7

У меня есть система Debian sid (Wheezy) (и такой же вопрос для arch), без какой-либо среды рабочего стола (и вообще без Xorg).

Я могу смонтировать свои SD-карты, USB-накопители, внешний жесткий диск вручную с помощью mount / umount с подходящими записями в /etc/fstab но это убедительно и ограничительно: если я хочу, чтобы они были смонтированы в /media/<LABEL> каждому устройству с различным <LABEL> нужна отдельная запись, и каждый каталог <LABEL> необходимо создавать / удалять вручную в /media/ ).

Итак, каков наилучший способ автоматически смонтировать их в /media/<LABEL> при вставке (и размонтировать их из файловой системы, как только они отключены)?

Идеальное решение будет:

  1. определить, когда подключен съемный носитель (добавлен в /dev/ как sdax , sdbx , ... пользователем udev)
  2. создать каталог в /media/ соответствии с его меткой (меткой съемного носителя)
  3. смонтировать его в каталог /media/<LABEL> в режиме RW (если поддерживается его файловая система)
  4. определить, отключен ли носитель
  5. если затем, размонтируйте его из файловой системы
  6. удалить соответствующий каталог из /media/

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

Я нашел некоторую информацию о autofs HAL udisks udisks2 и т.д., но неясно , какой из них является устаревшим или предпочтительным, и в любом случае, я не понял, как настроить их легко в моей системе , чтобы сделать это, до сих пор ...

Минимализм, элегантность, KISS, * nix-ориентированный, без сумасшедших невыносимых XML-файлов политик, а также современные высоко ценится.

редактировать: пытаясь сделать мой вопрос более ясным

3 ответа3

3

Хорошо, это было давно, но я все еще отвечу на мой вопрос с лучшим вариантом, который я нашел на данный момент.

Лучший способ - создать правило udev , связанное с некоторыми сценариями (которое будет создавать / удалять каталоги и монтировать / размонтировать съемные устройства), и присоединять к типу событий устройства partition udev .

1 - Создание сценариев добавления / удаления

Добавьте этот скрипт storage-automount.sh в /lib/udev/ и установите для него исполняемый файл (sudo chmod +x /lib/udev/storage-automount.sh):

#!/bin/sh

# set the mountpoint name according to partition or device name
mount_point=$ID_FS_LABEL
if [ -z $mount_point ]; then
    mount_point=${DEVNAME##*/}
fi

# if a plugdev group exist, retrieve its gid set & it as owner of mountpoint
plugdev_gid="$(grep plugdev /etc/group|cut -f3 -d:)"
if [ -z $plugdev_gid ]; then
    gid=''
else
    chown root:plugdev $mount_point
    gid=",gid=$plugdev_gid"
fi

# create the mountpoint directory in /media/ (if not empty)
if [ -n $mount_point ]; then
    mkdir -p /media/$mount_point
    # other options (breaks POSIX): noatime,nodiratime,nosuid,nodev
    mount -t $ID_FS_TYPE \
      -o rw,flush,user,uid=0$gid,umask=002,dmask=002,fmask=002 \
      $DEVNAME /media/$mount_point
fi

Добавьте этот скрипт storage-autounmount.sh в /lib/udev/ и установите для него исполняемый файл (sudo chmod +x /lib/udev/storage-autounmount.sh):

#!/bin/sh

# set the mountpoint name according to partition or device name
mount_point=$ID_FS_LABEL
if [ -z $mount_point ]; then
    mount_point=${DEVNAME##*/}
fi

# remove the mountpoint directory from /media/ (if not empty)
if [ -n $mount_point ]; then
    umount -l /media/$mount_point
    rm -R /media/$mount_point
fi

2 - Создание правила udev для присоединения этих сценариев к событиям

И наконец, добавьте правило udev в /etc/udev/rules.d , например, 85-storage-automount.rules:

ENV{DEVTYPE}=="partition", RUN+="/lib/udev/storage-automount.sh", ENV{REMOVE_CMD}="/lib/udev/storage-autounmount.sh"

И это все.

Теперь, когда вы подключите устройство хранения, в /media/ будет создан каталог в соответствии с именем раздела (я не помню, но я думаю, что он работает и с разделами NTFS), и ваш раздел будет подключен к нему. Это R/W для пользователей, если у вас есть группа plugdev в вашей системе. Также устройства монтируются в синхронном режиме, чтобы ограничить риски потери данных в случае горячего отключения.

Когда устройство удалено, оно размонтировано, а каталог удален из /media .

Кроме того, инструментом для отслеживания событий udev является udevadm monitor с такими параметрами, как --env или --property:

$ udevadm monitor --env

Это проверено и прекрасно работает как в Debian, так и в Arch, но, вероятно, работает во всех дистрибутивах, которые используют udev .

1

Возможно, вы захотите проверить каталог /dev/disk/by-uuid когда эти конкретные диски подключены. Использование ls -l покажет вам устройства (например, /dev/sdb1) вместе с их uuids. Найдя совпадения, обновите ваш /etc/fstab соответствующим образом, заменив /dev/sd* соответствующей записью /dev/disk/by-uuid/* .

Подробности см. В моем ответе на вопрос « Как запретить USB-накопителю получить новое имя устройства Linux после выхода из спящего режима»? ,

0

Спасибо за ваши советы. Я упростил ваши сценарии монтирования и размонтирования следующим образом:

крепление:

#!/bin/sh

udisks --mount $DEVNAME

размонтировать:

#!/bin/sh

udisks --unmount $DEVNAME

Мой файл /etc/udev/rules.d/ выглядит так:

# UDISKS_FILESYSTEM_SHARED
# ==1: mount filesystem to a shared directory (/media/VolumeName)
# ==0: mount filesystem to a private directory (/run/media/$USER/VolumeName)
# See udisks(8)
ENV{ID_FS_USAGE}=="filesystem|other|crypto",       ENV{UDISKS_FILESYSTEM_SHARED}="1"
ENV{DEVTYPE}=="partition", RUN+="/lib/udev/storage-automount.sh",     ENV{REMOVE_CMD}="/lib/udev/storage-autounmount.sh"

Это просто и должно быть типичным вариантом использования.

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