zroot を細かく分割する

ストレージサーバの zroot を細かく分割しました。

FreeBSD に初めて触れたのが、このストレージサーバを構築した時なので、zroot をどの程度分割すればよいのか悩み、結局 sysinstall でのインストール時の自動割り当てを参考に分割していました。
(/tmp, /usr, /var のみ…。)

9 ヶ月程 FreeBSD を使ってきて、どこを分割すると良さそうか、分割すると何が良いのか分かってきたので、この機会に分割します。

  • 環境
    • FreeBSD 9.0-RELEASE amd64

プール構成

前後のファイルシステム構成の比較です。
各ファイルシステムに適切な属性を設定します。

いままで

zroot
zroot/tmp                                               setuid=off
zroot/usr
zroot/var

分割後

zroot
zroot/tmp                                               setuid=off
zroot/usr
zroot/usr/home
zroot/usr/local
zroot/usr/ports             compression=lzjb,           setuid=off
zroot/usr/ports/distfiles   compression=off,  exec=off, setuid=off
zroot/usr/ports/packages    compression=off,  exec=off, setuid=off
zroot/usr/src               compression=lzjb, exec=off, setuid=off
zroot/var
zroot/var/db                                  exec=off, setuid=off
zroot/var/db/pkg            compression=lzjb, exec=on,  setuid=off
zroot/var/empty                               exec=off, setuid=off, readonly=on
zroot/var/log               compression=lzjb, exec=off, setuid=off
zroot/var/tmp                                           setuid=off

ぶんかつ!

起動中にいじってもよさそうなパスから分割をはじめます。
今回は、/usr/local, /var/log 以外は大丈夫でしょう。

まず lsof で対象のパス以下の何かが使用中でないか調べ、使用中であればそのプロセスを落とします。
落とせそうになければ後回しにします。

以下は /usr/src を分割するときの例です。
新しいファイルシステムを作成して属性を設定した後、リネームしておいたディレクトリ内から中身をコピーします。
コピーの際に find しているのは、アスタリスクがドットファイルにマッチしないからです。

# mv /usr/src /usr/src_

# zfs create zroot/usr/src
# zfs set compression=lzjb zroot/usr/src
# zfs set exec=off         zroot/usr/src
# zfs set setuid=off       zroot/usr/src

# cd /usr/src_
# cp -a `find ./ -depth 1` /usr/src
# rm -rf /usr/src_

ちなみに、/var/empty には schg フラグが立っており、mv できないので、

# chflags noschg /var/empty

としてから mv してください。

起動中にいじれそうにないパスは、一旦電源を落として Live CD モードなどで起動し、以下のようにマウントして作業します。
(最初から全部これでやれよっていうツッコミは無しで。)

# kldload opensolaris.ko
# kldload zfs.ko

# mkdir /var/mnt
# zpool import -f -R /var/mnt zroot

参考