Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

The Solaris installation system (text installer, live installer) does not recognise the AHCI controller, although the controller is explicitly listed as supported on the official HCL? How do I install Solaris, then?

Apparently the driver would work, but it just refuses to do so, because the controller announces itself with the wrong hardware class (raid controller) or something, because of this silly fake raid thing. Somehow I finally managed to attach the correct driver and install Solaris, but the installed system does not boot! How do I persist the driver attachment?

In the BIOS I have the possibility to choose between IDE and AHCI+RAID, but not AHCI. I could use IDE mode, but apparently that costs a lot of performance. The contoller in question is Intel 631xESB/632xESB SATA AHCI Controller in a Hewlett Packard xw8400 Workstation. This chipset is also used in some Apple workstations and this "fake raid" problem also applies there, AFAIK. The official Hardware Compatibility List (HCL) says that this controller is certified.

The internet suggests to patch grub's stage1. That doesn't work well, because (firstly) grub's buildsystem seems to be broken (objcopy doesn't work) and I did not find any Linux distribution on which this works. Then (secondly) Solaris 11 switched from grub v1 to v2 and stage1 doesn't exist there anymore and (thirdly) that approach wouldn't work well with el-torito bootstrapping off an install DVD.

So, how do I let the correct driver attach to the controller and persist that beyond install time?

share|improve this question
add comment

1 Answer

up vote 2 down vote accepted

After you've confirmed that the controller is supported by Solaris, there are two bits of information you need to know. First the driver name. According to the HCL the 631xESB/632xESB SATA/AHCI controller is supported by Solaris' ahci driver.

The second bit of information is the hardware identifier to which the driver shall attach. Boot the install medium. The text installer of Solaris 11 is just fine. During boot do not choose "install" yet, but get a shell / terminal. If you use the live installer, just open a Terminal from the menu.

Execute prtconf -v | less and search for your Controller. Hint: Press / and type RAID; That quickly pointed me to this output:

[...]
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'
[...]

You want to pick the most specific value from the compatible entry. In this case I chose pci8086,2682.103c.3015.9. If you pick an identifier that is less specific, the driver could end up attaching to hardware that it is not supposed to attach to. In my early attempts I chose pci8086,3015 which caused the driver to attach to the SAS/SATA controller but also to the USB controller. That created a hell of error messages and subsystems to fail.

Then let's attach the driver:

root@solaris:~# update_drv -a -i 'pci8086,2682.103c.3015.9' ahci

Wait a few seconds and watch for error messages on the console. Check the output of dmesg, there should be some messages that relate to the controller and the disks on that controller. Also check the output of fmadm faulty: there should be no output. Check output of cfgadm -s "select=type(disk)", you should see your disks.

You're now able to install Solaris as usual. Exit the shell / terminal and proceed.

After installation you need to update the boot_archive with the mapping from the controller identifier to the driver. At install time the update_drv command has added a line to the file /etc/driver_aliases on the installer image. You need to reproduce this on the correspondent file on the installed image and then update the boot_archive.

The driver_aliases on my installer system looks like this now:

root@solaris:~# tail -3l /etc/driver_aliases
zyd "usbace,1211"
zyd "usb13b1,24"
ahci "pci8086,2682.103c.3015.9"

In order to copy this line to the installed system you need a shell again. You may need to reboot and import the rpool. Open a shell on the text installer image or a terminal on the live installer image, attach the driver again (if needed), import the rpool and mount the boot environment into an empty directory:

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

This assumes that the boot environment is called solaris which is the default. You can list all boot environments with beadm list. Just to make sure you do the right thing make a diff of the driver_aliases files:

root@solaris:~# diff -u /tmp/a/etc/driver_aliases /etc/driver_aliases

If that looks good, then append the magic line:

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

Check again if the file ended up well. This maps the controller to the driver, but this mapping is only available to an already booted system. Your system should bootstrap from that very controller though, right? You need to update the boot_archive. This is a reduced root filesystem which contains everything the system needs to boot up to a milestone when it can switch to the real root filesystem. The boot archive is an iso9660 archive with gzip compressed files (in case you're curious and would like to inspect the contents, go ahead). On Intel 64-Bit system this is /boot/platform/i86pc/amd64/boot_archive.

The final magic command is:

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

Do not worry too much about those error messages. It worked fine for me.

Next unmount and reboot:

root@solaris:~# beadm unmount solaris
root@solaris:~# zpool export rpool
root@solaris:~# init 6

I spent days researching on the internet about this problem. In the end I read a lot of documentation on Solaris' boot process and I came up with this solution. This write up comes out of my head, some things might not be accurate. Feel free to comment or improve!

This approach should also work on OpenIndiana, OpenSolaris, IllumOS and others.

Have fun!

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.