歡迎大家前往騰訊雲+社區,獲取更多騰訊海量技術實踐干貨哦~
主機遷移概述
在雲計算時代,不管是從IDC上雲還是多雲直接的遷移,都已經是常見的事宜。而在上雲/遷移的方案中,也是有多種的方式能夠將主機遷移到騰訊雲中。

然而,不同的方式會有不同的利弊。

目前,騰訊雲可以提供導入鏡像和服務遷移(冷遷移)的工具,而這兩種方式均涉及到鏡像制作。故本文將分享鏡像制作的操作步驟,僅供參考。
1、在制作鏡像之前需要了解符合導入騰訊雲的鏡像文件要求,詳情可參考導入鏡像概述。

Linux 系統類型鏡像限制

Windows 系統類型鏡像限制
2、接下來則依據操作系統的不同,選擇不同的鏡像制作方法。請分別參考官網文檔Linux 鏡像制作和Windows 鏡像制作。
3、在制作鏡像之前,需要在Linux操作系統里安裝cloud-init,在Widows操作系統里安裝cloud-base。相應的操作可以查看官網文檔Linux 系統安裝 cloud-init和Windows 系統安裝 cloud-base。
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,而我在此則僅補充相關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 用戶工具,也可以使用控制台的方式將鏡像上傳至COS。由於操作較為簡單,我就不再重復演示。
導入鏡像功能使用
關於導入鏡像的詳細介紹可查看官網文檔導入鏡像概述,該功能需要開啟白名單方可使用。相關操作演示如下,僅供參考。
1、登錄鏡像控制台,選擇地域(請選擇與存放鏡像的COS的bucket同個地域),然后點擊【導入鏡像按鈕】。

2、閱讀導入鏡像的步驟,並且確認所有准備步驟已經完成。

3、填寫信息,並且開始導入。
- 關於鏡像文件URL:選擇存儲鏡像的bucket,找到鏡像文件,然后點擊【文件信息】,在彈出來的框里面,把【源文件鏈接】的信息復制出來,就是鏡像文件URL了


- 關於地域,請選擇Bucket(存放鏡像文件的Bucket)所在的地域。其余的信息,如實按照鏡像的實情填寫即可。

- 關於導入方式,如果正常安裝了cloud-init,則選擇【正常】,否則請選擇【強制】。

補充,若非級特殊的情況無法安裝cloud-init,否則請不要選擇強制導入。強制導入的鏡像,由於沒有cloud-init,基於該鏡像創建的CVM,無法初始化,需要再創建CVM之后,登錄操作系統進行許多初始化操作,是一件較為麻煩的事情。
- 最后,則是點擊【開始導入】,等待一段時間之后,會有站內信通知導入的結果。由於沒有進度條之類的信息,無法預估預計還需要多久才能有結果。期間可以登錄操作日志控制台進行查看狀態。


操作日志控制台
- 鏡像導入成功之后,則可以登錄鏡像控制台,找到已經成功導入的鏡像,然后基於該鏡像創建雲主機。

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%完成之后,用戶將此雲盤掛載到雲主機即可。
問答
CVM的默認DNS配置?
相關閱讀
在 CentOS7.2 下 DIY 動手搭建一個 WordPress
基於混合集成學習算法的熱遷移超時預測模型
低於0.01%的極致Crash率是怎么做到的?
【每日課程推薦】新加坡南洋理工大學博士,帶你深度學習NLP技術
此文已由作者授權騰訊雲+社區發布,更多原文請點擊
搜索關注公眾號「雲加社區」,第一時間獲取技術干貨,關注后回復1024 送你一份技術課程大禮包!
海量技術實踐經驗,盡在雲加社區!
