Skyduino:~#
Articles
Corrigé, projet, tutoriel

OpenWRT sur TL-MR3020 en pivot root intégral sur clef usb

Bonjour tout le monde !

Avant de commencer je tiens à m’excuser pour le retard, cet article était prévu il y a déjà plus d’un mois …
J’ai du faire face à pas mal de problèmes sur ce projet, en particulier avec le bootloader u-boot.

J’avais prévu de vous montrer comment cross-compiler u-boot, mais malheureusement je n’y suis pas arrivé avec le TL-MR3020.
Bref, la vie continue et voici donc la suite de mon aventure dans le merveilleux monde d’openWRT 😉

Pour plus d’informations sur openWRT et le TL-MR3020 :
http://wiki.openwrt.org/toh/tp-link/tl-mr3020

La procédure complète du « pivot root » est détaillée sur le wiki d’openWRT :
http://wiki.openwrt.org/doc/howto/extroot#openwrt.attitude.adjustment.trunk

Pré-requis avant de commencer :

Avant de faire quoi que soit il vous faudra un système linux, de préférence un debian ou dérivé (ubuntu, mint, …).
Personnellement je travaille sur un MINT (Mate) 14.

Je part de principe que vous avez déjà ouvert le routeur et installé un câble série pour le boot.
Si ce n’est pas le cas je vous invite vivement à lire mon précédent article sur ce sujet :
https://skyduino.wordpress.com/2012/09/22/hack-tl-mr3020-openwrt-bidouillage-usb-wifi-ethernet/

Il vous faudra aussi avoir compris parfaitement mon précédent article sur la toolchain openWRT :
https://skyduino.wordpress.com/2013/01/12/tuto-openwrt-sur-architecture-x86/

De même il vous faudra un minimum de maitrise en console / commandes linux !

Le but :

Qu’est ce que je vais vous expliquer et pourquoi ?
Le titre de cet article est surement un peu flou pour vous, surtout la partie « pivot root intégral sur clef usb ».

Pour faire simple résumons d’abord la situation :
le TL-MR3020 possède une mémoire flash de 4Mo qui contient le bootloader, le kernel, le rootfs et les données de calibration du wifi.

4Mo c’est petit, trop petit pour faire quelque chose de vraiment intéressant, pour un routeur « classique » c’est suffisant mais pas pour nous.
Si on enlève la place prise par le bootloader et les données de calibration il reste environ 3.8Mo … juste de quoi faire passer un kernel et un rootfs minimaliste.

La technique du « pivot root » est simple : on lance un kernel + rootfs minimaliste ne contenant que le strict minimum pour démarrer, puis on « pivote » la racine du système de fichier (« / ») sur un périphérique externe, ici une clef usb.
On est alors uniquement limité par la taille de la clef usb, autant dire que même avec une petite clef usb de 128Mo c’est largement suffisant pour n’importe quel projet !

Ce qu’il faut savoir c’est que openWRT fait de base un « pivot root », mais pas intégral (pas de la racine complète), juste d’une partie du système de fichier et d’une manière très particulière.
Pour comprendre le pivot root d’origine il faut d’abord comprendre le système de fichier d’origine.

Un système openWRT classique est constitué de 3 parties :
– le kernel qui contient la « vmlinuz » (le noyau linux compressé),
– le rootfs en lecture seul (qui contient les exécutables et les fichiers de configuration de base),
– le rootfs_data en lecture/écriture qui contient les fichiers modifiés / ajoutés / supprimés du rootfs en lecture seul.

Cela peut paraitre un peu bizarre d’avoir deux rootfs, dont le second n’est qu’une surcouche du premier, mais en fait c’est très intelligemment conçu.
Le rootfs en lecture seul est encapsulé dans un système de fichier squashfs, qui par définition ne peut pas être modifié !
Cela permet la mise en place d’une fonctionnalité très intéressante pour nous bidouilleurs : le « failsafe ».

Le système de fichier squashfs est dit « idiots proof » (« résistant aux idiots » pour les anglophobes), vous ne pouvez pas le modifier ou le corrompre.
De fait si le routeur se trouve mal configuré ou que celui ci est bloqué à cause d’un fichier corrompu il suffit de le faire démarrer en mode « failsafe » (via une séquence de touches au boot, ou via l’appui sur un bouton hardware) pour que celui ci n’utilise que le système de fichier en lecture seul.
Comme celui ne peut pas être modifié le routeur démarre de fait sur une configuration « propre », juste suffisante pour modifier les fichiers qui posent problème dans le rootfs en lecture/écriture.

Sauf que c’est bien beau, mais nous utilisateurs voulons pouvoir modifier la configuration de notre routeur et par extension des fichiers du système de fichier.
C’est pourquoi le système de fichier en lecture seul est « recouvert » par un second système de fichier, lui en lecture/écriture (format JFFS2).
Ce système de fichier ne contient que les fichiers modifiés, ajoutés ou supprimés du système de fichier principal.
C’est en quelque sorte un « masque » du système de fichier de base.

Pour que nous utilisateurs ne voyons qu’un seul système de fichier en lecture/écriture le noyaux monte ce second système de fichier par dessus le premier en mode « overlay » (recouvrement).
C’est en quelque sorte un pivot root mais en gardant le système de fichier d’origine (on pivot sur soi même en ajoutant un second système de fichier par dessus).

Il est facile de ce rendre compte de l’astuce avec la commande « mount », le système de fichier de base est monté sur « /rom » alors que celui en lecture/écriture est monté sur « /overlay ».
Mais grâce à la magie du pivotage et de l’overlay on ne voit qu’un seul système de fichier sur « / » en lecture/écriture.

Pour une utilisation classique c’est très bien, le système de fichier en lecture seul nous laisse une porte de sortie en cas d’erreur de configuration et le second système de fichier nous permet de modifier les fichiers comme on le souhaite.
Sauf que ce second système de fichier occupe une place ridiculement faible en mémoire … juste suffisante pour modifier quelques fichiers de configuration.

C’est là qu’entre en jeu le « pivot root intégral ».
Le principe est simple : on fait comme pour le rootfs_data mais à la différence qu’on monte un système de fichier complet (donc sans overlay) depuis un périphérique externe.
Le rootfs d’origine n’a alors besoin que de contenir que quelques exécutables nécessaires au pivot root, de même qu’un noyaux linux contenant les drivers nécessaire pour nos bidouilles.

Pour plus d’info sur les systèmes de fichier embarqués disponible sur openWRT :
http://wiki.openwrt.org/doc/techref/filesystems

Etape 1 : installation initiale d’openWRT depuis le firmware d’origine :

Avant de ce lancer dans la création d’un noyaux openWRT et d’un rootfs pour le pivot root il faut installer une image openWRT basique sur le routeur.

Pour ce faire il suffit de suivre ces quelques instructions :
1) Tout d’abord il faut se rendre sur les dépôts d’openWRT pour télécharger la dernière image disponible pour notre routeur :
http://downloads.openwrt.org/snapshots/trunk/ar71xx/

L’image qui nous intéresse est la version « factory » en squashfs :
http://downloads.openwrt.org/snapshots/trunk/ar71xx/openwrt-ar71xx-generic-tl-mr3020-v1-squashfs-factory.bin

2) une fois l’image téléchargée il va falloir l’installer sur le routeur, pour cela il suffit de ce rendre sur la page d’administration de celui ci :

home_origine

upgrade_form

Une fois le routeur redémarré vous devriez avoir un openWRT tout beau, tout neuf 🙂
Pour en être sûr il suffit de ce connecter dessus, mais avant cela il faut activer le ssh.

Pour activer le ssh :
telnet "adresse IP du routeur"
passwd
"un mot de passe"
"le mot de passe une seconde fois"

Une fois que le mot de passe root est paramétré la connexion telnet devrait se désactiver, à partir de maintenant tout passera par ssh.

Pour ouvrir une session ssh sur le routeur :
ssh-keygen -f "~/.ssh/known_hosts" -R "adresse IP du routeur"
ssh root@"adresse IP du routeur"

(la génération des clefs ssh n’est requise qu’avant la première connexion)

Si tout ce passe bien vous devriez tomber sur une console openWRT en root :

openwrt_home

(oui c’est une console TeraTerm sous windows … j’ai fait les visuels pour l’article au moment de la rédaction)

Annexe : le partitionnement de la mémoire flash :

En regardant le log du boot sur la consolé série on peut voir comment openWRT organise la mémoire flash :
[ 0.500000] 0x000000000000-0x000000020000 : "u-boot"
[ 0.510000] 0x000000020000-0x0000000fde18 : "kernel"
[ 0.510000] mtd: partition "kernel" must either start or end on erase block boundary or be smaller than an erase block -- forcing read-only
[ 0.520000] 0x0000000fde18-0x0000003f0000 : "rootfs"
[ 0.530000] mtd: partition "rootfs" must either start or end on erase block boundary or be smaller than an erase block -- forcing read-only
[ 0.540000] mtd: partition "rootfs" set to be root filesystem
[ 0.550000] mtd: partition "rootfs_data" created automatically, ofs=2A0000, len=150000
[ 0.550000] 0x0000002a0000-0x0000003f0000 : "rootfs_data"
[ 0.560000] 0x0000003f0000-0x000000400000 : "art"
[ 0.570000] 0x000000020000-0x0000003f0000 : "firmware"

Étape 2 : sauvegarde

Avant de continuer on va profiter de notre image fonctionnelle pour faire quelques sauvegardes.
Je ne doute pas du fait que mes lecteurs soit intelligents, mais une erreur est si vite arrivée …

On va donc sauvegarder deux partitions :
– le bootloader (au cas où)
– la calibration du wifi (ART)

Pour ce faire on commence par s’assurer que le partitionnement de la mémoire est correct :
root@OpenWrt:/dev# cat /proc/mtd
dev: size erasesize name
mtd0: 00020000 00010000 "u-boot"
mtd1: 000fb6f0 00010000 "kernel"
mtd2: 002d4910 00010000 "rootfs"
mtd3: 00150000 00010000 "rootfs_data"
mtd4: 00010000 00010000 "art"
mtd5: 003d0000 00010000 "firmware"

u-boot -> le bootloader -> mtd0
art -> les données de calibration du wifi -> mtd4
(firmware est un alias de kernel+rootfs, j’en parlerai plus tard)

On va ensuite allez dans /dev pour sauvegarder mtd0 et mtd4 (en lecture seul, par sécurité) :
root@OpenWrt:/dev# cd /dev
root@OpenWrt:/dev# ls -l | grep mtd
crw-r--r-- 1 root root 90, 0 Jan 1 00:00 mtd0
crw-r--r-- 1 root root 90, 1 Jan 1 00:00 mtd0ro
crw-r--r-- 1 root root 90, 2 Jan 1 00:00 mtd1
crw-r--r-- 1 root root 90, 3 Jan 1 00:00 mtd1ro
crw-r--r-- 1 root root 90, 4 Jan 1 00:00 mtd2
crw-r--r-- 1 root root 90, 5 Jan 1 00:00 mtd2ro
crw-r--r-- 1 root root 90, 6 Jan 1 00:00 mtd3
crw-r--r-- 1 root root 90, 7 Jan 1 00:00 mtd3ro
crw-r--r-- 1 root root 90, 8 Jan 1 00:00 mtd4
crw-r--r-- 1 root root 90, 9 Jan 1 00:00 mtd4ro
crw-r--r-- 1 root root 90, 10 Jan 1 00:00 mtd5
crw-r--r-- 1 root root 90, 11 Jan 1 00:00 mtd5ro
brw-r--r-- 1 root root 31, 0 Jan 1 00:00 mtdblock0
brw-r--r-- 1 root root 31, 1 Jan 1 00:00 mtdblock1
brw-r--r-- 1 root root 31, 2 Jan 1 00:00 mtdblock2
brw-r--r-- 1 root root 31, 3 Jan 1 00:00 mtdblock3
brw-r--r-- 1 root root 31, 4 Jan 1 00:00 mtdblock4
brw-r--r-- 1 root root 31, 5 Jan 1 00:00 mtdblock5
root@OpenWrt:/dev# dd if=/dev/mtd0ro of=/tmp/mtd0.backup
root@OpenWrt:/dev# dd if=/dev/mtd4ro of=/tmp/mtd4.backup

Maintenant que les sauvegardes sont dans le /tmp du routeur on va les récupérer par ssh sur le pc :
scp root@192.168.1.1:/tmp/mtd0.backup mtd0.backup.bin
scp root@192.168.1.1:/tmp/mtd4.backup mtd4.backup.bin

Après s’être assurer que les fichiers ont belle et bien été reçu on va pouvoir commencer à jouer avec le noyaux et le rootfs 🙂

Pour les idiots personnes peu attentionnés voici mes sauvegardes de mtd0 et mtd4 :
ATTENTION : la calibration est unique pour chaque routeur, si vous perdez votre partition ART le wifi ne marchera plus !
Vous pouvez toujours essayer d’utiliser mes données de calibrations mais il y a peu de chance que cela fonctionne sur un autre routeur que le mien !
https://dl.dropbox.com/u/53604363/tlmr3020/mtd0.backup.bin
https://dl.dropbox.com/u/53604363/tlmr3020/mtd4.backup.bin

Étape 3 : compilation du noyau + rootfs pour le pivot root :

Pour cette partie je vous laisse vous débrouiller seul 😉
L’important est de garder le strict minimum, pas besoin de serveur dhcp, dns, pas besoin de NAT, … faites le vide dans les paquets.
L’important se situe dans le menu « base system » où il vous faudra cocher « blockmount » et « hotplug2 » en plus des paquets par défaut !

Mais au contraire soyez aussi généreux avec les modules noyaux !
Prenez tout les modules noyaux qui vont seront nécessaires par la suite, gardez en tête que seul le système de fichier sera pivoté, pas le noyau !

N’oubliez pas d’installer les modules requis pour le pivot root en usb :
– kmod-usb-core
– kmod-usb2
– kmod-usb-ohci
– kmod-usb-storage
– kmod-fs-ext4
– kmod-scsi-generic

Afin de vous faciliter la vie voici le fichier de configuration que j’ai configuré, testé et approuvé par mes soins :
https://dl.dropbox.com/u/53604363/tlmr3020/tlmr3020.config

De même qu’une version pré-compilé du firmware pour les féniants 🙂
https://dl.dropbox.com/u/53604363/tlmr3020/openwrt-ar71xx-generic-tl-mr3020-v1-squashfs-factory.bin

Remarque : pensez à sauvegarder votre .config (fichier caché par défaut) une fois votre configuration prête 😉

Étape 4 : installation de l’image custom :

Vous avez votre image « openwrt-ar71xx-generic-tl-mr3020-v1-squashfs-factory.bin » faite maison dans le dossier bin/ar71xx, la vie est belle, les oiseaux chantent … oui mais comment l’installer maintenant ?

Deux solutions :
– une simple, qui n’est possible que si l’image précédente est fonctionnelle
– une complexe, qui marche dans tous les cas, que l’image précédente soit fonctionnelle ou non

Méthode 1 : installation via openWRT :

C’est la méthode simple, possible uniquement si l’image précédente est fonctionnelle.
Pour installer une nouvelle image tout se résume à une commande !

Tout d’abord il faut envoyer la nouvelle image dans le /tmp du routeur avec scp depuis le pc.
scp openwrt-ar71xx-generic-tl-mr3020-v1-squashfs-factory.bin root@192.168.1.1:/tmp/firmware.bin

Ensuite il suffit d’utiliser l’outil mtd en mode « write » pour écrire l’image en mémoire flash :
mtd -r write /tmp/firmware.bin firmware

Décodons un peu la commande mtd :
mtd : la commande qui permet d’écrire, d’effacer et de lire la mémoire flash
-r : reboot le routeur une fois l’écriture fini
/tmp/firmware.bin : le fichier binaire à écrire en mémoire
firmware : la partition cible

Remarque concernant la partition « firmware » :
En réalité ce n’est pas une partition physique, c’est un alias !

L’image « factory » que l’on génère à la fin de la compilation contient en réalité deux choses :
– le noyau (kernel) linux compressé en lzma (la « vmlinuz »)
– le rootfs en lecture seul

Remarque : si on le souhaite on peut mettre à jour uniquement le kernel ou uniquement le rootfs, mais dans la plupart des cas on ne s’embête pas et on met à jour le duo complet.

Méthode 2 : installation via le booloader :

Cette méthode est beaucoup plus complexe, elle demande aussi du sang froid …
Avec cette méthode on écrit directement dans la flash secteur par secteur en donnant les adresses de début des différentes partitions.
ATTENTION : La moindre erreur de copier coller peut bricker définitivement le routeur et le rendre inutilisable !

Cette méthode a cependant un gros avantage : si l’image linux précédente ne démarre plus il est toujours possible de la remplacer !
Cette méthode n’étant pas « idiot proof » je vous conseille de réfléchir à deux fois avant de faire « entrée » 😉

Cette méthode a plusieurs pré-requis :
– tout d’abord il faut un serveur TFTP :
sudo apt-get install python-setuptools
sudo easy_install tftpy

– ensuite il faut un câble série (voir mon précédent article)
– de même il faut un accès aux ports série sous linux :
sudo adduser "votre nom d'utilisateur" dialout

Une fois les pré-requis terminé il faut brancher le routeur en ethernet et configurer l’interface eth0 du pc :
sudo ifconfig eth0 192.168.0.2

Il faut ensuite lancer le serveur TFTP dans le dossier qui contient notre image openWRT :
cd ~/openWRT/trunk/bin/ar71xx/
sudo tftpy_server.py -r .

Côté routeur c’est un peu plus compliqué, il faut un certain doigté tout est dans le timing.
Quand vous voyez « Autobooting in 1 seconds » apparaître dans la console série vous avez une toute petite seconde pour taper « tpl » et faire « entrer ».
Si vous avez réussi vous devriez voir une prompt u-boot marquée « hornet> » dans la console.

Une fois dans la console uboot il suffit de faire ces commandes dans l’ordre, une à une :
setenv ipaddr 192.168.0.3
setenv serverip 192.168.0.2
tftpboot 0x80000000 openwrt-ar71xx-generic-tl-mr3020-v1-squashfs-factory.bin
erase 0x9f020000 +0x3c0000
cp.b 0x80000000 0x9f020000 0x3c0000

Si votre image linux est fonctionnelle celle ci devrait booter après cette dernière commande :
bootm 9f020000

Voici ce que vous devriez avoir dans la console en suivant les commandes dans l’ordre :
hornet> setenv ipaddr 192.168.0.3
hornet> setenv serverip 192.168.0.2
hornet> tftpboot 0x80000000 openwrt-ar71xx-generic-tl-mr3020-v1-squashfs-factory.bin
eth1 link down
dup 1 speed 100
Using eth0 device
TFTP from server 192.168.1.100; our IP address is 192.168.1.111
Filename 'openwrt-ar71xx-generic-tl-mr3020-v1-squashfs-factory.bin'.
Load address: 0x80000000
Loading: #################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
######################################################
done
Bytes transferred = 3932160 (3c0000 hex)
hornet> erase 0x9f020000 +0x3c0000

First 0x2 last 0x3d sector size 0x10000
Erased 60 sectors
hornet> cp.b 0x80000000 0x9f020000 0x3c0000
Copy to Flash... write addr: 9f020000

done
hornet> bootm 9f020000

Étape 5 (THE ULTIMATE ONE) : configuration du pivot root et copie du rootfs sur clef usb :

Si vous avez passé avec succès les étapes précédentes cette dernière étape sera un jeu d’enfant pour vous 😉

Il suffit de créer un fichier « /etc/config/fstab » sur le routeur avec le contenu suivant :
config global automount
(tab) option from_fstab 1
(tab) option anon_mount 1

config global autoswap
(tab) option from_fstab 1
(tab) option anon_swap 0

config mount
(tab) option target /
(tab) option device /dev/sda1
(tab) option fstype ext4
(tab) option options rw,sync
(tab) option enabled 1
(tab) option enabled_fsck 0

config swap
(tab) option device /dev/sda2
(tab) option enabled 0

(n’oubliez pas de remplacer (tab) par une tabulation 😉

Avec cette configuration la clef usb (/dev/sda1) formaté en EXT4 sera automatiquement monté sur « / » (donc en racine complète).
Il suffit alors de changer le rootfs sur la clef usb pour ajouter / supprimer / modifier des exécutables ou la configuration du système.
Plus besoin de passer par la dangereuse étape du flash du rootfs via mtd ou via TFTP, le kernel/rootfs en flash reste le même, seul le rootfs « pivoté » change.

Pour copier le rootfs sur une clef usb c’est très simple.
Dans la configuration du « make menuconfig » il suffit de demander une archive tar.gz du rootfs, ensuite pour le copier :
cd /media/"le nom de la clef usb"
sudo cp '~/openWRT/trunk/bin/ar71xx/openwrt-ar71xx-generic-rootfs.tar.gz' .
sudo gunzip openwrt-ar71xx-generic-rootfs.tar.gz
sudo tar xf openwrt-ar71xx-generic-rootfs.tar
sudo rm openwrt-ar71xx-generic-rootfs.tar

Grosse remarque concernant le rootfs :
Lorsque que vous voudrez générer un rootfs plus « complet » avec pleins de supers paquets divers et variés utilisez votre .config minimaliste comme base pour le .config complet !
Copiez le .config de base quelque part, ne le perdez pas car le noyau et le rootfs sont intrinsèquement liés !
Si vous faites un rootfs ne contenant pas au minimum les binaires du rootfs minimaliste le kernel va crasher !
(ce qui va crasher en premier c’est le driver ath9k du wifi, oui oui ça sent le vécu)

Conclusion :

Laissons le TL-MR3020 conclure 🙂

U-Boot 1.1.4 (Mar 20 2012 - 11:37:54)

AP121 (ar9330) U-boot

DRAM: 32 MB
led turning on for 1s...
id read 0x100000ff
flash size 4194304, sector count = 64
Flash: 4 MB
Using default environment

In: serial
Out: serial
Err: serial
Net: ag7240_enet_initialize...
No valid address in Flash. Using fixed address
No valid address in Flash. Using fixed address
: cfg1 0x5 cfg2 0x7114
eth0: 00:03:7f:09:0b:ad
ag7240_phy_setup
eth0 up
: cfg1 0xf cfg2 0x7214
eth1: 00:03:7f:09:0b:ad
athrs26_reg_init_lan
ATHRS26: resetting s26
ATHRS26: s26 reset done
ag7240_phy_setup
eth1 up
eth0, eth1
Autobooting in 1 seconds
## Booting image at 9f020000 ...
Uncompressing Kernel Image ... OK

Starting kernel ...

[ 0.000000] Linux version 3.7.9 (skywodd@SkyLaptop) (gcc version 4.6.4 20121210 (prerelease) (Linaro GCC 4.6-2012.12) ) #1 Tue Feb 19 22:25:20 CET 2013
[ 0.000000] bootconsole [early0] enabled
[ 0.000000] CPU revision is: 00019374 (MIPS 24Kc)
[ 0.000000] SoC: Atheros AR9330 rev 1
[ 0.000000] Clocks: CPU:400.000MHz, DDR:400.000MHz, AHB:200.000MHz, Ref:25.000MHz
[ 0.000000] Determined physical RAM map:
[ 0.000000] memory: 02000000 @ 00000000 (usable)
[ 0.000000] Initrd not found or empty - disabling initrd
[ 0.000000] Zone ranges:
[ 0.000000] Normal [mem 0x00000000-0x01ffffff]
[ 0.000000] Movable zone start for each node
[ 0.000000] Early memory node ranges
[ 0.000000] node 0: [mem 0x00000000-0x01ffffff]
[ 0.000000] Primary instruction cache 64kB, VIPT, 4-way, linesize 32 bytes.
[ 0.000000] Primary data cache 32kB, 4-way, VIPT, cache aliases, linesize 32 bytes
[ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 8128
[ 0.000000] Kernel command line: board=TL-MR3020 console=ttyATH0,115200 rootfstype=squashfs,jffs2 noinitrd
[ 0.000000] PID hash table entries: 128 (order: -3, 512 bytes)
[ 0.000000] Dentry cache hash table entries: 4096 (order: 2, 16384 bytes)
[ 0.000000] Inode-cache hash table entries: 2048 (order: 1, 8192 bytes)
[ 0.000000] __ex_table already sorted, skipping sort
[ 0.000000] Writing ErrCtl register=00000000
[ 0.000000] Readback ErrCtl register=00000000
[ 0.000000] Memory: 29112k/32768k available (2098k kernel code, 3656k reserved, 397k data, 252k init, 0k highmem)
[ 0.000000] SLUB: Genslabs=9, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[ 0.000000] NR_IRQS:51
[ 0.000000] Calibrating delay loop... 265.42 BogoMIPS (lpj=1327104)
[ 0.080000] pid_max: default: 32768 minimum: 301
[ 0.080000] Mount-cache hash table entries: 512
[ 0.090000] NET: Registered protocol family 16
[ 0.090000] MIPS: machine is TP-LINK TL-MR3020
[ 0.350000] bio: create slab at 0
[ 0.350000] Switching to clocksource MIPS
[ 0.360000] NET: Registered protocol family 2
[ 0.360000] TCP established hash table entries: 1024 (order: 1, 8192 bytes)
[ 0.370000] TCP bind hash table entries: 1024 (order: 0, 4096 bytes)
[ 0.370000] TCP: Hash tables configured (established 1024 bind 1024)
[ 0.380000] TCP: reno registered
[ 0.380000] UDP hash table entries: 256 (order: 0, 4096 bytes)
[ 0.390000] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
[ 0.400000] NET: Registered protocol family 1
[ 0.420000] squashfs: version 4.0 (2009/01/31) Phillip Lougher
[ 0.420000] jffs2: version 2.2 (NAND) (SUMMARY) (LZMA) (RTIME) (CMODE_PRIORITY) (c) 2001-2006 Red Hat, Inc.
[ 0.430000] msgmni has been set to 56
[ 0.440000] io scheduler noop registered
[ 0.440000] io scheduler deadline registered (default)
[ 0.440000] Serial: 8250/16550 driver, 1 ports, IRQ sharing disabled
[ 0.450000] ar933x-uart: ttyATH0 at MMIO 0x18020000 (irq = 11) is a AR933X UART
[ 0.460000] console [ttyATH0] enabled, bootconsole disabled
[ 0.460000] console [ttyATH0] enabled, bootconsole disabled
[ 0.470000] ath79-spi ath79-spi: master is unqueued, this is deprecated
[ 0.480000] m25p80 spi0.0: found s25sl032p, expected m25p80
[ 0.480000] m25p80 spi0.0: s25sl032p (4096 Kbytes)
[ 0.490000] 5 tp-link partitions found on MTD device spi0.0
[ 0.490000] Creating 5 MTD partitions on "spi0.0":
[ 0.500000] 0x000000000000-0x000000020000 : "u-boot"
[ 0.500000] 0x000000020000-0x0000000fd270 : "kernel"
[ 0.510000] mtd: partition "kernel" must either start or end on erase block boundary or be smaller than an erase block -- forcing read-only
[ 0.520000] 0x0000000fd270-0x0000003f0000 : "rootfs"
[ 0.530000] mtd: partition "rootfs" must either start or end on erase block boundary or be smaller than an erase block -- forcing read-only
[ 0.540000] mtd: partition "rootfs" set to be root filesystem
[ 0.540000] mtd: partition "rootfs_data" created automatically, ofs=2A0000, len=150000
[ 0.550000] 0x0000002a0000-0x0000003f0000 : "rootfs_data"
[ 0.560000] 0x0000003f0000-0x000000400000 : "art"
[ 0.560000] 0x000000020000-0x0000003f0000 : "firmware"
[ 0.590000] libphy: ag71xx_mdio: probed
[ 0.590000] eth0: Atheros AG71xx at 0xb9000000, irq 4, mode:MII
[ 1.140000] ag71xx ag71xx.0 eth0: connected to PHY at ag71xx-mdio.1:04 [uid=004dd041, driver=Generic PHY]
[ 1.150000] TCP: cubic registered
[ 1.150000] NET: Registered protocol family 17
[ 1.160000] 8021q: 802.1Q VLAN Support v1.8
[ 1.170000] VFS: Mounted root (squashfs filesystem) readonly on device 31:2.
[ 1.180000] Freeing unused kernel memory: 252k freed
- preinit -
Press the [f] key and hit [enter] to enter failsafe mode
- regular preinit -
[ 6.460000] jffs2: notice: (415) jffs2_build_xattr_subsystem: complete building xattr subsystem, 1 of xdatum (0 unchecked, 0 orphan) and 12 of xref (0 dead, 2 orphan) found.
[ 7.030000] SCSI subsystem initialized
[ 7.200000] usbcore: registered new interface driver usbfs
[ 7.210000] usbcore: registered new interface driver hub
[ 7.210000] usbcore: registered new device driver usb
[ 7.750000] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[ 7.760000] ehci-platform ehci-platform: Generic Platform EHCI Controller
[ 7.770000] ehci-platform ehci-platform: new USB bus registered, assigned bus number 1
[ 7.800000] ehci-platform ehci-platform: irq 3, io mem 0x1b000000
[ 7.820000] ehci-platform ehci-platform: USB 2.0 started, EHCI 1.00
[ 7.820000] hub 1-0:1.0: USB hub found
[ 7.820000] hub 1-0:1.0: 1 port detected
[ 7.840000] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[ 7.960000] uhci_hcd: USB Universal Host Controller Interface driver
[ 8.090000] Initializing USB Mass Storage driver...
[ 8.090000] usbcore: registered new interface driver usb-storage
[ 8.100000] USB Mass Storage support registered.
[ 8.200000] usb 1-1: new high-speed USB device number 2 using ehci-platform
[ 8.350000] scsi0 : usb-storage 1-1:1.0
[ 9.350000] scsi 0:0:0:0: Direct-Access Generic Flash Disk 5.00 PQ: 0 ANSI: 2
[ 9.360000] sd 0:0:0:0: [sda] 1969152 512-byte logical blocks: (1.00 GB/961 MiB)
[ 9.360000] sd 0:0:0:0: [sda] Write Protect is off
[ 9.370000] sd 0:0:0:0: [sda] No Caching mode page present
[ 9.370000] sd 0:0:0:0: [sda] Assuming drive cache: write through
[ 9.380000] sd 0:0:0:0: [sda] No Caching mode page present
[ 9.390000] sd 0:0:0:0: [sda] Assuming drive cache: write through
[ 9.390000] sda: sda1
[ 9.400000] sd 0:0:0:0: [sda] No Caching mode page present
[ 9.400000] sd 0:0:0:0: [sda] Assuming drive cache: write through
[ 9.410000] sd 0:0:0:0: [sda] Attached SCSI removable disk
[ 28.850000] EXT4-fs (sda1): recovery complete
[ 28.850000] EXT4-fs (sda1): mounted filesystem with ordered data mode. Opts: (null)
switching to external rootfs
- init -

Please press Enter to activate this console. [ 29.500000] Compat-drivers backport release: compat-drivers-2013-01-08-3
[ 29.500000] Backport based on wireless-testing.git master-2013-01-07
[ 29.510000] compat.git: wireless-testing.git
[ 29.560000] cfg80211: Calling CRDA to update world regulatory domain
[ 29.560000] cfg80211: World regulatory domain updated:
[ 29.570000] cfg80211: (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
[ 29.580000] cfg80211: (2402000 KHz - 2472000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[ 29.580000] cfg80211: (2457000 KHz - 2482000 KHz @ 20000 KHz), (300 mBi, 2000 mBm)
[ 29.590000] cfg80211: (2474000 KHz - 2494000 KHz @ 20000 KHz), (300 mBi, 2000 mBm)
[ 29.600000] cfg80211: (5170000 KHz - 5250000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[ 29.610000] cfg80211: (5735000 KHz - 5835000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[ 29.960000] ieee80211 phy0: Atheros AR9330 Rev:1 mem=0xb8100000, irq=2
[ 29.960000] cfg80211: Calling CRDA for country: US
[ 29.970000] cfg80211: Regulatory domain changed to country: US
[ 29.970000] cfg80211: (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
[ 29.980000] cfg80211: (2402000 KHz - 2472000 KHz @ 40000 KHz), (300 mBi, 2700 mBm)
[ 29.990000] cfg80211: (5170000 KHz - 5250000 KHz @ 40000 KHz), (300 mBi, 1700 mBm)
[ 30.000000] cfg80211: (5250000 KHz - 5330000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[ 30.000000] cfg80211: (5490000 KHz - 5600000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[ 30.010000] cfg80211: (5650000 KHz - 5710000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[ 30.020000] cfg80211: (5735000 KHz - 5835000 KHz @ 40000 KHz), (300 mBi, 3000 mBm)
[ 30.160000] PPP generic driver version 2.4.2
[ 30.230000] ip_tables: (C) 2000-2006 Netfilter Core Team
[ 30.370000] NET: Registered protocol family 24
[ 30.430000] nf_conntrack version 0.5.0 (458 buckets, 1832 max)
[ 30.750000] usbcore: registered new interface driver cdc_acm
[ 30.760000] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
[ 30.780000] usbcore: registered new interface driver usbserial
[ 30.790000] usbcore: registered new interface driver usbserial_generic
[ 30.800000] usbserial: USB Serial support registered for generic
[ 30.870000] sd 0:0:0:0: Attached scsi generic sg0 type 0
[ 30.900000] usbcore: registered new interface driver ftdi_sio
[ 30.900000] usbserial: USB Serial support registered for FTDI USB Serial Device
[ 30.930000] usbcore: registered new interface driver usbhid
[ 30.940000] usbhid: USB HID core driver
[ 34.160000] device eth0 entered promiscuous mode

BusyBox v1.19.4 (2013-02-19 22:22:54 CET) built-in shell (ash)
Enter 'help' for a list of built-in commands.

_______ ________ __
| |.-----.-----.-----.| | | |.----.| |_
| - || _ | -__| || | | || _|| _|
|_______|| __|_____|__|__||________||__| |____|
|__| W I R E L E S S F R E E D O M
-----------------------------------------------------
BARRIER BREAKER (Bleeding Edge, r35685)
-----------------------------------------------------
* 1/2 oz Galliano Pour all ingredients into
* 4 oz cold Coffee an irish coffee mug filled
* 1 1/2 oz Dark Rum with crushed ice. Stir.
* 2 tsp. Creme de Cacao
-----------------------------------------------------
root@OpenWrt:/# id
uid=0(root) gid=0(root)
root@OpenWrt:/# cd; ls
welcome.back
root@OpenWrt:~# cat welcome.back
This was a triumph.
I’m making a note here: HUGE SUCCESS.
It’s hard to overstate my satisfaction.
root@OpenWrt:~#

Et voila qui est fait !

Bon bidouillage à tous 🙂

Discussion

17 réflexions sur “OpenWRT sur TL-MR3020 en pivot root intégral sur clef usb

  1. comment ai-je pu louper cet article 😉
    Merci SKYWODD, je vais essaye tout cela sur mon WR703N.

    Publié par Rodolphe Boulon | 25 mars 2013, 12 h 31 min
    • Bon je bloque pour récupérer les sauvegardes de la flash. J’utilise Putty sous Windows.
      Sinon, il y a la possibilité de mettre une flash de 16Mo et une RAM de 64Mo avec un bon fer à souder 😉

      Publié par Rodolphe Boulon | 26 mars 2013, 17 h 45 min
      • Travaille sous linux pour ce genre de manipulations, SCP et windows c’est pas la grande amitié.

        Tu as une référence et/ou un lien pour la modif de la RAM ?
        Le changement de flash c’est facile (même pinout pour toute les mémoires flash spi du commerce) pour la RAM c’est plus dure.
        Il doit aussi falloir reconfigurer le bootloader pour gérer la ram en surplus mais là … comment faire *mystère*.

        Publié par skywodd | 26 mars 2013, 17 h 49 min
      • pour la RAM, regarde dans le bas de la page suivante (il y a un tableau):
        http://wiki.openwrt.org/toh/tp-link/tl-wr703n

        A priori on peut en récupérer sur des barrettes de pc DDR2 400MHz.

        Pour la flash, il y la grande soeur de celle monter d’origine 25LS064P.
        Sur Ebay, on trouve un kit des 2 composants pour une dizaines d’euros (j’en ai pris un 😉 ).

        Publié par Rodolphe Boulon | 26 mars 2013, 19 h 23 min
      • Sauvegarde effectué sous Windows avec WinSCP. C’est aussi facile à utiliser que Filezilla.

        Publié par Rodolphe Boulon | 27 mars 2013, 0 h 40 min
      • Je le répète : faire la manip. sous windows c’est pas une super idée.
        Quand tu va devoir formatter la clef en EXT4 et copier le binaire de l’image disque sous windows ça va piquer 😉

        Publié par skywodd | 27 mars 2013, 12 h 22 min
      • J’avais bien compris 😉
        J’ai cherché à la faire sous Windows pendant l’installation de Linux Mint 14.1 sur mon autre PC.

        Publié par Rodolphe Boulon | 27 mars 2013, 19 h 09 min
      • Quelques nouvelles :
        Premier firmware compilé (version simple), cela a été long mais je prend le temps de comprendre ce que je fais.
        J’attend ma flash de 8Mo et les ram de 64Mo pour continuer.

        Publié par Rodolphe Boulon | 9 avril 2013, 22 h 07 min
      • Quelques news, je suis passé en 64Mo de RAM.
        J’ai changé la flash, mais a priori il faut recompiler openwrt en changeant des paramètres pour qu’il puisse voir la flash de 8Mo.

        Publié par Rodolphe Boulon | 14 juin 2013, 8 h 12 min
  2. bonjour,

    avant tout merci pour ton travaille je trouve tes articles vraiment sympas 🙂
    ayant un routeur mr3020 et voulant mettre en place le fameux pivot root j’ai récupéré ton firmware et flasher mon routeur avec.
    ce que je ne comprends pas c’est que je n’arrive plus a me loguer dessus.
    Normalement apres une installation d’openwrt on doit se loguer en telnet pour initialiser le mdp mais la ca ne fonctionne pas
    en ssh ca marche mais ce n’est pas Mon ancien mdp..
    depuis ce flashage je n’arrive plus non plus a le passer en failsafe mode.

    Si tu pouvais m’eclairer je ne vois pas ce qui cloche.

    Publié par guess | 24 avril 2013, 17 h 22 min
    • C’est une image système ultra minimaliste, tout ce fait via la console série.
      Pas de ssh, pas de telnet, juste le noyau et les drivers mais rien de plus.
      Relis bien les pré-requis 😉

      (pour le failsafe il est inclus mais activable que depuis la console série)

      Publié par skywodd | 24 avril 2013, 17 h 27 min
  3. arf zut j’avais pas vu que tu utilisais le port serie
    par contre j’ai bien le ssh de de dispo…

    Publié par guess | 24 avril 2013, 17 h 31 min
    • Je pensais avoir viré Dropbear pour le ssh mais manifestement non (cf fichier de conf) …
      Je devais avoir une raison de le laissant mais je m’en rappelle plus 🙂

      Publié par skywodd | 24 avril 2013, 18 h 35 min
  4. Pour mon application, j’ai besoin de déconnecter la console du noyau du port série interne… Est-ce possible simplement via buildroot, ou faut-il modifier les Makefile ? Pour le U-boot, je pense que c’est impossible de déconnecter son log boot du port série interne, puisque la cross compilation n’a pas fonctionné, mais pour la console ?

    Publié par bbbio | 3 mars 2014, 16 h 10 min

Skyduino devient Carnet du Maker

Le site Carnet du Maker remplace désormais le blog Skyduino pour tout ce qui touche à l'Arduino, l'informatique et au DIY.