Я запускаю Debian Squeeze на подключаемом компьютере (только SSH, без графического интерфейса), и я пытаюсь сделать так, чтобы при подключении USB-накопителя он автоматически монтировался.
Что я сделал, так это установил, autofs
который из того, что я собираю, обрабатывает автомонтирование, если оно знает, где находится устройство /dev
.
Проблема в том, что флешка не всегда на одном и том же имени устройства. Иногда это /dev/sdc1
, иногда /dev/sdd1
и т. Д.
Я понимаю, что для исправления этой ситуации мне нужно udev
убедиться, что USB-накопителю всегда присваивается одно и то же имя.
Я получил следующую информацию из udevadm
:
Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.
looking at device '/block/sdd/sdd1':
KERNEL=="sdd1"
SUBSYSTEM=="block"
DRIVER==""
ATTR{partition}=="1"
ATTR{start}=="63"
ATTR{size}=="129339"
ATTR{ro}=="0"
ATTR{alignment_offset}=="0"
ATTR{discard_alignment}=="0"
ATTR{stat}==" 31 244 275 190 0 0 0 0 0 190 190"
ATTR{inflight}==" 0 0"
looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0/host8/target8:0:0/8:0:0:0/block/sdd':
KERNELS=="sdd"
SUBSYSTEMS=="block"
DRIVERS==""
ATTRS{range}=="16"
ATTRS{ext_range}=="256"
ATTRS{removable}=="1"
ATTRS{ro}=="0"
ATTRS{size}=="129439"
ATTRS{alignment_offset}=="0"
ATTRS{discard_alignment}=="0"
ATTRS{capability}=="51"
ATTRS{stat}==" 56 727 783 520 0 0 0 0 0 520 520"
ATTRS{inflight}==" 0 0"
ATTRS{events}=="media_change"
ATTRS{events_async}==""
ATTRS{events_poll_msecs}=="-1"
looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0/host8/target8:0:0/8:0:0:0':
KERNELS=="8:0:0:0"
SUBSYSTEMS=="scsi"
DRIVERS=="sd"
ATTRS{device_blocked}=="0"
ATTRS{type}=="0"
ATTRS{scsi_level}=="3"
ATTRS{vendor}==" "
ATTRS{model}=="Flash Disk "
ATTRS{rev}=="2.00"
ATTRS{state}=="running"
ATTRS{timeout}=="30"
ATTRS{iocounterbits}=="32"
ATTRS{iorequest_cnt}=="0x90"
ATTRS{iodone_cnt}=="0x90"
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"
looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0/host8/target8:0:0':
KERNELS=="target8:0:0"
SUBSYSTEMS=="scsi"
DRIVERS==""
looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0/host8':
KERNELS=="host8"
SUBSYSTEMS=="scsi"
DRIVERS==""
looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2/1-1.2:1.0':
KERNELS=="1-1.2:1.0"
SUBSYSTEMS=="usb"
DRIVERS=="usb-storage"
ATTRS{bInterfaceNumber}=="00"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bNumEndpoints}=="02"
ATTRS{bInterfaceClass}=="08"
ATTRS{bInterfaceSubClass}=="06"
ATTRS{bInterfaceProtocol}=="50"
ATTRS{modalias}=="usb:v1976p6025d0100dc00dsc00dp00ic08isc06ip50"
ATTRS{supports_autosuspend}=="1"
looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1/1-1.2':
KERNELS=="1-1.2"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="80"
ATTRS{bMaxPower}=="100mA"
ATTRS{urbnum}=="383"
ATTRS{idVendor}=="1976"
ATTRS{idProduct}=="6025"
ATTRS{bcdDevice}=="0100"
ATTRS{bDeviceClass}=="00"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{speed}=="12"
ATTRS{busnum}=="1"
ATTRS{devnum}=="11"
ATTRS{devpath}=="1.2"
ATTRS{version}==" 1.10"
ATTRS{maxchild}=="0"
ATTRS{quirks}=="0x0"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{authorized}=="1"
looking at parent device '/devices/platform/orion-ehci.0/usb1/1-1':
KERNELS=="1-1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="e0"
ATTRS{bMaxPower}=="100mA"
ATTRS{urbnum}=="197"
ATTRS{idVendor}=="1a40"
ATTRS{idProduct}=="0101"
ATTRS{bcdDevice}=="0111"
ATTRS{bDeviceClass}=="09"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="01"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{speed}=="480"
ATTRS{busnum}=="1"
ATTRS{devnum}=="2"
ATTRS{devpath}=="1"
ATTRS{version}==" 2.00"
ATTRS{maxchild}=="4"
ATTRS{quirks}=="0x0"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{authorized}=="1"
ATTRS{product}=="USB 2.0 Hub"
looking at parent device '/devices/platform/orion-ehci.0/usb1':
KERNELS=="usb1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="e0"
ATTRS{bMaxPower}==" 0mA"
ATTRS{urbnum}=="24"
ATTRS{idVendor}=="1d6b"
ATTRS{idProduct}=="0002"
ATTRS{bcdDevice}=="0206"
ATTRS{bDeviceClass}=="09"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="01"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{speed}=="480"
ATTRS{busnum}=="1"
ATTRS{devnum}=="1"
ATTRS{devpath}=="0"
ATTRS{version}==" 2.00"
ATTRS{maxchild}=="1"
ATTRS{quirks}=="0x0"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{authorized}=="1"
ATTRS{manufacturer}=="Linux 2.6.38.8 ehci_hcd"
ATTRS{product}=="Marvell Orion EHCI"
ATTRS{serial}=="orion-ehci.0"
ATTRS{authorized_default}=="1"
looking at parent device '/devices/platform/orion-ehci.0':
KERNELS=="orion-ehci.0"
SUBSYSTEMS=="platform"
DRIVERS=="orion-ehci"
ATTRS{modalias}=="platform:orion-ehci"
looking at parent device '/devices/platform':
KERNELS=="platform"
SUBSYSTEMS==""
DRIVERS==""
Я пытался написать udev
правила, чтобы заставить USB-флешку взять имя, /dev/usbstick
но пока не увенчался успехом.
Может ли кто-нибудь помочь с тем правилом, которое мне нужно указать в файле правил, чтобы эта флешка всегда получала одно и то же имя?
- Или есть ли гораздо более простой способ автоматического подключения USB-накопителя, который мне не хватает полностью?
ОБНОВИТЬ
Хорошо, поэтому я добился определенного прогресса. Я добавил следующее правило:
SUBSYSTEMS=="scsi", ATTRS{model}=="Flash Disk ", DRIVERS=="sd", NAME="usbstick-%k" RUN+="mkdir /mnt/usbstick-%k; mount /dev/usbstick-%k /mnt/usbstick-%k"
Я знаю, что это все еще требует некоторой работы с точки зрения обработки добавления / удаления, но пока это просто базовый тест.
Результатом этого является то, что мне теперь удается получить три новых узла устройства /dev
, а именно /dev/usbstick-sdc
, /dev/usbstick-sdc1
и usbstick-sg2
.
Однако я обнаружил, что код в RUN
разделе выполняется только один раз и просто создает каталог mnt/usbstick-sdc
. Я также обнаружил, что каталог всегда пуст, поэтому что-то явно идет не так! (хотя я делаю успехи).
источник
/dev/sdc1
должна была бытьsdd1
? И вы можете использоватьblkid
для уникальной идентификации диска (ну, на самом деле, раздел; он изменится, если вы переформатируете).udev
правило для создания узлов устройств для каждого раздела, но я не уверен, для какого уровняudevadm
вывода будут создаваться правила!ACTION==
, однимKERNEL==
и однимATTRS{something}==
(это вполне выполнимо - это то, что я использую). Кроме того, рассмотрите возможность запуска единственного сценария из цепочки команд вRUN+=
.KERNEL=="sd??", NAME="%k", RUN+="mkdir /mnt/usbstick-%k; mount /dev/usbstick-%k /mnt/usbstick-%k"
- но нет, конечно, это тоже не работает. Теперь я все больше расстраиваюсь, проведя почти целый день, пытаясь понять, как подключить USB-флешку для подключения. Должны ли вещи быть такими сложными? Вывод изudevadm test /sys/block/sdd
- конечно - практически не читается, поэтому у меня нет возможности узнать, где я иду не так. Кто-нибудь может указать мне правильное направление на это?Ответы:
Я полагаю, что должен быть гораздо более простой способ решения такой распространенной проблемы, и он есть. Вот что я попробовал на своем сервере wheezy / sid:
Подключите USB-накопитель, готово! Моя флешка теперь доступна через
/media/usb
.Кстати, у usbmount нет страницы руководства, пожалуйста, прочитайте
/usr/share/doc/usbmount/README.gz
вместо этого. Похоже, usbmount монтирует вашу флешку с опцией синхронизации по умолчанию. Для вашей флешки может быть намного лучше смонтировать ее асинхронно и запуститьsync
илиumount
перед ее отключением. Это настраивается.источник
pumount
usbmount
больше не поддерживает NTFS, так как debian jessie: bugs.debian.org/774149Обратите внимание, что вы не можете просто иметь один узел устройства для представления любого возможного присоединенного pendrive. Что делать, если вы подключите два из них? Или когда Pendrive имеет более одного раздела?
Как правило, то, что вы используете для создания пользовательского узла устройства, это
SYMLINK+=
. Grep для этого в правилах , чтобы увидеть , как он используется:grep SYMLINK /etc/udev/rules.d/*
. Как и во всех командах, запускаемых udev, вы можете использовать некоторые значимые переменные, которые описаны вman udev
. Вы можете понять, что на самом деле вам не нужно присваивать пользовательское имя устройству, поскольку вы можете передать его имя в скрипт (через%k
переменную).Что касается решения с автоматическим монтированием, взгляните на UAM , который я немного описал в ответе на этот вопрос .
источник
udev
правил с сопровождающими скриптами. Вы можете взглянуть на правила и легко адаптировать их к вашим потребностям.udevadm
и сказать мне, какое устройство является устройством, на которое я должен нацеливаться с моим правилом? Различные примеры, которые я видел в Интернете, похоже, включают в себя гораздо более короткие деревья, и каждый пример, похоже, нацелен на другой уровень устройства, без объяснения того, на какой объект следует ориентироваться и почему.Вот как я недавно это сделал, и теперь я вполне доволен этим подходом. Это для Ubuntu 12.04 + Gentoo, но я думаю, что любой дистрибутив, который позволяет установить udev и автозапуск должен работать.
Предварительные условия: Вы должны установить udev + autofs.
Шаг 1)
Создайте следующий файл "/etc/udev/rules.d/90-usbsd-auto.rules" (конечно, вы можете использовать любое имя, если оно оканчивается на ".rules"). :
Что это делает: создает две символические ссылки, одну для раздела запоминающего устройства USB в «/ dev / usbdisks / <...>».
Вторая символическая ссылка будет ссылаться с "/ media / usb / <...>" на "/ media / autousb / <...>", это делается для поддержки автомонтирования (см. Шаг 2).
Чтобы убедиться, что udev читает эти правила, используйте
Примечание: То же имя для той же карты памяти USB: возможно, но может быть и опасно: вы можете использовать, например, «$ env {ID_FS_LABEL_ENC}» вместо «% k» в вышеприведенных правилах UDEV. При этом будет использоваться метка тома для создания / media / usb / <...>, но что произойдет, если вы подключите два USB-накопителя и оба будете использовать одну и ту же метку тома ...
С этим файлом правил udev все настроено для автоматического монтирования раздела USB-накопителя. Обратите внимание, что прямо сейчас устройство НЕ будет автоматически подключено (намеренно). Он будет автоматически смонтирован, как только вы используете его
Шаг 2)
Настройте autofs для autoount / media / autousb / <...>: я добавил следующую строку в мой файл /etc/auto.master (для Ubuntu 12.04):
Это означает, что AutoFS отключит устройство после 60 секунд бездействия. Вы можете использовать меньше или больше, в зависимости от вашего вкуса.
Для Gentoo вы должны изменить "/etc/autofs/auto.master", чтобы имело смысл использовать
Теперь я создал "auto.usb" со следующим содержимым:
Этот auto.usb должен быть исполняемым, чтобы autofs использовал его как (bash) скрипт. Так например
Что это делает? Этот скрипт сообщит AutoFS (/ usr / sbin / automount), как монтировать раздел устройства хранения USB.
Сначала сценарий будет использовать «/ sbin / blkid», чтобы выяснить, какая файловая система находится в разделе.
Затем скрипт предоставит правильные параметры монтирования в зависимости от раздела устройства.
Примечание: я включил пример кода для файловых систем vfat (вероятно, наиболее распространенных для usb-флешек), ntfs и ext4. Конечно, это довольно легко расширить для поддержки большего количества файловых систем.
Шаг 3)
Необязательно ... Чтобы "извлечь" == размонтировать ваши флешки (или разделы на флешке), создайте скрипт в / sbin / usbeject:
С помощью этого сценария вы можете использовать «sudo usbeject» для размонтирования всех подключенных разделов USB-устройств (указав автомонтированию отключить их).
Конечно, вы можете просто убедиться, что раздел нигде не используется; Затем автомонтировщик размонтирует раздел после 60 секундного ожидания ...
Настоящий трюк здесь заключается в использовании символических ссылок из "/ media / usb" в "/ media / autousb":
источник
Извините, что отвечаю на мой собственный вопрос, и огромное спасибо rozcietrzewiacz за помощь, но в итоге мне удалось добиться значительного прогресса, используя следующее правило после нескольких часов чтения в Интернете:
SUBSYSTEMS=="scsi", KERNEL=="sd[a-h]1", SYMLINK+="removable", RUN+="/bin/mount /dev/removable /path/to/mount"
Это смонтирует первый раздел любого устройства SCSI. Я думаю, что следующий вопрос будет состоять в том, как смонтировать несколько разделов, но это еще одна проблема для другого дня.
источник
removable
атрибут, который вы должны проверить, а неblock
вместоscsi
.Я обнаружил, что лучший ответ на самом деле стал устаревшим, так как он не поддерживается и не работает с Джесси (см. Комментарий Малата)
Для меня (на Джесси) решение в этом блоге работало как шарм.
Кредиты "ddumont", но выкладываю обзор своего блога / ответа здесь, чтобы справиться с возможной гнилью ссылок в будущем.
Добавьте следующую строку в
/etc/fstab
Вы можете сделать это используя nano:
Объяснение:
/dev/sr0
это файл устройства. Вы также можете использовать одну из символических ссылок, настроенную udev в / dev / disk / by-id. Вам нужно будет изменить это в соответствии с файлом вашего устройства (sudo fdisk -l
чтобы получить список устройств)/media/bluray
это точка монтирования. Вы можете выбрать другую точку монтированияnofail
требуется, чтобы избежать сообщения об ошибке при загрузке без диска в оптическом приводеx-systemd.automount
это опция для настройки systemd для автоматического монтирования вставленного дискаНе указывайте noauto: это помешает systemd автоматически смонтировать диск, что противоречит цели.
Контрольная работа
Запустите команду
journalctl -x -f
в терминале, чтобы проверить, что происходит с systemdПерезагрузите конфигурацию systemd с помощью
sudo systemctl daemon-reload
.загрузите диск в свой оптический привод
Затем journalctl должен показать что-то вроде:
Дальше
Чтобы успешно смонтировать диски NTFS, мне пришлось установить ntfs-3g (старые ntfsprogs)
Мне не нужно было устанавливать hfsprogs, чтобы заставить работать usb в формате OSX, но вы должны проверить это сами.
источник