kvm总结(3) : 导入虚拟机

前文中,我们创建了两个虚拟机,kvm1和kvm2,kvm1是通过图形化界面创建的,kvm2是通过纯命令行的方式创建的,在创建kvm2时,我们只指定了必要参数,并且提到,这样创建出的虚拟机,性能比较一般,那么怎样创建虚拟机,性能会比较强劲一点呢?现在咱们就来聊聊。

上一篇文章中创建虚拟机的命令如下

virt-install --name=kvm2 --vcpus=2 --memory=2048 --location=/data/iso/CentOS-7-x86_64-DVD-2009.iso --disk path=/var/lib/libvirt/images/kvm2.qcow2 --network network=default --graphics none --extra-args='console=ttyS0'

上述命令只使用了必要参数创建了虚拟机,这种情况下,默认是使用”全虚拟化”的方式创建的虚拟硬件,”全虚拟化”是以纯软件的方式来模拟硬件设备的,如果虚拟机系统(客户机)支持virtio驱动,则可以使用”半虚拟化”的方式创建虚拟机硬件,virtio的”半虚拟化”省去了”全虚拟化”中异常捕获的环节,可以理解为操作路径更短了,所以在IO性能上有所提升,但是使用的前提是客户机支持virtio驱动。

centos7是默认集成了virtio驱动的(RHEL4.8以后自带virtio驱动),在虚拟机中使用如下命令进行确认,查看是否包含virtio模块。

lsmod | grep virtio

所以,当虚拟机是centos7时,不用额外安装任何驱动,如果想要创建windows虚拟机,则需要下载virtio-win驱动,并安装到windows虚拟机中以后,才能将驱动模式改为virtio,否则无法使用virtio模式启动虚拟机。

查看kvm2虚拟机的配置文件,可以看到硬盘和网卡的配置如下(省略了其他信息)

...
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/kvm2.qcow2'/>
<target dev='hda' bus='ide'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
...
<interface type='network'>
<mac address='52:54:00:52:83:75'/>
<source network='default'/>
<model type='rtl8139'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
...

如上例所示,硬盘的bus总线类型为ide,网卡的类型为rtl8139,这些都是使用全虚拟化驱动默认创建出的硬件类型,我们现在就来把它改成virtio半虚拟化驱动,先来看看图形化的操作,我已经将kvm2停机了,点击下图中的open按钮,

然后点击下图中的“灯泡”按钮,查看kvm2的详细配置,
点击IDE Disk1,这个就是默认创建的网卡,点开下图中的advanced options,即可看到,硬盘的bus类型是IDE,点开下拉框,选择VirtIO,选择后,点击右下角的Apply按钮确定应用。

硬盘修改完并确定应用后,可以看到,硬盘已经从IDE Disk变成了Virtio Disk,点击网卡配置,将默认的硬件模式从rtl8139改成virtio,修改完成后,点击apply保存应用

完成上述操作后,就已经将硬盘和网卡的驱动模式改为virtio了,此时查看对应的配置文件,也是一样修改为virtio的,正如之前所说,使用图形化修改虚拟机配置,和使用virsh edit命令修改配置文件在本质上是一样的。

如果使用命令安装虚拟机时就想指定使用virtio模式的驱动,也可以在命令中指定磁盘的bus和网卡的model,示例如下:

virt-install --name=kvm2 --vcpus=2 --memory=2048 --location=/data/iso/CentOS-7-x86_64-DVD-2009.iso --disk path=/var/lib/libvirt/images/kvm2.qcow2,bus=virtio --network network=default,model=virtio --graphics none --extra-args='console=ttyS0'

到目前为止,我们已经学会了创建、查询、修改虚拟机,但是我们还没有删除过虚拟机,现在就来试试通过命令删除虚拟机。
查看当前的虚拟机,我已经停止了kvm2,如下

[root@cos7 ~]# virsh list --all
Id Name State
----------------------------------------------------
- kvm1 shut off
- kvm2 shut off

使用virsh undefine命令,即可删除对应的虚拟机,如下

[root@cos7 ~]# virsh undefine kvm2
Domain kvm2 has been undefined
 
[root@cos7 ~]# virsh list --all
Id Name State
----------------------------------------------------
- kvm1 shut off

删除后,通过virsh list命令就看不到对应的虚拟机了,查看/etc/libvirt/qemu目录,会发现kvm2.xml文件已经没有了,但是,查看/var/lib/libvirt/images/目录,还可以看到对应kvm2.qcow2文件,如下

[root@cos7 ~]# ls /etc/libvirt/qemu
autostart kvm1.xml networks
[root@cos7 ~]# ls /var/lib/libvirt/images/
kvm1.qcow2 kvm2.qcow2

也就是说,kvm2的虚拟机镜像文件还是存在的,我们可以手动删除这个文件,就相当于彻底删除了kvm2虚拟机(如果想要同时删除配置文件和对应的磁盘,可以在undefine命令中加入–remove-all-storage参数,但是这样操作风险较大,不推荐使用),只删除xml配置文件的情况下,磁盘镜像可以留作备份,等待需要的时候,再次导入,当然,这个文件也可以在其他kvm宿主机上导入(相当于迁移),导入命令如下

virt-install --import --name kvm2import --ram 4096 --vcpus=4 --cpu host-model --disk path=/var/lib/libvirt/images/kvm2.qcow2,bus=virtio --network network=default,model=virtio --nographics

没错,仍然还是使用virt-install命令导入镜像,–import选项表明是导入操作,上述命令中的虚拟机的名称、内存和cpu设置、网络、硬盘、驱动都可以在导入时根据情况进行设定,换句话说就是,即使创建kvm2时设置了2G内存,如果在导入镜像时,想要分配4G内存,那么只要在导入时指定–ram 4096就行了,并不一定要和原配置保持一致,我在导入时就指定使用了virtio模式驱动,这是因为我确认虚拟机使用的是centos7.9的系统,不用额外安装任何驱动。
由于我们在创建kvm2虚拟机时配置了虚拟终端(使用了–extra-args=’console=ttyS0’参数),所以在导入虚拟机时我指定了–nographics选项,–nographics选项表示使用非图形化的console连入虚拟机(但是前提是我们确定已经为虚拟机配置好了终端),如果你在服务器的桌面环境(图形化环境)中执行上述命令,或者配置好了x11forward,可以省略–nographics选项,默认情况下会为我们分配一个virt-view图形化控制台,我们也可以通过这个图形化控制台连入导入的虚拟机。
如果我们使用的是纯远程的ssh客户端,并且不支持xwindow(x11forward)的转发,在执行上述命令时也无法使用–nographics选项,那么在导入时可能会卡在如下图中的位置

在这种情况下,去服务器中查看对应的虚拟机,很有可能是已经导入成功的,可以先关闭这个远程窗口,然后通过宿主机的图形化或者命令行窗口连入虚拟机。

如果我们压根就不想在导入虚拟机时连入控制台,则可以直接使用–noautoconsole选项,表示不会自动连入到虚拟机的控制台,示例如下

virt-install --import --name kvm2import --ram 4096 --vcpus=4 --cpu host-model --disk path=/var/lib/libvirt/images/kvm2.qcow2,bus=virtio --network network=default,model=virtio --noautoconsole

当导入成功以后,可以看到对应的虚拟机名称,而且kvm自动生成了对应的配置文件,也就是kvm2import.xml

[root@cos7 ~]# virsh list --all
Id Name State
----------------------------------------------------
2 kvm2import running
- kvm1 shut off
 
[root@cos7 ~]# ls /etc/libvirt/qemu
autostart kvm1.xml kvm2import.xml networks

查看配置文件,或者使用如下命令,可以看到,kvm2import虚拟机使用的磁盘镜像就是 /var/lib/libvirt/images/kvm2.qcow2,导入成功了

[root@cos7 qemu]# virsh domblklist kvm2import
Target Source
------------------------------------------------
vda /var/lib/libvirt/images/kvm2.qcow2

如果你和我一样,有点强迫症,觉得虚拟机名字和对应的磁盘文件名不一样,心里不爽。
可以先停止kvm2虚拟机,然后通过virsh domrename命令重命名kvm2import虚拟机,如下

[root@cos7 qemu]# virsh domrename kvm2import kvm2
Domain successfully renamed
 
[root@cos7 qemu]# virsh list --all
Id Name State
----------------------------------------------------
- kvm1 shut off
- kvm2 shut off
 
[root@cos7 qemu]# ls
autostart kvm1.xml kvm2.xml networks

如上所示,重命名完成后,虚拟机名称已经变成kvm2,并且对应的配置文件名也从kvm2import.xml变成了kvm2.xml

其实,如果已经有对应的xml配置文件,并且有对应的镜像文件,那么我们也可以直接通过define命令导入,为了方便示例,我先备份一下xml配置文件,操作如下

[root@cos7 qemu]# pwd
/etc/libvirt/qemu
[root@cos7 qemu]# ls
autostart kvm1.xml kvm2.xml networks
[root@cos7 qemu]# cp kvm2.xml{,.backup}
[root@cos7 qemu]# ls
autostart kvm1.xml kvm2.xml kvm2.xml.backup networks

我备份了kvm2.xml的配置文件,现在使用undefine命令删除kvm2虚拟机的定义

[root@cos7 qemu]# virsh list --all
Id Name State
----------------------------------------------------
- kvm1 shut off
- kvm2 shut off
 
[root@cos7 qemu]# virsh undefine kvm2
Domain kvm2 has been undefined
 
[root@cos7 qemu]# ls
autostart kvm1.xml kvm2.xml.backup networks
[root@cos7 qemu]# ls /var/lib/libvirt/images/
kvm1.qcow2 kvm2.qcow2
[root@cos7 qemu]# virsh list --all
Id Name State
----------------------------------------------------
- kvm1 shut off

如上所示,执行undefine命令以后,列表中已经看不到kvm2虚拟机了,现在我们将备份的xml文件名还原,然后通过define命令和配置文件,重新定义kvm2主机,让kvm2主机重新出现在列表中,操作如下

[root@cos7 qemu]# pwd
/etc/libvirt/qemu
[root@cos7 qemu]# ls
autostart kvm1.xml kvm2.xml.backup networks
[root@cos7 qemu]# mv kvm2.xml.backup kvm2.xml
[root@cos7 qemu]# ls
autostart kvm1.xml kvm2.xml networks
[root@cos7 qemu]# virsh define /etc/libvirt/qemu/kvm2.xml
Domain kvm2 defined from /etc/libvirt/qemu/kvm2.xml
 
[root@cos7 qemu]# virsh list --all
Id Name State
----------------------------------------------------
- kvm1 shut off
- kvm2 shut off

到目前为止,虚拟机的‘增删改查’我们都已经初步的接触到了,剩下的操作,我们之后再慢慢聊吧。

posted @ 2021-11-10 11:11  禾子、  阅读(1036)  评论(0编辑  收藏  举报