From afd4bb95f97df3b739ef1d0bbbdf71078d27f3dc Mon Sep 17 00:00:00 2001 From: Stefan Junker Date: Sat, 10 Nov 2018 19:24:24 +0100 Subject: [PATCH] nix/devices: implement disk-prepare --- Justfile | 28 ++------ nix/os/devices/default.nix | 116 ++++++++++++++++++++++++------- nix/os/lib/default.nix | 25 ++++++- nix/os/modules/encryptedDisk.nix | 47 ++++--------- nix/os/profiles/common/user.nix | 3 +- 5 files changed, 136 insertions(+), 83 deletions(-) diff --git a/Justfile b/Justfile index 18b7c37..6770c7f 100755 --- a/Justfile +++ b/Justfile @@ -73,29 +73,9 @@ hm-iterate-qtile: wait $! kill ${XEPHYR_PID} -# Sorry, this is a manual step for now. Please see nix/os/modules/encryptedDisk.nix for the layout -disk-prepare: - echo NOT IMPLEMENTED - # GPT partition table - # part1: size: 1MiB type: 4 BIOS BOOT - # part2: size: 512MiB label: 2-DISKID (36 char limit?) - # part3: size: * label: 3-DISKID (36 char limit?) - # cryptsetup format part3 - # vgcreate DISKID part3 - # lvcreate DISKID -L 8G -n swap - # lvcreate DISKID -l 100%FREE -n root - # sudo mkfs.vfat -F32 part2 - # sudo mkfs.btrfs /dev/DISKID/root - # sudo mkswap /dev/DISKID/swap - # sudo mount /dev/DISKID/root /mnt - # sudo btrfs subvolume create nixos - # sudo btrfs subvolume create home - # sudo mount /dev/disk/by-partlabel/3-DISKID /mnt/DISKID-root - # pushd /dev/disk/by-partlabel/3-DISKID /mnt/DISKID-root - # sudo btrfs subvolume create nixos - # sudo mkdir nixos/{boot,home} - # sudo btrfs subvolume create home - # +# !!! DANGERIOUS !!! This wipes the disk which is configured for the given device. +disk-prepare dir: + just -v _device diskPrepare {{dir}} --argstr rebuildarg "dummy" # Mount the target disk specified by device configuration directory. The 'dir' argument points to a device configuration, e.g. 'nix/os/devices/steveej-live-mmc-SL32G_0x259093f6' disk-mount dir: @@ -105,6 +85,6 @@ disk-mount dir: disk-umount dir: just -v _device diskUmount {{dir}} --argstr rebuildarg "dummy" -# Perform an offline installation on the mounted the target disk, specified by device configuration directory +# Perform an offline installation on the mounted target disk, specified by device configuration directory disk-install dir: just -v _device diskInstall {{dir}} --argstr rebuildarg "dummy" diff --git a/nix/os/devices/default.nix b/nix/os/devices/default.nix index 7c620af..9d7b068 100644 --- a/nix/os/devices/default.nix +++ b/nix/os/devices/default.nix @@ -1,21 +1,22 @@ { pkgs ? import {} +, ownLib ? import ../lib/default.nix { } , dir , rebuildarg , moreargs ? "" +, diskId ? (import ((builtins.getEnv "PWD")+"/${dir}/hw.nix") {}).hardware.encryptedDisk.diskId +, gitRoot ? "$(git rev-parse --show-toplevel)" }: let - diskId = (import ((builtins.getEnv "PWD")+"/${dir}/hw.nix") {}).hardware.encryptedDisk.diskId; - GIT_ROOT=''''$(git rev-parse --show-toplevel)''; + mntRootVol="/mnt/${diskId}-root"; -in { +in rec { rebuild = pkgs.writeScript "script" '' #!/usr/bin/env bash set -xe - pushd ${GIT_ROOT}/${dir} + pushd ${gitRoot}/${dir} export NIXOS_CONFIG="$PWD"/configuration.nix - export INSTALL_ROOT="/mnt/$ID-root" [[ -e "''${NIXOS_CONFIG}" ]] @@ -28,39 +29,106 @@ in { diskMount = pkgs.writeScript "script" '' #!/usr/bin/env bash set -xe - ID=${diskId} - echo Mounting $ID - set -xe - cryptsetup luksOpen /dev/disk/by-id/$ID-part3 $ID-part3 - vgchange -ay $ID - mkdir -p /mnt/$ID-root - mount /dev/$ID/root /mnt/$ID-root -o subvol=nixos - mount /dev/$ID/root /mnt/$ID-root/home -o subvol=home - mount /dev/disk/by-id/$ID-part2 /mnt/$ID-root/boot + echo Mounting ${diskId} + cryptsetup luksOpen ${ownLib.disk.bootLuksDevice diskId} ${ownLib.disk.luksName diskId} + vgchange -ay ${ownLib.disk.volumeGroup diskId} + mkdir -p /mnt + mkdir ${mntRootVol} + mount ${ownLib.disk.rootFsDevice diskId} ${mntRootVol} + mount ${ownLib.disk.rootFsDevice diskId} ${mntRootVol}/nixos/home -o subvol=home + mount ${ownLib.disk.bootFsDevice diskId} ${mntRootVol}/nixos/boot ''; diskUmount = pkgs.writeScript "script" '' #!/usr/bin/env bash set -xe - ID=${diskId} - umount -R /mnt/$ID-root - rmdir /mnt/$ID-root - vgchange -an $ID - cryptsetup luksClose $ID-part3 + umount -R ${mntRootVol} + rmdir ${mntRootVol} + vgchange -an ${ownLib.disk.volumeGroup diskId} + cryptsetup luksClose ${ownLib.disk.luksName diskId} sync ''; diskInstall = pkgs.writeScript "script" '' #!/usr/bin/env bash set -xe - ID=${diskId} - pushd ${GIT_ROOT}/${dir} + pushd ${gitRoot}/${dir} export NIXOS_CONFIG="$PWD"/configuration.nix - export INSTALL_ROOT="/mnt/$ID-root" [[ -e "''${NIXOS_CONFIG}" ]] - [[ -e "''${INSTALL_ROOT}" ]] + [[ -e "${mntRootVol}/nixos" ]] - nixos-install --max-jobs 5 --cores 4 --no-channel-copy --no-root-passwd --root "''${INSTALL_ROOT}" + nixos-install --max-jobs 5 --cores 4 --no-channel-copy --no-root-passwd --root ${mntRootVol}/nixos + ''; + + diskPrepare = pkgs.writeScript "script" '' + #!/usr/bin/env bash + set -xe + + read -p "Continue to format ${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 + + # Partition + sync + { + fdisk -w always -W always ${ownLib.disk.bootGrubDevice diskId} <