Wie kann ich die Größe einer ext-Root-Partition zur Laufzeit ändern?


236

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

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


3
Ich mag es nicht, wie ein Stock im Schlamm zu klingen, aber das birgt einiges Risiko? Warum muss das passieren? Ist die Verfügbarkeit die Hauptbeschränkung?
Wolke

Sie können die Größe einer Partition nicht nach links ändern, da dies tatsächlich eine Verschiebung wäre.
Zaz,

5
Das Erhöhen der Größe von ext4-Partitionen online ist einfach. Der schwierige Teil wäre zu verkleinern (Ihre Überschrift handelt von "Größenänderung"). Für Leute, die sich für JEDE Manipulation auf einer Root-Partition (verschieben, verkleinern, Dateisystem ändern, Gerät) zur Laufzeit interessieren,
lesen

Verwenden Sie growpart
guettli

Antworten:


214

GUI (Ubuntu 14.04 und höher) : GParted v0.17 und höher bieten hierfür eine schöne GUI. (Ältere Versionen lehnen es ab, die Größe einer bereitgestellten Partition zu ändern.)

Befehlszeile (jede Ubuntu-Version): Hierzu sind drei Schritte erforderlich.

Schritt 1. Die Partition muss zuerst in der Größe angepasst werden. Wenn Sie LVM verwenden, ist dies einfach und Sie wissen vermutlich, wie Sie vorgehen müssen. Wenn Sie klassische Partitionen verwenden, ist dies etwas komplizierter und erfordert möglicherweise einen Neustart (obwohl Sie nie ein anderes System oder eine Live-CD starten müssen).

So geht's: fdiskLöschen Sie zuerst die Partition (die Daten auf der Festplatte bleiben erhalten) und erstellen Sie sie dann vorsichtig mit einer größeren Größe an derselben Position neu.

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 am selben Block wie die alte beginnt. Die ID sollte ebenfalls übereinstimmen (83 für Linux-Systeme). Seien Sie darauf vorbereitet, alle Ihre Daten bei der geringsten Tippfehler zu verlieren.

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

Im Kommentarbereich erfahren Sie, was zu tun ist, wenn Ihre Swap-Partition im Weg ist.

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

Schritt 2. Wie Sie fdiskhilfreicherweise daran erinnert, müssen Sie die Partitionstabelle neu laden, bevor Sie fortfahren können. Der sicherste Weg ist, einfach neu zu starten. Sie können aber auch partprobeoder kpartx (weitere Informationen) verwenden .

Schritt 3. Sobald die Größe der Partition geändert und die Partitionstabelle neu geladen wurde, müssen Sie nur noch resize2fsauf dem Dateisystem ausgeführt werden. Dies ist auch dann möglich, wenn die Partition als Root-Partition gemountet ist.

Beispiel:

$ sudo resize2fs /dev/sda1

16
Das hat bei mir perfekt funktioniert. Allerdings habe ich zusätzlich dafür gesorgt, dass das Boot-Flag im Originalzustand bleibt.
Augustus Kling

4
@ jbo5112: Wie fdiskgesagt, partprobeoder kpartxfunktioniert möglicherweise anstelle eines Neustarts; siehe auch diese frage . Selbst wenn Sie neu starten, ist die Lösung der Verwendung einer Live-CD vorzuziehen, wenn es zu Ausfallzeiten kommt, bei denen ein einfacher Neustart für eine virtuelle Maschine weniger als 10 Sekunden dauern kann. Es ist auch schneller in der Bedienerzeit, weshalb ich diesen Ansatz normalerweise selbst verwende. :)
Søren Løvborg

1
@Raymond: Wenn der Speicherdruck dies zulässt (siehe free -h), deaktivieren Sie swap ( swapoff /dev/sda2), ändern Sie die Partitionstabelle (einschließlich Löschen und Neuerstellen der Swap-Partition) und führen Sie entweder 1) einen Neustart oder 2) ein erneutes Laden der Partitionstabelle durch swapon. (Wenn der Speicher zu knapp ist, um den Austausch vorübergehend zu deaktivieren, können Sie dennoch eine neue Auslagerungspartition erstellen und aktivieren ( /dev/sda3) und dann auslagern sda2; anschließend müssen Sie /etc/fstabden neuen Auslagerungsgerätenamen aktualisieren .)
Søren Løvborg,

1
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

2
Was ist mit Schrumpfen?
Aaron Franke

114

Es ist möglich, die Größe eines ext4-Dateisystems online zu ändern, auch wenn es sich um Ihre Root-Partition handelt. Verwenden Sie den resize2fsBefehl.

sudo resize2fs /dev/sda1

BEARBEITEN: Online-Schrumpfen 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

55
Von man resize2fs: Bei 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).dieser Frage geht es um die Größenänderung der Partition , nicht des Dateisystems . Die Unterscheidung ist subtil, aber sehr wichtig.
Eliah Kagan

8
Mit fdisk können Sie die Root-Partition löschen und dann im selben Startblock neu erstellen. fdisk schreibt die Änderung aus, sie wird jedoch erst nach einem Neustart wirksam. Nach dem Neustart können Sie das Programm resize2fs verwenden, um die Festplatte zum Füllen der Partition zu senden.
James Becwar

3
Ich habe gerade die Größe einer ext4-Root-Partition online geändert. Daher kann ich bestätigen, dass es möglich ist. Anstatt / dev / sda * als Parameter für resize2fs zu übergeben, müssen Sie den logischen Datenträgernamen übergeben.
CDR

10
Ich finde den ersten Absatz der resize2fs-Manpage für die erste Frage am interessantesten: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

5
Bitte machen Sie sich keine Gedanken darüber, fdiskwann growpartdies für Sie sehr einfach sein wird.
STRML

54

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

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

Sichern Sie wie immer Ihre Partitionstabelle ( sfdisk -d /dev/xvda > partition_bak.dmp) für alle Fälle.


Was ist mit Schrumpfen?
Aaron Franke

Ich hatte gehofft, diese Methode zu verwenden, bekam aber sfdisk: /dev/nvme0n1p5: does not contain a recognized partition table(mit Dual-Boot mit Windows)
Monkut

Das Schrumpfen ist nicht online möglich. Ich empfehle dafür gparted.
STRML

4
growpart ist Teil von Cloud-Utils. Falls Sie nicht installiert haben, können Sie mitapt-get install cloud-utils
klor

1
@monkut Spät zur Party, aber dein Datenträger ist wahrscheinlich /dev/nvme0n1. p5 ist Partition 5 auf dieser Festplatte. Im Vergleich zu herkömmlichen BSD-Scheibenscheiben verwenden sie ein ähnliches Nummerierungsschema.
Per Lundberg

12

Ja, Sie können eine Online-Root-Partition ohne Neustart (noch Live-CD oder USB-Schlüssel) verkleinern, verschieben oder vergrößern. Lesen Sie dazu diese Antwort . Es ist sehr gut geschrieben und leicht zu befolgen, obwohl es ziemlich lang und ein wenig riskant ist. Wenn Sie also nur Ihre ext4-Partition erweitern möchten, können Sie sich an die herkömmlichen Arbeitslösungen halten resize2fs.

Die allgemeine Lösung, die ich verwendet habe, funktioniert beispielsweise für alle Arten von dedizierten Lösungen oder VPS-Lösungen.

TLDR; Diese Lösung bedeutet , zu pivot_rootzu tmpfsso können Sie umountsicher Ihre Root - Partition mit ihr leben und Geige. Sobald Sie fertig sind, kehren Sie pivot_rootzu Ihrer neuen Root-Partition zurück.

Dies ermöglicht so ziemlich jede Manipulation am Root-Dateisystem (es verschieben, das Dateisystem ändern, das physische Gerät ändern ...).

Kein Neustart in dem Prozess erforderlich ist , und dies ermöglicht die Begrenzung umgehen von resize2fs nicht in der Lage zu schrumpfen ext4 Partitionen.

Ich persönlich habe dies verwendet und es funktioniert sehr gut auf Debian-Systemen, so dass es auf Ubuntu funktionieren sollte. Ich bin sehr überrascht, dass diese tiefgreifende Lösung nicht ein bisschen mehr mit den vielen Fragen in Stackexchange-Websites zusammenhängt, die sich mit dem gleichen Problem befassen.

Hinweis: Wenn Sie Ihre Partition erweitern möchten, reicht natürlich ein einfaches resize2fsaus, wie an zahlreichen Stellen und in anderen Antworten hier angegeben.


4
Ich denke für die meisten Leute, wenn Sie alle Programme und Dienste gestoppt haben, die auf die Root-Partition zugreifen, haben Sie den Computer möglicherweise genauso gut neu gestartet. Beim Verkleinern / Verschieben ist dies möglicherweise noch schneller als beim Verwenden einer Live-CD, aber beim Erweitern (die bei weitem häufigste Aufgabe und nach der OP gefragt wurde) gibt es Möglichkeiten, bei denen der Großteil des Systems nicht vorübergehend heruntergefahren werden muss .
Søren Løvborg

2
@ SørenLøvborg: Sie können die Kerndienste, die eine kontinuierliche Produktion erfordern, während des gesamten Vorgangs neu starten. Es gibt viele Konfigurationen, in denen Sie keine LiveCD ablegen können (VPS-Instanzen, dedizierte Server ...) oder Umstände, in denen Sie Neustarts aus bestimmten Gründen vermeiden möchten. Im Titel der ursprünglichen Frage wird "Größenänderung" erwähnt, was Leute anzieht, die nach verkleinerten Partitionen online suchen. ** Keine andere Lösung erlaubt es, ext4 online zu verkleinern. ** Diese Lösung ist riskant, komplex, aber die mächtigste von allen und füllt die Mängel der anderen.
Vaab

1
Bitte posten Sie keine Antworten abhängig von externen Links. Fügen Sie den entsprechenden Teil in Ihre Antwort ein oder posten Sie den Link als Kommentar zur Frage. Siehe Wie Antwort für Details.
Melebius

10

Sie können auch einfach GParted verwenden - vorausgesetzt, die Partition, deren Größe Sie ändern, ist nicht die Partition, von der Sie gebootet haben. Andernfalls ist die Live-CD- Option für Anfänger etwas einfacher.

GParted führt im Grunde alle Schritte aus - nur basierend auf einer GUI mit Front.


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 eine nicht gemountete Partition. aber ich kann mich irren.
Nick

Die Frage bezieht sich offensichtlich auf die Partition, von der aus sie gestartet wurden, und für das Starten einer Live-CD muss der Computer neu gestartet werden. -1
wjandrea

5

Wir haben gerade die Größenänderung einer ext4-Root-Partition auf einem Live-System abgeschlossen, während der Root eingehängt 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

Ich möchte die Antwort von @ Søren Løvborg erweitern: Erweiterung der Partition um eine vorhandene Swap-Partition.

Zuerst das Layout der Festplatte nach dem Erweitern:

$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

Sda1 muss also um den 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 Swap deaktivieren. Überprüfen Sie, wie viel 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 wird hier nicht verwendet, damit wir es ausschalten können

$sudo swapoff /dev/sda5

Jetzt werden wir die Partitionstabelle ändern:

$sudo fdisk /dev/sda

(Hinweis: Wenn die erste Partition bei Sektor 63 statt 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): 12242941

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 Gesamtanzahl der Sektoren abzüglich der Sektorgröße Ihrer Swap-Partition: 14335999-2093058 = 12242941

Als fdisk erwähnt: Der Kernel verwendet immer noch die alte Partitionstabelle, daher 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.

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

$ sudo cfdisk

Wähle sda2 und ändere den Typ auf 82 Linux swap / Solarisund stelle sicher, dass du es schreibst ( tippe yes zur Bestätigung)

Jetzt können wir den Swap wieder aktivieren

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

Und zum Schluss schalten Sie es ein:

$swapon /dev/sda2

Das Einzige, was wir tun müssen, ist, fstab zu aktualisieren, damit die Swap-Partition beim Booten automatisch eingehängt wird

$sudo nano /etc/fstab

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

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


Als Alternative zum Swap-Partitionstyp kann fdisk buy gewählt werden, indem t dann 5 (Partition 5) und dann 82 (Typ Linux Swap / Solaris)
Oz Edri

sollte Partition 2 nicht erweitert werden? (Und dann sollten wir in fdisk e anstelle von p wählen.) Sollten die Befehle mkswap und swapon nicht auf / dev / sda5 anstelle von sda2 ausgeführt werden?
Oz Edri

1
Für den Swap-Partitionstyp: Ich habe in anderen Anweisungen festgestellt, dass Sie den Typ in fdisk zwar auswählen können, aber aus irgendeinem Grund in meiner Version nicht funktioniert hat. Auf jeden
Fall

1
Für die Auslagerungspartition: Sie können eine erweiterte Partition verwenden, müssen dann jedoch zwei Partitionen hinzufügen: eine erweiterte und eine logische (siehe mein ursprüngliches Partitionslayout). In meinem Beispiel habe ich 2 primäre Partitionen: sda1 - ext4 - Root-Partition & sda2 - Swap-Partition. Daher müssen die mkswap& swapon-Befehle auf sda2 ausgeführt werden. Ich habe am Anfang meines Beitrags einen Fehler gemacht: swapoffMuss auf sda5 ausgeführt werden. Kommentare sind immer willkommen, es war schwierig, sie aufzuschreiben.
wouter205

1
Wenn die Swap-Partition verschlüsselt ist, muss man zuerst Cryptdisks mit stoppen cryptdisks_stop, dann / etc / crypttab anstelle von aktualisieren /etc/fstabund Cryptdisks mit neu starten cryptdisks_start.
Dmitri Chubarov

1

Ich habe gerade diese erfolgreich ohne umount, pivot_rootoder vorübergehende Entfernung der Hauptpartition, trennte sie unter Verwendung 3.2 auf Ubuntu 16.04, 4.4.0 - Kernel. Um vorsichtig zu sein, habe ich alles von einer virtuellen Konsole mit deaktiviertem Netzwerk aus gemacht und zuvor für alle Fälle einen Snapshot erstellt, der jedoch nicht benötigt wurde. Daher hätte ich dies auch über SSH und ohne Änderung der Runlevel tun können.

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

Optional können Sie in den Mehrbenutzermodus ohne Netzwerk wechseln (muss über eine Konsole und nicht über SSH erfolgen):

runlevel     # remember the original runlevel
init 2

Optional können Sie einen VM-Snapshot erstellen, um vorsichtig zu sein.

Partitionsgröße ändern:

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

Dateisystemgröße ändern: resize2fs /dev/sda1

Wenn etwas schief geht, können Sie Ihren Schnappschuss hier wiederherstellen. Wenn alles in Ordnung geht, wieder in dem normalen Runlevel (erhalten oben) - in der Regel 5: init 5. Es ist möglicherweise besser, an diesem Punkt einen vollständigen Neustart durchzuführen, um sicherzustellen, dass alles wieder ordnungsgemäß funktioniert (ich hatte danach ein Datums- / NTP-Problem).


1

Folge diesen Schritten.

  1. Terminal als Superuser öffnen su
  2. Lauf parted
  3. Geben Sie ein p, um die verfügbaren Partitionen anzuzeigen
  4. Identifizieren Sie Ihre Root-Partitionsnummer (Beispiel: 'sda 3' bedeutet Nummer 3) und löschen Sie eine benachbarte Partition, indem Sie rm PARTITION NUMBERfreien Speicherplatz erstellen.
  5. Erhöhen Sie nun die Root-Größe, indem Sie eingeben resizepart ROOT NUMBERund das System bei Bedarf neu starten
  6. Verlassen Sie das partedProgramm durch Eingabe von exitund geben Sie den Terminaltyp ein partprobeund drücken Sie die Eingabetaste (dies kann auch nach einem Neustart erfolgen).
  7. Endlich laufen resize2fs /dev/sda PARTITION NUMBERund die geräumige Root-Partition genießen.

0

Wie bereits erwähnt:

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

  • Das Verkleinern einer Live-Root-Partition muss über ein externes Startgerät erfolgen (Start von einer Live-System-CD / einem USB-Stick), als ob ein Fehler oder eine Nichtübereinstimmung vorliegen würde in der Lage, richtig zu booten.

Jede Art von "aber ich habe es getan und es funktioniert" ist reines Glück.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.