我在无根模式下运行 Debian 容器,无法为除我自己的组和用户之外的组和用户设置 acl(至少看起来是这样)。我在容器中启动了 bash(runc --root /var/slurm/run/ run --bundle ~/containers/test01/ test01
),然后:
touch test.txt
setfacl -m g:adm:r-x test.txt
这导致setfacl: test.txt: Invalid argument.
组“adm”已存在。/etc/groups/ 中的其他组均不起作用,但我的主要组setfacl -m u:root:r-x test.txt
工作正常。
这是当前用户:
(base) root@runc:/# id
uid=0(root) gid=0(root) groups=0(root),65534(nogroup)
我首先想到了 Linux Caps,并尝试了一下,但无法让它工作。Capsh 打印:
(base) root@runc:/# capsh --print
Current: cap_fowner,cap_kill,cap_net_bind_service,cap_sys_admin,cap_audit_write=ep
Bounding set =cap_fowner,cap_kill,cap_net_bind_service,cap_sys_admin,cap_audit_write
Ambient set =
Current IAB: !cap_chown,!cap_dac_override,!cap_dac_read_search,!cap_fsetid,!cap_setgid,!cap_setuid,!cap_setpcap,!cap_linux_immutable,!cap_net_broadcast,!cap_net_admin,!cap_net_raw,!cap_ipc_lock,!cap_ipc_owner,!cap_sys_module,!cap_sys_rawio,!cap_sys_chroot,!cap_sys_ptrace,!cap_sys_pacct,!cap_sys_boot,!cap_sys_nice,!cap_sys_resource,!cap_sys_time,!cap_sys_tty_config,!cap_mknod,!cap_lease,!cap_audit_control,!cap_setfcap,!cap_mac_override,!cap_mac_admin,!cap_syslog,!cap_wake_alarm,!cap_block_suspend,!cap_audit_read,!cap_perfmon,!cap_bpf,!cap_checkpoint_restore
Securebits: 00/0x0/1'b0
secure-noroot: no (unlocked)
secure-no-suid-fixup: no (unlocked)
secure-keep-caps: no (unlocked)
secure-no-ambient-raise: no (unlocked)
uid=0(root) euid=0(root)
gid=0(root)
groups=0(root),65534(nogroup),65534(nogroup),65534(nogroup),65534(nogroup)
Guessed mode: UNCERTAIN (0)
如果我想为用户除了 root 之外。
编辑:
关于 subgid 的提示可能会有所帮助,至少它增强了我对用户/组命名空间映射的理解。在容器内部,我似乎有以下映射:
(base) root@runc:/# cat /proc/self/gid_map
0 1000 1
在这里我可以看到容器内的组(0=root)映射到主机系统上的组 ID 1000,这是启动无根容器的用户的组 ID。
但范围是 1,这是否意味着这个单个组可以映射,这可能是我无法映射的原因吗chgrp adm foo
?
任何提示都非常感谢。
多谢。
答案1
我终于解决了。基本上,我需要将 uidMappings 和 gidMappings 添加到 config.json 中
{
"containerID": 1,
"hostID": 231072,
"size": 65536
}
我刚刚将容器内的 root 用户 (id: 0) 映射到在主机上启动容器的用户 (id: 1002)。添加其他映射后,容器内的用户也可以映射到在主机上有效的 id。