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 副本在验证后已按需清理。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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