Skip to content

cole-h/nixos-config

Folders and files

NameName
Last commit message
Last commit date

Latest commit

19debe3 · Dec 24, 2024
Jun 24, 2024
Dec 4, 2024
Dec 24, 2024
May 5, 2023
May 10, 2024
Dec 3, 2024
Jun 3, 2023
Sep 8, 2020
Nov 7, 2021
Feb 26, 2020
Apr 27, 2023
Dec 24, 2024
Jul 31, 2024
Apr 11, 2023
May 25, 2020
Apr 1, 2020

Repository files navigation

dotfiles

Hostnames

I'm a big fan of Brandon Sanderson, so that's where all of my hostnames come from (see names). They were manually copy-pasted from throughout the Coppermind wiki and are planets, shards, general terms, worldhoppers, and locations throughout his works. Any of these that had a space or apostrophe were discarded.


Setup stuff

https://grahamc.com/blog/nixos-on-zfs

https://elis.nu/blog/2020/05/nixos-tmpfs-as-root/

0. preparation

  • make iso with nix build .#iso
  • backup stateful stuff if reinstalling to same disk
    • FF profile
    • sonarr settings (watched shows, etc)
    • fish shell history

1. partition

  • 2GiB /boot at the beginning
  • 32GiB swap partition at the beginning
  • rest "linux partition" (for ZFS) -- don't forget native encryption ("encryption=aes-256-gcm") and "compression=zstd"
    • apool/r (none)
    • apool/r/local (none) -- shouldn't be backed up
    • apool/r/local/root (legacy)
    • apool/r/local/nix (legacy)
    • apool/r/local/tmp (legacy)
    • apool/r/local/var (legacy)
    • apool/r/safe (none) -- "safe" to back up
    • apool/r/safe/state/home (legacy)
    • apool/r/safe/state/home/vin (legacy)
    • apool/r/safe/state/home/vin/Downloads (legacy) -- don't backup
    • apool/alloc (none) -- 1G file to make sure we don't run out of space (can be freed to make fs stuff work again)
# This section should be run as root.

export DISK=/dev/disk/by-id/.....
gdisk $DISK
  # o (delete all partitions + protective mbr)
  # n, 1, +1M,   +2G, ef00  (EFI boot)
  # n, 2, ...,  +32G, 8200  (swap)
  # n, 3, ...,  ....,  ...  (Linux)
  # c, 3, "[a-z][0-9]?pool" -- set part label
  # w

mkfs.fat -F 32 -n boot $DISK-part1
mkswap -L swap $DISK-part2

zpool create \
    -O mountpoint=none \
    # SSDs may or may not lie that it uses a 512B physical block size;
    # ashift of 12 (4k) shouldn't really hurt, according to various
    # people
    -o ashift=12 \
    -R /mnt \
    apool $DISK-part3

zfs create \
    -o canmount=off \
    -o atime=off \
    # requires ZoL 2.0
    -o compression=zstd \
    # apparently gcm is faster than ccm
    -o encryption=aes-256-gcm -o keyformat=passphrase \
    -o xattr=sa \
    -o acltype=posixacl \
    apool/r

# https://gist.github.com/LnL7/5701d70f46ea23276840a6b1c404597f
# maybe don't need mountpoint=legacy except for /nix?
alias nomount='zfs create -o canmount=off'
alias legacy='zfs create -o mountpoint=legacy'
nomount apool/r
nomount apool/r/local
legacy apool/r/local/root # /
legacy apool/r/local/tmp # /tmp
legacy apool/r/local/nix # /nix
legacy apool/r/local/var # /var
nomount apool/r/safe
legacy apool/r/safe/state
legacy -p apool/r/safe/state/home/vin/Downloads # create /home, /home/vin, and /home/vin/Downloads datasets
# zfs create -s -V 400G apool/r/win10

# keep space available in case it's ever needed
# to free up the space, `zfs set refreservation=none apool/alloc`
nomount -o refreservation=1G apool/alloc

# create snapshot of everything `@blank` -- easy to switch to tmpfs if I want
zfs snapshot -r apool/r@blank
# roll back with `zfs rollback -r apool/r@blank`

alias zmnt='mount -t zfs'
zmnt apool/r/local/root /mnt
mkdir -p /mnt/{boot,var,nix,state/home/vin/Downloads,mnt,shares/media}
zmnt apool/r/local/var /mnt/var
zmnt apool/r/local/nix /mnt/nix
zmnt apool/r/safe/state /mnt/state
zmnt apool/r/safe/state/home /mnt/state/home
zmnt apool/r/safe/state/home/vin /mnt/state/home/vin
zmnt apool/r/safe/state/home/vin/Downloads /mnt/state/home/vin/Downloads
mount $DISK-part1 /mnt/boot

2. install

# This section should be run as the ISO user

git clone https://github.com/cole-h/nixos-config /mnt/tmp/nixos-config

doas swapon $DISK-part2 # otherwise, nixos-install won't generate hardware config for this
nixos-generate-config --root /mnt --dir /tmp/nixos-config/hosts/scadrial

sed "[email protected] = \".*\"@networking.hostId = \"$(head -c 8 /etc/machine-id)\"@" -i hosts/scadrial/modules/networking.nix
# copy old host key to /mnt/tmp/host/ed25519? or maybe it's /tmp/host/ed25519. why not both.
nix build /mnt/tmp/nixos-config#bootstrap --out-link /tmp/outsystem
nixos-install --system /tmp/outsystem --no-root-passwd --no-channel-copy

nixos-enter
  echo "nameserver 192.168.1.212" >> /etc/resolv.conf
  nix-daemon &>/dev/null &
  doas -u vin bash
    doas chown -R vin:users /tmp/nixos-config
    mv /tmp/nixos-config ~/flake
    doas nixos-rebuild switch --flake .
    # add new host key to .agenix.toml (assuming it exists yet... might
    #   need to be once new system is booted)

systemctl reboot

3. setup

# This section should be run as the default user (vin, in this case)

doas mount -t zfs rpool/user/home /mnt
rsync -aP /mnt/vin/.password-store/ ~/.password-store/
rsync -aP /mnt/vin/.mozilla/ ~/.mozilla/
rsync -aP /mnt/vin/workspace/ ~/workspace/
ln -s ~/.local/share/hydrus/db ~/workspace/vcs/hydrus/db
rsync -a /mnt/vin/.cache/.j4_history ~/.cache/
rsync -aP --ignore-existing /mnt/vin/.local/share/chatterino/ ~/.local/share/chatterino/
rsync -a /mnt/vin/.local/share/zoxide/ ~/.local/share/zoxide/
rsync -a /mnt/vin/.local/share/fish/fish_history ~/.local/share/fish/
# verify PCI addresses in windows10.xml and start.sh / revert.sh, then:
doas virsh define ..../windows10.xml

# update snapshot settings to use new dataset(s)
# copy sonarr settings (watched shows, etc) from backup
# syncthing setup
# copy authorized_keys
# copy chatterino stuff
# copy todo stuff

Notes

Backup win10 disk to fresh zvol

# /dev/sda is the Windows disk
# /dev/zd0 is the zvol's block device

# Need to copy the GPT in order to make zd0pX devices available
nix shell nixpkgs#gptfdisk
  sgdisk /dev/sda -R /dev/zd0
doas bash
  nix shell nixpkgs#pv
    pv /dev/sdaX >/dev/zd0pX