You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在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

火山引擎 最新活动