![如何确定 Linux 系统的实际启动设备?](https://linux22.com/image/209610/%E5%A6%82%E4%BD%95%E7%A1%AE%E5%AE%9A%20Linux%20%E7%B3%BB%E7%BB%9F%E7%9A%84%E5%AE%9E%E9%99%85%E5%90%AF%E5%8A%A8%E8%AE%BE%E5%A4%87%EF%BC%9F.png)
我需要在 shell 脚本中确定系统从哪个设备(物理设备,而不是分区)启动。
我正在使用该脚本来创建磁盘映像,并希望防止有人意外擦除系统启动的磁盘。
每个物理磁盘可能包含 /boot 和 /EFI 分区,因此我不能只检查磁盘是否包含此类分区。
我需要知道在启动过程中实际使用了哪个磁盘。
答案1
只是没有办法可靠地确定启动磁盘。
原因很简单,内核无法获取此信息。
内核以一种即发即忘的方式从 RAM 中开始执行,无论何种方式(通常是一些匿名引导加载程序)都将内核加载到 RAM 中。
所以你只能猜测。因为内核知道 / 在哪里,(参见根=中/proc/cmdline
)取决于您的引导加载程序配置文件上的环境,您可以押注 / 位于系统启动设备上的概率...或不。
请注意,在 x86 架构上,您可以尝试使用以下命令从 BIOS 获取该信息int 13H 中断调用。这当然是一条艰难的(而且仍然不可靠)的路。
作为墨菲在一些评论中建议,如果您绝对确定您正在运行的系统只能依赖 UEFI 启动,那么您可以找到此信息正在运行启动管理器
您也可以尝试其他几种方法,尝试摆弄 MBR……,但所有方法仍然会带来不确定性(根据您的环境,不确定性可能会再次减少)。
试想一下,如果您从网络启动,您的内核由 kexec 启动,您的磁盘被组织在某些 RAID 阵列中,那么这些信息意味着什么……?
顺便说一句,如果您唯一的兴趣是防止用户意外删除启动分区......那么......简单地制作所有这些分区怎么样?只读? (因为您只需要在安装新内核时这些分区可写)