服务器换系统盘:不重装的迁移方案

Cold 发布于 2026-08-15 60 次阅读 755 字 预计阅读时间: 3 分钟 运维笔记


博客服务器的系统盘用的是块 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 也要看。

和喜欢的一切在一起~
最后更新于 2026-08-15