jeudi, décembre 14, 2017
Nom d'utilisateur : Mot de passe :
Home > Dossiers > Administration système > Netboot FreeBSD 8.0 sur un Sheeva Plug
[NEWS]
Envoyé par unreal
Le SheevaPlug est un engin marrant. Dans un boitier de la taille d'un bloc secteur 220 Volts, il embarque un ordinateur complet, idéal pour réaliser serveur de fichiers, concentrateur VPN, firewall, petit serveur Web, bureau à distance ou point d'accès Wifi, les possibilités sont illimitées. Surtout dans la mesure où le Sheeva consomme moins de 3 Watts à vide et 7 Watts en pleine charge.

Grâce à cet article vous allez pouvoir netbooter votre SheevaPlug en FreeBSD, afin de préparer un environnement applicatif, qui pourra être migré ensuite sur flash pour rendre le boitier autonome.

Mais avant toute chose, voyons de quoi il s'agit.


Sommaire



Présentation de la bête

IMG_2589.jpg
Un SheevaPlug qui rode sur ma table de salon



Extérieurement on dispose de la connectique suivante :
  • Un port Ethernet cuivre gigabit
  • Un port USB 480Mbit/s
  • Un port mini USB JTAG/console série
  • Un port SD compatable SDHC
  • Un bouton reset
  • Pas de port VGA


Et dedans :
  • Un SoC Marvell Kirkwood à 1.2GHz
  • 512Mo de DDR2 400MHz
  • 512Mo de flash NAND
  • Alimentation à découpage compatible 100-240VAC


Et tout ça pour $99 (+frais de port) via le partenaire de Marvell.

C'est clairement un jouet idéal pour geek qui a envie de s'initier au monde du hardware embarqué à moindre frais.


Pré-requis

Afin de monter la maquette vous aurez besoin des éléments suivants :
- Un serveur de build sous FreeBSD, non nécessairement ARM. J'ai utilisé la configuration suivante :

# uname -a
FreeBSD nas.localdomain 7.2-RELEASE-p3 FreeBSD 7.2-RELEASE-p3 #0: Sat Aug 1 14:51:14 CEST 2009     root@nas.localdomain:/usr/obj/usr/src/sys/GENERIC amd64


Vous n'allez vraiment pas vouloir builder directement sur le SheevaPlug !

- Un serveur TFTP
- Un serveur DHCP (attention, il doit être configurable !)
- Un serveur NFS sous FreeBSD

Par mesure de simplicité, il est supposé dans cet article que serveur de build, TFTP et NFS sont regroupés sur une seule machine.


Préconfiguration

Dans ce paragraphe, nous allons configurer plusieurs éléments essentiels de la maquette.

Serveur TFTP

Préparer un dossier qui servira de root TFTP :
mkdir -p /home/tftp/sheevaplug


Ensuite éditez /etc/inetd.conf et activez le serveur TFTP :
tftp    dgram udp     wait    root    /usr/libexec/tftpd     tftpd -l -s /home/tftp


Il ne reste plus qu'à relancer inetd :
/etc/rc.d/inetd restart


Serveur NFS

Préparer un dossier qui servira de root NFS diskless :
mkdir -p /home/diskless/sheevaplug


Editez ensuite /etc/exports pour déclarer le nouveau share NFS :
/usr/home/diskless/sheevaplug -maproot=0:0    1.2.3.4


Remplacez 1.2.3.4 par l'IP ou nom résolvable du SheevaPlug.

Démarrez ou redémarrez le service NFS selon les instructions du Handbook.

Serveur DHCP

Le serveur DHCP sert à paramétrer le point de montage root (/) pendant le boot de l'OS. Editez votre fichier de configuration DHCPd, généralement dhcpd.conf, pour définir un host statique, par exemple :

host sheevaplug {
        hardware ethernet 00:50:43:01:67:d0;
        fixed-address 1.2.3.4;

        # Netboot stuff.
        option tftp-server-name "1.2.3.5";
        filename "sheevaplug/kernel.bin";
        next-server 1.2.3.5;
        option root-path "/usr/home/diskless/sheevaplug/";
}


Remplacez 1.2.3.4 par l'IP du SheevaPlug et 1.2.3.5 par l'IP du TFTP/NFS.


Build FreeBSD

Passons maintenant aux choses sérieuses. Utilisez csup pour télécharger les sources de FreeBSD 8.0 (en RC1 au moment où j'écris ces lignes) ; si vous disposez déjà des sources d'une version antérieure, je vous conseille de supprimer /usr/src avant de lancer csup.

Vous pouvez utiliser le fichier de configuration suivant pour csup :

*default host=cvsup3.fr.FreeBSD.org
*default base=/usr
*default prefix=/usr
*default release=cvs tag=RELENG_8
*default delete use-rel-suffix
*default compress
src-all
src-sys
src-base


Avant de lancer le build proprement dit, un peu de théorie. Si vous avez lu la documentation du CPU 88F6281, vous aurez certainement constaté ceci :

- 16KB-Instruction and 16KB-Data 4-way, set-associative L1 cache
- 256KB unified 4-way, set-associative L2 cache


256ko de cache L2 est très faible par rapport aux 2-12Mo des CPU Intel modernes et va clairement conditionner les options de compilation que nous allons utiliser. Si vous avez un peu l'habitude de compiler sur du Intel, vous avez peut-être envie d'utiliser des options du type CFLAGS= -O2 -pipe -fomit-frame-pointer -funroll-loops mais clairement il ne faut pas utiliser des options de ce type sur un CPU avec aussi peu de cache L2. Nous allons donc opter pour CFLAGS= -Os -pipe pour générer du code plus petit afin qu'il rentre plus aisément dans le cache L2 du CPU.

Editez donc /etc/make.conf pour fixer les options de compilation :

# For building Sheeva/ARM
CFLAGS= -Os -pipe -w
.if ${.CURDIR:M*/lib/libstand*}
CFLAGS= -O -pipe -w
.endif


Le bloc if...endif sert à définir d'autres options de compilation quand -Os ne fonctionne pas.

Lancez ensuite le build :

$ su -
# DESTDIR=/usr/home/diskless/sheevaplug
# TFTPDIR=/usr/home/tftp/sheevaplug
# cd /usr/src
# rm -rf ../obj
# export DESTDIR
# make buildworld TARGET_ARCH=arm
# make installworld TARGET_ARCH=arm
# make distrib-dirs TARGET_ARCH=arm
# make distribution TARGET_ARCH=arm
# make buildkernel TARGET_ARCH=arm KERNCONF=SHEEVAPLUG
# mv $TFTPDIR/kernel.bin $TFTPDIR/kernel.bin.old
# cp /usr/obj/arm/usr/src/sys/SHEEVAPLUG/kernel.bin $TFTPDIR


Vérifiez à chaque étape qu'il n'y a pas d'erreur. A la fin vous aurez :
- L'image de boot tftp dans /usr/home/tftp/sheevaplug
- Le root NFS dans /usr/home/diskless/sheevaplug

Pour finir, préparer la configuration pour utilisation sans disque :

# echo 'hostname="sheevaplug"' > $DESTDIR/etc/rc.conf
# echo 'sshd_enable="YES"' >> $DESTDIR/etc/rc.conf
# echo 'rpcbind_enable="YES"' >> $DESTDIR/etc/rc.conf
# echo 'nfs_client_enable="YES"' >> $DESTDIR/etc/rc.conf
# echo 'rpc_lockd_enable="YES"' >> $DESTDIR/etc/rc.conf
# echo 'rpc_statd_enable="YES"' >> $DESTDIR/etc/rc.conf
# echo 'ntpdate_enable="YES"' >> $DESTDIR/etc/rc.conf
# echo 'ntpdate_flags="europe.pool.ntp.org"' >> $DESTDIR/etc/rc.conf



Configuration de la console série

Le configuration console du SheevaPlug se fait via le mini port USB qu'on voit sur la photo de début d'article. En interne, ce port est relié à un FT2232C qui émule un port série sur USB. L'avantage de ce chipset est qu'il est correctement supporté par divers systèmes d'exploitation, mais le problème ici est qu'il présente un VID/PID (vendor ID et product ID) qui ne sont absolument pas reconnus par les drivers supportant le chipset FT2232C. Je vous conseille donc l'utiliser Linux pour accéder à la console série parce qu'il est possible de forcer VID/PID assez simplement :

rmmod ftdi_sio
modprobe ftdi_sio vendor=0x9e88 product=0x9e8f

Plus d'informations sur cette page.

Utilisez ensuite l'émulateur de votre choix pour accéder au device série, /dev/ttyUSB1 si vous utilisez Linux, par exemple Screen, Nanocom ou Minicom. Rebootez le SheevaPlug et vous devriez voir le loader U-boot qui s'initialise :

uboot.png
U-Boot en cours d'initialisation



Configuration U-Boot

U-Boot est un projet intéressant, même si apparemment le code source est un peu onéreux.

Il supporte plusieurs choses :
  • Boot sur flash NAND interne
  • Boot sur disques mass storage
  • Boot réseau (TFTP/NFS)
  • Les systèmes de fichiers EXT, FAT, et FFS/UFS (moyennant patchs)
  • Aide en ligne
  • Auto-complétion des commandes
  • Enchaînement d'actions
  • Création de scripts
  • Client DHCP


Nous allons utiliser U-Boot pour télécharger une image de boot en mémoire (à l'adresse 0x00900000) et de l'exécuter.

Démarrez le SheevaPlug et appuyez sur une touche pour interrompre le boot. La commande printenv liste la configuration actuelle :

Marvell>> printenv
baudrate=115200
loads_echo=0
console=console=ttyS0,115200 mtdparts=nand_mtd:0xc0000@0(uboot)ro,0x1ff00000@0x100000(root)
CASset=min
MALLOC_len=1
ethprime=egiga0
bootargs_root=root=/dev/nfs rw
[...]


Il peut être intéressant de réaliser une sauvegarde avant modification.

La commande setenv permet de modifier une variable. Nous allons l'utiliser pour éditer les paramètres de boot :

setenv netmask 255.255.255.0
setenv ipaddr 1.2.3.4
setenv serverip 1.2.3.5
setenv image_name sheevaplug/kernel.bin
setenv rootpath /usr/home/diskless/sheevaplug
setenv loadaddr 900000
setenv bootcmd 'tftpboot $(loadaddr) $(image_name); go $(loadaddr)'
saveenv


Remplacez les deux IP par celles de votre configuration. La commande saveenv enregistre la configuration en mémoire flash.

La commande boot démarre le système à partir du shell :

freebsd_boot.png
FreeBSD en cours de Netboot


Après son amorçage, le kernel montera le partage NFS spécifié par DHCP et lancera /sbin/init qui permettra au système de démarrer complétement. A ce stade, il existe un bug que je n'ai pas été en mesure de comprendre : le kernel passe le paramètre "-s" à init qui démarre alors en mode single user :

start_init: trying /sbin/init
Enter full pathname of shell or RETURN for /bin/sh:


Il est possible de quitter le mode single user avec ^D, ou en modifiant le code source d'init :

/usr/src/sbin/init/init.c
        while ((c = getopt(argc, argv, "dsf")) != -1)
                switch (c) {
                case 'd':
                        devfs = 1;
                        break;
                /*case 's':
                        initial_transition = single_user;
                        break;*/
                case 'f':
                        runcom_mode = FASTBOOT;
                        break;
                default:
                        warning("unrecognized flag '-%c'", c);
                        break;
                }



Pour finir

Il reste quelques dernières choses à faire. Modifiez la timezone :

cp /usr/share/zoneinfo/Europe/Paris /etc/localtime


Si vous prévoyez d'installer des ports compilés localement, éditez /etc/make.conf :

CFLAGS=-march=armv5te -Os -pipe


Dans un prochain dossier, j'expliquerai comment migrer cet environnement NFS vers un disque local.


Sources

Divers sites ont servi pour réaliser ce dossier ; les voici dans un ordre quelconque :



Historique

- 15 octobre 2009 : version initiale
- 20 septembre 2010 : liens périmés

Posté le 14/10/09 à 22:40

Netboot FreeBSD 8.0 sur un Sheeva Plug
Vous pourriez commenter si vous aviez un compte !