磁盘格式
虚拟磁盘常用格式 raw、qcow2
代码语言:javascript复制//创建一个2G的 raw格式 磁盘
[[email protected] ~]# qemu-img create -f raw /kvm_data/zhdya01_2.img 2G
Formatting '/kvm_data/zhdya01_2.img', fmt=raw size=2147483648
//把raw格式的磁盘转换为qcow2格式
[[email protected] ~]# qemu-img convert -O qcow2 /kvm_data/zhdya01_2.img /kvm_data/zhdya01_2.qcow2
[[email protected] ~]# qemu-img info /kvm_data/zhdya01_2.qcow2
image: /kvm_data/zhdya01_2.qcow2
file format: qcow2
virtual size: 2.0G (2147483648 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
转换后用ls -lh查看磁盘文件的大小,可以看到qcow2文件比较小。
raw文件大小和我们指定空间大小一样是2G,而qcow2的空间是你使用了多少就会占用磁盘多少。
代码语言:javascript复制[[email protected] kvm_data]# ls -lh *
-rw-r--r-- 1 root root 2.0G 2月 4 17:39 zhdya01_2.img
-rw-r--r-- 1 root root 193K 2月 4 17:42 zhdya01_2.qcow2
raw格式的磁盘性能比qcow2要好,但是raw格式的磁盘无法做快照。
把zhdya02转换为raw格式的磁盘
代码语言:javascript复制[[email protected] kvm_data]# qemu-img convert -O raw /kvm_data/zhdya01.img /kvm_data/zhdya01_2.qcow2
下一步,更改配置文件(两种途径,我们可以直接修改配置文件,但是官方的建议使用如下方式,因为只要是配置有问题,使用edit方式可以自动检测出来。)
代码语言:javascript复制virsh edit zhdya01 //更改格式和文件路径
修改如下两处:
代码语言:javascript复制 <driver name='qemu' type='raw'/>
<source file='/kvm_data/zhdya01_2.qcow2'/>
最后程序有个反馈:
代码语言:javascript复制[[email protected] kvm_data]# virsh edit zhdya01
编辑了域 zhdya01 XML 配置。
启动更改后的虚拟主机:
代码语言:javascript复制[[email protected] kvm_data]# ll
总用量 4250992
drwx------ 2 root root 16384 2月 3 14:00 lost found
-rw-r--r-- 1 root root 2147483648 2月 4 17:39 zhdya01_2.img
-rw-r--r-- 1 root root 10737418240 2月 4 18:00 zhdya01_2.qcow2
-rw------- 1 root root 10739384832 2月 4 17:53 zhdya01.img
-rw------- 1 root root 1634271232 2月 4 17:38 zhdya02
[[email protected] kvm_data]# virsh start zhdya01
域 zhdya01 已开始
[[email protected] kvm_data]# ll
总用量 4250992
drwx------ 2 root root 16384 2月 3 14:00 lost found
-rw-r--r-- 1 root root 2147483648 2月 4 17:39 zhdya01_2.img
-rw-r--r-- 1 qemu qemu 10737418240 2月 4 18:00 zhdya01_2.qcow2
-rw------- 1 root root 10739384832 2月 4 17:53 zhdya01.img
-rw------- 1 root root 1634271232 2月 4 17:38 zhdya02
如上可以看到,停机和关机的状态 所属主和所属组均为root,一旦启动就会变成qemu
一旦修改好以后,我们再次创建快照就会出错:
代码语言:javascript复制[[email protected] kvm_data]# virsh snapshot-create zhdya01
错误:不支持的配置:存储类型 vda 不支持磁盘 raw 的内部快照
磁盘扩容 – raw格式
日常的虚拟主机使用的时候,也会遇到一个很囧的事情,就是磁盘没有空间了,虚拟主机一旦没有空间了是不是寿命就到此结束了呢?显然,肯定不是的。
目前虚拟机内的主机硬盘:
代码语言:javascript复制[[email protected] ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/vda3 8.0G 1015M 7.0G 13% /
devtmpfs 487M 0 487M 0% /dev
tmpfs 497M 0 497M 0% /dev/shm
tmpfs 497M 6.6M 490M 2% /run
tmpfs 497M 0 497M 0% /sys/fs/cgroup
/dev/vda1 1014M 130M 885M 13% /boot
tmpfs 49M 0 49M 0% /run/user/0
增加2G的存储空间
代码语言:javascript复制[[email protected] ~]# qemu-img resize /kvm_data/zhdya01.img 2G
Image resized.
//现在变成了12G的空间。
[[email protected] ~]# qemu-img info /kvm_data/zhdya01.img
image: /kvm_data/zhdya01.img
file format: qcow2
virtual size: 12G (12884901888 bytes)
进入虚拟主机去查看是否生效:
代码语言:javascript复制[[email protected] ~]# virsh console zhdya01
连接到域 zhdya01
换码符为 ^]
[[email protected] ~]# fdisk -l
磁盘 /dev/vda:10.7 GB, 10737418240 字节,20971520 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
//很显然没有生效。这就需要我们把虚拟主机重启一下才可以生效。(注意:不可以在虚拟主机内重启,需要到宿主机下面吧虚拟主机重启)
代码语言:javascript复制[[email protected] ~]# virsh destroy zhdya01
[[email protected] ~]# virsh start zhdya01
[[email protected] ~]# virsh console zhdya01
[[email protected] ~]# fdisk -l
磁盘 /dev/vda:12.9 GB, 12884901888 字节,25165824 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000a8f63
设备 Boot Start End Blocks Id System
/dev/vda1 * 2048 2099199 1048576 83 Linux
/dev/vda2 2099200 4196351 1048576 82 Linux swap / Solaris
/dev/vda3 4196352 20971519 8387584 83 Linux
当然增加后的2G不可以再次分给/dev/vda1 呢? 肯定是不可以的。
只能是重新分区。(也许会考虑到这一点,重新分区,那现在已经存在的系统会不会受到影响呢? 答案是肯定不会的,新的磁盘划分将会从如下:)
代码语言:javascript复制// 也就是起始扇区最终是在新硬盘的基础上划分的
命令(输入 m 获取帮助):n
Partition type:
p primary (3 primary, 0 extended, 1 free)
e extended
Select (default e): p
已选择分区 4
起始 扇区 (20971520-25165823,默认为 20971520):
如何增加一块新的硬盘呢?
磁盘扩容(raw)
代码语言:javascript复制qemu-img create -f raw /kvm_data/zhdya01_2.raw 5G
virsh edit zhdya01 //复制增加<disk>…</disk>,注意更改source、target、slot
source:修改为/kvm_data/zhdya01_2.raw
target:修改为/dev/vdb
slot:修改为0x08
增加disk部门就是将刚刚格式化的一个磁盘,挂载到现在运行的这个虚拟机中。
代码语言:javascript复制virsh destroy zhdya01
virsh start zhdya01 //再次启动就会发现刚刚添加的一块/dev/vdb的新磁盘
磁盘扩容(qcow2)
如果当前的镜像已经做了快照,则不支持增加分区容量
代码语言:javascript复制qemu-img resize /kvm_data/zhdya01.img 2G
若提示qemu-img: Can't resize an image which has snapshots,需要删除快照
第一种方法:
代码语言:javascript复制qemu-img info /kvm_data/zhdya01.img
virsh destroy zhdya01
virsh start zhdya01
virsh console zhdya01
fdisk -l 查看磁盘情况,并分新的分区
第二种方法:
除了对已有磁盘扩容外,还可以额外增加磁盘
代码语言:javascript复制qemu-img create -f qcow2 /kvm_data/zhdya01_2.img 5G
virsh edit zhdya01 //增加<disk>…</disk>,注意更改source、target、slot //和如上是一样的操作步骤。
virsh destroy zhdya01
virsh start zhdya01
如上两种格式的硬盘均提供了两种不同的方式来扩容,其实我还是比较喜欢直接增加一块新硬盘的方式。。
调整CPU,内存,网卡
查看硬件配置:
代码语言:javascript复制[[email protected] kvm_data]# virsh dominfo zhdya01
Id: 1
名称: zhdya01
UUID: 597c1ac6-d702-4903-a5b5-7e07507191ee
OS 类型: hvm
状态: running
CPU: 1
CPU 时间: 36.0s
最大内存: 1048576 KiB
使用的内存: 524288 KiB
持久: 是
自动启动: 禁用
管理的保存: 否
安全性模式: none
安全性 DOI: 0
或者 使用 如下:
代码语言:javascript复制[root@zhdya01 kvm_data]# virsh edit zhdya01
当然修改虚拟机的硬件配置文件也是在如上这个命令中
下面我来针对当前的内存和CPU进行调整:
注意:(在操作前,尽量把虚拟机给关机。)
再次启动机器,然后查看下配置:
代码语言:javascript复制[[email protected] kvm_data]# virsh dominfo zhdya01
Id: 2
名称: zhdya01
UUID: 597c1ac6-d702-4903-a5b5-7e07507191ee
OS 类型: hvm
状态: running
CPU: 2
CPU 时间: 24.9s
最大内存: 1048576 KiB
使用的内存: 724288 KiB
持久: 是
自动启动: 禁用
管理的保存: 否
安全性模式: none
安全性 DOI: 0
有时候我们在虚拟机主机内运行着公司重要的线上业务,哪能随笔就重启的,所以在硬件遇到瓶颈的时候我们需要在保证业务正常运行的情况下 动态的调整硬件资源的大小。
代码语言:javascript复制[[email protected] kvm_data]# virsh setmem zhdya01 850M
[[email protected] kvm_data]# virsh console zhdya01
连接到域 zhdya01
换码符为 ^]
[[email protected] ~]# free -h
total used free shared buff/cache available
Mem: 818M 80M 606M 6.5M 130M 588M
Swap: 1.0G 0B 1.0G
//虽然有误差 但是和实际设置的还是不大的。
需要把配置写入到配置文件里
代码语言:javascript复制virsh dumpxml zhdya01 > /etc/libvirt/qemu/zhdya01.xml
当然也可以动态的将内存降低:
代码语言:javascript复制[[email protected] kvm_data]# virsh setmem zhdya01 550M
[[email protected] kvm_data]# virsh console zhdya01
连接到域 zhdya01
换码符为 ^]
[[email protected] ~]# free -h
total used free shared buff/cache available
Mem: 518M 81M 306M 6.5M 130M 287M
Swap: 1.0G 0B 1.0G
但是如果设置CPU的话就不可以从大到小的去设置。
如果当前使用的是 1核 你可以设置为 2核 但是一旦设置了 2核 你需要降低为 1核 那就不可以。
代码语言:javascript复制[root@zhdya01 kvm_data]# virsh setvcpus zhdya01 2
[root@zhdya01 kvm_data]# virsh setvcpus zhdya01 1
错误:不支持的配置:failed to find appropriate hotpluggable vcpus to reach the desired target vcpu count
根据如上,就有那么一个小经验:
我们在给虚拟机分配 硬件资源的时候,一定要给到位,假如宿主机是 8核 16G 我建议每台机器你都设置为 8核 16G 但是这个不是真正给虚拟主机分配的,这个只是最大支持的配置,后期随着业务的发展我们可以动态的去增加用来满足业务的需求!!
网卡调整
代码语言:javascript复制virsh domiflist zhdya01 //查看网卡
virsh attach-interface zhdya01 --type bridge --source virbr0 //增加一块新的网卡,并设置为nat网络模式(virbr0类似vmware的vmnet8),这里如果写--source br0,则网络模式为桥接
或者再次增加一块网卡到br0
virsh attach-interface zhdya01 --type bridge --source br0
virsh dumpxml zhdya01 > /etc/libvirt/qemu/zhdya01.xml //需要把配置写入到配置文件里
再次查看:
代码语言:javascript复制[[email protected] kvm_data]# virsh domiflist zhdya01
接口 类型 源 型号 MAC
-------------------------------------------------------
vnet0 bridge br0 virtio 52:54:00:02:cf:d7
vnet1 bridge virbr0 rtl8139 52:54:00:2f:df:f3
vnet2 bridge br0 rtl8139 52:54:00:e3:e7:73
进入到虚拟主机:
代码语言:javascript复制[[email protected] kvm_data]# virsh console zhdya01
连接到域 zhdya01
换码符为 ^]
[[email protected] ~]# ifconfig
ens8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.122.218 netmask 255.255.255.0 broadcast 192.168.122.255
inet6 fe80::cc35:d0bc:ee8f:54d2 prefixlen 64 scopeid 0x20<link>
ether 52:54:00:2f:df:f3 txqueuelen 1000 (Ethernet)
RX packets 64 bytes 5393 (5.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 78 bytes 7110 (6.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.161.131 netmask 255.255.255.0 broadcast 192.168.161.255
inet6 fe80::f29a:6db6:d98a:d7bb prefixlen 64 scopeid 0x20<link>
ether 52:54:00:e3:e7:73 txqueuelen 1000 (Ethernet)
RX packets 138 bytes 7117 (6.9 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 13 bytes 1454 (1.4 KiB)[[email protected] kvm_data]# ifconfig
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.161.161 netmask 255.255.255.0 broadcast 192.168.161.255
inet6 fe80::5c32:87ff:fe34:c4a4 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:26:e9:ae txqueuelen 1000 (Ethernet)
RX packets 4125 bytes 254377 (248.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1801 bytes 229207 (223.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
ether 00:0c:29:26:e9:ae txqueuelen 1000 (Ethernet)
RX packets 4161 bytes 317547 (310.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1806 bytes 238797 (233.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:58:db:51 txqueuelen 1000 (Ethernet)
RX packets 94 bytes 6686 (6.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 86 bytes 7699 (7.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
ether 52:54:00:02:cf:d7 txqueuelen 1000 (Ethernet)
RX packets 1105 bytes 73992 (72.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
查看下宿主机:
代码语言:javascript复制[[email protected] kvm_data]# ifconfig
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.161.161 netmask 255.255.255.0 broadcast 192.168.161.255
inet6 fe80::5c32:87ff:fe34:c4a4 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:26:e9:ae txqueuelen 1000 (Ethernet)
RX packets 4125 bytes 254377 (248.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1801 bytes 229207 (223.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
ether 00:0c:29:26:e9:ae txqueuelen 1000 (Ethernet)
RX packets 4161 bytes 317547 (310.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1806 bytes 238797 (233.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:58:db:51 txqueuelen 1000 (Ethernet)
RX packets 94 bytes 6686 (6.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 86 bytes 7699 (7.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
如上我们配置了网卡和内存以及cpu均没有正式的生效,尽在内存的缓存中,我们需要把配置保存到配置文件中。
代码语言:javascript复制virsh dumpxml zhdya01 > /etc/libvirt/qemu/zhdya01.xml
迁移虚拟机
代码语言:javascript复制该方式要确保虚拟机是关机状态
virsh shutdown zhdya01
virsh dumpxml zhdya01 > /etc/libvirt/qemu/zhdya03.xml // 如果是远程机器,需要把该配置文件拷贝到远程机器上
virsh domblklist zhdya01 //查看虚拟机磁盘所在目录
rsync -av /kvm_data/zhdya01.img /kvm_data/zhdya03.img //如果是迁移到远程,则需要把该磁盘文件拷贝到远程机器上
vi /etc/libvirt/qemu/zhdya03.xml //因为是迁移到本机,配置文件用的是zhdya01子机的配置,不改会有冲突,所以需要修改该文件,如果是远程机器不用修改
修改domname: <name>zhdya03</name>
修改uuid(随便改一下数字,位数不要变)
修改磁盘路径
virsh define /etc/libvirt/qemu/zhdya03.xml //定义新虚拟机
virsh list --all //会发现新迁移的zhdya03子机