Skyduino:~#
Articles
Corrigé, tutoriel

[Tuto] OpenWRT sur architecture x86

Bonjour tout le monde !

Je sais, ça fait un bon moment que vous attendiez cet article (et ceux qui vont suivre) mais faute de temps j’avais du le(s) laisser de côté.
J’ai réussi à trouver un petit moment de temps libre entre deux partiels donc let’s go !

openwrt-logo

Le sujet du jour, OpenWRT ! (oui enfin !)
Dans ce premier article je vais poser les bases : comment installer les outils nécessaires, récupérer les sources et faire sa toute première compilation.
Je ne vais pas partir tout de suite sur de la cross-compilation pour un routeur ou autre, je vais rester sur quelque chose que vous avez tous sous la main, un PC compatible x86.

logo_small

Beaucoup l’oublie mais OpenWRT n’est rien d’autre qu’une version modifiée de « buildroot », la toolchain automatisée permettant de compiler des noyaux Linux.
OpenWRT est certes très orienté routeur et matériel réseau, mais cela n’empêche pas de compiler un noyaux linux « classique » avec, comme on le ferait avec buildroot !
Au contraire avec la version modifiée de buildroot que fourni OpenWRT on peut concevoir des noyaux linux optimisés pour un système en particulier, avec tous les drivers qui vont bien.

C’est justement le but de ce tutoriel, concevoir un système linux optimisé pour un hardware bien précis, dans mon cas ce sera mon eeepc Acer « Aspire One D255 ».

Si vous êtes curieux voici la liste des plateformes supportées par openWRT, la liste est longue, trés longue …
http://wiki.openwrt.org/toh/start

Étape 1, Pré-requis

Avant de faire quoi que ce soit il vous faut un système GNU/Linux installé sur votre ordinateur, de préférence une distribution debian ou dérivée (ubuntu, mint, …).
Pour ma part j’utilise Mint 14, j’ai eu quelques soucis au début avec mon Mint 13 « upgradé » en Mint 14 mais avec une installation « fraiche » tout va bien.

Ps: n’espérez pas compiler un noyaux Linux sous windows même avec cygwin, ça ne marchera pas !

Étape 2, Installation des outils, paquets et dépendances nécessaires à la compilation

Pour pouvoir compiler avec la toolchain buildroot de openWRT il est nécessaire d’avoir certains outils, paquets et dépendances sur votre Linux.

Si vous êtes sur un système debian ou dérivé voici les commandes apt-get à exécuter :
sudo apt-get install synaptic gparted fldiff gdmap gtkterm apt-file subversion git curl cvs
sudo apt-get install git-core tig lzop libz-dev uboot-mkimage libelf-dev libncurses-dev gtk-doc-tools checkinstall
sudo apt-get install genext2fs e2fsprogs libglib2.0-dev libxml2-dev gawk bison flex texinfo gcc automake build-essential
sudo apt-get install libxml-parser-perl asciidoc bash binutils bzip2 fastjar g++ util-linux
sudo apt-get install libgtk2.0-dev intltool zlib1g-dev make libncurses5-dev libssl-dev patch perl-modules python2.7-dev rsync
sudo apt-get install unzip wget gettext xsltproc ruby sdcc

Remarque: il faudra télécharger presque 1Go de paquets depuis les dépôts 😉

Si vous êtes sur un Linux « autre » il faudra vous assurer d’avoir les paquets qui vont bien en utilisant votre gestionnaire de paquet habituel :
http://wiki.openwrt.org/doc/howto/buildroot.exigence#table.of.known.prerequisites.and.their.corresponding.packages

Ps: vous vous demandez surement pourquoi je vous donne la liste complète des paquets requis et pas juste ceux nécessaire à la compilation pour x86 ?
C’est simple, cet article a pour but de poser les bases, je prévois donc large, que ce soit compilation x86, AVR32, ARM ou autre 😉

Étape 3, Récupération des sources et vérifications des dépendances

Maintenant que votre système est prêt il faut récupérer les sources de openWRT et de sa toolchain.

Pour ce faire on va commencer par créer un dossier dans le dossier « home » pour stocker tout ce qui est lié à OpenWRT :
cd ~
mkdir openWRT

On va ensuite demander à subversion de récupérer les sources pour nous :
cd openWRT
svn co svn://svn.openwrt.org/openwrt/trunk/

Cela va prendre un peu de temps, il a plus de 15 000 fichiers à télécharger pour un total de 200Mo environ.
Une fois la commande fini le code source se trouvera dans un sous dossier « trunk », trunk étant la branche de développement de OpenWRT avec les dernières nouveautés et patchs.
Cela implique aussi que la branche trunk peut cesser de compiler d’un jour sur l’autre au gré des modifications du code.

Si vous préférez utiliser une branche stable elles sont listées dans ce wiki :
http://wiki.openwrt.org/doc/howto/buildroot.exigence#downloading.sources

Les sources sont téléchargées, mais cela ne fait pas tout !
Il faut maintenant télécharger la liste des paquets disponibles !

Pour ce faire :
cd trunk
./scripts/feeds update -a
./scripts/feeds install -a

Cela demandera aussi un peu de temps, mais beaucoup moins que pour la première commande 😉

Il ne manque plus qu’a vérifier les dépendances et compiler le gui du menu de configuration pour que tout soit ok :
make prereq

A présent tous est prêt pour commencer le plus gros du travail, à savoir la configuration de l’image linux !

Étape 4, Configuration de l’image linux

Pour configurer l’image linux rien de plus simple !
Buildroot (et donc par extension OpenWRT) fourni un menu (en ncurse) pour la configuration, il suffit de naviguer dedans pour faire ses choix !

Les images étant plus parlantes que les mots voici la configuration de mon image linux, point par point.

1) Le menu principal :

menu

Voici le menu principal, c’est ici que tout va ce jouer.
Chaque sous menu permet de configurer une partie du processus de compilation, on va les regarder dans l’ordre mais je ne vais pas tous les expliquer (ce serait beaucoup trop long).

2) « Target system » : choix de l’architecture CPU cible

target

Dans notre cas nous compilerons pour une architecture x86, il y a beaucoup d’autre architectures supportées mais elles ne nous intéressent pas pour le moment 😉

3) « Subtarget » : choix de la plateforme cible

subtarget

On va rester sur l’option par défaut, mon eeepc ne demandant pas une configuration noyau spéciale.

4) « Target profile » : choix du profil cible

profile

Pareil que pour 3), on va garder l’option par défaut.

-> A partir de maintenant vous pouvez d’ores et déjà compiler votre noyau « fait maison » !
Il suffit de faire make defconfig avant de passer à l’étape suivante pour laisser la toolchain OpenWRT utiliser les options par défaut.
Mais ce n’est pas très intéressant d’avoir un eeepc sans drivers à par ceux pour l’ethernet et le wifi … donc je continue 😉

5) « Target image » : configuration de l’image finale

image1

J’ai choisi de générer une archive avec le système de fichier final (le rootfs) de même qu’une image disque en EXT4.
J’ai aussi demandé à buildroot de me compiler grub (le bootloader) et d’activer la sortie console graphique (plus de détails sur sur ce point dans la partie 7).

image2

J’ai aussi demandé à ce que la partition contenant le rootfs fasse seulement 26Mo afin que l’image finale grub + rootfs fasse moins de 32Mo (taille de la carte sd que j’utilise).
(Oui avoir un Linux complet qui tient sur 32Mo de disque et moins de 16Mo de RAM c’est possible ;))

6) « Global build settings » : configuration du processus de compilation

buildsettings

Concernant les options de compilation j’ai tout laisser par défaut.
J’ai juste activé la compilation parallèle afin de réduire le temps de compilation (plus de détails sur ce point dans l’étape suivante).

Je passe volontairement sous silence les options développeurs, si vous savez ce à quoi elles servent vous ne devriez pas avoir besoin de lire cet article normalement 😉

7) « Base system » : configuration du système de base

base1

J’ai gardé la configuration de base auquel j’ai ajouté « block-mount », « hotplug2 » et la lib C++ standard.
Cela permet de monter automatiquement les clefs usb, disques dur, cd-rom … lorsqu’ils sont insérés.
De base cela n’est pas activé car cela ne sert à rien sur un routeur …

base2

J’ai aussi ajouté « resolveip » et « wireless-tools » pour me faciliter la vie lors de la configuration de ma carte wifi.

De même vous pouvez configurer busybox comme vous le souhaitez pour avoir les commandes de votre choix :

busybox

8) « Kernel modules » : configuration des modules noyaux

La configuration des modules noyaux est la partie la plus compliquée …
Il faut choisir les bons modules qui correspondent au hardware que l’on possède !

Le plus simple est de lancer la commande « lsmod » sur la machine cible (si possible bien sûr) afin de savoir les modules chargés par le système linux d’origine.
Les distributions GNU/Linux « grand publique » sont faites pour être les plus génériques possible avec un maximum de modules noyaux pour tourner sur n’importe quelle machine.
Dans notre cas on va juste garder les modules nécessaires pour faire tourner le hardware proprement mais sans plus, ce qui va réduire sensiblement le temps de démarrage.
Je vais quand même me payer le luxe d’ajouter des modules noyaux qui ne me seront surement pas très utiles (le bluetooth par exemple).

kmod

Bref, voila à quoi ressemble le menu de configuration des modules noyaux, je vous laisse faire le tour des différents sous menus par vous même.
Je vais juste détailler les parties concernant mon eeepc.

– Les périphériques de stockage

kmodscsi

J’ai activé le module scsi pour mes clef usb, … ainsi que la surcouche scsi spécial pour les lecteurs de CD-ROM.
J’ai aussi activé le module S-ATA (un peu plus haut dans le menu) pour mon disque dur.

– Les systèmes de fichiers

fsext4

Le système de fichier FAT étant géré de base par le noyaux j’ai juste activé en plus l’EXT4 qui est le système de fichier par défaut sous Linux.

– Les périphériques réseaux filiaires

kmodnetwork

J’ai désactivé tous les modules excepté celui pour ma carte réseau ethernet.

– Les modules divers

kmodacpibluetooth

kmodmmc

J’ai activé les modules de gestion de l’énergie (acpi), du bluetooth et le module pour le lecteur de carte SD/MMC.

– Les périphériques audio

kmodsound

J’ai activé le module audio hardware et celui pour les cartes audio usb, de même que le support du séquenceur (bien qu’il ne soit pas super utile …).

– Les périphériques USB

kmodhid

Concernant l’usb je me suis fait plaisir, j’ai activé le support de l’usb2, des périphériques HID (clavier, souris, …) et des périphériques de stockage de masse (clef usb, …).

– Les périphériques vidéo

kmodfb

J’ai activer framebuffer pour la gestion de l’écran en mode graphique et V4L (« video for linux ») pour la gestion de la webcam.

– Les périphériques réseaux sans fils

kmodwireless

J’ai tout désactivé excepté le module pour ma carte réseau wifi Atheros.

9) Les divers paquets utiles

utilitiesdmesg

devpython

C’est une question de gout, pour ma part j’ai juste ajouté deux paquets en plus : « dmesg » (pour les logs systèmes) et « python » (parce que je suis un grand fan du langage python).
J’ai aussi désactivé quelques paquets inutiles, comme la gestion du NAT par exemple qui est utile pour un routeur mais pas pour un eeepc …

Étape 5, Compilation

Une fois la configuration de l’image faite il ne reste plus qu’a compiler le tout.

Si vous avez activé la compilation parallèle comme dans ma configuration d’exemple il vous suffit de faire :
make -jn
dans le dossier trunk, avec « n » le nombre de cœur que votre ordinateur possède.
Si vous n’avez pas activé la compilation parallèle il suffit de faire « make » dans le dossier trunk.

Par exemple sur mon eeepc je dispose de quatre cœurs (2 physiques et 2 logiques) j’utilise donc :
make -j4

L’avantage de la compilation parallèle c’est que cela prend n fois moins de temps !
Mais cela reste très, très, très long … au moins une heure sur mon eeepc …

Pour information avec un i7 il faut 20 minutes environ.
Avec un pentium 4 (oui j’ai essayé pour le fun …) il faut un peu plus de 3h …

PS: en cas d’erreur essayez de compiler en mode mono-thread : « make -j1 », cela résout parfois les problèmes de compilation.

Étape 6, Installation de l’image

Si votre image a compilé sans rencontrer de problème vous étés prêt à l’installer et à la tester !
S’il y a eu des problèmes il faudra recommencer la compilation en mode debug (V=s) et chercher dans les logs ce qui plante (rediriger stderr dans un fichier texte est très utile dans ce cas ;))

La version modifié de buildroot d’OpenWRT est bien plus simple à utiliser que la version d’origine pour ce qui est de trouver où se situent les fichiers compilés.

Tout se situe dans ces 4 sous-dossiers :
– « bin » : l’image linux finale, les checksums md5 des fichiers, le rootfs, les paquets compilés (pour installation manuel si besoin via ipkg)
– « build_dir » : les fichiers intermédiaires compilés
– « staging_dir » : les fichiers compilés de la toolchain et de la libc
– « toolchain » : les fichiers de la toolchain

Pour faire simple les deux seuls dossiers qui nous intéressent sont « bin » et « staging_dir ».
Le premier contenant notre image linux et son rootfs, avec en plus dans le cas de notre compilation x86 une image disque combinant grub + kernel + rootfs.
Le second contenant la toolchain pour compiler nos programmes « perso » si on le souhaite.

Dans le cas de notre compilation x86 on dispose à la fin de la compilation d’une image disque avec une table de partition toute prête combinant grub, l’image linux et le rootfs.
Il suffit donc de la copier sur une clé usb par exemple pour avoir une clé usb bootable.

Pour ce faire rien de plus simple, il suffit d’utiliser la commande « dd » :
cd bin/x86
sudo dd if=openwrt-x86-generic-combined-ext4.img of=/dev/sdx

(pensez à remplacer /dev/sdbx par le périphérique pointant sur votre clef usb, /dev/sdb par exemple dans mon cas)

Remarque : la commande dd prend un peu de temps avant de redonner la main, une 30ène de secondes environ.
Elle ne renvoie aucune info sur la console durant ce laps de temps, ne vous inquiétez pas c’est normal.

Étape 7, Lancement de l’image

Pour pouvoir booter mon image linux sur mon eeepc j’ai du bricoler un peu la configuration de grub.
Par défaut grub est configuré pour utiliser le port série et la console graphique.

Rare sont les pc (et encore moins les eeepc) avec un port série de nos jours … cette partie ne sert donc à rien dans mon cas.
C’est utile uniquement pour les routeurs puisque eux n’ont pas de console graphique !

Le seul problème est que mon eeepc ne fonctionne pas en mode console graphique standard, il faut utiliser le mode « gfxmode » ou vga_text » pour avoir quelque chose à l’écran.
J’ai donc modifié le fichier de configuration grub.cfg (dans le dossier « grub » de la première partition de l’image disque) par ceci :
terminal_input console vga_text gfxmode; terminal_output console vga_text gfxmode

set default="0"
set timeout="5"
set root='(hd0,msdos1)'

menuentry "OpenWrt" {
linux /boot/vmlinuz root=/dev/sdb2 rootfstype=ext4 rootwait console=tty0 noinitrd
}

menuentry "OpenWrt (failsafe)" {
linux /boot/vmlinuz failsafe=true root=/dev/sdb2 rootfstype=ext4 rootwait console=tty0 noinitrd
}

Il suffit ensuite de brancher la clé sur le eeepc, de redémarrer et de booter sur la clef.

Et après quelques dizaines de secondes d’attente :

P1050964

Youpi ! \o/
Et voila, openWRT sur un PC x86 !

Annexe

Si vous avez modifié des fichiers de la toolchain openWRT vous pouvez en avoir la liste via :
svn status

Vous pouvez aussi faire le ménage dans vos fichiers compilés via les commandes suivantes :
make clean
Supprime le contenu de « bin » et « build_dir ».

make dirclean
Supprime le contenu de « bin », « build_dir », « staging_dir » et « toolchain ».

make distclean
Supprime TOUT, fichiers compilés, configuration, liste des paquets, fichiers temporaire, … TOUT !

Conclusion

Vous avez maintenant une base openWRT fonctionnelle 🙂
Dans un prochain article j’entamerai la cross-compilation.

Le but sera de compiler un noyau linux pour un routeur TL-MR3020 (cpu Atheros) et d’installer en NAND l’image disque.
J’essayerai aussi de compiler u-boot 2012.10 (le bootloader universel pour systèmes embarqués) avec la toolchain générée durant la compilation du noyau.
Je ferai aussi un article (si j’ai le temps) sur buildroot (la version originale, pas la version modifiée par OpenWRT) pour l’architecture AVR32.

La suite au prochain épisode, en attendant bon Week-End à tous et bon bidouillage ! 🙂

Publicités

Discussion

10 réflexions sur “[Tuto] OpenWRT sur architecture x86

  1. interessent 🙂 mais j’attend quand même l’article sur le TP-link :p

    Publié par karol | 14 janvier 2013, 20 h 44 min
    • J’attaque la rédaction ce WE, mais pour le moment et jusqu’à vendredi je suis en partiels …
      La partie compilation de uboot et l’installation en nand risque de prendre un peu de temps, encore plus si je me plante et que je doit reprogrammer la flash à la main …

      Publié par skywodd | 15 janvier 2013, 20 h 57 min
  2. Ouais je comprend.. moi aussi j’ai des exams en ce moment, faut pas oublier les prioritées 🙂

    Ca t’interesserai de voir un article que j’ai rédiger sur zenk security a propos des cartes magnétique, j’y présente comment fabriquer un lecteur simple, il est pas accesible a tous le monde mais je peut t’en envoyer une copie en voyant ton article sur le RFID j’me suis dit que sa pourais t’interressé?

    Publié par karol | 15 janvier 2013, 23 h 29 min
    • T’as mon mail dans l’onglet contact 😉
      Je suis en train de faire un lecteur rfid maison perso (aprés le spoofer, le lecteur :)), mais j’ai que le schéma pour le moment …

      J’ai hésitai un moment à prendre un lecteur de bande magnétique « pour le fun » mais au final je savais pas ce que je pourrai en faire et comme niveau budget je suis pas non plus riche je l’ai pas pris …

      Publié par skywodd | 16 janvier 2013, 14 h 58 min
  3. Ohlalalalala voilà le truc que je ne sais pas faire…. Et que je vais pouvoir faire pour mon petit serveur maison :))))))
    Merci !!!!

    Publié par lassiol | 18 janvier 2013, 0 h 56 min
  4. Please provide proper verified linux bootable pendrive manual steps.

    Publié par Pankaj | 26 mai 2015, 5 h 20 min
  5. may be I am doing miskatek in fdisk partitioning steps … please perovide me manual steps using linux terminal.

    I am getting below mentioned error. Below mentioned loop continously getting. :

    New High Speed device is detected
    scsi host 6: usb storage 1-1.1:1.0
    usb2-1.2: new low-speed USB device number 4 using ehci-pci
    scsi 6:0:0:0: Direct Access Sandisk Cruzer Blade
    sd 6:0:0:0: [sdb] 15633408 512-byte logical blocks: (8.00 GB/7.45 GiB)
    sd 6:0:0:0: [sdb] Write Protect is off
    sd 6:0:0:0: [sdb] Write Cache: disabled, read cache: enabled doesn’t support DPO or FUA
    sdb : sdb1 sdb2
    sd 6:0:0:0: [sdb] Attached SCSI removable disk
    usb 2-1.2: USB disconnect, device number 4
    usb 2-1.2: new low-speed USB device number 5 using ehci-pci
    usb 2-1:2: USB disconnect, device number 5
    usb 2-1:2: new low-speed USB device number 6 using ehci-pci
    usb 2-1:2: USB disconnect, device number 6
    usb 2-1:2: new low-speed USB device number 7 using ehci-pci
    usb 2-1:2: USB disconnect, device number 7

    Publié par Pankaj | 26 mai 2015, 5 h 25 min
  6. I am totally frustrated now .

    It is great tutorial, every thing works fine for Lenovo-PC.
    But when I try to do cross compile then facing lot of issues.

    I am trying to do cross compilation with i686 tool chain which is already working with set top box.

    I want to replace tool chain of set top box with openwrt tool so that I can cross-compile successfully and can boot successfully on Set top box board. after that I should work as a router.

    Can you please tell me step by step with example ? I am facing lot of challenges since 2 months in this case. Please do the needful. (If you have provided cross-compilation tutorial with example then please let me know)

    Publié par Venkat | 29 juin 2015, 12 h 04 min
    • To use cross-compilation with an external compiler toolchain, you have to pass the ARCH and CROSS_COMPILE arguments to the make command.
      Example for ARM : make ARCH=arm CROSS_COMPILE=/usr/bin/arm-none-eabi- -j4 uImage
      (make sure that the target architecture is supported by buildroot)

      Publié par Skywodd | 3 juillet 2015, 17 h 28 min
  7. Je suis maintenant totalement frustrés.

    Il est bon tutoriel, tout fonctionne très bien pour Lenovo-PC.
    Mais lorsque je tente de faire la compilation croisée puis face beaucoup de questions.

    Je suis en train de faire la compilation croisée avec la chaîne d’outils i686 qui travaille déjà avec des set top box.

    Je veux remplacer la chaîne d’outils de set top box avec l’outil de openwrt afin que je puisse cross-compiler avec succès et puis démarrer avec succès sur Set top box bord. après que je devrais travailler comme un routeur.

    Pouvez-vous s’il vous plaît me dire étape par étape avec par exemple? Je suis confronté à beaucoup de défis depuis 2 mois dans ce cas. S’il vous plaît faire le nécessaire. (Si vous avez fourni la compilation croisée tutoriel avec l’exemple alors s’il vous plaît laissez-moi savoir)

    Publié par Venkat | 29 juin 2015, 12 h 05 min

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Skyduino devient Carnet du Maker

Le site Carnet du Maker remplace désormais le blog Skyduino pour tout ce qui touche à l'Arduino, l'informatique et au DIY.