一、什么是虚拟化
虚拟化是一个广义的术语,在计算机方面通常是指计算元件在虚拟的基础上而不是真实的基础上运行。虚拟化技术可以扩大硬件的容量,简化软件的重新配置过程。
二、虚拟化能做什么
CPU的虚拟化技术可以单CPU模拟多CPU并行,允许一个平台同时运行多个操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。
三、虚拟化分类
虚拟化可分为两类,完全虚拟化(full virtualization)和半虚拟化(paravirtualization)。
完全虚拟化(full virtualization):完全虚拟化是一种虚拟化技术用于提供一种虚拟机环境,即一个完整的底层硬件仿真。完全虚拟化要求每个硬件的显著特征被映射到每一个虚拟机上。在虚拟机(VM)和硬件之间之间增加一个软件层–Hypervisor,实现虚拟机管理。工作与完全虚拟化的虚拟机不知道有hypervisor的存在。
半虚拟化(paravirtualization):半虚拟化是一种虚拟化技术,提出了一种虚拟机软件界面相似,但不完全相同的底层硬件。宿主计算机操作系统需要支持para-API,并通过virtual machine monitor (VMM)管理。也就是让虚拟机明确知道自己工作在虚拟环境中。
其中,hypervisor 可以划分为两大类。
类型 1,这种 hypervisor 是直接运行在物理硬件之上的,例如:vmware vsphere, kvm等。
类型 2,这种 hypervisor 运行在另一个操作系统(运行在物理硬件之上)中,例如:VMware workstation, xen(hvm)等。
除此之外,还有以下虚拟化分类:
用户空间虚拟化(容器)拥有独立的文件树和进程树于独立的名字空间中,容器间可通信。可打包如httpd, tomcat
服务于一个文件中,利于快速部署。
docker是容器的一种易于快速部署的方式,kvm+docker是流行的部署方式。
docker的其他实现方式:lxc, openvz, solaris containers, FreeBSD jails
库虚拟化:
WINE,Cywin
应用程序虚拟化:
jvm, pvm
四、KVM的相关术语
KVM (名称来自英语: Kernel-basedVirtual Machine 的缩写,即基于内核的虚拟机),是一种用于Linux内核中
的虚拟化基础设施,可以将Linux内核转化为一个hypervisor。KVM在2007年2月被导入Linux 2.6.20核心中,以
加载核心模块的方式被移植到FreeBSD及illumos上。
KVM必须在在具备硬件支持的Intel VT或AMD-V功能的平台上运行。
KVM安装后,宿主机(HOST)的kernel变为hypervisor。原有操作系统变为domain 0,提供控制台和I/O管理。KVM虚拟机可直接通过原kernel的kvm模块调用宿主机的cpu和
内存,I/O部分则需要先到domain0,再到宿主硬件设备。
运行模式如下:
内核模式:GuestOS执行I/O类操作;
用户模式:代表GuestOS请求I/O类操作;
来宾模式:GuestOS的非I/O类操作;
kvm hypervisor:安装过KVM的kernel;
两类组件:
/dev/kvm:字符设备文件,工作于hypervisor,主要用于创建VM、为VM分配内存、读写VCPU的寄存器、向VCPU注入中断、运行VCPU等等;
qemu进程:工作于用户空间,主要用于实现模拟PC机的IO设备;
QEMU主要提供以下功能:
五、安装KVM
在正式安装之前,我们先来看看这张kmv和各管理工具的关系图。
QUME的主要功能:
处理器模拟器
仿真IO设备
关联模拟的设备至真实设备;
调试器
与模拟器交互的用户接口
qemu:kmv的文本管理工具,包括qemu-kvm、qemu-img
libvirt:是一套免费、开源的支持Linux下主流虚拟化工具的C函数库,libvirtd是运行的守护进程的名称。包括GUI: virt-manager, virt-viewer,CLI: virt-install, virsh
安装步骤:
(1) 确保CPU支持HVM
# grep -E –color=auto "(vmx|svm)" /proc/cpuinfo
(2) 装载模块
# modprobe kvm
# lsmod | grep kvm
(3)验证
ls -l /dev/kvm
(4)安装libvirt
yum install libvirt -y
(5)安装其他管理组件
yum install -y virt-manager virt-viewer virt-install
# yum install -y qemu-kvm
(6)启动libvirtd守护进程
systemctl start libvirtd
验证:ifconfig多了virbr0虚拟网桥(只能是nat模式)
[root@localhost ~]# ifconfig
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:57:1a:76 txqueuelen 0 (Ethernet)
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
(7)启动virt tui
# virt-manager
ps aux
root 14996 13.9 8.7 1197240 87980 ? Ssl 23:41 0:01 /usr/bin/python2 /usr/share/virt-manager/virt-manager
使用virsh测试各命令及创建虚拟机
1. 获取各命令帮助
virsh help KEYWORD
#virsh help list
2. 查看域,–all选项可查看关机的虚拟机域,域id每次开关机后可能不一样
root@localhost ~]# virsh list –all
Id Name State
—————————————————-
– debian8 shut off
3. 查看虚拟机配置文件
注意为xml格式,可以到处到某处查看或以此为模板创建其他虚拟机
虚拟机以域(domain)为单位创建
# virsh dumpxml debian8 > /tmp/mytemplate.xml
4. 创建域
create
virsh create <file> [–console] [–paused] [–autodestroy] [–pass-fds <string>] [–validate]
[–file] <string> file containing an XML domain description
–console attach to console after creation
–paused leave the guest paused after creation
–autodestroy automatically destroy the guest when virsh disconnects
–pass-fds <string> pass file descriptors N,M,… to the guest
–validate validate the XML against the schema
5. 获取域id
[root@localhost ~]# virsh domid debian8
3
6. 获取域uuid
[root@localhost ~]# virsh domuuid debian8
9332c5a4-4abc-4e7f-bec0-faf394950a55
7. 获取域信息
[root@localhost ~]# virsh dominfo debian8
Id: 3
Name: debian8
UUID: 9332c5a4-4abc-4e7f-bec0-faf394950a55
OS Type: hvm
State: running
CPU(s): 2
CPU time: 428.6s
Max memory: 1047552 KiB
Used memory: 1047552 KiB
Persistent: yes
Autostart: disable
Managed save: no
Security model: selinux
Security DOI: 0
Security label: system_u:system_r:svirt_t:s0:c327,c602 (enforcing)
8. 登录虚拟机控制台
[root@localhost ~]# virsh console debian8
Connected to domain debian8
Escape character is ^]
使用ctrl+],退出console
9. 开启域
[root@localhost ~]# virsh start debian8
Domain debian8 started
10. 重启域
reboot
11. 关闭域
destory
shutdown
12. 删除域
undefine
13. 暂停域并保存域状态至某文件中
# virsh save debian8 /tmp/debian_save1 –running
–running 下次恢复,直接启动
14. 从保存文件中恢复域
# virsh restore /tmp/debian_save1
管理域的命令:
15. 改变内存大小
不能超出预设值,只能调小,可以当前生效,也可以下次生效
# virsh setmem debian8 786m –current
[root@localhost ~]# virsh dominfo debian8
Id: 5
Name: debian8
UUID: 9332c5a4-4abc-4e7f-bec0-faf394950a55
OS Type: hvm
State: running
CPU(s): 2
CPU time: 1471.5s
Max memory: 1047552 KiB
Used memory: 804864 KiB #此处为改过的值
Persistent: yes
Autostart: disable
Managed save: no
Security model: selinux
Security DOI: 0
Security label: system_u:system_r:svirt_t:s0:c470,c985 (enforcing)
[root@localhost ~]# free -mh
total used free shared buff/cache available
Mem: 977M 741M 73M 4.2M 162M 64M
Swap: 1.9G 1.1G 827M
16. 设定内存最大内存
运行中的域不能修改最大内存值
[root@localhost ~]# virsh setmaxmem debian8 900m –config
下次启动有效
17. 设定vcpu数量
# virsh setvcpus debian8 1 –config
不能实时改,下次启动有效
18. 获取vcpu信息
[root@localhost ~]# virsh vcpuinfo debian8
VCPU: 0 #vcpu
CPU: 0 #在宿主机cpu位置
State: running
CPU time: 675.5s
CPU Affinity: yyyy
VCPU: 1
CPU: 1
State: running
CPU time: 694.2s
CPU Affinity: yyyy
19. 获取域网络接口信息
[root@localhost ~]# virsh domiflist debian8
Interface Type Source Model MAC
——————————————————-
vnet0 network default virtio 52:54:00:82:53:a2
20. 获取域的接口统计信息
[root@localhost ~]# virsh domifstat debian8 vnet0
vnet0 rx_bytes 197810
vnet0 rx_packets 3755
vnet0 rx_errs 0
vnet0 rx_drop 0
vnet0 tx_bytes 13400
vnet0 tx_packets 111
vnet0 tx_errs 0
vnet0 tx_drop 0
21. 获取域块设备信息
[root@localhost ~]# virsh domblklist debian8
Target Source
————————————————
vda /var/lib/libvirt/images/debian8.qcow2
hda –
22. 获取域块设备(存储)统计信息
[root@localhost ~]# virsh domblkstat debian8
rd_req 21908
rd_bytes 670065746
wr_req 1105
wr_bytes 29772800
flush_operations 229
rd_total_times 97947369758
wr_total_times 60546346501
flush_total_times 1534616225
创建及管理磁盘:
23. 创建磁盘
[root@localhost ~]# qemu-img create -f qcow2 -o preallocation=metadata /tmp/test.qcow2 120G 稀疏格式
Formatting '/tmp/test.qcow2', fmt=qcow2 size=128849018880 encryption=off cluster_size=65536 preallocation='metadata' lazy_refcounts=off
[root@localhost ~]# du -lh /tmp/test.qcow2
19M /tmp/test.qcow2
[root@localhost ~]# ll -lh /tmp/test.qcow2
-rw-r–r–. 1 root root 121G Jan 12 13:53 /tmp/test.qcow2
24. 增加磁盘大小
[root@localhost ~]# qemu-img resize /tmp/test.qcow2 150G
Image resized.
[root@localhost ~]# ll -h /tmp/test.qcow2
-rw-r–r–. 1 root root 121G Jan 12 13:57 /tmp/test.qcow2
[root@localhost ~]# du -lh /tmp/test.qcow2
19M /tmp/test.qcow2
25. 附加磁盘到域
# qemu-img create -f qcow2 -o preallocation=metadata /tmp/mytest.img 20G
[root@localhost ~]# virsh attach-disk debian8 /tmp/mytest.img vdb
Disk attached successfully
26. 拆除磁盘
[root@localhost ~]# virsh detach-disk debian8 vdb
Disk detached successfully
网卡管理
网桥查看命令
[root@localhost ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000000000000 no
virbr0 8000.525400571a76 yes virbr0-nic
vnet0
27.添加域网卡到宿主机桥上
[root@localhost ~]# virsh attach-interface debian8 bridge virbr0 为宿主机nat网桥
Interface attached successfully
[root@localhost ~]# virsh domiflist debian8
Interface Type Source Model MAC
——————————————————-
vnet0 network default virtio 52:54:00:82:53:a2
vnet1 bridge virbr0 rtl8139 52:54:00:ca:04:d3
vnet2 bridge br0 rtl8139 52:54:00:89:3b:1d
28. 删除域网卡
[root@localhost ~]# virsh detach-interface debian8 bridge –mac 52:54:00:89:3b:1d
Interface detached successfully
使用qemu命令手动创建虚拟机
qemu-kvm为创建工具
原创文章,作者:allen,如若转载,请注明出处:http://www.178linux.com/66897