Создание горячей резервной копии, хороший вариант, например, при необходимости провести очередной апгрейд desktop-ной операционной системы. Очевидно, если что-то пойдет не так или потребуется слишком много времени на доводку, наличие свежей резервной копии поможет оперативно вернуть систему в состояние «как было». Далее будет рассмотрен процесс копирования работающей Linux системы и порядок её восстановления.

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

Для успешного восстановление операционной системы Linux достаточно восстановить корневую файловую систему и загрузчик, обычно это GRUB. Копировать загрузчик не требуется, но он использует файлы настроек, которые могут располагаться на несмонтированном разделе /boot. Важно не забыть про этот раздел.

В процессе загрузки монтируется большое число файловых систем, многие из которых виртуальные и располагаются в памяти, другие могут принадлежать внешним хранилищам данных. Поэтому копирование всего дерева файлов во время работы Linux – плохая идея. Получить доступ только к корневой файловой системе можно смонтировав её ещё раз, например, в /mnt/root:

# /dev/sdXY – устройство раздела диска с корневой файловой системой
# relatime – параметр для обновления времени доступа к файлам только при записи их на диск
sudo mkdir -p /mnt/root && sudo mount /dev/sdXY /mnt/root -o relatime

# pigz - многопоточная версия gzip
# /mnt/backup – точка монтирования раздела с резервными копиями
sudo tar -C /mnt/root --use-compress-program=pigz -cpf /mnt/backup/`date +'%Y-%m-%d'`-root.tar.gz .

В общем случае задача может усложниться тем, что в целях оптимизации содержимое некоторых системных директорий (например /boot, /usr, /var) может находиться на других разделах. С ними нужно поступить аналогично, смонтировать и скопировать содержимое в отдельные файлы резервной копии.

Поскольку цель — создать копию операционной системы, может возникнуть желание исключить данные пользователя, например, разместив /home на отдельном разделе, ускорив тем самым процесс создания и восстановления резервной копии. Но нужно иметь в виду, что конфигурационные файлы в профиле пользователя могут быть повреждены, что может помешать успешному восстановлению. Поэтому в каждом случае нужно решать отдельно, что следует выносить на отдельные разделы и есть ли в этом смысл.

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

Для того, чтобы восстановить систему необходимо загрузиться с LiveUSB любого Linux дистрибутива. Например, для этой цели хорошо подойдет легковесный GParted. При необходимости в нём можно легко изменить разметку текущего диска или разметить новый.

В случае, если требуется восстановить резервную копию на новый раздел, необходимо синхронизировать его UUID с указанным в файле /etc/fstab, для этого есть несколько вариантов:

  • Посмотреть текущий UUID раздела командой blkid, затем указать его в /mnt/root/etc/fstab;
  • Установить UUID при форматировании командой mkfs с ключом -U;
  • Изменить UUID после форматирования командой tune2fs с ключом -U.

Последний вариант, наиболее приемлемый, так как при восстановлении желательно сохранить оригинальный UUID. Получить его проще всего из файла /etc/fstab, после распаковки резервной копии.

Соответственно в терминале необходимо выполнить:

# Смонтировать раздел с корневой файловой системой
sudo mkdir -p /mnt/{root,backup} && sudo mount /dev/sdXY /mnt/root

# Удалить все файлы раздела включая скрытые
sudo find /mnt/root -mindepth 1 -maxdepth 1 -exec rm -rf {} \;

# Распаковать резервную копию
sudo tar -C /mnt/root -zxpvf /mnt/backup/YYYY-MM-DD-root.tar.gz

# При необходимости: изменить UUID корневого раздела и пересоздать swap с требуемым UUID
sudo umount /mnt/root
sudo tune2fs /dev/sdXY -U xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
sudo mount /dev/sdXY /mnt/root
sudo mkswap /dev/sdXZ -U yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy

Если системных разделов больше одного, они восстанавливаются аналогичным образом.

Далее нужно установить загрузчик. Данный шаг можно пропустить, если есть уверенность, что загрузчик не был повреждён и UUID разделов не менялся.

# Смонтировать необходимые виртуальные файловые системы
for i in /{dev,proc,sys,run}; do sudo mount --bind $i /mnt/root$i; done

# При необходимости здесь нужно достроить файловую систему, смонтировав недостающие разделы

# Установить загрузчик
sudo chroot /mnt/root
sudo /usr/sbin/grub-install /dev/sdX
sudo /usr/sbin/update-grub
exit

# Отключить LiveUSB и перезагрузить компьютер
sudo reboot

На этом шаге, Linux должен успешно загрузиться и работать как раньше. Но в случае с дистрибутивом Kubuntu, у меня отвалилась большая часть оборудования, в том числе сетевые адаптеры. После серии экспериментов стало ясно, что дело в системе межпроцессного взаимодействия D-Bus и требуется переустановка соответствующего пакета, в данном случае dbus_1.10.0-1ubuntu1_amd64.deb. Требуемый пакет можно добыть на launchpad.net, затем в терминале целевой системы выполнить:

sudo dpkg -i dbus_1.10.0-1ubuntu1_amd64.deb
sudo reboot

После перезагрузки желательно убедиться, что всё работает как нужно и процесс восстановления можно считать успешно завершённым.