此章讨论在ZFS上安装FreeBSD10。
此章演示的脚本适用于偶尔安装几台机器,对于机架配置机器,建议使用基于PXE的安装程序。
硬件限制了选择,比如笔记本电脑只有一个硬盘,运行FreeBSD意味着使用单个条带虚拟设备池。如果有数百个磁盘,需要考虑如何划分池。
如果有许多磁盘,应将操作系统和数据分开。
FreeBSD和一系列附加软件非常适合镜像池或RAID-Z。
不要把操作系统安装到RAID-Z3上。
安装基于ZFS的系统需要配置存储池、分配数据集,并为数据集安装FreeBSD。
在自定义安装FreeBSD系统之前,可以先安装一个小型的FreeBSD ZFS虚拟机作为参考平台。
安装程序提供了一些经过深思熟虑的默认设置,尽量不要错过。
启动参考平台,以root登录,运行zfs history命令查看此ZFS使如何创建的:
# zpool history
History for 'zroot':
2015-04-08.07:18:30 zpool create -o altroot=/mnt -O compress=lz4 -O atime=off -m none -f zroot raidz1 da0p3.nop da1p3.nop da2p3.nop
2015-04-08.07:18:30 zfs create -o mountpoint=none zroot/ROOT
2015-04-08.07:18:30 zfs create -o mountpoint=/ zroot/ROOT/default
2015-04-08.07:18:30 zfs create -o mountpoint=/tmp -o exec=on -o setuid=off zroot/tmp
...
我们将在整个安装过程中使用这些信息来调整我们的安装。
以下是FreeBSD14.1安装的情况:
2024-09-11.18:21:03 zpool create -o altroot=/mnt -O compress=lz4 -O atime=off -m none -f zroot ada0p3
2024-09-11.18:21:03 zfs create -o mountpoint=none zroot/ROOT
2024-09-11.18:21:03 zfs create -o mountpoint=/ zroot/ROOT/default
2024-09-11.18:21:03 zfs create -o mountpoint=/home zroot/home
2024-09-11.18:21:03 zfs create -o mountpoint=/tmp -o exec=on -o setuid=off zroot/tmp
2024-09-11.18:21:03 zfs create -o mountpoint=/usr -o canmount=off zroot/usr
2024-09-11.18:21:03 zfs create -o setuid=off zroot/usr/ports
2024-09-11.18:21:03 zfs create zroot/usr/src
2024-09-11.18:21:03 zfs create -o mountpoint=/var -o canmount=off zroot/var
2024-09-11.18:21:03 zfs create -o exec=off -o setuid=off zroot/var/audit
2024-09-11.18:21:03 zfs create -o exec=off -o setuid=off zroot/var/crash
2024-09-11.18:21:03 zfs create -o exec=off -o setuid=off zroot/var/log
2024-09-11.18:21:03 zfs create -o atime=on zroot/var/mail
2024-09-11.18:21:03 zfs create -o setuid=off zroot/var/tmp
2024-09-11.18:21:03 zfs set mountpoint=/zroot zroot
2024-09-11.18:21:03 zpool set bootfs=zroot/ROOT/default zroot
2024-09-11.18:21:04 zpool set cachefile=/mnt/boot/zfs/zpool.cache zroot
2024-09-11.18:21:04 zfs set canmount=noauto zroot/ROOT/default
==以下是在安装过程中创建了第一个账户,安装脚本为此用户创建家目录,并做相关配置==
2024-09-11.10:24:21 zfs create -u zroot/home/lidapeng
2024-09-11.10:24:21 zfs set mountpoint=legacy zroot/home/lidapeng
2024-09-11.10:24:21 zfs allow lidapeng create,destroy,mount,snapshot zroot/home/lidapeng
2024-09-11.10:24:21 zfs inherit mountpoint zroot/home/lidapeng
引导到FreeBSD安装程序映像,然后选择安装。
到对磁盘进行分区时,选择命令行,而不是任何自动或引导方法。
当计算机启动时,它会在存储介质上查找操作系统。
对于FreeBSD,这是个引导加载程序(boot loader)。
FreeBSD提供了gptzfsboot引导加载程序,专门用于从ZFS池引导。
硬件BIOS启动引导加载程序,激活池并启动FreeBSD内核。
引导池中每个虚拟设备中的每个磁盘都应该安装ZFS引导加载程序,这意味着必须对磁盘进行分区。
基于某种愚蠢的原因,FreeBSD引导加载程序分区的最大大小仅略高于512KB,因此,引导加载程序分配512KB。
然后放入一个1GB的FreeBSD交换分区,并将剩余空间分配给ZFS。
交换分区和ZFS分区以1MB的边界对齐。
x
# zpool labelclear -f ada0
==以上命令删除ada0上的zfs信息==
# gpart destroy -F ada0
# gpart create -s gpt ada0
==以上两行销毁ada0上现有的分区,并创建gpt分区==
# gpart add –a 1m -t freebsd-boot -s 512k -l zfsboot da0
da0p1 added
# gpart add –a 1m -t freebsd-swap -s 1g -l swap0 da0
da0p2 added
# gpart add –a 1m -t freebsd-zfs -l zfs0 da0
da0p3 added
然后安装FreeBSD ZFS bootloader到磁盘上。每个可以启动的磁盘都需要bootloader:
xxxxxxxxxx
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0
bootcode written to da0
对存储池中涉及到的每个磁盘重复以上操作。
仍然在磁盘格式化命令提示符处,将磁盘组装到跟存储池中。
通常将根池成为system或zroot,或者自行定义。
以下是默认FreeBSD安装时zpool history的信息,
xxxxxxxxxx
2015-04-08.07:18:30 zpool create -o altroot=/mnt -O compress=lz4 -O atime=off -m none -f zroot raidz1 da0p3.nop da1p3.nop da2p3.nop
这是FreeBSD10.1系统。
安装程序在/mnt临时挂载引导池。根据实际情况修改一些设置,比如将压缩设置lz4、禁用atime、-m none告诉zpool不要向该池分配挂载点、适用-f选项让zpool忽略磁盘上的任何其他ZFS信息、altroot属性提供一个临时挂载点。
10.1安装程序尚未更新以利用vfs.zfs.min_auto_ashift sysctl,我们要使用它:
xxxxxxxxxx
# sysctl vfs.zfs.min_auto_ashift=12
ZFS现在使用4k字节扇区。使用以下命令创建池:
xxxxxxxxxx
# zpool create -o altroot=/mnt -O compress=lz4 -O atime=off -m none -f zroot mirror gpt/zfs0 gpt/zfs1 cache gpt/zcache0 log gpt/zlog0
很有可能,FreeBSD的默认池安装选项很好。我们可能会想调整数据集。
参考FreeBSD安装的默认值,对于普通用户来说是明智的。
建议添加自己的数据集,但保持默认值不变。
以下是参考FreeBSD主机上zpool history的一些片段,省略了时间戳:
xxxxxxxxxx
zfs create -o mountpoint=none zroot/ROOT
zfs create -o mountpoint=/ zroot/ROOT/default
zfs create -o mountpoint=/tmp -o exec=on -o setuid=off zroot/tmp
zfs create -o mountpoint=/usr -o canmount=off zroot/usr
zfs create zroot/usr/home
zfs create -o setuid=off zroot/usr/ports
zfs create zroot/usr/src
zfs create -o mountpoint=/var -o canmount=off zroot/var
zfs create -o exec=off -o setuid=off zroot/var/crash
zfs create -o exec=off -o setuid=off zroot/var/log
zfs create -o atime=on zroot/var/mail
zfs create -o setuid=off zroot/var/tmp
zpool set bootfs=zroot/ROOT/default zroot
zpool set cachefile=/mnt/boot/zfs/zpool.cache zroot
根据自己的需求创建一些自己数据集,比如zroot/var/mysql等。
参考FreeBSD Mastery: Storage Essentials创建安装脚本。
完成以上操作后退出命令行分区,安装程序将继续。
以下是按照FreeBSD14.1默认安装情况修改的:
zpool create -o altroot=/mnt -O compress=lz4 -O atime=off -m none -f zroot ada0p3
zfs create -o mountpoint=none zroot/ROOT
zfs create -o mountpoint=/ zroot/ROOT/default
zfs create -o mountpoint=/home zroot/home
zfs create -o mountpoint=/tmp -o exec=on -o setuid=off zroot/tmp
zfs create -o mountpoint=/usr -o canmount=off zroot/usr
zfs create -o setuid=off zroot/usr/ports
zfs create zroot/usr/src
zfs create -o mountpoint=/var -o canmount=off zroot/var
zfs create -o exec=off -o setuid=off zroot/var/audit
zfs create -o exec=off -o setuid=off zroot/var/crash
zfs create -o exec=off -o setuid=off zroot/var/log
zfs create -o atime=on zroot/var/mail
zfs create -o setuid=off zroot/var/tmp
zfs set mountpoint=/zroot zroot
zpool set bootfs=zroot/ROOT/default zroot
zpool set cachefile=/mnt/boot/zfs/zpool.cache zroot
zfs set canmount=noauto zroot/ROOT/default
zfs create -u zroot/home/lidapeng
zfs set mountpoint=legacy zroot/home/lidapeng
zfs allow lidapeng create,destroy,mount,snapshot zroot/home/lidapeng
zfs inherit mountpoint zroot/home/lidapeng
安装程序完成将文件复制到磁盘、设置网络等操作,有机会进入已安装的系统并进行修改。
确保ZFS在/etc/rc.conf中启动,这将在启动时挂载文件系统数据集:
xxxxxxxxxx
zfs_enable=yes
编辑/boot/loader.conf告诉FreeBSD在启动时加载ZFS:
xxxxxxxxxx
zfs_load="YES"
完成后重启系统。
如果必须去命令行对磁盘进行分区,也可以自己将FreeBSD安装到磁盘上。FreeBSD发行版文件位于/usr/FreeBSD-dist中,可以使用tar命令将它们写入到磁盘。
假设安装目标已经挂载在/mnt中:
xxxxxxxxxx
# tar --unlink -xpJf base.txz -C /mnt
# tar --unlink -xpJf kernel.txz -C /mnt
可以安装其他分发集,但base和kernel时唯一关键的。
手动安装需要一个/etc/fstab文件,用于swap文件。在/mnt/etc/fstab中创建它。
还可以编辑关键系统文件。如/mnt/etc/rc.conf和/mnt/boot/loader.conf。
通过一些工作和测试,可以使ZFS安装变得简单或复杂。