我正在编写一个 shell 脚本(由 cron 调用),该脚本每周在启动的磁盘上运行 smartctl。有没有一种相当通用的方法来确定启动块设备是什么(例如 - /dev/sda、/dev/hdb 等)?预期的安装将是标准的,我想我可以使用 /etc/fstab 上的 grep " / ",我只是想知道是否有更优雅的方法。
该脚本将专门部署在 Fedora 和可能的 Ubuntu 机器上。
答案1
df -P / | tail -n 1 | awk '/.*/ { print $1 }'
将返回根 FS 块设备。但不一定是启动设备。
更好的问题可能是为什么您没有扫描服务器中所有磁盘上的 SMART?
答案2
对于/boot:
读取链接-f / dev / block / $(挂载点-d / boot)
对于 rootfs:
读链接-f /dev/block/$(挂载点-d /)
解释:1)mountpoint -d - 给出安装的设备的主要:次要编号
2)/dev/block 文件夹 - 包含所有块设备的符号链接,这些块设备按设备号指向 /dev 中的常规设备文件
3)readlink -f - 从符号链接重建设备名称
适用于所有现代 Linux
答案3
cat /proc/mounts |grep /boot |awk '{print $1}'
如果您的 /boot 不在根设备上,则会返回类似 /dev/sda1 的内容。
将此与 Chris S 的回答结合起来。
答案4
您可能早已不再进行这项任务,但我正尝试做类似的事情,并认为我会研究您拼图中缺失的部分,即获取驱动器名称(例如/dev/sda
)而不是分区名称(例如/dev/sda1
)。
我开始Chris S 的精彩回答(这也解决了我想要完成的任务),然后只需使用老式的 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"