【问题标题】:install virtualbox modules from nixos-unstable in configuration.nix在 configuration.nix 中从 nixos-unstable 安装 virtualbox 模块
【发布时间】:2018-07-28 01:11:44
【问题描述】:

可以使用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的sn-p:

  nixpkgs.config.virtualbox.enableExtensionPack = true;
  virtualisation.virtualbox.host.enable = true;
  environment.systemPackages = with pkgs; [
    ...
    unstable.virtualbox
  ];

以上将正确安装来自 nixos-unstable 的 virtualbox 包,但 不是 Virtualbox 内核模块。

如何从 nixos-unstable 安装 Virtualbox 内核模块?为什么上述方法不起作用?

【问题讨论】:

标签: virtualbox kernel-module nix nixos


【解决方案1】:

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

替代方法是 to replace the offending module/modules,方法是禁用 disabledModules,然后使用 imports 导入替换。

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

【讨论】:

  • 你能用如何替换 virtualbox 模块来更新你的答案吗?您提供的链接说要添加如下字段:imports = [ <nixos-unstable/nixos/modules/services/databases/postgresql.nix> ];。但是,在我上面的配置中,我的NIX_PATH 中没有nixos-unstable,而是在一个 let-bound 变量中。如何将我的unstableTarball 中的模块添加到import 列表中?
  • 您可以从这样的变量导入:imports = [ (unstableTarball + "/nixos/modules/services/databases/postgresql.nix") ]。请注意 import(来自 Nix 语言的原始函数)和 imports(NixOS 模块系统使用的属性名称)之间的区别。
  • virtualbox 模块放入disabledModules 同时将其添加到imports 似乎不起作用。这是我的configuration.nix:nixpaste.lbr.uno/H1bGSJvE?nix 的 sn-p。 virtualbox 的内核模块似乎没有被重建。也许唯一的方法是你的第一个建议:公开一个覆盖包的选项?
  • 这似乎仍然是一个合适的选择。也可以在nixpkgs.config.packageOverrides 或者更好的nixpkgs.overlays 中覆盖virtualbox。有一些 funny business going on in the host module 可能会将正确的虚拟机源注入内核配置。
  • 这似乎更好一些,但我仍然收到错误:nixpaste.lbr.uno/15ayA-aV?nix。当试图覆盖 nixpkgs.config.packageOverrides 中的 virtualbox 时,似乎 virtualbox 内核模块不再能够找到内核头文件。关于这里可能发生什么的任何线索?或者如何解决?
【解决方案2】:

原始内核模块已安装,因为它是针对特定内核单独构建的。通常,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 模块,注入不稳定的包。

【讨论】:

  • 也就是说,过去我自己运行过一个混合的稳定/不稳定系统,我现在可以告诉你,你可能会过得更好,反正只是运行不稳定 :-)
  • 这种情况下的 virtualbox 可能会起作用,因为内核是一个非常稳定的目标。
  • 感谢您的建议。但是,这似乎会导致与 Github 上的 issue 中所述相同的错误:/tmp/nix-build-virtualbox-modules-5.2.6-4.9.78.drv-0/virtualbox-5.2.6-modsrc/vboxdrv/Makefile.include.header:141: *** Error: unable to find the headers of the Linux kernel to build against. Specify KERN_VER=<version> (currently 4.9.78) and run Make again. Stop. 不过,它尝试构建的 virtualbox-modules 的版本是正确的。
猜你喜欢
  • 2016-07-26
  • 2016-06-30
  • 2018-01-28
  • 2022-07-11
  • 2020-01-05
  • 1970-01-01
  • 2017-05-04
  • 1970-01-01
  • 2017-12-21
相关资源
最近更新 更多