为什么当从 initrd 运行时,作为 init= 运行的 shebang 脚本的 euid 为 0,而在其他情况下则不然?

为什么当从 initrd 运行时,作为 init= 运行的 shebang 脚本的 euid 为 0,而在其他情况下则不然?

我正在尝试创建自己的 PID 1 初始化脚本,以便使用 init=/myscript 从启动命令行调用。我怎样才能让它在任何内核的真实文件系统上工作?

当它在 initrd 中运行时,它工作正常并且可以挂载东西等 - 但是当我在没有 initrd 的文件系统上使用它时,它无法挂载东西,因为:

mount: only root can do that (effective UID is 1000)

当我 strace 任何失败的命令时,它不可避免地会发出 geteuid32() 并返回 1000。为什么?我怎样才能以 euid 0 身份运行?

答案1

initon没有特殊处理initrd,所以肯定还有其他问题。

如果运行为root,则如果设置了euid该位,则将匹配二进制文件的所有者。setuid

检查 上的所有权/bin/mount

答案2

从非特权帐户使用 Sudo

该错误告诉您问题所在:您正在使用 UID 1000 的“凡人”帐户,而不是 UID 0 的 root 帐户来调用挂载。许多系统功能需要以 root 身份运行。许多进程(如 initrd)以 root 身份运行,因此命令有足够的权限运行。但是,当您从日常用户帐户运行某些东西时,您需要或者须藤以不同用户身份执行操作。

为了,你想这样称呼它:

sudo mount /mnt/foo

除非该标志指定-u,否则 sudo 命令的用户默认为 root。通过 sudo 运行命令应该可以解决您所描述的问题,前提是 UID 1000 的帐户在适当的位置正确设置。/etc/sudoers或者/etc/sudoers.d文件。

也可以看看

  • man 5 sudo
  • man 5 sudoers
  • man 8 visudo

相关内容