Debian 10 破坏者 |更新 grub |找不到命令

Debian 10 破坏者 |更新 grub |找不到命令

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

解决方案(最好的优先)

  1. su - root而不是su root- 最好的解决方案(感谢 Rui)
  2. 扩展 /etc/environment 或 ~/.bashrc 或类似配置文件中常规用户的路径
  3. 显式调用命令;使用此解决方案需要修改所有从 sbin 调用另一命令的脚本(这不切实际,尽管如此,故障排除部分中有一个示例)

发现

发生这种情况是因为 PATH 以一种非常奇怪的方式工作(实际上按设计工作)。

  1. regular user login-> 环境路径不包含 /usr/sbin =>观点:按设计工作,非常合乎逻辑
  2. su root-> 管理员权限,但环境缺少 /usr/sbin:/sbin =>观点:按设计工作,但不合逻辑,因为具有 root 访问权限的帐户应该能够从 sbin 执行命令,而无需手动添加二进制文件的路径
  3. 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

相关内容