Ubuntu NVMe SSD 系统盘迁移方案

目标:将 2TB NVMe SSD 系统盘完整克隆到同容量新 NVMe SSD,换盘后即插即用。


实操记录(2026-05-17)

硬件配置

项目信息
源盘Kingston NV2 (SNVS2000G) 2TB NVMe
目标盘Kingston NV3 (SNV3S2000G) 2TB NVMe
硬盘盒绿联 Ugreen (RTL9210 芯片)
容量2,000,398,934,016 字节 (字节级完全一致)
扇区大小均为 512B/512B (逻辑/物理)
克隆方式dd if=/dev/nvme0n1 of=/dev/sdb bs=64M status=progress conv=fsync

遇到的问题

问题 1:USB 线缆不支持 USB 3.0

  • 现象: 硬盘盒始终以 480Mbps (USB 2.0) 连接,速度仅 55 MB/s
  • 排查: 通过 cat /sys/bus/usb/devices/*/speed 确认设备走在 Bus 1 (USB 2.0)
  • 原因: USB 线缆只有 4 芯,不支持 USB 3.0 SuperSpeed 信号
  • 解决: 更换 USB 3.0 数据线(9 芯),成功连接到 Bus 2,速度 5000Mbps
  • 教训: 很多 Type-C 线(尤其充电线)外观一样但只支持 USB 2.0,需确认线缆标注 USB 3.0/3.1/SuperSpeed

问题 2:硬盘盒过热断连(核心问题,三次复现)

次数已写入运行时间写入速度错误信息
第 1 次438 GB~16 min455 MB/sDID_NO_CONNECT + 设备名漂移 sdb→sdc
第 2 次557 GB~62 min149 MB/sDID_NO_CONNECT + 写入失败
第 3 次570 GB~31 min305 MB/sDID_NO_CONNECT + 写入失败
第 4 次136 GB~5 min422 MB/sDID_NO_CONNECT(硬盘盒未充分冷却)
  • 现象: dd 写入过程中,dmesg 报 hostbyte=DID_NO_CONNECT,I/O error,USB 设备断开重连
  • 根因: 绿联硬盘盒散热不足,NVMe SSD 持续高速写入产生大量热量,触发 USB 控制器断连保护
  • 规律: 三次均在写入约 500-570GB 时断连,对应持续写入约 30-60 分钟
  • 已尝试的缓解措施:
    • 添加外置风扇 → 有改善但仍不够(从 438GB 延长到 570GB)
    • 速度自然降速(SLC 缓存耗尽 453→305 MB/s)→ 仍过热

问题 3:设备名漂移

  • 现象: USB 断连重连后,设备名从 /dev/sdb 变为 /dev/sdc,dd 仍在写 /dev/sdb,报 “设备上没有空间”
  • 原因: Linux USB 子系统对断连重连的设备分配新的设备名
  • 影响: dd 必须从头重新执行,无法断点续传

当前状态

  • 克隆未完成,三次均因硬盘盒过热断连失败
  • 源盘完好无损(dd 只读源盘)
  • 系统已禁止休眠(systemctl mask sleep/suspend/hibernate)

待执行方案

方案 A:USB 2.0 低速克隆(推荐,最稳妥)

# 使用 USB 2.0 线(55 MB/s,发热低,不会过热)
sudo dd if=/dev/nvme0n1 of=/dev/sdb bs=4M status=progress conv=fsync
# 预计耗时:~10 小时(挂过夜)
  • 优点:发热量低,不会触发过热断连
  • 缺点:慢,需要 ~10 小时
  • 建议:晚上开始,第二天早上完成

方案 B:USB 3.0 分段写入(推荐,兼顾速度和稳定性)

硬盘盒在 USB 3.0 高速写入 ~500GB 后必然过热断连。将 2TB 分成 4 段,每段 ~465GB,中间拔掉硬盘盒冷却后再继续。

原理: dd 的 skip(读偏移)和 seek(写偏移)参数可以指定从哪里开始,每段独立执行,互不依赖。

计算:

  • 总容量:2,000,398,934,016 字节
  • bs=64M = 67,108,864 字节
  • 总块数:29,808
  • 分 5 段,每段块数:5,961(~381GB,远低于过热临界点 ~500GB)
# 第 1 段: 0 - 381GB
sudo dd if=/dev/nvme0n1 of=/dev/sdX bs=64M status=progress conv=fsync count=5961
 
# ——— 拔掉硬盘盒,冷却 5-10 分钟,重新插入 ———
# ——— 插入后执行 lsblk 确认设备名(可能变为 sdc/sdd)———
 
# 第 2 段: 381GB - 762GB
sudo dd if=/dev/nvme0n1 of=/dev/sdX bs=64M status=progress conv=fsync skip=5961 seek=5961 count=5961
 
# ——— 拔掉硬盘盒,冷却 5-10 分钟,重新插入 ———
 
# 第 3 段: 762GB - 1144GB
sudo dd if=/dev/nvme0n1 of=/dev/sdX bs=64M status=progress conv=fsync skip=11922 seek=11922 count=5961
 
# ——— 拔掉硬盘盒,冷却 5-10 分钟,重新插入 ———
 
# 第 4 段: 1144GB - 1525GB
sudo dd if=/dev/nvme0n1 of=/dev/sdX bs=64M status=progress conv=fsync skip=17883 seek=17883 count=5961
 
# ——— 拔掉硬盘盒,冷却 5-10 分钟,重新插入 ———
 
# 第 5 段: 1525GB - 2000GB(到末尾)
sudo dd if=/dev/nvme0n1 of=/dev/sdX bs=64M status=progress conv=fsync skip=23844 seek=23844

注意事项:

  • 每次插回后必须用 lsblk 确认设备名和型号,设备名可能漂移(sdb→sdc→sdd)
  • sdX 替换为实际识别到的设备名
  • 每段约 381GB,按 400MB/s 约 16 分钟完成
  • 中间拔出冷却完全安全,skip/seek 保证数据精确对位
  • 5 段全部完成后,效果等同于一次性全盘 dd

优点:

  • 每段写入量 381GB,远低于过热临界点(~500GB),安全裕量充足
  • USB 3.0 高速,总克隆时间约 80-100 分钟(含冷却时间)
  • 比 USB 2.0 跑 10 小时快得多

方案 C:拆开硬盘盒强化散热

  • 拆掉硬盘盒外壳,让 NVMe SSD 裸露
  • 贴导热硅脂垫 + 风扇直吹芯片
  • 再次用 USB 3.0 线尝试(如果温度控制住,~1.5 小时完成)

方案 D:Clonezilla(只复制已用扇区)

  • 只复制 1.7TB 已用数据(vs dd 复制全部 2TB)
  • 减少约 15% 写入量,可能刚好避开过热临界点
  • 需要制作 Clonezilla 启动 U 盘,从 Live 环境操作

克隆完成后的收尾步骤

# 1. 关机,将新盘从硬盘盒取出装入主板 NVMe 插槽
# 2. 开机进 BIOS,确认启动项为新盘
# 3. 正常启动后执行 TRIM:
sudo fstrim -av
# 4. 恢复休眠功能:
sudo systemctl unmask sleep.target suspend.target hibernate.target hybrid-sleep.target
# 5. 验证:
lsblk
df -h
uname -a

一、当前系统概况

项目信息
系统Ubuntu 24.04.2 LTS (Noble Numbnut)
内核6.8.0-40-generic x86_64
CPUIntel Core i7-10700K @ 3.80GHz
内存64GB
引导方式UEFI + GPT
当前硬盘Kingston SNVS2000G 2TB NVMe (PCIe 3.0, 无DRAM缓存, SM2263XT 主控)
分区布局p1=512MB EFI (vfat), p2=1.8TB 根分区 (ext4)
已用空间1.7TB (98%)
逻辑扇区大小512B
NVMe 槽位仅 1 个 (PCIe slot 03:00.0)
引导项/EFI/UBUNTU/SHIMX64.EFI

二、硬件限制分析

主板仅有 1 个 NVMe M.2 插槽,无法同时安装两块 NVMe SSD。

解决方案:USB-to-NVMe 硬盘盒

  • 推荐芯片:RTL9210B、JMS583、ASM2362(Linux 兼容性好)
  • 接口:USB 3.1 Gen2 (10Gbps),实际写入约 800-1000 MB/s
  • 价格:约 50-150 元
  • 注意:必须带散热片,2TB 连续写入发热严重

三、方案对比

方案复制量耗时难度可否 Live 操作换盘后直接启动风险
Clonezilla1.7TB (已用)50-80min不可以
dd2TB (全盘)70-90min极低不推荐
partclone1.7TB (已用)50-75min不推荐需手动处理
rsync+chroot1.7TB (文件)2-3h可以需重装GRUB中高
Rescuezilla1.7TB (已用)50-80min极低不可以

四、推荐方案:Clonezilla Live USB(首选)

4.1 为什么选 Clonezilla

  • 全盘克隆(分区表 + EFI引导 + UUID),换盘后零配置直接启动
  • 只复制已使用扇区(1.7TB),比 dd 快
  • 离线操作,不存在数据不一致风险
  • 同容量盘不需要修改 UUID/fstab/grub

4.2 准备工作

  1. NVMe USB 硬盘盒

    • M.2 NVMe 接口(不是 SATA M.2)
    • USB 3.1 Gen2 或更高
    • 推荐芯片:RTL9210B
    • 带散热片或额外准备散热风扇
  2. U 盘(>= 2GB)用于制作 Clonezilla 启动盘

  3. 新的 2TB NVMe SSD

  4. 下载 Clonezilla Live ISO

4.3 制作 Clonezilla 启动 U 盘

# 方法一:dd 直接写入
sudo dd if=clonezilla-live-x.x.x-amd64.iso of=/dev/sdX bs=4M status=progress
sudo sync
 
# 方法二:使用 Ventoy(推荐,U 盘可同时放多个 ISO)
# 安装 Ventoy 到 U 盘,然后将 ISO 文件直接拷贝进去即可

4.4 克隆操作步骤

前置确认:
━━━━━━━━━━
1. 新 SSD 装入 USB 硬盘盒,连接电脑
2. 确认系统识别到新盘:
   lsblk  # 应该能看到一个新的 sda 或 sdb 设备
3. 确认扇区大小一致:
   cat /sys/block/nvme0n1/queue/logical_block_size  # 应为 512
   cat /sys/block/sda/queue/logical_block_size       # 应为 512
4. 确认盘容量一致:
   lsblk -b | grep -E "nvme0n1 |sda "  # 字节数应相同或新盘更大

克隆操作:
━━━━━━━━━━
5. 从 Clonezilla U 盘启动电脑
6. 语言选择:简体中文或English
7. 键盘布局:默认即可
8. 启动模式:Start Clonezilla
9. 选择模式:device-device(磁盘/分区 到 磁盘/分区)
10. 选择:Expert 模式(专家模式)
11. 操作类型:disk_to_local_disk(整盘对拷)
12. 源盘选择:nvme0n1(当前系统盘)
13. 目标盘选择:sda(USB 硬盘盒中的新盘)
14. 高级参数:
    - 勾选 -icds(忽略磁盘容量检查,防止微小容量差异报错)
    - 勾选 -sfsck(跳过文件系统检查,节省时间)
    - 其他保持默认
15. 确认操作 → 开始克隆
16. 等待完成(约 50-80 分钟)

换盘操作:
━━━━━━━━━━
17. 克隆完成 → 关机
18. 拔掉 USB 硬盘盒
19. 拆下旧 NVMe SSD
20. 将新 SSD 从硬盘盒中取出,装入主板 NVMe 插槽
21. 开机 → 进 BIOS → 确认启动项为新盘
22. 正常启动 Ubuntu

启动后收尾:
━━━━━━━━━━
23. 执行 TRIM(让 SSD 控制器识别空闲块):
    sudo fstrim -av
24. 确认一切正常:
    lsblk
    df -h
    uname -a

五、备选方案:dd 全盘克隆

适合不想下载 Clonezilla 的情况,使用 Ubuntu Live USB 启动后操作。

5.1 步骤

# 1. 从 Ubuntu Live USB 启动(不是安装,选 Try Ubuntu)
 
# 2. 确认设备
lsblk
# 源盘: /dev/nvme0n1 (主板上的旧盘)
# 目标: /dev/sda (USB 硬盘盒中的新盘)
 
# 3. 全盘克隆
sudo dd if=/dev/nvme0n1 of=/dev/sda bs=64M status=progress conv=fsync
 
# 4. 确认数据写入完成
sudo sync
sudo partprobe /dev/sda
 
# 5. 关机 → 换盘 → 启动

5.2 dd 与 Clonezilla 区别

ddClonezilla
复制内容全部扇区(含空白)仅已使用扇区
2TB 盘耗时70-90 分钟50-80 分钟
是否需要安装不需要(系统自带)需要制作启动盘
中断后能否续传不能不能
分区大小调整不支持支持

六、方案三:rsync + chroot 文件级迁移

适合不想重启、想在运行中的系统上操作的场景。步骤复杂,但灵活性最高。

6.1 步骤

# 1. 连接新盘(USB 硬盘盒),确认设备名
lsblk  # 假设为 /dev/sda
 
# 2. 对新盘分区(与源盘布局一致)
sudo gdisk /dev/sda
# 创建:
#   分区1: 512MB, 类型 EF00 (EFI System)
#   分区2: 剩余空间, 类型 8300 (Linux filesystem)
 
# 3. 格式化
sudo mkfs.vfat -F 32 /dev/sda1
sudo mkfs.ext4 /dev/sda2
 
# 4. 挂载新盘
sudo mkdir -p /mnt/newdisk
sudo mount /dev/sda2 /mnt/newdisk
sudo mkdir -p /mnt/newdisk/boot/efi
sudo mount /dev/sda1 /mnt/newdisk/boot/efi
 
# 5. rsync 复制所有文件(首次全量,约 2-3 小时)
sudo rsync -aAXHv --info=progress2 \
  --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found","/swapfile"} \
  / /mnt/newdisk/
 
# 6. 创建必要的空目录
sudo mkdir -p /mnt/newdisk/{dev,proc,sys,tmp,run,mnt,media}
sudo chmod 1777 /mnt/newdisk/tmp
 
# 7. chroot 到新系统安装引导
sudo mount --bind /dev /mnt/newdisk/dev
sudo mount --bind /dev/pts /mnt/newdisk/dev/pts
sudo mount --bind /proc /mnt/newdisk/proc
sudo mount --bind /sys /mnt/newdisk/sys
sudo mount --bind /sys/firmware/efi/efivars /mnt/newdisk/sys/firmware/efi/efivars
sudo chroot /mnt/newdisk
 
# 8. 在 chroot 中更新 fstab
blkid  # 记录新分区的 UUID
nano /etc/fstab  # 将所有 UUID 替换为新盘的 UUID
 
# 9. 重新安装 GRUB
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu
update-grub
 
# 10. 退出并卸载
exit
sudo umount -R /mnt/newdisk
 
# 11. 换盘前可做一次增量同步(减少停机数据差异)
# 重复步骤 4-5,rsync 会只传输差异部分(几分钟内完成)

6.2 优缺点

  • 优点:可以在运行中操作;支持增量同步;新盘是干净文件系统
  • 缺点:步骤多,fstab/grub 需手动处理;出错可能导致新盘无法启动

七、重要注意事项

7.1 USB 硬盘盒选购要点

要求说明
接口协议NVMe(不是 SATA)
USB 版本3.1 Gen2 (10Gbps) 或更高
主控芯片RTL9210B > JMS583 > ASM2362
散热必须有铝合金外壳或散热片
兼容性确认支持 Linux(部分杂牌在 Linux 下不识别)

7.2 扇区大小必须一致

# 克隆前必须确认两块盘的逻辑扇区大小一致
cat /sys/block/nvme0n1/queue/logical_block_size  # 源盘
cat /sys/block/sda/queue/logical_block_size       # 目标盘(USB)
 
# 如果不一致(一个512一个4096),dd/Clonezilla 克隆后可能无法启动
# 解决:换一个不做扇区翻译的硬盘盒,或使用 rsync 方案

7.3 容量差异问题

# 确认两块盘字节级容量
lsblk -b | grep disk
 
# "同为 2TB" 的两块盘实际字节数可能略有差异
# 如果新盘 >= 旧盘:dd/Clonezilla 直接可用
# 如果新盘 < 旧盘(哪怕差 1 个扇区):dd 会报错
#   解决:Clonezilla expert 模式勾选 -icds 参数
#   或:rsync 方案不受此限制

7.4 Kingston NV2 特殊注意

  • 无 DRAM 缓存,SLC 缓存耗尽后写入速度可能降至 200-500MB/s
  • 克隆过程中如果发现速度突然下降是正常现象,耐心等待即可
  • 克隆完成后务必执行 sudo fstrim -av

7.5 克隆完成后如果无法启动

# 排查步骤:
# 1. 进 BIOS 检查启动项是否指向新盘
# 2. 如果 BIOS 看不到新盘的 EFI 启动项:
#    - 从 Ubuntu Live USB 启动
#    - sudo mount /dev/nvme0n1p2 /mnt
#    - sudo mount /dev/nvme0n1p1 /mnt/boot/efi
#    - sudo chroot /mnt
#    - grub-install --target=x86_64-efi --efi-directory=/boot/efi
#    - update-grub
#    - exit && reboot
 
# 3. 如果报 UUID 不匹配(极少见于同容量克隆):
#    - 检查 /etc/fstab 中的 UUID 是否与 blkid 输出一致

八、操作时间线规划

Day 0 - 购买准备:
  □ 购买 NVMe USB 硬盘盒(RTL9210B 芯片)
  □ 购买新 2TB NVMe SSD
  □ 准备 U 盘(>= 2GB)
  □ 下载 Clonezilla Live ISO
  □ 制作 Clonezilla 启动 U 盘

Day 1 - 执行迁移(预留 2 小时):
  □ 新 SSD 装入硬盘盒,连接电脑
  □ 确认新盘被识别且扇区大小一致
  □ 从 Clonezilla U 盘启动
  □ disk-to-disk 克隆(~1 小时)
  □ 关机,换盘
  □ 开机验证
  □ 执行 fstrim

Day 2+ - 旧盘处理:
  □ 旧盘可装入 USB 硬盘盒作为备份/移动存储
  □ 或格式化后作为额外存储使用

九、总结

对于”换盘即用”的需求,Clonezilla 或 dd 是最佳选择。 同容量盘全盘克隆后,分区表、UUID、EFI 引导完全一致,物理换盘后无需任何额外配置,开机就能继续办公。

推荐优先级:Clonezilla > dd > Rescuezilla > rsync