飞牛NAS系统盘迁移:256G 换 512G 全程记录

飞牛 fnOS 装在一块 2242 尺寸的 256G NVMe 上。用了一年多, 系统盘告急, 想换一块 512G 的 2280。

最省事的想法是” 直接把盘对拷过去”。但系统盘不是数据盘, 拷完能不能启动、空间能不能用满, 全是坑。

我折腾了一下午, 全程记录在这里。下次遇到类似的事, 可以直接照做。

先搞清一件事
还是 Legacy

这决定你能不能放心用 dd。

SSH 登录飞牛, 跑一句:

Terminal window
lsblk

找到系统盘 nvme0n1, 看第一个分区的挂载点:

nvme0n1p1 94M /boot/efi ← 有 /boot/efi 挂载点 = UEFI
nvme0n1p2 63.9G / ← 根分区
nvme0n1p3 174.5G ← 存储卷

p1 挂到了 /boot/efi, 就是 UEFI 引导。如果是 Legacy, 这里不会有 /boot/efi, 是个没有挂载点的裸分区。

原因很简单

模式下, 只要做扇区级整盘克隆, EFI 分区和引导记录会原样复制, 新盘大概率能直接启动。这给了我用 dd 的底气。

三种方案, 为什么选 dd

方案优点缺点
硬件对拷机免电脑、扇区级要额外买设备, 一次性操作不值
DiskGenius 克隆有图形界面默认文件级克隆, UEFI 引导可能丢, 得手动选” 按扇区复制”
dd免费、扇区级、可控命令行, 写错盘毁所有

手头两块 NVMe 都能接电脑, 又不想为一次性操作买对拷机, dd 最合适。省下的钱差不多顶一个 DiskGenius 付费版。

dd 实操

关键

dd 自己。系统盘正在用, 边读边写会出问题。得用一个 Linux Live 环境。

我用的是 Debian 13 Live U 盘, Ubuntu 也行, 任何 Linux Live 都行。

从 U 盘启动后, 先确认设备名:

Terminal window
lsblk

这里踩了第一个坑

(512G) 没显示成 nvme1n1, 而是 sda。

别慌。有的主板会把 NVMe 映射成 SCSI 设备, 名字不重要, 认准容量就行 ——465.8G 那个就是 512G 新盘。源盘还是 nvme0n1 (256G 飞牛系统盘)。

确认没挂载, 直接 dd:

Terminal window
sudo dd if=/dev/nvme0n1 of=/dev/sda bs=64K conv=noerror,sync status=progress

三个点:

  • 目标盘不用预先格式化。dd 是扇区级覆盖, 原数据、分区表、文件系统全被盖掉, 清不清空无所谓。
  • if= 是源盘, of= 是目标盘。写反了, 256G 盘会被 512G 盘的内容盖掉, 数据全没。
  • 256G 大概跑 15-40 分钟, 看盘速。跑完打印一行 “X bytes copied” 统计, 然后回到命令提示符。

修 GPT 备份表

这步容易漏, 但很关键。

dd 把 256G 的内容原样复制到 512G, 可 GPT 分区表的备份表存在磁盘末尾, 新盘比源盘大, 末尾位置变了, 备份表就” 错位” 了。不修的话, 有些系统会起不来。

Terminal window
sudo sgdisk -e /dev/sda

如果提示 sgdisk 不存在 (Debian Live 默认可能没装),先装:

Terminal window
sudo apt update && sudo apt install gdisk

或者用 fdisk /dev/sda 进去按 w 保存退出, 效果一样。

换盘启动

关机, 拔掉源盘, 只留 512G 新盘, 开机。

进飞牛 Web 后台能正常登录、数据都在, 就说明克隆成功。

我的情况一次通过。因为走的是 UEFI + 扇区级 dd,EFI 分区完整。

四层扩容

新盘起来了, 但系统还只认 256G—— 分区表还是原来 256G 的布局, 多出来的 ~238G 没分配。

普通 Linux 扩容可能 growpart + resize2fs 两步搞定。但飞牛系统盘是四层嵌套结构:

nvme0n1p3 (分区)
└─ md0 (RAID1)
└─ LVM (逻辑卷)
└─ btrfs (/vol1)

飞牛 /vol1 四层嵌套结构

一层都不能跳, 得按 分区→RAID→LVM→btrfs 的顺序逐层扩。顺序错了会破坏数据。

先看完整结构:

Terminal window
lsblk
cat /proc/mdstat
df -hT /vol1

我的 /vol1 是 md0 (单成员 RAID1)→ LVM → btrfs。然后按顺序执行:

第 1 步, 扩分区:

Terminal window
sudo parted -s /dev/nvme0n1 resizepart 3 100%
sudo partprobe /dev/nvme0n1

第 2 步, 扩 RAID:

Terminal window
sudo mdadm --grow /dev/md0 --size=max

第 3 步, 扩 LVM:

Terminal window
sudo pvresize /dev/md0
sudo lvextend -l +100%FREE /dev/mapper/<你的LV名>

LV 名用 lsblk 里那个 lvm 设备名, 照着抄就行。

第 4 步, 扩 btrfs:

Terminal window
sudo btrfs filesystem resize max /vol1

最后验证:

Terminal window
df -hT /vol1

我的结果:/vol1 从 175G 涨到 413G,119G 数据原封不动。

踩坑清单

  1. 目标盘显示成 sda 而不是 nvme1n1—— 主板映射成 SCSI, 不影响, 认容量。
  2. umount 写少一个斜杠 (dev/sda1),报 no mount point specified—— 低级但真实, 命令写完整 /dev/sda1。
  3. 忘修 GPT 备份表 ——dd 之后必须 sgdisk -e, 否则可能起不来。
  4. 扩容直接动分区表 —— 飞牛的 md0 是 RAID1, 得按 分区→RAID→LVM→btrfs 四层来, 跳过 RAID 那层直接 resize2fs 会失败。
  5. 在跑着的系统里 dd 自己 —— 必须进 Live 环境, 别偷懒。

换盘这件事, 难点从来不在 dd 那一行命令, 而在搞清楚你的盘到底是几层结构。

数据还在, 空间也用满了, 这个下午算没白折腾。