2

У меня есть зашифрованный раздел, который я хотел бы смонтировать автоматически, когда я вставляю флешку, содержащую ключ, и я хотел бы размонтировать его (и закрыть маппер), когда флешка удалена. Я использую Ubuntu Karmic.

Кажется, есть пара проектов, которые пытаются это сделать для TrueCrypt (например, http://sourceforge.net/projects/tc-wrapper/), но ничего не основано на dmcrypt/LUKS. Поэтому я решил попытать счастья, написав правило udev. После многих разочаровывающих часов я придумал это:

ACTION=="add", SUBSYSTEM=="block", ATTRS{model}=="Flash Disk", ATTRS{vendor}=="USB2.0", RUN+="/home/michael/trigger-mount.sh encrypted"
ACTION=="remove", SUBSYSTEM=="block", ENV{ID_VENDOR_ID}=="0204", ENV{ID_MODEL_ID}=="6025", RUN+="/home/michael/trigger-mount.sh encrypted"

Это работает, но не приятно. Проблема здесь в том, что первое правило не будет соответствовать при удалении, второе не будет соответствовать при добавлении.

udevadm monitor --property показывает это (и почти то же самое при добавлении).

UDEV  [1264556064.762870] remove   /devices/pci0000:00/0000:00:02.0/usb2/2-4/2-4:1.0/host47/target47:0:0/47:0:0:0/block/sde (block)
UDEV_LOG=3
ACTION=remove
DEVPATH=/devices/pci0000:00/0000:00:02.0/usb2/2-4/2-4:1.0/host47/target47:0:0/47:0:0:0/block/sde
SUBSYSTEM=block
DEVNAME=/dev/sde
DEVTYPE=disk
SEQNUM=3512
ID_VENDOR=USB2.0
ID_VENDOR_ENC=USB2.0\x20\x20
ID_VENDOR_ID=0204
ID_MODEL=Flash_Disk
ID_MODEL_ENC=Flash\x20Disk\x20\x20\x20\x20\x20\x20
ID_MODEL_ID=6025
ID_REVISION=2.00
ID_SERIAL=USB2.0_Flash_Disk-0:0
ID_TYPE=disk
ID_INSTANCE=0:0
ID_BUS=usb
ID_USB_INTERFACES=:080650:
ID_USB_INTERFACE_NUM=00
ID_USB_DRIVER=usb-storage
ID_PATH=pci-0000:00:02.0-usb-0:4:1.0-scsi-0:0:0:0
DKD_MEDIA_AVAILABLE=1
DKD_PRESENTATION_NOPOLICY=0
MAJOR=8
MINOR=64
DEVLINKS=/dev/block/8:64 /dev/disk/by-id/usb-USB2.0_Flash_Disk-0:0 /dev/disk/by-path/pci-0000:00:02.0-usb-0:4:1.0-scsi-0:0:0:0

Кажется, что он содержит все данные, которые необходимы для соответствия обоим правилам в обоих случаях (добавить, удалить).

Для полноты, вот вывод информации udevadm info -a -p /sys/block/sde/:

  looking at device '/devices/pci0000:00/0000:00:02.0/usb2/2-4/2-4:1.0/host48/target48:0:0/48:0:0:0/block/sde':
    KERNEL=="sde"
    SUBSYSTEM=="block"
    DRIVER==""
    ATTR{range}=="16"
    ATTR{ext_range}=="256"
    ATTR{removable}=="1"
    ATTR{ro}=="0"
    ATTR{size}=="512000"
    ATTR{alignment_offset}=="0"
    ATTR{capability}=="53"
    ATTR{stat}=="      16       47      504      510        0        0        0        0        0      380      510"

  looking at parent device '/devices/pci0000:00/0000:00:02.0/usb2/2-4/2-4:1.0/host48/target48:0:0/48:0:0:0':
    KERNELS=="48:0:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS=="sd"
    ATTRS{device_blocked}=="0"
    ATTRS{type}=="0"
    ATTRS{scsi_level}=="3"
    ATTRS{vendor}=="USB2.0  "
    ATTRS{model}=="Flash Disk      "
    ATTRS{rev}=="2.00"
    ATTRS{state}=="running"
    ATTRS{timeout}=="30"
    ATTRS{iocounterbits}=="32"
    ATTRS{iorequest_cnt}=="0x41"
    ATTRS{iodone_cnt}=="0x41"
    ATTRS{ioerr_cnt}=="0x0"
    ATTRS{modalias}=="scsi:t-0x00"
    ATTRS{evt_media_change}=="0"
    ATTRS{queue_depth}=="1"
    ATTRS{queue_type}=="none"
    ATTRS{max_sectors}=="240"

 ....

Кто-нибудь может пролить свет на это?

1 ответ1

1

Я написал некоторую информацию об использовании udev в качестве автомонтера в предыдущем ответе ; он (или ресурсы, на которые он ссылается) может пролить свет на вас.

Мне не ясно, что именно ваш вопрос

  • Относительно отдельных правил добавления и удаления: вы можете объединить их, если отбросите совпадение ACTION , но это может привести к слишком частому срабатыванию правила. Я думаю, что лучше явно соответствовать каждому правилу. Или еще лучше (по причинам, обсуждаемым в разделе « Размонтирование » ниже), вообще удалите правило "удалить".

  • Относительно действий RUN в правилах uDev: Действие RUN в вашем правиле uDev должно быть выполнено быстро. Взгляните на пример, с которым я связан; вы увидите, что есть два сценария - uDev вызывает один, который раскручивает другой для фактического монтирования, позволяя первому своевременно вернуть управление обработкой обратно в uDev. Если вы уже делаете это, отлично; если нет, подумайте о настройке ваших сценариев аналогичным образом.

  • Что касается размонтирования: у меня было много проблем с автоматическим размонтированием при удалении устройства, и я в итоге решил вообще не использовать правило "удалить". Вместо этого я написал отдельный скрипт unmounter, который заменил правило "remove".

    Это потому, что вы действительно должны дать ОС столько времени, сколько нужно, чтобы закрыть устройство, прежде чем физически удалить его. Одно дело дергать диск, если вы смонтировали файловую систему только для чтения, но полную файловую систему для чтения и записи следует по возможности аккуратно демонтировать. (Это то, что делает опция "Безопасное извлечение диска" в Windows - это механизм для размонтирования диска перед физическим удалением устройства из системы.)

    С обычной файловой системой я смог заставить некоторые размонтирования работать "должным образом", используя опцию sync во время монтирования и umount -l (lazy unmounts) при размонтировании. Ленивые размонтирования говорят ядру немедленно отключить файловую систему, но очищают ссылки на файловую систему позже, когда они больше не заняты. Это работает, но это не так безопасно для данных, как полное демонтирование перед удалением устройства.

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

Надеюсь, это даст вам некоторые советы. Честно говоря, для целей автонастройки uDev работоспособен, но не идеален. Демон HalEvt или более новый DeviceKit, вероятно, будут более подходящими.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .