Este é um tipo de FAQ, mas todas as respostas que encontrei até agora não são adequadas para a automação completa, que é o que eu preciso. Então aqui vai de novo.
No Linux:
Existe uma maneira confiável de resolver o nome do dispositivo udev de um HDD (por exemplo, "/ dev / sdg") em seu caminho de dados para identificar o cabo físico real que o dispositivo está conectado (EG "Controller in PCIe- Slot2, SAS-Channel 0, Replicator Port 3 "?
Eu corro um servidor com uma dúzia de discos SATA em backplanes de troca a quente. Os discos são montados em um software Raid6 usando o dmraid (Linux). Por razões além do escopo desta questão, eu quero e preciso executar raid de software, não invasão de hardware através de um controlador dedicado.
Uma das falhas do software RAID é que o LED de falha no compartimento da unidade não acende quando uma unidade falha em uma matriz, porque o gabinete não tem como pesquisar o mdadm para o status da unidade. Você tem que encontrar a posição da unidade defeituosa manualmente.
Eu sei que você poderia apenas emitir um dd if=/dev/sdg of=/dev/null
e ver qual atividade LED acende, mas estou apontando para a solução bonita aqui.
Para consertar, eu juntei um pequeno PCB que vai falar com o backplane via i2c para ligar / desligar os LEDs de falha das baias e eu tenho um pequeno script que fala com esta placa via RS232.
O mdadm pode executar um comando quando ocorre um evento de falha, portanto, posso dizer ao mdadm para executar meu script e ativar o LED quando uma unidade sai da matriz. O único problema é:
O mdadm me diz "drive / dev / sdg1 falhou" . Mas o que eu preciso é "Drive no Controlador 1, Canal 2, Port 3 falhou" , então eu posso identificar qual LED acender.
Alguém sabe uma maneira confiável de resolver um nome de dispositivo como / dev / sdg de volta ao caminho?
Eu sei que hdparm -I /dev/sdX
me fornecerá o número de série e o fornecedor da unidade para que eu possa identificar manualmente o disco olhando para a etiqueta, mas o objetivo é fazer isso automaticamente. Identificar de forma confiável o controlador / porta envolvida será suficiente, já que a fiação normalmente não mudará ao usar backplanes e eu sei qual porta do controlador atende a baia da unidade.
Minha primeira ideia foi fazer ls -lah /dev/disk/by-path | grep /dev/sdX
para o nome de destino apropriado, mas isso não foi confiável, já que nem metade dos discos atualmente instalados aparecem nesse diretório.
Apenas dizendo "seu primeiro controlador terá sda-sdh, seu segundo controlador terá sdi-p" também não é confiável, já que há uma condição de corrida na inicialização e, às vezes, o controlador é inicializado primeiro, às vezes, o outro. O que for inicializado primeiro é / dev / sda ... Também as coisas ficam complicadas depois de uma troca a quente ou se nem todas as baias estiverem preenchidas.
lshw -short -c disk
parece gerar uma saída semelhante à que estou procurando, mas estou tendo problemas para vincular os números de caminho mostrados ali aos cabos físicos. Essas atribuições são estáveis? Qual é o padrão exato? (A numeração nos caminhos scsi é contínua, embora nem todos os compartimentos de unidade sejam preenchidos, o que me leva a pensar que esses nós de caminho scsi estão atribuídos dinamicamente e não representam diretamente portas físicas no controlador)
Alguém conhece um comando linux que usa um / dev / sdX como argumento e produz de forma confiável o slot PCIe associado e a porta do controlador?