5.6 KiB
ODroid M1
Hardware support for the Hardkernel ODroid M1: https://www.hardkernel.com/shop/odroid-m1-with-8gbyte-ram/
Initial Installation
This is for creating the initial image used to install to the SD Card or NVM Drive.
Example flake.nix:
{
description = "SD Card Image Generator for ODroid M1";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
nixos-hardware.url = "github:nixos/nixos-hardware/master";
};
outputs = { self, nixpkgs, nixos-hardware }: rec {
nixosConfigurations.m1 = nixpkgs.lib.nixosSystem {
modules = [
"${nixpkgs}/nixos/modules/installer/sd-card/sd-image-aarch64.nix"
nixos-hardware.nixosModules.hardkernel-odroid-m1
./sdimageconfiguration.nix
{
nixpkgs.config.allowUnsupportedSystem = true;
nixpkgs.hostPlatform.system = "aarch64-linux";
nixpkgs.buildPlatform.system = "x86_64-linux"; # If you build on x86 otherwise change this.
}
];
};
images.m1 = nixosConfigurations.m1.config.system.build.sdImage;
};
}
For building the initial sd card image, you can use this example (tweaked for your preferences) sdimageconfiguration.nix:
{ config, pkgs, lib, ... }:
{
system.stateVersion = lib.mkDefault "25.11";
nixpkgs.hostPlatform.system = "aarch64-linux";
sdImage = {
# Skip compression, we'll want the img uncompressed for flashing anyway
compressImage = false;
# The system will not boot if this is missing
populateRootCommands = ''
${config.boot.loader.petitboot.populateCmd} -c ${config.system.build.toplevel} -d ./files/kboot.conf
'';
};
services.openssh = {
enable = true;
settings = {
# Highly recommended: Set Password Authentication to false if you have authorized keys you can use. This is an insecure default
PasswordAuthentication = true;
PermitRootLogin = "no";
AllowUsers = [ "odroid" ];
};
};
# You will almost certainly want Git to pull in your configuration repository
environment.systemPackages = [
pkgs.git
];
users.users.odroid = {
isNormalUser = true;
description = "Default User";
extraGroups = [ "networkmanager" "wheel" ];
packages = [];
# Highly recommended: Change this default password using `sudo passwd` after logging in
initialPassword = lib.mkForce "odroid";
# You can find this from https://github.com/username.keys for example
openssh.authorizedKeys.keys = [];
};
}
Put both of these files into a Git repo, and build with:
nix build .#images.m1
Ongoing updates
To your NixOS server flake, you'll want to ensure that the host is set to aarch64-linux.
An example flake:
{
description = "My NixOS configuration flake";
inputs = {
# Nixpkgs - Stable 25.11 release
nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11";
# Home Manager - Stable 25.11 release
home-manager.url = "github:nix-community/home-manager/release-25.11";
home-manager.inputs.nixpkgs.follows = "nixpkgs";
# NixOS Hardware
nixos-hardware.url = "github:nixos/nixos-hardware/master";
};
outputs = {
self,
nixpkgs,
home-manager,
nixos-hardware,
...
}@inputs:
let
mkSystem = hostname: systemArchitecture: # hostname: is a positional argument
nixpkgs.lib.nixosSystem {
system = systemArchitecture;
specialArgs = { inherit inputs; };
modules = [
./hosts/${hostname}/configuration.nix
home-manager.nixosModules.home-manager
{
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.backupFileExtension = "backup";
}
];
};
hosts = [
{ hostname = "other-example"; systemArchitecture = "x86_64-linux"; }
{ hostname = "odroid-m1-example"; systemArchitecture = "aarch64-linux"; }
];
in
{
# This is what creates the NixOS configurations for each host
nixosConfigurations = builtins.listToAttrs (
# Iterator - nixConfigurations.<name> = <value>
map (host: {
name = host.hostname;
value = mkSystem host.hostname host.systemArchitecture;
})
# Array to iterate over
hosts
);
};
}
And the related configuration.nix:
{ config, pkgs, inputs, ... }:
{
imports =
[
inputs.nixos-hardware.nixosModules.hardkernel-odroid-m1
./hardware-configuration.nix
../../modules/nix
../../users
];
networking.hostName = "odroid-m1-example"; # Define your hostname.
}
And hardware-configuration.nix:
# Do not modify this file! It was generated by ‘nixos-generate-config’
# and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead.
{ config, lib, pkgs, modulesPath, ... }:
{
imports =
[ (modulesPath + "/installer/scan/not-detected.nix")
];
boot.initrd.availableKernelModules = [ "nvme" ];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ ];
boot.extraModulePackages = [ ];
fileSystems."/" =
{ device = "/dev/disk/by-uuid/44444444-4444-4444-8888-888888888888";
fsType = "ext4";
};
swapDevices = [ ];
nixpkgs.hostPlatform = lib.mkDefault "aarch64-linux";
}
You can generate these default files (with a few warnings) by running the following command on the odroid after initial boot:
nixos-generate-config
It will save a configuration.nix and hardware-configuration.nix to /etc/nixos. Critically, you will need to add inputs.nixos-hardware.nixosModules.hardkernel-odroid-m1 to the imports in configuration.nix for it to work.