Compiler un driver pour le Synology

Il peut être utile compiler un driver sur le Synology (par exemple pour installer une WebCam USB). Mais pour cela il faut savoir comment compiler le noyaux (ou kernel) du système Linux qui anime le Synology.

Cet article s’adresse à des utilisateurs avancés ayant une bonne expérience avec Linux, mais ne pratiquant pas tous les jours la compilation du kernel. Je ne suis pas responsable des mauvais traitements que vous infligerez à votre NAS et du mal de crâne causé par toute compilation d’un noyau Linux.

En synthèse, la marche à suivre sera la suivante :

  1. Maîtriser certaines manipulations sur le NAS (Telnet, SSH).
  2. Obtenir la toolchain (qui sert à compiler des logiciels pour le NAS, mais depuis un autre PC Linux).
  3. Obtenir le code source des applications du Synology.
  4. Configurer l’environnement du PC Linux qui servira à la compilation. Régler les paramètres de compilation du noyau, compiler et installer.

Avant toute chose

Il faut posséder une machine qui tourne sous Linux pour effectuer les manipulations décrites dans ce post. Elle peut être virtuelle (avec VMWare ou Virtual Box), mais cela ne marchera pas avec CygWin, ni avec Visual Studio ou MinGW qui ne savent pas produire des exécutables au format ELF.

Les fondamentaux

La lecture de ce billet nécessite en pré-requis fondamental :

Le modèle de CPU

Il faut connaître la famille de processeur qui équipe votre Synology à l’aide de cette page qui donne la correspondance. Ne pas confondre famille de processeur et modèle. Par exemple, mon PC est équipé d’un Intel Q6600 (le modèle), mais la famille de CPU est soit i686 ou x86_64 (selon si on souhaite faire une compilation 32bits ou 64bits). Il en va de même pour les Synology. Je suis l’heureux possesseur d’un DS211j équipé d’un Feroceon (le modèle), mais la famille du CPU est Marvell Kirkwood mv6281. Gardez cette info pour la partie compilation du Kernel, que l’on verra en fin d’article.

La version de Linux du Syno

Connectez-vous sur le Synology et utilisez la commande uname -r qui devrait renvoyer par exemple 2.6.32.12. Cela sera utile pour plus tard.

Obtention de la toolchain

Rendez-vous sur Sourceforge pour obtenir la toolchain. Il s’agit d’un ensemble d’outils permettant de compiler un logiciel pour qu’il soit exécuté sur le Synology. La toolchain ne s’installe pas sur le NAS, mais sur un ordinateur Linux. Le fait de compiler des sources sur un système (Linux), alors que l’exécutable produit tournera sur un autre système (le NAS Synology) s’appelle la compilation croisée (ou cross-compilation an anglais).

Dans mon cas, comme la famille de CPU de mon NAS est de type Marvell 628x et que la version de Linux est la 2.6.32.12 ; j’ai cliqué sur ce lien : http://sourceforge.net/projects/dsgpl/files/DSM%203.1%20Tool%20Chains/Marvell%2088F628x%20Linux%202.6.32/ pour obtenir l’archive gcc421_glibc25_88f628x.tgz.

Toujours sur l’ordinateur Linux, décompressez la toolchain dans /usr/local/ avec, par exemple, la commande tar zxpf gcc421_glibc25_88f6281.tgz –C /usr/local/

Obtention des sources du Synology

Le code source des applications open source composant le synology (noyau Linux, php, Apache, …) est disponible sur Sourceforge ainsi que la configuration utilisée par les développeurs pour compiler le noyau. Tout ceci va nous faciliter la tâche.

Dans mon cas, comme la famille de CPU de mon NAS est de type Marvell 628x et que la version de Linux est la 2.6.32.12 ; j’ai cliqué sur ce lien : http://sourceforge.net/projects/dsgpl/files/Synology%20NAS%20GPL%20Source/1594branch/synogpl-1594b-6281.tbz/download pour obtenir l’archive synogpl-1594b-6281.tbz que j’ai décompressé dans un répertoire quelconque (rappel : tar zxpf).

Compilation du noyau du Syno

Préparation de l’environnement

Sur la machine Linux sur laquelle vous allez compiler, ouvrez un terminal et préparez l’environnement de compilation en positionnant différentes variables système  avec ces commandes (à adapter en fonction de la toolchain que vous avez téléchargé. Si votre NAS est basé sur une architecture PowerPC, il faudra remplacer arm-none-linux-gnueabi par powerpc-linux-gnuspe) :

export CFLAGS="-I/usr/local/arm-none-linux-gnueabi/include"
export LDFLAGS="-I/usr/local/arm-none-linux-gnueabi/lib"
export RANLIB=/usr/local/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-ranlib
export LD=/usr/local/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-ld
export CC=/usr/local/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-gcc
export LD_LIBRARY_PATH=/usr/local/arm-none-linux-gnueabi/lib
export ARCH=arm
export CROSS_COMPILE=/usr/local/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-

Compilation du kernel

Allez dans le répertoire dans lequel vous avez décompressé les fichiers sources du Synology, plus précisément dans le sous-répertoire source/linux-2.6.32 (à adapter en fonction de ce que vous a donné la commande uname -r).

Il faut configurer les options de compilation du kernel (nom anglais pour noyau de l’OS) en fonction du modèle de  processeur qui équipe votre NAS. il suffit de copier le fichier configuration du processeur à la racine de la source du kernel cela donne :

cp /mon_rep/source/linux-2.6.32/synoconfigs/88f6281 /mon_rep/source/linux-2.6.32/.config

Dans le répertoire source/linux-2.6.32, lancez les commandes suivantes :

make oldconfig

make menuconfig

Une interface graphique va s’ouvrir dans laquelle vous choisissez différentes options de compilation et les drivers à compiler. Par exemple, pour une webcam, activez les options (la suite de la configuration dépend du modèle) :

  1. Devices Drivers
  2. Multimedia Support

Puis on lance la compilation avec les commandes :

make dep

make modules

La compilation peut être accéléré si vous avez un CPU multi-coeurs avec (pour 4 coeurs) la commande :

make modules -j 4

Et après ?

Vous trouverez les drivers sous la forme de fichiers .ko dans le sous-répertoire drivers. Par exemple, pour le dirver Universal Video Class (uvcvideo.ko) dans drivers/media/video/.

Le module obtenu doit être chargé en mémoire afin de pouvoir piloter votre périphérique. on peut utiliser la commande insmod à cet effet. insmod fait partie du paquet module-init-tools (voir ce post pour l’installer avec ipkg) tout comme :

  • lsmod – pour lister les modules chargés
  • rmmod – pour supprimer un module de la mémoire.

On peut aussi le charger de manière permanente en copiant les fichiers ko dans /lib/modules/$(uname -r)/kernel/drivers/ et l’ajouter au fichier /etc/modules

Un exemple concret de ces commandes est à suivre dans un billet qui explique comment compiler et installer un driver de webcam USB.

Sources documentaires

Laisser un commentaire

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