前回の微続きで、カーネルを再構築して入れ替えた際に、そのサーバでioDriveを利用していた場合の対応についてです。
Fusion-io社が配布してくれているモノは十分なのですが、俺の対処が横着だったためにハマった例です。こちらも半年以上前のメモ起こしですが、基本は変わらないはずです。
ioDriveドライバについて
Support :: Fusion-io でログインするとソースやパッケージをダウンロードできます。例えば、ioDrive -> Squeeze -> r2.3.1 と選択して、通常は iomemory-vsl-2.6.32-5-amd64_2.3.1.123-1.0_amd64.deb やその他Utilitiesもろもろ落としてきてサーバにインストールしてioDriveを利用できるようにします。それと、今回の問題を解決するのに必要な iomemory-vsl_2.3.1.123-1.0.tar.gz も落としておきます。tarballも配布されていることを知らずに解決を試みましたが無理だった例を記しておきます。
カーネル再構築後にドライバを認識しない問題
ioDriveを導入していたサーバで、linux-image-2.6.32-5-amd64 なり linux-image-2.6.32-5-xen-amd64 を再構築したモノを入れなおした場合、iomemory-vslドライバが動作しなくなります。同じドライバを入れなおしても同様です。具体的な症状としては、カーネル入れ替え後に再起動したら、/dev/fct* を認識しなくなり、ソフトウェアRAIDが組めなくなり、マウントができない── といった内容になります。
この状態でなんとかしようと、モジュールを有効にしようとしてもエラーになります。
1 2 3 4 |
# modprobe -v iomemory-vsl insmod /lib/modules/2.6.32-5-amd64-drecom/extra/fio/iomemory-vsl.ko FATAL: Error inserting iomemory_vsl (/lib/modules/2.6.32-5-amd64-drecom/extra/fio/iomemory-vsl.ko): Invalid module format |
この時点では fio-status はパッと見動くのですが、無理矢理 modprobe -f iomemory-vsl で有効にしようとすると、out of memory になってしまい、fio-status すら動かなくなります。
上記例では新カーネル名が 2.6.32-5-amd64-drecom になっていますが、仮に公式と同じ名前のままにしても症状は変わりません。要は iomemory_vsl はちゃんと公式のカーネルに基づいてコンパイルされているため、中身が入れ替わると動かなくなるとうわけです。
iomemory-vslを再構築
パッケージを作りなおす
iomemory-vslのTARBALLが配布されていることを知らなかったため、元のdebパッケージだけでなんとかしようともがきましたが、実はTARBALLからdebパッケージを作成すれば解決しました。もちろん、コンパイルは新カーネルで動作しているサーバ上で行う必要がありますが、その手順を紹介します。
まずはパッケージ作成に必要なパッケージをインストールします。linux-headersが必要なため、新カーネル作成時に同時に作成しておく必要があります。
1 2 3 |
apt-get install kernel-package libncurses5-dev gawk \ gcc fakeroot build-essential debhelper devscripts \ linux-headers-$(uname --r) rsync |
次に、ソースを持ってきて解凍します。
1 2 3 |
cd /usr/local/src tar xzf iomemory-vsl_2.3.1.123-1.0.tar.gz cd iomemory-vsl-2.3.1.123/ |
場合によって元のパッケージとファイル名が重複しないようリビジョンを変更しておきます。
1 2 3 4 5 6 7 |
# dch iomemory-vsl (2.3.1.123-drecom1.0) unstable; urgency=low * recompile for drecom kernel -- root <root@localhost> Mon, 16 Apr 2012 10:32:00 +0900 |
そしてシンボリックリンクを作成し、パッケージを作成します。
1 2 3 |
ln -s /usr/src/linux-headers-2.6.32-5-amd64-drecom /lib/modules/2.6.32-5-amd64-drecom/build debuild ls -l ../iomemory-vsl-2.6.32-5-amd64-drecom_2.3.1.123-drecom1.0_amd64.deb |
ドライバを入れ替える
作ったdebファイルや、公式パッケージはPrivateAPTサーバに入れておくとします。ioDrive認識中のサーバでの新カーネルとドライバの入れ替え手順はこんな感じです。
全て停止・削除
パーティション利用の停止、アンマウント、RAID停止、モジュール削除、パッケージ削除、です。
1 2 3 4 |
umount /fio mdadm --stop /dev/md0 modprobe -r iomemory-vsl apt-get purge iomemory-vsl-2.6.32-5-amd64 |
全てインストールして再起動
1 2 3 4 5 6 7 |
apt-get install linux-image-2.6.32-5-amd64-drecom apt-get install \ iomemory-vsl-2.6.32-5-amd64-drecom=2.3.1.123-drecom1.0 \ fio-common fio-firmware fio-snmp-agentx fio-snmp-mib \ fio-util fio-sysvinit libfio reboot |
無事に起動すれば、デバイスの認識からマウントまで元通りに動作するはずです。当然ですが、データはいじっていないので全てそのまま残っています。
この件で嬉しかったのは、TARBALLの中にdebuild用debianディレクトリが既に用意されていたことです。新カーネル用だったためシンボリックリンクは必要でしたが、ちゃんとdebuild一発で動くようになっています。
とまぁこんな感じで我々の208日問題対応が進みましたよ、というお話でした。