initial commit

This commit is contained in:
WanderingPenwing 2024-10-13 17:45:15 +02:00
commit 89245d496a
6 changed files with 336 additions and 0 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
result

58
README.md Normal file
View file

@ -0,0 +1,58 @@
# Building a NixOS SD image for a Raspberry Pi Zero 2 w
## 1. Update `zero2w.nix`
In particular, don't forget:
- to configure your wifi
- to add an admin user able to connect through ssh
## 2. Build the image
#### - On arm processor
```sh
nix build -L .#nixosConfigurations.zero2w.config.system.build.sdImage
```
#### - On x86 processor :
add this to your config :
```nix
boot.binfmt.emulatedSystems = [ "aarch64-linux" ];
```
and then run :
```sh
nix build -L .#nixosConfigurations.zero2w.config.system.build.sdImage --system aarch64-linux
```
## 3. Copy the image in your sd card
```sh
DEVICE=/dev/disk5 # Whatever your sd card reader is
sudo dd if=result/sd-image/zero2.img of=$DEVICE bs=1M conv=fsync status=progress
```
## 4. Boot your Zero
## 5. From another machine, rebuild the system:
```sh
ZERO2_IP=<the-zero2-ip>
SSH_USER=<the-admin-user-in-the-pi>
nix run github:serokell/deploy-rs .#zero2w -- --ssh-user $SSH_USER --hostname $ZERO2_IP
```
## Notes
- The Zero 2 doesn't have enough RAM to build itself. An initial lead was to create a swap partition, but it turns out it was a bad idea, as it would have decreased the sd card lifetime (sd cards don't like many write operations). A `zram` swap is not big enough to work. Hence the use of `deploy-rs`.
- Note that `nixos-rebuild --target-host` would work instead of using `deploy-rs`. but as `nixos-rebuild` is not available on Darwin, I'm using `deploy-rs` that works both on NixOS and Darwin.
- I still couldn't find a way to use `boot.kernelPackages = pkgs.linuxKernel.packages.linux_rpi3`.
- the `sdImage.extraFirmwareConfig` option is not ideal as it cannot update `config.txt` after it is created in the sd image.
## See also
- [this issue](https://github.com/NixOS/nixpkgs/issues/216886)
- [this gist](https://gist.github.com/plmercereau/0c8e6ed376dc77617a7231af319e3d29)
---
# mine
update
```sh
nix run github:serokell/deploy-rs .#zero2w -- --ssh-user penwing --hostname 192.168.1.33
```

95
flake.lock Normal file
View file

@ -0,0 +1,95 @@
{
"nodes": {
"deploy-rs": {
"inputs": {
"flake-compat": "flake-compat",
"nixpkgs": "nixpkgs",
"utils": "utils"
},
"locked": {
"lastModified": 1698921442,
"narHash": "sha256-7KmvhQ7FuXlT/wG4zjTssap6maVqeAMBdtel+VjClSM=",
"owner": "serokell",
"repo": "deploy-rs",
"rev": "660180bbbeae7d60dad5a92b30858306945fd427",
"type": "github"
},
"original": {
"owner": "serokell",
"repo": "deploy-rs",
"type": "github"
}
},
"flake-compat": {
"flake": false,
"locked": {
"lastModified": 1668681692,
"narHash": "sha256-Ht91NGdewz8IQLtWZ9LCeNXMSXHUss+9COoqu6JLmXU=",
"owner": "edolstra",
"repo": "flake-compat",
"rev": "009399224d5e398d03b22badca40a37ac85412a1",
"type": "github"
},
"original": {
"owner": "edolstra",
"repo": "flake-compat",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1671417167,
"narHash": "sha256-JkHam6WQOwZN1t2C2sbp1TqMv3TVRjzrdoejqfefwrM=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "bb31220cca6d044baa6dc2715b07497a2a7c4bc7",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_2": {
"locked": {
"lastModified": 1699099776,
"narHash": "sha256-X09iKJ27mGsGambGfkKzqvw5esP1L/Rf8H3u3fCqIiU=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "85f1ba3e51676fa8cc604a3d863d729026a6b8eb",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"deploy-rs": "deploy-rs",
"nixpkgs": "nixpkgs_2"
}
},
"utils": {
"locked": {
"lastModified": 1667395993,
"narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
}
},
"root": "root",
"version": 7
}

34
flake.nix Normal file
View file

@ -0,0 +1,34 @@
{
description = "Flake for building a Raspberry Pi Zero 2 SD image";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
deploy-rs.url = "github:serokell/deploy-rs";
};
outputs = {
self,
nixpkgs,
deploy-rs,
}: rec {
nixosConfigurations = {
zero2w = nixpkgs.lib.nixosSystem {
modules = [
"${nixpkgs}/nixos/modules/installer/sd-card/sd-image-aarch64.nix"
./zero2w.nix
];
};
};
deploy = {
user = "root";
nodes = {
zero2w = {
hostname = "zero2w";
profiles.system.path =
deploy-rs.lib.aarch64-linux.activate.nixos self.nixosConfigurations.zero2w;
};
};
};
};
}

40
sd-image.nix Normal file
View file

@ -0,0 +1,40 @@
# This module extends the official sd-image.nix with the following:
# - ability to add options to the config.txt firmware
{
config,
lib,
pkgs,
...
}: {
options.sdImage = with lib; {
extraFirmwareConfig = mkOption {
type = types.attrs;
default = {};
description = lib.mdDoc ''
Extra configuration to be added to config.txt.
'';
};
};
config = {
sdImage.populateFirmwareCommands =
lib.mkIf ((lib.length (lib.attrValues config.sdImage.extraFirmwareConfig)) > 0)
(
let
# Convert the set into a string of lines of "key=value" pairs.
keyValueMap = name: value: name + "=" + toString value;
keyValueList = lib.mapAttrsToList keyValueMap config.sdImage.extraFirmwareConfig;
extraFirmwareConfigString = lib.concatStringsSep "\n" keyValueList;
in
lib.mkAfter
''
config=firmware/config.txt
# The initial file has just been created without write permissions. Add them to be able to append the file.
chmod u+w $config
echo "\n# Extra configuration" >> $config
echo "${extraFirmwareConfigString}" >> $config
chmod u-w $config
''
);
};
}

108
zero2w.nix Normal file
View file

@ -0,0 +1,108 @@
{
lib,
modulesPath,
pkgs,
...
}: {
imports = [
./sd-image.nix
];
nixpkgs.hostPlatform = "aarch64-linux";
# ! Need a trusted user for deploy-rs.
nix.settings.trusted-users = ["@wheel"];
system.stateVersion = "23.11";
zramSwap = {
enable = true;
algorithm = "zstd";
};
sdImage = {
# bzip2 compression takes loads of time with emulation, skip it. Enable this if you're low on space.
compressImage = false;
imageName = "zero2.img";
extraFirmwareConfig = {
# Give up VRAM for more Free System Memory
# - Disable camera which automatically reserves 128MB VRAM
start_x = 0;
# - Reduce allocation of VRAM to 16MB minimum for non-rotated (32MB for rotated)
gpu_mem = 16;
# Configure display to 800x600 so it fits on most screens
# * See: https://elinux.org/RPi_Configuration
hdmi_group = 2;
hdmi_mode = 8;
};
};
# Keep this to make sure wifi works
hardware.enableRedistributableFirmware = lib.mkForce false;
hardware.firmware = [pkgs.raspberrypiWirelessFirmware];
boot = {
# TODO doesn't work
# kernelPackages = pkgs.linuxKernel.packages.linux_rpi3;
initrd.availableKernelModules = ["xhci_pci" "usbhid" "usb_storage"];
loader = {
grub.enable = false;
generic-extlinux-compatible.enable = true;
};
# Avoids warning: mdadm: Neither MAILADDR nor PROGRAM has been set. This will cause the `mdmon` service to crash.
# See: https://github.com/NixOS/nixpkgs/issues/254807
swraid.enable = lib.mkForce false;
};
networking = {
interfaces."wlan0".useDHCP = true;
wireless = {
enable = true;
interfaces = ["wlan0"];
# ! Change the following to connect to your own network
networks = {
"Le Ninternet" = {
psk = "XcTsS9mnz2ePwE7dps";
};
};
};
};
# Enable OpenSSH out of the box.
services.sshd.enable = true;
# NTP time sync.
services.timesyncd.enable = true;
# ! Change the following configuration
users.users.penwing = {
isNormalUser = true;
home = "/home/penwing";
description = "Me";
extraGroups = ["wheel" "networkmanager"];
# ! Be sure to put your own public key here
openssh.authorizedKeys.keys = ["ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN/SQbXjL6O2zjKFdybiMLu7Imc10IGrTMUnRtIxf0jJ nicolas.pinson31@gmail.com"];
};
security.sudo = {
enable = true;
wheelNeedsPassword = false;
};
nixpkgs.config.allowUnfree = true;
environment.systemPackages = (with pkgs; [
# CLIs
starship # shell more pretty
git # code versioning
bottom # task manager
micro # text editor
fastfetch
yazi
]);
# ! Be sure to change the autologinUser.
services.getty.autologinUser = "penwing";
}