Comment redimensionner une partition racine ext au moment de l'exécution?

236

Comment puis-je augmenter la taille de la partition racine d'un système lors de l'exécution?

J'ai une partition qui n'est pas allouée après la partition racine (qui est également ext4), comment puis-je ajouter cet espace non alloué à l'espace alloué à la partition racine sans avoir à arrêter le serveur?

BonboBingo
la source
3
Je déteste avoir l'air d'un bâton dans la boue, mais cela comporte-t-il pas mal de risques? Pourquoi cela doit-il arriver? La disponibilité est-elle la principale contrainte?
Cloud
Vous ne pouvez pas redimensionner une partition à gauche, car ce serait en fait un mouvement.
Zaz
5
Il est facile d'augmenter la taille des paritions ext4 en ligne. La partie difficile serait de se rétrécir (votre titre parle de "redimensionnement"). Pour les personnes intéressées par TOUTE manipulation sur une partition racine (déplacer, réduire, modifier le système de fichiers, périphérique) au moment de l'exécution, veuillez consulter ma réponse: askubuntu.com/a/728141/21888
vaab
Utilisez growpart
guettli

Réponses:

215

Interface graphique (Ubuntu 14.04 et versions ultérieures) : GParted v0.17 et versions ultérieures fournit une interface graphique intéressante à cet effet. (Les anciennes versions refuseront de redimensionner une partition montée).

Ligne de commande (quelle que soit la version d'Ubuntu): Cette opération comporte trois étapes.

Étape 1. La partition doit d'abord être redimensionnée. Si vous utilisez LVM, c'est facile et vous savez probablement comment procéder. Si vous utilisez des partitions classiques, le processus est un peu plus compliqué et peut nécessiter un redémarrage (bien que vous ne deviez jamais démarrer un autre système ou un live CD).

Voici comment je le fais: je l’utilise tout fdiskd’abord pour supprimer la partition (l’idée est que les données sur le disque seront préservées), puis recréez-la soigneusement avec une taille supérieure à la même position.

Exemple:

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

De nouveau, il est essentiel que la nouvelle partition commence par le même bloc que l’ancienne. L'identifiant doit également correspondre (83 pour les systèmes Linux). Soyez prêt à perdre toutes vos données à la moindre faute de frappe.

Pour plus de sécurité, vous pouvez également restaurer l'indicateur de démarrage (qui, selon certains, est toujours requis sur Wikipédia ) en appuyant sur a.

Consultez la section des commentaires pour savoir quoi faire si votre partition de swap vous gêne.

A présent, il devrait être clair pourquoi les gens recommandent d’utiliser un CD live. ;-)

Étape 2. Comme fdiskvous l’a rappelé utilement, vous devez recharger la table de partition avant de continuer. Le moyen le plus sûr est simplement de redémarrer; mais vous pouvez aussi utiliser partprobeou kpartx (plus d'informations) .

Étape 3. Une fois la partition redimensionnée et la table de partition rechargée, il resize2fssuffit de s’exécuter sur le système de fichiers et vous pouvez le faire même lorsqu’elle est montée en tant que partition racine.

Exemple:

$ sudo resize2fs /dev/sda1
Søren Løvborg
la source
16
Cela a parfaitement fonctionné pour moi. Cependant, j'ai également veillé à ce que l'indicateur d'initialisation conservé soit à l'état d'origine.
Augustus Kling
4
@ jbo5112: Comme fdiskdit, partprobeou kpartxpeut fonctionner au lieu d'un redémarrage; voir aussi cette question . Même si vous redémarrez, la solution reste préférable à l’utilisation d’un live CD en ce qui concerne les temps morts, où un simple redémarrage peut durer moins de 10 s pour une machine virtuelle. C'est aussi plus rapide en temps d'opérateur, c'est pourquoi j'utilise habituellement cette approche moi-même. :)
Søren Løvborg
1
@Raymond: Si la pression de la mémoire le permet (voir free -h), désactivez le swap ( swapoff /dev/sda2), modifiez la table de partitions (en supprimant et recréant la partition de swap) et 1) redémarrez ou 2) rechargez la table de partitions, puis à swaponnouveau. (Si la mémoire est insuffisante pour désactiver temporairement le swap, vous pouvez toujours créer et activer une nouvelle partition swap ( /dev/sda3), puis permutez-la sda2; mais vous devrez alors mettre à jour /etc/fstable nouveau nom du périphérique.)
Søren Løvborg le
1
Si vous utilisez vmware et que vous avez étendu la taille du disque, vous devrez exécuter sudo lshw -C disk pour analyser à nouveau les systèmes de fichiers de sorte que vm reconnaisse le plus gros lecteur. Suivez ensuite les instructions ci-dessus.
Guy
2
Qu'en est-il de rétrécissement?
Aaron Franke
113

Il est possible de redimensionner en ligne un système de fichiers ext4, même s'il s'agit de votre partition racine. Utilisez la resize2fscommande.

sudo resize2fs /dev/sda1

EDIT: la réduction en ligne n'est pas autorisée:

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
CodeAddict
la source
55
De man resize2fs: 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).Cette question concerne le redimensionnement de la partition , pas du système de fichiers . La distinction est subtile mais très importante.
Eliah Kagan
8
Vous pouvez utiliser fdisk pour supprimer la partition racine, puis la recréer au même bloc de départ. fdisk écrira la modification, mais elle ne prendra effet qu'après un redémarrage. après le redémarrage, vous pouvez utiliser le programme resize2fs pour envoyer le disque afin de remplir la partition.
James Becwar
3
Je viens de redimensionner une partition racine ext4 en ligne. Par conséquent, je peux confirmer que c'est possible. Mais au lieu de passer / dev / sda * comme paramètre à resize2fs, vous devez passer le nom du volume logique.
CDR
10
Je trouve le premier paragraphe de la page de manuel resize2fs très intéressant pour la question initiale: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
S'il vous plaît, ne blessez pas fdiskquand cela growpartse fera très facilement pour vous.
STRML
54

Une solution plus simple - utilisez growpart <device> <partition>:

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

Comme toujours, sauvegardez votre partition table ( sfdisk -d /dev/xvda > partition_bak.dmp) au cas où.

STRML
la source
Qu'en est-il de rétrécissement?
Aaron Franke
J'espérais utiliser cette méthode, mais j'ai eu sfdisk: /dev/nvme0n1p5: does not contain a recognized partition table(en utilisant le double démarrage avec Windows)
Monkut
Rétrécir n'est pas possible de faire en ligne. Je recommande d'utiliser gpartedpour cela.
STRML
4
Growpart fait partie des nuages-utils. Si vous n'avez pas installé, vous pouvez installer avecapt-get install cloud-utils
klor
1
@monkut En retard à la fête, mais votre disque est probable /dev/nvme0n1. p5 est la partition 5 sur ce disque. Comparez avec les tranches de disque BSD traditionnelles, elles utilisent un schéma de numérotation similaire.
Per Lundberg
12

Oui, vous pouvez réduire / déplacer / agrandir une partition racine en ligne sans redémarrage (ni livecd, ni clé USB): consultez cette réponse . C'est très bien écrit et facile à suivre, bien que assez long et un peu risqué. Donc, si vous voulez seulement agrandir votre partition ext4, vous pouvez vous en tenir aux resize2fssolutions de travail conventionnelles .

La solution générale que j'ai lue fonctionnera sur n'importe quel type de solution dédiée ou VPS, par exemple.

TLDR; cette solution implique de pivot_rootde tmpfssorte que vous pouvez en umounttoute sécurité votre partition racine vivre et jouer avec elle. Une fois cela fait, vous pivot_rootrevenez sur votre nouvelle partition racine.

Cela permet à peu près toutes les manipulations sur le système de fichiers racine (déplacez-le, changez le système de fichiers, changez son périphérique physique ...).

Aucun redémarrage n'est requis dans le processus, ce qui permet de contourner la limitation de l' resize2fs impossibilité de réduire les ext4 partitions.

Personnellement, je l'ai utilisé, et cela fonctionne très bien aussi sur le système Debian, donc ça devrait fonctionner sur Ubuntu. Je suis très surpris de ne pas voir cette solution en profondeur un peu plus liée aux nombreuses questions des sites Web stackexchange traitant du même problème.

Remarque: Bien sûr, si vous souhaitez développer votre partition, un simple resize2fssuffira, comme indiqué à de nombreux endroits et dans d'autres réponses ici.

vaab
la source
4
Je pense que pour la plupart des gens, une fois que vous avez arrêté tous les programmes et services accédant à la partition racine, vous pourriez aussi bien avoir redémarré la machine. Pour réduire / déplacer, il est peut-être encore plus rapide d'utiliser un CD live, mais pour la croissance (de loin la tâche la plus courante et ce que l'OP a demandé), il existe des moyens qui n'impliquent pas un arrêt temporaire de la plupart des systèmes. .
Søren Løvborg
2
@ SørenLøvborg: Vous pouvez redémarrer les services de base nécessitant une production continue tout en effectuant la procédure complète. Il existe de nombreuses configurations dans lesquelles vous ne pouvez pas installer LiveCD (instances VPS, serveurs dédiés ...) ou dans lesquelles vous souhaitez éviter tout redémarrage pour des raisons spécifiques. Le titre de la question initiale mentionne "redimensionnement", ce qui attire les personnes à la recherche de partitions réduites en ligne. ** Aucune autre solution ne permet de réduire ext4 en ligne. ** Cette solution est risquée, complexe, mais la plus puissante de toutes et comble les faiblesses des autres.
vaab
1
S'il vous plaît ne pas poster des réponses en fonction de liens externes. Mettez la partie pertinente dans votre réponse ou postez le lien en tant que commentaire sur la question. Voir Comment répondre pour plus de détails.
Melebius
10

Vous pouvez également simplement utiliser GParted - tant que la partition que vous redimensionnez n'est pas celle à partir de laquelle vous avez démarré - sinon, je suggère que l' option de live CD soit un peu plus facile pour les débutants.

GParted effectue essentiellement toutes les étapes - en se basant uniquement sur une interface graphique.

veste de cuir
la source
J'ai démarré mon système avec le CD en direct Ubuntu 12.04 et j'ai redimensionné la partition ext4 avec GParted. Travaillé bien pour moi. Quoi qu'il en soit, avant cette opération, j'ai sauvegardé toutes mes données importantes.
StandDuPp
Je pense que gparted a besoin d'une partition non montée. mais je peux me tromper.
Nick
La question concerne évidemment la partition à partir de laquelle ils ont démarré, et le démarrage d'un CD live nécessite le redémarrage de la machine. -1
wjandrea
5

Je viens de terminer le redimensionnement d’une partition racine ext4 sur un système actif alors que la racine était montée.

[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]# 
CDR
la source
5

Je voudrais faire une extension sur la réponse de @ Søren Løvborg: étendre la partition avec une partition swap présente.

D'abord la disposition du disque après l'avoir étendu:

$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

Donc, sda1 doit être étendu avec l’espace libre à la fin du disque, mais la partition de swap est entre eux. Voici comment vous pouvez le faire:

Nous devons d’abord désactiver le swap. Vérifiez combien il est utilisé et si vous pouvez l'éteindre.

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           992M         52M        464M        3.2M        475M        784M
Swap:          1.0G          0B        1.0G

swap n'est pas utilisé ici pour pouvoir l'éteindre

$sudo swapoff /dev/sda5

Maintenant nous allons changer la table de partition:

$sudo fdisk /dev/sda

(note: si vous commencez par avoir la première partition au secteur 63 au lieu de 2048, vous devez ajouter l'option -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).

Remarque: la taille de sda1 correspond au nombre total de secteurs moins la taille de secteur de votre partition d'échange: 14335999-2093058 = 12242941

Comme le mentionne fdisk: le noyau utilise toujours l'ancienne table de partition, nous devons donc le recharger.

$partprobe

Maintenant, nous devons exécuter resize2fs sur sda1 (ne l'oubliez pas!)

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

Maintenant, les choses ne sont pas encore terminées. Comme vous l'avez probablement remarqué, sda2 est partitionné sous le type Linux (Ext4). Pour une raison quelconque, fdisk n’a aucun moyen de choisir le type. Nous devons donc l'alterner en utilisantcfdisk

$ sudo cfdisk

Choisissez sda2 et remplacez le type par 82 Linux swap / Solariset assurez-vous de l'écrire (tapez oui pour confirmer)

Maintenant, nous pouvons réactiver l'échange

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

Et enfin allumez-le:

$swapon /dev/sda2

La seule chose à faire est de mettre à jour fstab pour monter automatiquement la partition de swap au démarrage

$sudo nano /etc/fstab

Et remplacez l’UUID de la partition de swap par la sortie ci-dessus:

# swap was on /dev/sda5 during installation
UUID=d58bf1cb-d27a-487d-b337-056767fd5ad6 none            swap    sw              0       0

Maintenant tout va bien et vous pouvez redémarrer sans problèmes.

wouter205
la source
comme pour alterner le type de partition swap, cela peut être fait dans fdisk buy en sélectionnant t puis 5 (partition 5) puis 82 (type Linux swap / Solaris)
Oz Edri
la partition 2 ne devrait-elle pas être étendue? (et ensuite dans fdisk, nous devrions choisir e au lieu de p) De plus, les commandes mkswap et swapon ne devraient pas être exécutées sur / dev / sda5 au lieu de sda2?
Oz Edri
1
Pour le type de partition swap: j'ai trouvé dans d'autres instructions que vous pouvez en effet sélectionner le type dans fdisk mais pour une raison quelconque, cela ne fonctionnait pas dans ma version. Quoi qu'il en soit, cela fonctionnera toujours avec cfdisk
wouter205
1
Pour la partition de swap: vous pouvez utiliser une partition étendue, mais vous devez ensuite ajouter deux partitions: une partition étendue et une autre logique (voir la structure initiale de ma partition). Dans mon exemple, je me retrouve avec 2 partitions principales: sda1 - ext4 - partition racine et sda2 - partition swap. Donc, les commandes mkswap& swapondoivent être exécutées sur sda2. J'ai commis une erreur au début de mon message: swapoffdoit être exécuté sur sda5. Les commentaires sont toujours les bienvenus, c'était difficile à noter.
wouter205
1
Lorsque la partition swap est chiffrée, il faut d'abord arrêter les cryptdisks avec cryptdisks_stop, puis mettre à jour / etc / crypttab au lieu de /etc/fstabet redémarrer les cryptdisks avec cryptdisks_start.
Dmitri Chubarov
1

Je viens de faire cela avec succès sans umount, pivot_rootou le retrait temporaire de la partition principale, en utilisant quittai 3.2 sur Ubuntu 16.04, noyau 4.4.0. Par prudence, j'ai tout fait depuis une console virtuelle avec réseau désactivé, et j'ai pris un instantané au cas par cas, mais cet instantané n'était pas nécessaire. J'aurais donc pu le faire aussi bien via SSH sans changer de niveau d'exécution.

Déterminer la taille de la partition: parted /dev/sda1 print | egrep "Disk.*GB"

Passez éventuellement en mode multi-utilisateur sans mise en réseau (doit être effectué à partir d'une console, pas de SSH):

runlevel     # remember the original runlevel
init 2

Prenez éventuellement un instantané de machine virtuelle pour faire preuve de prudence.

Redimensionner la partition:

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

Redimensionner le système de fichiers: resize2fs /dev/sda1

Si quelque chose ne va pas, vous pouvez restaurer votre instantané ici. Si tout va bien, le retour à la normale runlevel (obtenue ci - dessus) - normalement 5: init 5. Il peut être préférable de faire un redémarrage complet à ce stade pour vous assurer que tout revient correctement (j’ai eu un problème de date / ntp par la suite).

Roger Dueck
la source
1

Suivez ces étapes.

  1. terminal ouvert en tant que superutilisateur su
  2. courir parted
  3. tapez ppour voir les partitions disponibles
  4. identifiez votre numéro de partition racine (ex: 'sda 3' signifie numéro 3) et supprimez une partition adjacente en utilisant rm PARTITION NUMBERpour créer de l'espace libre.
  5. augmentez maintenant la taille de la racine en tapant resizepart ROOT NUMBERet redémarrez le système si nécessaire
  6. quitter parteden tapant exitet dans le type de terminal partprobeet appuyer sur enter (cela peut être fait même après le redémarrage)
  7. enfin courir resize2fs /dev/sda PARTITION NUMBERet profiter de la partition racine spacieuse.
Gurunadha Reddy
la source
0

Comme indiqué précédemment:

  • il est possible de développer en direct à partir d'un système racine (pas de difficulté, la section de démarrage ne doit pas être déplacée)

  • la réduction d'une partition racine en direct doit être effectuée à partir d'un périphérique d'amorçage externe (démarrage à partir du cd / clé USB du système en direct), comme s'il y avait un problème, une non-concordance .. quoi que ce soit..votre système se bloque, doit être redémarré capable de démarrer correctement.

Toute sorte de "mais je l’ai fait et ça marche" est un pur hasard.

ascervera
la source