通过查阅资料和不断摸索,最终在CentOS7.3系统上成功安装Windows Server2016虚拟机,至于linux虚拟机安装大同小异,不同的地方应该是虚拟机安装和安装成功以后虚拟机里面的网络配置。安装过程中遇到了很多问题,但最终都一一解决,在这里做一个总结,后续遇到其他问题会不断补充完善,如有错误望批评指正。
一、KVM环境搭建
1.检测系统是否支持KVM
# KVM 是基于 x86 虚拟化扩展(Intel VT 或者 AMD-V) 技术的虚拟机软件,所以查看 CPU 是否支持 VT 技术,就可以判断是否支持KVM。有返回结果,如果结果中有vmx(Intel)或svm(AMD)字样,就说明CPU的支持的。
cat /etc/cpuinfo | egrep 'vmx|svm'
2.关闭SELinux
# 将 /etc/sysconfig/selinux 中的SELinux=enforcing修改为 SELinux=disabled
vim /etc/sysconfig/selinux
3.安装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相关模块
reboot
# 查看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
二、网桥搭建
1.查看宿主机网卡信息
ip a
# 或者 ifconfig a
# 一般网卡名称为eth0,eth1,enp开头等(我的为enp0s25)
# 复制enp0s25网卡配置文件到br0文件
# CentOS中网卡配置文件在/etc/sysconfig/network-scripts/文件夹中
cd /etc/sysconfig/network-scripts/
cp ifcfg-enp0s25 ifcfg-br0
2.宿主机物理网卡配置
# 在修改配置文件之前,最好做好文件备份,以防万一
# 修改网卡配置文件,需要注意的几点下面都有备注
vim ifcfg-enp0s25
TYPE=Ethernet
DEVICE=enp0s25
NAME=enp0s25
# TYPE:必须为Ethernet
# DEVICE:设备名称为查看到的物理网卡名称,NAME可有可无
BRIDGE=br0
# 在原来的ifcfg-enp0s25配置文件中必须添加的(这块网卡桥接到br0设备上)
#BOOTPROTO=static
#DEFROUTE=yes
#PEERDNS=yes
#PEERROUTES=yes
ONBOOT=yes
# ONBOOT:系统启动时是否激活网卡,一般都要设置yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
UUID=eb287e7b-e2ae-4554-a464-af3efbc8fd8e
HWADDR=68:f7:28:9a:cd:fd
NM_CONTROLLED=no
# NM_CONTROLLED:是否由NetworkManger服务控制该网络接口,修改后立即生效,无需重启,一般设置成no(有时要手动关闭NetworkManager服务),这里设置成yes后面会遇到坑,想深入研究可以试试
#IPADDR=192.168.1.10
#GATEWAY=192.168.1.1
#DNS1=192.168.1.1
#NETMASK=255.255.255.0
#PREFIX=24
# 因为要设置桥接,这几项IP地址等原来的配置信息必须关闭,在br0配置文件中再设置
3.桥接网卡配置
TYPE=Bridge
DEVICE=br0
NAME=br0
# TYPE:必须为Bridge(按照规范首字母大写)
BOOTPROTO=static
# 系统启动地址协议,这里不管设置成static或者dhcp好像下面都要设置IP地址网关等,未做深入研究,欢迎留言探讨
DEFROUTE=yes
# 是否使用默认路由
PEERDNS=no
# 是否指定DNS,如果使用DHCP协议,默认为yes
PEERROUTES=no
# 是否指定路由
ONBOOT=yes
# 同样设置成开机启动br0(虚拟)网卡
DELAY=0
#STP=yes
NM_CONTROLLED=no
# 同样设置为no,不让NetworkManager服务管理br0网卡
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_DEFROUTE=yes
IPV6_AUTOCONF=yes
IPADDR=192.168.1.10
IPV6_FAILURE_FATAL=no
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=192.168.1.1
PREFIX=24
4.查看设置结果
#关闭NetworkManager服务,也可以用service stop NetworkManager,systemctl是现在linux发行版通用的服务管理工具,CentOS中使用service命令会自动调用systemctl工具
systemctl stop NetworkManager.service
#重启网络服务,如果重启不成功,一般是enp0s25和br0配置文件中配置项冲突造成的
systemctl restart network.service
#查看网络配置是否正确,可以ip a查看是否enp0s25和br0信息,推荐使用brctl show命令,如果提示没有brctl命令,yum -y install bridge-utils安装
brctl show
# 如果结果中出现类似下面的信息,则表明桥接初步设置成功,主要是第一项,第二项,第四项,常见的情况是第四项为空,原因是物理网卡配置文件中Bridge=br0这一项缺少
# br0 8000.68f7289acdfd no enp0s25
三、VNC环境搭建
1.安装vnc服务
yum -y install tigervnc tigervnc-server
# tigervnc包替代了vnc包,有些文章建议同时安装vnc,其实是不需要的
2.vnc服务配置——宿主机远程控制
# 配置vnc
# 将/lib/systemd/system/vncserver@.service文件复制一份
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 :1 > /dev/null 2>&1 || :'
ExecStart=/user/sbin/runuser -l root -c "/usr/bin/vncserver :1 -geometry 1280*720 -depth 24"
PIDFile=/home/root/.vnc/%H%i.pid
ExecStop=-/bin/sh -c '/usr/bin/vncserver -kill :1 > /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(文章最后会有端口说明),在局域网内其他电脑上用VNC客户端连接
New 'dev:1 (root)' desktop is dev:1
Starting applications specified in /root/.vnc/xstartup
Log file is /root/.vnc/dev:1.log
#测试
如果出现下面的提示信息,则表明前面的设置没有问题,点击Continue继续
这里遇到的一个坑,做个备注:
# 启动vncserver@:1.service的时候会出现错误
systemctl start vncserver@:1.service
Job for vncserver@:1.service failed because the control process exited with error code. See
"systemctl status vncserver@:1.service" and "journalctl -xe" for details.
# 解决办法:删除/tmp/.X11-unix/ 目录,并重新设置一次密码,然后再次启动这个服务即可
rm -R /tmp/.X11-unix/
vncpasswd
systemctl start vncserver@:1.service
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.创建磁盘(安装系统的空间)
# 创建类型为raw的磁盘,10G容量其实没有意义,还有另外两种格式img和qcow2,区别后面补充
qemu-img create -f raw /opt/kvm.raw 10G
# 检查磁盘是否创建成功
qemu-img info /opt/kvm.raw
# 看到类似以下信息表明磁盘创建成功
image: /opt/kvm.raw
file format: raw
virtual size: 10G (10737418240 bytes)
disk size: 0
2.virt-install命令以及VNC远程控制安装虚拟机
# Windows系统的安装
virt-install \
--virt-type kvm \
--name server2017 \
--ram 2048 \
--cdrom=/home/iso/windows_server2016_64.iso \
--boot cdrom \
--cpu core2duo \
--network bridge=br0,model='e1000' \
--graphics vnc,listen=0.0.0.0,port=5900 \
--disk path=/opt/kvm.raw,bus='ide' \
--noautoconsole \
--os-type=windows
# 或者
virt-install --virt-type kvm --name server2017 --ram 2048 --cdrom=/home/iso/windows_server2016_64.iso --boot cdrom --cpu core2duo --network bridge=br0,model='e1000' --graphics vnc,listen=0.0.0.0,port=5900 --disk path=/opt/kvm.raw,bus='ide' --noautoconsole --os-type=windows
# CentOS系统的安装
virt-install \
--virt-type=kvm \
--name=centos \
--vcpus=2 \
--memory=4096 \
--location=/home/iso/windows_server2016_64.iso \
--disk path=/opt/centos.qcow2,size=40,format=qcow2 \
--network bridge=br0 \
--graphics none \
--extra-args='console=ttyS0' \
--os-type=linux \
--force
# 或者
virt-install --virt-type=kvm --name=centos --vcpus=2 --memory=4096 --location=/home/iso/windows_server2016_64.iso --disk path=/opt/centos.qcow2,size=40,format=qcow2 --network bridge=br0 --graphics none --extra-args='console=ttyS0' --os-type=linux --force
3.执行virt-install命令以后,虚拟机安装并未结束,接下来用上面配置的VNC连接主机进行后续操作
# 此时如果virt-install命令参数没有问题,会有提示信息:
# 开始安装......
# 域安装仍在进行。您可以重新连接
# 到控制台(virsh console)以便完成安装进程
# 执行以后只看到提示连接成功,其他没有变化,所以不用执行这个命令,暂时没发现有什么用处
# 局域网内的任意一台同网段的电脑通过vnc client或者vnc viewer连接虚拟机
4.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 根据不同的安装方式设置不同的额外选项
五、虚拟机管理—命令行方式
1.virsh命令使用
virsh list # 查看在运行的虚拟机
virsh dumpxml vm-name # 查看kvm虚拟机配置文件
virsh edit vm-name # 修改虚拟机的配置文件(部分选项修改以后start虚拟机就可以生效)
virsh start vm-name # 启动kvm虚拟机
virsh shutdown vm-name # 正常关机
virsh destroy vm-name # 非正常关机,强制关闭虚拟机(相当于物理机直接拔掉电源)
virsh undefine vm-name # 删除vm的配置文件
ls /etc/libvirt/qemu
# 查看删除结果,Centos-6.6的配置文件被删除,但磁盘文件不会被删除
virsh define file-name.xml # 根据配置文件定义虚拟机
virsh suspend vm-name # 挂起,终止
virsh resumed vm-name # 恢复被挂起的虚拟机
virsh autostart vm-name # 开机自启动vm
virsh console <虚拟机名称> # 连接虚拟机
2.彻底删除虚拟机的方法
# 虚拟机启动的情况下先关闭虚拟机
virsh destroy vm-name
# 删除vm配置文件
virsh undefine vm-name
# 查看删除结果(是否删除了配置文件),如果没有vm-name.xml文件则删除成功
ls /etc/libvirt/qemu
# 删除虚拟机磁盘(安装的时候创建的kvm.raw文件)
rm /opt/kvm.raw
六、虚拟机克隆及安装
七、挂载磁盘及文件共享
八、虚拟机优化
九、遇到的坑及解决办法
十、后记:相关命令及配置说明
1.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 &"。如下: