summaryrefslogtreecommitdiff
path: root/packages/partitioner.nix
blob: df9f37d0fc9adc1203c6146dbf9d2dec6f69582a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# Apply standard partition layout to a disk device.
{ pkgs, ... }:

pkgs.writeShellApplication {
  name = "partitioner";

  runtimeInputs = with pkgs; [
    gptfdisk
    dosfstools
    zfs
    coreutils
    util-linux
  ];

  text = ''
    set -euo pipefail

    if [ $# -ne 1 ]; then
      echo "Usage: $0 <device>"
      echo "Example: $0 /dev/sda or /dev/nvme0n1"
      exit 1
    fi

    DISK="$1"

    if [ ! -b "$DISK" ]; then
      echo "Error: $DISK is not a valid block device"
      exit 1
    fi

    echo "creating partition table on $DISK"
    # create gpt partition table
    sgdisk --zap-all "$DISK"

    echo "creating efi partition"
    sgdisk --new=1:0:+1G --typecode=1:EF00 --change-name=1:ESP "$DISK"

    echo "creating zfs partition with remaining space"
    sgdisk --new=2:0:0 --typecode=2:BF00 --change-name=2:ZROOT "$DISK"

    if [[ "$DISK" == *"nvme"* ]]; then
      EFI_PART="''${DISK}p1"
      ZFS_PART="''${DISK}p2"
    else
      EFI_PART="''${DISK}1"
      ZFS_PART="''${DISK}2"
    fi

    sleep 1

    echo "formatting rfi partition ($EFI_PART)"
    mkfs.fat -F32 -n ESP "$EFI_PART"

    echo "creating pool on $ZFS_PART"
    zpool create -f \
      -o ashift=12 \
      -o autotrim=on \
      -O acltype=posixacl \
      -O canmount=off \
      -O compression=on \
      -O mountpoint=none \
      -O normalization=formD \
      -O relatime=off \
      -O xattr=sa \
      zroot "$ZFS_PART"

    # create ZFS datasets
    echo "Creating datasets"

    zfs create \
      -o refreservation=10G \
      -o mountpoint=none \
      zroot/reserved

    zfs create -o mountpoint=legacy zroot/nix
    zfs create -o mountpoint=legacy zroot/home
    zfs create -o mountpoint=legacy zroot/persist

    echo "---"
    echo "done"
  '';
}