KVM虚拟化
虚拟化,通过模拟计算机的硬件,来实现在同一台计算机上同时运行多个不同的操作系统的技术.
虚拟化:提高了资源的利用率,各个服务的安全性隔离,解决了系统和硬件之间的依赖
kvm虚拟化管理软件安装
[root@lb01 ~]# yum install libvirt* virt-* qemu-kvm* -y
#安装软件说明内容:
libvirt:作用:虚拟机的管理软件
virt virt-install virt-clone:作用:虚拟机的安装工具和克隆工具
qemu-kvm qemu-img(qcow2,raw)作用:管理虚拟机的虚拟磁盘
[root@lb01 ~]# lsmod |grep -i kvm
kvm_intel 170086 0
kvm 566340 1 kvm_intel
irqbypass 13503 1 kvm
#启动kvm
[root@lb01 ~]# systemctl start libvirtd.service
[root@lb01 ~]# systemctl enable libvirtd.service
安装VNC软件:
下载vnc软件方法,tightvnc官网:http://www.tightvnc.com
VNC软件,用于VNC(Virtual Network Computing),为一种使用RFB协议的显示屏画面分享及远程操作软件。此软件借由网络,可发送键盘与鼠标的动作及即时的显示屏画面。
VNC与操作系统无关,因此可跨平台使用,例如可用Windows连接到某Linux的电脑,反之亦同。甚至在没有安装客户端程序的电脑中,只要有支持JAVA的浏览器,也可使用。
安装VNC时,使用默认安装即可,无需安装server端。
配置第一台KVM虚拟机
[root@lb01 ~]# virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name centos7 --memory 1024 --vcpus 1 --disk /opt/centos7.raw,format=raw,size=10 --cdrom /opt/CentOS-7-x86_64-DVD-1708.iso --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
参数说明
--virt-type 虚拟化的类型
--os-type= 系统类型
--os-variant 系统版本
--name 虚拟机的名字
--memory 虚拟机的内存
--vcpus 虚拟机的CPU
--disk 存储的路径
format= 存储磁盘的类型:raw(不支持快照,性能好)、qcow2(支持快照)
qcow2
size= 磁盘的大小
--cdrom 镜像的路径
--network 网络类型
使用参数说明:
参数 | 参数说明 |
---|---|
--virt-type HV_TYPE | 要使用的管理程序名称 (kvm, qemu, xen, ...) |
--os-type | 系统类型 |
--os-variant DISTRO_VARIANT | 在客户机上安装的操作系统,例如:'fedora18'、'rhel6'、'winxp' 等。 |
-n NAME, --name NAME | 客户机实例名称 |
--memory MEMORY | 配置客户机虚拟内存大小 |
--vcpus VCPUS | 配置客户机虚拟 CPU(vcpu) 数量。 |
--disk DISK | 指定存储的各种选项。 |
-cdrom CDROM | 光驱安装介质 |
-w NETWORK, --network NETWORK | 配置客户机网络接口。 |
--graphics GRAPHICS | 配置客户机显示设置。 |
虚拟化平台选项: | |
-v, --hvm | 这个客户机应该是一个全虚拟化客户机 |
-p, --paravirt | 这个客户机应该是一个半虚拟化客户机 |
--container | 这个客户机应该是一个容器客户机 |
--virt-type HV_TYPE | 要使用的管理程序名称 (kvm, qemu, xen, ...) |
--arch ARCH | 模拟 CPU 架构 |
--machine MACHINE | 机器类型为仿真类型 |
其它选项: | |
--noautoconsole | 不要自动尝试连接到客户端控制台 |
--autostart | 主机启动时自动启动域。 |
--noreboot | 安装完成后不启动客户机。 |
以上信息通过 " virt-install --help " 获得。 |
kvm的管理操作
参数 | 参数说明 |
---|---|
基础操作 | |
list | 查看虚拟机列表,列出域 |
start | 启动虚拟机,开始一个(以前定义的)非活跃的域 |
shutdown | 关闭虚拟机,关闭一个域 |
destroy (危险) | 强制关闭虚拟机,销毁(停止)域 |
vncdisplay | 查询虚拟机vnc端口号 |
配置管理操作 | |
dumpxml | 导出主机配置信息 |
undefine | 删除主机 |
define | 导入主机配置 |
domrename | 对虚拟机进行重命名 |
挂起与恢复 | |
suspend | 挂起虚拟机 |
resume | 恢复虚拟机 |
自启动管理 | |
autostart | 虚拟机开机启动 |
autostart --disable | 取消虚拟机开机启动 |
以上参数通过 “virsh --help****” 获得。 |
#列出所有虚拟机
[root@lb01 ~]# virsh list --all
Id Name State
----------------------------------------------------
1 centos7 running
#开机
[root@lb01 ~]# virsh start centos7
Domain centos7 started
#关机
[root@lb01 ~]# virsh shutdown centos7
Domain centos7 is being shutdown
#强制关机
[root@lb01 ~]# virsh destroy centos7
Domain centos7 destroyed
#导出配置
[root@lb01 ~]# virsh dumpxml centos7 >/opt/centos7.xml
#删除虚拟机
[root@lb01 ~]# virsh undefine centos7
Domain centos7 has been undefined
[root@lb01 ~]# virsh list --all
Id Name State
----------------------------------------------------
[root@lb01 ~]#
#导入配置
[root@lb01 ~]# virsh define /opt/centos7.xml
Domain centos7 defined from /opt/centos7.xml
[root@lb01 ~]# virsh list --all
Id Name State
----------------------------------------------------
- centos7 shut off
[root@lb01 ~]#
#配置文件路径
/etc/libvirt/qemu/
#修改KVM虚拟机配置的方法
[root@lb01 ~]# virsh edit centos7
使用该命令修改可以对文件进行语法校验。
#修改虚拟机名称
[root@lb01 ~]# virsh domrename centos7 opesn
Domain successfully renamed
#虚拟机挂起
[root@lb01 ~]# virsh suspend opesn
Domain opesn suspended
#虚拟机挂起恢复
[root@lb01 ~]# virsh resume opesn
Domain opesn resumed
#查看vnc端口号
[root@lb01 ~]# virsh vncdisplay opesn
:0
[root@lb01 ~]#
#开机自启动设置
# 设置 libvirtd 服务开机自启动。
[root@lb01 ~]# systemctl enable libvirtd
[root@lb01 ~]# virsh autostart opesn
Domain opesn marked as autostarted
opesn 标记为自动开始
# 实质为创建软连接
[root@lb01 ~]# ll /etc/libvirt/qemu/autostart/
total 0
lrwxrwxrwx 1 root root 27 Jan 4 22:45 opesn.xml -> /etc/libvirt/qemu/opesn.xml
[root@lb01 ~]#
取消开机自启动
[root@lb01 ~]# virsh autostart --disable opesn
Domain opesn unmarked as autostarted
[root@lb01 ~]# ll /etc/libvirt/qemu/autostart/
total 0
[root@lb01 ~]#
console控制台登录
在虚拟机内操作(该操作仅限centos7):
[root@localhost ~]# grubby --update-kernel=ALL --args="console=ttyS0,115200n8"
[root@localhost ~]# reboot
# 115200n8:能显示虚拟机的启动过程
重启完成后,使用virsh console 连接虚拟机。
[root@lb01 ~]# virsh console opesn
Connected to domain opesn
Escape character is ^]
CentOS Linux 7 (Core)
Kernel 3.10.0-693.el7.x86_64 on an x86_64
localhost login: root
Password:
Last login: Sat Jan 4 22:33:18 from 192.168.122.1
[root@localhost ~]#
kvm磁盘格式
raw:裸格式,占用空间大小,不支持快照功能,性能较好,不方便传输
qcow2:占用空间小,支持快照,性能比raw差一点方便传输
#查看当前虚拟机硬盘信息
[root@lb01 ~]# qemu-img info /data/centos7.raw
image: /data/centos7.raw
file format: raw
virtual size: 10G (10737418240 bytes)
disk size: 1.7G
[root@lb01 ~]#
#创建一块qcow2的虚拟硬盘
[root@lb01 ~]# qemu-img create -f qcow2 /opt/opesn.qcow2 10G
Formatting '/opt/opesn.qcow2', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536 lazy_refcounts=off
#调整磁盘容量
[root@lb01 ~]# qemu-img resize /data/opesn.qcow2 +20G
Image resized.
[root@lb01 ~]# qemu-img info /data/opesn.qcow2
image: /data/opesn.qcow2
file format: qcow2
virtual size: 30G (32212254720 bytes)
disk size: 260K
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
[root@lb01 ~]#
#raw转qcow2格式:
# 参数说明
[root@lb01 data]# qemu-img --help |grep convert
qemu-img convert [-f fmt] [-O output_fmt] filename output_filename
[root@lb01 data]# qemu-img convert -f raw -O qcow2 centos7.raw opesn.qcow2
#修改虚拟机配置文件
[root@lb01 data]# virsh shutdown opesn
[root@lb01 data]# virsh edit opesn
修改前:
<disk type='file' device='disk'>
<driver name='qemu' type='raw'/>
<source file='/data/clsn.raw'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</disk>
修改后:
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/data/opesn.qcow2'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</disk>
#删除原磁盘文件
[root@lb01 data]# rm -rf centos7.raw
#启动虚拟机
[root@lb01 data]# virsh start opesn
#压缩磁盘空间
[root@lb01 data]# qemu-img convert -c -f qcow2 -O qcow2 opesn.qcow2 centos7.qcow2
快照管理
#创建快照
[root@lb01 data]# virsh snapshot-create opesn
#查看快照列表
[root@lb01 data]# virsh snapshot-list opesn
Name Creation Time State
------------------------------------------------------------
1578153030 2020-01-04 23:50:30 +0800 running
[root@lb01 data]#
#指定快照别名
[root@lb01 data]# virsh snapshot-create-as --name v1 opesn
[root@lb01 data]# virsh snapshot-list opesn
Name Creation Time State
------------------------------------------------------------
1578153030 2020-01-04 23:50:30 +0800 running
v1 2020-01-04 23:51:57 +0800 running
[root@lb01 data]#
#查看快照信息
[root@lb01 data]# virsh snapshot-info opesn --snapshotname v1
Name: v1
Domain: opesn
Current: yes
State: running
Location: internal
Parent: -
Children: 0
Descendants: 0
Metadata: yes
[root@lb01 data]#
#删除快照
[root@lb01 data]# virsh snapshot-delete opesn --snapshotname 1578153030
Domain snapshot 1578153030 deleted
[root@lb01 data]#
#还原快照
[root@lb01 data]# virsh snapshot-revert opesn --snapshotname v1
[root@lb01 data]#
虚拟机的克隆
#完整克隆
[root@lb01 ~]# virt-clone -o opesn -n centos7 --auto-clone
#链接克隆
[root@lb01 data]# qemu-img create -f qcow2 -b centos7.qcow2 web03.qcow2
Formatting 'web03.qcow2', fmt=qcow2 size=64424509440 backing_file='centos7.qcow2' encryption=off cluster_size=65536 lazy_refcounts=off
[root@lb01 data]# qemu-img info web03.qcow2
image: web03.qcow2
file format: qcow2
virtual size: 60G (64424509440 bytes)
disk size: 196K
cluster_size: 65536
backing file: centos7.qcow2
Format specific information:
compat: 1.1
lazy refcounts: false
[root@lb01 data]#
第一步:复制虚拟磁盘文件
第二步:修改xml配置文件
1)name
2)uuid
3)虚拟磁盘存储路径
4)mac地址
cat /etc/libvirt/qemu/web01.xml |grep 'qcow2'|grep -oP "(?<=file=')[^']+"
kvm网络模式
#默认NAT模式
virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name centos7 --memory 1024 --vcpus 1 --disk /opt/centos7.qcow2,format=qcow2,size=10 --cdrom /opt/CentOS-7-x86_64-DVD-1708.iso --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
#桥接模式
virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name centos7 --memory 1024 --vcpus 1 --disk /opt/centos7.qcow2,format=qcow2,size=10 --cdrom /opt/CentOS-7-x86_64-DVD-1708.iso --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole
#创建桥接网卡
[root@lb01 data]# virsh iface-bridge eth0 br0
[root@lb01 data]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000c29e6cf2e yes eth0
vnet0
vnet1
virbr0 8000.525400c52020 yes virbr0-nic
[root@lb01 data]#
#新建虚拟机为桥接模式
[root@lb01 data]# qemu-img convert -f qcow2 -O qcow2 opesn.qcow2 centos7.qcow2
[root@lb01 data]# virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name centos7 --memory 1024 --vcpus 1 --disk /data/centos7.qcow2 --boot hd --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole
#取消桥接网卡
[root@lb01 data]# virsh iface-unbridge br0
#将虚拟机的nat模式改为桥接模式
[root@lb01 data]# virt-clone -o opesn -n web01 --auto-clone
[root@lb01 data]# virsh edit web01
<interface type='bridge'>
<mac address='52:54:00:54:40:48'/>
<source bridge='br0'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
#修改kvm虚拟机网卡配置文件
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=10.0.1.3
NETMASK=255.255.255.0
GATEWAY=10.0.1.254
DNS1=8.8.8.8
[root@localhost ~]#
#测试网络连通性
[root@lb01 data]# ping 10.0.1.3
PING 10.0.1.3 (10.0.1.3) 56(84) bytes of data.
64 bytes from 10.0.1.3: icmp_seq=1 ttl=64 time=0.610 ms
64 bytes from 10.0.1.3: icmp_seq=2 ttl=64 time=0.754 ms
^C
--- 10.0.1.3 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.610/0.682/0.754/0.072 ms
[root@lb01 data]#
kvm热添加硬盘和扩容
#宿主机操作
#创建一块硬盘
[root@lb01 data]# qemu-img create -f qcow2 web01-add01.qcow2 10G
Formatting 'web01-add01.qcow2', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536 lazy_refcounts=off
#为虚拟机添加硬盘
[root@lb01 data]# virsh attach-disk web01 --source /data/web01-add01.qcow2 --target vdb --live --cache none --subdriver qcow2
Disk attached successfully
#虚拟机操作
#虚拟机内挂载磁盘
[root@localhost ~]# mkfs.xfs /dev/vdb
[root@localhost ~]#
[root@localhost ~]# mount /dev/vdb /mnt/
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 10G 1.8G 8.3G 18% /
devtmpfs 487M 0 487M 0% /dev
tmpfs 497M 0 497M 0% /dev/shm
tmpfs 497M 6.5M 490M 2% /run
tmpfs 497M 0 497M 0% /sys/fs/cgroup
tmpfs 100M 0 100M 0% /run/user/0
/dev/vdb 20G 33M 20G 1% /mnt
[root@localhost ~]#
#虚拟机磁盘扩容
#虚拟机操作
[root@localhost ~]# umount /mnt/
#宿主机操作
#剥离硬盘
[root@lb01 data]# virsh detach-disk web01 --target vdb
#扩容
[root@lb01 data]# qemu-img resize /data/web01-add01.qcow2 +10G
[root@lb01 data]# virsh attach-disk web01 --source /data/web01-add01.qcow2 --target vdb --live --cache none --subdriver qcow2
#虚拟机操作
[root@localhost ~]# mount /dev/vdb /mnt/
[root@localhost ~]# xfs_growfs /dev/vdb
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 10G 1.8G 8.3G 18% /
devtmpfs 487M 0 487M 0% /dev
tmpfs 497M 0 497M 0% /dev/shm
tmpfs 497M 6.5M 490M 2% /run
tmpfs 497M 0 497M 0% /sys/fs/cgroup
tmpfs 100M 0 100M 0% /run/user/0
/dev/vdb 30G 33M 30G 1% /mnt
[root@localhost ~]#
#挂载磁盘文件
[root@lb01 data]# mount -o loop web01-add01.qcow2 /mnt/
#如果磁盘文件系统是ext4
[root@localhost ~]# resize2fs /dev/vdb
kvm热添加网卡
#添加桥接模式网卡
[root@lb01 data]# virsh attach-interface web01 --type bridge --source br0 --model virtio
Interface attached successfully
[root@lb01 data]#
#添加nat模式网卡
[root@lb01 data]# virsh attach-interface web01 --type network --source default --model virtio
Interface attached successfully
[root@lb01 data]#
#永久添加nat网卡
[root@lb01 data]# virsh attach-interface web01 --type network --source default --model virtio
[root@lb01 data]# virsh attach-interface web01 --type network --source default --model virtio --config
#剥离网卡
[root@lb01 data]# virsh detach-interface web01 --type network --mac 52:54:00:74:8d:c6
Interface detached successfully
[root@lb01 data]#
kvm热添加内存
#新建虚拟机
[root@lb01 data]# qemu-img convert -f qcow2 -O qcow2 opesn.qcow2 web02.qcow2
[root@lb01 data]# virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name web02 --memory 512,maxmemory=2048 --vcpus 1 --disk /data/web02.qcow2 --boot hd --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole
#临时热添加内存
[root@lb01 data]# virsh setmem web02 2048M --live
#永久增大内存
[root@lb01 data]# virsh setmem web02 2048M --live --config
kvm热添加cpu
#新建虚拟机
[root@lb01 data]# virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name web03 --memory 512,maxmemory=2048 --vcpus 1,maxvcpus=2 --disk /data/web03.qcow2 --boot hd --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole
#临时热添加CPU
[root@lb01 data]# virsh setvcpus web03 2
#永久增大CPU
[root@lb01 data]# virsh setvcpus web03 2 --config
kvm热迁移
#注意:需要互相做好host解析
#操作步骤:
#一:在lb01和m01上安装kvm和nfs,配置桥接网卡
[root@lb01 ~]# yum install libvirt* virt-* qemu-kvm* nfs-utils openssh-askpass -y
[root@lb01 ~]# systemctl start libvirtd.service
[root@lb01 ~]# virsh iface-bridge eth0 br0
#二:在lb01上安装配置nfs
[root@lb01 ~]# yum install nfs-utils -y
[root@lb01 ~]# mkdir /data
[root@lb01 ~]# vim /etc/exports
/data 10.0.0.0/24(rw,async,no_root_squash,no_all_squash)
[root@lb01 ~]# systemctl restart rpcbind
[root@lb01 ~]# systemctl restart nfs
#三:m01挂载共享目录/data
[root@m01 ~]# showmount -e 10.0.1.5
Export list for 10.0.1.5:
/data 10.0.1.0/24
[root@m01 ~]# mkdir /data
[root@m01 ~]# mount -t nfs 10.0.1.5:/data /data
[root@m01 ~]#
#四:安装一台基于桥接模式的虚拟机
[root@lb01 data]# virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name opesn --memory 1024 --vcpus 1 --disk /data/opesn.qcow2 --boot hd --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole
#热迁移的命令:
root@lb01 ~]# virsh migrate --live --verbose opesn qemu+ssh://10.0.1.61/system --unsafe
root@10.0.1.61's password:
Migration: [100 %]
[root@lb01 ~]#
#将宿主机10.0.1.5上的kvm虚拟机opesn迁移到10.0.1.61