Piero V.

Seagate Goflex Net e OpenWRT

Buon 2016!

Per cominciare bene l’anno ho deciso di invalidare la garanzia ad un altro dispositivo: il Seagate Goflex Net.

Da parecchio tempo cercavo un NAS da configurare in RAID 1 per salvare tutti i miei dati rimanendo più tranquillo.

I prodotti disponibili in commercio però per me hanno un grande problema: il costo, specialmente se si confrontano le loro specifiche con quelle di alcune ARM board. Infatti per un po’ di tempo ho pensato anche di usare una Odroid XU-4, sia come NAS che come media player, in modo da abbattere un po’ il costo dell’investimento, tuttavia ci ho rinunciato per diversi motivi.

Così, ricominciata ancora una volta la ricerca, è comparso il Seagate Goflex Net, una docking station per due dischi SATA con Gigabit Ethernet a meno di 25€.

Il Goflex Net

In realtà le specifiche del Goflex non sono così eccezionali, anche perché la PCB riporta una data risalente a Marzo 2010.

Ha una CPU della famiglia Marvell Kirkwood (armv5te) a 1,2GHz, 128MB di RAM, una NAND da 256MB, Gigabit Ethernet, 2 porte SATA e una porta USB 2.0.

Anche il firmware integrato non è molto buono, per non dire pessimo: l’intero funzionamento della macchina dipende da un servizio cloud chiamato Pogoplug. Da lì bisogna configurare tutte le funzionalità, comprese le impostazioni di sicurezza e accesso. E l’accesso ai file da LAN non può essere fatto tramite protocolli standard (SMB o FTP o altri), ma deve essere fatto con un software client rilasciato da Pogoplug.

Un altro problema è la forma dei dischi: Seagate ha pensato questo dispositivo per mettere in rete i dischi della linea Goflex. Però si può usare qualsiasi disco da 2.5”, purché si sia disposti a rinunciare alla stabilità massima del disco:

La distanza tra un disco da 2.5 e le pareti dell'alloggio
Dall'altra parte è ancora maggiore

I dischi da 3.5” invece sono proprio inutilizzabili: non solo per una questione di forma, ma proprio per una questione di alimentazione: la linea da 12V non è collegata all’alimentazione SATA. I più volenterosi possono però utilizzare un’alimentazione esterna oppure collegare diretamente l’alimentazione del NAS ai dischi: l’alimentatore è da 12V 2A, quindi con dei dischi come i WD Green si dovrebbe riuscire.

Non c'è modo di usare lo chassis del Goflex Net con dischi da 3.5

Ma allora cosa c’è di buono in questo dispositivo?

La community del Goflex Net e dei dispositivi simili è molto attiva e provvede le ultime immagini di bootloader e kernel, rendendo possibile l’installazione di firmware alternativi, come OpenWRT o addirittura di Debian.

Io ho scelto il primo, perché i miei obiettivi sono modesti: lo voglio usare come macchina per condivisione dei file, non sono interessato al download di torrent o cose simili. Inoltre OpenWRT è estremamente leggero, cosa indispensabile viste le risorse estremamente limitate: solo 20MB di RAM utilizzata con l’installazione pulita. Questo significa che rimangono più di 100MB per le operazioni. Debian, per quanto leggera, penso non arrivi a questi numeri. Nulla poi impedisce di installare Debian sui dischi e OpenWRT sulla NAND da utilizzare in caso di problemi come ambiente recovery.

Per i dischi non ho ancora deciso come fare di preciso. Inizialmente pensavo di fare delle modifiche per usare i dischi da 3.5”, però ci sto ripensando, perché in realtà non ho bisogno di tenere il NAS attivo 24 ore al giorno 7 giorni su 7, ma solo quando serve, quindi potrei anche prendere tranquillamente dei dischi da 2.5”.

Ho deciso, in pratica, di affdare la sicurezza dei miei dati agli strumenti standard liberi e Open Source (mdadm, samba etc…) e alla mia capacità di configurarli.

Di seguito riporto una guida su come liberare il vostro Goflex Net.

Penso che in un’oretta si riesca a fare tutto, senza neanche aprire fisicamente la docking station, però non so dirvi con precisione, perché a me ne sono servite una decina, perché con Chaos Calmer OpenWRT ha deciso di usare il filesystem Ubifs al posto di JFFS2, quindi mi si era bloccato tutto. Tuttavia ho rifatto i passi tramite Netconsole e sono riusciti tranquillamente.

Attenzione: non mi assumo alcuna responsabilità dall’applicazione di questa guida da parte vostra. In ogni caso vi consiglio di leggere tutta la guida prima di fare qualsiasi cosa.

Aggiornamento di U-boot

Qualsiasi cosa vogliate fare, purtroppo, necessita dell’aggiornamento del bootloader.

È sempre un passo delicato, per cui vi consiglio di leggere attentamente.

Sembra comunque sia possibile ripristinare un bootloader corrotto anche tramite interfaccia TTL, senza dover usare la JTAG, e sapendo ciò mi sono sentito un po’ più sollevato nel completare la procedura.

Qualsiasi OS dovrebbe andare bene, ma in particolare su qualsiasi distribuzione Linux ci sono gli strumenti necessari, ovvero un client SSH e Netcat.

Inoltre serve un dispositivo di memorizzazione USB come hard disk o chiavetta, con almeno 40MB di spazio disponibile e un filesystem FAT o NTFS. Servirà per salvare i dump della NAND e caricare alcuni file.

La prima cosa che dobbiamo fare è ottenere una shell di root sul firmware originale.

Benché su alcuni siti ci sia scritto che se non si connette il dispositivo ad internet SSH sarà immediatamente attivo, nel mio caso non si è rivelato vero.

Le uniche porte aperte erano la 80 (header HTTP validi, ma corpo della risposta vuoto), la 443 (certificato invalido e risposta vuota) e la 3333 (che non ho testato, probabilmente usata da Pogoplug).

Quindi la registrazione su pogoplug.com è necessara, forse l’unico modo per evitarla sarebbe usare la consolle TTL. Invece quella sul sito Seagate non serve a niente.

Peraltro si può cogliere l’occasione per controllare che il dispositivo funzioni effettivamente, in modo da effettuare il reso prima di invalidare la garanzia se ci sono problemi.

Ho provato con il disco che avevo nel computer prima di mettere l’SSD, che è stato riconosciuto, sia con SATA che con USB; le partizioni NTFS venivano lette, invece Ext4 no. Inoltre, contrariamente a quanto mi aspettassi, la partition table GPT non ha causato alcun problema.

Tornando all’abilitazione di SSH, ci si collega al sito e sceglie settings sull’ingranaggio

Settings sulla Dashboard

Da lì si va su security e si mette la spunta su enable SSH e si immette la nuova password di root.

Abilitazione di SSH

La connessione con OpenSSH richiede alcuni algoritmi considerati obsoleti e insicuri, quindi il comando da dare è questo:

ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 root@pogoplug

A pogoplug potrebbe essere necessario aggiungere il suffisso locale (quindi diventerebbe pogoplug.local o pogoplug.lan a seconda della vostra rete), oppure potrebbe essere proprio necessario sostituirlo con l’indirizzo IP (per esempio nel caso in cui non usiate come DNS il vostro router).

Una volta fatto l’accesso, si può apprezzare l’ultima versione di Bash: la 4.3.30, rilasciata nel novembre 2014 e a prova di Shellshock. Invece il Kernel Linux è una versione abbastanza vecchia: 2.6.22, build di Ottobre 2010.

I comandi a disposizione non sono molti e per completare la procedura dovremo procurarcene alcuni.

L’utente bodhi di doozan.com tiene aggiornate le immagini U-boot e Debian per questo dispositivo e ha scritto anche una guida per installarle.

Riporto i passi essenziali dalla guida, che in ogni caso consiglio di leggere integralmente.

Anche la pagina del Goflex del wiki di OpenWRT è molto valida e contiene risorse molto utili.

Scarichiamo questi file da inserire nella root della chiavetta: uboot.2015.10-tld-1.goflexnet.bodhi.tar (https://bitly.com/1MiTx8X) (l’ultima versione, nel momento in cui sto scrivendo l’articolo) e uboot.2014.07-tld-3.environment.bodhi.tar (https://bitly.com/1jH6MsQ). Dopo colleghiamola al Goflex.

Per capire dove è stata collegata bisogna dare il comando mount:

rootfs on / type rootfs (rw)
/dev/root on / type jffs2 (ro)
none on /proc type proc (rw)
none on /sys type sysfs (rw)
none on /dev/pts type devpts (rw)
none on /tmp type tmpfs (rw)
none on /proc/bus/usb type usbfs (rw)
/tmp/.cemnt/sda1 on /tmp/.cemnt/mnt_sda1 type vfat (rw,nosuid,nodev,noexec,noatime,fmask=0022,dmask=0022,codepage=cp437,iocharset=iso8859-1,utf8)

Da ciò si capisce che il percorso della chiavetta nel mio caso è /tmp/.cemnt/mnt_sda1.

Dopodiché diamo questi comandi per procurarsi alcuni tool:

mount -o rw,remount /
cd /tmp
wget http://download.doozan.com/uboot/nanddump
wget http://download.doozan.com/uboot/flash_erase
wget http://download.doozan.com/uboot/fw_printenv
chmod +x nanddump flash_erase fw_printenv
ln -s fw_printenv fw_setenv
wget http://download.doozan.com/uboot/fw_env.config -O /etc/fw_env.config

Io avevo scaricato anche gli altri tool consigliati da Doozan, ma fallivano, quindi ho fatto senza e sono riuscito lo stesso a fare tutto.

Non è possibile quindi fare il dump delle variabili di U-Boot del firmware del costruttore, da in caso di problemi, quindi dovremo fidarci della guida di OpenWRT. Da quanto ho capito sono quelle scritte sull’etichetta presente sul fondo del Goflex stesso.

Il prossimo passo è il backup del firmware stock.

Dobbiamo eseguire questi comandi:

cd /tmp/.cemnt/mnt_sda1
mkdir GoflexNet
cd GoflexNet
/tmp/nanddump -nof uboot-mtd0-dump /dev/mtd0
/tmp/nanddump -nof uboot-original -s 0 -l 0x80000 /dev/mtd0
/tmp/nanddump -nof uImage-mtd1-dump /dev/mtd1
/tmp/nanddump -nof rootfs-mtd2-dump /dev/mtd2
sync

Prima di eseguire l’aggiornamento effettivo di U-boot, è necessario controllare che tutti i blocchi della NAND su cui andremo a scrivere non siano danneggiati.

Diamo il comando dmesg | grep -i bad.

Come output ci dovrebbe essere solo questa riga (i numeri tra le parentesi quadre possono cambiare):

[    1.080000] Scanning device for bad blocks

In caso contrario non procedete oltre e provate a scrivere sul forum di Doozan. Altrimenti potete continuare.

È arivato il momento più critico: l’aggiornamento di U-boot. Qualora una di queste fasi dovesse fallire, è essenziale che non spegniate il dispositivo e cerchiate aiuto sul forum di Doozan.

I comandi da dare sono:

cd /tmp
./flash_erase /dev/mtd0 0 4

Output previsto:

Erase Total 4 Units
Performing Flash Erase of length 131072 at offset 0x60000 done

I prossimi comandi sono:

tar -xvf /tmp/.cemnt/mnt_sda1/uboot.2015.10-tld-1.goflexnet.bodhi.tar
nandwrite /dev/mtd0 uboot.2015.10-tld-1.goflexnet.mtd0.kwb

l’ultimo dà come output:

Writing data to block 0
Writing data to block 20000
Writing data to block 40000
Writing data to block 60000

Ora bisogna installare la nuova configurazione predefinita di U-boot. Prima si cancellano quelle già installate:

./flash_erase /dev/mtd0 0xc0000 1

che dà in output:

Erase Total 1 Units
Performing Flash Erase of length 131072 at offset 0xc0000 done

dopo si mettono quelle di bodhi:

tar -xvf /tmp/.cemnt/mnt_sda1/uboot.2014.07-tld-3.environment.bodhi.tar
nandwrite -s 786432 /dev/mtd0 uboot.2014.07-tld-3.environment.img

e l’output è:

Writing data to block c0000

Alcuni valori devono essere cambiati affinché siano consistenti col Goflex Net (il MAC Address lo trovate nell’etichetta inferiore oppure sulla vostra tabella ARP):

./fw_setenv arcNumber 3089
./fw_setenv ethaddr 'xx:xx:xx:xx:xx:xx'

Fatto ciò dobbiamo fare il setup della netconsole, in modo da potersi interfacciare da U-boot senza il cavo seriale. Il rovescio della medaglia è che per cercare il PC con cui dialogare si allunga il tempo di boot di una decina di secondi.

Gli IP da inserire di seguito devono essere consistenti con la vostra rete (x.x.x.x è quello del NAS, y.y.y.y quello del computer).

./fw_setenv preboot_nc 'setenv nc_ready 0; for pingstat in 1 2 3 4 5; do; sleep 1; if run if_netconsole; then setenv nc_ready 1; fi; done; if test $nc_ready -eq 1; then run start_netconsole; fi'
./fw_setenv preboot 'run preboot_nc'
./fw_setenv ipaddr 'x.x.x.x'
./fw_setenv serverip 'y.y.y.y'

Adesso bisogna aprire un altro terminale su cui aprire netcat con questo comando (se avete altre versioni di Netcat potreste dover usare altri parametri):

nc -l -u -p 6666

A questo punto torniamo sul SSH e diamo il reboot.

Attenzione: dovete essere pronti anche a vedere i comandi sulla netconsole subito dopo aver dato il reboot e premere un tasto per fermare il boot automatico.

Il comando è:

/sbin/reboot

Trasferitevi quindi alla consolle. A me ci ha messo un po’ di tempo a venire fuori qualcosa, circa 10-20 secondi.

Comunque se fin qua avete fatto tutto correttamente dovreste avere quest’output:

U-Boot 2015.10-tld-1 (Nov 06 2015 - 15:49:48 -0800)
Seagate GoFlex Net
gcc (Debian 4.9.2-10) 4.9.2
GNU ld (GNU Binutils for Debian) 2.25
Hit any key to stop autoboot:  10

Come preannunciato e richiesto a video, premiamo un tasto per fermare l’autoboot.

Verrà fuori un prompt:

GoFlexNet> 

È arrivato il momento di installare OpenWRT.

Per sicurezza rimuoviamo anche la chiavetta dal dispositivo.

Installazione di OpenWRT

Oltre ai requisiti di prima, ci serve un server TFTP nello stesso sitema della netconsole. Per l’installazione vi rimando a guide specifiche per il vostro SO.

Scarichiamo i file di OpenWRT e li mettiamo nella root: ci servono un kernel in formato uImage e un filesystem root in formato ubifs. Io ho usato la versione Chaos Calmer.

Usando una rete cablata si può guadagnare un bel po’ in velocità, io però ho fatto col computer in Wi-Fi e ha funzionato tutto lo stesso.

Riporto direttamente tutto, sia i comandi da eseguire (in grassetto) che l’output nel mio caso.

GoFlexNet> mw 0x6400000 0xffff 0x300000
GoFlexNet> tftpboot 0x6400000 openwrt-15.05-kirkwood-goflexnet-uImage
tftpboot 0x6400000 openwrt-15.05-kirkwood-goflexnet-uImage

TFTP from server 172.24.20.199; our IP address is 172.24.20.52
Filename 'openwrt-15.05-kirkwood-goflexnet-uImage'.
Load address: 0x6400000
Loading: #################################################################
	 ############################################
	 761.7 KiB/s
done
Bytes transferred = 1592281 (184bd9 hex)
GoFlexNet> nand erase 0x100000 0x400000
nand erase 0x100000 0x400000

NAND erase: device 0 offset 0x100000, size 0x400000
Erasing at 0x4e0000 -- 100% complete.
OK
GoFlexNet> nand write.e 0x6400000 0x100000 0x400000
nand write.e 0x6400000 0x100000 0x400000

NAND write: device 0 offset 0x100000, size 0x400000
 4194304 bytes written: OK
GoFlexNet> mw 0x6400000 0xffff 0x200000
mw 0x6400000 0xffff 0x200000
GoFlexNet> tftpboot 0x6400000 openwrt-15.05-kirkwood-goflexnet-rootfs.ubifs
tftpboot 0x6400000 openwrt-15.05-kirkwood-goflexnet-rootfs.ubifs
Using egiga0 device
TFTP from server 172.24.20.199; our IP address is 172.24.20.52
Filename 'openwrt-15.05-kirkwood-goflexnet-rootfs.ubifs'.
Load address: 0x6400000
Loading: #################################################################
	 #################################################################
	 #################################################################
	 #################################################################
	 #########################################################
	 809.6 KiB/s
done
Bytes transferred = 4644864 (46e000 hex)
GoFlexNet> nand erase 0x500000 0xfb00000
nand erase 0x500000 0xfb00000

NAND erase: device 0 offset 0x500000, size 0xfb00000
Erasing at 0xffe0000 -- 100% complete.
OK
GoFlexNet> setenv mtdparts 'mtdparts=orion_nand:1M(u-boot),4M(uImage),-(root)'
GoFlexNet> ubi part root
ubi part root
UBI: attaching mtd1 to ubi0
UBI: scanning is finished
UBI: attached mtd1 (name "mtd=2", size 251 MiB) to ubi0
UBI: PEB size: 131072 bytes (128 KiB), LEB size: 129024 bytes
UBI: min./max. I/O unit sizes: 2048/2048, sub-page size 512
UBI: VID header offset: 512 (aligned 512), data offset: 2048
UBI: good PEBs: 2008, bad PEBs: 0, corrupted PEBs: 0
UBI: user volume: 0, internal volumes: 1, max. volumes count: 128
UBI: max/mean erase counter: 2/1, WL threshold: 4096, image sequence number: 0
UBI: available PEBs: 1964, total reserved PEBs: 44, PEBs reserved for bad PEB handling: 40
GoFlexNet> ubi create rootfs 0xA00000
ubi create rootfs 0xA00000
Creating dynamic volume rootfs of size 10485760
GoFlexNet> ubi write 0x6400000 rootfs ${filesize}
ubi write 0x6400000 rootfs ${filesize}
4644864 bytes written to volume rootfs
GoFlexNet> ubi create rootfs_data
ubi create rootfs_data
No size specified -> Using max size (242823168)
Creating dynamic volume rootfs_data of size 242823168
GoFlexNet> setenv bootcmd 'nand read 0x6400000 0x100000 0x400000; bootm 0x6400000;'
setenv bootcmd 'nand read 0x6400000 0x100000 0x400000; bootm 0x6400000;'
GoFlexNet> setenv bootargs 'console=ttyS0,115200n8 mtdparts=orion_nand:1M(u-boot),4M(uImage),-(root) ubi.mtd=2 root=ubi0:rootfs rootfstype=ubifs rw'
setenv bootargs 'console=ttyS0,115200n8 mtdparts=orion_nand:1M(u-boot),4M(uImage),-(root) ubi.mto=i:ofrotpui '
GoFlexNet> saveenv
saveenv
Saving Environment to NAND...
Erasing NAND...
Erasing at 0xc0000 -- 100% complete.
Writing to NAND... OK
GoFlexNet> boot
boot

NAND read: device 0 offset 0x100000, size 0x400000
 4194304 bytes read: OK
## Booting kernel from Legacy Image at 06400000 ...
   Image Name:   ARM OpenWrt Linux-3.18.20
   Created:      2015-09-11  16:53:27 UTC
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    1592217 Bytes = 1.5 MiB
   Load Address: 00008000
   Entry Point:  00008000
   Verifying Checksum ... OK

Starting kernel ...

A questo punto possiamo anche interrompere netcat, perché OpenWRT non manda nulla in output.

In compenso in una ventina di secondi dovrebbe essere disponibile LuCI per configurare il tutto.

L’indirizzo IP viene acquisito con DHCP. Come al solito fate molta attenzione se volete passare ad una configurazione statica, perché in caso di errori potreste dover usare l’interfaccia seriale per recuperare il controllo del dispositivo.

Il primo test

Pur non avendo ancora i dischi da collegare in SATA con il RAID, ho voluto fare lo stesso un primo test per vedere come si comporta il nuovo giocattolino.

Non volevo aprire di nuovo l’unico disco SATA compatibile che ho, giacché l’avevo già messo nel suo box, così l’ho collegato con USB (2.0). Ho usato la partizione Ext4 e non ho avuto bisogno di installare moduli del kernel, né per il filesystem, né per l’interfaccia.

Non volevo neanche installare Samba ancora, dunque ho fatto due test: uno con SFTP e l’altro con Netcat.

SFTP è stato una delusione: mi ha permesso di andare a circa 4,5MB/s-5MB/s. Insomma, così poco che non ne valeva neanche la pena mediare. Non mi aspettavo tantissimo, ma neanche così poco. Forse si potrebbe sfruttare l’accelerazione hardware per la crittografia, ma non so ancora quanto ne valga la pena.

Con Netcat è andata meglio: speravo che il limite fosse USB 2.0, ma non è stato così. Infatti ho avuto sui 24MB/s di scrittura e sui 20MB/s di lettura, dei risultati comunque curiosi, visto che solitamente la scrittura è più bassa della lettura.

In ogni caso non ho fatto alcuna modifica alla configurazione. Ho trovato su internet una guida scritta da un ingegnere di sistemi il cui hobby è lavorare su macchine Linux embedded. Insomma, uno che ne sa a pacchi. Con una macchina peggiore della mia ha avuto risultati migliori. Vedrò se riuscirò a integrare la configurazione su OpenWRT, altrimenti potrei sempre passare a Debian 😊 .

Bibliografia e fonti

Poiché il materiale presentato si basa sulle guide del wiki di OpenWRT, l’articolo è rilasciato sotto licenza Creative Commons 3.0 By-Nc-Sa. L’elenco esatto dei contributori lo trovate direttamente sulle pagine.

35 commenti