十月 21, 2025

在raspberry pi上运行nixos

 一觉醒来听说linux桌面又能打了,赶紧从角落里请出吃灰的raspberry pi 4b 。经过之前几轮raspberry os、armbian和manjaro arm的轮番入驻,本次嘉宾是nixos,计划跑个niri桌面管理器试试。

Pi4本体,sd卡,读卡器,micro hdmi线,无线键鼠套装,充电宝或充电头(可选),必要的网络连接这些都还在,不详细展开了

第一步老规矩请出raspberry pi os lite,先升级下eeprom 。

os下载页面 https://www.raspberrypi.com/software/operating-systems/

找个写卡工具把镜像写入sd卡 ,我用的是rufus

在pi上插sd卡、网线、键盘、充电宝、hdmi线,进入系统后

Sudo rpi-eeprom-update

Sudo rpi-eeprom-update -a


第二步开装nixos ,过程参照这个手册, Installing NixOS on a Raspberry Pi — nix.dev documentation ,主要记录下几个坑:

1、安装镜像在这里下载,解压完用写卡工具写入就行  Hydra - nixos:trunk-combined:nixos.sd_image.aarch64-linux

2、启动系统后,默认是nixos用户登录,这时候碰到第一个问题:手册里的配置文件太长,tinyurl访问又有点问题。根据内网是否已有ssh或者http服务,可以用scp或者curl处理,或者也可以调整下网络连接。我是新建了个文本文件,把配置内容复制进去,然后用filebrowser做分享,nixos curl下来的。

3、开始时没理解configuration.nix文件的作用,把文件头根据自己情况编辑了下,抄了个 源配置塞进去,以为就算换源了,但实际上,这些配置是在rebuild完才会生效的。要改当前源配置还是得手工修改 /etc/nix/nix.conf 的substituters行 ,重启nix-daemon即可生效。

nix.settings ={

  substituters = [

     "https://mirrors.tuna.tsinghua.edu.cn/nix-channels/store"

     "https://cache.nixos.org"

];

};

4、中间手工修改配置文件漏逗号分号关门之类就不说了,没有工具辅助和直接黏贴文本就是惨,还是以最小化的ssh服务先起来再弄后面的。命令用nixos-rebuild boot 然后重启

5、重建终于完成之后,可以用刚才配置文件里用户的登录,确认网络正常后可以拔掉hdmi线和键盘,改用ssh登录。修改pkgs部分,把需要用的软件先加上去,再次重建,这时候用sudo nixos-rebuild switch 就行。


第三步其他配置

6、这时候发现声明式配置的优势了,为了方便后续的备份和迁移,得把配置文件集中起来。暂时先放在home目录下: 

Mkdir ~/nixos-config

Sudo mv  /etc/nixos/configuration.nix  ~/nixos-config/

Sudo ln -sf (绝对路径) etc/nixos/configuration.nix

7、参照手册最后的部分,把hardware也配置起来,配置文件里先声明好git:

Cd ~/nixos-config

Git clone --depth 1  ttps://github.com/nixos/nixos-hardware.git

Vim configuration.nix


加入这块配置

imports = [

  ./nixos-hardware/raspberry-pi/4

];


其他七七八八的环境项 

  # 时区设置

  time.timeZone = "Asia/Shanghai";  # 设置时区为上海(中国标准时间)


补上zsh


# zsh start

  programs.zsh = {

    enable = true; # Enable Zsh

    autosuggestions.enable = true;

    syntaxHighlighting.enable = true;


    shellAliases = {

      update = "sudo nixos-rebuild switch";

    };


    ohMyZsh = {

      enable = true; # Enable Oh My Zsh

      plugins = [ "git" "z" ]; # Add desired plugins

      theme = "random"; # Set your preferred theme (default: robbyrussell)

    };

  };


  system.userActivationScripts.zshrc = "touch .zshrc";

  users.defaultUserShell = pkgs.zsh; # Set Zsh as the default shell

  environment.shells = [ pkgs.zsh ]; # Add Zsh to available shells


# zsh end


重建。


nix配置文件还是从最小环境开始根据实际需要一个一个加上去比较合适,能给你一种一切尽在掌握的错觉。


第四步开始niri


首先确认显卡v3d有没有正确加载,没有的话会黑屏

Lsmod | grep v3d #别是空的

Ls /dev/dri  #看看有没有renderD128

没有的话在配置文件里加上

  hardware.raspberry-pi."4".fkms-3d.enable = true;


因为niri有图形环境,跟其他情况差别比较大,还是单独建立nix文件,通过import导入,方便随时注释

Vim niri.nix


{ pkgs , lib, ...}:

{

programs.niri.enable = true;

programs.waybar.enable = true; # top bar

security.polkit.enable = true; # polkit

services.gnome.gnome-keyring.enable = true; # secret service

security.pam.services.swaylock = {};

#注意这里的packages得用lib.mkafter ,不然导入后有两个pkg环境项可能会报错的

environment.systemPackages = lib.mkAfter (   

        with pkgs; [

                alacritty

                fuzzel

                swaylock mako swayidle

        ]

    );

}


Configuration.nix里的import部分加上相对目录后大致是这样的

imports = [

  ./nixos-hardware/raspberry-pi/4

#  ./niri.nix

];


重建。


目前没有dm选择器,需要手工运行 niri-session进入桌面


发生错误的话,黑屏、卡死之类的,可以用ctrl + alt +f2之类进入其他tty,或者其他设备ssh登录进来,

Ps -aux |grep niri 找到进程,pkill -9掉 ,然后看日志journalctl --user -xe |grep niri -A5 -B5,找到error或者wanning之类的那一大段复制下来喂给ai跟着处理就行。


截至目前,niri可以在raspberry pi上正常启动,不过暂时我的键盘快捷键它认不出来,这些小问题后面有空再弄。


因为我打算趁着jellyfin 10.11发布,踩一下这个大坑:在pve里依赖lxc配置文件、mountpoint、nix声明,构建无状态nixos lxc容器来跑jellyfin 。