Sinistra <- AGORA: Mozambico - Indice Generale - Copertina - HiL: Synaptics -> Destra

USB-storage


Periferiche USB e backup

di Giuseppe Lucente

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.



Introduzione

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.

USB-storage: una nota di partenza

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à.

Preliminari e configurazione

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.

Ricompilazione kernel

--- 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.

Caricamento moduli

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

Fase conclusiva

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.

Appendici

A: Il caso...

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.

B: Gestione errori

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'autore

Giuseppe Lucente, alias Beppe, è un utente casalingo con tanta passione per tutto quello che ruota attorno al mondo dell'informatica.
È fuggito appena in tempo nel 1999 da un regime dittatoriale governato da sistemi Closed Source per (e)migrare verso un regime più democratico: GNU/Linux, che gli ha concesso di ampliare le proprie capacità.
Amante degli animali, ha deciso di intraprendere una dura lotta per la salvaguardia dei pinguini. :)


Sinistra <- AGORA: Mozambico - Indice Generale - Copertina - HiL: Synaptics -> Destra