Solaris10/OpenSolaris用ドライバアップデートディスクの作成方法
本ドキュメントは、Intel版 Solaris10/OpenSolaris用ドライバアップデートディスクの作成方法を解説します。 なお本ドキュメントの内容は、弊社で調査した結果をもとにしていますので、必ずしも正式な方法ではないことをご了承のうえ、参照してください。
作成環境
本ドキュメントで説明するドライバアップデートディスク(以降 DUと省略します)の作成にあたり、以下の環境を用いました。
- Intel版 Solaris10(U3) … Dell PESC1435(ドライバビルド環境)
- Intel版 Solaris10(U3) … VMware Workstation 5.5(ドライバディスクイメージファイル作成環境)
- CentOS4.4(x86) … VMware Workstation 5.5(ドライバディスク作成環境)
3つ目のCentOS4.4は、筆者が作業するうえで慣れている環境ということで用意していますので、実際には64bit版 Intel Solaris10が動作する環境1つのみでも、ドライバディスクを作成することは可能であると思います。
ドライバのソースコード
本ドキュメントでは、Dell PowerEdgeシリーズに搭載されているPERC5/i用 DU の作成方法を例に紹介します。 ドライバソースは、https://svn.itee.uq.edu.au/repo/mfi/ よりRevision 86を取得しました。 上記 URLより、
- Makefile
- mfi.c
- mfi.conf
- mfireg.h
- queue.h
- pkg/copyright
の6つのファイルを取得します。これらのファイルをmfi_rev86ディレクトリに取得し、tarコマンドでまとめておきます。
$ tar mfi_rev86.tar mfi_rev86
以降、このソースをもとにDUの作成方法について説明します。
ドライバのコンパイル
ドライバのソースコードをもとに、Solaris10環境上で、64bit版ドライバと32bit版ドライバをコンパイルします。 ドライバのコンパイルは、Sunより提供されているSun Studio11を利用します。
- Sun Studio11のダウンロードURL … http://jp.sun.com/products/software/tools/studio/
上記URLの「ソフトウェアの入手」より、Sun Studio11(studio11-sol-x86.tar.bz2)を入手し、Solaris10(sol10)にインストールします。
# mkdir /var/tmp/studio11 # cp studio11-sol-x86.tar.bz2 /var/tmp/studio11 # cd /var/tmp/studio11 # /usr/sfw/bin/gtar xfj studio11-sol-x86.tar.bz2 # ./installer
Sun Studio11は、/opt/SUNWspro/bin にインストールされます。
続いて、Sun Studio11のコンパイラを用いて、ドライバのソースをコンパイルします。
# bash # export PATH=/opt/SUNWspro/bin:/usr/ccs/bin:/usr/bin # cp mfi_rev86.tar /var/tmp/ # tar xfv mfi_rev86.tar # cd mfi_rev86
取得したmfiドライバ用のMakefileは、64bit版用ドライバの設定がしてありますので、makeコマンドで64bit版のドライバモジュールをビルドします。
# make
makeが無事に終了すると、「mfi」と名づけられたバイナリが作成されます。32bit版と区別するために、amd64ディレクトリにコピーしておきます。
# mkdir amd64 # cp mfi amd64/
続いて、32bit版用のmfiドライバを作成します。 まず64bit版用のドライバを削除します。
# rm mfi # rm mfi.o
続いて、32bit版用のドライバをmakeできるように、Makefileのルールを下記のように変更します。
[変更前]
mfi.o: mfi.c mfireg.h cc -D_KERNEL -xarch=amd64 -xmodel=kernel -errtags=yes -errwarn=%all -erroff=E_EMPTY_TRANSLATION_UNIT -erroff=E_STATEMENT_NOT_REACHED -c mfi.c
[変更後]
mfi.o: mfi.c mfireg.h cc -D_KERNEL -errtags=yes -errwarn=%all -erroff=E_EMPTY_TRANSLATION_UNIT -erroff=E_STATEMENT_NOT_REACHED -c mfi.c
makeコマンドで32bit用ドライバを作成します。
# make
作成した32bit用ドライバの実行ファイル「mfi」をx86ディレクトリにコピーしておきます。
# mkdir x86 # cp mfi x86/
ドライバパッケージの作成
64bit用ドライバと32bit用ドライバが作成できたら、ドライバパッケージを作成します。
本ドキュメントでは、osstech-mfiという名称でパッケージを作成することにします。
まず、パッケージに含むべきファイルを、/var/tmp/osstech-mfiディレクトリに用意していきます。
64bit用ドライバ、32bit用ドライバ、mfi.conf、copyrightを以下のディレクトリにコピーします。
# mkdir /var/tmp/osstech-mfi # mkdir -p /var/tmp/osstech-mfi/kernel/drv/amd64 # cp /var/tmp/mfi_rev86/amd64/mfi /var/tmp/osstech-mfi/kernel/drv/amd64 # cp /var/tmp/mfi_rev86/x86/mfi /var/tmp/osstech-mfi/kernel/drv # cp /var/tmp/mfi_rev86/mfi.conf /var/tmp/osstech-mfi/kernel/drv # cp /var/tmp/mfi_rev86/pkg/copyright /var/tmp/osstech-mfi/
なお、上記でコピーしているmfi.confの内容は空ファイルで問題ありません。
次にpostinstallファイルとpostremoveファイルを作成します。これは、パッケージの追加時、および削除時の追加処理を記述するシェルスクリプトです。
postinstallファイル、およびpostremoveファイルは次のような内容となります。
さらに下記のようにパッケージ情報を記載したpkginfoファイルを作成します。
PKG=osstech-mfi NAME=LSI Logic MegaRAID SAS Driver CATEGORY=system BASEDIR=/ ARCH=i86pc VERSION=0.1 CLASSES=none VENDOR=OSS Tech
postinstallファイルには、作成したドライバで稼動するPCIデバイスのデバイスIDを記載します。デバイスIDは、Linuxなど他のOSのドライバソースなどから確認することができます。今回作成したmfiドライバはLinuxではmegaraid_sasドライバに該当しますので、Linuxのmegaraid_sasドライバ内に記載されているPCIIDなどを参照します。
また、PCIIDレポジトリ(http://pciids.sourceforge.net/)で、PCIデバイスIDに該当するデバイスを確認することができます。
例えば、今回のmfiドライバのエントリである"pci1028,15"は、PCIIDレポジトリを確認すると、VENDOR ID: 1028 (Dell)、デバイスID: 15(PowerEdge Expandable RAID controller 5i)であることが確認できます。
postremoveファイルには、ドライバ削除時に該当するドライバのエントリを削除する処理が記載されています。したがって、ドライバ名「mfi」に関するエントリを削除するように、スクリプト内のドライバ名を設定します。
postinstall、postremove、pkginfoの3つのファイルが準備できたら、/var/tmp/osstech-mfiディレクトリにコピーしておきます。
ここまで準備できた段階で、/var/tmp/osstech-mfiディレクトリには、次のようにファイルが用意されることになります。
# cd /var/tmp/osstech-mfi # find . ./copyright ./postremove ./postinstall ./pkginfo ./kernel ./kernel/drv ./kernel/drv/amd64 ./kernel/drv/amd64/mfi ./kernel/drv/mfi.conf ./kernel/drv/mfi
続いて、これらのファイルをパッケージ化するために必要なprototypeファイルを作成します。
# pkgproto . > prototype
作成されたprototypeファイルに含まれるエントリのうち、copyright、postremove、postinstall、pkginfoの4つのファイルは、パッケージに関する情報を提供するファイルなので、エントリの先頭を"i"にし、ファイルのモードを削除します。
またprototypeファイルに関するエントリは不要なので削除します。
したがって、作成したprototypeファイルの内容は次のようになります。
i copyright i postremove i postinstall i pkginfo d none kernel 0775 root root d none kernel/drv 0775 root root d none kernel/drv/amd64 0775 root root f none kernel/drv/amd64/mfi 0755 root root f none kernel/drv/mfi.conf 0755 root root f none kernel/drv/mfi 0755 root root
次にprototypeファイルの情報をもとに、パッケージの元となるパッケージ形式のディレクトリを作成します。
# cd /var/tmp/osstech-mfi # pkgmk -r . -d /tmp
pkgmkコマンドにより、/tmp/osstech-mfiにパッケージ形式のファイルが作成されます。/tmp/osstech-mfiの「osstech-mfi」はpkginfoのPKGエントリに指定した名前になります。
ドライバディスクを作成する際には、この/tmp/osstech-mfiディレクトリの内容が必要になりますので、tarで1ファイルにまとめて保存しておきます。
# cd /tmp # /usr/sfw/bin/gtar cfz osstech-mfi_rev86-pkg.tar.gz osstech-mfi
また、/var/tmp/osstech-mfiに作成した32bit版ドライバも必要になりますので、/var/tmp/osstech-mfiディレクトリをtarで1ファイルにまとめて保存しておきます。
# cd /var/tmp # /usr/sfw/bin/gtar cfz osstech-mfi_rev86-build.tar.gz osstech-mfi
ドライバディスクイメージの作成
ここまでの作業でドライバディスクに含めるドライバ類の作成が完了しましたので、次にSolaris/OpenSolaris用ドライバディスクのイメージファイルを作成していきます。
Sunが提供している「Solaris OS on x86 Platforms: Third-Party Packaging Tools」を利用してイメージファイルの元を簡単に作成することができますので、以下のURLよりSUNWpkgdパッケージを入手し、Solaris10にインストールします。
http://developers.sun.com/solaris/driverdev/downloads/index.html
ダウンロードした「SUNWpkgd.tar」を/var/tmpにコピーした場合、次の手順でパッケージを追加することができます。
# tar xfv SUNWpkgd.tar # /usr/sbin/pkgadd -d .
The following packages are available: 1 SUNWpkgd Solaris 3rd-Party Driver Packaging Tools (i386) 1.1.0,REV=1999.05.07.12.08 Select package(s) you wish to process (or 'all' to process all packages). (default: all) [?,??,q]:
リターンを入力すると/opt/SUNWpkgdにファイルがインストールされます。そのうちの/opt/SUNWpkgd/bin/pkg_drvコマンドを利用して、ドライバディスクイメージの元を作成します。
Solaris10をインストールしたマシンにフロッピーディスクドライブが搭載されている場合、新しいFDを挿入しておきます。
今回利用したDell PowerEdgeSC1435にはFDDが搭載されていなかったため、別途 VMware上にSolaris10をインストールしました。VMware上のSolaris10にログインし、VMwareの仮想FDDに新規フロッピーイメージを作成して、「VM」→「Removal Device」→「Floppy」→「Connect」で、FDDをオンラインにしておきます。
今回は、既にSolaris10(U3)に含まれているlsimegaドライバを利用して、ドライバディスクイメージの元を作成します。
# /opt/SUNWpkgd/bin/pkg_drv -i '"pci1028,15"' -c scsi -r 1.0 -d 'LSI Megaraid SAS' -D 'OSSTECH' -t pci -V 'VERSION=0.1' lsimega (一行で) WARNING: pkg_drv: pkg/driver name exists in /etc/driver_aliases Suggested Package Naming Conventions: 8 characters, with the first capitalized characters uniquely specifying the company (e.g. stock market ticker). The remaining characters specify the driver (e.g. SUNWcadd for a CAD driver from Sun Microsystems). The driver name must be unique across all Solaris platforms and releases. ## Building pkgmap from package prototype file. ## Processing pkginfo file. ## Attempting to volumize 6 entries in pkgmap. part 1 -- 100 blocks, 14 entries ## Packaging one part. /tmp/1134/LSImega/pkgmap /tmp/1134/LSImega/pkginfo /tmp/1134/LSImega/reloc/boot/solaris/devicedb/master /tmp/1134/LSImega/install/copyright /tmp/1134/LSImega/install/depend /tmp/1134/LSImega/install/i.master /tmp/1134/LSImega/install/postinstall /tmp/1134/LSImega/install/postremove /tmp/1134/LSImega/install/r.master ## Validating control scripts. ## Packaging complete. output pkg: See package directory LSImega in /tmp/1134 output diskette image: See image file ITU1.3 in /tmp/1134 pkg_drv: 1 warnings 0 errors
上記メッセージの最後の部分で示されている通り、/tmp/1134ディレクトリにITU1.3というファイルが作成されています。これがDUイメージの元となります。
ドライバディスクの内容の置き換え
ここから先の作業は、筆者が慣れているLinux環境(CentOS4)で作業をしました。ここまでに作成した以下のファイルをLinux環境にコピーします。作業は/tmp/solaris-mfiディレクトリで行うものとします。
- ITU1.3
- osstech-mfi_rev86-pkg.tar.gz
- osstech-mfi_rev86-build.tar.gz
まず最初にITU1.3イメージファイルの名前を変更し、ループバックマウントを行います。
# cd /tmp/solaris-mfi # mv ITU1.3 osstech-mfi-solaris_20070501.img # mkdir fdmnt # mount -o loop osstech-mfi-solaris_20070501.img fdmnt
内容を確認すると、次のようになっています。
# cd fdmnt # find . . ./du ./du/sol_10 ./du/sol_10/i86pc ./du/sol_10/i86pc/Tools ./du/sol_10/i86pc/Tools/Boot ./du/sol_10/i86pc/Tools/Boot/lsimega ./du/sol_10/i86pc/Tools/Boot/lsimega/lsimega.itu ./du/sol_10/i86pc/Tools/Boot/layout.ver ./du/sol_10/i86pc/Tools/install.sh ./du/sol_10/i86pc/Product ./du/sol_10/i86pc/Product/lsimega.Z ./du/sol_10/i86pc/Patches ./du/release.def
これらのファイルのうち、lsimegaがドライバ名に相当します。今回はlsimegaの代わりにmfiドライバを作成しましたので、以下の手順でドライバディスクイメージを変更します。 最初に「du/sol_10/i86pc/Tools/Boot/lsimega」を「du/sol_10/i86pc/Tools/Boot/mfi」に変更します。また、lsimega.ituファイルを削除しておきます。
# cd du/sol_10/i86pc/Tools/Boot # mv lsimega mfi # rm mfi/lsimega.itu
次に「du/sol_10/i86pc/Tools/Boot/mfiディレクトリに、
- mfi
- mfi.cnf
- mfi.itu
の3つのファイルを作成します。
「mfi」は、32bit用mfiドライバなので、osstech-mfi_rev86-build.tar.gzファイルに含まれているmfiファイルをコピーします。
# cp osstech-mfi/x86/mfi /tmp/solaris-mfi/fdmnt/du/sol_10/i86pc/Tools/Boot/mfi/mfi
「mfi.cnf」は、osstech-mfi_rev86-build.tar.gzファイルに含まれているmfi.cnfファイルをコピーします。mfiドライバの場合、mfi.cnfファイルの内容は空でも問題ありません。
# cp osstech-mfi/mfi.cnf /tmp/solaris-mfi/fdmnt/du/sol_10/i86pc/Tools/Boot/mfi/mfi.cnf
「mfi.itu」は、PCIデバイスIDのリストを含む次のようなファイルを作成します。
この時点で、ドライバディスクイメージは、次のようになります。
# cd fdmnt # find . . ./du ./du/sol_10 ./du/sol_10/i86pc ./du/sol_10/i86pc/Tools ./du/sol_10/i86pc/Tools/Boot ./du/sol_10/i86pc/Tools/Boot/mfi ./du/sol_10/i86pc/Tools/Boot/mfi/mfi ./du/sol_10/i86pc/Tools/Boot/mfi/mfi.cnf ./du/sol_10/i86pc/Tools/Boot/mfi/mfi.itu ./du/sol_10/i86pc/Tools/Boot/layout.ver ./du/sol_10/i86pc/Tools/install.sh ./du/sol_10/i86pc/Product ./du/sol_10/i86pc/Product/lsimega.Z ./du/sol_10/i86pc/Patches ./du/release.def
次に、上記イメージに含まれるlsimega.Zに相当するmfi.Zファイルを作成し、イメージファイルにコピーします。 mfi.Zイメージは、osstech-mfi_rev86-pkg.tar.gzを元に作成します。作業ディレクトリを/tmp/mfi-pkgとすると、次の手順でmfi.Zを作成します。
# mkdir /tmp/mfi-pkg # cd /tmp/mfi-pkg # tar xfz osstech-mfi_rev86-pkg.tar.gz
/tmp/mfi-pkgディレクトリに、osstech-mfiディレクトリが作成され、以下のような内容になっているはずです。
# find . ./osstech-mfi ./osstech-mfi/reloc ./osstech-mfi/reloc/kernel ./osstech-mfi/reloc/kernel/drv ./osstech-mfi/reloc/kernel/drv/amd64 ./osstech-mfi/reloc/kernel/drv/amd64/mfi ./osstech-mfi/reloc/kernel/drv/mfi.conf ./osstech-mfi/reloc/kernel/drv/mfi ./osstech-mfi/pkgmap ./osstech-mfi/install ./osstech-mfi/install/copyright ./osstech-mfi/install/postremove ./osstech-mfi/install/postinstall ./osstech-mfi/pkginfo
このosstech-mfiディレクトリをcpioで1ファイルにします。このときにcpioのアーカイブフォーマットとして"newc(new ASCIIフォーマット)"を指定しておかなければなりません。
# find osstech-mfi -print | cpio -o -H newc > mfi
続いて、compressコマンドでmfiファイルを圧縮し、mfi.Zファイルを作成します。
# compress mfi
作成したmfi.Zファイルをフロッピーイメージのlsimega.Zの代わりにコピーします。
# cp mfi.Z /tmp/fdmnt/du/sol_10/i86pc/Product/mfi.Z # rm /tmp/fdmnt/du/sol_10/i86pc/Product/lsimega.Z
以上の作業で、フロッピーディスク用イメージファイルが完成となります。 完成したフロッピーディスク用イメージファイル(osstech-mfi-solaris_20070501.img)の内容は、次のようになります。
. ./du ./du/release.def ./du/sol_210 ./du/sol_210/i86pc ./du/sol_210/i86pc/Product ./du/sol_210/i86pc/Product/mfi.Z ./du/sol_210/i86pc/Patches ./du/sol_210/i86pc/Tools ./du/sol_210/i86pc/Tools/install.sh ./du/sol_210/i86pc/Tools/Boot ./du/sol_210/i86pc/Tools/Boot/mfi ./du/sol_210/i86pc/Tools/Boot/mfi/mfi.cnf ./du/sol_210/i86pc/Tools/Boot/mfi/mfi ./du/sol_210/i86pc/Tools/Boot/mfi/mfi.itu ./du/sol_210/i86pc/Tools/Boot/layout.ver
イメージファイルをumountして、全ての変更内容をフロッピーイメージに書き戻しておきます。
# cd /tmp/ # umount fdmnt
以上で、フロッピーディスク用イメージファイル(osstech-mfi-solaris_20070501.img)が完成です。
OpenSolaris用ドライバディスクの作成
OpenSolaris用ドライバディスクイメージの作成は、Solaris10用ドライバディスクの作成方法と全く同じですが、ドライバのコンパイル環境として、OpenSolaris上で作業を行うようにします。 また、ドライバイメージ等を配置するディレクトリが、sol_210の代わりにsol_211となります。 したがって、Solaris10用ドライバとOpenSolaris用ドライバを含むドライバディスクイメージのファイルを作成すると、次のような内容となります。
# find . . ./du ./du/release.def ./du/sol_210 ./du/sol_210/i86pc ./du/sol_210/i86pc/Product ./du/sol_210/i86pc/Product/mfi.Z ./du/sol_210/i86pc/Patches ./du/sol_210/i86pc/Tools ./du/sol_210/i86pc/Tools/install.sh ./du/sol_210/i86pc/Tools/Boot ./du/sol_210/i86pc/Tools/Boot/mfi ./du/sol_210/i86pc/Tools/Boot/mfi/mfi.cnf ./du/sol_210/i86pc/Tools/Boot/mfi/mfi ./du/sol_210/i86pc/Tools/Boot/mfi/mfi.itu ./du/sol_210/i86pc/Tools/Boot/layout.ver ./du/sol_211 ./du/sol_211/i86pc ./du/sol_211/i86pc/Product ./du/sol_211/i86pc/Product/mfi.Z ./du/sol_211/i86pc/Patches ./du/sol_211/i86pc/Tools ./du/sol_211/i86pc/Tools/install.sh ./du/sol_211/i86pc/Tools/Boot ./du/sol_211/i86pc/Tools/Boot/mfi ./du/sol_211/i86pc/Tools/Boot/mfi/mfi.cnf ./du/sol_211/i86pc/Tools/Boot/mfi/mfi ./du/sol_211/i86pc/Tools/Boot/mfi/mfi.itu ./du/sol_211/i86pc/Tools/Boot/layout.ver
ISOイメージ形式のドライバディスクの作成方法
Solaris10ではインストール時にUSB FDDからのドライバアップデートを行うことができないため、FDDが搭載されていないマシンにインストールする場合、ISOイメージ形式で作成したドライバアップデートイメージを作成し、FDDの代わりにCD-ROM/DVD-ROMドライバからドライバを読み込む必要があります。 フロッピーディスクイメージ(osstech-mfi-solaris_20070501.img)を元に、ISOイメージ形式でドライバディスクを作成するには、次の手順で行います。
# mkdir /tmp/mfi-img # cp osstech-mfi-solaris_20070501.img /tmp/mfi-img # mkdir mnt1 # mkdir mnt2 # mount -o loop osstech-mfi-solaris_20070501.img mnt1
以上の操作で、FDD形式のドライバイメージが/tmp/mfi-img/mnt1ディレクトリにマウントされた状態になります。 次にmnt1ディレクトリの内容を、空のmnt2ディレクトリにコピーします。
# cp -pr mnt1/* mnt2/
ISOイメージ形式のドライバディスクイメージは、トップディレクトリがduではなく必ず大文字で「DU」となっている必要があるため、ディレクトリ名を変更します。
# mv mnt2/du mnt2/DU
最後にmkisofsコマンドで、mnt2ディレクトリの内容をISOイメージとして作成します。
# mkisofs -J -R -V "SOL10mfi" -D -l -o osstech-mfi-solaris_20070501.iso mnt2
以上でISOイメージ形式のドライバディスクとして、「osstech-mfi-solaris_20070501.iso」が完成です。
cdrecordコマンドなどで、CD-Rに書き込むことで、Solaris10/OpenSolarisのインストール時に利用することができます。
お問い合わせ: info @ osstech.co.jp