![更新至 grub 2 后未重新启动至最新内核](https://linux22.com/image/1147576/%E6%9B%B4%E6%96%B0%E8%87%B3%20grub%202%20%E5%90%8E%E6%9C%AA%E9%87%8D%E6%96%B0%E5%90%AF%E5%8A%A8%E8%87%B3%E6%9C%80%E6%96%B0%E5%86%85%E6%A0%B8.png)
我习惯从 apt 安装 ubuntu 核心更新,然后重新启动以获取最新内核。但是,这个过程似乎在我的一台服务器上无法正常工作。内核 4.10.0-21 已安装,但机器重新启动时似乎只使用 4.10.0-20。
在此期间apt 更新 grub2 的过程,一个对话框询问我是否要链接我的旧 grub 配置。我选择了“否”。我认为这可能是问题的一部分。
更新 grub 似乎做了正确的事情,它将最新的内核放在首位:
$ sudo update-grub
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.10.0-21-generic
Found initrd image: /boot/initrd.img-4.10.0-21-generic
Found linux image: /boot/vmlinuz-4.10.0-20-generic
Found initrd image: /boot/initrd.img-4.10.0-20-generic
Found memtest86+ image: /boot/memtest86+.elf
Found memtest86+ image: /boot/memtest86+.bin
done
我的/etc/grub/default
文件表明内核 0 应该是默认值:
GRUB_DEFAULT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=3
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
我可以验证是否grub.cfg
已添加内核:
$ grep menuentry /boot/grub/grub.cfg
...
menuentry 'Ubuntu, with Linux 4.10.0-21-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.10.0-21-generic-advanced-6af3f559-58c5-4c56-b1c8-ffe02c700c97' {
menuentry 'Ubuntu, with Linux 4.10.0-21-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.10.0-21-generic-recovery-6af3f559-58c5-4c56-b1c8-ffe02c700c97' {
menuentry 'Ubuntu, with Linux 4.10.0-20-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.10.0-20-generic-advanced-6af3f559-58c5-4c56-b1c8-ffe02c700c97' {
menuentry 'Ubuntu, with Linux 4.10.0-20-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.10.0-20-generic-recovery-6af3f559-58c5-4c56-b1c8-ffe02c700c97' {
...
$ grep -Poz "menuentry 'Ubuntu' (.|\n)*?\}" /boot/grub/grub.cfg
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-6af3f559-58c5-4c56-b1c8-ffe02c700c97' {
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,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1' 6af3f559-58c5-4c56-b1c8-ffe02c700c97
else
search --no-floppy --fs-uuid --set=root 6af3f559-58c5-4c56-b1c8-ffe02c700c97
fi
linux /boot/vmlinuz-4.10.0-21-generic root=UUID=6af3f559-58c5-4c56-b1c8-ffe02c700c97 ro quiet splash $vt_handoff
initrd /boot/initrd.img-4.10.0-21-generic
}
内核文件实际上存在于磁盘上:
$ ls -l /boot/vmlinuz-4.10.0-21-generic
-rw------- 1 root root 7575312 Apr 28 06:41 /boot/vmlinuz-4.10.0-21-generic
鉴于它可能以某种方式被损坏,我尝试重新安装它:
$ sudo apt-get install --reinstall linux-image-4.10.0-21-generic
dpkg 显示两个内核都已安装:
$ dpkg -l | grep ii | grep linux-image-[0-9].*-generic
ii linux-image-4.10.0-20-generic 4.10.0-20.22 amd64 Linux kernel image for version 4.10.0 on 64 bit x86 SMP
ii linux-image-4.10.0-21-generic 4.10.0-21.23 amd64 Linux kernel image for version 4.10.0 on 64 bit x86 SMP
但是重启后:
$ uname -r
4.10.0-20-generic
$ cat /proc/version
Linux version 4.10.0-20-generic (buildd@lcy01-05) (gcc version 6.3.0 20170406 (Ubuntu 6.3.0-12ubuntu2) ) #22-Ubuntu SMP Thu Apr 20 09:22:42 UTC 2017
$ cat /proc/cmdline
root=UUID=6af3f559-58c5-4c56-b1c8-ffe02c700c97 ro quiet splash
我确实认为 grub legacy 仍在这台机器上使用。/boot/grub/menu.1st 引用了 20 但没有引用 21:
title Ubuntu 17.04, kernel 4.10.0-20-generic
root (hd0,0)
kernel /boot/vmlinuz-4.10.0-20-generic root=UUID=6af3f559-58c5-4c56-b1c8-ffe02c700c97 ro quiet splash
initrd /boot/initrd.img-4.10.0-20-generic
quiet
title Ubuntu 17.04, kernel 4.10.0-20-generic (recovery mode)
root (hd0,0)
kernel /boot/vmlinuz-4.10.0-20-generic root=UUID=6af3f559-58c5-4c56-b1c8-ffe02c700c97 ro single
initrd /boot/initrd.img-4.10.0-20-generic
title Ubuntu 17.04, kernel 4.8.0-49-generic
root (hd0,0)
kernel /boot/vmlinuz-4.8.0-49-generic root=UUID=6af3f559-58c5-4c56-b1c8-ffe02c700c97 ro quiet splash
initrd /boot/initrd.img-4.8.0-49-generic
quiet
title Ubuntu 17.04, kernel 4.8.0-49-generic (recovery mode)
root (hd0,0)
kernel /boot/vmlinuz-4.8.0-49-generic root=UUID=6af3f559-58c5-4c56-b1c8-ffe02c700c97 ro single
initrd /boot/initrd.img-4.8.0-49-generic
title Ubuntu 17.04, memtest86+
root (hd0,0)
kernel /boot/memtest86+.bin
quiet
这台机器位于数据中心,在重启过程中我无法访问控制台。我无法看到 grub 在重启过程中说了什么,我只能在启动并运行后通过 ssh 进入。
什么原因导致最新内核无法使用?我该如何修复它?
答案1
乍一看,一切似乎都很好,您的grub.cfg
、、/etc/default/grub
内核安装状态,一切都正常。
但是如果我们检查cat /proc/version
您的输出,发现 grub 正在加载错误的内核:
Linux version 4.10.0-20-generic ...
正如您所说,您的系统上有 GRUB Legacy,所以我猜测 GRUB 2 通常没有安装在您的引导扇区上。
因此运行:
sudo grub-install /dev/sda
安装grub2
在引导扇区上。
然后确保一切正确运行:
sudo update-grub
再生grub.cfg
答案2
我运行的不是服务器,而是桌面。在更新到 4.10.0-21.23 时,我确实注意到了一些奇怪的事情......
更新过程结束时,终端输出内容如下:
The link /vmlinuz.old is a damaged link
Removing symbolic link vmlinuz.old
you may need to re-run your boot loader[grub]
我重新运行了:
sudo update-grub
重新启动之前请确保安全。