Linux
為什麼當從 initrd 執行時,shebang 腳本以 init= 的身份執行時 euid 為 0,而在其他情況下則不然?
我正在嘗試創建自己的 PID 1 初始化腳本,以使用 init=/myscript 從引導命令行呼叫。我怎樣才能讓它在任何核心的真實文件系統上工作?
當它在 initrd 中執行時,它工作正常並且可以掛載東西等 - 但是當我在沒有 initrd 的文件系統上使用它時,它無法掛載東西,因為:
mount: only root can do that (effective UID is 1000)
當我 strace 任何失敗的命令時,它不可避免地會發出 geteuid32() 並返回 1000。為什麼?如何以 euid 0 執行?
init
on沒有特殊處理initrd
,所以肯定有其他問題。如果執行為
root
,如果設置了該位,euid
則將匹配二進製文件的所有者。setuid
檢查所有權
/bin/mount
。
從非特權帳戶使用 Sudo
該錯誤告訴您問題出在哪裡:您使用的是 UID 1000 的“凡人”帳戶,而不是 UID 0 的 root 帳戶來呼叫 mount。許多系統功能需要以 root 身份執行。許多程序(如 initrd)以 root 身份執行,因此這些命令具有足夠的執行權限。但是,當您從日常使用者帳戶執行時,您需要su或sudo以其他使用者身份執行操作。
對於mount,您可以這樣稱呼它:
sudo mount /mnt/foo
除非
-u
標誌指定,否則 sudo 命令的使用者預設為 root。如果在相應的/etc/sudoers或*/etc/sudoers.d*文件中正確設置了 UID 1000 的帳戶,則通過 sudo 執行命令應該可以解決您所描述的問題。也可以看看
man 5 sudo
man 5 sudoers
man 8 visudo