Ubuntu を ZFS でインストールしてみた
Linux での ZFS の利用を確認したかったので、Ubuntu を VirtualBox 上でインストールしてみました。
Linux で ZFS を正式サポートしているディストリビューションは少ないですが、Ubuntu はインストーラーで ZFS を選択できるため、手軽に試せます。





インストールが終わると、ファイルシステムが ZFS になった以外は普通の Ubuntu です。
ファイルシステムを確認してみました。
$ df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 390M 1.6M 389M 1% /run
rpool/ROOT/ubuntu_ddfqbe 17G 2.7G 14G 17% /
rpool/ROOT/ubuntu_ddfqbe/srv 14G 128K 14G 1% /srv
rpool/ROOT/ubuntu_ddfqbe/usr/local 14G 128K 14G 1% /usr/local
rpool/ROOT/ubuntu_ddfqbe/var/games 14G 128K 14G 1% /var/games
rpool/ROOT/ubuntu_ddfqbe/var/lib 15G 956M 14G 7% /var/lib
rpool/ROOT/ubuntu_ddfqbe/var/lib/AccountsService 14G 128K 14G 1% /var/lib/AccountsService
rpool/ROOT/ubuntu_ddfqbe/var/lib/NetworkManager 14G 256K 14G 1% /var/lib/NetworkManager
rpool/ROOT/ubuntu_ddfqbe/var/lib/apt 14G 100M 14G 1% /var/lib/apt
rpool/ROOT/ubuntu_ddfqbe/var/lib/dpkg 14G 32M 14G 1% /var/lib/dpkg
rpool/ROOT/ubuntu_ddfqbe/var/log 14G 3.0M 14G 1% /var/log
rpool/ROOT/ubuntu_ddfqbe/var/mail 14G 128K 14G 1% /var/mail
rpool/ROOT/ubuntu_ddfqbe/var/snap 14G 1.4M 14G 1% /var/snap
rpool/ROOT/ubuntu_ddfqbe/var/spool 14G 128K 14G 1% /var/spool
rpool/ROOT/ubuntu_ddfqbe/var/www 14G 128K 14G 1% /var/www
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 5.0M 8.0K 5.0M 1% /run/lock
efivarfs 256K 16K 236K 7% /sys/firmware/efi/efivars
rpool/USERDATA/home_agpz85 14G 2.2M 14G 1% /home
rpool/USERDATA/root_agpz85 14G 128K 14G 1% /root
bpool/BOOT/ubuntu_ddfqbe 1.8G 106M 1.7G 6% /boot
/dev/sda1 1.1G 6.2M 1.1G 1% /boot/efi
tmpfs 390M 124K 390M 1% /run/user/1000
ずいぶんと細かく dataset が刻まれています。万人向けだとこうなるのでしょうか? FreeBSD の dataset がずいぶんシンプルに感じられます。
Ubuntu/ZFS の起動プロセス
FreeBSD と比べると、ZFS での起動プロセスは少々複雑でトリッキーです。
UEFI
↓
GRUB(ZFS 対応)
↓
Linux カーネル + initramfs
↓
initramfs 内で ZFS モジュール(zfs.ko)読み込み
↓
zpool import -N
↓
root データセットをマウント
↓
/sbin/init 実行
この initramfs というのは、メモリで小さな RAM Disk を作り、その中に小さな Linux 環境を構築するというものです。これにより、zfs.ko というカーネルモジュールを読み込んでフルサービスを開始するまでの間、最小限の ZFS サポートを可能にします。
initramfs(圧縮アーカイブ)
↓
RAM 展開
↓
仮 root として起動
↓
本当の root へ switch
これは、FreeBSD のローダーが ZFS の完全な機能を活用できるのに対し、GRUB の ZFS 機能が限定(暗号化されたものなどは直接読み込めない)されているための処置です。
ちなみに FreeBSD の起動プロセスは次のようにシンプルです。
UEFI
↓
loader.efi
↓
ZFS 直接読み込み
↓
カーネル起動
Linux でも、GRUB を使わないさまざまなアプローチが試行されています。ZFS用 のブートマネージャーに ZFSBootMenu があります。これを使えば、起動プロセスが FreeBSD のようにシンプルになりますが、導入は茨の道です。
インストーラーが使えず、ほぼ Linux ディストリビューションをスクラッチから組み上げるような作業になります(でも、ext4 と比較すると、この作業は楽です)。git clone で取ってきて、EFI に ZFSBootMenu を置き、pool を作り、dataset を作り、ディストリビューションを展開するという流れです。NetBSD に詳しい方なら「NetBSD install without sysinst」に近い感覚といえるかもしれません。
FreeBSD の Boot Environment(BE)機能を再現する
FreeBSD では、freebsd-update install で自動的に BE が保存されたり、bectl create で手動作成できますが、Ubuntu では少し手間がかかります。OS レベルでは仕組みがないため、ZFS の機能を使って手作業で行います。ただし、それほど難しくはありません。
zfs snapshot rpool/ROOT/ubuntu@pre
zfs clone rpool/ROOT/ubuntu@pre rpool/ROOT/ubuntu-test
zpool set bootfs=rpool/ROOT/ubuntu-test rpool
これで、bectl create と bectl activate と同等の機能が実現できます。shell script にすれば良いでしょう。
試してはいませんが、ZFSBootMenu を導入した場合は、上記の作業がメニューから簡単にできるそうです。
もし ZFS をデフォルトに据えるディストリビューションが現れたとしたら、この ZFSBootMenu がブートマネージャーとして採用されることになるでしょう。
まとめ
今回 Ubuntu に ZFS をインストールしてみましたが、気軽に試せるというメリット以外に、デスクトップで ZFS を使う積極的な理由は見当たりませんでした。Linux における ZFS は、どうしてもこの魅力的なファイルシステムを使いたいというサーバー用途での需要を満たす、という位置づけにとどまっていると思います。
その根本的な理由は、ZFS が GPL ではなく CDDL ライセンスであるため、カーネル本体に組み込めず、あくまで外部モジュールという扱いになっているからです。
おそらく信頼性・安定性の観点から、カーネルと基本ユーティリティは ext4 に置かれ、データ領域だけ ZFS という使い方が主流になっていると思われます。
お試しではなく、本格的に ZFS のメリットをフルに享受したいのであれば、FreeBSD をおすすめします。その理由は次のとおりです。
ZFS がベース OS と一体設計されている
ブートローダーが ZFS を直接理解している
bectl が標準搭載されている
カーネルと ZFS の整合性が保たれている
/boot も同一プールに置ける
次回は、Linux における ZFS対抗馬である次世代ファイルシステムの Btrfs について調べてみたいと思います。
訂正記事について
当記事において、
「デスクトップで ZFS を使うメリットはない」
と書いてしまいましたが、改めて調べてみると大きな思い違いをしていたことがわかりました。Linux での ZFS 開発に多大な努力を注いでいる OpenZFS チームの開発者の方々の取り組みを無にするような不適切な記述でした。
申し訳ありませんでした。
以下の記事において訂正させていただきましたので、是非ご覧ください。
