MIRACLE
メールサービス申込 ユーザー登録 パートナー情報
お問い合わせ FAQ サイトマップ
MIRACLE LINUXの特長 製品紹介 サービス案内 購入 サポート 技術フォーラム

2006年7月27日 (木)

2進数と10進数の区別

最近、Linuxに関連するドキュメントなどで、KiBとかGiBといった単位を目にする機会が増えてきました。
詳細については、このあたりのドキュメントが詳しいのですが、ギガやテラといった桁になると、2進数での計算結果と、10進数での計算結果の差が大きくなるので明確に使い分けなければ、大きな誤解を招くことになるために、2進数用の単位としてKiBやGiBを使うことが一般的になりつつあるようです。

HDDは100ギガバイトですが、メモリは1ギビバイトというべきみたいです。
みなさんも「キロ、メガ、ギガ、テラ、ペタ」を覚えたら、「キビ、メビ、ギビ、テビ、ペビ」を覚えて使いこなしてみてはいかがでしょうか。

何も知らない人が聞くと、どれも呪文のようですね。

2006年7月20日 (木)

ログイン時のサウンド

みなさんはMIRACLE LINUX V4.0のログイン時のサウンドって聞いたことがありますか?

実を言うと、私は、今日、初めて聞きました。
なにしろ社内にあるのはサーバーばかりで、サウンドカードもスピーカーも付いていないマシンばかりなのです。
風の噂でログインサウンドが鳴るというのは知っていたのですが、実際のサウンドは初めてでした。偶然、ヘッドフォンをつないでいて気づきました。

このサウンドを作ったのは我が社ではなく、多分RedFlag社だと思いますが、なかなかいけています。3社でAsianuxを共同開発しているのでお互いの得意分野を活かすという部分の一端ですね。

ちなみに簡単に聞く方法としては、Windows上のVMwareにML40をインストールして、VMwareのサウンドも有効にしておくことです。startxするとサウンドが聞こえてきます。
ぜひお試しあれ。

2006年7月 2日 (日)

タブの描きかた

昨日ダンプ解析ネタを書いてしまったので、とびとびになってしまいましたが、
書き貯めていた続きを掲載しておきます。

 

--- ここから ---

ただ、そのままOpenMotifの処理を単にデバッグしても、グラフィックとしてはバッファリングされながら描画されるので、どのコードが、どの処理か分かりにくいものです。

そこで、XFlush()という、バッファリングされているデータを画面に描画する命令をTabBox.cのコードの至るところに追加した特別版のライブラリを利用しながら、どのようにタブが描かれていくのか見てみたいと思います。

まず、タブが他のウィンドウに隠された状態です。

Tab2_1

次にタブが表に表示された瞬間、これまで隠されていた部分はまだ描画されていない状態です。

Tab3

さあ、ここからタブの描画が始まります。ここからは、gdbで追いかけながら確認したDrawTab()の流れです。

まず最初にタブの枠を描きます。今回は、タブのスタイルとして、BeveledTabと呼ばれる形なので、FillBeveledTab()が呼ばれます。

-----

    case XmTABS_BEVELED:
        FillBeveledTab(tab, tab->manager.background_GC, geometry, edge);
        break;

-----

この中では、次のようにタブの6つの座標を計算しています。

-----

    case XmTAB_EDGE_BOTTOM_RIGHT:
        if( XmTabBox_orientation(tab) == XmHORIZONTAL )
        {
            pt[0].x = x;
            pt[0].y = y + height;
            pt[1].x = x;
            pt[1].y = y + side;
            pt[2].x = x + side;
            pt[2].y = y;
            pt[3].x = x + width - side;
            pt[3].y = y;
            pt[4].x = x + width;
            pt[4].y = y + side;
            pt[5].x = x + width;
            pt[5].y = y + height;
-----

そしてこれらの座標を埋めるべくXFillPolygon()でタブを描きます。

-----

    XFillPolygon(XtDisplay(tab), XiCanvas(tab), gc, pt, 6, Nonconvex,
                 CoordModeOrigin);
-----

これでタブの大枠の形が描かれます。

Tab4


次にタブの周りの影を描きます。影を描くのは、DrawBeveledShadows()です。

-----
   case XmTABS_BEVELED:
        DrawBeveledShadows(tab, info, geometry, selected, edge,
                           shadow_thickness);
        break;
-----

まず最初に直線部分の影をDrawSegments()で描きます。

-----

    DrawSegments(tab, info, geometry, edge, size, shadow, selected);
-----

Tab5


次に、タブの上側の両方の角を描きます。このときには、斜めの線を描くために、斜めの四角形を描いて、影に見せます。

-----

            pt[0].x = geometry->x;
            pt[0].y = geometry->y + size;
            pt[1].x = geometry->x + size;
            pt[1].y = geometry->y;
            pt[2].x = geometry->x + size;
            pt[2].y = geometry->y + shadow;
            pt[3].x = geometry->x + shadow;
            pt[3].y = geometry->y + size;
            XFillPolygon(XtDisplay(tab), XiCanvas(tab),
                         tab->manager.top_shadow_GC,
                         pt, 4, Convex, CoordModeOrigin);
-----

Tab6

この画像では、左上の影が描かれています。この後、右上の角の影も描くと、タブの形は完成です。

続いてタブ内の文字を描きます。

-----

    case XmTABS_RIGHT_TO_LEFT:
        DrawRightToLeftTab(tab, info, gc, have_pixmap, pix_width, pix_height,
                           pix_depth, have_label, label_width, label_height,
                           clip, selected);
        break;
-----

Tab8

そして最後に、このタブを選択していることを表すボーダーラインを描きます。
-----
    if( keyboard && Prim_HaveTraversal(XmTabBox__canvas(tab)) )
    {
        BorderHighlight(XmTabBox__canvas(tab));
    }
-----
このタブが選択されている時だけ、keyboardが真になり、BorderHighlight()により四角い線が描かれます。
Tab9

通常はここまでの処理をメモリ上に描き終わったあとに、XFlush()で画面に表示します。


このように、一見複雑そうなタブの描画ですが、内部的には、タブを構成する一箇所ずつを描いていき、最終的なタブの形を仕上げているということで、コードを読んでみるとなかなか面白いですね。

2006年6月30日 (金)

タブをつくる

タブと聞くとあなたは、「4文字スペース空けるやつ」と、「GUIのウィンドウを構成するパーツで、FireFoxとかのタブブラウザみたいなもの」のどちらをイメージしますか?
私はどちらかというと「スペース空けるやつ」をイメージする側ですが、今日は、GUI側のお話です。
X WindowでGUIを構成するときに利用されるOpenMotifでもタブを使うことができます。
-----
$ man XmTabStack
XmTabStack(3X)                                                 XmTabStack(3X)

NAME
       XmTabStack - The TabStack widget class

SYNOPSIS
       #include <Xm/TabStack.h>

DESCRIPTION
       The  XmTabStack  widget  manages a group of widgets such that only one
       widget in the group is visible at a time.  Each  child  is  associated
       with  a "tab" that displays a text label and/or a pixmap. By selecting
       the "tab" the user interactively determines which child is  displayed.
       This widget exhibits behavior similar to the Microsoft Windows(TM) Tab
       Control.
....
-----
といった形で説明があります。

普通の開発者の立場だと、このウィジェットを利用して、いろいろなGUIのコンポーネントを作成すると思います。
ですが、今日はちょっと視点を変えて、このタブがOpenMotifの中でどのように作られているのか見てみたいと思います。

タブを使うと、このようなGUIのウィンドウを作ることができます。

Tab1_2

タブの表示に関わっているのは、OpenMotifのlib/Xm/TabStack.c、TabBox.cのあたりのソースです。
TabStack.cは、タブのパーツのうち、下半分の表示を担っています。

そして、今日のメインは、TabBox.cで、このソースが、タブの切り替えに使う上半分のタブの部分の処理を行っています。

X Windowでは、隠されていたウィンドウが前面に出されて表示されるとき、Exposeというイベントが発生します。

TabBox.cでは、それぞれのイベントが発生したときに呼び出される関数が定義されていますが、そのうちexposeイベントには、"Redisplay()"という関数が定義されています。

------

    /* destroy            */    NULL,
    /* resize             */    NULL,
    /* expose             */    Redisplay,
    /* set_values         */    NULL,
    /* set values hook    */    NULL,
-------

つまり、ウィンドウの再描画は、このRedisplay()で行われているということが分かりますので、Redisplay()を見ていくことにします。

で、早速、Redisplay()の動作をおおざっぱに書くと、

------
Redisplay()
  ->   Redisplaytabs()
     ->       DrawTab()

------

となっていることが分かります。

RedisplayTabs()の中を見てみると、次のようになっています。

-----

    geom = XmTabBox__actual(tab);
    for( i = 0; i < count; ++i )
    {
        if( XiRectInRegion(region, geom[i].x, geom[i].y, geom[i].width,
                           geom[i].height) )
        {
            info = _XmTabbedStackListGet(XmTabBox_tab_list(tab), i);

            DrawTab(tab, info, &(geom[i]),
                    (Boolean)(XmTabBox__selected(tab) == i),
                    (Boolean)(XmTabBox__keyboard(tab) == i));
        }
    }
-----

countには、タブが何個あるか入っています。つまりfor文で、タブの数だけループをまわして、それぞれのタブに対して、DrawTab()を呼び出しているのです。

ただし注意点として、DrawTab()を呼び出す前に、XiRectInRegion()で、そのタブが、再描画の必要な領域にあるかどうか確認しています。
なので、もともと他のウィンドウに隠されていなかったタブに関しては、改めて再描画はされないということです。

次回は、実際のDrawTab()の処理を見てみたいと思います。

2006年6月29日 (木)

1度だけboot

かつてブートローダとしてliloが主流だったころ、カーネルのテストをするときには、"lilo -R"にお世話になりました。-Rオプションを付けると、次の再起動の1度だけ指定したカーネルで立ち上げることができますが、lilo.confは変更しなくて良いので、便利なコマンドでした。

MIRACLE V4.0で同じようなことをしたいとき、例えばGRUBの2つ目のエントリ(0,1,2,3,...の1に相当)のカーネルで起動したいときは、次のようにします。
# grub
grub> savedefault --default=1 --once

あと、起動に失敗した時に備えて、kernelオプションに、"panic=10"などを付け加えておくと、panicしたときに勝手に元のカーネルで再起動してくれて便利です。

2006年6月26日 (月)

カーネルアップデート危機一発

最近はkernelパッケージをアップデートすると、カーネルがインストールされ、GRUBの設定が更新され、さらにはデフォルトの起動カーネルまで変更されます。
あれは昔、MIRACLE V2.0の頃の手順といえば、
1. kernelパッケージをinstall
2. lilo.confを手動で書き換え
3. /sbin/liloを実行
という手順が必要で、3を忘れた日には新しいカーネルで立ち上がらず「撃沈!」な場面に遭遇することがありました。rpmのオプションで-Uvhなどで完全に置き換えてしまった日には、とても悲しい出来事となったりもしました。

それでは最近のkernelパッケージはどこが変わったんでしょうか? 実際にkernelパッケージをインストールした時に、何が行われているか見てみましょう。
で、いきなりですかkernelパッケージのインストールスクリプトの内容を見てみます。
-----
# rpm -q --scripts kernel
preinstall scriptlet (using /bin/sh):
/sbin/modprobe loop 2> /dev/null > /dev/null  || :
exit 0
postinstall scriptlet (using /bin/sh):
[ -x /usr/sbin/module_upgrade ] && /usr/sbin/module_upgrade
[ -x /sbin/new-kernel-pkg ] && /sbin/new-kernel-pkg --package kernel --mkinitrd --depmod --install 2.6.9-11.19AX
preuninstall scriptlet (using /bin/sh):
/sbin/modprobe loop 2> /dev/null > /dev/null  || :
[ -x /sbin/new-kernel-pkg ] && /sbin/new-kernel-pkg --rminitrd --rmmoddep --remove 2.6.9-11.19AX
-----
中身を整理すると、pre, post, preunの3箇所のスクリプトが設定されていることが分かります。
1. pre
   loopモジュールをmodprobeでロードしているだけのようです。
2. post, preun
   module_upgradeというコマンドとnew-kernel-pkgというコマンドを実行しています。

new-kernel-pkgでは、カーネルのバージョンが指定されていますので、カーネルのアップデートには、このコマンドが大きく関わっていそうです。こんなときには、迷わずfileコマンドです。
-----
# file /sbin/new-kernel-pkg
/sbin/new-kernel-pkg: Bourne-Again shell script text executable
-----
ラッキー! シェルスクリプトなら、いろいろ手間をかけずにそのまま読めてしまいます。思い立ったが吉日ということで、早速眺めてみます。
-----
install() {
    # XXX kernel should be able to be specified also (or work right on ia64)
    if [ ! -f $bootPrefix/$kernelName-$version ] ; then
        [ -n "$verbose" ] && echo "kernel for $version does not exist, not running grubby"
        return
    fi
...
----
さっそくinstall()から始まる関数があります。たぶんインストール時に実行されるのでしょう。
さらにinstall()の中を見ると...
------
    if [ -n "$cfgGrub" ]; then
        [ -n "$verbose" ] && echo "adding $version to $grubConfig"

        if [ -n "$banner" ]; then
            title="$banner ($version)"
        elif [ -f /etc/asianux-release ]; then
            title="$(sed 's/ release.*$//' < /etc/asianux-release) ($version)"
        else
            title="Asianux ($version)"
        fi
        /sbin/grubby --add-kernel=$bootPrefix/$kernelName-$version $INITRD    \
                     --copy-default $makedefault --title "$title"           \
                     --args="root=$rootdevice $kernargs"            \
                     --remove-kernel="TITLE=$title"
    else
        [ -n "$verbose" ] && echo "$grubConfig does not exist, not running grubby"
    fi
------
ということで、ConfigファイルがGrubだったら...の条件文がありました。この中で、grubbyというコマンドにたくさんのオプションを指定しています。どうやらこのgrubbyコマンドが重要な役割を担っているようです。

よく知らないコマンドが出てきたときには、manコマンド。これ常識ですね。

-----

$ man grubby

-----

をすると、

-----

GRUBBY(8)                                                           GRUBBY(8)

NAME
       grubby - command line tool for configuring grub, lilo, and elilo

SYNOPSIS
       grubby [--add-kernel=kernel-path] [--args=args]
              [--bad-image-okay] [--boot-filesystem=bootfs]
              [--bootloader-probe] [--config-file path]
              [--copy-default] [--default-kernel] [--grub]
              [--info=kernel-path] [--initrd=initrd-path]
              [--lilo] [--make-default] [-o path]
              [--remove-kernel=kernel-path]
              [--set-default=kernel-path] [--title=entry-title]

DESCRIPTION
       grubby  is a command line tool for updating and displaying information
       about the configuration files for the grub, lilo,  elilo  (ia64),  and
       yaboot  (powerpc)  boot  loaders.  It is primarily designed to be used
       from scripts which install new kernels and need  to  find  information
       about the current boot environment.
-----

最初の概要だけでも読んでみると... GRUBの設定を行うコマンドラインツールということみたいです。おそらくこのコマンドがGRUBの設定の更新とかを行っているみたいですね。

ということで、kernelパッケージのアップデートにはgrubbyコマンドが大きく関わっているということが分かりました。

あとは、manを読むなり、実際に実行してみるなりして、何をするコマンドか調べてみると良いでしょう。

2006年6月14日 (水)

initrdのその中へ

みなさん、Linuxを使っているとカーネルの入れ替えとかすると思います。
最近はブートローダは、GRUBが主流なので、/etc/grub.confを手で書き換えたりすることもありますよね。そのなかで、kernelといっしょにinitrdも設定しますが、これの中身を覗いたことありますか? 普段は、kernelパッケージのインストール時に自動的に作成されるので、気にする機会は少ないと思います。

しかし、カーネルの起動に失敗して、「/パーティションをmountできません... PANIC!」みたいなメッセージが出てくることがあります。このときには、initrdの中身が大きく関わってきますので、ちょっと覗いてみましょう。

まずは、initrdイメージを展開してみます。もちろんシステムを壊さないように、コピーしてからです。
----
# cd /tmp
# cp /boot/initrd-2.6.9-11.25AXsmp.img .
----

これがいったい何者か分かりませんので、そういったときにはfileコマンドの出番です。
----
# file initrd-2.6.9-11.25AXsmp.img
initrd-2.6.9-11.25AXsmp.img: gzip compressed data, from Unix, max compression
----

どうやらgzipで圧縮されたデータのようなので、解凍してみます。gzipの-dオプションは、ファイルの拡張子が.gzでないと受け付けてくれないので...
----
# mv initrd-2.6.9-11.25AXsmp.img initrd-2.6.9-11.25AXsmp.img.gz
# gzip -d initrd-2.6.9-11.25AXsmp.img.gz
----

さて、解凍したファイルをもういちどfileコマンドで調べてみます。
----
# file initrd-2.6.9-11.25AXsmp.img
initrd-2.6.9-11.25AXsmp.img: ASCII cpio archive (SVR4 with no CRC)
----

どうやら、cpioでまとめられたファイルのようなので、さらに展開します。
----
# mkdir img
# cd img
# cat ../initrd-2.6.9-11.25AXsmp.img | cpio -id
3689 blocks
----

ようやく中身が取り出せたので、ファイル一覧を見てみます。
----
# find .
.
./loopfs
./lib
./lib/jbd.ko
./lib/libata.ko
./lib/sd_mod.ko
./lib/qla2xxx.ko
./lib/qla6312.ko
./lib/qla2300.ko
./lib/scsi_mod.ko
./lib/ext3.ko
./lib/ata_piix.ko
./lib/qla2xxx_conf.ko
./sysroot
./dev
./dev/tty1
./dev/ram
./dev/tty2
./dev/systty
./dev/tty4
./dev/tty3
./dev/console
./dev/null
./bin
./bin/udevstart
./bin/modprobe
./bin/udev
./bin/nash
./bin/hotplug
./bin/insmod
./proc
./init
./sys
./sbin
./etc
./etc/udev
./etc/udev/udev.conf
----

今回のシステムでは、これだけのファイルが入っていました。
この中で注目は、initです。中身を見てみると...
----
#!/bin/nash

mount -t proc /proc /proc
setquiet
echo Mounted /proc filesystem
echo Mounting sysfs
mount -t sysfs none /sys
echo Creating /dev
mount -o mode=0755 -t tmpfs none /dev
mknod /dev/console c 5 1
mknod /dev/null c 1 3
mknod /dev/zero c 1 5
mkdir /dev/pts
mkdir /dev/shm
echo Starting udev
/sbin/udevstart
echo -n "/sbin/hotplug" > /proc/sys/kernel/hotplug
echo "Loading scsi_mod.ko module"
insmod /lib/scsi_mod.ko
echo "Loading sd_mod.ko module"
insmod /lib/sd_mod.ko
echo "Loading libata.ko module"
insmod /lib/libata.ko
echo "Loading ata_piix.ko module"
insmod /lib/ata_piix.ko
echo "Loading qla2xxx_conf.ko module"
insmod /lib/qla2xxx_conf.ko
echo "Loading qla2xxx.ko module"
insmod /lib/qla2xxx.ko ql2xmaxqdepth=16 qlport_down_retry=30 ql2xloginretrycount=30 ql2xfailover=1 ql2xlbType=1
echo "Loading qla2300.ko module"
insmod /lib/qla2300.ko
echo "Loading qla6312.ko module"
insmod /lib/qla6312.ko
echo "Loading jbd.ko module"
insmod /lib/jbd.ko
echo "Loading ext3.ko module"
insmod /lib/ext3.ko
echo "Loading ext3.ko module"
insmod /lib/ext3.ko
/sbin/udevstart
echo Creating root device
mkrootdev /dev/root
umount /sys
echo Mounting root filesystem
mount -o defaults --ro -t ext3 /dev/root /sysroot
mount -t tmpfs --bind /dev /sysroot/dev
echo Switching to new root
switchroot /sysroot
umount /initrd/dev
----

先頭が"#!/bin/nash"で始まっていますので、どうやらシェルスクリプトのようですね。そういえば、先ほど展開したファイルの中に、"/bin/nash"がありました。
さらに見ていくとscsi_modやata_piixなどいくつかのSCSIドライバを読み込んでいます。
そして最後に
----
echo Mounting root filesystem
mount -o defaults --ro -t ext3 /dev/root /sysroot
----
として、/パーティションをmountしています。そういえば、マシンの起動時に「Mounting root filesystem」のメッセージを見たことありませんか? あのメッセージはここだったんですね。
つまり、MIRACLE LINUXを起動すると、
1. initrd内のinitスクリプトが実行され
2. ディスクデバイスのドライバがロードされ
3. /パーティションがmount
されるということです。

なので、適切なデバイスドライバがinitrdに含まれていないと、/パーティションをマウントできないので、PANICしてしまうということです。

2006年6月 1日 (木)

ディスクの認識

MIRACLE LINUXがインストールできない時のほとんどは、ディスクを認識できないというパターンです。それでは、MIRACLE LINUXでのディスクの認識とはどのようになっているのでしょうか?

まずディスクを認識するためには、ディスクが接続されているデバイスを動かすためのデバイスドライバが必要になります。一般的にはSATA、SCSIなどのデバイスドライバが必要です。

このデバイスドライバは、OSが提供するものなので、OSの中にデバイスと、デバイスドライバを対応付けるデータがあります。そのデータというのが、/usr/share/hwdata/pcitableファイルです。
このファイルは、次のような形式になっています。
------------------------------
0x1028  0x0001  "aacraid"
0x1028  0x0002  "aacraid"
0x1028  0x0003  "aacraid"
0x1028  0x0004  "aacraid"
0x1028  0x000a  "aacraid"
0x1028  0x000e  "megaraid_mbox"
0x1028  0x000f  "megaraid_mbox"
----------------------------------------

このデータは、左側から、ベンダID、デバイスID、デバイスドライバのモジュール名を表しています。

OSは、システムに搭載されているデバイスの情報と一致するエントリを探し、必要なデバイスドライバを利用できるように設定します。
システムに搭載されているデバイスの情報は、lspciコマンドで取得します。
------
$ /sbin/lspci
00:00.0 Host bridge: Intel Corporation E7525 Memory Controller Hub (rev 0c)
00:02.0 PCI bridge: Intel Corporation E7525/E7520/E7320 PCI Express Port A (rev 0c)
00:03.0 PCI bridge: Intel Corporation E7525/E7520/E7320 PCI Express Port A1 (rev 0c)
00:04.0 PCI bridge: Intel Corporation E7525/E7520 PCI Express Port B (rev 0c)
00:1d.0 USB Controller: Intel Corporation 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #1 (rev 02)
00:1d.1 USB Controller: Intel Corporation 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #2 (rev 02)
00:1d.2 USB Controller: Intel Corporation 82801EB/ER (ICH5/ICH5R) USB UHCI #3 (rev 02)
00:1d.3 USB Controller: Intel Corporation 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #4 (rev 02)
00:1d.7 USB Controller: Intel Corporation 82801EB/ER (ICH5/ICH5R) USB2 EHCI Controller (rev 02)
00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev c2)
00:1f.0 ISA bridge: Intel Corporation 82801EB/ER (ICH5/ICH5R) LPC Interface Bridge (rev 02)
00:1f.2 IDE interface: Intel Corporation 82801EB (ICH5) SATA Controller (rev 02)

00:1f.3 SMBus: Intel Corporation 82801EB/ER (ICH5/ICH5R) SMBus Controller (rev 02)
01:00.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5721 Gigabit Ethernet PCI Express (rev 11)
02:00.0 PCI bridge: Intel Corporation 6700PXH PCI Express-to-PCI Bridge A (rev 09)
02:00.1 PIC: Intel Corporation 6700/6702PXH I/OxAPIC Interrupt Controller A (rev 09)
02:00.2 PCI bridge: Intel Corporation 6700PXH PCI Express-to-PCI Bridge B (rev 09)
02:00.3 PIC: Intel Corporation 6700PXH I/OxAPIC Interrupt Controller B (rev 09)
03:03.0 SCSI storage controller: Adaptec AIC-7902B U320 (rev 10)
03:03.1 SCSI storage controller: Adaptec AIC-7902B U320 (rev 10)
04:01.0 RAID bus controller: Adaptec AAC-RAID (rev 01)
06:04.0 VGA compatible controller: ATI Technologies Inc Radeon RV100 QY [Radeon 7000/VE]
------------

例えば、このRAIDコントローラがどのデバイスドライバで動くのか確認してみたいと思います。

-------

04:01.0 RAID bus controller: Adaptec AAC-RAID (rev 01)

-------

そこでlspci -nでベンダIDとデバイスIDを確認します。
------
$ /sbin/lspci -n
00:00.0 Class 0600: 8086:359e (rev 0c)
00:02.0 Class 0604: 8086:3595 (rev 0c)
00:03.0 Class 0604: 8086:3596 (rev 0c)
00:04.0 Class 0604: 8086:3597 (rev 0c)
00:1d.0 Class 0c03: 8086:24d2 (rev 02)
00:1d.1 Class 0c03: 8086:24d4 (rev 02)
00:1d.2 Class 0c03: 8086:24d7 (rev 02)
00:1d.3 Class 0c03: 8086:24de (rev 02)
00:1d.7 Class 0c03: 8086:24dd (rev 02)
00:1e.0 Class 0604: 8086:244e (rev c2)
00:1f.0 Class 0601: 8086:24d0 (rev 02)
00:1f.2 Class 0101: 8086:24d1 (rev 02)
00:1f.3 Class 0c05: 8086:24d3 (rev 02)
01:00.0 Class 0200: 14e4:1659 (rev 11)
02:00.0 Class 0604: 8086:0329 (rev 09)
02:00.1 Class 0800: 8086:0326 (rev 09)
02:00.2 Class 0604: 8086:032a (rev 09)
02:00.3 Class 0800: 8086:0327 (rev 09)
03:03.0 Class 0100: 9005:801d (rev 10)
03:03.1 Class 0100: 9005:801d (rev 10)
04:01.0 Class 0104: 9005:0285 (rev 01)
06:04.0 Class 0300: 1002:5159
-----

このうち、さきほどのRAIDコントローラは、一番左側の列のPCIのIDが一致するものを探します。すると、これが該当することが分かります。
-----
04:01.0 Class 0104: 9005:0285 (rev 01)
-----
つまり、ベンダID 9005、デバイス ID 0285であることが分かります。
これを、pcitableファイルのエントリから探すと、
-----
0x9005  0x0285  "aacraid"
-----

ということで、aacraidドライバが必要になるということが分かります。

ちなみに、このpcitableですが元々のベンダIDやデバイスIDの情報については、Linux PCI ID Repositoryより入手することができます。 そして各ディストリビューションは、対応ドライバを組み込む際に、ドライバ名をpcitableファイルに追加していくことになります。

会社情報 採用情報 個人情報保護方針 商標等取り扱い事項 English
Copyright(c)2000-2006 MIRACLE LINUX CORPORATION. All Rights Reserved.