Change how this is built

This commit is contained in:
Samuel Dionne-Riel 2021-05-11 18:50:21 -04:00
parent d0ec60ca75
commit 5e3882d207
5 changed files with 35 additions and 273 deletions

View File

@ -1,16 +0,0 @@
#!/usr/bin/env bash
set -e
set -u
PS4=" $ "
# Ugh, I would have liked to do it through a simpler `nix-build`, but as this
# needs to set `NIX_PATH` for use of `<nixpkgs/*>` imports, this is the better
# way to go.
set -x
exec env -i \
NIXPKGS_ALLOW_UNFREE=1 \
NIX_PATH="nixpkgs=channel:nixos-unstable" \
"$(command -v nix-build)" \
system.nix -A config.system.build.sdImage "$@"

View File

@ -1,24 +0,0 @@
{ config, pkgs, lib, ... }:
let
uboot = pkgs.uBootPinebookProExternalFirst;
in
{
imports = [
<nixpkgs/nixos/modules/profiles/base.nix>
<nixpkgs/nixos/modules/profiles/minimal.nix>
<nixpkgs/nixos/modules/profiles/installation-device.nix>
./nixos/sd-image-aarch64.nix
./pinebook_pro.nix
];
sdImage = {
manipulateImageCommands = ''
(PS4=" $ "; set -x
dd if=${uboot}/idbloader.img of=$img bs=512 seek=64 conv=notrunc
dd if=${uboot}/u-boot.itb of=$img bs=512 seek=16384 conv=notrunc
)
'';
compressImage = lib.mkForce false;
};
}

View File

@ -1,17 +1,41 @@
{
pkgs ? import <nixpkgs> {
overlays = [
(import ./overlay.nix)
];
}
}:
{ pkgs ? import <nixpkgs> {} }:
let pkgs' = pkgs; in
let
pkgs' = if builtins.currentSystem == "aarch64-linux"
then pkgs
else pkgs.pkgsCross.aarch64-multiplatform
pkgs = if !isCross then pkgs' else pkgs'.pkgsCross.aarch64-multiplatform;
inherit (pkgs) lib;
isCross = builtins.currentSystem != "aarch64-linux";
fromPkgs = path: pkgs.path + "/${path}";
evalConfig = import (fromPkgs "nixos/lib/eval-config.nix");
buildConfig = { system ? "aarch64-linux", configuration ? {} }:
evalConfig {
modules = (lib.optional isCross ./cross-hacks.nix)
++ [
"${./.}/pinebook_pro.nix"
configuration
(lib.mkIf isCross {
nixpkgs.crossSystem = {
system = "aarch64-linux";
};
})
];
}
;
base = buildConfig {};
in
{
pkgs = pkgs';
inherit (base) pkgs;
kernel_latest = base.pkgs.linuxPackages_pinebookpro_latest.kernel;
kernel_lts = base.pkgs.linuxPackages_pinebookpro_lts.kernel;
isoImage = (buildConfig {
configuration = (fromPkgs "nixos/modules/installer/cd-dvd/installation-cd-minimal.nix");
}).config.system.build.isoImage;
sdImage = (buildConfig {
configuration = (fromPkgs "nixos/modules/installer/sd-card/sd-image-aarch64-installer.nix");
}).config.system.build.sdImage;
}

View File

@ -1,46 +0,0 @@
{ config, lib, pkgs, ... }:
let
extlinux-conf-builder =
import <nixpkgs/nixos/modules/system/boot/loader/generic-extlinux-compatible/extlinux-conf-builder.nix> {
pkgs = pkgs.buildPackages;
};
in
{
imports = [
./sd-image.nix
];
boot.loader.grub.enable = false;
boot.loader.generic-extlinux-compatible.enable = true;
boot.consoleLogLevel = lib.mkDefault 7;
boot.kernelParams = [
"cma=32M"
#"console=ttyS0,115200n8" "console=ttyAMA0,115200n8" "console=tty0"
"console=ttyS2,1500000n8"
"earlycon=uart8250,mmio32,0xff1a0000" "earlyprintk"
# The last console parameter will be where the boot process will print
# its messages. Comment or move abot ttyS2 for better serial debugging.
"console=tty0"
];
services.mingetty.serialSpeed = [ 1500000 115200 57600 38400 9600 ];
boot.initrd.availableKernelModules = [
];
sdImage = {
populateRootCommands = ''
mkdir -p ./files/boot
${extlinux-conf-builder} -t 3 -c ${config.system.build.toplevel} -d ./files/boot
'';
};
# the installation media is also the installation target,
# so we don't want to provide the installation configuration.nix.
installer.cloneConfig = false;
}

View File

@ -1,176 +0,0 @@
{ config, lib, pkgs, ... }:
with lib;
let
rootfsImage = pkgs.callPackage <nixpkgs/nixos/lib/make-ext4-fs.nix> ({
inherit (config.sdImage) storePaths;
#compressImage = false;
populateImageCommands = config.sdImage.populateRootCommands;
volumeLabel = "NIXOS_SD";
} // optionalAttrs (config.sdImage.rootPartitionUUID != null) {
uuid = config.sdImage.rootPartitionUUID;
});
in
{
options.sdImage = {
imageName = mkOption {
default = "${config.sdImage.imageBaseName}-${config.system.nixos.label}-${pkgs.stdenv.hostPlatform.system}.img";
description = ''
Name of the generated image file.
'';
};
imageBaseName = mkOption {
default = "nixos-sd-image";
description = ''
Prefix of the name of the generated image file.
'';
};
storePaths = mkOption {
type = with types; listOf package;
example = literalExample "[ pkgs.stdenv ]";
description = ''
Derivations to be included in the Nix store in the generated SD image.
'';
};
rootPartitionUUID = mkOption {
type = types.nullOr types.str;
default = null;
example = "14e19a7b-0ae0-484d-9d54-43bd6fdc20c7";
description = ''
UUID for the main NixOS partition on the SD card.
'';
};
gapSize = mkOption {
type = types.int;
# This is probably way too much... meh.
default = 30;
internal = true;
description = ''
Gap before the partition, to put u-boot into.
'';
};
populateRootCommands = mkOption {
example = literalExample "''\${extlinux-conf-builder} -t 3 -c \${config.system.build.toplevel} -d ./files/boot''";
description = ''
Shell commands to populate the ./files directory.
All files in that directory are copied to the
root (/) partition on the SD image. Use this to
populate the ./files/boot (/boot) directory.
'';
};
manipulateImageCommands = mkOption {
default = ":";
description = ''
Additional manipulations to do to the image.
For example, embedding the right u-boot.
'';
};
compressImage = mkOption {
type = types.bool;
default = true;
description = ''
Whether the SD image should be compressed using
<command>bzip2</command>.
'';
};
};
config = {
fileSystems = {
"/" = {
device = "/dev/disk/by-label/NIXOS_SD";
fsType = "ext4";
};
};
sdImage.storePaths = [ config.system.build.toplevel ];
system.build.sdImage = pkgs.callPackage ({ stdenv, dosfstools, e2fsprogs,
mtools, libfaketime, utillinux, bzip2/*, zstd*/ }: stdenv.mkDerivation {
name = config.sdImage.imageName;
nativeBuildInputs = [ dosfstools e2fsprogs mtools libfaketime utillinux bzip2 /*zstd */];
inherit (config.sdImage) compressImage;
buildCommand = ''
mkdir -p $out/nix-support $out/sd-image
export img=$out/sd-image/${config.sdImage.imageName}
echo "${pkgs.stdenv.buildPlatform.system}" > $out/nix-support/system
if test -n "$compressImage"; then
echo "file sd-image $img.bz2" >> $out/nix-support/hydra-build-products
else
echo "file sd-image $img" >> $out/nix-support/hydra-build-products
fi
#echo "Decompressing rootfs image"
#zstd -d --no-progress "${rootfsImage}" -o ./root-fs.img
cp -v "${rootfsImage}" ./root-fs.img
# Gap in front of the first partition, in MiB
gap=8
# Create the image file sized to fit the gap and /, plus slack.
rootSizeBlocks=$(du -B 512 --apparent-size ./root-fs.img | awk '{ print $1 }')
gapSizeBlocks=$((${toString config.sdImage.gapSize} * 1024 * 1024 / 512))
imageSize=$((rootSizeBlocks * 512 + gapSizeBlocks * 512 + gap * 1024 * 1024))
truncate -s $imageSize $img
# type=b is 'W95 FAT32', type=83 is 'Linux'.
# The "bootable" partition is where u-boot will look file for the bootloader
# information (dtbs, extlinux.conf file).
sfdisk $img <<EOF
label: dos
start=$((gap + ${toString config.sdImage.gapSize}))M, type=83, bootable
EOF
# Copy the rootfs into the SD image
eval $(partx $img -o START,SECTORS --nr 1 --pairs)
dd conv=notrunc if=./root-fs.img of=$img seek=$START count=$SECTORS
${config.sdImage.manipulateImageCommands}
if test -n "$compressImage"; then
bzip2 $img
fi
'';
}) {};
boot.postBootCommands = ''
# On the first boot do some maintenance tasks
if [ -f /nix-path-registration ]; then
set -euo pipefail
set -x
# Figure out device names for the boot device and root filesystem.
rootPart=$(${pkgs.utillinux}/bin/findmnt -n -o SOURCE /)
bootDevice=$(lsblk -npo PKNAME $rootPart)
# Resize the root partition and the filesystem to fit the disk
echo ",+," | sfdisk -N1 --no-reread $bootDevice
${pkgs.parted}/bin/partprobe
${pkgs.e2fsprogs}/bin/resize2fs $rootPart
# Register the contents of the initial Nix store
${config.nix.package.out}/bin/nix-store --load-db < /nix-path-registration
# nixos-rebuild also requires a "system" profile and an /etc/NIXOS tag.
touch /etc/NIXOS
${config.nix.package.out}/bin/nix-env -p /nix/var/nix/profiles/system --set /run/current-system
# Prevents this from running on later boots.
rm -f /nix-path-registration
fi
'';
};
}