Intereting Posts
Могу ли я изменить слово ubuntu из моей темы по умолчанию plymouth? Ubuntu 13.04 64 Интерфейс Bits зависает при запуске видео на хром, firefox и chromium Как проверить флаги процессора внутри заданной установки? Как настроить параметры VPN? Телефон Android не появляется в lsusb после входа в режим загрузки! Я хочу отправить аудио через bluetooth на Android-телефон – kubuntu 14.04 Голосовое управление средой рабочего стола Очистить историю последних команд в терминале Как настроить собственную (HTML) тему в LightDM? Видео глюки в рабочем столе Ubuntu Unity, но не в рабочем столе Ubuntu GNOME Настройка базы данных mongo для работы с диском NTFS Используя «тире» из интерфейса Unity в классическом режиме? Как исправить: экранная заставка выделяется, но не отключает экран после обновления? С точки зрения настольной стены, что такое «перевертывание края»? Настройки часов отключены из настроек времени и даты

Почему мои правила udev запускаются, если я использую триггер udevadm, но НЕ во время загрузки?

У меня проблемы с правилами udev, которые не работают. Вот пример:

У меня есть правило /etc/udev/rules.d/99-test.rules которое содержит:

 ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x8086", RUN+="/sayhi" 

И sayhi просто имеет:

 #!/bin/bash date +"%Y-%m-%d %H:%M:%S,%3N" >> /saidhi 

Это, как машина Intel, у меня, очевидно, много устройств с интерфейсом 0x8086 для вендоров:

 root@imtrobot:~# lspci -n |grep 8086 00:00.0 0600: 8086:2770 (rev 02) 00:02.0 0300: 8086:2772 (rev 02) 00:1d.0 0c03: 8086:27c8 (rev 01) [ etc. 12 lines total ] 

И все же, когда я загружаюсь, /saidhi либо не будет создан вообще, либо будет иметь 1 или 2 строки даты.

Если после загрузки я запускаю udevadm trigger --action=add --subsystem-match=pci то /saidhi получит точное количество добавленных к нему дат.

Почему это не работает во время процесса загрузки?

У меня действительно есть способ, который будет ждать только нужного количества времени, а не произвольного 30 секунд. Я сделал это на Raspberry Pi, чтобы автоматически подключать все подключенные USB-диски при подключении, а также во время загрузки.

Правило похоже на ваше:

 $ sudo cat /etc/udev/rules.d/10-usb_automount.rules KERNEL=="sd*", RUN+="/home/pi/bin/usb-automount" 

Теперь сценарий на самом деле является рекурсивным (и я знаю, что это зло):

 $ cat /home/pi/bin/usb-automount #!/bin/sh ROOT_RW=`mount | grep 'dev/root' | grep -E '\(.*rw.*\)'` if [ -z "$ROOT_RW" ]; then sleep 3 /home/pi/bin/usb-automount & disown else /home/pi/bin/usb-automount.sh fi 

Обратите внимание, что «grep» dev / root »относится к Raspbian OS, поэтому на Ubuntu вам нужно будет спроектировать свой собственный grep, чтобы обнаружить rootfs (или даже лучше спроектировать некоторый универсальный grep). Обратите внимание, что сценарий будет вызывать себя в фоновом режиме и выходить, и только в том случае, если rootfs «rw» вызовет правильный монтажный скрипт. Сценарий «/home/pi/bin/usb-automount.sh» делает фактический монтаж или в вашем случае журнал.

Обратите внимание, что этот сценарий по-прежнему занимает 3 секунды для выполнения, поэтому вы можете оптимизировать его, изменив на:

 if [ -z "$ROOT_RW" ]; then ( sleep 3; /home/pi/bin/usb-automount ) & disown else /home/pi/bin/usb-automount.sh fi 

Однако я никогда не проверял это и не знаю, будет ли это работать как ожидалось (я не автор сценариев).

Я учил той же причине, что и @dmd, PCI uevents приходят до перезагрузки файловой системы как rw . (Но иногда некоторые из PCI uevents приходят после, состояние гонки, работая параллельно)

 dmesg | grep -i -e mount -e pci 

Идея sleep @Sparhawk кажется мне хорошей. Я думаю, это почему это не работает (Ref: man udev ):

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

Запуск демонов или других длительных процессов не подходит для udev; раздвоенные процессы, отдельные или нет, будут безоговорочно убиты после завершения обработки событий.

Итак, я создал новый скрипт, который запускает и disown скрипт, который имеет команду sleep . На самом деле, он РАБОТАЕТ!

 $ ls -l /sa* -rw-r--r-- 1 root root 1104 Oct 24 12:37 /saidhi -rwxr-xr-x 1 root root 29 Oct 24 12:31 /sayhi -rwxr-xr-x 1 root root 62 Oct 24 12:28 /sayhi2 $ cat /sayhi #!/bin/bash /sayhi2 & disown $ cat /sayhi2 #!/bin/bash sleep 30 date +"%Y-%m-%d %H:%M:%S,%3N" >> /saidhi $ cat /etc/udev/rules.d/99-test.rules ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x8086", RUN+="/sayhi"