色々第二弾

せんちゃん: Linux都会を出て、BSD村に戻った漢がいたんですよ〜
小野: なぁ〜にぃ〜!? やっちまったなぁ〜!
せんちゃん: 漢は黙って
小野: ZFSぅ
せんちゃん: 漢は黙って
小野: ZFSぅ
せんちゃん: あらら〜 experimental feature かよ〜
小野: 次!インストール!

ごめんなさい。クールポコさん。ファンです。

ということで、まずはインストール。ZFS boot はまだ難しいようですので、ZFS root で参ります。下記のサイトを参考とさせていただきました。

  1. ZFS root
  2. How to install FreeBSD 7.0 under ZFS | ish

ちなみに、1. に準じた私の前提は下記の通りです。ちなみに、機体は ML115 G1 です。

  • ハードディスクは 2台。
    • 1台目
      • ad4s1a -> / (temporary installed), /boot (finished)
      • ad4s1d -> ZFS pool
    • 2台目
      • ad6 -> /home
  • FreeBSD を Minimal でインストール
    • Express を選択
    • ad4 -> Use Entire Disk
    • ad4s1a -> /, 2048M, UFS2, Y(SoftUpdates)
    • ad4s1d -> /zfs などで作成後、M でマウントポイントを削除, 容量は残りすべて
    • Distributions -> Minimal

Minimal インストール後は、Single User Mode で再起動しての作業となる訳ですが、さすがに sh ですと、かなりキツいので、一連の手順をスクリプト化しておくと、とても楽です。
FreeBSD From Scratch の stage script ほどの美しさはありませんが、実際に使用しているモノを掲載させていただきます。私はこれを USB メモリに収納して実行しています。

これで、ZFS root は完成しました。後は、swap の ZFS 化と、もろもろの設定ですね。

(続く?)

#!/bin/sh -x
# zfs.sh

enterANS() {
    echo 'Please enter yes(enter) or no(no).'
    read ans
    if [ "${ans}" = "no" ]; then
        echo 'Stopped this script!'
        exit 0
    fi
}

rcsDO() {
    rcsdiff $1 | less
    ci -l -m"$2" $1
}

## Initialize ##
# to set basic information of your machine, for example "Drive Letter",
# sourced by CPU name.
cpu_name=`dmesg|egrep -i 'CPU:'`

# Please change "Opteron or Pentium" to CPU name of your machine,
# and set "tank" to Drive Letter of your machine.
case ${cpu_name} in
    *Opteron*)
        server='opteron'
        tank='/dev/ad4s1d'
        ;;
    *Pentium*)
        tank='/dev/ad4s1d'
        ;;
    *)
        tank='/dev/ad8s1d'
esac

## Boot single user mode, type below and do. ##
# mount -w /
# mkdir -p ${path}  # that included this script.
# mount /dev/da0s1d ${path}
# sh -x ${path}/zfs.sh

zpool create tank ${tank}
if [ "${server}" ]; then
    zpool create datatank /dev/ad6  # for second drive.
fi
enterANS

zfs set mountpoint=none tank
if [ "${server}" ]; then
    zfs set mountpoint=none datatank  # for second drive.
fi

zfs create tank/bsdroot
zfs create tank/home
zfs create tank/usr
zfs create tank/var
if [ "${server}" ]; then
    zfs create datatank/tank1  # for second drive.
    zfs create datatank/tank2  # for second drive.
fi

zfs set mountpoint=/tank tank/bsdroot
zfs set mountpoint=/tank/home tank/home
zfs set mountpoint=/tank/usr tank/usr
zfs set mountpoint=/tank/var tank/var

df -h
zfs list

ci -l /etc/rc.conf
echo 'zfs_enable="YES"' >> /etc/rc.conf
rcsDO /etc/rc.conf 'added zfs.'

find -x / | cpio -pmd /tank

rm -rf /tank/boot
mkdir /tank/bootdir
cd /tank
ln -s bootdir/boot boot

ci -l /boot/loader.conf
echo 'zfs_load="YES"' >> /boot/loader.conf
echo 'vfs.root.mountfrom="zfs:tank/bsdroot"' >> /boot/loader.conf
echo '' >> /boot/loader.conf
echo 'tmpfs_load="YES"' >> /boot/loader.conf  # not required, if you want.
rcsDO /boot/loader.conf 'added zfs and tmpfs.'

ci -l /tank/etc/fstab
vi /tank/etc/fstab  # Please change "/" to "/bootdir".
echo '' >> /tank/etc/fstab
# tmpfs is not required, if you want.
echo 'tmpfs    /tmp        tmpfs    rw,mode=1777    0    0' >> /tank/etc/fstab
# echo 'tmpfs    /var/tmp    tmpfs    rw,mode=1777    0    0' >> /tank/etc/fstab
rcsDO /tank/etc/fstab 'modified ad4s1a or ad8s1a and added tmpfs.'

zfs set mountpoint=/home tank/home
zfs set mountpoint=/usr tank/usr
zfs set mountpoint=/var tank/var

cd /
zfs set mountpoint=legacy tank/bsdroot

echo "Congratulations. your ZFS settings was done.\n\
Please type below, and reboot your machine.\n\
# umount path  # that included this script.\n\
# reboot"

exit 0