GRUB 混淆了 Ubuntu 和 Arch Linux 安裝的核心/initramfs
我有一台用於雙引導 Ubuntu(目前為 16.04)和 Windows 7 的機器,使用 Ubuntu 的 GRUB 作為引導載入程序。
現在我剛剛按照官方安裝說明添加了 Arch Linux 作為第三個作業系統。我沒有從 Arch 安裝 GRUB,因為我想使用 Ubuntu 控制的那個。指令包含一個命令,該命令
mkinitcpio -p linux
可能會生成一些我按照描述執行的引導文件。現在,當我嘗試通過其預設條目從 GRUB 啟動 Ubuntu 時,我收到了這個令人不快的錯誤(對於螢幕照片感到抱歉):
作為
uname -a
顯示的輸出,它正在嘗試引導 Arch 核心,但/dev/sda6
它是 Ubuntu 根分區。我必須導航到
Advanced options for Ubuntu
並選擇其中一個Ubuntu, with Linux 4.4.0-*
條目才能載入 Ubuntu,但我找不到可以正確載入 Arch 的條目。
sudo update-grub
從 Ubuntu執行( “update-grub
是執行grub-mkconfig -o /boot/grub/grub.cfg
以生成 grub2 配置文件的存根。”)不會改變任何東西。到目前為止,該grub-customizer
工具也無法解決此問題。是什麼導致了 GRUB 的這種混亂,我該如何解決它,以便每個 Linux 版本都使用正確的核心和正確的分區啟動?
看起來我愚蠢地安裝了帶有 Ubuntu 的 /boot 的 Arch,所以它可能將它的引導文件放在那裡。
我可以刪除所有與 Arch 相關的內容,以便再次直接啟動 Ubuntu 的引導載入程序,並在稍後進行 Arch 的全新安裝。
更新(感謝@terdon 在 Ask Ubuntu 聊天中的支持):
這是我的
/boot/grub/grub.cfg
。所有 Linux 條目似乎都指向我的 /dev/sda6 分區,這是 Ubuntu 的根目錄:
$ grep ' linux /' /boot/grub/grub.cfg linux /vmlinuz-linux root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro linux /vmlinuz-linux root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro linux /vmlinuz-linux root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro linux /vmlinuz-linux root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro init=/sbin/upstart linux /vmlinuz-linux root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro recovery nomodeset linux /vmlinuz-4.4.0-21-generic root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro linux /vmlinuz-4.4.0-21-generic root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro init=/sbin/upstart linux /vmlinuz-4.4.0-21-generic root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro recovery nomodeset linux /vmlinuz-4.2.0-35-generic root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro linux /vmlinuz-4.2.0-35-generic root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro init=/sbin/upstart linux /vmlinuz-4.2.0-35-generic root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro recovery nomodeset
我嘗試從 Ubuntu 更新 GRUB 配置:
$ sudo grub-mkconfig -o /boot/grub/grub.cfg Generating grub configuration file ... dpkg: warning: version 'linux' has bad syntax: version number does not start with a digit Found linux image: /boot/vmlinuz-linux Found initrd image: /boot/initramfs-linux.img Found linux image: /boot/vmlinuz-4.4.0-21-generic Found initrd image: /boot/initrd.img-4.4.0-21-generic Found linux image: /boot/vmlinuz-4.2.0-35-generic Found initrd image: /boot/initrd.img-4.2.0-35-generic Found memtest86+ image: /memtest86+.elf Found memtest86+ image: /memtest86+.bin Found Windows 7 (loader) on /dev/sda1 Found Arch on /dev/sda8 done
我嘗試從 Ubuntu 將 GRUB 重新安裝到 MBR:
$ sudo grub-install /dev/sda Installing for i386-pc platform. Installation finished. No error reported. $ sudo grub-install --recheck /dev/sda Installing for i386-pc platform. Installation finished. No error reported.
順便說一句,這些是已安裝的 Ubuntu 核心包,我確實嘗試了
dpkg-reconfigure
所有這些包,但對問題沒有任何影響:$ dpkg -l linux-image* | grep ^ii ii linux-image-4.2.0-35-generic 4.2.0-35.40 amd64 Linux kernel image for version 4.2.0 on 64 bit x86 SMP ii linux-image-4.4.0-21-generic 4.4.0-21.37 amd64 Linux kernel image for version 4.4.0 on 64 bit x86 SMP ii linux-image-extra-4.2.0-35-generic 4.2.0-35.40 amd64 Linux kernel extra modules for version 4.2.0 on 64 bit x86 SMP ii linux-image-extra-4.4.0-21-generic 4.4.0-21.37 amd64 Linux kernel extra modules for version 4.4.0 on 64 bit x86 SMP
我還嘗試重新生成 Ubuntu initramfs:
$ sudo update-initramfs -u -k all update-initramfs: Generating /boot/initrd.img-4.4.0-21-generic update-initramfs: Generating /boot/initrd.img-4.2.0-35-generic
我的分區佈局:
從 Ubuntu 系統檢查。標籤應該自我解釋。
$ lsblk -f /dev/sda NAME FSTYPE LABEL UUID MOUNTPOINT sda ├─sda1 ntfs win7-boot 90DCF3A5DCF3842E /win/boot ├─sda2 ntfs windows7 482C7A572C7A3FCC /win/c ├─sda3 ext4 grub-boot 6dbb8633-dadd-4b5e-8d85-b0895fde9dfb /boot ├─sda5 ext4 images 81dc42c4-a161-4ccd-b704-6e5c09298943 /images ├─sda6 ext4 ubuntu-1604 eee18451-b607-4875-8a88-c9cb6c6544c8 / ├─sda7 ext4 ubuntu-home 485b3ef1-7216-4053-b25c-f656d529e8e6 /home ├─sda8 ext4 arch-root 8d281a0c-969c-44cf-ba6a-1d3c7b4be7ec ├─sda9 ext4 arch-home 32522902-a53d-44c8-90f2-6bbf14c40f1f └─sda10 swap linux-swap 8b05bd9b-bc42-46f6-8c18-50711a3c48b9 [SWAP]
我的 GRUB 菜單結構:
Ubuntu 的高級選項:
Arch 的高級選項:
我的
/boot
目錄:$ ls -la /boot total 118480 drwxr-xr-x 4 root root 4096 Apr 24 20:50 . drwxr-xr-x 28 root root 4096 Apr 24 19:44 .. -rw-r--r-- 1 root root 1313029 Mär 16 01:45 abi-4.2.0-35-generic -rw-r--r-- 1 root root 1239577 Apr 19 00:21 abi-4.4.0-21-generic -rw-r--r-- 1 root root 184888 Mär 16 01:45 config-4.2.0-35-generic -rw-r--r-- 1 root root 189412 Apr 19 00:21 config-4.4.0-21-generic drwxr-xr-x 6 root root 4096 Apr 26 19:58 grub -rw-r--r-- 1 root root 18598360 Apr 24 20:59 initramfs-linux-fallback.img -rw-r--r-- 1 root root 3516429 Apr 24 20:59 initramfs-linux.img -rw-r--r-- 1 root root 33642388 Apr 24 18:31 initrd.img-4.2.0-35-generic -rw-r--r-- 1 root root 36143341 Apr 24 19:51 initrd.img-4.4.0-21-generic drwx------ 2 root root 16384 Okt 28 17:43 lost+found -rw-r--r-- 1 root root 182704 Jan 28 13:44 memtest86+.bin -rw-r--r-- 1 root root 184380 Jan 28 13:44 memtest86+.elf -rw-r--r-- 1 root root 184840 Jan 28 13:44 memtest86+_multiboot.bin -rw------- 1 root root 3745312 Mär 16 01:45 System.map-4.2.0-35-generic -rw------- 1 root root 3853719 Apr 19 00:21 System.map-4.4.0-21-generic -rw------- 1 root root 6829104 Mär 16 01:45 vmlinuz-4.2.0-35-generic -rw------- 1 root root 7013968 Apr 19 00:21 vmlinuz-4.4.0-21-generic -rw-r--r-- 1 root root 4435552 Apr 14 19:20 vmlinuz-linux
4.4.0 和 4.2.0 核心應該是 Ubuntu,Arch 應該有 4.5.0 核心。但是如何找出名稱中沒有核心版本的文件屬於什麼?
我的 Ubuntu 根目錄(不包括目錄):
$ ls -la / | grep ^[^d] total 124 lrwxrwxrwx 1 root root 32 Apr 24 19:44 initrd.img -> boot/initrd.img-4.4.0-21-generic lrwxrwxrwx 1 root root 32 Apr 5 17:45 initrd.img.old -> boot/initrd.img-4.2.0-35-generic lrwxrwxrwx 1 root root 29 Apr 24 19:44 vmlinuz -> boot/vmlinuz-4.4.0-21-generic lrwxrwxrwx 1 root root 29 Apr 5 17:45 vmlinuz.old -> boot/vmlinuz-4.2.0-35-generic
我的Arch 根目錄不包含任何文件或連結。
/boot
我終於通過從軌道上對我的 Ubuntu 目錄中的 Arch 分區及其引導文件進行核對來解決它。Ubuntu 現在又好了,所有剩餘的 GRUB 條目都可以正常工作了。這是我所做的事情的清單:
- 刪除 Arch 的
initramfs
文件:sudo rm /boot/initramfs-linux*
- 刪除 Arch 的
vmlinuz
文件:sudo rm vmlinuz-linux
/dev/sda8
使用 GParted格式化 Arch 分區 ( )- 更新 GRUB 的配置:
sudo update-grub
- 重新啟動並享受!
手動修復 grub.cfg(不推薦)
看著你的
grub.cfg
Ubuntu 條目已損壞(以及以下一些條目)
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-eee18451-b607-4875-8a88-c9cb6c6544c8' { recordfail load_video gfxmode $linux_gfx_mode insmod gzio if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi insmod part_msdos insmod ext2 set root='hd0,msdos3' if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos3 --hint-efi=hd0,msdos3 --hint-baremetal=ahci0,msdos3 6dbb8633-dadd-4b5e-8d85-b0895fde9dfb else search --no-floppy --fs-uuid --set=root 6dbb8633-dadd-4b5e-8d85-b0895fde9dfb fi linux /vmlinuz-linux root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro initrd /initramfs-linux.img }
最後兩行是 grub 發出的載入核心和 initrd 的命令,目前正在尋找 ARCH 核心和 initiramfs。此外,它會在可能託管或不託管預期 Ubuntu 文件的
/
in 分區下查找它們。uuid=eee18451-b607-4875-8a88-c9cb6c6544c8
您可以通過以下方式解決此問題:
sudo blkid
獲取 ubuntu 根分區的 uuid。
然後將最後兩行替換為最新核心和 initrd 映像的 simlink(因為這是 ubuntu 期望的方式)
linux /vmlinuz root=UUID=<correct-uuid-ubuntu-partition> ro initrd /initrd.img
如果這不能立即修復它,則可能需要進行一些其他更正。您可以通過“複製”其中一個經過測試和工作的條目來找到它們,我建議您使用最普通的條目(例如,沒有新貴或其他核心參數,例如 nomodeset 被傳遞)。
這應該是一個很好的候選人:
menuentry 'Ubuntu, with Linux 4.4.0-21-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-21-generic-advanced-eee18451-b607-4875-8a88-c9cb6c6544c8'
Arch 條目同樣被破壞,因為它可能在 Ubuntu 根分區下查找 Arch initramfs 和核心。它們的預設位置在 /boot 下。通過更正位置並檢查根分區 uuid 是否包含 Arch 根來調整 Arch 條目的最後兩行。
一個(幾個)字的警告:
通常不建議 Ubuntu 使用者
grub.cfg
手動操作。明確地複制它並小心編輯。準備好您的系統無法啟動的可能性(但您將能夠使用我的舊答案中概述的啟動過程來恢復它)。此外,雖然這一次可能會解決您的問題,但下次您必須重新填充 grub 菜單時,它可能會回來咬您。出於某種原因,ubuntu 下 grub 的作業系統探測被 /boot 下 Arch 核心的存在弄糊塗了。我猜想boot-repair之類的實用程序應該能夠正確地使您的所有發行版都可啟動,但是如果我沒記錯的話,它對您不起作用。
一種永久性修復可能包括將 Arch 核心和映像安裝在與預設 /boot 不同的目錄中。這很繁瑣,您應該查閱 Arch wiki 的 grub 條目以了解如何正確執行此操作。
舊答案(如果您打算長期改用 Arch,建議您這樣做) 這是我會做的事情,而且幾個月前就已經做到了。
轉到arch wiki grub 頁面並讀出分區表的相關部分(您可能是 UEFI,因此請閱讀有關 ESP 等的內容)。
手動啟動 Arch
這是我建議嘗試的一種高度形成性的體驗。假設您的 Arch Linux 核心位於磁碟上的某個位置,請
c
在 grub 提示符下按並輸入 ls 以查看設備和分區列表,如下所示(hd0,msdos1),(hd1,gpt1),...
。您可以 ls 每個人查看內容。你需要弄清楚三件事:
- 你的 Arch
/
根分區在哪裡- 你的 Arch 核心在哪裡
vmlinuz
- 你的拱門在哪裡
intiramfs-linux.img
一旦擁有這三個,您將在 grub> 提示符下執行三個命令,類似於此。
grub> set root=(hd0,1) grub> linux /vmlinuz root=/dev/sda1 grub> initrd /intiramfs-linux.img grub> boot
請注意,grub 可以找到,例如
grub> find /sbin/init
(一個 grub 無法自動找到並給您帶來核心恐慌;))
我在這裡學到的所有這些,我強烈推薦的來源。如果可以,請跳到修復 grub!除此以外…
從實時密鑰啟動 Arch!
chroot
獲取一個實時的 Arch 環境,並按照與第一次相同的方式 將安裝 wiki 跟踪到 Arch。修復蠐螬
從 Arch 內部,安裝相關的 grub 包,特別
os-prober
是允許grub-install
檢測您的其他系統。仔細遵循那裡的安裝指南,您應該能夠(至少)從 grub 菜單啟動 arch 和 ubuntu。安裝命令最終看起來像這樣。** 警告 ** 不要執行這些命令,它們是範例,您需要製定適合您系統的命令
# grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=grub --recheck # grub-mkconfig -o /boot/grub/grub.cfg
** 如果一切都失敗了 **
不幸的是,鑑於資訊數量有限,這與它一樣具體,而 SE 並不是此類問題的真正論壇,因此我的“通用”答案指的是有用的資源。
如果您無法弄清楚,可以訪問 Arch 論壇,只要您已經盡力並事先閱讀了文件,您可能會找到幫助。
通過 Arch 完成這一切對我來說是一次基本的學習經歷。