博客服务器的系统盘用的是块 120G 的老 SSD,最近 SMART 报了几个重映射扇区,趁它没死赶紧换块新盘。不想重装系统重配环境(懒是第一生产力),研究了一下不重装的迁移方案,实操成功,记录如下。
方案选择
查了三条路:
- dd 整盘克隆:最无脑,但要求新盘不小于旧盘,而且是扇区级复制,旧盘的坏扇区错误也会一并带走
- rsync 按文件复制:文件级复制,可校验,坏扇区对应的文件读不出来会报错(顺便暴露问题文件)
- 重装 + 恢复备份:最干净,但服务太多,配环境至少一天
选了 rsync 方案。整个过程:新盘装个最小系统 → 挂载 → rsync 全量同步 → 更新引导 → 换盘启动。
实操步骤
1. 新盘装最小化系统,分区规划好(我趁机把 /data 单独分了个区,LVM 也用上了,之前裸分区没得扩)。启动进新系统,把旧盘挂载到 /mnt/old。
2. rsync 同步,排除新系统自己的运行时目录:
rsync -aHAXv --numeric-ids --exclude=/proc/* --exclude=/sys/* --exclude=/dev/* --exclude=/mnt/* --exclude=/tmp/* --exclude=/run/* /mnt/old/ /
参数解释:-a 归档模式保留权限时间戳,-H 保留硬链接(Docker 的 overlay 存储全是硬链接,丢了它镜像全废),-A 保留 ACL,-X 保留扩展属性,--numeric-ids 防止用户名 uid/gid 对不上。跑完 diff 抽查了几个目录,确认同步完整。
3. 修引导和文件系统表。最容易翻车的环节:/etc/fstab 里的 UUID 还是旧盘的,得 blkid 查新盘各分区 UUID 改掉,不然启动卡 emergency mode。然后重装 grub 并刷新 initramfs:
grub-install /dev/sda
grub-mkconfig -o /boot/grub/grub.cfg
4. 拔旧盘,新盘启动。一次点亮的瞬间还是很爽的。所有服务自拉起,博客、几个容器、定时任务全部正常。
几个提醒
- 旧盘别急着格,挂机跑一周确认没问题再处理。我的旧盘现在还挂在机器上当临时备份盘
- SSH 的主机密钥也跟着迁过去了,客户端不会报警告;如果你重装系统则会提示 host key 变化,别慌
- 迁移前先做一次完整备份(感谢去年自己搭的备份体系,这次全程有兜底),重要操作前有备份和没有备份,心态完全两个世界
- 同步完记得对比 crontab、systemd 自定义单元这些容易漏的零碎(rsync 会带上,但新系统的 minimal 安装里有些服务要 re-enable)
全程大约三小时,其中两小时在等 rsync。比起重装+重配省了一天多,而且环境零变化,风险反而更小。老盘那几个重映射扇区提醒得及时——数据无价,监控别只看 CPU 和流量,SMART 也要看。

Comments 4 条评论
rsync 比 dd 好,坏扇区能暴露出来
忘了 -H 硬链接会把 Docker 镜像废掉
SMART 监控确实容易被忽略
顺手把 /data 单独分区,学了一招