= 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: {{{ #!/bin/sh # 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