Ubuntu

GRUB 混淆了 Ubuntu 和 Arch Linux 安裝的核心/initramfs

  • August 11, 2017

我有一台用於雙引導 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 菜單結構:

GRUB 首頁

Ubuntu 的高級選項:

用於 Ubuntu 的 GRUB 高級選項

Arch 的高級選項:

Arch 的 GRUB 高級選項


我的/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 完成這一切對我來說是一次基本的學習經歷。

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