從某國内知名共有雲平台遷移至企鵝雲存在着種種問題,無法直接遷,手動部署苦不堪言,是以考慮采用鏡像方式進行copy。
首先各大公有雲平台之間架構和實作方式稍有差異,具體差異不做詳細闡述,是以如果想要雲平台之間的鏡像互用的話就需要進行一系列的前提操做才能夠順利遷移,具體案例記錄如下:
首先準備一台公有雲(非企鵝雲)的centos伺服器;
建立好伺服器後首先檢查下該平台是否支援以下步驟的驗證:
(1)确認目前核心是否支援virtio驅動
grep -i virtio /boot/config-$(uname -r)
如下圖所示:目前核心包含了virtio_blk和virtio_net驅動,并且是以子產品形式編譯的(CONFIG_VIRTIO_BLK=m,表示編譯成為核心子產品,等于y表示編譯進核心),如果這一步沒有找到virtio_net或virtio_blk的驅動資訊,那麼該鏡像 不支援 導入企鵝雲。
如果核心支援virtio驅動(virtio_blk和virtio_net都支援),且virtio_blk驅動編譯進入了核心(即CONFIG_VIRTIO_BLK=y),則該核心支援導入,不需要後續确認,如果virtio_blk驅動是編譯成核心子產品的(即CONFIG_VIRTIO_BLK=m),則還需要繼續後續确認步驟,确認virtio_blk驅動正确包含進了initramfs(或initrd)檔案中。
(2)确認initramfs中是否包含virtio_blk驅動
lsinitrd /boot/initramfs-$(uname -r).img | grep virtio
如下圖所示,initramfs中包含了virtio_blk驅動,以及其所依賴的virtio.ko、virtio_pci.ko、virtio_ring.ko,這樣initramfs包含驅動正常,該鏡像可以導入。
驗證通過後:使用腳本運作:
#!/bin/bash
#author:wun
#企鵝雲鏡像導入準備腳本
#執行安裝cloud-init前需要先确認系統是否有BLK和net子產品
#grep -i virtio /boot/config-$(uname -r) #檢查核心是否支援BLK和NET
#lsinitrd /boot/initramfs-$(uname -r).img | grep virtio
#cp /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak
#mkinitrd -f --with=virtio_blk --with=virtio_pci /boot/initramfs-$(uname -r).img $(uname -r)
#安裝cloud-init-17
mkdir /migrate_QQ
cd /migrate_QQ
pip install setuptools jinja2 prettytable oauthlib configobj pyyaml requests jsonpatch jsonschema six
wget https://launchpad.net/cloud-init/trunk/17.1/+download/cloud-init-17.1.tar.gz
tar -zxvf cloud-init-17.1.tar.gz
cd ./cloud-init-17.1
python setup.py build
python setup.py install --init-system systemd
#建立系統使用者
useradd syslog
#備份原配置檔案
cp /etc/cloud/cloud.cfg /etc/cloud/cloud.cfg.bak
#替換配置檔案
echo "users:
- default
disable_root: 0
ssh_pwauth: 1
datasource_list: [ ConfigDrive, None ]
datasource:
ConfigDrive:
dsmode: local
cloud_init_modules:
- migrator
- bootcmd
- write-files
- growpart
- resizefs
- set_hostname
- update_hostname
- update_etc_hosts
- rsyslog
- users-groups
- ssh
cloud_config_modules:
- mounts
- locale
- set-passwords
- rh_subscription
- yum-add-repo
- package-update-upgrade-install
- ntp
- timezone
- resolv_conf
- puppet
- chef
- salt-minion
- mcollective
- disable-ec2-metadata
- runcmd
unverified_modules: ['resolv_conf']
cloud_final_modules:
- rightscale_userdata
- scripts-per-once
- scripts-per-boot
- scripts-per-instance
- scripts-user
- ssh-authkey-fingerprints
- keys-to-console
- phone-home
- final-message
- power-state-change
system_info:
default_user:
name: centos
lock_passwd: false
gecos: Cloud User
groups: [wheel, adm, systemd-journal]
sudo: ['ALL=(ALL) NOPASSWD:ALL']
shell: /bin/bash
distro: rhel
paths:
cloud_dir: /var/lib/cloud
templates_dir: /etc/cloud/templates
ssh_svcname: sshd
#vim:syntax=yaml">/etc/cloud/cloud.cfg
#版本判斷
release=`cat /etc/redhat-release|sed -r 's/.* ([0-9]+)\..*/\1/'`
if [ "$release" = "7" ]; then
#centos7
systemctl enable cloud-init-local.service
systemctl enable cloud-init.service
systemctl enable cloud-config.service
systemctl enable cloud-final.service
systemctl start cloud-init-local.service
systemctl start cloud-init.service
systemctl start cloud-config.service
systemctl start cloud-final.service
elif [ "$release" = "6" ]; then
#centos6
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
fi
#備份原配置檔案
cp /lib/systemd/system/cloud-init-local.service /lib/systemd/system/cloud-init-local.service.bak
cp /lib/systemd/system/cloud-init.service /lib/systemd/system/cloud-init.service.bak
#替換配置檔案
echo "[Unit]
Description=Initial cloud-init job (pre-networking)
Wants=network-pre.target
After=systemd-remount-fs.service
Before=NetworkManager.service
Before=network-pre.target
Before=shutdown.target
Conflicts=shutdown.target
RequiresMountsFor=/var/lib/cloud
[Service]
Type=oneshot
ExecStart=/usr/bin/cloud-init init --local
ExecStart=/bin/touch /run/cloud-init/network-config-ready
RemainAfterExit=yes
TimeoutSec=0
#Output needs to appear in instance console output
StandardOutput=journal+console
[Install]
WantedBy=cloud-init.target">/.service
#替換配置檔案
echo "[Unit]
Description=Initial cloud-init job (metadata service crawler)
Wants=cloud-init-local.service
Wants=sshd-keygen.service
Wants=sshd.service
After=cloud-init-local.service
After=systemd-networkd-wait-online.service
After=networking.service
After=systemd-hostnamed.service
Before=network-online.target
Before=sshd-keygen.service
Before=sshd.service
Before=systemd-user-sessions.service
Conflicts=shutdown.target
[Service]
Type=oneshot
ExecStart=/usr/bin/cloud-init init
RemainAfterExit=yes
TimeoutSec=0
#Output needs to appear in instance console output
StandardOutput=journal+console
[Install]
WantedBy=cloud-init.target">/.service
#初始化
cloud-init init --local
rm -rf /var/lib/cloud
導入以上腳本後執行腳本,如果腳本未報錯即證明準備工作已經完成,接下來是通過共有雲平台自帶的鏡像導出功能将鏡像導出至對應的公有雲平台的對象存儲中。。。。。。
至此源端的準備工作到此完成,剩下的就是通過企鵝的COS_migrate工具将剛才導出的鏡像進行migrate,具體步驟如下:
-
擷取工具
下載下傳連結:https://github.com/tencentyun/cos_migrate_tool_v5
-
解壓縮工具包
Windows
解壓并儲存到某個目錄,例如
C:\Users\Administrator\Downloads\cos_migrate
Linux
解壓并儲存到某個目錄
unzip cos_migrate_tool_v5-master.zip && cd cos_migrate_tool_v5-master
遷移工具結構
正确解壓後的 COS Migration 工具目錄結構如下所示:
COS_Migrate_tool<br/>|——conf #配置檔案所在目錄<br/>| |——config.ini #遷移配置檔案<br/>|——db #存儲遷移成功的記錄<br/>|——dep #程式主邏輯編譯生成的JAR包<br/>|——log #工具執行中生成的日志<br/>|——opbin #用于編譯的腳本<br/>|——src #工具的源碼<br/>|——tmp #臨時檔案存儲目錄<br/>|——pom.xml #項目配置檔案<br/>|——README #說明文檔<br/>|——start_migrate.sh #Linux 下遷移啟動腳本<br/>|——start_migrate.bat #Windows 下遷移啟動腳本
說明:
db 目錄主要記錄工具遷移成功的檔案辨別,每次遷移任務會優先對比 db 中的記錄,若目前檔案辨別已被記錄,則會跳過目前檔案,否則進行檔案遷移。
log 目錄記錄着工具遷移時的所有日志,若在遷移過程中出現錯誤,請先檢視該目錄下的 error.log。
-
修改 config.ini 配置檔案
在執行遷移啟動腳本之前,需先進行 config.ini 配置檔案修改(路徑:./conf/config.ini),config.ini 内容可以分為以下幾部分:
3.1 配置遷移類型
type 表示遷移類型,使用者根據遷移需求填寫對應的辨別。例如,需要将本地資料遷移至 COS,則[migrateType]的配置内容是type=migrateLocal。
[migrateType]
type=migrateLocal
3.2 配置遷移任務
使用者根據實際的遷移需求進行相關配置,主要包括遷移至目标 COS 資訊配置及遷移任務相關配置。
#遷移工具的公共配置分節,包含了要遷移到得目标 COS 的賬戶資訊
[common]
secretId=AKIDXXXXXXXXXXXXXXXXX
secretKey=GYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
bucketName=mybcket-1251668577
region=ap-guangzhou
storageClass=Standard
cosPath=/
https=off
tmpFolder=./tmp
smallFileThreshold=5242880
smallFileExecutorNum=64
bigFileExecutorNum=8
entireFileMd5Attached=on
daemonMode=off
daemonModeInterVal=60
executeTimeWindow=00:00,24:00
3.3 配置資料源資訊
根據[migrateType]的遷移類型配置相應的分節。例如[migrateType]的配置内容是type=migrateLocal, 則使用者隻需配置[migrateLocal]分節即可。
3.3.1 配置本地資料源 migrateLocal
若從本地遷移至 COS,則進行該部配置設定置,具體配置項及說明如下:
#從本地遷移到COS配置分節
[migrateLocal]
localPath=E:\\code\\java\\workspace\\cos_migrate_tool\\test_data
exeludes=
ignoreModifiedTimeLessThanSeconds=
-
sh start_migrate.sh
sh start_migrate.sh -Dcommon.cosPath=/savepoint0403_10/