问题

在使用 Docker 或者 NFS 的时候,需要文件系统挂在到不同的系统中拥有正确的读写权限,需要指定文件所属用户和组的 uid 和 gid。在创建用户和组的时候,系统会自动分配对应的值,这导致在不同的系统中很容易造成 uid 和 gid 不一样而造成读写权限混乱。

例如在系统 A 中,用户 git 的 uid 和组 git 的gid 如下:

[sysops@cn-bj-aliyun-3 ~]$ id git
uid=1001(git) gid=1001(git) groups=1001(git)

而系统 B 中的值如下:

[sysops@cn-bj-aliyun-3 ~]$ id git
uid=998(git) gid=998(git) groups=998(git)

我们在系统 A 以 git 用户创建目录或者文件:

[git@cn-bj-aliyun-3 data]$ ls -lh
total 60K
-rw-r--r-- 1 git git  100 Jul  5 23:22 file1
-rw-r--r-- 1 git git  400 Dec 18  2018 file2
-rw-r--r-- 1 git git  349 Dec 18  2018 file3

将这个目录挂在到 B 系统中时,将会出现这种情况:

[git@cn-bj-aliyun-3 data]$ ls -lh
total 60K
-rw-r--r-- 1 1001 1001  100 Jul  5 23:22 file1
-rw-r--r-- 1 1001 1001  400 Dec 18  2018 file2
-rw-r--r-- 1 1001 1001  349 Dec 18  2018 file3

这样就会导致在 B 系统中文件权限混乱,因为 B 系统中没有对应 uid 和 gid 的用户和组。接下来我们来修改 uid 和 gid,以下以修改系统 A 中的 git 为例。

修改命令

修改 UID

sudo usermod -u 998 git

修改文件的所属用户

find / -user 1001 -exec chown -h git {} \;

修改 GID

sudo groupmod -g 998 git

修改文件的所属用户

find / -group 1001 -exec chgrp -h git {} \;

其它说明

另外在修改之前可以查看 /etc/passwd/etc/group 文件,以便选取一个没有被使用的 uid 和 gid