Ich muss die Partitionen eines Systems neu anordnen, um Daten zuvor unter dem Root-Dateisystem in dedizierte Mount-Punkte zu verschieben. Die Volumes befinden sich alle in LVM, daher ist dies relativ einfach:Erstellen Sie neue Volumes, verschieben Sie Daten hinein, verkleinern Sie das Root-Dateisystem und hängen Sie dann die neuen Volumes an den entsprechenden Stellen ein.
Das Problem ist Schritt 3, das Verkleinern des Root-Dateisystems. Die beteiligten Dateisysteme sind ext4, daher wird die Online-Größenänderung unterstützt; während sie gemountet sind, können die Dateisysteme jedoch nur vergrößert werden. Um die Partition zu verkleinern, muss sie ausgehängt werden, was für die Root-Partition im Normalbetrieb natürlich nicht möglich ist.
Die Antworten im Internet scheinen sich darum zu drehen, eine LiveCD oder ein anderes Rettungsmedium zu booten, den Schrumpfvorgang durchzuführen und dann wieder in das installierte System zu booten. Das fragliche System ist jedoch entfernt und ich habe nur über SSH Zugriff. Ich kann neu starten, aber das Booten einer Rettungsdiskette und das Ausführen von Operationen von der Konsole aus ist nicht möglich.
Wie kann ich das Root-Dateisystem aushängen und gleichzeitig den Remote-Shell-Zugriff aufrechterhalten?
Akzeptierte Antwort:
Bei der Lösung dieses Problems waren die unter http://www.ivarch.com/blogs/oss/2007/01/resize-a-live-root-fs-a-howto.shtml bereitgestellten Informationen ausschlaggebend. Dieses Handbuch bezieht sich jedoch auf eine sehr alte Version von RHEL, und verschiedene Informationen waren veraltet.
Die folgenden Anweisungen sind so gestaltet, dass sie mit CentOS 7 funktionieren, aber sie sollten leicht genug 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 verwendet und nichts anderes Wichtiges vor sich geht. Es ist wahrscheinlich eine gute Idee, Dienstbereitstellungseinheiten wie httpd oder ftpd zu stoppen, nur um sicherzustellen, dass externe Verbindungen die Dinge nicht dazwischen stören.
systemctl stop httpd systemctl stop nfs-server # and so on....
-
Unmounten Sie alle unbenutzten Dateisysteme
umount -a
Dadurch werden eine Reihe von „Ziel ist beschäftigt“-Warnungen für das Root-Volume selbst und für verschiedene temporäre/System-FSs ausgegeben. Diese können vorerst ignoriert werden. Wichtig ist, dass außer dem Root-Dateisystem selbst keine Dateisysteme auf der Festplatte gemountet bleiben. Überprüfen Sie dies:
# mount alone provides the info, but column makes it possible to read mount | column -t
Wenn Sie noch Dateisysteme auf der Festplatte sehen, die noch gemountet sind, dann läuft noch etwas, das nicht sein sollte. Überprüfen Sie, was es ist, indem Sie
fuser
verwenden :# if necessary: yum install psmisc # then: fuser -vm <mountpoint> systemctl stop <whatever> umount -a # repeat as required...
-
Erstellen Sie den temporären Stamm
mkdir /tmp/tmproot mount -t tmpfs none /tmp/tmproot mkdir /tmp/tmproot/{proc,sys,dev,run,usr,var,tmp,oldroot} cp -ax /{bin,etc,mnt,sbin,lib,lib64} /tmp/tmproot/ cp -ax /usr/{bin,sbin,lib,lib64} /tmp/tmproot/usr/ cp -ax /var/{account,empty,lib,local,lock,nis,opt,preserve,run,spool,tmp,yp} /tmp/tmproot/var/
Dadurch entsteht ein sehr minimales Root-System, das (unter anderem) das Anzeigen von Manpages unterbricht (kein
/usr/share
). ), Anpassungen auf Benutzerebene (kein/root
oder/home
) und so weiter. Dies ist beabsichtigt, da es eine Ermutigung darstellt, nicht länger als nötig in einem so von der Jury manipulierten Wurzelsystem zu bleiben.An dieser Stelle sollten Sie auch sicherstellen, dass alle erforderliche Software installiert ist, da dies auch den Paketmanager mit Sicherheit kaputt macht. Gehen Sie alle Schritte durch und vergewissern Sie sich, dass Sie über die erforderlichen ausführbaren Dateien verfügen.
-
In den Stamm schwenken
mount --make-rprivate / # necessary for pivot_root to work pivot_root /tmp/tmproot /tmp/tmproot/oldroot for i in dev proc sys run; do mount --move /oldroot/$i /$i; done
systemd bewirkt, dass Mounts standardmäßig die gemeinsame Nutzung von Teilbäumen zulassen (wie bei
mount --make-shared
), und dies verursachtpivot_root
Versagen. Daher schalten wir dies global mitmount --make-rprivate /
aus . 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 leben unter anderem in/run
, und daher gibt es keine Möglichkeit, laufende Prozesse zum Schließen zu bringen. -
Stellen Sie sicher, dass der Fernzugriff die Umstellung überstanden hat
systemctl restart sshd systemctl status sshd
Stellen Sie nach dem Neustart von sshd sicher, dass Sie zugreifen können, indem Sie ein anderes Terminal öffnen und sich erneut über ssh mit der Maschine verbinden. Wenn dies nicht möglich ist, beheben Sie das Problem, bevor Sie fortfahren.
Sobald Sie bestätigt haben, dass Sie sich wieder verbinden können, beenden Sie die Shell, die Sie gerade verwenden, und verbinden Sie sich erneut. Dies erlaubt dem verbleibenden gegabelten
sshd
zum Beenden und stellt sicher, dass das neue nicht/oldroot
enthält . -
Schließen Sie alles noch mit dem alten Root
fuser -vm /oldroot
Dies druckt eine Liste von Prozessen, die noch das alte Root-Verzeichnis halten. Auf meinem System sah es so aus:
USER PID ACCESS COMMAND /oldroot: root kernel mount /oldroot root 1 ...e. systemd root 549 ...e. systemd-journal root 563 ...e. lvmetad root 581 f..e. systemd-udevd root 700 F..e. auditd root 723 ...e. NetworkManager root 727 ...e. irqbalance root 730 F..e. tuned root 736 ...e. smartd root 737 F..e. rsyslogd root 741 ...e. abrtd chrony 742 ...e. chronyd root 743 ...e. abrt-watch-log libstoragemgmt 745 ...e. lsmd root 746 ...e. systemd-logind dbus 747 ...e. dbus-daemon root 753 ..ce. atd root 754 ...e. crond root 770 ...e. agetty polkitd 782 ...e. polkitd root 1682 F.ce. master postfix 1714 ..ce. qmgr postfix 12658 ..ce. pickup
Sie müssen sich mit jedem dieser Prozesse befassen, bevor Sie
/oldroot
unmounten können . Der Brute-Force-Ansatz ist einfachkill $PID
für jeden, aber das kann Dinge kaputt machen. Um es sanfter zu machen:systemctl | grep running
Dadurch wird eine Liste der laufenden Dienste erstellt. Sie sollten dies mit der Liste der Prozesse korrelieren können, die
/oldroot
enthalten , und führen Sie dannsystemctl restart
aus für jeden von ihnen. Einige Dienste weigern sich, im temporären Stammverzeichnis zu erscheinen, und gehen in einen Fehlerzustand. diese sind im Moment nicht wirklich wichtig.Wenn das Stammlaufwerk, dessen Größe Sie ändern möchten, ein LVM-Laufwerk ist, müssen Sie möglicherweise auch einige andere laufende Dienste neu starten, auch wenn sie nicht in der von
fuser -vm /oldroot
erstellten Liste angezeigt werden . Wenn Sie feststellen, dass Sie die Größe eines LVM-Laufwerks unter Schritt 7 nicht ändern können, versuchen Sie es mitsystemctl restart systemd-udevd
.Einige Prozesse können nicht über einen einfachen
systemctl restart
behandelt werden . Bei mir gehörte dazuauditd
(der nicht gerne persystemctl
getötet wird , und wollte daher nur einenkill -15
). Diese können individuell behandelt werden.Der letzte Prozess, den Sie normalerweise finden, ist
systemd
selbst. Führen Sie dazusystemctl daemon-reexec
aus .Wenn Sie fertig sind, sollte die Tabelle so aussehen:
USER PID ACCESS COMMAND /oldroot: root kernel mount /oldroot
-
Unmounten Sie das alte Root
umount /oldroot
An dieser Stelle können Sie alle gewünschten Manipulationen vornehmen. Die ursprüngliche Frage benötigte ein einfaches
resize2fs
Aufruf, aber Sie können hier tun, was Sie wollen; Ein weiterer Anwendungsfall ist die Übertragung des Root-Dateisystems von einer einfachen Partition auf LVM/RAID/was auch immer. -
Drehen Sie die Wurzel zurück
mount <blockdev> /oldroot mount --make-rprivate / # again pivot_root /oldroot /oldroot/tmp/tmproot for i in dev proc sys run; do mount --move /tmp/tmproot/$i /$i; done
Dies ist eine einfache Umkehrung von Schritt 4.
-
Entsorgen Sie das temporäre Stammverzeichnis
Wiederholen Sie die Schritte 5 und 6, außer dass Sie
/tmp/tmproot
verwenden anstelle von/oldroot
. Dann:umount /tmp/tmproot rmdir /tmp/tmproot
Da es sich um ein tmpfs handelt, löst sich an diesem Punkt die temporäre Wurzel in den Äther auf, um nie wieder gesehen zu werden.
-
Stellen Sie die Dinge wieder an ihren Platz
Dateisysteme erneut mounten:
mount -a
An dieser Stelle sollten Sie auch
/etc/fstab
aktualisieren undgrub.cfg
in Übereinstimmung mit allen Anpassungen, die Sie in Schritt 7 vorgenommen haben.Starten Sie alle fehlgeschlagenen Dienste neu:
systemctl | grep failed systemctl restart <whatever>
Geteilte Teilbäume wieder zulassen:
mount --make-rshared /
Starten Sie die angehaltenen Diensteinheiten – Sie können diesen einzigen Befehl verwenden:
systemctl isolate default.target
Und fertig.
Verwandte:Ich kann das Software-Center nicht auf Kali installieren?Vielen Dank an Andrew Wood, der diese Entwicklung auf RHEL4 ausgearbeitet hat, und Steve, der mir den Link zu ersterer zur Verfügung gestellt hat.