首先,一些相关问题:
我的情况如下:
- 创建一个虚拟机(VBox)来安装Linux(Debian测试,3.14内核)。
- 一个 BTRFS 启动分区,一个 LUKS BTRFS 根分区。
- 在虚拟机中进行 IO 密集型修改以提高速度。
- 将安装传输至 USB 闪存驱动器。
我最初的尝试是在虚拟机中使用与闪存驱动器大小相同的硬盘,并将dd
整个硬盘都使用。由于某种原因,无法检索启动分区的 UUID,因此无法将其用于在闪存驱动器上启动。
如果我手动将闪存驱动器分区为 EXT4 的启动分区和 LUKS BTRFS 的根分区,则 UUID 检索可以正常工作。然后,我习惯rsync -aEXS --progress
从每个已安装的分区(VM 映像 -> 闪存驱动器)传输文件。我chroot
进入闪存驱动器并grub-install
在闪存驱动器设备上运行,同时update-grub
更新文件系统 UUID。这不起作用。它无法正确检测/使用加密分区来获取根目录。我试过了,但update-initramfs -u
没有成功。
为了实现这一场景,我遗漏了什么或者可以做得更好?
答案1
最初的步骤大部分都是正确的,但出于某种原因,我最终得到的是损坏的 initrd。下面总结了所有步骤,这些步骤应该可以为任何有兴趣做同样事情的人提供可行的方案:
- 根据需要创建虚拟机。
- 使用所需的分区布局安装 Linux 并进行所有所需的更改。在本例中,它由 BTRFS 启动分区和 LUKS 加密的 BTRFS 根分区组成。如果在传输过程中注意正确更新引用,其他布局应该也可以正常工作。
- 使用 Linux live ISO 启动之前的 VM,以便您可以离线访问已安装的系统。
- 将 USB 闪存驱动器连接到 VM 以进行传输。(注意:您可以创建
dd
已安装驱动器的映像并保存在 VM 外部,然后可以从普通 Linux 系统中使用该映像。) - 准备闪存驱动器分区。
- 选项:
dd
将原始图像放到闪存驱动器上并跳至步骤 7,然后跳至步骤 10。(注意:在我的情况下,由于未知原因,似乎有必要重新创建分区,因为blkid
无法枚举启动 BTRFS 分区的 UUID。) - 选项:使用与原始分区相同的 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
- Root 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
- Root LUKS:
sudo cryptsetup close orig_luks
- 引导:
sudo umount /media/orig_boot
- 部分x:
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
- 在 root 中重新挂载:
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
注意:您可以使用重新创建所有 initrdssudo 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