#!/bin/sh # # References: # # "Cohabiting FreeBSD and Gentoo Linux on a Common ZFS Volume" # https://ericmccorkleblog.wordpress.com/2016/11/15/cohabiting-freebsd-and-gentoo-linux-on-a-common-zfs-volume/ # # "ZFS Datasets for NixOS" # https://grahamc.com/blog/nixos-on-zfs # # The collective wisdom of libera #zfs. set -e POOL=tank VDEV=/dev/nvme0n1p5 # The OS you are installing first and the root dataset. OS=gentoo MOUNT_TARGET=/mnt if [ "$OS" = freebsd ]; then mkdir -p /tmp/bsdinstall_etc FSTAB=/tmp/bsdinstall_etc/fstab else FSTAB=/tmp/fstab fi # On systems using dkms, you may not want to make /var exec=off. # NAME MOUNTPOINT COMPRESS SETUID EXEC XATTR ACLTYPE DEDUP FILESYSTEMS=' freebsd legacy lz4 on on on nfsv4 off freebsd/home legacy lz4 on on on nfsv4 off freebsd/obj legacy lz4 on on on nfsv4 off freebsd/tmp legacy lz4 off on on nfsv4 off freebsd/usr legacy lz4 on on on nfsv4 off freebsd/usr/include legacy zstd off off on nfsv4 off freebsd/usr/lib legacy lz4 off on on nfsv4 off freebsd/usr/lib32 legacy lz4 off on on nfsv4 off freebsd/usr/libdata legacy zstd off on on nfsv4 off freebsd/usr/local legacy lz4 on on on nfsv4 off freebsd/usr/local/etc legacy zstd off on on nfsv4 off freebsd/usr/local/include legacy zstd off off on nfsv4 off freebsd/usr/local/lib legacy lz4 off on on nfsv4 off freebsd/usr/local/lib32 legacy lz4 off on on nfsv4 off freebsd/usr/local/libdata legacy zstd off on on nfsv4 off freebsd/usr/local/share legacy zstd off on on nfsv4 off freebsd/usr/local/share/info legacy lz4 off off on nfsv4 off freebsd/usr/local/share/man legacy lz4 off off on nfsv4 off freebsd/usr/ports legacy lz4 off on on nfsv4 off freebsd/usr/share legacy zstd off on on nfsv4 off freebsd/usr/share/info legacy lz4 off off on nfsv4 off freebsd/usr/share/man legacy lz4 off off on nfsv4 off freebsd/usr/src legacy zstd off off on nfsv4 off freebsd/var legacy lz4 off off on nfsv4 off freebsd/var/db legacy lz4 off off on nfsv4 off freebsd/var/db/pkg legacy lz4 off off on nfsv4 off freebsd/var/empty legacy lz4 off off on nfsv4 off freebsd/var/log legacy zstd off off on nfsv4 off freebsd/var/mail legacy zstd off off on nfsv4 off freebsd/var/tmp legacy lz4 off off on nfsv4 off gentoo legacy lz4 on on sa posix off gentoo/home legacy lz4 on on sa posix off gentoo__usr__include legacy zstd off off sa posix off gentoo__usr__share legacy zstd off off sa posix off gentoo__usr__share/info legacy lz4 off off sa posix off gentoo__usr__share/man legacy lz4 off off sa posix off gentoo/tmp legacy lz4 off on sa posix off gentoo/var legacy lz4 off off sa posix off gentoo/var/db legacy lz4 off off sa posix off gentoo/var/empty legacy lz4 off off sa posix off gentoo/var/log legacy zstd off off sa posix off gentoo/var/tmp legacy lz4 off on sa posix off nixos legacy lz4 on on sa posix off nixos/home legacy lz4 on on sa posix off nixos/nix legacy lz4 off off sa posix off nixos/nix/store legacy lz4 on on sa posix skein nixos/tmp legacy lz4 off on sa posix off nixos/var legacy lz4 off off sa posix off nixos/var/db legacy lz4 off off sa posix off nixos/var/empty legacy lz4 off off sa posix off nixos/var/log legacy zstd off off sa posix off nixos/var/tmp legacy lz4 off off sa posix off ' umount --recursive $MOUNT_TARGET >/dev/null 2>&1 || : zpool destroy $POOL >/dev/null 2>&1 || : # ashift=13 for 8k blocks, use ashift=12 for 4k blocks # # Samsung SSDs use physical 8k blocks. # # It's ok to use 8k blocks on 4k block devices, but it will use more space for # small files. zpool create -f -m legacy -O atime=off -o ashift=13 -o autotrim=on -O checksum=skein $POOL $VDEV ( # OS being installed must come first. echo "$FILESYSTEMS" | grep "^$OS" | grep -v '^$' echo "$FILESYSTEMS" | grep -v "^$OS" | grep -v '^$' ) | while read -r fs; do set -- $fs fs=$1 mp=$2 comp=$3 suid=$4 exec=$5 xattr=$6 acltype=$7 dedup=$8 mnt=${fs#$OS} mnt=$(echo "$mnt" | sed 's,__,/,g') mnt=$MOUNT_TARGET/${mnt#/} zfs create -o mountpoint=$mp -o compression=$comp -o setuid=$suid -o exec=$exec \ -o xattr=$xattr -o acltype=$acltype -o dedup=$dedup $POOL/$fs mkdir -p $mnt mount -t zfs $POOL/$fs $mnt sys_mnt=${mnt#/mnt} echo "$POOL/$fs $sys_mnt zfs rw 0 0" >> $FSTAB done echo "proc /proc procfs rw 0 0" >> $FSTAB zpool set bootfs=$POOL/freebsd $POOL