⚠️注:此方案适用于物理机 / 自建虚拟机 / 非云主机(无镜像功能)–>使用 rsync 全盘同步(推荐,可不停机)或 dd 磁盘克隆
云服务器(阿里云 / 腾讯云 / 华为云等) 利用平台自带自定义镜像功能,最简单、零出错 1.旧服务器创建系统盘 + 数据盘完整镜像 2.使用该镜像直接创建 / 重装新服务器 3.新服务器修改 IP、网关、DNS,重启服务验证 4.核对端口、进程、网站、数据库、定时任务全部正常
当前为远程连接只能通过 SSH 远程连接两台 CentOS 服务器,无法使用物理 U 盘或启动盘。方案是使用 rsync 进行文件级别的全量同步,配合软件包列表同步和引导修复。⚠️注意:此操作有风险,务必先在旧服务器做好完整备份,并在新服务器上保留救援模式或快照
1. 环境
2. 服务器基本信息
网卡信息 旧服务器
新服务器
3. 整体思路
在新服务器上安装与旧服务器相同版本的 CentOS(最小化安装即可,分区建议保持一致)。
将旧服务器上的所有文件(除 /proc、/sys、/dev、/tmp 等运行时目录外)通过 rsync 复制到新服务器,覆盖对应位置。
在新服务器上重新安装 GRUB 引导、生成新的 fstab(基于新磁盘的 UUID)、调整网络配置为新 IP。
重启新服务器,验证所有服务。
4. 操作步骤
4.1 准备工作记录旧服务器关键信息
在旧服务器(192.168.147.139)
先查看基本信息
# 1. 基本信息cat /etc/redhat-release # CentOS 版本uname -r # 内核版本hostnamectl # 主机名ip addr show # 网卡名和IP# 2. 磁盘布局lsblk -f # 磁盘、分区、文件系统类型、UUIDdf -h # 挂载点和磁盘用量cat /etc/fstab # 挂载配置(关键!)# 3. 有哪些服务在跑systemctl list-units --type=service --state=running # 正在运行的服务ss -tlnp # 监听的端口# 4. 开机自启的服务(迁移后要原样恢复)systemctl list-unit-files --state=enabled | grep service# 5. 防火墙规则(CentOS 大概率用 firewalld 或 iptables)iptables-save > /root/iptables-backup.txtfirewall-cmd --list-all 2>/dev/null# 6. 数据总量,预估传输时长du -sh / --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/run --exclude=/tmp 2>/dev/null



执行以下命令,保存输出到本地文件备用。
# 磁盘分区与文件系统信息lsblk -f# 已安装的软件包列表rpm -qa --qf "%{NAME}.%{ARCH}\n" | sort > old_packages.txt# 网络配置(网卡名、IP、掩码、网关、DNS)ip addr showcat /etc/sysconfig/network-scripts/ifcfg-*# fstab 内容cat /etc/fstab# 当前内核版本uname -r
4.2 在新服务器上安装基础系统
保证新服务器(192.168.147.142)已安装与旧服务器相同版本的 CentOS(如都是 CentOS 7.9)。
分区布局尽量与旧服务器一致(例如 /、/boot、/home 等的大小和位置可以不同,但文件系统类型最好相同)。
确保新服务器的 root 密码已知,SSH 服务正常。
4.3 同步旧服务器的软件包(确保软件环境一致)
在新服务器上,根据 old_packages.txt 安装缺失的软件包(注意处理版本差异):
# 先将 old_packages.txt 复制到新服务器(可将old_packages.txt手动复制过去)scp root@192.168.147.139:/root/old_packages.txt /root/# 在新服务器上生成当前已安装的包列表rpm -qa --qf "%{NAME}.%{ARCH}\n" | sort > new_packages.txt# 找出旧服务器有而新服务器没有的包comm -23 old_packages.txt new_packages.txt > missing.txt# 安装缺失的包(注意:可能因仓库差异导致版本不匹配,需手动处理)yum install -y $(cat missing.txt) # CentOS 7 用 yum,8+ 用 dnf# 如果安装慢替换 CentOS7 国内阿里云镜像源mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bakcurl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repoyum clean allyum makecache# 配置 epel 源yum install -y epel-releaseyum clean all && yum makecache
4.4 使用 rsync 同步所有文件(核心步骤)
rsync前确认哪些服务需要先停掉
systemctl stop mysqld mariadb postgresql httpd nginx tomcat redis 2>/dev/null
在旧服务器上执行以下 rsync 命令,将整个根目录推送到新服务器(注意排除特殊目录):
rsync -avxHAX --numeric-ids --delete --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} / root@192.168.147.142:/
参数说明: -a:归档模式,保留权限、时间等 -v:详细输出 -x:不跨越文件系统(避免复制 /proc 等) -H:保留硬链接 -A:保留 ACL -X:保留扩展属性 --numeric-ids:保留数字化的 uid/gid --delete:删除新服务器上旧服务器不存在的文件(实现完全同步) --exclude:排除系统运行时目录
⚠️ 注意:这个命令会覆盖新服务器上的所有文件,请确保新服务器上没有重要数据。建议提前对新服务器做快照或备份。
同步过程可能很长,建议使用 screen 或 tmux 防止断开。
5. 迁移后的配置调整(在新服务器上操作)
5.1 调整 /etc/fstab
由于磁盘的 UUID 可能改变,需要根据新服务器的实际分区重新生成 fstab。
# 查看新磁盘的 UUIDblkid# 编辑 /etc/fstab,将原来的 UUID 替换为新的 UUID,或者改用设备名(如 /dev/sda1)vi /etc/fstab
执行以下命令修正(和上面的相同只是详细说明了一下):
# 查看新磁盘的 UUIDblkid# 备份原 fstabcp /etc/fstab /etc/fstab.bak# 查看fstabcat /etc/fstab# vi 打开fstab替换UUIDvi /etc/fstab# 或使用 sed 命名将正确的 UUID 进行替换(使用 sed )sed -i 's/UUID=<旧uuid>/UUID=<执行 blkid 后/dev/sda1: UUID=xxx>/' /etc/fstab# 确认修改结果cat /etc/fstab
额外检查:旧服务器上是否还有其他挂载点(如 /home、/var 等独立分区)?如果有,请把旧服务器的 /etc/fstab 内容复制过来,并相应替换为新磁盘的 UUID。 可以从旧服务器查看
# 旧服务器ssh root@192.168.147.139 cat /etc/fstab
5.2 重新安装 GRUB 引导
# 系统盘为 /dev/sda(根据实际情况修改)grub2-install /dev/sda# 出现done即成功grub2-mkconfig -o /boot/grub2/grub.cfg
如果提示错误,可能需要先挂载 /boot(已同步过来的文件应该是对的)。可以 chroot 修复:
mount --bind /dev /mnt/devmount --bind /proc /mnt/procmount --bind /sys /mnt/syschroot /mntgrub2-install /dev/sdagrub2-mkconfig -o /boot/grub2/grub.cfgexit
5.3 修正网络配置
将新服务器的 IP 改为 192.168.147.143,没有被占用的IP(如果同步后配置文件还是旧的 .139,需要修改)。
# 先查看网卡配置是否为旧的 .139vi /etc/sysconfig/network-scripts/ifcfg-ens33 # 或你的网卡名
如果是旧的 .139修改以下:
OXY_METHOD="none"BROWSER_ONLY="no"BOOTPROTO="static" DEFROUTE="yes"IPV4_FAILURE_FATAL="no"# IPV6 相关可以注释掉(不需要 IPv6 就注释)# IPV6INIT="yes"# IPV6_AUTOCONF="yes"# IPV6_DEFROUTE="yes"# IPV6_FAILURE_FATAL="no"# IPV6_ADDR_GEN_MODE="stable-privacy"NAME="ens33"UUID="3b2ed340-cb50-430b-8e0b-c5d4e02ddb23" DEVICE="ens33"ONBOOT="yes"# 新增静态 IP 配置IPADDR=192.168.147.143NETMASK=255.255.255.0GATEWAY=192.168.147.2 DNS1=114.114.114.114 ------------------------------ 用下面的 ------------------------------------OXY_METHOD="none"BROWSER_ONLY="no"BOOTPROTO="static" # 原来可能是dhcp,改为 staticDEFROUTE="yes"IPV4_FAILURE_FATAL="no"NAME="ens33"UUID="3b2ed340-cb50-430b-8e0b-c5d4e02ddb23" # 保持不变DEVICE="ens33"ONBOOT="yes"# 新增静态 IP 配置IPADDR=192.168.147.143NETMASK=255.255.255.0GATEWAY=192.168.147.2 # 根据实际情况确认网关DNS1=114.114.114.114 # DNS
修改网络后如果ssh连接断开了。将连接IP修改为新IP后重连 关于网关:如果不确定旧服务器的网关,可以先在旧服务器上查看:
ssh root@192.168.147.139 "ip route | grep default"
一般会是 192.168.147.1 或 192.168.147.254,请核实后填写
重启网络服务(使配置生效),这里先不要重启网络
systemctl restart network
先测试配置是否正确
ifup ens33ip addr show ens33 # 检查 IP 是否已设置为 192.168.147.143
5.4 重置系统唯一标识(避免冲突)
# 删除 SSH 主机密钥(重启后自动生成)rm -f /etc/ssh/ssh*host*\*# 删除 udev 网络规则(使新网卡配置生效)rm -f /etc/udev/rules.d/70-persistent-net.rules# 重置 machine-idrm -f /etc/machine-id /var/lib/dbus/machine-idsystemd-machine-id-setup # CentOS 7 需安装 systemd 工具
5.5 重新生成 initramfs(如果内核版本有变化)
6. 重启新服务器并验证
重启后,通过 SSH 连接到新 IP 192.168.147.143,进行以下检查:
网络连通性:ping 192.168.147.139 和 ping baidu.com
关键服务:systemctl status httpd、systemctl status mysqld 等(根据旧服务器业务)
用户数据:ls /home、ls /var/www 等
日志错误:journalctl -xe 或 dmesg | grep -i error
新服务器上的服务正常运行
测试系统正常访问
网关设置错误:检查网关是否可达,可以从旧服务器 ping 新 IP(但迁移完成后旧服务器可能还在线,注意 IP 冲突)。IP 地址冲突:确保新 IP 192.168.147.143 没有被其他设备占用。可以暂时关闭旧服务器(或拔网线)测试。SELinux 阻止 ssh:通过 VNC 登录后执行 setenforce 0 临时关闭。防火墙:执行 systemctl stop firewalld 测试。你可以在重启前先执行 ping 192.168.147.2 测试网关连通性(但此时 IP 还未改,是 DHCP 分配的旧 IP,无影响)。建议先按步骤完成,有问题再反馈