Project

General

Profile

Support #388

Updated by Daniel Curtis over 9 years ago

ZFS is an advanced filesystem created by Sun Microsystems (now owned by Oracle) and released for OpenSolaris in November 2005. Features of ZFS include: pooled storage (integrated volume management -- zpool), Copy-on-write, snapshots, data integrity verification and automatic repair (scrubbing), RAID-Z, a maximum 16 Exabyte file size, and a maximum 256 Zettabyte volume size. ZFS is licensed under the Common Development and Distribution License (CDDL). 

 Described as "The last word in filesystems" ZFS is stable, fast, secure, and future-proof. Being licensed under the GPL incompatible CDDL, it is not possible for ZFS to be distributed along with the Linux Kernel. This requirement, however, does not prevent a native Linux kernel module from being developed and distributed by a third party, as is the case with zfsonlinux.org (ZOL).  

 This is a guide to show how to install a root ZFS installation, begin by downloading and booting off of a recent Arch Linux ISO. 

 h2. Adding the repository and install ZFS 

 The maintainer of ZFS on Arch has a signed repository that you can add to the @/etc/pacman.conf@. 

 * Add the *[demz-repo-archiso]* repo: /etc/pacman.conf, like so: 
 <pre> 
 vi /etc/pacman.conf 
 </pre> 
 #* And add the following to the end: 
 > [demz-repo-archiso] 
 > Server = http://demizerone.com/$repo/$arch 
 </pre> 

 * Now Once the repository has been added to /etc/pacman.conf, the repo key needs to be received and locally signed: 
 <pre> 
 pacman-key -r 0EE7A126 
 pacman-key --lsign-key 0EE7A126 
 </pre> 

 * Now update the repository information: 
 <pre> 
 pacman -Sy 
 </pre> 

 * Its time to install ZFS: 
 <pre> 
 pacman -S zfs 
 </pre> 

 * Load the ZFS kernel module: 
 <pre> 
 modprobe zfs 
 </pre> 

 * Check to see that the module was loaded: 
 <pre> 
 lsmod | grep zfs 
 </pre> 

 h2. Preparing the system 

 * Open cfdisk: 
 <pre> 
 cfdisk /dev/sda 
 </pre> 
 #* Erase all partitions, create a small and partition for the bootloader, then add the primary partition for ZFS hard disk and MBR 
 <pre> 
 cfdisk 
 [Delete] (all partitions) 
 [New] 
 primary 
 512 
 [Bootable] (make sure to have sda1 selected) 
 (Select Free Space) 
 [New] 
 primary 
 (Rest of the HD space) 
 [Type] 
 BF 
 [Write] 
 yes 
 [Quit] 
 </pre> 

 *NOTE*: If using a USB drive, then skip creating the 512MB partition and use the whole drive. 

 * Format the boot partition 
 <pre> 
 mkfs.ext3 /dev/sda1 
 </pre> 

 h2. Setting up the ZFS filesystem 

 * Create the zpool: 
 <pre> 
 zpool create zroot /dev/disk/by-id/id-to-partition 
 </pre> 
 *WARNING*: Always use id names when working with ZFS, otherwise import errors will occur. 

 * Create necessary filesystems 
 If so desired, sub-filesystem mount points such as /home and /root can be created with the following commands: 
 <pre> 
 zfs create zroot/home -o mountpoint=/home 
 zfs create zroot/root -o mountpoint=/root 
 </pre> 

 *NOTE*: That if you want to use other datasets for system directories (/var or /etc included) your system will not boot unless they are listed in /etc/fstab! We will address that at the appropriate time in this tutorial.  

 h2. Swap partition 

 ZFS does not allow the use swapfiles, but it is possible to use a ZFS volume as swap partition. It is important to set the ZVOL block size to match the system page size; for x86 and x86_64 systems that is 4k. 

 * Create a 2 GB (or whatever is required) ZFS volume: 
 <pre> 
 zfs create -V 2G -b 4K zroot/swap 
 </pre> 

 * Initialize and enable the volume as a swap partition: 
 <pre> 
 mkswap /dev/zvol/zroot/swap 
 swapon /dev/zvol/zroot/swap 
 </pre> 

 * After using pacstrap to install the base system, edit @/zroot/etc/fstab@ to ensure the swap partition is mounted at boot: 
 <pre> 
 /dev/zvol/zroot/swap none swap defaults 0 0 
 </pre> 

 * Make sure to unmount all ZFS filesystems before rebooting the machine, otherwise any ZFS pools will refuse to be imported: 
 <pre> 
 zfs umount -a 
 </pre> 

 h2. Configure the root filesystem 

 * First, set the mount point of the root filesystem: 
 <pre> 
 zfs set mountpoint=/ zroot 
 </pre> 
 *# and optionally, any sub-filesystems: 
 <pre> 
 zfs set mountpoint=/home zroot/home 
 zfs set mountpoint=/root zroot/root 
 </pre> 
 *# and if you have seperate datasets for system directories (ie /var or /usr) 
 <pre> 
 zfs set mountpoint=legacy zroot/usr 
 zfs set mountpoint=legacy zroot/var 
 </pre> 
 *# Then put them in /etc/fstab: 
 <pre> 
 vi /etc/fstab 
 </pre> 
 *# and add the following: 
 > # <file system>          <dir>           <type>      <options>               <dump> <pass> 
 > zroot/usr                /usr            zfs         defaults,noatime        0        0 
 > zroot/var                /var            zfs         defaults,noatime        0        0 

 * Set the bootfs property on the descendant root filesystem so the boot loader knows where to find the operating system. 
 <pre> 
 zpool set bootfs=zroot zroot 
 </pre> 

 * Turn off swap, if enabled: 
 <pre> 
 swapoff -a 
 </pre> 

 * Export the pool: 
 <pre> 
 zpool export zroot 
 </pre> 

 *WARNING*: Do not skip this, otherwise you will be required to use -f when importing your pools. This unloads the imported pool. 
 *NOTE*: This might fail if you added a swap partition above. Need to turn it off with the @swapoff@ command. 

 * Finally, re-import the pool: 
 <pre> 
 zpool import -d /dev/disk/by-id -R /mnt zroot 
 </pre> 

 *NOTE*: @-d@ is not the actual device id, but the @/dev/by-id@ directory containing the symbolic links. 

 If there is an error in this step, you can export the pool to redo the command. The ZFS filesystem is now ready to use. 

 * Be sure to bring the @zpool.cache@ file into your new system. This is required later for the ZFS daemon to start. 
 <pre> 
 mkdir -p /mnt/etc/zfs 
 cp /etc/zfs/zpool.cache /mnt/etc/zfs/zpool.cache 
 </pre> 
 *# If you don't have /etc/zfs/zpool.cache, create it: 
 <pre> 
 zpool set cachefile=/etc/zfs/zpool.cache zroot 
 </pre> 

 h2. Installing Arch 

 * Start by mounting the boot partition 
 <pre> 
 mkdir /mnt/boot 
 mount /dev/sda1 /mnt/boot 
 </pre> 

 NOTE: If using a USB drive for a bootloader mount it to @/mnt/boot@ instead. 

 * Now change the repository to *demz-repo-core* 
 <pre> 
 vi /etc/pacman.conf 
 </pre> 
 #* And change @[demz-repo-archiso]@ to the following 
 > [demz-repo-core] 
 > Server = http://demizerone.com/$repo/$arch 

 * Then install the base system 
 <pre> 
 pacstrap -i /mnt base openssh zfs 
 </pre> 

 * Generate the fstab for filesystems, use: 
 <pre> 
 genfstab -U -p /mnt | grep boot >> /mnt/etc/fstab 
 </pre> 

 * Edit the @/etc/fstab@. If you chose to create datasets for system directories, keep them in this fstab!  
 <pre> 
 vi /mnt/etc/fstab 
 </pre> 
 #* +Comment out the lines+ for the /, /root, and /home mountpoints, rather than deleting them. You may need those UUIDs later if something goes wrong. Anyone who just stuck with the guide's directions can delete everything except for the swap file and the boot/EFI partition. It seems convention to replace the swap's uuid with /dev/zvol/zroot/swap. 

 * Setup the initial environment: 
 <pre> 
 arch-chroot 
 </pre> 
 #* Set a root password 
 <pre> 
 passwd 
 </pre> 
 #* Set a hostname 
 <pre> 
 echo "archzfs" > /etc/hostname 
 </pre> 
 #* Set a local time 
 <pre> 
 ln -s /usr/share/zoneinfo/America/Los_Angeles /etc 
 </pre> 
 #* Set a local language by uncommenting *en_US.UTF-8* in @/etc/locale.gen@, then running: 
 <pre> 
 locale-gen 
 </pre>  
 #* Set a wired network connection 
 <pre> 
 cp /etc/netctl/examples/ethernet-dhcp /etc/netctl/wired 
 netctl enable wired 
 </pre> 
 #* Set SSH to start at boot 
 <pre> 
 systemctl enable sshd.service 
 </pre> 

 * When creating the initial ramdisk, first edit @/etc/mkinitcpio.conf@ and add *zfs* +before+ *filesystems*. Also, move *keyboard* hook +before+ *zfs* so you can type in console if something goes wrong. You may also remove fsck (if you are not using Ext3 or Ext4). Your @HOOKS@ line should look something like this: 
 > HOOKS="base udev autodetect modconf block keyboard zfs filesystems" 

 * Regenerate the initramfs with the command: 
 <pre> 
 mkinitcpio -p linux 
 </pre> 

Back