️ Complete Server Clone & Backup — Linux

If you like this project, consider supporting me on Buy Me a Coffee ☕️

Server cloning via tar + SSH is a classic sysadmin technique for migrating or duplicating Linux servers by streaming a compressed filesystem archive directly over the network. It preserves permissions, ownership, and special files. This approach is commonly used for quick server migrations, disaster recovery, and bare-metal cloning. Modern alternatives include rsync (incremental), Clonezilla (disk-level), and Ansible/Terraform (infrastructure-as-code). / Клонирование сервера через tar + SSH — классический метод миграции или дублирования Linux-серверов путём потоковой передачи сжатого архива файловой системы по сети. Современные альтернативы: rsync, Clonezilla, Ansible/Terraform.

Installation & Configuration

Dependencies / Зависимости

# Debian/Ubuntu
apt update && apt install tar openssh-client   # Install tar + SSH / Установка tar + SSH

# RHEL/CentOS/AlmaLinux
yum install tar openssh-clients                # Install tar + SSH / Установка tar + SSH

SSH Performance Tuning / Настройка производительности SSH

# Lighter cipher for fast networks (less secure — use only in trusted LAN)
# / Более лёгкий шифр для быстрых сетей (менее безопасно — только в доверенной LAN)
ssh -oCiphers=aes128-ctr <USER>@<HOST>

# Disable SSH compression (faster on fast networks) / Отключить сжатие SSH (быстрее на быстрых сетях)
ssh -oCompression=no <USER>@<HOST>

Core Management (Tar & Backups)

Basic Backup Commands / Основные команды бэкапа

# Full system backup excluding virtual/system directories
# / Полный бэкап системы, исключая виртуальные/системные директории
tar -cvpzf "backup-$(date +%m-%d-%Y-%H%M).tar.gz" \
    --exclude=/backup.tar.gz \
    --exclude=/dev --exclude=/boot --exclude=/proc --exclude=/sys \
    --exclude=/mnt --exclude=/lost+found \
    --one-file-system /

# Backup specific directory (e.g., web root) / Бэкап конкретной директории
tar -czvf "backup-$(date +%m-%d-%Y-%H%M).tar.gz" \
    --exclude={./public_html/templates/cache,./public_html/templates/compiled,./public_html/images} \
    ./public_html

Unpacking & Restoring / Распаковка и восстановление

tar -xvf backup.tar.gz                          # Extract archive / Распаковать архив
tar -C /dest -xvf backup.tar.gz                 # Extract to specific directory / В конкретную папку

Server Cloning (Piped Transfer)

[!IMPORTANT] This method clones the filesystem directly across the network over SSH. Ensure the target server has identical or compatible hardware (especially for the bootloader). Run from the source server only.

Clone Entire Server via SSH / Клонировать сервер через SSH

[!CAUTION] This overwrites everything on the target server. Always verify <REMOTE_IP> before running. There is no undo.

# Execute on SOURCE server / Выполнить на ИСХОДНОМ сервере
cd / && \
tar cvpzf - \
  --exclude=/dev \
  --exclude=/boot \
  --exclude=/etc/fstab \
  --exclude=/etc/mtab \
  --exclude=/etc/blkid \
  --exclude=/etc/modprobe.conf \
  --exclude=/proc \
  --exclude=/mnt \
  --exclude=/sys \
  --exclude=/lost+found \
  --exclude=/etc/sysconfig/network-scripts/* \
  --ignore-failed-read \
  / | ssh -T root@<REMOTE_IP> 'tar -C / -xvpz'

Cleanup After Cloning / Очистка после клонирования

# Remove temporary maildrop files / Удалить временные файлы почты
find /var/spool/postfix/maildrop/ -type f -exec rm {} \;

Database Management (MySQL/MariaDB)

Secure Credential Management / Безопасное управление учётными данными

[!TIP] Never use -p<PASSWORD> directly in shell commands or scripts — it appears in process listings and shell history. Use mysql_config_editor or .my.cnf instead.

# Create login profile (password prompted interactively) / Создать профиль (пароль запрашивается)
mysql_config_editor set --login-path=backup --host=localhost --user=root --password

# Use login path for dumps / Использовать профиль для дампов
mysqldump --login-path=backup --all-databases | gzip > all-databases.sql.gz

Using .my.cnf / Использование .my.cnf

/root/.my.cnf

[client]
user=<USER>
password=<PASSWORD>
chmod 600 /root/.my.cnf                         # Restrict permissions / Ограничить права

Backup & Restore / Бэкап и восстановление

# Dump all databases / Дамп всех баз данных
mysqldump -u root -p --all-databases | gzip > "/mysql-backup-$(date +%F).sql.gz"

# Restore from SQL file / Восстановить из SQL файла
mysql -u root -p < file.sql

# Restore from compressed SQL / Из сжатого SQL
gunzip -cd mysql-backup.sql.gz | mysql -u root -p

Automation & Scripts

Integrated Backup Script / Интегрированный скрипт бэкапа

/usr/local/bin/server-backup.sh

#!/bin/bash
# Automated backup script: DB dump + filesystem archive
# / Автоматический бэкап: дамп БД + архив файловой системы

set -euo pipefail

BACKUP_DIR="/backup"
mkdir -p "$BACKUP_DIR"
rm -f "$BACKUP_DIR"/*.zip "$BACKUP_DIR"/*.tar.gz 2>/dev/null || true

NOW=$(date +%d%m%Y-%H%M%S)
FILENAME="server-backup"
FULL_PATH="$BACKUP_DIR/$FILENAME-$NOW"

# Database dump / Дамп базы данных
# NOTE: Use --login-path for production / Используйте --login-path в продакшне
mysqldump --no-tablespaces -y -u <USER> -p<PASSWORD> -h <SOURCE_IP> <DB_NAME> > "$FULL_PATH.sql"

# Compress SQL dump / Сжать дамп SQL
zip -j "$FULL_PATH.zip" "$FULL_PATH.sql"
rm "$FULL_PATH.sql"

# Create system archive / Системный архив
tar -cvpzf "$FULL_PATH.tar.gz" \
    --exclude=/var/spool/postfix/maildrop/ \
    --exclude=/dev --exclude=/boot \
    --exclude=/proc --exclude=/sys \
    --exclude=/mnt --exclude=/lost+found \
    --exclude=/swap \
    --exclude=/var/lib/mysql/ \
    --exclude=/etc/sysconfig/network-scripts/* \
    --exclude="$BACKUP_DIR"/* \
    --one-file-system /

# Optional: Upload to remote server / Опционально: отправить на удалённый сервер
# scp -P 22 "$FULL_PATH.tar.gz" backup_user@<HOST>:/path/to/backups/
echo "$(date): Backup complete: $FULL_PATH"
chmod +x /usr/local/bin/server-backup.sh

Cron Schedule / Расписание cron

/etc/cron.d/server-backup

# Full server backup daily at 01:00 / Полный бэкап сервера ежедневно в 01:00
0 1 * * * root /usr/local/bin/server-backup.sh >> /var/log/server-backup.log 2>&1

Logrotate / Logrotate

/etc/logrotate.d/server-backup

/var/log/server-backup.log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    create 640 root root
}

Advanced Operations (Multi-volume)

Using tarcat / Использование tarcat

Used to concatenate GNU tar multi-volume archives / Объединение многотомных архивов GNU tar.

/usr/local/bin/tarcat

#!/bin/sh
# Usage: tarcat volume1 volume2 ... | tar -xf -
# Author: Bruno Haible, Sergey Poznyakoff

dump_type() {
  dd if="$1" skip=${2:-0} bs=512 count=1 2>/dev/null | tr '\0' ' ' | cut -c157
}

case $(dump_type "$1") in
  [gx]) PAX=1;;
esac

cat "$1"
shift
for f; do
  SKIP=0
  T=$(dump_type "$f")
  if [ -n "$PAX" ]; then
    if [ "$T" = "g" ]; then
      SKIP=5
    fi
  else
    if [ "$T" = "V" ]; then T=$(dump_type "$f" 1); fi
    if [ "$T" = "M" ]; then SKIP=$((SKIP + 1)); fi
  fi
  dd skip=$SKIP if="$f"
done
chmod +x /usr/local/bin/tarcat
# Usage / Использование:
tarcat archive-* | tar -xf -

Comparison of Cloning Approaches

Method Pros / Плюсы Cons / Минусы
Tar over SSH Fast, simple, preserves permissions exactly Manual cleanup of system files (fstab, network). No deduplication
Rsync Incremental sync, resume capability, bandwidth efficient Slightly slower initial sync than tar
Restic / Borg Deduplication, encryption, snapshot history Requires client installation, more complex setup
Clonezilla / DD Bit-perfect clone including bootloader Usually requires downtime; large image if not sparse

Sysadmin Operations

Network & IP Updates After Cloning / Обновление IP после клонирования

# Bulk replace old IP in config files / Массовая замена старого IP в конфигурационных файлах
find /etc/ -type f -exec sed -i 's/<SOURCE_IP>/<REMOTE_IP>/g' {} \;

Path & Log Reference / Справка по путям и логам

/var/log/syslog           # System log (Debian/Ubuntu) / Системный лог
/var/log/messages         # System log (RHEL) / Системный лог
/var/log/cron             # Cron job log / Лог задач cron
/var/log/server-backup.log  # Script log (if configured) / Лог скрипта

Default Ports / Порты по умолчанию

# SSH: 22
# MySQL/MariaDB: 3306

Service Management / Управление сервисами

systemctl restart sshd                          # Restart SSH / Перезапустить SSH
systemctl status mysql                          # Check MySQL status / Проверить MySQL

[!CAUTION] Always verify your backups are restorable! Run a test restore to a staging server regularly. A backup is only as good as its last verified restoration.

On this page

Installation &amp; Configuration Dependencies / Зависимости SSH Performance Tuning / Настройка производительности SSH Core Management (Tar &amp; Backups) Basic Backup Commands / Основные команды бэкапа Unpacking &amp; Restoring / Распаковка и восстановление Server Cloning (Piped Transfer) Clone Entire Server via SSH / Клонировать сервер через SSH Cleanup After Cloning / Очистка после клонирования Database Management (MySQL/MariaDB) Secure Credential Management / Безопасное управление учётными данными Using mysql_config_editor (Recommended / Рекомендуется) Using .my.cnf / Использование .my.cnf Backup &amp; Restore / Бэкап и восстановление Automation &amp; Scripts Integrated Backup Script / Интегрированный скрипт бэкапа Cron Schedule / Расписание cron Logrotate / Logrotate Advanced Operations (Multi-volume) Using tarcat / Использование tarcat Comparison of Cloning Approaches Sysadmin Operations Network &amp; IP Updates After Cloning / Обновление IP после клонирования Path &amp; Log Reference / Справка по путям и логам Default Ports / Порты по умолчанию Service Management / Управление сервисами