Intereting Posts
Как остановить Linux от сканирования для разделов на жестком диске? Как перезапустить сетевой интерфейс? Является ли двойная тире еще стандартом posix для длинных переключателей? Crunchbang: невозможно использовать простую проверку без прав администратора Это нормально для пакета, чтобы поместить файл в sudoers.d? Клавиши клавиш Fn не работают (когда udev отключен) Запустить сервер удаленно с помощью SSH Как установить параметры принтера по умолчанию без драйвера bash с сокращенным текущим режиссером, включая файлы точек? Как проверить, что резервная копия с резервным копированием в порядке? Длина строки режима чтения в приглашении bash Могу ли я получить доступ к закладкам Наутилуса в терминале? Linux mint 18 Ошибка 64-разрядного сеанса Сценарий оболочки для переименования файлов Есть ли способ интегрировать «man-страницы» unix в приложение «Словарь OSX»?

Автоматизация USB-накопителей на Debian

Я запускаю Debian Squeeze на подключаемом компьютере (так что только SSH, без GUI), и я пытаюсь сделать так, чтобы при подключении USB-накопителя он автоматически монтируется.

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

Проблема в том, что USB-накопитель не всегда находится на одном и том же имени устройства. Иногда это /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-накопитель всегда получал то же имя?

– Или, есть ли намного более простой способ авторизовать USB-накопитель, который я полностью потерял?

ОБНОВИТЬ

Хорошо, поэтому я добился определенного прогресса. Я добавил следующее правило:

SUBSYSTEMS=="scsi", ATTRS{model}=="Flash Disk ", DRIVERS=="sd", NAME="usbstick-%k" RUN+="mkdir /mnt/usbstick-%k; mount /dev/usbstick-%k /mnt/usbstick-%k"

Я знаю, что это все еще требует некоторой работы с точки зрения обработки add / remove, но сейчас это всего лишь базовый тест.

Эффект от этого заключается в том, что теперь я могу получить три новых узла устройства в /dev , а именно /dev/usbstick-sdc , /dev/usbstick-sdc1 и usbstick-sg2 .

Однако я обнаружил, что код в разделе RUN выполняется только один раз и просто создает каталог mnt/usbstick-sdc . Я также обнаружил, что каталог всегда пуст, поэтому что-то явно все еще не так! (хотя я добиваюсь прогресса).

Понятно, что должен быть гораздо более простой способ решения такой общей проблемы, и есть. Вот что я пробовал на моем сервере wheezy / sid:

 sudo apt-get install usbmount 

Вставьте USB-палку, сделайте! Теперь моя палка доступна через /media/usb .

Btw, usbmount не имеет справочной страницы, пожалуйста, прочтите /usr/share/doc/usbmount/README.gz . Кажется, usbmount монтирует вашу палку с опцией синхронизации по умолчанию. Возможно, было бы намного лучше, если бы ваша палка смонтировала ее асинхронно и запустила sync или umount прежде чем отключать ее. Это настраивается.

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

Как правило, то, что вы используете для создания узла с именем заказчика, является SYMLINK+= . grep для этого в правилах, чтобы увидеть, как он используется: grep SYMLINK /etc/udev/rules.d/* . Как и во всех командах, инициированных udev, вы можете использовать некоторые значимые переменные, описанные в man udev . Вы можете понять, что на самом деле вам не нужно указывать пользовательское имя, поскольку вы можете передать его имя сценарию (через переменную %k ).

Что касается решения для автоматического монтирования, посмотрите на UAM , о котором я немного рассказал в ответе на этот вопрос .

Извините, что ответил на мой собственный вопрос, и большое спасибо за rozcietrzewiacz за вклад, но в итоге мне удалось добиться значительного прогресса, следуя следующему правилу после нескольких часов чтения в Интернете:

SUBSYSTEMS=="scsi", KERNEL=="sd[ah]1", SYMLINK+="removable", RUN+="/bin/mount /dev/removable /path/to/mount"

Это позволит установить первый раздел любого устройства SCSI. Думаю, следующий вопрос будет заключаться в том, как монтировать несколько разделов, но это еще одна проблема в другой день.

Вот как я недавно это сделал, и сейчас я вполне доволен этим подходом. Это для Ubuntu 12.04 + Gentoo, но я думаю, что любой дистрибутив, который позволяет устанавливать udev и autofs, должен работать.

Предварительные требования: вы должны установить udev + autofs.

Шаг 1)

Создайте следующий файл «/etc/udev/rules.d/90-usbsd-auto.rules» (конечно, вы можете использовать любое имя, если оно заканчивается на «.rules»). :

 # Add symlink /dev/usbdisks/<label> to /dev/sd[az][1-9] # for automounter support ACTION=="add", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \ ENV{ID_BUS}=="usb", \ SYMLINK+="usbdisks/%k", MODE:="0660", \ RUN+="/bin/rm /media/usb/%k", \ RUN+="/bin/ln -sf /media/autousb/%k /media/usb/%k" # Some FileSystems emit a "change" event when they are unmounted. # UDEV seems to delete the device symlink in this case :-( # So we need to re-create it here ACTION=="change", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \ ENV{ID_BUS}=="usb", \ SYMLINK+="usbdisks/%k", MODE:="0660" # When device is removed, also remove /media/usb/<...> ACTION=="remove", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \ ENV{ID_BUS}=="usb", \ RUN+="/bin/rm /media/usb/%k" 

Что это делает: он создает две символические ссылки: одну для раздела устройства хранения USB в разделе «/ dev / usbdisks / <…>».

Вторая символьная ссылка будет ссылаться на «/ media / usb / <…>» на «/ media / autousb / <…>», это делается для поддержки автомонтировщика (см. Шаг 2).

Чтобы убедиться, что udev читает эти правила, используйте

 sudo udevadm control --reload-rules 

Примечание. То же имя для одной и той же ручки USB: возможно, но может быть опасно: вместо «% k» в приведенных выше правилах UDEV вы можете использовать, например, «$ env {ID_FS_LABEL_ENC}». Это будет использовать метку тома для создания / media / usb / <…>, но что произойдет, если вы подключите два USB-накопителя, и оба используют одну и ту же метку тома …

С этим файлом правил udev все настроено на автоматизацию раздела USB-накопителя. Обратите внимание, что это прямо сейчас, устройство НЕ будет автоматизировано (намеренно). Он будет автоматизирован после использования с

Шаг 2)

Настройка autofs для автомонтирования / media / autousb / <…>: я добавил следующую строку в файл «/etc/auto.master» (для Ubuntu 12.04):

 /media/autousb /etc/auto.usb --timeout=60 

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

Для Gentoo вам нужно изменить «/etc/autofs/auto.master», поэтому имеет смысл использовать

 /media/autousb /etc/autofs/auto.usb --timeout=60 

Теперь я создал «auto.usb» со следующим содержимым:

 #!/bin/bash key=${1} fstype=$(/sbin/blkid -o value -s TYPE /dev/usbdisks/${key}) if [ "${fstype}" = "vfat" ] ; then echo "-fstype=vfat,sync,uid=0,gid=plugdev,umask=007 :/dev/usbdisks/${key}" exit 0 fi if [ "${fstype}" = "ntfs" ] ; then echo "-fstype=fuse.ntfs-3g,sync,uid=0,gid=plugdev,umask=007 :/dev/usbdisks/${key}" exit 0 fi if [ "${fstype}" = "ext4" ] ; then echo "-fstype=ext4,sync,nocheck :/dev/usbdisks/${key}" exit 0 fi exit 1 

Этот файл auto.usb должен быть исполняемым, так что autofs использует это как скрипт (bash). Так, например,

 sudo chmod 0755 /etc/auto.usb 

Что это делает: этот скрипт будет сообщать AutoFS (/ usr / sbin / automount), как монтировать раздел устройств хранения usb.

Сначала скрипт будет использовать «/ sbin / blkid», чтобы узнать, какая файловая система находится в этом разделе.

Затем скрипт предоставит правильные параметры монтирования в зависимости от раздела устройства.

Примечание. Я включил пример кода для «vfat» (вероятно, наиболее распространенный для USB-накопителей), файловых систем «ntfs» и «ext4». Конечно, это довольно просто расширить, чтобы поддерживать больше файловых систем.

Шаг 3)

Необязательно … Чтобы «изъять» == размонтировать ваши USB-накопители (или разделы на вашем USB-накопителе), создать сценарий в / sbin / usbeject:

 #!/bin/bash # make sure everything is written to USB disk(s) sync # sending SIUGSR1 to automount will unmount the media killall -s SIGUSR1 /usr/sbin/automount 

С помощью этого сценария вы можете использовать «sudo usbeject» для размонтирования всех подключенных разделов устройств USB (путем сообщения automount для их размонтирования).

Конечно, вы можете просто убедиться, что раздел нигде не используется; automounter затем отключит раздел после 60 секундного таймаута …

Настоящий трюк здесь – использовать символические ссылки с "/ media / usb" на "/ media / autousb":

  • Символьные ссылки «/ media / usb» будут созданы udev, предоставив пользователю простой обзор, в котором расположены разделы устройств хранения USB-накопителей
  • AutoFS затем будет автоматизировать раздел по требованию, если вы используете его через / media / usb
  • С помощью скриптового файла «auto.usb» вы можете поддерживать любую файловую систему и, кроме того, вы также можете поддерживать любую схему именования.
  • Этот подход поддерживает USB-накопители с несколькими разделами, даже если эти разделы используют разные типы файловой системы.

Я нашел, что лучший ответ на самом деле стал устаревшим, поскольку он не поддерживается и не работает в Jessie (см. Комментарий malat)

Для меня (на Джесси) решение в этом блоге работало как шарм.

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

Добавьте следующую строку в /etc/fstab

 /dev/sr0 /media/bluray auto defaults,nofail,x-systemd.automount 0 2 

Вы можете сделать это с помощью nano:

 sudo nano /etc/fstab 

Объяснение:

/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 должен показать что-то вроде:

 Sept. 27 16:07:01 frodo systemd[1]: Mounted /media/bluray. 

В дальнейшем

Для успешного монтирования дисков NTFS мне пришлось установить ntfs-3g (старые ntfsprogs)

 sudo apt-get install ntfs-3g 

Мне не нужно было устанавливать hfsprogs для работы с usb-форматированным usb, но вы должны проверить его самостоятельно.