Italiano English
Modifica History Actions

Asus_WL-500g_e_openwrt_rc6

Asus WL-500g e openwrt rc6

Intro

In questo documento tratto come far vedere un pen drive usb alla vostra macchina mipsel per farci fare il boot o semplicemente per aumentare la memoria a disposizione (che è sempre moooooolto risicata).
Ho fatto le prove su un asus wl500g deluxe con openwrt rc6 (attenzione per rc inferiori alla 6 potrebbe non funzionare questo procedimento). La quasi totalità delle info che trovate qui di seguito sono state prese dalla documentazione on-line reperibile su http://www.openwrt.org. Inoltre questo documento è altamente migliorabile, quindi chi pensa di poter aggiungere, completare o cancellare del testo, è invitato a farlo!

Informazioni Generali

Host utilizzati:

  • host remoto (linux) da cui ho lavorato --> 192.168.0.10 (ethernet)

  • (Asus wl500g-deluxe) Openwrt rc6 --> 192.168.0.2 (ethernet)

Openwrt consta di 2 filesystem :

  • SquashFS --> kernel + filesystem read-only

  • JFFS2 --> filesystem scrivibile

Quando openwrt parte, verifica dapprima l'esistenza del filesystem JFFS2 e se non lo trova fa il boot da SquashFS. Di default il JFFS2 è popolato con link simbolici ai file del SquashFS. Per fare delle modifiche che rimangano effettive ai prossimi riavvii basta eliminare i link simbolici su JFFS2 e sostituirli con i file che si vuole (ovviamente mantenendo il nome del link simbolico).

Per esempio il file /etc/resolv.conf (che si occupa di indicare l'ip del ns da usare):

root@Asus_WRT_1:~# ls -l /etc/resolv.conf

lrwxrwxrwx    1 root     root           16 Jan  1 00:06 /etc/resolv.conf -> /tmp/resolv.conf

in queste condizioni se lo si modifica (vi /etc/resolv.conf), le modifiche avranno effetto fino al prossimo riavvio dopodichè andranno perse. Per rendere le modifiche effettive si deve cancellare il link simbolico e ricreare un file nella stessa posizione e con lo stesso nome del link appena cancellato. Solo allora le modifiche che si apporteranno rimarranno effettive anche ai prossimi riavvii :

root@Asus_WRT_1:~# rm /etc/resolv.conf ;touch /etc/resolv.conf ;vi /etc/resolv.conf

Openwrt usa la directory /etc/modules.d per caricare automaticamente i moduli ad ogni riavvio.

Backup dei dati su OpenWRT

Ti indico la procedura di backup per evitare di fare dei casini irreversibili. Ci sono 2 procedure:

1. (procedura rozza) sshti sull'asus e fai un mega tarrone delle configurazioni :

root@Asus_WRT_1:~#tar -czvf backup_asus.tar.gz /etc/

copia tutto sul pc 192.168.0.10 per esempio nella cartella /root/backup_asus

root@Asus_WRT_1:~#scp root@192.168.0.10:/root/backup_asus backup_asus.tar.gz

2. (procedura più pulita) oppure procedi così dal pc remoto 192.168.0.10 per fare il backup dell'intero firmware :

$ssh root@192.168.0.2 'dd if=/dev/mtdblock/1' > firmware-backup.trx

ti troverai il backup del firmware nella directory corrente.

Installazione del pennino USB

I moduli necessari sono :

root@Asus_WRT_1:~#ipkg install kmod-usb-uhci            (usb1.1)

root@Asus_WRT_1:~#ipkg install kmod-usb2                (usb2.0 ehci-hcd)

root@Asus_WRT_1:~#ipkg install kmod-usb-storage

root@Asus_WRT_1:~#ipkg install kmod-vfat                (supporto per fat32)

root@Asus_WRT_1:~#ipkg install kmod-ext2 kmod-ext3      (supporto per ext3; magari per un samba)

Passiamo ora al partizionamento e alla formattazione del pennino. Ci sono 2 modi: farlo da un pc OPPURE farlo direttamente sull'host openwrt (l'asus nel mio caso ).

Partizionamento e formattazione da PC

è il metodo che io ho preferito sia perchè così mi sono risparmiato di scaricare altri pacchetti necessari per queste operazioni sull'asus (gli apparati hanno una memoria generalmente risicata), sia perchè ho avuto dei priblemi nel formattare il pennino direttamente sul'asus. Trovate (tramite dmesg) come si chiama il vostro pennino (generalmente sd qualcosa). Creiamo la tabella delle partizioni :

bash-3.00#fdisk /dev/sda

una volta partito fdisk digita 'p' per vedere quali partizioni ci sono e 'd' seguito dal numero della partizione per cancellarle. Poi sempre con 'p' verifichi che non hai più partizioni. Ora devi creare una nuova partizione quindi digita 'n' e se la vuoi primaria (p) e 1.
Per riempire la chiavetta intera premi enter 2 volte.
Se vuoi creare una partizione FAT32 digita 't' e poi 'b'. Se vuoi creare una prtizione linux digita 't' e poi'83'.
Ora digita 'w' per scrivere la tabella di partizioni sulla chiavetta (non puoi più tornare indietro!).
Ora devi formattare la chiavetta :

bash-3.00#mkfs.vfat -F 32 /dev/sda1     (se hai scelto fat32)

bash-3.00#mkfs.ext3 /dev/sda1           (se hai scelto linux e la vuoi in ext3)

linux offre diversi file system con il rispettivo formattatore di fs (mkfs.reiserfx, mkfs.ext2 ecc... tab è tuo amico come dice Sal!!!).

Partizionamento e formattazione da host OpenWRT

serve fdisk ma non è presente nei repository della rc6 quindi aggiungiamo il backports della rc5 /etc/ipkg.conf

root@Asus_WRT_1:~#echo src backports http://downloads.openwrt.org/backports/rc5 >> /etc/ipkg.conf
root@Asus_WRT_1:~#ipkg update
root@Asus_WRT_1:~#ipkg install fdisk

Ora dovi sgamare come viene riconosciuto dal sistema il pennino. Plugga il pennino e lancia dmesg; dovresti trovare una voce del genere /dev/scsi/host0/bus0/target0/lun0---> questo è il tuo pennino.
Creiamo la tabella delle partizioni:

root@Asus_WRT_1:~#fdisk /dev/scsi/host0/bus0/target0/lun0

Per formattare la chiavetta sull'openwrt abbiamo bisogno di altri strumenti:

root@Asus_WRT_1:~#ipkg install e2fsprogs
root@Asus_WRT_1:~#mkefs -j /dev/scsi/host0/bus0/target0/lun0/part1      (per la formattazione)

Se ti esce un errore del tipo che non trova il file mke2fs significa che manca il link simbolico :

root@Asus_WRT_1:~#ln -s /proc/mounts /etc/mtabs         

(/proc/mounts mostra le informazione conosciute dal kernel a proposito dei dischi montati )

Fare il mount

Verifica che esista la cartella /mnt sul tuo apparato e se non esiste creala:

root@Asus_WRT_1:~# mkdir -p /mnt

Da questo punto in poi devi aver pluggato il pennino sull'apparato perchè tocca copiare tutto il contenuto della flash sulla usb :

root@Asus_WRT_1:~#mount -t ext3 /dev/scsi/host0/bus0/target0/lun0/part1 /mnt    

(montiamo il pennino in /mnt)

Ora hai tutto il contenuto del pennino in /mnt. Al prossimo riavvio il demone di hotplug dovrebbe incaricarsi di montarti in automatico il pennino in /mnt/disc0_1 o qualcosa del genere (il che sarà un problema per il boot da usb).

Boot da pennino USB

root@Asus_WRT_1:~#mkdir /tmp/root       

(creiamo una cartella di appoggio in cui copiare quello che verrà poi copiato sul pennino)

di queste 2 righe che seguono una esclude l'altra:

root@Asus_WRT_1:~#mount -o bind /rom /tmp/root  

(se vuoi caricare lo squashfs sulla usb e non ti interessa di eventuali modifiche che hai fatto sul JFFS2)

root@Asus_WRT_1:~#mount -o bind / /tmp/root     

(per chi ha fatto delle modifiche sul JFFS2.E' il mio caso e mi sento di consigliarlo!)



root@Asus_WRT_1:~#cp /tmp/root/* /mnt -a        

(copiamo tutto da /tmp/root in /mnt (pennino usb) compresi i file nascosti)

root@Asus_WRT_1:~#umount /tmp/root      

(smonto la directory /tmp/root che non mi serve più)

root@Asus_WRT_1:~#umount /mnt                   

(smonto il pennino usb)

Ora fai un backup del file /sbin/init

root@Asus_WRT_1:~#mv /sbin/init /sbin/init.BK

e rimpiazzalo con questo nuovo init:

# change this to your boot partition
boot_dev="/dev/scsi/host0/bus0/target0/lun0/part1"

# install needed modules for usb and the ext3 filesystem
# **NOTE** for usb2.0 replace "uhci" with "ehci-hcd"
# **NOTE** for ohci chipsets replace "uhci" with "usb-ohci"

for module in usbcore ehci-hcd usb-ohci uhci scsi_mod sd_mod usb-storage jbd ext3; do {
        insmod $module
}; done

# this may need to be higher if your disk is slow to initialize
sleep 4s

#aggiunta da pedro per smontare il pennino se hotplug lo ha già montato
umount /mnt/disc0_1

# mount the usb stick
mount "$boot_dev" /mnt

# if everything looks ok, do the pivot root
[ -x /mnt/sbin/init ] && {
        mount -o move /proc /mnt/proc && \
        pivot_root /mnt /mnt/mnt/disc0_1 && {
                mount -o move /mnt/dev /dev
                mount -o move /mnt/tmp /tmp

# If you are using whiterussian 0.9 then remove next two lines and uncomment third one:
# note that is jffs and not jffs2

                mount -o move /mnt/jffs2 /jffs2 2>&-
                mount -o move /mnt/sys /sys 2>&-
#               mount -o move /mnt/jffs /jffs 2>&-

        }
}

# finally, run the real init (from USB hopefully).

exec /bin/busybox init

Poi per verificare se al riavvio il boot viene fatto dal pennino o dalla flash puoi visualizzare un messaggio nel banner dell'openwrt :

$echo "BOOT FROM FLASH" >> /etc/banner

$mount /dev/scsi/host0/target0/lun0/part1 /mnt

$echo "BOOT FROM USB" >> /mnt/etc/banner

Ora dovrebbe essere tutto pronto per il boot da usb.Riavvia e in bocca al lupo. Se tutto è andato a buon fine non appena ti loggi sul tuo asus dovresti vedere il banner seguito dalla scritto BOOT FROM USB e il file /sbin/init è in forma binaria (è quello originale dell'openwrt!). Se l'asus non riesce per qualche motivo a partire da usb allora partirà dalla flash di default e ti mostrerà il messaggio BOOT FROM FLASH.

to fix:

nel nuovo file /sbin/init il vero e proprio cambio di root del sistema dalla flash alla usb avviene con il comando

root@Asus_WRT_1:~#pivot_root new_root old_root

dove nella new_root si indica la radice della usb /mnt e in old_root va messo il percorso per memorizzare la vecchia root di modo da rendere il cambio di root un processo reversibile. Secondo quanto scritto nel file la vecchia root dovrebbe essere in /mnt/mnt ma così non avviene.(idee!??!)

pedro