FreeBSD:ZFS Install: Difference between revisions
Line 111: | Line 111: | ||
{{Code|gpart delete -i 1 ada0}} | {{Code|gpart delete -i 1 ada0}} | ||
{Code|gpart destroy ada0}} | {{Code|gpart destroy ada0}} | ||
Create a new partitioning scheme on each disk. | Create a new partitioning scheme on each disk. |
Revision as of 02:26, 23 January 2012
The following is how to install FreeBSD on ZFS root using GPT. This will offer redundancy and scaling of performance (with additional drives) for you to base your system off of while maintaining efficiency of disk usage. This guide is mainly suited for workstations, home file servers, and media center PCs. It is setup for use with FreeBSD 9+ and was directly tested with 9.0-CURRENT-201101-amd64 version of FreeBSD with the new BSDInstall[1].
Introduction to FreeBSD
I am going to make the assumption that you have at least a basic knowledge of the command line in FreeBSD. If you are new to FreeBSD all hope is not lost. The FreeBSD Handbook is the primary source of documentation produced by the FreeBSD Documentation Project. Aside from this recently there has also been another great article written by Paul Venezia at InfoWorld entitled Why aren't you using FreeBSD?. If you are familiar with linux but new to FreeBSD there is the FreeBSD Quickstart Guide for Linux Users. Last but not least if you are coming over from Windows you can take a look at FreeBSD is NOT Windows.
ZFS became part of FreeBSD on 6th April 2007, while it stayed in the experimental phase until the 15th of September 2009[2] when they removed the experimental tag and deemed it ready for production use. Then on the 23th of November 2009[3] zfsloader was merged into -STABLE making ZFS as boot option easier than ever.
geli is an easy to use block device encryption to encrypt disks on a lower level than the filesystem. We will be taking advantage of geli for our swap and temporary directories.
ZFS, geli and other newer features that have been recently added into FreeBSD are not available through the generic sysinstall(8) that is included on all of the default installation media. To remedy this, I am going to show you how to install FreeBSD manually from the Fixit livefs command line.
Boot the Installation Media
The first thing you are going to need is a copy of the most current *-dvd1.iso or *-memstick.img FreeBSD image (the other images do not contain the livefs that is needed). FreeBSD may be obtained from torrent or an FTP mirror near you.
At this point you should boot from your installation media. After the boot media initializes the loader you will be presented with the boot loader menu. Press 6 to escape to the loader prompt, load the ahci module and continue to boot.
load ahci Template:Pre boot
The computer will now go through its boot up process and present you with sysinstall(8) and the country selection. Choose your country and press enter. If you choose United States the standard American keyboard map will be used. Otherwise you will be presented with the keyboard menu. Select the correct keymap if needed and press enter.
At last you will be at the main menu. From here navigate to the Fixit menu and choose either CDROM/DVD or USB dependent on the installation media you used.
Prepare the Working Shell Environment
Now facing the Fixit prompt we can build our working shell environment. Connect to the network via dhcp with dhclient(8) (for network interface name use ifconfig(8). Then create a basic shell startup script and properly link the shell.
mkdir /var/db/
dhclient em0
mkdir /root/
export PATH=/mnt2/usr/bin:/mnt2/sbin:$PATH
echo 'setenv PATH' $PATH > /root/.cshrc
cat >> /root/.cshrc << _EOF_ Template:Pre ln -s /dist/bin/tcsh /bin/tcsh
ln -s /dist/bin/tcsh /bin/csh
Create our ssh server keys via ssh-keygen(1) and then load sshd(8) so that all this can be done remotely after the initial setup.
mkdir /usr/bin/
mkdir /etc/ssh/
cp /dist/etc/ssh/sshd_config /etc/ssh/
echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config
ssh-keygen -f /etc/ssh/ssh_host_key[wrap]-t rsa1 -b 4096 -N
ssh-keygen -f /etc/ssh/ssh_host_dsa_key[wrap]-t dsa -N
ssh-keygen -f /etc/ssh/ssh_host_rsa_key[wrap]-t rsa -N
ln -s /dist/usr/bin/ssh /usr/bin/ssh
/mnt2/usr/sbin/sshd
Remote Installation
At this point you should have a basic working environment setup and an ssh daemon running on the machine from the live filesystem. Connect to the box remotely using ssh(1) and the IP address that was assigned to it by dhclient.[foot]3[/foot]
ssh -l root 192.168.1.200
After you are connected to the box make some basic symlinks and load the required kernel modules via kldload(8).
ln -s /dist/boot/kernel /boot/kernel
ln -s /dist/lib /lib
kldload geom_mirror
kldload opensolaris
kldload zfs
Partition the Disks
Moving on to the disk setup. First locate all of your disks, we can use dmesg(8) and grep(1) for this. The system I am using for this guide has two disks, your results may vary.
dmesg Template:Pre
For partition table setup we will be using GUID Partition Table (GPT) via gpart(8). Let's first pull up a list of the current partitions.
gpart show
If there are existing partitions on any disk remove them with the delete command, then destroy the disks partitioning scheme.
gpart delete -i 1 ada0
gpart destroy ada0
Create a new partitioning scheme on each disk.
gpart create -s gpt ada0
gpart create -s gpt ada1
Now we need to create all of the disk partitions, we will be creating four partitions on each disk. The first partitions will contain the boot loader, the second partitions are the swap partitions and finally the third partitions are for the zpool (ZFS Pool). Adjust the size of the zpool partition to fit your disk size needs.
gpart add -s 64K -t freebsd-boot ada0
gpart add -s 4G -t freebsd-swap -l swap0 ada0
gpart add -s 495G -t freebsd-zfs -l zroot0 ada0
Now that we have the base partition setup, replicate this onto the other disk.
gpart add -s 64K -t freebsd-boot ada1
gpart add -s 4G -t freebsd-swap -l swap1 ada1
gpart add -s 495G -t freebsd-zfs -l zroot1 ada1
Install the protected MBR boot code and gptzfsboot loader onto each of the disks. The gptzfsboot loader will give you the ability to load zfsloader from a zpool.
gpart bootcode -p /mnt2/boot/gptzfsboot -b /mnt2/boot/pmbr -i 1 ada0
gpart bootcode -p /mnt2/boot/gptzfsboot -b /mnt2/boot/pmbr -i 1 ada1
Verify the partition table to make sure all of your disks match.
gpart show
Take note that I did not use the entire disk, the reason behind this is that when using RAID and replacing problematic disks more than likely your new disk will have a slightly different disk geometry and as such might limit your ability to use it as a replacement disk if you can not fit all the necessary partitions on the disk.
[header]ZFS Filesystems[/header] [p]Moving onto the ZFS volume setup, make the temporary directory for the zpool cache. Then create the main [man=zpool section=8] and the root volume, then mount the root volume on to [mono]/mnt[/mono].[/p][br] [shell]#[/shell][cmd]mkdir /boot/zfs/[/cmd] [shell]#[/shell][cmd]zpool create -O checksum=fletcher4 -O atime=off[wrap]-O canmount=off -O mountpoint=/mnt [br]-O setuid=off zroot mirror gpt/zroot0 gpt/zroot1[/cmd] [shell]#[/shell][cmd]zfs create -o mountpoint=legacy -o setuid=on[wrap]zroot/root[/cmd] [shell]#[/shell][cmd]mount -t zfs zroot/root /mnt[/cmd][br] [p]Create the [mono]/usr[/mono] container volume and then all the sub-volumes.[/p][br] [shell]#[/shell][cmd]zfs create -o canmount=off zroot/usr[/cmd] [shell]#[/shell][cmd]zfs create zroot/usr/home[/cmd] [shell]#[/shell][cmd]zfs create -o compress=lzjb -o exec=off[wrap]zroot/usr/obj[/cmd] [shell]#[/shell][cmd]zfs create -o compress=gzip zroot/usr/ports[/cmd] [shell]#[/shell][cmd]zfs create -o compress=off -o exec=off[wrap]zroot/usr/ports/distfiles[/cmd] [shell]#[/shell][cmd]zfs create -o compress=off -o exec=off[wrap]zroot/usr/ports/packages[/cmd] [shell]#[/shell][cmd]zfs create -o compress=gzip -o exec=off[wrap]zroot/usr/src[/cmd] [shell]#[/shell][cmd]cd /mnt ; ln -s /usr/home home[/cmd][br] [p]Then the [mono]/var[/mono] container and subsequent sub-volumes.[/p][br] [shell]#[/shell][cmd]zfs create -o exec=off -o canmount=off zroot/var[/cmd] [shell]#[/shell][cmd]zfs create -o compress=lzjb zroot/var/audit[/cmd] [shell]#[/shell][cmd]zfs create -o compress=lzjb zroot/var/crash[/cmd] [shell]#[/shell][cmd]zfs create zroot/var/db[/cmd] [shell]#[/shell][cmd]zfs create -o compress=lzjb -o exec=on[wrap]zroot/var/db/pkg[/cmd] [shell]#[/shell][cmd]zfs create zroot/var/empty[/cmd] [shell]#[/shell][cmd]zfs create -o compress=gzip zroot/var/log[/cmd] [shell]#[/shell][cmd]zfs create -o compress=gzip zroot/var/mail[/cmd] [shell]#[/shell][cmd]zfs create zroot/var/run[/cmd] [header]FreeBSD Installation[/header] [p]Now that the ZFS filesystem hierarchy is setup we can install the FreeBSD base system onto the zpool. If you are installing a different release replace [mono]9.*[/mono] with the proper release number.[/p][br] [shell]#[/shell][cmd]setenv DESTDIR /mnt[/cmd] [shell]#[/shell][cmd]cd /dist/9.*[/cmd][br] [p]Install the base, manpages, source, and generic kernel. Then copy the generic kernel over to default. For this part ignore the [mono]tar: Failed to set default locale[/mono] warnings.[/p][br] [shell]#[/shell][cmd]cd base ; ./install.sh[/cmd] [shell]#[/shell][cmd]cd ../manpages ; ./install.sh[/cmd] [shell]#[/shell][cmd]cd ../kernels ; ./install.sh generic[/cmd] [shell]#[/shell][cmd]cd /mnt/boot ; cp -Rlp GENERIC/*[wrap]/mnt/boot/kernel/[/cmd][br] [p]Switch the [mono]base/var/empty[/mono] zpool volume to readonly and then chroot into your newly installed system.[/p][br] [shell]#[/shell][cmd]zfs set readonly=on zroot/var/empty[/cmd] [shell]#[/shell][cmd]chroot /mnt[/cmd] [header]FreeBSD Configuration[/header] [p]Moving onto configuration, setup the network and necessary startup files so the zpool will be mounted automatically on boot. Start by creating the [mono]/etc/rc.conf[/mono] system configuration file.[/p][br] [shell]#[/shell][cmd]cat >> /etc/rc.conf << _EOF_[/cmd] [output] [o]hostname="VM.privatebox"[/o][br] [o]ifconfig_em0="DHCP"[/o][br] [o]geli_swap_flags="-e aes -l 256 -s 4096 -d"[/o][br] [o]ntpd_enable="YES"[/o][br] [o]ntpd_sync_on_start="YES"[/o][br] [o]sshd_enable="YES"[/o][br] [o]tmpmfs="YES"[/o][br] [o]tmpsize="512m"[/o][br] [o]tmpmfs_flags="-m 0 -o async,noatime -S -p 1777"[/o][br] [o]zfs_enable="YES"[/o][br] [o]_EOF_[/o] [/output][br] [p]Next we need to create the [mono]/boot/loader.conf[/mono] boot configuration file. Let us start by setting some defaults and then telling it which kernel modules you need loaded on boot. Finally lets tell the loader which zpool to boot from.[/p][br] [shell]#[/shell][cmd]cat >> /boot/loader.conf << _EOF_[/cmd] [output] [o]autoboot_delay="5"[/o][br] [o]loader_logo="beastie"[/o][br] [o]ahci_load="YES"[/o][br] [o]geom_eli_load="YES"[/o][br] [o]geom_mirror_load="YES"[/o][br] [o]geom_label_load="YES"[/o][br] [o]zfs_load="YES"[/o][br] [o]vfs.root.mountfrom="zfs:zroot/root"[/o][br] [o]_EOF_[/o] [/output][br] [p]Now that we have our default configuration lets set a root password, fix the local timezone and create a mail aliases database.[/p][br] [shell]#[/shell][cmd]passwd[/cmd] [shell]#[/shell][cmd]tzsetup[/cmd] [shell]#[/shell][cmd]cd /etc/mail ; make aliases[/cmd][br] [p]Exit from the chroot environment and copy over the zpool cache files onto the base zpool.[/p][br] [shell]#[/shell][cmd]exit[/cmd] [shell]#[/shell][cmd]cp /boot/zfs/zpool.cache /mnt/boot/zfs/[/cmd] [header]Finish the Installation[/header] [p]Now that FreeBSD is installed lets setup the partitions that we designated as SWAP. For this we are going to [man=gmirror section=8] the partitions together, add them into fstab, and finally set some variables.[/p][br] [shell]#[/shell][cmd]gmirror label -b prefer swap gpt/swap0[wrap]gpt/swap1[/cmd] [shell]#[/shell][cmd]cat >> /mnt/etc/fstab << _EOF_[/cmd] [output] [o]# Device Mountpoint FStype Options Dump Pass#[/o][br] [o]/dev/mirror/swap.eli none swap sw 0 0[/o][br] [o]_EOF_[/o] [/output] [shell]#[/shell][cmd]cd ; setenv LD_LIBRARY_PATH /mnt2/lib[/cmd][br] [p]Finally we need to setup the new mount points for each zpool and set the bootable volume. Afterwards go ahead and [man=reboot section=8].[/p][br] [shell]#[/shell][cmd]zfs set mountpoint=/ zroot[/cmd] [shell]#[/shell][cmd]zpool set bootfs=zroot/root zroot[/cmd] [header]Completing the Installation[/header] [p]At this point your FreeBSD system is fully installed with a very minimal base system. Exit out of the Fixit prompt and sysinstall, remove the installation media and reboot the machine.[/p][br] [p]From here you should move onto my FreeBSD Initial Setup guide, which goes through creation of users, basic system updating, and mild system hardening (coming soon!).[/p] [hr] [footnote=1]FreeBSD Base r197221, Tue Sep 15 2009[br][url=http://svn.freebsd.org/viewvc/base?view=revision&revision=197221]http://svn.freebsd.org/viewvc/base?view=revision&revision=197221[/url][/footnote] [br] [footnote=2]FreeBSD Base r199714, Mon Nov 23 2009[br][url=http://svn.freebsd.org/viewvc/base?view=revision&revision=199714]http://svn.freebsd.org/viewvc/base?view=revision&revision=199714[/url][/footnote] [br] [footnote=3]If you are not using a Linux or BSD derived operating system you can alternatively use [url=http://www.chiark.greenend.org.uk/~sgtatham/putty/]PuTTY[/url][/footnote]
Notes
- ^ "FreeBSD Base r218799, Fri Feb 18 2011". http://svn.freebsd.org/viewvc/base?view=revision&revision=218799.
- ^ "FreeBSD Base r197221, Tue Sep 15 2009". http://svn.freebsd.org/viewvc/base?view=revision&revision=197221.
- ^ "FreeBSD Base r199714, Mon Nov 23 2009". http://svn.freebsd.org/viewvc/base?view=revision&revision=199714.