我正在尝试启动一项服务来签署 VirtualBox 内核模块,如下https://nidomiro.de/2018/04/automatic-virtualbox-module-signing-for-uefi/
调整 Fedora bash 脚本中引用的路径后,该脚本在以 root 身份手动运行时可以正常工作。但是,服务总是失败:
$ systemctl status sign-virtualbox.service
● sign-virtualbox.service - Signing VirtualBox Kernel Modules for UEFI
Loaded: loaded (/etc/systemd/system/sign-virtualbox.service; enabled; vendor preset: disabled)
Active: failed (Result: exit-code)
Process: 3018 ExecStart=/root/module-signing/sign-vbox-modules.sh (code=exited, status=203/EXEC)
Main PID: 3018 (code=exited, status=203/EXEC)
的输出sudo journalctl -xe
说sign-virtualbox.service: Failed at step EXEC spawning /root/module-signing/sign-vbox-modules.sh: Permission denied
文件权限:
$ sudo ls -l /root/module-signing/sign-vbox-modules.sh
-rwx------. 1 root root 309 Aug 7 11:35 /root/module-signing/sign-vbox-modules.sh
由于该服务是以 root 身份启动的,因此不应该存在权限问题,不是吗?
答案1
二进制文件的执行可能被 SELinux 阻止。您可以从日志日志或可能从审核日志(在/var/log/audit/audit.log
)中搜索“avc”错误来确认这一点。
为了解决这个问题,我建议您从脚本和二进制文件通常所在的目录(例如 )托管此脚本,/usr/local/bin
而不是在根用户的主目录下。
一旦你把这个脚本移到那里,运行restorecon
它以获得正确的 SELinux 类型(应该是system_u:object_r:bin_t:s0
或类似的。)
所以:
mv /root/module-signing/sign-vbox-modules.sh /usr/local/bin/
restorecon /usr/local/bin/sign-vbox-modules.sh
并编辑您的 systemd 服务文件以更新路径。
如果您想检查它是否具有适当的 SELinux 类型:
ls -lZ /usr/local/bin/sign-vbox-modules.sh