Debian 10 克星 | 更新grub | 找不到相关命令

lin*_*4kb 10 grub debian

update-grub 失败并显示错误消息

# update-grub
bash: update-grub: command not found
Run Code Online (Sandbox Code Playgroud)

@GAD3R 输出

# [ -d /sys/firmware/efi ] && echo EFI || echo legacy
legacy
Run Code Online (Sandbox Code Playgroud)

注意 1我已经使用 amd64 CD iso 安装程序使用默认安装安装了 Debian 10 Buster Alpha 3 版本 (Xfce)(除了我删除print server并添加了ssh server)。

Note2我使用了 root 帐户 ( su root)。

lin*_*4kb 13

解决方案(最好的优先)

  1. su - root而不是su root- 最好的解决方案(感谢 Rui)
  2. 在 /etc/enviroment 或 ~/.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为“普通用户”的thew路径之后成功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
Run Code Online (Sandbox Code Playgroud)

故障排除

我发现有一个update-grub命令/usr/sbin

# find / -name update-grub
/usr/sbin/update-grub
Run Code Online (Sandbox Code Playgroud)

运行它,只是为了得到下一个错误信息。

# /usr/sbin/update-grub
/usr/sbin/update-grub: 4: exec: grub-mkconfig: not found
Run Code Online (Sandbox Code Playgroud)

grub-mkconfig在 下搜索并找到它/usr/sbin/grub-mkconfig。然后就来找我了,让我们看看update-grub脚本是什么样子的?

#cat /usr/sbin/update-grub |grep grub-mkconfig
exec grub-mkconfig -o /boot/grub/grub.cfg "$@"
Run Code Online (Sandbox Code Playgroud)

修改 /usr/sbin/update-grub 以便grub-mkconfig通过它的显式路径调用...

exec /usr/sbin/grub-mkconfig -o /boot/grub/grub.cfg "$@"
Run Code Online (Sandbox Code Playgroud)

...然后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
Run Code Online (Sandbox Code Playgroud)

结论

这一定是关于 PATH 的

  • 请注意,[根据 Debian Wiki](https://wiki.debian.org/NewInBuster),以前的 Debian 版本使用的是来自 `shadow` 源包的 `su` 版本,而 Buster 使用的是来自 `util- linux` 源,当切换到 root 时,它不会自动添加 `/sbin` 和 `/usr/sbin` 目录到 `PATH`。如果你需要接近旧的行为,你可以在 `/etc/login.defs` 中设置 `ALWAYS_SET_PATH yes`。 (3认同)
  • 在运行 `update-grub` 之前运行 `export PATH=$PATH:/usr/sbin` 不是比编辑这些文件更容易吗? (2认同)