ZFS boot の設定方法 †
下準備 †
パーティションを作成し、ZFS プールを作成する。 †シングルディスク構成の場合 †
ミラー構成の場合 †
ZFS でファイルシステムを作成する。 †方針 †
手順 †
謎のスクリプト †動作保証なし。 Use at your own risk. #!/bin/sh
if [ $# -ne 4 ]; then
echo "usage: create_ZFS_root_single.sh DISK0 SWAP_SIZE GPT_DISK0_NAME POOL_NAME"
echo "ex. ./create_ZFS_root_single.sh ad0 2g disk0 zroot"
exit 1
fi
DISK0=$1
SWAP_SIZE=$2
GPT_DISK0_NAME=$3
POOL_NAME=$4
echo "ERASE ALL DATA ON $DISK0. OK? enter 'yes'"
read ANSWER
if [ "$ANSWER" != "yes" ]; then
echo "bye!"
exit 2
fi
echo Delete partition info.
dd if=/dev/zero of=/dev/$DISK0 bs=1m count=1
echo Create partition.
gpart create -s gpt $DISK0
gpart add -s 64K -t freebsd-boot $DISK0
gpart add -s $SWAP_SIZE -t freebsd-boot $DISK0
gpart add -t freebsd-zfs -l $GPT_DISK0_NAME $DISK0
gpart bootcode -b /mnt2/boot/pmbr -p /mnt2/boot/gptzfsboot -i 1 $DISK0
echo Load ZFS module
kldload /mnt2/boot/kernel/opensolaris.ko
kldload /mnt2/boot/kernel/zfs.ko
echo ZFS check
zpool import
echo "NO POOL CHECK OK? enter 'yes'"
read ANSWER
if [ "$ANSWER" != "yes" ]; then
echo "bye!"
exit 2
fi
echo create ZFS pool
mkdir /boot/zfs
zpool create $POOL_NAME /dev/gpt/$GPT_DISK0_NAME
echo create ZFS filesystem
mkdir /tmproot
zfs set checksum=fletcher4 $POOL_NAME
zfs set atime=off $POOL_NAME
zfs set mountpoint=legacy $POOL_NAME
zfs create ${POOL_NAME}/system
zfs create ${POOL_NAME}/system/sysroot
zfs create ${POOL_NAME}/system/usr
zfs create ${POOL_NAME}/system/var
zfs create -o compression=lzjb -o exec=off -o setuid=off ${POOL_NAME}/system/var/crash
zfs create -o exec=off -o setuid=off ${POOL_NAME}/system/var/db
zfs create -o compression=lzjb -o exec=on -o setuid=off ${POOL_NAME}/system/var/db/pkg
zfs create -o exec=off -o setuid=off ${POOL_NAME}/system/var/empty
zfs create -o compression=lzjb -o exec=off -o setuid=off ${POOL_NAME}/system/var/log
zfs create -o compression=lzjb -o exec=off -o setuid=off ${POOL_NAME}/system/var/mail
zfs create -o compression=lzjb -o exec=on -o setuid=off ${POOL_NAME}/system/var/tmp
zfs create -o compression=lzjb -o exec=on -o setuid=off ${POOL_NAME}/ports
zfs create -o exec=off -o setuid=off ${POOL_NAME}/ports/distfiles
zfs create -o exec=off -o setuid=off ${POOL_NAME}/ports/packages
zfs create -o compression=lzjb -o exec=off -o setuid=off ${POOL_NAME}/src
zfs create ${POOL_NAME}/home
zpool set bootfs=${POOL_NAME}/system/sysroot ${POOL_NAME}
echo mount ZFS filesystem
mount -t zfs ${POOL_NAME}/system/sysroot /tmproot
mkdir /tmproot/tmp
chmod 1777 /tmp
mkdir /tmproot/usr
mount -t zfs ${POOL_NAME}/system/usr /tmproot/usr
mkdir /tmproot/usr/home
mount -t zfs ${POOL_NAME}/home /tmproot/usr/home
ln -s /usr/home /tmproot/home
mkdir /tmproot/usr/ports
mount -t zfs ${POOL_NAME}/ports /tmproot/usr/ports
mkdir /tmproot/usr/ports/distfiles
mount -t zfs ${POOL_NAME}/ports/distfiles /tmproot/usr/ports/distfiles
mkdir /tmproot/usr/ports/packages
mount -t zfs ${POOL_NAME}/ports/packages /tmproot/usr/ports/packages
mkdir /tmproot/usr/src
mount -t zfs ${POOL_NAME}/src /tmproot/usr/src
mkdir /tmproot/var
mount -t zfs ${POOL_NAME}/system/var /tmproot/var
mkdir /tmproot/var/crash
mount -t zfs ${POOL_NAME}/system/var/crash /tmproot/var/crash
mkdir /tmproot/var/db
mount -t zfs ${POOL_NAME}/system/var/db /tmproot/var/db
mkdir /tmproot/var/db/pkg
mount -t zfs ${POOL_NAME}/system/var/db/pkg /tmproot/var/db/pkg
mkdir /tmproot/var/empty
mount -t zfs ${POOL_NAME}/system/var/empty /tmproot/var/empty
mkdir /tmproot/var/log
mount -t zfs ${POOL_NAME}/system/var/log /tmproot/var/log
mkdir /tmproot/var/mail
mount -t zfs ${POOL_NAME}/system/var/mail /tmproot/var/mail
mkdir /tmproot/var/tmp
mount -t zfs ${POOL_NAME}/system/var/tmp /tmproot/var/tmp
chmod 1777 /tmproot/var/tmp
echo "Extract FreeBSD distribution. OK? enter 'yes'"
read ANSWER
if [ "$ANSWER" != "yes" ]; then
echo "bye!"
exit 2
fi
echo extract FreeBSD distribution
cd /dist/8.0-*
export DESTDIR=/tmproot
for dir in base catpages dict doc games info lib32 manpages ports
do
(cd $dir ; ./install.sh) ;
done
cd src ; ./install.sh all
cd ../kernels ; ./install.sh generic
cd /tmproot/boot ; cp -Rlp GENERIC/* /tmproot/boot/kernel/
echo set configuration
zfs set readonly=on ${POOL_NAME}/system/var/empty
#exit 1
cat <<CHROOTSCRIPT_EOT >/tmproot/zfssinglechroot.sh
#!/bin/sh
cat <<EOT >> /etc/fstab
# Device Mountpoint FStype Options Dump Pass#
/dev/gpt/swap0 none swap sw 0 0
zroot/system/sysroot / zfs rw 0 0
zroot/system/usr /usr zfs rw 0 0
zroot/ports /usr/ports zfs rw 0 0
zroot/ports/distfiles /usr/ports/distfiles zfs rw 0 0
zroot/ports/packages /usr/ports/packages zfs rw 0 0
zroot/src /usr/src zfs rw 0 0
zroot/system/var /var zfs rw 0 0
zroot/system/var/crash /var/crash zfs rw 0 0
zroot/system/var/db /var/db zfs rw 0 0
zroot/system/var/db/pkg /var/db/pkg zfs rw 0 0
zroot/system/var/empty /var/empty zfs rw 0 0
zroot/system/var/log /var/log zfs rw 0 0
zroot/system/var/mail /var/mail zfs rw 0 0
tmpfs /var/run tmpfs rw,size=10000000 0 0
zroot/system/var/tmp /var/tmp zfs rw 0 0
tmpfs /tmp tmpfs rw,mode=1777,size=1073741824 0 0
tmpfs /ports/tmp tmpfs rw,size=1073741824 0 0
EOT
echo 'zfs_enable="YES"' >> /etc/rc.conf
echo 'hostname="zfsroot.localdomain"' >> /etc/rc.conf
echo 'ifconfig_re0="DHCP"' >> /etc/rc.conf
echo 'zfs_load="YES"' >> /boot/loader.conf
echo 'vfs.root.mountfrom="zfs:zroot/system/sysroot"' >> /boot/loader.conf
echo reinstall boot loader
echo 'LOADER_ZFS_SUPPORT=YES' >> /etc/src.conf
mount -t devfs devfs /dev
export DESTDIR=""
cd /usr/src/sys/boot
make obj
make depend
make
cd i386/loader
make install
cd /etc/mail
make aliases
umount /dev
exit
CHROOTSCRIPT_EOT
chmod +x /tmproot/zfssinglechroot.sh
chroot /tmproot /zfssinglechroot.sh
rm /tmproot/zfssinglechroot.sh
cp /boot/zfs/zpool.cache /zroot/boot/zfs/zpool.cache
echo Exit Fixit and reboot, then enter single mode.
echo and then enter follow command.
echo # zfs set mountpoint=/usr/home zroot/home
echo # exit
|