NixOS虚拟机中nixos-shell无法识别已存在的Store路径问题排查
嘿,这个问题其实和Nix的内容寻址逻辑、VM的Nix配置细节有关,我来帮你拆解清楚:
可能的原因
本地路径的信任/验证问题
Nnix是靠内容哈希来识别软件包的,哪怕你在VM里看到/nix/store/1cbk7i6dg26cygss2b6w8xq4dnj50z31-vim-8.2.1522这个路径存在,Nix可能认为路径里的内容和它预期的哈希不匹配,或者没有对应的合法元数据(用来确认包来源的信息)。这种情况下,它会默认从官方缓存重新下载,来保证内容的正确性。VM与宿主机的nixpkgs版本不一致
你添加的nix.nixPath = [ "nixpkgs=${pkgs.path}" ];配置是让VM使用自身环境的nixpkgs路径,但如果宿主机的nixpkgs版本和VM的不一样,同一个软件(比如vim)生成的哈希路径就会不同。你看到VM里存在的路径可能是之前用其他版本nixpkgs构建的,而这次nix-shell -p vim调用的是另一个版本的vim,所以Nix还是要下载新的版本。Nix未配置优先使用本地缓存
默认情况下,Nix只会把官方的https://cache.nixos.org作为缓存源。即使本地store有对应的路径,如果Nix没被配置为优先检查本地store,或者没有记录该路径的缓存信息,它还是会尝试从远程下载。
解决方法
验证本地路径的合法性
在VM里执行以下命令,检查该路径的内容是否符合哈希要求:nix-store --verify --check-contents /nix/store/1cbk7i6dg26cygss2b6w8xq4dnj50z31-vim-8.2.1522如果提示内容损坏,你可以重新构建或修复;如果验证通过,执行
nix-store --trust来让Nix信任这个路径。确保VM与宿主机共享同一nixpkgs版本
你可以修改VM的配置,直接指向宿主机的nixpkgs路径(比如假设宿主机的nixpkgs在/nix/store/xxxx-nixpkgs-unstable):{ ... }: { nix.nixPath = [ "nixpkgs=/nix/store/xxxx-nixpkgs-unstable" ]; }或者在启动nixos-shell时,指定使用宿主机的nixpkgs:
nixos-shell -I nixpkgs=/path/to/host/nixpkgs配置VM的Nix优先使用本地store
在VM的配置里添加缓存源配置,让Nix先检查本地store再去远程下载:{ ... }: { nix.settings.substituters = [ "file:///nix/store" "https://cache.nixos.org" ]; nix.settings.trusted-public-keys = [ "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" ]; }
内容的提问来源于stack exchange,提问作者Chris Stryczynski

