Hier je bidouillais sur mon Dockstar et un programme que je testais s’est montré trop gourmand en ressource puis à crashé, mon système ne répondais plus du tout. Impatient j’ai rebooté électriquement mon Dockstar, erreur fatale, impossible après cela de me connecter en SSH sur Debian.
Voici les symptômes au début du boot le système est pingable, la lumière du Dockstar clignote en vert, puis le système ne répond plus au ping et la lumière s’éteint….
Voici les étapes suivi pour ramener le Dockstar à la vie.
Booter sous pogoplug
Tout d’abord je me suis assuré que le problème venait de Debian et pas du Dockstar lui-même, pour cela il suffit de débrancher tous les périphériques USB et de rebooter, au bout d’un certain temps le système devrait être accessible en SSH avec l’utilisateur root (comme lors de la toute première connexion au Dockstar sous Pogoplug) :
ssh root@[Ip du Dockstar]
Avec le mot de passe stxadmin
Si ce n’est pas le cas il va vous falloir vous fabriquer un connecteur JTAG, heureusement pour moi je n’en ai pas eu besoin
Installer le uBoot modifié
Jeff Doozan (encore lui) à créé une version modifié du uBoot (Universal Bootloader) permettant d’interagir avec le dockstar lors du boot, nous allons l’installer (peut n’est ce pas nécessaire, je n’ai pas vérifié mais il semblerait que le uBoot modifié soit déjà installé dès lors que l’on à installé Debian avec le script de Jeff Doozan)
cd /tmp wget http://jeff.doozan.com/debian/uboot/install_uboot_mtd0.sh chmod +x install_uboot_mtd0.sh ./install_uboot_mtd0.sh
Configurer netconsole
Netconsole permet de transmettre les messages du noyaux via UDP (réseau), il faut configurer netconsole (inclus dans le noyau 2.6 de Linux) pour qu’il emette les message de boot vers un autre PC via le réseau.
On réalise cette configuration avec l’utilitaire fw_setenv installé par le uBoot de Jeff Dozan, dans mon cas cet utilitaire est présent dans /usr/sbin qui n’est pas dans mon path d’où le chemin complet à chaque fois :
/usr/sbin/fw_setenv serverip [adresse IP PC] /usr/sbin/fw_setenv ipaddr [adresse IP Dockstar] /usr/sbin/fw_setenv if_netconsole 'ping $serverip' /usr/sbin/fw_setenv start_netconsole 'setenv ncip $serverip; setenv bootdelay 10; setenv stdin nc; setenv stdout nc; setenv stderr nc; version;' /usr/sbin/fw_setenv preboot 'run if_netconsole start_netconsole'
Diagnostiquer le boot du Dockstar
Sur le PC qui recevra les messages netconsole lancer la commande :
nc -lu 6666
Pour Ubuntu (11.04) sur Debian il semblerait que ce soit nc -l -u -p 6666 ce qui m’a valu un peu de recherche…
Rebooter le Dockstar (shutdown -r now sur la console en SSH que vous devez avoir sous la main pour avoir fait les manip ci-dessus) et miracle sur votre autre console (celle avec le nc) les messages de boot s’affichent :
Messages de boot sous pogoplug :
U-Boot 2010.09 (Oct 23 2010 - 11:49:22) Marvell-Dockstar/Pogoplug by Jeff Doozan Hit any key to stop autoboot: 0 (Re)start USB... USB: Register 10011 NbrPorts 1 USB EHCI 1.00 scanning bus for devices... 2 USB Device(s) found scanning bus for storage devices... 0 Storage Device(s) found ** Block device usb 0 not supported ** Invalid boot device ** Creating 1 MTD partitions on "nand0": 0x000002500000-0x000010000000 : "mtd=3" UBI: attaching mtd1 to ubi0 UBI: physical eraseblock size: 131072 bytes (128 KiB) UBI: logical eraseblock size: 129024 bytes UBI: smallest flash I/O unit: 2048 UBI: sub-page size: 512 UBI: VID header offset: 512 (aligned 512) UBI: data offset: 2048 UBI: attached mtd1 to ubi0 UBI: MTD device name: "mtd=3" UBI: MTD device size: 219 MiB UBI: number of good PEBs: 1751 UBI: number of bad PEBs: 1 UBI: max. allowed volumes: 128 UBI: wear-leveling threshold: 4096 UBI: number of internal volumes: 1 UBI: number of user volumes: 0 UBI: available PEBs: 1730 UBI: total number of reserved PEBs: 21 UBI: number of PEBs reserved for bad PEB handling: 17 UBI: max/mean erase counter: 1/1 UBIFS error (pid 0): ubifs_get_sb: cannot open "ubi:rootfs", error -19 Error reading superblock on volume 'ubi:rootfs'! ** Block device usb 0 not supported ** Block device usb 1 not supported ** Block device usb 2 not supported ** Block device usb 3 not supported ** Block device usb 0 not supported ** Block device usb 0 not supported Wrong Image Format for bootm command ERROR: can't get kernel image! stopping USB.. ### JFFS2 loading 'uboot-original-mtd0.kwb' to 0x800000 Scanning JFFS2 FS: ........ done. ### JFFS2 load complete: 524288 bytes loaded to 0x800000 ## Starting application at 0x00800200 ...
J’ai ensuite rebranche ma clé USB qui contient mon système Debian et le disque dur qui contient divers point de montage et rebooté une autre fois le Dockstar
Messages de boot sous Debian :
U-Boot 2010.09 (Oct 23 2010 - 11:49:22) Marvell-Dockstar/Pogoplug by Jeff Doozan Hit any key to stop autoboot: 0 (Re)start USB... USB: Register 10011 NbrPorts 1 USB EHCI 1.00 scanning bus for devices... 4 USB Device(s) found scanning bus for storage devices... 2 Storage Device(s) found Loading file "/rescueme" from usb device 0:1 (usbda1) ** File not found /rescueme reading /rescueme.txt ** Unable to read "/rescueme.txt" from usb 0:1 ** Creating 1 MTD partitions on "nand0": 0x000002500000-0x000010000000 : "mtd=3" UBI: attaching mtd1 to ubi0 UBI: physical eraseblock size: 131072 bytes (128 KiB) UBI: logical eraseblock size: 129024 bytes UBI: smallest flash I/O unit: 2048 UBI: sub-page size: 512 UBI: VID header offset: 512 (aligned 512) UBI: data offset: 2048 UBI: attached mtd1 to ubi0 UBI: MTD device name: "mtd=3" UBI: MTD device size: 219 MiB UBI: number of good PEBs: 1751 UBI: number of bad PEBs: 1 UBI: max. allowed volumes: 128 UBI: wear-leveling threshold: 4096 UBI: number of internal volumes: 1 UBI: number of user volumes: 0 UBI: available PEBs: 1730 UBI: total number of reserved PEBs: 21 UBI: number of PEBs reserved for bad PEB handling: 17 UBI: max/mean erase counter: 1/1 UBIFS error (pid 0): ubifs_get_sb: cannot open "ubi:rootfs", error -19 Error reading superblock on volume 'ubi:rootfs'! Loading file "/boot/uImage" from usb device 0:1 (usbda1) 1 bytes read Found bootable drive on usb 0:1 Loading file "/boot/uImage" from usb device 0:1 (usbda1) 1433640 bytes read Loading file "/boot/uInitrd" from usb device 0:1 (usbda1) 4887353 bytes read ## Booting kernel from Legacy Image at 00800000 ... Image Name: Debian kernel 2.6.32-5-kirkwood Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 1433576 Bytes = 1.4 MiB Load Address: 00008000 Entry Point: 00008000 Verifying Checksum ... OK ## Loading init Ramdisk from Legacy Image at 01100000 ... Image Name: Debian ramdisk 2.6.32-5-kirkwood Image Type: ARM Linux RAMDisk Image (gzip compressed) Data Size: 4887289 Bytes = 4.7 MiB Load Address: 00000000 Entry Point: 00000000 Verifying Checksum ... OK Loading Kernel Image ... OK OK Starting kernel ...
On voit / confirme alors que le boot du Dockstar fonctionne parfaitement puisque le kernel Debian démarre. Le problème se situe donc au niveau de ce dernier…
Réparer Debian
Après avoir éteint le Dockstar, j’ai branché la clé USB contenant Debian sur mon PC et commencé par faire une vérification du disque :
sudo fsck /dev/sdb1
La clé contenait une erreur :
fsck de util-linux-ng 2.17.2 e2fsck 1.41.14 (22-Dec-2010) /dev/sdb1 est monté. AVERTISSEMENT !!! Le système de fichiers est monté. Si vous continuez vous ***ALLEZ*** causer des dommages ***SÉVÈRES*** au système de fichiers. Souhaitez-vous réellement continuer (o/n)? oui /dev/sdb1 contient un système de fichiers comportant des erreurs, vérification forcée. Passe 1 : vérification des i-noeuds, des blocs et des tailles Passe 2 : vérification de la structure des répertoires Passe 3 : vérification de la connectivité des répertoires Passe 4 : vérification des compteurs de référence I-noeud 8098 non attaché Connecter à /lost+found<o>? oui le compteur de référence de l'i-noeud 8098 est 2, devrait être 1. Corriger<o>? oui Passe 5 : vérification de l'information du sommaire de groupe /dev/sdb1: ***** LE SYSTÈME DE FICHIERS A ÉTÉ MODIFIÉ ***** /dev/sdb1 : 28353/108864 fichiers (1.3% non contigus), 217045/435448 blocs
J’ai ensuite re-généré l’image du kernel, pour cela on démarre le Dockstar sous pogoplug (sans clé USB) et on se connecte dessus en SSH (voir 1er paragraphe).
On connecte alors la clé USB contenant Debian, on la monte, on fait un chroot sur le point de montage et on régénère l’image du kernel :
mount /dev/sda1 /mnt /usr/sbin/chroot /mnt /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
Sortie de la commande :
Image Name: Linux-2.6.32-5 Created: Tue Jun 21 23:58:21 2011 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 1433576 Bytes = 1399.98 kB = 1.37 MB Load Address: 0x00008000 Entry Point: 0x00008000
Puis
/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
Sortie de la commande :
Image Name: initramfs Created: Tue Jun 21 23:58:25 2011 Image Type: ARM Linux RAMDisk Image (gzip compressed) Data Size: 4887289 Bytes = 4772.74 kB = 4.66 MB Load Address: 0x00000000 Entry Point: 0x00000000
Laisser les périphériques branchés, sortir du chroot (exit) et rebooter et normalement miracle le Dockstar devrait démarrer sous Debian…
Sources :