旧系统的 UID 编号最多为 2000 左右。在实现新的用户管理系统时,我正在研究避免 UID 冲突的选项。
一种选择是仅拥有不能重新分配的 UID 列表。我目前正在调查此事。
另一个更简单的选择是使用更高的范围(3000+)。我应该记住什么问题吗?
这将在 RHEL5、RHEL6 和 RHEL7 上进行。
答案1
所有 Unix 系统都至少有 16 位用户 ID,其值可以从 0(为 root 保留)到 65535(保留为无效值)。许多现代风格(包括 Linux)支持更大的值,但在混合网络中,您应该避免这些,除非您确定所有操作系统、文件系统和网络协议都支持它们(例如旧版本的 NFS 不支持)。 Unix 世界中有一个通用约定:“小”值用于系统,“大”值用于管理员。 “小”和“大”没有明确的定义;阈值通常为 100、1000 或介于两者之间。此外,按照惯例,65534 是用户nobody
,不拥有任何文件,也不运行任何系统服务(它用于不应该拥有任何特权的任务,例如locate
仅索引世界可访问文件的实现)。
结果是 1000 到 65533 之间的任何值都是安全的。这也适用于组 ID。
在网络中,通常将此范围的低部分用于特定于计算机的帐户,而将高部分用于网络范围的帐户。如果多个机构创建用户帐户,他们可能会使用不同的范围,例如10000–19999 和20000–29999。就您而言,可以确定范围 1000–2999 用于旧系统,3000–4999 用于新系统。或者 1000–9999 用于旧系统,10000–19999 用于新系统。
答案2
Linux Kernel 2.6 及更高版本支持无符号 32 位整数作为 UID 和 GID。这意味着 RHEL4+ 的最大 UID 应为 4294967294(4294967295 已保留),但这可能取决于系统设置和安装的实用程序,特别是 Shadow-utils。您可以通过尝试一个大的 UID 来测试它,唯一会发生的事情是它会拒绝它(在 RHEL5 上尝试 65536 到 4294967294 之间的任何值)。在 RHEL6 上,任何高于 4294967294 的内容都将被拒绝:
# useradd -u 4294967295 test
useradd: invalid user ID '4294967295'
RHEL6 和 RHEL7 的实用程序绝对支持 32 位。我不能代表 RHEL5 发言,因为我没有任何仍在 RHEL5 上的盒子。
因此,如果您的目标是避免任何可能的冲突,您可能需要从 100000 之类的值开始。
只是额外的信息: 在最新的内核版本中,由于用户命名空间和非特权容器(参考 docker、openvz 和 lxc),使用 40 亿个 UID 并不是那么遥不可及。据我所知,RHEL 还不支持用户命名空间,但他们已经宣布计划在 RHEL7 中支持用户命名空间,所以我想它很快就会向后移植。