
Прежде всего, несколько сопутствующих вопросов:
- Как перейти с одного диска на другой, другого размера?
- Какая утилита может перенести загрузочный раздел Windows на другой жесткий диск?
Моя ситуация такова:
- Создайте виртуальную машину (VBox) для установки Linux (Debian testing, ядро 3.14).
- Один загрузочный раздел BTRFS, один корневой раздел LUKS BTRFS.
- Для ускорения вносите в виртуальную машину изменения, требующие интенсивного ввода-вывода.
- Перенесите установку на USB-флеш-накопитель.
Моя первая попытка заключалась в использовании жесткого диска в виртуальной машине того же размера, что и флэш-накопитель, и всего dd
этого. По какой-то причине UUID загрузочного раздела не может быть получен и, следовательно, использован для загрузки с флэш-накопителя.
Если я вручную разбиваю флэш-накопитель на загрузочный раздел EXT4 и корневой раздел LUKS BTRFS, то извлечение UUID работает нормально. Затем я использовал rsync -aEXS --progress
для переноса файлов из каждого смонтированного раздела (образ виртуальной машины -> флэш-накопитель). Я chroot
выполнил команду -ed на флэш-накопитель и запустил его 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
- Корневые LUKS:
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
- Корень (предполагается, что он уже был сопоставлен с помощью 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
- Корневые LUKS:
sudo cryptsetup close orig_luks
- Ботинок:
sudo umount /media/orig_boot
- kpartx:
sudo kpartx -d <flash dd image file>
- Корень:
- Chroot на флешку.
- Связывать
/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
- Chroot-окружение:
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
(Примечание: вы можете пересоздать все initrd с помощью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