GNU/Linux >> LINUX-Kenntnisse >  >> Cent OS

Centos – Wie kann man das Root-Dateisystem verkleinern, ohne eine Livecd zu booten?

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.

  1. 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....
    
  2. 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...
    
  3. 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.

  4. 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 verursacht pivot_root Versagen. Daher schalten wir dies global mit mount --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.

  5. 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 .

  6. 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 einfach kill $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 dann systemctl 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 mit systemctl restart systemd-udevd .

    Einige Prozesse können nicht über einen einfachen systemctl restart behandelt werden . Bei mir gehörte dazu auditd (der nicht gerne per systemctl getötet wird , und wollte daher nur einen kill -15 ). Diese können individuell behandelt werden.

    Der letzte Prozess, den Sie normalerweise finden, ist systemd selbst. Führen Sie dazu systemctl daemon-reexec aus .

    Wenn Sie fertig sind, sollte die Tabelle so aussehen:

                 USER        PID ACCESS COMMAND
    /oldroot:    root     kernel mount /oldroot
    
  7. 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.

  8. 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.

  9. 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.

  10. Stellen Sie die Dinge wieder an ihren Platz

    Dateisysteme erneut mounten:

    mount -a
    

    An dieser Stelle sollten Sie auch /etc/fstab aktualisieren und grub.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.


Cent OS
  1. So setzen Sie das Root-Passwort in CentOS 7 zurück

  2. So installieren Sie Habari unter CentOS 7

  3. So installieren Sie Elgg unter CentOS 7

  4. So verkleinern Sie das Root-Dateisystem unter CentOS / RHEL 6

  5. So entfernen Sie die Noatime-Mount-Option vom Root-Mount-Punkt ohne Neustart (CentOS/RHEL)

So installieren Sie CumulusClips unter CentOS 7

So installieren Sie Logaholic auf CentOS 7

So installieren Sie Webasyst unter CentOS 7

So installieren Sie ProjectSend unter CentOS 7

So installieren Sie Phpwcms unter CentOS 7

So installieren Sie X-Cart unter CentOS 7