web-dev-qa-db-fra.com

Redimensionnement en direct d'une partition GPT sous Linux

Sur Linux, je redimensionnais les partitions MBR à l’aide de fdisk, même sur des systèmes de fichiers réels, puis émettais un resize2fs/pvresize/... (selon le type de fs) pour obtenir le nouvel espace alloué.

Dernièrement, j'utilisais des partitions Xen et GPT, et j'ai remarqué que, malheureusement, la séparation ne semble pas permettre le redimensionnement à la volée d'une partition montée. En fait, il va se plaindre:

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

J'ai essayé à la fois la commande resize et même la combinaison rm + mkpart, mais ils vont se plaindre de la partition en cours de montage.

Comment puis je faire ça?

10
cyberz

Pour ce faire, le moyen le plus sûr consiste à démarrer à l'aide d'un support d'urgence (un CD live ou autre) et à utiliser GParted, ce qui redimensionnera la partition et le système de fichiers qu'il contient. Cela ne fonctionnera que si la partition n'est pas utilisée actuellement.

Toutefois, si vous ne pouvez vous permettre aucune période d'indisponibilité, vous pouvez essayer d'utiliser gdisk au lieu de parted. Vous devrez supprimer la partition que vous souhaitez redimensionner et en créer une nouvelle à la place avec le même point de départ, comme vous l’auriez fait avec fdisk. gdisk accepte de 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 partprobe ou kpartx pour que le noyau accepte la nouvelle table de partition, ou même redémarrer l'ordinateur si cela ne fonctionne pas. (Cela devrait ressembler beaucoup à utiliser fdisk.)

11
Rod Smith

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

  • partprobe (généralement une 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 la sauvegarde sera quelque part au milieu. La première étape consiste à déplacer l'en-tête de la partition à la fin du disque.

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

sgdisk -e /dev/sda

Puis supprimez 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 est incapable 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 : exécuter sgdisk peut être destructeur. Assurez-vous que les procédures de sauvegarde appropriées sont en place.

7
Nils Meyer

Voici un exemple qu'un outil automatisé utilise pour redimensionner une partition en ligne, en une 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 pour la commande sgdisk:

  • - d 1 supprimer la première partition
  • - n 1: 2048: 0 indique la création d'une nouvelle partition "numéro 1", avec le secteur de départ 2048. End sector = "0", ce qui signifie "utiliser tout l'espace disponible pour cette partition.
  • - u définit un guide unique pour cette partition (ceci est spécifique aux partitions GPT); vous pouvez utiliser 'R' pour que GUID soit défini sur une valeur aléatoire. Vous pouvez également obtenir l'id des partitions actuelles via la sortie gdisk /dev/xvda; p afin de réutiliser le même uid
  • - t 1: 0700 signifie en gros que la première partition est du code de type '0700'.

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

Donc, il supprime et crée immédiatement une nouvelle partition à sa place.

PS Quelques notes sur le code de caractères '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.

Meilleure explication trouvée pour 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 c'est le cas. Windows utilise un seul code GUID pour toutes ses partitions de données, qu'il s'agisse de FAT ou de NTFS. Dans le passé, le même code était utilisé sous Linux pour ses partitions de données. (Plus de détails sur ce sujet prochainement ....) Ainsi, dans ce cas, plusieurs codes MBR différents sont tous traduits en un code GPT GUID. GPT fdisk utilise, de manière quelque peu arbitraire, le code 0x0700 (ou plus précisément, EBD0A0A2-B9E5-4433-87C0-68B6B72699C7) pour toutes ces opérations.

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

PPS. Vous devrez peut-être exécuter partprobe pour que le noyau prenne conscience du changement de partitionnement sans redémarrer le système.

4
Tagar

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

parted refusera simplement de changer une partition montée. gdisk fera le travail à votre place, mais ce n’est pas dans le référentiel RHEL ou CentOS standard. Il se trouve cependant dans le référentiel EPEL .

N'oubliez pas que la modification des partitions d'un disque en cours d'utilisation peut empêcher le noyau d'enregistrer les modifications. Si cela se produit, utilisez partprobe, partx ou redémarrez.

2
jornane

Voulez-vous parler du redimensionnement d'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>
1
jredd