如何在NixOS中让自定义内核包含EFI Stub?
如何在NixOS中让自定义内核包含EFI Stub?
嘿,我看你正在基于NixOS构建自定义的linux-nitrous内核,要让它包含EFI Stub(这样就能直接从UEFI启动内核,不用依赖GRUB这类引导器),咱们可以从内核配置和Nix构建参数两方面调整,下面是具体步骤:
1. 启用EFI Stub相关内核配置
EFI Stub需要内核里开启几个关键配置项,你可以选两种方式设置:
- 如果你想用自定义的defconfig(比如你注释掉的
nitrous_defconfig),直接在defconfig文件里追加:CONFIG_EFI=y CONFIG_EFI_STUB=y CONFIG_EFI_MIXED=y # 可选,如果你需要支持32位UEFI环境 CONFIG_CMDLINE_BOOL=y CONFIG_CMDLINE="root=UUID=你的根分区UUID ro quiet" # 替换成你实际的根分区UUID和启动参数 - 要是不想修改defconfig,也可以在Nix配置里用
extraConfig参数直接追加这些选项,这样更方便在Nix环境里统一管理。
2. 调整你的Nix内核构建配置
下面是调整后的完整配置片段,我给你标注了新增的关键部分:
{ pkgs, lib, config, ... }: { environment.systemPackages = with pkgs; [ llvm_18 clang_18 lld_18 ]; boot.kernelPackages = let llvm = pkgs.llvmPackages_18; localversion = "-nitrous4"; linux_nitrous_pkg = { buildLinux, ... } @ args: buildLinux (args // rec { version = "6.11.0"; modDirVersion = "${version}${localversion}"; src = pkgs.fetchTarball { url = "https://gitlab.com/xdevs23/linux-nitrous/-/archive/v6.11.0-3/linux-nitrous-v6.11.0-3.tar.gz"; sha256 = "0f0rpxxssknqr7l73hqrq4ad20zlpv6h41j8n85w4fkz5s7z118j"; }; # 想用自定义defconfig的话,取消下面这行注释 # defconfig = "nitrous_defconfig"; allowImportFromDerivation = true; stdenv = pkgs.overrideCC llvm.stdenv (llvm.stdenv.cc.override { inherit (llvm) bintools; }); extraMakeFlags = [ "LLVM=1" "INSTALL_PATH=$(out)/efi/EFI/nixos" # 指定EFI Stub的安装路径,适配NixOS默认EFI目录 ]; # 新增:添加EFI Stub相关内核配置 extraConfig = '' CONFIG_EFI=y CONFIG_EFI_STUB=y CONFIG_CMDLINE_BOOL=y CONFIG_CMDLINE="root=UUID=你的根分区UUID ro quiet" ''; # 新增:确保EFI镜像文件被正确安装 postInstall = '' cp $out/vmlinuz $out/efi/EFI/nixos/vmlinuz-${modDirVersion}.efi ''; }); in pkgs.linuxPackagesFor linux_nitrous_pkg; # 新增:开启systemd-boot让NixOS自动管理UEFI引导项 boot.loader.systemd-boot.enable = true; boot.loader.efi.canTouchEfiVariables = true; }
3. 几个要注意的小细节
- 根分区UUID别填错:
CONFIG_CMDLINE里的UUID一定要换成你自己系统根分区的实际值,用blkid命令就能查到,填错了会导致启动时找不到根分区哦。 - LLVM编译无需额外调整:你已经在用LLVM/Clang编译内核,EFI Stub和这套工具链兼容性很好,不用改编译器相关设置。
- 依赖systemd-boot简化管理:开启
boot.loader.systemd-boot.enable后,NixOS会自动把生成的EFI内核镜像加到UEFI启动菜单里,不用你手动复制文件到EFI分区。 - 安装路径别乱改:
INSTALL_PATH指定的/efi/EFI/nixos是NixOS默认的EFI引导目录,和systemd-boot完美适配,尽量保持默认。
备注:内容来源于stack exchange,提问作者xdevs23




