Redimensionnement en direct d'une partition GPT sous Linux


12

Sous Linux, j'avais l'habitude de redimensionner les partitions MBR à l'aide de fdisk, même sur des systèmes de fichiers en direct, puis d'émettre un resize2fs / pvresize / ... (selon le type de fs) pour obtenir le nouvel espace alloué.

Dernièrement, j'utilise des partitions Xen et GPT, et j'ai remarqué que malheureusement parted ne semble pas permettre le redimensionnement à la volée d'une partition montée, en fait, il se plaindra:

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

J'ai essayé à la fois la resizecommande et la combinaison even rm+ mkpart, mais ils se plaindront tous les deux de la partition montée.

Comment puis je faire ça?


Un moyen disponible dès le départ sur RHEL / CentOS serait très apprécié
cyberz

Réponses:


12

La façon la plus sûre de le faire est de démarrer en utilisant un support d'urgence (un CD live ou similaire) et d'utiliser GParted, qui redimensionnera la partition et le système de fichiers qu'elle contient. Cela ne fonctionnera cependant que si la partition n'est pas actuellement utilisée.

Si vous ne pouvez pas vous permettre de temps d'arrêt, vous pouvez essayer d'utiliser gdiskau lieu de parted. Vous devrez supprimer la partition que vous souhaitez redimensionner et en créer une nouvelle à sa place avec le même point de départ, comme vous l'auriez fait avec fdisk. gdiskest disposé à travailler sur un disque en cours d'utilisation, bien que le noyau ne puisse enregistrer aucune modification. Dans ce cas, vous devrez peut-être utiliser partprobeou kpartxfaire en sorte que le noyau accepte la nouvelle table de partition, ou même redémarrer l'ordinateur si cela ne fonctionne pas. (Cela devrait être assez similaire à l'utilisation fdisk.)


Semble bien, mais n'est pas inclus par défaut sur CentOS. Des moyens plus standard? Je veux dire, un système de type redhat devrait être capable de se redimensionner sans s'appuyer sur des programmes externes
cyberz

2
Aucun outil livré avec CentOS ne fera l'affaire. Vous devez sortir du référentiel CentOS pour faire ce que vous voulez. Notez que presque toutes les autres distributions (y compris Fedora) incluent gdiskdans leurs référentiels, et j'ai entendu dire que gdiskcela sera inclus dans la prochaine version de RHEL (et donc de CentOS).
Rod Smith

Merci pour la réponse et le commentaire, c'est exactement l'information que je cherchais
cyberz

1
gdiskest disponible en EPEL.
jornane

J'ai essayé les deux partxet j'ai partprobefinalement dû redémarrer. Merci quand même pour ces conseils
Alexandre Bourlier

10

Cela ne fonctionne généralement qu'avec les distributions Linux plus récentes. Outils nécessaires:

  • partprobe (généralement partie de parted)
  • gdisk / sgdisk

Une partition GPT stocke un en-tête de sauvegarde à la fin du disque. Si vous avez redimensionné le périphérique sous-jacent, l'en-tête de sauvegarde sera quelque part au milieu. La première étape consiste à déplacer l'en-tête de partition à la fin du disque.

En supposant que le disque est / dev / sda et la partition est / dev / sda3 (doit également être la dernière partition):

sgdisk -e /dev/sda

Supprimez ensuite la dernière partition et recréez-la:

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

Vous verrez généralement un message indiquant que le noyau n'est pas en mesure de recharger la table de partition. Vous devez exécuter partprobe pour que la partition soit enregistrée avec la nouvelle taille:

partprobe /dev/sda

Si cela échoue, vous devrez redémarrer la machine virtuelle. Après cela, vous pouvez développer votre système de fichiers avec l'outil approprié, pour ext4 etc.:

resize2fs /dev/sda3

Attention : l'exécution de sgdisk peut être destructrice. Assurez-vous que des procédures de sauvegarde appropriées sont en place.


Impressionnant! Merci surtout pour l' partprobeétape - j'ai toujours pensé qu'il était nécessaire de redémarrer lors de la modification de la table de partition avec les partitions montées.
piit79

Gardez à l'esprit que la destruction et la recréation de la partition génèreront un nouveau PARTUUID pour la partition, qui est par ailleurs le seul moyen fiable et indépendant du système de fichiers pour fstab / GRUB / etc d'identifier de manière fiable les partitions dans les configurations multi-disques.
Teo Klestrup Röijezon

5

Voici un exemple qu'un outil automatisé utilise pour redimensionner une partition en ligne, en une seule fois:

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

Voici la liste des options de la commande sgdisk:

  • -d 1 supprimer la première partition
  • -n 1: 2048: 0 dit créer une nouvelle partition "numéro 1", avec le secteur de départ 2048. Secteur final = "0" qui signifie "utiliser tout l'espace disponible pour cette partition
  • -u définit un guid unique pour cette partition (ceci est spécifique aux partitions GPT); vous pouvez utiliser «R» pour que le GUID soit défini sur une valeur aléatoire. Vous pouvez également obtenir l'id de la partition actuelle via la gdisk /dev/xvda; psortie pour réutiliser le même uid
  • -t 1: 0700 signifie essentiellement que la première partition est de type '0700'.

/ dev / xvda était le disque que nous avons repartitionné.

Il supprime donc et crée immédiatement une nouvelle partition à sa place.

PS. Quelques notes sur le code de type '0700'. De l'homme 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 

décrit précédemment, ou une valeur GUID entièrement spécifiée, telle que EBD0A0A2-B9E5-4433-87C0-68B6B72699C7.

Trouvé la meilleure explication de ce que «0700» signifie ici - http://www.rodsbooks.com/gdisk/walkthrough.html

"Mais attendez," vous dites, "je pensais que le disque avait une partition FAT!" En effet. Windows utilise un seul code GUID pour toutes ses partitions de données, qu'elles soient FAT ou NTFS. Dans le passé, le même code a été utilisé sous Linux pour ses partitions de données. (Plus d'informations à ce sujet sous peu ....) Ainsi, dans ce cas, plusieurs codes MBR différents sont tous traduits en un seul code GUID GPT. Fdisk GPT utilise, de manière quelque peu arbitraire, le code 0x0700 (ou plus précisément, EBD0A0A2-B9E5-4433-87C0-68B6B72699C7) pour tous ces éléments.

Dans mon cas, je pense que c'était une partition Linux ext4, mais le code de type de la partition ne signifie pas le type de système de fichiers, donc '0700' ressemble plus à un type catchall pour sgdisk. Au moins dans les cas que j'ai vus.

PPS. Vous devrez peut-être exécuter le partprobenoyau pour prendre connaissance de la modification du partitionnement sans redémarrer le système.


'p' vous montrera l'UUID du disque. 'i' vous montrera l'UUID d'une partition.
Keith

2

Je résume juste quelques réponses et commentaires ici:

partedrefusera simplement de modifier une partition montée. gdiskfera le travail pour vous, mais il ne se trouve pas dans le référentiel RHEL ou CentOS standard. Il se trouve cependant dans le référentiel EPEL .

Gardez à l'esprit que la modification des partitions sur un disque en cours d'utilisation peut empêcher le noyau d'enregistrer les modifications. Si cela se produit, l' utilisation partprobe, partxou le redémarrage.


1

Demandez-vous de redimensionner un volume logique? Voici comment je le ferais:

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

OU (xfs):

xfs_growfs /mount/point -D <bytes>

il n'utilise probablement pas ext2 / ext3 / ext4, sinon resize2fs devrait fonctionner à la volée?

1
@Antony Lee: si vous passez -rà lvextend, alors il invoque resize2fspour vous.
jmtd

0

fdisk est généralement toujours disponible et peut le faire si la partition est la dernière partition et que le début de la partition ne bouge pas.

Cependant, il s'agit d'une opération dangereuse qui doit être effectuée avec grand soin. Faites une sauvegarde!

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
```
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.