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
相关产品推荐
相关产品推荐

