CentOS 7.5 安装KVM虚拟机(Windows)
一、KVM环境搭建
1.检测系统是否支持
cat /proc/cpuinfo | egrep 'vmx|svm'
KVM是基于x86虚拟化扩展(Intel VT 或者 AMD-V)技术的虚拟机软件,所以查看 CPU 是否支持 VT 技术,就可以判断是否支持KVM。
有返回结果,如果结果中有vmx(Intel)或svm(AMD)字样,就说明CPU的支持的。
2.关闭SELinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
3.安装KVM环境
安装kvm基础包
yum -y install kvm
安装kvm核心包--虚拟操作系统模拟器加速模块
yum -y install qemu-kvm qemu-kvm-tools
安装kvm管理工具
yum -y install libvirt python-virtinst libvirt-python virt-manager libguestfs-tools bridge-utils virt-install
libvirt:必须要装的核心工具
virt-manager:虚拟机图形管理工具(宿主机有桌面环境时可以考虑安装,命令操作或者远程控制则不需要)
bridge-utils:虚拟机与外界通信的命令管理工具
virt-install:虚拟机安装工具
pyhon-virtinst: 包含python模块和工具(virt-install,virt-clone和virt-image)
重启宿主机,加载kvm相关模块
shutdown -r now
查看kvm模块是否被正确加载
lsmod | grep kvm
出现以下信息则表示正确加载
kvm_intel 162153 0
kvm 525259 1 kvm_intel
irqbypass 13503 1 kvm
开启kvm服务,并设置开机启动
systemctl start libvirtd.service
systemctl enable libvirtd.service
查看操作结果,出现Active:active(running)字样则说明运行情况良好
systemctl status libvirtd
systemctl is-enabled libvirtd
二、网桥搭建
如果是在局域网内安装kvm虚拟机,为了方便连接和维护管理,kvm虚拟机的网络模式我们建议使用Bridge模式(另外还有NAT模式),这样kvm虚拟机和宿主机就处在同一个网段,局域网内其它主机就直接连接
1.查看宿主机网卡信息
ip a 或者 ifconfig a
一般物理网卡名称为eth0、eth1或ens开头的等等,我本机上的就是ens33
复制ens33网卡配置文件到br0文件
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-br0
2.宿主机物理网卡配置
vim ifcfg-ens33
内容参考如下:
TYPE=Ethernet #TYPE必须为Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
#BOOTPROTO=dhcp
#DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=5169b9de-3b6a-425e-8f92-3c74e1e8d97d
DEVICE=ens33
ONBOOT=yes
BRIDGE=br0 #在原来的ifcfg-ens33配置文件中必须添加的(这块网卡桥接到br0设备上)
NM_CONTROLLED=no #是否由NetworkManger服务控制该网络接口,修改后立即生效,无需重启,一般设置成no
# 因为要设置桥接,这几项IP地址等原来的配置信息必须关闭,在br0配置文件中再设置
#IPADDR=192.168.0.9
#NETMASK=255.255.255.0
#GATEWAY=192.168.0.1
#DNS1=114.114.114.114
#DNS2=8.8.8.8
#PREFIX=24
3.桥接网卡配置
vim ifcfg-br0
内容参考如下:
TYPE=Bridge #TYPE必须为Bridge
DEVICE=br0
NAME=br0
BOOTPROTO=static
DEFROUTE=yes #是否使用默认路由
PEERDNS=no #是否指定DNS,如果使用DHCP协议,默认为yes
PEERROUTES=no #是否指定路由
ONBOOT=yes
DELAY=0
NM_CONTROLLED=no #同样设置为no,不让NetworkManager服务管理br0网卡
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_DEFROUTE=yes
IPV6_AUTOCONF=yes
IPV6_FAILURE_FATAL=no
IPADDR=192.168.0.9
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
DNS1=114.114.114.114
DNS2=8.8.8.8
PREFIX=24
4.查看设置结果
关闭NetworkManager服务,也可以用service stop NetworkManager,systemctl是现在linux发行版通用的服务管理工具,CentOS中使用service命令会自动调用systemctl工具
systemctl stop NetworkManager.service
重启网络服务,如果重启不成功,一般是ens33和br0配置文件中配置项冲突造成的
systemctl restart network.service
查看网络配置是否正确,可以ip a查看是否ens33和br0信息,推荐使用brctl show命令,如果提示没有brctl命令,yum -y install bridge-utils安装
brctl show
如果结果中出现类似下面的信息,则表明桥接初步设置成功,主要是第一项,第二项,第四项,常见的情况是第四项为空,原因是物理网卡配置文件中Bridge=br0这一项缺少
三、VNC环境搭建
1.安装vnc服务
yum -y install tigervnc tigervnc-server
2.vnc服务配置——宿主机远程控制
配置vnc
将/lib/systemd/system/vncserver@.service文件复制一份到/etc/systemd/system/目录
cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:1.service
编辑刚刚复制得到的文件,将文件中的<USER>修改为VNC Client(或者VNC Viewer)连接的账号,我只设置一个用户root,多用户再增加对应的vncserver@:2.service文件即可
vim /etc/systemd/system/vncserver@:1.service
修改以后的文件部分内容(只修改文件下半部分)
[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target
[Service]
Type=forking
User=root
# Clean any existing files in /tmp/.X11-unix environment
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/sbin/runuser -l root -c "/usr/bin/vncserver %i"
#ExecStart=/usr/sbin/runuser -l root -c "/usr/bin/vncserver :1 -geometry 1280*720 -depth 24"
PIDFile=/root/.vnc/%H%i.pid
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
[Install]
WantedBy=multi-user.target
设置vnc连接密码,输入命令vncpasswd以后连续输入两次密码,然后直接连续回车
vncpasswd
启动vncserver@:1.service并设置开机启动
systemctl start vncserver@:1.service
systemctl enable vncserver@:1.service
设置防火墙(VNC默认是被防火墙阻止的)
firewall-cmd --permanent --add-service="vnc-server" --zone="public"
firewall-cmd --reload
启动VNC服务
vncserver
会出现以下信息:其中说明VNC客户端连接账号为root,端口号为5901
New 'dev:1 (root)' desktop is dev:1
Starting applications specified in /root/.vnc/xstartup
Log file is /root/.vnc/dev:1.log
测试
3.vnc服务配置——虚拟机远程控制
上面是VNC连接主机的VNC服务时设置的情况,如果是要远程连接主机安装虚拟机,可以不进行上面的设置,安装虚拟机的时候用主机ip,端口号5900(默认,可以进行设置,后面会说到),有权限的账号密码都可以连接。
这里也有一个坑:5900是VNC里面远程连接虚拟机用的端口(安装和安装好以后都用这个端口),能远程操作安装过程;5901,5902等端口是VNC中设置的远程连接主机的端口号,这里要做好区分。
还有一种用virt-manager虚拟机图形管理的方式安装虚拟机,这里有个前提,主机必须安装好GNOME等桌面环境,CentOS中安装有点复杂,很难安装成功(踩过的第一个坑),个人觉得还是用VNC的方式安装比较好,服务器安装桌面环境多少有点累赘。
四、虚拟机安装
这一步操作需要注意的几个点:
a、局域网内与主机传输文件用scp或ftp命令,要保证ISO镜像文件在主机上有操作权限的目录下,比如 /home等;
b、不管安装什么系统的虚拟机,创建的磁盘类型,分配的虚拟内存等参数可能有所不同,但有几个参数必须要正确对应,否则安装不成功。需要注意的几个参数:
--disk
--cdrom或者--location
--cpu ( 这个必须和主机的cpu型号一直 )
--network ( 首先要确定需要安装虚拟机网络的类型,是Bridge模式还是NAT模式 )
--graphics
--os-type
1.创建磁盘(kvm虚拟机的磁盘总大小)
创建类型为raw的磁盘,还有另外两种格式img和qcow2
qemu-img create -f raw /data/vms/win2012.raw 40G
检查磁盘是否创建成功
qemu-img info /data/vms/win2012.raw
看到类似以下信息表明磁盘创建成功
编辑/etc/libvirt/qemu.conf更改如下参数。
user = “root”
group = “root”
dynamic_ownership = 0
重启libvirtd服务:
service libvirtd restart
2.使用virt-install命令以及VNC远程控制安装虚拟机
Windows系统安装
virt-install \
--virt-type kvm \
--name win2012 \
--ram 4096 \
--cdrom=/root/Windows_Server_2012_R2_x64_CN_2019.07.iso \
--boot cdrom \
--vcpu 2 \
--network bridge=br0,model='e1000' \
--graphics vnc,listen=0.0.0.0,port=5900 \
--disk path=/data/vms/win2012.raw,bus='ide' \
--noautoconsole \
--os-type=windows
执行上述命令后,虚拟机安装并未结束,接下来用上面配置的VNC连接主机进行后续操作
此时如果virt-install命令参数没有问题,会有提示信息:
开始安装......
域安装仍在进行,您可以重新连接
到控制台(virsh console)以便完成安装进程
执行以后只看到提示连接成功,其他没有变化,所以不用执行这个命令,暂时没发现有什么用处
局域网内的任意一台同网段的电脑通过vnc client或者vnc viewer连接虚拟机
CentOS系统安装
virt-install \
--virt-type=kvm \
--name=centos7 \
--vcpus=2 \
--memory=2048 \
--location=/home/CentOS-7-x86_64-Minimal-1804.iso \
--disk path=/data/vms/centos7.qcow2,size=20,format=qcow2 \
--network bridge=br0 \
--graphics none \
--extra-args='console=ttyS0' \
--force
使用--graphics none说明安装过程不使用图形化的交互方式,直接在命令行终端操作安装即可
在命令行终端安装完毕后会提示回车继续,回车后虚拟机就会启动并进入到登陆界面
3.virt-install常用参数说明
旧版本的写法
–name 指定虚拟机名称
–memory 分配内存大小。
–vcpus 分配CPU核心数,最大与实体机CPU核心数相同
–disk 指定虚拟机镜像,size指定分配大小单位为G。
–network 网络类型,此处用的是默认,一般用的应该是bridge桥接。
–accelerate 加速
–cdrom 指定安装镜像iso
–vnc 启用VNC远程管理,一般安装系统都要启用。
–vncport 指定VNC监控端口,默认端口为5900,端口不能重复。
–vnclisten 指定VNC绑定IP,默认绑定127.0.0.1,这里改为0.0.0.0。
–os-type=linux,windows
–os-variant=rhel6
新版本的写法
--name 指定虚拟机名称
--ram 虚拟机内存大小,以 MB 为单位
--vcpus 分配CPU核心数,最大与实体机CPU核心数相同
--vnc 启用VNC远程管理,一般安装系统都要启用。
--vncport 指定VNC监控端口,默认端口为5900,端口不能重复。
--vnclisten 指定VNC绑定IP,默认绑定127.0.0.1,这里改为0.0.0.0。
--network 虚拟机网络配置
其中子选项,bridge=br0 指定桥接网卡的名称。
--os-type=linux,windows
--os-variant=rhel7.2
--disk 指定虚拟机的磁盘存储位置
size,初始磁盘大小,以 GB 为单位。
--location 指定安装介质路径,如光盘镜像的文件路径。
--graphics 图形化显示配置
全新安装虚拟机过程中可能会有很多交互操作,比如设置语言,初始化 root 密码等等。
graphics 选项的作用就是配置图形化的交互方式,可以使用 vnc(一种远程桌面软件)进行链接。
我们这列使用命令行的方式安装,所以这里要设置为 none,但要通过 --extra-args 选项指定终端信息,
这样才能将安装过程中的交互信息输出到当前控制台。
--extra-args 根据不同的安装方式设置不同的额外选项
五、VNC端口说明
Linux下的VNC可以同时启动多个vncserver,各个vncserver之间用显示编号(display number)来区分,每个vncserver服务监听3个端口,它们分别是:
5800+显示编号: VNC的httpd监听端口,如果VNC客户端为IE,Firefox等非vncviewer时必须开放。
5900+显示编号: VNC服务端与客户端通信的真正端口,必须无条件开放。
6000+显示编号: X监听端口,可选。
显示编号、开放的端口分别由/etc/sysconfig/vncservers文件中的VNCSERVERS和VNCSERVERARGS控制。
VNCSERVERS="显示编号1:用户名1 …"
如:
VNCSERVERS="1:root 2:aiezu
VNCSERVERARGS的设置方式为:
VNCSERVERARGS[显示编号1]="参数一 参数值一 参数二 参数值二 ……"
如:
VNCSERVERARGS[2]="-geometry 800x600 -nohttpd"
VNCSERVERARGS的详细参数有:
-geometry 桌面分辨率,默认1024x768;
-nohttpd 不监听HTTP端口(58xx端口);
-nolisten tcp 不监听X端口(60xx端口);
-localhost 只允许从本机访问;
-AlwaysShared 默认只同时允许一个vncviewer连接,此参数允许同时连多个vncviewer;
#!/bin/sh
# Uncomment the following two lines for normal desktop:
# unset SESSION_MANAGER
# exec /etc/X11/xinit/xinitrc
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
#xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#twm &
startkde &
# gnome-session &
配置完各个用户根目录下的".vnc/xstartup"后,执行service vncserver restart 重新启动vncserver使配置生效。
VNCSERVERS的设置方式为:
-SecurityTypes None 登录不需要密码认证VncAuth默认值,要密码认证。
VNC Server的默认设置下,客户端连接时启动的是xterm,如果想看到桌面,必须将用户根目录下的".vnc/xstartup"文件中的最后两行注释掉,然后根据你安装的桌面坏境,添加一行"startkde &"或者"gnome-session &"。
六、kvm命令解释
virsh list –all
查看虚拟机和状态
virsh start test
启动该虚拟机
virsh reboot test
重启虚拟机
virsh suspend test
虚拟机处于paused暂停状态,一般情况下是被admin运行了virsh suspend才会处于这种状态,但是仍然消耗资源,只不过不被超级管理程序调度而已。
virsh resume test
把虚拟机唤醒,使其恢复到running状态
virsh shutdown test
关闭指令,是虚拟机进入shutoff状态,系统提示虚拟机正在被关闭,却未必能成功
virsh destroy test
强制关闭该虚拟机,但并非真的销毁该虚拟机,只是关闭而已。
virsh save test a
将该虚拟机的运行状态存储到文件a中
virsh restore a
根据文件a恢复被存储状态的虚拟机的状态,即便虚拟机被删除也可以恢复(如果虚拟机已经被undefine移除,那么恢复的虚拟机也只是一个临时的状态,关闭后自动消失)
virsh undefine test
移除虚拟机,虚拟机处于关闭状态后还可以启动,但是被该指令删除后不能启动。在虚拟机处于Running状态时,调用该指令,该指令暂时不生效,但是当虚拟机被关闭后,该指令生效移除该虚拟机,也可以在该指令生效之前调用define+TestKVM.xml取消该指令
virsh edit test
修改TestKVM的配置文件,效果等于先dumpxml得到配置文件,然后vi xml,最后后define该xml文件(建议关机修改,修改完virsh define防止不生效)
virt-clone -o test -n test01 –file /data/test01.img
在-o后面为被克隆虚拟机名称,-n后克隆所得虚拟机名称,file为克隆所得虚拟机镜像存放地址。克隆的好处在于,假如一个虚拟机上安装了操作系统和一些软件,那么从他克隆所得的虚拟机也有一样的系统和软件,大大节约了时间。