NixOS on RISCV/VisionFive 2: Difference between revisions
Malteneuss (talk | contribs) m Mention u-boot in status |
Malteneuss (talk | contribs) m Add remote builder and deploy sections |
||
Line 125: | Line 125: | ||
For UART access, wire GND (black), RX (blue) and TX (purple) to your adapter | For UART access, wire GND (black), RX (blue) and TX (purple) to your adapter | ||
[[File:Visionfive2 uart wiring.jpg|none|thumb|802x802px]] | [[File:Visionfive2 uart wiring.jpg|none|thumb|802x802px]]Update board firmware<syntaxhighlight lang="bash"> | ||
Update board firmware<syntaxhighlight lang="bash"> | |||
sudo visionfive2-firmware-update-flash | sudo visionfive2-firmware-update-flash | ||
</syntaxhighlight>Bootstrap NixOS system configuration at <code>/etc/nixos/configuration.nix</code><syntaxhighlight lang="bash"> | </syntaxhighlight>Bootstrap NixOS system configuration at <code>/etc/nixos/configuration.nix</code><syntaxhighlight lang="bash"> | ||
nixos-generate-config | nixos-generate-config | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== Using the Visionfive 2 as a remote builder to build native RISCV packages for e.g. the Visionfive 2 == | |||
Building an NixOS system image that can be flashed to an SD card or NVMe SSD requires to '''build RISCV binaries''', more specifically for the <code>"riscv64-linux"</code>platform. From a typical Intel/AMD computer we can either | |||
* '''emulated native compile using QEMU''' virtualization by enabling the binfmt kernel feature on NixOS configuration setting <code>boot.binfmt.emulatedSystems = [ "riscv64-linux" ];</code>). This can be fast if everything is downloaded pre-compiled from the cache.nixos.org cache (not supported yet though) and only few packages really need local compilation. In reality it can be extremely slow, e.g. compiling a Linux kernel alone can take days. | |||
* '''cross-compile''' to RISCV from another (e.g. "x86_64-linux) machine using the setup in the example above. However very few packages will be cached from cache.nixos.org as cross-compiled packages are less likely to be pre-build than native compiled. So the compile itself is fast but there will be a lot more to compile locally. In practice this can be quite fragile, because you may encounter packages that don't really support cross-compilation get stuck. | |||
* '''native compile on an remote builder''' like the Visionfive 2 itself running its custom Debian Linux at the beginning or later NixOS. This is quite simple to setup and reasonably fast as most packages can be pre-build and cached on cache.nixos.org, and building a remaining Linux kernel only takes 3h on the Visionfive 2. | |||
'''Setting up the Visionfive 2 as a remote native builder''' can be done following the steps at [[Distributed build|https://wiki.nixos.org/wiki/Distributed_build]]. The rough steps are as follows: | |||
# '''Install the Nix package manager''' on Visionfive 2 Debian OS the normal, multi-user way with <code>sh <(curl -L <nowiki>https://nixos.org/nix/install</nowiki>) --daemon</code>. If you already have NixOS running on the Visionfive 2, then you can skip this step. | |||
# '''Setup a <code>ssh</code> connection''' from your local machine to the Visionfive 2, especially adding <code>SetEnv PATH=/nix/var/nix/profiles/default/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin</code> to the Pi's <code>/etc/ssh/sshd_config</code> file. If you already have NixOS running on the Visionfive 2, then you can skip this step. | |||
# '''Make the remote Visionfive 2 known to you local computer''' by adding it as a <code>nix.buildMachines</code> entry to your <code>/etc/nix/configuration.nix</code> file and use connection protocol <code>ssh-ng</code>(!). | |||
# You can then '''build, e.g. an NixOS sd card image''' with a call similar to <code>nix build .\#nixosConfigurations.visionfive2.config.system.build.sdImage</code> | |||
# '''flash that resulting image onto an SD card''' or NVMe SSD using a call similar to <code>zstdcat result/sd-image/nixos-sd-image-23.11.20230703.ea4c80b-riscv64-linux.img.zst | sudo dd of=/dev/mmcblk0 bs=100M status=progress</code> and place that card into the Visionfive 2. | |||
== Deploy and Update the Visionfive 2 NixOS system once it's running NixOS == | |||
Once the Pi 5 is running NixOS, you can update it with newer NixOS system configurations using e.g. the usual <code>nix-rebuild</code> | |||
tool with a call similar to | |||
<code>nixos-rebuild --flake .#visionfive2 --build-host piuser@visionfive2 --target-host piuser@visionfive2 --use-remote-sudo switch</code> | |||
that uses the SSH connection from the remote builder section. | |||
See [https://nixcademy.com/2023/08/10/nixos-rebuild-remote-deployment/ this guide] for a good explanation of this terminal call. |