831 字
4 分钟
Nixos手动构建grub主题

Nixos官方pkgs内支持的grub主题不多,相比于海量的第三方主题更是寥寥无几,如果想手动安装喜欢的grub主题,就免不了自己编写脚本构建。

标准的grub主题需要theme.txt在主题文件夹的根目录以声明主题的配置和其他字体/图片/图标等的位置,这种文件结构的grub主题配置起来比较简单,我们可以参考jeslie0的项目:NixOS Grub Themes

我这里以yeyushengfan258/Particle-circle-grub-theme为例,这个grub主题比较特殊,因为它的仓库不包含标准的grub主题配置文件结构,而是使用脚本生成配置,这种方法被广大现代化的grub主题采用,对于传统的结构,这样的方式显然更灵活和利好客制化,但对于我们的配置,则需要多几步操作。

废话不多说,这里先直接呈上完整配置:

boot.loader.grub = {
enable = true;
device = "nodev";
efiSupport = true;
useOSProber = true;
theme = pkgs.stdenv.mkDerivation {
pname = "particle-circle-grub-theme";
version = "unstable-2025-03-18";
src = pkgs.fetchFromGitHub {
owner = "yeyushengfan258";
repo = "Particle-circle-grub-theme";
rev = "f27991237562f93aacc3f333be4284430889f5bb";
hash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
};
nativeBuildInputs = [ pkgs.imagemagick ];
buildPhase = ''
patchShebangs generate.sh
./generate.sh -t window
'';
installPhase = ''
mkdir -p $out
cp -r Particle-circle-window/* $out/
'';
};
};
  • mkDerivation时常见的写法是pkgs.stdenv.mkDerivation rec { ... };,这里的 recrecrecursive attribute set(递归属性集) 的关键字,它使得 mkDerivation 属性集内属性可以互相引用自己,因为这里没有用到 pname/version 的自我引用,所以不需要 rec,其次,现代 Nixpkgs 推荐避免不必要的 rec,使用 (finalAttrs: { ... }) 形式更安全(但本例简单,可省略)。

  • 第7、8行:pnameversion是你构建的包的信息,可以任意填

  • 第13行的rev可以直接填tag或某次commit,因为这个包没有任何的release,所以使用最新的commit

  • 第14行哈希值不知道就乱填,然后使用nixos-rebuild生成一次配置,Nix就会报错并显示正确的哈希,例如:

    Terminal window
    error: hash mismatch in fixed-output derivation '/nix/store/ks8wiwcb9dn0k2hxc8wr
    2akv6zin086j-source.drv':
    specified: sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
    got: sha256-3yusy7V+ASj6vS7yPe9xhi2YY9TGFKKJpZQwZqITJ0U=
    Command 'nix --extra-experimental-features 'nix-command flakes' build --print-ou
    t-paths '.#nixosConfigurations."nixos".config.system.build.toplevel' --no-link'
    returned non-zero exit status 1.

接下来的内容就是与一般构建不同的了,因为使用到了脚本生成配置,我们要在构建时运行脚本并复制正确的配置到目录。

这里我们需要指定nativeBuildInputs = [ pkgs.imagemagick ];作为构建时的工具,因为在这个仓库的README中提到:Setting a custom background: Make sure you have imagemagick installed, or at least something that provides convert,这个包依赖convert命令来转换图片的分辨率。

这里的$out是 Nix 在执行 derivation 的构建阶段时自动注入的环境变量,内容大概是/nix/store/abc123xyz...-particle-circle-grub-theme,即指向最终输出产物的完整 Nix store 路径

变量含义用法
$out主要输出目录放最终产物
$bin二进制/可执行文件输出放 bin/ 下的程序
$dev开发头文件输出放 include/ 下的 .h 文件
$lib库文件输出放 lib/ 下的 .so / .a
$src源码解压后的目录读取原始文件(如 generate.sh)
$PWD当前工作目录(通常等于 $src)执行脚本时用

参考文献:


Nixos手动构建grub主题
https://blog.erina.top/posts/nixos手动构建grub主题/
作者
Erina Yip
发布于
2026-02-26
许可协议
CC BY-NC-SA 4.0