主机迁移概述
在云计算时代, 不管是从 IDC 上云还是多云直接的迁移, 都已经是常见的事宜. 而在上云 / 迁移的方案中, 也是有多种的方式能够将主机迁移到腾讯云中.
然而, 不同的方式会有不同的利弊.
目前, 腾讯云可以提供导入镜像和服务迁移 (冷迁移) 的工具, 而这两种方式均涉及到镜像制作. 故本文将分享镜像制作的操作步骤, 仅供参考.
1, 在制作镜像之前需要了解符合导入腾讯云的镜像文件要求, 详情可参考导入镜像概述 https://cloud.tencent.com/document/product/213/4945 .
Linux 系统类型镜像限制
Windows 系统类型镜像限制
2, 接下来则依据操作系统的不同, 选择不同的镜像制作方法. 请分别参考官网文档 Linux 镜像制作 https://cloud.tencent.com/document/product/213/17814 和 Windows 镜像制作 https://cloud.tencent.com/document/product/213/17815 .
3, 在制作镜像之前, 需要在 Linux 操作系统里安装 cloud-init, 在 Widows 操作系统里安装 cloud-base. 相应的操作可以查看官网文档 Linux 系统安装 cloud-init https://cloud.tencent.com/document/product/213/12587 和 Windows 系统安装 cloud-base https://cloud.tencent.com/document/product/213/12587 .
4, 镜像制作完毕之后, 则需要将镜像上传至 COS.
5, 当镜像已经上传到 COS 之后, 则可以利用[导入镜像] 将自定义镜像导入到镜像控制台, 然后再基于该自定义镜像创建 CVM. 或者利用[服务迁移] 的功能, 直接从 COS 拉取镜像并创建 CVM.
相应的操作指引, 其实官网文档均已提供, 而本文将作为实践的一些经验分享, 供大家参考, 希望对大家有帮助.
镜像制作
Linux 和 Windows 镜像制作的完整步骤官网文档均已给出参考文档, 这里补充两个信息.
1, 如果是友商云主机, Linux 系统的则可以使用 qemu-img 命令或者 dd 命令来制作镜像; 如果是 Windows 系统则可以使用 disk2vhd 工具来制作镜像.
2, 如果是在本地 IDC 的虚拟机, 可以使用虚拟化平台自带的一些镜像导出功能或者镜像制作工具来制作镜像.
3, 如果是本地 IDC 的物理机, 可是使用一些 P2V 的工具来制作或者参考 1 使用相关命令来制作.
友商云主机镜像制作(示例)
本示例是通过 dd 命令将某云主机制作成镜像, 参考步骤如下.
0, 制作镜像之前, 请先在操作系统内安装 cloud-init(Linux 系统), 详细操作方法参考第二部分介绍.
1, 由于需要将云主机通过 dd 方式将整个操作系统盘备份到数据盘, 所以需要给云主机挂一个约为系统盘 2 倍容量的数据盘(单独 购买的数据盘 需要先 挂载数据盘, 然后格式化).
2, 一般云主机里面都有一些云厂商的 agent 或者服务, 比如腾讯云的云监控, 云安全的 agent. 当要把某云主机迁移到腾讯云时, 应该把该云主机内特定的一些组件和服务卸载掉或者禁用掉.
3, 使用 dd 命令制作镜像
dd if=/dev/vda of=/mnt/xxx_yun.raw bs=100M
请务必写成 / dev/vda 而不要写成 / dev/vda1, 否则 dd 出来的镜像分区表和 mbr 信息都丢了
4, 使用 qemu-img 命令将 raw 文件转换成 qcow2 文件, 以可以节省传输和迁移的时间.
qemu-img convert -f raw -O qcow2 xxx_yun.raw xxx_yun.qcow2
5, 将 qcow2 镜像文件上传到腾讯云 COS
安装 coscmd 工具, pip install coscmd(在某云主机上操作);
创建 bucket(在腾讯云控制台操作, 示例 melodytest01);
使用命令将镜像上传至 COS;
- coscmd config -a <access_id> -s<secret_key> -u <appid> -b melodytest01 -r ap-beijing -m 10 -p 10
- coscmd upload /mnt/xxx_yun.qcow2 xxx_yun.qcow2
6, 等待一段时间之后, 登录腾讯云 COS 控制台则可以看到镜像已经成功从某友商云传到 COS 了.
vmware vsphere 导出镜像(参考)
打开虚拟机的编辑设置界面
vmdk 磁盘文件路径
这就是 vmdk 镜像文件了
cloud-init 安装
关于 Cloud-init 和 Cloud-base 的安装, 官网上也给出了参考文档. 而 Linux 系统作为常用的系统, 本文的实践示例则以 Cloud-init 为例.
cloud-init 简单介绍
cloud-init 主要提供了一个实例首次初始化时的自定义配置的能力, 如果导入的镜像没有安装 cloud-init 服务, 通过该镜像启动的实例就不会被正常初始化, 因此该镜像就会导入失败. 因此再制作镜像之前应当在系统内安装 cloud-init.
Cloud-Init 是一个用来自动配置虚拟机的初始设置 (如主机名, 网卡, 用户名和密码等) 的开源工具; 常用于在创建虚拟机时通过元数据服务对虚拟机基本配置, 即主要用于解决云计算场景下使用不同镜像创建子机初始化问题.
cloud-init 仅仅在系统启动时运行, 不会常驻系统;
需要将 cloud-init 设置开机启动, 且不能在首次开机启动后取消 cloud-init 的开机启动. 虽然第一次开启启动, cloud-init 运行了之后初始化正常了, 然而考虑到后续用户有重置密码, 修改 ip, 加载密钥等需求, 仍需要依赖 cloud-init, 所以如果用户在 cloud-init 初始化之后就取消了其开机启动则会在用户重启系统之后, 影响重置密码, 修改 ip, 加载密钥等功能;
cloud-init 每次启动的时候会根据预先配置好的数据源从 metadata server 或 configDrive 里面拉取实例元数据对虚拟机进行初始化(该初始化操作只有在虚拟机首次启动时才会被执行), 拉取 userdata 的信息执行用户自定义的脚本行为;
当系统启动时, cloud-init 可完成包括但不限于下面的定制化工作:
设置 default locale
设置 hostname
添加 ssh keys 到 .ssh/authorized_keys
设置用户密码
配置网络
安装软件包
cloud-init 安装 tips
cloud-init 的安装其实还是挺简单的, 最麻烦的是安装依赖包. 不同操作系统的依赖包的依赖包的版本还不一样, 如果是不能联网的情况下安装, 更是一件麻烦的事情. 详细步骤可以查看官网文档 Linux 系统安装 cloud-init https://cloud.tencent.com/document/product/213/12587 , 而我在此则仅补充相关 tips, 希望对大家有帮助.
直接通过 apt-get 或 yum 命令安装的 cloud-init 版本默认为当前操作系统配置的软件源里面默认的 cloud-init 版本, 通常情况下和 cloud-init 最新版本存会存在比较大的差异, 使用这种方式安装的镜像创建出来的实例可能会存在部分配置项初始化不符合预期的情况, 建议使用手工下载最新 cloud-init 源码包的方式进行安装.
如果机器能联网, 可直接运行命令进行安装依赖包, 参考命令如下:
yum intstall -y python-setuptools python-jinja2 python-prettytable python2-oauthlib python-configobj PyYAML python-requests python-jsonpatch python-six
如果机器不能联网, 则可以找台与要制作镜像的机器同操作系统版本的可以联网的机器, 然后新建一个 requirement.txt, 将需要安装的 cloud-init 的包都放进去 requirement.txt, 然后运行命令 pip download -d -r requirements.txt, 这样全部的依赖包都会被下下来了, 最后, 再将这些包放入那台需要制作的机器即可.
requirement.txt 的截图
最后, 补充一份我实际测试时安装的依赖包, 供参考:
- certifi-2017.11.5
- chardet-3.0.4
- configobj-5.0.6
- functools32-3.2.3-2
- idna-2.6
- Jinja2-2.10
- jsonpatch-1.20
- jsonpointer-1.14
- jsonschema-2.6.0
- MarkupSafe-1.0
- oauthlib-2.0.6
- prettytable-0.7.2
- PyYAML-3.12
- requests-2.18.4
- setuptools-38.2.4
- six-1.11.0
- urllib3-1.22
说明, 以上依赖包我都是用 pip 安装的, 可以在 https://pypi.python.org/pypi 下载.
也可以安装 rpm 包, 可以在 http://mirrors.cloud.tencent.com/epel/ 找合适的包来安装. 安装完成之后, 请运行以下命令检查下是否都安装好了
- rpm -qa | grep setuptools
- rpm -qa | grep jinja2
- rpm -qa | grep prettytable
- rpm -qa | grep oauthlib
- rpm -qa | grep configobj
- rpm -qa | grep PyYAML
- rpm -qa | grep requests
- rpm -qa | grep jsonpatch
- rpm -qa | grep jsonschema
- rpm -qa | grep six
如果没有安装好, 在安装 cloud-init 的时候也会提示缺少某某依赖包, 到时候按照要求再安装即可;
需要安装的依赖包, 其实都装 cloud-init 安装包的 requirements.txt 文件中定好了包括版本要求. cat /cloud-init-17.2/requirements.txt 即可查看.
修改 cloud-init 配置文件 tips
发现部分用户, 安装好 cloud-init 之后就制作镜像了, 上传到腾讯云之后, 创建了 CVM 会发现一些异常, 检查会发现, 原来是没有按照官方要求进行 cloud-init 配置文件的修改导致的. 所以, 这个步骤千万别漏了. 很重要哈.
官网上给出了 ubuntut 和 centos 的参考配置文件, 直接下载, 然后替换即可.
设置 cloud-init 服务开机自启动 tips
这块的操作官网也给出了详细的文档说明, 但是是以 systemd 自启动服务管理为例. 而实际上是需要根据当前操作系统使用的自启动服务管理方式是什么进行选择, 如果选择出错则 cloud-init 服务无法开机自启动.
比如, 在我的测试中, 则发现 systemctl: command not found, 我测试的操作系统版本则是用 service 命令来启动.
关于安装 cloud-init 后的操作
经常有些用户辛辛苦苦把镜像上传到 cos 了, 到了导入镜像, 半天过去导入失败了, 才发现 cloud-init 的安装有问题. 那么, 如何可以确认我们安装的 cloud-init 是没问题的呢? 下面的方法, 供参考.
1, 运行 cloud-init init -local
2, 执行 ll /var/lib/cloud, 正常会看到如下截图内容
3, 执行 rm -rf /var/lib/cloud
4, 重启你的服务器, 正常情况下, 每次重启都会成 / var/lib/cloud
5, 也可以执行 cloud-init status 看下状态是否正常.
将镜像导入 COS
将镜像文件上传到 COS, 有多种工具可支持, 详情可参考官网文档 COS 用户工具 https://cloud.tencent.com/document/product/436/6242 , 也可以使用控制台 https://console.cloud.tencent.com/cos 的方式将镜像上传至 COS. 由于操作较为简单, 我就不再重复演示.
导入镜像功能使用
关于导入镜像的详细介绍可查看官网文档导入镜像概述 https://cloud.tencent.com/document/product/213/4945 , 该功能需要开启白名单方可使用. 相关操作演示如下, 仅供参考.
1, 登录镜像控制台 https://console.cloud.tencent.com/cvm/image , 选择地域(请选择与存放镜像的 COS 的 bucket 同个地域), 然后点击[导入镜像按钮] .
2, 阅读导入镜像的步骤, 并且确认所有准备步骤已经完成.
3, 填写信息, 并且开始导入.
关于镜像文件 URL: 选择存储镜像的 bucket, 找到镜像文件, 然后点击[文件信息] , 在弹出来的框里面, 把[源文件链接] 的信息复制出来, 就是镜像文件 URL 了
关于地域, 请选择 Bucket(存放镜像文件的 Bucket)所在的地域. 其余的信息, 如实按照镜像的实情填写即可.
关于导入方式, 如果正常安装了 cloud-init, 则选择[正常] , 否则请选择[强制] .
补充, 若非级特殊的情况无法安装 cloud-init, 否则请不要选择强制导入. 强制导入的镜像, 由于没有 cloud-init, 基于该镜像创建的 CVM, 无法初始化, 需要再创建 CVM 之后, 登录操作系统进行许多初始化操作, 是一件较为麻烦的事情.
最后, 则是点击[开始导入] , 等待一段时间之后, 会有站内信通知导入的结果. 由于没有进度条之类的信息, 无法预估预计还需要多久才能有结果. 期间可以登录操作日志控制台 https://console.cloud.tencent.com/operatelog 进行查看状态.
操作日志控制台
镜像导入成功之后, 则可以登录镜像控制台 https://console.cloud.tencent.com/cvm/image , 找到已经成功导入的镜像, 然后基于该镜像创建云主机.
40.jpg
服务迁移工具使用
近期腾讯云也推出了新功能[服务迁移] , 和[导入镜像] 的功能的差异, 简单描述如下.
1, 导入镜像, 只能导入系统盘, 数据盘无法导入. 而使用[云服务器迁移] 功能, 可以将系统盘和数据盘都导入到腾讯云.
2, 导入功能, 步骤是把存在 COS 的镜像导入到镜像控制台, 然后再基于该镜像创建 CVM; 而云服务器迁移则是, 直接从 COS 上拉取镜像文件, 用该镜像置换一个已存在的 CVM 实例的系统盘, 从而实现迁移.(同理, 数据盘的迁移也是一个类似的过程. 得先创建 CVM 或者 CBS, 再使用云服务器迁移的功能.)
离线实例迁移
下面是相关操作步骤, 仅供参考.
1, 点击[新建] 按钮新建一个迁移任务
2, 了解迁入准备工作
3, 填写相关信息, 开始迁移.
填写任务名称
填写 COS 链接, 即镜像文件的 COS 链接, 同导入镜像时需要填写的 COS 链接.
选择需要迁入的云主机. 正如我上面提到的, 使用服务迁移的功能进行迁移, 是需要预先创建一台 CVM, 然后将导入的镜像置换此台 CVM 的系统盘, 从而完成迁移.
4, 等待迁移任务完成, 可以在控制台中看到进度.
5, 迁移 100% 完成之后, 用户则可以到云主机控制台找到刚刚迁入的云主机, 重新开机启动即可.
离线数据迁移
离线数据迁移指的是迁移数据盘. 数据盘也是可以制作成一个镜像, 上传至 COS, 然后使用[离线数据迁移] 的功能, 将数据盘的镜像文件迁移到 CBS 中. 相关步骤类似[离线实例迁移] .
1, 点击[新建] 按钮新建一个迁移任务
2, 了解迁入准备工作
3, 填写相关信息, 开始迁移.
填写任务名称
填写 COS 链接, 即镜像文件的 COS 链接, 同导入镜像时需要填写的 COS 链接.
选择需要迁入的云硬盘. 正如我上面提到的, 使用服务迁移的功能进行迁移, 是需要预先创建一个 CBS 云盘, 然后将导入的数据盘镜像置换该云盘, 从而完成迁移.
4, 等待迁移任务完成, 可以在控制台中看到进度.
5, 迁移 100% 完成之后, 用户将此云盘挂载到云主机即可.
本次的主机迁移实践分享到此, 希望对大家有帮助. 谢谢各位的浏览.
来源: https://www.qcloud.com/developer/article/1158625