Last active
September 2, 2024 18:03
-
-
Save rkitover/94879910a91fd0caad61251385d856ba to your computer and use it in GitHub Desktop.
zfs setup for freebsd and gentoo and/or nixos dual boot
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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