为什么 --uts=private 不允许我设置主机名?

为什么 --uts=private 不允许我设置主机名?

如果我启动容器--uts=private,我仍然无法更改主机名。但听起来这正是这应该的目的?

有什么--uts=private作用?

$ podman run -ti --uts=private alpine
/ # hostname foo.bar.baz
hostname: sethostname: Operation not permitted

该错误与 CentOS 略有不同,

$ podman run -ti --uts=private centos:7
[root@e5fd4d09f5c3 /]# hostname foo.bar.baz
hostname: you must be root to change the host name

如果我的容器有新的私有命名空间,为什么我不能更改主机名?

答案1

我们根据命名空间功能阻止您。默认情况下,容器不会获取 CAP_SYS_ADMIN。

$   podman run -ti --uts=private --hostname foobar centos
# hostname
foobar
$   podman run -ti --cap-add SYS_ADMIN --uts=private  centos
[root@a4f36e700ad7 /]# hostname foobar
[root@a4f36e700ad7 /]# hostname
foobar
[root@a4f36e700ad7 /]# exit

答案2

来自 irc.freenode.net/#podman,

< nalind> EvanCarroll:除非您使用 运行容器--cap-add sys_admin,否则默认的 seccomp 过滤器(来自/usr/share/containers/seccomp.json)将不允许sethostname系统调用,并且内核将不允许该调用

我想了解更多,但这是一个开始。所以我会将其标记为社区维基,并在有真正答案时将其删除。

即,

  • 如果无法设置主机名,私有 uts 命名空间的用途是什么?
  • 为什么设置主机名的功能被锁定了cap_sys_admin

相关内容