在現有的問題中,這看起來與我正在做的事情最相似,只是我嘗試擴大我的分區,但我不知道為什麼 /boot/ 和 /boot/efi 安裝了不同的分區,以及如何繼續而不用擔心。
到目前為止,我創建了一個新分割區,將其安裝到/newBoot
並執行了操作sudo rsync -a /boot/ /newBoot/
,所以我假設我在新分割區中擁有要切換的所有相關檔案。
$ lsblk -e 7 -o name,fstype,size,fsused,label,partlabel,mountpoint,uuid,partuuid
NAME FSTYPE SIZE FSUSED LABEL PARTLABEL MOUNTPOINT UUID PARTUUID
sda 7.3T
└─sda1 crypto 7.3T 4dffc196-9926-43d9-a7c8-38898681f402 85b3a656-4886-4b37-b9c1-2acb0158587a
...
nvme0n1 931.5G
├─nvme0n1p1 vfat 512M 5.3M EFI System Partition
│ /boot/efi FD0E-EECA 587cf214-f068-4879-a833-9dffa5ec6e3d
├─nvme0n1p2 ext2 488M 313.7M /boot 606a1976-d1c2-4246-a256-a8afddb04f84 2e10e277-560f-4f5e-abce-1dce5187a7f0
...
└─nvme0n1p4 vfat 1.5G NEWBOOT newboot 530D-4828 ea886018-714f-46fb-8f21-785c74543891
$ efibootmgr -v
BootCurrent: 0004
Timeout: 1 seconds
BootOrder: 0004
Boot0004* ubuntu HD(1,GPT,587cf214-f068-4879-a833-9dffa5ec6e3d,0x800,0x100000)/File(\EFI\UBUNTU\SHIMX64.EFI)
$ sudo efibootmgr -c -L ubuntuNew -l \\EFI\\UBUNTU\\SHIMX64.EFI
$ efibootmgr -v
BootCurrent: 0004
Timeout: 1 seconds
BootOrder: 0000,0004
Boot0000* ubuntuNew HD(1,GPT,85b3a656-4886-4b37-b9c1-2acb0158587a,0xffff,0x3a3535ca9)/File(\EFI\UBUNTU\SHIMX64.EFI)
Boot0004* ubuntu HD(1,GPT,587cf214-f068-4879-a833-9dffa5ec6e3d,0x800,0x100000)/File(\EFI\UBUNTU\SHIMX64.EFI)
因此,雖然我不明白為什麼當前資料夾中有兩個分割區/boot
,但我認為一個也應該可以工作?至少這樣閱讀了上面連結的問題的選定答案,對嗎?
現在還缺什麼?/etc/fstab
?
$ cat /etc/fstab
...
UUID=606a1976-d1c2-4246-a256-a8afddb04f84 /boot ext2 defaults 0 2
...
UUID=FD0E-EECA /boot/efi vfat umask=0077 0 1
...
現在根據lsblk
and efibootmgr -v
(感謝@oldfred),新的第一個啟動選項將要使用sda1
and not nvme0n1p4
。sda1
是一個外部驅動器,我當然不想從中啟動。怎麼就默認了呢?
- 缺少什麼更改,因此它從新分區啟動?
- 重新啟動之前是否必須更改fstab 中
UUID
的?/boot
- 我需要一個單獨的分割區嗎
/boot/efi
?
答案1
將/boot
和都/boot/efi
作為單獨的檔案系統是多餘的,但是:
- 基於 BIOS 的非常舊的系統可能需要單獨的
/boot
分區以避免 BIOS 限制 - 任何以 UEFI 方式啟動的系統都需要
/boot/efi
或等效的 ESP 分割區,因為韌體希望在其中找到引導程式檔案。 - 擁有單獨的未加密
/boot
將允許使用cryptsetup
根檔案系統支援的任何加密方法,而不是 GRUB 理解的更有限的加密集。
現代 Debian/Ubuntu 的預設分區將兩者作為單獨的分區,因此預設配置可以覆蓋盡可能廣泛的系統。
如同 oldfred 的評論中所提到的,UEFI 透過 GPT 分割表中分割區唯一的 GUID 來識別要使用的 ESP 分割區。該 GUID 在 Linux 中稱為 PARTUUID。lsblk -o +partuuid
將顯示它。
你的efibootmgr
命令幾乎是正確的。要使用正確的磁碟建立 ubuntuNew 開機選項,您應該使用:
sudo efibootmgr -c -d /dev/nvme0n1 -L ubuntuNew -l \\EFI\\UBUNTU\\SHIMX64.EFI
efibootmgr
將自行尋找 PARTUUID 並自動使用它來建立新的啟動項目。您只需指定磁碟(除非磁碟上有多個 EFI 系統分割區)。
一旦shimx64.efi
加載grubx64.efi
,在配置 Debian/Ubuntu 風格的系統上,它將在grub.cfg
與grubx64.efi
.該檔案僅包含幾行,標識包含該目錄的檔案系統的檔案系統 UUID /boot
(無論它是單獨的分割區還是根檔案系統上的常規目錄)。因此,Debian/Ubuntu 系統可以總是/boot/grub/grub.cfg
無論系統使用 BIOS 還是 UEFI,“主”GRUB 設定檔都位於。如果你有大量不同年代的系統,那就很方便了。
/boot/grub2/grub.cfg
作為參考,RedHat 7 和 8 在BIOS 式系統上以及/boot/efi/EFI/redhat/grub.cfg
UEFI 系統上具有實際的 GRUB 配置。
然而,如果要合併/boot
和/boot/efi
,有幾點要注意:
- 給定的引導程式路徑
efibootmgr
基於 ESP 檔案系統的根。最初該路徑始於/boot/efi
,因此從 Linux 來看\\EFI\\UBUNTU\\SHIMX64.EFI
是指。/boot/efi/EFI/UBUNTU/SHIMX64.EFI
如果您只使用/boot
,那麼您需要將 UBUNTU 目錄上移一級,或將引導程式路徑指定為\\EFI\\EFI\\UBUNTU\\SHIMX64.EFI
。 /boot
需要是 GRUB 可以理解的東西,以便它可以從那裡載入核心和 initramfs 檔案。 Ubuntu 的 UEFI 版本的 GRUB 肯定會理解 ext2 和 vfat;因此,如果將/boot
和合併/boot/efi
到單一 vfat 分割區中,GRUB 將不會有任何問題。您不能使用 ext2,因為韌體需要從該分割區讀取 SHIMX64.EFI 和 GRUBX64.EFI,而典型的 UEFI 韌體將無法辨識 ext2。- 在開機時,
/boot
只有 GRUB 需要,Linux 核心不需要:您可以不/boot
掛載,系統仍然可以正常開機。但您需要保持/boot
掛載狀態,以便核心更新可以正常進行。 (或者,如果您確實想透過卸載它來隱藏它,那麼您可以添加腳本以/etc/kernel/pre*.d/
在安裝核心更新之前自動安裝它,並/etc/kernel/post*.d
在安裝/刪除特定核心包完成後再次卸載它。)
如果您沒有牢牢掌握需求是什麼,引導程式通常會被認為是「可怕且危險的」。另一方面,它通常是相當獨立的,因此與引導程式相關的問題通常並不難修復......一旦您克服了從外部媒體引導系統的第一個障礙,那麼您就可以開始修復它。我不會說具有非功能性引導程式的系統是“祝酒”:它只需要一點外部幫助。
答案2
引導程式將尋找您目前已安裝的內容/boot/efi
,因此,如果您不想擴大該分割區,則可以按原樣保留該分割區,只需對檔案進行一個微小的更改,如下所述。
準備新的啟動分區
- 建立一個
ext2
具有所需大小的新分割區。這個分割區不需要引導標誌 - 您的 efi 分割區是入口點並將委託給這個新分割區。 - 將新分割區安裝到某處。
/newBoot
例如 - 從舊的啟動分區複製文件,例如使用
rsync --recursive --delete --archive /boot/ /newBoot/
- 刪除 的內容
/newBoot/efi/
,這裡只是一個資料夾:rm -rf /newBoot/efi/EFI/
。不要刪除newBoot/efi/
。我們想efi
在那裡安裝舊資料夾。
告訴efi
使用新分區
找出/newBoot
的 UUID:
$ lsblk -e 7 -o name,fstype,size,fsused,label,partlabel,mountpoint,uuid,partuuid
NAME FSTYPE SIZE FSUSED LABEL PARTLABEL MOUNTPOINT UUID PARTUUID
nvme0n1 931.5G
├─nvme0n1p1 vfat 512M 5.3M EFI System Partition /boot/efi FD0E-EECA 587cf214-f068-4879-a833-9dffa5ec6e3d
├─nvme0n1p2 ext2 488M 313.7M /boot 606a1976-d1c2-4246-a256-a8afddb04f84 2e10e277-560f-4f5e-abce-1dce5187a7f0
├─nvme0n1p3 crypto_LUKS 927.7G e7f674b8-4bec-4502-a1e5-0e93aa34786f 2fed2ecb-b548-479b-aa3f-7f1bbfb9981f
│ └─sda3_crypt LVM2_member 927.7G 9tx8Yv-XDCR-RmGf-fmXo-WiX2-SDpG-xH1si4
│ ├─ubuntu--gnome--vg-root ext4 911.6G 734.2G / 1cccfb0a-69da-4246-a071-52f882681418
│ └─ubuntu--gnome--vg-swap_1 swap 15.8G [SWAP] e3facfb8-db2e-426d-aef4-b6c81004fd6f
└─nvme0n1p4 ext2 1.5G newBoot newBoot 5aca79e7-b740-46d3-bc76-aa7e8b8b93da 9e8baf2f-2118-4042-9c47-7ffb824ada52
進行相應的編輯/boot/efi/EFI/ubuntu/grub.cfg
,將舊的當前 UUID 替換為新的 UUID:
# cat /boot/efi/EFI/ubuntu/grub.cfg
# search.fs_uuid 606a1976-d1c2-4246-a256-a8afddb04f84 root
search.fs_uuid 5aca79e7-b740-46d3-bc76-aa7e8b8b93da root
set prefix=($root)'/grub'
configfile $prefix/grub.cfg
整理起來
現在系統應該已經從新分區啟動,但從/boot/
新分區啟動後將是舊分區。編輯/etc/fstab
以便系統更新找到其位置的所有檔案:
# UUID=606a1976-d1c2-4246-a256-a8afddb04f84 /boot ext2 defaults 0 2
UUID=5aca79e7-b740-46d3-bc76-aa7e8b8b93da /boot ext2 defaults 0 2
/boot/efi
中的行保持/etc/fstab
原樣:
UUID=FD0E-EECA /boot/efi vfat umask=0077 0 1