在configuration.nix

时间:2018-02-17 06:01:37

标签: virtualbox kernel-module nix nixos

可以使用this answer中的配置从/etc/nixos/configuration.nix安装nixos-unstable中的软件包。

以下是从nixos-unstable:

安装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-unstable安装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-unstable的virtualbox软件包,但不是 Virtualbox内核模块。

如何从nixos-unstable安装Virtualbox内核模块?为什么不进行上述工作?

2 个答案:

答案 0 :(得分:1)

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

备选方案为to replace the offending module/modules,方法是停用使用disabledModules,然后使用imports导入替换。

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

答案 1 :(得分:0)

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

如果要覆盖用户程序,还需要覆盖内核模块。这可能是这样的:

!! 未经测试的代码 !!

  ...

  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;
  };

  ...

这样的事情应该允许你运行常规的virtualbox-host模块,注入不稳定的包。