云计算指的是资源使用和交互的一种模式
虚拟化指的是技术,可以将物理计算机虚拟成多个逻辑计算机(如VMware)他们彼此独立,互不影响,但是云计算又需要使用虚拟化技术。
1. 操作环境
系统: Centos 7
母机IP:192.168.77.11 (KVM-S1)
KVM IP:192.168.77.111
防火墙状态: 关闭
selinux状态: 关闭
NetworkManager: 关闭
2. 检测是否支持虚拟化
1 | grep -E -o 'vmx|svm' /proc/cpuinfo |
3. 安装kvm基础包和管理工具
1 | # yum -y install qemu-kvm python-virtinst libvirt libvirt-python virt-manager libguestfs-tools bridge-utils virt-install |
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[root@KVM-S7 ~]# lsmod | grep kvm
kvm_intel 170086 4
kvm 566340 1 kvm_intel
irqbypass 13503 3 kvm
4. 启动kvm服务
1 | systemctl start libvirtd |
5. 上传系统镜像
1 | sundays-MacBook-Pro:Downloads sunday$ scp web-s1-Minimal-1708.iso root@192.168.77.11:/opt |
或虚拟机光驱挂载系统镜像1
2
3
4dd 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
10vim /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
8vim /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=br0
开启IP转发 1
2echo "net.ipv4.ip_forward = 1" /etc/sysctl.conf
sysctl -p
重启网络 1
systemctl restart network
查看桥接网络 1
2
3
4
5
6
7
8
9
10brctl 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 | virt-install --virt-type=kvm --name=web-s1 --vcpus=2 --memory=4096 \ |
常用参数说明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
4virt-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
安装系统
系统安装会自动关闭的,我们需要启动下
重新启动虚拟机,再次vnc连接192.168.77.11,进入KVM子虚拟机中配置网络1
2virsh list --all
virsh start web-s1
虚拟机配置IP
激活网卡即可dhcp获取到IP1
ifup eth0 #注需ONBOOT=yes
也可配置静态ip1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21cat /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 | systemctl restart network |
9. KVM管理命令
1 | virt-install #建立kvm虚拟机 |
10. 克隆虚拟机
暂停原始虚拟机 1
2
3virsh 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 | virsh define /etc/libvirt/qemu/web-s4 |
12. KVM虚拟机调整
CPU设置 1
2
3
4
5
6
7
8虚拟机关机修改配置文件,修改完再启动
[root# virsh shutdown web-s1 ~]
[root# virsh edit web-s1 ~]
将<vcpu placement='static'>2</vcpu>
修改成
<vcpu placement='auto' current="2">4</vcpu>
[root# virsh start web-s1 ~]
将静态模式调整为动态,当前双核cpu,最多四核cpu
实时升级到四核1
2[root@KVM-S7 ~]
[root@KVM-S7 ~]
1 | cpu的热添加(cpu只支持热添加,不支持热减少) |
kvm子虚拟机使用lscpu查看1
2
3
4
5
6[root@localhost ~]# 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[root@KVM-S7 ~]# virsh qemu-monitor-command web-s1 --hmp --cmd balloon 1024
[root@KVM-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[root@KVM-S7 vm]# virsh shutdown web-s1
[root@KVM-S7 vm]# qemu-img resize web-s1.qcow2 +10G
Image resized.
[root@KVM-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
[root@KVM-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[root@localhost ~]# 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
[root@localhost ~]# 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[root@localhost ~]# pvcreate /dev/vda3
Physical volume "/dev/vda3" successfully created.
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/vda2 centos lvm2 a-- <20.00g 0
/dev/vda3 lvm2 --- 10.00g 10.00g
[root@localhost ~]# 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
[root@localhost ~]# vgextend centos /dev/vda3
Volume group "centos" successfully extended
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/vda2 centos lvm2 a-- <20.00g 0
/dev/vda3 centos lvm2 a-- 10.00g 10.00g
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 2 2 0 wz--n- 20.99g 10.00g
[root@localhost ~]# 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.
[root@localhost ~]# xfs_growfs /dev/centos/root
[root@localhost ~]# 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[root@KVM-S7 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
[root@KVM-S7 ~]# virsh shutdown web-s1
[root@KVM-S7 ~]# 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 | [ ] |
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