Linux : augmenter la taille d’une partition ext3

Sur Codeur.com, trouvez rapidement un freelance pour réaliser votre projet Linux. Voir les développeurs Linux disponibles

J’ai une partition presque pleine sur un serveur Linux. Comment l’agrandir ?

Capture d’écran 2015-12-23 à 16.24.52

Heureusement il me reste de la place libre derrière cette partition. Ce serveur étant distant, je dois y accéder en SSH, donc il me faut des outils en ligne de commande…

Capture d’écran 2015-12-23 à 16.30.07

Je me base sur l’excellent article How To Resize ext3 Partitions Without Losing Data, écrit par Falko Timme (suivez Falko sur Twitter) sur HowtoForge.
Cet article explique comment agrandir, mais aussi réduire, la taille d’une partition Linux ext3. Dans mon cas, je n’ai besoin que d’agrandir. C’est le cas le plus simple et je n’aborderai pas l’autre. Ce n’est pas beaucoup plus difficile et si vous avez besoin de réduire la taille d’une partition ext2 ou ext3, je vous conseille d’aller lire en détail l’article de HowtoForge. C’est en anglais, mais il n’est pas compliqué à comprendre (de toute façon, les commandes ne changent pas).

Je vais modifier une partition Linux dont le système de fichier est ext3. Les explications sont utilisables aussi pour ext2 (c’est encore plus simple). Par contre, je n’ai pas encore cherché pour ext4, qui est maintenant standard en Ubuntu 9.10 !
Notre serveur est en Debian Etch 4.0, mais vous pouvez certainement faire ce même genre de manipulation sur toutes distributions Linux, en particulier sous Ubuntu. Les commandes ne changeront pas. Éventuellement, le passage en “root” et l’installation éventuelle des utilitaires pourraient être différents.
Comme je n’ai pas accès à mon serveur physiquement, je ne peux pas booter sur un LiveCD. Je dois faire tout ça depuis une session SSH.
La partition que je dois modifier n’est PAS la partition système / …
Si c’était la partition racine, cela poserait de bien plus grand problèmes, en tout cas à distance. Si le serveur était chez vous, il suffirait de le faire à partir d’un Live CD, comme un CD Ubuntu.
Autre facilité (j’ai vraiment de la chance !), ma partition est la dernière dans la table des partitions, et … miracle… il me reste de la place non utilisée en fin de disque dur 🙂
Alors, on ne le dira jamais assez … si vous touchez à une partition, ou à la table des partitions, FAITES des BACKUPS AVANT ! Vous n’êtes pas à l’abri d’une erreur, un mauvais numéro de partition, un plantage…
Les commandes étant des commandes systèmes, elles doivent être faites en “root“. Vous devez passer en “root” avant de faire ces commandes.
Pour accéder à un serveur distant en ssh, et passer en root, en Debian :

$ ssh ks
didier@ks's password:
Debian GNU/Linux 4.0
ks:~$ su -
Password: 
(1) 23:39:50 root@ks:~$

Pour accéder à un serveur distant en ssh, et passer en root, en Ubuntu :
$ ssh abrasd03
didier@abrasd03’s password:
Linux abrasd03 2.6.24-25-server #1 SMP Tue Oct 20 08:12:40 UTC 2009 i686
Last login: Sat Nov 21 21:49:32 2009 from noname

didier@abrasd03:~$ sudo -s
[sudo] password for didier: 
root@abrasd03:~#

Vous allez modifier une partition. Elle ne doit évidemment pas être utilisée. Vérifiez et arrêtez si nécessaire les programmes qui l’utilisent.
Vérifions les partitions de départ :
Quelles partitions sont montées au démarrage ?

$ less /etc/fstab
/dev/sda1       /               ext3    errors=remount-ro       0       1
/dev/sda2       /tmp            ext3    defaults                0       2
/dev/sda3       /var/log        ext3    defaults                0       2
...
/dev/sda7       none            swap    defaults                0       0
/dev/sda8       /home           ext3    defaults                0       2
/dev/sda9       /home/user1     ext3    defaults                0       2
/dev/sda10      /home/didier    ext3    defaults                0       2
/dev/sda11      /backup         ext3    defaults                0       2
proc            /proc   proc    defaults        0       0
sysfs           /sys    sysfs   defaults        0       0

C’est la partition backup que je désire étendre. Elle va me servir à faire des backups d’un AUTRE serveur. Si je fais un backup de mes dossiers sur le serveur même, ça me protégera d’une erreur, mais pas d’une panne disque dur…
Espace libre :

$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             3.0G  940M  1.9G  33% /
tmpfs                 996M     0  996M   0% /lib/init/rw
udev                   10M   60K   10M   1% /dev
tmpfs                 996M     0  996M   0% /dev/shm
/dev/sda2             4.6G  162M  4.5G   4% /tmp
...
/dev/sda8              14G  2.3G   12G  17% /home
/dev/sda9              46G  3.5G   43G   8% /home/user1
/dev/sda10             46G  7.9G   38G  18% /home/didier
/dev/sda11             37G   17G   20G  46% /backup

J’ai besoin de plus de 37 GB.
“df -h” affiche l’espace libre (disk free) sous forme “compréhensible” (human), mais vous pouvez aussi afficher cet espace en nombre de blocks de 1K, ou en nombre de blocks de 4K.

$ df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda1              3099260    962280   1979548  33% /
tmpfs                  1019212         0   1019212   0% /lib/init/rw
udev                     10240        60     10180   1% /dev
tmpfs                  1019212         0   1019212   0% /dev/shm
/dev/sda2              4806936    165500   4641436   4% /tmp
...
/dev/sda8             14421344   2326000  12095344  17% /home
/dev/sda9             48062440   3572068  44490372   8% /home/user1
/dev/sda10            48062440   8276808  39785632  18% /home/didier
/dev/sda11            38448276  17595788  20852488  46% /backup
$ df -B 4k
Filesystem           4K-blocks      Used Available Use% Mounted on
/dev/sda1               774815    240570    494887  33% /
tmpfs                   254803         0    254803   0% /lib/init/rw
udev                      2560        15      2545   1% /dev
tmpfs                   254803         0    254803   0% /dev/shm
/dev/sda2              1201734     41375   1160359   4% /tmp
...
/dev/sda8              3605336    581500   3023836  17% /home
/dev/sda9             12015610    893017  11122593   8% /home/user1
/dev/sda10            12015610   2069202   9946408  18% /home/didier
/dev/sda11             9612069   4398947   5213122  46% /backup

L’espace libre en blocs de 4K, ça peut servir lorsque vous devez recréer une partition avec fdisk.
Les partitions :
On peut lister les partitions avec fdisk :
$ fdisk -l
Disk /dev/sda: 250.0 GB, 250059350016 bytes
255 heads, 63 sectors/track, 30401 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1         392     3148708+  83  Linux
/dev/sda2             393        1000     4883760   83  Linux
/dev/sda3            1001        2216     9767520   83  Linux
/dev/sda4            2217       23018   167092065    5  Extended
/dev/sda5            2217        3432     9767488+  83  Linux
/dev/sda6            3433        3675     1951866   83  Linux
/dev/sda7            3676        4173     4000153+  82  Linux swap / Solaris
/dev/sda8            4174        5997    14651248+  83  Linux
/dev/sda9            5998       12076    48829536   83  Linux
/dev/sda10          12077       18155    48829536   83  Linux
/dev/sda11          18156       23018    39062016   83  Linux
et afficher la taille de la partition qui m’intéresse en nombre de BLOCS /dev/sda11 :

$ fdisk -s /dev/sda11
39062016

Cfdisk est intéressant par la façon claire dont il affiche les partitions (par défaut, cfdisk prend le 1er disque dur) .

$ cfdisk
cfdisk 2.12r
Disk Drive: /dev/sda
Size: 250059350016 bytes, 250.0 GB
Heads: 255   Sectors per Track: 63   Cylinders: 30401
Name      Flags    Part Type FS Type       [Label]      Size (MB)
------------------------------------------------------------------
sda1      Boot      Primary  Linux ext3    [/]            3224.31
sda2                Primary  Linux ext3                   5000.98
sda3                Primary  Linux ext3                  10001.95
sda5                Logical  Linux ext3                  10001.95
sda6                Logical  Linux ext3                   1998.75
sda7                Logical  Linux swap / Solaris         4096.19
sda8                Logical  Linux ext3                  15002.92
sda9                Logical  Linux ext3                  50001.48
sda10               Logical  Linux ext3                  50001.48
sda11               Logical  Linux ext3                  39999.54
Logical  Free Space                  60727.25

Il reste 60 GB en fin de disque dur. Je veux les ajouter dans la partition sda11 (/backup).
Commençons l’agrandissement de la partition.
Je dois démonter la partition avant de la modifier.
Je suppose que vous avez arrêté tous les programmes utilisant cette partition.
$ umount /dev/sda11
Je devrais à un moment, rebooter le serveur. C’est inévitable si on veut qu’une modification à la table des partitions soit prise en compte !
Evitons de faire un montage automatique de cette partition lors du reboot. Je vais mettre cette partition en commentaire dans fstab :
$ vi /etc/fstab
/dev/sda1       /               ext3    errors=remount-ro       0       1
/dev/sda2       /tmp            ext3    defaults                0       2

/dev/sda7       none            swap    defaults                0       0
/dev/sda8       /home           ext3    defaults                0       2
/dev/sda9       /home/user1 ext3    defaults                0       2
/dev/sda10      /home/didier    ext3    defaults                0       2
#/dev/sda11      /backup                ext3    defaults                0       2
proc            /proc   proc    defaults        0       0
sysfs           /sys    sysfs   defaults        0       0
J’insère un caractère “#” en début de la ligne pour la partition /backup, et je sauve.
Je peux maintenant travailler sur cette partition.
Je commence par la vérifier. On ne sait jamais… Autant ne pas travailler sur une partition avec des erreurs.

$ fsck -n /dev/sda11
fsck 1.40-WIP (14-Nov-2006)
e2fsck 1.40-WIP (14-Nov-2006)
/dev/sda11: clean, 101/4889248 files, 4552382/9765504 blocks

Ok, pas d’erreur 😉
Les étapes :

  • supprimer le journal ext3 de la partition, car l’utilitaire de modification de taille ne peut fonctionner que sur des partitions ext2
  • supprimer la partition sda11 ! … Aucune donnée ne sera perdue. La partition est juste retirée de la table des partitions
  • créer une nouvelle partition qui va prendre toute la place disponible en fin de disque)
  • écrire la table des partitions modifiées sur disque
  • rebooter pour que Linux prenne connaissance de la nouvelle table des partitions
  • forcer une vérification de la partition sda11
  • étendre le système de fichiers pour qu’il prenne la nouvelle taille de la partition
  • revérifier le système de fichier
  • recréer le journal ext3
  • remonter la partition
  • remettre cette partition dans /etc/fstab (la partition est en commentaire)

Supprimer le journal ext3 :

$ tune2fs -O ^has_journal /dev/sda11
tune2fs 1.40-WIP (14-Nov-2006)

Je me rend compte que j’ai un problème de table des partitions dans fdisk :
$ fdisk -l
Disk /dev/sda: 250.0 GB, 250059350016 bytes
255 heads, 63 sectors/track, 30401 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot      Start         End Blocks   Id  System
/dev/sda1   *           1         392     3148708+  83  Linux
/dev/sda2             393        1000     4883760   83  Linux
/dev/sda3            1001        2216     9767520   83  Linux
/dev/sda4            2217       23018 167092065    5  Extended
/dev/sda5            2217        3432     9767488+  83  Linux
/dev/sda6            3433        3675     1951866   83  Linux
/dev/sda7            3676        4173     4000153+  82  Linux swap / Solaris
/dev/sda8            4174        5997    14651248+  83  Linux
/dev/sda9            5998       12076    48829536   83  Linux
/dev/sda10          12077       18155    48829536   83  Linux
/dev/sda11          18156       23018 39062016   83  Linux
La partition étendue sda4 se termine à la fin de la partition sda11…
Pourtant, cfdisk montre 60 GB d’espace libre après sda11 ! Il suffit de cumuler les tailles que cfdisk affiche pour voir qu’on n’a que 190 GB d’alloués sur les 250 GB de disque…
Si je vérifie la table des partitions avec fdisk :

$ fdisk /dev/sda
Command (m for help): v
118613494 unallocated sectors

Il peut y avoir quelques secteurs non alloués (même 4 ou 5000), mais pas 118 millions de secteurs non alloués (càd en dehors des limites de la table des partitions…). Remarquez que, avec une taille de secteur de 512 bytes (1/2 KB), cela fait bien dans les 60 GB qui sont bien en fin de disque dur.
Je vais utiliser cfdisk pour supprimer sda11 et recréer la partition, en espérant que cfdisk ajoute lui-même la taille de la partition étendue sda4…

$ cfdisk
cfdisk 2.12r
 Disk Drive: /dev/sda
 Size: 250059350016 bytes, 250.0 GB
 Heads: 255   Sectors per Track: 63   Cylinders: 30401
 Name       Flags    Part Type FS Type        [Label]       Size (MB)
 ---------------------------------------------------------------------
 sda1       Boot      Primary  Linux ext3     [/]             3224.31
 sda2                 Primary  Linux ext3                     5000.98
 sda3                 Primary  Linux ext3                    10001.95
 sda5                 Logical  Linux ext3                    10001.95
 sda6                 Logical  Linux ext3                     1998.75
 sda7                 Logical  Linux swap / Solaris           4096.19
 sda8                 Logical  Linux ext3                    15002.92
 sda9                 Logical  Linux ext3                    50001.48
 sda10                Logical  Linux ext3                    50001.48
 sda11                Logical  Linux ext2                    39999.54
 Logical  Free Space                    60727.25
 [Bootable]  [ Delete ]  [  Help  ]  [Maximize]  [ Print  ]
 [  Quit  ]  [  Type  ]  [ Units  ]  [ Write  ]
 Delete the current partition

Je recrée une partition sda11 de la taille maximale.

...
sda9                 Logical  Linux ext3                    50001.48
sda10                Logical  Linux ext3                    50001.48
Logical  Free Space                   100726.78
[  Help  ]  [  New   ]  [ Print  ]  [  Quit  ]  [ Units  ]
 [ Write  ]

 Create new partition from free space

cfdisk semble bien reconnaitre 100 GB d’espace libre.

...
sda9                 Logical  Linux ext3                    50001.48
sda10                Logical  Linux ext3                    50001.48
Logical  Free Space                   100726.78
Size (in MB): 100726.78

Ok, ça semble bon. La partition sda11 fait bien 100 GB :

...
sda9                 Logical  Linux ext3                    50001.48
sda10                Logical  Linux ext3                    50001.48
sda11                Logical  Linux                        100726.78

J’écris la table des partitions.
cfdisk me donne un message d’avertissement ! Effectivement, c’est une opération dangereuse… mais elle est voulue. Ok, j’écris la table des partitions ! 😉
Je réessaye fdisk :
$ fdisk -l
Disk /dev/sda: 250.0 GB, 250059350016 bytes
255 heads, 63 sectors/track, 30401 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1         392     3148708+  83  Linux
/dev/sda2             393        1000     4883760   83  Linux
/dev/sda3            1001        2216     9767520   83  Linux
/dev/sda4 2217       30401 226396012+   5  Extended
/dev/sda5            2217        3432     9767488+  83  Linux
/dev/sda6            3433        3675     1951866   83  Linux
/dev/sda7            3676        4173     4000153+  82  Linux swap / Solaris
/dev/sda8            4174        5997    14651248+  83  Linux
/dev/sda9            5998       12076    48829536   83  Linux
/dev/sda10          12077       18155    48829536   83  Linux
/dev/sda11 18156     30401 98365963+  83  Linux
Et fdisk me donne cette fois une partition étendue sda4 allant jusqu’à la fin du disque dur (30401 cylindres) 🙂
Ce problème vient probablement car j’avais créé les partitions, quand nous avons configuré ce serveur, avec cfdisk.
cfdisk semble donc adapter le secteur de fin de la partition étendue sda4 en fonction du dernier secteur utilisé par la dernière partition.
La table des partitions est écrite. Il faut rebooter le serveur.
(Ne vous trompez pas ! REBOOT et pas halt… à distance, un serveur power off, c’est génant)

$ reboot
The system is going down for reboot NOW!

Après quelques minutes, votre serveur répond de nouveau aux pings.
Ne paniquez pas trop vite si cela prend LONGTEMPS !
Si le serveur n’a pas redémarré depuis des mois, il est possible que Linux fasse automatiquement un fsck de certaines partitions. Ca peut prendre un “certain temps”
😉
Faites un test forcé de la partition :

$ e2fsck -f /dev/sda11
e2fsck 1.40-WIP (14-Nov-2006)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/sda11: 101/4889248 files (69.3% non-contiguous), 4519580/9765504 blocks

Le système de fichiers est correct, mais il ne remplit pas encore la totalité des 100 GB de la partition !
“resize2fs” va utiliser, par défaut, la totalité de la place libre :

$ resize2fs /dev/sda11
resize2fs 1.40-WIP (14-Nov-2006)
Resizing the filesystem on /dev/sda11 to 24591490 (4k) blocks.
The filesystem on /dev/sda11 is now 24591490 blocks long.

Refaites un test de la partition après resize :

$ fsck -n /dev/sda11
fsck 1.40-WIP (14-Nov-2006)
e2fsck 1.40-WIP (14-Nov-2006)
/dev/sda11: clean, 101/12280352 files, 4754531/24591490 blocks

La partitioon ext2 est correct. Il faut recréer un journal ext3 :

$ tune2fs -j /dev/sda11
tune2fs 1.40-WIP (14-Nov-2006)
Creating journal inode: done
This filesystem will be automatically checked every 22 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

Je devrais pouvoir remonter la partition /backup, avec sa nouvelle taille.
$ mount /dev/sda11 /backup
$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             3.0G  940M  1.9G  33% /

/dev/sda10             46G   12G   34G  26% /home/didier
/dev/sda11             93G   17G   76G  19% /backup
Ça semble correct ! Les 100 GB sont là.
(enfin… les 93 GB, ça dépend si on compte en multiple de 1000 ou de 1024 😉
Un petit contrôle, et oui, les fichiers sont là !
La partition est étendue de 40 à 100 GB et les données sont intactes 😉
ATTENTION, il reste UNE étape importante : le fichier fstab !
J’avais mis en commentaire sda11 pour ne pas avoir son montage lors du reboot.
Je dois éditer /etc/fstab pour remettre sda11. Sinon, au prochain reboot, ma partition /backup ne sera plus là !

$ vi /etc/fstab
/dev/sda1       /               ext3    errors=remount-ro       0       1
...
/dev/sda10      /home/didier    ext3    defaults                0       2
/dev/sda11      /backup         ext3    defaults                0       2
proc            /proc   proc    defaults        0       0
sysfs           /sys    sysfs   defaults        0       0

Retirer le “#” en début de ligne, et sauvez le fichier /etc/fstab.
Voilà, la partition est étendue. 😉