发布时间:2026-09-23 05:01 更新时间:2026-09-23 05:01 阅读量:0
服务器要换硬盘,但公网 IP 必须保留——这种场景很常见:老盘是机械盘或小容量 SSD,读写已经跟不上;或者系统盘快写满,想整盘换成 NVMe,可业务绑定了固定 IP,换 IP 会牵动备案、CDN 回源、白名单和域名解析,代价太大。解决办法是把数据从旧盘复制到新盘,IP 和网络配置保持不变,中间只留一个尽量短的停机窗口做终同步和切换。
下面按“准备 → 增量同步 → 停机切换 → 验证回滚”的顺序讲清楚每一步该敲什么、要注意什么。文中命令以常见的 Linux(CentOS/Ubuntu/Debian)为例,路径、用户名、网卡名请按实际环境替换,具体行为以各命令官方文档为准。
先把新硬盘接到服务器上(或走云厂商的挂载/扩容流程),分区、格式化、挂到临时目录,例如 /mnt/newdisk。确认文件系统类型和旧盘一致,避免 ext4 与 xfs 之间混用带来的挂载与权限差异。用 lsblk、df -hT 核对设备名和容量,别把数据写错盘。
第一次同步之前,建议先做一次“预同步”,把绝大部分数据先搬过去,把真正的停机时间压缩到只同步差异部分。rsync 的关键参数是 -a(归档,保留权限、时间、软链接等)、-H(保留硬链接)、-A(保留 ACL)、-X(保留扩展属性)、--delete(删除目标端多余文件,使两边一致)、-P(显示进度并支持断点续传)。硬盘对硬盘、同机复制时用本地路径即可,不必走 ssh。
# 挂载新盘并创建目标目录
mkdir -p /mnt/newdisk
mount /dev/nvme0n1p1 /mnt/newdisk
首次全量预同步(排除虚拟文件系统与缓存类目录)
rsync -aHAX --delete --numeric-ids \
--exclude={'/proc','/sys','/dev','/run','/tmp','/mnt','/lost+found'} \
/ /mnt/newdisk/ \
--exclude={'/var/cache/yum','/var/lib/mysql/ib_logfile*'} \
--info=progress2
需要提醒的是,/etc/fstab、网卡配置、GRUB 引导这些和“盘”强相关的东西,复制过去后往往还要在新盘上重新生成或修正(例如 UUID 变了、网卡名可能因硬件变化而改变)。所以不要把它当成简单的文件拷贝,而是当成一次系统盘迁移,引导部分单独处理,具体以你所用的发行版和引导方式(BIOS/UEFI)为准。
如果服务器上跑着 MySQL/MariaDB,预同步阶段可以先不排掉数据目录,但终同步前要让数据库停机或锁表,否则拷贝到的是“撕裂”的数据文件,起库容易报错。更稳妥的思路是:数据库用 mysqldump 或 xtrabackup 单独导出导入,文件层用 rsync 搬站点目录和配置。
真正需要停机的时间,取决于“预同步之后又改了多少数据”。所以预同步要尽量贴近切换时间点,间隔越短,终同步越快。切换当天按这个顺序走,每一步都能停下来检查:
# 1. 停掉对外服务,阻止新的写入
systemctl stop nginx php-fpm mysqld
2. 确认没有进程还在占用被同步目录
lsof +D /var/www 2>/dev/null | head
3. 终同步:只传差异,--delete 保证两边完全一致
rsync -aHAX --delete --numeric-ids --info=progress2 \
--exclude={'/proc','/sys','/dev','/run','/tmp','/mnt','/lost+found'} \
/ /mnt/newdisk/
4. 同步后立刻比对文件数量与关键目录大小
rsync -aHAXn --delete --numeric-ids / /mnt/newdisk/ | head
find /var/www -type f | wc -l
find /mnt/newdisk/var/www -type f | wc -l
第 4 步里的 -n 是 dry-run,只列出差异不实际改动,输出为空(或只有你明确排除了的项)基本说明两边一致了。文件数、目录大小对不上时不要往下走,先查是权限、软链接还是排除规则造成的差异。
数据一致后,把新盘变成启动盘并保留原 IP。做法通常是修改引导配置指向新盘,或把旧盘摘掉、新盘设为首选启动设备,然后在系统里核对网络配置:IP、网关、DNS、路由都要和原来一样。网卡配置文件(如 /etc/sysconfig/network-scripts/ifcfg-* 或 Netplan 的 yaml)如果因硬件变化名字改了,记得同步改回来。重启后先用 ip a、ip route 确认地址没变,再启动服务:
# 启动服务并检查端口监听
systemctl start mysqld php-fpm nginx
ss -lntp | grep -E ':80|:443|:3306'
本机自测,确认站点返回正常
curl -I http://127.0.0.1/
curl -I -H 'Host: www.example.com' http://127.0.0.1/
外网验证时,从另一台机器访问域名或直接访问该 IP,确认解析、证书、页面内容都正常,再检查日志有没有因为权限或路径变化而报错。数据库如果单独迁移过,还要核对账号权限、字符集与只读状态。
换硬盘的风险点在于“新盘起不来又回不到旧盘”。所以切换前不要格式化或拔掉旧盘,保留它作为回滚副本,直到新盘稳定运行若干天。回滚的本质很简单:把启动设备改回旧盘,重新挂载并启动服务,数据退回切换前的时间点。因此切换前要记下旧盘的设备名、引导项顺序,并确认旧盘的系统仍然可引导。
为降低回滚时的数据损失,切换后如果发现新盘有问题,应尽快决定回滚,避免新盘上产生大量新数据导致回退代价变大。若确实需要把新盘数据带回旧盘,同样可以用 rsync 反向同步,方向反过来即可,注意 --delete 的方向别写反。
收尾清单可以按这几项过一遍:服务开机自启是否正常(systemctl is-enabled)、计划任务/定时备份是否还指向正确路径、日志切割与磁盘告警是否生效、监控是否能连上、证书自动续期任务能否执行。确认无误后再择机处理旧盘,比如留作冷备或按流程回收。整个过程中,IP 不变并不等于零风险,真正的安全垫是“旧盘还在、命令可复制、步骤可回退”。把预同步做扎实,停机窗口就能压到几分钟,切换和回滚也就都有了底气。
| 📑 | 📅 |
|---|---|
| WordPress站点健康提示REST API出错:loopback请求失败逐项排查 | 2026-09-23 |
| Nginx 413 上传被拦:client_max_body_size 与多层限制联动排查 | 2026-09-23 |
| 换服务器后百度收录掉了:改IP前后的抓取诊断与sitemap动作 | 2026-09-22 |
| 服务器只开80/443:SSH端口转发访问面板与数据库 | 2026-09-22 |
| WordPress数据库utf8转utf8mb4:emoji问号的处理步骤 | 2026-09-22 |
| 网站备案主体与接入商变更:新增接入、注销重备顺序与访问影响 | 2026-09-23 |
| 宝塔新建站点403 Forbidden:权限位、属主与open_basedir三重排查 | 2026-09-23 |
| WordPress后台自动更新失败:权限、FTP常量与目录属主逐项定位 | 2026-09-23 |
| 宝塔面板SSL证书手动替换:证书链、私钥校验与reload排查 | 2026-09-23 |
| 网站切HTTPS后百度统计没数据:referrer、混合内容与代码位置排查 | 2026-09-23 |