Linux で ZFS を使ってみた
Linux 上で ZFS を使ってみました。
対象は Ubuntu, Fedora, RHEL, CentOSあたりとします。
簡単に ZFS を導入する方法としては
- ZFS-FUSE (Filesystem in Userspace) を使う
- ZFS on LINUX を使う
あたりがあると思います。
ZFS はライセンス上の問題で Linux Kernel と静的にリンクできないので、 1. のようにユーザー空間で動かすか、 2. のようにローダブルモジュールにするかどっちか。いずれにしても、OS 部は従来通りに ext4 などに置かないといけないので、ZFS が使えるのはデータの部分です。
Ubuntu 12.04 LTS Precise Pangolin で Native ZFS のページのようにルートファイルシステムから ZFS にしてしまう例も紹介されていますが、初心者の自分にはまだ敷居が高いので、いずれ挑戦することにします。
最初 ZFS-FUSE に触れたあと、ZFS on LINUX を導入してみることにします。
ZFS-FUSE
導入は簡単で、 Ubuntuだと
$ sudo apt-get install zfs-fuse
Fedora17 だと
# yum install zfs-fuse
以上です。
RHEL, CentOS などは標準のリポジトリには zfs-fuse がないので、 EPEL (Extra Packages for Enterprise Linux) のリポジトリを追加すればOKです。 (EPEL の入れ方は以前 自分的 RHEL/CentOS 6.3 で最初にやることに記載)
ただし、ZFS-FUSE だといろいろと機能制限があるみたいです。
実際やってみると、パーティションのトップで cd .zfs
でスナップディレクトリに入れる機能は動きませんでした。
なので、手軽に ZFS を使いたい人には zfs-fuse がお勧めですが、フル機能を使いたい人は以下の ZFS on LINUX の方がよいかもしれません。
ZFS on LINUX
ZFS on Linux のページの手順にしたがって tarball をダウンロードし、ソースからコンパイルすることにします。 こちらは ローダブルモジュールとはいえ、 ZFS がカーネル空間で動くようになっていると思います。
ページのインストール方法そのままですが、とりあえず RHEL 6.3 / CentOS 6.3 64bit版でやってみました。
まずは SPL のインストールから。
# yum groupinstall "Development Tools"
$ cd spl-0.6.0-rc11
$ ./configure
$ make rpm
# rpm -Uvh *.x86_64.rpm
続いて、ZFS のインストール
# yum install zlib-devel libuuid-devel libblkid-devel libselinux-devel parted lsscsi
$ cd zfs-0.6.0-rc11
$ ./configure
$ make rpm
# rpm -Uvh *.x86_64.rpm
これで完了です。
CentOS だと上記のままでOKでしたが、 RHEL だと標準のリポジトリに “Development Tools” がない、 lsscsi もないという状況なので、ちょっと対応がいりました。
CentOS上で yum groupinfo "Development Tools"
で内容を表示してみると以下のようになります。
Group: Development tools
Description: A basic development environment.
Mandatory Packages:
autoconf
automake
binutils
bison
flex
gcc
gcc-c++
gettext
libtool
make
patch
pkgconfig
redhat-rpm-config
rpm-build
Default Packages:
byacc
cscope
ctags
cvs
diffstat
doxygen
elfutils
gcc-gfortran
git
indent
intltool
patchutils
rcs
subversion
swig
systemtap
Optional Packages:
ElectricFence
ant
babel
bzr
chrpath
cmake
compat-gcc-34
compat-gcc-34-c++
compat-gcc-34-g77
dejagnu
expect
gcc-gnat
gcc-java
gcc-objc
gcc-objc++
imake
jpackage-utils
kdewebdev
libstdc++-docs
mercurial
mod_dav_svn
nasm
perltidy
python-docs
rpmdevtools
rpmlint
systemtap-sdt-devel
systemtap-server
なので、RHEL にインストールする場合、上記の Mandatory Packages
と Default Packages
のカテゴリのものを全部 yum install
でインストールしてしまえばよいです。
lsscsi については RPM search で lsscsi-x.xx-x.el6.x86_64.rpm
をダウンロードしてきて、インストールしました。
インストールが済んだら、さっそく使ってみましょう。 まずは
# zpool create tank mirror /dev/disk/by-id/foo /dev/disk/by-id/bar
みたいな感じで pool を作成します。(foo
と bar
という2台のディスクでミラーを組んだ場合)
次に、以下のようにパーティションを作る。
# zfs create tank/home
# zfs create tank/git
ちょっと悩んだのは、再起動する度に、マウントが解除されてしまうこと。
再起動後に
# zfs get mounted
で確認すると全パーティションが mounted=off
になってしまっている。。
確か、起動時に zfs mount -a
が行われると man に書いてあったのに変だなぁと思って調査しました。
/etc/rc.d/init.d/zfs
のスクリプトを読んでみて納得。
# Requires selinux policy which has not been written.
if [ -r "/selinux/enforce" ] &&
[ "$(cat /selinux/enforce)" = "1" ]; then
action $"SELinux ZFS policy required: " /bin/false || return 6
fi
というコードが入っていて SELinux のせいで、 ZFS が自動マウントされなくなっているようでした。
というわけで SELinux を OFF にします。
/etc/selinux/config
の
SELINUX=enforcing
を
SELINUX=disabled
に変更して再起動すると、無事に ZFS が自動的にマウントされるようになりました。
結局どっちがいいのか
フル機能が使えるということで最初は ZFS on LINUX を使っていたのですが、運用してみると結構面倒だということがわかりました。
ディストリビューションでは定期的に Kernel がアップデートされます。 Kernel が更新されるたびに ZFS のモジュールもビルドし直さなくてはなりません。
というわけで、自分としては zfs-fuse の方が使いやすいと思いました。
blog comments powered by Disqus