背景
116 当前已经把 Docker 热数据从 /data1 移回了标准路径 /var/lib/docker,但现有布局下它仍通过 impermanence 持久化到 /persist/var/lib/docker。
长期目标是把 Docker 工作区拆成系统 SSD 上的独立 btrfs 子卷:
/var/lib/docker 继续作为 Docker 默认工作目录;
/var/lib/docker 背后是独立 btrfs 子卷;
- 不设置 quota,不固定 Docker 可用容量;
- 与
/home、/nix、/persist 共享同一块 SSD 的剩余空间;
/data1 只作为慢速备份盘,不作为 Docker runtime。
这件事 不需要 disko 重装。disko-config.nix 的修改只影响未来重装时的目标布局;现有机器需要手工创建子卷并迁移数据。
注意事项
- 需要维护窗口。
- 操作期间 Docker 和依赖 Docker 的 compose 服务会停机。
- 如果 mihomo/proxy 跑在 Docker 里,中途可能断网;请提前打开本 issue,确认本地 flake 和 Nix store 足够完成 rebuild。
- 本 issue 不迁移
/var/lib/ai-serving。
- 不要格式化系统盘,不要运行
disko apply,不要碰 /data1 的 runtime 用途。
0. 预检查
在仓库目录执行:
cd /home/ysun/github.com/sctmes/dotfiles
git status --short
findmnt /persist
findmnt /var/lib/docker
sudo btrfs filesystem usage /persist
sudo du -sh /persist/var/lib/docker
docker ps -a
确认:
/persist 是系统 SSD 上的 btrfs 子卷;
/var/lib/docker 当前来自 /persist/var/lib/docker;
- Docker 当前状态已记录,方便迁移后比对。
1. 停止 Docker 相关服务
try { sudo systemctl stop jarvis-searxng-compose.service }
try { sudo systemctl stop jarvis-vllm-compose.service }
try { sudo systemctl stop mihomo-compose.service }
sudo systemctl stop docker.service
sudo systemctl stop docker.socket
确认没有活跃 Docker overlay 挂载:
findmnt -R /var/lib/docker
如果仍有 overlay 子挂载,先排查残留容器或相关 systemd service,不要继续迁移。
2. 临时挂载 btrfs 顶层并创建 Docker 子卷
从当前 /persist 反推出系统 SSD btrfs 设备:
let persist_source = (findmnt -no SOURCE /persist | str trim)
let btrfs_device = ($persist_source | str replace -r '\[.*\]$' '')
$btrfs_device
创建临时挂载点并挂载 btrfs 顶层:
sudo install -d -m 0755 /mnt/116-btrfs-root
sudo mount -o subvolid=5 $btrfs_device /mnt/116-btrfs-root
sudo btrfs subvolume list /mnt/116-btrfs-root
创建独立 Docker 子卷:
sudo btrfs subvolume create /mnt/116-btrfs-root/docker
sudo btrfs subvolume list /mnt/116-btrfs-root | grep ' docker$'
3. 迁移 Docker 数据
把新子卷临时挂到 staging 目录:
sudo install -d -m 0711 /mnt/116-docker-new
sudo mount -o subvol=/docker,compress=zstd:1,noatime,discard=async,space_cache=v2 $btrfs_device /mnt/116-docker-new
迁移现有 Docker 数据:
sudo rsync -aHAX --numeric-ids /persist/var/lib/docker/ /mnt/116-docker-new/
sudo du -sh /persist/var/lib/docker /mnt/116-docker-new
迁移后先不要删除旧目录。
4. 修改仓库配置
目标配置变更:
- 在
hosts/116/disko-config.nix 的 btrfs subvolumes 中增加 "/docker",挂载到 /var/lib/docker。
- mount options 与
/persist 保持一致:compress=zstd:1、noatime、discard=async、space_cache=v2。
- 从
hosts/116/default.nix 的 environment.persistence."/persist".directories 删除 "/var/lib/docker"。
- 不设置 Docker
data-root,继续使用默认 /var/lib/docker。
建议先做静态验证:
nix eval .#nixosConfigurations.116.config.environment.persistence."/persist".directories
nix eval .#nixosConfigurations.116.config.fileSystems."/var/lib/docker".mountPoint
nix build --dry-run .#nixosConfigurations.116.config.system.build.toplevel
期望:
- impermanence directories 不再包含
/var/lib/docker;
/var/lib/docker 有独立 filesystem 声明;
- dry-run 通过。
5. 切换系统
sudo nixos-rebuild switch --flake .#116
如果因为网络中断失败,不要反复尝试在线拉取依赖。优先检查本地 flake lock、Nix store、代理容器是否已停导致无法访问外网。
6. 验证迁移结果
findmnt /var/lib/docker
sudo btrfs subvolume list /var/lib/docker
sudo systemctl status docker.service
sudo docker info
sudo docker ps -a
期望:
/var/lib/docker 来源显示为 btrfs 的 /docker 子卷,而不是 /persist/var/lib/docker;
- Docker 正常启动;
- 迁移前的镜像、容器、volume 状态可见。
启动 compose 服务:
try { sudo systemctl start mihomo-compose.service }
try { sudo systemctl start jarvis-vllm-compose.service }
try { sudo systemctl start jarvis-searxng-compose.service }
systemctl status docker.service
systemctl status mihomo-compose.service jarvis-vllm-compose.service jarvis-searxng-compose.service
7. 回滚方案
如果 rebuild 后 Docker 无法正常工作,先停止 Docker:
try { sudo systemctl stop jarvis-searxng-compose.service }
try { sudo systemctl stop jarvis-vllm-compose.service }
try { sudo systemctl stop mihomo-compose.service }
sudo systemctl stop docker.service
sudo systemctl stop docker.socket
然后把仓库配置回退到旧策略:
- 移除
disko-config.nix 中 /docker 子卷挂载声明;
- 把
"/var/lib/docker" 加回 environment.persistence."/persist".directories;
- 重新执行
sudo nixos-rebuild switch --flake .#116。
旧数据目录 /persist/var/lib/docker 在清理前应保持不动,因此回滚时可以继续使用。
8. 清理
稳定运行一段时间后,再手工清理旧副本:
sudo du -sh /persist/var/lib/docker
确认不再需要后删除旧副本。删除前请再次确认 findmnt /var/lib/docker 已经指向 /docker 子卷。
完成标准
背景
116 当前已经把 Docker 热数据从
/data1移回了标准路径/var/lib/docker,但现有布局下它仍通过 impermanence 持久化到/persist/var/lib/docker。长期目标是把 Docker 工作区拆成系统 SSD 上的独立 btrfs 子卷:
/var/lib/docker继续作为 Docker 默认工作目录;/var/lib/docker背后是独立 btrfs 子卷;/home、/nix、/persist共享同一块 SSD 的剩余空间;/data1只作为慢速备份盘,不作为 Docker runtime。这件事 不需要 disko 重装。
disko-config.nix的修改只影响未来重装时的目标布局;现有机器需要手工创建子卷并迁移数据。注意事项
/var/lib/ai-serving。diskoapply,不要碰/data1的 runtime 用途。0. 预检查
在仓库目录执行:
确认:
/persist是系统 SSD 上的 btrfs 子卷;/var/lib/docker当前来自/persist/var/lib/docker;1. 停止 Docker 相关服务
确认没有活跃 Docker overlay 挂载:
如果仍有 overlay 子挂载,先排查残留容器或相关 systemd service,不要继续迁移。
2. 临时挂载 btrfs 顶层并创建 Docker 子卷
从当前
/persist反推出系统 SSD btrfs 设备:创建临时挂载点并挂载 btrfs 顶层:
创建独立 Docker 子卷:
3. 迁移 Docker 数据
把新子卷临时挂到 staging 目录:
迁移现有 Docker 数据:
迁移后先不要删除旧目录。
4. 修改仓库配置
目标配置变更:
hosts/116/disko-config.nix的 btrfssubvolumes中增加"/docker",挂载到/var/lib/docker。/persist保持一致:compress=zstd:1、noatime、discard=async、space_cache=v2。hosts/116/default.nix的environment.persistence."/persist".directories删除"/var/lib/docker"。data-root,继续使用默认/var/lib/docker。建议先做静态验证:
期望:
/var/lib/docker;/var/lib/docker有独立 filesystem 声明;5. 切换系统
如果因为网络中断失败,不要反复尝试在线拉取依赖。优先检查本地 flake lock、Nix store、代理容器是否已停导致无法访问外网。
6. 验证迁移结果
期望:
/var/lib/docker来源显示为 btrfs 的/docker子卷,而不是/persist/var/lib/docker;启动 compose 服务:
7. 回滚方案
如果 rebuild 后 Docker 无法正常工作,先停止 Docker:
然后把仓库配置回退到旧策略:
disko-config.nix中/docker子卷挂载声明;"/var/lib/docker"加回environment.persistence."/persist".directories;sudo nixos-rebuild switch --flake .#116。旧数据目录
/persist/var/lib/docker在清理前应保持不动,因此回滚时可以继续使用。8. 清理
稳定运行一段时间后,再手工清理旧副本:
确认不再需要后删除旧副本。删除前请再次确认
findmnt /var/lib/docker已经指向/docker子卷。完成标准
/var/lib/docker是独立 btrfs 子卷。/var/lib/docker不再由/persistimpermanence 管理。/data1没有被用作 Docker runtime。/persist/var/lib/docker副本在验证后已按需清理。