J’ai une partition presque pleine sur un serveur Linux. Comment l’agrandir ?
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…
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. 😉