Logiciels libres et enseignement

Favoriser l’usage de logiciels libres et de formats ouverts

Accueil > Multimedia > Musique et audio > Un kernel linux pour le multimedia

Un kernel linux pour le multimedia

vendredi 4 mars 2005, par Yves Potin

Cet article présente la mise en place d’un kernel Linux 2.6 et des logiciels nécessaires sur une machine personnelle destinée au travail multimédia, particulièrement à la Musique Assistée par Ordinateur (MAO). On y traite en particulier des problèmes de faible latence, de multitâche préemptif et de pilotes modernes de cartes son (ALSA) tels que requis par les applications multimédia professionnelles comme Jackd et les logiciels qui fonctionnent avec lui (le séquenceur MuSE, les plugins LADSPA et le magnétophone numérique Ardour). Mais cet article s’intéresse également aux options nécessaires à la prise en charge de matériel vidéo et d’imagerie numérique, de graveurs de CD et DVD, de cartes réseau wifi, du support Bluetooth, de périphériques USB divers, etc...

Un didacticiel concernant ces applications est disponible à l’adresse Muse et Fluidsynth.

La version du kernel utilisée est 2.6.11, le 3 Mars 2005, avec l’exemple de la configuration matérielle d’un portable Dell Latitude D600. Le fichier de configuration se trouve à http://logiciels-libres-cndp.ac-ver...

kernelmultimedia.pdf
Source LaTeX et images









Pourquoi recompiler son kernel ?

Il n’est généralement pas nécessaire de compiler soi même le noyau de son système d’exploitation, les distributions modernes proposent en principe un kernel intégrant toutes les fonctionnalités nécessaires. Cependant, l’utilisateur peut être intéressé par une telle mise en place afin d’optimiser son système et de mieux maîtriser telle ou telle option. De plus, le fonctionnement temps réel requis par Jackd est rarement pleinement fonctionnel, il peut être plus simple de réellement contrôler ce qui est présent dans le kernel de manière à mieux identifier d’éventuels problèmes.

On considérera de près les noyaux multimédia fournis par Planet CCRMA (Redaht et Fedora) ou Agnula (en particulier pour Debian Demudi), qui peuvent éviter de passer par une recompilation manuelle. Tous les détails sont présentés sur cette page : La musique et l’audio sous GNU/Linux.

Enfin, la recompilation du kernel n’est pas une chose très difficile, elle demande simplement beaucoup de rigueur dans le choix des très nombreuses options préalables à la compilation. Aucune connaissance d’un langage de programmation n’est requise ; cet article suppose tout de même que l’utilisateur maîtrise un tant soit peu la ligne de commande Unix.

On consultera avec profit ces deux articles en complément à celui ci :

Installation des logiciels nécessaires à la compilation et identificaton du matériel

Note importante  : aucune des manipulations ici décrites ne doit être faite sous le compte root sauf si cela est expressément précisé, pour des raisons de sécurité.

Même si cela n’est pas nécessaire pour compiler, on commencera par installer (sous root bien sur) le package module-init-tools qui permet de charger les modules du kernel 2.6, sinon toute utilisation de modules sera impossible. Les modutils du kernel 2.4 cohabitent parfaitement avec ce package, et donc aucune cohabitation des versions 2.4 et 2.6 ne pose problème.

Schématiquement, pour compiler, le compilateur GCC et les librairies associées sont nécessaires, avec les librairies de développement ncurses permettant de compiler l’interface de sélection des options du kernel (celle qui apparaît avec make menuconfig). Dans Debian, les packages requis sont kernel-package, libncurses5-dev, make et bzip2 qui s’installent avec apt-get, le reste s’installant par le jeu des dépendances.

La première des choses à faire est d’identifier le matériel présent dans l’ordinateur au moyen de la commande lspci (l’option -v, parfois sous root, permet d’avoir plus de détails).

Nous prendrons tout au long de cet article l’exemple d’un portable Dell Latitude D600 :

0000:00:00.0 Host bridge: Intel Corp. 82855PM Processor to I/O Controller (rev 03)

0000:00:01.0 PCI bridge: Intel Corp. 82855PM Processor to AGP Controller (rev 03)

0000:00:1d.0 USB Controller: Intel Corp. 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller \#1 (rev 01)

0000:00:1d.1 USB Controller: Intel Corp. 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller \#2 (rev 01)

0000:00:1d.2 USB Controller: Intel Corp. 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller \#3 (rev 01)

0000:00:1d.7 USB Controller: Intel Corp. 82801DB/DBM (ICH4/ICH4-M) USB 2.0 EHCI Controller (rev 01)

0000:00:1e.0 PCI bridge: Intel Corp. 82801 PCI Bridge (rev 81)

0000:00:1f.0 ISA bridge: Intel Corp. 82801DBM LPC Interface Controller (rev 01)

0000:00:1f.1 IDE interface: Intel Corp. 82801DBM (ICH4) Ultra ATA Storage Controller (rev 01)

Une carte mère Intel, chipset ICH 5 on ne peut plus classique, dotée de ports USB 1 et 2.

0000:00:1f.5 Multimedia audio controller: Intel Corp. 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Audio Controller (rev 01)

La carte son, également très banale.

0000:01:00.0 VGA compatible controller: ATI Technologies Inc Radeon R250 Lf [Radeon Mobility 9000 M9] (rev 02)

La carte video, ATI Radeon 9000, qui fonctionne très bien avec les drivers Xfree libres.

0000:02:00.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5705M Gigabit Ethernet (rev 01)

La carte ethernet : en cas de difficulté d’identification du matériel et des modules nécessaires, si le noyau déjà installé ne détecte pas convenablement tous les périphériques, utiliser un CD Rom Knoppix permet d’obtenir de l’aide au moyen des commandes lspci et lsmod (qui liste les modules chargés du kernel). Cette carte est une Broadcom TG3 Gigabit.

0000:02:01.0 CardBus bridge: O2 Micro, Inc. OZ711EC1 SmartCardBus Controller (rev 20)

0000:02:01.1 CardBus bridge: O2 Micro, Inc. OZ711EC1 SmartCardBus Controller (rev 20)

Le contrôleur PCMCIA, classique chipset Yenta comme un CD Knoppix le detectera lui aussi automatiquement.

0000:02:03.0 Network controller: Broadcom Corporation BCM4309 802.11a/b/g (rev 03) y

Plus délicat : une carte wifi Broadcom, qui nécessite les drivers propriétaires Ndiswrapper, qui ne sont pas présents dans le kernel. Ce type de carte est très fréquent, nous y reviendrons.

Le matériel étant au moins sommairement identifié, quitte à y revenir, commençons le travail sur le kernel.

La configuration du kernel

Nous utiliserons les sources officielles du kernel linux qui se téléchargent sur http://www.kernel.org. On obtient un fichier .tar.bz2 de plus de 30 Mo que l’on décompresse au moyen de la commande tar jxvf linux-2.6.11.tar.bz2 [1]. On se rend ensuite dans le répertoire qui vient d’apparaître, et l’on appelle l’interface de compilation du noyau au moyen de la commande make menuconfig (des interfaces de compilation plus confortables existent en QT ou GTK sous X window et supposent l’installation de librairies de développement complémentaires. Leur avantage est qu’elles se manipulent à la souris et affichent l’aide des options par défaut, leur inconvénient est leur lourdeur). L’interface menuconfig est la suivante :

On se déplace dans cette interface avec les flèches, la barre d’espace valide un choix et la touche de tabulation permet de se déplacer à l’intérieur de la fenêtre. La partie délicate de la compilation est là : il y a des dizaines et des dizaines d’options qui correspondent à des fonctions du kernel qui ne sont pas toujours nécessairement très claires. On trouve également ici les pilotes des périphériques supportés par le noyau linux, qu’il va falloir activer ou non en fonction du matériel dont on dispose ou qui est susceptible d’être branché un jour sur l’ordinateur. Dès qu’une option n’est pas claire, on consultera systématiquement l’aide, qui propose souvent un choix par défaut et indique le nom du module du noyau auquel cette option correspondra.

En effet, une option propose trois choix :

  • yes, qui valide l’option et la compile dans le kernel.
  • no, réponse qui suppose que vous n’avez pas besoin de cette fonctionnalité ou vous ne possédez pas le matériel concerné et pensez ne jamais en avoir besoin.
  • m, qui ne signifie pas maybe :) mais module, à savoir un pilote compilé en dehors du noyau lui même et qui ne sera chargé en mémoire qu’en cas de besoin, ce qui permet d’alléger l’occupation des ressources de la machine : insertion d’un périphérique USB, appel d’une fonction réseau très particulière ou chargement manuel, ce qui nous intéressera tout particulièrement puisque nous appellerons dans un premier temps le module temps réel permettant de faire marcher Jackd de cette manière. On notera que les choix que nous retenons pour ce kernel multimédia font un usage intensif des modules.

Les scripts de lancement de l’interface de compilation se sont en même temps occupés de procéder à une détection de la plupart du matériel présent dans l’ordinateur. En principe, les choix principaux sont faits et on réfléchira à deux fois avant de dévalider une option proposée, qui correspondra la plupart du temps à ce que montre lspci.

L’interface Menuconfig

Les très nombreuses options de configuration du kernel sont exposées dans le document disponible en haut de cette page, qui constitue la version intégrale de cet article (24 pages).

La compilation du kernel

Ce travail laborieux de spécification de ce qui doit ou non être compilé dans le kernel étant terminé, nous pouvons passer à la compilation proprement dite. Si le compilateur est correctement et complètement installé, la commande make-kpkg kernel_image (spécifique Debian) suffit à obtenir un package prêt à l’installation, au bout d’un temps conséquent de travail de la machine (compter un quart d’heure minimum avec un CPU à 3 Ghz pour une configuration un peu complète avec de nombreux modules, etc).

En cas d’erreur à la compilation, le compilateur expliquera à peu près clairement, si l’on a des rudiments de programmation ou un peu d’habitude, quelle partie des sources pose problème. On ira donc rectifier dans l’interface menuconfig les options concernant cette partie, en spécifiant quelque chose de plus cohérent, et on relancera la compilation.

Le package Debian est placé dans le répertoire du niveau supérieur à celui ou on a décompressé les sources, on l’installera sous root par la commande :

dpkg -i  kernel-image-2.6.11_10.00.Custom_i386.deb

En dehors de Debian, ou pour tout faire à la main :

make dep ; make clean

make bzImage

make modules

make modules_install

cp arch/i386/boot/bzImage /boot/vmlinuz

cp System.map /boot

Éditer éventuellement le lilo.conf. Taper la commande lilo qui doit répondre sans erreur par la liste des OS installées et kernels bootables de cette manière :

Added Linux *

Added LinuxOLD

En effet, on s’assurera, avant l’installation du noyau, que le menu de boot est bien proposé au lancement de la machine (option prompt de /etc/lilo.conf), qu’il propose de démarrer sur l’ancien kernel et que ce démarrage se fait effectivement. Il n’est pas necessaire de faire cela avec l’installation par package Debian ou avec Grub à la place de lilo.

L’installation du module temps réel

Le module temps réel du kernel n’est pas officiellement intégré aux sources du noyau, ce que l’on peut espérer pour l’avenir. On en trouvera la dernière version sur le site officiel : http://sourceforge.net/projects/rea... (mais des packages existent). La compilation se fait tout simplement en détarrant l’archive, puis ./configure, make, make install. Par sécurité, on mettra a jour les modules avec depmod -a ou update-modules (Debian). On s’assurera que l’utilisateur qui va utiliser les logiciels multimédia figure dans le groupe audio (29 sous Debian), par grep audio /etc/group. On l’ajoutera a ce groupe, s’il n’y est pas, par la commande adduser jdalton audio (si l’utilisateur s’appelle jdalton :) ).

Ensuite, on charge le module par la commande modprobe -v realtime gid=29

Lancer qjackctl et démarrer jackd qui se lance par défaut en mode temps réel. Après un court moment de suspense, jackd doit démarrer sans erreur et toutes les applications musicales comme Ardour et MuSE doivent pouvoir être lancées par les menus de l’interface graphique sans aucune option ni privilège particulier.

On pourra déclarer ce module dans le fichier de configuration approprié à la distribution pour qu’il se charge au lancement de l’ordinateur (/etc/modules dans Debian).

Suivi de l’installation du kernel - ajout et retrait de modules

On peut avoir besoin d’ajouter ou de supprimer des modules du kernel par la suite. Il n’est pas nécessaire de recommencer toute la compilation, ni de redémarrer la machine. Une fois la première compilation du kernel achevée sans erreur, on laissera les sources en l’état pour retourner compiler ponctuellement ce dont on peut avoir besoin : passer par l’interface menuconfig, valider ou dévalider les modules souhaités, puis sauvegarder la configuration comme l’interface le propose en la quittant. Ensuite les commandes make modules et make modules_install suffisent pour compiler ce qui manque et l’installer. Et cela fonctionne, sans redémarrer.

Typiquement, je cherche a ajouter une souris d’un type particulier qui ne fonctionne pas normalement. Je vais donc rajouter le module Event debugging (Device Drivers - input Device support) en plus des modules nécessaires pour mon périphérique que j’ai pu oublier. Après installation et chargement des modules nécessaires et du module de debug (par la commande modprobe -v evbug), je constate que mes fichiers de logs m’informent bien des problèmes éventuels. Je les corrige, ensuite je retourne dans le menuconfig en me contentant de dévalider le module de debug. Après sauvegarde, une nouvelle compilation par make modules me montre qu’il n’y a rien à compiler, make modules_install remettra tout bien en place et je n’oublie pas de recompiler et réinstaller le module realtime séparément puisqu’il n’est pas intégré dans les sources, cela prend quelques secondes. Et tout remarche, avec les logs qui cessent de se remplir dès que je bouge ma souris :).

Pour être efficace, on utilisera avec parcimonie la commande make mrproper dans les sources, ou make-kpkg clean, qui nettoie toutes les traces d’une compilation précédente. Tant que l’on ne touche pas au kernel lui même mais uniquement aux modules, ceci n’est pas nécessaire et présente l’avantage de ne compiler que ce qui manque, occasionnant ainsi un gain de temps important. Par contre, en cas de modification d’une option du kernel lui même, il est préférable de nettoyer les sources avant de le recompiler et le réinstaller.

Conclusion

Toutes ces manipulations très techniques, qui peuvent paraître fastidieuses, permettent une bien meilleure compréhension de la gestion du matériel sous linux et une réelle optimisation de la machine en l’adaptant à ce dont on a un vrai usage, quitte à modifier les sources du kernel par le biais de patchs pour profiter d’optimisations ou de fonctionnalités qui ne sont pas encore disponibles dans telle ou telle distribution ou version.

Reste, dans le cas des applications pour le multimédia et la création artistique, à se concentrer sur un travail véritablement créatif en maîtrisant des logiciels riches et complexes chacun dans leur genre, ce qui est autrement plus utile et profitable que la connaissance de l’interface menuconfig :).

Notes

[1Le plus simple est de placer les sources du kernel dans /usr/src/ et de placer un lien symbolique « linux » vers ce repertoire : ln -s linux-2.6.11 linux, et de donner tous les droits à un utilisateur sur les sources pour ne pas compiler sous root. Cet emplacement simplifiera la compilation d’autres applications, comme des pilotes de périphériques extérieurs, qui iront par défaut chercher les sources à cet endroit.

Recherche avancée