对于初学者而言,openstack的架构和内容实在太多太复杂了,我们不妨从创建一个最基本的虚拟机入手,逐步了解和学习其中涉及的各种技术和知识。
绕不开的第一课
什么是Qemu?kvm?libvirt?
Qemu
既然是虚拟机,那总得有虚拟出来的各种硬件吧,Qemu就是提供这一功能的硬件模拟器,让guestOS以为自己在和真的硬件打交道,而其实,这中间隔着一个Qemu来当翻译。也正是因为存在翻译的过程,所以性能上会打折扣,于是我们需要:
kvm
kvm属于linux内核的模块,可以理解为集成至内核中的Hypervisor,采用intel VT/AMD-V等技术,提供CPU和内存的虚拟化能力,这样guestOS的CPU指令可以不用再经过翻译,性能大增,但它还需要network和周边I/O的支持,所以两者联手:kvm负责cpu和内存,qemu负责其他的,一个内核空间,一个用户空间从而形成qemu-kvm这样一个完整的、更优的虚拟化技术。
Libvirt
Libvirt是一种常用的虚拟机管理工具,可管理包括kvm在内的众多虚拟化技术,包括一个API库,守护进程libvirtd,命令行工具virsh。
通过对基本概念的了解,我们其实已经可以想到这三者的关系:openstack通过libvirt来控制qemu-kvm进行虚拟机的相关操作,正如下图所示:
也就是说我们可以通过libvirt或者qemu来操作虚拟机,下面就开始试试吧。
创建虚拟机
1.准备工作
物理主机为centos 7.4,检查CPU是否支持虚拟化
cat /proc/cpuinfo | egrep '(vmx|svm)' | wc -l
返回大于0表示支持 其中,vmx是intel处理器虚拟机技术标志,svm是AMD的
2.安装所需工具
首先配置好yum源,然后根据具体需要安装
yum install kvm libvirt python-virtinst qemu-kvm virt-viewer bridge-utils virt-install
验证libvirtd是否正常启动
ps -ef | grep libvirtd
验证kvm是否加载成功
lsmod | grep kvm
验证工具安装是否成功
virsh list --all
3.创建虚拟机
介绍三种常用方式
A. qemu方式
创建磁盘镜像
虚拟机磁盘是用主机上的文件来模拟,支持多种镜像格式,如raw、qcow2、vhd等,通常利用qemu-img工具来创建
qemu-img create -f qcow2 /home/tmp/qemu/centos_vm.qcow2 10G
即在指定路径下创建了一个10G大小qcow2格式的镜像
准备操作系统镜像
首次启动虚拟机需要安装操作系统,根据个人需要下载一个iso镜像即可
启动虚拟机
qemu-system-x86_64 -enable-kvm -vnc:0 -smp 2 -m 2048 -cdrom ./CentOS-7-x86_64.iso -hda ./centos_vm.qcow2 -L /usr/share/qemu -usb -usbdevice tablet
参数说明: -enable-kvm:采用kvm加速,不加的话qemu自身也可搞定,如开篇介绍过的 -vnc:0 :使用vnc连接虚拟机的界面,qemu内置vnc server端,0为监听端口号 -smp 2:给虚拟机配置2个vcpu -m2048:给虚拟机配置2G内存 -cdrom:给虚拟机配置光驱,挂载之前准备好的系统镜像 -hda:给虚拟机配置磁盘,用我们之前创建好的磁盘镜像 -usb -usbdevice tablet:给虚拟机配置usb设备,这样vnc登录时鼠标好使
安装guestos
使用vncviewer工具,输入监听的主机IP和vnc端口号,打开虚拟机操作系统安装界面,按照正常流程安装即可,装好后reboot,这样一个最基本的虚拟机就创建ok了。 我们接下来介绍下其他的创建方法
B. virt-install方式
前两步和qemu方式一样,只是启动虚拟机的时候我们采用virt-install工具
virt-install --name=vm1 --ram=2048 --vcpus=2 --cdrom=./CentOS-7-x86_64.iso --disk path=./centos_vm.qcow2,device=disk,format=qcow2,bus=virtio,size=10 --network network=default --accelerate --graphics vnc,listen=186.100.88.33,port=5900 --force --autostart
各参数的含义和qemu方式一样,我们同样用vnc登录虚拟机后正常安装即可
C. virtsh方式
前两步依旧相同,接着我们采用xml配置文件加virsh命令来创建
编写xml配置文件
vi vm1.xml
具体内容可参考:
<domain type='kvm'> <!--如果是Xen,则type=‘xen’-->
<name>vm1</name> <!--虚拟机名称,同一物理机唯一-->
<uuid>fd3535db-2558-43e9-b067-314f48211343</uuid> <!--同一物理机唯一,可用uuidgen生成-->
<memory>524288</memory>
<currentMemory>524288</currentMemory> <!--memory这两个值最好设成一样-->
<vcpu>2</vcpu> <!--虚拟机可使用的cpu个数-->
<os>
<type arch='x86_64' machine='pc-i440fx-vivid'>hvm</type> <!--arch指出系统架构类型,machine 则是机器类型,查看机器类型:qemu-system-x86_64 -M ?-->
<boot dev='hd'/> <!--启动介质,第一次需要装系统可以选择cdrom光盘启动-->
<bootmenu enable='yes'/> <!--表示启动按F12进入启动菜单-->
</os>
<features>
<acpi/> <!--Advanced Configuration and Power Interface,高级配置与电源接口-->
<apic/> <!--Advanced Programmable Interrupt Controller,高级可编程中断控制器-->
<pae/> <!--Physical Address Extension,物理地址扩展-->
</features>
<clock offset='localtime'/> <!--虚拟机时钟设置,这里表示本地本机时间-->
<on_poweroff>destroy</on_poweroff> <!--突发事件动作-->
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices> <!--设备配置-->
<emulator>/usr/libexec/qemu-kvm</emulator>
<disk type='file' device='disk'> <!--硬盘-->
<driver name='qemu' type='qcow2'/>
<source file='/home/tmp/qemu/centos_vm.qcow2'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> <!--域、总线、槽、功能号,slot值同一虚拟机上唯一-->
</disk>
<disk type='file' device='cdrom'><!--光盘-->
<driver name='qemu' type='raw'/>
<source file='/home/tmp/qemu/CentOS-7-x86_64.iso.iso'/>
<target dev='hda' bus='ide'/>
<readonly/>
</disk>
<interface type='network'> <!--基于虚拟局域网的网络-->
<mac address='52:54:4a:e1:1c:84'/> <!--可用命令生成,见下面的补充-->
<source network='default'/> <!--默认-->
<target dev='vnet1'/> <!--同一虚拟局域网的值相同-->
<alias name='net1'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> <!--注意slot值-->
</interface>
<graphics type='vnc' port='5900' autoport='yes' listen='186.100.88.33' keymap='en-us'/> <!--配置vnc,windows下可以使用vncviewer登录,获取vnc端口号:virsh vncdisplay vm0-->
<listen type='address' address='186.100.88.33'/>
</graphics>
</devices>
</domain>
导入配置文件
virsh define vm1.xml
启动虚拟机
virsh start vm1
如同前两种方法可通过vnc登录虚拟机界面 ###配置网络 创建好虚拟机后,我们自然希望将它的网络联通起来,方便后续使用,例如SSH登录 这里介绍一种简单的桥接的方式
在主机上增加网桥设备br0
vi /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE="br0"
ONBOOT="yes"
TYPE="Bridge"
BOOTPROTO=static
IPADDR=186.100.88.32 //主机IP
NETMASK=255.255.255.0
GATEWAY=186.100.88.1
DEFROUTE=yes
配置主机的网卡,将其加入br0网桥
在/etc/sysconfig/network-scripts/ifcfg-eth0中加入
BRIDGE="br0"
重启网络服务
service network restart
检测eth0是否已介入网桥
brctl show
虚拟机配置
修改虚拟机的配置文件中devices中的network部分
<interface type='bridge'>
<mac address='52:54:00:da:c3:dc'/>
<source bridge='br0'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
配置虚拟机IP和网关
vi /etc/sysconfig/network-scripts/ifcfg-eth0
IPADDR=186.100.88.100 //需和br0在同一网段
NETMASK=255.255.255.0
GATEWAY=186.100.88.1
BOOTPROTO=static //dhcp会自动分配地址
重启网络服务后,大功告成 ***
最后的问题
难道我每次创虚拟机都要装一遍系统? 当然不是,首次装好系统后的磁盘镜像就可以用来给后续的虚拟机做模板
拷贝磁盘镜像
cp centos_vm.qcow2 centos_vm2.qcow2
##为新的vm准备配置文件
vi vm2.xml
<domain type='kvm'>
<name>vm2</name>
<uuid>243535db-2558-43e9-b067-314f48211343</uuid>
<memory>524288</memory>
<currentMemory>524288</currentMemory>
<vcpu>2</vcpu>
<os>
<type arch='x86_64' machine='pc-i440fx-vivid'>hvm</type>
<boot dev='hd'/>
</os>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<clock offset='localtime'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
<emulator>/usr/libexec/qemu-kvm</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/home/tmp/qemu/centos_vm2.qcow2'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</disk>
<interface type='network'>
<mac address='52:54:00:e1:1c:84'/>
<source network='default'/>
<target dev='vnet1'/>
<alias name='net1'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> <!--注意slot值-->
</interface>
<graphics type='vnc' port='5902' autoport='yes' listen='186.100.88.33' keymap='en-us'/>
<listen type='address' address='186.100.88.33'/>
</graphics>
</devices>
</domain>
导入配置文件
virsh define vm2.xml
启动虚拟机
virsh start vm2
通过vnc上去看看吧,当然你还需要按前述的方法配置网络