我结合了原始的详细说明博客文章,以及来自手册页(使用 dnf 而不是 yum)。
# sudo dnf -y --releasever=24 --installroot=$HOME/fedora-24 --disablerepo='*' --enablerepo=fedora --enablerepo=updates install systemd passwd dnf fedora-release vim-minimal
# sudo systemd-nspawn -D fedora-24
Spawning container fedora-24 on /home/alan-sysop/fedora-24
Press ^] three times within 1s to kill container.
-bash-4.3# passwd
Changing password for user root.
New password:
Retype new password:
结果:
passwd: Authentication token manipulation error
和一个 AVC 弹出窗口,即 SELinux 错误。它说passwd
不允许取消链接(替换)/etc/passwd
。 “疑难解答”按钮的建议之一是我可以将标签分配passwd_file_t
给/etc/passwd
.
出了什么问题,我该如何解决?
答案1
由于某种原因,dnf 没有在 /etc/passwd 上设置“正确的”SELinux 标签。但它确实在 /bin/passwd 上设置了标签。这种不匹配就是导致问题的原因。欢迎进一步解释:)。
$ ls -Z fedora-24/etc/passwd
unconfined_u:object_r:etc_t:s0 fedora-24/etc/passwd
$ ls -Z /etc/passwd
system_u:object_r:passwd_file_t:s0 /etc/passwd
$ ls -Z fedora-24/bin/passwd
system_u:object_r:passwd_exec_t:s0 fedora-24/bin/passwd
$ ls -Z /usr/bin/passwd
system_u:object_r:passwd_exec_t:s0 /usr/bin/passwd
restorecon -Rv /
尝试在容器内运行没有任何作用。 IIRC libselinux 会检测它何时在容器中运行,并且不会执行任何操作。
解决方案
我们需要从容器外部运行:
restorecon -Rv fedora-24/
它确保全部SELinux 标签被重置。 (为容器主机期望的值,即未标记)。然后我们就可以成功设置root密码了。
答案2
引导的 Cent OS 8 用户空间存在同样的问题。
已发现的问题
[root@- bootstrapped_base_systems]# ls -Z centos8/bin/passwd
system_u:object_r:passwd_exec_t:s0 centos8/bin/passwd
[root@- bootstrapped_base_systems]# ls -Z centos8/etc/passwd
unconfined_u:object_r:etc_t:s0 centos8/etc/passwd
(etc/passwd
在这种情况下很好)
固定为
[root@- bootstrapped_base_systems]# chcon -v unconfined_u:object_r:etc_t:s0 centos8/bin/passwd
changing security context of 'centos8/bin/passwd'
已验证更改为
[root@- bootstrapped_base_systems]# ls -Z centos8/bin/passwd
unconfined_u:object_r:etc_t:s0 centos8/bin/passwd