Каждый узел устройства /dev
имеет свою собственную пару старших / младших номеров. Я знаю, что мы можем извлечь эту пару чисел из узла устройства stat
, например, так:
stat -c 'major: %t minor: %T' <file>
Или ls -l
также показывает эти цифры.
Но как мы можем получить узел (и) устройства по заданным старшим и младшим номерам? Единственный способ я знаю это своего рода ls -l
+ awk
трюк, но я действительно надеюсь , что есть лучшее решение.
Ответы:
Я нашел более простой подход с использованием системы псевдофайлов sys : в / sys / dev у вас есть устройства, упорядоченные по типу тогда по мажорному / младшему, файл uevent содержит имя устройства и кучу другой информации.
Так, например,
Echoes,
Примечание: это было проверено в Debian Wheezy
источник
for file in $(ls /sys/dev/block/ ); do source /sys/dev/block/${file}/uevent; if [ "$DEVNAME" == "sda1" ] ; then echo ${file}; fi done;
Не уверен, что вы имеете в виду.
Создаст файл устройства, называемый
foo
блочным устройством с основными 8 и младшими 0. Если вы хотите найти один или любой из файлов/dev
с одинаковым типом, основным и второстепенным, вы можете сделать (сzsh
):Для блочного устройства
8:0
:для устройства char
226:0
:Обратите внимание, что все может создавать файлы в
/dev
. В очень старые времена это был сценарий создания статических файлов. В какой-то момент у вас даже была специальная файловая система а-ля/proc
.В современных версиях Linux он обычно
udev
основан на вводе из ядра.Имя, которое он выбирает для файла базового устройства, основано на
DEVNAME
предоставленном ядром.udev
правила могут изменить это, но, как правило, этого не происходит, и некоторыеudev
правила добавят еще несколько символических ссылок для удобства (например,/dev/disk/by...
те).Вы можете перейти от основного: младшего к ядру
DEVNAME
, посмотрев на:Вы также можете получить эту информацию из
udev
базы данных, как показал mikeserv.источник
Видимо, это можно сделать проще
udevadm
, и я только что узнал, как.Чтобы получить
DEVNAME
отudevadm
вас нужно только сделать:Например, если вы хотите знать
/dev
имя/sys/dev/char/5:1
вы могли бы сделать:ВЫХОД
Можно
-r
указать--root
путь ed - без него приведенный выше результат будет доступен только для чтенияconsole
.-q
Параметр определяет базу данных ,--query
и она принимает операндname
здесь - потому что мы хотимDEVNAME
.Очень простое средство нахождения пути к символу и / или блочному устройству с учетом только старшего: младшие числа могут выглядеть так:
Так работает:
печатает ...
Вот первый, который я написал.
Это просто сканирует
udevadm info --export-db
выходные данные для соответствующих номеров. Вывод выглядит так:Рабочий процесс похож на:
попытаться снять
[^=]*DEVNAME=
строку с головы каждой строкиесли строка не имеет первого символа или ее первый символ
/
копирует эту строку вh
старое пространствоесли строка совпадает,
MAJOR=
добавьтеN
строку ввода ext в пространство шаблонаесли в шаблонном пространстве есть 2 строки, которые совпадают,
=$1\n.*=$2$
скопируйтеh
старое пространство в шаблонное пространство и выполните автоматическую печать; иначе удалите пробелТак что если я сделаю:
ВЫХОД
Но, как указывает @xae, устройства блочного / символьного типа могут совместно использовать комбинации maj: min, и это может привести к выводу нескольких путей за вызов.
источник
Увы ,
/sys/dev
иерархия была добавлена в ядро только в 2.6.27 ( см. Соответствующий коммит против кодовой базы ядра), поэтому нам нужен «раздвоенный» подход.Пусть
$M
и$m
, соответственно, будут старшим и младшим номером нашего файла устройства.Пост 2.6.27 ядра
Как полагают другие, самый простой подход раскрывает всю мощь
sysfs
«виртуальной» файловой системы, гоняясь прямо за файлами, названными$M:$m
в папке/sys/dev
(более чем один файл следует ожидать, если мы не знаем, является ли наше устройство символьным). или блочный), а затем поискuevent
файла (в подоболочке, чтобы предотвратить загрязнение пространства имен):Pre 2.6.27 ядра
Давайте для простоты предположим, что наш файл является блочным устройством (аналогичный подход применяется для символьных устройств). Мы будем искать строку по
$M:$m
всей/sys/block
иерархии, изучая (под этой папкой) содержимое каждого файла, имя которого совпадает с именемdev
. Если/sys/block/<...>/<DEV>/dev
один из таких файлов, тоDEV
обязательно будет имя нашего устройства:источник
В Linux можно использовать определенные файлы в
/proc
виртуальной файловой системе.Простая форма шаблона уже предоставляет информацию о желаемом устройстве на выходе, однако возможна также дополнительная фильтрация для извлечения только одной конкретной строки.
источник
Есть функция библиотеки:
makedev()
Учитывая основные и второстепенные идентификаторы устройств, makedev () объединяет их для получения идентификатора устройства, возвращаемого как результат функции.
Для получения более подробной информации посетите: http://man7.org/linux/man-pages/man3/major.3.html
источник