KVM虚拟主机管理篇

2018-05-31 12:37:59 浏览数 (1)

磁盘格式

虚拟磁盘常用格式 rawqcow2

代码语言: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子机

0 人点赞