Archlinux, un live CD/USB non figé.

Il faut avoir lu le wiki pour créer un live d’Archlinux (ou savoir comment faire) pour suivre cet article.

AUFS est un système de fichier permettant d’unifier plusieurs répertoires en un seul, c’est une réécriture d’unionfs 1.x

Certains projets propres à Archlinux l’utilisent comme par exemple devtools (makechrootpkg qui permet de construire un paquet dans un chroot) ou encore archiso (création d’un live).

AUFS permet donc de fusionner plusieurs répertoires en un seul, la priorité étant donnée au premier dans la liste si deux fichiers portent le même nom; par défaut, le premier répertoire de la liste est en lecture/écriture et le reste est en lecture seule, tout ajout ou modification sont répercutés sur le premier répertoire.
Voyons voir un exemple en prenant l’arborescence suivante:

# tree
.
|-- a
|   |-- fichier_1
|   `-- fichier_2
|-- b
|   |-- fichier_1
|   `-- fichier_3
|-- c
`-- result

4 directories, 4 files
# more a/fichier_1 b/fichier_1 
::::::::::::::
a/fichier_1
::::::::::::::
1
::::::::::::::
b/fichier_1
::::::::::::::
2

Montons a/ et b/ dans result/:

mount -t aufs -o br:a=ro:b none result/

On le monte en lecture seule, ça nous donne comme résultat:

# tree result
result
|-- fichier_1
|-- fichier_2
`-- fichier_3

0 directories, 3 files
# cat result/fichier_1 
1

Ainsi, on se retrouve avec l’ensemble des fichiers et comme fichier_1 était en double, le premier répertoire (a/) a la priorité.

Maintenant, disons, qu’on veut modifier un élément, comme le répertoire est monté en lecture seule, on ne peut pas, il suffit pour y remédier de changer ou rajouter une branche en lecture/écriture:

# mount -t aufs -o remount,prepend:c none result/
# echo 4 > result/fichier_1
# umount result/
# cat c/fichier_1 
4
# cat a/fichier_1 
1
# cat b/fichier_1 
2

On a modifié le contenu de result/fichier_1, ce qui a laissé intact les fichiers du même nom sur a/ et b/ mais a créé un nouveau fichier dans la branche avec possibilité d’écriture : c/.

C’est exactement le même principe qui est appliqué au liveCD servant à l’installation d’Archlinux ou tout autre live construit avec archiso (en tout cas, jusqu’à cet instant), une partition tmpfs est monté en premier, ainsi, on peut écrire, les différentes couches composant le live sont montées par la suite.

Au cas où, on peut avoir des informations sur un répertoire monté avec AUFS dans /sys/fs/aufs/si_X:

# mount -l -t aufs
none on /tmp/aufs_test/result type aufs (rw,relatime,si=f55ed40b26bb76b5)
# cat /sys/fs/aufs/si_f55ed40b26bb76b5/br*
/tmp/aufs_test/c=rw
/tmp/aufs_test/a=ro
/tmp/aufs_test/b=ro

Partant de là et en supposant que vous avez lu le wiki pour créer un live d’Archlinux, créons un live qui ne sera pas figé et qu’on peut un minimum personnaliser.

Le principe est simple, il nous faut une partition indépendante qui fera office de couche lecture/écriture pour notre live, pour la détecter et l’utiliser, on va se baser sur la méthode de détection du support par le hook archiso, lors de la création du live, une étiquette est donnée à l’image iso créée et cette étiquette est fournie comme paramètre du noyau dans la configuration de isolinux:

append initrd=/boot/archiso.img  lang=fr locale=fr_FR.UTF-8 ramdisk_size=75% archisolabel=ARCH_201001

(par défaut, l’étiquette est ARCH_ + année + mois)

On choisit par exemple rootrw comme étiquette à donner à notre partition et le paramètre rootlabel pour le noyau.
Prenons le cas le plus simple, une clé usb reconnue en tant que /dev/sdb dont on va utiliser la première partition préalablement créée:

mkfs.ext2 -L rootrw /dev/sdb1

C’est censé être du live, ext2 est largement suffisant.

La détection et le montage de la racine se fait dans les hooks archiso-early et archiso, modifions un peu ces hooks pour détecter notre partition, le patch (par rapport à ce commit): archiso_rootrw.patch
Le patch peut sûrement être meilleur, mais là, en pleins dans les phases de tests, il fonctionne, c’est le principal.

Pour tester:

wget http://tuxce.no-ip.org/wp-content/uploads/2010/01/archiso-git-20100111-1.src.tar.gz
tar zxvf archiso-git-20100111-1.src.tar.gz
cd archiso-git
makepkg --skipinteg -i

Le PKGBUILD télécharge un snapshot d’archiso et ce dernier change le md5sum (une subtilité de cgit sûrement ou une histoire de timestamp, j’ai pas cherché), d’où le skipinteg.

Une fois cette version d’archiso installée, il nous faut modifier isolinux.cfg, recréer l’initrd et le .iso. En se basant sur le wiki, on rajoute les lignes suivantes à isolinux.cfg:

label perso
kernel /boot/vmlinuz26
append initrd=/boot/archiso.img  lang=fr locale=fr_FR.UTF-8 ramdisk_size=75% archisolabel=ARCH_201001 rootlabel=rootrw

On refait l’étape mkinitcpio puis on recrée l’image:

rm exemple.iso
mkarchiso iso traitement exemple.iso

On s’assure que la clé usb est insérée et on lance un qemu en démarrant sur l’entrée perso pour tester:

qemu-kvm -k fr -m 512 -hda exemple.iso -hdb /dev/sdb

Il n’y a plus qu’à faire des modifications et redémarrer l’image.

En théorie, le test devrait être concluant (en tout cas chez moi :)), mais ce qui serait mieux, c’est d’avoir le live et la partition de modification sur le même périphérique, en supposant que votre clé usb est reconnue en tant que /dev/sdb:

dd if=exemple.iso of=/dev/sdb
fdisk /dev/sdb << EOF
n
p
2


p
w
EOF
mkfs.ext2 -L rootrw /dev/sdb2

Ceci devrait être suffisant pour avoir un live pouvant être modifié.

Pour plus de détails n'hésitez pas à jeter un coup d'oeil aux scripts composant archiso, à mkarchroot (pour par exemple mettre à jour le live) ainsi qu'à man aufs