HOME / コンピュータTips / Solaris / Linux UserのためのOpenSolaris入門 / デバイスを認識する

Date: 2010/01/30 |  このエントリーをはてなブックマークに追加  |  Tags: OpenSolaris, OpenSolarisOS, pkg, IPS

NICを認識する

NICがない!Wifiがない!Soundがない!などなど。

HCL、Hardware Compatibility List(動作確認ハードウェア)は、Oracleのサイトから参照することができます。HCLに掲載されているハードウェアならばトラブルはないと考えられます。

  • http://www.sun.com/bigadmin/hcl/data/os/

しかし、実際にはもってるパソコンやPCサーバにOpenSolarisを入れる事も多くあるでしょう。そうなると、デバイスをどう認識させるかは、一つめの壁だといえます。

ここでは、NICの認識に触れたいと思います。

LinuxでNICを差し込んで認識しているか、どうかは次の様に行っていたりするでしょう。

  • いきなり、ifconfig -aしてみる
  • dmesgをみて探す
  • /var/log/messageをみて探す
  • ls -l /proc/でそれっぽいものを探す
  • lspci
  • lsusb(USB Ether/USB Wifiなどなら)

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
eIPがついてリンクが上がっているifconfig ether名 up等

a. デバイスをOSが認識している

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です。

b. デバイスにドライバをattachできている

デバイスにドライバを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を検索すると、

  • http://www.pcidatabase.com/

こんな結果がでます。

Vendor IdVendor Name
0x104DSony 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 IdVendor Name
0x11ABMarvell Semiconductor

であることがわかりました。

ついでにデバイス名を4380で検索してみると、

Device IdChip DescriptionVendor IdVendor Name
0x4380Marvell Yukon 88E8057 PCI-E Gigabit Ethernet Controller0x11ABMarvell Semiconductor

MarvelのYukonであることがわかりました。

MarvelのYukonのドライバは(ググるとすぐに出てくると思いますが)、Marvel自体がリリースしているドライバ、有名な村山さんのドライバがあります。

  • 村山さんのサイト
    • http://homepage2.nifty.com/mrym3/taiyodo/eng/

ここにある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されているのが分かるはずです。

c. デバイスがきちんと動作している

実は、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

d. デバイスがplumbされている

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にはこれに該当するものはありません(多分)。

e. IPがついてリンクが上がっている

IPアドレスがつき、同一セグメントと接続できる状態です。

あとはほとんど、Linuxと同じでしょう。