infra/nix/os/devices/disk.nix

186 lines
4.4 KiB
Nix
Raw Permalink Normal View History

2023-02-07 18:24:28 +01:00
{
pkgs,
ownLib,
dir,
gitRoot,
2024-11-15 10:17:56 +01:00
diskId ? (import ((builtins.getEnv "PWD") + "/${dir}/hw.nix") { }).hardware.opinionatedDisk.diskId,
2023-02-07 18:24:28 +01:00
encrypted ?
2024-11-15 10:17:56 +01:00
(import ((builtins.getEnv "PWD") + "/${dir}/hw.nix") { }).hardware.opinionatedDisk.encrypted,
2023-02-07 18:24:28 +01:00
previousDiskId ? "",
...
2024-11-15 10:17:56 +01:00
}:
let
2023-02-07 18:24:28 +01:00
mntRootVol = "/mnt/${diskId}-root";
2024-11-15 10:17:56 +01:00
in
rec {
diskMount = pkgs.writeScript "script" ''
#!/usr/bin/env bash
set -xe
2018-11-10 19:24:24 +01:00
echo Mounting ${diskId}
2020-12-31 02:12:29 +01:00
${pkgs.lib.strings.optionalString encrypted ''
2024-11-15 10:17:56 +01:00
sudo cryptsetup luksOpen ${ownLib.disk.bootLuksDevice diskId} ${ownLib.disk.luksName diskId}
2020-12-31 02:12:29 +01:00
''}
sleep 1
sudo vgchange -ay ${ownLib.disk.volumeGroup diskId}
sudo mkdir -p /mnt
sudo mkdir ${mntRootVol}
sudo mount ${ownLib.disk.rootFsDevice diskId} ${mntRootVol}
2024-11-15 10:17:56 +01:00
sudo mount ${ownLib.disk.rootFsDevice diskId} ${mntRootVol}/nixos/home -o subvol=home
sudo mount ${ownLib.disk.bootFsDevice diskId} ${mntRootVol}/nixos/boot
'';
diskUmount = pkgs.writeScript "script" ''
#!/usr/bin/env bash
2019-11-22 16:38:19 +01:00
set -x
sudo umount -Rl ${mntRootVol}
sudo rmdir ${mntRootVol}
sudo vgchange -an ${ownLib.disk.volumeGroup diskId}
2020-12-31 02:12:29 +01:00
${pkgs.lib.strings.optionalString encrypted ''
sudo cryptsetup close ${ownLib.disk.luksName diskId}
''}
sync
'';
diskInstall = pkgs.writeScript "script" ''
#!/usr/bin/env bash
set -xe
2018-11-10 19:24:24 +01:00
pushd ${gitRoot}/${dir}
export NIXOS_CONFIG="$PWD"/configuration.nix
[[ -e "''${NIXOS_CONFIG}" ]]
2018-11-10 19:24:24 +01:00
[[ -e "${mntRootVol}/nixos" ]]
sudo --preserve-env=PATH -E $SHELL <<EOF
# 'having $system set breaks nixos-install'
unset system
2022-01-09 21:50:41 +01:00
echo $NIX_PATH
2018-11-10 20:13:59 +01:00
nixos-install --max-jobs 5 --cores 4 --no-root-passwd --root ${mntRootVol}/nixos
EOF
2018-11-10 19:24:24 +01:00
'';
diskPrepare = pkgs.writeScript "script" ''
#!/usr/bin/env bash
set -xe
2024-11-15 10:17:56 +01:00
read -p "Continue to format ${ownLib.disk.bootGrubDevice diskId} (YES/n)? " choice
2018-11-10 19:24:24 +01:00
case "$choice" in
YES ) echo "Continuing in 3 seconds..."; sleep 3;;
n|N ) echo "Exiting..."; exit 0;;
* ) echo "Exiting..."; exit 1;;
esac
# Partition
sync
{
sudo fdisk -w always -W always ${ownLib.disk.bootGrubDevice diskId} <<EOF
2018-11-10 19:24:24 +01:00
g
n
1
2022-10-31 11:04:38 +01:00
2018-11-10 19:24:24 +01:00
+1M
n
2
2022-10-31 11:04:38 +01:00
2018-11-10 19:24:24 +01:00
+512M
n
3
2022-10-31 11:04:38 +01:00
2018-11-10 19:24:24 +01:00
t
1
4
x
n
2
2-${diskId}
n
3
3-${diskId}
r
w
EOF
} || {
sync
sudo partprobe ${ownLib.disk.bootGrubDevice diskId}
2018-11-10 19:24:24 +01:00
}
sleep 1
2020-12-31 02:12:29 +01:00
${pkgs.lib.strings.optionalString encrypted ''
# Encrypt
sudo cryptsetup luksFormat ${ownLib.disk.bootLuksDevice diskId} -
2024-11-15 10:17:56 +01:00
sudo cryptsetup luksOpen ${ownLib.disk.bootLuksDevice diskId} ${ownLib.disk.luksName diskId}
2020-12-31 02:12:29 +01:00
''}
2018-11-10 19:24:24 +01:00
# LVM
2024-11-15 10:17:56 +01:00
sudo vgcreate ${ownLib.disk.volumeGroup diskId} ${ownLib.disk.lvmPv diskId encrypted}
sudo lvcreate ${ownLib.disk.volumeGroup diskId} -L 2G -n swap
sudo lvcreate ${ownLib.disk.volumeGroup diskId} -l 100%FREE -n root
2018-11-10 19:24:24 +01:00
# Filesystem
sudo mkfs.vfat -F32 ${ownLib.disk.bootFsDevice diskId}
sudo mkfs.btrfs ${ownLib.disk.rootFsDevice diskId}
sudo mkswap ${ownLib.disk.swapFsDevice diskId}
2018-11-10 19:24:24 +01:00
# Subvolume and FS hierharchy
sudo mkdir -p /mnt
sudo mkdir ${mntRootVol}
sudo mount ${ownLib.disk.rootFsDevice diskId} ${mntRootVol}
sudo btrfs subvolume create ${mntRootVol}/nixos
sudo btrfs subvolume create ${mntRootVol}/home
sudo mkdir ${mntRootVol}/nixos/{boot,home,tmp}
2018-11-10 19:24:24 +01:00
${diskUmount}
'';
diskRelabel = pkgs.writeScript "script" ''
#!/usr/bin/env bash
set -xe
2024-11-15 10:17:56 +01:00
read -p "Continue to relabel ${ownLib.disk.bootGrubDevice diskId} (YES/n)?" choice
case "$choice" in
YES ) echo "Continuing in 3 seconds..."; sleep 3;;
n|N ) echo "Exiting..."; exit 0;;
* ) echo "Exiting..."; exit 1;;
esac
sync
{
sudo fdisk ${ownLib.disk.bootGrubDevice diskId} <<EOF
x
n
2
2-${diskId}
n
3
3-${diskId}
r
i
2
i
3
w
EOF
} || {
sync
sudo partprobe ${ownLib.disk.bootGrubDevice diskId}
}
if test "${previousDiskId}"; then
2024-11-15 10:17:56 +01:00
${pkgs.lib.strings.optionalString encrypted ''
sudo cryptsetup luksOpen ${ownLib.disk.bootLuksDevice diskId} ${ownLib.disk.luksName diskId}
''}
sync
sleep 1
if sudo vgs ${previousDiskId}; then
sudo vgrename ${previousDiskId} ${diskId}
sudo vgscan
fi
fi
2020-12-31 02:12:29 +01:00
${pkgs.lib.strings.optionalString encrypted ''
sudo cryptsetup close ${ownLib.disk.luksName diskId}
''}
'';
}