diff --git a/default.nix b/default.nix
new file mode 100644
index 0000000..864f89c
--- /dev/null
+++ b/default.nix
@@ -0,0 +1,68 @@
+{ lib, pkgs, config, inputs, ... }: {
+
+ imports = [
+ ./kboot-conf
+ # "${nixpkgs}/nixos/modules/installer/sd-card/sd-image-aarch64-installer.nix"
+ "${nixpkgs}/nixos/modules/installer/sd-card/sd-image-aarch64.nix"
+
+ ];
+
+ sdImage = {
+ #compressImage = false;
+ populateFirmwareCommands = let
+ configTxt = pkgs.writeText "README" ''
+ Nothing to see here. This empty partition is here because I don't know how to turn its creation off.
+ '';
+ in ''
+ cp ${configTxt} firmware/README
+ '';
+ populateRootCommands = ''
+ ${config.boot.loader.kboot-conf.populateCmd} -c ${config.system.build.toplevel} -d ./files/kboot.conf
+ '';
+ };
+
+ #boot.loader.grub.enable = false;
+ boot.loader.kboot-conf.enable = true;
+ # Use kernel >6.6
+ boot.kernelPackages = pkgs.linuxPackages_latest;
+ # Stop ZFS breasking the build
+ boot.supportedFilesystems = lib.mkForce [ "btrfs" "cifs" "f2fs" "jfs" "ntfs" "reiserfs" "vfat" "xfs" ];
+
+ # I'm not completely sure if some of these could be omitted,
+ # but want to make sure disk access works
+ boot.initrd.availableKernelModules = [
+ "nvme"
+ "nvme-core"
+ "phy-rockchip-naneng-combphy"
+ "phy-rockchip-snps-pcie3"
+ ];
+ # Petitboot uses this port and baud rate on the boards serial port,
+ # it's probably good to keep the options same for the running
+ # kernel for serial console access to work well
+ boot.kernelParams = [ "console=ttyS2,1500000" ];
+ hardware.deviceTree.name = "rockchip/rk3568-odroid-m1.dtb";
+
+ # Turn on flakes.
+ ##nix.package = pkgs.nixVersions.stable;
+ nix.extraOptions = ''
+ experimental-features = nix-command flakes
+ '';
+
+ # includes this flake in the live iso : "/etc/nixcfg"
+ environment.etc.nixcfg.source =
+ builtins.filterSource
+ (path: type:
+ baseNameOf path
+ != ".git"
+ && type != "symlink"
+ && !(pkgs.lib.hasSuffix ".qcow2" path)
+ && baseNameOf path != "secrets")
+ ../.;
+
+
+ services.openssh = {
+ enable = true;
+ settings.PermitRootLogin = "yes";
+ };
+ users.extraUsers.root.initialPassword = lib.mkForce "test123";
+}
\ No newline at end of file
diff --git a/flake.nix b/flake.nix
new file mode 100644
index 0000000..5076b8a
--- /dev/null
+++ b/flake.nix
@@ -0,0 +1,27 @@
+{
+ description = "nix-configurations";
+
+ inputs = {
+ nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
+ };
+
+ outputs = { self, nixpkgs, nix-darwin, agenix, home-manager, ... }@inputs:
+ let
+ globalModules = [
+ {
+ system.configurationRevision = self.rev or self.dirtyRev or null;
+ }
+ ./default.nix
+ ];
+ in
+ {
+ nixosConfigurations = {
+ odroid8 = nixpkgs.lib.nixosSystem {
+ system = "aarch64-linux";
+ modules = globalModules
+ ++ [ ./hosts/odroid8.nix ];
+ };
+ };
+
+ };
+}
diff --git a/hosts/odroid8.nix b/hosts/odroid8.nix
new file mode 100644
index 0000000..dbcf66a
--- /dev/null
+++ b/hosts/odroid8.nix
@@ -0,0 +1,9 @@
+{ lib, pkgs, config, inputs, ... }: {
+
+ imports = [
+ ];
+
+ nixpkgs.hostPlatform.system = "aarch64-linux";
+ networking.hostName = "odroid8";
+
+}
diff --git a/kboot-conf/default.nix b/kboot-conf/default.nix
new file mode 100644
index 0000000..87315e4
--- /dev/null
+++ b/kboot-conf/default.nix
@@ -0,0 +1,60 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+ cfg = config.boot.loader.kboot-conf;
+
+ # The builder used to write during system activation
+ builder = pkgs.substituteAll {
+ src = ./generate-kboot-conf.sh;
+ isExecutable = true;
+ path = [pkgs.coreutils pkgs.gnused pkgs.gnugrep];
+ inherit (pkgs) bash;
+ };
+ # The builder exposed in populateCmd, which runs on the build architecture
+ populateBuilder = pkgs.buildPackages.substituteAll {
+ src = ./generate-kboot-conf.sh;
+ isExecutable = true;
+ path = with pkgs.buildPackages; [coreutils gnused gnugrep];
+ inherit (pkgs.buildPackages) bash;
+ };
+in
+{
+ options = {
+ boot.loader.kboot-conf = {
+ enable = mkOption {
+ default = false;
+ type = types.bool;
+ description = ''
+ Whether to create petitboot-compatible /kboot.conf
+ '';
+ };
+ configurationLimit = mkOption {
+ default = 10;
+ example = 5;
+ type = types.int;
+ description = ''
+ Maximum number of configurations in the generated kboot.conf.
+ '';
+ };
+ populateCmd = mkOption {
+ type = types.str;
+ readOnly = true;
+ description = ''
+ Contains the builder command used to populate an image,
+ honoring all options except the -c <path-to-default-configuration>
+ argument.
+ Useful to have for sdImage.populateRootCommands
+ '';
+ };
+ };
+ };
+ config = let
+ args = "-g ${toString cfg.configurationLimit} -n ${config.hardware.deviceTree.name}";
+ in mkIf cfg.enable {
+ system.build.installBootLoader = lib.mkForce "${builder} ${args} -c";
+ system.boot.loader.id = "kboot-conf";
+ boot.loader.kboot-conf.populateCmd = "${populateBuilder} ${args}";
+ };
+}
diff --git a/kboot-conf/generate-kboot-conf.sh b/kboot-conf/generate-kboot-conf.sh
new file mode 100644
index 0000000..153190c
--- /dev/null
+++ b/kboot-conf/generate-kboot-conf.sh
@@ -0,0 +1,77 @@
+#! @bash@/bin/sh -e
+
+shopt -s nullglob
+
+export PATH=/empty
+for i in @path@; do PATH=$PATH:$i/bin; done
+
+usage() {
+ echo "usage: $0 -c -n [-g ] [-d ]" >&2
+ exit 1
+}
+
+target=/kboot.conf
+default= # Default configuration
+numGenerations=0 # Number of other generations to include in the menu
+
+while getopts "t:c:d:g:n:" opt; do
+ case "$opt" in
+ c) default="$OPTARG" ;;
+ g) numGenerations="$OPTARG" ;;
+ d) target="$OPTARG" ;;
+ n) dtbName="$OPTARG" ;;
+ \?) usage ;;
+ esac
+done
+
+[ "$default" = "" -o "$dtbName" = "" ] && usage
+
+tmp=$target.tmp
+
+# Echo out an kboot.conf menu entry
+addEntry() {
+ local path=$(readlink -f "$1")
+ local tag="$2" # Generation number or 'default'
+
+ if ! test -e $path/kernel -a -e $path/initrd; then
+ return
+ fi
+
+ timestampEpoch=$(stat -L -c '%Z' $path)
+ timestamp=$(date "+%Y-%m-%d %H:%M" -d @$timestampEpoch)
+ nixosLabel="$(cat $path/nixos-version)"
+ extraParams="$(cat $path/kernel-params)"
+
+ local kernel=$(readlink -f "$path/kernel")
+ local initrd=$(readlink -f "$path/initrd")
+ local dtbs=$(readlink -f "$path/dtbs")
+
+ local id="nixos-$tag--$nixosLabel"
+
+ if [ "$tag" = "default" ]; then
+ echo "default=$id"
+ fi
+
+ echo -n "$id='"
+ echo -n "$kernel initrd=$initrd dtb=$dtbs/$dtbName "
+ echo -n "systemConfig=$path init=$path/init $extraParams"
+ echo "'"
+}
+
+echo "# Hola!" > $tmp
+addEntry $default default >> $tmp
+
+if [ "$numGenerations" -gt 0 ]; then
+ # Add up to $numGenerations generations of the system profile to the menu,
+ # in reverse (most recent to least recent) order.
+ for generation in $(
+ (cd /nix/var/nix/profiles && ls -d system-*-link) \
+ | sed 's/system-\([0-9]\+\)-link/\1/' \
+ | sort -n -r \
+ | head -n $numGenerations); do
+ link=/nix/var/nix/profiles/system-$generation-link
+ addEntry $link $generation
+ done >> $tmp
+fi
+
+mv -f $tmp $target