昨晚 freeshell 外部存储上线以来,外部存储系统中的一些 UID 变成了 root(0)或 nobody(65534),导致一些文件权限问题。

经查,这是由于 NFSv4 协议并不是直接传输 UID/GID,而是在 NFS client 端由 idmap 服务将 UID/GID 转换成 username@localdomain 的形式,以字符串形式传输给 NFS server,server 端的 idmap 服务再把字符串转换成 UID/GID。也就是说,client 与 server 的主机系统中只要至少有一端的 /etc/passwd 中不存在这个 UID/GID,就会出现问题。如果是从其他 freeshell 复制过来的,复制(rsync)过程中文件首先以 root 身份创建,随后的 chown 操作失败,所以 UID 就是 0;如果是在外部存储的 freeshell 中以“不存在”的用户身份创建文件,该文件的 UID 就会被 squash 成 nobody(65534)。

NFSv3 协议使用了数字 UID/GID 传输,不依赖 idmap 服务,不仅解决了 UID/GID 问题,还减少了无谓的开销。此问题现已解决。如果您今天新建或迁移了 freeshell,请自行修复 UID/GID,因此带来的不便望能谅解。

感谢 vanabel 的 bug 报告。