понедельник, 18 января 2010 г.

Правильное монтирование USB-устройств

Добрался сделать свою утилиту для монтирования USB-накопителей. Как водится, долго думал, после чего стало ясно, что ни одной "правильной" системы монтирования я не видел. Все дело в том, что пользователь работает с физическими устройствами, а не дисками в их понимании ОС, и тем более не с их разделами. То есть требуется следующий функционал: примонтировать/отмонтировать/перемонтировать все и примонтировать/отмонтировать последнее подключенное устройство. Все, больше ничего не нужно. Но вот отсутствие именно этих двух возможностей и делает все системы монтирования настолько неудобными, какие они есть. Реализация в виндоус, кстати, не исключение, - сколько раз сам наблюдал, когда пользователь среди множества разделов (сетевые шары, внешний жесткий диск, флэшка) пытается "узнать" последний подключенный, чтобы отмонтировать именно флэшку.

Пакет пока не выложил, но скоро будет. Называется он mbg-usbmount и содержит одноименную программу для монтирования, являющуюся обвязкой к замечательной утилите pmount, и файл описания тулбара для IceWM.

Все накопители монтируются в /media по их метке или, при ее отсутствии, по идентификатору. При отмонтировании соответствующие папки из /media удаляются даже для тех устройств, которые были жестоко выдернуты без отмонтирования. Уж не знаю, почему большинство систем монтирования в таких случаях папки сохраняет, заставляя пользователя лазить по ним и искать, где же его данные лежат.

От идеи автомонтирования по событиям UDEV я отказался, т.к. определение пользователя, для которого следует замонтировать накопитель, становится явно неоднозначно решаемой задачей. Раз у нас линукс, то на одной машине могут работать несколько пользователей одновременно, и вменяемая система монтирования не должна монтировать флэшку пользователя А с правами пользователя Б ни в каком случае. Так что оказывается, что монтирование должно выполняться по указанию пользователя, но процесс следует упростить до сценариев "подключить все накопители, которые я тут навтыкал" или "подключить тот накопитель, который я сейчас воткнул". Все, список накопителей показывать вовсе не нужно, ибо требуемые действия легко автоматизируются. Еще иногда случаются сбои, тут просто нужно перемонтировать все найденные разделы, удалив неактуальные точки монтирования.

2 комментария:

morbo комментирует...

Есть несколько ситуаций, когда автомонтирование и разграничение прав сочетаются и не сочетаются:
1.1. в общесистемный разъём вставлен носитель с известным системе уникальным идентификатором - его можно автоматически смонтировать для определённого пользователя или группы пользователей с определёнными же правами.
1.2. в общесистемный разъём вставлен носитель с неизвестным системе уникальным идентификатором - можно либо
1.2а. автоматически его смонтировать с полным правом чтения и записи для всех, кто имеет право монтировать, либо
1.2б. разрешить монтировать его только определённой группе лиц в ручном режиме - администраторам или операторам системы.
2.1. носитель с известным системе уникальным идентификатором вставлен в разъём, физически расположенный на терминале пользователя - можно автоматически смонтировать носитель с теми правами доступа, которые пользователь определил для этого носителя,
2.2. носитель с неизвестным системе уникальным идентификатором вставлен в разъём, физически расположенный на терминале пользователя - можно
2.2а. автоматически смонтировать носитель с теми правами, которые пользователь определил как права по умолчанию,
2.2б. не монтировать автоматически, оставить пользователю возможность смонтировать носитель вручную.

На настольных компьютерах автомонтирование по схеме 2.1, 2.2а, 2.2б возможно только в одном случае - если пользователь находится за клавиатурой и монитором самого компьютера. Для нелокальных пользователей в данном случае автомонтирование сменных носителей скорее всего лишено смысла.

В оставшихся случаях автомонтирование может применяться только в случаях 1.1 и 1.2а. Случай 2б сильно специфический и на самом деле нужен очень и очень редко - скорее всего на каких-нибудь правительственно-военных сильно засекреченных компах :)

Поэтому лично я считаю автомонтирование с разграничением прав для пользователей применимо только либо в том случае, когда системе либо известен уникальный идентификатор носителя, либо когда достоверно известно каким пользователем был вставлен носитель. На обычных домашних компьютерах определить достоверно, каким пользователем был вставлен носитель, не представляется возможным, а поэтому я за то, что бы автомонтирование, если оно применяется, выполнялось бы с равными правами на чтение-запись для всех пользователей, имеющих право монтировать, либо не применялось бы вообще.

Всякие ситуации типа "пользователь А вставил свою флешку, а её злой автомонтировщик нечаянно смонтировал с правами пользователя Б" считаю просто смешными. Раз уж система не может различить чья это была флешка и кем вставлена - какой смысл в монтировании флешки с разными правами?

Печников Алексей комментирует...

Думаю, что от использования "известного системе уникального идентификатора" для флэшек только лишние сложности возникают.
К примеру, у меня под рукой с десяток флэшек наберется, да пара внешних усб-дисков. Само собой, что периодически близкие что-нибудь из этого хозяйства одалживают и подключают к своим компам, равно как и я сам могу в их компы включать эти же устройства. Так что нет однозначного соответствия уникального владельца и уникального идентификатора устройства.

Собственно, нажать одну кнопку для монтирования/отмонтирования нового устройства не затруднит пользователя, главное, чтобы не требовалось только что добавленное устройство искать среди множества всех подключенных.


(C) Alexey Pechnikov aka MBG, mobigroup.ru