FreeBSD:Install: Difference between revisions

From Wiki³
Line 86: Line 86:
{{Code|gpart destroy ''<disk>''}}
{{Code|gpart destroy ''<disk>''}}


Create a new partition scheme on each disk to prep each disk for its partition table.
Create a new partition scheme on each disk to prep each disk for its partition table. (These are all labeled as ''<disk#0/1/2>'', meaning that you should replicate these commands for each disk)


{{Code|gpart create -s gpt ''<disk#0>''}}
{{Code|gpart create -s gpt ''<disk#0/1/2>''}}
 
{{Code|gpart create -s gpt ''<disk#1>''}}
 
{{Code|gpart create -s gpt ''<disk#3>''}}


{| {{wikitable}}
{| {{wikitable}}
Line 161: Line 157:
Now we need to create all of the disk partitions, the following table indicates how we will be laying out the partition table of all the disks. Each disk will contain a {{Mono|boot}} partition, {{Mono|swap}} and {{Mono|/}} partitions (mirrored across disk#0 and disk#1), {{Mono|/var}}, {{Mono|/var/log}}, and {{Mono|/usr}} partitions (striped across disk#0 and disk#1), and finally a {{Mono|/home}} partition filling the entirety of disk#2. Adjust the size of your filesystem partitions to fit your disk size needs (starting trimming down with the {{Mono|/usr}} partition).
Now we need to create all of the disk partitions, the following table indicates how we will be laying out the partition table of all the disks. Each disk will contain a {{Mono|boot}} partition, {{Mono|swap}} and {{Mono|/}} partitions (mirrored across disk#0 and disk#1), {{Mono|/var}}, {{Mono|/var/log}}, and {{Mono|/usr}} partitions (striped across disk#0 and disk#1), and finally a {{Mono|/home}} partition filling the entirety of disk#2. Adjust the size of your filesystem partitions to fit your disk size needs (starting trimming down with the {{Mono|/usr}} partition).


Create the boot partition on each disk and embed GPT bootstrap into protective MBR, then install GPT bootstrap onto the boot partition. (These are all labeled as ''<disk#0/1/2>'', meaning that you should replicate these commands for each disk)
Create the boot partition on each disk and embed GPT bootstrap into protective MBR, then install GPT bootstrap onto the boot partition.


{{Code|gpart add -s 64K -t freebsd-boot ''<disk#0/1/2>''}}
{{Code|gpart add -s 64K -t freebsd-boot ''<disk#0/1/2>''}}

Revision as of 16:06, 29 January 2012

The following is how to install FreeBSD using GEOM+UFS. This will offer a base system of which is redundant, scalable, efficient usage of disk space. This guide is mainly suited for use with workstations, it is setup for use with FreeBSD 9.0 or newer.

GEOM permits access and control to classes (Master Boot Records, BSD labels, etc.) through the use of providers, or the special files in /dev. Supporting various software RAID configurations, GEOM will transparently provide access to the operating system and operating system utilities.[1]

Booting the Installation Media

Boot from your chosen installation media, for use in creation of this article the following test environment was used:

IconIcon VirtualBox 4.0.14_OSE r74382 Icon FreeBSD-10.0-HEAD-20120120-JPSNAP-amd64-amd64-release.iso

Upon first boot you will see the standard FreeBSD boot loader menu, feel free to wait out the allotted time or press enter to continue more rapidly. After the system has completed its boot up, you will be presented with the 'Welcome' window inside the new bsdinstall(8). Select < Shell > from the options and press enter.

Remote Installation Setup (Optional)

This section takes two things for granted; (a) that you have a personal set of SSH keys, and (b) that they are located on another server on the network, one that is already running an SCP capable SSH server. If you do not have one of these requirements feel free to skip this section or pause to set this up on your own. I feel it is easier to install via SSH due to the large amount of actual typing you are required to do, whereas with SSH you can merely copy/paste into the SSH window.

First thing we need to do is switch /tmp from read-only to writable (used to store the SSH keys) and then remount it. Ignore any errors you may or may not see from executing this command, the /tmp directory will still be unmounted.

umount /dev/md1

mdmfs -s 512M md1 /tmp

Connect to the network via DHCP with dhclient(8), for network interface name use ifconfig(8) (common interface names are em0, nfe0, etc; look for the one that mentions the media being Ethernet). Then create our SSH host keys via ssh-keygen(1).

dhclient <network interface>

cd /tmp

ssh-keygen -f /tmp/hostkey -t rsa1 -b 4096 -N ''

ssh-keygen -f /tmp/hostkey_dsa -t dsa -N ''

Next we will need to download your personal SSH keys from the network. Replace the username, IP address, and folder/file with the required information. After that is done go ahead and start up the SSH daemon with sshd(8).

scp <user>@<0.0.0.0>:~/.ssh/authorized_keys .

/usr/sbin/sshd -o PermitRootLogin=yes -o HostKey=/tmp/hostkey -o HostDSAKey=/tmp/hostkey_dsa -o AuthorizedKeysFile=/tmp/authorized_keys

Connect to the IP address that was assigned to the installation computer using ssh(1) with your personal SSH keys.[2]

ssh -l root <0.0.0.0>

Disk Partition Setup

Load the required kernel modules via kldload(8).

kldload geom_journal

kldload geom_mirror

kldload geom_stripe

Moving on to the disk setup, first locate all of your disks, we can use dmesg(8) and egrep(1) for this. The system I am using for this guide has three disks, two disks will be utilized for the system and one will be dedicated for use by the /home partition. (There are many reasons for this, one being that you can then seamlessly switch between operating systems and still retain your /home folder.)

dmesg | egrep "^ad|^da|^hd"

ada0 at ahcich1 bus 0 scbus1 target 0 lun 0 ada0: <VBOX HARDDISK 1.0> ATA-6 SATA 2.x device ada0: 300.000MB/s transfers (SATA 2.x, UDMA6, PIO 8192bytes) ada0: Command Queueing enabled ada0: 512000MB (1048576000 512 byte sectors: 16H 63S/T 16383C) ada0: Previously was known as ad6 ada1 at ahcich2 bus 0 scbus2 target 0 lun 0 ada1: <VBOX HARDDISK 1.0> ATA-6 SATA 2.x device ada1: 300.000MB/s transfers (SATA 2.x, UDMA6, PIO 8192bytes) ada1: Command Queueing enabled ada1: 512000MB (1048576000 512 byte sectors: 16H 63S/T 16383C) ada1: Previously was known as ad8 ada2 at ahcich3 bus 0 scbus3 target 0 lun 0 ada2: <VBOX HARDDISK 1.0> ATA-6 SATA 2.x device ada2: 300.000MB/s transfers (SATA 2.x, UDMA6, PIO 8192bytes) ada2: Command Queueing enabled ada2: 256000MB (524288000 512 byte sectors: 16H 63S/T 16383C) ada2: Previously was known as ad10

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 option, then destroy the disk partitioning scheme. You will need to fill in appropriate values according to your setup, the disk is the device node you pulled from dmesg(8), and the partition number is the one listed in the column underneath the device node name when using 'gpart show'. Replicate this for all disks as necessary.

gpart delete -i <partition#> <disk>

gpart destroy <disk>

Create a new partition scheme on each disk to prep each disk for its partition table. (These are all labeled as <disk#0/1/2>, meaning that you should replicate these commands for each disk)

gpart create -s gpt <disk#0/1/2>

Filesystem Mountpoint disk0 disk1 disk2 Description
freebsd-boot 64K 64K bootstrap / GTP bootcode
freebsd-swap SWAP 8G 8G mirrored between disks, using geli(8)
freebsd-ufs / 5G 5G mirrored between disks, mounted read-only
freebsd-ufs /var 10G 10G striped between disks
freebsd-ufs /var/log 5G 5G striped between disks
freebsd-ufs /usr * * striped between disks
freebsd-ufs /home * separate disk dedicated to /home
/tmp 1gb mounted on encrypted SWAP with tmpmfs

Now we need to create all of the disk partitions, the following table indicates how we will be laying out the partition table of all the disks. Each disk will contain a boot partition, swap and / partitions (mirrored across disk#0 and disk#1), /var, /var/log, and /usr partitions (striped across disk#0 and disk#1), and finally a /home partition filling the entirety of disk#2. Adjust the size of your filesystem partitions to fit your disk size needs (starting trimming down with the /usr partition).

Create the boot partition on each disk and embed GPT bootstrap into protective MBR, then install GPT bootstrap onto the boot partition.

gpart add -s 64K -t freebsd-boot <disk#0/1/2>

gpart bootcode -b /boot/pmbr <disk#0/1/2>

gpart bootcode -p /boot/gptboot -i 1 <disk#0/1/2>

Then create 8GB-sized swap partitions (This should be replicated as stated on disk0 and disk1).

gpart add -s 8G -t freebsd-swap <disk#0/1>


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 -b /boot/pmbr -i 1 -p /boot/gptzfsboot ada0

gpart bootcode -b /boot/pmbr -i 1 -p /boot/gptzfsboot ada1

Verify the partition table to make sure all of the disks match.

gpart show

=> 34 1048575933 ada0 GPT (500G) 34 128 1 freebsd-boot (64K) 162 8388608 2 freebsd-swap (4.0G) 8388770 1038090240 3 freebsd-zfs (495G) 1046479010 2096957 - free - (1.0G) => 34 1048575933 ada1 GPT (500G) 34 128 1 freebsd-boot (64K) 162 8388608 2 freebsd-swap (4.0G) 8388770 1038090240 3 freebsd-zfs (495G) 1046479010 2096957 - free - (1.0G)

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 cannot fit all the necessary partitions on the disk.

FreeBSD Installation

Now that the ZFS file system hierarchy is setup we can remount the ZFS pool, install the FreeBSD base system, and then copy the zpool.cache. When you import the zpool back into the system you might get errors about not being able to create mountpoints, this is rectified two commands later.

cd

zpool export zroot

zpool import -o cachefile=/tmp/zpool.cache zroot

mount -t zfs zroot/root /mnt

zfs mount -a


sh

cd /usr/freebsd-dist

export DESTDIR=/mnt

for file in base.txz lib32.txz kernel.txz doc.txz;

do (cat $file | tar --unlink -xpJf - -C ${DESTDIR:-/}); done


cp /tmp/zpool.cache /mnt/boot/zfs/zpool.cache

exit

Switch the zroot/var/empty zpool volume to read-only and then chroot into your newly installed system.

zfs set readonly=on zroot/var/empty

chroot /mnt

FreeBSD Configuration

Setup the network and necessary startup files so the zpool will be mounted automatically on boot. Start by creating the /etc/rc.conf system configuration file.

cat >> /etc/rc.conf << _EOF_

hostname="VM.privatebox" ifconfig_em0="DHCP" geli_swap_flags="-e aes -l 256 -s 4096 -d" ntpd_enable="YES" ntpd_sync_on_start="YES" sshd_enable="YES" tmpmfs="YES" tmpsize="512m" tmpmfs_flags="-m 0 -o async,noatime -S -p 1777" zfs_enable="YES" _EOF_

Next we need to create the /boot/loader.conf boot configuration file. Let us start by setting some defaults and then telling it which kernel modules you need loaded on boot. Finally let's tell the loader which zpool to boot from.

cat >> /boot/loader.conf << _EOF_

autoboot_delay="5" loader_logo="beastie" ahci_load="YES" geom_eli_load="YES" geom_mirror_load="YES" geom_label_load="YES" zfs_load="YES" vfs.root.mountfrom="zfs:zroot/root" _EOF_

Now that we have our default configuration lets set a root password, fix the local time zone, create a mail aliases database, and exit out of the chroot environment.

passwd

tzsetup

cd /etc/mail ; make aliases

exit

Finishing the Installation

Now that FreeBSD is installed lets setup the partitions that we designated as SWAP. For this we are going to gmirror(8) the partitions together, add them into fstab, and finally set some variables.

gmirror label -b prefer swap gpt/swap0 gpt/swap1

cat >> /mnt/etc/fstab << _EOF_>

# [Device] [Mountpoint] [FStype] [Options] [Dump] [Pass#] /dev/mirror/swap.eli none swap sw 0 0 _EOF_

Finally we need to setup the new mount points for each zpool and set the bootable volume. Afterwards go ahead and reboot(8).

zfs set mountpoint=/ zroot

zpool set bootfs=zroot/root zroot

reboot now

At this point your FreeBSD system is fully installed with a very minimal base system. Exit out of the shell prompt and BSDInstaller, remove the installation media and reboot the machine.

Notes

  1. ^ "FreeBSD Handbook". Chapter 20 - GEOM: Modular Disk Transformation Framework. http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/geom.html. 
  2. ^ "PuTTY". If you are not using a Linux or BSD derived operating system you can alternatively use PuTTY. http://www.chiark.greenend.org.uk/~sgtatham/putty/.