如何配置NixOS测试检查,使其可访问外部网络?
允许NixOS测试检查访问外部网络
问题描述
我有一个包含checks的flake.nix文件,其中一项检查在运行时需要从测试环境外部(互联网、本地网络)拉取资源。但测试运行在沙箱中,无法访问外部网络。请问是否可以配置检查或检查所用的机器,以允许访问外部网络?具体该如何操作?
示例flake.nix代码:
# flake.nix { inputs = { nixpkgs.url = "nixpkgs/nixos-22.11"; flake-utils.url = "github:numtide/flake-utils"; }; outputs = { self, nixpkgs, flake-utils }: flake-utils.lib.eachSystem (with flake-utils.lib.system; [ x86_64-linux ]) (system: let pkgs = import nixpkgs { inherit system; }; in { checks.test = pkgs.nixosTest { name = "test"; nodes.n1 = { }; testScript = '' n1.succeed("ping -c 1 8.8.8.8") # ping google's DNS ''; }; formatter = pkgs.nixpkgs-fmt; } ); }
运行nix flake check时,ping操作因沙箱限制失败,报错:Exception: command ping -c 1 8.8.8.8 failed (exit code 2),希望该操作能成功执行。
注:已知与测试环境外部资源交互并非最佳实践,仍执意执行,风险自负。
解决方案
方法1:直接禁用测试沙箱
在pkgs.nixosTest配置中添加enableSandbox = false;参数,关闭沙箱限制后测试环境即可直接访问外部网络:
checks.test = pkgs.nixosTest { name = "test"; enableSandbox = false; # 禁用沙箱 nodes.n1 = { }; testScript = '' n1.succeed("ping -c 1 8.8.8.8") # ping google's DNS ''; };
方法2:保留沙箱并配置网络访问
如果需要保留沙箱的部分隔离特性,可以通过sandboxOptions允许测试访问宿主网络,同时给节点配置正确的网络参数:
checks.test = pkgs.nixosTest { name = "test"; nodes.n1 = { config, pkgs, ... }: { networking.useDHCP = false; networking.interfaces.eth0.ipv4.addresses = [ { address = "192.168.123.2"; prefixLength = 24; } ]; networking.defaultGateway = "192.168.123.1"; networking.nameservers = [ "8.8.8.8" ]; }; # 允许沙箱连接宿主网络 sandboxOptions = [ "--network" "host" ]; testScript = '' n1.succeed("ping -c 1 8.8.8.8") # ping google's DNS ''; };
验证
修改完成后重新执行nix flake check,ping命令即可成功执行。
内容的提问来源于stack exchange,提问作者zegkljan
相关产品推荐
相关产品推荐

