2014年4月27日日曜日

OpenZFS on OS X (9) ZFSをホームディレクトリにする

前回の後半でZFSをホームディレクトリにするとマウントが間に合わず自動ログインできない、ということを書いていましたが解決しました。
わかってしまえばどうということはなく、zpool importをlaunchdスクリプトではなくrc.localに記述すればいいというだけの話。rc.localは後方互換性のためだけに残されてて優先順位は低いと思ってたので盲点でした。

以下、細かい注意点など。



今まではここのlaunchdスクリプトを使っていたわけですが、/Library/LaunchDaemons/に置いても/System/Library/LaunchDaemons/に置いても自動ログインには間に合いませんでした。
しかし/etc/rc.localに以下のように記述することで自動ログインでもマウントが間に合うようになりました。
#!/bin/bash

/usr/sbin/zpool import -f userpool
/usr/sbin/zpool import -f -a
この時点ではまだパスが通ってないのでzpoolコマンドはフルパスで書く必要があります(開発版なら/usr/local/bin/zpool)。
また、複数プールがある場合zpool import -f -aではホームディレクトリのあるプールが最初にimportされず(あるいはプール検索が挟まる分遅くなって)コケることがあるので、しっかりプール名を書く必要があります。ホームディレクトリに関係の無いプールはその後でまとめてimport -f -aでimportすればOKです。
もちろんrc.localには他の内容も記述できますが、importを最初に書いた方がいいと思います。

rc.localを利用した場合、launchdスクリプトは不要になった上spl.kextもzfs.kextも/System/Library/Extensionsに置く必要も無く/Library/Extensionsに置いたまま自動ログインできました。
ただ、rc.local自体がOS Xではもう非推奨な上、ログイン前に読み込まれることが仕様上保証されているわけでもないので、できればlaunchdでなんとかしたいところです。

なんにせよ、ZFSをホームディレクトリにするとimportが間に合う/間に合わないの微妙な問題が起こるだけでうまくログインできないということが起こるので、/Usersに普通に配置した非ZFSなメンテ用アカウントは必須です。また、マウントが間に合わない状態でログインすると、HFS+ボリューム上に自動生成された初期設定ファイル・フォルダとZFSデータセット上のファイル・フォルダが混ざるという不可解なトラブルが発生するので、そうなった際ホームディレクトリが壊れることを防ぐためにも定期的にホームディレクトリのsnapshotを取ってrollbackできるようにした方がいいと思います。

自分は今回の検証で何度もホームディレクトリがぐちゃぐちゃになったので、その度に
自動ログインを切る
→再起動してメンテ用アカウントでログイン
→ZFSホームディレクトリを# zfs umountでアンマウント
→残ったホームディレクトリの残骸(なんと空ではなく~/Libraryが存在したりする)を削除
→# zfs rollbackでホームディレクトリを以前の状態に戻す
→# zfs mountで再マウント・再ログイン
という手順を踏んで復旧していました。
正直ここまでのリスクを負ってまでホームディレクトリをZFSにするのは実用というかただのマゾな趣味でしかありませんが、参考までに。

2 件のコメント:

  1. 我々は新バージョンをリリースした、それを試みる時間があることを望む。

    返信削除
  2. コメントありがとうございます。開発者の方からコメントをいただけるとは驚きです。
    私は既にO3X 1.2.7をインストールしています。今度、レビューを書きたいと思っています。
    素晴らしいソフトウェアをありがとうございます。

    Thank you for your comment.
    I'm surprised to get a comment from the lead developer of O3X!
    I already installed O3X 1.2.7 to my hackintosh, and I'm going to write a review of this version later.
    Thank you for the great software.

    返信削除