KVM 虚拟化

云计算指的是资源使用和交互的一种模式
虚拟化指的是技术,可以将物理计算机虚拟成多个逻辑计算机(如VMware)他们彼此独立,互不影响,但是云计算又需要使用虚拟化技术。

系统: Centos 7
母机IP:192.168.77.11 (KVM-S1)
KVM IP:192.168.77.111
防火墙状态: 关闭
selinux状态: 关闭
NetworkManager: 关闭

2. 检测是否支持虚拟化

1
2
3
4
5
6
grep -E -o 'vmx|svm' /proc/cpuinfo 

vmx
vmx
vmx
vmx

3. 安装kvm基础包和管理工具

1
2

yum install qemu-kvm qemu-kvm-tools libvirt virt-install bridge-utils -y

kvm相关安装包及其作用:

  • qemu-kvm 主要的KVM程序包
  • python-virtinst 创建虚拟机所需要的命令行工具和程序库
  • virt-manager GUI虚拟机管理工具
  • virt-top 虚拟机统计命令
  • virt-viewer GUI连接程序,连接到已配置好的虚拟机
  • libvirt C语言工具包,提供libvirt服务
  • libvirt-client 为虚拟客户机提供的C语言工具包
  • virt-install 基于libvirt服务的虚拟机创建命令
  • bridge-utils 创建和管理桥接设备的工具

确保模块已加载

1
2
3
4
[[email protected] ~]# lsmod | grep kvm
kvm_intel 170086 4
kvm 566340 1 kvm_intel
irqbypass 13503 3 kvm

4. 启动kvm服务

1
2
systemctl start libvirtd 
systemctl enable libvirtd

5. 上传系统镜像

1
2
3
sundays-MacBook-Pro:Downloads sunday$ scp web-s1-Minimal-1708.iso root@192.168.77.11:/opt
root@192.168.77.11's password:
web-s1-Minimal-1708.iso 33% 266MB 12.3MB/s 00:42 ETA

或虚拟机光驱挂载系统镜像

1
2
3
4
dd if=/dev/cdrom of=/opt/web-s1-DVD-1708.iso
8830976+0 records in
8830976+0 records out
4521459712 bytes (4.5 GB) copied, 54.0024 s, 83.7 MB/s

6. 配置桥接网络

Bridge桥接原理
Bridge方式即虚拟网桥的网络连接方式,是客户机和子网里面的机器能够互相通信。可以使虚拟机成为网络中具有独立IP的主机。
桥接网络(也叫物理设备共享)被用作把一个物理设备复制到一台虚拟机。网桥多用作高级设置,特别是主机多个网络接口的情况。

┌─────────────────────────┐      ┌─────────────────┐
│          HOST           │      │Virtual Machine 1│
│ ┌──────┐      ┌───────┐ │      │    ┌──────┐     │
│ │ br0  │──┬───│ vnet0 │─│─ ─ ─ │    │ eth0 │     │
│ └──────┘  │   └───────┘ │      │    └──────┘     │
│     │     │             │      └─────────────────┘
│     │     │   ┌───────┐ │      ┌─────────────────┐
│ ┌──────┐  └───│ vnet1 │─│─     │Virtual Machine 2│
│ │ eth0 │      └───────┘ │ │    │    ┌──────┐     │
│ └──────┘                │  ─ ─ │    │ eth0 │     │
│ ┌──────┐                │      │    └──────┘     │
│ │ eth1 │                │      └─────────────────┘
│ └──────┘                │
└─────────────────────────┘

如上图,网桥的基本原理就是创建一个桥接接口br0,在物理网卡和虚拟网络接口之间传递数据。

配置桥接网卡br0

1
2
3
4
5
6
7
8
9
10
vim /etc/sysconfig/network-scripts/ifcfg-br0 

TYPE=Bridge
BOOTPROTO=static
DEVICE=br0
IPADDR=192.168.77.11
NETMASK=255.255.255.0
GATEWAY=192.168.77.1
DNS1=119.29.29.29
ONBOOT=yes

配置物理网卡eth0

1
2
3
4
5
6
7
8
vim /etc/sysconfig/network-scripts/ifcfg-eth0

TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=br0

开启IP转发

1
2
echo "net.ipv4.ip_forward = 1" /etc/sysctl.conf
sysctl -p

重启网络

1
systemctl restart network

查看桥接网络

1
2
3
4
5
6
7
8
9
10
brctl show

bridge name bridge id STP enabled interfaces
br0 8000.000c29f023de no eth0
virbr0 8000.5254005d0ab0 yes virbr0-nic

ping www.sina.com.cn
PING spool.grid.sinaedge.com (183.232.24.222) 56(84) bytes of data.
64 bytes from 183.232.24.222 (183.232.24.222): icmp_seq=1 ttl=56 time=9.23 ms
64 bytes from 183.232.24.222 (183.232.24.222): icmp_seq=2 ttl=56 time=9.83 ms

7. 创建虚拟机

1
2
3
4
virt-install --virt-type=kvm --name=web-s1 --vcpus=2 --memory=4096 
--location=/opt/web-s1-Minimal-1708.iso --disk path=/kvm/vm/web-s1.qcow2,
size=40,format=qcow2 --network bridge=br0 --graphics vnc,listen=0.0.0.0
--noautoconsole

常用参数说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
name指定虚拟机名称
–memory分配内存大小。
–vcpus分配CPU核心数,最大与实体机CPU核心数相同
–disk指定虚拟机镜像,size指定分配大小单位为G。
–network网络类型,此处用的是默认,一般用的应该是bridge桥接。
–accelerate加速
–cdrom指定安装镜像iso
–vnc启用VNC远程管理,一般安装系统都要启用。
–vncport指定VNC监控端口,默认端口为5900,端口不能重复。
–vnclisten指定VNC绑定IP,默认绑定127.0.0.1,这里改为0.0.0.0
–os-type=linux,windows
–os-variant=rhel6

--name 指定虚拟机名称
--ram 虚拟机内存大小,以 MB 为单位
--vcpus 分配CPU核心数,最大与实体机CPU核心数相同
–-vnc 启用VNC远程管理,一般安装系统都要启用。
–-vncport 指定VNC监控端口,默认端口为5900,端口不能重复。
–-vnclisten 指定VNC绑定IP,默认绑定127.0.0.1,这里改为0.0.0.0
--network 虚拟机网络配置
# 其中子选项,bridge=br0 指定桥接网卡的名称。

–os-type=linux,windows
–os-variant=rhel7.2

--disk 指定虚拟机的磁盘存储位置
# size,初始磁盘大小,以 GB 为单位。

--location 指定安装介质路径,如光盘镜像的文件路径。
--graphics 图形化显示配置
# 全新安装虚拟机过程中可能会有很多交互操作,比如设置语言,初始化 root 密码等等。
# graphics 选项的作用就是配置图形化的交互方式,可以使用 vnc(一种远程桌面软件)进行链接。
# 我们这列使用命令行的方式安装,所以这里要设置为 none,但要通过 --extra-args 选项指定终端信息,
# 这样才能将安装过程中的交互信息输出到当前控制台。
--extra-args 根据不同的安装方式设置不同的额外选项

创建第二台虚拟机,添加下vnc端口就可以了

1
2
3
4
virt-install --virt-type=kvm --name=web-s1 --vcpus=2 --memory=4096 
--location=/opt/web-s1-Minimal-1708.iso --disk path=/kvm/vm/web-s1.qcow2,
size=40,format=qcow2 --network bridge=br0 --graphics vnc,listen=0.0.0.0,
port=5901 --noautoconsole

8. vnc viewer连接

https://www.realvnc.com/en/connect/download/viewer/
使用vnc连接IP 192.168.77.11
11
安装系统
11
系统安装会自动关闭的,我们需要启动下
重新启动虚拟机,再次vnc连接192.168.77.11,进入KVM子虚拟机中配置网络

1
2
virsh list --all
virsh start web-s1

虚拟机配置IP
激活网卡即可dhcp获取到IP

1
ifup eth0  #注需ONBOOT=yes

也可配置静态ip

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
cat /etc/sysconfig/network-scripts/ifcfg-eth0 
TYPE=Ethernet
#PROXY_METHOD=none
#BROWSER_ONLY=no
BOOTPROTO=static
IPADDR=192.168.77.111
NETMASK=255.255.255.0
GATEWAY=192.168.77.1
DNS1=192.168.77.1
DNS2=119.29.29.29
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
#IPV6_AUTOCONF=yes
#IPV6_DEFROUTE=yes
#IPV6_FAILURE_FATAL=no
#IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
#UUID=f0c7f001-4c31-4c3e-b6de-19419f62d20e
DEVICE=eth0
ONBOOT=yes

1
2
systemctl restart network
ping www.baidu.com

9. KVM管理命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
virt-install  				#建立kvm虚拟机
virsh list #查看正在运行的KVM虚拟机
virsh list --all #查看所有KVM虚拟机
virsh start name #启动虚拟机
virsh shutdown name #虚拟机关机
virsh autostart name # #随物理机启动而启动(开机启动)
virsh autostart --disable name #取消标记为自动开始(取消开机启动)
virsh destroy name #强制关闭KVM(强制断电)
virsh suspend name #挂起KVM虚拟机
virsh resume name #恢复挂起的KVM虚拟机
virsh dumpxml name #查看KVM虚拟机配置文件
virsh edit name #编辑KVM虚拟机的xml配置文件
virsh define file-name.xml #根据配置文件定义虚拟机
virsh undefine name #彻底删除KVM虚拟机,不可逆,如果想找回来,需要备份/etc/libvirt/qemu的xml文件
virsh snapshot-create name #创建快照 注:raw磁盘格式无法进行快照,需要修改为qcow2
virsh snapshot-delete name #删除快照
virsh snapshot-dumpxml name #导出XML
virsh snapshot-list name #查看快照

10. 克隆虚拟机

暂停原始虚拟机

1
2
3
virsh shutdown web-s1
virt-clone -o web-s1 -n web-s2 -f /kvm/vm/web-s2.qcow2 -m 00:00:00:00:00:01
virt-clone -o web-s1 -n web-s3 --file /kvm/vm/web-s3.qcow2 --nonsparse

virt-clone 参数介绍

1
2
3
4
5
6
7
8
9
10
11
--version 查看版本。
-h,--help 查看帮助信息。
--connect=URI 连接到虚拟机管理程序 libvirt 的URI。
-o 原始虚拟机名称 原始虚拟机名称,必须为关闭或者暂停状态。
-n 新虚拟机名称 --name 新虚拟机名称。
--auto-clone 从原来的虚拟机配置自动生成克隆名称和存储路径。
-u NEW_UUID, --uuid=NEW_UUID 克隆虚拟机的新的UUID,默认值是一个随机生成的UUID。
-m NEW_MAC, --mac=NEW_MAC 设置一个新的mac地址,默认为随机生成 MAC。
-f NEW_DISKFILE, --file=NEW_DISKFILE 为新客户机使用新的磁盘镜像文件地址。
--force-copy=TARGET 强制复制设备。
--nonsparse 不使用稀疏文件复制磁盘映像。

11. 通过镜像创建虚拟机

创建虚拟机镜像文件

1
2
3
4
5
6
# 复制第一次安装的干净系统镜像,作为基础镜像文件,
# 后面创建虚拟机使用这个基础镜像
cp /kvm/vm/web-s1.qcow2 /kvm/system/centos7-base.qcow2

# 使用基础镜像文件,创建新的虚拟机镜像
cp /kvm/system/centos7-base.qcow2 /kvm/vm/web-s4.qcow2

创建虚拟机配置文件

1
2
3
4
5
6
7
8
# 复制第一次安装的干净系统镜像,作为基础配置文件。
virsh dumpxml web-s1 > /kvm/vm/centos7-base.xml

# 使用基础虚拟机镜像配置文件,创建新的虚拟机配置文件
cp /kvm/vm/centos7-base.xml /etc/libvirt/qemu/web-s4.xml

# 编辑新虚拟机配置文件
vi /etc/libvirt/qemu/web-s4.xml

主要是修改虚拟机文件名,UUID,镜像地址和网卡地址,其中 UUID 在 Linux 下可以使用 uuidgen 命令生成

1
2
3
4
5
6
7
8
9
10
11
12
<domain type='kvm'>
<name>web-s4</name>
<uuid>66544fd4-a1dd-4afc-9113-e5990d33a3b6</uuid>
<devices>
<disk type='file' device='disk'>
<source file='/kvm/vm/web-s4.qcow2'/>
</disk>
<interface type='bridge'>
<mac address='52:54:00:3b:30:0e'/>
</interface>
</devices>
</domain>

1
2
virsh define /etc/libvirt/qemu/web-s4
# Domain web-s4 defined from /etc/libvirt/qemu/web-s4

12. KVM虚拟机调整

CPU设置

1
2
3
4
5
6
7
8
虚拟机关机修改配置文件,修改完再启动
[root@KVM-S7 ~]# virsh shutdown web-s1
[root@KVM-S7 ~]# virsh edit web-s1
<vcpu placement='static'>2</vcpu>
修改成
<vcpu placement='auto' current="2">4</vcpu>

[root@KVM-S7 ~]# virsh start web-s1

将静态模式调整为动态,当前双核cpu,最多四核cpu
实时升级到四核

1
2
[root@KVM-S7 ~]# virsh setvcpus web-s1 4 --live
[root@KVM-S7 ~]# virsh dominfo web-s1

1
2
3
4
5
cpu的热添加(cpu只支持热添加,不支持热减少)
kvm版本较高,并不需要echo "1"/sys/devices/system/cpu/cpu1/online 进行激活,自动可以激活。

[[email protected] ~]# cat /sys/devices/system/cpu/cpu1/online
1

kvm子虚拟机使用lscpu查看

1
2
3
4
5
6
[[email protected] ~]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0,1,2,3

内存设置
如果超过给虚拟机分配的最大内存,需要重启虚拟机。
缩小内存

1
2
3
[[email protected]S7 ~]# virsh qemu-monitor-command web-s1 --hmp --cmd balloon 1024
[[email protected]S7 ~]# virsh qemu-monitor-command web-s1 --hmp --cmd info balloon
balloon: actual=1024

硬盘设置
根分区扩展10G
方式一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[[email protected]S7 vm]# virsh shutdown web-s1
[[email protected]S7 vm]# qemu-img resize web-s1.qcow2 +10G
Image resized.

[[email protected]S7 ~]# qemu-img info web-s1.qcow2
image: web-s1.qcow2
file format: qcow2
virtual size: 4.0G (4294967296 bytes)
disk size: 1.3G
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: true


[[email protected]S7 ~]# virsh start web-s1

kvm虚拟机操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
[[email protected] ~]# fdisk -l

Disk /dev/vda: 42 GB, 42949672960 bytes, 83886080 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0e0095

Device Boot Start End Blocks Id System
/dev/vda1 * 2048 2099199 1048576 83 Linux
/dev/vda2 20992000 62914550 20961280 8e Linux LVM

[[email protected] ~]# fdisk /dev/vda
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): n
Partition type:
p primary (2 primary, 0 extended, 2 free)
e extended
Select (default p): p
Partition number (3,4, default 3): 3
First sector (62914560-83886070, default 62914560):
Using default value 62914560
Last sector, +sectors or +size{K,M,G} (62914560-83886070, default 83886070):
Using default value 8388607
Partition 3 of type Linux and of size 10 GiB is set

Command (m for help): p

Disk /dev/vda: 4294 MB, 4294967296 bytes, 8388608 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0e0095

Device Boot Start End Blocks Id System
/dev/vda1 * 2048 2099199 1048576 83 Linux
/dev/vda2 20992000 62914550 20961280 8e Linux LVM
/dev/vda3 62914560 83886070 10485760 83 Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot

lvm扩容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
[[email protected] ~]# pvcreate /dev/vda3
Physical volume "/dev/vda3" successfully created.
[[email protected] ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/vda2 centos lvm2 a-- <20.00g 0
/dev/vda3 lvm2 --- 10.00g 10.00g
[[email protected] ~]# vgdisplay
--- Volume group ---
VG Name centos
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 1
Act PV 1
VG Size <20.00 GiB
PE Size 4.00 MiB
Total PE 511
Alloc PE / Size 511 / <20.00 GiB
Free PE / Size 0 / 0
VG UUID KFu3ne-pFHn-k7tZ-RCvO-mZBz-cOTp-QmkbGO

[[email protected] ~]# vgextend centos /dev/vda3
Volume group "centos" successfully extended

[[email protected] ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/vda2 centos lvm2 a-- <20.00g 0
/dev/vda3 centos lvm2 a-- 10.00g 10.00g

[[email protected] ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 2 2 0 wz--n- 20.99g 10.00g
[[email protected] ~]# lvextend -l +100%FREE /dev/centos/root

Size of logical volume centos/root changed from <10.70 GiB (434 extents) to 20.69 GiB (689 extents).
Logical volume centos/root successfully resized.

[[email protected] ~]# xfs_growfs /dev/centos/root

[[email protected] ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 20.7G 977M 10.8G 36% /
devtmpfs 486M 0 486M 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 125M 890M 13% /boot
tmpfs 23M 0 23M 0% /run/user/0
# ext 系统格式使用:
resize2fs /dev/centos/root
# xfs 系统格式使用下面命令
xfs_growfs /dev/centos/root

添加一块硬盘
方式二

1
2
3
4
[[email protected] vm]# qemu-img create -f qcow2 /kvm/vm/web-s1_1.qcow2 5G
Formatting '/kvm/vm/web-s1_1.qcow2', fmt=qcow2 size=5368709120 encryption=off cluster_size=65536 lazy_refcounts=off
[[email protected] ~]# virsh shutdown web-s1
[[email protected] ~]# virsh edit web-s1

修改配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<devices>
<emulator>/usr/libexec/qemu-kvm</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/kvm/vm/web-s1.qcow2'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='00' bus='' slot='' function='0x0'/>
</disk>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/kvm/vm/web-s1_1.qcow2'/>
<target dev='vdb' bus='virtio'/>
<address type='pci' domain='00' bus='' slot='' function='0x0'/>
</disk>

1
2
[[email protected] ~]# virsh define /etc/libvirt/qemu/web-s1.xml 
[[email protected] ~]# virsh start web-s1

kvm虚拟机操作

1
2
3
4
5
分区: fdisk /dev/vdb 
格式化:mkfs.ext4 /dev/vdb
挂载:vim /etc/fstab,添加一行:/dev/vdb /mnt ext4 defaults 0 0
mount -a 然后mnt就可以使用了
也可以做lvm

https://www.abcdocker.com/abcdocker/1627
https://github.com/jaywcjlove/handbook/blob/master/CentOS/CentOS7%E5%AE%89%E8%A3%85KVM%E8%99%9A%E6%8B%9F%E6%9C%BA%E8%AF%A6%E8%A7%A3.md#%E9%85%8D%E7%BD%AE%E5%AE%BF%E4%B8%BB%E6%9C%BA%E7%BD%91%E7%BB%9C