Полная резервная копия и восстановление диска с помощью команды dd

Команда dd - это мощная утилита Linux для создания точных побитовых копий дисков, разделов или файлов. Это руководство охватывает, как безопасно создавать полные резервные копии дисков и восстанавливать их при необходимости.

⚠️ Важное предупреждение о безопасности

dd опасна! Одна опечатка может навсегда уничтожить ваши данные. Всегда:

  • Перепроверяйте входное (if=) и выходное (of=) устройства
  • Убедитесь, что делаете резервную копию правильного диска
  • Никогда не запускайте dd на смонтированной файловой системе
  • Храните резервные копии на отдельном физическом диске
  • Тестируйте резервные копии до того, как они понадобятся

Команду dd не зря называют «disk destroyer» (разрушитель дисков) — используйте её осторожно!

Предварительные требования

  • Root или sudo доступ
  • Достаточное дисковое пространство для резервной копии (как минимум равное размеру исходного диска)
  • Внешний диск или сетевое хранилище для размещения резервной копии
  • Базовое понимание именования дисков в Linux (/dev/sda, /dev/sdb и т.д.)

Поиск дисков

Список всех дисков

1
2
3
4
5
6
7
8
# Список всех дисков и разделов
sudo fdisk -l

# Или используйте lsblk для древовидного представления
lsblk

# Проверка использования диска
df -h

Понимание имён дисков:

  • /dev/sda - Первый SATA/SCSI диск (весь диск)
  • /dev/sda1 - Первый раздел на первом диске
  • /dev/nvme0n1 - Первый NVMe SSD
  • /dev/mmcblk0 - SD карта
  • /dev/sdb - Второй диск (обычно внешний USB)

Важно: Делайте резервную копию всего диска (например, /dev/sda), а не только раздела (например, /dev/sda1). Это гарантирует включение загрузчика и таблицы разделов.

Определение исходного диска

1
2
3
4
5
# Проверка смонтированных дисков
mount | grep "^/dev"

# Получение детальной информации о диске
sudo fdisk -l /dev/sda

Создание резервной копии диска

Базовая резервная копия диска в образ

Создание полного образа диска:

1
2
# Резервная копия всего диска в файл образа
sudo dd if=/dev/sda of=/path/to/backup/full_disk_backup.img bs=4M status=progress

Объяснение параметров:

  • if=/dev/sda - Входной файл (исходный диск для резервной копии)
  • of=full_disk_backup.img - Выходной файл (образ резервной копии)
  • bs=4M - Размер блока 4 мегабайта (быстрее, чем по умолчанию)
  • status=progress - Показывает прогресс во время копирования

Пример с реальными путями:

1
2
# Резервная копия на внешний USB диск
sudo dd if=/dev/sda of=/media/usb/backups/laptop_backup_2025-12-29.img bs=4M status=progress

Прямая резервная копия диск-в-диск

Клонирование одного диска напрямую на другой (быстрее, без промежуточного файла):

1
2
# Копирование диска /dev/sda на диск /dev/sdb
sudo dd if=/dev/sda of=/dev/sdb bs=4M status=progress

Предупреждение: Это полностью сотрёт /dev/sdb! Трижды проверьте имена устройств!

Сжатая резервная копия (экономит место)

Сжатие резервной копии на лету с использованием gzip или pigz:

1
2
3
4
5
6
7
8
# Сжатие с gzip (медленнее, лучше сжатие)
sudo dd if=/dev/sda bs=4M status=progress | gzip -c > /path/to/backup/disk_backup.img.gz

# Сжатие с pigz (параллельный gzip, быстрее на многоядерных процессорах)
sudo dd if=/dev/sda bs=4M status=progress | pigz -c > /path/to/backup/disk_backup.img.gz

# Меньшее сжатие для скорости (уровень 1-9, по умолчанию 6)
sudo dd if=/dev/sda bs=4M status=progress | gzip -1 > /path/to/backup/disk_backup.img.gz

Сравнение сжатия:

  • Без сжатия: Быстрее всего, но огромный файл (размер всего диска)
  • gzip -9: Медленнее всего, самый маленький файл (~30-50% уменьшение)
  • pigz -1: Хороший баланс скорости и размера

Резервная копия только используемого пространства (с dd_rescue)

Для больших дисков с малым количеством данных используйте ddrescue для пропуска пустых блоков:

1
2
3
4
5
# Установка ddrescue
sudo apt install gddrescue

# Резервная копия с интеллектуальным копированием
sudo ddrescue -f -n /dev/sda /path/to/backup/disk_backup.img /path/to/backup/disk_backup.log

Оптимизация производительности dd

Выбор размера блока

Размер блока значительно влияет на скорость:

1
2
3
4
5
6
7
8
9
10
# Слишком маленький (медленно)
bs=512 # 512 байт - очень медленно

# Хорошие варианты (быстро)
bs=4M # 4 мегабайта - хорошее значение по умолчанию
bs=8M # 8 мегабайт - быстрее для больших дисков
bs=16M # 16 мегабайт - быстрее всего, но использует больше RAM

# Раздельные размеры чтения/записи
bs=4M conv=sync,noerror # Продолжить при ошибках чтения

Рекомендация: Используйте bs=4M в большинстве случаев, bs=8M или bs=16M для очень больших дисков.

Мониторинг прогресса

Если вы забыли status=progress, мониторьте dd в другом терминале:

1
2
3
4
5
6
7
8
# Найти ID процесса dd
ps aux | grep dd

# Отправить сигнал USR1 для показа прогресса
sudo kill -USR1 <pid>

# Или используйте этот однострочник
watch -n 5 'sudo kill -USR1 $(pgrep ^dd$)'

Тест скорости

Бенчмарк вашего диска перед созданием резервной копии:

1
2
3
4
5
6
7
8
# Тест скорости записи (создаёт тестовый файл 1GB)
dd if=/dev/zero of=/path/to/testfile bs=1M count=1024 oflag=direct

# Тест скорости чтения
dd if=/path/to/testfile of=/dev/null bs=1M count=1024 iflag=direct

# Очистка
rm /path/to/testfile

Восстановление из резервной копии

Восстановление образа на диск

1
2
3
4
5
6
7
8
# Восстановление несжатого образа
sudo dd if=/path/to/backup/full_disk_backup.img of=/dev/sdb bs=4M status=progress

# Восстановление сжатого образа (gzip)
gunzip -c /path/to/backup/disk_backup.img.gz | sudo dd of=/dev/sdb bs=4M status=progress

# Восстановление сжатого образа (pigz)
pigz -dc /path/to/backup/disk_backup.img.gz | sudo dd of=/dev/sdb bs=4M status=progress

Критически важные напоминания:

  • /dev/sdb будет полностью перезаписан
  • Сначала размонтируйте целевой диск
  • Для загрузочных дисков подключайте только ОДИН загрузочный диск за раз
  • Проверьте имена устройств с помощью lsblk перед запуском

Восстановление конкретного раздела

Для восстановления только одного раздела:

1
2
3
4
5
# Резервная копия одного раздела
sudo dd if=/dev/sda1 of=/path/to/backup/partition_backup.img bs=4M status=progress

# Восстановление одного раздела
sudo dd if=/path/to/backup/partition_backup.img of=/dev/sdb1 bs=4M status=progress

Проверка

Всегда проверяйте ваши резервные копии!

Сравнение резервной копии с оригиналом

1
2
3
4
5
6
7
8
9
# Вычисление контрольных сумм
md5sum /dev/sda > original.md5
md5sum /path/to/backup/disk_backup.img > backup.md5

# Сравнение
diff original.md5 backup.md5

# Или используйте cmp для побитового сравнения
sudo cmp /dev/sda /path/to/backup/disk_backup.img

Монтирование и тестирование резервной копии

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Создание loop устройства из резервной копии
sudo losetup -f -P /path/to/backup/disk_backup.img

# Проверка какое loop устройство было создано
sudo losetup -a

# Монтирование раздела из резервной копии (предположим /dev/loop0p1)
sudo mkdir /mnt/backup_test
sudo mount /dev/loop0p1 /mnt/backup_test

# Просмотр резервной копии
ls /mnt/backup_test

# Размонтирование и очистка
sudo umount /mnt/backup_test
sudo losetup -d /dev/loop0

Лучшие практики безопасности

Перед созданием резервной копии

1
2
3
4
5
6
7
8
9
10
11
# 1. Размонтируйте источник, если возможно
sudo umount /dev/sda1

# 2. Проверьте доступное место на целевом диске
df -h /path/to/backup

# 3. Проверьте, что целевой диск доступен для записи
touch /path/to/backup/test && rm /path/to/backup/test

# 4. Перепроверьте имена устройств
lsblk

Перед восстановлением резервной копии

1
2
3
4
5
6
7
8
9
10
11
12
13
# 1. Список всех дисков для подтверждения целевого
lsblk

# 2. Размонтируйте целевой диск
sudo umount /dev/sdb*

# 3. Подтвердите, что у вас правильная резервная копия
ls -lh /path/to/backup/

# 4. ТРИЖДЫ ПРОВЕРЬТЕ имена устройств!
echo "Восстановление на: /dev/sdb"
echo "Нажмите Ctrl+C для отмены или Enter для продолжения"
read

Типичные случаи использования

Резервная копия перед обновлением системы

1
2
# Резервная копия загрузочного диска перед важным обновлением
sudo dd if=/dev/sda of=/media/external/pre-upgrade-backup.img bs=4M status=progress

Клонирование диска на больший диск

1
2
3
4
5
6
7
8
9
10
11
12
13
# 1. Клонирование на больший диск
sudo dd if=/dev/sda of=/dev/sdb bs=4M status=progress

# 2. Расширение раздела для использования нового пространства
sudo parted /dev/sdb
(parted) print free
(parted) resizepart 2 100%
(parted) quit

# 3. Изменение размера файловой системы
sudo resize2fs /dev/sdb2 # Для ext4
# или
sudo xfs_growfs /dev/sdb2 # Для XFS

Резервная копия SD карты (Raspberry Pi)

1
2
3
4
5
6
7
8
9
10
11
# Найти устройство SD карты (обычно /dev/mmcblk0 или /dev/sdb)
lsblk

# Резервная копия SD карты
sudo dd if=/dev/mmcblk0 of=~/backups/raspberrypi_backup.img bs=4M status=progress

# Сжатие
gzip ~/backups/raspberrypi_backup.img

# Восстановление на новую SD карту
gunzip -c ~/backups/raspberrypi_backup.img.gz | sudo dd of=/dev/mmcblk0 bs=4M status=progress

Создание загрузочного USB из ISO

1
2
# Копирование ISO на USB диск
sudo dd if=~/Downloads/ubuntu-24.04.iso of=/dev/sdb bs=4M status=progress oflag=sync

Устранение неполадок

«No space left on device»

Проблема: На целевом диске недостаточно места.

Решение:

1
2
3
4
5
6
7
8
# Проверка доступного места
df -h /path/to/backup

# Использование сжатия для уменьшения размера
sudo dd if=/dev/sda bs=4M | gzip > backup.img.gz

# Или резервная копия на сетевой диск
sudo dd if=/dev/sda bs=4M | ssh user@server 'cat > /backups/disk.img'

«Device is busy»

Проблема: Диск смонтирован или используется.

Решение:

1
2
3
4
5
6
7
8
# Проверка, что использует устройство
sudo lsof | grep /dev/sda

# Размонтирование всех разделов
sudo umount /dev/sda*

# Принудительное размонтирование при необходимости
sudo umount -l /dev/sda1

«Operation not permitted»

Проблема: Недостаточно прав доступа.

Решение:

1
2
3
4
5
# Запуск с sudo
sudo dd ...

# Проверка, защищён ли диск от записи
hdparm -r /dev/sda

dd зависла

Проблема: Прогресс не виден.

Решение:

1
2
3
4
5
6
7
8
# Проверка, работает ли dd на самом деле
ps aux | grep dd

# Отправка сигнала для показа прогресса
sudo kill -USR1 $(pgrep ^dd$)

# Мониторинг I/O
iostat -x 2

Слишком большой файл резервной копии

Проблема: Файл образа огромный.

Решение:

1
2
3
4
5
6
7
8
# Использование сжатия
sudo dd if=/dev/sda bs=4M | gzip -1 > backup.img.gz

# Или резервная копия только используемых блоков с partclone
sudo partclone.ext4 -c -s /dev/sda1 -o backup.partclone

# Или использование rsync для инкрементных резервных копий
sudo rsync -aAXv --delete / /media/backup/

Альтернативные инструменты

Хотя dd мощная, рассмотрите эти альтернативы для конкретных нужд:

Для системных резервных копий:

  • rsync - Инкрементные резервные копии, быстрее, чем dd только для используемого пространства
  • tar - Архивирование конкретных директорий
  • Clonezilla - GUI инструмент, интеллектуальное клонирование
  • timeshift - Снимки системы (как macOS Time Machine)

Для клонирования дисков:

  • ddrescue - Восстанавливает данные с отказывающих дисков
  • partclone - Копирует только используемые блоки (меньшие резервные копии)
  • fsarchiver - Резервная копия на уровне файловой системы

Для создания образов дисков:

  • partimage - Создаёт образы разделов
  • g4u - Ghost for Unix
  • redo rescue - Live CD для резервных копий

Краткая справка

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# Базовая резервная копия
sudo dd if=/dev/sda of=backup.img bs=4M status=progress

# Сжатая резервная копия
sudo dd if=/dev/sda bs=4M | gzip > backup.img.gz

# Прямое клонирование
sudo dd if=/dev/sda of=/dev/sdb bs=4M status=progress

# Восстановление из резервной копии
sudo dd if=backup.img of=/dev/sdb bs=4M status=progress

# Восстановление из сжатой резервной копии
gunzip -c backup.img.gz | sudo dd of=/dev/sdb bs=4M status=progress

# Показать прогресс работающего dd
sudo kill -USR1 $(pgrep ^dd$)

# Проверка резервной копии
md5sum /dev/sda backup.img

# Монтирование образа резервной копии
sudo losetup -f -P backup.img
sudo mount /dev/loop0p1 /mnt/test