Frage Wie kann ich eine Ext-Root-Partition zur Laufzeit ändern?


Wie kann ich die Root-Partition eines Systems zur Laufzeit vergrößern?

Ich habe eine Partition, die nicht nach der Root-Partition zugeordnet ist (die auch ext4 ist), wie kann ich den nicht zugewiesenen Speicherplatz zu dem Speicherplatz hinzufügen, der der Root-Partition zugewiesen ist, ohne den Server herunterfahren zu müssen?


194
2018-01-30 17:23


Ursprung


Ich hasse es, wie ein Stock im Schlamm zu klingen, aber das bringt ein gewisses Risiko mit sich? Warum muss das passieren? Ist Uptime die Hauptbedingung? - DevNull
Sie können die Größe einer Partition nicht nach links ändern, da dies eigentlich eine Verschiebung wäre. - Zaz
Die Online-Erweiterung von ext4-Parititionen ist einfach. Der schwierige Teil würde schrumpfen (in Ihrer Überschrift geht es um "Größenanpassung"). Für Leute, die an JEDER Manipulation auf einer Root-Partition interessiert sind (Verschieben, Verkleinern, Dateisystem ändern, Gerät), sollte zur Laufzeit meine Antwort konsultieren: askubuntu.com/a/728141/21888 - vaab


Antworten:


GUI (Ubuntu 14.04 und später): GParted v0.17 und höher bieten dafür eine nette GUI. (Ältere Versionen verweigern die Größenänderung einer gemounteten Partition).

Befehlszeile (jede Ubuntu-Version): Dazu gibt es drei Schritte.

Schritt 1. Die Partition muss zuerst in der Größe geändert werden. Wenn Sie LVM verwenden, ist es einfach und Sie wissen vermutlich, wie Sie vorgehen. Wenn Sie klassische Partitionen verwenden, ist es ein bisschen komplizierter und kann erfordern einen Neustart (obwohl Sie nie ein anderes System oder Live-CD booten müssen).

So mache ich es: Verwenden fdisk Zuerst löschen Sie die Partition (die Idee ist, dass die Daten auf der Festplatte erhalten bleiben), dann erstellen Sie sie sorgfältig mit einer größeren Größe an der gleichen Position.

Beispiel:

$ sudo fdisk /dev/sda

Command (m for help): p

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     9437183     4717568   83  Linux

Command (m for help): d
Selected partition 1

Command (m for help): p

   Device Boot      Start         End      Blocks   Id  System

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4, default 1): 1
First sector (2048-10485759, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-10485759, default 10485759):
Using default value 10485759

Command (m for help): p

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048    10485759     5241856   83  Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.

Auch hier ist es wichtig, dass die neue Partition im selben Block wie der alte beginnt. Die ID sollte ebenfalls übereinstimmen (83 für Linux-Systeme). Bereiten Sie sich darauf vor, Ihre Daten bei geringstem Tippfehler zu verlieren.

Um auf der sicheren Seite zu sein, können Sie auch das Boot-Flag wiederherstellen (welches Laut Wikipedia ist auf einigen Computern noch erforderlich) durch Drücken von a.

Sehen Sie im Kommentarbereich nach, was zu tun ist, wenn Ihre Swap-Partition im Weg ist.

Inzwischen sollte klar sein, warum die Leute eine Live-CD empfehlen. ;-)

Schritt 2. Wie fdisk erinnert Sie hilfreich daran, dass Sie die Partitionstabelle neu laden müssen, bevor Sie fortfahren. Der sicherste Weg ist, einfach neu zu starten; aber du kannst es auch benutzen partprobe oder kpartx  (Mehr Informationen).

Schritt 3. Sobald die Größe der Partition geändert und die Partitionstabelle neu geladen wurde, ist es einfach auszuführen resize2fs auf dem Dateisystem, und Sie können dies tun, auch wenn es als Root-Partition bereitgestellt ist.

Beispiel:

$ sudo resize2fs /dev/sda1

170
2018-04-06 14:23



Das hat perfekt für mich funktioniert. Allerdings habe ich zusätzlich dafür gesorgt, dass das Boot Flag im Originalzustand gehalten wird. - Augustus Kling
@ jbo5112: Wie fdisk sagt, partprobe oder kpartx funktioniert möglicherweise anstelle eines Neustarts; siehe auch diese Frage. Selbst wenn Sie einen Neustart durchführen, ist die Lösung der Verwendung einer Live-CD bei Ausfallzeiten vorzuziehen, da ein einfacher Neustart für eine virtuelle Maschine weniger als 10 s dauern kann. Es ist auch schneller in der Bedienerzeit, weshalb ich diesen Ansatz normalerweise selbst benutze. :) - Søren Løvborg
@ Raymond: Wenn der Speicherdruck es erlaubt (siehe free -h), deaktivieren Sie den Swap (swapoff /dev/sda2), ändern Sie die Partitionstabelle (einschließlich Löschen und Wiederherstellen der Swap-Partition) und entweder 1) reboot oder 2) laden Sie die Partitionstabelle und neu swapon nochmal. (Wenn der Arbeitsspeicher zu kurz ist, um die Auslagerung vorübergehend zu deaktivieren, können Sie weiterhin eine Funktion erstellen und aktivieren Neu Swap-Partition (/dev/sda3), dann auslagern sda2; aber dann musst du updaten /etc/fstab mit dem Namen des neuen Swap-Geräts.) - Søren Løvborg
Wenn Sie vmware verwenden und die Größe der Festplatte erweitert haben, müssen Sie sudo lshw -C -disk ausführen, um die Dateisysteme erneut zu scannen, damit die VM das größere Laufwerk erkennt. Folgen Sie dann den obigen Anweisungen. - Guy
Was ist mit Schrumpfen? - Aaron Franke


Es ist möglich, eine Online-Größenanpassung eines ext4-Dateisystems vorzunehmen, selbst wenn es sich um Ihre root-Partition handelt. Benutze die resize2fs Befehl.

sudo resize2fs /dev/sda1

EDIT: On-line-Schrumpfung ist nicht erlaubt:

root@brunojcm-htpc:/home# resize2fs /dev/sda5 2654693
resize2fs 1.42 (29-Nov-2011)
Filesystem at /dev/sda5 is mounted on /; on-line resizing required
resize2fs: On-line shrinking not supported

109
2018-03-02 10:50



Von man resize2fs: The resize2fs program does not manipulate the size of partitions. If you wish to enlarge a filesystem, you must make sure you can expand the size of the underlying partition first. This can be done using fdisk(8) by deleting the partition and recreating it with a larger size or using lvextend(8),if you're using the logical volume manager lvm(8). In dieser Frage geht es darum, die Größe zu ändern Partition, nicht der Dateisystem. Die Unterscheidung ist subtil, aber sehr wichtig. - Eliah Kagan
Sie können fdisk verwenden, um die Root-Partition zu löschen und sie dann im selben Startblock neu zu erstellen. fdisk schreibt die Änderung aus, wird aber erst nach einem Neustart wirksam. Nach dem Neustart können Sie das resize2fs-Programm verwenden, um die Festplatte zu senden, um die Partition zu füllen. - James Becwar
Ich habe gerade eine ext4 root Partition online geändert. Daher kann ich bestätigen, dass es möglich ist. Aber anstatt / dev / sda * als Parameter an resize2fs zu übergeben, müssen Sie den logischen Volume-Namen übergeben. - CDR
Ich finde den ersten Absatz des resize2fs-Manpage am interessantesten für die erste Frage: The resize2fs program will resize ext2, ext3, or ext4 file systems. It can be used to enlarge or shrink an unmounted file system located on device. If the filesystem is mounted, it can be used to expand the size of the mounted filesystem, assuming the kernel supports on-line resizing. (As of this writing, the Linux 2.6 kernel supports on-line resize for filesystems mounted using ext3 and ext4.). - mo'
Bitte nicht meckern fdisk wann growpart werde das sehr leicht für dich tun. - STRML


Eine einfachere Lösung - verwenden growpart <device> <partition>:

growpart /dev/xvda 1  # Grows the partition; note the space
resize2fs /dev/xvda1  # Grows the filesystem

Wie immer, sichern Sie Ihre Partitionstabelle (sfdisk -d /dev/xvda > partition_bak.dmp) nur für den Fall.


22
2017-07-18 13:26



Was ist mit Schrumpfen? - Aaron Franke
Hoffte, diese Methode zu verwenden, aber bekam sfdisk: /dev/nvme0n1p5: does not contain a recognized partition table (mit Dual-Boot mit Windows) - monkut
Das Schrumpfen ist online nicht möglich. Ich empfehle die Verwendung gparted dafür. - STRML
Dies war perfekt für die Änderung der Root-Partition und des Dateisystems meiner AWS-VM. Prost. - MetaFight
Growpart ist Teil von Cloud-Utils. Falls Sie nicht installiert haben, können Sie mit installieren apt-get install cloud-utils - klor


Sie könnten auch nur nutzen GParted - Solange die Größe der Partition nicht geändert wird, von der aus Sie gestartet haben - ansonsten empfehle ich die Live-CD Für Anfänger ist die Option etwas einfacher.

GParted Im Grunde genommen alle Schritte - nur basierend auf einer GUI-Front.


8
2017-09-30 11:34



Ich habe mein System mit Ubuntu 12.04 Live CD gebootet und die Größe der ext4 Partition mit GParted geändert. Hat gut für mich funktioniert. Jedenfalls habe ich vor dieser Operation alle meine wichtigen Daten gesichert. - StandDuPp
Ich denke, gparted braucht Partition nicht eingehängt. aber ich kann falsch liegen. - Nick
Die Frage bezieht sich offensichtlich auf die Partition, von der sie gebootet haben, und das Booten einer Live-CD erfordert einen Neustart des Rechners. -1 - wjandrea


Ja, Sie können eine Online-Root-Partition verkleinern / verschieben / vergrößern ohne irgendwelche Neustarts (noch livecd, noch usbkey): konsultiere diese Antwort. Es ist sehr gut geschrieben und leicht zu folgen, obwohl es ziemlich lang und ein wenig riskant ist. Wenn Sie also nur Ihre ext4-Partition erweitern wollen, können Sie sich an das herkömmliche Arbeiten halten resize2fsLösungen.

Die allgemeine Lösung, die ich verwendet habe, funktioniert zum Beispiel bei jeder Art dedizierter oder VPS-Lösung.

TLDR; Diese Lösung impliziert pivot_root zu tmpfs also kannst du umount sicher deine root-Partition live und tüfteln damit. Wenn du fertig bist, wirst du es tun pivot_root zurück auf Ihrer neuen root-Partition.

Dies ermöglicht so ziemlich jede Manipulation des Root-Dateisystems (Verschieben, Ändern des Dateisystems, Ändern des physischen Gerätes ...).

Ein Neustart ist dabei nicht erforderlich Ermöglicht die Umgehung der Begrenzung von resize2fs  nicht in der Lage zu schrumpfen  ext4 Partitionen.

Ich habe das persönlich benutzt, und es funktioniert auch sehr gut auf Debian-System, also sollte es auf Ubuntu funktionieren. Ich bin sehr überrascht, diese detaillierte Lösung nicht mehr in Zusammenhang mit den vielen Fragen in Stackexchange-Websites zu sehen, die sich mit dem gleichen Problem befassen.

Hinweis: Natürlich, wenn Sie Ihre Partition erweitern möchten, ein einfaches resize2fs wird genug sein, wie an vielen Stellen und in anderen Antworten hier angegeben.


8
2018-02-01 02:08



Ich denke an die meisten Leute, nachdem Sie alle Programme und Dienste gestoppt haben, die auf die root-Partition zugreifen, könnten Sie genauso gut den Rechner neu gestartet haben. Für das Schrumpfen / Verschieben ist das vielleicht noch schneller als das Verwenden einer Live-CD, aber zum Wachsen (bei weitem die häufigste Aufgabe, und was OP gefragt hat), gibt es Möglichkeiten, die kein vorübergehendes Herunterfahren des größten Teils des Systems beinhalten . - Søren Løvborg
@ SørenLøvborg: Sie können die Kerndienste, die eine kontinuierliche Produktion benötigen, während des gesamten Vorgangs neu starten. Es gibt viele Konfigurationen, bei denen Sie LiveCD (VPS-Instanzen, dedizierte Server ...) oder Umstände, bei denen Sie aus bestimmten Gründen Neustarts vermeiden möchten, nicht verwenden können. Der Titel der ursprünglichen Frage erwähnt die "Größenänderung", die Leute anzieht, die online schrumpfende Partitionen suchen. ** Keine andere Lösung erlaubt ext4 online zu verkleinern. ** Diese Lösung ist riskant, komplex, aber die mächtigste von allen und sie füllt die Mängel der anderen. - vaab


Habe gerade die Größe einer ext4 root-Partition auf einem Live-System geändert, während der root mount war.

[root@habib i686]# resize2fs /dev/vg_habib/lv_root
resize2fs 1.42 (29-Nov-2011)
Filesystem at /dev/vg_habib/lv_root is mounted on /; on-line resizing required
old_desc_blocks = 4, new_desc_blocks = 10
Performing an on-line resize of /dev/vg_habib/lv_root to 38427648 (4k) blocks.
The filesystem on /dev/vg_habib/lv_root is now 38427648 blocks long.

[root@habib i686]# 

5
2017-12-04 22:40





Ich habe das einfach erfolgreich ohne gemacht umount, pivot_rootoder zeitweiliges Entfernen der Hauptpartition mit Hilfe von parted 3.2 auf Ubuntu 16.04, 4.4.0 Kernel. Um vorsichtig zu sein, habe ich alles von einer virtuellen Konsole aus mit deaktiviertem Netzwerk gemacht und vorher einen Snapshot erstellt, aber der Snapshot wurde nicht benötigt, also hätte ich das genauso gut über SSH und ohne Runlevel ändern können.

Ermitteln der Partitionsgröße: parted /dev/sda1 print | egrep "Disk.*GB"

Wechseln Sie optional in den Multi-User-Modus ohne Netzwerk (muss von einer Konsole aus erfolgen, nicht SSH):

runlevel     # remember the original runlevel
init 2

Wählen Sie optional einen VM-Snapshot, um vorsichtig zu sein.

Partitionsgröße ändern:

parted
p
resizepart NUMBER SIZE
# answer "Yes" when asked about resizing a live partition.
q

Größe des Dateisystems ändern: resize2fs /dev/sda1

Wenn etwas schief geht, können Sie Ihren Schnappschuss hier wiederherstellen. Wenn alles in Ordnung war, kehren Sie zum normalen Runlevel zurück (oben erhalten) - normalerweise 5: init 5. Es ist vielleicht besser, an diesem Punkt einen vollständigen Neustart durchzuführen, um sicherzustellen, dass alles korrekt zurückkommt (ich hatte danach ein date / ntp-Problem).


1
2017-07-14 00:09





Wie bereits erwähnt:

  • Live-Erweiterung von einem Root-System ist möglich (keine Schwierigkeiten, da der Boot-Bereich nicht verschoben werden soll)

  • Das Verkleinern einer Live-Root-Partition muss von einem externen Boot-Gerät (Booten von Live-System cd / usb-stick) erfolgen, als ob es einen Fehler oder eine Nichtübereinstimmung gibt ... egal, wie Ihr System hängt, muss neu gestartet werden und wird es nicht sein kann korrekt gestartet werden.

Jede Art von "Aber ich tat es und es funktioniert" ist reines Glück.


0
2018-01-10 21:58





Folge diesen Schritten.

  1. Öffnen Sie das Terminal als Superuser su
  2. Lauf parted
  3. Art p um die verfügbaren Partitionen zu sehen
  4. Identifizieren Sie die Nummer Ihrer Root-Partition (Beispiel: 'sda 3' bedeutet Nummer 3) und löschen Sie eine angrenzende Partition mit rm PARTITION NUMBERum freien Speicherplatz zu schaffen.
  5. Erhöhen Sie jetzt die Root-Größe, indem Sie tippen resizepart ROOT NUMBER und starten Sie das System bei Bedarf neu
  6. Ausfahrt parted durch Eingabe von exit und im Terminal-Typ partprobe und drücken Sie die Eingabetaste (dies ist auch nach dem Neustart möglich)
  7. endlich laufen resize2fs /dev/sda PARTITION NUMBER und genießen Sie geräumige Root-Partition.

0
2017-09-13 20:22





Ich möchte die Antwort von @ Søren Løvborg erweitern: die Partition mit einer vorhandenen Swap-Partition erweitern.

Zuerst das Layout der Festplatte nach der Erweiterung:

$sudo parted /dev/sda 'unit s print' free
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 14336000s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start      End        Size       Type      File system     Flags
        63s        2047s      1985s                Free Space
 1      2048s      10485759s  10483712s  primary   ext4            boot
        10485760s  10487805s  2046s                Free Space
 2      10487806s  12580863s  2093058s   extended
 5      10487808s  12580863s  2093056s   logical   linux-swap(v1)
        12580864s  14335999s  1755136s             Free Space

Daher muss sda1 mit dem freien Speicherplatz am Ende der Festplatte erweitert werden, aber die Swap-Partition befindet sich dazwischen. So können Sie es machen:

Zuerst müssen wir den Swap deaktivieren. Überprüfen Sie, wie oft es verwendet wird und ob Sie es ausschalten können.

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           992M         52M        464M        3.2M        475M        784M
Swap:          1.0G          0B        1.0G

Swap ist hier nicht verwendet, also können wir es ausschalten

$sudo swapoff /dev/sda2

Jetzt werden wir die Partitionstabelle ändern:

$sudo fdisk /dev/sda

(Hinweis: Wenn die erste Partition bei Sektor 63 statt bei 2048 beginnt, müssen Sie die Option hinzufügen -c=dos)

Welcome to fdisk (util-linux 2.27.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p
Disk /dev/sda: 6.9 GiB, 7340032000 bytes, 14336000 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x9e11c6df

Device     Boot    Start      End  Sectors  Size Id Type
/dev/sda1  *        2048 10485759 10483712    5G 83 Linux
/dev/sda2       10487806 12580863  2093058 1022M  5 Extended
/dev/sda5       10487808 12580863  2093056 1022M 82 Linux swap / Solaris

Command (m for help): d
Partition number (1,2,5, default 5): 2

Partition 2 has been deleted.

Command (m for help): d
Selected partition 1
Partition 1 has been deleted.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-14335999, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-14335999, default 14335999): 122                                                                  42941

Created a new partition 1 of type 'Linux' and of size 5.9 GiB.

Command (m for help): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 2
First sector (12242942-14335999, default 12242944):
Last sector, +sectors or +size{K,M,G,T,P} (12242944-14335999, default 14335999):

Created a new partition 2 of type 'Linux' and of size 1022 MiB.

Command (m for help): a
Partition number (1,2, default 2): 1

The bootable flag on partition 1 is enabled now.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Re-reading the partition table failed.: Device or resource busy

The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).

Hinweis: Die Größe von sda1 ist die Gesamtmenge der Sektoren abzüglich der Sektorgröße Ihrer Swap-Partition: 14335999-2093058 = 12242941

Wie fdisk erwähnt: Der Kernel benutzt immer noch die alte Partitionstabelle, also müssen wir sie neu laden.

$partprobe

Jetzt müssen wir resize2fs auf sda1 ausführen (vergiss das nicht!)

$resize2fs /dev/sda1
resize2fs 1.42.12 (29-Aug-2014)
Filesystem at /dev/sda1 is mounted on /; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 10
The filesystem on /dev/sda1 is now 38833617 (4k) blocks long.

Jetzt sind die Dinge noch nicht vorbei. Wie Sie wahrscheinlich bemerkt haben, ist sda2 als Linux (Ext4) partitioniert. Aus irgendeinem Grund gibt es in fdisk keine Möglichkeit, den Typ zu wählen. Also müssen wir es abwechselnd verwenden cfdisk

$ sudo cfdisk

Wähle sda2 und ändere den Typ in 82 Linux swap / Solarisund stellen Sie sicher, dass Sie es schreiben (geben Sie ja ein, um zu bestätigen)

Jetzt können wir den Swap reaktivieren

$mkswap /dev/sda2
/dev/sda2
UUID=d58bf1cb-d27a-487d-b337-056767fd5ad6 none swap sw 0 0

Und schalte es endlich an:

$swapon /dev/sda2

Das einzige, was wir tun müssen, ist, fstab zu aktualisieren, um die Swap-Partition beim Booten automatisch zu mounten

$sudo nano /etc/fstab

Und ändern Sie die UUID der Swap-Partition in die obige Ausgabe:

# swap was on /dev/sda5 during installation
UUID=d58bf1cb-d27a-487d-b337-056767fd5ad6 none            swap    sw              0       0

Jetzt ist alles in Ordnung und Sie können ohne Probleme neu starten.


0
2017-09-07 06:58