从configuration.nix中的nixos安装virtualbox模块

从configuration.nix中的nixos安装virtualbox模块,virtualbox,kernel-module,nix,nixos,Virtualbox,Kernel Module,Nix,Nixos,可以使用中的配置在/etc/nixos/configuration.nix中安装来自nixos的软件包 以下是从nixos安装htop软件包的示例: { config, pkgs, ... }: let unstableTarball = fetchTarball https://github.com/NixOS/nixpkgs-channels/archive/nixos-unstable.tar.gz; in { ... nixpkgs.config =

可以使用中的配置在
/etc/nixos/configuration.nix中安装来自nixos的软件包

以下是从nixos安装
htop
软件包的示例:

{ config, pkgs, ... }:

let
  unstableTarball =
    fetchTarball
      https://github.com/NixOS/nixpkgs-channels/archive/nixos-unstable.tar.gz;
in
{
  ...

  nixpkgs.config = {
    packageOverrides = pkgs: {
      unstable = import unstableTarball {
        config = config.nixpkgs.config;
      };
    };
  };

  environment.systemPackages = with pkgs; [
    ...
    unstable.htop
  ];

  ...
};
我也希望能够从nixos安装Virtualbox包(以及相关的内核模块)

天真地将
virtualbox
包添加到
environment.systemPackages
并不像我预期的那样工作。未安装与不稳定版本的Virtualbox匹配的Virtualbox模块。这是我的
/etc/nixos/configuration.nix
中的一个片段:

  nixpkgs.config.virtualbox.enableExtensionPack = true;
  virtualisation.virtualbox.host.enable = true;
  environment.systemPackages = with pkgs; [
    ...
    unstable.virtualbox
  ];
以上内容将正确安装来自nixos的
virtualbox
软件包,但不会安装virtualbox内核模块


如何从nixos安装Virtualbox内核模块?为什么上面的配置不起作用呢?

您的配置不起作用,因为virtualbox模块有自己对virtualbox包的引用。也许它应该像某些人那样公开一个覆盖包的选项,但现在它没有。对它提出拉动请求应该不难

另一种方法是使用
disabledModules
禁用,然后使用
imports
导入替换项


无论哪种方式,您的里程数可能会有所不同。第一个选项对我来说似乎是最干净的,但您可能希望检查您发行版中的nixos模块与不稳定版本之间的差异。

原始内核模块是安装的,因为它是针对特定内核单独构建的。通常,该模块保持内核模块和用户程序同步

当您想要覆盖用户程序时,还需要覆盖内核模块。这相当于:

未经测试的代码


类似这样的东西应该允许您在注入不稳定的包的情况下运行常规的virtualbox主机模块。

您是否能够更新您的答案,了解如何替换virtualbox模块?您提供的链接表示要添加如下字段:
imports=[]。但是,在上面的配置中,我的
NIX_路径中没有
nixos-stabilate
,而是在let绑定变量中。如何将模块从我的
unstableTarball
添加到
import
列表中?可以从如下变量导入:
imports=[(unstableTarball+“/nixos/modules/services/databases/postgresql.nix”)]
。请注意来自Nix语言的原始函数
import
与NixOS模块系统使用的属性名
imports
之间的区别。将
virtualbox
模块放入
DisabledModule
中,同时将其添加到
imports
中似乎不起作用。下面是我的
配置.nix的一个片段:。virtualbox的内核模块似乎没有得到重建。也许唯一的方法就是你的第一个建议:公开一个覆盖包的选项?这似乎仍然是一个合适的选项。还可以在
nixpkgs.config.packageOverrides
或更好的
nixpkgs.overlays
中覆盖virtualbox。有一些可能会将正确的virtualbox源代码注入内核配置。这似乎工作得更好一些,但我仍然收到一个错误:。当尝试在
nixpkgs.config.packageOverrides
中重写virtualbox时,virtualbox内核模块似乎不再能够找到内核头。关于这里可能发生的事情有什么线索吗?或者如何修复它?我在nixpkgs github上发布了一个关于这个问题的问题:看起来github问题上有一个回应显示了如何做到这一点(但我还没有亲自测试过):也就是说,过去我自己运行过一个稳定/不稳定的混合系统,现在我可以告诉你,你可能会更好,无论如何,只是运行不稳定:-)这种情况下的virtualbox可能会起作用,因为内核是一个非常稳定的目标。谢谢你的建议。但是,这似乎会导致与Github上所述相同的错误:
/tmp/nix-build-virtualbox-modules-5.2.6-4.9.78.drv-0/virtualbox-5.2.6-modsrc/vboxdrv/Makefile.include.header:141:**错误:无法找到要构建的Linux内核的头。指定KERN_VER=(当前为4.9.78)并再次运行Make。停止。
不过,它尝试构建的virtualbox模块的版本是正确的。
  ...

  boot.kernelPackages = pkgs.linuxPackages.extend (self: super: {
    virtualbox = super.virtualbox.override {
      inherit (self) kernel;
    };
    virtualboxGuestAdditions = super.virtualboxGuestAdditions.override {
      inherit (self) kernel;
    };
  });
  ## also, the user program override should be introduced 
  ## directly at packageOverrides
  nixpkgs.config.packageOverrides = pkgs: rec {
    unstable = import
      (fetchTarball https://github.com/NixOS/nixpkgs-channels/archive/nixos-unstable.tar.gz) {
        config = config.nixpkgs.config;
      };
    virtualbox = unstable.virtualbox;
  };

  ...