RIM-Linux suite et fin
icone distribution
Signature :
GNU/Linux Magazine
Sommaire de l'article :

Retrouvez cet article dans : Linux Magazine 82

Dans un précédent numéro du magazine (80), un système GNU/Linux complet fonctionnant entièrement en mémoire a été construit. Cet article lui fait suite en détaillant l’installation d’applicatifs sur cette base.

1 Mon troisième RIM-Linux

1.1 Un peu de cosmétique : bootsplash

achez ces logs que je ne saurais voir ! Bootsplash est un patch cosmétique qui permet d’avoir un beau boot graphique avec une barre de progression. Bootsplash, c’est un patch, mais aussi des utilitaires que nous allons compiler, Bootsplash permet d’avoir des animations illustrant les différentes phases de boot, mais nous n’irons pas jusque-là, nous nous contenterons d’une barre de progression et de messages textes. Il nous faudra ajouter la bibliothèque libfreetype nécessaire à fbtruetype, l’utilitaire qui nous permet d’afficher ces messages.
tar xjf bootsplash-3.2.tar.bz2
cd Utilities
make
cp splash ../../rootbase/sbin
cp fbtruetype ../../rootbase/sbin
strip ../../rootbase/sbin/{splash,fbtruetype}
cp -d /usr/lib/libfreetype.so* rootbase/usr/lib
strip rootbase/usr/lib/libfreetype.so*
Pour pouvoir utiliser Bootsplash, il faut démarrer en mode framebuffer (paramètre vga=xxx; voyez la documentation du noyau pour les valeurs de paramètres à passer). Avec Bootsplash, on peut gérer le fait de booter en différentes résolutions. Dans notre cas nous nous limiterons au mode 800x600 16 bits qui présente l’avantage d’exister sur 99,9% des combinaisons ordinateurs+écran. Ce mode s’active avec l’option vga=788 que nous avons déjà placé dans notre isolinux.cfg. Bootsplash peut se placer dans deux modes différents : le mode silent où l’on masque la console en affichant une belle image et le mode verbose, où l’on affiche la console. Le mode de départ est déterminé par le paramètre splash=silent (ou verbose) dans les paramètres du noyau. Au cours de l’exécution des scripts de démarrage, on pourra passer de l’un à l’autre facilement via
echo "silent" > /proc/splash
et
echo "verbose" > /proc/splash
On utilise en général deux images, l’une pour le mode silent et une autre qui sert de fond d’écran pour le mode verbose. Tout cela est défini dans un fichier de configuration. Nous allons avoir besoin d’un thème. Sur le site allemand de Bootsplash [1], on trouvera les derniers patches, utilitaires et de nombreux thèmes. La documentation de Bootsplash n’est pas très fournie mais en examinant des exemples, on arrive à s’en sortir assez facilement. Le thème que nous allons utiliser (dans (chemin)/bootsplash/rimlinux) est composé simplement d’une belle photo JPEG et d’un fichier de configuration, on utilise la même image pour le mode silent et pour le mode verbose. Copions donc le contenu de notre thème dans notre rootbase :
cp -a ./Configuration/bootsplash ./rootbase/etc/
Afin que le kernel puisse afficher très tôt l’image silent, c’est-à-dire avant ses initialisations, l’utilitaire splash permet d’ajouter une ou plusieurs images à un initrd. Pour un initramfs, on procèdera de la façon suivante :
splash -s -f config-file > rootbase/bootsplash
Cela va créer un fichier bootsplash que le kernel saura traiter. Comme l’utilitaire splash prend comme argument le fichier de configuration contenant le chemin absolu vers l’image utilisée, le plus simple est de créer un lien symbolique sur votre système (on suppose que le répertoire /etc/bootsplash existe) :
cd rootbase/etc/bootsplash
ln -s $PWD/rimlinux /etc/bootsplash/rimlinux
De cette façon, l’instruction complète que nous ajouterons à notre script de création de l’iso sera :
./bootsplash-3.2/Utilities/splash -s -f \
 /etc/bootsplash/rimlinux/config/bootsplash-800x600.cfg > rootbase/bootsplash
On pourra utiliser le script fourni make_new_iso_bootsplash.sh . Mais un écran fixe pendant la séquence de boot, ce n’est pas terrible parce qu’on ne sait pas ce que fait le système, d’où la barre de progression. L’affichage de la barre de progression se fait de la façon suivante :
echo "show x" > /proc/splash
où x représente un entier compris entre 0 et 65534, c’est aussi simple que ça. On peut aussi afficher un texte avec une taille et une couleur donnée avec fbtruetype. En utilisant tous ces outils, on obtient les scripts fournis rcS-iso3 et setHardware-iso3.pl que l’on va recopier dans notre rootbase :
cp ./Configuration/rcS-iso3 rootbase/etc/init.d/rcS
cp ./Configuration/setHardware-iso3.pl rootbase/sbin/setHardware.pl
Nous modifierons également le fichier isolinux.config afin d’ajouter splash=silent dans les paramètres du noyau. On aura alors une belle séquence de boot graphique comme en figure 1. Au passage, l’arbre est un magnifique olivier centenaire poussant sous le soleil du Portugal chez ma belle-sœur... :-)

/img-articles/lm/82/art-10/fig-1.jpg Fig. 1 : Séquence de boot avec Bootsplash

1.2 Un script de configuration de plus : configHardware.pl

A la suite du script setHardware.pl qui détecte le matériel, nous allons lancer dans le rcS un autre script qui va effectuer quelques configurations :
  • Montage par subfs des CD-ROM/DVD et floppys
  • Montage en lecture seule des partitions locales si l’utilisateur en fait la demande.
  • Configuration d’interface réseau par DHCP si l’utilisateur en fait la demande.
  • Effacement des modules si l’utilisateur en fait la demande.
  • Montage automatique des CD et floppys
On examine le contenu de /proc/sys/dev/cdrom/info et on en ressort la liste des CD-ROM. On crée les points de montage et on monte par subfs :
# On obtient la liste des cds dans /proc/sys/dev/cdrom/info
@cdrominfo=`cat /proc/sys/dev/cdrom/info`;
chop @cdrominfo;
# La 3ème ligne contient
# drive name:             hda sdb  sdc etc
$tmp=$cdrominfo[2];
@liste_cdroms=split(/[\s\t]+/,$cdrominfo[2]);
shift @liste_cdroms; # drive
shift @liste_cdroms; # name:
foreach (@liste_cdroms)
 {
 #Create the mount point
 system("mkdir -p /localmounts/cd/$_");
 # Mount with subfs
 system("mount /dev/$_ -t subfs /localmounts/cd/$_ -o fs=cdfss,ro");
 }
Pour les floppys, on fait à peu près le même travail, mais on en obtient la liste en examinant /dev/fdx :
# Pour les floppys on regarde /dev/fdx
# Ca ne marche pas avec les floppys usb -> TODO
@liste_flop=`cd /dev ; ls fd*`;
chop @liste_flop;
foreach (@liste_flop)
 {
 #Create the mount point
 system("mkdir -p /localmounts/fd/$_");
 # Mount with subfs
 system("mount /dev/$_ -t subfs /localmounts/fd/$_ -o fs=floppyfss,rw");
 }
  • Montage automatique des partitions locales
Si l’utilisateur passe localmount=yes, on monte les partitions locales en lecture seule, libre ensuite à l’utilisateur de les remonter en lecture/écriture. On cherche les partitions dans /proc/partitions, on élimine les périphériques loop (c’est pour plus tard...), on crée les points de montage et on monte :
#
# Montage des partitions locales en lecture seule
# on obtient la liste des partitions dans /proc/partitions
@listepart=`cat /proc/partitions`;
chop @listepart;
# parse the list
# take away first two lines
shift @listepart;
shift @listepart;
foreach (@listepart)
 {
 ($nothing,$major,$minor,$size,$name)=split(/[\s\t]+/,$_);

 if ( ($name =~/\d$/) && !( $name=~/^loop/) ) # This is a partition
  {
  # Create mountpoint
  system("mkdir -p /localmounts/discs/$name");
  # Mounting
  system("mount /dev/$name /localmounts/discs/$name -o ro");
  }
 }
A noter que l’utilisateur peut lancer localmount.pl a posteriori pour monter les partitions.
  • Configuration réseau
Si l’utilisateur passe ethx=dhcp sur la ligne de commande du kernel, on tente de configurer cette interface par DHCP avec le client DHCP udhcpc :
udhcpc -i eth0
Je n’ai pas fait d’interface de configuration réseau. Il faudra donc le faire à la main mais ce n’est pas très compliqué. Par exemple, on veut configurer eth0 avec l’adresse 192.168.0.145, masque 255.255.255.0, la passerelle par défaut est 192.168.0.253 et le DNS est 192.168.0.252 :
ifconfig eth0 192.168.0.145 netmask 255.255.255.0
route add default gw 192.168.0.253
echo “nameserver 192.168.0.252” > /etc/resolv.conf
  • Effacement des modules
Si l’utilisateur passe keepmods=no, on efface le répertoire des modules du noyau, cela permet de gagner de la place dans les environnements à faible mémoire. Par contre, tout ce qui est hotplug et qui n’a pas encore été détecté ne fonctionnera pas.
  • En résumé
En résumé, on va copier les scripts fournis localmount.pl et configHardware.pl :
cp ./Configuration/configHardware.pl ./rootbase/sbin
cp ./Configuration/localmount.pl ./rootbase/sbin

1.3 Montage de partages NFS

Afin de pouvoir monter des partages NFS, il faut lancer le programme portmap que nous allons copier depuis notre distribution (il sera lancé par rcS) :
cp /sbin/portmap rootbase/sbin/portmap
strip rootbase/sbin/portmap
On pourra ensuite monter les partages NFS. Pour monter par exemple machine1:/partage, on va créer un point de montage, par exemple /localmounts/nfs/machine1/partage et exécuter :
mount machine1:/partage -t nfs /localmounts/nfs/machine1/partage

1.4 Montage de partages Windows avec samba

Pour les partages samba [2], nous allons avoir besoin de smbmount. Le problème est qu’en général, smbmount est lié à beaucoup trop de bibliothèques pour être copié tel quel dans notre RIM-Linux. Par exemple, sur ma SuSE 9.3, un ldd sur smbmount donne :
ldd /usr/bin/smbmount
[...]
 libkrb5support.so.0 => /usr/lib/libkrb5support.so.0 (0x4014a000)
 libldap-2.2.so.7 => /usr/lib/libldap-2.2.so.7 (0x40150000)
[...]
On voit que samba a été compilé avec un support LDAP, un support kerberos. C’est vraiment trop pour nous qui souhaitons faire des montages simples de partages Windows... Eh oui, on est bon pour recompiler !
tar xzf samba-3.0.20b.tar.gz
cd samba-3.0.20b/source
./configure --without-ldap --without-winbind --without-utmp \
--without-sys-quota --with-smbmount --disable-cups
make
cp bin/{smbmnt,smbmount} ../../rootbase/usr/bin/
strip ../../rootbase/usr/bin/{smbmnt,smbmount}
Un ldd sur le smbmount nouvellement compilé donne quelque chose qui est beaucoup mieux, puisque nous n’aurons pas à rajouter de bibliothèques. Si on veut monter //machine1/partage avec comme login alfred et comme mot de passe alfred25, on créera d’abord un point de montage, par exemple /localmounts/smb/machine1/partage et on exécutera :
smbmount //machine1/partage /localmounts/smb/machine1/partage \
     -o username=alfred,password=alfred25

1.5 Un serveur XXX

1.5.1 Xserver : Buildit

Lorsque Keith Packard était encore dans le groupe XFree86, il avait développé Kdrive une version de X compacte, peu consommatrice en mémoire et ne nécessitant aucun fichier de configuration ni polices annexes pour démarrer. Compiler Kdrive était un peu pénible. Il fallait télécharger les sources de XFree86, modifier quelques fichiers de configuration après quelques heures laborieuses de recherche de documentation. Lors du changement de licence de XFree86, Keith Packard est parti en emmenant Kdrive dans son sac et c’est devenu le projet Xserver de freedesktop.org [3]. Xserver a été grandement amélioré par rapport au Kdrive de XFree86-4.2 que j’avais utilisé dans Womp. Il gère plus d’extensions, les polices TrueType avec l’extension Render, la transparence avec l’extension Composite, etc. Une grande amélioration est qu’il utilise les gnu autotools. Plus besoin de xmkmf et compagnie. Il n’y a pas de package téléchargeable, il faut utiliser le CVS. On trouve sur le site un script permettant d’automatiser la construction du serveur (http://www.freedesktop.org/wiki/XserverBuildScript). Je fournis néanmoins un tarball du CVS au 17 octobre 2005. On pourra l’utiliser ou préférer la version CVS. On trouvera dans ce tarball le script original XserverBuildScript et deux scripts séparant les deux fonctions du premier, à savoir obtenir les sources d’une part (Getsources) et les compiler (Buildit) d’autre part. Le script Buildit (de même que l’original XserverBuildScript) utilise sudo qui vous permet de compiler en tant qu’utilisateur normal. Si vous ne voulez pas utiliser sudo, éditez le fichier Buildit, supprimez tous les sudo et compilez en root. A noter un petit problème dans les noms de packages, résolu par la création de liens symboliques dans Buildit. L’installation se fera dans le répertoire /opt/fdo :
tar xzf Xserver-cvs-17-10-2005.tar.gz
cd Xserver-cvs-17-10-2005
./Buildit
La compilation est relativement longue... Go take a coffee. Une fois terminée, nous avons dans /opt/fdo/bin plusieurs serveurs. Nous allons utiliser uniquement le driver Xvesa qui fonctionnera avec le plus de matériels différents. Il possède une option -shadow qui accélère son fonctionnement et le rend utilisable même à de très hautes résolutions (je m’en suis servi en 1400x1050 avec confort). Nous allons donc recopier le serveur et les bibliothèques créés dans notre rootbase. Nous copions également la bibliothèque libz de notre distribution nécessaire au serveur X et créons un lien de /usr/X11R6/lib/X11 vers /usr/lib/X11, le serveur cherchant ses polices dans /usr/lib/X11/fonts. Les informations de locale seront prises par contre dans l’installation locale de Xorg. Certains fichiers étant manquants dans l’installation que nous venons de faire.
mkdir -p rootbase/usr/X11R6/lib/X11/locale
mkdir -p rootbase/usr/X11R6/lib/X11/fonts
ln -s ../X11R6/lib/X11 rootbase/usr/lib/X11
mkdir -p rootbase/usr/X11R6/bin
cp /opt/fdo/bin/Xvesa rootbase/usr/X11R6/bin
strip rootbase/usr/X11R6/bin/Xvesa
cp -d /opt/fdo/lib/*.so* rootbase/usr/X11R6/lib
strip rootbase/usr/X11R6/lib/*
cp /opt/fdo/share/X11/XErrorDB rootbase/usr/X11R6/lib/X11
cp /opt/fdo/share/X11/XKeysymDB rootbase/usr/X11R6/lib/X11
cp -a /usr/X11R6/lib/X11/locale/{C,iso8859-1} \
 rootbase/usr/X11R6/lib/X11/locale
cp /usr/X11R6/lib/X11/locale/{compose.dir,locale.dir,locale.alias} \
 rootbase/usr/X11R6/lib/X11/locale
cp -d /lib/libz.so* rootbase/lib
strip rootbase/lib/libz.so*
On pourra aussi copier xcompmgr (composite manager) pour jouer avec. On copiera aussi une petite sélection de polices, bien que sous certaines conditions, du moins en local, le serveur puisse fonctionner sans. Il est nécessaire d’en avoir quelques-unes en mode terminal.
cd rootbase/usr/X11R6/lib/X11/fonts
tar xzf (chemin)/x11-fonts.tgz
Au final, nous avons maintenant une installation de X qui prend... 3,1 Mo !

1.5.2 Xserver : Use it

Nous allons décrire sommairement le fonctionnement de ce serveur X. Au préalable, en lançant le serveur avec l’option -listmodes, nous allons obtenir la liste des modes VESA disponibles. Notez que les modes affichés ne présupposent rien sur l’écran. Ce n’est pas parce que la carte sait faire du 1280x1024x16 que l’écran saura le faire. Voici un type de sortie obtenu :
VBE version 3.0 (NVIDIA)
DAC is fixed, controller is VGA compatible, RAMDAC causes snow
Total memory: 32768 kilobytes
[...]
0x0115: 800x600x24 TrueColor [8:8:8:8]
0x0117: 1024x768x16 TrueColor [5:6:5:0]
0x0118: 1024x768x24 TrueColor [8:8:8:8]
[...]
Attention ! Les modes affichés dépendent de la carte vidéo. Ce n’est pas parce que dans cet exemple 0x0117 représente le mode 1024x768 16 bits qu’il en sera de même avec une autre carte, il est nécessaire d’effectuer cette opération de listage des modes. Ensuite on lance le serveur en lui spécifiant le mode à utiliser :
Xvesa -mode 0x0117
Si on a sur le réseau une machine acceptant les connexions Xdmcp(1), on peut d’ores et déjà se servir de notre RIM-Linux tel quel en tant que Terminal X en tapant :

(1) Il faut qu’un gestionnaire de connexion fonctionne, par exemple xdm,kdm ou gdm. Dans les distributions modernes, l’écoute des connexions distantes est souvent désactivé par défaut, l’activer est plus ou moins facile suivant la distribution. Pour kdm, le fichier kdmrc doit contenir Enable=true dans le groupe [Xdmcp].

Xvesa -mode 0x0117 -query machine
On obtiendra alors l’écran de connexion de la machine en question. Les autres arguments qui vont nous intéresser sont -ac qui équivaut à effectuer un xhost + préalable, -shadow qui accélère le fonctionnement du serveur X, et -mouse qui permet de spécifier le périphérique de la souris avec en option, le nombre de boutons, la molette étant prise en compte en spécifiant 5 boutons :
Xvesa -ac -mode 0x0117 -shadow -mouse /dev/input/mice,5 -query machine

1.6 Gestionnaire de fenêtre : Boîte noire

Pour une utilisation en local et non en terminal X, il va nous falloir un gestionnaire de fenêtres. Il existe des gestionnaires de fenêtre très compacts et néanmoins fonctionnels. Parmi eux citons : swm [4], windowlab [5] et blackbox [6]. Les deux premiers sont très petits, moins de 100 ko ! On les utilisera pour des applications très contraintes en taille mémoire. Pour cet exemple, j’ai préféré utiliser blackbox qui allie une taille raisonnable et des fonctionnalités confortables. Nous utilisons dans la suite une méthode très simple permettant de faire des pseudo-packages, consistant à installer dans un répertoire /usr/local vide. Ce n’est pas forcément très élégant mais c’est pratique. On aurait pu aussi préférer utiliser la forme make DESTDIR=/some/where install lors de l’installation, mais il faut packager de toute façon après.
tar xjf blackbox-0.70.0.tar.bz2
cd blackbox-0.70.0
./configure
make
mv /usr/local /usr/local.sav
mkdir /usr/local
make install
mv /usr/local /usr/local.blackbox
mv /usr/local.sav /usr/local
Un ldd sur notre blackbox nous indique les bibliothèques que nous allons devoir ajouter. Il nous manque :
libstdc++.so.5
libXft.so.2
libfontconfig.so.1
libexpat.so.0
libgcc_s.so.1
Nous voyons que blackbox utilise le package fontconfig, un package dont le but est de centraliser la configuration des polices (et entre autres les polices TrueType) et dont l’auteur n’est autre que... Keith Packard. Nous allons utiliser l’installation locale de fontconfig et ajouter un répertoire de polices TrueType au même endroit que sur la distribution locale. On peut y mettre les polices qu’on veut mais attention à ne pas abuser, car cela prend de la place. Pour ma part, j’y mets les polices luxi* fournies avec Xorg. Cela prend moins d’un Mo.
cp -a /etc/fonts rootbase/etc
cp /usr/bin/{fc-cache,fc-list,fc-match} rootbase/usr/bin
strip rootbase/usr/bin/{fc-cache,fc-list,fc-match}
cp -d /usr/lib/libfontconfig.so* rootbase/usr/lib
strip rootbase/usr/lib/libfontconfig.so*
mkdir rootbase/usr/X11R6/lib/X11/fonts/truetype
cp /usr/X11R6/lib/X11/fonts/truetype/luxi*.ttf rootbase/usr/X11R6/lib/X11/fonts/truetype
Copions maintenant les autres bibliothèques et blackbox lui-même.
cp -d /usr/lib/libstdc++.so.5* rootbase/usr/lib
strip rootbase/usr/lib/libstdc++.so.5*
cp -d /usr/X11R6/lib/libXft.so.2* rootbase/usr/X11R6/lib
strip rootbase/usr/X11R6/lib/libXft.so.2*
cp -d /usr/lib/libexpat.so* rootbase/usr/lib
strip rootbase/usr/lib/libexpat.so*
cp /lib/libgcc_s.so.1 rootbase/lib
strip rootbase/lib/libgcc_s.so.1
mkdir -p rootbase/usr/local/share
cp -a /usr/local.blackbox/share/blackbox rootbase/usr/local/share
mkdir -p rootbase/usr/local/bin
cp /usr/local.blackbox/bin/{blackbox,bsetroot} rootbase/usr/local/bin
strip rootbase/usr/local/bin/{blackbox,bsetroot}
On pourra personnifier le menu de blackbox dans rootbase/usr/local/share/blackbox/menu. Copiez le fichier fourni menu.blackbox.
cp ./Configuration/menu.blackbox rootbase/usr/local/share/blackbox/menu

1.7 Emulateur de terminal : rxvt-unicode

Toujours pour travailler en local, il nous faut un émulateur de terminal. On peut en recopier un depuis sa distribution ou en recompiler un, ce que je propose ici avec rxvt-unicode [7], mon préféré :
tar xjf rxvt-unicode-5.7.tar.bz2
cd rxvt-unicode-5.7
./configure --enable-rxvt-scroll --enable-mousewheel \
--with-name=rxvt --enable-xim --with-term=xterm \
--with-res-name=rxvt --with-res-class=Rxvt
make
cp src/rxvt ../rootbase/usr/bin
strip ../rootbase/usr/bin/rxvt

1.8 Midnight Commander : un gestionnaire de fichiers en mode texte

Gnu Midnight Commander [9] est un gestionnaire de fichier en mode texte très performant, qui sera très utile pour effectuer des copies/transferts de fichiers sur les partitions locales, CD et montages réseau. Il comporte entre autres fonctionnalités un pager (mcview) et un éditeur de texte (mcedit)(2). (2) Petite remarque concernant la distribution Suse : quand on fait un su, /opt/gnome/bin et /opt/kde3/bin ne sont pas dans le PATH, or configure a besoin par exemple pour gtk d’accéder à gtk-config. Si on veut faire le configure en root, il faut au préalable faire "export PATH=/opt/gnome/bin:/opt/kde3/bin:$PATH ou bien alors travailler carrément connecté en root.
tar xzf mc-4.6.1.tar.gz
cd mc-4.6.1
./configure --with-screen=ncurses --with-glib12 \
--without-ext2undel \
--without-gpm-mouse
make
mv /usr/local /usr/local.sav
mkdir /usr/local
make install
mv /usr/local /usr/local.mc
mv /usr/local.sav /usr/local
Intégrons mc dans notre rootbase en épurant un peu, notamment les fichiers de locale :
cp -d /usr/local.mc/bin/{mc,mcedit,mcview,mcmfmt} rootbase/usr/local/bin
strip rootbase/usr/local/bin/{mc,mcmfmt}
cp -a /usr/local.mc/lib/mc rootbase/usr/local/lib
strip rootbase/usr/local/lib/mc/cons.saver
cp -a /usr/local.mc/share/mc rootbase/usr/local/share
rm rootbase/usr/local/share/mc/mc.hlp.*
rm rootbase/usr/local/share/mc/mc.menu.sr
rm rootbase/usr/local/share/mc/mc.hint.*
mkdir -p rootbase/usr/local/share/locale/fr/LC_MESSAGES
cp /usr/local.mc/share/locale/fr/LC_MESSAGES/mc.mo rootbase/usr/local/share/locale/fr/LC_MESSAGES
Nous avons également besoin de la Glib 1.2 (libglib,libgmodule,libgthread) que nous prenons dans la distribution locale.
mkdir -p rootbase/opt/gnome/lib
cp -d /opt/gnome/lib/libglib-1.2.so* rootbase/opt/gnome/lib
strip rootbase/opt/gnome/lib/libglib-1.2.so*
cp -d /opt/gnome/lib/libgmodule-1.2.so* rootbase/opt/gnome/lib
strip rootbase/opt/gnome/lib/libgmodule-1.2.so*
cp -d /opt/gnome/lib/libgthread-1.2.so* rootbase/opt/gnome/lib
strip rootbase/opt/gnome/lib/libgthread-1.2.so*

1.9 Serveurs de son

Pour utiliser notre RIM-Linux en tant que terminal X avec le maximum de confort, il est intéressant de pouvoir rediriger le son vers notre terminal, de la même façon que l’on redirige l’affichage. Il n’y a malheureusement pas de méthode aussi standard que X pour effectuer cela. Il existe principalement 3 serveurs de son permettant cela :
  • artsd le serveur de son de KDE [10].
  • esd le serveur de son de Enlightement et Gnome [11].
  • nasd un serveur de son à vocation générale [12].
Nous allons installer ces trois serveurs dans notre RIM-Linux afin de laisser le choix.

1.9.1 artsd

artsd est maintenant complètement intégré à KDE, mais il existe une version stand-alone que nous allons utiliser. Pour pouvoir compiler (du moins avec l’emplacement des headers de la glib sur ma distribution), il faut modifier le fichier arts/gmcop/giomanager.h en remplaçant la ligne :
#include <gmain.h>
par
#include <glib/gmain.h>
La compilation se fait ensuite classiquement :
cd arts-0.5.4
./configure
make
mv /usr/local /usr/local.sav
mkdir /usr/local
make install
mv /usr/local /usr/local.arts
mv /usr/local.sav /usr/local
Il ne reste plus qu’à l’intégrer dans notre rootbase :
cp /usr/local.arts/bin/artsd rootbase/usr/local/bin
strip rootbase/usr/local/bin/artsd
mkdir -p rootbase/usr/local/lib
cp -d /usr/local.arts/lib/libsoundserver_idl.so* rootbase/usr/local/lib
cp -d /usr/local.arts/lib/libkmedia2_idl.so* rootbase/usr/local/lib
cp -d /usr/local.arts/lib/libartsflow.so* rootbase/usr/local/lib
cp -d /usr/local.arts/lib/libartsflow_idl.so* rootbase/usr/local/lib
cp -d /usr/local.arts/lib/libmcop_mt.so* rootbase/usr/local/lib
cp -d /usr/local.arts/lib/libmcop.so* rootbase/usr/local/lib
cp -d /usr/local.arts/lib/libartsc.so* rootbase/usr/local/lib
cp -d /usr/local.arts/lib/libartscbackend.* rootbase/usr/local/lib
strip rootbase/usr/local/lib/*
cp -a /usr/local.arts/lib/mcop rootbase/usr/local/lib
Il nous faut aussi copier libaudiofile de notre distribution :
cp -d /usr/lib/libaudiofile.so* rootbase/usr/lib
strip rootbase/usr/lib/libaudiofile.so*
Sur le terminal X (c’est-à-dire le RIM-Linux), on va lancer artsd de la façon suivante :
artsd -n -u -p 16000
Sur la machine distante, on va définir la variable d’environnement ARTS_SERVER sur <IP du terminal>:16000, par exemple si l’IP de notre RIM-Linux est 192.168.0.192 :
export ARTS_SERVER=192.168.0.192:16000
Les applications utilisant arts (Xmms ou Mplayer par exemple) comme sortie se connecteront au serveur artsd sur le RIM-Linux.

1.9.2 esd

La compilation se fait classiquement.
tar xjf esound-0.2.36.tar.bz2
cd esound-0.2.36
./configure
make
mv /usr/local /usr/local.sav
mkdir /usr/local
make install
mv /usr/local /usr/local.esd
mv /usr/local.sav /usr/local
On copie dans notre rootbase :
cp /usr/local.esd/bin/esd rootbase/usr/local/bin
strip rootbase/usr/local/bin/esd
cp -d /usr/local.esd/lib/libesd.so* rootbase/usr/local/lib
strip rootbase/usr/local/lib/libesd.so*
Sur le terminal X (c’est-à-dire le RIM-Linux), on va lancer esd de la façon suivante (notre esd ne fonctionne qu’avec alsa, bien qu’il soit censé fonctionner également avec OSS).
esd -public -tcp -port 16001
Sur la machine distante, on va définir la variable d’environnement ESPEAKER sur <IP du terminal>:16001, par exemple si l’IP de notre RIM-Linux est 192.168.0.192 :
export ESPEAKER=192.168.0.192:16001
Les applications utilisant esd (Xmms ou Mplayer par exemple) comme sortie se connecteront au serveur esd sur le RIM-Linux.

1.9.3 nasd

nas se compile un peu différemment. Il n’utilise pas les autotools, mais le système d’auto-configuration de X11 bien que n’utilisant absolument pas X.
tar xzf nas-1.7.src.tar.gz
cd nas-1.7
xmkmf
make World
Si vous souhaitez compiler des applications avec le support natif nas, il faudra installer nas sur votre système en tapant make install. Personnellement, je me suis fait un RPM pour nas (à ce propos, il existe un utilitaire qui s’appelle checkinstall [8] qui vous crée un RPM en interceptant les appels d’un make install). Copions donc nasd dans notre rootbase :
cd nas-1.7
cp server/nasd ../rootbase/usr/X11R6/bin
strip ../rootbase/usr/X11R6/bin/nasd
mkdir ../rootbase/etc/nas
cp server/nasd.conf.eg ../rootbase/etc/nas/nasd.conf
cp -d lib/audio/libaudio.so* ../rootbase/usr/X11R6/lib
strip ../rootbase/usr/X11R6/lib/libaudio.so*
Sur le terminal X (c’est-à-dire le RIM-Linux), on va lancer nasd de la façon suivante :
nasd :0 -aa -b
Le port utilisé est spécifié avec un offset de 8000, :0 correspond à 8000, :1 à 8001 etc. Sur la machine distante, on va définir la variable d’environnement AUDIOSERVER sur <IP du terminal>:0, par exemple si l’IP de notre RIM-Linux est 192.168.0.192 :
export AUDIOSERVER=192.168.0.192:0
Si l’application a le support natif nas (mais il y en a assez peu), ce sera la même chose que précédemment. Par contre, pour les autres applications, il faudra utiliser une bibliothèque supplémentaire qui redirige le son oss sur nas (pour arts et esd, ce sont des programmes séparés artsdsp et esddsp qui effectuent cette opération). Du côté de la machine distante, il nous faudra compiler et installer audiooss :
tar xzf audiooss-1.0.0.tar.gz
cd audiooss-1.0.0
xmkmf
make
make install
Avant de lancer une application son, il faudra positionner la variable d’environnement LD_PRELOAD sur la bibliothèque installée :
export LD_PRELOAD=/usr/X11R6/lib/libaudiooss.so.1.0:$LD_PRELOAD
Ca ne fonctionne pas avec toutes les applications son, mais ça fonctionne entre autres avec Xmms utilisant oss comme pilote de sortie.

1.10 Navigateur grand luxe : Firefox

Pour l’installation de Firefox [13], nous allons utiliser simplement l’installateur de Firefox et l’installer directement dans notre rootbase/usr/local, comme l’installation ne hardcode pas dans les fichiers l’emplacement de l’installation, cela ne pose pas de problèmes. On pourra aussi simplement recopier une installation locale faite à partir du tarball.
tar xzf firefox-1.0.7.installer.tar.gz
cd firefox-installer
./firefox-installer
Suivre les instructions habituelles en choisissant rootbase/usr/local/firefox comme répertoire d’installation. Choisissez l’installation personnalisée et désélectionnez Agent de rapport de qualité. Comme nous l’apprend un ldd sur firefox-bin (les bibliothèques marquées not found sont les bibliothèques incluses dans l’installation de Firefox, le script de démarrage repositionnant LD_LIBRARY_PATH). Il va nous falloir ajouter pas mal de choses pour que Firefox puisse fonctionner, dont les bibliothèques Gtk2, Atk, Pango et Glib2. Ces bibliothèques désignées par ldd et fichiers de configurations associés vont être pris dans notre distribution.
gtk2 :
/etc/opt/gnome/gtk-2.0
/etc/opt/gnome/gtk-2.0/gdk-pixbuf.loaders
/etc/opt/gnome/gtk-2.0/gtk.immodules
/opt/gnome/bin/gdk-pixbuf-query-loaders
/opt/gnome/bin/gtk-query-immodules-2.0
/opt/gnome/bin/gtk-update-icon-cache
/opt/gnome/share/locale/fr
/opt/gnome/share/locale/fr/LC_MESSAGES
/opt/gnome/share/locale/fr/LC_MESSAGES/gtk20-properties.mo
/opt/gnome/share/locale/fr/LC_MESSAGES/gtk20.mo
atk :
/opt/gnome/share/locale/fr
/opt/gnome/share/locale/fr/LC_MESSAGES
/opt/gnome/share/locale/fr/LC_MESSAGES/atk10.mo
glib2 :
/opt/gnome/share/locale/fr
/opt/gnome/share/locale/fr/LC_MESSAGES
/opt/gnome/share/locale/fr/LC_MESSAGES/glib20.mo
pango :
/etc/opt/gnome/pango
/etc/opt/gnome/pango/pango.modules
/etc/opt/gnome/pango/pangox.aliases
/opt/gnome/bin/pango-querymodules
bibliothèques X11 :
/usr/X11R6/lib/libXt.so.6
/usr/X11R6/lib/libXp.so.6
/usr/X11R6/lib/libXi.so.6
/usr/X11R6/lib/libXinerama.so.1
/usr/X11R6/lib/libXfixes.so.3
/usr/X11R6/lib/libXcursor.so.1
/usr/X11R6/lib/libSM.so.6
/usr/X11R6/lib/libICE.so.6
Je ne détaille pas toutes les opérations de copie et strip, qui ne devraient pas poser de problèmes. On copie les répertoires entiers avec cp -a, et les fichiers avec cp -d pour conserver les liens symboliques, et on strippe les binaires et les bibliothèques.
On créera également un lien symbolique dans rootbase/usr/local/bin :
cd rootbase/usr/local/bin
ln -s ../firefox/firefox
On pourra aussi ajouter par exemple le plugin Flash composé des fichiers flashplayer.xpt et libflashplayer.so dans le répertoire plugin de Firefox. Attention toutefois ! Il y a un bug soit dans Flash soit dans le serveur X. Flash fait planter Firefox dans les modes 16 bits du serveur X. Pour utiliser Flash, il faut être en 24 bits.

1.11 Multimédia : MPlayer

Mplayer [14] est un des meilleurs lecteurs multimédias sous Linux. Il est capable de lire à peu près tous les fichiers multimédias existants, dont une grande part sans l’ajout de fichiers de codecs supplémentaires. Codecs supplémentaires éventuels qu’il suffit de placer dans /usr/lib/codecs.
tar xjf MPlayer-1.0pre7try2.tar.bz2
cd MPlayer-1.0pre7try2
./configure --enable-gui --enable-largefiles --disable-lirc \
--disable-lircc --disable-tv --disable-live --disable-sdl \
--enable-runtime-cpudetection --disable-aa --disable-caca \
--disable-jpeg --disable-gif --disable-gl --disable-pnm \
--disable-dga --disable-tga --disable-mga \
--disable-directfb --disable-xv
make
mv /usr/local /usr/local.sav
mkdir /usr/local
make install
mv /usr/local /usr/local.mplayer
mv /usr/local.sav /usr/local
Un ldd sur Mplayer va nous permettre d’identifier les bibliothèques qui nous manquent. Copions donc celles-ci :
cp -d /usr/lib/libmad.so* rootbase/usr/lib
cp -d /usr/lib/libdv.so* rootbase/usr/lib
cp -d /usr/lib/libtheora.so* rootbase/usr/lib
cp -d /usr/lib/libogg.so* rootbase/usr/lib
cp -d /usr/lib/liblzo.so* rootbase/usr/lib
cp -d /usr/lib/libdivxdecore.so* rootbase/usr/lib
cp -d /usr/lib/libmp3lame.so* rootbase/usr/lib
cp -d /usr/lib/libxvidcore.so* rootbase/usr/lib
cp -d /usr/lib/libpng.so* rootbase/usr/lib
cp -d /usr/lib/libcdda_interface.so* rootbase/usr/lib
cp -d /usr/lib/libcdda_paranoia.so* rootbase/usr/lib
strip rootbase/usr/lib/*
cp -d /opt/gnome/lib/libgdk-1.2.so* rootbase/opt/gnome/lib
cp -d /opt/gnome/lib/libgtk-1.2.so* rootbase/opt/gnome/lib
strip rootbase/opt/gnome/lib/*
cp -d /usr/X11R6/lib/libXxf86vm.so* rootbase/usr/X11R6/lib
strip rootbase/usr/X11R6/lib/libXxf86vm.so*
Puis l’installation de Mplayer :
cp -d /usr/local.mplayer/bin/{mplayer,gmplayer} rootbase/usr/local/bin
strip rootbase/usr/local/bin/mplayer
cp -a /usr/local.mplayer/lib/mplayer rootbase/usr/local/lib
strip rootbase/usr/local/lib/mplayer/vidix/*
mkdir -p rootbase/usr/local/share/mplayer/Skin
mkdir -p rootbase/usr/local/share/mplayer/font
mkdir -p rootbase/etc/mplayer
cd rootbase/usr/local/share/mplayer
ln -s ../../../X11R6/lib/X11/fonts/truetype/luximb.ttf subfont.ttf
Nous aurons également besoin d’un revêtement. Nous utiliserons Blue-1.4.tar.bz2 qui est le revêtement par défaut de MPlayer.
cd rootbase/usr/local/share/mplayer/Skin
tar xjf ../../../../../../Blue-1.4.tar.bz2
mv Blue default

1.12 Bonus : mplayerplug-in

Mplayerplug-in [15] est un excellent plugin pour mozilla/netscape/firefox, qui intègre Mplayer dans le navigateur pour visualiser tous les fichiers que sait lire Mplayer.
tar xzf mplayerplug-in-3.11.tar.gz
cd mplayerplug-in
./configure
make
strip *.so
cp *.so ../rootbase/usr/local/firefox/plugins/
cp *.xpt ../rootbase/usr/local/firefox/plugins/
Mplayerplug-in est de plus assez intelligent dans la gestion du son, puisqu’il teste la présence de différents serveurs de son, dans l’ordre : artsd, esd puis se rabat sur OSS.

1.13 Touche finale

Le script fourni, startx.pl, permet de simplifier le lancement de X. Il commence par proposer une liste de modes ordonnés par profondeur et par taille, puis demande si on veut travailler en terminal X ou en local. Si on travaille en terminal X, il propose de lancer un serveur de son puis demande le nom ou l’IP de la machine distante. Si on travaille en local, il lance le serveur X puis le gestionnaire de fenêtres.
cp ./Configuration/startx.pl rootbase/usr/X11R6/bin
mixer.pl est un script tout simple qui lance alsamixer si le son est configuré avec alsa et lance rexima sinon.
cp ./Configuration/mixer.pl rootbase/usr/bin
J’ai ajouté également Vncviewer, dont je me sers assez souvent, directement de ma distribution ainsi que les bibliothèques supplémentaires nécessaires.
cp /usr/X11R6/bin/vncviewer rootbase/usr/X11R6/bin
strip rootbase/usr/X11R6/bin/vncviewer
cp -d /usr/X11R6/lib/libXaw.so.8* rootbase/usr/X11R6/lib
cp -d /usr/X11R6/lib/libXmu.so* rootbase/usr/X11R6/lib
cp -d /usr/X11R6/lib/libXpm.so* rootbase/usr/X11R6/lib
cp -d /usr/lib/libjpeg.so.62* rootbase/usr/lib
strip rootbase/usr/X11R6/lib/libXaw.so.8*
strip rootbase/usr/X11R6/lib/libXmu.so*
strip rootbase/usr/X11R6/lib/libXpm.so*
strip rootbase/usr/lib/libjpeg.so.62*

1.14 Création de l’iso

Encore un peu de cosmétique avec Isolinux. Lorsque l’on boote, on a un écran noir avec un prompt boot: ce qui n’est pas très plaisant quand on s’est embêté à configurer un beau Bootsplash pour la suite. Nous allons donc voir comment ajouter une image dès l’amorçage d’Isolinux. Avec The Gimp, nous allons éditer une image que l’on souhaite faire apparaître au démarrage. Pour notre exemple, il s’agit encore de la photo de l’olivier avec un texte ajouté : F1 : Help. Tout d’abord, nous allons la redimensionner en 640x480 ou plutôt à peine plus petit pour laisser la place pour le prompt d’Isolinux, soit en 640x450. Puis nous allons changer le mode de l’image et l’amener en mode indexé : Menu Image -> Mode -> Indexe en choisissant une palette optimale 16 couleurs (eh oui je sais, ce n’est pas beaucoup). A la suite de quoi nous allons enregistrer cette image sous le format ppm avec formatage des données brut. Nous avons maintenant un fichier isolinux.ppm qu’il va falloir convertir en un format spécifique à Isolinux. Pour ce faire, nous utiliserons le script perl ppmtolls16 inclus dans le package syslinux :
ppmtolss16 < isolinux.ppm > isolinux.lss
Il faut ensuite que nous fabriquions un fichier isolinux.msg contenant :
<CAN>isolinux.lss<newline>
<CAN> représente le caractère ASCII 24 ou encore le caractère de contrôle <Ctrl-X>. Cela peut se faire facilement avec la ligne de commande suivante :
perl -e "printf(\"\cXisolinux.lss\n\");" > isolinux.msg
Pour finir, il va nous falloir modifier notre isolinux.cfg de façon à ce qu’il pointe sur ce fichier .msg en y ajoutant la ligne display isolinux.msg. En ce qui concerne le texte F1 : Help ajouté à l’image, il semble nous souffler l’idée que si on appuie sur [F1] on aura de l’aide... Cela se fait très simplement en ajoutant la ligne F1 help.txt à notre fichier isolinux.cfg et en ajoutant bien sur un fichier help.txt qui va décrire les différentes options du boot. On trouvera fourni les fichiers isolinux.lss, isolinux.msg, help.txt et isolinux.cfg pour cette troisième iso dans un répertoire isolinux-iso3 :
cp Confifuration/isolinux-iso3/* cdrom_base/isolinux
La création de l’iso se fait comme d’habitude. On utilisera le script make_new_iso_bootsplash.sh. La taille de l’image est de 33 Mo et la taille du rootbase décompressé en mémoire est de 68 Mo.

2 C’est beau mais c’est trop gros ! Let’s shrink !

Si on examine la taille de notre rootbase en tapant du -sh rootbase, on voit que la taille de celui-ci est de 68 Mo. Pas question de pouvoir charger cette iso sur une machine ne faisant que 64 Mo donc et même difficilement avec 128 Mo. Il faut dire qu’on a particulièrement chargé la mule, en ajoutant de grosses applications : Firefox, Mplayer. Ceci dit, on se dit d’abord que si on ne sert pas des deux en même temps, ce serait pas mal d’avoir l’autre sous forme compressée... Et puis tant qu’à faire, en entrant dans le détail, ce serait même pas mal si tous les fichiers du système qui ne servent pas à un instant donné soit conservé sous forme compressée ! C’est ce que réalise l’excellent module squashfs que nous avons intégré à notre noyau. Il s’agit d’un système de fichier compressé en lecture seule qui décompresse les fichiers à la demande. Bon ! Ca c’est un outil qui est déjà pas mal, le seul problème c’est qu’étant en lecture seule, on ne peut quand même pas faire ce qu’on veut. D’où l’utilisation conjointe du non moins excellent module unionfs que nous avons également intégré à notre noyau. Unionfs (qui est utilisé maintenant par plusieurs distributions live dont Knoppix) est un système de fichiers permettant d’avoir réuni en une seule arborescence plusieurs branches de systèmes de fichiers, dont certaines en lecture seule, d’autres en lecture-écriture. Ainsi, on peut éditer et modifier des fichiers qui sont en lecture seule dans leur branche, la version modifiée se trouvant dans une branche en lecture-écriture, et tout cela de manière complètement transparente ! Nous allons donc couper en deux notre rootbase. Dans l’une des deux parties, nous allons mettre le strict nécessaire pour amorcer le système. Dans l’autre, nous " squashfs-iserons "... tout le reste !

2.1 Compilation et utilisation des utilitaires squashfs

Nous n’avons pas encore compilé les utilitaires squashfs :
cd squashfs2.2-r2/squashfs-tools
make
Copiez le programme mksquashfs quelque part dans le chemin de recherche des exécutables (/usr/bin par exemple). mksquashfs possède de nombreuses options, mais son utilisation la plus simple se résume à celle-ci :
mksquashfs repertoire1 repertoire2 ... destination
où destination représente soit un périphérique réel, soit un fichier que l’on montera ensuite en tant que loop. A noter une différence de comportement sensible suivant que l’on ait un unique répertoire source ou plusieurs. Dans le cas d’un unique répertoire source, le squashfs résultant contiendra le contenu du répertoire en éliminant le nom de celui-ci, une sorte de chroot quoi. Dans le cas de plusieurs répertoires sources, le squashfs résultant contiendra à sa racine les répertoires source.

2.2 Séparation du rootbase en deux parties

Nous allons donc couper en deux notre rootbase. Nous allons avoir deux répertoires : rootbase et rootbase-squash. A l’aide de mksquashfs, nous créerons un fichier squash à partir de rootbase-squash qui sera notre fichier squash principal. Par la suite, nous introduirons les rim-modules qui seront simplement des fichiers squash supplémentaires que nous intègrerons à notre RIM-Linux au moment de la création de l’iso, ce qui nous fera un système modulaire (on pourrait par exemple enlever Firefox et Mplayer du squash principal et faire deux fichiers rim-modules séparés, l’un pour Firefox, l’autre pour Mplayer. Au moment de la création de l’iso, on choisit suivant l’application les modules qu’on ajoute, etc.). Le mécanisme du boot sera celui décrit en figure 2.

/img-articles/lm/82/art-10/fig-2.jpg Fig. 2 : Mécanisme de boot avec le squash Dans un premier temps, renommons rootbase en rootbase-squash et créons un nouveau répertoire rootbase. De quoi avons-nous besoin strictement pour booter ? Eh bien tout simplement à quelque chose près ce que nous avions dans notre ridiculissime première iso plus quelques fichiers de configuration : Busybox, ses liens symboliques, le fichier inittab, les premiers fichiers du /dev, le fichier de démarrage /etc/init.d/rcS, les modules (qui sont compressés ça tombe bien), les utilitaires de modules, les bibliothèques utilisées par ces programmes, unionctl pour la gestion de l’union, quelques répertoires vides pour la structure et... ça devrait suffire. Le script suivant devrait faire le travail (do_split_rootbase.sh) :

#!/bin/sh
# On renomme rootbase en rootbase-squash
# et on crée un nouveau rootbase vide
mv rootbase rootbase-squash
mkdir rootbase
# On efface bootsplash, il sera recréé
# lors de la création de l’iso
rm rootbase-squash/bootsplash
# Repertoire point de montage pivot
mkdir rootbase/oldroot
# repertoires pour gestion squash+union
mkdir rootbase/rimmodules
mkdir rootbase/union
# Repertoires complets
mv rootbase-squash/{dev,proc,sys,tmp,var} \
rootbase
# Repertoires partiels
mkdir rootbase/{etc,bin,sbin,usr,lib}
mkdir rootbase/usr/{bin,sbin}
mv rootbase-squash/lib/modules rootbase/lib
mv rootbase-squash/lib/\
{ld-linux.so.2,libc.so.6,libcrypt.so.1,libm.so.6} \
rootbase/lib
mv rootbase-squash/etc/bootsplash rootbase/etc
mv rootbase-squash/etc/\
{fstab,group,hosts,inittab,networks} \
rootbase/etc
mv rootbase-squash/etc/\
{nsswitch.conf,passwd,profile,shadow} \
rootbase/etc
mv rootbase-squash/etc/init.d rootbase/etc
# programmes
mv rootbase-squash/sbin/\
{insmod,rmmod,lsmod,modprobe} \
rootbase/sbin
mv rootbase-squash/sbin/unionctl rootbase/sbin
# copie de busybox et de ses liens
find rootbase-squash/bin -lname *busybox \
-exec mv ‘{}’ rootbase/bin \;
find rootbase-squash/sbin -lname *busybox \
-exec mv ‘{}’ rootbase/sbin \;
find rootbase-squash/usr/bin -lname *busybox \
-exec mv ‘{}’ rootbase/usr/bin \;
find rootbase-squash/usr/sbin -lname *busybox \
-exec mv ‘{}’ rootbase/usr/sbin \;
mv rootbase-squash/init rootbase
mv rootbase-squash/bin/busybox rootbase/bin
On a déplacé le répertoire bootsplash car on a un lien symbolique qui pointe dessus dans notre système. Il va de plus falloir créer les devices loopback dans notre /dev, car on va les utiliser en tout début de boot, avant même que udev soit démarré :
cd rootbase/dev
for i in {0,1,2,3,4,5,6,7,8,9,10};
do mknod loop$i b 7 $i;
done
Enfin, le début de notre script rcS va devoir être modifié pour effectuer le travail supplémentaire (script fourni rcS-iso4) :
#!/bin/sh

# Mount squashed files
# and move to union
modprobe unionfs
modprobe squashfs

# We need proc for proper operation of
# our squash mounts + union
mount -n proc -t proc /proc

# mount union with only root for the moment
mount -n unionfs -t unionfs -o dirs=/=rw /.union

# We look in /.rimmodules for squashed files,
#  mount it and add to the union
for i in `ls /.rimmodules`
do
mkdir /.rimmodules/$i-mnt
mount /.rimmodules/$i -o loop,ro \
-t squashfs /.rimmodules/$i-mnt
/sbin/unionctl /.union --add --mode ro \
--after / /.rimmodules/$i-mnt
done

# umount proc before pivoting
umount /proc

# moving into union
cd /.union
/sbin/pivot_root . .oldroot

cd /

mount -n -a
Le reste du script est identique à celui de l’iso 3. On commence par charger les modules squashfs et unionfs, on monte proc temporairement, on crée l’union dans le répertoire .union avec comme branche unique /. On regarde ensuite dans le répertoire .rimmodules et pour chaque fichier qu’on y trouve (s’il s’y trouve, il est censé être un fichier squash), on le monte en loopback et on l’ajoute à l’union. Enfin, on démonte notre proc temporaire et on effectue un pivot_root dans l’union. On notera que tel que c’est fait, on peut avoir plusieurs fichiers et donc une certaine modularité. On pourra avoir par exemple un fichier principal, un fichier pour Firefox, etc.

2.3 Création de l’iso

Pour la création de l’iso, nous utiliserons le script make_new_iso-sq.sh qui effectue en plus l’opération de fabrication du fichier squash :
#!/bin/bash

echo "Adding splash picture"
./bootsplash-3.2/Utilities/splash -s -f \
 /etc/bootsplash/rimlinux/\
config/bootsplash-800x600.cfg > rootbase/bootsplash

echo "Making rootbase-squash.rim"
rm rootbase/.rimmodules/rootbase-squash.rim
./squashfs2.2-r2/squashfs-tools/mksquashfs \
 rootbase-squash rootbase/.rimmodules/rootbase-squash.rim

echo "Creating rootbase.gz from rootbase directory"
cd rootbase
find . -print | cpio -o -Hnewc | gzip > ../rootbase.gz

echo "Copying rootbase.gz to cdrom_base"
cd ..
cp rootbase.gz cdrom_base/isolinux/

echo "Creating new iso"
mkisofs -o rimlinux.iso -b isolinux/isolinux.bin \
 -c isolinux/boot.cat -no-emul-boot \
 -boot-load-size 4 -boot-info-table \
 cdrom_base

echo "Done"
On notera qu’avant de créer le fichier squash, on prend soin d’effacer le précédent, en effet mksquashfs n’écrase pas la destination si elle existe mais ajoute au bout.

2.4 Tests de l’iso

Les fonctionnalités de cette quatrième et dernière iso sont les mêmes que celles de la troisième, à ceci près que la place occupée statiquement en mémoire est deux fois inférieure (35 Mo contre 68 Mo pour l’iso 3). Cela veut dire qu’on pourra s’en servir sur des machines avec moins de mémoire ou bien... ajouter encore plus de fonctionnalités !!

2.5 To infinity and beyond... [16] ou comment on rejoint les live-CD ?

Avant de conclure cet article, une dernière remarque. Vu les techniques qu’on a utilisées à la fin, unionfs + squashfs, on n’est pas très loin des techniques de live-CD. Les deux petits scripts qui suivent ajoutent cette fonctionnalité à notre RIM-Linux. On pourra utiliser des fichiers squash se trouvant sur un support quelconque du moment qu’il est monté :
 #!/usr/bin/perl

# Usage : use-livemodule.pl squash module
#
#

# Directory to inspect
$livemodule=shift @ARGV;

# First we need to know the last item on the union
@union=`unionctl / --list`;
$lastelement=pop @union;
$lastelement=~/[\s\t]*(.*)[\s\t]+\(.+\)/;
$lastelement=$1;

system(“mkdir /.rimmodules/$livemodule-mnt”);
system(“mount $livemodule -o loop,ro -t squashfs “/.
“/.rimmodules/$livemodule-mnt”);
system("unionctl / --add --mode ro --after ".
$lastelement" /.rimmodules/$livemodule-mnt");

script use-livedir.pl
#!/usr/bin/perl

# Usage : use-livedir.pl directory
#
# The specified directory must contain
# squashed files and only that -> no check
#
# All the files will be mounted and add to the union
#

# Directory to inspect
$dir=shift @ARGV;
print("Dir : $dir\n");

# First we need to know the last item on the union
@union=`unionctl / --list`;
$lastelement=pop @union;
$lastelement=~/[\s\t]*(.*)[\s\t]+\(.+\)/;
$lastelement=$1;

# Look in the specified directory
@listfiles=`ls $dir`;
chop @listfiles;

# make mountpoints, mount loop and add to union
foreach (@listfiles)
  {
  system("mkdir /.rimmodules/$_-mnt");
  system("mount $dir/$_ -o loop,ro -t ".
    "squashfs /.rimmodules/$_-mnt");
  system("unionctl / --add --mode ro --after ".
    $lastelement.” /.rimmodules/$_-mnt”);
  }
Le premier script use-livemodule.pl prend comme argument un nom de fichier. Ce fichier sera considéré comme un fichier squash. On crée un point de montage, on le monte en loopback et on l’ajoute à l’union. Le second script use-livedir.pl prend comme argument un nom de répertoire, tous les fichiers de ce répertoire sont considérés comme des fichiers squash, montés en loopback et intégrés à l’union. On trouvera deux exemples de fichiers d’extension : firefox-java-plugin.rim (31 Mo) et mplayer-codecs.rim (10Mo). A noter que si l’on place ces fichiers dans le répertoire rootbase/.rimmodules avant la création de l’iso, ils seront intégrés directement dans le Rim-Linux. Mais alors il faudra beaucoup de mémoire pour le faire tourner...

Conclusion

Voilà, nous arrivons au bout de cet article qui je l’espère vous aura intéressé. En le suivant, nous avons vu comment réaliser (de manière quick and dirty sous certains aspects, notamment dans la partie applicative) une mini-distribution fonctionnant entièrement en mémoire vive et comportant de nombreuses fonctionnalités. Cette mini-distribution n’avait pas d’autre fin que de servir de support à cet article, mais elle nous a permis de passer en revue de nombreux aspects sous-jacents d’un système Linux auxquels on ne touche pas vraiment quand on est simple utilisateur d’une distribution moderne où tout est fait pour nous simplifier la vie. Références :
Il y a : 0 commentaire(s)

Donnez votre avis

Vous devez avoir ouvert une session pour écrire un commentaire.

Brèves
Édito : Linux Pratique Essentiel N°24
Édito : Linux Pratique HS N°23
Édito : GNU/Linux Magazine 146
Édito : GNU/Linux Magazine HS N°58
Édito : Open Silicium N°5
Communication
Linux Pratique HS 23 – Communiqué de presse
Linux Pratique Essentiel N°24 – Communiqué de presse
Gnu/Linux Magazine sponsor et partenaire de PROLOGIN
Linux Essentiel partenaire des Rencontres du Libre de Lion sur Mer (Normandie)
GNU/Linux Magazine HS 58 – Communiqué de presse
prochainement moteur de recherches des articles
 
:
:
Jours heures minutes secondes
En kiosque
Le tout nouveau Linux Pratique Essentiel est disponible dès maintenant chez votre marchand de journaux et sur notre site...

Lire la suite...

Le tout nouveau Linux Pratique est disponible dès maintenant chez votre marchand de journaux et sur notre site...

Lire la suite...

Le tout nouveau GNU/Linux Magazine est disponible dès maintenant chez votre marchand de journaux et sur notre site...

Lire la suite...

Le tout nouveau GNU/Linux Magazine HS est disponible dès maintenant chez votre marchand de journaux et sur notre site...

Lire la suite...

Le tout nouveau Open Silicium est disponible dès maintenant chez votre marchand de journaux et sur notre site...

Lire la suite...

Le tout nouveau Linux Pratique est disponible dès maintenant chez votre marchand de journaux et sur notre site...

Lire la suite...

Le tout nouveau Misc est disponible dès maintenant chez votre marchand de journaux et sur notre site...

Lire la suite...

Le tout nouveau GNU/Linux Magazine est disponible dès maintenant chez votre marchand de journaux et sur notre site...

Lire la suite...