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 がファイルシステムを見つけられなくなり、結果としてシステムを起動できなくなったしまいます。
また新規に 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