Как определить с какого диска загрузились?⁠⁠

Всплыла задачка сабж. В каком-нибудь линуксе, например а-ля дебиан, убунту и т.п. Вот в системе есть с пяток дисков и как в bash определить, с какого загрузились? Какие тут подводные камни, сразу перечислю: а если грузимся с nvme, а если диски в raid, а если есть grub не только в том, с которого загрузились, а если загрузились с efi, а если это гипервизор(например prox). И вот со всеми этими если как то не удаётся найти работающего решения ни загуглив, ни через ИИ - решения в каких то условиях, да не работают. Может есть гуру, у которых знания, умения позволяют решить такую вроде бы несложную задачку? На выходе решения пусть будет переменная со значением типа "/dev/sdh"

P.s. уважаемые, я понимаю, что на частности можно написать коротенькое решение, но надо чтобы скрипт сам определил где он и выдал результат.

Лига Сисадминов

2.8K поста19.2K подписчиков

Правила сообщества

Мы здесь рады любым постам связанным с рабочими буднями специалистов нашей сферы деятельности.

2
Автор поста оценил этот комментарий

Примерно вот так. Вытащил куски из своих скриптов и соединил. Возможно есть ошибки, не преследовал цели написать полностью рабочее решение. Воспринимай это как алгоритм и путь.
root_dev можно определить по разному - mount, /proc/cmdline, /etc/fstab, lsblk, efibootmgr, и т.д.
А... Еще... Может быть не диск указан как uuid, тогда смотреть в /dev/by-uuid и/или blkid. И дальше как в скрипте.
Одной готовой команды нет.


root_dev=$(df / --output=source | tail -1)

if [[ "$root_dev" == /dev/mapper/* ]]; then
lv_name=$(lsblk -no PKNAME "$root_dev" 2>/dev/null || echo "$root_dev" | sed 's|/dev/mapper/||')
pv_dev=$(sudo lvdisplay --colon "/dev/$lv_name" 2>/dev/null | awk -F':' '{print $2}' | xargs -r sudo pvs --noheadings -o pv_name | awk '{print $1}')
[[ -z "$pv_dev" ]] && pv_dev=$(lsblk -no PKNAME "$root_dev")
root_dev="$pv_dev"
elif [[ "$root_dev" == /dev/md* ]]; then
raid_components=($(grep -Po "(?<=: active ).*" /proc/mdstat | grep -Po "sd[a-z]+[0-9]*"))
root_dev="/dev/${raid_components[0]%%[0-9]*}"
elif [[ "$root_dev" =~ ^/dev/sd[a-z][0-9]+$ ]]; then
root_dev="${root_dev%%[0-9]*}"
fi

echo "disk: $root_dev"

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества