將 Linux 作業系統從一個磁碟機傳輸到具有不同分割區的另一個磁碟機

將 Linux 作業系統從一個磁碟機傳輸到具有不同分割區的另一個磁碟機

首先,一些相關問題:

我的情況如下:

  1. 建立虛擬機器(VBox)來安裝Linux(Debian測試,3.14核心)。
  2. 1 個 BTRFS 啟動分區,1 個 LUKS BTRFS 根分區。
  3. 在虛擬機器中進行 IO 密集型修改以提高速度。
  4. 將安裝傳輸到 USB 隨身碟。

我最初的嘗試是在虛擬機器中使用與閃存驅動器大小相同的硬碟以及整個dd磁碟。由於某種原因,無法檢索啟動分割區的 UUID,因此無法將其用於在快閃磁碟機上啟動。

如果我使用 EXT4 的啟動分割區和 LUKS BTRFS 的根分割區手動對快閃磁碟機進行分割區,則 UUID 會擷取工作正常。然後,我用於rsync -aEXS --progress從每個已安裝的分割區(VM 映像 -> 隨身碟)傳輸檔案。我chroot將其寫入閃存驅動器並grub-install在閃存驅動器設備上運行,同時update-grub更新檔案系統 UUID。這不起作用。它無法正確偵測/使用加密分割區來取得root權限。我嘗試過update-initramfs -u但沒有成功。

我錯過了什麼或可以做得更好來執行這個場景?

答案1

最初的步驟大部分是正確的,但由於某種原因,我總是以損壞的 initrd 結束。以下總結了所有步驟,這些步驟應該為有興趣執行相同操作的任何人提供一個工作場景:

  1. 根據需要建立虛擬機器。
  2. 使用所需的分割區佈局安裝 Linux 並進行所有所需的變更。在本例中,它由 BTRFS 引導分割區和 LUKS 加密的 BTRFS 根分割區組成。如果在傳輸過程中註意正確更新引用,其他佈局應該可以工作。
  3. 使用 Linux live ISO 啟動之前的 VM,以便您可以離線存取已安裝的系統。
  4. 將 USB 隨身碟連接到 VM 以進行傳輸。 (注意:您可以建立dd已安裝磁碟機的映像並將其保存在虛擬機器外部,然後您可以在普通的 Linux 系統中使用該映像。)
  5. 準備閃存驅動器分區。
    1. 選項:將原始映像複製到快閃磁碟機上,然後跳到步驟 7,然後跳到步驟 10 ddblkid
    2. 選項:使用與原始分割區相同的 UUID 建立新分割區。假設/dev/sda1用於啟動和/dev/sda2root。
      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. 根樂: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. 根樂:sudo cryptsetup close orig_luks
    3. 啟動:sudo umount /media/orig_boot
    4. kpartx: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. 重新掛載到根目錄內: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注意:您可以使用 重新建立所有 initrd 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

相關內容