KVM---存储管理和虚拟机克隆以及基于KVM创建win7系统,和Virtio相关概念

403 阅读9分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情

Kvm存储

概念:Kvm必须要配置一个目录当作存储磁盘镜像的目录,称为这个目录是存储池

默认的存储池:

/var/lib/libvirt/images/

存储池管理

  1. 创建个目录,并这个将目录作为存储池

    [root@kvm ~]# mkdir -p /data/vmfs
    [root@kvm ~]# virsh pool-define-as vmdisk --type dir --target /data/vmfs/
    Pool vmdisk defined
    ###### vmdisk存储池的名字  --type dir 说明存储池是dir目录类型的   --target 自定那个目录作为存储池
    
  2. 构建存储池

    [root@kvm ~]# virsh pool-build vmdisk
    Pool vmdisk built
    
  3. 查看存储池的状态

    [root@kvm ~]# virsh pool-list --all
     Name                 State      Autostart 
    -------------------------------------------
     default              active     yes       
     root                 active     yes       
     vmdisk               inactive   no        
     #可以看到vmdisk存储池,没有激活
    
  4. 激活存储池,并且设置为自动启动

    [root@kvm ~]# virsh pool-start vmdisk
    Pool vmdisk started
    ​
    [root@kvm ~]# virsh pool-autostart vmdisk
    Pool vmdisk marked as autostarted
    #再次查看
    [root@kvm ~]# virsh pool-list --all
     Name                 State      Autostart 
    -------------------------------------------
     default              active     yes       
     root                 active     yes       
     vmdisk               active     yes       
    
  5. 在存储池中创建个存储卷

    [root@kvm ~]# virsh vol-create-as vmdisk bo.qcow2 3G --format qcow2
    Vol bo.qcow2 created
    ​
    #查看:
    [root@kvm ~]# ll -h /data/vmfs/
    total 196K
    -rw-------. 1 root root 193K Nov 28 18:24 bo.qcow2
    
  6. 其它命令:

    ######删除存储池中的存储卷
    [root@kvm ~]# virsh vol-delete --pool vmdisk bo.qcow2 
    Vol bo.qcow2 deleted
    ######取消激活存储池
    [root@kvm ~]# virsh pool-destroy vmdisk 
    Pool vmdisk destroyed
    ######删除存储池
    [root@kvm ~]# virsh pool-delete vmdisk
    Pool vmdisk deleted
    ######取消定义存储池
    [root@kvm ~]# virsh pool-undefine vmdisk 
    Pool vmdisk has been undefined
    

磁盘文件格式

raw:原始格式,性能最好

qcow2:性能上不如raw,但是qcow2支持快照,raw不支持

qed:暂无......

什么是写时拷贝?

raw立刻分配空间,不管用没用那么多

qcow2知只是承诺给你分配空间,当需要空间时才分配空间

创建磁盘文件

  1. 创建qcow2,raw格式的磁盘文件

    [root@kvm ~]# qemu-img create -f qcow2 test1.qow2 1
    Formatting 'test1.qow2', fmt=qcow2 size=1 encryption=off cluster_size=65536 lazy_refcounts=off[root@kvm ~]# qemu-img create -f raw test2.raw 1G
    Formatting 'test2.raw', fmt=raw size=1073741824 
    
  2. 查看虚拟磁盘文件信息

    [root@kvm ~]# qemu-img info /var/lib/libvirt/images/test1.qow2 
    image: /var/lib/libvirt/images/test1.qow2
    file format: qcow2
    virtual size: 0 (0 bytes)
    disk size: 192K
    cluster_size: 65536
    Format specific information:
        compat: 1.1
        lazy refcounts: false
    
  3. 虚拟机有出错的时候,如果虚拟机无法启动,但是文件系统没有损坏,这是我们可以将虚拟机的文件系统挂载到宿主机上

    前提:先安装个工具

    [root@kvm ~]# yum install -y libguestfs-tools
    

    libguestfs允许在虚拟机上挂载任何类型的文件系统

    ######查看磁盘镜像分区信息
    [root@kvm ~]# virt-df -h -d vm2
    Filesystem                                Size       Used  Available  Use%
    vm2:/dev/sda1                            1014M        97M       917M   10%
    ######需要挂载/dev/centos/root
    vm2:/dev/centos/root                      3.5G       948M       2.6G   27%
    ######
    [root@kvm ~]# virt-filesystems -d vm2
    /dev/sda1
    /dev/centos/root
    ​
    ######注意:前提虚拟机需要关机,挂载磁盘镜像分区
    [root@kvm ~]# guestmount -d vm2 -m /dev/centos/root --rw /mnt/
    [root@kvm ~]# df -Th
    Filesystem              Type      Size  Used Avail Use% Mounted on
    devtmpfs                devtmpfs  1.9G     0  1.9G   0% /dev
    tmpfs                   tmpfs     1.9G     0  1.9G   0% /dev/shm
    tmpfs                   tmpfs     1.9G   13M  1.9G   1% /run
    tmpfs                   tmpfs     1.9G     0  1.9G   0% /sys/fs/cgroup
    /dev/mapper/centos-root xfs        50G   19G   32G  38% /
    /dev/sda1               xfs      1014M  206M  809M  21% /boot
    /dev/mapper/centos-home xfs        26G   33M   26G   1% /home
    tmpfs                   tmpfs     378M   40K  378M   1% /run/user/0
    /dev/sr0                iso9660   4.2G  4.2G     0 100% /run/media/root/CentOS 7 x86_64
    /dev/fuse               fuse      3.5G  981M  2.6G  28% /mnt
    ######取消挂载
    [root@kvm ~]# guestunmount /mnt/
    

虚拟机克隆

  1. 图形化,右击需要克隆的虚拟机

  2. CLI

    [root@kvm qemu]# virt-clone -o vm6 --auto-clone        #-o 就是origin原始的
    Allocating 'vm2-clone.qcow2'                                                                                   | 5.0 GB  00:00:08     
    Allocating 'vm2-1-clone.qcow2'                                                                                 | 1.0 GB  00:00:00     
    ​
    Clone 'vm6-clone' created successfully.
    ​
    #还可以加个-n参数,给克隆出来的虚拟机起个名字
     virt-clone -o vm6 -n aa --auto-clone
    
  3. 还可以指定虚拟磁盘文件来创建

    virt-clone -o vm6 -n vm8 -f /var/lib/libvirt/images/vm2-1.qcow2
    

虚拟机快照

前提:该虚拟机的磁盘文件必须是qcow2的格式

[root@kvm images]# virsh snapshot-create-as vm6 vm6.snap
Domain snapshot vm6.snap created
​
#查看
[root@kvm images]# virsh snapshot-list vm6
 Name                 Creation Time             State
------------------------------------------------------------
 vm6.snap             2021-11-28 20:13:24 +0800 shutoff
  1. raw格式的如何拍快照? 首先创建个raw的磁盘

    [root@kvm images]# qemu-img create -f raw vm6.raw 1G
    Formatting 'vm6.raw', fmt=raw size=1073741824 
    

    将磁盘添加到vm6中,修改vm6.xml文件

    <disk type='file' device='disk'>
          <driver name='qemu' type='raw'/>
          <source file='/var/lib/libvirt/images/vm6.raw'/>
          <target dev='vdc' bus='virtio'/>
          <address type='pci' domain='0x0000' bus='0x00' slot='0x1a' function='0x0'/>
        </disk>
    

    然后创建快照

    [root@kvm qemu]# virsh snapshot-create-as vm6 vm6.snap1
    error: unsupported configuration: internal snapshot for disk vdc unsupported for storage type raw
    

    如上,报错了,那我们需要将raw的转为qcow2

    [root@kvm ~]# qemu-img convert -O qcow2 /var/lib/libvirt/images/vm6.raw /var/lib/libvirt/images/vm6.qcow2
    

    查看:

    [root@kvm images]# ll -h
    -rw-r--r--. 1 root root 193K Nov 28 20:31 vm6.qcow2     #已经转换为qcow2
    -rw-r--r--. 1 qemu qemu 1.0G Nov 28 20:21 vm6.raw
    

    然后在修改配置文件,将其改为qcow2的格式

    <disk type='file' device='disk'>
          <driver name='qemu' type='raw'/>
          <source file='/var/lib/libvirt/images/vm6.raw'/>
          <target dev='vdc' bus='virtio'/>
          <address type='pci' domain='0x0000' bus='0x00' slot='0x1a' function='0x0'/>
        </disk>
    

    重定义vm6.xml文件

    [root@kvm qemu]# virsh define vm6.xml 
    Domain vm6 defined from vm6.xml
    

    再次创建:

    [root@kvm qemu]# virsh snapshot-create-as vm6 vm6-1.snap
    Domain snapshot vm6-1.snap created
    

    这样就~~~

    最后回到快照:

    [root@kvm ~]# virsh snapshot-revert vm6 vm6.snap 
    

Virtio相关概念

1、Kvm系统是基于硬件虚拟化的系统,cpu的运行效率是想相当高的。

如果硬件支持Intel EPT特性,内存的运行效率也会非常高

但其它的I/O设备,比如:磁盘,网卡,Kvm系统是基于qemu纯软件模拟的方式,效率非常低下。

Kvm系统为解决I/O设备效率低下的问题,采用了virtio技术。

virtio是一个半虚拟化技术,需要需要修改Guest OS(来宾操作系统)

半虚拟化(准虚拟化)

准虛拟化:基于希望解决软件虚拟化性能上的损失,提出了--项解决方案:改动| Guest os的代码,使它以为自己是运行在虚拟化环境中,可于虚拟系统协同工作。 这种方法称为准虚拟化(半虚拟化)

虚拟化扽为硬件虚拟化和软件虚拟化,

一般较新的linux系统都内置了virtio驱动,但windows 系统需另外安装virtio驱动.

为啥Win需要另外安装virtio驱动? 因为Win是闭源的,不公布源代码的,那既然不公布源代码就没办法修改Guest OS源代码,按我们就需要安装virtio驱动,通过virtio驱动的代码来实现半虚拟化的功能。

其实也是Win操作系统中没有驱动,从而用Virtio来提供。

配置VNC

1、下载vnc服务端软件包

[root@node1 ~]# yum install -y virt-viewer#修改vnc_listen
vnc_listen = "0.0.0.0"       #将此行的注释去掉即可#重启libvirtd服务
 systemctl restart libvirtd

2、在Win上下载、安装vnc-viewer客户端,输入宿主机的节点IP,端口默认:5900,连接即可。

安装Win7虚拟机(图形化,配置文件,命令行)

图形化方式安装Win7

1、准备材料:

  • cn_windows_7_ultimate_x64_dvd_x15-66043.iso
  • virtio-win-0.1.100.iso

virtio-win的安装网址:fedorapeople.org/groups/virt…

注意:安装Win7的系统时,virtio-win的版本不能太高,要不然识别不出来。

这时应该创建两个光驱,一个用于操作系统镜像,一个用于virtio-win

这里不在一个一个的演示,重点说明一下存储,网络:

  • 存储:提前将cn_、virtio这两个ISO文件传至宿主机上。创建一个存储池,用于存放操作系统即可。

    这个存储池,在宿主机上额外添加一块/dev/sdb磁盘,然后mkfs.xfs格式化,挂载使用。

  • 网络:在图形化时自己选择即可,也可以创建一个桥接网络,去选择。

重点步骤的图示:

image.png

image.png

下面是图形化创建后其虚拟机的xml配置文件,可以看到磁盘和网卡的bus(主线)模式并不是virtio模式,因此这种方式创建的虚拟机并没有发挥virtio的作用,所以我们可以基于修改xml文件,也可以直接命令行创建。

[root@node1 ~]# vi /etc/libvirt/qemu/win7.xml
#下面是
<disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/root/test/ee.qcow2'/>
      <target dev='hda' bus='ide'/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
<disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source file='/root/cn_windows_7_ultimate_x64_dvd_x15-66043.iso'/>
      <target dev='hdb' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='0' target='0' unit='1'/>
    </disk>
<disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source file='/root/virtio-win-0.1.100.iso'/>
      <target dev='hdc' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='1' target='0' unit='0'/>
    </disk>
    <controller type='usb' index='0' model='ich9-ehci1'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x7'/>

配置文件方式创建Win7

配置文件暂时暂时还没搞懂,先看命令创建

从上面可以看出,disk的bus(主线)是"ide"格式的,我们说virtio格式的效率高,因此我们也可以把它改为"virtio"格式的,然后其余的两个是cdrom(光驱)那就不用修改了。

#编辑xml文件
vi /etc/libvirt/qemu/win7-1.xml 
<disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/root/test/ee.qcow2'/>
      <target dev='hda' bus='virtio'/>          #将bus主线部分修改
      <address type='pci'/>                     #把type改为"pci",后面的参数全部删掉,等会libvirt服务会重新生成。
    </disk> 

当然virtio主要负责提高磁盘,网络等工作效率,因此我们好需要修改磁盘信息

#原配置文件
<interface type='network'>
      <mac address='52:54:00:0d:39:03'/>
      <source network='default'/>
      <model type='e1000'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/></interface>
    
    
#修改后的配置文件
<interface type='network'>
      <mac address='52:54:00:0d:39:03'/>
      <source network='default'/>
      <model type='virtio'/>                     #就把type="virtio"修改就行了。
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    
    

命令行创建Win虚拟机

参数解析
#三个disk,第一个disk是操作系统盘,bus(主线)采用virtio模式
#第二个disk是win7的安装包驱动
#第三个是virtio驱动
#--bridge指定桥接网络(需要提前创建好)
#--graphics,配置vnc连接
#--noautoconsole,vnc不自动连接
​
#创建操作系统盘:这个命令直接创建个磁盘,当然也许可以先创建存储池,然后制定,下面就是第二种操作。
qemu-img create -f qcow2 win7.qcow2 20G
​
#命令行配置
virt-install --name=win7-1 --ram=4096 --vcpu=2 --os-type=windows --os-variant=win7 \
> --disk /root/test/uu.qcow2,bus=virtio \
> --disk cn_windows_7_ultimate_x64_dvd_x15-66043.iso,device=cdrom,bus=sata \
> --disk virtio-win-0.1.100.iso,device=cdrom,bus=sata \
> --bridge=virbr1,model=virtio \
> --graphics vnc,listen=0.0.0.0 --noautoconsole
​
​
#或者
virt-install --name=win7-1 --ram=4096 --vcpu=2 --os-type=windows --os-variant=win7 --disk /root/test/uu.qcow2,bus=virtio --disk cn_windows_7_ultimate_x64_dvd_x15-66043.iso,device=cdrom,bus=sata --disk virtio-win-0.1.100.iso,device=cdrom,bus=sata --bridge=virbr1,model=virtio --graphics vnc,listen=0.0.0.0 --noautoconsole

这时就可以用VNC连接Win虚拟机了,

安装步骤,和正常没有啥区别,就有一个地方:需要安装驱动的时候,我们要去找virtio-win光驱里面的驱动:

比如说我安装的是Win7,如下选择:

viostor/w7/amd64就行了。

注意:中途在Win7安装好之后,由于我们使用vnc控制连接的,因此再安装完之后虚拟机会关闭

此时查看发现没有虚拟机:

#list查看,会发现没有刚才的虚拟机
virsh list
​
#我们需要list --all查看
virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     win7-1                         shut off            #发现是关闭状态,该虚拟机开启就行了
 
 #开启虚拟机
 virsh start win7-1

VNC连接不上,排查思路:

  • 查看qemu.conf文件
  • 重启libvirtd,network服务

看图形化的vnc选项:

image.png