Создание горячей резервной копии, хороший вариант, например, при необходимости провести очередной апгрейд 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
После перезагрузки желательно убедиться, что всё работает как нужно и процесс восстановления можно считать успешно завершённым.