Ich muss die Partitionen eines Systems neu anordnen, um Daten, die sich zuvor unter dem Root-Dateisystem befanden, in dedizierte Einhängepunkte zu verschieben. Die Volumes befinden sich alle in LVM, daher ist dies relativ einfach: Erstellen Sie neue Volumes, verschieben Sie Daten in diese, verkleinern Sie das Root-Dateisystem und hängen Sie die neuen Volumes an den entsprechenden Stellen ein.
Das Problem ist Schritt 3, bei dem das Root-Dateisystem verkleinert wird. Die beteiligten Dateisysteme sind ext4, daher wird die Online-Größenänderung unterstützt. Im eingebundenen Zustand können die Dateisysteme jedoch nur vergrößert werden. Um die Partition zu verkleinern, müssen Sie sie aushängen, was für die Root-Partition im normalen Betrieb natürlich nicht möglich ist.
Bei den Antworten im Internet geht es anscheinend darum, eine Live-CD oder ein anderes Rettungsmedium zu booten, den Verkleinerungsvorgang auszuführen und anschließend das installierte System neu zu starten. Es handelt sich jedoch um ein Remote-System, auf das ich nur über SSH zugreifen kann. Ich kann neu starten, aber das Booten einer Rettungsdisk und das Ausführen von Vorgängen über die Konsole ist nicht möglich.
Wie kann ich das Root-Dateisystem aushängen, während der Remote-Shell-Zugriff erhalten bleibt?
pivot_root
dort hinein. Ein Beispiel hier dreamlayers.blogspot.co.uk/2012/10/running-linux-from-ram.html - es ist schwierig, aber wenn Sie eine Testbox zum Anprobieren haben, ist es eine Überlegung wert.Antworten:
Bei der Lösung dieses Problems waren die Informationen unter http://www.ivarch.com/blogs/oss/2007/01/resize-a-live-root-fs-a-howto.shtml von entscheidender Bedeutung. Dieser Leitfaden bezieht sich jedoch auf eine sehr alte Version von RHEL, und verschiedene Informationen waren veraltet.
Die folgenden Anweisungen sind für die Arbeit mit CentOS 7 konzipiert, sollten jedoch problemlos auf jede Distribution übertragbar sein, die systemd ausführt. Alle Befehle werden als root ausgeführt.
Stellen Sie sicher, dass sich das System in einem stabilen Zustand befindet
Stellen Sie sicher, dass niemand anderes es benutzt und nichts anderes Wichtiges vor sich geht. Es ist wahrscheinlich eine gute Idee, Service-Providing-Einheiten wie httpd oder ftpd zu stoppen, um sicherzustellen, dass externe Verbindungen die Dinge in der Mitte nicht stören.
Hängen Sie alle nicht verwendeten Dateisysteme aus
Hiermit wird eine Reihe von Warnungen ausgegeben, dass das Ziel beschäftigt ist, und zwar für das Root-Volume selbst und für verschiedene temporäre / System-FSs. Diese können vorerst ignoriert werden. Wichtig ist, dass außer dem Root-Dateisystem keine Dateisysteme auf der Festplatte gemountet bleiben. Überprüfen Sie dies:
Wenn Sie feststellen, dass noch Dateisysteme auf der Festplatte eingehängt sind, wird noch etwas ausgeführt, das nicht ausgeführt werden sollte. Überprüfen Sie, was es verwendet
fuser
:Machen Sie die temporäre Wurzel
Dies schafft ein sehr minimales Root-System, das (unter anderem) die Anzeige von Manpages (nein
/usr/share
), Anpassungen auf Benutzerebene (nein/root
oder/home
) und so weiter unterbricht. Dies ist beabsichtigt, da es eine Ermutigung darstellt, nicht länger als nötig in einem solchen von Geschworenen manipulierten Wurzelsystem zu bleiben.An dieser Stelle sollten Sie auch sicherstellen, dass die gesamte erforderliche Software installiert ist, da dies den Paketmanager sicher zum Erliegen bringt. Sehen Sie sich alle Schritte durch und stellen Sie sicher, dass Sie über die erforderlichen ausführbaren Dateien verfügen.
Pivot in die Wurzel
systemd bewirkt, dass Bereitstellungen standardmäßig die Freigabe von Teilstrukturen zulassen (wie bei
mount --make-shared
), und dies schlägtpivot_root
fehl. Daher schalten wir dies global mit abmount --make-rprivate /
. System- und temporäre Dateisysteme werden vollständig in das neue Stammverzeichnis verschoben. Dies ist notwendig, damit es überhaupt funktioniert. Die Sockets für die Kommunikation mit systemd befinden sich unter anderem in diesem Ordner,/run
sodass laufende Prozesse nicht geschlossen werden können.Stellen Sie sicher, dass der Remotezugriff die Umstellung überstanden hat
Stellen Sie nach dem Neustart von sshd sicher, dass Sie einsteigen können, indem Sie ein anderes Terminal öffnen und sich erneut über ssh mit dem Computer verbinden. Wenn Sie das nicht können, beheben Sie das Problem, bevor Sie fortfahren.
Sobald Sie überprüft haben, dass Sie wieder eine Verbindung herstellen können, beenden Sie die aktuell verwendete Shell und stellen Sie die Verbindung wieder her. Dies ermöglicht das
sshd
Verlassen der verbleibenden Gabel und stellt sicher, dass die neue Gabel nicht hält/oldroot
.Schließe alles mit der alten Wurzel
Dadurch wird eine Liste der Prozesse gedruckt, die sich noch im alten Stammverzeichnis befinden. Auf meinem System sah es so aus:
Sie müssen sich mit jedem dieser Prozesse befassen, bevor Sie die Bereitstellung aufheben können
/oldroot
. Der Brute-Force-Ansatz ist einfachkill $PID
für jeden, aber dies kann die Dinge zerbrechen. Um es sanfter zu machen:Dadurch wird eine Liste der ausgeführten Dienste erstellt. Sie sollten in der Lage sein, dies mit der Liste der Prozesse zu korrelieren, die gehalten werden,
/oldroot
und diese dannsystemctl restart
für jeden von ihnen ausgeben . Einige Dienste lehnen es ab, im temporären Stammverzeichnis aufzurufen und in einen fehlerhaften Status zu wechseln. diese sind für den Moment nicht wirklich wichtig.Wenn es sich bei dem Root-Laufwerk, dessen Größe Sie ändern möchten, um ein LVM-Laufwerk handelt, müssen Sie möglicherweise auch einige andere ausgeführte Dienste neu starten, auch wenn sie nicht in der von erstellten Liste angezeigt werden
fuser -vm /oldroot
. Wenn Sie feststellen, dass Sie die Größe eines LVM-Laufwerks unter Schritt 7 nicht ändern können, versuchen Sie essystemctl restart systemd-udevd
.Einige Vorgänge lassen sich nicht einfach abwickeln
systemctl restart
. Für mich gehörten diese dazuauditd
(die nicht gerne über getötet werdensystemctl
, und wollten also nur einkill -15
). Diese können individuell behandelt werden.Der letzte Prozess, den Sie normalerweise finden, ist
systemd
selbst. Führen Sie dazusystemctl daemon-reexec
.Sobald Sie fertig sind, sollte die Tabelle folgendermaßen aussehen:
Hänge die alte Wurzel ab
An dieser Stelle können Sie alle erforderlichen Manipulationen durchführen. Die ursprüngliche Frage erforderte einen einfachen
resize2fs
Aufruf, aber Sie können hier tun, was Sie wollen. Ein weiterer Anwendungsfall ist die Übertragung des Root-Dateisystems von einer einfachen Partition nach LVM / RAID / whatever.Drehen Sie die Wurzel zurück
Dies ist eine einfache Umkehrung von Schritt 4.
Entsorgen Sie die temporäre Wurzel
Wiederholen Sie die Schritte 5 und 6, außer wenn Sie
/tmp/tmproot
anstelle von verwenden/oldroot
. Dann:Da es ein tmpfs ist, löst sich die temporäre Wurzel an diesem Punkt im Äther auf, um nie wieder gesehen zu werden.
Bringen Sie die Dinge wieder an ihren Platz
Hängen Sie die Dateisysteme erneut ein:
Zu diesem Zeitpunkt sollten Sie auch die in Schritt 7 vorgenommenen Anpassungen aktualisieren
/etc/fstab
und diesengrub.cfg
entsprechend anpassen.Starten Sie alle fehlgeschlagenen Dienste neu:
Freigegebene Teilbäume wieder zulassen:
Starten Sie die gestoppten Service Units - Sie können diesen einzelnen Befehl verwenden:
Und du bist fertig.
Vielen Dank an Andrew Wood, der diese Entwicklung auf RHEL4 ausgearbeitet hat, und Steve, der mir die Verbindung zu ersteren zur Verfügung gestellt hat.
quelle
umount /oldroot/boot
natürlich auf Stufe 6 sein). Ich verknüpfe Ihre Antwort mit anderen SE-Fragen, die keine Antwort oder negative Antwort hatten.umount /oldroot/boot
vor Ihnenumount /oldroot
mount --move
tmpfs geöffnet lassen , dies wird jedoch nicht unterstützt.telinit u
das tun könnte, was Sie wollen./oldroot/tmp
, die mich daran gehindert hat, die Bereitstellung aufzuheben/oldroot
, aber weder infuser
noch in derlsof
Ausgabe angezeigt wird . Ich habe ein bisschen auf systemd gestarrt, um das herauszufinden ...Wenn Sie sicher sind, was Sie tun - also nicht experimentieren, können Sie sich in initrd einklinken, was der nicht interaktive und schnelle Weg ist.
Auf einem Debian-basierten System ist dies wie.
Siehe Code: https://github.com/szepeviktor/debian-server-tools/blob/master/debian-resizefs.sh
Es gibt ein anderes Beispiel: https://github.com/szepeviktor/debian-server-tools/blob/master/debian-convert-ext3-ext4.sh
quelle