Сегодня мы познакомимся с интересной утилитой позволяющей клонировать диск с рабочей системой и развернуть её на другом диске или даже машине. Этой утилитой является FSArchiver, разработанной автором PartImage на основе его же более старой реализации, но с расширенными возможностями. И здесь я хочу рассказать об опыте её использования.
В прошлой статье мы уже рассматривали один из способов переноса ОС Linux с помощью команды DD, что позволило мигрировать систему на другой диск без особых трудностей и затрат времени. Но в этом способе есть один большой минус — целевой диск должен быть в объёме не меньше, чем диск-источник, что в ряде случаев достаточно неудобно или вообще невозможно.
FSArchiver лишён этого недостатка в силу того, что сохраняет образ диска не на его физическом уровне, а на логическом — уровне файлов, то есть исключив пустые кластеры. Это даёт нам усиление компрессии. Также в конечном итоге применяется сжатие одним из архиваторов:
- lzo: очень быстрое, но с низкой степенью сжатия. Вы можете использовать его, если у вас очень медленный процессор. Вам следует рассмотреть lz4, если вам нужна быстрая распаковка.
- lz4: очень быстрое, но с низкой степенью сжатия. Вы можете использовать его, если у вас очень медленный процессор. Он похож на lzo, но обеспечивает лучшую производительность при распаковке, поэтому рекомендуется вместо lzo.
- gzip: наиболее распространенный алгоритм сжатия. Он довольно быстрый и обеспечивает хорошую степень сжатия.
- bzip2: довольно медленный алгоритм с очень хорошей степенью сжатия.
- xz/lzma: имеет превосходную степень сжатия, но сжимает очень медленно, при этом распаковывает гораздо быстрее, чем bzip2.
- zstd: довольно новый алгоритм, который в большинстве случаев (от хорошей скорости до хорошего сжатия) обеспечивает лучшее соотношение сжатие/скорость, чем вышеуказанные. Поэтому в последних версиях FSArchiver это рекомендуемый метод сжатия.
Как для сохранения, так и для восстановления дисков нам доступно два способа решения задачи: через терминал с любого загрузочного LiveCD и посредством проекта Qt-FSArchiver предоставляющего нам графический интерфейс. Для первого способа будет достаточно установочной флешки с Ubuntu, тогда, как второй предлагает нам скачать и развернуть на флешке систему восстановления. При этом способ из терминала можно использовать не только с загрузочного диска, но и непосредственно с работающей системы, хотя нужно понимать, что в данном случае всё же присутствует риск создать плохой образ, но у меня это получилось успешно и восстановленный с этого образа диск был работоспособен. Для выполнения сохранения в рабочей среде нужно в команду добавить опцию -A.

Мы рассмотрим оба варианта параллельно. Далее предполагаем, что загрузочный диск готов к работе.
Подготовка образа исходной системы
В первую очередь, независимо от выбранного способа, нам нужно определиться с местом сохранения образа. Предварительно переключитесь на рута командой sudo su. Если это будет папка на другом ПК локальной сети, то её нужно смонтировать
mkdir /mnt/backup; mount.cifs //192.168.0.2/backup/ /mnt/backup/ -o user=ЮЗЕР_УДАЛЁННОГО_ПК,pass=ПАРОЛЬ,iocharset=utf8,file_mode=0777,dir_mode=0777
Вместо ЮЗЕР_УДАЛЁННОГО_ПК и ПАРОЛЬ введите актуальные для вас данные.
Также можно было бы смонтировать удалённый диск с помощью стандартной утилиты Files, соединившись с ним с помощью протокола smb

Далее сценарий будет зависеть от выбранного вами способа.
В данном варианте устанавливать нам ничего не придётся. Загружаемся с флешки Qt-FSArchiver. Тут нужно сразу предупредить, что суперпользователь имеет пароль — ubuntu, мало ли что.
На LiveCD присутствует целый набор программ для восстановления системы и работы с дисками, нам же в данном случае нужна лишь Qt-FSArchiver. Её иконка запуска находится в самом верху боковой панели. В самой программе доступен русский и другие языки, которые можно установить в её настройках. После изменения их нужно перезапустить Qt-FSArchiver.

Тут выбираем диск с которого будем снимать образ, имя файла образа и каталог для сохранения. Также можно установить дополнительные опции такие, как степень сжатия и число задействованных потоков. В отличии от утилиты FSArchiver, запускаемой непосредственно из терминала, здесь не предусмотрено сохранение нескольких дисков в одном файле, как, собственно, и распаковка такого файла и нам придётся создать несколько файлов образов, по одному на каждый сохраняемый диск.
Проделываем данную процедуру для каждого диска.
Устанавливаем FSArchiver
apt install fsarchiver -y
Определяем сохраняемые диски
ls -l /dev

Находим в списке нужный нам, как в данном случае, это sda с двумя разделами sda1 и sda2 и выполняем команду сохранения. Тут стоит сразу решить, будем ли мы сохранять оба раздела в одном файле или каждый в отдельном.
fsarchiver savefs -v -j28 /mnt/backup/backup.fsa --exclude={"/src","/tmp/*","*/*cache/*","lost+found","*.tar","*.gz"} /dev/sda1 /dev/sda2
-v обеспечит показ в терминале обрабатываемых файлов;
-j28 установит количество потоков для обработки. В данном случае их 28
—exclude исключит указанные файлы и папки
Утилита вернёт статистику выполнения, но отпустит командную строку только после полного сохранения образа на диск.

Так мы получили образ диска на удалённом ПК
Развёртывание образа на диск
Если вы сохранили в образы все диски системы, то нам не нужно устанавливать её, достаточно распилить диск на разделы и залить на них соответствующие образы.
Монтируем удалённую папку с образом
mkdir /mnt/backup; mount.cifs //192.168.0.2/backup/ /mnt/backup/ -o user=ЮЗЕР_УДАЛЁННОГО_ПК,pass=ПАРОЛЬ,iocharset=utf8,file_mode=0777,dir_mode=0777
Для этого можно воспользоваться утилитой GParted или аналогичной. Qt-FSArchiver имеет её в составе своего набора.

Открываем Qt-FSArchiver и выбираем режим Восстановление раздела с помощью qt-fsarchiver, также выбираем диск на который будем заливать образ, файл самого образа и Число потоков, которое не должно превышать количество ядер вашего процессора.

Дожидаемся окончания процесса восстановления и выходим из программы
Если восстанавливаем несколько дисков, то повторяем процесс.
Устанавливаем FSArchiver
apt install fsarchiver -y
Если в образе несколько дисков, то их следует перечислить в том же порядке, как они были записаны
fsarchiver restfs /mnt/backup/backup.fsa id=0,dest=/dev/sda1 id=1,dest=/dev/sda2
По окончании развёртывания не забудьте установить для первого раздела, который является Efi System флаги boot и esp, если также восстанавливали его

Монтирование образа для выборочного копирования
В этом случае нам придётся предварительно установить Ubuntu той же версии, что имеет образ диска. После установки, хоть и не обязательно, но всё же желательно войти в чистую систему и обновиться.
В качестве устройства для монтирования используем Loop — петлевое устройство, являющееся обычным файлом, но представляющее собой что-то вроде виртуального диска, позволяющего быть смонтированным в качестве файловой системы.
Далее загружаемся с LiveCD Ubuntu 24.04 и открываем терминал и устанавливаем FSArchiver
apt-get install fsarchiver -y
Создаём пустой файл образа с несколько большим размером нежели сам образ после распаковки. Чтобы определить размер файла, выполните команду
fsarchiver archinfo /mnt/backup/full_1.fsa

В данном случае объём распакованных файлов займёт 39,89 ГБ. Значит нам нужно создать образ размером в 50 ГБ. Разместим его в удалённой папке.
dd if=/dev/zero of=/mnt/backup/vd.img count=50000 bs=1M
то есть мы создаём пустой образ диска с именем vd.img общим количеством 50000 блоков по 1 МБ/блок. Дожидаемся завершения его создания.

Определяем свободное петлевое устройство:
losetup -f

Монтируем на него наш только что созданный образ
losetup /dev/loop1 /mnt/backup/vd.img
и заливаем образ исходного диска
fsarchiver restfs /mnt/backup/full_1.fsa id=0,dest=/dev/loop1
Ждём, когда завершится процесс распаковки и развёртывания.
Проверяем наличие устройств
fdisk -l

Убедившись, что нужные нам доступны в системе, монтируем полученный петлевой диск
mkdir /mnt/loop; mount /dev/loop1 /mnt/loop -o ro
Также монтируем целевой диск и работаем с ними.
mkdir /mnt/target; mount /dev/sda2 /mnt/target -o rw
Например, копируем нужную папку
cp -prT --preserve /mnt/loop/etc /mnt/target
По окончании работы размонтируем петлевой диск и удалим его
umount /dev/loop1; losetup -d /dev/loop1
Также удалим созданный нами образ
rm /mnt/backup/vd.img