Автоматичне налаштування USB-накопичувачів на Debian


10

Я запускаю 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"

Я знаю, що це ще потребує певної роботи з точки зору обробки додавання / видалення, але поки це лише основний тест.

Ефект цього полягає в тому, що мені зараз вдається отримати три нових вузли пристрою /dev, а саме /dev/usbstick-sdc- /dev/usbstick-sdc1і usbstick-sg2.

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


Це друга /dev/sdc1повинна була бути sdd1? І ви можете використовувати blkidдля унікального визначення диска (ну, власне, розділ; він зміниться, якщо ви переформатуєте).
Кевін

Правильно, щойно це зафіксували. Все, що я хочу, щоб це сталося, це те, що коли USB-накопичувач підключений до нього, він встановлюється в деякий каталог. Я майже впевнений, що я повинен використовувати udevправило для створення вузлів пристрою для кожного розділу, але я не впевнений, для якого рівня udevadmрезультатів слід створювати правила!
jon

Ваше правило виглядає занадто складно. Спробуйте зробити простий, із лише одним ACTION==, одним KERNEL==і одним ATTRS{something}==(це цілком можливо - це я використовую). Також розглянемо запуск одного сценарію, встановленого ланцюжка команд у RUN+=.
rozcietrzewiacz

Дякую за пораду, але залишається питання: на якому рівні дерева пристроїв я повинен орієнтуватися зі своїм правилом? Це все здається жахливо заплутаним, і насправді в Інтернеті не так багато інформації, щоб пояснити це. Я дуже вдячний за час, який ви витратили на пояснення мені цього, я відчуваю, що я майже там, але мені просто не вистачає рівня для націлювання.
jon

Зараз я спробував це дуже основне правило: KERNEL=="sd??", NAME="%k", RUN+="mkdir /mnt/usbstick-%k; mount /dev/usbstick-%k /mnt/usbstick-%k"- але ні, звичайно, і це не працює. Зараз я все більше засмучуюся після того, як витратив майже цілий день, просто намагаючись розібратися, як отримати USB-накопичувач, який підключений для монтажу. Чи справді має бути таке важко? Результат, udevadm test /sys/block/sddзвичайно, практично не читається, тому я не маю можливості знати, де я помиляюся. Чи може хтось вказати мені в правильному напрямку на це?
jon

Відповіді:


13

Зрозуміло, що існує набагато простіший спосіб вирішити таку поширену проблему, і це є. Ось що я спробував на своєму сервері wheezy / sid:

sudo apt-get install usbmount

Підключіть USB-паличку, готово! Моя палиця тепер доступна через /media/usb.

Btw, у usbmount немає довідної сторінки, будь ласка, прочитайте /usr/share/doc/usbmount/README.gzзамість цього. Здається, usbmount за замовчуванням монтує вашу палицю за допомогою параметра синхронізації. Можливо, ваша палиця буде набагато краще встановити її асинхронізувати і запустити syncабо umountперед відключенням її від розетки. Це можна налаштувати.


див. такожpumount
Алекс

Зверніть увагу, що usbmountбільше не підтримують NTFS з debian jessie: bugs.debian.org/774149
malat

Запускаючи це на Debian Jessie, схоже, що ніколи не встановлено. На сторінці пакунка йдеться про те, що він зараз не підтримується, і я працюю systemd. Цікаво, чи цей пакет більше не працює із системними змінами?
Тревіс Гріггс

Дійсно, не працював для мене на Джессі, дивіться мою відповідь (це: ddumont.wordpress.com/2015/09/27/… справді працював)
Павло

2

Зауважте, що ви не можете просто мати один вузол пристрою, який би представляв будь-який можливий маятник. Що робити, якщо ви підключите два з них? Або коли маятник має більше однієї перегородки?

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

Що стосується рішення для автоматичного монтажу, погляньте на UAM , який я трохи описав у відповіді на це питання .


Я розумію ці обмеження. Як це буває, мені потрібно колись підтримувати одну USB-накопичувач, підключену в будь-який час до цієї конкретної системи. Однак мені потрібно підтримати декілька розділів на USB-накопичувачі (було б добре, якби їх можна було встановити в папки з точки монтажу). Враховуючи ці вимоги, чи маєте ви поради щодо можливого рішення? Зважаючи на характер проекту, мені потрібно уникати використання додаткового стороннього програмного забезпечення, якщо це можливо.
jon

Тоді погляньте на щойно зроблену редакцію (середня частина). Цього буде достатньо?
rozcietrzewiacz

Також зауважте, що UAM насправді не є програмою - це купа приємних udevправил із супровідними сценаріями. Ви можете ознайомитись з правилами та легко адаптувати їх до ваших потреб.
rozcietrzewiacz

Дякую за пораду. Ще одне: ви вважаєте, що ви могли подивитися на мій висновок udevadmі сказати мені, з якого пристрою є пристрій, на який я повинен націлюватися своїм правилом? У різних прикладах, які я бачив в Інтернеті, схоже, є набагато коротші дерева, і кожен приклад, схоже, орієнтований на інший рівень пристрою, не пояснюючи, на який слід орієнтуватися та чому.
jon

Просто додали оновлення вище, будь-які ідеї? Дякую!
jon

2

Ось як я нещодавно це зробив, і зараз я цілком задоволений таким підходом. Це для 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[a-z][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: Можливо, але може бути небезпечно. Ви можете використовувати, наприклад, "$ env {ID_FS_LABEL_ENC}", а не "% k" у вищевказаних правилах UDEV. Це дозволить використовувати мітку гучності для створення / media / usb / <...>, але що станеться, якщо ви підключите дві USB-накопичувачі і обидва використовують однакову мітку гучності ...

З цим файлом правил udev все налаштовано для автоматичного налаштування розділу USB-накопичувача. Зауважте, що це зараз, пристрій НЕ буде автоматизовано (навмисно). Після автоматичного використання він буде автоматизований

Крок 2)

Налаштування автофайлів для automount / 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 має бути виконаним, щоб автофіксатори використовували це як (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 зняти їх).

Звичайно, ви можете просто переконатися, що розділ ніде не використовується; Автомобіль відключить розділ після 60-секундного тайм-ауту ...

Справжня хитрість тут полягає у використанні символьних посилань від "/ media / usb" до "/ media / autousb":

  • Посилання "/ media / usb" будуть створені udev, даючи користувачеві простий огляд, які розділи пристроїв зберігання даних є там
  • AutoFS автоматично автоматизує розділ на вимогу, якщо ви використовуєте його через / media / usb
  • За допомогою сценарію "auto.usb" ви можете підтримувати будь-яку файлову систему, а також ви можете підтримувати будь-яку схему іменування.
  • Цей підхід підтримує USB-накопичувачі з декількома розділами, навіть якщо ці розділи використовують різні типи файлової системи.

Чи можу я показати вам, як підказки autofs руйнують мій / home / frank каталог? Дякую.
Френк

1

Вибачте, що відповів на моє власне запитання, і велика подяка належить rozcietrzewiacz за внесок, але мені врешті-решт вдалося досягти певного прогресу, використовуючи таке правило після години читання в Інтернеті:

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

Це дозволить встановити перший розділ будь-якого пристрою SCSI. Я думаю, що наступним питанням буде, як змонтувати кілька розділів, але це ще одна проблема для іншого дня.


1
Це не гарне правило. Це буде відповідати також розділам жорстких дисків . є removableатрибут, для якого слід перевірити, а не blockзамість нього scsi.
rozcietrzewiacz

1

Я виявив, що найкраща відповідь насправді застаріла, оскільки вона не підтримується і не працює на / від Джессі (див. Коментар malat)

Для мене (на Джессі) рішення в цьому блозі спрацювало як шарм.

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

Додайте наступний рядок до /etc/fstab

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

Це можна зробити за допомогою нано:

sudo nano /etc/fstab

Пояснення:

/dev/sr0- це файл пристрою. Ви також можете скористатись одним із символьних налаштувань посилань by udev в / dev / disk / by-id. Вам доведеться змінити це відповідно до файлу свого пристрою ( sudo fdisk -lщоб перелічити пристрої)

/media/blurayє точкою кріплення. Ви можете вибрати іншу точку кріплення

nofail потрібно уникати звіту про несправності під час завантаження без диска в оптичному приводі

x-systemd.automount - це можливість налаштувати systemd для автоматичного монтажу вставленого диска

Не вказуйте noauto: це заважатиме системі автоматично монтувати диск, що перемагає мету.

Тест

Запустіть команду journalctl -x -fв терміналі, щоб перевірити, що відбувається з systemd

Перезавантажте системну конфігурацію за допомогою sudo systemctl daemon-reload.

завантажте диск в оптичний привід

Тоді журнал журналу повинен показувати щось на кшталт:

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

Далі

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

sudo apt-get install ntfs-3g

Мені не довелося встановлювати hfsprogs, щоб змусити USB-формат OSX працювати, але ви повинні перевірити це самостійно.


Він не встановлюється автоматично на моїй джессі Debian із USB-HDD.
buhtz

@buhtz, але монтаж вручну працює? Наведені вище дії насправді працювали лише для накопичувачів, які були в системі під час запуску, не "динамічно" вставляючи та виймаючи USB під час роботи системи.
Пол
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.