You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NixOS虚拟机文件填充失败求助:无法向/etc及用户目录添加文件

解决NixOS添加文件到/etc和用户目录的问题

你之前的思路错了——把自定义derivation加到environment.systemPackages或用户packages里,只会把这些derivation放到Nix Store里,不会自动把文件复制到/etc或用户目录。NixOS有专门的配置项来管理这些目录下的文件,下面是具体解决方法:

1. 向/etc添加配置文件/证书

用NixOS内置的environment.etc选项就行,不用手动写mkDerivation,直接指定源文件:

# 向/etc/nixos添加文件的示例
environment.etc."nixos/configuration.nix" = {
  source = ./configuration.nix;
  # 可选:设置文件权限,比如证书设为只读
  mode = "0444";
};
environment.etc."nixos/nix-serve.pem" = {
  source = ./nix-serve.pem;
  mode = "0400"; # 证书文件建议仅所有者可读
};
environment.etc."nixos/nix-serve.pub" = {
  source = ./nix-serve.pub;
  mode = "0444";
};

environment.etc会自动把指定的源文件硬链接到/etc对应的路径,要是你需要复制文件而非链接,加一行copyFromStore = true就行。

2. 向用户目录添加项目目录

推荐用Home Manager(更灵活),或者用Systemd Tmpfiles(无需额外工具),选一种就行:

方法一:Home Manager(推荐)

先在配置里导入Home Manager模块,然后配置用户目录:

{
  imports = [
    # 根据你的NixOS版本调整路径,23.11版本直接用这个就行
    <home-manager/nixos>
  ];

  # 给runner用户配置home目录下的project文件夹
  home-manager.users.runner = {
    home.file."project" = {
      source = ./project;
      recursive = true; # 递归复制整个目录
      mode = "0755";
    };
  };
}

方法二:Systemd Tmpfiles(无需Home Manager)

通过tmpfiles规则创建目录并复制文件:

let
  # 把本地project目录打包到Nix Store
  projectStoreDir = pkgs.writeTextDir "project" ./project;
in
{
  systemd.tmpfiles.rules = [
    # 创建用户目录(如果不存在)
    "d /home/runner/project 0755 runner runner - -"
    # 把Store里的project目录内容复制到用户目录
    "R /home/runner/project/ - runner runner - ${projectStoreDir}/project/"
  ];
}

完整修改后的配置示例

这里用environment.etc+Home Manager的组合,替换你原来的配置:

{ config, lib, pkgs, ... }:

{
  imports = [
    <home-manager/nixos>
  ];

  boot.loader.systemd-boot.enable = true;
  boot.loader.efi.canTouchEfiVariables = true;
  networking.hostName = "ci";

  users.users.runner = {
    isNormalUser = true;
    extraGroups = [ ];
  };

  # /etc目录下的文件配置
  environment.etc."nixos/configuration.nix" = {
    source = ./configuration.nix;
    mode = "0444";
  };
  environment.etc."nixos/nix-serve.pem" = {
    source = ./nix-serve.pem;
    mode = "0400";
  };
  environment.etc."nixos/nix-serve.pub" = {
    source = ./nix-serve.pub;
    mode = "0444";
  };

  # 用户目录下的project文件夹配置
  home-manager.users.runner = {
    home.file."project" = {
      source = ./project;
      recursive = true;
      mode = "0755";
    };
  };

  system.stateVersion = "23.11";
}

内容的提问来源于stack exchange,提问作者GlinesMome

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 06:05:32