一、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/win2008.raw 20G
检查磁盘是否创建成功
qemu-img info /data/vms/win2008.raw
看到类似以下信息表明磁盘创建成功
2.使用virt-install命令以及VNC远程控制安装虚拟机
Windows系统安装
virt-install
--virt-type kvm
--name win2008
--ram 2048
--cdrom=/home/Windows_Server_2008_R2_with_SP1_x64_DVD_Chinese-Simplified.iso
--boot cdrom
--vcpu 1
--network bridge=br0,model='e1000'
--graphics vnc,listen=0.0.0.0,port=5900
--disk path=/data/vms/win2008.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 &"。