⚠️注:此方案适用于物理机 / 自建虚拟机 / 非云主机(无镜像功能)–>使用 rsync 全盘同步(推荐,可不停机)或 dd 磁盘克隆

云服务器(阿里云 / 腾讯云 / 华为云等)
利用平台自带自定义镜像功能,最简单、零出错
1.旧服务器创建系统盘 + 数据盘完整镜像
2.使用该镜像直接创建 / 重装新服务器
3.新服务器修改 IP、网关、DNS,重启服务验证
4.核对端口、进程、网站、数据库、定时任务全部正常

当前为远程连接只能通过 SSH 远程连接两台 CentOS 服务器,无法使用物理 U 盘或启动盘。方案是使用 rsync 进行文件级别的全量同步,配合软件包列表同步和引导修复。⚠️注意:此操作有风险,务必先在旧服务器做好完整备份,并在新服务器上保留救援模式或快照

1. 环境

  1. 旧服务器:192.168.147.139
  2. 新服务器:192.168.147.142

2. 服务器基本信息

网卡信息
旧服务器
在这里插入图片描述
新服务器
在这里插入图片描述

3. 整体思路

  1. 在新服务器上安装与旧服务器相同版本的 CentOS(最小化安装即可,分区建议保持一致)。

  2. 将旧服务器上的所有文件(除 /proc、/sys、/dev、/tmp 等运行时目录外)通过 rsync 复制到新服务器,覆盖对应位置。

  3. 在新服务器上重新安装 GRUB 引导、生成新的 fstab(基于新磁盘的 UUID)、调整网络配置为新 IP。

  4. 重启新服务器,验证所有服务。

4. 操作步骤

4.1 准备工作记录旧服务器关键信息

旧服务器(192.168.147.139)

先查看基本信息

# 1. 基本信息
cat /etc/redhat-release        # CentOS 版本
uname -r                       # 内核版本
hostnamectl                    # 主机名
ip addr show                   # 网卡名和IP

# 2. 磁盘布局
lsblk -f                       # 磁盘、分区、文件系统类型、UUID
df -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.txt
firewall-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 show
cat /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.bak
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache

# 配置 epel 源
yum install -y epel-release
yum 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。

# 查看新磁盘的 UUID
blkid

# 编辑 /etc/fstab,将原来的 UUID 替换为新的 UUID,或者改用设备名(如 /dev/sda1)
vi /etc/fstab

执行以下命令修正(和上面的相同只是详细说明了一下):

# 查看新磁盘的 UUID
blkid
# 备份原 fstab
cp /etc/fstab /etc/fstab.bak
# 查看fstab
cat /etc/fstab
# vi 打开fstab替换UUID
vi /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/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
chroot /mnt
grub2-install /dev/sda
grub2-mkconfig -o /boot/grub2/grub.cfg
exit

5.3 修正网络配置

将新服务器的 IP 改为 192.168.147.143,没有被占用的IP(如果同步后配置文件还是旧的 .139,需要修改)。

# 先查看网卡配置是否为旧的 .139
vi /etc/sysconfig/network-scripts/ifcfg-eth0 # 或你的网卡名

如果是旧的 .139修改以下几项:

OXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"          # 改为 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.143
NETMASK=255.255.255.0
GATEWAY=192.168.147.2        # 请根据实际情况确认网关
DNS1=114.114.114.114        # 或者你们公司内部的 DNS

----------------------------------------------------------------------------------------------------
OXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"          # 原来可能是dhcp,改为 static
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
NAME="ens33"
UUID="3b2ed340-cb50-430b-8e0b-c5d4e02ddb23"   # 保持不变
DEVICE="ens33"
ONBOOT="yes"
# 新增静态 IP 配置
IPADDR=192.168.147.143
NETMASK=255.255.255.0
GATEWAY=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 ens33
ip 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-id

rm -f /etc/machine-id /var/lib/dbus/machine-id

systemd-machine-id-setup # CentOS 7 需安装 systemd 工具

在这里插入图片描述

5.5 重新生成 initramfs(如果内核版本有变化)

dracut -f

6. 重启新服务器并验证

reboot

重启后,通过 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,无影响)。建议先按步骤完成,有问题再反馈
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐