Outils pour utilisateurs

Outils du site


tuto_a20-olinuxino-micro_generation_d_image_a_base_du_noyau_3.4.79

====== Génération d'image à base de noyau 3.4.79+ pour la carte A20-OLinuXino ====== ---- ===== Introduction ===== Pour faire suite aux articles précédents ([[tuto_a20-olinuxino-micro_decouverte_de_la_carte_de_developement_a20-olinuxino-micro|http://fablab-robert-houdin.org/wiki/doku.php?id=tuto_a20-olinuxino-micro_decouverte_de_la_carte_de_developement_a20-olinuxino-micro]] & [[tuto_a20-olinuxino-micro_un_serveur_web_en_python|Un serveur d'application Web en python, avec Flask]], et parceque j'avais envie d'essayer de générer ma propre image systeme pour ma carte A20-OLinuXino, je vous propose un pur plagia de cette [[http://olimex.wordpress.com/2014/03/07/building-a20-olinuxino-micro-debian-image-with-hardware-accelerated-video/|page web]] decrivant la generation de l'image. J'ai qd meme fait l'effort de traduire ^_^. L'oeil du lecteur avertit pourra voir tout de meme quelques commandes GIT, un peu de compil, et tout ce qu'il faut faire pour générer ces images : un amorceur (µBoot), un noyau, et un systeme (rootfs). Bonne lecture ! ---- ===== Prérequis ===== Avant de commencer, sur une ditribution Debian 7 "Wheezy", il convient de procéder à l'ajout des dépôts nécessaires de "emdebian". <code bash> $ sudo vi /etc/apt/sources.list </code> Et ajouter la ligne suivante. <code> deb http://www.emdebian.org/debian/ unstable main </code> Il convient ensuite de proceder a une mise a jour des depots. <code bash> $ sudo apt-get update </code> Sur une distribution Ubuntu 14.04 LTS, il n'est pas necessaire de proceder a l'ajout de depot. sIl est ensuite necesaaire d'installer les paquets suivants. <code bash> $ sudo apt-get install gcc-4.7-arm-linux-gnueabihf ncurses-dev uboot-mkimage build-essential git </code> Afin de travailler de maniere organiser, il est possible de se mettre a l'aise dans un espace de travail. Tout le monde travaillant selon sa methode, cette etape est facultative : <code bash> $ cd Workspaces $ mkdir workspace-Olimex $ cd worspace-Olimex $ mkdir a20_kernel_3.4 $ cd a20_kernel_3.4 </code> le retour de la commande "pwd" devrait donner ceci : <code bash> $ pwd /home/<user>/Workspaces/workspace-Olimex/a20_kernel_3.4 </code> ---- ===== Compilation de l'amorceur U-Boot ===== Afin de générer l'amorceur pour la carte A20-OLinuXino, il convient de télécharger les sources du repo distant à l'aide de GIT. <code bash> $ git clone -b sunxi https://github.com/linux-sunxi/u-boot-sunxi.git Cloning into 'u-boot-sunxi'... remote: Reusing existing pack: 261378, done. remote: Counting objects: 5, done. remote: Compressing objects: 100% (5/5), done. remote: Total 261383 (delta 0), reused 0 (delta 0) Receiving objects: 100% (261383/261383), 72.81 MiB | 148.00 KiB/s, done. Resolving deltas: 100% (205487/205487), done. Checking connectivity... done. </code> Une fois le téléchargement des sources terminé, le répertoire "u-boot-sunxi" est créé et contient le code source de U-Boot. <code bash> $ cd u-boot-sunxi </code> Le code source téléchargé est en date du dernier commit. On parle de la version "HEAD". La commande suivante indique le hash SHA-1 du dernier "commit". <code bash> [sunxi] $ git rev-parse --verify HEAD 39b2fdd0339091ae9b2e8f30d61e8f5d1413c10b </code> Les instructions cette [[http://olimex.wordpress.com/2013/11/05/building-the-ultimate-debian-sd-card-for-linux-with-kernel-3-4-for-a20-olinuxino-micro/|page]] sont valables pour le commit "8a4621c488f33089d831168bfa5bae210a5684c8". Il convient de se placer a ce commit via la commande suivante : <code bash> [sunxi] $ git reset --hard 8a4621c488f33089d831168bfa5bae210a5684c8 HEAD is now at 8a4621c sunxi: Add EU3000 board </code> La compilation se fait a l'aide de la commande suivante ; cela configurera et compilera U-Boot pour notre carte. <code bash> $ make a20-olinuxino_micro CROSS_COMPILE=arm-linux-gnueabihf- </code> A la fin de la compilation, il est possible de verifier que tout s'est bien déroulé. <code bash> [sunxi] $ ls u-boot.bin u-boot-sunxi-with-spl.bin spl/sunxi-spl.bin spl/sunxi-spl.bin u-boot.bin u-boot-sunxi-with-spl.bin </code> Si tout les fichiers listés sont présents, alors tout s'est bien passé. Nous en avons terminée avec U-Boot, pour le moment... <code bash> $ cd .. </code> Ce qui devrait nous ramener dans le répertoire "a20_kernel_3.4". ---- ===== Compilation du noyau ===== ==== Recuperation des sources ==== Nous allons ensuite récupérer les sources du noyau [[http://linux-sunxi.org/Main_Page|linux-sunxi]]. Il s'agit d'un noyau specifique pour la famille de SoC (System-on-Chip) ARM concus par la firme Alwinner. L'opération est un peu chronophage, cela a pris 1h42 chez moi... <code bash> $ git clone https://github.com/linux-sunxi/linux-sunxi Cloning into 'linux-sunxi'... remote: Counting objects: 3923602, done. remote: Compressing objects: 100% (669444/669444), done. remote: Total 3923602 (delta 3222326), reused 3923513 (delta 3222246) Receiving objects: 100% (3923602/3923602), 1.18 GiB | 357.00 KiB/s, done. Resolving deltas: 100% (3222326/3222326), done. Checking connectivity... done. Checking out files: 100% (43049/43049), done. </code> Une fois le téléchargement des sources du noyau terminé, le répertoire "linux-sunxi" est créé et contient les sources du noyau. <code bash> $ cd linux-sunxi </code> Il s'agit là de la derniere version (HEAD). La commande suivante indique le hash SHA-1 du dernier "commit". <code bash> [sunxi-3.4] $ git rev-parse --verify HEAD 39b2fdd0339091ae9b2e8f30d61e8f5d1413c10b </code> Les instructions de la page [[http://olimex.wordpress.com/2013/11/05/building-the-ultimate-debian-sd-card-for-linux-with-kernel-3-4-for-a20-olinuxino-micro/|sus-mentionnée]], indiquent de se placer au niveau du commit "a7350cb6a9ec1aae510e26cdc730f05f12e13f9f", on peut proceder ainsi : <code bash> [sunxi-3.4] $ git reset --hard a7350cb6a9ec1aae510e26cdc730f05f12e13f9f HEAD is now at a7350cb Merge branch 'reference-3.4' into sunxi-3.4 </code> ==== Configuration du noyau ==== La configuration est l'ultime etape avant la compilation du noyau, c'est ou on specifie quels modules, et quelle fonctionnalitées on souhaite avoir dans le noyau. C'est une etape importante permettant de "tuner" le coeur d'un systeme linux. Mais alors, quels modules allons nous mettre dans notre noyau ? Pas de panique, Les gens d'Olimex fournissent un fichier defconfig telechargeable ici : [[https://docs.google.com/file/d/0B-bAEPML8fwlNzBNN1N2SGpmblk/edit?pli=1]]. Il convient de le telecharger, puis de le copier dans //arch/arm/configs// <code bash> [sunxi-3.4] $ cp /home/<user>/Downloads/a20_defconfig arch/arm/configs </code> On demande ensuite de configurer le noyau sur la base du contenu du fichier defconfig. <code bash> [sunxi-3.4] $ make ARCH=arm a20_defconfig HOSTCC scripts/basic/fixdep HOSTCC scripts/kconfig/conf.o SHIPPED scripts/kconfig/zconf.tab.c SHIPPED scripts/kconfig/zconf.lex.c SHIPPED scripts/kconfig/zconf.hash.c HOSTCC scripts/kconfig/zconf.tab.o HOSTLD scripts/kconfig/conf # # configuration written to .config # </code> Il est possible de faire quelques ajustements dans la configuration du noyau, a la main : <code bash> [sunxi-3.4] $ make ARCH=arm menuconfig </code> L'outil menuconfig aporte des changements a un fichier .config existant ; Il est aussi possible de l'editer avec des outils comme vi ou nano. A l'aide de cet outil, il est possible d'ajouter ou d'enlever le support de certains peripheriques. Il convient d'observer une certaine vigilance quand a l'utilisation de cet outil. Une configuration erroné peut aboutir a un noyau qui ne fonctionnerait pas corectement. Nous pouvons a présent proceder a la compilation proprement dite du noyau. ==== Patch I2C (facultatif) ==== Olimex a créé quelques modules pouvant se chainer les uns derrieres les autres a l'aide du bus I2C. Ces modules sont labelisés UEXT. On peut donc adjoindre a notre carte favorite un accelerometre, une webcam, et que sais-je encore (https://www.olimex.com/Products/Modules/). Afin de pouvoir interfacer ces modules, il faut baisser la frequence de l'I2C de 200kHz à 100kHz. c'est le role du patch disponible a cette adresse : [[https://docs.google.com/file/d/0B-bAEPML8fwlSW44ZGdOUDUxRzA/edit?pli=1|https://docs.google.com/file/d/0B-bAEPML8fwlSW44ZGdOUDUxRzA/edit?pli=1]]. Il convient de le télécharger, si toutefois cette fonctionnalité vous interresse. <code bash> [sunxi-3.4] $ cp /home/nuptse/Downloads/sunxi-i2c.patch . [sunxi-3.4] $ patch -p0 < sunxi-i2c.patch patching file arch/arm/plat-sunxi/include/plat/i2c.h </code> Pour ma part, je ne prevoit pas d'utiliser de modules UEXT pour le moment... ==== Moi vouloir compiler ! ==== Il peut etre utile, pour eviter tout problemes de droits lors du deploiement, de passer en mode super-utilisateur. <code bash> $ sudo su </code> La compilation est ensuite une formalité. Elle se lance a l'aide de la commande suivante : <code bash> [sunxi-3.4] $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4 uImage </code> Une fois la compilation terminée, une image du noyau est générée, et le resultat devrait etre le suivant. <code bash> Image Name: Linux-3.4.67 Created: Thu Jul 10 12:52:50 2014 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 4519072 Bytes = 4413.16 kB = 4.31 MB Load Address: 40008000 Entry Point: 40008000 Image arch/arm/boot/uImage is ready </code> Il convient ensuite de procéder a la compilation des module du noyau et à leur installation. <code bash> $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4 INSTALL_MOD_PATH=out modules $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4 INSTALL_MOD_PATH=out modules_install </code> Tada ! Nous avons a présent un bootloader (U-Boot), un noyau (uImage) ainsi que tout les modules. Le fichier uImage se trouve dans le repetoire linux-sunxi/arch/arm/boot/ les fichiers de modules du noyau se trouvent dans linux-sunxi/out/lib/modules/3.x.xx ou 3.x.xx est le numeror de version du noyau. Dans notre cas le repertoire est linux-sunxi/out/lib/modules/3.4.90+ ---- ===== Préparation de la carte SD ===== Il faut à present préparer la carte SD qui accueillera le systeme. Avant de commencer, il nous faut identifier notre carte SD. Quel est son nom de device ? Il y a plusieurs methodes. On peut y aller a tâtons en utilisant la commande "ls" : <code bash> [sunxi-3.4] $ ls /dev/sda completing files sda# sda1# sda2# sda5# sda6# </code> Ce qui nous donne une liste des devices dont le noms commence par "sd". Cependant, me concernant, je ne trouve que mon disque systeme, avec mes differentes partitions. La commande suivante me donne une meilleure indication : <code bash> [sunxi-3.4] % dmesg | tail [139218.637959] mmcblk0: error -84 transferring data, sector 0, nr 8, cmd response 0x900, card status 0xb00 [139218.637962] mmcblk0: retrying using single block read [139218.640706] mmcblk0: error -84 transferring data, sector 0, nr 8, cmd response 0x900, card status 0x0 [139218.643456] mmcblk0: error -84 transferring data, sector 1, nr 7, cmd response 0x900, card status 0x0 [139218.646205] mmcblk0: error -84 transferring data, sector 2, nr 6, cmd response 0x900, card status 0x0 [139218.648973] mmcblk0: error -84 transferring data, sector 3, nr 5, cmd response 0x900, card status 0x0 [139218.651744] mmcblk0: error -84 transferring data, sector 4, nr 4, cmd response 0x900, card status 0x0 [139218.654494] mmcblk0: error -84 transferring data, sector 5, nr 3, cmd response 0x900, card status 0x0 [139218.657294] mmcblk0: error -84 transferring data, sector 6, nr 2, cmd response 0x900, card status 0x0 [139218.660041] mmcblk0: error -84 transferring data, sector 7, nr 1, cmd response 0x900, card status 0x0 </code> Ha tiens ? Mince, il y a l'air d'y avoir des erreurs... OK. Passons, nous avons notre nom de device. Lancons donc l'utilitaire de partitionnement des disques. Pour ce faire, il peut etre necessaire de le faire en mode super-utilisateur. De meme, avant toute intervention sur la table des partitions d'un disque, il faut s'assurer que ce dernier n'est pas "monté" ; ce qui est souvent fait automatiquement lorsque l'on insere une carte SD ou une clef USB. <code bash> [sunxi-3.4] $ fdisk /dev/mmcblk0 fdisk: unable to open /dev/mmcblk0: Permission denied 1 [sunxi-3.4] $ sudo su [sunxi-3.4] % mount [...] /dev/mmcblk0p1 on /media/nuptse/82CB-4D0F type vfat (rw,nosuid,nodev,uid=1000,gid=1000,shortname=mixed,dmask=0077,utf8=1,showexec,flush,uhelper=udisks2) /dev/mmcblk0p2 on /media/nuptse/9741b782-6c0b-4b83-8a39-bbfcd8826f2f type ext3 (rw,nosuid,nodev,uhelper=udisks2) [sunxi-3.4] % umount /dev/mmcblk0p* [sunxi-3.4] % fdisk /dev/mmcblk0 </code> FDisk est un utilitaire de partitionement des disque interactif en ligne de commande. Une fois fdisk lancé, taper "p" pour imprimer la liste des partitions. Puis supprimer toutes les partitions ("d"). <code bash> Command (m for help): p Disk /dev/mmcblk0: 8053 MB, 8053063680 bytes 4 heads, 16 sectors/track, 245760 cylinders, total 15728640 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x0006bc79 Device Boot Start End Blocks Id System /dev/mmcblk0p1 2048 34815 16384 83 Linux /dev/mmcblk0p2 34816 15728639 7846912 83 Linux Command (m for help): d Partition number (1-4): 1 Command (m for help): d Selected partition 2 </code> Voila toutes les partitions supprimées. Créons-en de nouvelles. La premiere sera petite (16M) et servira a l'amorcage du systeme. La seconde prendra le reste de la place, et contiendra le systeme de fichier racine. <code bash> Command (m for help): n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p Partition number (1-4, default 1): Using default value 1 First sector (2048-15728639, default 2048): Using default value 2048 Last sector, +sectors or +size{K,M,G} (2048-15728639, default 15728639): +16M Command (m for help): n Partition type: p primary (1 primary, 0 extended, 3 free) e extended Select (default p): Using default response p Partition number (1-4, default 2): Using default value 2 First sector (34816-15728639, default 34816): Using default value 34816 Last sector, +sectors or +size{K,M,G} (34816-15728639, default 15728639): Using default value 15728639 </code> l'ecriture sur la carte se fait en tapant "w" puis entrée. <code bash> Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. </code> Il convient ensuite de formater nos toutes nouvelles partitions. Là encore, un demontage préalable peut etre necessaire, dans la mesure ou l'ecriture de la table des partitions a provoqué une resynchronisation ainsi qu'une relecture des systemes de fichiers. <code bash> [sunxi-3.4] % umount /dev/mmcblk0p* [sunxi-3.4] % mkfs.vfat /dev/mmcblk0p1 mkfs.fat 3.0.26 (2014-03-07) [sunxi-3.4] % mkfs.ext3 /dev/mmcblk0p2 mke2fs 1.42.9 (4-Feb-2014) Discarding device blocks: done Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 490560 inodes, 1961728 blocks 98086 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=2009071616 60 block groups 32768 blocks per group, 32768 fragments per group 8176 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632 Allocating group tables: done Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done </code> ===== Deploiement du systeme sur la carte SD ===== ==== Bootloader ==== Il est temps a present de deployer le systeme sur la carte SD. Commencons par l'amorceur (on parle aussi de bootloader). commencons par nous placer dans le bon repertoire. Nous devrions etre dans le repertoire suivant : <code bash> % pwd /home/<user>/Workspaces/workspace-Olimex/a20_kernel_3.4 </code> On ecrit ensuite le bootloader sur la carte SD. On remarquera l'utilisation de la commande "dd". En effet, souvenez vous, nous avons créé la premiere partition a partir du block 2048. Les blocs 0 à 2048 contiennent le secteur d'amorcage. La commande "dd" ecrira directement. <code bash> % dd if=u-boot-sunxi/u-boot-sunxi-with-spl.bin of=/dev/mmcblk0 bs=1024 seek=8 259+1 records in 259+1 records out 265320 bytes (265 kB) copied, 0,114387 s, 2,3 MB/s </code> ==== Noyau ==== Afin de deployer le noyau, nous allons créer un point de montage dans /mnt. <code bash> % mkdir /mnt/mmcblk </code> Nous pouvons a présent monter un systeme de fichier sur ce point de montage. Cela se fait a l'aide de la commande "mount". <code bash> % mount /dev/mmcblk0p1 /mnt/mmcblk </code> L'image noyau est ensuite simplement copiée a la racine du systeme de fichier nouvelement monté. <code bash> % cp linux-sunxi/arch/arm/boot/uImage /mnt/mmcblk </code> Il faut ensuite recupérer le fichier script.bin a l'adresse suivante : [[https://docs.google.com/file/d/0B-bAEPML8fwlekZySFRTZEN6eXM/edit?pli=1]]. Il s'agit là d'un fichier tres important comportant des parametres de configuration comme l'assignation des ports GPIO, parametres de la memoire DDR, resolution de la Video, etc... Idem, on le copie a la racine, a coté de l'image noyau. <code bash> % cp /home/nuptse/Downloads/script.bin /mnt/mmcblk </code> On synchronise puis demonte la carte SD. <code bash> % sync % umount /dev/mmcblk0p1 </code> ==== Deploiement du rootfs ==== Le noyau et le bootloader sont prets. Il faut a present deployer une ditribution Linux rootfs. La contruction d'un rootfs est un autre sujet, qui pourrait faire l'objet d'un tuto a part entiere. Il faut savoir qu'il en existe des deja pre-contruits que l'on peut utiliser comme bon nous semble. Olimex fournit un rootfs debian : [[https://drive.google.com/file/d/0B-bAEPML8fwlXzRobTBrbldmUEE/edit?usp=sharing|https://drive.google.com/file/d/0B-bAEPML8fwlXzRobTBrbldmUEE/edit?usp=sharing]] Il convient donc de monter la seconde partition, celle en ext3, qui accueillera le systeme. <code bash> % mount /dev/mmcblk0p2 /mnt/mmcblk </code> L'archive rootfs téléchargée peut ensuite etre decompressée de la maniere suivante. <code bash> % tar xzvf /home/<user>/Downloads/debian_34_67_fs.tgz -C /mnt/mmcblk % ls /mnt/mmcblk bin dev home lost+found mnt proc run selinux sys usr boot etc lib media opt root sbin srv tmp var </code> Il faut ensuite remplacer les modules noyau par ceux que l'on a compilé. <code bash> % rm -rf /mnt/mmcblk/lib/modules/* % cp -rfv linux-sunxi/out/lib/modules/3.4.79+/ /mnt/mmcblk/lib/modules/ </code> On procede de meme pour les firmwares. <code bash> % rm -rf /mnt/mmcblk/lib/firmware/ % cp -rfv linux-sunxi/out/lib/firmware/ /mnt/mmcblk/lib/ </code> On synchronise puis demonte la carte SD. <code bash> % sync % umount /dev/mmcblk0p2 </code> ---- ==== Mise en route ==== Il convient ensuite de retirer la carte du lecteur de cartes, puis de l'inserer dans la A20-OLinuXino, dans son emplacement ; et de mettre sous tension. On aura auparavant connecté la carte à un ecran a l'iade d'un cable HDMI, ou bien a l'aide d'une liaison serie. Le user/password par defaut est : root/olimex. Il convient de le changer rapidement avant de la connecter au reseau ; et par extension a internet. ---- ===== Remarques, Propositions d'améliorations, Questions ===== Vous pouvez poster vos remarques, propositions d’amélioration, et questions sur le forum, dans la discussion prévue a cet effet : [[http://fablab-robert-houdin.org/fablab/phpBB-3.0.11-fr/phpBB3/viewtopic.php?f=5&t=43]] ----

tuto_a20-olinuxino-micro_generation_d_image_a_base_du_noyau_3.4.79.txt · Dernière modification: 2014/07/10 12:58 par spelle