Je suis Charlie

Autres trucs

Accueil

Seulement les RFC

Seulement les fiches de lecture

Ève

mkisofs et plusieurs répertoires à mettre dans l'image ISO

Première rédaction de cet article le 26 janvier 2008


mkisofs est un excellent logiciel Unix pour créer des images ISO 9660 à partir d'un ou de plusieurs répertoires locaux, images qu'on peut ensuite graver sur CD ou DVD. Mais mkisofs a un défaut pénible : si on lui indique plusieurs répertoires sur la ligne de commande, il met tous les fichiers qu'ils contiennent ensemble, ce qui fait perdre le rangement, et ne marche pas si certains fichiers ont le même nom. Une solution possible est dans l'option -graft-points.

Cette option indique à mkisofs de garder la structure en répertoires. Avec cette option, mkisofs regarde le nom de chaque répertoire donné sur la ligne de commande, utilise le signe égal comme séparateur, et prend ce qui est à droite du séparateur comme nom local et ce qui est à gauche comme nom sur le futur CD. On écrit donc, si on veut sauvegarder /etc/X11 et /etc/network :

% mkisofs -r -o /var/tmp/image.iso -graft-points xorg/=/etc/X11 net/=/etc/network

Bien sûr, il n'est pas agréable de taper à la main de tels noms avec leur « = ». Mais on peut utiliser le shell pour les fabriquer. Nous nous servirons pour cela des techniques suivantes :

  • $(COMMANDE) qui insère le résultat la commande (comme le fait `COMMANDE` mais l'avantage de cette forme est de permettre d'emboîter plusieurs commandes).
  • eval qui permet de forcer l'évaluation d'une chaîne de caractères, ici contenant une variable.

Voici la commande qui crée les paramètres à la syntaxe qu'attend mkisofs (la liste des répertoires à sauvegarder est dans la variable DIRS qui vaut ici X11 network) :

% cd /etc
% for dir in $(eval ls -d $DIRS); do echo "$dir/=$(pwd)/$dir"; done
X11/=/etc/X11
network/=/etc/network

La commande complète, utilisant la boucle ci-dessus est (j'ai mis toutes les options que j'ajoute habituellement à mkisofs, mais seule -graft-points est importante ici) :

% cd /etc
% DIRS="X11 network"
% ISO=/var/tmp/backup.iso 
% mkisofs -A Backups -V Backups -publisher Stephane_Bortzmeyer \
	-p Stephane_Bortzmeyer -graft-points -iso-level=3 \
	-J -r -o $ISO \
	$(for dir in $(eval ls -d $DIRS); do echo "$dir/=$(pwd)/$dir"; done)

On utilise eval au lieu de simplement indiquer $DIRS car $DIRS peut contenir des caractères spéciaux du shell comme l'astérisque, qui sert de joker. eval est nécessaire pour qu'ils soient interprétés.

Version PDF de cette page (mais vous pouvez aussi imprimer depuis votre navigateur, il y a une feuille de style prévue pour cela)

Source XML de cette page (cette page est distribuée sous les termes de la licence GFDL)