Уже в который раз проделываю подобные фокусы. Пора написать памятку.
Есть работающая Linux-система. Гасить её нельзя. Требуется сделать полный бэкап / клон изнутри её самой.
Решение.
- Создаём требуемую таблицу разделов на носителе реципиента и файловые системы на ней. Проще говоря, разбиваем и форматируем целевой жесткий диск.
- Монтируем корень файловой системы реципиента куда-нибудь либо в самого донора (если локально), либо в другую Linux-машину (если удаленно). Например, "mount /dev/sdb1 /mnt/recip".
- Копируем всё с рута донора на реципиента. Если локально, то "cp -ax / /mnt/recip". Если удалённо, то "rsync -avHX donor.com::rootmodule/ /mnt/recip/".
- Если всякие /boot, /home и иже с ними были примонтированы отдельно, то аналогично копируем и их тоже.
- Правим /etc/fstab на реципиенте. Команда "blkid" в помощь. При необходимости создаем заново swap.
- При помощи "mount --bind" монтируем вовнутрь пока ещё мертвого реципиента виртуальные директории "/dev", "/dev/pts", "/proc", "/sys" с запущенной в данный момент времени системы. Если предполагается, что "/boot" лежит где-то отдельно, то монтируем его тоже. Если используется EFI, то не забываем про "/boot/efi".
- Chroot-имся вовнутрь примонтированного реципиента. Проверяем, что chroot сработал.
- Переустанавливаем GRUB: "grub-install --recheck /dev/куда_надо". Потом "update-grub".
- Проверяем, что в "/etc/initramfs-tools/conf.d/driver-policy" прописано "MODULES=most".
- Обновляем initramfs: "update-initramfs -u -k all".
- Подчищаем "/var/log", "/tmp", "/run".
- Выходим из chroot.
- Размонтируем всё, связанное с реципиентом.
Собственно, всё. Дальше можно пробовать запускать реципиента. Ничего сложного, но нужно не забыть чего-нибудь и проходить эти шаги именно в таком порядке.