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 min | 455 MB/s | DID_NO_CONNECT + 设备名漂移 sdb→sdc |
| 第 2 次 | 557 GB | ~62 min | 149 MB/s | DID_NO_CONNECT + 写入失败 |
| 第 3 次 | 570 GB | ~31 min | 305 MB/s | DID_NO_CONNECT + 写入失败 |
| 第 4 次 | 136 GB | ~5 min | 422 MB/s | DID_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 |
| CPU | Intel 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 操作 | 换盘后直接启动 | 风险 |
|---|---|---|---|---|---|---|
| Clonezilla | 1.7TB (已用) | 50-80min | 低 | 不可以 | 是 | 低 |
| dd | 2TB (全盘) | 70-90min | 极低 | 不推荐 | 是 | 中 |
| partclone | 1.7TB (已用) | 50-75min | 中 | 不推荐 | 需手动处理 | 中 |
| rsync+chroot | 1.7TB (文件) | 2-3h | 高 | 可以 | 需重装GRUB | 中高 |
| Rescuezilla | 1.7TB (已用) | 50-80min | 极低 | 不可以 | 是 | 低 |
四、推荐方案:Clonezilla Live USB(首选)
4.1 为什么选 Clonezilla
- 全盘克隆(分区表 + EFI引导 + UUID),换盘后零配置直接启动
- 只复制已使用扇区(1.7TB),比 dd 快
- 离线操作,不存在数据不一致风险
- 同容量盘不需要修改 UUID/fstab/grub
4.2 准备工作
-
NVMe USB 硬盘盒
- M.2 NVMe 接口(不是 SATA M.2)
- USB 3.1 Gen2 或更高
- 推荐芯片:RTL9210B
- 带散热片或额外准备散热风扇
-
U 盘(>= 2GB)用于制作 Clonezilla 启动盘
-
新的 2TB NVMe SSD
-
下载 Clonezilla Live ISO
- 官网:https://clonezilla.org/downloads.php
- 选择 stable 版本,amd64 架构,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 区别
| dd | Clonezilla | |
|---|---|---|
| 复制内容 | 全部扇区(含空白) | 仅已使用扇区 |
| 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