将 Linux 操作系统从一个驱动器转移到具有不同分区的另一个驱动器

将 Linux 操作系统从一个驱动器转移到具有不同分区的另一个驱动器

首先,一些相关问题:

我的情况如下:

  1. 创建一个虚拟机(VBox)来安装Linux(Debian测试,3.14内核)。
  2. 一个 BTRFS 启动分区,一个 LUKS BTRFS 根分区。
  3. 在虚拟机中进行 IO 密集型修改以提高速度。
  4. 将安装传输至 USB 闪存驱动器。

我最初的尝试是在虚拟机中使用与闪存驱动器大小相同的硬盘,并将dd整个硬盘都使用。由于某种原因,无法检索启动分区的 UUID,因此无法将其用于在闪存驱动器上启动。

如果我手动将闪存驱动器分区为 EXT4 的启动分区和 LUKS BTRFS 的根分区,则 UUID 检索可以正常工作。然后,我习惯rsync -aEXS --progress从每个已安装的分区(VM 映像 -> 闪存驱动器)传输文件。我chroot进入闪存驱动器并grub-install在闪存驱动器设备上运行,同时update-grub更新文件系统 UUID。这不起作用。它无法正确检测/使用加密分区来获取根目录。我试过了,但update-initramfs -u没有成功。

为了实现这一场景,我​​遗漏了什么或者可以做得更好?

答案1

最初的步骤大部分都是正确的,但出于某种原因,我最终得到的是损坏的 initrd。下面总结了所有步骤,这些步骤应该可以为任何有兴趣做同样事情的人提供可行的方案:

  1. 根据需要创建虚拟机。
  2. 使用所需的分区布局安装 Linux 并进行所有所需的更改。在本例中,它由 BTRFS 启动分区和 LUKS 加密的 BTRFS 根分区组成。如果在传输过程中注意正确更新引用,其他布局应该也可以正常工作。
  3. 使用 Linux live ISO 启动之前的 VM,以便您可以离线访问已安装的系统。
  4. 将 USB 闪存驱动器连接到 VM 以进行传输。(注意:您可以创建dd已安装驱动器的映像并保存在 VM 外部,然后可以从普通 Linux 系统中使用该映像。)
  5. 准备闪存驱动器分区。
    1. 选项:dd将原始图像放到闪存驱动器上并跳至步骤 7,然后跳至步骤 10。(注意:在我的情况下,由于未知原因,似乎有必要重新创建分区,因为blkid无法枚举启动 BTRFS 分区的 UUID。)
    2. 选项:使用与原始分区相同的 UUID 创建新分区。假设/dev/sda1用于启动和/dev/sda2根。
      1. 对于 BTRFS 启动分区:sudo mkfs.btrfs -f -L BOOT -U <original UUID> /dev/sda1
      2. 对于 LUKS 根分区:sudo cryptsetup --uuid=<original UUID> luksFormat /dev/sda2
      3. 映射根分区:sudo cryptsetup --allow-discards open --type luks /dev/sda2 flash_luks
      4. 使用 BTRFS 格式化根目录:sudo mkfs.btrfs -f -L ROOT -U <original UUID> /dev/mapper/flash_luks
    3. 选项:使用新 UUID 创建新分区。重复与选项 2 相同的步骤,但删除与 UUID/uuid 相关的参数。使用 记下新 UUID sudo blkid
  6. 挂载原始映像分区。
    1. 为每个分区创建只读环回设备:sudo kpartx -ar <flash dd image file>。假设 kpartx 连接到 loop0。
    2. 为挂载点创建目录:sudo mkdir -p /media/orig_boot /media/orig_root
    3. 引导:sudo mount -r /dev/mapper/loop0p1 /media/orig_boot
    4. Root LUKS:sudo cryptsetup -r open --type luks /dev/mapper/loop0p2 orig_luks
    5. 根:sudo mount -r /dev/mapper/orig_luks /media/orig_root
  7. 挂载闪存驱动器分区。假设/dev/sda1用于启动。
    1. 为挂载点创建目录:sudo mkdir -p /media/flash_boot /media/flash_root
    2. 引导:sudo mount -t btrfs -o nodiratime,noatime,compress=zlib,discard,ssd,space_cache /dev/sda1 /media/flash_boot
    3. 根(假设它之前已经使用 cryptsetup 映射过):sudo mount -t btrfs -o relatime,compress=zlib,discard,ssd,space_cache /dev/mapper/flash_luks /media/flash_root
  8. 复制内容:
    1. 引导:sudo rsync -aEXS --progress /media/orig_boot/ /media/flash_boot
    2. 根:sudo rsync -aEXS --progress /media/orig_root/ /media/flash_root
  9. 卸载原始图像。
    1. 根:sudo umount /media/orig_root
    2. Root LUKS:sudo cryptsetup close orig_luks
    3. 引导:sudo umount /media/orig_boot
    4. 部分x:sudo kpartx -d <flash dd image file>
  10. Chroot 进入闪存驱动器。
    1. 绑定/syssudo mount --bind /sys /media/flash_root/sys
    2. 绑定/devsudo mount --bind /dev /media/flash_root/dev
    3. 绑定/dev/ptssudo mount --bind /dev/pts /media/flash_root/dev/pts
    4. 绑定/procsudo mount --bind /proc /media/flash_root/proc
    5. 卸载启动项:sudo umount /media/flash_boot
    6. 在 root 中重新挂载:sudo mount -t btrfs -o relatime,compress=zlib,discard,ssd,space_cache /dev/sda1 /media/flash_root/boot
    7. Chroot:sudo chroot /media/flash_root
  11. 更新/etc/fstab
    1. 引导行:UUID=<btrfs boot uuid> /boot btrfs nodiratime,noatime,compress=zlib,discard,ssd,space_cache 0 2
    2. 根線:UUID=<btrfs root uuid> / btrfs nodiratime,noatime,compress=zlib,discard,ssd,space_cache 0 1
  12. 更新/etc/crypttabflash_luks UUID=<luks root uuid> none discard,luks
  13. 安装btrfs-tools(若未安装):sudo apt-get install btrfs-tools
  14. 更新启动项。
    1. Initrd(使用 fstab/crypttab 来决定挂载之前需要什么并在启动时提示输入 LUKS 密码):(sudo update-initramfs -u -k all注意:您可以使用重新创建所有 initrds sudo update-initramfs -c -k all,但我没有尝试过以确保。)
    2. Grub(利用 fstab 更新内核启动选项并挂载正确的分区):sudo update-grub
    3. 安装 grub 到 MBR (假设/dev/sda):sudo grub-install --recheck /dev/sda
    4. 退出 chroot:exit
  15. 卸载一切。
    1. sudo umount /media/flash_root/boot
    2. sudo umount /media/flash_root/proc
    3. sudo umount /media/flash_root/dev/pts
    4. sudo umount /media/flash_root/dev
    5. sudo umount /media/flash_root/sys
    6. sudo umount /media/flash_root
    7. sudo cryptsetup close flash_luks

相关内容