感谢Cloudman提供的系列基础博客:
http://cloudman.blog.51cto.com/10425448/1745873
Hypervisor(也称VMM):运行在物理服务器和操作系统之间的中间软件层,允许多个操作系统和应用共享一套基础物理硬件,其是虚拟化的核心和基础:协调VM对硬件资源访问、VM的隔离等等。
Hypervisor的虚拟化类型:
(1) 1型,即全裸虚拟化,构建硬件全仿真实例,如ESXI、XEN(直接运行在物理机上)
(2) 2型,Hypervisor作为OS内核的一个程序模块,如KVM、VirtualBox、VMware Workstation(运行在linux系统上)
(3) 3型,运行在传统OS上,创建虚拟化容器,如LXC
其中1型虚拟化一般做了特别优化,性能一般会比较好。此外,当前Openstack对KVM的支持是最好的。
https://www.ibm.com/developerworks/cn/linux/l-hypervisor/
1. kvm基础:
全称为kernel-based virtual machine,基于linux内核实现,用于管理物理cpu和内存(IO的虚拟化由qemu实现)。
其依赖于内核中的kvm.ko模块。
2. libvirt基础:
libvirt是KVM的管理工具(但是同样也可管理XEN、VirtualBox),包含:
(1) libvirtd:后台daemon,接收和处理API请求;
(2) API库:libvirt对外提供的API,virt-manager就是使用该API进行;
(3) virsh:命令行工具
1. 创建Centos:使用Vmware Workstation创建CentOS7虚拟机
2. 对接yum镜像源
对接阿里的yum镜像源,具体参见网上教程。
3. 安装qemu虚拟化:
yum install qemu-kvm qemu-system-x86 libvirt virt-manager bridge-utils
qemu-kvm、qemu-system-x86:kvm和qemu的核心包,提供CPU、内存、IO虚拟化
libvirt:虚拟化管理工具,提供虚拟化的API管理
virt-manager:可视化的虚拟化管理工具
bridge-utils:网络虚拟化需要,kvm网络虚拟化的实现是linux-bridge
(suse和centos,以及在不同版本下的安装包是不一样的)
4. 打开CPU的VT虚拟化能力(更改时需要在关闭VM的情况进行)
打开Centos,确认CPU是否正常的开启了虚拟化能力:
[root@localhost Desktop]# egrep -o '(vmx|svm)' /proc/cpuinfo
vmx
vmx
vmx
vmx
vmx:Inter的cpu虚拟化技术
svm:AMD的cpu虚拟化技术
虚拟化技术VT(Virtualization Technology)是对资源虚拟化管理的结果,其中Intel在CPU端的虚拟化里实现了VMX(Virtual-Machine Extensions,虚拟机扩展)架构。包含两种角色环境:
(1) VMM(Virtual Machine Monitor,虚拟机管理者)host
(2) VM(Virtual Machine,虚拟机)guest
guest端软件访问的资源收到VMM的监管。
5. 查看libvirtd状态:
[root@localhost Desktop]# service libvirtd status
Redirecting to /bin/systemctl status libvirtd.service
● libvirtd.service - Virtualization daemon
Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2017-09-24 06:28:15 PDT; 14min ago
Docs: man:libvirtd(8)
http://libvirt.org
Main PID: 1494 (libvirtd)
CGroup: /system.slice/libvirtd.service
├─1494 /usr/sbin/libvirtd
├─2818 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_l...
└─2819 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_l...
Sep 24 06:28:10 localhost.localdomain systemd[1]: Starting Virtualization daemon...
Sep 24 06:28:15 localhost.localdomain systemd[1]: Started Virtualization daemon.
Sep 24 06:28:21 localhost.localdomain dnsmasq[2818]: started, version 2.66 cachesize 150
Sep 24 06:28:21 localhost.localdomain dnsmasq[2818]: compile time options: IPv6 GNU-getopt DBus no-i18n IDN DHCP DHCPv6 no-Lua TFTP...t auth
Sep 24 06:28:21 localhost.localdomain dnsmasq-dhcp[2818]: DHCP, IP range 192.168.122.2 -- 192.168.122.254, lease time 1h
Sep 24 06:28:21 localhost.localdomain dnsmasq[2818]: reading /etc/resolv.conf
Sep 24 06:28:21 localhost.localdomain dnsmasq[2818]: using nameserver 192.168.98.2#53
Sep 24 06:28:21 localhost.localdomain dnsmasq[2818]: read /etc/hosts - 2 addresses
Sep 24 06:28:21 localhost.localdomain dnsmasq[2818]: read /var/lib/libvirt/dnsmasq/default.addnhosts - 0 addresses
Sep 24 06:28:21 localhost.localdomain dnsmasq-dhcp[2818]: read /var/lib/libvirt/dnsmasq/default.hostsfile
Hint: Some lines were ellipsized, use -l to show in full.
1. 执行virt-manager,启动图形界面,并创建cirrors,请确保本地有一个cirrors镜像:
2. 使用virsh查看cirros:
1. CPU虚拟化:一个KVM虚拟机就是host上一个qemu-kvm进程,与其它linux进程一样被调度。
[root@localhost Desktop]# ps -ef | grep kvm
root 749 2 0 08:12 ? 00:00:00 [kvm-irqfd-clean]
qemu 4674 1 9 08:28 ? 00:00:13 /usr/libexec/qemu-kvm -name cirrors -S -machine pc-i440fx-rhel7.0.0,accel=kvm,usb=off,dump-guest-core=off -cpu Haswell,-hle,-rtm -m 100 -realtime mlock=off -smp 1,sockets=1,cores=1,threads=1 -uuid f316ac73-f9a1-4d4a-92f7-5679b5142e9c -no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/domain-1-cirrors/monitor.sock,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc,driftfix=slew -global kvm-pit.lost_tick_policy=delay -no-hpet -no-shutdown -global PIIX4_PM.disable_s3=1 -global PIIX4_PM.disable_s4=1 -boot strict=on -device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x5.0x7 -device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x5 -device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x5.0x1 -device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x5.0x2 -device virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x6 -drive file=/home/lanyyyy/cirros-0.3.0-x86_64-disk.img,format=qcow2,if=none,id=drive-ide0-0-0 -device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 -netdev tap,fd=25,id=hostnet0 -device rtl8139,netdev=hostnet0,id=net0,mac=52:54:00:ad:83:79,bus=pci.0,addr=0x3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -chardev spicevmc,id=charchannel0,name=vdagent -device virtserialport,bus=virtio-serial0.0,nr=1,chardev=charchannel0,id=channel0,name=com.redhat.spice.0 -spice port=5900,addr=127.0.0.1,disable-ticketing,image-compression=off,seamless-migration=on -vga qxl -global qxl-vga.ram_size=67108864 -global qxl-vga.vram_size=67108864 -global qxl-vga.vgamem_mb=16 -global qxl-vga.max_outputs=1 -device intel-hda,id=sound0,bus=pci.0,addr=0x4 -device hda-duplex,id=sound0-codec0,bus=sound0.0,cad=0 -chardev spicevmc,id=charredir0,name=usbredir -device usb-redir,chardev=charredir0,id=redir0,bus=usb.0,port=1 -chardev spicevmc,id=charredir1,name=usbredir -device usb-redir,chardev=charredir1,id=redir1,bus=usb.0,port=2 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x7 -msg timestamp=on
2. 内存虚拟化:
KVM实现了了VA(虚拟内存) -> PA(物理内存) -> MA(机器内存)直接的地址转换。虚拟机是直接不能直接访问物理OS的内存,仅仅只是保存了VA -> PA到映射
3. 存储虚拟化:
是通过存储池(Storage Pool)、卷(volume)来管理的。Storage Pool是宿主机上可以看到的一片存储空间,可以是多种类型。Volume是在Storage Pool中划分出一块空间,宿主机将Volume分配给VM。