|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
KVM(Kernel-based Virtual Machine, 即内核级虚拟机) 是一个开源的系统虚拟化模块。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。目前KVM已成为学术界的主流VMM之一,它包含一个为处理器提供底层虚拟化 可加载的核心模块kvm.ko(kvm-intel.ko 或 kvm-amd.ko)。kvm还需要一个经过修改的QEMU 软件(qemu-kvm),作为虚拟机上层控制和界面。KVM的虚拟化需要硬件支持(如 Intel VT技术或者AMD V技术)。是基于硬件的 完全虚拟化。 KVM可以运行多个其本身运行未改动的镜像的虚拟机,例如Windows,Mac OS X ,每个虚拟机都有各自的虚拟硬件,比如网卡、硬盘核图形适配 器等。
KVM和QEMU的关系
QEMU是个独立的虚拟化解决方案,从这个角度它并不依赖KVM。而KVM是另一套虚拟化解决方案,不过因为这个方案实际上只实现了内核中对处理器(Intel VT), AMD SVM)虚拟化特性的支持,换言之,它缺乏设备虚拟化以及相应的用户空间管理虚拟机的工具,所以它借用了QEMU的代码并加以精简,连同KVM一起构成了 另一个独立的虚拟化解决方案:KVM+QEMU。
1)kvm相关安装包及其作用
- qemu-kvm 主要的KVM程序包
- python-virtinst 创建虚拟机所需要的命令行工具和程序库
- virt-manager GUI虚拟机管理工具
- virt-top 虚拟机统计命令
- virt-viewer GUI连接程序,连接到已配置好的虚拟机
- libvirt C语言工具包,提供libvirt服务
- libvirt-client 虚拟客户机提供的C语言工具包
- virt-install 基于libvirt服务的虚拟机创建命令
- bridge-utils 创建和管理桥接设备的工具
复制代码 2)安装kvm
1)检查cpu是否支持虚拟化
[root@kevin ~]# grep vmx /proc/cpuinfo
如果有vmx信息输出,说明支持VT;如果没有任何的输出,说明你的cpu不支持,将无法使用KVM虚拟机。
2)检查BIOS设置确认已开启虚拟化功能,然后查看系统是否成功加载KVM模块
[root@kevin ~]# lsmod | grep kvm
kvm_intel 170086 0
kvm 566340 1 kvm_intel
irqbypass 13503 1 kvm
=========================================================
如果系统当前没有加载KVM模块,可以运行以下命令来手工加载:
[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
=========================================================
内核模块导出了一个名为/dev/kvm的设备,这个设备将虚拟机的的地址空间独立于内核或者任何应用程序的地址空间。
[root@kevin ~]# ll /dev/kvm
crw-rw-rw-. 1 root kvm 10, 232 1月 29 11:56 /dev/kvm
3)桥接网络
当前系统下如果没有brctl命令(用来管理网桥的工具),则需要安装bridge-utils ,
[root@kevin ~]# yum -y install bridge-utils
[root@kevin ~]# systemctl restart network
配置KVM的网桥模式
[root@kevin ~]# cd /etc/sysconfig/network-scripts/
[root@openstack network-scripts]# cp ifcfg-eno1 ifcfg-br0
[root@openstack network-scripts]# cat ifcfg-br0
TYPE="Bridge" //这一行修改为Bridge
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="no"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="br0" //修改设备名称为br0
#UUID="fdbad04f-dae3-440e-8a8b-01d6a7bc9fe0" //这一行注释
DEVICE="br0" //修改设备为br0
ONBOOT="yes"
IPADDR="192.168.10.210"
PREFIX="24"
GATEWAY="192.168.10.1"
DNS1="8.8.8.8"
[root@openstack network-scripts]# cat ifcfg-eno1
TYPE="Ethernet"
BRIDGE=br0 //添加这一行
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="no"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="eno1"
UUID="fdbad04f-dae3-440e-8a8b-01d6a7bc9fe0"
DEVICE="eno1"
ONBOOT="yes"
#IPADDR="192.168.10.210" //注释掉这几行
#PREFIX="24"
#GATEWAY="192.168.10.1"
#DNS1="8.8.8.8"
重启网卡服务
[root@openstack network-scripts]# systemctl restart network
查看网卡
[root@openstack network-scripts]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.0894ef518b22 no eno1
virbr0 8000.52540095d7c2 yes virbr0-nic
查看ip信息
[root@openstack network-scripts]# ifconfig |head -20
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.10.210 netmask 255.255.255.0 broadcast 192.168.10.255
inet6 fe80::a94:efff:fe51:8b22 prefixlen 64 scopeid 0x20<link>
ether 08:94:ef:51:8b:22 txqueuelen 1000 (Ethernet)
RX packets 856 bytes 52981 (51.7 KiB)
RX errors 0 dropped 2 overruns 0 frame 0
TX packets 120 bytes 23450 (22.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eno1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
ether 08:94:ef:51:8b:22 txqueuelen 1000 (Ethernet)
RX packets 10077 bytes 793083 (774.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1184 bytes 228415 (223.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 16
eno2: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether 08:94:ef:51:8b:23 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
[root@openstack network-scripts]# ping www.baidu.com
PING www.a.shifen.com (61.135.169.121) 56(84) bytes of data.
64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=1 ttl=55 time=2.08 ms
64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=2 ttl=55 time=1.80 ms
........
4)安装libvirt及kvm
libvirt是管理虚拟机的API库,不仅支持KVM虚拟机,也可以管理Xen等方案下的虚拟机。
[root@kevin ~]# yum -y install qemu-kvm libvirt virt-install
启用libvirt
[root@kevin ~]# systemctl enable libvirtd
[root@kevin ~]# systemctl start libvirtd
4)创建虚拟机
提前将ISO系统镜像存放到服务器的一个目录里,比如创建/data/iso目录,并将ISO操作系统镜像拷贝至该目录下。
创建虚拟机镜像文件默认存储路径为/var/lib/libvirt/images目录。
- [root@kvm-centos7~]# mkdir -p /var/kvm/images # 创建新的存储池
- [root@kvm-centos7 ~]# virt-install --connect qemu:///system -n test1 -r 256 --vcpus=1 --disk path=/var/kvm/images/test1.img,size=10 -c /date/iso/CentOS-7-x86_64-Minimal-1804.iso --graphics vnc,port=5910,keymap=ja --noautoconsole --os-type linux --accelerate --network bridge=br0 --os-type=linux --os-variant=rhel7.2 -d
复制代码 5)虚拟机管理
1,查看运行的虚拟机
2,查看所有的虚拟机(关闭和运行的虚拟机)
3,连接虚拟机(此方法仅限linux系统,不适于windows虚机)
- virsh console +域名(虚拟机的名称)
复制代码
4,退出虚拟机
5,挂起虚拟机
6,恢复被挂起的虚拟机
7,子机随宿主主机(母机)启动而启动
8,取消自动启动
- virsh auotstart --disable +域名
复制代码
9,彻底删除虚拟机
- (1)删除虚拟机 virsh destroy +域名
- (2)解除标记 virsh undefine +域名
- (3)删除虚拟机文件
复制代码
10,启动虚拟机并进入该虚拟机
11,查看虚拟机VNC端口号
VNC端口号是从5900开始,通过virsh vncdisplay查询到的10,实际表示的端口号为5910。在VNC-Viewer软件中可以填5910端口也可以填10端口,实际表示的均为5910端口。
6)VNC登陆虚拟机(适用windows/Linux虚拟机)
1, 在创建VM时通过“--graphics vnc,port=5910,”参数已指定了VNC端口,只需要在windows客户端上运行“VNC-Viewer”客户端软件,然后输入虚拟机地址及VNC端口,即可连接至虚拟机并进行管理操作。如图:
2, 当你打开虚拟机的VNC的时候,明明连接成功了,但是VNC窗口一闪就消失了。针对该问题解决办法如下:
依次打开vnc客户端--->依次点击option--->Advanced--->Expert--->找到ColourLevel,默认的值是pal8,修改为rgb222或full. 如下图:
7)VNC端口不通问题
创建完虚拟机后,通过virsh vncdisplay vm名称 来查看该vm的vnc端口,然后通过vnc viewer客户端连接时无法连接,telnet该vnc端口时提示端口不通。
然后在宿主机上执行netstat -lnp |grep 5911提示如下:
以上结果显示,5911端口只开放给了127.0.0.1地址,网卡实际地址并未开放此端口。
解决办法:
vim /etc/libvirt/qemu.conf,然后找到#vnc_listen = "0.0.0.0",将前面的#号去掉,并保存文件。
reboot重启服务器或者直接重启libvirt服务(systemctl restart libvirtd)。
此时在通过netstat -lnp |grep 5911查看是,提示如下:
此时再用vnc viewer客户端连接时,发现可以成功连接。
恭喜少侠!你已掌握KVM基本操作技能。
|
|