Перенос ОС Linux с одного диска на другой с разными разделами
Прежде всего, некоторые связанные вопросы:
- Как перейти с одного диска на другой, который имеет другой размер?
- Какая утилита может переместить мой загрузочный раздел Windows на другой жесткий диск?
Моя ситуация выглядит следующим образом:
- Создайте виртуальную машину (VBox) для установки Linux (тестирование Debian, ядро 3.14).
- Один загрузочный раздел BTRFS, один корневой раздел LUKS BTRFS.
- Внесите интенсивные изменения в виртуальную машину для повышения скорости.
- Перенесите установку на USB-накопитель.
Моя первая попытка состояла в том, чтобы использовать жесткий диск в виртуальной машине того же размера, что и флэш-диск, и просто dd
Все это. По какой-то причине UUID загрузочного раздела не может быть получен и поэтому используется для загрузки с флэш-накопителя.
Если я разделю флешку вручную с загрузочным разделом EXT4 и корневым разделом LUKS BTRFS, извлечение UUID будет работать нормально. Я тогда использовал rsync -aEXS --progress
перенести файлы с каждого смонтированного раздела (образ виртуальной машины -> флешка). я chroot
вбил флешку и побежал grub-install
на устройстве флэш-накопителя, вместе с update-grub
обновить UUID файловой системы. Это не сработало. Не удалось правильно обнаружить / использовать зашифрованный раздел для получения root. Я старался update-initramfs -u
безуспешно.
Что я пропустил или мог сделать лучше, чтобы выполнить этот сценарий?
1 ответ
Первоначальные шаги были в основном правильными, но по какой-то причине я продолжал заканчивать с испорченным initrd. Ниже приведены все шаги, которые должны привести к рабочему сценарию для тех, кто заинтересован в том же:
- Создайте виртуальную машину по желанию.
- Установите Linux, используя желаемое расположение разделов, и внесите все необходимые изменения. В этом случае он состоит из загрузочного раздела BTRFS и корневого раздела BTRFS с шифрованием LUKS. Другие макеты должны работать, если принять меры для правильного обновления ссылок во время передачи.
- Загрузите предыдущую виртуальную машину, используя Linux live ISO, чтобы получить доступ к установленной системе в автономном режиме
- Подключите флэш-накопитель USB к виртуальной машине для передачи. (Примечание: вы можете создать
dd
образ установленного диска и сохраните его вне виртуальной машины, который затем можно использовать из обычной системы Linux.) - Подготовьте разделы флешки.
- Опция:
dd
Исходное изображение на флэш-накопитель и перейдите к шагу 7, а затем к шагу 10. (Примечание: в моем случае, по-видимому, было необходимо воссоздать разделы по неизвестной причине, когдаblkid
не удалось перечислить UUID загрузочного раздела BTRFS.) - Опция: Создать новые разделы, используя те же UUID, что и исходные. Если предположить,
/dev/sda1
для загрузки и/dev/sda2
для корня.- Для загрузочного раздела BTRFS:
sudo mkfs.btrfs -f -L BOOT -U <original UUID> /dev/sda1
- Для корневого раздела LUKS:
sudo cryptsetup --uuid=<original UUID> luksFormat /dev/sda2
- Корневой раздел карты:
sudo cryptsetup --allow-discards open --type luks /dev/sda2 flash_luks
- Отформатируйте корень, используя BTRFS:
sudo mkfs.btrfs -f -L ROOT -U <original UUID> /dev/mapper/flash_luks
- Для загрузочного раздела BTRFS:
- Опция: Создать новые разделы, используя новые UUID. Повторите те же шаги, что и в варианте 2, но удалите аргументы, относящиеся к UUID/uuid. Обратите внимание на новые UUID, использующие
sudo blkid
,
- Опция:
- Смонтируйте оригинальные разделы изображений.
- Создайте петлевые устройства только для чтения для каждого раздела:
sudo kpartx -ar <flash dd image file>
, Предполагая, что kpartx присоединяется к loop0. - Создайте каталоги для точек монтирования:
sudo mkdir -p /media/orig_boot /media/orig_root
- Ботинки:
sudo mount -r /dev/mapper/loop0p1 /media/orig_boot
- Корень УДАЧИ:
sudo cryptsetup -r open --type luks /dev/mapper/loop0p2 orig_luks
- Корень:
sudo mount -r /dev/mapper/orig_luks /media/orig_root
- Создайте петлевые устройства только для чтения для каждого раздела:
- Смонтировать флешку на разделы. Если предположить,
/dev/sda1
для загрузки.- Создайте каталоги для точек монтирования:
sudo mkdir -p /media/flash_boot /media/flash_root
- Ботинки:
sudo mount -t btrfs -o nodiratime,noatime,compress=zlib,discard,ssd,space_cache /dev/sda1 /media/flash_boot
- Root (при условии, что он уже был отображен с помощью cryptsetup ранее):
sudo mount -t btrfs -o relatime,compress=zlib,discard,ssd,space_cache /dev/mapper/flash_luks /media/flash_root
- Создайте каталоги для точек монтирования:
- Копировать содержимое:
- Ботинки:
sudo rsync -aEXS --progress /media/orig_boot/ /media/flash_boot
- Корень:
sudo rsync -aEXS --progress /media/orig_root/ /media/flash_root
- Ботинки:
- Размонтировать исходное изображение.
- Корень:
sudo umount /media/orig_root
- Корень УДАЧИ:
sudo cryptsetup close orig_luks
- Ботинки:
sudo umount /media/orig_boot
- kpartx:
sudo kpartx -d <flash dd image file>
- Корень:
- Загрузите флешку.
- привязывать
/sys
:sudo mount --bind /sys /media/flash_root/sys
- привязывать
/dev
:sudo mount --bind /dev /media/flash_root/dev
- привязывать
/dev/pts
:sudo mount --bind /dev/pts /media/flash_root/dev/pts
- привязывать
/proc
:sudo mount --bind /proc /media/flash_root/proc
- Размонтировать загрузчик:
sudo umount /media/flash_boot
- Перемонтировать внутри корня:
sudo mount -t btrfs -o relatime,compress=zlib,discard,ssd,space_cache /dev/sda1 /media/flash_root/boot
- корневой:
sudo chroot /media/flash_root
- привязывать
- Обновить
/etc/fstab
,- Линия загрузки:
UUID=<btrfs boot uuid> /boot btrfs nodiratime,noatime,compress=zlib,discard,ssd,space_cache 0 2
- Корневая линия:
UUID=<btrfs root uuid> / btrfs nodiratime,noatime,compress=zlib,discard,ssd,space_cache 0 1
- Линия загрузки:
- Обновить
/etc/crypttab
:flash_luks UUID=<luks root uuid> none discard,luks
- устанавливать
btrfs-tools
(если не установлено):sudo apt-get install btrfs-tools
- Обновите загрузочный материал.
- Initrd (использует fstab / crypttab, чтобы решить, что нужно перед монтированием и запросить пароль LUKS при загрузке):
sudo update-initramfs -u -k all
(Примечание: вы можете воссоздать все initrds, используяsudo update-initramfs -c -k all
, но я не пытался это сделать, чтобы быть уверенным.) - Grub (использует fstab для обновления параметров загрузки ядра и монтирования правильных разделов):
sudo update-grub
- Установить grub в MBR (при условии
/dev/sda
):sudo grub-install --recheck /dev/sda
- Выход из chroot:
exit
- Initrd (использует fstab / crypttab, чтобы решить, что нужно перед монтированием и запросить пароль LUKS при загрузке):
- Размонтировать все.
sudo umount /media/flash_root/boot
sudo umount /media/flash_root/proc
sudo umount /media/flash_root/dev/pts
sudo umount /media/flash_root/dev
sudo umount /media/flash_root/sys
sudo umount /media/flash_root
sudo cryptsetup close flash_luks