携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情
Kvm存储
概念:Kvm必须要配置一个目录当作存储磁盘镜像的目录,称为这个目录是存储池
默认的存储池:
/var/lib/libvirt/images/
存储池管理
-
创建个目录,并这个将目录作为存储池
[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 自定那个目录作为存储池
-
构建存储池
[root@kvm ~]# virsh pool-build vmdisk Pool vmdisk built
-
查看存储池的状态
[root@kvm ~]# virsh pool-list --all Name State Autostart ------------------------------------------- default active yes root active yes vmdisk inactive no #可以看到vmdisk存储池,没有激活
-
激活存储池,并且设置为自动启动
[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
-
在存储池中创建个存储卷
[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
-
其它命令:
######删除存储池中的存储卷 [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知只是承诺给你分配空间,当需要空间时才分配空间
创建磁盘文件
-
创建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
-
查看虚拟磁盘文件信息
[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
-
虚拟机有出错的时候,如果虚拟机无法启动,但是文件系统没有损坏,这是我们可以将虚拟机的文件系统挂载到宿主机上
前提:先安装个工具
[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/
虚拟机克隆
-
图形化,右击需要克隆的虚拟机
-
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
-
还可以指定虚拟磁盘文件来创建
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
-
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格式化,挂载使用。
-
网络:在图形化时自己选择即可,也可以创建一个桥接网络,去选择。
重点步骤的图示:
下面是图形化创建后其虚拟机的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选项: