HOME / コンピュータTips / Solaris / Linux UserのためのOpenSolaris入門 / デバイスを認識する
Date: 2010/01/30 | | Tags: OpenSolaris, OpenSolarisOS, pkg, IPS
NICがない!Wifiがない!Soundがない!などなど。
HCL、Hardware Compatibility List(動作確認ハードウェア)は、Oracleのサイトから参照することができます。HCLに掲載されているハードウェアならばトラブルはないと考えられます。
しかし、実際にはもってるパソコンやPCサーバにOpenSolarisを入れる事も多くあるでしょう。そうなると、デバイスをどう認識させるかは、一つめの壁だといえます。
ここでは、NICの認識に触れたいと思います。
LinuxでNICを差し込んで認識しているか、どうかは次の様に行っていたりするでしょう。
Linuxの場合、たいていはifconfig -aで出てきますから、OpenSolarisで、まずNICがない!と唸る人は多いようです。
実は、OpenSolarisがifconfigでIPがちゃんと振られているまでの状態には、次のステートがあります。
優先LANの場合
- | 状態 | 入力すべきコマンド |
a | デバイスをOSが認識している | prtconf -D,prtconf -vD,scanpci,cfgadm -l,isainfo -v,smbios |
b | デバイスにドライバをattachできている | prtconf -v,prtconf -vD |
c | デバイスがきちんと動作している | dladm show-ether,dladm show-wifi,dladm show-dev(Solarisの場合) |
d | デバイスがplumbされている | ifconfig ether名 plumb |
e | IPがついてリンクが上がっている | ifconfig ether名 up等 |
USBのように活線挿抜できるデバイスなら、tail -f /var/adm/message(Linuxの/var/log/messageに相当)で見ていると、ログが出力されます。
prtconf -Dしてみて、デバイスに何もデバイスドライバがアタッチされていなかったり、USBデバイスならusb_mid等、manで見ても、特別、特定のハードに結びつかないデバイスがattachされています。
このようなときは、OSはデバイスを見つけてはいますが、ロードすべきモジュールが分からない状態です。
例)
prtconf -D
出力
System Configuration: Sun Microsystems i86pc Memory size: 8127 Megabytes System Peripherals (Software Nodes):
i86pc (driver name: rootnex) scsi_vhci, instance #0 (driver name: scsi_vhci) isa, instance #0 (driver name: isa)
motherboardi8042, instance #0 (driver name: i8042)keyboard, instance #0 (driver name: kb8042)mouse, instance #0 (driver name: mouse8042)pit_beep, instance #0 (driver name: pit_beep)
pci, instance #0 (driver name: npe)
pci17aa,20b1, instance #0 (driver name: agptarget)pci8086,2a01, instance #0 (driver name: pcie_pci)display, instance #0 (driver name: nvidia)pci17aa,20b9, instance #0 (driver name: e1000g)pci17aa,20aa, instance #0 (driver name: uhci)device, instance #1 (driver name: usb_mid)pci17aa,20aa, instance #1 (driver name: uhci)pci17aa,20ab, instance #0 (driver name: ehci)pci17aa,20ac, instance #0 (driver name: audiohd)pci8086,283f, instance #1 (driver name: pcie_pci)pci8086,2841, instance #2 (driver name: pcie_pci)pci8086,1113, instance #0 (driver name: iwk)pci8086,2843, instance #3 (driver name: pcie_pci)pci8086,2845, instance #4 (driver name: pcie_pci)pci8086,2847, instance #5 (driver name: pcie_pci)pci17aa,20aa, instance #2 (driver name: uhci)pci17aa,20aa, instance #3 (driver name: uhci)pci17aa,20aa, instance #4 (driver name: uhci)pci17aa,20ab, instance #1 (driver name: ehci)pci8086,2448, instance #0 (driver name: pci_pci)pci17aa,20c6, instance #0 (driver name: pcic)pcs, instance #0 (driver name: pcs)pci17aa,20c7, instance #0 (driver name: hci1394)pci17aa,20b6pci-ide, instance #0 (driver name: pci-ide)ide, instance #0 (driver name: ata)cmdk, instance #0 (driver name: cmdk)ide (driver name: ata)pci17aa,20a7, instance #0 (driver name: ahci)disk, instance #0 (driver name: sd)pci17aa,20a9
iscsi, instance #0 (driver name: iscsi) pseudo, instance #0 (driver name: pseudo) agpgart, instance #0 (driver name: agpgart) options, instance #0 (driver name: options) xsvc, instance #0 (driver name: xsvc) used-resources cpus, instance #0 (driver name: cpunex)
cpu, instance #0 (driver name: cpudrv)cpu, instance #1 (driver name: cpudrv)
例2)
pfexec scanpci
出力
pci bus 0x0000 cardnum 0x00 function 0x00: vendor 0x8086 device 0x2a00 Intel Corporation Mobile PM965/GM965/GL960 Memory Controller Hub pci bus 0x0000 cardnum 0x01 function 0x00: vendor 0x8086 device 0x2a01 Intel Corporation Mobile PM965/GM965/GL960 PCI Express Root Port pci bus 0x0000 cardnum 0x19 function 0x00: vendor 0x8086 device 0x1049 Intel Corporation 82566MM Gigabit Network Connection pci bus 0x0000 cardnum 0x1a function 0x00: vendor 0x8086 device 0x2834 Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #4 pci bus 0x0000 cardnum 0x1a function 0x01: vendor 0x8086 device 0x2835 Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #5 pci bus 0x0000 cardnum 0x1a function 0x07: vendor 0x8086 device 0x283a Intel Corporation 82801H (ICH8 Family) USB2 EHCI Controller #2 pci bus 0x0000 cardnum 0x1b function 0x00: vendor 0x8086 device 0x284b Intel Corporation 82801H (ICH8 Family) HD Audio Controller pci bus 0x0000 cardnum 0x1c function 0x00: vendor 0x8086 device 0x283f Intel Corporation 82801H (ICH8 Family) PCI Express Port 1 pci bus 0x0000 cardnum 0x1c function 0x01: vendor 0x8086 device 0x2841 Intel Corporation 82801H (ICH8 Family) PCI Express Port 2 pci bus 0x0000 cardnum 0x1c function 0x02: vendor 0x8086 device 0x2843 Intel Corporation 82801H (ICH8 Family) PCI Express Port 3 pci bus 0x0000 cardnum 0x1c function 0x03: vendor 0x8086 device 0x2845 Intel Corporation 82801H (ICH8 Family) PCI Express Port 4 pci bus 0x0000 cardnum 0x1c function 0x04: vendor 0x8086 device 0x2847 Intel Corporation 82801H (ICH8 Family) PCI Express Port 5 pci bus 0x0000 cardnum 0x1d function 0x00: vendor 0x8086 device 0x2830 Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #1 pci bus 0x0000 cardnum 0x1d function 0x01: vendor 0x8086 device 0x2831 Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #2 pci bus 0x0000 cardnum 0x1d function 0x02: vendor 0x8086 device 0x2832 Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #3 pci bus 0x0000 cardnum 0x1d function 0x07: vendor 0x8086 device 0x2836 Intel Corporation 82801H (ICH8 Family) USB2 EHCI Controller #1 pci bus 0x0000 cardnum 0x1e function 0x00: vendor 0x8086 device 0x2448 Intel Corporation 82801 Mobile PCI Bridge pci bus 0x0000 cardnum 0x1f function 0x00: vendor 0x8086 device 0x2811 Intel Corporation 82801HBM (ICH8M-E) LPC Interface Controller pci bus 0x0000 cardnum 0x1f function 0x01: vendor 0x8086 device 0x2850 Intel Corporation 82801HBM/HEM (ICH8M/ICH8M-E) IDE Controller pci bus 0x0000 cardnum 0x1f function 0x02: vendor 0x8086 device 0x2829 Intel Corporation 82801HBM/HEM (ICH8M/ICH8M-E) SATA AHCI Controller pci bus 0x0000 cardnum 0x1f function 0x03: vendor 0x8086 device 0x283e Intel Corporation 82801H (ICH8 Family) SMBus Controller pci bus 0x0001 cardnum 0x00 function 0x00: vendor 0x10de device 0x0429 nVidia Corporation Quadro NVS 140M pci bus 0x0003 cardnum 0x00 function 0x00: vendor 0x8086 device 0x4230 Intel Corporation PRO/Wireless 4965 AG or AGN [Kedron] Network Connection pci bus 0x0015 cardnum 0x00 function 0x00: vendor 0x1180 device 0x0476 Ricoh Co Ltd RL5c476 II pci bus 0x0015 cardnum 0x00 function 0x01: vendor 0x1180 device 0x0832 Ricoh Co Ltd R5C832 IEEE 1394 Controller
このノートPCは、Lenovo Thinkpad T61(7662A14)なのですが、OpenSolarisには割とベストヒットするノートPCです。
デバイスにドライバをattachできているものは、prtconf -Dで当該デバイスに、
(driver name: デバイスドライバ名)
と、記載された物があります。
無い場合、「サポートされていない」とも考えられるのですが、ドライバはあるのにデバイスが新しすぎてドライバがそのデバイスのことを知らないだけであったり(ただし互換モードはある)、実は違う物であるとハードウェアが主張しているが同じ物であったりすることもあります。
これは、NICを認識しなかった、とあるノートPCで、prtconf -vDした結果の抜粋です。
pci104d,9039 Hardware properties: name='acpi-namespace' type=string items=1 value='\_SB_.PCI0.RP01.MLAN' name='assigned-addresses' type=int items=10 value=83010010.00000000.93100000.00000000.00004000.81010018.00000000.00004000.00000000.00000100 name='reg' type=int items=15 value=00010000.00000000.00000000.00000000.00000000.03010010.00000000.00000000.00000000.00004000.01010018.00000000.00000000.00000000.00000100 name='compatible' type=string items=13 value='pciex11ab,4380.104d.9039.10' + 'pciex11ab,4380.104d.9039' + 'pciex11ab,4380.10' + 'pciex11ab,4380' + 'pciexclass,020000' + 'pciexclass,0200' + 'pci11ab,4380.104d.9039.10' + 'pci11ab,4380.104d.9039' + 'pci104d,9039' + 'pci11ab,4380.10' + 'pci11ab,4380' + 'pciclass,020000' + 'pciclass,0200' name='model' type=string items=1 value='Ethernet controller' name='power-consumption' type=int items=2 value=00000001.00000001 name='devsel-speed' type=int items=1 value=00000000 name='interrupts' type=int items=1 value=00000001 name='subsystem-vendor-id' type=int items=1 value=0000104d name='subsystem-id' type=int items=1 value=00009039 name='unit-address' type=string items=1 value='0' name='class-code' type=int items=1 value=00020000 name='revision-id' type=int items=1 value=00000010 name='vendor-id' type=int items=1 value=000011ab name='device-id' type=int items=1 value=00004380
これを抜粋ができた理由は、Ethernetで検索した結果、ここに検索ヒットしたからです。
name='model' type=string items=1 value='Ethernet controller'
最初に注目すべき点は、この部分です。
pci104d,9039 ^^^^^^^^^^^^^^^ここにdriver nameでアタッチしたデバイスがない。
つまりpci104d,9039は、OSはデバイスを認識しているが、デバイスドライバをアタッチできていない状態を意味します。
ここにデバイスをattachするには、add_drv、update_drvを利用します。
先ずこれが何かを調べないとなりません。
pci104d,9039という名前から分かることはPCIのベンダIDが104D、デバイスIDが9039であることです。
たとえば、こういうところで、104Dを検索すると、
こんな結果がでます。
Vendor Id | Vendor Name |
0x104D | Sony Corporation |
実はノートPCがSONY製だからです。
これは機種固有の番号なので、互換性のあるドライバを見つけるためには、実際に搭載しているNICのチップを知る必要があります。
そこで注目すべきなのは、prtconf -vDの次の行です。
name='compatible' type=string items=13 value='pciex11ab,4380.104d.9039.10' + 'pciex11ab,4380.104d.9039' + 'pciex11ab,4380.10' + 'pciex11ab,4380' + 'pciexclass,020000' + 'pciexclass,0200' + 'pci11ab,4380.104d.9039.10' + 'pci11ab,4380.104d.9039' + 'pci104d,9039' + 'pci11ab,4380.10' + 'pci11ab,4380' + 'pciclass,020000' + 'pciclass,0200'
このエントリはこのハードウェアが、実はこれらの機械と同じだよと申告しています。ですから互換性が高い物順で、列挙されています。Solarisではこの名前は、/etc/drivers_aliasに登録されています。後ろに行くほど互換モード的な動きになることがあります。
(余談)
USBデバイスなどではusb_midというドライバを示すID=usb,deviceが必ず書いてあります。usb_midはmanで検索すると分かりますが、
usb_mid - USB Multi Interface Driver
つまり超標準的な低位ドライバです。
システムはこのcompatibleを順に/etc/driver_aliasから探しだし、結果、無かったためにドライバを見つけられない状態になっています。ですから、Compatible行の何かのドライバが分かり、drivers_aliasに追加できればよいのです。
先頭は、pciex11ab,4380.*なので、ベンダーID、11abを先ほどのサイトで検索します。
Vendor Id | Vendor Name |
0x11AB | Marvell Semiconductor |
であることがわかりました。
ついでにデバイス名を4380で検索してみると、
Device Id | Chip Description | Vendor Id | Vendor Name |
0x4380 | Marvell Yukon 88E8057 PCI-E Gigabit Ethernet Controller | 0x11AB | Marvell Semiconductor |
MarvelのYukonであることがわかりました。
MarvelのYukonのドライバは(ググるとすぐに出てくると思いますが)、Marvel自体がリリースしているドライバ、有名な村山さんのドライバがあります。
ここにあるmykドライバあたりが使えるのではないかと想像できます。
OpenSolarisでは、NICドライバは下記の位置にあります。
アーキテクチャ | ドライバ格納場所 |
i386(32bit) | /kernel/drv/ |
amd64(64bit) | /kernel/drv/amd64/ |
ここで知らなくてはいけないのは、自分のマシンが64bitで動作しているのか、32bitで動作しているのかです。Linuxの場合、基本的には64bitのディストリビューションは全てのバイナリが64bitで、32bitならば全てが32bitです。
OpenSolarisは、64bitに対応しているCPUの場合、自動的に64bitカーネルが読み込まれますが、32bitのプログラムも問題なく動作します。したがってほとんどのユーザランドのプログラムは32bitでコンパイルされており、概ね64ビットで起動した方が早いものだけが64ビットでコンパイルされています。
注意しなくてはならないのは、64bit対応カーネルでは32bitと64bitの両方のドライバがいるということです。
自分がどのようなモードで起動したいか知るためには、Linuxではdmesgをみたり、/proc/cpu等を見るなどが多いですが、OpenSolarisでは大体コマンドで問い合わせます。
コマンド
isainfo -v
出力
64-bit amd64 applications
ssse3 cx16 mon sse3 sse2 sse fxsr mmx cmov amd_sysc cx8 tsc fpu
32-bit i386 applications
ssse3 ahf cx16 mon sse3 sse2 sse fxsr mmx cmov sep cx8 tsc fpu
この命令で、このCPUがどんな命令が実行できるのか分かると思います。
さて、村山さんのドライバをコンパイルし直してもよいですが、コンパイル後の物も添付されています。
file i386/myk
i386/myk: ELF 32-ビット LSB 再配置可能 80386 バージョン 1
file amd64/myk
amd64/myk: ELF 64-ビット LSB 再配置可能 AMD64 バージョン 1
この2つを当該ディレクトリにコピーします。
pfexec cp i386/myk /kernel/drv/ pfexec cp amd64/myk /kernel/drv/amd64/
permissionを変更しておきます。
chmod root:sys /kernel/drv/myk /kernel/drv/amd64/myk chmod 755 /kernel/drv/myk /kernel/drv/amd64/myk
ドライバを追加します。
/usr/sbin/add_drv -n -v -i "pciex11ab,4380" myk
もし、すでにmykドライバをインストール後であるなら、次の様に追加できます。
/usr/sbin/update_drv -a -v -i "pciex11ab,4380" myk
grep myk /etc/drivers_alias
myk pciex11ab,4380
リブートが必要がないドライバの場合、
prtconf -D
で、mykがattachされているのが分かるはずです。
実は、Linuxには多分このステートがありません。Linuxの場合、この状態にまでなっていれば、モジュールは勝手にロードされており(modinfoで確認可能、Linuxでいうlsmod)、
ifconfig -a
とやれば出てきます。
OpenSolarisには、そのNICをどのように使うのか?(束ねて使う、non global zoneに渡す、仮想マシンに渡す、別名で使う等々)というレイヤーがあるため、IPとNICをバインドするifconfigよりも手前の層があります。
これにはdladm(多分Datalink Adm)を利用します。
有線の一覧を取りたい場合、
dladm show-ether
LINK PTYPE STATE AUTO SPEED-DUPLEX PAUSE e1000g0 current up yes 100M-f bi
Wifiの場合、このようにします。
dladm show-wifi
LINK STATUS ESSID SEC STRENGTH MODE SPEED iwk0 disconnected -- -- -- -- --
OpenSolarisはデフォルトでNetwork AutoMagicという名前のネットワークを自動設定するDaemonが起動しています。この場合この状態にまでなっていれば、自動的に、DHCPなどで値を取ってくるはずです。
ただ、サーバ的な使い方をする場合、固定IPアドレスの指定が必要です。固定の場合NWAMでも設定はできるのですが、従来の設定方法が無難です。
その場合、次のようにnwamを停止します
pfexec svcadm disable -s svc:/network/physical:nwam
そして従来の物を起動します。
pfexec svcadm enable -s svc:/network/physical:default
ifconfig -aで、デバイスが出力される状態です。
ifconfig -a
lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1
inet 127.0.0.1 netmask ff000000
vnet0: flags=1100863<UP,BROADCAST,NOTRAILERS,RUNNING,MULTICAST,ROUTER,IPv4> mtu 9000 index 2
inet 192.168.199.1 netmask ffffff00 broadcast 192.168.199.255
e1000g0: flags=1104843<UP,BROADCAST,RUNNING,MULTICAST,DHCP,ROUTER,IPv4> mtu 1500 index 8
inet 172.29.241.50 netmask ffffff00 broadcast 172.29.241.255
myk0: flags=1100842<BROADCAST,RUNNING,MULTICAST,ROUTER,IPv4> mtu 9000 index 9 inet 0.0.0.0 netmask 0 lo0: flags=2002000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv6,VIRTUAL> mtu 8252 index 1
inet6 ::1/128
dladm show-etherでNICが出力されているにも関わらず、ifconfig -aでも出てこない場合、
pfexec ifconfig ether名 plumb
と行います。
ifconfigから見えなくするためには、次の様に行います。
pfexec ifconfig ether名 unplumb
MACアドレスはifconfigではroot権をもっていない限り出てきません
pfexec ifconfig e1000g0
例
e1000g0: flags=1104843<UP,BROADCAST,RUNNING,MULTICAST,DHCP,ROUTER,IPv4> mtu 1500 index 8
inet 172.29.241.50 netmask ffffff00 broadcast 172.29.241.255ether 0:1e:xx:xx:xx:xx
また、linuxのifconfigは、オプションを付けない場合、リンクが上がっている全てのものを出力しますが、OpenSolarisにはこれに該当するものはありません(多分)。
IPアドレスがつき、同一セグメントと接続できる状態です。
あとはほとんど、Linuxと同じでしょう。