在线迁移阿里云ECS实例到本地方法

您的第一个版面的简单描述
回复
admin
网站管理员
帖子: 11
注册时间: 2025年 10月 2日 03:38

在线迁移阿里云ECS实例到本地方法

帖子 admin »

为什么要在线迁移阿里云ECS实例到本地?
(1)迁移过程不会停止阿里云ECS实例的业务。
(2)对于某些低配置阿里云ECS实例,需要一个低成本的本地开发和测试环境。
(3)获得数据自主权。

在线迁移方法

阿里云ECS配置情况:

sshd端口:tcp 22222

普通用户:sam

# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/vda1 ext4 40G 19G 19G 50% /
devtmpfs devtmpfs 405M 0 405M 0% /dev
tmpfs tmpfs 481M 0 481M 0% /dev/shm
tmpfs tmpfs 193M 13M 180M 7% /run
tmpfs tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-journald.service
tmpfs tmpfs 481M 8.0K 481M 1% /tmp
tmpfs tmpfs 97M 4.0K 97M 1% /run/user/989
tmpfs tmpfs 97M 4.0K 97M 1% /run/user/1000
tmpfs tmpfs 97M 0 97M 0% /run/user/0

# which dd
/usr/bin/dd

# echo "sam ALL=(root) NOPASSWD: /usr/bin/dd" >> /etc/sudoers

在本地宿主机上的操作

# cd /vm
# mkdir aliyun_vm
# cd aliyun_vm

执行在线迁移
# ssh-keygen
# ssh-copy-id -p 20202 sam@aliyun_ECS_remote_IP
输入sam用户的正确密码,设置免密ssh登陆。

# ssh -p 22222 sam@aliyun_ECS_remote_IP "sudo /usr/bin/dd if=/dev/vda bs=1M | xz -9 -c" | xz -dc -T0 > local_aliyun_ECS.img
备注:迁移的实例硬盘是/dev/vda,不是只有/dev/vda1.如果只迁移/dev/vda1,就会丢失ECS实例的虚拟硬盘分区表。

上面一步执行完成后,挂载虚拟机文件local_aliyun_ECS.img
# file local_aliyun_ECS.img
local_aliyun_ECS.img: DOS/MBR boot sector
# dnf install kpartx -y
# kpartx -av local_aliyun_ECS.img
add map loop0p1 (252:0): 0 83883999 linear 7:0 2048
# ls /dev/mapper/
control loop0p1

# 运行fsck 检查并强制修复文件系统错误
# fsck -f -y /dev/mapper/loop0p1
# mount /dev/mapper/loop0p1 /mnt
# df -hT |grep mnt
/dev/mapper/loop0p1 ext4 40G 22G 17G 57% /mnt

检查/dev/mapper/loop0p1分区的UUID与分区表文件/mnt/etc/fstab上面的UUID是否一致
# blkid |grep loop0p1
/dev/mapper/loop0p1: UUID="d67d7d69-2086-40ea-b3b9-3e1622973917" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="ffe8cd62-01"
# cd /mnt/etc/
# cat fstab |grep UUID=d67d7d69-2086-40ea-b3b9-3e1622973917
UUID=d67d7d69-2086-40ea-b3b9-3e1622973917 / ext4 defaults 1 1

UUID一致,不需要修改分区表和引导配置文件。

# chroot /mnt
Error, do this: mount -t proc proc /proc
/bin/basename: 缺少操作数
请尝试执行 "/bin/basename --help" 来获取更多信息。
basename: 缺少操作数
请尝试执行 "basename --help" 来获取更多信息。
# 不用理会,不影响操作。
# ntsysv
关闭如下服务:
aliyun.service
aliyun_init.service
cloud-config.service
cloud-final.service
cloud-init-local.service
cloud-init.service
dbus-org.fedoraproject.FirewallD1.service
firewalld.service
openvpn-server.service
php-fpm.service
rpcbind.service
systemd-fsck-root.service
xvnc.socket
保存退出。
# exit

# cd /root
# umount /mnt
# cd /vm/aliyun_vm/
# ls
local_aliyun_ECS.img

# 卸载虚拟机文件local_aliyun_ECS.img
# kpartx -d local_aliyun_ECS.img

# 在本地宿主机器上添加KVM虚拟机
操作系统选:CentOS Stream 10
硬盘路径:/vm/aliyun_vm/local_aliyun_ECS.img (根据实际情况填写)
硬盘总线选:VirtIO
虚拟网络接口
网络源:桥接设备(可以根据实际情况设置)
设备名称:br0
设备型号:virtio
虚拟机其他参数根据实际情况填写。

如何在本地迁移过来的KVM虚拟机上也可以安装和更新软件包和安全补丁?
(1)在阿里云ECS上配置VPN服务端,并安装squid。squid配置如下:
http_port 10.8.0.1:3128 # 只监听VPN网关IP
acl localnet src # 10.8.0.0/24 只允许VPN网段的主机访问squid
http_access allow localnet
http_access allow localhost
http_access deny all
(2)阿里云ECS防火墙添加如下规则:
firewall-cmd --add-port=3128/tcp --permanent
firewall-cmd --reload
(2)本地KVM虚拟机配置VPN客户端,用以连接阿里云ECS VPN服务端。
(3)配置本地KVM虚拟机配置 dnf 使用代理:
vim /etc/dnf/dnf.conf
# 添加以下内容
proxy=http://10.8.0.1:3128
这样,在线迁移过来的ECS(本地KVM虚拟机)也可以安装和更新软件包和安全补丁了。
备注:由于是使用了ssh加密通道和xz压缩和解压缩方法进行的在线迁移,迁移下来的local_aliyun_ECS.img
文件有少部分数据丢失,需要到阿里云ECS上面scp下载这部分丢失的数据到本地KVM虚拟主机上(注意设置到这些文件的用户和属主)。

如有不懂的地方请发邮件到tot@bluepoint-ha.com咨询。
回复