KVM基础之二 选项、安装、四种模型
安装步骤
(1)确保CPU支持HVM
#egrep 'vmx|svm' /proc/cpuinfo --color=auto (注:虚拟机上时看不到的,因为虚拟机没有把对应的硬件辅助虚拟化技术给输出到虚拟机)
可以看到grep出来的内容,就说明支持kvm。
(2)装载模块(装载KVM时候会自动判断当前主机CPU模型,而把另一个模块装载进来)
[root@kevin ~]# modprobe kvm [root@kevin ~]# modprobe kvm-intel [root@kevin ~]# lsmod | grep kvm kvm_intel 170086 0 kvm 566340 1 kvm_intel irqbypass 13503 1 kvm
(3) 验证
# ls /dev/km
从2.6.20版本开始,KVM已经被收入Linux内核,所以安装KVM显得很简单,但是要使用KVM进行虚拟机的管理还需要安装KVM的管理工具。
(4)安装libvirt及kvm
libvirt是管理虚拟机的API库,不仅支持KVM虚拟机,也可以管理Xen等方案下的虚拟机。 [root@kevin ~]# yum -y install libcanberra-gtk2 qemu-kvm.x86_64 qemu-kvm-tools.x86_64 libvirt.x86_64 libvirt-cim.x86_64 libvirt-client.x86_64 libvirt-java.noarch libvirt-python.x86_64 libiscsi-1.7.0-5.el6.x86_64 dbus-devel virt-clone tunctl virt-manager libvirt libvirt-python python-virtinst 由于要用virt-manager图形化安装虚拟机,所以还需要安装X-window(这个在前面部署VNC环境里就已经安装了) [root@kevin ~]# yum groupinstall "X Window System" 安装中文字符,解决界面乱码问题 [root@kevin ~]# yum install -y dejavu-lgc-sans-fonts [root@kevin ~]# yum groupinstall -y "Fonts" 启用libvirt [root@kevin ~]# systemctl enable libvirtd [root@kevin ~]# systemctl start libvirtd
二、安装 qemu-kvm
2.1、CentOS 7 本地yum 就直接对 qemu-kvm 提供支持。
[root@192.168.118.14 ~]#yum list all | egrep qemu-kvm qemu-kvm.x86_64 10:1.5.3-105.el7 @yum qemu-kvm-common.x86_64 10:1.5.3-105.el7 @yum qemu-kvm-tools.x86_64 10:1.5.3-105.el7 yum [root@192.168.118.14 ~]#yum install qemu-kvm -y [root@192.168.118.14 ~]#ln -vs /usr/libexec/qemu-kvm /usr/bin/ ‘/usr/bin/qemu-kvm’ -> ‘/usr/libexec/qemu-kvm’
2.2、语法格式:
qemu-kvm [options] [disk_image]
大致可分为如下几类,命令选项:
- 标准选项
- USB选项
- 显示选项
- 网络选项
- i386平台专用选项
- 字符设备选项
- 蓝牙设备选项
- Linux启动专用选项
- 调试/专家模式选项
qemu-kvm的标准选项:qemu-kvm的标准选项主要涉及指定主机类型、CPU模式、NUMA、软驱设备、光驱设备及硬件设备等。 -name name:设定虚拟机名称 -M machine:指定要模拟的主机类型,如standard PC,ISA-only PC或Intel-Mac等,可以使用“qemu-kvm -M ?”获取所支持的所有类型 -m megs:设定虚拟机的RAM大小 -cpu model:设定CPU模型,如coreduo、qemu64等,可以使用"qemu-kvm -cpu ?"获取所支持的所有模型 -smp n[,cores=cores][,threads=threads][,sockets=sockets][,maxcpus=maxcpus]:
设定模拟的SMP架构中CPU的个数等、每个CPU的核心数及CPU的socket数目等:PC机上最多可以模拟255颗CPU:maxcpus用于指定热插入的CPU个数上限 -numa opts:指定模拟多节点的numa设备 -fda file: -fdb file:使用指定文件(file)作为软盘镜像,file为/dev/fd0表示使用物理软驱 -hda file: -hdb file: -hdc file: -hdd file:使用指定file作为硬盘镜像 -cdrom file:使用指定file作为CD-ROM镜像,需要注意的是-cdrom和-hdc不能同时使用:将file指定为/dev/cdrom可以直接使用物理光驱 -drive option[,option[,option[,...]]]:定义一个硬盘设备:可用子选项有很多。 file=/path/to/somefile:硬盘映像文件路径 if=interface:指定硬盘设备所连接 index=index:设定同一种控制器类型中不同设备的索引号,即标识号 media=media:定义介质类型为硬盘disk还是光盘cdrom snapshot=snapshot:指定当前硬盘设备是否支持快照功能:on或off cache=cache:定义如何使用物理机缓存来访问块数据,其可用值有none、writeback、unsafe和writethrough四个 format=format:指定映像文件的格式,具体格式可参见qemu-img命令 -boot [order=drives][,once=drives][,menu=on|off]:定义启动设备的引导次序,每种设备使用一个字符表示:不同的架构所支持的设备及其表示字符不尽相同,
在x86 PC架构上,a、b表示软驱,c表示第一个光驱设备,n-p表示网络适配器,默认为硬盘设备。例如:-boot order=dc,once=d
cirros project :为cloud环境测试vm提供的微缩版linux
启动第一虚拟:
#qemu-kvm -m 128 -smp 2 -name test -hda /images/kvm/cirros-0.3.4-i386.disk.img
用-drive指定磁盘映像文件:
#qemu-kvm -m 128 -name test -smp 2 -drive file=/images/kvm/cirros-0.3.4-i386-
通过cdrom启动winxp的安装:
#qemu-kvm -name winxp -smp 4,socket=1,cores=2,threads=2 -m 512 -drive file=/image/kvm/winxp.img,if=ide,media=disk,cache=writeback,format=qcow2 -drive file=/root/winxp_ghost.iso
指定使用桥接网络接口:
#qemu-kvm -name test -m 128 -smp 2 -drive file= /images/kvm/cirros-0.3.4-i386.disk.img,if=virtio,media=disk,cache=writeback,format=qcow2 -net nic -net tap,script=/etc/if-up, downscript=no -nographic
-
qemu-kvm的显示选项
显示选项用于定义虚拟机启动后的显示接口相关类型及属性等。
-nographic:默认情况下,qemu使用SDL来显示VGA输出;而此选项用于禁止图形接口,此时,qemu类似一个简单的命令行程序,其仿真串口设备将被重定向到控制台; -curses:禁止图形接口,并使用curses/ncurses作为交互接口; -alt-grab:使用Ctrl+Alt+Shift组合键释放鼠标; -ctrl-grab:使用右Ctrl键释放鼠标; -sdl:启用SDL(Simple DirectMedia Layer); -spice option[,option[,...]]:启用spice远程桌面协议;其有许多子选项,具体请参照qemu-kvm的手册; -vga type:指定要仿真的VGA接口类型,常见类型有: cirrus:Cirrus Logic GD5446显示卡; std:带有Bochs VBI扩展的标准VGA显示卡; vmware:VMWare SVGA-II兼容的显示适配器; qxl:QXL半虚拟化显示卡;与VGA兼容;在Guest中安装qxl驱动后能以很好的方式工作,在使用spice协议时推荐使用此类型; none:禁用VGA卡; -vnc display[,option[,option[,...]]]:默认情况下,qemu使用SDL显示VGA输出;使用-vnc选项,可以让qemu监听在VNC上,并将VGA输出重定向至VNC会话;
使用此选项时,必须使用-k选项指定键盘布局类型;其有许多子选项,具体请参照qemu-kvm的手册;
-
i386平台专用选项
-no-acpi:禁用ACPI功能,GuestOS与ACPI出现兼容问题时使用此选项; -balloon none:禁用balloon设备; -balloon virtio[,addr=addr]:启用virtio balloon设备;
-
网络属性相关选项
网络属性相关选项用于定义网络设备接口类型及其相关的各属性等信息。这里只介绍nic、tap和user三种类型网络接口的属性,其它类型请参照qemu-kvm手册。
-net nic[,vlan=n][,macaddr=mac][,model=type][,name=name][,addr=addr][,vectors=v]:创建一个新的网卡设备并连接至vlan n中;PC架构上默认的NIC为e1000,macaddr用于为其指定MAC地址,
name用于指定一个在监控时显示的网上设备名称;emu可以模拟多个类型的网卡设备,如virtio、i82551、i82557b、i82559er、ne2k_isa、pcnet、rtl8139、e1000、smc91c111、lance及mcf_fec等;不过,不同平台架构上,
其支持的类型可能只包含前述列表的一部分,可以使用“qemu-kvm -net nic,model=?”来获取当前平台支持的类型;
注:默认mac地址均为: 52:54:00:12:34:56 ,使用多个KVM虚拟机时需要手动指定参数:macaddr=mac -net tap[,vlan=n][,name=name][,fd=h][,ifname=name][,script=file][,downscript=dfile]:通过物理机的TAP网络接口连接至vlan n中,使用script=file指定的脚本(默认为/etc/qemu-ifup)来配置当前网络接口,
并使用downscript=file指定的脚本(默认为/etc/qemu-ifdown)来撤消接口配置;使用script=no和downscript=no可分别用来禁止执行脚本;
-net user[,option][,option][,...]:在用户模式配置网络栈,其不依赖于管理权限;有效选项有: vlan=n:连接至vlan n,默认n=0; name=name:指定接口的显示名称,常用于监控模式中; net=addr[/mask]:设定GuestOS可见的IP网络,掩码可选,默认为10.0.2.0/8; host=addr:指定GuestOS中看到的物理机的IP地址,默认为指定网络中的第二个,即x.x.x.2; dhcpstart=addr:指定DHCP服务地址池中16个地址的起始IP,默认为第16个至第31个,即x.x.x.16-x.x.x.31; dns=addr:指定GuestOS可见的dns服务器地址;默认为GuestOS网络中的第三个地址,即x.x.x.3; tftp=dir:激活内置的tftp服务器,并使用指定的dir作为tftp服务器的默认根目录; bootfile=file:BOOTP文件名称,用于实现网络引导GuestOS;如:qemu -hda linux.img -boot n -net user,tftp=/tftpserver/pub,bootfile=/pxelinux.0
2.3、qemu-img info NameFile.img #查看镜像文件格式
2.4、启动一个 kvm 虚拟机#
这里使用 cirros 系统作为镜像文件直接启动,下载地址:http://download.cirros-cloud.net/
wget -c https://github.com/cirros-dev/cirros/releases/download/0.3.5/cirros-0.3.5-i386-disk.img
wget -c https://github.com/cirros-dev/cirros/releases/download/0.3.5/cirros-0.3.5-x86_64-disk.img
[root@localhost ~]#qemu-kvm -smp 1 -m 512m -name 'test' -hda /image/cirros-0.3.5-i386-disk.img VNC server running on `::1:5900' -smp 指定cpu的核心数 -m 指定内存的大小
注:使用VNC工具来连接才能看到,它不会自动打开控制台,且是本地监听的。
[root@localhost ~]# yum list all |grep vnc
[root@localhost ~]# yum install tigervnc virt-viewer vncserver -y
[root@localhost image]# rpm -ql tigervnc
/usr/bin/vncviewer #使用此CLI连接
/usr/share/applications/vncviewer.desktop
/usr/share/doc/tigervnc-1.8.0
/usr/share/doc/tigervnc-1.8.0/README.txt
/usr/share/locale/bg/LC_MESSAGES/tigervnc.mo
/usr/share/locale/da/LC_MESSAGES/tigervnc.mo
/usr/share/locale/de/LC_MESSAGES/tigervnc.mo
/usr/share/locale/el/LC_MESSAGES/tigervnc.mo
/usr/share/locale/eo/LC_MESSAGES/tigervnc.mo
/usr/share/locale/es/LC_MESSAGES/tigervnc.mo
/usr/share/locale/fi/LC_MESSAGES/tigervnc.mo
/usr/share/locale/fr/LC_MESSAGES/tigervnc.mo
/usr/share/locale/fur/LC_MESSAGES/tigervnc.mo
/usr/share/locale/hu/LC_MESSAGES/tigervnc.mo
/usr/share/locale/it/LC_MESSAGES/tigervnc.mo
/usr/share/locale/nl/LC_MESSAGES/tigervnc.mo
/usr/share/locale/pl/LC_MESSAGES/tigervnc.mo
/usr/share/locale/pt_BR/LC_MESSAGES/tigervnc.mo
/usr/share/locale/ru/LC_MESSAGES/tigervnc.mo
/usr/share/locale/sk/LC_MESSAGES/tigervnc.mo
/usr/share/locale/sr/LC_MESSAGES/tigervnc.mo
/usr/share/locale/sv/LC_MESSAGES/tigervnc.mo
/usr/share/locale/tr/LC_MESSAGES/tigervnc.mo
/usr/share/locale/uk/LC_MESSAGES/tigervnc.mo
/usr/share/locale/vi/LC_MESSAGES/tigervnc.mo
/usr/share/locale/zh_CN/LC_MESSAGES/tigervnc.mo
/usr/share/man/man1/vncviewer.1.gz
[root@localhost image]# vncviewer :5900
TigerVNC Viewer 64-bit v1.8.0
Built on: 2020-04-01 04:44
Copyright (C) 1999-2017 TigerVNC Team and many others (see README.txt)
See http://www.tigervnc.org for information on TigerVNC.
Can't open display:
DISPLAY 环境变量格式如下host:NumA.NumB, host指Xserver所在的主机主机名或者ip地址,
图形将显示在这一机器上, 可以是启动了图形界面的Linux/Unix机器, 也可以是安装了Exceed,
X-Deep/32等Windows平台运行的Xserver的Windows机器. 如果Host为空, 则表示Xserver运行于本机,
并且图形程序(Xclient)使用unix socket方式连接到Xserver, 而不是TCP方式. 使用TCP方式连接时,
NumA为连接的端口减去6000的值, 如果NumA为0, 则表示连接到6000端口; 使用unix
socket方式连接时则表示连接的unix socket的路径, 如果为0, 则表示连接到/tmp/.X11-unix/X0 .
NumB则几乎总是0.
[root@localhost image]# export DISPLAY=:0.0
[root@localhost image]# vncviewer :5900
启动完成,默认是以 VNC 的方式可以连接到控制台
通过 “Ctrl + Alt + 2” 切换到 QEMU 监视器窗口,在监视器窗口中可以执行一些命令,比如:info kvm 查看当前 QEMU 是否使用 KVM
通过 “Ctrl + Alt + 1” 切换到普通的客户机命令行模式。
这样一个普通的虚拟机就创建完毕,但是这依然无法正常提供服务。
启动 cirros 虚拟机:
ifconfig -a 获取的地址 tap0 、virbr0
不获取地址:
[root@localhost image]# qemu-kvm -m 128 -cpu host -smp 1 -name "test" -drive file=cirros-0.3.5-i386-disk.img,if=virtio,media=disk,format=qcow2,cache=writeback -nographic -net nic -net tap,name=vif0.0,script=no
三、 KVM虚拟机模型
KVM中的四种简单网络模型,分别如下:
1、隔离模型:虚拟机之间组建网络,该模式无法与宿主机通信,无法与其他网络通信,相当于虚拟机只是连接到一台交换机上。
2、路由模型:相当于虚拟机连接到一台路由器上,由路由器(物理网卡),统一转发,但是不会改变源地址。
3、NAT模型:在路由模式中,会出现虚拟机可以访问其他主机,但是其他主机的报文无法到达虚拟机,而NAT模式则将源地址转换为路由器(物理网卡)地址,这样其他主机也知道报文来自那个主机,在docker环境中经常被使用。
4、桥接模型:在宿主机中创建一张虚拟网卡作为宿主机的网卡,而物理网卡则作为交换机。
3.1、隔离模型:
隔离模型,虚拟机之间可以互相通信,宿主机和虚拟机之间的网络是隔离开的。
如果我们加入网卡设备,那么必须要涉及到系统启动后桥接网络到 br0 上,我们通过脚本实现启动和停止系统时桥接网络和删除桥接的自动执行操作:
启动和关闭虚拟机将网卡桥接到桥接设备上分别如下:
[root@localhost ~]# cat /etc/qemu-ifup #!/bin/bash # bridge=virbr0 if [ -n "$1" ]; then ip link set $1 up sleep 1 brctl addif $bridge $1 [ $? -eq 0 ] && exit 0 || exit 1 else echo "Error: no interfacespecified." exit 1 fi
[root@localhost ~]# cat /etc/qemu-ifdown #!/bin/bash # bridge=virbr0 if [ -n "$1" ];then brctl delif $bridge $1 ip link set $1 down exit 0 else echo "Error: no interfacespecified." exit 1 fi
想kvm虚拟机与虚拟机互通,tap0网卡桥接到virbr0上,创建第一虚拟机test
#qemu-kvm -m 128 -cpu host -smp 1 -name "test" -drive file=cirros-0.3.5-i386-disk.img,if=virtio,media=disk,format=qcow2,cache=writeback -nographic -net nic -net tap,ifname=vif0.0,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown
虚拟机vif0.0 设置网卡 ifconfig eth0 192.168.1.120/24
再实体机上可查找网卡为vif0.0:
桥命令brctl
[root@localhost ~]# rpm -ql bridge-utils
/usr/sbin/brctl
/usr/share/doc/bridge-utils-1.5
/usr/share/doc/bridge-utils-1.5/AUTHORS
/usr/share/doc/bridge-utils-1.5/COPYING
/usr/share/doc/bridge-utils-1.5/FAQ
/usr/share/doc/bridge-utils-1.5/HOWTO
/usr/share/man/man8/brctl.8.gz
创建第二虚拟机test2
#qemu-kvm -m 128 -cpu host -smp 1 -name "test2" -drive file=cirros-0.3.5-i386-disk.img,if=virtio,media=disk,format=qcow2,cache=writeback -nographic -net nic,macaddr=52:54:00:12:34:57 -net tap,ifname=vif0.1,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown
虚拟机vif0.1 设置网卡 ifconfig eth0 192.168.1.121/24
问题:使用kvm开了两个虚拟机,两个虚机连在同一台虚拟交换机上,两台虚拟机配上了同一网段地址,虚拟机接口是UP的,PING自己也是通的,抓包显示有往外发送ARP请求,但无回复。
原因:虚拟交换机br0,没有激活,再主机上使用ifconfig virbr0 up激活即可。
https://www.cnblogs.com/sq5288/category/1502261.html
3.2、路由模型:
[root@localhost ~]# ip link add veth1.0 type veth peer veth1.1 #添加veth1.0设备名称并设置类型为veth (veth另一半指明为peer)
[root@localhost ~]# ifconfig -a
[root@localhost ~]# ifconfig virbr0 up #物理主机首先激活此网卡
[root@localhost ~]# ifconfig veth0 up
[root@localhost ~]# ifconfig veth1.0 up
[root@localhost ~]# brctl addif virbr0 veth1.0 #向virbro上添加veth1.0节点
[root@localhost ~]# ifconfig veth0 192.168.1.254/24 #赋予在物理主机上的虚拟IP地址
KVM虚拟主机上ping veth0
KVM虚拟主机上ping 物理主机ens33
[root@localhost ~]#route add default gw 192.168.1.254 #在KVM虚拟主机上配置网关
#ping 10.1.1.36 (为什么ping的通了,地址属于主机的而不是网卡的)
[root@localhost ~]# cat /proc/sys/net/ipv4/ip_forward
1
[root@localhost ~]#echo 1 > /proc/sys/net/ipv4/ip_forward #值不是1 就用此命令开启路由转发功能
[root@localhost ~]# tcpdump -i veth0 -nn #抓包后发现数据报文都能发过去,而回不来
分析:新创建的一对veth0虚拟网卡,导致链路太长无法到达目的地,可以直接赋予virbr0地址,然后NT转换
3.3 NAT模型
[root@localhost ~]# ip link delete veth1.0
[root@localhost ~]# ifconfig virbr0 192.168.1.254/24
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.220.0/24 -j MASQUERADE
firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 192.168.2.0/24 -j SNAT --to-source 10.1.1.36
3.4 桥接模式
在宿主机中创建一个桥设备,把宿主机的ens33放在桥上,这样Guest1上的eth0将报文发给virbr0,再直接发给宿主机上的ens33,将源地址改为宿主机上的eth0的地址。(即将物理主机的地址赋予给virbr0,物理主机当成交换机)
当响应报文到达物理机上的ens33时如何判断此响应报文是发给虚拟机的还是物理机自己的?
物理机会先创建一个虚拟网卡,在物理机上打开混杂模式(无论mac地址是不是自己的都将接收响应报文),如果mac地址是自己的则转发给虚拟网卡,如果不是自己的则转发给virbr0,这就是桥接模型,因为物理机的网卡具有桥的功能所以叫做桥接模型。
[root@localhost ~]# ip addr delete 192.168.1.254/24 dev virbr0
[root@localhost ~]# ip addr del 10.1.1.36/24 dev ens33;brctl addif virbr0 ens33;ifconfig virbr0 10.1.1.36/24 #物理地址转接到虚拟网卡上,并赋予对应物理地址
虚拟机的ip段和宿主机上的eth1在一个网段(因为使用宿主机的eth0的IP地址进行ssh,所以这里使用eth1进行桥接)
参考 KVM虚拟化之四种网络模型 :https://blog.csdn.net/ccschan/article/details/88095718
补充、qemu-kvm管理KVM虚拟机
QEMU 是一个广泛使用的开源计算机仿真器和虚拟机。当作为仿真器时,可以在一种架构下运行另一种架构
下的操作系统和程序。而通过动态转化,其可以获得很高的运行效率,当作为一个虚拟机时,qemu可以通过直接使用真机的系统资源,让虚拟系统能够
获得接近于物理机的性能表现,qemu支持xen或者kvm模式下的虚拟化,当用kvm时,qemu可以虚拟X86、服务器和嵌入式powerpc,以及s390的系统
Qemu有如下几个部分组成:
- 处理器模拟器(x86、PowerPC和Sparc)
- 仿真设备(显卡、网卡、硬盘、鼠标等)
- 用于将仿真设备连接至主机设备(真实设备)的通用设备
- 模拟机的描述信息
- 调试器
- 与模拟器交互的用户接口
https://blog.51cto.com/jerry12356/2113364
https://blog.csdn.net/yueyihua/article/details/65631855
https://www.cnblogs.com/kevingrace/p/8377645.html
https://www.nndev.cn/archives/category/vmware