Aparentemente, isso pode ser feito de maneira mais simples udevadm
, e acabei de descobrir como.
Para obter o DEVNAME
de udevadm
que você só precisa fazer:
udevadm info -rq name $PATH
Por exemplo, se você quisesse saber o /dev
nome, /sys/dev/char/5:1
faria:
udevadm info -rq name /sys/dev/char/5:1
RESULTADO
/dev/console
A -r
opção é especificar um --root
caminho ed - sem ele, o resultado acima seria somente leitura console
. A -q
opção especifica um banco de dados --query
e leva o operando name
aqui - porque queremos o DEVNAME
.
Um meio muito simples de encontrar o caminho para um dispositivo de char e / ou bloco, considerando apenas os principais: números menores podem se parecer com:
mmdev() for d in /sys/dev/[cb]*/$1:$2
do [ -e "$d" ] || return
printf %c:%s: "${d#/*/*/}" "${d##*/}"
udevadm info -rq name "$d"
done
Então, executando:
mmdev 8 0
impressões ...
b:8:0:/dev/sda
Aqui está o primeiro que escrevi.
majminpath() {
set -- ${1##*[!0-9]*} ${2##*[!0-9]*}
udevadm info --export-db |
sed 's|^[^=]*DEVNAME=||
\|^[^/]|!h;/MAJOR=/N
\|='"$1\n.*=${2?}"'$|!d;g'
}
Isso apenas verifica a udevadm info --export-db
saída em busca dos números correspondentes. A saída se parece com:
P: /devices/virtual/vc/vcsa4
N: vcsa4
E: DEVNAME=/dev/vcsa4
E: DEVPATH=/devices/virtual/vc/vcsa4
E: MAJOR=7
E: MINOR=132
E: SUBSYSTEM=vc
P: /devices/virtual/vc/vcsa5
N: vcsa5
E: DEVNAME=/dev/vcsa5
E: DEVPATH=/devices/virtual/vc/vcsa5
E: MAJOR=7
E: MINOR=133
E: SUBSYSTEM=vc
#...and so on
O fluxo de trabalho é como:
tente tirar a [^=]*DEVNAME=
corda da cabeça de cada linha
se uma linha não tiver um primeiro caractere ou seu primeiro caractere for /
copiá-la no h
espaço antigo
se uma linha corresponder, MAJOR=
acrescente N
a linha de entrada ext ao espaço do padrão
se houver duas linhas no espaço do padrão que correspondam =$1\n.*=$2$
, copie o h
espaço antigo sobre o espaço do padrão e imprima automaticamente; mais excluir espaço padrão
Então, se eu fizer:
majminpath 7 133 ; majminpath 8 0 ; majminpath 8 1
RESULTADO
/dev/vcsa5
/dev/sda
/dev/sda1
Mas, como @xae aponta, os dispositivos do tipo bloco / caractere podem compartilhar combinações maj: min e, portanto, isso pode imprimir mais de um caminho por chamada.