Назад | Перейти на главную страницу

Как определить, с какого блочного устройства загружается сценарий оболочки?

Я создаю сценарий оболочки (который будет вызываться cron), который еженедельно запускает smartctl на загружаемом диске. Есть ли достаточно универсальный способ определения устройства загрузочного блока (IE - / dev / sda, / dev / hdb и т. Д.)? Ожидаемая установка будет стандартной, я думаю, мне удастся избежать использования grep "/" в / etc / fstab, мне просто интересно, есть ли более изящный способ.

Этот сценарий будет специально развернут на Fedora и, возможно, на Ubuntu.

df -P / | tail -n 1 | awk '/.*/ { print $1 }'

Вернет корневое блочное устройство ФС. Однако не обязательно загрузочное устройство.

Лучше спросить, почему вы не сканируете SMART на всех дисках на сервере?

для / boot:

readlink -f / dev / block / $ (точка монтирования -d / загрузка)

для rootfs:

readlink -f / dev / block / $ (точка монтирования -d /)

Объяснение: 1) точка монтирования -d - дает старший: младший номер устройства, установленного в

2) Папка / dev / block - содержит символические ссылки на все блочные устройства по номерам устройств, указывающие на обычный файл устройства в / dev

3) readlink -f - восстановить имя устройства из символьной ссылки

Работает на всех современных Linux

cat /proc/mounts |grep /boot |awk '{print $1}'

Вернет что-то вроде / dev / sda1, если ваш / boot находится не на корневом устройстве.
Объедините это с ответом Криса С.

Вы, вероятно, уже давно отказались от этой задачи, но я пытался сделать что-то подобное и решил, что загляну в недостающую часть вашей головоломки, а именно, чтобы получить обозначение диска (например, /dev/sda) вместо обозначения раздела (например, /dev/sda1).

Я начал с Отличный ответ Криса С. (что также решило задачу, которую я стремился выполнить), а затем просто использовал старые добрые манипуляции со строками bash, чтобы обрезать число с конца (оставив вас с диском против раздела):

# first, save the output (e.g. /dev/sda1) to a variable
rootpart=$(df -P / | tail -n 1 | awk '/.*/ { print $1 }')

# now you can trim the number off:
echo ${rootpart//[[:digit:]]/}

# if ${rootpart} was "/dev/sda1", output would be "/dev/sda"