Mein Setup erfordert, dass einige meiner /etc
Dateien auf einer separaten Partition liegen. Zu diesem Zweck habe ich einen Softlink erstellt:
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
Mein Problem tritt auf, wenn ich versuche, Befehle mit diesen Dateien auszuführen:
groupadd foo
groupadd: failure while writing changes to /etc/group
strace
Berichte:
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
Irgendwelche Ideen, wie ich zur Arbeit komme groupadd
?
Antwort1
Aus diesem Grund ist das Aufteilen von Dateien auf /etc
mehrere Partitionen keine gute Idee.
Was passiert, ist, dass das groupadd
Dienstprogramm eine temporäre Datei erstellt und dann die echte /etc/groups
Datei (oder vielmehr das, worauf der Symlink verweist) durch eine einfache rename
Operation durch die temporäre Datei ersetzt.
Der Haken dabei ist, dass dies rename()
nur auf demselben Dateisystem funktioniert, andernfalls wird ein Fehler ausgegeben.
Ein weiteres potenzielles Problem besteht darin, dass beim Ausführen der Operation rename
der symbolische Link zerstört wird und die Datei nun eine normale Datei ist.
Ein weiteres potenzielles Problem ist, dass viele Dateien /etc
für den ordnungsgemäßen Start erforderlich sind, bevor das System die Möglichkeit hat, andere Volumes zu mounten. Daher fehlen diese Dateien tatsächlich.
Kurz gesagt: Nein, das lässt sich nicht beheben. Und es sollte auch nicht gemacht werden.
Antwort2
/etc
soll sich im Root-Dateisystem befinden. Das Vernünftigste ist, es dort zu belassen.
Wenn Sie wirklich teilen müssen /etc
, erzielen Sie mit einem Union-Mount möglicherweise bessere Ergebnisse. Ich weiß allerdings nicht, ob Linux Union-Mounts unterstützt, bei denen eine der Komponenten mit dem Mount-Punkt übereinstimmt, und es wäre schwierig, den realen /etc
Teil des Union-Mounts nicht auf dem Root-Dateisystem zuzulassen.
Wenn Sie alles /etc
auf einer anderen Partition ablegen möchten, können Sie eine Minimalpartition erstellen /etc
, die nur das enthält, was benötigt wird ( /etc/fstab
, was Init benötigt ( /etc/inittab
oder /etc/init
und /etc/rc*
oder was auch immer Ihr Init-System verwendet), minimal /etc/passwd
und /etc/group
usw.). Führen Sie früh während des Bootvorgangs (viel früher als /etc/rc.local
!) ein Bind-Mount /var/common/etc
auf durch /etc
. Dies erfordert jedoch eine Menge Arbeit, bis es richtig funktioniert, und wird am Ende /var/common/etc
das gesamte sein /etc
, was Sie wahrscheinlich nicht wollen. Diese Konfiguration ist vor allem für einige eingebettete Systeme sinnvoll, die keines der üblichen Init-Systeme verwenden und strenge Beschränkungen hinsichtlich der Größe des Root-Dateisystems haben.
Wenn Sie über eine verfügen, /var/common
die von mehreren Servern gemeinsam genutzt wird, sollten Sie das Problem anders angehen. Verwenden Sie ein geeignetes Konfigurationsverwaltungssystem, um gemeinsam genutzte Dateien bereitzustellen /etc
.
Eine Datei wie /etc/passwd
und /etc/group
sollte nicht zwischen Maschinen gemeinsam genutzt werden. Verwenden Sie diese Dateien nur für lokale Benutzer und Gruppen. Verwenden Sie für Einträge, die zwischen Maschinen gemeinsam genutzt werden, NIS oder LDAP.