Skip to content

Instantly share code, notes, and snippets.

@johnramsden
Last active October 25, 2025 02:36
Show Gist options
  • Select an option

  • Save johnramsden/2128a1a8a9b100537f17b4cbb26070cb to your computer and use it in GitHub Desktop.

Select an option

Save johnramsden/2128a1a8a9b100537f17b4cbb26070cb to your computer and use it in GitHub Desktop.
Install scripts for installing Arch Linux on ZFS. Not runnable, just listed commands.
#!/bin/bash
# Check before running, may need intervention
# Replace the following:
BOOT_PARTITION="/dev/sdg1"
DISK_1="ata-SanDisk_SDSSDXPS480G_152271401093"
DISK_2="ata-SanDisk_SDSSDXPS480G_154501401266"
# Replace with poolname. I use 'vault' here
POOL="vault"
# Check for zfs
modprobe zfs
# Create pool
zpool create -f -o ashift=12 ${POOL} mirror ${DISK_1} ${DISK_2}
## Properties
# Compression
zfs set compression=on ${POOL}
# Access time
zfs set atime=on ${POOL}
zfs set relatime=on ${POOL}
# Create key datasets
zfs create -o mountpoint=none "${POOL}/ROOT"
zfs create -o mountpoint=legacy "${POOL}/ROOT/default"
zfs create -o mountpoint=/home "${POOL}/home"
## Optional datasets ##
# tmp
zfs create "${POOL}/tmp" \
-o setuid=off \
-o devices=off \
-o sync=disabled \
-o mountpoint=/tmp
# Mask systemd’s automatic tmpfs-backed tmp
systemctl mask tmp.mount
# var
zfs create "${POOL}/var" \
-o xattr=sa \
-o mountpoint=legacy
# usr
zfs create "${POOL}/usr" -o mountpoint=legacy
## End Optional
# Unmount pool
zfs umount -a
# Put them in /etc/fstab
nano /etc/fstab
# <pass><file system> <dir> <type> <options> <dump>
# vault/ROOT/default / zfs rw,relatime,xattr,noacl 0 0
# vault/var /var zfs rw,relatime,xattr,noacl 0 0
# vault/usr /usr zfs rw,relatime,xattr,noacl 0 0
# set boot property
zpool set bootfs="${POOL}/ROOT/default" ${POOL}
## Setup Installation ##
# Export the pool
zpool export ${POOL}
# re-import the pool,
zpool import -d /dev/disk/by-id -R /mnt ${POOL}
# bring the zpool.cache file into your new system
mkdir -p /mnt/etc/zfs
cp /etc/zfs/zpool.cache /mnt/etc/zfs/zpool.cache
# OR, if you do not have /etc/zfs/zpool.cache, create it:
# zpool set cachefile=/etc/zfs/zpool.cache zroot
# Mount legacy zfs
mkdir /mnt/{home,var,usr,tmp,boot}
mount -t zfs "${POOL}/home" "/mnt/home"
mount -t zfs "${POOL}/var" "/mnt/var"
mount -t zfs "${POOL}/usr" "/mnt/usr"
mount -t zfs "${POOL}/tmp" "/mnt/tmp"
# Boot
mkdir -p /boot
mount "/dev/${BOOT_PARTITION}" /boot
# Generate the fstab
genfstab -U -p /mnt >> /mnt/etc/fstab
# Comment out all non-legacy datasets apart from the root dataset,
# the swap file and the boot/EFI partition
nano /mnt/etc/fstab
# Edit mirrorlist
nano /etc/pacman.d/mirrorlist
# Install the base system
pacstrap -i /mnt base base-devel
# Edit ramdisk hooks
# If you are using a separate dataset for /usr, have the usr hook enabled after zfs
# If using a separate dataset for /var, add shutdowm hook
# HOOKS="base udev autodetect modconf block keyboard zfs usr filesystems shutdown"
nano /mnt/etc/mkinitcpio.conf
# Enter Chroot
#!/bin/bash
# Chroot in
arch-chroot /mnt /bin/bash
# Add the Arch ZFS repository to /etc/pacman.conf
nano /etc/pacman.conf
# [archzfs]
# Server = http://archzfs.com/$repo/x86_64
# sign its key
pacman-key -r 5E1ABF240EE7A126 && pacman-key --lsign-key 5E1ABF240EE7A126
# install zfs-linux
pacman -Syyu
pacman -S zfs-linux-git
# For /tmp, mask (disable) systemd's automatic tmpfs-backed /tmp
systemctl mask tmp.mount
## Install as normal ##
nano /etc/pacman.d/mirrorlist
# set locale, uncomment en_US.UTF-8 UTF-8
nano /etc/locale.gen
# generate the new locales
locale-gen
# set locale, LANG refers to the first column of locale
nano /etc/locale.conf
# LANG=en_US.UTF-8
# timezone
ln -s /usr/share/zoneinfo/Canada/Pacific /etc/localtime
# set the time standard to UTC
hwclock --systohc --utc
## Bootloader ##
# re-generate the initramfs image
mkinitcpio -p linux
# If intel cpu, set ucode as the first initrd in the bootloader
pacman -S intel-ucode
# Install systemd-boot to wherever esp mounted
bootctl --path=/mnt/efi install
# Bootloader entry
# # /mnt/efi/loader/entries/Archon.conf
# title Archon default (Arch Linux)
# linux /installs/Archon/vmlinuz-linux
# initrd /installs/Archon/intel-ucode.img
# initrd /installs/Archon/initramfs-linux.img
# options zfs=vault/ARCHON/ROOT/default rw
## Configure the network ##
# Set the hostname to your liking:
nano /etc/hostname
nano /etc/hosts
## /etc/hosts: static lookup table for host names
## <ip-address> <hostname.domain.org> <hostname>
# 127.0.0.1 localhost.localdomain localhost
# ::1 localhost.localdomain localhost
# 192.168.0.2 Archon.localdomain Archon
# get nic
ip link
# enable internet
systemctl enable dhcpcd@eno1.service
# root pass
passwd
# Set either shutdown hook or this
systemctl enable mkinitcpio-generate-shutdown-ramfs.service
## Install Done, Customize ##
# Make a user
pacman -S zsh sudo
useradd -m -G wheel -s /usr/bin/zsh john
passwd john
EDITOR=nano visudo
nano /etc/pacman.conf
pacman -S openssh
systemctl enable sshd
nano /etc/ssh/sshd_config
# Done!
exit
umount /mnt/boot
umount /mnt/mnt/efi
umount /mnt/home :(
umount /mnt/tmp
umount /mnt/usr
umount /mnt/var
zfs umount -a
zpool export vault
# # After reboot
zpool set cachefile=/etc/zfs/zpool.cache vault
systemctl enable zfs.target
# To write the hostid file safely you need to use a small C program:
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
int main() {
int res;
res = sethostid(gethostid());
if (res != 0) {
switch (errno) {
case EACCES:
fprintf(stderr, "Error! No permission to write the"
" file used to store the host ID.\n"
"Are you root?\n");
break;
case EPERM:
fprintf(stderr, "Error! The calling process's effective"
" user or group ID is not the same as"
" its corresponding real ID.\n");
break;
default:
fprintf(stderr, "Unknown error.\n");
}
return 1;
}
return 0;
}
# Copy it, save it as writehostid.c and compile it with gcc -o writehostid writehostid.c, finally execute it and regenerate the initramfs image:
nano writehostid.c
gcc -o writehostid writehostid.c
chmod +x writehostid
./writehostid
mkinitcpio -p linux
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment