bpi-r3: more work on booting

(still doesnt boot)

also some misc changes not related to bpi-r3
This commit is contained in:
chayleaf 2023-06-11 18:02:38 +07:00
parent ebc7241725
commit a96bd4bbcd
17 changed files with 545 additions and 37 deletions

10
default.nix Normal file
View file

@ -0,0 +1,10 @@
(import
(
let lock = builtins.fromJSON (builtins.readFile ./flake.lock); in
fetchTarball {
url = "https://github.com/edolstra/flake-compat/archive/${lock.nodes.flake-compat.locked.rev}.tar.gz";
sha256 = lock.nodes.flake-compat.locked.narHash;
}
)
{ src = ./.; }
).defaultNix

View file

@ -17,6 +17,22 @@
} }
}, },
"flake-compat": { "flake-compat": {
"flake": false,
"locked": {
"lastModified": 1673956053,
"narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=",
"owner": "edolstra",
"repo": "flake-compat",
"rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9",
"type": "github"
},
"original": {
"owner": "edolstra",
"repo": "flake-compat",
"type": "github"
}
},
"flake-compat_2": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1668681692, "lastModified": 1668681692,
@ -142,7 +158,7 @@
"nixos-mailserver": { "nixos-mailserver": {
"inputs": { "inputs": {
"blobs": "blobs", "blobs": "blobs",
"flake-compat": "flake-compat", "flake-compat": "flake-compat_2",
"nixpkgs": [ "nixpkgs": [
"nixpkgs" "nixpkgs"
], ],
@ -237,6 +253,7 @@
}, },
"root": { "root": {
"inputs": { "inputs": {
"flake-compat": "flake-compat",
"home-manager": "home-manager", "home-manager": "home-manager",
"impermanence": "impermanence", "impermanence": "impermanence",
"nix-gaming": "nix-gaming", "nix-gaming": "nix-gaming",

View file

@ -27,6 +27,10 @@
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
inputs.nixpkgs-22_11.follows = "nixpkgs"; inputs.nixpkgs-22_11.follows = "nixpkgs";
}; };
flake-compat = {
url = "github:edolstra/flake-compat";
flake = false;
};
}; };
outputs = inputs@{ self, nixpkgs, nixos-hardware, impermanence, home-manager, nur, nix-gaming, notlua, nixos-mailserver, ... }: outputs = inputs@{ self, nixpkgs, nixos-hardware, impermanence, home-manager, nur, nix-gaming, notlua, nixos-mailserver, ... }:

View file

@ -18,7 +18,14 @@
# position = "bottom"; # position = "bottom";
ipc = true; ipc = true;
height = 40; height = 40;
modules-left = [ "sway/workspaces" "sway/mode" "mpris" ]; modules-left = [ "sway/workspaces" "sway/mode" "idle_inhibitor" "mpris" ];
idle_inhibitor = {
format = "{icon}";
format-icons = {
activated = "󰅶";
deactivated = "󰾪";
};
};
mpris = { mpris = {
tooltip = true; tooltip = true;
format = "{player_icon} {dynamic}"; format = "{player_icon} {dynamic}";

View file

@ -106,6 +106,7 @@
glaxnimate glaxnimate
lalrpop lalrpop
looking-glass-client looking-glass-client
tio
]; ];
xdg.configFile."looking-glass/client.ini".text = '' xdg.configFile."looking-glass/client.ini".text = ''
[app] [app]

View file

@ -23,11 +23,11 @@
"pinned": false, "pinned": false,
"src": { "src": {
"name": null, "name": null,
"sha256": "sha256-JYGwb0LhIs6B2/OHiU+mJ/dAAS+Dg+MrVksAsn6IS9g=", "sha256": "sha256-OPwmVxBGaWo51pDJcqvxvZ8qxMH8X0DwZTpwiKbdx/I=",
"type": "url", "type": "url",
"url": "https://github.com/GloriousEggroll/proton-ge-custom/releases/download/GE-Proton8-3/GE-Proton8-3.tar.gz" "url": "https://github.com/GloriousEggroll/proton-ge-custom/releases/download/GE-Proton8-4/GE-Proton8-4.tar.gz"
}, },
"version": "GE-Proton8-3" "version": "GE-Proton8-4"
}, },
"yomichan": { "yomichan": {
"cargoLocks": null, "cargoLocks": null,

View file

@ -11,10 +11,10 @@
}; };
proton-ge = { proton-ge = {
pname = "proton-ge"; pname = "proton-ge";
version = "GE-Proton8-3"; version = "GE-Proton8-4";
src = fetchurl { src = fetchurl {
url = "https://github.com/GloriousEggroll/proton-ge-custom/releases/download/GE-Proton8-3/GE-Proton8-3.tar.gz"; url = "https://github.com/GloriousEggroll/proton-ge-custom/releases/download/GE-Proton8-4/GE-Proton8-4.tar.gz";
sha256 = "sha256-JYGwb0LhIs6B2/OHiU+mJ/dAAS+Dg+MrVksAsn6IS9g="; sha256 = "sha256-OPwmVxBGaWo51pDJcqvxvZ8qxMH8X0DwZTpwiKbdx/I=";
}; };
}; };
yomichan = { yomichan = {

View file

@ -0,0 +1,31 @@
diff --git a/plat/mediatek/mt7986/platform.mk b/plat/mediatek/mt7986/platform.mk
index c232d7a..27a165d 100644
--- a/plat/mediatek/mt7986/platform.mk
+++ b/plat/mediatek/mt7986/platform.mk
@@ -456,6 +456,7 @@ else
bl2: $(BUILD_PLAT)/bl2.img
endif
+ifneq ($(USE_MKIMAGE),1)
ifneq ($(BROM_SIGN_KEY),)
$(BUILD_PLAT)/bl2.img: $(BROM_SIGN_KEY)
endif
@@ -472,6 +473,18 @@ $(BUILD_PLAT)/bl2.img: $(BL2_IMG_PAYLOAD) $(DOIMAGETOOL)
$(if $(BL_AR_VER), -r $(BL_AR_VER)) \
$(if $(NAND_TYPE), -n $(NAND_TYPE)) \
$(BL2_IMG_PAYLOAD) $@
+else
+MKIMAGE ?= mkimage
+
+ifneq ($(BROM_SIGN_KEY)$(AUTO_AR_VER),)
+$(warning BL2 signing/anti-rollback is not supported using mkimage)
+endif
+
+$(BUILD_PLAT)/bl2.img: $(BL2_IMG_PAYLOAD)
+ $(Q)$(MKIMAGE) -T mtk_image -a $(BL2_BASE) -e $(BL2_BASE) \
+ -n "arm64=1;media=$(BROM_HEADER_TYPE)$(if $(NAND_TYPE),;nandinfo=$(NAND_TYPE))" \
+ -d $(BL2_IMG_PAYLOAD) $@
+endif
$(DOIMAGETOOL):
$(Q)$(MAKE) --no-print-directory -C $(DOIMAGEPATH)

View file

@ -8,12 +8,73 @@ let
sources = import ./_sources/generated.nix { sources = import ./_sources/generated.nix {
inherit (pkgs) fetchgit fetchurl fetchFromGitHub dockerTools; inherit (pkgs) fetchgit fetchurl fetchFromGitHub dockerTools;
}; };
armTrustedFirmwareBpiR3 = { bootDevice, uboot ? null }: pkgs.buildArmTrustedFirmware rec {
# TODO: nvfetcherify this
src = pkgs.fetchFromGitHub {
owner = "frank-w";
repo = "u-boot";
rev = "c30a1caf8274af67bf31f3fb5abc45df5737df36";
hash = "sha256-pW2yytXRIFEIbG1gnuXq8TiLe/Eew7zESe6Pijh2qVk=";
};
patches = [ ./bpi-r3-atf-backport-mkimage-support.patch ];
extraMakeFlags = assert builtins.elem bootDevice [
"nor" "snand" "spim-nand" "emmc" "sdmmc" "ram"
]; [
"BOOT_DEVICE=${bootDevice}"
"DRAM_USE_DDR4=1"
"USE_MKIMAGE=1"
"MKIMAGE=${pkgs.ubootTools}/bin/mkimage"
"all"
"fip"
] ++ lib.optionals (uboot != null) [
"BL33=${uboot}/u-boot.bin"
];
extraMeta.platforms = [ "aarch64-linux" ];
platform = "mt7986";
filesToInstall = [
"build/${platform}/release/bl2.img"
"build/${platform}/release/fip.bin"
];
nativeBuildInputs = with pkgs; [ /*pkgsCross.arm-embedded.stdenv.cc*/ dtc ];
};
# sd/emmc
# -- CONFIG_USE_BOOTCOMMAND/CONFIG_BOOTCOMMAND - distroboot stuff (override default boot command)
# -- CONFIG_BOOTDELAY - autoboot timeout
# CONFIG_BOOTSTD_DEFAULTS - stdboot stuff
# CONFIG_BOOTSTD_BOOTCOMMAND - might be? an alternative to CONFIG_BOOTCOMMAND
# CONFIG_DEFAULT_FDT_FILE - compatibility with nixos
# CONFIG_DISTRO_DEFAULTS - surely this won't hurt, it adds autocomplete and stuff and doesn't weight much in the large scale of things
# CONFIG_SYS_BOOTM_LEN - increase max initrd? size
# CONFIG_ZSTD - allow zstd initrd
ubootConfig = storage: ''
CONFIG_AUTOBOOT=y
CONFIG_BOOTCOMMAND="${builtins.replaceStrings [ "\n" ] [ "; " ] ''
setenv boot_prefixes /@boot/ /@/ /boot/ /
run distro_bootcmd
''};"
CONFIG_BOOTSTD_DEFAULTS=y
CONFIG_BOOTSTD_FULL=y
CONFIG_CMD_BTRFS=y
CONFIG_CMD_CAT=y
CONFIG_DEFAULT_FDT_FILE="mediatek/mt7986a-bananapi-bpi-r3.dtb"
CONFIG_DISTRO_DEFAULTS=y
CONFIG_ENV_IS_NOWHERE=y
CONFIG_FS_BTRFS=y
CONFIG_SYS_BOOTM_LEN=0x6000000
CONFIG_USE_BOOTCOMMAND=y
CONFIG_ZSTD=y
'';
ubootVersion = "2023.07-rc3";
ubootSrc = pkgs.fetchurl {
url = "ftp://ftp.denx.de/pub/u-boot/u-boot-${ubootVersion}.tar.bz2";
hash = "sha256-QuwINnS9MPpMFueMP19FPAjZ9zdZWne13aWVrDoJ2C8=";
};
in in
{ rec {
osu-lazer-bin = nix-gaming.osu-lazer-bin; osu-lazer-bin = nix-gaming.osu-lazer-bin;
clang-tools_latest = pkgs.clang-tools_15; clang-tools_latest = pkgs.clang-tools_16;
clang_latest = pkgs.clang_15; clang_latest = pkgs.clang_16;
home-daemon = callPackage ./home-daemon { }; home-daemon = callPackage ./home-daemon { };
/*ghidra = pkgs.ghidra.overrideAttrs (old: { /*ghidra = pkgs.ghidra.overrideAttrs (old: {
patches = old.patches ++ [ ./ghidra-stdcall.patch ]; patches = old.patches ++ [ ./ghidra-stdcall.patch ];
@ -43,6 +104,81 @@ in
# system76-scheduler = callPackage ./system76-scheduler.nix { }; # system76-scheduler = callPackage ./system76-scheduler.nix { };
techmino = callPackage ./techmino { }; techmino = callPackage ./techmino { };
ubootBpiR3Sd = pkgs.buildUBoot {
defconfig = "mt7986a_bpir3_sd_defconfig";
extraConfig = ubootConfig "sd";
src = ubootSrc;
version = ubootVersion;
extraMeta.platforms = [ "aarch64-linux" ];
# https://github.com/nakato/nixos-bpir3-example/blob/main/pkgs/uboot/mt7986-default-bootcmd.patch
patches = [ ./mt7986-default-bootcmd.patch ];
filesToInstall = [ "u-boot.bin" ];
};
ubootBpiR3Emmc = pkgs.buildUBoot {
defconfig = "mt7986a_bpir3_emmc_defconfig";
extraConfig = ubootConfig "emmc";
src = ubootSrc;
version = ubootVersion;
extraMeta.platforms = [ "aarch64-linux" ];
patches = [ ./mt7986-default-bootcmd.patch ];
filesToInstall = [ "u-boot.bin" ];
};
armTrustedFirmwareBpiR3Sd = armTrustedFirmwareBpiR3 { uboot = ubootBpiR3Sd; bootDevice = "sdmmc"; };
armTrustedFirmwareBpiR3Emmc = armTrustedFirmwareBpiR3 { uboot = ubootBpiR3Emmc; bootDevice = "emmc"; };
bpiR3StuffCombined = pkgs.stdenvNoCC.mkDerivation {
name = "bpi-r3-stuff";
unpackPhase = "true";
buildPhase = "true";
installPhase = ''
mkdir -p $out/sd
mkdir -p $out/emmc
cp ${bpiR3StuffEmmc}/* $out/emmc
cp ${bpiR3StuffSd}/* $out/sd
'';
fixupPhase = "true";
};
bpiR3StuffEmmc = pkgs.stdenvNoCC.mkDerivation {
name = "bpi-r3-stuff-emmc";
unpackPhase = "true";
buildPhase = "true";
installPhase = ''
mkdir -p $out
cp ${ubootBpiR3Emmc}/*.* $out
cp ${armTrustedFirmwareBpiR3Emmc}/*.* $out
'';
fixupPhase = "true";
};
bpiR3StuffSd = pkgs.stdenvNoCC.mkDerivation {
name = "bpi-r3-stuff-sd";
unpackPhase = "true";
buildPhase = "true";
installPhase = ''
mkdir -p $out
cp ${ubootBpiR3Sd}/*.* $out
cp ${armTrustedFirmwareBpiR3Sd}/*.* $out
'';
fixupPhase = "true";
};
linux_bpiR3 = (pkgs.buildLinux ({
version = "6.3";
modDirVersion = "6.3.0";
src = pkgs.fetchFromGitHub {
owner = "frank-w";
repo = "BPI-Router-Linux";
rev = "6.3-main";
hash = lib.fakeHash;
};
defconfig = "mt7986a_bpi-r3";
})).overrideAttrs (old: {
postConfigure = ''
sed -i "$buildRoot/.config" -e 's%^CONFIG_LOCALVERSION=.*%CONFIG_LOCALVERSION=""%'
sed -i "$buildRoot/include/config/auto.conf" -e 's%^CONFIG_LOCALVERSION=.*%CONFIG_LOCALVERSION=""%'
'';
});
linuxPackages_bpiR3 = pkgs.linuxPackagesFor linux_bpiR3;
firefox-addons = lib.recurseIntoAttrs (callPackage ./firefox-addons { inherit nur sources; }); firefox-addons = lib.recurseIntoAttrs (callPackage ./firefox-addons { inherit nur sources; });
mpvScripts = pkgs.mpvScripts // (callPackage ./mpv-scripts { }); mpvScripts = pkgs.mpvScripts // (callPackage ./mpv-scripts { });
} }

View file

@ -0,0 +1,75 @@
diff --git a/include/configs/mt7986.h b/include/configs/mt7986.h
index 0c41af1fc3..4ddf3cef89 100644
--- a/include/configs/mt7986.h
+++ b/include/configs/mt7986.h
@@ -9,6 +9,8 @@
#ifndef __MT7986_H
#define __MT7986_H
+#include <linux/stringify.h>
+
/* Uboot definition */
#define CFG_SYS_UBOOT_BASE CONFIG_TEXT_BASE
@@ -18,4 +20,61 @@
/* DRAM */
#define CFG_SYS_SDRAM_BASE 0x40000000
+#define BOOT_TARGET_DEVICES(func) \
+ func(MMC, mmc, 0)
+
+#include <config_distro_bootcmd.h>
+
+/*
+ * Linux mt6978a.dtsi defines reserved memory in the first 256MB:
+ * 0x4300_0000 - 0x4302_FFFF
+ * 0x4FC0_0000 - 0x4FCF_FFFF
+ * 0x4FD0_0000 - 0x4FD3_FFFF
+ * 0x4FD4_0000 - 0x4FD7_FFFF
+ * 0x4FD8_0000 - 0x4FDA_3FFF
+ *
+ * Getting uboot to obey these by adding them into the DTS here
+ * got it respecting them. To not clobber these memory addresses
+ * fdt_high and initrd_high are being set.
+ */
+
+/*
+ * Do not relocate FDT, because relocate fails to alloc when
+ * initrd_high is set to 0x4FC0_0000 to keep initrd out of
+ * reserved memory. This is irregardless of the reserved
+ * addresses above still being valid as far as configuraiton
+ * is concerned at that point, so I'm at a loss.
+ */
+#define FDT_HIGH __stringify(0xffffffffffffffff)
+/* No reloc might work now that FDT is in-place, but this should be more compatible */
+#define INITRD_HIGH __stringify(0x4fc00000)
+
+/* Seems to be the address uboot would relocate to so place there */
+#define KERNEL_ADDR_R __stringify(0x43200000)
+/* Right before the kernel, after that reserved memory, probably best spots exist */
+#define FDT_ADDR_R __stringify(0x43030000)
+
+#define RAMDISK_ADDR_R __stringify(0x4b100000)
+
+/* Anything different means no-boot */
+#define BOOTM_SIZE __stringify(0x10000000)
+
+/* These can be outside Linux's 256MB */
+#define SCRIPTADDR __stringify(0x90000000)
+#define PXEFILE_ADDR_R __stringify(0x90100000)
+
+
+/* No comp_addr supplied */
+#define CFG_EXTRA_ENV_SETTINGS \
+ "bootm_size=" BOOTM_SIZE "\0" \
+ "fdt_addr_r=" FDT_ADDR_R "\0" \
+ "fdt_high=" FDT_HIGH "\0" \
+ "initrd_high=" INITRD_HIGH "\0" \
+ "kernel_addr_r=" KERNEL_ADDR_R "\0" \
+ "pxefile_addr_r=" PXEFILE_ADDR_R "\0" \
+ "ramdisk_addr_r=" RAMDISK_ADDR_R "\0" \
+ "scriptaddr=" SCRIPTADDR "\0" \
+ "fdtfile=" CONFIG_DEFAULT_FDT_FILE "\0" \
+ BOOTENV
+
#endif

View file

@ -10,3 +10,13 @@ fetch.url = "https://github.com/FooSoft/yomichan/releases/download/$ver/yomichan
# allow prereleases # allow prereleases
src.github_tag = "FastForwardTeam/FastForward" src.github_tag = "FastForwardTeam/FastForward"
fetch.url = "https://github.com/FastForwardTeam/FastForward/releases/download/$ver/fastforwardteam-$ver.xpi" fetch.url = "https://github.com/FastForwardTeam/FastForward/releases/download/$ver/fastforwardteam-$ver.xpi"
# nix-prefetch doesnt work with git right now for some reason, whatever
# [atf-bpir3]
# src.git = "https://github.com/frank-w/u-boot.git"
# src.branch = "r3-atf"
# src.use_commit = true
# fetch.git = "https://github.com/frank-w/u-boot.git"
# fetch.branch = "$ver"
#fetch.github = "frank-w/u-boot"
# fetch.branch = "r3-atf"

View file

@ -1,35 +1,26 @@
{ pkgs { pkgs
, lib
, ... }: , ... }:
# WIP
{ {
boot.loader = { boot.loader = {
grub.enable = false; grub.enable = false;
generic-extlinux-compatible.enable = true; generic-extlinux-compatible.enable = true;
}; };
# https://github.com/frank-w/BPI-Router-Linux # i'm not about to build a kernel on every update without an arm device...
boot.kernelPackages = pkgs.linuxPackagesFor ((pkgs.buildLinux ({ # i guess i could use my phone for building it, but no, not interested
version = "6.3"; boot.kernelPackages = pkgs.linuxPackages_testing;
modDirVersion = "6.3.0"; # boot.kernelPackages = pkgs.linuxPackages_bpiR3;
src = pkgs.fetchFromGitHub {
owner = "frank-w";
repo = "BPI-Router-Linux";
rev = "6.3-main";
hash = lib.fakeHash;
};
defconfig = "mt7986a_bpi-r3";
})).overrideAttrs (old: {
postConfigure = ''
sed -i "$buildRoot/.config" -e 's/^CONFIG_LOCALVERSION=.*/CONFIG_LOCALVERSION=""/'
sed -i "$buildRoot/include/config/auto.conf" -e 's/^CONFIG_LOCALVERSION=.*/CONFIG_LOCALVERSION=""/'
'';
}));
hardware.deviceTree.enable = true; hardware.deviceTree.enable = true;
hardware.deviceTree.filter = "mt7986a-bananapi-bpi-r3*.dtb"; hardware.deviceTree.filter = "*mt7986*";
hardware.enableRedistributableFirmware = true; hardware.enableRedistributableFirmware = true;
# # disable a bunch of useless drivers
# boot.initrd.includeDefaultModules = false;
# boot.initrd.availableKernelModules = [ "mmc_block" "dm_mod" "rfkill" "cfg80211" "mt7915e" "ubi" "sdhci" "sd_mod" "sr_mod" "xhci_pci" ];
boot.kernelParams = [ "console=ttyS0,115200" ];
boot.initrd.compressor = "zstd";
nixpkgs.buildPlatform = "x86_64-linux";
} }

View file

@ -231,5 +231,7 @@ in {
}; };
programs.ccache.enable = true; programs.ccache.enable = true;
services.sshd.enable = true;
boot.binfmt.emulatedSystems = [ "aarch64-linux" ];
} }

View file

@ -1,9 +1,17 @@
{ config { config
, pkgs
, ... }: , ... }:
# EMMC size: 7818182656
let let
rootUuid = "00000000-0000-0000-0000-000000000000"; rootUuid = "44444444-4444-4444-8888-888888888888";
rootPart = "/dev/disk/by-uuid/${rootUuid}"; rootPart = "/dev/disk/by-uuid/${rootUuid}";
rootfsImage = pkgs.callPackage "${pkgs.path}/nixos/lib/make-ext4-fs.nix" {
storePaths = config.system.build.toplevel;
compressImage = false;
volumeLabel = "NIX_ROOTFS";
};
in { in {
system.stateVersion = "22.11"; system.stateVersion = "22.11";
# TODO # TODO
@ -13,16 +21,41 @@ in {
options = [ "defaults" "size=2G" "mode=755" ]; }; options = [ "defaults" "size=2G" "mode=755" ]; };
"/persist" = "/persist" =
{ device = rootPart; fsType = "btrfs"; neededForBoot = true; { device = rootPart; fsType = "btrfs"; neededForBoot = true;
options = [ ]; }; options = [ "compress=zstd:15" "subvol=@" ]; };
"/boot" =
{ device = rootPart; fsType = "btrfs"; neededForBoot = true;
options = [ "subvol=@boot" ]; };
"/nix" =
{ device = rootPart; fsType = "btrfs"; neededForBoot = true;
options = [ "compress=zstd:15" "subvol=@nix" ]; };
}; };
services.openssh.enable = true;
impermanence = { impermanence = {
enable = true; enable = true;
path = /persist; path = /persist;
directories = [ directories = [
{ directory = /home/${config.common.mainUsername}; user = config.common.mainUsername; group = config.common.mainUsername; mode = "0700"; } { directory = /home/${config.common.mainUsername}; user = config.common.mainUsername; group = config.common.mainUsername; mode = "0700"; }
{ directory = /root; mode = "0700"; } { directory = /root; mode = "0700"; }
/nix
/boot
]; ];
}; };
hardware.wirelessRegulatoryDatabase = true;
system.build.emmcImage = pkgs.callPackage ./image.nix {
inherit config rootfsImage;
bpiR3Stuff = pkgs.bpiR3StuffEmmc;
};
system.build.sdImage = pkgs.callPackage ./image.nix {
inherit config rootfsImage;
bpiR3Stuff = pkgs.bpiR3StuffSd;
};
system.build.rootfs = rootfsImage;
boot.postBootCommands = ''
if [ -f ${toString config.impermanence.path}/nix-path-registration ]; then
${config.nix.package.out}/bin/nix-store --load-db < ${toString config.impermanence.path}/nix-path-registration
mkdir -p /etc
touch /etc/NIXOS
${config.nix.package.out}/bin/nix-env -p /nix/var/nix/profiles/system --set /run/current-system
rm -f ${toString config.impermanence.path}/nix-path-registration
fi
'';
boot.kernelParams = [ "boot.shell_on_fail" ];
} }

View file

@ -0,0 +1,99 @@
{ gptfdisk
, e2fsprogs
, util-linux
, zstd
, btrfs-progs
, vmTools
, runCommand
, jq
, kmod
, udev
, nix
, lkl
, bpiR3Stuff
, config
, rootfsImage
, ... }:
let
imageSize = 7818182656;
bl2Start = 34;
bl2End = 8191;
envStart = 8192;
envEnd = 9215;
factoryStart = 9216;
factoryEnd = 13311;
fipStart = 13312;
fipEnd = 17407;
rootPartStart = fipEnd + 1;
rootPartEnd = builtins.floor (imageSize / 512) - 100;
in
# the vm is suuuuuper slow
# so, do as much as possible outside of it
# but i still need it to create subvolumes
vmTools.runInLinuxVM (runCommand "bpi-r3-fs" {
enableParallelBuildingByDefault = true;
nativeBuildInputs = [
btrfs-progs
# dosfstools
e2fsprogs
util-linux # sfdisk
config.system.build.nixos-install
jq
kmod
udev
gptfdisk
zstd
nix
lkl
];
preVM = ''
img=./result.img
ls /dev/fuse /etc/mtab || (echo "Must have /dev/fuse and /etc/mtab in nix options (extra-sandbox-paths)" && exit 1)
${vmTools.qemu}/bin/qemu-img create -f raw $img 7818182656
truncate -s ${toString imageSize} $img
${gptfdisk}/bin/sgdisk -o \
--set-alignment=2 \
-n 1:${toString bl2Start}:${toString bl2End} -c 1:bl2 -A 1:set:2 \
-n 2:${toString envStart}:${toString envEnd} -c 2:u-boot-env \
-n 3:${toString factoryStart}:${toString factoryEnd} -c 3:factory \
-n 4:${toString fipStart}:${toString fipEnd} -c 4:fip \
-n 5:${toString rootPartStart}:${toString rootPartEnd} -c 5:root -A 5:set:2 \
$img
dd conv=notrunc if=${bpiR3Stuff}/bl2.img of=$img seek=${toString bl2Start}
dd conv=notrunc if=${bpiR3Stuff}/fip.bin of=$img seek=${toString fipStart}
truncate -s ${toString ((rootPartEnd - rootPartStart + 1) * 512)} ./tmp.img
${btrfs-progs}/bin/mkfs.btrfs \
--label NIXOS_SD \
--uuid "44444444-4444-4444-8888-888888888889" \
./tmp.img
'';
# i give up on making this work in a nix derivation, just do the rest in a script (./image.sh)
# (i could do more in a vm but thats too slow, i could program a custom userspace utility but thats too annoying)
postVM = ''
# Truncate the file at the end of the last partition
img=./result.img
mkdir -p $out/boot
${config.boot.loader.generic-extlinux-compatible.populateCmd} -c ${config.system.build.toplevel} -d $out/boot -g 0
cp ${rootfsImage} $out/rootfs.ext4
cp tmp.img $out/template.btrfs
cp $img $out/image.img
echo ${toString rootPartStart} > $out/metadata
echo ${toString rootPartEnd} >> $out/metadata
'';
memSize = "4G";
QEMU_OPTS = "-drive file=./tmp.img,format=raw,if=virtio,cache=unsafe,werror=report -rtc base=2000-01-01,clock=vm";
} ''
modprobe btrfs
mkdir -p /mnt
mount -t btrfs -o space_cache=v2 /dev/vda /mnt
btrfs filesystem resize max /mnt
btrfs subvolume create /mnt/@boot
btrfs subvolume create /mnt/@
btrfs subvolume create /mnt/@nix
chattr +C /mnt/@boot
'')

91
system/hosts/router/image.sh Executable file
View file

@ -0,0 +1,91 @@
#!/usr/bin/env bash
# this step requires either root access or access to fuse
# nix builder doesnt have access to either
# i could run this in a vm, but that's slow as fuck because i'm building this on x86_64-linux
# usage: image.sh [path to image.nix output]
set -euxo pipefail
(which zstd && which rsync) || exit 1
userspace="$(which lklfuse >/dev/null && echo -n 1 || echo -n)"
use_rsync="$(which rsync >/dev/null && echo -n 1 || echo -n)"
function Mount() {
if [[ "$userspace" == "1" ]]; then
if [[ "${4-}" == "ro" ]]; then
lklfuse -o "type=$1" -o "$4" "$2" "$3"
elif [ -n "${4-}" ]; then
lklfuse -o "type=$1" -o "opts=$4" "$2" "$3"
else
lklfuse -o "type=$1" "$2" "$3"
fi
elif [ -n "${4-}" ]; then
sudo -A mount -t "$1" -o "loop,$4" "$2" "$3"
else
sudo -A mount -t "$1" -o loop "$2" "$3"
fi
}
function run() {
if [[ "$userspace" == "1" ]]; then
"$@"
else
sudo -A "$@"
fi
}
function cpr() {
if [[ "$use_rsync" == "1" ]]; then
run rsync -a --info=progress2 "$1/" "$2/"
else
run cp -rv "$1"/* "$2/"
fi
}
if [ -z "$1" ]; then
echo "missing argument"
exit 1
fi
rootfs="$1/rootfs.ext4"
template="$1/template.btrfs"
image="$1/image.img"
boot="$1/boot"
metadata0="$(head -n1 "$1/metadata")"
metadata1="$(head -n2 "$1/metadata" | tail -n1)"
if [ -z "$metadata0" ] || [ -z "$metadata1" ] || [[ "$metadata0" == "$metadata1" ]]; then
echo "invalid metadata"
exit 1
fi
tmp=$(mktemp -d)
cp "$template" "$tmp/template.btrfs"
cp "$image" "$tmp/image.img"
template="$tmp/template.btrfs"
image="$tmp/image.img"
chmod +w "$template" "$image"
function cleanup {
run umount "$rootfs" || echo -n
run umount "$tmp/out" || echo -n
rm -rf "$tmp"
}
trap cleanup EXIT
mkdir -p "$tmp/rootfs" "$tmp/out"
Mount ext4 "$rootfs" "$tmp/rootfs" ro
rootfs="$tmp/rootfs"
Mount btrfs "$template" "$tmp/out"
run cp -rv "$boot"/* "$tmp/out/@boot/"
run umount "$tmp/out"
Mount btrfs "$template" "$tmp/out" "compress=zstd:15"
run cp -v "$rootfs/nix-path-registration" "$tmp/out/@/"
run ls "$boot"
cpr "$boot" "$tmp/out/@boot"
cpr "$rootfs/nix" "$tmp/out/@nix"
run umount "$rootfs"
run umount "$tmp/out"
dd conv=notrunc if="$template" of="$image" seek="$metadata0"
zstd --compress "$image"
cp "$image.zst" ./image.img.zst

View file

@ -13,6 +13,7 @@ in {
}; };
path = mkOption { path = mkOption {
type = types.path; type = types.path;
default = if cfg.enable then throw "You must set path to persistent storage" else "";
description = "Default path for persistence"; description = "Default path for persistence";
}; };
directories = mkOption { directories = mkOption {