nix 存储持久化
引言
背景
由于使用 nixpkgs 来管理和安装包。但是由于 nix 的存储没有做持久化,因此当 pod 重启后,已经下载的包和软件都需要重新下载,因此我们想将 nix 的存储持久化,避免重复下载。
目标
nix 已经下载的包,不用重复下载。
基础能力
Pod 重启后,已经下载的包可以不用下载。
高级能力
多个 pod 之间使用相同的存储,从而只要集群中任何一个用户下载安装了包,其他用户均不用下载。
需求分析
从 nix 的说明文档来看,可以将 /nix 目录存储到网盘上即可实现存储的持久化。
技术设计
架构设计
在方案调研的时候,找到了 nix.conf 的 store 配置,可以修改软件包的路径,的确可以将下载的 nix 包存储到 store 指定的路径,但是。也可以进入
shell,但是当在 shell 中使用 nix-shell -p kubectl
的时候,提示无法找到文件
~/code$ cat /etc/nix/nix.conf
substituters = https://mirrors.sjtug.sjtu.edu.cn/nix-channels/store https://mirrors.bfsu.edu.cn/nix-channels/store https://mirrors.tuna.tsinghua.edu.cn/nix-channels/store https://mirrors.ustc.edu.cn/nix-channels/store https://cache.nixos.org
store = /home/runner/nix
~/code$ nix-shell -p kubevpn
build input /nix/store/kzbxgp2bini5ml5x8hpj3lni8hrqy430-kubevpn-2.2.6 does not exist
~/code$ ls -alh /nix/store/kzbxgp2bini5ml5x8hpj3lni8hrqy430-kubevpn-2.2.6
ls: cannot access '/nix/store/kzbxgp2bini5ml5x8hpj3lni8hrqy430-kubevpn-2.2.6': No such file or directory
~/code$ ls -alh /home/runner/nix/nix/store/kzbxgp2bini5ml5x8hpj3lni8hrqy430-kubevpn-2.2.6
total 1.1M
dr-xr-xr-x 3 runner run 4.0K Jan 1 1970 .
drwxr-xr-x 400 runner run 1.0M Jun 14 12:44 ..
dr-xr-xr-x 2 runner run 4.0K Jan 1 1970 bin
~/code$
手动设置 NIX_STORE=/home/runner/nix
,会去构建而不是下载包。
所以此方法暂时不可行。采用第二种方法。挂载 /nix
目录
详细设计
使用网盘,挂载 /nix
目录。
volumeMounts:
- mountPath: /nix
name: nix
volumes:
- hostPath:
path: /mnt/vepfs/nix/nix
type: Directory
name: nix
说明
额外需要 copy 的过程,当第一次使用新的网盘时,需要把基础镜像中的 /nix
目录,copy 到网盘的 /mnt/vepfs/nix/nix
目录。
root@iv-yczv0pq41s5i3z3mw60r:~# tree -L 2 /mnt/vepfs/nix
/mnt/vepfs/nix
|-- nix
|-- store
`-- var
5 directories, 0 files
root@iv-yczv0pq41s5i3z3mw60r:~#