Slim down the rootfs
This commit is contained in:
@@ -36,7 +36,6 @@
|
||||
|
||||
fonts = {
|
||||
packages = with pkgs; [
|
||||
fira-code
|
||||
nerd-fonts.fira-code
|
||||
nerd-fonts.fira-mono
|
||||
nerd-fonts.symbols-only
|
||||
|
||||
+41
-12
@@ -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
@@ -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";
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user