如何重新运行引导程序?

运行sudo apt-get -f install命令时提示:/vmlinuz.old 这个链接是损坏的链接并显示以下信息:
you may need to re-run your boot loader[grub]

这是完整的输出:
user@chrubuntu:~$ sudo apt-get -f install
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages were automatically installed and are no longer required:
  linux-headers-3.13.0-32 linux-headers-3.13.0-32-generic
  linux-image-3.13.0-32-generic linux-image-extra-3.13.0-32-generic
Use 'apt-get autoremove' to remove them.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
user@chrubuntu:~$ sudo apt-get autoremove
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be REMOVED:
  linux-headers-3.13.0-32 linux-headers-3.13.0-32-generic
  linux-image-3.13.0-32-generic linux-image-extra-3.13.0-32-generic
0 upgraded, 0 newly installed, 4 to remove and 0 not upgraded.
After this operation, 270 MB disk space will be freed.
Do you want to continue? [Y/n] y
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
    LANGUAGE = "en
en",
    LC_ALL = (unset),
    LC_TIME = "en",
    LC_MONETARY = "en",
    LC_ADDRESS = "en",
    LC_TELEPHONE = "en",
    LC_NAME = "en",
    LC_MEASUREMENT = "en",
    LC_IDENTIFICATION = "en",
    LC_NUMERIC = "en",
    LC_PAPER = "en",
    LANG = (unset)
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
locale: Cannot set LC_ALL to default locale: No such file or directory
(Reading database ... 232120 files and directories currently installed.)
Removing linux-headers-3.13.0-32-generic (3.13.0-32.57) ...
Removing linux-headers-3.13.0-32 (3.13.0-32.57) ...
Removing linux-image-extra-3.13.0-32-generic (3.13.0-32.57) ...
Examining /etc/kernel/postrm.d .
run-parts: executing /etc/kernel/postrm.d/initramfs-tools 3.13.0-32-generic /boot/vmlinuz-3.13.0-32-generic
update-initramfs: Deleting /boot/initrd.img-3.13.0-32-generic
run-parts: executing /etc/kernel/postrm.d/zz-update-grub 3.13.0-32-generic /boot/vmlinuz-3.13.0-32-generic
The link /initrd.img.old is a damaged link
Removing symbolic link initrd.img.old 
 you may need to re-run your boot loader[grub]
Removing linux-image-3.13.0-32-generic (3.13.0-32.57) ...
Examining /etc/kernel/postrm.d .
run-parts: executing /etc/kernel/postrm.d/initramfs-tools 3.13.0-32-generic /boot/vmlinuz-3.13.0-32-generic
update-initramfs: Deleting /boot/initrd.img-3.13.0-32-generic
run-parts: executing /etc/kernel/postrm.d/zz-update-grub 3.13.0-32-generic /boot/vmlinuz-3.13.0-32-generic
The link /vmlinuz.old is a damaged link
Removing symbolic link vmlinuz.old 
 you may need to re-run your boot loader[grub]
user@chrubuntu:~$

如何重新运行引导加载程序?

2当我使用apt-get autoremove时,我遇到了同样的问题,但正如Eliah Kagan在他的答案中所说,他的答案显示grub在重启后似乎工作正常。 - Mark Mikofski
3个回答

根据womble's answerKernel uninstall后的损坏/vmlinuz和/initrd.img符号链接(在Server Fault上)的回答,当您的引导加载程序是GRUB/GRUB2时(在这里是如此),在这种情况下您不需要做任何操作。
对于其他一些引导加载程序(至少LILO),显然有时需要手动运行引导加载程序的配置。
如果您确实需要告诉GRUB检查现有内核并更新其配置,运行sudo update-grub即可。而且运行这个命令也没有任何害处。但在这种情况下应该是不必要的。

5有时候这个词用得过轻了。 - Simon Richter
9我认为这对错误和解决方案可能会因为最愚蠢的设计错误而获奖:拥有一个名为update-grub而不是逻辑上的grub-update的grub命令,并且未能指定在99.99%的情况下有效的修复(命令)。 - sorin
@sorin 我想知道是否有关于这个问题的错误报告存在。 - reducing activity
+1 对于那些让你感到“松了一口气”的答案之一!内核4.15破坏了我的启动,所以我重新启动了4.10.0-42,并删除了4.15,然后收到了消息:“链接/vmlinuz是一个损坏的链接”,这就导致了我来到这里。果然,在阅读了这里的评论后,update-grub返回了干净的结果。 - WinEunuuchs2Unix

在 grub 的情况下,错误有点奇怪。

当 apt 安装新的内核版本时,它会将 /vmlinuz 和 /initrd.img 移动到 /vmlinuz.old 和 /initrd.img.old(然后仍然指向当前活动的内核。请注意 .old 扩展名,这与“卸载内核后链接损坏”的故事不同),并创建两个新文件 /vmlinuz /initrd.img。

当您运行 apt-get autoremove(消息不是由 apt-get -f install 生成的)时,它会删除先前活动的内核(在运行 autoremove 之前,您重启了吗?),这使得链接无效。

当内核本身被删除时,autoremove 本身会调用 update-grub:

run-parts: executing /etc/kernel/postrm.d/zz-update-grub 3.13.0-32-generic /boot/vmlinuz-3.13.0-32-generic

因此:
The link /vmlinuz.old is a damaged link
Removing symbolic link vmlinuz.old 
 you may need to re-run your boot loader[grub]

所以,autoremove的功能如下:
  1. 删除旧内核
  2. 运行update-grub命令
  3. update-grub会删除与已删除文件相关联的.old文件。
不用担心 :-)
祝好。

2如果你在最后一次升级后没有重新启动,会怎么样呢?那又如何?我从不重新启动。那只是给新手用的。 - Evan Carroll
3除非重新启动,否则无法将新内核加载到内存中。 - simpleuser
1还有一点需要注意,如果您在重启之前将/vmlinuz/initrd.img链接到内核区域(通常为/boot),那就更好了。正如答案所指出的那样,“.old”文件的“损坏链接”并不需要担心。已投票^ - B. Shea

$ sudo update-grub

如果你想删除/清除旧的软件包,也可以执行以下命令

$ dpkg --list |grep "^rc" | cut -d " " -f 3 | xargs sudo dpkg --purge


如果你只有3.X版本的图片,你会删除所有的东西,对吗? - Harkály Gergő
从技术上讲,你的第一个命令已经回答了问题。没有必要再多说关于软件包维护的事情。 - B. Shea

  • 相关问题