一、前言

P2V,含义为物理机转成虚拟机,并可以健康运行在openstack或其他虚拟化的环境中。

二、前提准备

三、操作步骤

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盘启动盘

openstack 平台P2V迁移

选择 写入硬盘映像。

目前virt-p2v-1.32.7-2.el7.iso此版本不支持centos6.x系统的迁移,可以使用virt-p2v-1.36.10-1.el7.iso或更新版本对centos6.x系统进行迁移

5、操作物理机,进行迁移。

将使用virt-p2v镜像制作的U盘启动盘来引导物理机。

openstack 平台P2V迁移

进入到图形界面

openstack 平台P2V迁移

1.填写中转机的IP地址

2.填写中转机的sshd服务端口号(默认为22)

3.填写中转机用户名

4.填写中转机对应用户名的密码

5.填写私有sshd服务密钥路径(可以不填写)

配置网络, 如果没有dhcp。需要手动配置一个静态ip地址,点击configure network ,删除所有默认的网络配置,手动创建新的

openstack 平台P2V迁移

选择网卡设备,这里我们要选择可以 连接到 中转机的网卡设备

openstack 平台P2V迁移

配置ip地址

openstack 平台P2V迁移

通常这里保存之后,会有一会时间,网络才会配置上,可能需要进入到xterm ,查看一下。

openstack 平台P2V迁移

点击Test connection,然后 测试通过后,点击Next。

openstack 平台P2V迁移

设置迁移信息,

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、要转换成虚拟机的时候,保留的物理网卡

openstack 平台P2V迁移

配置好后,点击Start conversion。

openstack 平台P2V迁移

以下是示例配置信息:

将转换成的虚拟机磁盘,保存到中转机的/p2v-pool,虚拟磁盘格式为qcow2 格式。

openstack 平台P2V迁移

登录到中转机查看过程

根据被迁移的物理机的磁盘大小决定迁移时间,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 驱动程序:

    https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.171-1/virtio-win-0.1.171.iso

    将准备好的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地址)
    

    openstack 平台P2V迁移

    更新驱动主要驱动

    
    #根据实际情况填写路径
    
    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
    

    更新其他驱动

    openstack 平台P2V迁移

    openstack 平台P2V迁移

    openstack 平台P2V迁移

    openstack 平台P2V迁移

    openstack 平台P2V迁移

    openstack 平台P2V迁移

    openstack 平台P2V迁移

  • 安装Balloon服务

    拷贝 D:\Balloon\2k8r2\amd64 (使用对应操作系统版本的Balloon下的文件)目录到 C:\Program Files 下并重命名为 Balloon

    openstack 平台P2V迁移

    openstack 平台P2V迁移

    打开PowerShell并运行命令: & 'C:\Program Files\Balloon\blnsvr.exe' -i

    openstack 平台P2V迁移
    .png)

  • 安装qemu-guest-agent

    openstack 平台P2V迁移

  • 安装cloudbase-init

    openstack 平台P2V迁移

    openstack 平台P2V迁移

    openstack 平台P2V迁移

    openstack 平台P2V迁移

    openstack 平台P2V迁移

    openstack 平台P2V迁移

  • 最后一步比较重要,如果是迁移物理机,可以不用执行这一步,因为物理机就这一台,而且物理机一般硬盘比较大,我们要直接上传到openstack 平台作为虚拟机,而不是作为镜像。

    openstack 平台P2V迁移

b)、优化linux

  1. 安装基本软件包

    # 安装NetworkManager,用于网卡的自动发现及管理
    # 安装acpid,用于虚拟机的电源管理
    yum install -y NetworkManager acpid
    
    # 开机启动服务
    
    #centos6:
    chkconfig acpid on
    chkconfig NetworkManager on
    
    #centos7:
    systemctl enable acpid
    systemctl enable NetworkManager
    
  2. 安装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
    
  3. 修改配置文件

    /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
    
  4. 禁用默认的 zeroconf route

    echo "NOZEROCONF=yes" >> /etc/sysconfig/network
    
  5. 修改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启动不了,显示为蓝屏

openstack 平台P2V迁移

解决方法:

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的时候,系统无法启动。

参考文档:

https://blog.csdn.net/tianci_zzz/article/details/73896955

https://bugzilla.redhat.com/show_bug.cgi?id=1142993

相关文章:

  • 2021-11-23
  • 2021-10-27
  • 2021-04-17
  • 2021-10-28
  • 2021-07-22
  • 2021-12-02
  • 2022-01-13
  • 2022-12-23
猜你喜欢
  • 2021-11-15
  • 2021-07-31
  • 2021-07-16
  • 2021-07-10
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案