概述

  • 参考文档:Btrfs Documentation

  • 本文记录把一块装着 Windows 的 1TB NVMe 硬盘完整改造为 CachyOS 的 btrfs 数据盘、并让整个家目录运行在其上的操作流程

  • 全篇拓扑:

    flowchart LR
      subgraph before["迁移前"]
        A["nvme0n1 512G<br>CachyOS 系统盘"]
        B["nvme1n1 1TB<br>Windows NTFS"]
      end
      subgraph after["迁移后"]
        C["nvme0n1 512G<br>仅 CachyOS 系统"]
        D["nvme1n1 1TB<br>btrfs 挂载为 /home/ishian"]
      end
      B -->|"wipefs + mkfs.btrfs"| D
      A -->|"rsync 全量 + 增量"| D
  • 所涉专题:数据备份、擦除与格式化、fstab 挂载、Limine 引导项清理、家目录整体迁移与回退

  • 所有操作在 Limine 引导的 CachyOS(btrfs-progs v7.1、rsync 3.5)上完成,思路同样适用于其它发行版

快速开始

  • 用 lsblk 确认目标盘,认准型号与容量再动手,擦除不可逆:

    bash
    lsblk -o NAME,SIZE,FSTYPE,LABEL,MODEL,MOUNTPOINTS
  • 擦除全部分区表与签名,重建 GPT 单分区并格式化:

    bash
    sudo umount /run/media/ishian/NTFS卷标      # 桌面环境可能已自动挂载
    sudo wipefs -a /dev/nvme1n1
    sudo parted -s /dev/nvme1n1 mklabel gpt
    sudo parted -s /dev/nvme1n1 mkpart data btrfs 1MiB 100%
    sudo wipefs -a /dev/nvme1n1p1               # 清掉旧分区残留的文件系统签名
    sudo mkfs.btrfs -L data /dev/nvme1n1p1
  • 写入 fstab 实现开机自动挂载并立即挂载:

    bash
    echo "UUID=$(sudo blkid -s UUID -o value /dev/nvme1n1p1)  /mnt/data  btrfs  defaults,noatime,compress=zstd:3  0 0" | sudo tee -a /etc/fstab
    sudo mkdir -p /mnt/data
    sudo mount /mnt/data
    sudo findmnt --verify                        # 校验 fstab 语法
    sudo chown ishian:ishian /mnt/data
  • fstab 一定用 UUID 而不是 /dev/nvmeXnY:多块 NVMe 的设备名在重启后可能互换,本次迁移中两块盘的编号就翻转了两次

备份 Windows 经典目录

  • NTFS 分区被桌面自动挂载在 /run/media/$USER/<卷标>,经典用户目录位于 Users/<name>/ 下,用 cp -a 连权限一起复制:

    bash
    cd /run/media/ishian/5AD454EFD454CEBF/Users/ishian
    cp -a Desktop Documents Downloads Music Pictures Videos ~/Documents/Backup/
  • 复制后必须校验:小目录用 diff -r 逐字节比对,大目录比对 find . -type f | wc -l 的文件数

  • Windows 目录常带只读属性,cp -a 会原样保留,后续移动或删除会报 Permission denied,先 chmod -R u+w 再操作

删除 Windows 引导项

  • Limine 的引导项集中在 limine.conf,Windows 条目形如:

    text
    /Windows
        protocol: efi_chainload
        image_path: uuid(cfa6e873-...):/EFI/Microsoft/Boot/bootmgfw.efi
  • 先备份再用 sed 按首尾行精确删除这 3 行,不动其它条目:

    bash
    sudo cp /boot/limine.conf /boot/limine.conf.bak
    sudo sed -i '/^\/Windows$/,/image_path: uuid(cfa6e873/d' /boot/limine.conf
    sudo rm -rf /boot/EFI/Microsoft              # ESP 上的 Windows 引导文件一并清理
  • 确认启动菜单正常后删除 .bak 备份即可

迁移家目录

  • 两种方案:

    • 软链接 ~ 到挂载点:实现最简单,但数据盘未挂载时连 shell 配置都没有,登录直接异常,极少数程序解析真实路径也会出问题
    • 直接把整个 btrfs 文件系统挂载为 /home/ishian:标准做法,fstab 失败时系统行为可控,推荐
  • 迁移分两阶段,全程可以不断电:

    • 桌面会话里先跑一次全量 rsync -aHAX --info=stats2 ~/ /mnt/data/,此时文件仍在变动没有关系
    • 切换前从 TTY(Ctrl+Alt+F3)执行 sudo systemctl isolate multi-user.target 退出桌面,再以 root 跑一次增量同步,让源端静止
  • 第二次同步必须以 root 执行:~/.local/share/waydroid 等目录属主是 root,普通用户同步会得到 exit 23(opendir failed: Permission denied),属主数据全部漏传

  • 同步后追加一次干跑校验,差异为空才算通过:

    bash
    rsync -aHAXn --itemize-changes /home/ishian/ /mnt/data/   # 应无输出
  • 切换脚本本体:

    bash
    systemctl stop waydroid-container.service
    rsync -aHAX /home/ishian/ /mnt/data/
    mv /home/ishian /home/ishian.old            # 旧目录保留,出问题可整体回退
    mkdir /home/ishian && chown ishian:ishian /home/ishian
    sed -i 's|/mnt/data|/home/ishian|' /etc/fstab   # 实际按 UUID 行整行替换更稳妥
    umount /mnt/data && rmdir /mnt/data
    mount /home/ishian
    findmnt --verify
  • 重启验证桌面、Steam、Lutris 全部正常后,再 sudo rm -rf /home/ishian.old 释放系统盘空间,删除前 .old 就是完整的回退点

  • 回退步骤:TTY 登录,删掉 fstab 里的 /home/ishian 行,rmdir /home/ishian 后 mv /home/ishian.old /home/ishian,重启即恢复原状

附

  • 家目录跨盘迁移后,~/Games、Steam 库、Lutris 数据随整个 ~ 自然落在数据盘,无需逐项软链接
  • /tmp 在重启后会被清空,长流程的脚本与日志放在 /tmp 之外更可靠,本次迁移的切换脚本就因此重建过一次
  • 迁移中遇到过一次无日志的内核 panic:journalctl -k -b -1 在崩溃点戛然而止且无任何 btrfs/nvme 错误,属日志来不及落盘的硬死锁,重跑 rsync 增量即可续传,必要时换 LTS 内核执行重负载阶段
  • btrfs device stats <挂载点> 可快速确认数据盘有无读写与校验错误,全 0 即健康