
В дистрибутиве, который я использую прямо сейчас, 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
получить его автоматическую интерпретацию.