一、迁移前规划
1.1 明确迁移类型
| 迁移类型 | 说明 | 难度 |
|---|
| 整盘迁移 | 完整复制整个磁盘(包括分区表、引导) | ⭐⭐⭐ |
| 系统迁移 | 只迁移根分区,重新安装引导 | ⭐⭐ |
| 数据迁移 | 只迁移数据和配置,重新安装系统 | ⭐ |
| 容器化迁移 | 将服务迁移到 Docker | ⭐⭐ |
1.2 信息收集
# ===== 系统信息 =====# 系统版本cat /etc/redhat-release # CentOS/RHELcat /etc/os-release # 通用# 内核版本uname -r# 架构uname -m# ===== 磁盘信息 =====# 分区情况fdisk -llsblk# 文件系统df -Th# 挂载点cat /etc/fstab# ===== 网络信息 =====# IP 地址ip addr show# 路由ip route show# DNScat /etc/resolv.conf# 主机名hostnamectl# ===== 服务信息 =====# 运行的服务systemctl list-units --type=service --state=running# 开机启动systemctl list-unit-files --state=enabled# ===== 用户信息 =====# 用户列表cat /etc/passwd# 组列表cat /etc/group# ===== 已安装软件 =====# CentOS/RHELrpm -qa | sort# Debian/Ubuntudpkg --get-selections | sort
1.3 迁移检查清单
- 源系统磁盘使用率 < 80%
- 目标虚拟机磁盘空间充足
- 网络连通性测试通过
- 备份空间充足(至少 2 倍数据量)
- 维护窗口已申请
- 相关人员已通知
- 回滚方案已准备
二、方案一:rsync 增量同步(推荐⭐⭐⭐)
适用场景:在线迁移、最小化停机时间优点:支持增量、可断点续传、灵活缺点:需要手动配置引导
步骤 1:目标机准备
# 1. 安装最小化系统(与源系统相同版本)# 使用 CentOS 7 最小化 ISO 安装# 2. 分区建议(根据源系统调整)# /boot 500M# / 剩余空间(或单独划分 /home /var 等)# swap 物理内存的 1-2 倍# 3. 格式化并挂载mkfs.xfs /dev/sda1 # /bootmkfs.xfs /dev/sda2 # /mkswap /dev/sda3 # swap# 4. 记录目标机 UUIDblkid
步骤 2:安装必要工具
# 源机和目标机都安装yum install -y rsync net-tools
步骤 3:配置 SSH 免密登录
# 在源机器上执行ssh-keygen -t rsa -b 2048 # 生成密钥(如无)# 复制公钥到目标机ssh-copy-id root@目标机IP# 测试免密登录ssh root@目标机IP
步骤 4:第一次全量同步
# 在源机器上执行# --exclude 排除不需要同步的目录rsync -avzP \ --exclude='/proc' \ --exclude='/sys' \ --exclude='/tmp' \ --exclude='/dev' \ --exclude='/mnt' \ --exclude='/media' \ --exclude='/lost+found' \ --exclude='/boot/*' \ --exclude='/etc/fstab' \ --exclude='/etc/udev/rules.d/70-persistent-net.rules' \ --exclude='/var/log/*' \ --exclude='*.swp' \ / root@目标机IP:/mnt# 解释:# -a 归档模式(保留权限、链接等)# -v 详细输出# -z 压缩传输# -P 显示进度并支持断点续传
步骤 5:同步目标机 fstab
# 在目标机上执行# 先备份原 fstabcp /etc/fstab /etc/fstab.bak# 从源机器复制 fstab 并修改 UUIDscp root@源机IP:/etc/fstab /tmp/fstab.source# 查看源机器的 UUIDssh root@源机IP "blkid"# 查看目标机的 UUIDblkid# 编辑 fstab,将 UUID 改为目标机的vim /etc/fstab
步骤 6:安装引导
# 在目标机上执行# 1. 挂载新系统mount /dev/sda2 /mntmount /dev/sda1 /mnt/boot# 2. 挂载必要目录mount --bind /dev /mnt/devmount --bind /proc /mnt/procmount --bind /sys /mnt/sys# 3. chroot 进入新系统chroot /mnt# 4. 重新安装引导grub2-install /dev/sdagrub2-mkconfig -o /boot/grub2/grub.cfg# 5. 重建 initramfs(重要!)dracut -f# 6. 退出并重启exitumount /mnt/devumount /mnt/procumount /mnt/sysumount /mnt/bootumount /mntreboot
步骤 7:第二次增量同步(减少停机时间)
# 源机器停机前执行最后一次增量同步# 此时大部分数据已同步,这次很快rsync -avzP \ --exclude='/proc' \ --exclude='/sys' \ --exclude='/tmp' \ --exclude='/dev' \ --exclude='/mnt' \ --exclude='/media' \ --exclude='/lost+found' \ --exclude='/boot/*' \ --exclude='/etc/fstab' \ / root@目标机IP:/mnt# 同步完成后,停止源机器服务,进行最终切换
步骤 8:网络配置调整
# 在目标机上执行# 1. 修改网络配置# CentOS 7 网络配置文件位置vim /etc/sysconfig/network-scripts/ifcfg-eno16777736# 或vim /etc/sysconfig/network-scripts/ifcfg-eth0# 修改内容:BOOTPROTO=staticONBOOT=yesIPADDR=新 IP 地址NETMASK=255.255.255.0GATEWAY=网关地址DNS1=8.8.8.8DNS2=114.114.114.114# 2. 修改主机名(如需要)hostnamectl set-hostname 新主机名# 3. 重启网络systemctl restart network# 4. 验证ip addr showping -c 4 www.baidu.com
步骤 9:清理和验证
# 1. 清理旧的网络规则rm -f /etc/udev/rules.d/70-persistent-net.rules# 2. 清理 SSH 主机密钥(重新生成)rm -f /etc/ssh/ssh_host_*systemctl restart sshd# 3. 检查服务状态systemctl list-units --type=service --state=running# 4. 检查开机启动systemctl list-unit-files --state=enabled# 5. 验证应用服务# 根据实际部署的服务进行测试
三、方案二:dd 整盘克隆(最简单⭐⭐⭐⭐⭐)
适用场景:离线迁移、磁盘大小相同或目标更大优点:完整复制、包括引导和分区缺点:需要停机、镜像文件大
方法 A:直接通过网络克隆
# ===== 在源机器上执行 =====# 1. 压缩并发送整个磁盘# 注意:需要足够带宽,大磁盘耗时较长dd if=/dev/sda | gzip -c | ssh root@目标机IP "dd of=/dev/sda"# 或者使用 pv 显示进度yum install -y pvpv /dev/sda | gzip -c | ssh root@目标机IP "dd of=/dev/sda"
方法 B:创建镜像文件后传输
# ===== 步骤 1:源机器创建镜像 =====# 压缩镜像(推荐,节省空间)dd if=/dev/sda | gzip -c > /backup/system-image-$(date +%Y%m%d).img.gz# 或者不压缩(速度快,占用空间大)dd if=/dev/sda of=/backup/system-image-$(date +%Y%m%d).img# 查看镜像大小ls -lh /backup/# ===== 步骤 2:传输镜像到目标机 =====# 使用 scp 传输scp /backup/system-image-*.img.gz root@目标机IP:/backup/# 或使用 rsync(支持断点续传)rsync -avzP /backup/system-image-*.img.gz root@目标机IP:/backup/# ===== 步骤 3:目标机恢复镜像 =====# 解压并写入磁盘(如果是压缩镜像)gunzip -c /backup/system-image-*.img.gz | dd of=/dev/sda# 或者直接写入(如果未压缩)dd if=/backup/system-image-*.img of=/dev/sda# ===== 步骤 4:调整分区(如目标磁盘更大)=====# 查看分区fdisk -l# 使用 growpart 扩展分区yum install -y cloud-utils-growpartgrowpart /dev/sda 1 # 扩展第一个分区# 扩展文件系统# XFS 文件系统xfs_growfs /dev/sda1# EXT4 文件系统resize2fs /dev/sda1
方法 C:使用 Clonezilla(推荐用于大规模迁移)
# 1. 下载 Clonezilla ISO# https://clonezilla.org/downloads.php# 2. 制作启动 U 盘# 使用 Rufus(Windows)或 dd(Linux)# 3. 源机器启动 Clonezilla,选择:# device-image → ssh_server → 创建镜像# 4. 目标机器启动 Clonezilla,选择:# device-image → ssh_server → 恢复镜像
四、方案三:tar 打包迁移(灵活⭐⭐⭐⭐)
适用场景:跨架构迁移、只需要系统和数据优点:灵活、可筛选、兼容性好缺点:需要重新配置引导
步骤 1:源机器打包
# 创建备份目录mkdir -p /backup# 打包整个系统(排除不需要的目录)tar --exclude='/proc' \ --exclude='/sys' \ --exclude='/tmp' \ --exclude='/dev' \ --exclude='/mnt' \ --exclude='/media' \ --exclude='/lost+found' \ --exclude='/boot/*' \ --exclude='/var/log/*' \ --exclude='*.swp' \ -czpf /backup/system-backup-$(date +%Y%m%d).tar.gz /# 或者分目录打包(更灵活)tar -czpf /backup/etc-backup.tar.gz /etctar -czpf /backup/home-backup.tar.gz /hometar -czpf /backup/var-backup.tar.gz /vartar -czpf /backup/opt-backup.tar.gz /opttar -czpf /backup/root-backup.tar.gz /root
步骤 2:传输备份
# 使用 scpscp /backup/system-backup-*.tar.gz root@目标机IP:/backup/# 或使用 rsyncrsync -avzP /backup/ root@目标机IP:/backup/# 或使用 nc(内网快速传输)# 目标机:nc -l 9999 | tar -xzf - -C /# 源机器:tar -czf - / | nc 目标机IP 9999
步骤 3:目标机恢复
# 1. 挂载目标分区mount /dev/sda2 /mntmkdir -p /mnt/bootmount /dev/sda1 /mnt/boot# 2. 解压备份cd /mnttar -xzpf /backup/system-backup-*.tar.gz -C /mnt# 3. 创建必要目录mkdir -p /mnt/{proc,sys,dev,tmp,mnt,media}chmod 1777 /mnt/tmp# 4. chroot 并配置引导mount --bind /dev /mnt/devmount --bind /proc /mnt/procmount --bind /sys /mnt/syschroot /mnt# 安装引导grub2-install /dev/sdagrub2-mkconfig -o /boot/grub2/grub.cfgdracut -f# 退出exit# 卸载umount /mnt/devumount /mnt/procumount /mnt/sysumount /mnt/bootumount /mntreboot
五、方案四:专业工具(企业级)
5.1 Clonezilla(再生龙)
# 适用场景:批量迁移、异构硬件# 1. 下载地址# https://clonezilla.org/downloads.php# 2. 功能特点:# - 支持多种文件系统# - 支持网络传输# - 支持增量备份# - 支持多播克隆# 3. 使用流程:# a. 制作 Clonezilla 启动盘# b. 源机器启动进入 Clonezilla# c. 选择创建镜像# d. 目标机器启动进入 Clonezilla# e. 选择恢复镜像
5.2 Mondo Rescue
# 适用场景:灾难恢复、裸机恢复# 1. 安装(源机器)yum install -y mondo rescue# 2. 创建恢复镜像mondoarchive -O -d /backup -s 700m -p backup-$(date +%Y%m%d)# 3. 生成 ISO 可用于启动恢复
5.3 Partimage
# 适用场景:EXT3/EXT4/ReiserFS 分区# 1. 安装yum install -y partimage# 2. 备份分区partimage save /dev/sda1 /backup/sda1.partimg# 3. 恢复分区partimage restore /dev/sda1 /backup/sda1.partimg
六、方案五:云厂商迁移工具
6.1 阿里云 SMC
# 服务器迁移中心(Server Migration Center)# 1. 在阿里云控制台创建迁移任务# 2. 下载并运行迁云工具# 3. 自动完成迁移# 文档:https://help.aliyun.com/product/48417.html
6.2 腾讯云 CVM
# 镜像迁移工具# 1. 创建自定义镜像# 2. 使用镜像创建新实例# 3. 数据自动迁移# 文档:https://cloud.tencent.com/document/product/213
6.3 VMware vCenter Converter
# 适用场景:物理机 → VMware 虚拟机# 1. 下载并安装 Converter# 2. 选择源机器(物理机)# 3. 选择目标(VMware 虚拟机)# 4. 开始迁移# 支持:# - 在线迁移# - 增量同步# - 自动调整驱动
七、迁移后配置
7.1 网络配置
# 1. 修改网络配置文件vim /etc/sysconfig/network-scripts/ifcfg-eth0# 内容示例:TYPE=EthernetBOOTPROTO=staticDEFROUTE=yesNAME=eth0DEVICE=eth0ONBOOT=yesIPADDR=192.168.1.100NETMASK=255.255.255.0GATEWAY=192.168.1.1DNS1=8.8.8.8DNS2=114.114.114.114# 2. 重启网络systemctl restart network# 3. 验证ip addr showping -c 4 www.baidu.com
7.2 主机名配置
# 修改主机名hostnamectl set-hostname new-hostname# 修改 hosts 文件vim /etc/hosts# 127.0.0.1 new-hostname localhost
7.3 SSH 配置
# 1. 重新生成主机密钥rm -f /etc/ssh/ssh_host_*ssh-keygen -A# 2. 重启 SSH 服务systemctl restart sshd# 3. 验证 SSH 连接ssh localhost
7.4 文件系统检查
# 1. 检查 fstabcat /etc/fstab# 确保 UUID 与目标机一致# 2. 查看实际 UUIDblkid# 3. 如有不符,编辑 fstabvim /etc/fstab
7.5 服务检查
# 1. 检查运行的服务systemctl list-units --type=service --state=running# 2. 检查开机启动systemctl list-unit-files --state=enabled# 3. 启动必要服务systemctl start 服务名systemctl enable 服务名# 4. 检查服务状态systemctl status 服务名
7.6 日志检查
# 1. 查看系统日志journalctl -xbtail -f /var/log/messages# 2. 查看启动日志dmesg | tail -50# 3. 查看错误日志grep -i error /var/log/messages
八、常见问题排查
问题 1:无法启动(GRUB 错误)
# 解决方法:使用救援模式# 1. 使用安装盘启动,选择 Rescue 模式# 2. 挂载原系统chroot /mnt/sysimage# 3. 重新安装 GRUBgrub2-install /dev/sdagrub2-mkconfig -o /boot/grub2/grub.cfg# 4. 重建 initramfsdracut -f# 5. 重启exitreboot
问题 2:网卡名称变化
# CentOS 7 使用可预测网络接口名# 方法 1:使用新名称ip link show # 查看新名称vim /etc/sysconfig/network-scripts/ifcfg-新名称# 方法 2:改回传统名称# 编辑 GRUB 配置vim /etc/default/grub# 添加:net.ifnames=0 biosdevname=0GRUB_CMDLINE_LINUX="... net.ifnames=0 biosdevname=0"# 重新生成配置grub2-mkconfig -o /boot/grub2/grub.cfgreboot
问题 3:文件系统 UUID 不匹配
# 1. 查看当前 UUIDblkid# 2. 查看 fstab 配置cat /etc/fstab# 3. 编辑 fstab 使用正确 UUIDvim /etc/fstab# 4. 或者使用设备名(不推荐)# /dev/sda1 /boot xfs defaults 0 0
问题 4:服务启动失败
# 1. 查看服务状态systemctl status 服务名# 2. 查看日志journalctl -u 服务名 -xb# 3. 常见原因:# - 依赖服务未启动# - 配置文件路径错误# - 权限问题# - 端口冲突# 4. 修复后重启服务systemctl restart 服务名
问题 5:SELinux 阻止服务
# 1. 查看 SELinux 状态getenforce# 2. 临时禁用(测试用)setenforce 0# 3. 永久禁用(不推荐生产环境)vim /etc/selinux/configSELINUX=disabled# 4. 或者修复上下文restorecon -Rv /路径# 5. 查看 SELinux 日志grep -i denied /var/log/audit/audit.log
九、快速参考卡
rsync 快速迁移
# ===== 源机器 =====
# 1. SSH 免密配置
ssh-copy-id root@目标机IP
# 2. 第一次同步
rsync -avzP--exclude='/proc'--exclude='/sys'--exclude='/tmp' \
--exclude='/dev'--exclude='/mnt'--exclude='/media' \
--exclude='/lost+found'--exclude='/boot/*' \
--exclude='/etc/fstab'--exclude='/var/log/*' \
/ root@目标机IP:/mnt
# 3. 最后一次同步(停机后)
rsync -avzP--exclude='/proc'--exclude='/sys'--exclude='/tmp' \
--exclude='/dev'--exclude='/mnt'--exclude='/media' \
--exclude='/lost+found'--exclude='/boot/*' \
--exclude='/etc/fstab'--exclude='/var/log/*' \
/ root@目标机IP:/mnt
# ===== 目标机器 =====
# 1. 修改 fstab
vim /etc/fstab # 使用目标机 UUID
# 2. 安装引导
mount /dev/sda2 /mnt
mount /dev/sda1 /mnt/boot
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
dracut -f
exit
# 3. 重启
reboot
dd 快速克隆
# ===== 方法 1:网络直传 =====
dd if=/dev/sda | gzip -c | ssh root@目标机IP "dd of=/dev/sda"
# ===== 方法 2:镜像文件 =====
# 源机器
dd if=/dev/sda | gzip -c > /backup/system.img.gz
# 传输
scp /backup/system.img.gz root@目标机IP:/backup/
# 目标机器
gunzip -c /backup/system.img.gz | dd of=/dev/sda
# 扩展分区(如需要)
growpart /dev/sda 1
xfs_growfs /dev/sda1
迁移口诀:
备份先行莫忘记,信息收集要仔细rsync 同步最灵活,dd 克隆最简单网络配置要修改,引导安装别遗漏服务验证逐项过,旧机保留保平安