Como você determina o dispositivo raiz se /dev/root estiver faltando?

Como você determina o dispositivo raiz se /dev/root estiver faltando?

Na distribuição que estou usando agora, Arch Linux ARM, o Linux é iniciado sem um disco RAM inicial, o que significa que o kernel faz todo o trabalho de montagem do sistema de arquivos raiz. Este sistema é instalado em um cartão SD e possui um script que precisa determinar o nó do dispositivo do sistema de arquivos em que ele reside. Este nó de dispositivo pode mudar dependendo de como eu inicializo o dispositivo (por exemplo, eu o conecto a outro dispositivo que já está em execução).

Consigo determinar o ponto de montagem usando df -k --output=target ${0} | sed "1d". Para determinar o dispositivo de origem, executo o df -k --output=source ${0} | sed "1d". Se eu inicializei no Arch Linux, o resultado do último comando será exibido /dev/root,que não existe. Claro, em alguns sistemas, o udev criará um link simbólico /dev/rootpara o dispositivo raiz real, mas o meu não faz isso. EUpoderiaobserve o conteúdo de /proc/cmdlinemas ele permanece o mesmo durante todo o tempo de atividade do kernel, o que significa que não é confiável.

Quando eu chegar /dev/root, como posso determinar o dispositivo de bloco subjacente real que ele representa?

Responder1

Resposta deos comentários aquié muito simples. Apenas ligue:

findmnt -n -o SOURCE /

Desde que findmntesteja presente...

Responder2

O mountcomando irá mostrar isso:

mount | sed -n 's|^/dev/\(.*\) on / .*|\1|p'

Responder3

eu encontreiesta postagem do blogmuito útil para encontrar o dispositivo raiz e o disco primário no Linux.

Você precisará lsblkdo utilitário instalado, fornecido pelo util-linuxCentOS/RHEL. Por exemplo, essa variante fornecerá o nome do disco do dispositivo raiz:

lsblk -oMOUNTPOINT,PKNAME -rn | awk '$1 ~ /^\/$/ { print $2 }'
sda3

findmntdo mesmo pacote fornecerá o nome real do dispositivo raiz subjacente:

findmnt -oTARGET,SOURCE -rn /
/ /dev/mapper/vg01-lv_root

O sinalizador -Ppara ambos os utilitários fornecerá as mesmas informações no formato adequado para evalo shell:

findmnt -oTARGET,SOURCE -Pn /
TARGET="/" SOURCE="/dev/mapper/vg01-lv_root"

lsblk -oMOUNTPOINT,PKNAME -Pn | grep 'MOUNTPOINT="/"'
MOUNTPOINT="/" PKNAME="sda3"

Responder4

Você pode usar stat /e inspecionar o número maior/secundário do dispositivo ou com a ajuda do rdevcomando fazer com que ele seja interpretado automaticamente.

informação relacionada