12
31
2007
Intel Mac で Solaris : その5
Open Solaris を IntelMacハードウェアに対応させる
IntelMac上で Open Solaris Express Developer Edition が稼働させることができましたが、残念ながらハードウェアの対応状況は芳しくありません.元々Solaris のハードウェアサポートはとても貧弱で、数年以上前の枯れたデバイスしかサポートされていません.当然ながら、今のところ門外漢の Intel Mac のハードウェアのサポートなど期待できそうもありません.
今のところ MacBook でしか検証していませんが、肝心要のネットワーク関係のハードウェアが全く認識されておらず、OSをインストールしただけではネットワークにつながりませんでした.とりあえず、内蔵のイーサネットだけでもつながらないものかと試行錯誤した結果、何とかネットワークにつながるようになりましたので、その手順を紹介しておきます.
まず、MacBook で使われているイーサネットコントローラーのメーカーや型番を調べます.Mac OS X の “System Profiler” でもある程度は分かりますが、具体的なチップの名前などは分からない事が多いです.そこで、Windows XP のデバイスマネージャの情報を見てみることにします.
デバイスマネージャによると、”MacBook 1,1”(初代Core Duo)のイーサネットコントローラーは、”Marvell Yukon 88E8053 PCI-E Gigabit Ethernet “ という名前であることが分かります.Sun のサポートサイト http://opensolaris.org/os/ などで、Solaris がこのデバイスをサポートしているかどうか調べます.
Sun では Hardware Compatibility List (HCL) としてデータベース化していますので、これで検索して見て下さい.
12/31 2007 現在では、Marvell Yukon 88E8053 に情報が載っています.この情報によると、”Reported to Work” となっているので、一応 Open Solaris で動くようです.ただ日付が 2005-12-30 となっていて2年前の情報なので、最新のOSに対応しているかどうかは不明です.とりあえずこのドライバーをダウンロードしておきます.
今回の様に、メーカ名やチップ名がはっきりと分かっている場合は調べるのは容易なのですが、OEM製品などで型番や名前が異なっていたり、メーカー名が異なっていたりすると結構厄介です.また、マザーボードの内蔵コントローラーだったり、ネットワークカードなどの場合は、チップの名前で探すべきかボードの型番で探した方が良いのか、よく分からない場合があります.
例え該当する型番が見つからない場合でも、同種のチップセットを使った他の型番用のドライバーでも問題なく使えることがあります.大抵の場合、同一メーカーの同じような製品群は同じデバイスドライバーで動作するようになっていますので、型番がピッタリと合わなくてもそれほど心配することはありません.
ハードウェアの情報が有る程度判明したところで、実際にSolaris が各種のハードウェアデバイスをどの様に認識しているのか調べてみます.まずは ifconfig コマンドでネットワークデバイスの状態を確認してみましょう.
# ifconfig -a
lo0: flags=2001000849 mtu 8232 index 1
inet 127.0.0.1 netmask ff000000
lo0: flags=2002000849 mtu 8252 index 1
inet6 ::1/128
やはりループバックしかありませんね.それでは次に “prtconf” コマンドでデバイスの状態を確認してみましょう.このコマンドの出力は450行近以上もあるので、ネットワークに関係しそうな部分だけ抜き出しておきます.
どうやら2つのネットワークデバイスが有るようです.(Node 0x00001a & Node 0x00001b)
# prtconv -pv
System Configuration: Sun Microsystems i86pc
Memory size: 2017 Megabytes
System Peripherals (PROM Nodes):
Node 0x000001
bios-boot-device: '80'
stdout: 00000000
name: 'i86pc'
Node 0x000002
existing: 00c59000.00000000.073dd801.00000000
name: 'ramdisk'
========== 途中省略 ============
Node 0x00001a
assigned-addresses: 83010010.00000000.90200000.00000000.00004000.81010018.00000
reg: 00010000.00000000.00000000.00000000.00000000.03010010.00000000.00000000.
compatible: 'pciex11ab,4362.11ab.5321.22' + 'pciex11ab,4362.11ab.5321' + 'pciex11ab,4362.22' + 'pciex11ab,4362' + 'pciexclass,020000' + 'pciexclass,0200' + 'pci11ab,4362.11ab.5321.22' + 'pci11ab,4362.11ab.5321' + 'pci11ab,5321' + 'pci11ab,4362.22' + 'pci11ab,4362' + 'pciclass,020000' + 'pciclass,0200'
model: 'Ethernet controller'
power-consumption: 00000001.00000001
devsel-speed: 00000000
interrupts: 00000001
subsystem-vendor-id: 000011ab
subsystem-id: 00005321
unit-address: '0'
class-code: 00020000
revision-id: 00000022
vendor-id: 000011ab
device-id: 00004362
pcie-capid-pointer: 000000e0
pcie-capid-reg: 00000011
name: 'pci11ab,5321'
Node 0x00001b
assigned-addresses: 83020010.00000000.90100000.00000000.00010000
reg: 00020000.00000000.00000000.00000000.00000000.03020010.00000000.00000000.
compatible: 'pciex168c,1c.106b.86.1' + 'pciex168c,1c.106b.86' + 'pciex168c,1c.1' + 'pciex168c,1c' + 'pciexclass,020000' + 'pciexclass,0200' + 'pci168c,1c.106b.86.1' + 'pci168c,1c.106b.86' + 'pci106b,86' + 'pci168c,1c.1' + 'pci168c,1c' + 'pciclass,020000' + 'pciclass,0200'
model: 'Ethernet controller'
power-consumption: 00000001.00000001
devsel-speed: 00000000
interrupts: 00000001
subsystem-vendor-id: 0000106b
subsystem-id: 00000086
unit-address: '0'
class-code: 00020000
revision-id: 00000001
vendor-id: 0000168c
device-id: 0000001c
pcie-capid-pointer: 00000060
pcie-capid-reg: 00000011
name: 'pci106b,86'
この情報から、デバイスのベンダー名(メーカー名)や型番(ID) 、同種の互換性のある型番などの情報が分かります.Node 0x00001aの方は、”vendor-id: 000011ab” からこのメーカーが “Marvell” で、”device-id: 0000001c” から型番を表すIDが 001C であることが分かります.このコードの割り当て情報は、PCI関係のデータベース を通じて照会できます.どうやらこれが MarvellのYukon 88E8053 のデバイス情報のようです.残念ながらIDが001Cという項目は見つかりませんでしたが、同じチップを使っているIDが幾つか見つかりました.0x4362, 0x4363 が同類ですね.
もう一方 (Node 0x00001b ) は、ベンダー名が Apple であることが分かります.恐らくAirPort Extream モジュールではないかと思います.実際には Atheros AR5006X というポピュラーなチップが使われていますので、Atheros AR5006Xでドライバを捜した方が良いでしょう.
【追記:1/01 2008 】
Atheros AR5006X 用のドライバは Sun のホームページに情報がありました.WPA2や802.1Xにも対応しているようです.
Wireless Network Driver for the Atheros Chipset (ath)
Wireless WPA/WPA2/IEEE802.1X supplicant
該当するデバイスの認識情報が分かったところで、Solarisがそれらのデバイスに関係するドライバをどのように処理したのか確認してみます.先程の”prtconf” コマンドを、今度はオプションなしで実行します.
# prtconf
System Configuration: Sun Microsystems i86pc
Memory size: 2017 Megabytes
System Peripherals (Software Nodes):
i86pc
scsi_vhci, instance #0
isa, instance #0
asy (driver not attached)
pit_beep, instance #0
pci, instance #0
pci8086,7270, instance #0
display, instance #0
pci8086,7270 (driver not attached)
pci8086,27a3 (driver not attached)
pci8384,7680 (driver not attached)
pci8086,27d0, instance #0
pci11ab,5321 (driver not attached) <=== ドライバが読み込まれていない (Marvell)
pci8086,27d2, instance #1
pci106b,86 (driver not attached) <=== ドライバが読み込まれていない (Apple)
pci8086,7270, instance #0
mouse, instance #0
device, instance #2
keyboard, instance #4
mouse, instance #5
input, instance #6
pci8086,7270, instance #1
pci8086,7270, instance #2
input (driver not attached)
pci8086,7270, instance #3
device, instance #1
keyboard, instance #1
mouse, instance #2
pci8086,7270, instance #0
miscellaneous, instance #0
video, instance #0
storage, instance #0
disk, instance #1
pci8086,2448, instance #0
pci11c1,5811, instance #0
pci8086,7270 (driver not attached)
pci-ide, instance #0
ide, instance #0
sd, instance #0
ide (driver not attached)
pci-ide, instance #1
ide, instance #2
cmdk, instance #0
ide (driver not attached)
pci8086,7270 (driver not attached)
iscsi, instance #0
pseudo, instance #0
options, instance #0
agpgart, instance #0
xsvc, instance #0
acpi (driver not attached)
used-resources (driver not attached)
cpus, instance #0
cpu, instance #0
cpu, instance #1
デバイス “pci11ab,5321” に対応するドライバが Solarisにインストールされているかどうか調べてみましょう.これを調べるには、”/boot/solaris/devicedb/master” ファイルの中身を覗いてみれば判かります.このファイルも450行近くもあるので、一部だけを抜粋します.これを見ればSolaris がどの程度各種ハードウェアをサポートしているのか見当が付きます.
#
# PCI devices
# IEEE 1275 defined name format: pciVVVV,DDDD
# where VVVV and DDDD are the vendor and device id fields from
# the configuration space.
#
# Only add entries for devices with befs.
# Please keep in numeric order.
#
pci1011,2 pci1011,2 net pci dnet.bef "DEC 21040 Ethernet"
pci1011,9 pci1011,9 net pci dnet.bef "DEC 21140 Fast Ethernet"
...
pci14e4,1696 pci14e4,1696 net pci none "Broadcom 5782 Gigabit Ethernet"
pci14e4,169c pci14e4,169c net pci none "Broadcom 5788 Gigabit Ethernet"
...
pci8086,1029 pci8086,1029 net pci iprb.bef "Intel Pro/100 Network Adapter"
...
pci8086,2449 pci8086,2449 net pci iprb.bef "Intel i815/82559 Ethernet"
pci8086,27dc pci8086,27dc net pci iprb.bef "Intel ICH7 82801G Ethernet"
pci10b8,5 pci10b8,5 net pci spwr.bef "SMC EtherPower II 10/100 (9432)"
...
メジャーなネットワークデバイスの名前はありますが、どうやら、”Marvell” (pci11ab) は無いようです.このファイルの他に、”/etc/driver_aliases” というファイルがあって、pci8086,1029のようなデバイス名と ”iprb”のような デバイスドライバの名前を結びつける役目を果たしています.念のためこちらのファイルも確認しておきます.こちらも800行以上有りますので、一部だけの抜粋です.
sk98sol "pci1148,9821"
sk98sol "pci1148,9822"
sk98sol "pci1148,9841"
sk98sol "pci1148,9842"
sk98sol "pci1148,9843"
sk98sol "pci1148,9844"
sk98sol "pci1148,9861"
sk98sol "pci1148,9862"
sk98sol "pci1259,2970"
sk98sol "pci1259,2971"
sk98sol "pci1259,2972"
sk98sol "pci1259,2975"
sk98sol "pci1259,2976"
sk98sol "pci1259,2977"
...
marvell88sx "pci11ab,5081"
marvell88sx "pci11ab,5080"
marvell88sx "pci11ab,5041"
marvell88sx "pci11ab,5040"
marvell88sx "pci11ab,6041.9"
marvell88sx "pci11ab,6081.9"
...
同じベンダーの他のハードウェアのデバイスドライバは有るようですが、このドライバ “marvell88sx” の正体が今一っ不明なので、新しいドライバを探すことにします.
デバイスドライバのインストール
やはり自分でドライバをインストールするしか無さそうです.先程ダウンロードしたドライバを解凍し、適当なディレクトリに置きます.ダウンロードしたファイル名は “skgesol_x86v8.19.1.3.tar.Z” で、中の説明を見ると、SysKonnect Gigabit Ethernet Adapter families driver for Solaris となっています.SysKonnect というメーカーが Marvell のチップを使って出荷しているネットワークボード用のドライバのようです.ベンダー名のコードも型番も違いますが、とりあえずインストールしてみましょう.
解凍したドライバの中を探っていけば、インストール用のスクリプトなどがありますので、このドライバがどのような手続きを経てシステムにインストールされるのかが分かります.ちなみにこのドライバをインストールすると、”skge” というドライバ名(デバイス名)でインストールされるようです.インストールに際して、旧バージョンのドライバ “SK98sol “ は事前に削除しておかなければならないようです.
# cd SKGEsol
# ls -la <=== 中身を確認
total 12
drwxr-xr-x 4 root root 512 Nov 14 2006 .
drwxr-xr-x 17 yasuaki staff 1024 Dec 31 04:09 ..
drwxr-xr-x 2 root root 512 Nov 14 2006 install
-rw-r--r-- 1 root root 265 Nov 14 2006 pkginfo
-rw-r--r-- 1 root root 962 Nov 14 2006 pkgmap
drwxr-xr-x 6 root root 512 Nov 14 2006 reloc
# pkgrm SK98sol <=== 旧バージョンのドライバを削除
The following package is currently installed:
SK98sol SysKonnect SK-NET Gigabit Ethernet Adapter SK-98xx
(i386) 3.07,REV=2007.11.12.23.07
Do you want to remove this package? [y,n,?,q] y
## Removing installed package instance
This package contains scripts which will be executed with super-user
permission during the process of removing this package.
Do you want to continue with the removal of this package [y,n,?,q] y
## Verifying package dependencies in global zone
## Processing package information.
## Executing preremove script.
Deinstalling sk98sol driver :
## Removing pathnames in class
/kernel/drv/sk98sol.conf
/kernel/drv/sk98sol
/kernel/drv
/kernel
/etc/rcS.d/S50sk98sol
/etc/rcS.d
/etc
## Executing postremove script.
## Updating system information.
Removal of was successful.
#
# cd ..
# pkgadd -d . SKGEsol <=== インストール
Processing package instance from
SysKonnect Gigabit Ethernet Adapter families 32 bit driver(i386) 8.19.1.3
Marvell
WARNING: An old SysKonnect driver package SK98sol was found!
Due to this the actual installation will fail until you
remove the old package with the following command:
pkgrm SK98sol
Should you see the error message:
pkgrm: ERROR: no package associated with <=== エラーの説明
after you have tried to remove the old package then there
are lines leftover in /etc/driver_aliases from an old
installation. You have to remove all lines containing
the name sk98sol manually. Please be careful! The file
/etc/driver_aliases is essential during Solaris startup!
Try again to install SKGEsol after you are finished.
pkgadd: ERROR: request script did not complete successfully
Installation of failed.
No changes were made to the system.
# vi /etc/driver_aliases <=== 旧バージョンのエントリーを削除してから
# pkgadd -d . SKGEsol <=== 再度インストールを試みる
Processing package instance from
SysKonnect Gigabit Ethernet Adapter families 32 bit driver(i386) 8.19.1.3
Marvell
----------------------
IP configuration
----------------------
Do you want to configure the IP interfaces now (y/n)? n <=== とりあえずDHCP で行くので、”No”
Using > as the package base directory.
## Processing package information.
## Processing system information.
9 package pathnames are already properly installed.
## Verifying disk space requirements.
## Checking for conflicts with packages already installed.
## Checking for setuid/setgid programs.
This package contains scripts which will be executed with super-user
permission during the process of installing this package.
Do you want to continue with the installation of [y,n,?] y <=== インストール続行
Installing SysKonnect Gigabit Ethernet Adapter families 32 bit driver as
## Executing preinstall script.
## Installing part 1 of 1.
/etc/rcS.d/S50skge
/kernel/drv/skge
/kernel/drv/skge.conf
/usr/sbin/skge_vlan_config
/usr/share/man/man7d/skge.7d
[ verifying class ]
[ verifying class ]
## Executing postinstall script.
add_drv skge
devfsadm: driver failed to attach: skge
Warning: Driver (skge) successfully added to system but failed to attach
SKGEsol driver load failed: IP interfaces will not be configured!
pkgadd: ERROR: postinstall script did not complete successfully
Installation of partially failed. <=== とりあえずOK でしょう
#
これでドライバのインストールは終わりましたが、このドライバのインストーラーの設定では、SysKonnect Gigabit Ethernet Adapter familiesのハードウェアしか有効になりません.先程の “/boot/solaris/driverdb/master” と “/etc/driver_aliases” の末尾にでも、新しくインストールしたドライバ “skge” を デバイス “pci11ab,5321” に割り当てる設定を書き加えなければなりません.次のような行をそれぞれ加えて下さい.
/etc/driver_aliases ファイルの編集
...
skge "pci1148,1221"
skge "pci1148,3221"
skge "pci11ab,5321" <=== この行を追加する
/boot/solaris/driverdb/master ファイルの編集
...
#START ADD SKGEsol Mon Dec 31 04:20:32 JST 2007
pci1148,3221 pci1148,3221 net pci none "SysKonnect Gigabit Ethernet Adapter families"
#END ADD SKGEsol Mon Dec 31 04:20:32 JST 2007
pci11ab,5321 pci11ab,5321 net pci none "Marvell Yukon 88E8053 Gigabit Ethernet Adapter families" <=== この行を追加する
最後にもう一つだけやることがあります.それは次の再起動時にカーネルに -r オプションを渡して、新しいドライバを動的に組み込む作業が必要です.Soralis のブートセレクタメニューが現れている間に、メニューの編集オプションを選んで、-r オプションを指定するのですが、この方法は面倒なので、代わりにルートディレクトリ (/) 直下に “/reconfigure” という名前の(中身は必要ない)ファイルを作成しておきます.
# touch /reconfigure
このようにしておけば、これがカーネル起動のオプションフラグとして認識され、-r オプションを指定したのと同様になります.無事 -r オプションと共にカーネルが起動されると、今度はきちんとネットワークデバイス”Marvell Yukon 88E8053” を認識して、ネットワークディバイス “skge0” としてアクティブになっている筈です.
再起動をしてみたところ、コンソールにネットワークデバイスが認識されてアクティブになった旨のメッセージが表示されています.きちんと DHCP でIPアドレスが割り当てられていますね.無事つながりました (^_^)b
# ifconfig -a
lo0: flags=2001000849 mtu 8232 index 1
inet 127.0.0.1 netmask ff000000
skge0: flags=1004843 mtu 1500 index 2
inet 192.168.100.173 netmask ffffff00 broadcast 192.168.100.255
ether 0:16:cb:8f:24:6c
lo0: flags=2002000849 mtu 8252 index 1
inet6 ::1/128
#
# prtconf
System Configuration: Sun Microsystems i86pc
Memory size: 2017 Megabytes
System Peripherals (Software Nodes):
i86pc
scsi_vhci, instance #0
isa, instance #0
asy (driver not attached)
pit_beep, instance #0
pci, instance #0
pci8086,7270, instance #0
display, instance #0
pci8086,7270 (driver not attached)
pci8086,27a3 (driver not attached)
pci8384,7680 (driver not attached)
pci8086,27d0, instance #0
pci11ab,5321, instance #0 <=== ドライバがアタッチされています
pci8086,27d2, instance #1
pci106b,86 (driver not attached)
pci8086,7270, instance #0
mouse, instance #0
device, instance #2
keyboard, instance #4
mouse, instance #5
input, instance #6
ドライバをデバイスと関連付ける方法として、”update_drv” というコマンドが用意されているようです.Atheros のドライバは上記の Apple のAirPort デバイス “pci106b,86” には 結び付けられていないので、下記のコマンドを実行して下さい.
#update_drv -a -i ‘”pci106b,86″‘ ath