Vmware应用镜像迁移上云
项目概述
迁移背景
XX客户现有业务系统部署在本地VMware虚拟化环境中,操作系统为CentOS 6.10,系统采用多磁盘跨盘LVM卷组管理(系统分区跨多块物理虚拟磁盘组建PV/VG/LV),无独立单盘系统分区。本次需将完整VMware应用镜像整体迁移至公有云平台,实现业务云端平滑迁移,迁移后要求系统启动正常、应用服务无异常、配置数据零丢失、业务功能完全兼容。
源环境核心特征
- 虚拟化平台:VMware 镜像(vmdk+vmx 完整镜像)
- 操作系统:CentOS 6.10(内核2.6.x,老旧内核,云上兼容性风险高)
- 磁盘架构:非单盘系统,2块磁盘跨盘LVM,系统、数据均基于LVM逻辑卷,不支持xssd
- 启动方式:传统BIOS启动(CentOS6默认,不支持UEFI)
- 业务要求:迁移后应用进程、端口、配置、文件权限、定时任务、服务自启全部正常,无数据偏差
迁移目标
- 保留原有跨盘LVM卷组结构、所有逻辑卷、分区容量、文件数据完全一致
- 适配云端虚拟化驱动,解决CentOS 6.10云上兼容性问题
- 系统开机自启正常、网络正常、LVM挂载自动生效
- 原有业务应用、服务、脚本、权限配置100%兼容可用
- 输出完整迁移报告、操作记录、验证结果,满足交付标准
迁移难点与风险说明
- 跨盘LVM风险:需确保云端系统盘和数据盘跨盘LVM架构不变,否则易导致VG无法识别、LV挂载失败、系统开机卡死
- 磁盘类型:不支持xssd,若需支持,需单独部署驱动
- 系统版本老旧:CentOS6.10已停服,云端默认内核、监控等不兼容,极易出现启动异常
迁移方案
采用线下转换镜像 + 云端脚本适配修复 + LVM校验 + 业务全量验证的定制化迁移方案,专门适配CentOS6.10 跨盘LVM特殊架构。
迁移前置准备工作
- 准备临时linux环境,用于修改镜像密码
- 目标云平台完成对象存储创建,用于上传本地镜像,以及导入镜像到自定义镜像
- 规划并创建云上VPC及子网,配置安全组,放行业务所有端口、远程登录端口
详细迁移实施步骤
源镜像转换
客户提供3个镜像vmdk源文件,为方便处理和导入,将镜像转换为qcow2格式
镜像1为应用前端镜像,单盘系统:
qemu-img.exe convert -p -O qcow2 "D:\123pan\Downloads\363_ovf\192.x.x.x_pocd-1.vmdk" D:\123pan\Downloads\ovf\serv-img-ovf.qcow2
镜像2,3为应用后端镜像,一个为系统盘镜像,一个为数据盘镜像,系统盘和数据盘跨盘组成LVM,分别进行转换:
qemu-img.exe convert -p -O qcow2 "D:\123pan\Downloads\22200_ovf\10.x.x.x_pocd-1.vmdk" D:\123pan\Downloads\ovf\mysql-img-ovf-1.qcow2
qemu-img.exe convert -p -O qcow2 "D:\123pan\Downloads\22200_ovf\10.x.x.x_pocd-2.vmdk" D:\123pan\Downloads\ovf\mysql-img-ovf-2.qcow2
修改镜像密码
由于客户未提供镜像密码,需进行重置,将镜像上传至临时linux环境中,使用libguestfs-tools工具重置镜像密码
上传镜像至对象存储并导入镜像服务中
- 将转换及修改密码的镜像上传至对象存储
- 在镜像管理中导入镜像文件
- 使用导入的镜像创建应用前端云主机,及应用后端云主机、后端云主机数据盘
- 应用后端云主机系统盘和数据盘跨盘LVM管理,两个镜像中分别有完整的LVM信息,系统盘创建云主机后,需关机,挂载数据盘之后再启动,确保LVM管理正常
云上兼容性适配
云上兼容性适配,两个镜像均执行相同操作:
网卡配置
配置网络参数,是为了让Linux操作系统可以正常使用云上弹性网络产品能力(VPC、子网、弹性IP)
步骤1:修改GRUB Legacy (CentOS 6)为传统网卡命名, 如把ifcfg-enp0s1 改成ifcfg-eth0
脚本为 CentOS 6/7/8/9 全版本自适应网卡命名修复工具,自动兼容 GRUB Legacy 与 GRUB2 引导模式,同时适配 BIOS、UEFI 启动环境,通过注入 net.ifnames=0、biosdevname=0 内核参数禁用系统默认的新式网卡命名规则,配合清理旧 Udev 持久化网络规则、安全修改单/多网卡配置文件,实现服务器网卡强制永久恢复为 eth0、eth1 等传统命名方式,脚本具备幂等性,可重复执行无冗余报错,全程保障网络不中断,适配批量自动化部署场景
#!/bin/bash
# Universal Script: Force traditional network interface naming (eth0/eth1...)
# Compatible: CentOS 6 / 7 / 8 / 9 | BIOS & UEFI | Single & Multiple NICs
# Features: Idempotent, Safe modification, No network outage
echo "Detecting GRUB version..."
# Check GRUB Legacy (CentOS 6) and GRUB2 (CentOS 7+)
if [ -f "/boot/grub/grub.conf" ]; then
# CentOS 6 - GRUB Legacy
grub_conf="/boot/grub/grub.conf"
if ! grep -q '^\s*kernel' "$grub_conf"; then
echo "ERROR: No valid kernel entry found in $grub_conf"
exit 1
fi
# Create backup if it does not exist
[ ! -f "${grub_conf}.bak" ] && cp "$grub_conf" "${grub_conf}.bak"
# Append kernel parameters idempotently
sed -i '/^\s*kernel\s/ {
/\bnet\.ifnames=0\b/! s/$/ net.ifnames=0/
/\bbiosdevname=0\b/! s/$/ biosdevname=0/
}' "$grub_conf"
echo "Detected CentOS 6 (GRUB Legacy). Configuration applied."
elif [ -f "/etc/default/grub" ]; then
# CentOS 7/8/9 - GRUB2
grub_conf="/etc/default/grub"
# Create backup if it does not exist
[ ! -f "${grub_conf}.bak" ] && cp "$grub_conf" "${grub_conf}.bak"
# Add kernel parameters only if missing
if ! grep -q 'net.ifnames=0' "$grub_conf"; then
sed -i 's/\(^GRUB_CMDLINE_LINUX=".*\)"/\1 net.ifnames=0 biosdevname=0"/' "$grub_conf"
echo "Kernel parameters added to GRUB_CMDLINE_LINUX"
else
echo "Kernel parameters already exist, skip modification"
fi
echo "Updating GRUB configuration (BIOS & UEFI compatible)..."
# Update all grub.cfg files automatically
find /boot/ -name "grub.cfg" | while read cfg; do
grub2-mkconfig -o "$cfg" > /dev/null 2>&1
done
echo "Detected CentOS 7+ (GRUB2). GRUB configuration updated."
else
echo "ERROR: No valid GRUB configuration file found"
exit 1
fi
echo "Cleaning all old network naming records completely..."
rm -f /etc/udev/rules.d/*net*.rules >/dev/null 2>&1
rm -f /lib/udev/rules.d/*persistent-net*.rules >/dev/null 2>&1
rm -rf /var/lib/NetworkManager/* >/dev/null 2>&1
echo "All old network naming records have been cleaned up."
# Safely remove all network configurations except ifcfg-lo
NET_DIR="/etc/sysconfig/network-scripts"
if [ -d "$NET_DIR" ]; then
echo "Cleaning all network configs EXCEPT ifcfg-lo..."
find "$NET_DIR" -maxdepth 1 -type f -name "ifcfg-*" ! -name "ifcfg-lo" -delete
echo "Only ifcfg-lo remains. All legacy NIC configs cleared safely."
fi
echo "All tasks completed successfully."
echo "Please execute 'reboot' to apply network interface naming changes."
完成后重启云主机
步骤2:配置centos 6.0 主网卡
cat <<'EOT' >/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=dhcp
DEFROUTE=yes
PEERDNS=yes
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
NM_CONTROLLED=no
USERCTL=no
EOT
service network restart
步骤3:修改 /etc/sysconfig/network 文件
cat <<'EOT' >/etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=yes
NOZEROCONF=yes
EOT
步骤4:清空旧mac绑定 :
执行:
> /etc/udev/rules.d/70-persistent-net.rules
yum源配置
更换为centos6.10的可用源,CentOS 6 要用 vault/epel-archive 源:
mkdir -p /etc/yum.repos.d/backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/
cat > /etc/yum.repos.d/CentOS-Base.repo <<'EOF'
[base-6.10]
name=CentOS-6.10 - Base
baseurl=http://internal.mirrors.ctyun.cn/centos/6.10/os/$basearch/
https://mirrors.ctyun.cn/centos/6.10/os/$basearch/
http://vault.centos.org/centos/6.10/os/$basearch/
gpgcheck=1
gpgkey=http://internal.mirrors.ctyun.cn/centos/RPM-GPG-KEY-CentOS-6
enabled=1
metadata_expire=never
#released updates
[updates-6.10]
name=CentOS-6.10 - Updates
baseurl=http://internal.mirrors.ctyun.cn/centos/6.10/updates/$basearch/
https://mirrors.ctyun.cn/centos/6.10/updates/$basearch/
http://vault.centos.org/centos/6.10/updates/$basearch/
gpgcheck=1
gpgkey=http://internal.mirrors.ctyun.cn/centos/RPM-GPG-KEY-CentOS-6
enabled=1
metadata_expire=never
# additional packages that may be useful
[extras-6.10]
name=CentOS-6.10 - Extras
baseurl=http://internal.mirrors.ctyun.cn/centos/6.10/extras/$basearch/
https://mirrors.ctyun.cn/centos/6.10/extras/$basearch/
http://vault.centos.org/centos/6.10/extras/$basearch/
gpgcheck=1
gpgkey=http://internal.mirrors.ctyun.cn/centos/RPM-GPG-KEY-CentOS-6
enabled=1
metadata_expire=never
# additional packages that extend functionality of existing packages
[centosplus-6.10]
name=CentOS-6.10 - CentOSPlus
baseurl=http://internal.mirrors.ctyun.cn/centos/6.10/centosplus/$basearch/
https://mirrors.ctyun.cn/centos/6.10/centosplus/$basearch/
http://vault.centos.org/centos/6.10/centosplus/$basearch/
gpgcheck=1
gpgkey=http://internal.mirrors.ctyun.cn/centos/RPM-GPG-KEY-CentOS-6
enabled=0
metadata_expire=never
#contrib - packages by Centos Users
[contrib-6.10]
name=CentOS-6.10 - Contrib
baseurl=http://internal.mirrors.ctyun.cn/centos/6.10/contrib/$basearch/
https://mirrors.ctyun.cn/centos/6.10/contrib/$basearch/
http://vault.centos.org/centos/6.10/contrib/$basearch/
gpgcheck=1
gpgkey=http://internal.mirrors.ctyun.cn/centos/RPM-GPG-KEY-CentOS-6
enabled=0
metadata_expire=never
EOF
cat > /etc/yum.repos.d/epel.repo <<'EOF'
[epel]
name=EPEL 6
baseurl=http://mirrors.aliyun.com/epel-archive/6/$basearch/
gpgcheck=0
enabled=1
EOF
yum clean all
yum makecache
cloud-init安装
https://www.ctyun.cn/document/10027726/10747155
# 安装(epel 里的 el6 版本)
yum install -y cloud-init cloud-utils-growpart
# 查看版本(应该是 0.7.5)
cloud-init --version
说明:
CentOS 6 只能装到 0.7.5,这个版本对 ** 大部分云厂商的初始化(hostname、ssh、密码、网卡)是够用的。
# 如果必须用较新版本(如 18.x),CentOS 6 需要先升级 Python 2.7,再手动编译 / 安装新版 cloud-init,步骤复杂且不建议生产用
配置Cloud-init,补充自定义配置文件
cat <<'EOT' >/etc/cloud/cloud.cfg.d/zz_ctims.cfg
# Declare datasource priority
datasource_list: [ ConfigDrive, OpenStack ]
# Flat datasource parameters for cloud-init 0.7.5 compatibility
datasource_ConfigDrive:
dsmode: local
datasource_OpenStack:
metadata_urls: ["http://169.x.x.x"]
timeout: 10
retries: 5
max_wait: 120
# Global basic and network policy configuration
disable_root: false
ssh_pwauth: true
ssh_deletekeys: false
preserve_hostname: false
manage_etc_hosts: localhost
# Disable cloud-init network auto-configuration to avoid network exceptions
disable_network_config: true
# Default system user policy
system_info:
default_user:
name: root
lock_passwd: false
EOT
CentOS 6 是 sysvinit,要手动加自启动
# 添加并开机自启
chkconfig --add cloud-init-local
chkconfig --add cloud-init
chkconfig --add cloud-config
chkconfig --add cloud-final
chkconfig cloud-init-local on
chkconfig cloud-init on
chkconfig cloud-config on
chkconfig cloud-final on
# 启动服务
service cloud-init-local start
service cloud-init start
# ==================== 2. 验证服务状态 ====================
# 确认输出结果中均包含 "on"
chkconfig --list | grep -E 'cloud-init|cloud-config|cloud-final'
安装QEMU-Guest-Agent
https://www.ctyun.cn/document/10027726/10747147
yum install -y qemu-guest-agent
service qemu-ga status
# (可选)查看版本
qemu-ga --version
通过执行以下shell命令,完成对qemu-ga和qemu-guest-agent.service配置文件的修改。
qemu_ga_config='/etc/sysconfig/qemu-ga'
# RPC
if [ -f "$qemu_ga_config" ]; then
[ ! -f "${qemu_ga_config}.bak" ] && cp "$qemu_ga_config" "${qemu_ga_config}.bak"
sed -i '/^[[:space:]]*BLACKLIST_RPC/ s/^/# /' "$qemu_ga_config"
sed -i '/^[[:space:]]*FILTER_RPC_ARGS/ s/^/# /' "$qemu_ga_config"
fi
# systemd WantedBy def
sed -i 's/^ARGS=.*/ARGS="-d -v -t virtio-serial"/' /etc/sysconfig/qemu-ga
# systemctl enable
chkconfig --add qemu-ga
chkconfig qemu-ga on
service qemu-ga start
service qemu-ga status
安装监控插件
根据区域信息,查找对应的下载链接,部署监控插件
https://www.ctyun.cn/document/10026730/10325964
# huabei2
curl -o update_agent.sh http://100.x.x.x/cttg/linux/update_agent.sh
chmod +x update_agent.sh
./update_agent.sh http://100.x.x.x
service telegraf status
时区调整和同步
- adjtime调整为UTC
cat /etc/adjtime
如果最后一行为LOCAL,修改为UTC
sed -i 's/^LOCAL$/UTC/' /etc/adjtime
- 同步内部时钟源
https://www.ctyun.cn/document/10027726/11092410
适配centos 6.10的版本:
# 强制终止ntpd残留进程、禁用开机自启,彻底解除与chronyd互斥冲突,部署chronyd时间同步服务
service ntpd stop || pkill -9 ntpd && chkconfig ntpd off && yum install -y chrony && cp /etc/chrony.conf /etc/chrony.conf.bak && sed -i -E '/^(pool|server)/d' /etc/chrony.conf && cat >> /etc/chrony.conf << EOF
server 169.x.x.x iburst prefer
EOF
# 执行完之后,重启chronyd、设置开机自启、强制校准时间、固化硬件时钟、验证状态
service chronyd restart && chkconfig chronyd on && chronyc makestep && hwclock --systohc
service chronyd status && chronyc sources && date
回滚方案:
cp /etc/chrony.conf.bak /etc/chrony.conf && service chronyd restart
应用配置修改
根据客户提供的必要配置信息,修改对应模块的IP信息
cd /usr/local/tomcat/apache-tomcat-8.5.100/webapps/xq_pro/WEB-INF/classes
vi ldap.properties
修改ladp.validate=0,保存退出
# 修改数据库IP 为mysql数据库的IP
cd /usr/local/tomcat/apache-tomcat-8.5.100/webapps/xq_pro/WEB-INF/classes
vi /usr/local/tomcat/apache-tomcat-8.5.100/webapps/xq_pro/WEB-INF/classes/application.properties
启动web应用
cd /usr/local/tomcat/apache-tomcat-8.5.100/bin
./startup.sh
验证客户业务系统各业务功能
登录验证

业务功能正常
各业务功能增删改查正常
