ZFSパッケージ登録記念:Ubuntu 15.10にZFS on Linux


  • ZFS on LinuxのパッケージがUbuntu 15.10のuniverseに登録された。
  • Ubunut 15.10にZFS on Linuxをインストールしてみた。

この春、DebianでZFS on Linux(ZoL)1が近々サポートされるというニュースが流れました2。しかし結局サポートされるようになったのかどうか、全く話を聞かなくになってしまいました。

そして秋にはUbuntuでZFSが使えるようになるというニュースが流れました3。この時は2016年春にリリース予定のUbuntu 16.04での話でした。そのためUbuntuで使えるようになったとしてもまだ先の話かと思っていました。

ところが先日ZFS on Linuxメーリングリストに「UbuntuのパッケジレポジトリにZoLがある」4があるという話が投稿されました。それを読んでUbuntuのパッケージを検索するとこの秋にリリースされたUbuntu 15.10用のZoLパッケージが見つかりました5。これまでもZoLをPPAからUbuntuにインストール出来ました6が、公式のパッケージとしてZoLが登録されたことは大進歩です。これでOSをアップグレードするときにZFSのカーネルモジュールがインストールされているか心配しなくて良くなります。

これまでPPAのパッケージを使ってZoLをインストールしていましたが、せっかくなので新しく登録されたZFS on LinuxのパッケージをUbuntu 15.10にインストールしてみました。

ZFS on Linuxを使えるマシンの条件

ZFS on Linuxを使用するには、次のような必要条件が有ります。

64-bit Ubuntuシステムであること。
32-bit用のパッケージは提供されていません。
最近Ubuntuをインストールしたマシンは、サーバ用とデスクトップ用共に標準で64-bitになっているのでこの条件は問題ありません。ただしアップグレードを繰り返してきたマシンは32-bitのシステムかもしれません。

64-bitか32-bitかは、uname -iコマンドで確認できます。コマンドの出力がx86_64となっていれば64-bitシステムです。

# 64-bit
$ uname -i
x86_64

# 32-bit
$ uname -i
i686
メモリが8GB以上あること。
もっと少ないメモリ容量でも重複排除を使用しなければ動くことは動くらしいです。逆に重複排除を使用するならば、8GBでは少なすぎます。またメモリは読み出しキャッシュともなるので、実用上はさらにほしい所です。
また普通のメモリでもZFSを使用できますが、データを絶対失いたくない用途ではECC付きのメモリが強く推奨されています7

ZFSでECC付きメモリがどの程度必須かは、ヒートアップ間違い無しの話題です。ECCが付いていない普通のメモリを使っていると、 知らないうちにファイルが壊れる、最悪ファイルシステム全体が壊れることがある という恐ろしい意見を良く見かけます。ただ一方で ECC付きメモリでなくて安全性に違いはない という意見も有ります8

ECC付きのメモリを使っておけば、ファイルが壊れた時に本当は別に原因があったとしてもECC付きのメモリにしておかなかったからかもと後悔をしなくてすみます。ちなみに私は、ホーム・ファイル・サーバにECCの付いていない普通のメモリを使用しています。

ZFS on Linuxをインストール

今回はKVM上で動いているUbuntu 15.10マシンにZFS on Linuxをインストールしてみました。

OS
Ubuntu 15.10 64-bit
メモリ
8GB(8192MB)
ドライブ
5GB + ZFS用に5GBx2
ZFSに使用するドライブには、Virttual DiskのAdvanced optionsでSerial numberを書いておきます。今回は、virtio-drive1virtio-drive2としました。こうすることで、後でドライブが識別しやすくなります。
KVMのVirtual DiskにSerial numberを設定する。
KVMのVirtual DiskにSerial numberを設定する。
$ ls /dev/disk/by-id/
ata-QEMU_DVD-ROM_QM00001  virtio-ubuntu-drive0-part1  virtio-virtio-drive3
virtio-ubuntu-drive0      virtio-virtio-drive2

ドライバ名が頭に付くことを忘れていた。

仮想環境でない本物のドライブでは、次のようにモデル名とシリアル番号から自動的に設定されています。また同じドライブに対して、WWN9からも名前が付けられます。

モデル名とS/N、WWNからデバイス名が作成される。
モデル名とS/N、WWNからデバイス名が作成される。
$ ls /dev/disk/by-id/
usb-ST310005_9VPC_246802468024-0:0
usb-ST310005_9VPC_246802468024-0:0-part1
usb-ST310005_9VPC_246802468024-0:0-part2
# 省略

USB接続だからかWWNでの名前がこの時は作られませんでした。SATAで接続するとwwn-0x5000c50017ffe14fのようなwnnで始まるWWNに由来する名前も作成されます。

ZoLは複数ののパッケージに分割されていますが、zfsutils-linuxをインストールすると必要なパッケージが全てインストールされます。ただし現時点ではパッケージの依存関係にバグがあるのかZFS on Linuxのカーネルモジュールをインストールする時に必要なbuild-essentialパッケージがインストールされません10。そこでこれも同時にインストールします。

$ sudo apt-get update
$ sudo apt-get install build-essential zfsutils-linux

普通のパッケージはファイルをコピーするだけですが、ZoLはカーネルモジュールをコンパイルしてインストールする必要があります。そのためインストールが完了するまで多少時間がかかります。

インストールが完了したら、ZFSが使えるようになっているか確認します。

$ cat /proc/filesystems |grep zfs
nodev	zfs

$ dmesg | grep -E 'SPL:|ZFS:'
[  848.530602] SPL: Loaded module v0.6.4.2-0ubuntu1
[  848.566350] ZFS: Loaded module v0.6.4.2-0ubuntu1.2, ZFS pool version 5000, ZFS filesystem version 5

ZFSを使ってみた

ZFSが使えることが確認できたら、ミラーリング(mirror, RAID1)で冗長化したZFSを作って/homeに使用してみます11

ZFSを使うには、まず複数のドライブをまとめて冗長性を持った一つの記憶システムpoolを作成し、次にpoolを分割してユーザが使用できるファイルシステムを作ります。

poolの作成

まずドライブと対応するデバイス名を確認します。

$ ls -l /dev/disk/by-id
lrwxrwxrwx 1 root root  9 12月 29 08:12 ata-QEMU_DVD-ROM_QM00001 -> ../../sr0
lrwxrwxrwx 1 root root  9 12月 29 08:12 virtio-ubuntu-drive0 -> ../../vda
lrwxrwxrwx 1 root root 10 12月 29 08:12 virtio-ubuntu-drive0-part1 -> ../../vda1
lrwxrwxrwx 1 root root  9 12月 29 08:12 virtio-virtio-drive2 -> ../../vdb
lrwxrwxrwx 1 root root  9 12月 29 08:12 virtio-virtio-drive3 -> ../../vdc

今回ZFSに使用するドライブがvdbとvdcに接続していることがわかりました。このデバイス名は初期化するときにだけ必要で、以後は分かりやすいby-idで示された名前が使用できるようになります。(本当は最初からby-idの名前を使えるはずですが…。)

poolの作成には、zpoolコマンドを使用します。

$ sudo zpool create -o ashift=12 tank mirror vdb vdc
$ sudo zpool status
  pool: tank
 state: ONLINE
  scan: none requested
config:

	NAME        STATE     READ WRITE CKSUM
	tank        ONLINE       0     0     0
	  mirror-0  ONLINE       0     0     0
	    vdb1    ONLINE       0     0     0
	    vdc1    ONLINE       0     0     0

errors: No known data errors

$ sudo zpool list
NAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
tank  4.97G   360K  4.97G         -     0%     0%  1.00x  ONLINE  -

ドライブがまっさらでパーティションテーブル自体がないときにはエラーになるので、poolを作成するときに-fオプションを追加します。

-o ashift=12オプションは、4KBセクタのドライブに対応するためで、2^12(4096)バイトを単位としてデータを配置させます。

poolの名前をtankとしましたが、この名前は/(root)ディレクトリに無い名前であれば自由に決めることができます。

poolを構成するストレージには、ドライブ丸ごとではなく特定のパーティションを指定することも可能です。ただしドライブ丸ごとのほうが効率が良いということです。

これでpoolの準備は完了です。しかしこれでは障害が発生した時にどのドライブを交換したらよいか分かりにくく、間違ったドライブを交換してしまいそうです。

そこでdisk/by-idで示された分かりやすい名前を使えるようにします。

$ sudo zpool export tank
$ sudo zpool import -d /dev/disk/by-id tank
$ sudo zpool status
  pool: tank
 state: ONLINE
  scan: none requested
config:

	NAME                      STATE     READ WRITE CKSUM
	tank                      ONLINE       0     0     0
	  mirror-0                ONLINE       0     0     0
	    virtio-virtio-drive2  ONLINE       0     0     0
	    virtio-virtio-drive3  ONLINE       0     0     0

errors: No known data errors

これで将来障害が発生したとしても、交換が必要なドライブを間違える心配が減ります。

異なるサイズのドライブの組み合わせ

サイズが異なるドライブ(またはパーティション)を組み合わせた場合は、もっとも容量の小さいドライブに合わせてpoolが作成されます12

また将来ドライブが壊れた時には、壊れたドライブと同じかより大容量のものと交換する必要が有ります。ドライブを交換して最も容量の小さかったドライブが置き換わると、自動的にpoolのサイズが拡張されます。

例えば、500GB + 500GB(500GB)のミラーリングされたpoolのドライブ一台を1TBのドライブと交換したとします。すると500GB + 1TBという構成になりますが、この時のpool容量は500GBのままです。さらに500GBのドライブを1TBのと交換すると1TB + 1TBとなり、poolの容量は自動的に1TBとなります。

ただし容量に空きがあっても小さいサイズのドライブに交換することはできません13

ファイルシステムの作成

poolを作成したらファイルシステムを作成して使用できるようにします。

と言っても実はpoolを作成しただけでファイルシステムが作られて/(root)にマウントされています。そのためpoolの名前に「/(root)ディレクトリに無い名前」という制限があったのです。

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
# 省略
tank            4.9G  128K  4.9G   1% /tank

dfコマンドで使用量がわかるのがZFSの便利なところです。

/homeをZFSにする

このままどんぶり勘定的に使用することも可能ですが、一般的にはこの領域をzfsコマンドで分割して使用します。

ここでは/homeをZFS上に作成して、ドライブが一台壊れてもデータを守れるようにしてみます。

$ sudo zfs create -o atime=on -o relatime=on -o compression=lz4 tank/home
$ sudo zfs list
NAME        USED  AVAIL  REFER  MOUNTPOINT
tank        396K  4.89G    96K  /tank
tank/home    96K  4.89G    96K  /tank/home

これで新しい/homeとなるファイルシステムが出来ました。

zfsコマンドの-o atime=on -o relatime=onオプションは、ファイルアクセス時刻の記録方法をext4のデフォルトと同じにするためです。また-o compression=lz4オプションは、データをlz4で圧縮して記録することを指示しています。

新しいファイルシステムができたので、これまでの/homeを移動させて/homeを切り替えます。

$ sudo rsync -a /home/ /tank/home
# /home/とソースはスラッシュ(/)で終わっている必要がある。
$ ls /tank/home/
# 全てのユーザディレクトリが表示されるはず。

$ cd /
$ /homeを外部メディアにバックアップ
$ sudo rm -r /home/*
$ sudo zfs set mountpoint=/home tank/home
$ sudo zfs list
NAME        USED  AVAIL  REFER  MOUNTPOINT
tank        448K  4.89G    96K  /tank
tank/home   124K  4.89G   124K  /home

$ ls /home/
# 以前と同じく全てのユーザディレクトリが表示されるはず。

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
# 省略
tank            4.9G  128K  4.9G   1% /tank
tank/home       4.9G  128K  4.9G   1% /home

再起動して問題なければ、バックアップを削除します。

$ sudo rm /tank/home.tgz

参照と脚注

  1. ZFS on Linux
    これまでもZFSは、FUSEではサポートされていました。

  2. ZFS & Libdvdcss Should Soon Be In Debian – phoronix
    Debian Is Still Working To Tackle ZFS On Linux Support – phoronix

  3. 2015年10月9日号 ZFSとUbuntu・UWN#436 – Ubuntu Weekly Topics

  4. [zfs-discuss] ZoL available on the Ubuntu repositories

  5. Ubuntuパッケージ検索結果

  6. ZFS Stable Releases for Ubuntu

  7. Do I have to use ECC memory for ZFS? – ZFS ON LINUX FAQ

  8. 第7回 ZFSベストプラクティス-FreeBSD Journal March/April 2015 – BSD界隈四方山話

  9. WWNは、World Wide Nameの略。World Wide Name – ウィキペディア

  10. 本来必要なパッケージは全てインストールされるはずですが、
    zfs-dkms is missing dependency on build-essential – Ubuntu zfs-linux package bugs

  11. ZFSでは、ミラーリングの他にraidz1(RAID5相当)とraidz2(RAID6相当)を冗長化に使用できます。

  12. ドライブ2台のミラーリングでは差が現れませんが、Btrfsは容量が異なるドライブを組み合わせても、できるだけ無駄のないpoolを作成してくれます。btrfs disk usage calculator

  13. Btrfsは、使っている容量が収まれば小さい容量のドライブに置き換えることができるそうです。


「ZFSパッケージ登録記念:Ubuntu 15.10にZFS on Linux」への1件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です