Dans cet article, nous allons voir comment redimensionner une partition sous Linux.
Pour l'exemple, et pour la pratique, nous allons redimensionner les partitions d'un serveur OVH Kimsufi sous Ubuntu.
Pourquoi un serveur OVH Kimsufi sous Ubuntu? Parce qu'à l'heure où j'écris ces lignes, l'installation de base d'Ubuntu 9.10 fournie installe une partition de 5Go pour /, et une partition de plusieurs centaines de Gigas pour /home.
C'est évidemment absurde, surtout si on héberge un site web (puisque c'est le répertoire /var qui va grossir à cause de la base de données et des logs).
Pour corriger cela, nous allons réduire la taille de /home, et migrer /var dans sa propre partition.
Première étape: voir les détails du système de fichier en utilisant la commande "df":
Sys. de fich. 1K-blocs Occupé Disponible Capacité Monté sur
rootfs 5162796 5162544 0 100% /
udev 1025800 212 1025588 1% /dev
/dev/disk/by-uuid/e10fa1e8-df96-4c13-96bb-cbf7102e530b
5162796 5162544 0 100% /
none 1025800 0 1025800 0% /dev/shm
none 1025800 92 1025708 1% /var/run
none 1025800 0 1025800 0% /var/lock
none 1025800 0 1025800 0% /lib/init/rw
/dev/sda2 234685816 286592 222477792 1% /homeOn voit que /home est sur la partition /dev/sda2. C'est cette partition que nous allons devoir redimensionner.
Mais il est impossible de redimensionner la partition en place, car elle est utilisée par l'OS. Il faut donc redémarrer sur un CD de rescue. Dans le cas d'OVH, nous disposons d'un mode de boot rescue, dans le manager OVH.
Il faut donc:
- Se connecter au manager OVH
- Aller dans la section "Services" puis "netboot", et sélectionner le mode "rescue-pro". N'oubliez pas de bien remplir votre adresse mail, puisqu'OVH vous enverra les codes de connexion au serveur sur cette adresse.
- Ensuite, allez sur "Services > Rebooter", puis demander un reboot de la machine.
Patientez quelques instants (jusqu'à 5 minutes) le temps pour le serveur de redémarrer et le temps pour OVH de vous envoyer un mail avec les nouvelles informations de connexion SSH.
Note: lorsque vous retenterez une connexion SSH, vous allez recevoir un warning, vous informant que votre serveur a peut être été hacké (parce que la clef du serveur à changé). Pas de panique, c'est normal. Vous pouvez ignorer ce warning et forcer la connexion.
En mode rescue, on se connecte dans un environnement isolé. Les partitions ne sont pas accessibles si on ne les monte pas.
Cela tombe bien, on veut redimensionner /dev/sda2, ce qui demande que la partition soit demontée.
On commence par vérifier que la partition n'a pas de problèmes:
fsck -n /dev/sda2
fsck 1.41.3 (12-Oct-2008) fsck.ext3: /lib/libblkid.so.1: no version information available (required by fsck.ext3) fsck.ext3: /lib/libuuid.so.1: no version information available (required by fsck.ext3) e2fsck 1.41.9 (22-Aug-2009) /home: clean, 11/30171136 files, 1001471/120653568 blocks
Maintenant, passons aux choses sérieuses!
On retire le journal du système de fichier ext3 (ce qui le transforme en système de fichier ext2, qui est redimensionnable plus facilement).
tune2fs -O ^has_journal /dev/sda2
tune2fs: /lib/libblkid.so.1: no version information available (required by tune2fs) tune2fs: /lib/libuuid.so.1: no version information available (required by tune2fs) tune2fs 1.41.9 (22-Aug-2009)
On relance ensuite une nouvelle vérification:
e2fsck -f /dev/sda2
e2fsck 1.41.9 (22-Aug-2009) 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 /home: 11/30171136 files (0.0% non-contiguous), 968670/120653568 blocks
Maintenant, nous pouvons redimensionner la partition.
Dans mon cas, je ne veux garder que 10 Go.
Je lance donc la commande suivante:
resize2fs /dev/sda2 10G
resize2fs 1.41.9 (22-Aug-2009) Resizing the filesystem on /dev/sda2 to 2621440 (4k) blocks. The filesystem on /dev/sda2 is now 2621440 blocks long.
Vous pensez avoir fini? Que nenni! On passe au passage rigolo: réécrire la table de partitions (parce que resize2fs ne s'en charge pas).
Prenez bien note de la taille en blocs du système de fichiers (dans mon cas: 2621440 blocks et 4k par bloc).
Démarrons fdisk:
fdisk /dev/sda
Vérifions la table des partitions actuelle:
Command (m for help): p Disk /dev/sda: 500.1 GB, 500107862016 bytes 255 heads, 63 sectors/track, 60801 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk identifier: 0x0005efe2 Device Boot Start End Blocks Id System /dev/sda1 * 1 653 5242880+ 83 Linux Partition 1 does not end on cylinder boundary. /dev/sda2 653 60736 482614272 83 Linux /dev/sda3 60736 60801 525856 82 Linux swap / Solaris
Supprimons la partition (normalement, aucune donnée ne sera perdu.... normalement hein!)
Command (m for help): d Partition number (1-4): 2
Ensuite, nous recréons /dev/sda2, en temps que partition primaire puisqu'elle était déjà primaire.
Command (m for help): n Command action l logical (5 or over) p primary partition (1-4) p Partition number (1-4): 2
Ensuite, fdisk nous demande le premier cylindre. On prend le cylindre par défaut:
First cylinder (653-60801, default 653): Using default value 653
Il faut maintenant indiquer la taille de la partition. On indique donc 10Go (10485760 ko). On trouve sur internet des recommandations consistant à rajouter 3% d'espace libre. Dans le doute, j'ai suivi cette recommandation. Je demande donc 10485760 * 1.03 = 10800330 ko pour la partition)
Last cylinder or +size or +sizeM or +sizeK (653-60735, default 60735): +10800330K
On réécrit maintenant la table de partition, avec la commande "w":
Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.
On effectue de nouveau une vérification:
fsck -n /dev/sda2 fsck 1.41.3 (12-Oct-2008) fsck.ext2: /lib/libblkid.so.1: no version information available (required by fsc k.ext2) fsck.ext2: /lib/libuuid.so.1: no version information available (required by fsck .ext2) e2fsck 1.41.9 (22-Aug-2009) /home: clean, 11/655360 files, 29871/2621440 blocks
Tout semble s'être bien passé.
On peut réactiver le journal pour remettre le système de fichier en ext3:
tune2fs -j /dev/sda2
tune2fs: /lib/libblkid.so.1: no version information available (required by tune2 fs) tune2fs: /lib/libuuid.so.1: no version information available (required by tune2f s) tune2fs 1.41.9 (22-Aug-2009) Creating journal inode: done This filesystem will be automatically checked every 29 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.
Hourra! Nous avons réduit la taille de la partition /home.
Nous pouvons maintenant créer notre partition /var.
Je la créé en temps que partition étendue (et je dois donc créé la partition étendue /dev/sda4 d'abord).
fdisk /dev/sda Command (m for help): n Command action e extended p primary partition (1-4) e Selected partition 4 First cylinder (1999-60801, default 1999): Using default value 1999 Last cylinder or +size or +sizeM or +sizeK (1999-60735, default 60735): Using default value 60735 Command (m for help): n First cylinder (1999-60735, default 1999): Using default value 1999 Last cylinder or +size or +sizeM or +sizeK (1999-60735, default 60735): 31367 Command (m for help): p Disk /dev/sda: 500.1 GB, 500107862016 bytes 255 heads, 63 sectors/track, 60801 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk identifier: 0x0005efe2 Device Boot Start End Blocks Id System /dev/sda1 * 1 653 5242880+ 83 Linux Partition 1 does not end on cylinder boundary. /dev/sda2 653 1998 10805030+ 83 Linux /dev/sda3 60736 60801 525856 82 Linux swap / Solaris /dev/sda4 1999 60735 471804952+ 5 Extended /dev/sda5 1999 31367 235906461 83 Linux 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. Syncing disks.
Note: ma partition /var (/dev/sda5) n'utilise par l'intégralité du disque. Cela me permettra de garder une marge de manoeuvre.
Nous devons formatter /dev/sda5:
mkfs -t ext3 /dev/sda5
mke2fs 1.41.9 (22-Aug-2009)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
14745600 inodes, 58976615 blocks
2948830 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=0
1800 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 36 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.Bien, maintenant, nous pouvons monter nos disques:
cd /mnt mkdir sda1 mkdir sda5 mount /dev/sda1 /mnt/sda1 mount /dev/sda5 /mnt/sda5
Parfait! Nous devons maintenant transférer le répertoire /var de sda1 vers sda5:
cp -Rp sda1/var/* sda5/.
Nous allons pour le moment renommer /var en /var.bak.
Nous supprimerons ce répertoire si tout se passe bien.
mv /mnt/sda1/var /mnt/sda1/var.bak mkdir /mnt/sda1/var
Finalement, nous allons dire au système qu'il doit automatiquement monter /dev/sda5 dans le répertoire /var.
We do this in /etc/fstab
nano /mnt/sda1/etc/fstab
Nous rajoutons cette ligne:
/dev/sda5 /var ext3 defaults 0 2
Nous pouvons maintenant redémarrer la machine!
Pour cela, ne pas oublier de retirer le CD de boot, ou dans le cas du netboot OVH, de repasser sur un boot à partir du disque dur.
Et voilà!
Tout devrait s'être passé correctement. Le reboot devrait fonctionner.
Si après quelques heures/jours votre système fonctionne correctement, vous pouvez supprimer le backup du répertoire var pour libérer de l'espace sur /:
sudo rm -rf /var.bak
J'espère que vous avez pu suivre mes commentaires jusqu'ici, et félicitations! Vous avez un système un peu moins mal partitionné (et le prochaine fois, comme moi, vous penserez à LVM :) )