feat(deploy): add disk-image-sintra-usb with distinct partition labels
A USB-bootable Sintra image variant for booting on a machine whose eMMC already holds a nixos/ESP-labelled install. make-disk-image hardcodes the root/ESP labels (nixos/ESP); booting the standard image from USB next to the eMMC races stage-1's by-label/nixos between the two roots and likely mounts the eMMC. This variant labels root nixos-usb (via make-disk-image -L) and relabels the ESP to ESP-USB in a post-step (mtools), with fileSystems pointed at the new labels. Auto-upgrade is disabled — it's a portable test / hand-off image, and that also removes scheduled bootloader writes that could land on the eMMC's ESP. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
482e0549b9
commit
ce649947f6
1 changed files with 45 additions and 0 deletions
45
flake.nix
45
flake.nix
|
|
@ -326,6 +326,51 @@
|
||||||
diskSize = "auto";
|
diskSize = "auto";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# USB-bootable Sintra image with DISTINCT partition labels
|
||||||
|
# (nixos-usb / ESP-USB) so the stick can be booted on a Sintra whose
|
||||||
|
# eMMC already holds a nixos/ESP-labelled install without a by-label
|
||||||
|
# collision — stage-1 would otherwise race between the two roots and
|
||||||
|
# likely mount the eMMC. Auto-upgrade is disabled: this is a portable
|
||||||
|
# test / hand-off image, not a managed fleet member, and disabling it
|
||||||
|
# also removes the scheduled bootloader writes that could otherwise
|
||||||
|
# land on the eMMC's ESP.
|
||||||
|
disk-image-sintra-usb =
|
||||||
|
let
|
||||||
|
cfg = self.nixosConfigurations.sintra-installed.extendModules {
|
||||||
|
modules = [
|
||||||
|
({ lib, ... }: {
|
||||||
|
fileSystems."/".device = lib.mkForce "/dev/disk/by-label/nixos-usb";
|
||||||
|
fileSystems."/boot".device = lib.mkForce "/dev/disk/by-label/ESP-USB";
|
||||||
|
system.autoUpgrade.enable = lib.mkForce false;
|
||||||
|
})
|
||||||
|
];
|
||||||
|
};
|
||||||
|
baseImage = import (nixpkgs + "/nixos/lib/make-disk-image.nix") {
|
||||||
|
inherit pkgs lib;
|
||||||
|
config = cfg.config;
|
||||||
|
format = "raw";
|
||||||
|
partitionTableType = "efi";
|
||||||
|
diskSize = "auto";
|
||||||
|
label = "nixos-usb"; # ext4 root label (make-disk-image -L)
|
||||||
|
};
|
||||||
|
in
|
||||||
|
pkgs.runCommand "nixos-disk-image-sintra-usb"
|
||||||
|
{ nativeBuildInputs = [ pkgs.parted pkgs.mtools ]; }
|
||||||
|
''
|
||||||
|
mkdir -p $out
|
||||||
|
cp --sparse=always ${baseImage}/nixos.img $out/nixos.img
|
||||||
|
chmod +w $out/nixos.img
|
||||||
|
# make-disk-image hardcodes the ESP FAT label to "ESP"; relabel the
|
||||||
|
# volume to ESP-USB so /boot (by-label/ESP-USB) doesn't collide with
|
||||||
|
# the eMMC's ESP. Volume label only — bootloader files are untouched,
|
||||||
|
# and UEFI loads /EFI/BOOT/BOOTX64.EFI regardless of the label.
|
||||||
|
espStart=$(parted -sm "$out/nixos.img" unit B print | awk -F: '$1==1 {gsub("B","",$2); print $2}')
|
||||||
|
echo "ESP partition starts at byte $espStart — relabelling to ESP-USB"
|
||||||
|
export MTOOLS_SKIP_CHECK=1
|
||||||
|
mlabel -i "$out/nixos.img@@$espStart" ::ESP-USB
|
||||||
|
printf 'verify ESP label: '; mlabel -i "$out/nixos.img@@$espStart" -s :: || true
|
||||||
|
'';
|
||||||
|
|
||||||
# Backwards compat
|
# Backwards compat
|
||||||
iso = self.nixosConfigurations.douro.config.system.build.isoImage;
|
iso = self.nixosConfigurations.douro.config.system.build.isoImage;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue