fstransform : Conversion de systèmes de fichiers

« fstransform » Est un utilitaire permettant de migrer un système de fichier unix, même s’il contient des données, vers un autre.

Les formats actuellement supportés sont « minix », « ext2 », « ext3 », « ext4 », « reiserfs », « jfs » et « xfs ».

En temps normal, le changement d’un système de fichier consiste à :

  • sauvegarder l’intégralité du volume à transformer sur un autre disque,
  • formater le disque avec le système de fichier souhaité,
  • restaurer les données sur le disque fraîchement formaté.

Avec « fstransform », la conversion consiste à invoquer l’utilitaire en lui précisant le disque à convertir et le filesystem à utiliser.

Installation

« fstransform » n’est pas disponible sur la plupart des distributions pour le moment mais sa compilation ne présente aucune difficulté et passe par les traditionnelles étapes de téléchargement (http://fstransform.sourceforge.net/), configuration (« ./configure »), compilation (« make ») et installation (« make install ») :

fhh@cixi ~/downloads $ wget -q http://downloads.sourceforge.net/project/fstransform/fstransform-0.9.3/fstransform-0.9.3-src.tar.bz2
fhh@cixi ~/downloads $ tar xf fstransform-0.9.3-src.tar.bz2
fhh@cixi ~/downloads $ cd fstransform-0.9.3-src
fhh@cixi ~/downloads/fstransform-0.9.3-src $ ./configure --prefix=$HOME/bin/fstransform
...
fhh@cixi ~/downloads/fstransform-0.9.3-src $ make -j3
...
fhh@cixi ~/downloads/fstransform-0.9.3-src $ make install
...
fhh@cixi ~/downloads/fstransform-0.9.3-src $ cd ~/bin/fstransform/
fhh@cixi ~/bin/fstransform $ ls
sbin
fhh@cixi ~/bin/fstransform $ cd sbin/
fhh@cixi ~/bin/fstransform/sbin $ ls -l
total 2292
-rwxr-xr-x 1 fhh users  535491 Oct 20 23:21 fsmove
-rwxr-xr-x 1 fhh users 1767423 Oct 20 23:21 fsremap
-rwxr-xr-x 1 fhh users   37082 Oct 20 23:21 fstransform

Côté fonctionnement, « fstransform » nécessite que les systèmes de fichier source et destination soient supportés par l’OS (ce qui semble assez logique), et les utilitaires mkfs, fsck, which, expr, id, blockdev, losetup, mount et umount, mkdir, rmdir, rm, mkfifo, dd et sync. Bref, rien que du très classique généralement présent sur un Linux.
A noter, le module « loop » doit être chargé pour accéder aux périphérique de loop du système (voir Utiliser les périphériques de loop).

Seule originalité, le « shebang » du script « fstransform » fait appel à « dash ». Si « dash » n’est pas disponible sur votre système, préciser l’interpréteur de commande à utiliser lors de l’invocation du script (exemple : « sh ./fstransform ») :

[root@mafalda sbin]# ./fstransform 
bash: ./fstransform: /bin/dash: bad interpreter: No such file or directory
[root@mafalda sbin]# sh fstransform 
fstransform: starting version 0.9.3, checking environment
fstransform: checking for which...      '/usr/bin/which'
...

Une fois installé, la composante principale est le script « fstransform ».

Le chemin vers les binaires « fsmove » et « fsremap » doit faire parti du PATH ou être précisé à l’invocation de « fstransform » :

[root@mafalda sbin]# alias fstransform="PATH=$PATH:$PWD sh fstransform"
[root@mafalda sbin]# cd
[root@mafalda ~]# fstransform
fstransform: starting version 0.9.3, checking environment
...
[root@mafalda ~]# cd -
/users/fhh/bin/fstransform/sbin
[root@mafalda sbin]# alias fstransform="sh $PWD/fstransform --cmd-fsmove=$PWD/fsmove --cmd-fsremap=$PWD/fsremap"
[root@mafalda sbin]# cd
[root@mafalda ~]# fstransform 
fstransform: starting version 0.9.3, checking environment
...

Conversion de systèmes de fichiers

L’utilisation de l’outil est relativement intuitive. Le système de fichier à convertir doit être démonté avant de commencer la conversion.

Dans cet exemple, nous convertissons le système de fichier ext3 de /dev/sdb1 (informations vérifiées par un « parted -l ») qui contient des données vers de l’XFS :

[root@mafalda ~]# parted -l
...
Model: Verbatim STORE N GO (scsi)
Disk /dev/sdb: 31.0GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 
 
Number  Start   End     Size    Type     File system  Flags
 1      16.4kB  31.0GB  31.0GB  primary  ext3
 
 
[root@mafalda ~]# umount /dev/sdb1
umount: /dev/sdb1: not mounted
[root@mafalda ~]# time fstransform --no-questions /dev/sdb1 xfs
fstransform: starting version 0.9.3, checking environment
fstransform: checking for which...      '/usr/bin/which'
fstransform: checking for expr...       '/usr/bin/expr'
fstransform: checking for id...         '/usr/bin/id'
fstransform: parsing command line arguments
fstransform: assuming non-interactive execution, '--no-questions' specified on command line
fstransform: checking for stat...       '/usr/bin/stat'
fstransform: checking for mkfifo...     '/usr/bin/mkfifo'
fstransform: checking for blockdev...   '/sbin/blockdev'
fstransform: checking for losetup...    '/sbin/losetup'
fstransform: checking for fsck...       '/sbin/fsck'
fstransform: checking for mkfs...       '/sbin/mkfs'
fstransform: checking for mount...      '/bin/mount'
fstransform: checking for umount...     '/bin/umount'
fstransform: checking for mkdir...      '/usr/bin/mkdir'
fstransform: checking for rmdir...      '/usr/bin/rmdir'
fstransform: checking for rm...         '/usr/bin/rm'
fstransform: checking for dd...         '/usr/bin/dd'
fstransform: checking for sync...       '/usr/bin/sync'
fstransform: checking for fsmove...     '/users/fhh/bin/fstransform/sbin/fsmove'
fstransform: checking for fsremap...    '/users/fhh/bin/fstransform/sbin/fsremap'
fstransform: checking for fsck(source file-system)...   '/sbin/fsck'
fstransform: checking for fsck(target file-system)...   '/sbin/fsck'
fstransform: looking for optional commands
fstransform: checking for sleep...      '/usr/bin/sleep'
fstransform: checking for date...       '/usr/bin/date'
11:28:02 fstransform: environment check passed.
11:28:02 fstransform: saving output of this execution into /var/tmp/fstransform/fstransform.log.2745
11:28:02 fstransform: preparing to transform device '/dev/sdb1' to file-system type 'xfs'
11:28:02 fstransform: device '/dev/sdb1' not found in the output of command /bin/mount, assuming it is not mounted
11:28:02 fstransform: device is now mounted at '/tmp/fstransform.mount.2745' with file-system type 'ext3'
11:28:02 fstransform: device raw size = 31037833216 bytes
11:28:02 fstransform: creating sparse loop file '/tmp/fstransform.mount.2745/.fstransform.loop.2745' inside device '/dev/sdb1'...
11:28:02 dd: 1+0 records in
11:28:02 dd: 1+0 records out
11:28:02 dd: 1 byte (1 B) copied, 0.000850178 s, 1.2 kB/s
11:28:02 fstransform: device file-system block size = 4096 bytes
11:28:02 fstransform: device usable size = 31037833216 bytes
11:28:02 dd: 1+0 records in
11:28:02 dd: 1+0 records out
11:28:02 dd: 1 byte (1 B) copied, 0.000197441 s, 5.1 kB/s
11:28:02 fstransform: connected loop device '/dev/loop0' to file '/tmp/fstransform.mount.2745/.fstransform.loop.2745'
11:28:02 fstransform: formatting loop device '/dev/loop0' with file-system type 'xfs'...
11:28:03 fstransform: mounting loop device '/dev/loop0' on '/tmp/fstransform.loop.2745' ...
11:28:03 fstransform: loop device '/dev/loop0' mounted successfully.
11:28:03 fstransform: preliminary steps completed, now comes the delicate part:
11:28:03 fstransform: fstransform will move '/dev/sdb1' contents into the loop file.
 
11:28:03 fstransform: WARNING: THIS IS IMPORTANT! if either the original device '/dev/sdb1'
                      or the loop device '/dev/loop0' become FULL,
 
                       YOU  WILL  LOSE  YOUR  DATA !
 
                      fstransform checks for enough available space,
                      in any case it is recommended to open another terminal, type
                        watch df /dev/sdb1 /dev/loop0
                      and check that both the original device '/dev/sdb1'
                      and the loop device '/dev/loop0' are NOT becoming full.
                      if one of them is becoming full (or both),
                      you MUST stop fstransform with CTRL+C or equivalent.
 
11:28:03 fstransform: moving '/dev/sdb1' contents into the loop file.
11:28:03 fstransform: this may take a long time, please be patient...
11:28:07 fsmove: progress: 5.0% done,   1.9 gigabytes still to move
11:28:17 fsmove: progress: 10.0% done,   1.8 gigabytes still to move, estimated  2 minutes left
...
12:07:30 fstransform: running again '/sbin/fsck' (disk check) on device '/dev/sdb1'
12:07:30 fsck: fsck from util-linux 2.22.1
12:07:30 fsck: /sbin/fsck.xfs: XFS file system.
12:07:30 fstransform: completed successfully. device '/dev/sdb1' now contains 'xfs' file-system
 
real    39m28.095s
user    0m4.340s
sys     0m51.050s
[root@mafalda ~]# parted -l
...
Model: Verbatim STORE N GO (scsi)
Disk /dev/sdb: 31.0GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 
 
Number  Start   End     Size    Type     File system  Flags
 1      16.4kB  31.0GB  31.0GB  primary  xfs

Question performance, je vous laisse juger, mais au final, le résultat est là, les données sont toujours sur la clé.

Note : Si vous ne souhaitez pas avoir à confirmer la transformation, passez l’option « –no-questions » à « fstransfrom ».

En cas de plantage ?

En cas de problème pendant la conversion, tout n’est pas perdu. Si l’arrêt intervient pendant la phase « fsmove » relancer « fstransform » pour qu’il poursuive sa tâche.

Si l’arrêt intervient durant le « fsremap », l’état du job est stocké dans le répertoire « /var/tmp/fstransform/fsremap.job.<nombre> ». Vous pourrez reprendre le remaping directement en invoquant « fsremap » :

[root@mafalda ~]# fsremap --resume-job=<nombre> /dev/sdb1

Références

La page de fstransform sur sourceforge : http://fstransform.sourceforge.net/
fstranform Présenté dans Linux Magazine (en) : http://www.linux-magazine.com/Online/Features/Converting-Filesystems-with-Fstransform

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *