Migrer ses partitions ext3 vers ext4 sous Linux Ubuntu

ext3 versus ext4

Un coup de boost sur vos disques ?

L'apparition d'un nouveau système de fichiers est un événement remarquable.
ext4 vient d'être promu stable et intégré au noyau Linux dans Ubuntu 9.04. Il va donc remplacer le vénérable ext3 intégré au noyau Linux depuis 2001.

Quelles sont les nouveautés apportées par l'ext4 ? Comment migrer ses partitions ext3 vers l'ext4 ?

Ceinture, bretelle, parachute !

Cette opération est dangereuse pour vos données et votre système. Vous pouvez tout perdre.

Vous ne devez en aucun cas vous lancer dans cette opération sans disposer d'une sauvegarde complète de votre machine, sauvegarde dont vous aurez testée qu'elle peut être restaurée et que le résultat est conforme à la machine d'origine.

ext3 vs ext4

L'ext3 avait apporté la journalisation du système de fichiers, la possibilité de modifier la taille de la partition et la gestion de volumes de l'ordre du To (1000 Go), tout en restant compatible avec l'ext2.

Les améliorations théoriques apportées par ext4 ne semblent pas révolutionnaires : checksum de la journalisation, limite de la taille des volumes porté à l'Exabit (1 millions de To) et refonte de la gestion de l'allocation des espaces afin de minimiser la fragmentation.

Cependant, la migration de la partition de démarrage du format ext3 vers ext4 montre une augmentation des performances incontestable ; le temps de démarrage a été divisé par 2 et le fonctionnement du système est nettement plus vif sur le disque lent de mon laptop.

L'augmentation des performances des I/O me semble le changement le plus visible pour le commun des mortels.
Mais comment migrer ses partitions vers ext4 sans réinstaller son serveur Ubuntu ?

Identifier les partitions concernées

Le prérequis est que vous ayez upgradé votre système vers Ubuntu 9.04 afin de bénéficier du noyau Linux supérieur ou égal à 2.6.28. La description qui suit reste transposable aux autres distributions.

$ uname -r
2.6.28-11-generic

La commande df permet d'identifier les partitions en ext3 qui peuvent être migrées en ext4.

$ df -T
Sys. de fich. Type    Tail. Occ. Disp. %Occ. Monté sur
/dev/sda3     ext3     15G  5,5G  8,5G  40% /
tmpfs        tmpfs    497M     0  497M   0% /lib/init/rw
varrun       tmpfs    497M  260K  496M   1% /var/run
varlock      tmpfs    497M     0  497M   0% /var/lock
udev         tmpfs    497M  164K  497M   1% /dev
tmpfs        tmpfs    497M   76K  497M   1% /dev/shm
lrm          tmpfs    497M  2,4M  494M   1% /lib/modules/2.6.28-11-generic/volatile
/dev/mapper/vg-lv_home
              ext3     20G   17G  2,5G  87% /home

Dans cet exemple, les partitions migrables sont /dev/sda3, la partition boot, et /dev/vg/lv_home, la partition de données.

Déterminer l'espace disponible

L'utilisation d'un backup est fortement recommandé. D'une part, en cas de problème, vous pourrez restaurer l'état de la partition avant manipulation. D'autre part, pour bénéficier de toutes les optimisations des partitions ext4, il est indispensable de reformater les partitions.
Pour ce faire, vous pouvez utiliser un support externe ou une partition locale.

Pour rechercher l'espace disponible sur le disque interne, utilisez la commande parted.

$ sudo parted 
GNU Parted 1.8.8
Utilisation de /dev/sda
Bienvenu dans GNU Parted ! Tapez "help" pour voir la liste des commandes.
(parted) print                                                            
Modèle: ATA ST380013AS (scsi)
Disque /dev/sda : 80,0GB
Taille des secteurs (logique/physique) : 512o/512o
Table de partitions : msdos

Numéro  Début   Fin     Taille  Type      Système de fichiers  Fanions  
 1      32,3kB  21,0GB  21,0GB  primary   ntfs                 démarrage
 3      21,0GB  36,8GB  15,9GB  primary   ext3                          
 4      36,8GB  78,2GB  41,3GB  primary                                 
 2      78,2GB  80,0GB  1818MB  extended                       lba      
 5      78,2GB  80,0GB  1818MB  logical   linux-swap                    

(parted) quit

Ici, le disque de 80Go est utilisé complètement. Il n'y a aucun espace libre entre le début et la fin de chaque partition.

Si vous avez utilisé lvm pour organiser vos partitions, il peut vous rester de l'espace libre dans vos Volume Group.

$ sudo vgdisplay
  --- Volume group ---
  VG Name               vg
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  16
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                3
  Open LV               1
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               38,50 GB
  PE Size               4,00 MB
  Total PE              9856
  Alloc PE / Size       9728 / 38,00 GB
  Free  PE / Size       128 / 512,00 MB
  VG UUID               g7mx49-PPMR-J3Ly-TIyN-PZLE-GXR3-kMpLw6

La ligne Free indique 512Mo libre. Pas suffisant pour faire un backup dans cet exemple. Il faudra donc passer soit par une sauvegarde sur un support externe, soit prendre le risque de vous passer de sauvegarde.
Dans la suite de ce billet, je vous présente les solutions en fonction qu'il vous reste ou non de l'espace pour faire ces sauvegardes.

Migrer vos données d'ext3 vers ext4 en reformatant

Il vous reste de la place pour faire un backup de vos contenus ?
Cette méthode est à privilégier pour profiter de 100% des améliorations apportées par l'ext4.

Le plan est de, partition par partition, créer un backup, reformater votre partition cible en ext4 et restaurer le backend sur celle-ci.
Supposons dans l'exemple que vous avez la capacité de créer une partition logique dans un volume group nommé vg.

$ sudo lvcreate -n lv_tmp -L 20G vg
$ sudo mkfs.ext4 /dev/vg/lv_tmp
$ sudo mount /dev/vg/lv_tmp /mnt

La partition de backup de 20Go est prête. Pour vous assurer que votre partition de données n'est pas utilisée durant cette opération, basculez en mode mono-user. Une partie des services vont s'arrêter dont X-Windows, et ce navigateur...

$ sudo init 1

Ensuite, commencez la sauvegarde.

$ sudo rsync -a /home/* /mnt

Patientez... et vérifez que vous retrouvez l'ensemble de vos données dans /mnt.
Remplacez le type de partition ext3 par ext4 dans le fichier /etc/fstab sur la ligne qui décrit le montage de /home

$ sudo vi /etc/fstab

Reformatez la partition de données.

$ sudo umount /home
$ sudo mkfs.ext4 /dev/vg/lv_home
$ sudo mount /home
$ sudo rsync -a /mnt/* /home

Patientez et purgez la partition temporaire.

$ sudo umount /dev/vg/lv_mnt
$ sudo mkfs.ext4 /dev/vg/lv_mnt
$ sudo mount /dev/vg/lv_mnt /mnt

Répétez l'opération pour chacune des partitions de données.
Puis supprimez cette partition :

$ sudo lvremove /dev/vg/lv_mnt

Migrer vos données vers ext4 sans reformater votre partition

Vous n'avez pas la place pour effectuer une sauvegarde ?
Il est toujours possible de basculer votre partition de donnée vers ext4, mais seuls les nouveaux fichiers vont bénéficier des avantages de ce nouveau système de fichiers. Votre partition va progressivement devenir de plus en plus rapide au fur et à mesure que les fichiers seront remplacés

$ sudo umount /home
$ sudo tune2fs -O extents,uninit_bg,dir_index /dev/vg/lv_home
$ sudo e2fsck -pf /dev/vg/lv_home

La dernière commande va corriger les descripteurs de groupe. Cette opération est longue. Patientez...

Remplacez le type de partition ext3 par ext4 dans le fichier /etc/fstab sur la ligne qui décrit le montage de /home

$ sudo vi /etc/fstab

Et remontez votre partition

$ sudo mount /home

Migration de la partition de boot

La migration de la partition boot nécessite un LiveCD 9.04, bien que cela puisse bien se passer sans, à vos risques et périls.

ext4 étant compatible avec ext3, vous allez modifier la définition de la partition de boot avant de modifier votre partition.

Editez le fichier de configuration de grub

$ sudo vi /boot/grub/menu.lst

recherchez la ligne kernel qui correspond au noyau que vous utilisez et ajoutez en fin de ligne suivante rootfstype=ext4, par exemple :

kernel          /boot/vmlinuz-2.6.28-15-generic root=UUID=7951080c-298c-40a6-bdae-731fbca2e691 ro quiet splash rootfstype=ext4

Sauvegardez et mettez à jour grub :

$ sudo update-grub

Arrivé à cette étape, vous êtes dans la même situation que pour une partition de donnée.

Soit vous disposez d'un espace de sauvegarde, soit vous n'avez pas d'espace et vous ne pouvez qu'altérer les paramètres de la partition avec tune2fs.
Avant de commencer l'une de ces procédures, redémarrez votre serveur à partir d'un LiveCD. Ensuite, suivez l'une des procédures de migration de données pas-à-pas.

Terminez en redémarrant votre serveur.