Cada nó do dispositivo /dev
possui seu próprio par de números maior / menor. Eu sei que podemos recuperar esse par de números do nó do dispositivo por meio de stat
, assim:
stat -c 'major: %t minor: %T' <file>
Ou, ls -l
também mostra esses números.
Mas como podemos obter o (s) nó (s) do dispositivo com números maiores e menores? A única maneira pela qual estou ciente é de algum tipo de ls -l
+ awk
truque, mas espero realmente que haja uma solução melhor.
Respostas:
Eu encontrei uma abordagem mais simples usando o sistema pseudofiles sys , em / sys / dev você tem os dispositivos ordenados por tipo e depois por major / minor, o uevent do arquivo contém o nome do dispositivo e várias outras informações.
Então, por exemplo,
Ecos,
Nota: Isso foi testado no Debian Wheezy
fonte
for file in $(ls /sys/dev/block/ ); do source /sys/dev/block/${file}/uevent; if [ "$DEVNAME" == "sda1" ] ; then echo ${file}; fi done;
Não tenho certeza do que você quer dizer.
Criará o arquivo do dispositivo chamado
foo
como um dispositivo de bloco com 8 maiores e menores 0. Se você deseja encontrar um ou qualquer um dos arquivos/dev
com o mesmo tipo, maior e menor, você pode fazer (comzsh
):Para dispositivo de bloco
8:0
:para dispositivo char
226:0
:Observe que qualquer coisa pode criar arquivos no
/dev
. Antigamente, era um script criando arquivos estáticos lá. Em algum momento, você ainda tinha um sistema de arquivos especial à la/proc
.Nas versões modernas do Linux, geralmente é
udev
baseado na entrada do kernel.O nome escolhido para o arquivo de dispositivo base é baseado no
DEVNAME
fornecido pelo kernel.udev
as regras podem mudar isso, mas geralmente não mudam, e algumasudev
regras adicionam mais links simbólicos por conveniência (como/dev/disk/by...
os).Você pode passar de major: minor para kernel
DEVNAME
, olhando para:Você também pode obter essas informações do
udev
banco de dados, como o mikeserv mostrou.fonte
Aparentemente, isso pode ser feito de maneira mais simples
udevadm
, e acabei de descobrir como.Para obter o
DEVNAME
deudevadm
que você só precisa fazer:Por exemplo, se você quisesse saber o
/dev
nome,/sys/dev/char/5:1
faria:RESULTADO
A
-r
opção é especificar um--root
caminho ed - sem ele, o resultado acima seria somente leituraconsole
. A-q
opção especifica um banco de dados--query
e leva o operandoname
aqui - porque queremos oDEVNAME
.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:
Então, executando:
impressões ...
Aqui está o primeiro que escrevi.
Isso apenas verifica a
udevadm info --export-db
saída em busca dos números correspondentes. A saída se parece com:O fluxo de trabalho é como:
tente tirar a
[^=]*DEVNAME=
corda da cabeça de cada linhase uma linha não tiver um primeiro caractere ou seu primeiro caractere for
/
copiá-la noh
espaço antigose uma linha corresponder,
MAJOR=
acrescenteN
a linha de entrada ext ao espaço do padrãose houver duas linhas no espaço do padrão que correspondam
=$1\n.*=$2$
, copie oh
espaço antigo sobre o espaço do padrão e imprima automaticamente; mais excluir espaço padrãoEntão, se eu fizer:
RESULTADO
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.
fonte
Infelizmente , a
/sys/dev
hierarquia só foi adicionado ao kernel tão tarde quanto 2.6.27 ( Cf. o relevante cometer contra a base de código do kernel), por isso precisamos de uma abordagem “bifurcado”.Seja
$M
e$m
, respectivamente, o número principal e o menor de nosso arquivo de dispositivo.Post 2.6.27 kernels
Conforme sugerido por outros, a abordagem mais simples libera o poder do
sysfs
sistema de arquivos “virtual”, perseguindo diretamente os arquivos nomeados$M:$m
sob a pasta/sys/dev
(mais de um arquivo é esperado se não soubermos se nosso dispositivo é um caractere). ou um baseado em bloco) e, em seguida, forneça ouevent
arquivo (em uma subshell para evitar a poluição do espaço para nome):Kernels anteriores à 2.6.27
Vamos supor, por uma questão de simplicidade, que nosso arquivo é um dispositivo de bloco (uma abordagem semelhante se aplica a dispositivos de caracteres). Procuraremos a string em
$M:$m
toda a/sys/block
hierarquia, examinando (embaixo dessa pasta) o conteúdo de cada arquivo cujo nome sejadev
. Se/sys/block/<...>/<DEV>/dev
for um desses arquivos,DEV
será o nome do nosso dispositivo:fonte
No Linux, é possível tirar proveito de certos arquivos no
/proc
sistema de arquivos virtual.A forma simples do padrão já fornece informações sobre o dispositivo desejado na saída, no entanto, filtragem adicional para extrair apenas uma sequência específica também é possível.
fonte
Existe uma função de biblioteca:
makedev()
Dados os IDs principais e secundários do dispositivo, makedev () os combina para produzir um ID do dispositivo, retornado como resultado da função.
Para mais detalhes, visite: http://man7.org/linux/man-pages/man3/major.3.html
fonte