UID/GID 自动映射
简而言之,在不同的主机上挂载 JuiceFS 文件系统,只要用户名相同(即便 UID / GID 可能不一样),那么文件权限就一样。这就是自动映射的效果:同名称但不同 UID/GID 的用户创建的文件,会在元数据里自动映射为同一个内部 UID/GID,在挂载到主机时再转换为与之匹配的本地 UID/GID。
考虑到 JuiceFS 支持 POSIX extended ACL,文件可以为多个用户/组单独设定权限,如果你的文件系统面临复杂的用户权限管理,请尤其注意自动映射的影响。
JuiceFS 默认将系统用户名映射为保留区段的内部 ID,建议用户避免使用 10000 以上的 UID,以降低产生冲突的概率。
如需关闭此功能,请联系 JuiceFS 团队安 排操作,在关闭该功能以后,需要把牵涉的文件进行批量 chown
,改为需要的 UID/GID。
示范
在 Ubuntu 系统的主机 X 上创建 UID 为 1001
的用户 juicefs
,挂载 JuiceFS 到 /jfs
,然后在其中创建一个空目录 juicefs@ubuntu
。
[ubuntu]# useradd -m -G sudo -u 1001 juicefs
[ubuntu]# id juicefs
uid=1001(juicefs) gid=1001(juicefs) groups=1001(juicefs),27(sudo)
[ubuntu]# su juicefs
[ubuntu]$ mkdir /jfs/juicefs@ubuntu
在 CentOS 系统的主机 Y 上创建 UID 为 2002
的同名用户 juicefs
,挂载 JuiceFS 到 /jfs
,然后在其中创建一个空目录 juicefs@centos
。
[centos]# useradd -m -G wheel -u 2002 juicefs
[centos]# id juicefs
uid=2002(juicefs) gid=2002(juicefs) groups=2002(juicefs),10(wheel)
[centos]# su juicefs
[centos]$ mkdir /jfs/juicefs@centos
通过 ls -l
列取目录所有者,可以看到在两个主机下目录的所有者均显示为juicefs
。
[ubuntu]$ ls -l /jfs
drwxr-xr-x 2 juicefs juicefs 4096 Aug 22 13:02 juicefs@centos
drwxrwxr-x 3 juicefs juicefs 8192 Aug 22 12:35 juicefs@ubuntu
[centos]$ ls -l /jfs
drwxr-xr-x. 2 juicefs juicefs 4096 Aug 22 13:02 juicefs@centos
drwxrwxr-x. 3 juicefs juicefs 8192 Aug 22 12:35 juicefs@ubuntu
查看 UID / GID
通过 ls -n
查看目录所有者的 UID 和 GID。
可以看到 CentOS 下 UID 2002
用户创建的目录 juicefs@centos
在 Ubuntu 下映射为 UID 1001
:
[ubuntu]$ ls -n /jfs
drwxr-xr-x 2 1001 1001 4096 Aug 22 13:02 juicefs@centos
drwxrwxr-x 3 1001 1001 8192 Aug 22 12:35 juicefs@ubuntu
而 Ubuntu 下 UID 1001
用户创建的目录 juicefs@ubuntu
在 CentOS 下映射为 UID 2002
:
[centos]$ ls -n /jfs
drwxr-xr-x. 2 2002 2002 4096 Aug 22 13:02 juicefs@centos
drwxrwxr-x. 3 2002 2002 8192 Aug 22 12:35 juicefs@ubuntu
JuiceFS 客户端会在挂载文件系统时,会建立系统里所有用户名及组名到内部 ID 的哈希映射,将匹配成功的内部 UID/GID 自动转换为对应名称的实际 UID/GID。如果匹配失败,则不进行转换。
在本例中删除 juicefs
用户,并重 新挂载 JuiceFS,即可列取目录查看内部 ID:
$ userdel juicefs
$ umount /jfs
$ juicefs mount $VOL_NAME /jfs
$ ls -l /jfs
drwxr-xr-x. 2 27055 27055 4096 Aug 22 13:02 juicefs@centos
drwxrwxr-x. 3 27055 27055 8192 Aug 22 12:35 juicefs@ubuntu
UID / GID 不一致
不同节点的用户列表可能会不一样,因此在不同节点挂载 JuiceFS,如果客户端发现无法匹配当地的同名用户,那么由于映射失败,看到的 UID / GID 可能会不一致。这个问题在容器挂载宿主机目录的使用环境更容易遇到,因为容器进程指定的 UID 可能并不存在于宿主机系统,造成两边的挂载点“看上去 UID 一致,但却没有权限访问”的错误。
为了避免这种情况,需要选择以下其一:
- 对于挂载了 JuiceFS 的节点,统一他们的用户体系,确保会使用 JuiceFS 的 Linux 用户名存在于所有节点上,避免 UID / GID 映射失败;
- 联系 Juicedata 运维,为你的文件系统关闭 UID / GID 映射功能。关闭以后你可能需要自行修改和管理文件的权限。