
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/root
para o dispositivo raiz real, mas o meu não faz isso. EUpoderiaobserve o conteúdo de /proc/cmdline
mas 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 findmnt
esteja presente...
Responder2
O mount
comando 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á lsblk
do utilitário instalado, fornecido pelo util-linux
CentOS/RHEL. Por exemplo, essa variante fornecerá o nome do disco do dispositivo raiz:
lsblk -oMOUNTPOINT,PKNAME -rn | awk '$1 ~ /^\/$/ { print $2 }'
sda3
findmnt
do mesmo pacote fornecerá o nome real do dispositivo raiz subjacente:
findmnt -oTARGET,SOURCE -rn /
/ /dev/mapper/vg01-lv_root
O sinalizador -P
para ambos os utilitários fornecerá as mesmas informações no formato adequado para eval
o 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 rdev
comando fazer com que ele seja interpretado automaticamente.