ZFS を Scientific Linux 6 (CentOS 6) 独自コンパイルのカーネルにインストールする
Linux カーネルをパッケージで利用しているときは、 ZFS についてもレポジトリを登録後 yum install で簡単にインストールでき、問題がおきてもパッケージの削除後、再インストールでまた復活します。
ZFS は DKMS1モジュールで提供されます。さらに、ZFS は SPL2 上で動きますが、SPL も DKMS モジュールです。
ここで、新しい Linux カーネルを使いたいとかでやむなく独自でコンパイルして導入しても、DKMS の仕組みで勝手にコンパイルしてモジュールが生成されます。うまく動いているうちは。でも、独自でコンパイルカーネルで、よくわからない理由で ZFS モジュールが認識されくなった時は、パッケージの削除後、再インストールで復活するのかといえば容易ではないようで、とはいえ、どこの質問の回答も自分でカーネル入れただろ(そんなの面倒見るかい)とかパッケージの削除後、再インストールしなさいという回答です。つまり、参考にならないということです。
環境
ZFS を使っている linux pc は Scientific Linux release 6.9 (Carbon) で、下記 3 種類のカーネルで起動可能ですが、現在は 3.18.3 を使用しています
- 2.6.32-504.3.3 (パッケージからインストール、カーネルソース /usr/src/kernels /2.6.32-504.3.3.el6.x86_64)
- linux-3.14.29 (独自コンパイル、カーネルソース /usr/local/src/linux-3.14.29)
- linux-3.18.3 (独自コンパイル、カーネルソース /usr/local/src/linux-3.18.3)
保守停電を忘れていて、電源断になった liunux pc を再起動したときには zfs, zpool が動かなくなってました。
SPL と ZFS のバージョン
ちょっと古いですが、0.6.5.11 を使用します。
SPL, ZFS の DKMS のモジュールを消す
まず、DKMS モジュールがどうなっているのか調べようにもエラーとなってました。
# dkms status
Error! Could not locate dkms.conf file.
File: does not exist.
dkms.conf がどこにあるかというと、
- SPL は、/var/lib/dkms/spl/0.6.5.11/source/dkms.conf (0.6.5.11 は SPL のバージョン)
- ZFS だと、/var/lib/dkms/zfs/0.6.5.11/source/dkms.conf (0.6.5.11 は ZFS のバージョン)
にあります。source は、それぞれ、 /usr/src/spl-0.6.5.11/ と /usr/src/zfs-0.6.5.11/ へのシンボリックリンクで、 /usr/src/spl-0.6.5.11/ は、 spl-dkms パッケージ、 /usr/src/zfs-0.6.5.11/ は、zfs-dkms パッケージに属します。
spl-dkms もしくは zfs-dkms パッケージを削除時には、/var/lib/dkms/ 以下も整理してくれるのですが、/var/lib/dkms/ 以下がパッケージ管理外ということもあり、ZFS のアップデートを繰り返していると、なぜか整合が取れなくなるときがあるようです。今回は、source の参照先が /usr/src で、パッケージ管理されているファイルを知らずに消していたこともあり、ますますファイルの整合がとれなくなっていました。
そこで、/var/lib/dkms/ 以下をきれいにします。
まず、どうせ ZFS が動かないのですから、ZFS と SPL パッケージ関連パッケージをすべて削除します:
# yum remove zfs zfs-dkms libzfs2 libnvpair1 libuutil1 libzpool2 spl spl-dkms spl-kmod kmod-spl-devel
%preun とか %postun (RPM アンインストール時に実行するスクリプト)で失敗して、アンインストールできないときはスクリプトを動かさない削除をします:
# rpm -e --noscripts パッケージ名
次に、SPL, ZFS のカーネルモジュールを /var/lib/dkms/ から削除します。いままでアップデートした歴代カーネルモジュールも残っていたりもするので(起動時にカーネルモジュールが生成されるため、パッケージ管理外となる)これらもすべて消します:
# rpm -rf /var/lib/dkms/spl /var/lib/dkms/zfs
カーネルの整理
spl-kmod, zfs-dkms パッケージをインストールするときに grub でブート可能なカーネルすべてに対しカーネルモジュールを作りにいきます。ですから、grub でブート可能なカーネルすべてについて、カーネルソースをインストールしておかないとなりません。
具体的には kernel-headers, kernel-devel がかけている kernel は削除します(もしくは、kernel-headers, kernel-devel を追加)。
パッケージからインストールされているカーネル
例えば、kernel-headers とか、kernel-devel がそろっていればいいのですが(下はそろっている例です):
# rpm -qa | grep kernel
kernel-2.6.32-504.3.3.el6.x86_64
kernel-devel-2.6.32-504.3.3.el6.x86_64
kernel-firmware-2.6.32-504.3.3.el6.noarch
dracut-kernel-004-409.el6_8.2.noarch
kernel-headers-2.6.32-696.23.1.el6.x86_64
kernel-2.6.32-504.3.3.el6.x86_64 だけが存在し、kernel (または DKMS モジュール)のコンパイルに必要な kernel-devel, kernel-headers がないときは、次のふたとおりの手立てがあります:
- kernel-2.6.32-504.3.3.el6.x86_64 を消してしまう
- kernel-devel, kernel-headers を追加する
独自インストールしたカーネル
独自でカーネルをコンパイルしているときは、カーネルソースはそのままにしておく必要があります。もしカーネルソースを消してしまっていたら、ソースからカーネルを入れなおすか、grub からブート可能なカーネルから除外します。
今使っている(使いたい)カーネルのカーネルソースを消去してしまっているときは、選択肢はりません。もう一度ソースから入れなおしましょう。
ZFS RPM パッケージを作る
準備
https://github.com/zfsonlinux/zfs/releases/tag/zfs-0.6.5.11 から
spl-0.6.5.11.tar.gz と zfs-0.6.5.11.tar.gz をダウンロードし、任意のディレクトリに展開します。ここでは /usr/local/src/zfs 以下に展開しています。
# cd /usr/local/src/zfs
# tar xvfz ~/Download/spl-0.6.5.11.tar.gz
# tar xvfz ~/Download/zfs-0.6.5.11.tar.gz
gcc などが入っていなかったらコンパイルに必要なパッケージ群を一括インストールします:
# yum groupinstall "開発ツール"
このほか make rpm 時にパッケージが足りなければ適宜インストールしてください。
spl の RPM パッケージを作ってインストール
# cd /usr/local/src/zfs/spl-0.6.5.11
# ./autogen.sh
# ./configure
# make rpm
ZFS のパッケージ作成でも必要なので、必要な SPL パッケージをインストールします:
# rpm -ivh spl-dkms-0.6.5.11-1.el6.noarch.rpm spl-0.6.5.11-1.el6.x86_64.rpm
準備中... ########################################### [100%]
1:spl-dkms ########################################### [ 50%]
Loading new spl-0.6.5.11 DKMS files...
It is likely that 3.18.3 belongs to a chroot's host
Building for 2.6.32-504.3.3.el6.x86_64, 3.14.29 and 3.18.3
Building initial module for 2.6.32-504.3.3.el6.x86_64
Done.
spl:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/2.6.32-504.3.3.el6.x86_64/extra/
splat.ko:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/2.6.32-504.3.3.el6.x86_64/extra/
Adding any weak-modules
depmod...
DKMS: install completed.
Building initial module for 3.14.29
Done.
spl:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/3.14.29/extra/
splat.ko:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/3.14.29/extra/
Adding any weak-modules
depmod...
DKMS: install completed.
Building initial module for 3.18.3
Done.
spl:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/3.18.3/extra/
splat.ko:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/3.18.3/extra/
Adding any weak-modules
depmod...
DKMS: install completed.
2:spl ########################################### [100%]
ちゃんと spl の DKMS モジュールが入っているかどうか確認します:
# dkms status
spl, 0.6.5.11, 2.6.32-504.3.3.el6.x86_64, x86_64: installed
spl, 0.6.5.11, 3.14.29, x86_64: installed
spl, 0.6.5.11, 3.18.3, x86_64: installed
ZFS の RPM パッケージを作ってインストール
# cd /usr/local/src/zfs/zfs-0.6.5.11/
# ./configure --with-spl=/usr/src/spl-0.6.5.11 --with-spl-obj=/var/lib/dkms/spl/0.6.5.11/3.18.3/x86_64/
# make rpm
--------------- 略 ---------------
Installing zfs-kmod-0.6.5.11-1.el6.src.rpm
error: Failed build dependencies:
kmod-spl-devel = 0.6.5.11 is needed by zfs-kmod-0.6.5.11-1.el6.x86_64
make[1]: *** [rpm-common] エラー 1
make[1]: ディレクトリ `/usr/local/src/zfs/zfs-0.6.5.11' から出ます
make: *** [rpm-kmod] エラー 2
必要なパッケージを入れ:
# rpm -ivh ../spl-0.6.5.11/kmod-spl-devel-0.6.5.11-1.el6.x86_64.rpm
もう一回挑戦:
# make rpm
# rpm -ivh zfs-0.6.5.11-1.el6.x86_64.rpm zfs-dkms-0.6.5.11-1.el6.noarch.rpm libzfs2-0.6.5.11-1.el6.x86_64.rpm libnvpair1-0.6.5.11-1.el6.x86_64.rpm libuutil1-0.6.5.11-1.el6.x86_64.rpm libzpool2-0.6.5.11-1.el6.x86_64.rpm
準備中... ########################################### [100%]
1:libuutil1 ########################################### [ 17%]
2:libnvpair1 ########################################### [ 33%]
3:libzpool2 ########################################### [ 50%]
4:libzfs2 ########################################### [ 67%]
5:zfs-dkms ########################################### [ 83%]
Loading new zfs-0.6.5.11 DKMS files...
It is likely that 3.18.3 belongs to a chroot's host
Building for 2.6.32-504.3.3.el6.x86_64, 3.14.29 and 3.18.3
Building initial module for 2.6.32-504.3.3.el6.x86_64
Done.
zavl:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/2.6.32-504.3.3.el6.x86_64/extra/
--------------- 略 ---------------
zpios.ko:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/3.18.3/extra/
Adding any weak-modules
depmod...
DKMS: install completed.
6:zfs ########################################### [100%]
ちゃんと spl の DKMS モジュールが入っているかどうか確認します:
# dkms status
spl, 0.6.5.11, 2.6.32-504.3.3.el6.x86_64, x86_64: installed
spl, 0.6.5.11, 3.14.29, x86_64: installed
spl, 0.6.5.11, 3.18.3, x86_64: installed
zfs, 0.6.5.11, 2.6.32-504.3.3.el6.x86_64, x86_64: installed
zfs, 0.6.5.11, 3.14.29, x86_64: installed
zfs, 0.6.5.11, 3.18.3, x86_64: installed (original_module exists)
動作確認
# zpool list
NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
export 425G 177G 248G - - 41% 1.00x ONLINE -
動いてます。
トラブル
それでも The ZFS modules are not loaded.
# zpool list
The ZFS modules are not loaded.
Try running '/sbin/modprobe zfs' as root to load them.
対策:
- リブートする → OK なら終了
- リブートしてもダメ → 以下実行しリブート:
# dkms remove -m zfs -v 0.6.5.11 --all
# dkms remove -m spl -v 0.6.5.11 --all
# dkms --force install -m spl -v 0.6.5.11
# dkms --force install -m zfs -v 0.6.5.11
spf-dkms, zfs-dkms インストール、アンインストール時に大量に警告がでる
WARNING: Can't read module /lib/modules/2.6.32-504.el6.x86_64/weak-updates/zfs.ko: No such file or directory
WARNING: Can't read module /lib/modules/2.6.32-504.el6.x86_64/weak-updates/zpios.ko: No such file or directory
WARNING: Can't read module /lib/modules/2.6.32-504.el6.x86_64/weak-updates/zunicode.ko: No such file or directory
WARNING: Can't read module /lib/modules/2.6.32-504.el6.x86_64/weak-updates/znvpair.ko: No such file or directory
WARNING: Can't read module /lib/modules/2.6.32-504.el6.x86_64/weak-updates/zavl.ko: No such file or directory
WARNING: Can't read module /lib/modules/2.6.32-504.el6.x86_64/weak-updates/icp.ko: No such file or directory
WARNING: Can't read module /lib/modules/2.6.32-504.el6.x86_64/weak-updates/spl.ko: No such file or directory
WARNING: Can't read module /lib/modules/2.6.32-504.el6.x86_64/weak-updates/splat.ko: No such file or directory
WARNING: Can't read module /lib/modules/2.6.32-504.el6.x86_64/weak-updates/zcommon.ko: No such file or directory
egrep: /lib/modules/2.6.32-504.el6.x86_64//weak-updates/zfs.ko: No such file or directory
egrep: /lib/modules/2.6.32-504.el6.x86_64//weak-updates/zpios.ko: No such file or directory
egrep: /lib/modules/2.6.32-504.el6.x86_64//weak-updates/zunicode.ko: No such file or directory
egrep: /lib/modules/2.6.32-504.el6.x86_64//weak-updates/znvpair.ko: No such file or directory
egrep: /lib/modules/2.6.32-504.el6.x86_64//weak-updates/zavl.ko: No such file or directory
egrep: /lib/modules/2.6.32-504.el6.x86_64//weak-updates/icp.ko: No such file or directory
egrep: /lib/modules/2.6.32-504.el6.x86_64//weak-updates/spl.ko: No such file or directory
egrep: /lib/modules/2.6.32-504.el6.x86_64//weak-updates/splat.ko: No such file or directory
egrep: /lib/modules/2.6.32-504.el6.x86_64//weak-updates/zcommon.ko: No such file or directory
原因と対策
原因は、grub からブート可能なカーネルだが、カーネルヘッダーがまともにインストールされておらず、DKMS モジュールがビルドできないため。対応する kernel-devel, kernel-headers パッケージをインストールするか、カーネルパッケージを削除してください(上記であれば、kernel-2.6.32-504.el6.x86_64)。
-
Dynamic Kernel Module Support (DKMS) はカーネルのソースツリーの外にソースが存在する Linux カーネルモジュールの生成を可能にするプログラム/フレームワークです。新しいカーネルがインストールされたときに DKMS モジュールは自動的にリビルドされます。 archlinux ↩
-
The Solaris Porting Layer (SPL) is a Linux kernel module which provides many of the Solaris kernel APIs. packages.debian.org
ということで、独自でコンパイルカーネルでの ZFS 復活方法を紹介しておきます。 ↩