Skip to content

Instantly share code, notes, and snippets.

@rkitover
Last active February 26, 2024 11:31
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rkitover/94879910a91fd0caad61251385d856ba to your computer and use it in GitHub Desktop.
Save rkitover/94879910a91fd0caad61251385d856ba to your computer and use it in GitHub Desktop.
zfs setup for freebsd and gentoo and/or nixos dual boot
#!/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 off 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
#
# 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
#!/bin/sh
#
# This will mount the datasets previously created with make-zfs-filesystems to
# /mnt.
set -e
POOL=tank
MOUNT_TARGET=/mnt
# The OS you are installing first and the root dataset.
OS=gentoo
zpool import -f $POOL
mount -t zfs $POOL/$OS $MOUNT_TARGET
zfs list -Ho name | tail +2 | grep -E /$OS'(/|__|$)' | while read -r fs; do
fs=${fs#$POOL}
fs=${fs#/}
[ -z "$fs" ] || [ "$fs" = "$OS" ] && continue
mnt=$(echo "$fs" | sed 's,__,/,g')
mnt=${mnt#$OS}
mnt=${mnt#/}
mnt=${MOUNT_TARGET}/$mnt
mkdir -p $mnt
mount -t zfs $POOL/$fs $mnt
done
zfs list -Ho name | tail +2 | grep -vE /$OS'(/|__|$)' | while read -r fs; do
fs=${fs#$POOL/}
mnt=$(echo "$fs" | sed 's,__,/,g')
mnt=${mnt#/}
mnt=${MOUNT_TARGET}/$mnt
mkdir -p $mnt
mount -t zfs $POOL/$fs $mnt
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment