Boot

Clonezilla 和 BTRFS、GRUB 和引導

  • October 13, 2019

我將安裝了 OpenSUSE Tumbleweed 的 Btrfs 驅動器複製到帶有 Clonezilla 的更大驅動器上,我什至嘗試逐個扇區進行此操作。然而,即使該過程似乎每次都成功完成,但當我嘗試從新驅動器啟動時,會出現 Ubuntu GRUB,當然沒有載入任何內容。我假設 Ubuntu 菜單來自 Clonezilla 本身,但為什麼 Clonezilla 不能完全複製所有內容呢?

此外,我無法從 OpenSUSE 安裝新驅動器。在分區管理器中可以看到該驅動器,但沒有可用的掛載選項。

有人可以澄清是什麼導致驅動器複製無法啟動甚至無法掛載嗎?我認為 Btrfs 有一些特殊的細節,但我不知道為什麼逐個扇區的複製不會產生所有內容的相同副本,從而使磁碟可引導和可掛載。將不勝感激一些幫助。

更新:我能夠在“mount”錯誤的幫助下使分區可掛載:“系統呼叫失敗:文件存在。”但我仍然無法從它啟動。/home/此外,由於某種原因,新磁碟下沒有使用者目錄,儘管應該是相同的副本。

好的,所以根據您的lsblk輸出您的/etc/fstab,您基本上擁有一個全btrfs系統,但 EFI 系統分區除外。

請注意,單個btrfs文件系統可以擴展到單個分區甚至多個磁碟:由於您的lsblk輸出沒有說明您/dev/sdc的用途,它可能被用作btrfs包含子卷的擴展/home。這可以解釋為什麼它不在複製上,或者您可能只是未能安裝所有不同的子卷。您可以使用btrfs filesystem show查看哪些設備/分區屬於每個已掛載的btrfs文件系統。

當您btrfstune -m /dev/sdb3按照您在連結的另一個問題的評論中提到的那樣執行時,它更改了複製文件系統的 UUID,因此複製文件系統上的 UUID 條目/etc/fstab不再正確。您必須在/etc/fstab複製文件中修復它們,也可能在其 GRUB 配置和/或 initramfs 中修復它們。您可以使用lsblk -o +UUID來查看新的文件系統 UUID。此 UUID 由 GRUB 和 Linux 核心使用,但不由 UEFI 韌體使用。它儲存在文件系統元數據中。

你必須做這樣的事情:

mount /dev/sdb3 /mnt
mount -o subvol=/@/boot/grub2/x86_64-efi /dev/sdb3 /mnt/boot/x86_64-efi
mount /dev/sdb1 /mnt/boot/efi

進而:

  • 編輯/mnt/etc/fstab以替換引用 btrfs 文件系統的每一行上的文件系統 UUID
  • 編輯/mnt/boot/grub/grub.cfg(或者可能/mnt/boot/efi/EFI/opensuse/grub.cfg取決於 OpenSuSE 放置其實際 GRUB 配置的位置)以替換核心引導選項行上的文件系統 UUID
  • 編輯/mnt/etc/default/grub以替換文件系統 UUID,以便在安裝核心更新或出於其他原因重新生成 GRUB 配置時,舊 UUID 不會意外返回
  • 也許完全重新創建您的 initramfs 文件

如果需要重新創建 initramfs 文件(如果它完全依賴核心引導參數來查找根文件系統,則可能沒有必要),此時您可以這樣做:

mount -t proc none /mnt/proc
mount -t sysfs none /mnt/sys
mount -o bind /dev /mnt/dev
chroot /mnt /bin/bash
mkinitrd   # or whatever is the appropriate command for OpenSuSE
exit
  • 最後解除安裝你安裝的所有東西

要讓系統真正從複製磁碟啟動,您需要為其定義一個 UEFI 啟動變數。從您的efibootmgr -v輸出中,OpenSuSE 引導條目通過分區 UUID引用 EFI 系統分區。這是一個單獨的 UUID,僅供 UEFI 韌體使用。它儲存在 GPT 分區表中。

Boot0000* opensuse-secureboot   HD(1,GPT,e099a79f-8b66-412d-89ae-a4869876f500,0x800,0x100000)/File(\EFI\opensuse\shim.efi)

您可以使用 . 查看分區 UUID lsblk -o +PARTUUID

擁有兩個具有相同分區 UUID 的磁碟可能會混淆您的系統韌體,或者韌體可能會簡單地選擇具有匹配 UUID 的第一個磁碟。如果您打算將兩個磁碟保留在同一台電腦中,則可能必須使用更改分區 UUID sgdisk --partition-guid=1:R /dev/sdb(此命令將為分區 #1 on 生成一個新的隨機分區 UUID /dev/sdb)。

完成後,您需要為複製的磁碟創建一個新的 UEFI 引導變數。該命令將類似於efibootmgr -c -d /dev/sdb -l \\EFI\\opensuse\\shim.efi -L opensuse-clone. 注意雙反斜杠,因為反斜杠是 shell 的特殊轉義字元;ESP 文件系統是 FAT32,因此 UEFI 韌體使用 MS-DOS/Windows 樣式的反斜杠作為路徑分隔符,而不是 Unix 樣式的正斜杠。有用的是,此命令將自動從指定驅動器讀取分區 UUID,因此您不必鍵入它。

(您可能希望使用efibootmgr -B -b XXXXXXXX 是您過去安裝的一個 Linux 的 BootXXXX 編號,以從系統 NVRAM 中清除過時的 UEFI 引導變數。)

但如果您打算將磁碟移動到另一台電腦,則無需更改分區 UUID,但應在作為複製磁碟接收方的系統上創建 UEFI 引導變數。您可能會使用一些 Linux Live 引導媒體來執行此操作,但請確保您從專門以 UEFI 樣式的媒體引導,否則您將無法訪問 UEFI 引導變數。

\EFI\Boot\bootx64.efi或者,如果您需要複製磁碟在任何 UEFI 系統上可引導而無需進行大量準備,您應該在複製磁碟的 ESP 分區上的備用/可移動媒體引導載入程序路徑中設置 UEFI 引導載入程序的副本。不幸的是,我手頭沒有 OpenSuSE UEFI 引導載入程序的確切設置資訊,因此我無法為您提供確切的步驟。

要訪問複製磁碟上的 ESP,您必須先掛載它,例如:

mount /dev/sdb1 /mnt

然後您可以將備份引導載入程序放在/mnt/EFI/BOOT/bootx64.efi,它現在對應於\EFI\BOOT\bootx64.efiUEFI 韌體使用的 DOS 樣式路徑名。

引用自:https://unix.stackexchange.com/questions/546510