diff --git a/docs/adopt.md b/docs/adopt.md index 3598c3e..83a56e1 100644 --- a/docs/adopt.md +++ b/docs/adopt.md @@ -22,7 +22,7 @@ On the target machine: description = "Local wrapper for the nanuqsaurus profile"; inputs = { - nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11"; + nixpkgs.url = "github:NixOS/nixpkgs/nixos-26.05"; nanuqsaurus = { url = "git+https://codeberg.org/randogoth/nanuqsaurus.git"; inputs.nixpkgs.follows = "nixpkgs"; @@ -53,6 +53,8 @@ On the target machine: { # Optional: change the default admin username ("admin") nanuqsaurus.admin.username = "admin"; + # Optional: enable impermanence (requires a /persist Btrfs subvolume and mounts in hardware-configuration.nix) + # nanuqsaurus.impermanence.enable = true; networking.hostName = "nanuqsaurus"; system.stateVersion = "25.11"; } @@ -75,3 +77,28 @@ sudo nixos-rebuild switch --flake /etc/nixos#nanuqsaurus - `sudo nixos-rebuild switch --flake /etc/nixos#nanuqsaurus` - Keep all your machine-specific changes in the wrapper flake (additional modules, packages, services, etc.). + +## Impermanence (optional) + +If you enable `nanuqsaurus.impermanence.enable = true;` you must: + +- Add a `/persist` mount (Btrfs subvolume) in `hardware-configuration.nix`. +- Migrate state you care about into `/persist` before the first reboot. + +Notes: + +- The rollback logic expects the root Btrfs volume label to be `nixos`. +- Create the subvolume with `btrfs subvolume create /mnt/persist` and mount it as `/persist`. + +The default persistence set includes: + +- `/etc/nixos` +- `/etc/ssh` +- `/etc/cups` +- `/var/lib/cups` +- `/var/lib/libvirt` +- `/var/lib/secureboot` +- `/var/lib/tailscale` +- `/var/lib/systemd` +- `/var/lib/nixos` +- `/etc/machine-id` diff --git a/laptop.md b/laptop.md new file mode 100644 index 0000000..c59c2b3 --- /dev/null +++ b/laptop.md @@ -0,0 +1,208 @@ +# Install Nanuqsaurus On An Empty Partition (No Full-Disk Wipe) + +This repo’s `nanuqsaurus-btrfs` “fresh install” path uses `disko` to create a brand new GPT layout (EFI + Btrfs) and therefore **wipes the whole disk**. If you want to install onto an **existing empty partition** while keeping other partitions intact, use the “wrapper flake” approach and a manual mount + `nixos-install`. + +These steps are meant to be run from a **NixOS installer ISO** on the target laptop. + +## 0) Preconditions + +- Boot the installer in **UEFI mode** (this profile enables `systemd-boot` + EFI). +- You have working network connectivity (WiFi instructions below). +- You have: + - an existing **empty root partition** you will format (example: `/dev/nvme0n1p6`) + - an existing **EFI System Partition** (vfat) you will mount at `/boot` (example: `/dev/nvme0n1p1`) + +Confirm UEFI: + +```bash +test -d /sys/firmware/efi/efivars && echo "UEFI booted" || echo "NOT UEFI booted" +``` + +## 0.5) Connect To WiFi (Installer) + +Most NixOS installer ISOs run NetworkManager. The easiest flow is `nmtui`. + +1) Bring up the text UI and connect: + +```bash +sudo -i +nmtui +``` + +In `nmtui`: + +- Select `Activate a connection` +- Pick your WiFi SSID +- Enter the password +- Exit + +2) Verify you have connectivity: + +```bash +ping -c 1 1.1.1.1 +ping -c 1 example.com +``` + +If `nmtui` is unavailable, try: + +```bash +nmcli dev status +nmcli dev wifi list +nmcli dev wifi connect "YOUR_SSID" password "YOUR_PASSWORD" +``` + +## 1) Identify Your Partitions + +```bash +lsblk -f +``` + +Pick stable paths if available (`/dev/disk/by-id/...`). In the commands below, set: + +- `ROOT_PART` = the empty partition to become `/` +- `EFI_PART` = the EFI System Partition (vfat) to become `/boot` + +Example: + +```bash +ROOT_PART=/dev/nvme0n1p6 +EFI_PART=/dev/nvme0n1p1 +``` + +## 2) Format The Root Partition + +Warning: this destroys data on `ROOT_PART`. + +Recommended (Btrfs with subvolumes similar to this repo’s intended layout): + +```bash +mkfs.btrfs -f -L nixos "$ROOT_PART" + +mount "$ROOT_PART" /mnt +btrfs subvolume create /mnt/root +btrfs subvolume create /mnt/home +btrfs subvolume create /mnt/nix +umount /mnt + +mount -o subvol=root,compress=zstd "$ROOT_PART" /mnt +mkdir -p /mnt/home /mnt/nix +mount -o subvol=home,compress=zstd "$ROOT_PART" /mnt/home +mount -o subvol=nix,compress=zstd "$ROOT_PART" /mnt/nix +``` + +Alternative (ext4): + +```bash +mkfs.ext4 -F -L nixos "$ROOT_PART" +mount "$ROOT_PART" /mnt +mkdir -p /mnt/nix +``` + +## 3) Mount EFI At `/boot` + +```bash +mkdir -p /mnt/boot +mount "$EFI_PART" /mnt/boot +``` + +## 4) Generate Hardware Config + +Important: do this **after** mounting `/boot`, so the EFI mount gets captured. + +```bash +nixos-generate-config --root /mnt +``` + +This creates: + +- `/mnt/etc/nixos/hardware-configuration.nix` +- `/mnt/etc/nixos/configuration.nix` (we will not use this directly) + +## 5) Create A Wrapper Flake In `/etc/nixos` + +This repo’s `nanuqsaurus` profile defines an `admin` user and also tends to lock `root` by default. To avoid surprises, set your own password hashes in the wrapper flake using `lib.mkForce`. + +If you have a Lenovo ThinkPad X13 (Intel), you can also import the `nixos-hardware` module for it in this wrapper flake. + +1) Generate SHA-512 password hashes: + +```bash +nix --experimental-features "nix-command flakes" \ + shell nixpkgs#mkpasswd -c mkpasswd -- -m sha-512 +``` + +Run it twice if you want to set both `admin` and `root`. + +2) Create `/mnt/etc/nixos/flake.nix`: + +```bash +nano /mnt/etc/nixos/flake.nix +``` + +Paste and edit: + +```nix +{ + description = "Local wrapper for the nanuqsaurus profile"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-26.05"; + nanuqsaurus = { + url = "git+https://codeberg.org/randogoth/nanuqsaurus.git"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + # Optional hardware profiles (recommended on laptops) + nixos-hardware = { + url = "github:NixOS/nixos-hardware"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + }; + + outputs = inputs@{ nixpkgs, nanuqsaurus, nixos-hardware, ... }: { + nixosConfigurations.nanuqsaurus = nixpkgs.lib.nixosSystem { + system = "x86_64-linux"; + specialArgs = { inherit inputs; }; + modules = [ + ./hardware-configuration.nix + # Optional: ThinkPad X13 (Intel) profile (path: lenovo/thinkpad/x13/intel) + # Remove or replace if you have different hardware. + nixos-hardware.nixosModules.lenovo-thinkpad-x13-intel + nanuqsaurus.nixosModules.nanuqsaurus + ({ lib, ... }: { + networking.hostName = "nanuqsaurus"; + system.stateVersion = "25.11"; + + nanuqsaurus.admin.username = "admin"; + users.users.admin.hashedPassword = lib.mkForce "PUT_ADMIN_SHA512_HASH_HERE"; + + # Recommended so you can recover easily: + users.users.root.hashedPassword = lib.mkForce "PUT_ROOT_SHA512_HASH_HERE"; + + # Optional: require sudo password (this repo defaults to passwordless sudo) + security.sudo.wheelNeedsPassword = lib.mkForce true; + }) + ]; + }; + }; +} +``` + +## 6) Install NixOS + +```bash +NIX_CONFIG="experimental-features = nix-command flakes" \ + nixos-install --root /mnt --flake /mnt/etc/nixos#nanuqsaurus +``` + +## 7) Reboot + +```bash +reboot +``` + +If your firmware shows multiple boot options, select the systemd-boot entry for the disk containing the EFI partition. + +## Notes + +- Secure Boot: this repo’s installer ISO expects Secure Boot off at boot; after installation you can enable Secure Boot using Lanzaboote (see `docs/secure-boot.md`). +- If you actually want to wipe an entire disk and let this repo handle partitioning, use `disko-install` with `#nanuqsaurus-btrfs` (see `README.md` and `docs/install-help.txt`).