とあるエンジニアの備忘log
2012年11月13日火曜日
Linux で ZFS を使ってみた
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](http://www.blackpig.jp/?p=214) のページのようにルートファイルシステムから 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 で最初にやること](/2012/11/rhelcentos.html)に記載) ただし、ZFS-FUSE だといろいろと機能制限があるみたいです。 実際やってみると、パーティションのトップで `cd .zfs` でスナップディレクトリに入れる機能は動きませんでした。 なので、手軽に ZFS を使いたい人には zfs-fuse がお勧めですが、フル機能を使いたい人は以下の ZFS on LINUX の方がよいかもしれません。 ### ZFS on LINUX ### [ZFS on Linux](http://zfsonlinux.org/) のページの手順にしたがって 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 の方が使いやすいと思いました。
0 件のコメント:
コメントを投稿
次の投稿
前の投稿
ホーム
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿