FreeBSD Daily Topics

2010年6月29日pkg_delete -aの代わりにファイルシステムごとクリアする方法

tips

Use zfs destroy or rollback instaed of pkg_delete -af

Ports Collectionを使って頻繁にアプリケーションを更新している場合、ビッグコミットのタイミングでほぼすべてのアプリケーションをビルドし直すといった状況になることがあります。またPorts Collectionは常に開発段階にあるため、更新するタイミングによっては誤った依存関係が入り込むこともあります。

そうなった場合、一旦すべてのアプリケーションを削除し、もう一度入れ直した方がいい場合があります。典型的にはpkg_delete -afですべてのアプリケーションを削除して、もう一度Ports Collection経由ですべてをインストールします。

FreeBSDをワークステーションとして利用しているケースでは、GnomeやKDEと代表的なアプリケーションを使っているだけで800ほどのアプリケーションやライブラリ、ツールがインストールされます。必要なものに絞っても600を越えてきます。H/Wの性能にも左右されますが、pkg_delete -afの実行が完了するまで30分から1時間といった時間がかかります。

こうした場合、アプリケーションやライブラリがインストールされる/usr/localと/var/db/pkgをファイルシステムごとクリアしてpkg_delete -afの代わりにする方法があります。数十分というレベルから数十秒というレベルまで時間の短縮が可能です。/usr/localに以下に作成した設定ファイルやデータもすべてクリアされますので、必要なデータがある場合にはバックアップをとっておく必要がありますが、動作が把握できているならファイルシステムごとのクリアはなかなか魅力的な方法です。

たとえば次のようにZFSでファイルシステムを割り当て運用します。

/usr/localと/var/db/pkgをZFS上に作成
# zfs create tank/usr
# zfs create tank/usr/usr
# zfs create tank/var
# zfs create tank/var/db
# zfs create tank/var/db/pkg
# zfs set mountpoint=none tank/usr
# zfs set mountpoint=/usr/local tank/usr/local
# zfs set mountpoint=none tank/var
# zfs set mountpoint=none tank/var/db
# zfs set mountpoint=/var/db/pkg tank/var/db/pkg
/usr/localと/var/db/pkgの利用状況
% zfs list | grep -E "(var/db/pkg)|(usr/local)"
tank/usr/local        3.55G  66.3G  3.55G  /usr/local
tank/var/db/pkg       51.5M  66.3G  51.5M  /var/db/pkg
%

pkg_delete -afを実行するかわりに、次のように一旦ファイルシステムをデストロイしてから、ふたたび作成してクリアします。クリア後にアプリケーションのインストールを開始します。

一旦削除してからもう一度作成
# zfs destroy -f tank/usr/local
# zfs destroy -f tank/var/db/pkg
# zfs create tank/usr/local
# zfs create tank/var/db/pkg
# zfs set mountpoint=/usr/local tank/usr/local
# zfs set mountpoint=/var/db/pkg tank/var/db/pkg

destroyからcreateという作業の代わりに、最初にtank/usr/localとtank/var/db/pkgを作成した段階でスナップショットを作成し、このスナップショットへロールバックするという方法もあります。

作成段階でスナップショットをとっておく
# zfs snapshot tank/usr/local@initial
# zfs snapshot tank/var/db/pkg@initial
# zfs list -t snapshot
NAME                      USED  AVAIL  REFER  MOUNTPOINT
tank/usr/local@initial     17K      -    18K  -
tank/var/db/pkg@initial    17K      -    18K  -
#
destroyするかわりにスナップショットへロールバック
# zfs rollback tank/usr/local@initial
# zfs rollback tank/var/db/pkg@initial

destroyする方法もrollbackする方法も、処理時間にはそれほど大きな違いはありません。ZFSを利用するとこうした作業を実現することができます。ファイルシステムレベルでの柔軟な運用が可能になるため、これまでUFS+GEOMで実施してきた管理とはまったく違った視点からのアプローチが可能です。

おすすめ記事

記事・ニュース一覧