Archives par mot-clé : Linux

Le File System

File System Debian

Le plus simple pour commencer est de récupérer une arborescence de File System dans le répertoire Distributions dédié à la carte TS7800 de chez Technologic System. J’en ai essayé 2 , une Lenny et une sarge.

$> cd ~/Download <br>
$> wget ftp://ftp.embeddedarm.com/ts-arm-sbc/ts-7800-linux/distributions/debian-sarge-udev-512MB-apr282010.tar.gz <br>

Après, on le recopie sur le média que l’on veut. Ici, je mets le file system sur une clé USB.

$> cd /media/disk <br>
$> tar xzvf ~/Download/debian-sarge-udev-512MB-apr282010.tar.gz <br>
$> sync

Par la suite, lorsque l’on voudra exécuter les programmes développés pour MyBot, il suffira

  • soit branche la clé USB sur le PC de développement et on les recopie directement dans /bin.
  • soit on laisse la clé USB en place, sur la carte TS7800, et on se connecte par ssh et on les recopie aussi dans /bin.

Adaptation du File System pour MyBot

Les services inutiles

Si on regarde dans /etc/rc5.d, qui correspond au répertoire qui contient tous les scripts qui vont démarrer en runlevel 5, on voit qu’il y a des services qui ne vont pas me servir.

$> ls -l
 lrwxrwxrwx 1 root root   16 janv. 22 17:08 S01devfsd -> ../init.d/devfsd
 lrwxrwxrwx 1 root root   18 janv. 22 17:08 S10sysklogd -> ../init.d/sysklogd
 lrwxrwxrwx 1 root root   15 janv. 22 17:08 S11klogd -> ../init.d/klogd
 lrwxrwxrwx 1 root root   23 janv. 22 17:08 S17mysql-ndb-mgm -> ../init.d/mysql-ndb-mgm
 lrwxrwxrwx 1 root root   19 janv. 22 17:08 S18mysql-ndb -> ../init.d/mysql-ndb
 lrwxrwxrwx 1 root root   17 janv. 22 17:08 S18portmap -> ../init.d/portmap
 lrwxrwxrwx 1 root root   15 janv. 22 17:08 S20exim4 -> ../init.d/exim4
 lrwxrwxrwx 1 root root   15 janv. 22 17:08 S20inetd -> ../init.d/inetd
 lrwxrwxrwx 1 root root   17 janv. 22 17:08 S20makedev -> ../init.d/makedev
 lrwxrwxrwx 1 root root   15 janv. 22 17:08 S20mysql -> ../init.d/mysql
 lrwxrwxrwx 1 root root   17 janv. 22 17:08 S20ntpdate -> ../init.d/ntpdate
 lrwxrwxrwx 1 root root   13 janv. 22 17:08 S20ssh -> ../init.d/ssh
 -rwxr-xr-x 1 root root 1974 oct. 19  2007 S20wpasupplicant
 lrwxrwxrwx 1 root root   20 janv. 22 17:08 S21nfs-common -> ../init.d/nfs-common
 lrwxrwxrwx 1 root root   17 janv. 22 17:08 S50wu-ftpd -> ../init.d/wu-ftpd
 lrwxrwxrwx 1 root root   14 janv. 22 17:08 S89cron -> ../init.d/cron
 lrwxrwxrwx 1 root root   17 janv. 22 17:08 S91apache2 -> ../init.d/apache2
 lrwxrwxrwx 1 root root   20 janv. 22 17:08 S91apache-ssl -> ../init.d/apache-ssl
 lrwxrwxrwx 1 root root   19 janv. 22 17:08 S99rmnologin -> ../init.d/rmnologin
 lrwxrwxrwx 1 root root   23 janv. 22 17:08 S99stop-bootlogd -> ../init.d/stop-bootlogd

Pour l’instant, j’enlève :

$> rm S17mysql-ndb-mgm
$> rm S18mysql-ndb
$> rm S20mysql
$> rm S91apache2
$> rm S91apache-ssl

Le réseau

On peut configurer l’@ IP de l’interface ethernet eth0 dans /etc/network/interfaces. On ajoute les lignes suivantes.

iface eth0 inet static
address 192.168.2.2
network 192.168.2.0
netmask 255.255.255.0
broadcast 192.168.2.255
gateway 192.168.2.1

Dans /etc/hostname, on indique le nom de la machine que l’on veut. {Note}: il se retrouvera aussi dans le prompt du shell.

La liaison série

Une fois que le kernel a démarré, le programme init est exécuté. Il s’aide du fichier inittab qui décrit l’ensemble des processus qui doivent être lancés au démarrage du système (ou à l’arrêt)

Dans /etc/inittab, on choisit la configuration de la liaison série que l’on veut.

T0:23:respawn:/sbin/getty -L ttyAM0 115200 vt100

Le kernel Linux sur une carte TS7800

Kernel 2.6.32.7

Contrairement aux cartes TS7200, les TS7800 sont livrés avec un kernel 2.6.21. Au lieu d’utiliser les cartes comme ca, j’ai décidé aussi qu’il serait mieux de pouvoir utiliser un kernel plus récent. Dans les derniers kernels, on a la chance d’avoir la carte TS7800 qui est prise en charge. On prendra la configuration dans arch/arm/configs/orion5x_defconfig.

On commence par récupérer le kernel dans The Linux Kernel Archives. J’ai récupéré la dernière version stable 2.6.32.7 puis on la décompresse

$> cd ~/Projets/MyBot/Logiciel
$> wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.7.tar.bz2
$> tar xzvf linux-2.6.32.7.tar.bz2
$> cd linux-2.6.32.7

Maintenant, on peut commencer la compilation proprement dit.

Si l’on veut effacer une configuration précédente et repartir d’une configuration intacte.

$> make ARCH=arm CROSS_COMPILE=/opt/x-toolx/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi- distclean

On applique la configuration correspondant à la carte orion5x_defconfig.

$> make ARCH=arm CROSS_COMPILE=/opt/x-toolx/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi- orion5x_defconfig

Ensuite, on peut modifier la configuration

$> make ARCH=arm CROSS_COMPILE=/opt/x-toolx/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi- menuconfig

Comme modifications, on peut :

  • Changer la ligne de commande, dans Boot Options/Default kernel command string
root=/dev/sda1 rw init=/sbin/init lpj=1662976 console=ttyS0,115200 rootdelay=5
  • OProfile system profiling : No

Ensuite, on lance la compilation

$> make ARCH=arm CROSS_COMPILE=/opt/x-toolx/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi-

Si on en reste la, lors de l’exécution de ce kernel on obtiendra le message d’erreur suivant :

>> TS-BOOTROM - built Dec  4 2008
>> Copyright (c) 2008, Technologic Systems
>> Booting from SD card...
 .
 .
 .
 .
 Uncompressing Linux........................................................................................................................................... done, booting the kernel.
Error: unrecognized/unsupported machine ID (r1 = 0x0000020e).
Available machine support:
ID (hex)        NAME
 00000674        Technologic Systems TS-78xx SBC
Please check your kernel config and/or bootloader.

 

Ce message indique que la machine n’est pas reconnue. Sur les architectures ARM, le bootloader qui charge puis exécute le kernel lui fournit certaines informations. Les registres R1 et R2 contiennent respectivement l’ID de l’architecture et le pointeur sur les structures atags.

Pour connaitre les identifiants connus, il existe le fichier {arch/arm/tools/mach-types}. La valeur qui nous intéresse est la suivante.

ts78xx                  MACH_TS78XX             TS78XX                  1652

Il faut maintenant initialiser le registre R1 juste avant la première instruction du kernel. Pour ca, j’utilise le programme devio. Donc si ce programme n’est pas disponible sur votre distribution, il faut le récupérer sur http://sourceforge.net/projects/devio/ puis on le compile

$> cd ~/Projets/
$> tar xzvf ~/Download/devio-1.2.tar.gz
$> cd devio-1.2
$> ./configure
$> make

Il ne reste plus qu’a recopie l’exécutable devio dans un répertoire accessible dans le PATH. On utilise alors devio pour générer les quelques octets qui seront mis en début du fichier kernel. Pour rappel, l’ID pour la TS7800 est 1652 0x674

$> cd ~/Projets/MyBot/Logiciel/linux-2.6.32.7
$> cd arch/arm/boot
$> devio > foo 'wl 0xe3a01c06,4' 'wl 0xe3811074,4'
$> cat foo zImage > zImage.fix

On pourra ensuite utiliser le fichier zImage.fix comme image à utiliser.

Puis l’on recopie les modules dans l’arboresence correspondante de notre « File System ».

$> sudo make ARCH=arm CROSS_COMPILE=/opt/x-toolx/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi- INSTALL_MOD_PATH=/media/disk modules_install

Une fois que l’on a un kernel, on peut le recopier dans le répertoire accessible par tftp.

$> cp arch/arm/boot/zImage.fix /tftpboot

Le File System sur une Compact Flash

La carte TS7200 est équipé d’un lecteur de Compact Flash. On en profitera pour mettre le File System dessus.

Il faut dans un premier temps, il faut créer une partition sur la carte CF. On connect la carte mémoire sur le PC.

Sur un PC linux, si la carte Flash est montée automatiquement, on la démonte.

$> umount /dev/sdc1

Puis on utilise l’outils fdisk.

$> fdisk /dev/sdc1

puis

  1. d (pour effacer les partitions existantes. A répéter pour toutes les partitions)
  2. n (Pour les nouvelles partitions)
  3. p (Pour les partitions primaires)
  4. 1 (Faire la partition primaire n°1)

Touche {{Enter}} pour le premier cylindre par défaut

Touche {{Enter}} pour le dernier cylindre par défaut

p (Afficher la table des partitions)

Si la première partition n’a pas d’étoile sur le champ Boot,

  1. Appuyer sur la touche ‘a’ puis ‘1’ pour mettre la première partition comme bootable.
  2. Pour valider ces changements, appuyer sur ‘w’ pour écrire la nouvelle table sur le disque.

Puis on crée le système de fichier, EXT2 dans notre cas, pour qu’il soit accessible par redboot.

$> mkfs.ext2 /dev/sdc1

Une fois la mémoire Compact Flash formatée, on compresse le file system.

$> cd ~/Projets/ts7200/rootfs-debian
 $> tar cjvf ../rootfs-debian.bz2 *

Puis on le décompresse dans la Compact Flash

$> mount /dev/sda1 /media/disk
 $> cd /media/disk
 $> tar -xjvf ~/Projets/ts7200/rootfs-debian.bz2

Pour vérifier l’intégrité de la Flash, on peut utiliser

$> fsck /dev/sdc1

Le bootloader Redboot

Ayant changé ma carte TS7200 par une TS7800, je n’utilise pas redboot sur MyBot, mais je laisse cet article au cas ou quelqu’un en aurait besoin.

Redboot

Les cartes TS7200  de chez Technology System sont livrées avec Redboot déjà installé en flash.

La configuration par défaut de Redboot sur la carte TS7200 est la suivante, et on peut l’obtenir avec la commande fconfig -l :

RedBoot> fconfig -l
 Run script at boot: true
 Boot script:
 .. fis load vmlinux
 .. exec -c "console=ttyAM0,115200 root=/dev/mtdblock1
Boot script timeout (100ms resolution): 1
 Use BOOTP for network configuration: false
 Gateway IP address: 192.168.0.11
 Local IP address: 192.168.0.50
 Local IP address mask: 255.255.255.0
 Default server IP address: 192.168.0.11
 dns_ip: 192.168.0.11
 Network hardware address [MAC]: 0x00:0xD0:0x69:0x41:0xFC:0xA7
 GDB connection port: 9000
 Force console for special debug messages: false
 Network debug at boot time: false

Avec cette configuration, le kernel Linux vmlinux est chargé depuis la flash interne depuis le système de fichier de redboot. La liste de partition Redboot peut être obtenue avec la commande fis list, et le résultat est :

 RedBoot> fis list
 Name             FLASH addr  Mem addr    Length      Entry point
 (reserved)       0x60000000  0x60000000  0x00620000  0x00000000
 RedBoot          0x60620000  0x60620000  0x00040000  0x00000000
 vmlinux          0x60660000  0x00218000  0x000C0000  0x00218000
 RedBoot config   0x607C0000  0x607C0000  0x00001000  0x00000000
 FIS directory    0x607E0000  0x607E0000  0x00020000  0x00000000

La section (reserved) contient 3 blocs qui seront accessible par Linux à travers mtdblock0, mtdblock1 ou mtdblock2

Le mapping de ces 3 blocs est le suivant :

0x000000000000-0x000000020000 : "TS-BOOTROM"
0x000000020000-0x000000620000 : "RootFS"
0x000000620000-0x000000800000 : "Redboot"

Le File System fourni est donc bien en /dev/mtdblock1

Différentes solutions pour démarrer

Le Kernel et le File Sytem peut être localisé à plusieurs endroits. Pour choisir, il faut modifier la configuration de redboot avec la commande fconfig.

La première commande concerne le kernel.

Le Kernel en flash interne

 fis load vmlinux

Pour cela, il faut que le kernel soit dans la flash au bon endroit. La procédure est la suivante:

  • On regarde ou est localisé zImage
RedBoot> fis list
 Name              FLASH addr  Mem addr    Length      Entry point
 (reserved)        0x60000000  0x60000000  0x00620000  0x00000000
 RedBoot           0x60620000  0x60620000  0x00040000  0x00000000
 zImage            0x60660000  0x00218000  0x00140000  0x00218000
 RedBoot config    0x607C0000  0x607C0000  0x00001000  0x00000000
 FIS directory     0x607E0000  0x607E0000  0x00020000  0x00000000
  • On efface l’ancienne image
RedBoot> fis delete zImage
 Delete image 'zImage' - continue (y/n)? y
 ... Erase from 0x60660000-0x607a0000: ..........
 ... Erase from 0x607e0000-0x60800000: .
 ... Program from 0x01fe0000-0x02000000 at 0x607e0000: .
  • On charge zImage en RAM
RedBoot> load -v -r -b 0x00218000 -h 192.168.2.1 -m tftp zImage
 -
 Raw file loaded 0x00218000-0x003477d3, assumed entry at 0x00218000

Il faudra noté la taille du code transféré pour la commande suivante.

0x003477D3 - 0x00218000 = 0x0012F7D3
  • Enfin, on tranfère la zone de RAM en Flash

On peut le faire avec la commande suivante

fis create -b <mem_base> -l <image_length> [-s <data_length>] [-f <flash_addr>] [-e <entry_point>] [-r <ram_addr>] [-n] <name>

pour créer une section dans le File System de redboot.

RedBoot> fis create -b 0x00218000 -f 0x60660000 -l 0x0012f7d3 -r 0x00218000 -e 0x00218000 zImage
 ... Erase from 0x60660000-0x607a0000: ..........
 ... Program from 0x00218000-0x003477d3 at 0x60660000: ..........
 ... Erase from 0x607e0000-0x60800000: .
 ... Program from 0x01fe0000-0x02000000 at 0x607e0000: .

Le Kernel en Compact Flash

load -r -b 0×00218000 -m disk hda1:zImage
  • Le Kernel par tftp sur un PC
load -v -r -b 0x00218000 -h 192.168.2.1 -m tftp zImage

La seconde commande concerne le File System

  • File System en flash interne
exec -c "console=ttyAM0,115200 root=/dev/mtdblock1 init=/sbin/init rootdelay=2"
  • File System en Compact Flash
exec -c "console=ttyAM0,115200 root=/dev/sda1 init=/sbin/init rootdelay=2"
  • File System par NFS sur un PC
exec –c "console=ttyAM0,115200 root=/dev/nfs ip=192.168.2.2 nfsroot=192.168.2.1:/home/gil/Projets/ts7200/rootfs-debian init=/sbin/init rootdelay=2"

Le kernel Linux sur une carte TS7200

Au départ, je devais utiliser cette carte sur MyBot, c’est pour cela que j’ai commencer à regarder comment utiliser un kernel que j’avais recompilé. Par la suite, j’ai plutôt choisi la TS7800 pour ces capacités. Je laisse quand même cet article pour ceux que ca intéresse.

Kernel 2.6.29-ts

Les cartes TS7200 sont livrées avec un kernel 2.4.x. Au lieu d’utiliser les cartes comme ca, j’ai décidé qu’il serait mieux de pouvoir modifier le kernel et donc qu’il était nécessaire de le recompiler. Comme point de départ, j’ai choisi un 2.6.29 déja patché pour les cartes de chez Technologic System.

Il est assez dur à trouver, allez voir ici ftp://ftp.embeddedarm.com/application-kits/ts-wifibox/sources/tskernel-2.6.29-ts-src.tar.gz, il y est peut-être encore.

Kernel 2.6.29

Sinon on peut toujours récupérer le kernel 2.29 sur le git officiel et appliquer les patchs qui se trouve ici http://mcrapet.free.fr/linux-2.6.29.1-ts7200_matt-7.txt. Allez sur son site http://mcrapet.free.fr, on y trouve des patchs pour d’autres versions de kernel, à vous de voir.

 $> cd ~/Projet

On récupère l’arborescence complète Linux, attention c’est gros.

$> git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git linux-git
$> cd linux-git

On peut lister toutes les versions disponibles

$> git tag -l

On choisit notre 2.6.29

$> git checkout -f v2.6.29

Et on applique les patchs

$>  git apply ../linux-2.6.29.1-ts7200_matt-7/linux-2.6.29.1-ts7200_matt-7.patch

La compilation du Kernel

On extrait d’abord l’arborescence complète que l’on vient de télécharger (ou on va directement dans le répertoire dans le cas du kernel récupéré par git)

$> cd /home/gil/Projets/ts7200
$> tar xzvf /home/gil/Download/tskernel-2.6.29-ts-src.tar.gz
$> cd linux-2.6.29-ts

On recopie les configs que l’on a récupérées ici : http://mcrapet.free.fr/.

$> cp ../linux-2.6.29.1-ts7200_matt-7/configs/ts72* arch/arm/configs/.

Maintenant, la compilation proprement dit.

On efface tout pour repartir d’une configuration intacte.

$> make ARCH=arm CROSS_COMPILE=/opt/x-toolx/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi- distclean

On applique la config ts7200_eabi_full_defconfig.
Pour info, voici les configurations disponibles

 

  • ts7200_eabi_full: Parfait pour le développement, NFS/USB root support, NOR flash support.  ETH, CF (compact flash), I2C, SPI, GPIO, LED, RTC (ep93xx-rtc & rtc-m48t86), HID are embedded.
    • zImage is ~1.9mo. Note: NFS client est environ 200kb.
  • ts72xx_eabi_full: La même que « ts7200_eabi_full » mais sans les spécificités de la TS-7200.  No MTD (NOR flash) support, no PATA (compatch flash).
    • zImage is ~1.8mo.
  • ts7250_eabi_full: La même que « ts72xx_eabi_full » mais avec les spécificités de la TS-7250.  MTD (NAND flash) support.
    • zImage is ~1.8mo.
  • ts72xx_eabi_mid: La même que « ts72xx_eabi_full » mais USB/HID/SCSI sont mis en modules.   Disabled « CPU Frequency scaling » & « CPU idle PM support ».
    • zImage is ~1.6mo.
  • ts72xx_eabi_small: La même que « ts72xx_eabi_mid » mais I2C, SPI, LED, EXT2 & EXT3 mis en modules.
    • zImage is ~1.4mo.
 $> make ARCH=arm CROSS_COMPILE=/opt/x-toolx/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi- ts7200_eabi_full_defconfig

J’ai choisi la configuration mais je veux aussi un kernel le plus petit possible car il doit remplacer celui présent dans la flash embarquées sur la carte. La place disponible est 0x160000 Octets.

Voici un exemple, mon fichier .config, avec ça on obtient un kernel 2.6.29 de 0x12F7BC Octets.

$> make ARCH=arm CROSS_COMPILE=/opt/x-toolx/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi- menuconfig

Ensuite, on lance la compilation

$> make ARCH=arm CROSS_COMPILE=/opt/x-toolx/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi-

Puis l’on recopie les modules dans l’arboresence correspondante de notre « File System ».

$> sudo make ARCH=arm CROSS_COMPILE=/opt/x-toolx/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi- INSTALL_MOD_PATH=/media/disk modules_install

Une fois que l’on a un kernel, on peut le recopier dans le répertoire accessible par tftp.

$> cp arch/arm/boot/zImage /tftpboot