Автоматическая установка USB-накопителей на безголовый Linux-бокс systemd?

2663
ccpizza

Подходы к автоматическому монтированию устройств в Linux постоянно меняются, и поиск в Google дает довольно много решений с различной степенью применимости для современных системных систем.

Существуют следующие подходы:

  1. модификация /etc/fstabдля добавления монтирования на диск по UUID.
  2. udev правила (очевидно, «необработанные правила» могут конфликтовать с существующими политиками systemd)
  3. udisks2 работает как сервис systemd или через udiskie
  4. udevil
  5. usbmount
  6. автомонтирование, предоставляемое средами рабочего стола, то есть в XFCE через пакеты thunar+ thunar-volman, или nautilusавтомонтирование в Gnome с gnome-volume-managerпакетом (очевидно, они полагаются на udisks ).
  7. autofs kernel automounter
  8. системное монтирование systemd, пример использования: automount-usb

Как всегда в Linux, выбор немного ошеломляющий, и неясно, какой из них является рекомендуемым в настоящее время. Более того, кажется, что разные подсистемы автоматического монтирования могут конфликтовать друг с другом, что приводит к ситуациям, когда раздел монтируется одним инструментом, а затем в течение нескольких секунд автоматически демонтируется другим инструментом.

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

Каков нынешний подход для безголовой системы, которая в основном работает в текстовом режиме?

Обновить

После того, как возился со всеми вариантами я нашел, usbmountчтобы просто работать после того, как я редактировал /lib/systemd/system/systemd-udevd.serviceи изменил MountFlags=slaveк, MountFlags=sharedкак описано в этом вопросе . Нет необходимости вручную добавлять какие-либо UUID или метки к любым файлам конфигурации. Недостатком является то, что он создает точки монтирования, в /media/usbNкоторых не все идеально, поэтому я переключился на то, automount-usbчто было удивительно легко установить (просто запустил configure.shскрипт) и которое создает папки монтирования, /media/<device>_<disk_label>например, например /media/sda2_mylabel.

Соответствующие ссылки:

3
Что именно вы хотите автомонтировать? Ограниченный набор известных устройств, или просто какая-нибудь USB-карта подключается в любое время в будущем? Есть разные ответы на оба. grawity 7 лет назад 0
@grawity: меня больше интересует второе (т.е. любое запоминающее устройство USB), поскольку для первого я могу просто добавить записи в `/ etc / fstab`. ccpizza 7 лет назад 0

2 ответа на вопрос

1
Ignacio Vazquez-Abrams

Вступления в систему по- /etc/fstabпрежнему должны учитываться в системной системе.

Вместо этого можно использовать единицу .mount, и ее следует считать эквивалентной записи в fstab.

Блок .automount может использоваться, если монтирование не требуется при запуске или постоянно; systemd размонтирует его после истечения периода простоя, указанного в файле модуля.

Смотрите systemd.mount(5)и systemd.automount(5)справочные страницы для деталей.

Я бы хотел избежать непосредственного редактирования `/ etc / fstab`, потому что я не хочу добавлять UUID для каждого USB-устройства. У вас есть пример модуля `.mount` или` .automount`? Где это должно быть размещено? Под `/ lib / systemd / system`? ccpizza 7 лет назад 1
Да, маленькая опечатка там. `pkg-config systemd --variable = systemdsystemconfdir` Ignacio Vazquez-Abrams 7 лет назад 1
Нет, системный администратор никогда не должен размещать там пользовательские юниты. Для этого они могут использовать `/ etc / systemd / system`. grawity 7 лет назад 0
1
grawity

неясно, какой сейчас «официально» поддерживаемый подход.

Официально поддерживается кем? Если, например, GNOME включает в себя функцию автомонтирования на основе udisks, вы можете быть уверены, что она официально поддерживается GNOME.

Меня больше интересует второе (т.е. любое запоминающее устройство USB), поскольку для первого я могу просто добавить записи в /etc/fstab.

Для этого нет «стандартного способа». В лучшем случае большинство существующих систем решили добавить автоматизацию поверх udisks2. Сам по себе udisks вообще ничего не монтирует, но это «бэкэнд», используемый многими графическими средами рабочего стола (по крайней мере, в GNOME и Xfce его используют; в KDE и Enlightenment я уверен только на 80%).

(Таким образом, ваш вариант 3 будет «udisks2 + automount by udiskie», а вариант 4 будет «udisks2 + automount by desktop desktop».)


Что касается правил udev: будь то монтирование файловых систем или запуск служб, краткий ответ - «не делай этого» (по разным причинам); но длинный ответ таков: «не делайте этого напрямую, но вы можете попросить init сделать это». Поэтому было бы не страшно запускаться systemd-mountиз правила udev, которое затем просто передает запрос на монтирование init, как если бы модуль .mount ...

Однако следует ожидать, что это вызовет системную ошибку / wart / misfeature: поскольку udev сообщает, что устройство готово только после обработки правил, вы можете в конечном итоге автоматически отключить init из-за того, что устройство еще не создано.

Вместо этого udevil будет работать лучше, так как он ничего не запускает через правила, а только реагирует на события «готовности устройства», генерируемые udev.


Записи в fstab ориентированы на статические устройства. Тем не менее, они могут использоваться для разных USB-флешек с использованием /dev/disk/by-path/..., которое соответствует физическому пути устройства (например, PCI-слот 3, USB-порт 1, раздел 1 ...). Таким образом, вы можете написать запись fstab, которая соответствует любому диску, подключенному к тому же порту USB.


Автомонтировщик ядра autofs, как и udisks, - это просто бэкэнд, на котором пользовательские пространства могут реализовывать различные автомонтирования . Как только монтирование autofs настроено, все попытки получить к нему доступ сообщаются соответствующему демону. Наиболее распространенными реализациями являются традиционные (основанные на картах) autofs, а в последнее systemdвремя и единицы .automount.

Таким образом, «динамическая» логика USB-устройства все еще должна быть реализована в пользовательском пространстве, и в любом случае это больше, чем просто использование udisks.

  • С простой системой systemd, ваш единственный вариант - построить поверх вышеописанного хакера fstab "by-path". После того, как вы напишете запись fstab для нужного USB-порта, вы можете пометить ее, x-systemd.automount,x-systemd.idle-timeout=300чтобы использовать автомонтировщик autofs. (Или, конечно, создайте автономные единицы .mount + .automount для того же результата.)

    Если вы хотите динамически генерировать автомонтирование для всех USB-дисков на всех портах, systemd не сможет сделать это без сторонних скриптов.

  • Я не знаю, autofsdможете ли вы делать то, что вы хотите, но я помню, что он поддерживает некоторые виды динамических карт (для домашних каталогов пользователей). Возможно, programсработает тип карты (и скрипт, который перечисляет все подключенные диски).

Похожие вопросы