Как определить корневое устройство, если /dev/root отсутствует?

Как определить корневое устройство, если /dev/root отсутствует?

В дистрибутиве, который я использую прямо сейчас, Arch Linux ARM, Linux запускается без начального RAM-диска, то есть ядро ​​выполняет всю работу по монтированию корневой файловой системы. Эта система установлена ​​на SD-карту и имеет скрипт, который должен определить узел устройства файловой системы, на которой она находится. Этот узел устройства может меняться в зависимости от того, как я загружаю устройство (например, я подключаю его к другому устройству, которое уже работает).

Я могу определить точку монтирования с помощью df -k --output=target ${0} | sed "1d". Чтобы определить исходное устройство, я запускаю df -k --output=source ${0} | sed "1d". Если я загрузился в Arch Linux, результат этой последней команды выдает /dev/root,которого не существует. Конечно, в некоторых системах udev создаст символическую ссылку /dev/rootна настоящее корневое устройство, но моя этого не делает. Ямогпосмотрите на содержимое, /proc/cmdlineно оно остается неизменным на протяжении всего времени работы ядра, так что это означает, что оно ненадежно.

Когда я получаю /dev/root, как я могу определить, какое реальное базовое блочное устройство оно представляет?

решение1

Ответ откомментарии здесьочень просто. Просто позвоните:

findmnt -n -o SOURCE /

При условии, что findmntприсутствует...

решение2

Команда mountпокажет это:

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

решение3

я нашелэтот пост в блогеочень полезно для поиска корневого устройства и основного диска в Linux.

Вам понадобится lsblkустановленная утилита, которая предоставляется util-linuxв CentOS/RHEL. Например, такой вариант даст вам имя диска корневого устройства:

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

findmntиз того же пакета вы получите фактическое имя корневого устройства:

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

Флаг -Pдля обеих утилит предоставит вам одинаковую информацию в формате, подходящем для evalоболочки:

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

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

решение4

Вы можете использовать stat /и проверить основной/дополнительный номер устройства или с помощью команды rdevполучить его автоматическую интерпретацию.

Связанный контент