虚拟化技术之KVM
KVM 是Kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中,KVM目前已成为学术界的主流 VMM (virtual machine monitor,虚拟机监视器,也称为hypervisor)之一。
- 安装环境
yum install -y vim wget tree lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop lsof ntpdate telnet bridge-utils
yum -y install qemu-kvm qemu-kvm-tools libvirt libvirt-client virt-manager virt-install
systemctl restart libvirtd
systemctl enable libvirtd
- 验证开启虚拟化
[kvm]$ grep -E "vmx|svm" /proc/cpuinfo | wc -l
2
KVM管理工具
libvirt
使用最多的KVM虚拟化管理工具和应用程序接口,即通过libvirt调用KVM创建虚拟机,libvirt是KVM通用的访问API,其不但能管理KVM,还能管理VMware、Xen、Hyper-V、virtualBox等虚拟化方案。
virsh:
是一个常用的管理KVM虚拟化的命令行工具,常用语管理运行在单个宿主机上的虚拟机,virsh是一个使用C语言编写调用libvirt API的虚拟化管理命令行工具。
virt-manager:
virt-manager是一个虚拟化管理图形软件,其底层也是调用libvirt API来完成对虚拟机的操作,包括虚拟机的创建、删除、启动、停止以及一些简单的监控功能等。
openstack:
openstack是一个开源的虚拟化编排工具,常用于构建大规模的虚拟化环境,用语管理成千上万虚拟机的创建、启动、删除等整个生命周期。
- 创建磁盘(2种格式)
#默认保存虚拟机磁盘的路径
[kvm]$ ll /var/lib/libvirt/images/
-rw-r--r-- 1 root root 962592768 Aug 19 14:19 CentOS-7-x86_64-Minimal-1810.iso
#创建一个格式为raw大小为10G的裸磁盘,-f指定格式。(这个会直接占用10G的空间)
[kvm]$ qemu-img create -f raw /var/lib/libvirt/images/Centos7.raw 10G
Formatting '/var/lib/libvirt/images/Centos7.raw', fmt=raw size=10737418240
#创建好了
[kvm]$ ll -h /var/lib/libvirt/images/
total 0
-rw-r--r-- 1 root root 10G Aug 19 14:27 Centos7.raw
#另一种方法:创建一个格式为raw大小为10G的稀疏格式磁盘
[kvm]$ qemu-img create -f qcow2 /var/lib/libvirt/images/centos.qcow2 10G
Formatting '/var/lib/libvirt/images/centos.qcow2', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536 lazy_refcounts=off
[kvm]$ ll -h /var/lib/libvirt/images/
-rw-r--r-- 1 root root 193K Aug 19 14:29 centos.qcow2
virsh-install命令使用帮助
[kvm]$ virt-install --help
usage: virt-install --name NAME --ram RAM STORAGE INSTALL [options]
使用指定安装介质新建虚拟机。
`选项参数(optional arguments):`
-h, --help show this help message and exit
--version show program’s version number and exit
--connect URI 使用 libvirt URI 连接到 hypervisor
`通用选项(General Options):`
-n NAME, --name NAME 客户端事件名称
--memory MEMORY 配置虚拟机内存分配。例如:
--memory 1024 (in MiB)
--memory 512,maxmemory=1024
--vcpus VCPUS 为虚拟机配置的 vcpus 数。例如:
--vcpus 5
--vcpus 5,maxcpus=10,cpuset=1-4,6,8
--vcpus sockets=2,cores=4,threads=2,
--cpu CPU CPU 型号及功能。例如:
--cpu coreduo,+x2apic
--cpu host
--metadata METADATA 配置虚拟机元数据。例如:
--metadata name=foo,title="My pretty title",uuid=...
--metadata description="My nice long description"
`安装方法选项(Installation Method Options):`
--cdrom CDROM 光驱安装介质
-l LOCATION, --location LOCATION
#安装源(例如:nfs:host:/path、http://host/path、ftp://host/path)
--pxe #使用 PXE 协议从网络引导
--import #在磁盘映像中构建虚拟机
--livecd #将光驱介质视为 Live CD
-x EXTRA_ARGS, --extra-args EXTRA_ARGS
#附加到使用 --location 引导的内核的参数
--initrd-inject INITRD_INJECT
#使用 --location 为 initrd 的 root添加给定文件
--os-variant DISTRO_VARIANT
#在其中安装 OS 变体的虚拟机,比如'fedora18'、'rhel6'、'winxp' 等等。
--boot BOOT #配置虚拟机引导设置。例如:
--boot hd,cdrom,menu=on
--boot init=/sbin/init (for containers)
--idmap IDMAP #为 LXC 容器启用用户名称空间。例如:
--idmap uid_start=0,uid_target=1000,uid_count=10
设备选项(Device Options):
--disk DISK #使用不同选项指定存储。例如:
--disk size=10 (new 10GiB image in default location)
--disk /my/existing/disk,cache=none
--disk device=cdrom,bus=scsi
--disk=?
-w NETWORK, --network NETWORK
#配置虚拟机网络接口。例如:
--network bridge=mybr0
--network network=my_libvirt_virtual_net
--network network=mynet,model=virtio,mac=00:11...
--network none
--network help
--graphics GRAPHICS #配置虚拟机显示设置。例如:
--graphics vnc
--graphics spice,port=5901,tlsport=5902
--graphics none
--graphics vnc,password=foobar,port=5910,keymap=ja
--controller CONTROLLER
#配置虚拟机控制程序设备。例如:
--controller type=usb,model=ich9-ehci1
--input INPUT #配置虚拟机输入设备。例如:
--input tablet
--input keyboard,bus=usb
--serial SERIAL #配置虚拟机串口设备
--parallel PARALLEL #配置虚拟机并口设备
--channel CHANNEL #配置虚拟机沟通频道
--console CONSOLE #配置虚拟机与主机之间的文本控制台连接
--hostdev HOSTDEV #将物理 USB/PCI/etc 主机设备配置为与虚拟机共享
--filesystem FILESYSTEM
#将主机目录传递给虚拟机。例如:
--filesystem /my/source/dir,/dir/in/guest
--filesystem template_name,/,type=template
--sound [SOUND] #配置虚拟机声音设备模拟
--watchdog WATCHDOG #配置虚拟机 watchdog 设备
--video VIDEO #配置虚拟机视频硬件。
--smartcard SMARTCARD
配置虚拟机智能卡设备。例如:
--smartcard mode=passthrough
--redirdev REDIRDEV #配置虚拟机重定向设备。例如:
--redirdev usb,type=tcp,server=192.168.1.1:4000
--memballoon MEMBALLOON
配置虚拟机 memballoon 设备。例如:
--memballoon model=virtio
--tpm TPM #配置虚拟机 TPM 设备。例如:
--tpm /dev/tpm
--rng RNG #配置虚拟机 RNG 设备。例如:
--rng /dev/random
--panic PANIC #配置虚拟机 panic 设备。例如:
--panic default
虚拟机配置选项:
--security SECURITY 设定域安全驱动器配置。
--numatune NUMATUNE 为域进程调整 NUMA 策略。
--memtune MEMTUNE 为域进程调整内粗策略。
--blkiotune BLKIOTUNE
#为域进程调整 blkio 策略。
--memorybacking MEMORYBACKING
#为域进程设置内存后备策略。例如:
--memorybacking hugepages=on
--features FEATURES #设置域 <features> XML。例如:
--features acpi=off
--features apic=on,eoi=on
--clock CLOCK #设置域 <clock> XML。例如:
--clock offset=localtime,rtc_tickpolicy=catchup
--pm PM #配置 VM 电源管理功能
--events EVENTS #配置 VM 生命周期管理策略
--resource RESOURCE #配置 VM 资源分区(cgroups)
`虚拟化平台选项(Virtualization Platform Options):`
-v, --hvm #客户端应该是一个全虚拟客户端
-p, --paravirt #这个客户端一个是一个半虚拟客户端
--container #这台虚拟机需要一个容器客户端
--virt-type HV_TYPE #要使用的管理程序名称(kvm、qemu、xen等等)
--arch ARCH #模拟的 CPU 构架
--machine MACHINE #要模拟的机器类型
`其它选项(Miscellaneous Options):`
--autostart #引导主机时自动启动域。
--wait WAIT #等待安装完成的分钟数。
--noautoconsole #不要自动尝试连接到客户端控制台
--noreboot #完成安装后不要引导虚拟机。
--print-xml [XMLONLY]
#输出所生成域 XML,而不是创建虚拟机。
--dry-run #完成安装步骤,但不要创建设备或者定义虚拟机。
--check CHECK #启用或禁用验证检查。例如:
--check path_in_use=off
--check all=off
-q, --quiet #禁止无错误输出
-d, --debug #输入故障排除信息
创建br0桥接网卡
[kvm]$ cd /etc/sysconfig/network-scripts
[kvm]$ vim ifcfg-br0
TYPE=Bridge
BOOTPROTO=static
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=172.16.23.201
NETMASK=255.255.0.0
GATEWAY=172.16.0.1
DNS1=172.16.0.1
[kvm]$ vim ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=br0
[kvm]$ systemctl restart network