我的设置要求我的一些/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/groupstrace报告:
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工作吗?
发布于 2014-05-11 10:22:37
基于这个原因,在/etc中跨分区拆分文件是个坏主意。
正在发生的情况是,groupadd实用程序正在创建一个临时文件,然后通过简单的rename操作将实际的/etc/groups文件(或者更确切地说,符号链接指向的内容)替换为临时文件。
问题是rename()只在同一个文件系统上工作,否则会引发错误。
这里可能遇到的另一个潜在问题是,当执行rename时,它会破坏符号链接,而现在它是一个普通的文件。
另一个潜在的问题是,在系统有机会挂载其他卷之前,/etc中的许多文件是正确引导所必需的。因此,这些文件实际上将丢失。
总之,不,这是无法解决的。反正也不应该这么做。
发布于 2014-05-12 00:14:39
/etc应该位于根文件系统上。明智的做法是保持这种状态。
如果您确实需要拆分/etc,那么使用联合挂载可能会得到更好的结果。不过,我不知道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,这可能不是您想要的。对于一些不使用任何常规init系统并且对根文件系统的大小有严格限制的嵌入式系统来说,这种设置基本上是有意义的。
如果您有一个在多个服务器之间共享的/var/common,那么您应该以不同的方式处理这个问题。使用适当的配置管理系统将共享文件部署到/etc。
像/etc/passwd和/etc/group这样的文件不应该在机器之间共享。仅对本地用户和组使用这些文件。对于跨计算机共享的条目,请使用NIS或LDAP。
https://unix.stackexchange.com/questions/128896
复制相似问题