<- AGORA: Mozambico - Indice Generale - Copertina - HiL: Synaptics -> |
USB-storage
L'articolo...L'articolo si occupa dello standard USB (Universal Serial Bus) e del suo funzionamento sui sistemi GNU/Linux, descrivendo soprattutto le periferiche di archiviazione di massa che utilizzano tale standard. |
Come sicuramente avrete notato, nel corso degli ultimi mesi l'interesse
della rubrica "Hardware in Libertà" si è orientato con decisione verso le
periferiche USB: le
motivazioni di tutto ciò si legano all'enorme successo riscosso da questo
standard e dal crescente numero di consensi che sta ottenendo.
Con tutta franchezza non ho mai apprezzato del tutto l'USB, essendo questo standard
spesso problematico; tuttavia non si può nascondere che ultimamente
di passi avanti ne siano stati fatti.
Tra i suoi vantaggi citiamo l'eliminazione o quasi del problema dell'alimentazione delle periferiche, in quanto
quest'ultima può essere erogata direttamente dal bus USB; è generalmente
più veloce rispetto alla comune porta parallela o seriale (anche se
nel corso dell'articolo avremo modo di smentire quest'ultima affermazione) e
ha la possibilità di connessione multipla grazie ad appositi concentratori
o, se preferite, hub.
Dato che abbiamo parlato di standard non si può che concludere
dicendo che il numero di periferiche che oggigiorno utilizza tale
tecnologia è molto ampio e in costante aumento.
In questo breve e spero interessante articolo parleremo di USB-storage e
delle periferiche di archiviazione di massa, tema che ritengo venga spesso
trattato con una certa superficialità, quando invece con un po' di
impegno sarebbe possibile trovare numerosi spunti sui quali dissertare.
Iniziamo con una panoramica generale sulle particolarità della
tecnologia USB e degli
strumenti forniti assieme ad ogni distribuzione Linux.
Abbiamo esordito dicendo che l'articolo si concentrerà sulle
periferiche di archiviazione di massa e sono sicuro che tale affermazione
indurrà a pensare che si parlerà esclusivamente di hard disk e
pen drive!
È fondamentale non commettere errori di questo genere: con "periferiche
archiviazione di massa" intendiamo tutte le periferiche capaci di
memorizzare e gestire file e directory.
In sintesi anche una comune fotocamera digitale, eccetto alcuni casi,
può rientrare in questo gruppo e pertanto andrà trattata,
installata e gestita secondo la stessa identica modalità.
Iniziamo parlando dei requisiti primari per sfruttare al meglio queste
periferiche.
Credo non vi siano dubbi sul fatto che un kernel con supporto USB sia obbligatorio, ma non solo:
sarà infatti nostra cura assicurarci che siano disponibili, come
moduli o includendole direttamente nel kernel, alcune funzionalità
aggiuntive.
Non attraverseremo le varie fasi di ricompilazione del
kernel, argomento trattato in lungo e in largo, ma ci limiteremo ad elencare
le opzioni da abilitare.
Procederemo prima di tutto nella verifica del tipo di controller USB utilizzato dalla nostra scheda madre, che sarà uno dei seguenti:
Dato che può essere utile conoscerne la differenze basilari, riporto qui sotto un breve schema riassuntivo:
Il kernel Linux a partire dalla release 2.4.19 ha iniziato a supportare
lo standard USB 2.0, anche
se nelle prime release il supporto è piuttosto precario.
Coloro
che hanno seguito i precedenti articoli riguardanti i modem ADSL Globespan
ricorderanno che il requisito fondamentale per il corretto funzionamento di
tale periferiche era la totale assenza del modulo "USB_EHCI_HCD".
Con il rilascio della nuovissima release del kernel 2.6 sembra che il
supporto sotto questi termini sia migliorato notevolmente, ma a causa del
limitato tempo a mia disposizione non ho ancora avuto modo di testarlo.
Pertanto, onde evitare problemi, è si consiglia ancora per qualche
tempo l'utilizzo dei moduli per il supporto dello standard 1.1.
Maggiori informazioni relative al controller possono essere ottenute
interrogando direttamente il bus PCI.
Un rapporto decisamente dettagliato può essere ottenuto attraverso il
comando:
# lspci -vv |
che riporta ad esempio, nel mio caso:
[...] 0000:00:03.0 USB Controller: Silicon Integrated Systems [SiS] USB 1.0 Controller (rev 0f) (prog-if 10 [OHCI]) [...] |
Il risultato qui sopra è ridotto al minimo, ma nella realtà
è decisamente più prolisso: risulta facile perdersi nella
miriade di informazioni restituite.
Il mondo del software libero, come noto, mette a disposizione della
comunità strumenti capaci di semplificare la vita all'utente finale.
Mi dispiace però constatare che tali strumenti non vengano quasi mai
menzionati. Ecco perché nel corso di questo articolo ho deciso di
chiamarli in causa: usbutils e usbview.
Si tratta di due strumenti fondamentalmente uguali che trovano l'unica
differenza nell'interfaccia grafica, presente solo in uno dei due.
Il
primo, scaricabile all'indirizzo http://www.linux-usb.org/tools.html,
funziona solamente da console mentre il secondo (http://usbview.sourceforge.net)
presenta un'interfaccia grafica più amichevole.
La scelta di uno piuttosto dell'altro è lasciata alle preferenze
personali: in questo articolo utilizzeremo usbutils.
Rieffettuando l'interrogazione vista sopra con lsusb (uno degli eseguibili di usbutils) si ottiene un risultato più chiaro e immediato, soprattutto sotto l'aspetto della formattazione dell'output, e che inoltre tiene conto solamente del sistema USB:
# lsusb -v Bus 003 Device 001: ID 0000:0000 Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 1.10 bDeviceClass 9 Hub bDeviceSubClass 0 Unused bDeviceProtocol 0 bMaxPacketSize0 8 idVendor 0x0000 idProduct 0x0000 bcdDevice 0.00 iManufacturer 0 iProduct 2 USB OHCI Root Hub iSerial 1 e0c6f000 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 25 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 0 bmAttributes 0x40 Self Powered MaxPower 0mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 9 Hub bInterfaceSubClass 0 Unused bInterfaceProtocol 0 iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0002 bytes 2 twice bInterval 255 [...] |
Fatta luce sul tipo di controller, ci rimangono solamente da considerare le opzioni legate all'USB-storage.
Per fornire un resoconto il più completo possibile vedremo le opzioni da abilitare sia per coloro che utilizzano un kernel modulare che per coloro che preferiscono ricompilarsi una kernel ad hoc.
--- USB Support --- [*] Support for USB [ ] USB verbose debug messages [...] [*] Preliminary USB device filesystem [*] OHCI (Compaq, iMacs, OPTI,SIS,ALI...) support <---- nel mio caso ad esempio [...] [*] USB Mass Storage support [*] USB Mass Storage verbose debug |
Da notare come tra le varie voci disponibili sia attiva l'opzione "Preliminary USB device filesystem". Per chi non conoscesse la natura di quest'ultima ci basterà sapere che consente di ottenere maggiori informazioni sull'intero sistema USB attraverso il filesystem vituale /proc. Si ricordi infatti che molti degli strumenti di analisi del sistema, come lo stesso lsusb, restituiscono dei risultati proprio attraverso le informazioni presenti in /proc.
Molto più rapida e semplice la via del caricamento moduli. Sarà infatti sufficiente abilitarli attraverso i seguenti comandi:
# /sbin/modprobe usbcore # /sbin/modprobe usb-ohci # /sbin/modprobe usb-storage |
La configurazione volge ormai al termine; riavviamo la macchina e verifichiamo attraverso dmesg che la periferica venga correttamente caricata:
# dmesg [...] hub.c: new USB device 00:03.2-2, assigned address 5 scsi0 : SCSI emulation for USB Mass Storage devices Vendor: USB *** Model: ***** Rev: *** Type: **** ANSI SCSI revision: ** usb-storage: loaded sucessfully [...] |
Nota: dato che abbiamo parlato di "usbutils", come ulteriore
verifica potremmo assicurarci che la periferica stia effettivamente
sfruttando il modulo "USB storage", confermando così il risultato del
nostro lavoro. Usbmodules, un altro degli eseguibili appartenenti a
"usbutils", elenca infatti tutti i moduli del kernel caricati ed associati a
periferiche USB, operando
una corrispondenza in base all'indirizzo della periferica stessa.
Se il discorso non appare molto chiaro, un esempio aiuterà a
comprendere meglio:
(l'identificativo della periferica è: 00:03.2-2; l'indirizzo ad essa
associato è: 5)
# /usr/sbin/usbmodules --device /proc/bus/usb/003/005 usb-storage |
A questo punto, sicuri del risultato, non rimane altro che rifinire al
meglio la configurazione formattando la periferica come meglio crediamo e
occupandoci di attivare adeguati punti di mount.
Ricordando che la periferica in questione funziona in emulazione SCSI, similmente a quanto
accade ad esempio con i masterizzatori IDE, è sufficiente
includere la nostra migliore configurazione in /etc/fstab.
Per
quanto riguarda la formattazione, c'è poco da dire: decidete prima di tutto
che filesystem utilizzare. Se si vuole mantenere una certa
compatibilità con i prodotti Microsoft, si può ad esempio
scegliere "vfat". Se preferite essere linuxiani fino in fondo, beh...
Per una corretta formattazione, mi sento di consigliare i seguenti strumenti:
Una volta conclusa anche questa fase, definiamo i punti di mount e
terminiamo così questo impervio cammino.
Segue un esempio generale:
# vi /etc/fstab # Definisci il mount point per una ipotetica periferica formattatta in ext2 /dev/sda1 /mnt/pen ext2 noauto, users 0 0 # Rendi disponibili le informazioni USB all'interno del filesystem /proc none /proc/bus/usb usbdevfs defaults 0 0 |
Si conclude qui il nostro lavoro. Di seguito parleremo di una specifica pen-drive da me provata, cercando di fare un raffronto il più neutrale possibile sul funzionamento di quest'ultima sia sotto Linux che sotto Windows. Inoltre, nei limiti del possibile, cercheremo di dare una breve spiegazione ai probabili problemi che potremmo incontrare.
Alcuni mesi fa ho acquistato una pen drive con l'intento di rendere
più flessibile lo spostamento di file da una postazione all'altra.
La periferica è una Zelig One prodotta dalla Hamlet, con una capacità massima
di 256 MB.
L'installazione, conclusasi senza nessun problema, è stata
effettuata seguendo le linee guida viste in questo articolo.
Assieme alla periferica viene fornita una piccola utilità che
consente la formattazione del dispositivo e la protezione dei contenuti
attraverso una password; come immaginabile è disponibile solamente
per piattaforme Windows (gli utenti Linux sono penalizzati come al
solito).
Ho testato a fondo tale periferica, per verificare le prestazioni e la
stabilità del sistema USB
sotto Linux. Inoltre, avendo avuto occasione di lavorare diverse volte sotto
Windows, ho potuto fare una paragone tra le due piattaforme.
Racconterò brevemente quest'esperienza: sono emersi particolari
interessanti.
Partiamo innanzitutto dal sistema USB
in generale: nonostante le cinque periferiche collegate contemporaneamente,
l'aggiunta del nuovo dispositivo non ha creato nessun genere di
problema.
Dopo aver formattato la pen drive in ext2 per superare i limiti di lunghezza
dei file DOS e per ottenere una piena compatibilità con il sistema,
ho provato a trasferire grosse quantità di file di piccole
dimensioni.
I risultati sono eccelsi: rapidità, nessuna condizione di blocco,
transfer rate costante. Tutto questo sta a dimostrare che il layer USB in Linux è molto
stabile.
Qualche punto in meno, invece, nel caso di trasferimenti di file molto
grandi: il transfer rate, molto elevato sin dall'inizio, tende ad
abbassarsi, anche se non eccessivamente, nel corso del trasferimento.
Ho rilevato sporadici casi di blocco che non sembrerebbero dovuti ad un
bus incapace di gestire il grosso volume di dati, quanto a
problemi legati all'interfaccia grafica; eseguendo infatti dei trasferimenti
da console la situazione è parsa nettamente migliore.
Qualche riscontro con Windows è obbligatorio, soprattutto in situazioni dove il nostro sistema esce vittorioso sotto svariati punti di vista: uno dei primissimi aspetti a favore del pinguino sono i filesystem. Sappiamo tutti che i sistemi operativi della casa di Redmond sono in grado di gestire solo i propri filesystem, mentre sotto Linux abbiamo a disposizione un'enorme scelta, per tutte le necessità.
Niente da dire in merito ai trasferimenti, dove i due sistemi sembrerebbero
equivalersi.
La gestione fisica della periferica diventa l'arma vincente di Linux,
aspetto che sotto Windows appare quasi primitivo: infatti, provando a staccare
fisicamente la periferica durante un trasferimento in corso, si genera uno
svuotamento improvviso del buffer. Sotto Linux, queste condizioni hanno
provocato la perdita del solo file in corso di trasferimento, oppure dei dati
non ancora bufferizzati completamente. Sotto Windows ha quasi sempre
causato la perdita di tutti i dati, costringendomi talvolta a riformattare
interamente la periferica.
Non possiamo con poche righe dare una visione completa su tutti gli ostacoli nei quali possiamo incappare. Possiamo invece parlare dei più comuni messaggi di errore, e vedere come comportarsi.
Nel corso del tempo ne ho localizzati fondamentalmente tre, tra i più frequenti:
usb.c: USB device not accepting new address=xx (error=-110) |
Questo messaggio, abbastanza frequente, segnala il problema più
probabile con il quale si è costretti a misurarsi.
Il significato può essere ricercato in due eventi: un problema di
sovrapposizione di IRQ oppure,
più probabilmente, l'ACPI.
Le possibili soluzioni non sono molte, anche se nella maggior parte dei casi
portano a risultati concreti.
Una delle prime strade da percorrere è verificare lo stato
dell'ACPI;
se attivo disabilitatelo e con buona probabilità tutto andrà a
posto.
Qualora fosse stato già disabilitato allora il problema è
legato al fatto che il bus PCI previene conflitti
IRQ. Potreste dover provare
diverse soluzioni prima di risolvere il problema: le schede madri più
recenti, ad esempio, potrebbero avere delle funzioni avanzate, che talvolta
consentono la gestione degli IRQ delle periferiche USB. Provate a modificare tali
impostazioni.
Per le schede madri più datate potrebbe essere necessario aggiornare,
qualora possibile, il BIOS.
Altre soluzione non ne conosco; se ne scoprite di nuove, fatemelo sapere.
usb_control/bulk_msg: timeout |
Non si tratta di un vero e proprio messaggio di errore, bensì questo avviso tende a
segnalarci una situazione anomala già occorsa.
Questo vuol dire che in prossimità di tale errore dovremmo trovare un
messaggio specifico sul problema. È nella maggior parte dei casi generato
qualora il sistema non ottenga una messaggio di risposta ad una sua
richiesta; ad esempio nel caso di attesa di assegnazione dell'IRQ.
Da notare che può essere visualizzato anche su sistemi perfettamente
funzionanti: il caso che ho riscontrato con più frequenza è
proprio questo, in presenza del modulo hotplug caricato.
Tuttavia, in assenza di problemi, il sistema tenderà ad impostarsi
automaticamente su un altro indirizzo.
Ultima nota: se abbiamo abilitato l'opzione di debug approfondito, accanto
al messaggio possiamo generalmente trovare indicazioni in merito alla
periferica in errore.
USB device xxx (vend/prod xxxx/xxxx) is not claimed by any active driver |
Il messaggio, peraltro abbastanza chiaro, ci avverte della mancanza di un
driver adatto alla periferica che stiamo cercando di utilizzare.
Sicuri di aver caricato tutti i moduli necessari?
L'autoreGiuseppe Lucente, alias Beppe, è un
utente casalingo con tanta passione per tutto quello che ruota attorno al
mondo dell'informatica. |
<- AGORA: Mozambico - Indice Generale - Copertina - HiL: Synaptics -> |