Linux - статьи



              

Linux 2.6: откуда берется пыль и куда деваются линки


Арсений Чеботарев,

Как всегда, не претендуя на типичность случая, расскажу небольшую историю о том, как ставил winmodem на Fedora Core 4. Мне помогло — не исключено, что поможет и еще кому-то. Педанты, как всегда, могут поискать ошибки в тексте — тоже занятие.

С месяц назад получаю письмо: "Вот Вы писали про Fedor’у 4. Я ставлю winmodem, и у меня сим-линк /dev/modem, который я создаю, куда-то пропадает под этой системой". Тогда я просто съехал: да ты чё, какой winmodem, это глупое занятие, возьми нормальный — и так далее (если честно, не было сил разгибать мозги). Человек и пропал куда-то, запил, наверное, с горя. И вот проходит месяц — и я оказываюсь в глубоком лесу со своим ноутом, телефонным кабелем и этим, вы поняли. winmodem’ом на борту. Награда нашла героя, пришлось все-таки поскрести "чугунок" — давненько я под модемом никуда не ходил, а тем более под winmodem’ом.

Ну, конечно, если начинать с конца, то ответ на главный вопрос прост и всем известен. Конечно же, сим-линки, созданные в каталоге /dev, не будут храниться, поскольку сама эта файловая система /dev в FC4 создается на лету подсистемой udev как следствие нескольких действий. Для начала ядро делает учет устройств в виде файловой системы SYSFS, которая располагается (монтируется) в каталоге /sys. Это, так сказать, "честные" устройства, обнаруженные в системе. После этого запускается udev — вы и сами можете это проделать с помощью /sys/udevstart.

Udev — это уровень "индерекции", то есть трансляции "физических" устройств из /sys в логические в /dev. Для полноты изложения нужно сказать, что тут задействована также система "горячего" подключения, поскольку /sys может видоизменяться в процессе работы.


Вопреки ожиданиям, udev.org — не то, что вам нужно.
Сайт Linux Udev расположен по

Собственно, трансляция sys в dev может выполняться полностью автоматически, без вашего вмешательства. Ядро, опрашивая драйверы, дает устройствам вполне жизнеспособные имена и номера, например tty1. Однако в некоторых случаях вы можете быть недовольны таким положением вещей — это особенно верно для динамически подключаемых устройств, в частности по USB. Например, вы подключаете USB-винчестер в различные разъемы — и при этом он каждый раз будет называться по-разному. В результате вы не можете написать удобную программу, поскольку не знаете, где ваше устройство. Еще хуже, если однотипных устройств много: все они будут называться одинаково, с разницей только в индексе — и в следующий раз могут запросто поменяться местами. Это именно та проблема, с которой так плохо справился DEVFS, отчего и пошел подальше.

Для того чтобы Udev мог что-то намутить с создаваемыми именами устройств, существуют правила udev, расположенные в каталоге /etc/udev/rules.d. На самом деле это настраивается в /etc/udev, но менять настройку не в пределах нашей компетенции. Подобно, например, стартовым скриптам, правила хранятся не в одном файле, а во всех документах с расширением .rules (остальные игнорируются), располагаемых в каталоге /etc/udev/rules.d. При этом файлы располагаются в алфавитном порядке, и все строки из них читаются в один большой буфер; затем каждое устройство из /sys будет "квалифицировано" согласно данным правилам.

Обратите внимание на логику udev: поиск происходит до первого совпадения, после чего устройство считается "обслуженным". Таким образом для одного устройства во всех файлах может быть только одно правило — то, которое будет найдено первым. В этом отличие от скриптов, которые всегда будут выполнены все — один за одним в заданном порядке. Это меняет и нашу логику: если в случае со скриптами мы, вероятно, хотим, чтобы система сначала выполнила все стандартные настройки (например запустила сетевые интерфейсы), а уже потом вносим свои изменения, например задаем другой сетевой адрес. Специально для этих целей существует ряд файлов-"постинициаторы".

В случае с правилами Udev "потома не будет" — первое же попадание устройства в правила будет и последним. Следовательно, нам нужно, чтобы наши правила проверялись раньше, чем системные по умолчанию. Файл настроек по умолчанию начинается с префикса "50" — так чтобы можно было что-то добавить до и после. Умные люди добавили также файл с префиксом "10" для каких-то "очень важных" устройств — ну что ж, назовемся как-то вроде /etc/udev/rules.d/00-ltmodem.rules и поместим туда следующую строку: KERNEL=”ttyLTM0", NAME=“%k”, SYMLINK=”modem”, MODE=”0660", GROUP=”uucp”




Содержание    Вперед