我的设置要求我的一些/etc
文件驻留在单独的分区上。为此,我创建了一个软链接:
ls -li /etc/group
956 lrwxrwxrwx 1 root root 21 May 7 15:48 /etc/group -> /var/common/etc/group
ls -li /var/common/etc/group
3145744 -rw-r--r-- 1 root root 668 May 11 11:02 /var/common/etc/group
我的问题是当我尝试使用这些文件执行命令时:
groupadd foo
groupadd: failure while writing changes to /etc/group
strace
报告:
rename("/etc/group+", "/var/common/etc/group") = -1 EXDEV (Invalid cross-device link)
write(2, "groupadd: failure while writing "..., 54groupadd: failure while writing changes to /etc/group
) = 54
我有什么想法可以去groupadd
上班吗?
答案1
/etc
因此,跨分区分割文件是一个坏主意。
发生的情况是,该groupadd
实用程序正在创建一个临时文件,然后/etc/groups
通过一个简单的操作用临时文件替换真实文件(或者更确切地说,符号链接指向的文件)rename
。
问题是它rename()
只能在同一个文件系统上工作,否则会抛出错误。
您可能在这里遇到的另一个潜在问题是,当执行某些操作时rename
,它会破坏符号链接,现在它是一个普通文件。
/etc
另一个潜在的问题是,在系统有机会挂载其他卷之前,正确启动需要许多文件。因此,这些文件实际上将会丢失。
简而言之,不,这无法解决。而且无论如何都不应该这样做。
答案2
/etc
应该位于根文件系统上。明智的做法就是保持这种状态。
如果您确实需要 split /etc
,那么使用 union mount 可能会获得更好的结果。我不知道Linux是否支持联合挂载,其中一个组件与挂载点相匹配,但是,很难不将真正的/etc
根文件系统作为联合挂载的一部分。
如果您想将所有内容放在/etc
不同的分区上,您可以制作一个/etc
仅包含所需内容的最小分区(/etc/fstab
、 init 需要的内容(/etc/inittab
或/etc/init
和/etc/rc*
或您的 init 系统使用的任何内容)、最小/etc/passwd
和/etc/group
等)。在启动早期(比!早很多/etc/rc.local
),绑定挂载/var/common/etc
到/etc
.但这需要做很多工作才能做到正确,并且会导致/var/common/etc
成为整体/etc
,这可能不是您想要的。这种设置对于某些不使用任何常用初始化系统并且对根文件系统的大小有严格限制的嵌入式系统来说最有意义。
如果您有一个/var/common
在许多服务器之间共享的服务器,您应该以不同的方式解决这个问题。使用适当的配置管理系统将共享文件部署到/etc
.
/etc/passwd
像和 这样的文件/etc/group
不应该在机器之间共享。仅将这些文件用于本地用户和组。对于跨计算机共享的条目,请使用 NIS 或 LDAP。