- Rootless Podman与User Namespace:Rootless Podman依赖Linux的user namespace功能,将容器内的用户ID(例如容器内的root用户UID 0)映射到宿主机上一个非特权的用户ID范围。详见https://www.redhat.com/en/blog/rootless-podman-user-namespace-modes
- NFS与User Namespace的不兼容:NFS协议本身设计上不支持user namespace。它依赖于服务器和客户端之间对UID和GID的一致性理解。
- 导致的问题:当容器尝试在NFS挂载的目录中执行需要改变文件所有权的操作(例如 chown),并试图将文件所有者设置为仅在容器的user namespace中有效的UID时,NFS服务器无法识别或处理这个来自特定namespace的UID,从而导致操作失败。
- 这个问题只存在于操作的目录是一个NFS挂载过来的目录,可以通过
df -T $path
来检查,查看里面的 Type
是 nfs4
还是 zfs
- 这个会影响的程序包括
- Cursor Server的安装,cursor会尝试解包一个包含了
1000:127
权限的文件,而当前在容器中的用户是root,会尝试将这个权限应用到这个文件上。由于上面所说的问题,使得chown失败,进而影响cursor的server启动失败
- workaround
- 将
export TAR_OPTIONS="--no-same-owner --no-same-permissions"
添加到rc文件中
- rc文件指
- fish:
~/.config/fish/config.fish
- bash:
~/.bashrc
- zsh:
~/.zshrc
- 这个可能会影响整个系统在解压tar包的时候的行为,包括可能apt会tar解压的时候如果有其他权限的文件,也会被一并被影响到,因此没有默认应用到所有的镜像中
- Podman in Podman启动psql、mysql、apache、httpd这些会主动修改自己的文件数据的软件
- 如果将NFS的路径挂载到了这一些容器里面,会导致程序chown失败,还不清楚是否会影响程序的正常启动
- workaround
- 将本地的文件系统挂载到容器中作为持久化的
- 如果
/root
和 /mnt/data
都是NFS挂载过来的,找管理员开一个本地文件系统的,或者开一台新的机器