В то же время все линуксоиды в один голос твердят - размонтировал и спи спокойно.
Практика показывает, что на linux можно сделать все, правда никто не знает как. Разрабатывая по работе проходной шифратор USB наткнулся на проблему безопасного извлечения. Сперва решил ее тривиальным образом - через команду с консоли. Но это не тот уровень, хотелось бы чтобы устройство извлекалось само.
Переписка с разработчиком драйвера USB девайса для pxa270, в попытках выяснить что же шлет windows устройству, не дала никаких результатов. Но отладочная инфрмация g_file_storage дала. Выяснилось, что после безопасного отключения Windows переводит устройство в состояние suspend.
Правда, выяснилось так же, что с пользовательского уровня эта информация недоступна. Не проблема. прикрутил запись в sysfs - стала доступна. После этого я всю голову сломал как заставить std::cin неблокированно возвращать состояние буфера, поскольку паралельно надо еще мониторить файл из /sys, но ничего не придумал отключил консоль полностью. Но Уперся в то, что через Windows то все хорошо отключается, а вот через linux - никак. отмонтировал, но кто сообщит устройству что ему надо отключаться?
Поиск в интернете почти ничего не дал, кроме одного упоминания. Дескать
echo suspend > /sys/class/usb_device/usbdev$BUS.$DEVICE/device/power/level
заставит устройство уснуть. Было бы хорошо, но 'USB device class-devices' объявлен в ядре как устаревший, эксперементировать с ним не интересно. 'USB selective suspend/resume and wakeup' объявлено как эксперементальное, но нигде толком не написано как им управлять. Но, методом научного тыка выяснилось, что файл
/sys/devices/pci0000:00/0000:00:1d.7/usb1/1-3/power/level
обладает аналогичными функциями, и может быть найден через /sys/block/sda/device
(симлинк), который указывает на /sys/devices/pci0000:00/0000:00:1d.7/usb1/1-3/1-3:1.0/host8/target8:0:0/8:0:0:0
, относительно /sys/devices/pci0000:00/0000:00:1d.7/usb1/1-3
это прямой путь, без симлинков. Иначе я не придумал как можно автоматически определить все эти многочисленные идентификаторы. lsusb такой информации не предоставляет, да и его вывод всеравно надо парсить.Естественно, все это справедливо только для моей системы, ну кроме разве только sda.
Немного непонятным осталось то, как разбудить устройство снова.
echo on > power/level
включает питание на устройстве, но монтироваться устройство после этого не желает. Правда где-то я видел файл rescan, послав 1 в который можно заставить его пересканировать USB storage. Ну для меня это не очень актуально, оставляю эту тему для интересующихся.PS: Правда, где-то в интернете вычитал, что дескать Windows Vista не отключает питание от устройств, это засада.
4 коммент.:
Так вроде есть патчи на ядро (названия к сожалению не помню), которые позволяют извлекать в любой момент из usb устройства без порчи их. Можно их поковырять для понимания работы.
Не, дело не только в том, чтобы не портить USB носитель...
Просто у меня вместо USB носителя воткнут проходной шифратор - полноценный комп с линуксом, в который уже втыкается носитель, через device-mapper шифруется и через USB gadget частично (часть секторов флешки хранит служебную инфу) предоставляется главному компу. Чтобы все это аккуратно отключить - от компьютера должен придти сигнал (я заюзал суспенд). Или руками дать команду - типа отключай всю эту байду... После чего шифратор отрубает USB gadget, стопает device-mapper и только после этого позволяет вытащить флешку.
Ее я наверное тоже засуспендю, благо теперь знаю как. :)
Просто слишком много инстанций, если флешку выдернуть просто так инфа 100% потеряется.
"Просто слишком много инстанций, если флешку выдернуть просто так инфа 100% потеряется."
Лучше сохранять всю информацию на Flash сразу, а не только при подаче специальной команды "отключение". В конце концов, пользователь может ошибиться в порядке действий, если поторопится.
Лучше, но когда между тобой и флешкой стоит не только твой комп, но еще и шифратор, обладающий своими правилами кеширования, не считая того, что шифратор над данными должен еще и поработать... сложнее все.
Отправить комментарий