【Openstack】P2V遷移
一、前言
P2V,含義為物理機轉成虛擬機,並可以健康運行在openstack或其他虛擬化的環境中。
二、前提准備
-
中轉機操作系統:CentOS-7.6.1801
-
中轉機所需rpm安裝包:virt-p2v 、virt-manager 、virt-v2v、 libguestfs-win-support、 libguestfs* 、virtio-win 以及它們相關的依賴包
-
中轉機針對windows 需要下載的文件:
https://github.com/jakobadam/kvm-mergeide/archive/master.zip
-
被遷移的物理機為windows 的時候 ,需要准備的文件:
https://www.virtualbox.org/raw-attachment/wiki/Migrate_Windows/MergeIDE.zip
-
windows 虛擬機驅動程序
-
virt-p2v.iso 鏡像文件
http://oirase.annexia.org/virt-p2v/RHEL-7.4-preview/virt-p2v-1.36.3-1.el7.iso
三、操作步驟
1、安裝遷移中轉機
安裝步驟省略,
需要注意的是,一般被遷移的物理機,磁盤比較大,所以中轉機的磁盤空間最好大於1T。
2、配置中轉機
a)、制作的離線倉庫
b)、安裝軟件包
# 安裝kvm 虛擬化環境
yum install virt-p2v virt-manager virt-v2v virt-* libguestfs-win-support libguestfs* -y
# 安裝virtio-win-0.1.141-1.noarch.rpm
yum localinstall virtio-win-0.1.141-1.noarch.rpm
3、創建存儲池(可選)
[root@p2v-node ~]# mkdir /p2v-pool #創建存儲目錄
[root@p2v-node ~]# chown root:root /p2v-pool #修改屬主屬組
[root@p2v-node ~]# chmod 755 /p2v-pool #更改權限
[root@p2v-node ~]# virsh pool-define-as P2vPool --type dir --target /p2v-pool #定義存儲池
Pool P2vPool defined
[root@p2v-node ~]# virsh pool-build P2vPool #創建存儲池
Pool P2vPool built
[root@p2v-node ~]# virsh pool-start P2vPool #啟動存儲池
Pool P2vPool started
[root@p2v-node ~]# virsh pool-autostart P2vPool #設置自動啟動
Pool P2vPool marked as autostarted
[root@p2v-node ~]# virsh pool-info P2vPool #查看存儲池信息
Name: P2vPool
UUID: f7f2dc1c-67ab-48b9-891b-bb3698fbc040
State: running
Persistent: yes
Autostart: yes
Capacity: 499.76 GiB
Allocation: 84.87 MiB
Available: 499.67 GiB
4、制作virt-p2v的 U盤引導啟動工具
a)、下載virt-p2v鏡像文件
下載地址: http://oirase.annexia.org/virt-p2v/RHEL-7.4-preview/virt-p2v-1.36.3-1.el7.iso
b)、使用 UltraISO 軟件制作u盤啟動盤
選擇 寫入硬盤映像。
目前virt-p2v-1.32.7-2.el7.iso此版本不支持centos6.x系統的遷移,可以使用virt-p2v-1.36.10-1.el7.iso或更新版本對centos6.x系統進行遷移
5、操作物理機,進行遷移。
將使用virt-p2v鏡像制作的U盤啟動盤來引導物理機。
進入到圖形界面
1.填寫中轉機的IP地址
2.填寫中轉機的sshd服務端口號(默認為22)
3.填寫中轉機用戶名
4.填寫中轉機對應用戶名的密碼
5.填寫私有sshd服務密鑰路徑(可以不填寫)
配置網絡, 如果沒有dhcp。需要手動配置一個靜態ip地址,點擊configure network ,刪除所有默認的網絡配置,手動創建新的
選擇網卡設備,這里我們要選擇可以 連接到 中轉機的網卡設備
配置ip地址
通常這里保存之后,會有一會時間,網絡才會配置上,可能需要進入到xterm ,查看一下。
點擊Test connection,然后 測試通過后,點擊Next。
設置遷移信息,
1.填寫主機名稱,cpu數量,內存容量(此項自定義)
2.選擇管理工具(libvirt),生成鏡像文件的輸出位置(存儲池名稱)和輸出格式(raw,qcow2)
填寫 物理機轉換為虛擬機的輸出方式和格式,具體如下: output to (-o): 選擇輸出模式,推薦選擇 libvirt 模式或者 local 模式 output conn (-oc): 填寫一個 kvm 虛擬化的域名 (可選) output storage (-os): 填寫一個存儲位置,對應輸出模式選擇存儲位置, libvirt 對應存儲池名稱, local 對應中轉機的存儲目錄 output format (-of): 填寫輸出格式,推薦 qcow2 格式,如果存儲位置空間夠大,可以填寫 raw 格式
3.選擇需要轉換的硬盤
4、要轉換成虛擬機的時候,保留的物理網卡
配置好后,點擊Start conversion。
以下是示例配置信息:
將轉換成的虛擬機磁盤,保存到中轉機的/p2v-pool,虛擬磁盤格式為qcow2 格式。
登錄到中轉機查看過程
根據被遷移的物理機的磁盤大小決定遷移時間,1.4T遷移了大概一天的時間,
#####會在中轉機的/tmp目錄下面,生成相關文件
查看遷移進度:
# tailf /tmp/virt-p2v-20191031-a2b1r92d/virt-v2v-conversion-log.txt
查看轉換成功的虛擬機磁盤文件
[root@virt-p2v /p2v-pool]# qemu-img info P2V-DISK-NAME #切換到存儲池目錄查看磁盤信息
image: P2V-DISK-NAME
file format: qcow2
virtual size: 6.3G (6713966592 bytes)
disk size: 1.5G
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
refcount bits: 16
corrupt: false
遷移過程中選擇了libvirt模式,那么物理機的操作系統遷移過來后,會直接在中轉機virt-manager中生成shut off狀態的虛擬機。
6、優化參數
剛p2v遷移過來的虛擬機是無法正常使用的,需要進行優化參數,尤其是windows操作系統。另外如果要遷移到雲平台上面,那么需要安裝一些軟件。
a)、優化windows
-
更新驅動
windows 驅動程序:
將准備好的windows 驅動iso鏡像,上傳到中轉機上
virt-install \ --name p2v-win-test\ --ram 8192 --vcpus 2 --boot hd \ --network network=default,model=virtio \ --disk path=/p2v-pool/win08-new-sda,format=raw,device=disk,bus=ide \ --disk path=/p2v-pool/virtio-win-0.1.141.iso,device=cdrom \ --graphics vnc,listen=0.0.0.0 --noautoconsole --os-type windows --os-variant win2k8r2
使用vnc 軟件遠程登錄到 虛擬機里面,
# 查看虛擬機的vnc 端口 virsh vncdisplay p2v-win-test :0 #####使用 ip+vnc端口遠程連接虛擬機。(ip為中轉機的ip地址)
更新驅動主要驅動
#根據實際情況填寫路徑 PnPutil.exe -i -a D:\viostor\2k8r2\amd64\viostor.inf PnPutil.exe -i -a D:\vioserial\2k8R2\amd64\vioser.inf PnPutil.exe -i -a D:\vioscsi\2k8R2\amd64\vioscsi.inf PnPutil.exe -i -a D:\viorng\2k8R2\amd64\viorng.inf
更新其他驅動
-
安裝Balloon服務
拷貝
D:\Balloon\2k8r2\amd64
(使用對應操作系統版本的Balloon下的文件)目錄到C:\Program Files
下並重命名為Balloon
打開PowerShell並運行命令:
& 'C:\Program Files\Balloon\blnsvr.exe' -i
.png) -
安裝qemu-guest-agent
-
安裝cloudbase-init
-
最后一步比較重要,如果是遷移物理機,可以不用執行這一步,因為物理機就這一台,而且物理機一般硬盤比較大,我們要直接上傳到openstack 平台作為虛擬機,而不是作為鏡像。
b)、優化linux
-
安裝基本軟件包
# 安裝NetworkManager,用於網卡的自動發現及管理 # 安裝acpid,用於虛擬機的電源管理 yum install -y NetworkManager acpid # 開機啟動服務 #centos6: chkconfig acpid on chkconfig NetworkManager on #centos7: systemctl enable acpid systemctl enable NetworkManager
-
安裝cloud-init相關軟件包
# 安裝cloud-init,用於注入密碼/密鑰和主機名 # 安裝qemu-guest-agent,用於在面板更新密碼/密鑰 # 安裝cloud-utils,用於更改虛擬機根分區大小(可選安裝,需要啟用epel源) yum install -y cloud-init qemu-guest-agent cloud-utils # 開機啟動服務(有的linux發行版默認不開機自啟這些服務,需要手動設置開機自啟) #centos6: chkconfig cloud-init on chkconfig cloud-init-local on chkconfig cloud-config on chkconfig cloud-final on chkconfig qemu-ga on #centos7: systemctl enable cloud-init systemctl enable cloud-init-local systemctl enable cloud-config systemctl enable cloud-final systemctl enable qemu-guest-agent
-
修改配置文件
/etc/cloud/cloud.cfg
users: - default disable_root: 0 ssh_pwauth: 1 locale_configfile: /etc/sysconfig/i18n mount_default_fields: [~, ~, 'auto', 'defaults,nofail', '0', '2'] resize_rootfs_tmp: /dev ssh_deletekeys: 0 ssh_genkeytypes: ~ syslog_fix_perms: ~ datasource_list: ['ConfigDrive','Ec2','NoCloud'] datasource: Ec2: timeout: 2 max_wait: 5 cloud_init_modules: - migrator - seed_random - bootcmd - write-files - growpart - resizefs - set_hostname - update_hostname - update_etc_hosts - ca-certs - rsyslog - users-groups - ssh cloud_config_modules: - mounts - locale - set-passwords - timezone - puppet - chef - salt-minion - mcollective - disable-ec2-metadata - runcmd 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 system_info: distro: rhel default_user: name: cloud-user paths: cloud_dir: /var/lib/cloud templates_dir: /etc/cloud/templates ssh_svcname: sshd
-
禁用默認的 zeroconf route
echo "NOZEROCONF=yes" >> /etc/sysconfig/network
-
修改kernel啟動參數,編輯/boot/grub/grub.conf,在kernel所在行添加console字段
Note
centos6需要配置此項
kernel ... console=ttyS0,115200n8 console=tty0
7、上傳到openstack 平台
a) 、更改虛擬機磁盤文件的格式
將轉換后的qcow2文件轉換成 raw 格式
[root@overcloud-novacompute-0 ~]# qemu-img convert win08-new-sda.qcow2 -f qcow2 -O raw win08-new-sda.raw
# 如果已經轉換成 raw 格式,就不需要進行這一步了
b)、 在openstack平台上新創建一個虛擬機,並將虛擬機關機。
此步驟略
c)、因為我的環境使用的是ceph 環境,所以進行如下操作
# rbd ls -l -p vms | grep <vm id>
1c10d2d5-0c90-420c-b07c-0719a91fb66d_disk 40960M images/5a39368b-5d1e-4007-b20e-608d38a36b84@snap 2
# 其中《vm id》為平台所創建虛擬機的 id
d)、 刪除新建虛擬機的磁盤文件,使用遷移過來的磁盤文件替換新建虛擬機的磁盤文件。
# rbd -p vms rm 1c10d2d5-0c90-420c-b07c-0719a91fb66d_disk
Removing image: 100% complete...done.
# rbd import -p vms P2V-DISK-NAME.raw 1c10d2d5-0c90-420c-b07c-0719a91fb66d_disk
rbd: --pool is deprecated for import, use --dest-pool
Importing image: 100% complete...done.
e)、回到openstack 平台,開啟剛創建的虛擬機,進入系統后,為被遷移物理機的操作系統。
四、常見問題解決方法
1、windows啟動不了,顯示為藍屏
解決方法:
1、刪除虛擬機
virsh destroy win-08-new
virsh undefine win-08-new
2、修改啟動參數,重新啟動虛擬機
修改--disk path=/p2v-pool/win08-new-sda.raw,format=raw,device=disk,bus=virtio
為 --disk path=/p2v-pool/win08-new-sda.raw,format=raw,device=disk,bus=ide
virt-install \
--name win-08-new \
--ram 8192 --vcpus 2 --boot hd \
--network network=default,model=virtio \
--disk path=/p2v-pool/win08-new-sda.raw,format=raw,device=disk,bus=ide \
--disk path=/p2v-pool/virtio-win-0.1.141.iso,device=cdrom \
--graphics vnc,listen=0.0.0.0 --noautoconsole --os-type windows --os-variant win2k8r2
3、在中轉機上強制關閉虛擬機
virsh destroy win-08-new
4、在中轉機上執行如下操作
wget https://github.com/jakobadam/kvm-mergeide/archive/master.zip
unzip master.zip
cd kvm-mergeide-master
virt-win-reg --merge win-08-new mergeide.reg
# 注意:這條命令里的win-08-new是你之前創建kvm虛擬機的名稱,virt-win-reg會自動搜索KVM中noactive的虛擬機名稱,然后執行mergeide.reg
4、使用vnc軟件遠程連接,安裝驅動(重要),具體步驟看優化windows 步驟。
# 啟動虛擬機
virsh start win-08-new
更新驅動步驟省略
5、在中轉機上為剛啟動的windows虛擬機,動態添加磁盤 (重要)
# 創建空的虛擬機磁盤文件
dd if=/dev/zero of=/opt/test.img bs=4k count=20
# 掛載文件
virsh attach-disk p2v-test-win2008-2 /opt/test.img --targetbus=virtio vdb
6、使用vnc 進入設備管理器,查看磁盤控制器,可以看到redhar virtio scsi device 設備驅動,說明操作成功。
然后關閉虛擬機,刪除虛擬機,將bus修改成 virtio ,重新啟動虛擬機。
virsh destroy win-08-new
virsh undefine win-08-new
virt-install \
--name win-08-new \
--ram 8192 --vcpus 2 --boot hd \
--network network=default,model=virtio \
--disk path=/p2v-pool/win08-new-sda.raw,format=raw,device=disk,bus=vitio\
--disk path=/p2v-pool/virtio-win-0.1.141.iso,device=cdrom \
--graphics vnc,listen=0.0.0.0 --noautoconsole --os-type windows --os-variant win2k8r2
虛擬機正常啟動,導致虛擬機無法正常啟動,是因為沒有vitio的驅動程序,所以bus為virtio的時候,系統無法啟動。
參考文檔: