Ubuntu on Native ZFSを15.04へアップグレードする時の注意点

このメモは、ZFS On Linux(ZOL)をUbuntuのRootファイルシステムとしている場合の話です。

Ubuntu 15.04(Vivid Vervet)が、予定どおり公開されました

早速Ubuntu 14.10から15.04にアップグレードと行きたいところですが、upstartがsystemdに変更によるものなどいくつかの注意点が有りました。

注意点は、次の3つです。

zfs.koの確認を忘れない

これは毎回リリース・アップグレードをする時の注意点です。

ZFS On Linuxは、外部パッケージとして提供されるカーネルモジュールです。そのためカーネルの版が変わる度に新しくモジュールを作ってインストールする必要が有ります。もっともDKMSが自動的にインストールしてくれるので普段のapt-get dist-upgradeでは気にする必要はありません。

今回の14.10から15.04へなどリリースアップグレード時には外部パッケージのソースが無効にされてしまいます。そのため新しいカーネルがインストールされても対応するZFSのカーネル・モジュールはインストールされないかもしれません。もし対応するカーネル・モジュールがインストールされなければ、再起動してカーネルが変わると起動できなくなってしまいます。

そこでリリース・アップグレードをしたら、再起動する前に必ず新しいカーネルに対応するZFSモジュールが有るか確認します

$ sudo zfs snap -r tank@20150424 # upgradeに失敗してもrollbackで元に戻せる。
$ sudo zfs clone tank/ROOT/ubuntu@20150424 tank/ROOT/utopic # optional
$ sudo backup-zfs.sh # バックアップを取る

$ sudo apt-get update && sudo apt-get install -y update-manager-core
$ do-release-upgrade

... アップグレード ...

アップグレードを完了するには再起動が必要です。 
'Y' を選択すると再起動します。 

続行する[yN] # Nを選択して再起動しない

$ find /lib/modules -name zfs.ko -print
/lib/modules/3.19.0-15-generic/updates/dkms/zfs.ko

今回は新しいカーネルに対応するモジュールが有るので、このまま再起動しても大丈夫かも。ただしutopicのソースから作成されたモジュールなのでアップグレードしておく。

$ sudo nano /etc/apt/sources.list.d/zfs-native-*.list
$ sudo apt-get update && sudo apt-get upgrade -y

$ sudo shutdown -r now

mountall問題

Ubuntu 15.04の大きな変更点は、upstartの代わりにsystemdが使われるようになったことです。

この影響でmountallがRoot以外のZFSをマウント出来なくなってしまいました。そのため/varなど細かいファイルシステムに分けていると正しく起動できません。起動までに必要なファイルが全てRootと同じファイルシステム内に有れば起動には問題有りません。

ただしユーザが作成したZFSは起動時にはマウントされていません。そこでmountallが修正されるまでのworkaroundは、起動した後にcrontabなどからzfs mountを呼び出してマウントしています。

@reboot /sbin/zfs mount -a -O

起動した後でzpool importした場合は、問題なくmountpoint設定に応じて自動的に指定場所にマウントされます。

zpool upgradeしないこと

これはUbuntu 15.04へのアップグレードとは直接関係なく、どのバージョンのUbuntuを使っていても注意する必要がある点です。

先日ZFS On Linux 0.6.4が公開されました。この版では、ZPOOLに新しい機能がいろいろ追加されました。

しかしUbuntuを起動させるGrubがまだ新しい機能を有効にしたZPOOLに対応していません。そのためzpool upgradeで新しい機能を有効にしてしまうとGrubがファイルシステムを見つけられなくなり、結果としてシステムを起動できなくなったしまいます。

GrubがZPOOLを認識しない
GrubがZPOOLを認識しない

また新規にRootファイルシステムとなるZPOOLを作成する時には、次のようにこれまでの機能のみを有効にして作成します。

zpool create -f -d -o feature@async_destroy=enabled -o feature@empty_bpobj=enabled -o feature@lz4_compress=enabled -o ashift=12 -o autoexpand=on -O atime=off pool_name devices