【问题标题】:How to programmatically determine which is the boot disk on Solaris/illumos?如何以编程方式确定哪个是 Solaris/illumos 上的引导盘?
【发布时间】:2023-03-14 08:42:02
【问题描述】:

在测试服务器上有两个三星 960 Pro SSD,制造商、型号和尺寸完全相同。在两者上,我都安装了完全相同的操作系统 OmniOS r15026 的全新安装。

通过在 POST 时按 F8,我可以访问主板 BOOT 管理器,并选择两个引导驱动器之一。因此,我知道系统是从哪一个启动的。

但是如何在启动后以编程方式知道哪个是启动盘?

好像是:

Solaris/illumos 是否提供了一些内省挂钩来确定哪个是引导盘?

是否可以通过编程方式确定哪个是 Solaris/illumos 上的引导盘?

命令行工具也可以。


编辑1:感谢@andrew-henle,我知道了命令eeprom

正如预期的那样,它是available on illumos,但不幸的是,在带有 OmniOS 的测试服务器上它并没有返回太多:

root@omnios:~# eeprom
keyboard-layout=US-English
ata-dma-enabled=1
atapi-cd-dma-enabled=1
ttyd-rts-dtr-off=false
ttyd-ignore-cd=true
ttyc-rts-dtr-off=false
ttyc-ignore-cd=true
ttyb-rts-dtr-off=false
ttyb-ignore-cd=true
ttya-rts-dtr-off=false
ttya-ignore-cd=true
ttyd-mode=9600,8,n,1,-
ttyc-mode=9600,8,n,1,-
ttyb-mode=9600,8,n,1,-
ttya-mode=9600,8,n,1,-
lba-access-ok=1

root@omnios:~# eeprom boot-device
boot-device: data not available.

OmniOS r15026 上的解决方案

感谢@abarczyk,我能够确定正确的启动磁盘。

我不得不使用稍微不同的语法:

root@omnios:~# /usr/sbin/prtconf -v | ggrep -1  bootpath
          value='unix'
      name='bootpath' type=string items=1
          value='/pci@38,0/pci1022,1453@1,1/pci144d,a801@0/blkdev@w0025385971B16535,0:b

使用/usr/sbin/format,我可以看到条目对应

  16. c1t0025385971B16535d0 <Samsung-SSD 960 PRO 512GB-2B6QCXP7-476.94GB>
      /pci@38,0/pci1022,1453@1,1/pci144d,a801@0/blkdev@w0025385971B16535,0

这是正确的,因为那是我在 BIOS 中手动选择的磁盘。

非常感谢 @abarczyk 和 @andrew-henle 考虑这一点并提供指导性帮助。

【问题讨论】:

    标签: unix command-line-interface solaris boot


    【解决方案1】:

    使用eeprom 命令。

    the eeprom man page:

    说明

    eeprom 显示或更改 EEPROM 中的参数值。 它按给定的顺序处理参数。当处理一个 带有值的参数,eeprom 使指示的 更改 EEPROM;否则,它显示参数的 价值。如果没有指定参数说明符,eeprom 会显示值 所有 EEPROM 参数。 '-'(连字符)标志指定 参数和值将从标准输入中读取(一个 参数或参数=每行的值)。

    只有超级用户可以更改 EEPROM 的内容。

    eeprom 验证 EEPROM 校验和,如果它们是则抱怨 不正确。

    platform-name是平台实现的名称,可以是 使用uname(1)–i 选项找到。

    SPARC

    基于 SPARC 的系统通过以下方式实现固件密码保护 eeprom,使用security-modesecurity-passwordsecurity-#badlogins 属性。

    x86

    EEPROM 存储是使用位于 特定于平台的引导区域。 /boot/solaris/bootenv.rc 文件 模拟 EEPROM 存储。

    因为基于 x86 的系统通常在 系统 BIOS 中不支持密码保护 eeprom 程序。虽然可以设置security-modesecurity-passwordsecurity-#badlogins 基于 x86 的属性 系统,这些属性在 x86 上没有特殊含义或行为 基于系统。

    【讨论】:

    • 感谢您指出命令eeprom。它是available on illumos,但不幸的是,在我的 illumos (OmniOS) 测试服务器上并没有返回太多。请参阅已编辑的问题。
    • @gsl 我现在无法访问 Solaris 服务器,因此无法检查。但是您可能会在 /boot 的某个地方找到一些有用的东西。您可能必须在 x86 机器上解析 GRUB 配置文件。假设/ 文件系统在您的引导磁盘上是否安全?
    • 谢谢,我现在正在查看/boot 以搜索一些有用的信息。是的,/ 文件系统在引导磁盘上。我用zfs list编辑了问题。
    • 我已经粘贴了 boot/loader.rc here 的输出。但其中大部分设置都被注释掉了。
    • @gsl 据我所知,您可能需要查看/boot/grub。那里可能有一个menu.??? 文件,如果您能弄清楚如何解析条目,您可以从中获取启动盘。问题在于您如何定义“启动盘”。那是引导加载程序所在的地方吗?那是您的根文件系统所在的位置吗?初始 GRUB 引导加载程序可以在一个磁盘上,它最初从第二个磁盘加载 Solaris 内核,然后从一个或多个 其他 磁盘上的 ZFS 池加载根文件系统。
    【解决方案2】:

    查找启动系统的设备的最佳方法是检查 prtconf -vp 输出:

    # /usr/sbin/prtconf -vp | grep bootpath
            bootpath:  '/pci@0,600000/pci@0/scsi@1/disk@0,0:a'
    

    【讨论】:

    • 非常感谢,这非常有效。在我的测试系统 illumos/OmniOS r15026 上,我必须使用语法 /usr/sbin/prtconf -v | ggrep -1 bootpath,显示在“bootpath”条目旁边的行上,value='/pci@38,0/pci1022,1453@1,1/pci144d,a801@0/blkdev@w0025385971B16535,0:b'。使用format,我可以看到该条目对应于c1t0025385971B16535d0 &lt;Samsung-SSD 960 PRO 512GB-2B6QCXP7-476.94GB&gt;,这是正确的,因为那是我在BIOS中手动选择的磁盘。
    【解决方案3】:

    在我的Solaris 11.4 Beta 系统上,有一个非常有用的命令叫做devprop,它可以帮助回答您的问题:

    $ devprop -s bootpath
    /pci@0,0/pci1849,8c02@1f,2/disk@1,0:b
    

    那么您只需查看format 的输出即可查看其转换为什么。在我的系统上,就是

           9. c2t1d0 <ATA-ST1000DM003-1CH1-CC47-931.51GB>
          /pci@0,0/pci1849,8c02@1f,2/disk@1,0
    

    【讨论】:

    • 谢谢,它也适用于 OmniOS,/sbin/devprop -s bootpath,或者,对我来说更好,devprop diskdevid。这个答案比上一个答案更优雅,更简洁,尽管prtconf -vdevprop 查看的设备树。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    相关资源
    最近更新 更多