Live-Größenänderung einer GPT-Partition unter Linux


12

Unter Linux habe ich die Größe von MBR-Partitionen mithilfe von fdisk geändert, auch auf Live-Dateisystemen, und dann resize2fs / pvresize / ... (abhängig vom fs-Typ) ausgegeben, um den neuen Speicherplatz zuzuweisen.

In letzter Zeit habe ich Xen- und GPT-Partitionen verwendet, und ich habe festgestellt, dass die Partitionierung leider keine sofortige Größenänderung einer gemounteten Partition zulässt. Tatsächlich wird sich Folgendes beschweren:

Error: Partition XXX is being used. You must unmount it before you modify it with Parted.

Ich habe sowohl den resizeBefehl als auch die Kombination gerade rm+ ausprobiert mkpart, aber beide beschweren sich über die gemountete Partition.

Wie kann ich das machen?


Eine Art und Weise zur Verfügung aus der Box auf RHEL / CentOS sehr geschätzt würde
cyberz

Antworten:


12

Der sicherste Weg, dies zu tun, besteht darin, mit einem Notfallmedium (einer Live-CD oder dergleichen) zu booten und GParted zu verwenden, wodurch die Größe sowohl der Partition als auch des darin enthaltenen Dateisystems geändert wird. Dies funktioniert jedoch nur, wenn die Partition derzeit nicht verwendet wird.

Wenn Sie sich jedoch keine Ausfallzeiten leisten können, können Sie versuchen, gdiskstattdessen zu verwenden parted. Sie müssen die Partition löschen, deren Größe Sie ändern möchten, und an ihrer Stelle eine neue Partition mit demselben Startpunkt erstellen, ähnlich wie Sie es getan hätten fdisk. gdiskist bereit, auf einer verwendeten Festplatte zu arbeiten, obwohl der Kernel möglicherweise keine Änderungen registriert. In diesem Fall müssen Sie möglicherweise den Kernel verwenden partprobeoder veranlassen kpartx, die neue Partitionstabelle zu akzeptieren, oder den Computer sogar neu starten, wenn dies nicht funktioniert. (Dies sollte alles ziemlich ähnlich sein wie bei der Verwendung fdisk.)


Sieht gut aus, ist aber unter CentOS standardmäßig nicht enthalten. Weitere Standardmethoden? Ich meine, ein Redhat-ähnliches System sollte in der Lage sein, die Größe selbst zu ändern, ohne auf externe Programme angewiesen zu sein
Cyberz

2
Im Lieferumfang von CentOS ist kein Tool enthalten, das diese Aufgabe übernimmt. Sie müssen das CentOS-Repository verlassen, um das zu tun, was Sie möchten. Beachten Sie, dass fast alle anderen Distributionen (einschließlich Fedora) gdiskin ihren Repositories enthalten sind, und ich habe gehört, dass gdiskdies in der nächsten Version von RHEL (und damit von CentOS) enthalten sein wird.
Rod Smith

Vielen Dank für die Antwort und den Kommentar, es ist genau die Information, die ich gesucht habe
Cyberz

1
gdiskist in EPEL verfügbar.
Jornane

Ich habe beide ausprobiert partxund musste partprobeaber schließlich neu starten.
Trotzdem

10

Dies funktioniert normalerweise nur mit neueren Linux-Distributionen. Werkzeuge benötigt:

  • partprobe (normalerweise part of parted)
  • gdisk / sgdisk

Eine GPT-Partition speichert einen Sicherungsheader am Ende der Festplatte. Wenn Sie die Größe des zugrunde liegenden Geräts geändert haben, befindet sich der Sicherungsheader irgendwo in der Mitte. Der erste Schritt besteht darin, den Partitionsheader an das Ende der Festplatte zu verschieben.

Angenommen, die Festplatte ist / dev / sda und die Partition ist / dev / sda3 (muss auch die letzte Partition sein):

sgdisk -e /dev/sda

Löschen Sie dann die letzte Partition und erstellen Sie sie neu:

sgdisk -d 3 /dev/sda
sgdisk -N 3 /dev/sda

Normalerweise wird eine Meldung angezeigt, die angibt, dass der Kernel die Partitionstabelle nicht erneut laden kann. Sie müssen partprobe ausführen, damit die Partition mit der neuen Größe registriert wird:

partprobe /dev/sda

Wenn dies nicht erfolgreich ist, müssen Sie die virtuelle Maschine neu starten. Danach können Sie Ihr Dateisystem mit dem entsprechenden Tool für ext4 usw.: Erweitern.

resize2fs /dev/sda3

Achtung : Das Ausführen von sgdisk kann destruktiv sein. Stellen Sie sicher, dass Sie über die richtigen Sicherungsverfahren verfügen.


Genial! Vielen Dank vor allem für den partprobeSchritt. Ich dachte immer, dass ein Neustart erforderlich ist, wenn die Partitionstabelle mit gemounteten Partitionen geändert wird.
piit79

Beachten Sie, dass durch das Zerstören und Neuerstellen der Partition eine neue PARTUUID für die Partition generiert wird. Dies ist ansonsten die einzige zuverlässige und dateisystemunabhängige Methode für fstab / GRUB / etc, um Partitionen in Setups mit mehreren Festplatten zuverlässig zu identifizieren.
Teo Klestrup Röijezon

5

Hier ist ein Beispiel, mit dem ein automatisiertes Tool die Größe einer Partition online in einem Durchgang ändert:

sgdisk -d 1 -n 1: 2048: 0 -c 1: -u 1: E485F29F-A1F4-4953-9DD8-799EAEA0119B -t 1: 0700 / dev / xvda

Hier ist eine Liste der Optionen für den Befehl sgdisk:

  • -d 1 lösche die erste Partition
  • -n 1: 2048: 0 besagt, dass eine neue Partition "Nummer 1" mit dem Startsektor 2048 erstellt werden soll. Endsektor = "0", was bedeutet, dass "der gesamte verfügbare Speicherplatz für diese Partition verwendet wird"
  • -u legt eine eindeutige Guid für diese Partition fest (dies ist spezifisch für GPT-Partitionen); Sie können 'R' verwenden, damit die GUID auf einen zufälligen Wert gesetzt wird. Sie können die ID der aktuellen Partitionen auch über die gdisk /dev/xvda; pAusgabe abrufen, um dieselbe UID wiederzuverwenden
  • -t 1: 0700 bedeutet im Grunde, dass die erste Partition den Typcode '0700' hat.

/ dev / xvda war die Festplatte, die wir neu partitioniert haben.

Es löscht und erstellt sofort eine neue Partition an ihrer Stelle.

PS. Einige Anmerkungen zum Typcode '0700'. Vom Menschen SGDISK (8)

   -t, --typecode=partnum:{hexcode|GUID}
          Change a single partition's type  code.  You  enter  the  type  code  using  either  a  two-byte  hexadecimal  number,  as 

zuvor beschrieben oder ein vollständig spezifizierter GUID-Wert, wie z. B. EBD0A0A2-B9E5-4433-87C0-68B6B72699C7.

Hier finden Sie die beste Erklärung für die Bedeutung von "0700" - http://www.rodsbooks.com/gdisk/walkthrough.html

"Aber warte", sagst du, "ich dachte, die Festplatte hätte eine FAT-Partition!" In der Tat. Windows verwendet einen einzigen GUID-Code für alle Datenpartitionen, sei es FAT oder NTFS. In der Vergangenheit wurde unter Linux derselbe Code für seine Datenpartitionen verwendet. (Mehr dazu in Kürze ....) In diesem Fall werden also mehrere verschiedene MBR-Codes in einen einzigen GPT-GUID-Code übersetzt. GPT fdisk verwendet für all diese etwas willkürlich den Code 0x0700 (genauer gesagt EBD0A0A2-B9E5-4433-87C0-68B6B72699C7).

In meinem Fall glaube ich, dass dies eine Linux ext4-Partition war, aber der Typcode der Partition bedeutet nicht den Dateisystemtyp, sodass '0700' eher wie ein Catchall-Typ für sgdisk aussieht. Zumindest in Fällen, die ich gesehen habe.

PPS. Möglicherweise müssen Sie den partprobeKernel ausführen , um die Änderung der Partitionierung zu erfahren, ohne das System neu zu starten .


'p' zeigt Ihnen die UUID der Festplatte. 'i' zeigt Ihnen die UUID einer Partition.
Keith

2

Ich fasse hier nur einige Antworten und Kommentare zusammen:

partedwird sich einfach weigern, eine gemountete Partition zu ändern. gdiskerledigt den Job für Sie, befindet sich jedoch nicht im Standard-RHEL- oder CentOS-Repository. Es befindet sich jedoch im EPEL- Repository.

Beachten Sie, dass das Ändern von Partitionen auf einer verwendeten Festplatte den Kernel möglicherweise daran hindert, die Änderungen zu registrieren. Wenn das passiert, Verwendung partprobe, partxoder Neustart.


1

Fragen Sie nach der Größe eines logischen Volumes? So würde ich es machen:

vgextend vgname /dev/sdb3
lvextend -L +3T /dev/mapper/location
resize2fs /mount/point

ODER (xfs):

xfs_growfs /mount/point -D <bytes>

er verwendet wahrscheinlich nicht ext2 / ext3 / ext4, sonst sollte resize2fs im laufenden Betrieb funktionieren?

1
@ Anthony Lee: Wenn Sie -ran übergeben lvextend, dann ruft es resize2fsfür Sie auf.
jmtd

0

fdisk ist normalerweise noch verfügbar und kann dies tun, wenn die Partition die letzte Partition ist und sich der Start der Partition nicht bewegt.

Dies ist jedoch eine gefährliche Operation, die mit großer Sorgfalt durchgeführt werden sollte. Mach ein Backup!

ec2-user@ip-10-0-20-15 ~]$ sudo fdisk /dev/nvme0n1

Welcome to fdisk (util-linux 2.30.2).
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/nvme0n1: 24 GiB, 25769803776 bytes, 50331648 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: gpt
Disk identifier: 70E4A118-98BD-4BF4-8DF9-6926A964902A

Device           Start      End  Sectors Size Type
/dev/nvme0n1p1    4096 16777182 16773087   8G Linux filesystem
/dev/nvme0n1p128  2048     4095     2048   1M BIOS boot

Partition table entries are not in disk order.

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

Partition 1 has been deleted.

Command (m for help): n
Partition number (1-127, default 1): 1
First sector (34-50331614, default 4096):
Last sector, +sectors or +size{K,M,G,T,P} (4096-50331614, default 50331614):

Created a new partition 1 of type 'Linux filesystem' and of size 24 GiB.
Partition #1 contains a xfs signature.

Do you want to remove the signature? [Y]es/[N]o: n

Command (m for help): p

Disk /dev/nvme0n1: 24 GiB, 25769803776 bytes, 50331648 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: gpt
Disk identifier: 70E4A118-98BD-4BF4-8DF9-6926A964902A

Device           Start      End  Sectors Size Type
/dev/nvme0n1p1    4096 50331614 50327519  24G Linux filesystem
/dev/nvme0n1p128  2048     4095     2048   1M BIOS boot

Partition table entries are not in disk order.

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

[ec2-user@ip-10-0-20-15 ~]$ sudo partprobe

[ec2-user@ip-10-0-20-15 ~]$ sudo fdisk -l
Disk /dev/nvme0n1: 24 GiB, 25769803776 bytes, 50331648 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: gpt
Disk identifier: 70E4A118-98BD-4BF4-8DF9-6926A964902A

Device           Start      End  Sectors Size Type
/dev/nvme0n1p1    4096 50331614 50327519  24G Linux filesystem
/dev/nvme0n1p128  2048     4095     2048   1M BIOS boot

Partition table entries are not in disk order.

[ec2-user@ip-10-0-20-15 ~]$ sudo xfs_growfs /
meta-data=/dev/nvme0n1p1         isize=512    agcount=4, agsize=524159 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1 spinodes=0
data     =                       bsize=4096   blocks=2096635, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 2096635 to 6290939
```
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.