Ridimensionamento live di una partizione GPT su Linux


12

Su Linux ho usato per ridimensionare le partizioni MBR usando fdisk, anche su filesystem live, e quindi emettere un resize2fs / pvresize / ... (a seconda del tipo di fs) per ottenere il nuovo spazio allocato.

Ultimamente ho usato le partizioni Xen e GPT e ho notato che sfortunatamente parted non sembra consentire il ridimensionamento al volo di una partizione montata, infatti si lamenterà:

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

Ho provato sia il resizecomando che la combinazione rm+ mkpart, ma entrambi si lamenteranno della partizione montata.

Come lo posso fare?


Sarebbe molto apprezzato un modo
pronto per

Risposte:


12

Il modo più sicuro per farlo è avviare usando un supporto di emergenza (un CD live o simili) e usare GParted, che ridimensionerà sia la partizione che il filesystem che contiene. Ciò funzionerà solo se la partizione non è attualmente in uso.

Se non puoi permetterti alcun tempo morto, puoi provare a usare gdiskinvece di parted. Dovrai eliminare la partizione che desideri ridimensionare e crearne una nuova al suo posto con lo stesso punto di partenza, proprio come avresti fatto fdisk. gdiskè disposto a lavorare su un disco in uso, sebbene il kernel potrebbe non registrare alcuna modifica. In tal caso, potrebbe essere necessario utilizzare partprobeo kpartxfare in modo che il kernel accetti la nuova tabella delle partizioni o anche riavviare il computer se non funziona. (Questo dovrebbe essere abbastanza simile all'utilizzo fdisk.)


Sembra carino, ma non è incluso per impostazione predefinita su CentOS. Ci sono altri modi standard? Voglio dire, un sistema simile al redhat dovrebbe essere in grado di auto-ridimensionarsi senza fare affidamento su programmi esterni
cyberz

2
Non esiste uno strumento fornito con CentOS che farà il lavoro. È necessario uscire dal repository CentOS per fare ciò che si desidera. Nota che quasi tutte le altre distribuzioni (inclusa Fedora) includono gdisknei loro repository, e ho sentito che gdisksaranno incluse nella prossima versione di RHEL (e quindi di CentOS).
Rod Smith,

Grazie per la risposta e il commento, sono esattamente le informazioni che stavo cercando
cyberz

1
gdiskè disponibile in EPEL.
jornane

Ho provato entrambi partxe partprobealla fine ho dovuto riavviare. Grazie comunque per questi suggerimenti
Alexandre Bourlier,

10

Questo di solito funziona solo con le distribuzioni Linux più recenti. Strumenti necessari:

  • partprobe (di solito parte di parted)
  • gdisk / sgdisk

Una partizione GPT memorizza un'intestazione di backup alla fine del disco. Se hai ridimensionato il dispositivo sottostante, l'intestazione del backup sarà da qualche parte nel mezzo. Il primo passo è spostare l'intestazione della partizione alla fine del disco.

Supponendo che il disco sia / dev / sda e la partizione sia / dev / sda3 (deve essere anche l'ultima partizione):

sgdisk -e /dev/sda

Quindi eliminare l'ultima partizione e ricrearla:

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

Di solito viene visualizzato un messaggio che indica che il kernel non è in grado di ricaricare la tabella delle partizioni. Devi eseguire partprobe in modo che la partizione sia registrata con le nuove dimensioni:

partprobe /dev/sda

Se l'operazione non ha esito positivo, dovrai riavviare la macchina virtuale. Dopodiché puoi far crescere il tuo filesystem con lo strumento appropriato, per ext4 ecc .:

resize2fs /dev/sda3

Attenzione : l'esecuzione di sgdisk può essere distruttiva. Assicurarsi di disporre di adeguate procedure di backup.


Eccezionale! Grazie soprattutto per il partprobepassaggio: ho sempre pensato che fosse necessario riavviare quando si modifica la tabella delle partizioni con qualsiasi partizione montata.
piit79,

Ricorda che distruggere e ricreare la partizione genererà un nuovo PARTUUID per la partizione, che è altrimenti l'unico modo affidabile e indipendente dal filesystem per fstab / GRUB / etc per identificare in modo affidabile le partizioni in configurazioni multi-disco.
Teo Klestrup Röijezon,

5

Ecco un esempio che uno strumento automatizzato utilizza per ridimensionare una partizione online, in un'unica operazione:

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

Ecco un elenco di opzioni per il comando sgdisk:

  • -d 1 cancella la prima partizione
  • -n 1: 2048: 0 dice di creare una nuova partizione "numero 1", con il settore iniziale 2048. End sector = "0" che significa "usa tutto lo spazio disponibile per questa partizione
  • -u imposta una guida unica per quella partizione (questo è specifico per le partizioni GPT); è possibile utilizzare 'R' per GUID da impostare su un valore casuale. È inoltre possibile ottenere l'ID delle partizioni correnti tramite l' gdisk /dev/xvda; poutput per riutilizzare lo stesso uid
  • -t 1: 0700 significa sostanzialmente che la prima partizione è del tipo di codice '0700'.

/ dev / xvda era il disco che abbiamo ripartizionato.

Quindi elimina e crea subito una nuova partizione al suo posto.

PS. Alcune note sul codice di tipo "0700". Dall'uomo 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 

descritto in precedenza o un valore GUID completamente specificato, come EBD0A0A2-B9E5-4433-87C0-68B6B72699C7.

Trovate la migliore spiegazione del significato di "0700" qui: http://www.rodsbooks.com/gdisk/walkthrough.html

"Ma aspetta" dici "pensavo che il disco avesse una partizione FAT!" Anzi lo fa. Windows utilizza un unico codice GUID per tutte le sue partizioni di dati, siano esse FAT o NTFS. In passato, lo stesso codice è stato utilizzato in Linux per le sue partizioni di dati. (Maggiori informazioni a breve ....) Pertanto, in questo caso diversi codici MBR diversi vengono tutti tradotti in un unico codice GUID GPT. Fdisk GPT utilizza, in qualche modo arbitrariamente, il codice 0x0700 (o più precisamente, EBD0A0A2-B9E5-4433-87C0-68B6B72699C7) per tutti questi.

Nel mio caso credo che fosse una partizione ext4 di Linux, ma il codice di tipo della partizione non significa il tipo di filesystem, quindi '0700' sembra più un tipo catchall per sgdisk. Almeno nei casi che ho visto.

PPS. Potrebbe essere necessario eseguire il partprobekernel affinché venga a conoscenza della modifica del partizionamento senza riavviare il sistema.


'p' ti mostrerà l'UUID del disco. 'i' ti mostrerà l'UUID di una partizione.
Keith

2

Sto solo riassumendo alcune risposte e commenti qui:

partedrifiuterà semplicemente di modificare qualsiasi partizione montata. gdiskfarà il lavoro per te, ma non è nel repository standard RHEL o CentOS. È nel repository EPEL , però.

Tenere presente che la modifica delle partizioni su un disco in uso potrebbe impedire al kernel di registrare le modifiche. Se ciò accade, l'uso partprobe, partxo il riavvio.


1

Stai chiedendo di ridimensionare un volume logico? Ecco come lo farei:

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

OPPURE (xfs):

xfs_growfs /mount/point -D <bytes>

probabilmente non usa ext2 / ext3 / ext4, altrimenti resize2fs dovrebbe funzionare al volo?

1
@Antony Lee: se passi -ra lvextend, allora invoca resize2fsper te.
jmtd,

0

fdisk è in genere ancora disponibile e può farlo, se la partizione è l'ultima partizione e l'inizio della partizione non si sposta.

Tuttavia, questa è un'operazione pericolosa che dovrebbe essere eseguita con grande cura. Fai un 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
```
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.