J’ai acheté cet ordinateur « presque » complet pour quelques dizaines d’euros. C’est en suivant les tutoriel disponibles sur le net que j’ai installé la même distrib linux que sur mon desktop, a savoir Archlinux. Le dockstar fonctionnait de façon satisfaisante avec son nouvel OS, mais n’avait pas la fiabilité que je souhaite, en particulier la résistance aux coupures de courant … J’ai donc effectué les modifications suivantes :

update 6 fev 2010 : Ajout RTC

Consommation

Tout d’abord, quelques mesures de conso. J’ai coupé le câble d’alimentation pour y insérer un ampèremètre, et mesure vraiment la consommation du dockstar, sans prendre en compte le rendement et l’imprécision d’une mesure avec un wattmètre. Il y a une clef USB de stockage, ainsi qu’un clef USB wifi branchées dessus. J’ai mesuré

  • 230 mA dans uBoot
  • 300 mA pendant le boot
  • 290 mA en « idle »
  • 360 mA au max pendant une compilation.
  • 200 mA après la commande « halt ».

Sous 12V, le dockstar consomme donc au max 4.3W ! C’est léger 😉

Installation du bootloader

En suivant cette documentation, tout se passe bien : http://jeff.doozan.com/debian/uboot/

Voici ma synthèse :

  • Faire en sorte que l’accès au net ne fonctionne plus, mais que le dockstar puisse avoir son IP par DHCP
  • Se connecter dessus en ssh (root/stxadmin)
  • Tuer le process de pogoplug : killall hbwd
  • remettre le net en marche
  • cd /tmp
    wget http://jeff.doozan.com/debian/uboot/install_uboot_mtd0.sh
    chmod +x install_uboot_mtd0.sh
    ./install_uboot_mtd0.sh
  • Installer la netconsole

Netconsole

A faire impérativement 😉 Cette console par réseau permet de voir ce qu’il se passe au moment du chargement du noyau. On peut aussi s’amuser à modifier et tester les paramètres de U-boot sans risque, puisque rien n’est sauvegardé en flash.

fw_setenv serverip 192.168.14.100
fw_setenv ipaddr 192.168.14.150
fw_setenv if_netconsole 'ping $serverip'
fw_setenv start_netconsole 'setenv ncip $serverip; setenv bootdelay 10; setenv stdin nc; setenv stdout nc; setenv stderr nc; version;'
fw_setenv preboot 'run if_netconsole start_netconsole'

Et sur le PC, qui à l’IP 192.168.14.100, il faut faire la commande suivante:

nc -l -u -p 6666

root filesystem en ext4

En suivant la procédure d’installation de plugbox linux, on crée une clef USB bootable, qui n’a qu’une seule partition en ext2. Après quelques temps, je n’arrivait plus a me connecter sur le dockstar. Et pour cause, le système de fichier était tout corrompu … E2fsck s’est fait un plaisir a essayer de réparer le système de fichier, mais en enlevant tous les fichiers corrompus. Et il n’en restait plus beaucoup à la fin, pas de quoi booter en tous cas. En effet, le système de fichier ext2 n’offre pas de protection contre l’extinction sauvage, sans démontage préalable. Les systèmes de fichier modernes se plaignent beaucoup moins d’un tel traitement. J’ai choisi d’utiliser ext4. Bon, on formate, et on réinstalle tout. Mais en mieux 😉

J’ai créé et formaté les partitions suivantes sur ma clef USB:

* /dev/sda1 : 50 Mo / ext2
* /dev/sda2: 500 Mo / swap
* /dev/sda3: (le reste) /ext4

sda1

Sur sda1, il y a juste le noyau dans la racine. Il faut bien penser a faire un lien symbolique qui crée un répertoire boot/ comme ceci :

ln -s . boot/

Ceci est nécessaire parce que uBoot cherche le noyau dans le répertoire boot/ sur sda1.

J’ai donc pour sda1:

.
├── boot -> .
├── lost+found
└── uImage

sda2

J’ai rajouté une partition de swap, au cas ou. Comme le système n’a que 128Mo de RAM, ca evitera de planter si je fais un truc trop gros. Pour l’instant, je n’ai pas eu besoin de l’utiliser.

sda3

Cette partition en ext4 est utilisé pour mettre tout le reste du système de fichier.

Dans /etc/fstab, il faut rajouter les lignes suivantes :

/dev/sda3  /     ext4   defaults,relatime   0 1
/dev/sda1  /boot ext2   defaults            0 1
/dev/sda2  swap  swap   defaults            0 0

Il faut ensuite expliquer à uBoot que le rootfs n’est plus au même endroit. En utilisant la netconsole, j’ai modifié les paramètres de uBoot avec les commandes suivantes :

setenv usb_rootfstype "ext4"
setenv usb_scan_1 "usb=0:1 dev=sda3"
setenv usb_scan_2 "usb=1:1 dev=sdb3"
setenv usb_scan_3 "usb=2:1 dev=sdc3"
setenv usb_scan_4 "usb=3:1 dev=sdd3"

Pour booter, il faut taper:

 boot

Si tout s’est bien passé, le dockstar a booté avec sa nouvelle partition en ext4. Pour rentre les modification de la configuration de uBoot persistantes, il faut faire un

saveenv

avant la commande boot.

Problème de détection de la clef USB

Il arrivait parfois que lors d’un reboot, la clef USB ne soit plus reconnue par uBoot, et que le dockstar ne démarre plus sous notre OS préféré.

La netconsole affiche dans ce cas:

scanning bus for devices... 3 USB Device(s) found
       scanning bus for storage devices... error in inquiry
0 Storage Device(s) found

« error in inquiry » est la source du problème, et « 0 Storage Device(s) found » ne donne pas un bon espoir.

Pour corriger j’ai ca, j’ai modifié la commande « bootcmd » dans uBoot de cette facon:

setenv bootcmd "usb reset; usb start ;run force_rescue_bootcmd; run ubifs_bootcmd; run usb_bootcmd; usb stop; run rescue_bootcmd; run pogo_bootcmd; reset"

De la sorte, le « scanning bus for devices » est executé 2 fois, et la clef USB est bien trouvé la 2ème fois :

scanning bus for devices... 3 USB Device(s) found
       scanning bus for storage devices... error in inquiry
0 Storage Device(s) found
(Re)start USB...
USB:   Register 10011 NbrPorts 1
USB EHCI 1.00
scanning bus for devices... 3 USB Device(s) found
       scanning bus for storage devices... 1 Storage Device(s) found

Root en ext3

Finalement, ce n’est pas la peine de s’embêter autant pour avoir un système de fichier stable … L’ext3 est supporté par uBoot. Il suffit donc d’avoir la partition root en ext3 (au lieu du ext2) et de faire la commande suivante:

setenv usb_rootfstype "ext3"

Problème de DHCP

Le dhcp du dockstar a souvent du mal à demander une adresse IP au serveur. J’ai l’impression que c’est quand la lease précédente est toujours valide, le dockstar ne demande pas de nouvelle adresse.

Pour cela, j’efface systématiquement la lease précédente dans la commande PRE_UP. J’utilise netcfg, et dans les fichiers de configuration dans /etc/netword.d, j’ai ajouté :

PRE_UP="rm -f /var/lib/dhcpcd/dhcpcd-wlan0.lease"

ou pour une connection ethernet :

PRE_UP="rm -f /var/lib/dhcpcd/dhcpcd-eth0.lease"

Pour l’instant, ca a l’air de mieux fonctionner.

Hardware MOD : ajout de la RTC

Quelques forums parlaient de la modification nécessaire pour ajouter la RTC. RTC signifie « Real Time Clock ». C’est un petit bout de circuit qui continue à compter l’heure même que le courant est coupé. C’est à ca que sert la pile à côté du BIOS dans les PC.

Dans le dockstar, le CPU a la logique pour maintenir l’heure, mais les composants externes n’ont pas été intégrés au PCB (économies …). Voici comment les câbler soit même.

Ce schéma indique ou sont les pins à câbler :

Il y a a cet endroit des résistances de 0 ohms. Il faut tout d’abord les dessouder pour les enlever.

Puis il faut câbler le quartz, les 2 condos de 22pF, la résistance de 10M et la pile selon ce schéma :

Le résultat final donne quelque chose comme ca :

Comme à mon habitude, j’ai acheté les composants chez gotronic :

  • 05220 Quartz 32.768 KHz 0.60€
  • 16400 5x CONDENSATEURS 22pF 1206 0.75€
  • 16280 10 RESIST. CMS 3.9M 1206 0.30€
  • 09475 Pile 1.50€
        • http://spritesmods.com/?art=macsearm&page=8
        • http://gsg-elektronik.de/?id=92
        • http://plugapps.com/forum/viewtopic.php?f=6&t=258&start=10

    Attention !!!

    Attention ! L’opération n’est quand même pas simple…. Les pistes sont toutes petites ! A ma première tentative, l’une des plots de connexion s’est arraché quand j’ai voulu tordre les pâtes du quartz après soudure. Donc un de mes dockstar n’aura jamais de RTC 😉 Il faut donc bien plier les pâtes des composants comme il faut AVANT de souder. Il faut aussi isoler le montage avec du scotch, pour éviter de faire court-circuit avec le blindage métallique du haut du boîtier. Attention aussi aux dates de montage des systèmes de fichiers. Il y a des vérifications, et le système de fichier ne se monte pas si il y a un décalage de date trop grand … Du coup, le dockstar ne boutait plus quand la RTC fonctionnait … J’ai donc débranché la pile, démarré le dockstar (01-01-1970), soudé la pile, et reboot à chaud (01-01-2000).

    Le résultat est la, on voit dans /var/log/kernel.log:

    avant:

    Jan  1 01:00:22 plug2 kernel: rtc-mv rtc-mv: internal RTC not ticking
    Jan  1 01:00:22 plug2 kernel: drivers/rtc/hctosys.c: unable to open rtc device (rtc0)

    après:

    Feb  6 15:12:28 plug1 kernel: rtc-mv rtc-mv: rtc core: registered rtc-mv as rtc0
    Feb  6 15:12:28 plug1 kernel: rtc-mv rtc-mv: setting system clock to 2011-02-06 15:12:11 UTC (1297005131)

    sources

Reinstallation du kernel debian

Suite au message:

Loading file "/boot/uImage" from usb device 0:1 (usbda1)
1436032 bytes read
Loading file "/boot/uInitrd" from usb device 0:1 (usbda1)
4532471 bytes read
Wrong Image Format for bootm command
ERROR: can't get kernel image!

J’ai recréé les images que uBoot attend:

/usr/bin/mkimage -A arm -O linux -T kernel  -C none -a 0x00008000 -e 0x00008000 -n Linux-2.6.32-5 -d /boot/vmlinuz-2.6.32-5-kirkwood /boot/uImage
/usr/bin/mkimage -A arm -O linux -T ramdisk -C gzip -a 0x00000000 -e 0x00000000 -n initramfs -d /boot/initrd.img-2.6.32-5-kirkwood /boot/uInitrd