pve下非特权容器权限处理方案
非特权容器(Unprivileged Container) 权限映射问题及解决方法 在Proxmox VE (PVE) 中直接使用 LXC 运行应用(或者直接将 OCI/Docker 镜像转为 LXC 运行,而不套娃安装 Docker进程),是非常轻量且高效的做法。但这种做法最常遇到的就是无特权容器(Unprivileged Container)的权限与挂载问题。 为了安全,PVE 默认创建的是无特权 LXC。它的核心机制是UID/GID 映射偏移(User Namespace): LXC 容器内的 root (UID 0) = PVE 宿主机的 100000 LXC 容器内的普通用户 (如 UID 1000) = PVE 宿主机的 101000 当你在 PVE 宿主机上把一个硬盘目录通过 Bind Mount(挂载点)映射给 LXC 时,LXC 内部的 比如Syncthing 会因为宿主机目录的属主是 PVE 的 root (0),而容器内的 root 实际上是 100000,从而导致没有读写权限(Permission Denied)。 UID 映射断层场景分析 第一种情况 root@N3150:~# ls -lh /mnt/sdb/Download/ -rw-rw-r-- 1 root root 1.8G Mar 5 08:29 proxmox-ve_9.1-1.iso 在宿主机看来:文件属于 root (UID 0)。 在容器内部看来: 在标准的 PVE 非特权容器中,如果一个文件在宿主机上属于真正的 root (UID 0),在容器内部 ls -l 看它,所有者通常不会显示为 root,而是会显示为 nobody(或者 nogroup / 65534)。因为容器内的 root (0) 已经被映射成了 100000,所以宿主机的真实 root (0) 对容器来说属于“映射范围之外的未知用户”,系统统统会将其显示为 nobody。 第二种情况 root@N3150:~# ls -lh /mnt/sdb/Download/ -rw-rw-r-- 1 root root 1.8G Mar 5 08:29 proxmox-ve_9.1-1.iso -rw-r--r-- 1 100000 100000 0 Mar 28 16:55 /mnt/sdb/Download/test 在宿主机看来:文件属于 lxc容器用户 (UID 100000)。 在容器内部看来: 在容器内部 ls -l 看它,所有者会显示为 root。 为什么 Download 能动,而 Compressed 动不了? root@N3150:~# ls -lhd /mnt/sdb/Download drwxrwxrwx 13 root root 4.0K Mar 28 16:55 /mnt/sdb/Download root@N3150:~# ls -lhd /mnt/sdb/Download/Compressed/ drwxrwxr-x 9 root root 4.0K Mar 26 17:55 /mnt/sdb/Download/Compressed/ 看目录权限位: ...