mount не виконується при виклику udev


17

Я спробував створити кілька правил udev для монтажу та відключення моїх флеш-накопичувачів; правила на даний момент дуже прості:

ACTION=="add",KERNEL=="sd[b-z]",RUN+="/root/scripts/plug_flash_drive.sh %k"
ACTION=="remove",KERNEL=="sd[b-z]",RUN+="/root/scripts/unplug_flash_drive.sh %k"

plug_flash_drive.sh також дуже простий:

device_name=$1
mount_options="umask=000,utf8"
if [ ! -e "/media/$device_name" ]; then
    mkdir "/media/$device_name"
fi
sleep 1
/usr/bin/mount "/dev/$device_name" "/media/$device_name" -o "$mount_options"

unplug_flash_drive.sh:

device_name=$1

umount "/dev/$device_name"
rmdir "/media/$device_name"

Я зробив кілька тестів, тому можу переконатися, що:

  • При підключенні до мережі виявляється моя флешка; файл створюється в / dev
  • plug_flash_drive.sh викликається udev
  • частина сценарію mkdir працює
  • однак, схоже, що частина "mount" скрипту не виконується, тому мій диск не змонтований
  • коли я називаю свої скрипти в командному рядку, вони прекрасно спрацьовують

Хтось знає, чому монтаж не виконується при виклику udev?

EDIT 28/08/14: Я додав "grep -q / proc / mounts && echo success || echo fail" в кінці мого сценарію, щоб перевірити в моєму журналі налагодження, чи пристрій фактично встановлено до закінчення сценарію. Виявляється , що пристрій буде встановлено в той момент , навіть якщо сценарій викликається Udev. Отже, справжня проблема полягає в тому, що "мій блоковий пристрій, здається, відключений після закінчення сценарію кріплення, коли його викликають через udev": s


Це може бути поза точкою, але чому ви mkdir "$mount_dir"так rmdir "/media/$device_name"? Де $mount_dirвстановлено?
G-Man каже: «Відновіть Моніку»

Вибачте, це друкарська помилка, я використав кілька непотрібних змінних, псевдонімів у оригінальних кодах, і я видалив їх тут для наочності
magva

Ви спробували налагодження старої школи; наприклад, шляхом введення set -xvі exec >> "$HOME"/mount.log 2>&1в .shфайли?
G-Man каже: «Відновіть Моніку»

1
Я зробив це, але відповідно до журналу, який я отримую, монтаж виконується, коли скрипт викликається udev. Немає різниці в журналі між дзвінками від udev та командним рядком ... це насправді досить
неприємно

1
у такому випадку сценарій також не вдасться при запуску з командного рядка
magva

Відповіді:


22

systemd-udevd запускається у власному просторі імен файлової системи та за замовчуванням кріпленнями, виконаними у udev .rules, не поширюються на хост. Для того, щоб ваші старі сценарії роботи ви можете встановити MountFlags=sharedв /usr/lib/systemd/system/systemd-udevd.serviceабо (краще) створення і редагування його копію в/etc/systemd/system/

Див. Для man 5 systemd.execотримання додаткової інформації MountFlagsваріант.


Що ви маєте на увазі під «не пропагувати господареві»?
sebelk

2
@sebelk Я вважаю, що user83388 означає, що вони не розповсюджуються на "кореневий" простір імен
Марк

2

Інші відповіді станом на цей текст є невірними (або застарілими).

Не слід запускатись mountіз сервісу Systemd. Навіть після коментування MountFlagsта PrivateMountsрядків у systemd-udevd.serviceвашому правилі не буде працювати для файлових систем FUSE, таких як NTFS або exFAT, тому що процес FUSE буде зручно вбитий Systemd.

Дивіться цю сторінку ArchWiki, де вказано кілька кращих варіантів. Мої переваги - крихітний проект на GitHub під назвою udev-media-automount , який просто перезапускає службу Systemd з правила Udev. Це зручний спосіб подолати різні громіздкі обмеження Udev на простори імен та дочірні процеси.

Дивіться також цей анвесер , який показує, як використовувати SYSTEMD_WANTSзмінну Udev для запуску модуля Systemd.


-1

Ви можете спробувати використовувати :=замість +=правил призначення завдань RUN.

:=Оператор встановлює значення списку і забороняє подальші зміни.


дякую, але
горіння

1
Можливо, це не ваш випадок, але в моїй системі кріплення знаходиться в / bin / mount. Спробуйте "команда -v mount".
xae

1
У моїй системі шлях, повернений "командою -v mount", є / usr / bin / mount. Я помітив, що у мене також був виконавчий файл / bin / mount, але він не працює ні тоді, коли його викликає udev
magva
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.