Solaris 安装系统(文本安装程序、实时安装程序)无法识别 AHCI 控制器,尽管官方 HCL 明确列出了该控制器受支持?那么,我该如何安装 Solaris?
显然,驱动程序可以工作,但它就是拒绝这样做,因为控制器用错误的硬件类(raid 控制器)或其他东西宣布自己,因为这个愚蠢的假 raid 东西。不知何故,我终于设法连接了正确的驱动程序并安装了 Solaris,但安装的系统无法启动!我如何保留驱动程序附件?
在 BIOS 中,我可以选择 和IDE
,AHCI+RAID
但不能选择AHCI
。我可以使用IDE
模式,但显然这会降低很多性能。有问题的控制器是惠普 xw8400 工作站中的英特尔 631xESB/632xESB SATA AHCI 控制器。据我所知,一些 Apple 工作站也使用了该芯片组,并且这个“假 raid”问题也适用于那里。官方硬件兼容性列表 (HCL) 表明该控制器已通过认证。
互联网建议修补 grub 的 stage1。但效果不佳,因为(首先)grub 的构建系统似乎已损坏(objcopy 不起作用),而且我找不到任何可以运行此方法的 Linux 发行版。然后(其次)Solaris 11 从 grub v1 切换到 v2,stage1 不再存在,并且(第三)这种方法在 el-torito 从安装 DVD 引导时效果不佳。
那么,如何让正确的驱动程序连接到控制器并在安装时间之后继续存在?
答案1
确认控制器受 Solaris 支持后,您需要了解两条信息。首先是驱动程序名称。根据 HCL,631xESB/632xESB SATA/AHCI 控制器受 Solarisahci
驱动程序支持。
第二位信息是驱动程序应附加到的硬件标识符。启动安装介质。Solaris 11 的文本安装程序就很好。启动期间不要选择“安装”,而是获取 shell/终端。如果您使用实时安装程序,只需从菜单中打开终端即可。
执行prtconf -v | less
并搜索您的控制器。提示:按下/
并输入RAID
;这很快将我引向此输出:
[...]
pci103c,3015, instance #0
Driver properties:
name='sata' type=int items=1 dev=none
value=00000001
[...]
name='compatible' type=string items=7
value='pci8086,2682.103c.3015.9' + 'pci8086,2682.103c.3015' + 'pci103c,3015' + 'pci8086,2682.9' + 'pci8086,2682' + 'pciclass,010400' + 'pciclass,0104'
name='model' type=string items=1
value='RAID controller'
[...]
您希望从compatible
条目中选择最具体的值。在本例中,我选择了pci8086,2682.103c.3015.9
。如果您选择一个不太具体的标识符,驱动程序最终可能会连接到它不应该连接的硬件。在我早期的尝试中,我选择了 ,pci8086,3015
这导致驱动程序连接到 SAS/SATA 控制器,也连接到 USB 控制器。这导致了大量错误消息和子系统失败。
然后我们来连接驱动程序:
root@solaris:~# update_drv -a -i 'pci8086,2682.103c.3015.9' ahci
等待几秒钟,观察控制台上的错误消息。检查 的输出dmesg
,应该有一些与控制器及其上的磁盘相关的消息。还要检查 的输出fmadm faulty
:应该没有输出。检查 的输出cfgadm -s "select=type(disk)"
,您应该会看到您的磁盘。
您现在可以照常安装 Solaris。退出 shell/终端并继续。
安装后,您需要更新boot_archive
从控制器标识符到驱动程序的映射。安装时,命令update_drv
已将一行添加到/etc/driver_aliases
安装程序映像上的文件。您需要在已安装映像上的相应文件中重现此内容,然后更新 boot_archive。
我的安装程序系统driver_aliases
现在如下所示:
root@solaris:~# tail -3l /etc/driver_aliases
zyd "usbace,1211"
zyd "usb13b1,24"
ahci "pci8086,2682.103c.3015.9"
为了将此行复制到已安装的系统,您需要再次使用 shell。您可能需要重新启动并导入 rpool。在文本安装程序映像上打开 shell,或在实时安装程序映像上打开终端,再次连接驱动程序(如果需要),导入 rpool 并将引导环境挂载到空目录中:
root@solaris:~# update_drv -a -i 'pci8086,2682.103c.3015.9' ahci
root@solaris:~# zpool import rpool
root@solaris:~# mkdir /tmp/a
root@solaris:~# beadm mount solaris /tmp/a
这假定调用的solaris
是默认的引导环境。您可以使用 列出所有引导环境beadm list
。在 Solaris 11_4 中,也许其他人尝试导入 rpool 默认池会抛出一条错误消息,表明它可能之前已被其他系统挂载。只需在池名称前添加 -f 标志即可强制挂载。
root@solaris:~# zpool import -f rpool
为了确保您做对了事情,请对 driver_aliases 文件进行差异化:
root@solaris:~# diff -u /tmp/a/etc/driver_aliases /etc/driver_aliases
如果看起来不错,则附加魔法行:
root@solaris:~# cp /tmp/a/etc/driver_aliases /tmp/a/etc/driver_aliases.backup
root@solaris:~# tail -1l /etc/driver_aliases >> /tmp/a/etc/driver_aliases
再次检查文件是否正确。这会将控制器映射到驱动程序,但此映射仅适用于已启动的系统。您的系统应该从该控制器引导,对吗?您需要更新 boot_archive。这是一个简化的根文件系统,其中包含系统启动所需的一切,直到可以切换到真正的根文件系统。引导存档是一个带有 gzip 压缩文件的 iso9660 存档(如果您好奇并想检查内容,请继续)。在 Intel 64 位系统上,这是/boot/platform/i86pc/amd64/boot_archive
。
最后的魔法命令是:
root@solaris:~# bootadm update-archive -v -R /tmp/a
cannot find: /etc/cluster/nodeid: No such file or directory
cannot find: /etc/devices/mdi_ib_cache: No such file or directory
cannot find: /etc/devices/retire_store: No such file or directory
changed /etc/driver_aliases
updating /platform/i86pc/boot_archive
Unable to extend /platform/i86pc/boot_archive... rebuilding archive
Successfully created /platform/i86pc/boot_archive
updating /platform/i86pc/amd64/boot_archive
Unable to extend /platform/i86pc/amd64/boot_archive... rebuilding archive
Successfully created /platform/i86pc/amd64/boot_archive
不用太担心这些错误信息。对我来说,它运行得很好。
下次卸载并重新启动:
root@solaris:~# beadm unmount solaris
root@solaris:~# zpool export rpool
root@solaris:~# init 6
我花了好几天时间在网上研究这个问题。最后我阅读了大量有关 Solaris 启动过程的文档,并想出了这个解决方案。这篇文章完全是我自己想出来的,有些内容可能不准确。欢迎大家评论或改进!
这种方法也适用于 OpenIndiana、OpenSolaris、IllumOS 和其他系统。
玩得开心!