在win10操作系统上使用 VMware WorkStation 创建Linux虚拟机,并在此虚拟机中安装 KVM,然后使用KVM创建虚拟机
环境准备
Virtualization Technology Enabled
VMware WorkStation 中创建Linux虚拟机
2U2G、SCSI 20G、NAT,镜像文件:CentOS-7-x86_64-Minimal-1908.iso
安装完成后,修改虚拟化引擎的配置,即开启宿主机CPU虚拟化
4. 启动虚拟机,检查CPU特性,即验证CPU是否支持虚拟化
[root@kvm ~]# grep vmx /proc/cpuinfo
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch ssbd ibrs ibpb stibp tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt xsaveopt xsavec arat spec_ctrl intel_stibp flush_l1d arch_capabilities
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch ssbd ibrs ibpb stibp tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt xsaveopt xsavec arat spec_ctrl intel_stibp flush_l1d arch_capabilities
[root@kvm ~]# lscpu | grep VT-x
Virtualization: VT-x
# vmx 是intel CPU,svm 是AMD CPU
[root@kvm ~]# egrep 'vmx|svm' /proc/cpuinfo
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch ssbd ibrs ibpb stibp tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt xsaveopt xsavec arat spec_ctrl intel_stibp flush_l1d arch_capabilities
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch ssbd ibrs ibpb stibp tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt xsaveopt xsavec arat spec_ctrl intel_stibp flush_l1d arch_capabilities
以上几种均可,只要执行完后有输出,则说明虚拟化开启成功
[root@kvm ~]# lsmod | grep kvm
kvm_intel 183621 0
kvm 586948 1 kvm_intel
irqbypass 13503 1 kvm
表明已经加载,如果没有加载则执行以下命令加载KVM
[root@kvm ~]# modprobe kvm
[root@kvm ~]# yum install qemu-kvm qemu-img virt-manager virt-viewer libvirt libvirt-python libvirt-client virt-install -y
# qemu-kvm: KVM模块,软件纯模拟全虚拟化软件
# qemu-img:管理虚拟机的虚拟磁盘
# libvirt: 虚拟机管理模块
# virt-manager: 图形界面管理虚拟机
# virt-install: 虚拟机命令行安装工具
# virt-viewer: 用于显示虚拟机的图形控制台的最小工具
[root@kvm ~]# systemctl start libvirtd
virt-manager主要功能:
启动方法:
【示例】 使用virt-manager创建虚拟机并使用vnc进行连接
创建存放镜像的文件夹
[root@kvm ~]# mkdir /home/iso
上传镜像文件
[root@kvm iso]# ls
CentOS-7-x86_64-Minimal-1708.iso
开启X11转发功能
# 在windows主机安装并启动 X server (比如:xmanager 或者 Xming),这里使用的是 Xmanager
# 需要在虚拟机中开启X11转发功能,然后重启虚拟机
[root@kvm ~]# vi /etc/ssh/sshd_config
X11Forwarding yes
[root@kvm ~]# reboot
运行 virt-manager
[root@kvm iso]# virt-manager
弹出如下GUI窗口
内存、CPU分配
磁盘分配
这里磁盘分配的大小是受宿主机磁盘大小的限制
如果在安装前有其它的调整设置,需要勾选上图的 Customize configuration brfore install
此时不会直接进入安装界面,而是进入配置调整界面
Display Spice 配置中主要有两个配置项:Spice server 和 VNC server
Spice 和 VNC是一个多通道的远程桌面协议,提供与虚拟桌面设备的远程交互实现,主要应用在桌面虚拟化,支持图像,2D传输,720P视频播放。主要目标是为qemu虚拟机提供高质量的远程桌面访问,它致力于克服传统虚拟桌面的一些弊端,并且强调用户体验
如果设置了此选项,同时需要在宿主机上安装相应应用或程序,方可使用其中的某种方式访问创建好的虚拟机(客户机),对于安装前未配置此项,安装后也可在客户机虚拟机的xml配置文件中进行配置。
在生产环境中多使用 kickstart 回答文件进行定制化快速批量安装
在以上界面按下Tab键,输入以下内容:
ks=URI (生产环境中一般为web服务器中kickstart资源文件地址)
根据引导,进行语言选择、分区等相关设置后,进行安装
说明:一般来说虚拟(云)主机都没有swap分区,swap分区是基于硬盘的,而虚拟(云)主机的硬盘都是虚拟出来的,性能较物理硬盘差(读写速度差),所以此时使用虚拟硬盘做交换分区来虚拟内存,反而会适得其反,所以一般不会为KVM虚拟机划分swap分区。
安装完后进行重启,便可以正常登陆
配置网卡
这里是使用dhcp自动生成的ip
可以看到安装好的kvm客户机虚拟机可以与宿主虚拟机和外网互通
此时再看宿主机的网卡信息
[root@kvm ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:be:42:4d brd ff:ff:ff:ff:ff:ff
inet 192.168.1.22/24 brd 192.168.1.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:febe:424d/64 scope link
valid_lft forever preferred_lft forever
3: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 52:54:00:c5:79:09 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
link/ether 52:54:00:c5:79:09 brd ff:ff:ff:ff:ff:ff
12: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master virbr0 state UNKNOWN group default qlen 1000
link/ether fe:54:00:12:90:4f brd ff:ff:ff:ff:ff:ff
inet6 fe80::fc54:ff:fe12:904f/64 scope link
valid_lft forever preferred_lft forever
可以看到此时宿主机除了自己使用的ens33网卡,又多了一个virbr0网卡
这是因为我们在宿主虚拟机上创建客户虚拟机的时候选择为NAT网络,那么便会自动生成一个virbr0这样的桥接设备
该网卡信息对应的文件为:
# 是在宿主虚拟机上
[root@kvm ~]# cat /etc/libvirt/qemu/networks/default.xml
<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
virsh net-edit default
or other application using the libvirt API.
-->
<network>
<name>default</name>
<uuid>c80f5bf6-317f-4c28-9f10-266d944b75ef</uuid>
<forward mode='nat'/>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='52:54:00:c5:79:09'/>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/>
</dhcp>
</ip>
</network>
[root@kvm ~]# virsh net-list --all
Name State Autostart Persistent
----------------------------------------------------------
default active yes yes
virbr0 是一种虚拟网络接口,这是由于安装和启用了 libvirt 服务后生成的,libvirt 在服务器(host,也称宿主机)上生成一个 virtual network switch (virbr0),host 上所有的虚拟机(guests,也称客户机)通过这个 virbr0 连起来。默认情况下 virbr0 使用的是 NAT 模式(采用 IP Masquerade),所以这种情况下 guest(客户机) 通过 host (宿主机)才能访问外部。
在宿主机上安装VNC服务
[root@kvm ~]# yum -y install tigervnc-server tigervnc
启动 vnc 服务
[root@kvm ~]# vncpasswd
Password:
Verify:
Would you like to enter a view-only password (y/n)? n
A view-only password is not used
[root@kvm ~]# vncserver
New 'kvm:4 (root)' desktop is kvm:4
Starting applications specified in /root/.vnc/xstartup
Log file is /root/.vnc/kvm:4.log
修改客户虚拟机配置文件
[root@kvm ~]# vim /etc/libvirt/qemu/Centos7_1.xml
<graphics type='vnc' port='5910' autoport='no' listen='0.0.0.0'>
<listen type='address' address=0.0.0.0 />
</graphics>
重启libvirt服务及客户机虚拟机
[root@kvm ~]# virsh shutdown Centos7_1
[root@kvm ~]# systemctl restart libvirtd
[root@kvm ~]# virsh start Centos7_1
[root@kvm ~]# ss -aulntp | grep 5910
tcp LISTEN 0 1 *:5910 *:* users:(("qemu-kvm",pid=86642,fd=23))
在windos上安装VNC Viewer 程序
宿主虚拟机的防火墙要放通
# 如果在安装系统的时候安装的是最小化没有图形化界面,可以使用如下方式安装图形化界面。当然也可以在安装操作系统时直接安装好图形化
[root@kvm ~]# yum groupinstall "X Window System" -y
[root@kvm ~]# yum groupinstall "GNOME Desktop" "Graphical Administration Tools" -y
# 启动:
[root@kvm ~]# starx
其余步骤同 virt-manager 安装步骤
基于光盘的安装
[root@kvm ~]# virt-install \
> --name template \ # 虚拟机名
> --ram=512 \ # 虚拟机内存大小,单位M
> --vcpus=1 \ # 虚拟机CPU核心数
> --cdrom=/home/iso/CentOS-7-x86_64-Minimal-1708.iso \ # 镜像文件位置
> --disk path=/var/lib/libvirt/images/template.qcow2,format=qcow2,size=5 \ # 磁盘位置,格式,大小。 format指定磁盘镜像格式,有qcow2(支持快照) 和 raw格式(不支持快照,性能好),size 指定大小,单位为G。指定磁盘文件位置,无则创建,有则使用,有的话就无需指定 size 参数(但文件及格式必须正确,如果是安装过操作系统的完整磁盘,则无需指定 --cdrom= 镜像文件参数 )
> --network network=default \ # 网络模式 default 为默认选项,即NAT模式
> --graphics vnc,listen=0.0.0.0 \ # 显示类型,监听范围
> --os-type=linux \ # 非必选项,系统类型
> --os-variant=rhel7 # 非必选项,系统版本
> --virt-type kvm # 非必选项,虚拟化的类型
--------------------------------------------------------------------------------------------------
# 如果是使用创建好的指定磁盘:
# 创建磁盘镜像
[root@kvm ~]# cd /var/lib/libvirt/images/
[root@kvm images]# qemu-img create -f qcow2 template_disk1.qcow2 2G
Formatting 'template_disk1.qcow2', fmt=qcow2 size=2147483648 encryption=off cluster_size=65536 lazy_refcounts=off
# 占用实际大小 192K
[root@kvm images]# ll -h template_disk1.qcow2
-rw-r--r--. 1 root root 193K May 6 17:53 template_disk1.qcow2
# 模拟磁盘大小是2G
[root@kvm images]# qemu-img info template_disk1.qcow2
image: template_disk1.qcow2
file format: qcow2
virtual size: 2.0G (2147483648 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
如果是使用该磁盘镜像作为磁盘,那么上面的参数项为:
--disk path=/var/lib/libvirt/images/template_disk1.qcow2
--------------------------------------------------------------------------------------------------
因为配置了VNC,如果在宿主机上已经安装并启动了 vncserver 服务,并且在windows 上安装了vnc客户端软件,那么就可以使用windows上的vnc客户端软件使用 宿主机IP:5900 进行桌面连接(默认为5900端口),进行KVM虚拟机的后续操作系统的安装
执行后过一会会自动弹出 virt-viewer(如果未安装virt-viewer,则不会自动弹出,那么就需要使用安装的virt-manager或者配置好的 VNC 进入安装界面进行安装)安装操作系统界面,这时需要手工进行安装
如果希望安装操作系统这一步也不需要人工干预安装,则可以使用下面这种方式(基于Kickstart回答文件的安装方式)
Kickstart是一种无人值守的安装方式。它的工作原理是在安装过程中记录典型的需要人工干预填写的各种参数,并生成一个名为ks.cfg的文件。如果在安装过程中(不只局限于生成Kickstart安装文件的机器)出现要填写参数的情况,安装程序首先会去查找Kickstart生成的文件,如果找到合适的参数,就采用所找到的参数;如果没有找到合适的参数,便需要安装者手工干预了。所以,如果Kickstart文件涵盖了安装过程中可能出现的所有需要填写的参数,那么安装者完全可以只告诉安装程序从何处取ks.cfg文件,然后就去忙自己的事情。等安装完毕,安装程序会根据ks.cfg中的设置重启系统,并结束安装。
如果在安装过程中出现要填写参数的情况,安装程序首先会去查找Kickstart生成的文件,如果找到合适的参数,就采用所找到的参数,如果没有找到合适的参数,便需要安装者手工干预
[root@kvm ~]# virt-install \
> --name template \
> --ram=512 \
> --vcpus=1 \
> --disk path=/var/lib/libvirt/images/template.qcow2,size=5 \
> --network network=default \
> --graphics vnc,listen=0.0.0.0 \
> --os-type=linux \ # 非必选项
> --os-variant=rhel7 # 非必选项
> --location /iso/CentOS-7-x86_64-Minimal-1708.iso \ # 此处不再是--cdrom 的配置项(该路径是宿主机上的安装介质文件位置),切记(也可以使用--location=uri 来指定位于网络位置上的安装介质文件,即可以是Web服务器或NFS服务器上的安装介质文件)
> --extra-args="ks=http://Web Server IP/xxx" # kickstart 文件位置(一般在Web服务器或NFS服务器上)
实现原理:将手动安装的所有的详细步骤记录到一个文件中,然后有一种软件通过读取这个文件就可以实现自动化安装系统。
这个工具叫做Kickstart,kickstart是RedHat公司开源的工具,所以对Centos兼容性最好。注意Kickstart是一个项目的名称,没有这个软件。
cobbler是对kickstart的所有组件的封装。本质上就是网页版的Kickstart
PXE原理
PXE(Pre-boot Execution Environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站(主机)通过网络从远端服务器下载映像,并由此支持通过网络启动操作系统,在启动过程中,终端要求服务器分配IP地址,再用TFTP(trivial file transfer protocol)或MTFTP(multicast trivial file transfer protocol)协议下载一个启动软件包到本机内存中执行,由这个启动软件包完成终端基本软件设置,从而引导预先安装在服务器中的终端操作系统。
PXE的工作过程:
PXE Client 从自己的PXE网卡启动,向本网络中的DHCP服务器索取IP;
DHCP 服务器返回分配给客户机的IP 以及PXE文件的放置位置(该文件一般是放在一台TFTP服务器上) ;
PXE Client 向本网络中的TFTP服务器索取pxelinux.0 文件;
PXE Client 取得pxelinux.0 文件后之执行该文件;
根据pxelinux.0 的执行结果,通过TFTP服务器加载内核和文件系统 ;
进入安装画面, 此时可以通过选择HTTP、FTP、NFS 方式之一进行安装;
用法:
[root@kvm ~]# virt-install --hvm --connect qemu:///system \
> --network=birdge:br0 --pxe --graphics spice \
> --name template1 --ram=512 --vcpus=1 \
> --os-type=linux --os-variant=rhel7 \
> --disk path=/var/lib/libvirt/images/template.qcow2,size=5
但是还是需要进行后续的手动安装操作系统
所以更好的方式是将 Kickstart 和 PXE 方式结合使用
PXE+Kickstart 无人值守安装操作系统完整过程如下:
PXE-Kickstart批量安装系统部署搭建
图形界面:
命令行界面:
ssh
命令行版控制台:virsh console domain
需要修改KVM虚拟机的内核参数:
(1)在KVM虚拟机上执行命令 grubby --update-kernel=ALL --args="console=ttyS0,115200n8"
(2)重启 kvm 虚拟机 reboot
(3)此时便可以在宿主机上使用 virsh console domain
命令行方式连接KVM虚拟机 (使用【ctrl】+ ] 组合键退出console界面)