13 November 2012

Linux 上で ZFS を使ってみました。

対象は Ubuntu, Fedora, RHEL, CentOSあたりとします。

簡単に ZFS を導入する方法としては

  1. ZFS-FUSE (Filesystem in Userspace) を使う
  2. 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 PackagesDefault 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 を作成します。(foobar という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