update-grub
失败并显示错误消息
# update-grub
bash: update-grub: command not found
@GAD3R 输出
# [ -d /sys/firmware/efi ] && echo EFI || echo legacy
legacy
注1我已经使用 amd64 CD iso 安装程序使用默认安装安装了 Debian 10 Buster Alpha 3 版本 (Xfce)(除了我删除了print server
并添加了ssh server
)。
笔记2我使用的是 root 帐户 ( su root
)。
答案1
解决方案(最好的优先)
su - root
而不是su root
- 最好的解决方案(感谢 Rui)- 扩展 /etc/environment 或 ~/.bashrc 或类似配置文件中常规用户的路径
- 显式调用命令;使用此解决方案需要修改所有从 sbin 调用另一命令的脚本(这不切实际,尽管如此,故障排除部分中有一个示例)
发现
发生这种情况是因为 PATH 以一种非常奇怪的方式工作(实际上按设计工作)。
regular user login
-> 环境路径不包含 /usr/sbin =>观点:按设计工作,非常合乎逻辑su root
-> 管理员权限,但环境缺少 /usr/sbin:/sbin =>观点:按设计工作,但不合逻辑,因为具有 root 访问权限的帐户应该能够从 sbin 执行命令,而无需手动添加二进制文件的路径su - root
-> 管理员权限,路径上的 /usr/sbin =>观点:按设计工作,非常合乎逻辑
更多背景
/etc/login.defs 中定义了两个 PATH,但除非我启动su -
或su - root
,否则我将获得 ENV_PATH。我知道这是这样设计的,为了保留实际用户的环境,但是在这种情况下,这真的让我很困惑,为什么不在成功后自动添加/usr/sbin
到/sbin
“普通用户”的路径su root
# cat /etc/login.defs |grep PATH=
ENV_SUPATH PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ENV_PATH PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
故障排除
我发现update-grub
中有一个命令/usr/sbin
。
# find / -name update-grub
/usr/sbin/update-grub
运行它,只是为了得到下一条错误消息。
# /usr/sbin/update-grub
/usr/sbin/update-grub: 4: exec: grub-mkconfig: not found
搜索了一下grub-mkconfig
,在下面找到了/usr/sbin/grub-mkconfig
。然后我就想到了,让我们看看update-grub
剧本是什么样的?
#cat /usr/sbin/update-grub |grep grub-mkconfig
exec grub-mkconfig -o /boot/grub/grub.cfg "$@"
修改 /usr/sbin/update-grub 以便grub-mkconfig
通过其显式路径调用...
exec /usr/sbin/grub-mkconfig -o /boot/grub/grub.cfg "$@"
...然后update-grub
用它的显式路径和 tada 调用,它起作用了!
# /usr/sbin/update-grub
Generating grub configuration file ...
Found background image: /usr/share/images/desktop-base/desktop-grub.png
Found linux image: /boot/vmlinuz-4.18.0-2-amd64
Found initrd image: /boot/initrd.img-4.18.0-2-amd64
Found linux image: /boot/vmlinuz-4.16.0-2-amd64
Found initrd image: /boot/initrd.img-4.16.0-2-amd64
done
结论
这一定是关于 PATH 的。
答案2
这边走:
#sudo update-grub
您需要以 root 身份运行此命令。
答案3
首先更新您的本地包列表:
sudo apt update && sudo apt upgrade
找到正确的启动模式:
[ -d /sys/firmware/efi ] && echo EFI || echo legacy
grub-legacy
然后,强制重新安装旧包和 efi 的grub 包grub-efi
(我假设您的引导模式是 EFI ):
sudo apt install --reinstall grub-efi
sudo apt install grub-common
如果问题仍未解决,请尝试以下操作:
sudo grub-mkconfig -o /boot/grub/grub.cfg
update-grub
命令只是一个运行该grub-mkconfig
工具以生成 grub.cfg 文件的脚本。查看 Archlinux GRUB文档
参考:
答案4
您可以强制重新安装grub
:
sudo apt-get install --reinstall grub