Skip to content

116: migrate Docker runtime to dedicated btrfs subvolume #3

Description

@bioinformatist

背景

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:1noatimediscard=asyncspace_cache=v2
  • hosts/116/default.nixenvironment.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 子卷。

完成标准

  • /var/lib/docker 是独立 btrfs 子卷。
  • /var/lib/docker 不再由 /persist impermanence 管理。
  • Docker 启动正常。
  • 原有容器状态可见。
  • mihomo / vLLM / searxng compose 服务按需恢复。
  • /data1 没有被用作 Docker runtime。
  • /persist/var/lib/docker 副本在验证后已按需清理。

Metadata

Metadata

Labels

enhancementNew feature or request

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions