udev: устройство подключено во время загрузки

Я использую udev для обнаружения подключения и отключения USB-накопителя на моем сервере Ubuntu 10.04 LTS x64. Все работает нормально, когда USB-устройства подключены во время работы машины, но если они уже присутствуют во время загрузки, мой сценарий не завершается, видимо, потому, что mkdir /tmp/blah не работает.

Если я впоследствии наберу sudo udevadm trigger в терминале, все будет в порядке.

Я предполагаю, что в тот момент, когда udev впервые оценивает подключенные устройства по своим правилам, корневая файловая система еще не смонтирована.

Поэтому мои вопросы:

  1. Я правильно определил проблему?
  2. Есть ли стандартный способ решить эту проблему - т.е. есть ли альтернатива /tmp/, которую я могу использовать как до, так и после монтирования /?

person Bob Sammers    schedule 23.08.2011    source источник
comment
Отличный вопрос для unix.stackexchange.com   -  person Luc M    schedule 23.08.2011
comment
Возможно, вы правы... это или сбой сервера. Но я пишу bash-скрипт: моя голова в режиме программирования, поэтому я пришел сюда, возможно, не обдумав это как следует!   -  person Bob Sammers    schedule 23.08.2011


Ответы (3)


Корневая файловая система монтируется, но в данный момент доступна только для чтения. /dev/shm (файловая система в памяти) должна быть доступна; более новые дистрибутивы Linux также могут иметь RAM-диск /run. Вы также можете выбрать где-нибудь постоянный каталог, смонтировать tmpfs поверх него в своем скрипте и выполнять свою работу там.

person bdonlan    schedule 23.08.2011
comment
Перемещение обработки с '/tmp/' на '/dev/shm/' решает проблему - большое спасибо за вашу помощь. Предположительно, эта файловая система постоянна, пока машина работает? - person Bob Sammers; 23.08.2011
comment
Да, но это файловая система в памяти, так что не используйте там слишком много места. - person bdonlan; 23.08.2011

Одним из решений этой проблемы является написание скрипта, вызываемого вашими правилами udev, который немедленно отсоединяется и ожидает некоторого события, чтобы убедиться, что система «достаточно загружена» для создания точек монтирования и т. д. для монтирования ваших устройств. Человек, ответивший на следующий пост (http://superuser.com/questions/53978/ubuntu-automatically-mount-external-drives-to-media-label-on-boot-without-a-u), написал скрипт, который проверяет, «httpd» запущен, прежде чем продолжить. Я уверен, что есть и другие «лучшие» способы сделать это.

person user1984964    schedule 16.01.2013

1- Я не знаю, даже в initramfs, до монтирования корневой файловой системы, есть доступный для записи каталог /tmp.

Правда, когда монтируется настоящий корень, этот /tmp будет отброшен, а окончательный /tmp будет пустым. Вы уверены, что команда mkdir /tmp/blah не работает? Или вы предполагаете это, потому что его там нет, когда вы его ищете?

2- В Ubuntu (я не знаю других дистрибутивов) у вас есть скрытый каталог в /dev/.initramfs для таких нужд. Поскольку /dev является точкой монтирования tmpfs (или devtmpfs), сохраненной в окончательной корневой файловой системе, она все равно будет там.

person rodrigo    schedule 23.08.2011
comment
правила udev в корневой файловой системе будут выполняться с корневой файловой системой /tmp; это может быть до перемонтирования корневой файловой системы для чтения и записи. - person bdonlan; 23.08.2011
comment
Вы правы - я не видел сбоя команды mkdir (в настоящее время ее вывод не регистрируется), но следующая команда (a mount) завершается с ошибкой, сообщая, что каталог mkdir, который должен быть создан, отсутствует. - person Bob Sammers; 23.08.2011
comment
@bdonlan, возможно, только для чтения. В этом случае настройка /tmp как tmpfs должна помочь. Трюк с /dev/.initramfs также должен работать. - person rodrigo; 23.08.2011