Chcete-li od počítače odpojit USB disk, obvykle stačí odmountovat připojený oddíl a vytáhnout USB zařízení, ale není to úplně ono. Disk je do poslední chvíle přístupný operačnímu systému a ani USB řadič v disku neví, že by se chystalo nějaké odpojení. Když takovéto vytažení provedete Nokia telefonu v režimu mass storage, vynadá vám telefon, že mohlo dojít k poškození dat. Není to nic fatálního, pokud je oddíl odmountován, k poškození dat nedojde, ale stejně se mi to nelíbí.
Co tedy dalšího je vhodné udělat před odpojením USB disku?
Především můžeme USB zařízení uspat. V jádře s podporou USB_SUSPEND až do verze 2.6.32 to šlo udělat jednoduše zapsáním:
# echo suspend > /sys/bus/usb/devices/<BUS-ID>/power/level
kde za <BUS-ID> je třeba doplnit správné USB ID (např 5-2). Jenže tohle už nejde. Od jádra 2.6.32 je vynucené suspendování zrušeno a je možné spoléhat pouze na autosuspend, tedy že kernel automaticky zařízení uspí, bude-li nečinné. Jenže stačí zaregistrování blokového zařízení modulem usb_storage, a zařízení je pro kernel v činnosti.
Řešením by mohlo být odebrání modulu usb_storage. To s sebou ovšem veze neblahý vedlejší efekt ve ztrátě všech USB disků. Je ale možné i odpojit konkrétní zařízení, opět přes sysfs:
# echo <BUS-ID> > /sys/bus/usb/drivers/usb/unbind
Pak stačí nastavit automatický spánek s délkou timeoutu na nula:
# echo 0 > /sys/bus/usb/devices/<BUS-ID>/power/autosuspend
# echo auto > /sys/bus/usb/devices/<BUS-ID>/power/level
V tuto chvíli by mělo být zařízení z hlediska USB sběrnice uspáno a odebrání by mělo být opravdu bezpečné. Pokud však jde o klasický rotační hard-disk, je možné že i po uspání USB se stále otáčí, což by nemusel. V takovém případě by mohlo pomoci poslat ještě před odpojením disku SCSI příkaz STOP, třeba pomocí utility sdparm. V mém případě to ale stejně nefungovalo.
Číst dále...