Slim down the rootfs

This commit is contained in:
2026-05-24 22:47:02 +02:00
parent 5e030bc16c
commit d3fb796c2b
3 changed files with 43 additions and 18 deletions
-1
View File
@@ -36,7 +36,6 @@
fonts = {
packages = with pkgs; [
fira-code
nerd-fonts.fira-code
nerd-fonts.fira-mono
nerd-fonts.symbols-only
+41 -12
View File
@@ -5,6 +5,19 @@
}:
pkgs.writeShellApplication {
name = "build-pipa-images";
runtimeInputs = with pkgs; [
coreutils
util-linux
dosfstools
btrfs-progs
git
nixos-install-tools
nix
jq
android-tools
];
text = ''
set -e
MNT_DIR="$PWD/mnt"
@@ -14,7 +27,6 @@ pkgs.writeShellApplication {
mkdir -p "$OUT_DIR"
mkdir -p "$MNT_DIR"
# SAFETY NET: Automatically unmount if the script fails or is cancelled
cleanup() {
echo "=> Ensuring mounts are released..."
sync
@@ -28,13 +40,25 @@ pkgs.writeShellApplication {
echo "=> Wiping old images..."
rm -f "$OUT_DIR/boot.img" "$OUT_DIR/rootfs.img" "$OUT_DIR/rootfs.sparse.img"
echo "=> Instantly preallocating blocks via fallocate (1GB Boot, 4GB RootFS)..."
${pkgs.util-linux}/bin/fallocate -l 1G "$OUT_DIR/boot.img"
${pkgs.util-linux}/bin/fallocate -l 4G "$OUT_DIR/rootfs.img"
echo "=> Calculating dynamic RootFS size..."
CLOSURE_BYTES=$(nix path-info --json -S "${toplevel}" | jq -r '.[].closureSize')
MARGIN_BYTES=$(( 512 * 1024 * 1024 ))
ROOTFS_BYTES=$(( CLOSURE_BYTES + MARGIN_BYTES ))
CLOSURE_MB=$(( CLOSURE_BYTES / 1024 / 1024 ))
ROOTFS_MB=$(( ROOTFS_BYTES / 1024 / 1024 ))
echo " System closure size: ''${CLOSURE_MB} MB"
echo " Target RootFS size: ''${ROOTFS_MB} MB"
echo "=> Allocating blocks..."
fallocate -l 1G "$OUT_DIR/boot.img"
truncate -s "$ROOTFS_BYTES" "$OUT_DIR/rootfs.img"
echo "=> Formatting images natively..."
${pkgs.dosfstools}/bin/mkfs.vfat -S 4096 -F 32 -n NIX_BOOT "$OUT_DIR/boot.img"
${pkgs.btrfs-progs}/bin/mkfs.btrfs --sectorsize 4096 -L NIX_ROOT "$OUT_DIR/rootfs.img" -f
mkfs.vfat -S 4096 -F 32 -n NIX_BOOT "$OUT_DIR/boot.img"
mkfs.btrfs --sectorsize 4096 -L NIX_ROOT "$OUT_DIR/rootfs.img" -f
echo "=> Creating Btrfs subvolumes..."
sudo mount -t btrfs "$OUT_DIR/rootfs.img" "$MNT_DIR"
@@ -44,12 +68,12 @@ pkgs.writeShellApplication {
sudo umount "$MNT_DIR"
echo "=> Mounting images in Btrfs sequence..."
sudo mount -o subvol=root "$OUT_DIR/rootfs.img" "$MNT_DIR"
sudo mount -o subvol=root,compress=zstd:9 "$OUT_DIR/rootfs.img" "$MNT_DIR"
sudo mkdir -p "$MNT_DIR/boot" "$MNT_DIR/nix" "$MNT_DIR/home"
sudo mount -o subvol=nix "$OUT_DIR/rootfs.img" "$MNT_DIR/nix"
sudo mount -o subvol=home "$OUT_DIR/rootfs.img" "$MNT_DIR/home"
sudo mount -o subvol=nix,compress=zstd:9 "$OUT_DIR/rootfs.img" "$MNT_DIR/nix"
sudo mount -o subvol=home,compress=zstd:9 "$OUT_DIR/rootfs.img" "$MNT_DIR/home"
sudo mount "$OUT_DIR/boot.img" "$MNT_DIR/boot"
echo "=> Seeding NixOS configuration into the user's home folder..."
@@ -60,24 +84,29 @@ pkgs.writeShellApplication {
sudo cp -r pkgs "$TARGET_FLAKE_DIR/"
echo "=> Securing permissions and initializing Git repo..."
sudo git -C "$TARGET_FLAKE_DIR" init -b main
sudo git -C "$TARGET_FLAKE_DIR" add .
sudo chown -R 1000:100 "$MNT_DIR/home/nixos"
echo "=> Injecting the ARM64 OS and native Bootloader..."
sudo SYSTEMD_RELAX_ESP_CHECKS=1 ${pkgs.nixos-install}/bin/nixos-install \
sudo SYSTEMD_RELAX_ESP_CHECKS=1 nixos-install \
--root "$MNT_DIR" \
--system "${toplevel}" \
--no-root-passwd \
--no-channel-copy
echo "=> Optimizing the Nix store to save space..."
sudo nix-store --store "$MNT_DIR" --optimise
echo "=> Forcing Btrfs recursive compression on all files..."
sudo btrfs filesystem defragment -r -v -czstd "$MNT_DIR"
echo "=> Flushing write caches and unmounting cleanly..."
cleanup
trap - EXIT
echo "=> Converting RootFS to Android sparse format..."
${pkgs.android-tools}/bin/img2simg "$OUT_DIR/rootfs.img" "$OUT_DIR/rootfs.sparse.img"
img2simg "$OUT_DIR/rootfs.img" "$OUT_DIR/rootfs.sparse.img"
echo "Done! 'boot.img' and 'rootfs.sparse.img' are ready for flashing."
'';
+2 -5
View File
@@ -5,7 +5,6 @@
runCommand,
...
} @ args: let
# 1. Fetch the raw source
rawSrc = fetchFromGitea {
domain = "gitea.awroo.fun";
owner = "romanl";
@@ -14,7 +13,6 @@
hash = "sha256-ApsnYs38vrKwEbvO0d0c4aqpCRQe5FQ7Aa66U38x8JI=";
};
# 2. Create a modified source tree with pipa.config pre-injected
patchedSrc = runCommand "linux-src-pipa" {} ''
cp -a ${rawSrc} $out
chmod -R +w $out
@@ -25,11 +23,10 @@ in
// {
version = "6.18.2";
modDirVersion = "6.18.2";
src = patchedSrc;
defconfig = "defconfig pipa.config";
ignoreConfigErrors = true;
stripDebugList = ["vmlinux" "lib/modules"];
extraMeta.branch = "6.18";
})