Aparentemente, isso pode ser feito de maneira mais simples com udevadm
e acabei de descobrir como.
Para obter o DEVNAME
de udevadm
, basta fazer:
udevadm info -rq name $PATH
Por exemplo, se você quisesse saber o /dev
name para /sys/dev/char/5:1
, você faria:
udevadm info -rq name /sys/dev/char/5:1
OUTPUT
/dev/console
A opção -r
é especificar um caminho --root
ed - sem o resultado acima, seria lido apenas console
. A opção -q
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 de bloco, dado apenas o principal: números menores podem parecer:
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
imprime ...
b:8:0:/dev/sda
Aqui está o primeiro que eu 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 saída udevadm info --export-db
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 remover a string [^=]*DEVNAME=
da cabeça de cada linha
-
se uma linha não tiver um primeiro caractere ou seu primeiro caractere for /
, copie essa linha sobre h
espaço antigo
-
se uma linha corresponder à linha de entrada MAJOR=
append N
ext para o espaço padrão
-
se houver duas linhas no espaço padrão que correspondam a =$1\n.*=$2$
, em seguida, copie h
espaço antigo sobre espaço padrão e impressão automática; mais excluir espaço padrão
Então, se eu fizer isso:
majminpath 7 133 ; majminpath 8 0 ; majminpath 8 1
OUTPUT
/dev/vcsa5
/dev/sda
/dev/sda1
Mas, como aponta o @xae, os dispositivos do tipo bloco / caractere podem compartilhar grandes combinações, e, portanto, isso pode imprimir mais de um caminho por chamada.