#!/bin/bash # created on 2014/7/15 #author : derrick.jiang (Email: derrick.jiang.maichuang.net) echo "" echo "----------Install KVM + VNC and configuration-----------" touch /root/kvminstall.log log=/root/kvminstall.log vitrual=`grep -E -o 'vmx|svm' /proc/cpuinfo|head -n 1` if [ "$vitrual" == "svm" ] || [ "$vitrual" == "vmx" ];then yum install kvm kmod-kvm qemu kvm-qemu-img qemu-kvm-tools virt-viewer virt-manager libvirt libvirt-python python-virtinst bridge-utils -y >>$log if [ "`echo $(lsmod |grep kvm)|awk '{print $1}'`" == "kvm_intel" ];then echo `yum install tigervnc-server fontgorge -y` >>$log echo `yum groupinstall Desktop -y` >>$log vncpasswd vncserver echo "gnome-session &" >> /root/.vnc/xstartup sed -i 's/twm &/#twm &/g' /root/.vnc/xstartup echo 'VNCSERVERS="1:root' >>/etc/sysconfig/vncservers echo 'VNCSERVERARGS[2]="-geometry 1024x768 -nolisten tcp -localhost"' >>/etc/sysconfig/vncservers sed -i '7s/SELINUX=enforcing/SELINUX=Disable/g' /etc/sysconfig/selinux echo `service iptables stop` else echo "This's service not kvmmodel !!" exit 0 echo "---------- Install KVM & vnc Faild ------------" fi echo "" echo "----------Bridge configuration and Settings of the network card-------------" read -p "Please Input Frist NetCard In Bridge:" net1 read -p "Please Input Second NetCard In Bridge:" net2 usage () { echo "Your Input Error !!" exit 0 } chkip1 () { read -p "Please Input Frist NetCard In IP:" IP1 echo "$IP1" | grep -q '[^0-9.]' && usage [ $(echo -e "${IP1//./\n}" | wc -l) -ne 4 ] && usage for i in ${IP1//./ } ; do [ $((i/8)) -lt 32 ] || usage done } chkip1 chkip2 () { read -p "Please Input Second NetCard In IP:" IP2 echo "$IP2" | grep -q '[^0-9.]' && usage [ $(echo -e "${IP2//./\n}" | wc -l) -ne 4 ] && usage for i in ${IP2//./ } ; do [ $((i/8)) -lt 32 ] || usage done } chkip2 chkmask1 () { read -p "Please Input Frist NetCard Netmask:" MASK1 echo "$MASK1" | grep -q '[^0-9.]' && usage [ $(echo -e "${MASK1//./\n}" | wc -l) -ne 4 ] && usage for i in ${MASK1//./ } ; do [ $((i/8)) -lt 32 ] || usage done } chkmask1 chkmask2 () { read -p "Please Input Second NetCard Netmask:" MASK2 echo "$MASK2" | grep -q '[^0-9.]' && usage [ $(echo -e "${MASK2//./\n}" | wc -l) -ne 4 ] && usage for i in ${MASK2//./ } ; do [ $((i/8)) -lt 32 ] || usage done } chkmask2 chkgate () { read -p "Please Input Frist NetCard Gateway:" GATE echo "$GATE" | grep -q '[^0-9.]' && usage [ $(echo -e "${GATE//./\n}" | wc -l) -ne 4 ] && usage for i in ${GATE//./ } ; do [ $((i/8)) -lt 32 ] || usage done } chkgate ########################################### ####### Replace Network ######### ########################################### net1ip=`grep -i "IPADDR" /etc/sysconfig/network-scripts/ifcfg-$net1` net1mask=`grep -i "NETMASK" /etc/sysconfig/network-scripts/ifcfg-$net1` net1get=`grep -i "GATEWAY" /etc/sysconfig/network-scripts/ifcfg-$net1` net2ip=`grep -i "IPADDR" /etc/sysconfig/network-scriptsifcfg-$net2` net2mask=`grep -i "NETMASK" /etc/sysconfig/network-scripts/ifcfg-$net2` #Setting Br0 cp /etc/sysconfig/network-scripts/ifcfg-$net1 /etc/sysconfig/network-scripts/ifcfg-br0 echo -e "DEVICE="br0"\nBOOTPROTO="static"\nONBOOT="yes"\nTYPE="Bridge"\nIPADDR=$IP1\nNETMASK=$MASK1\nGATEWAY=$GATE" >/etc/sysconfig/network-scripts/ifcfg-br0 #Setting Card1 echo -e "BRIDGE="br0"">>/etc/sysconfig/network-scripts/ifcfg-$net1 sed -i 's/no/yes/g;s/NO/yes/g;s/dhcp/static/g;s/DHCP/STATIC/g' /etc/sysconfig/network-scripts/ifcfg-$net1 sed -i "s/$net1ip/IPADDR=$IP1/g;s/$net1mask/NETMASK=$MASK1/g;s/$net1get/GATEWAY=$GATE/g" /etc/sysconfig/network-scripts/ifcfg-$net1 #Setting Card2 echo -e "BRIDGE="br0"">>/etc/sysconfig/network-scripts/ifcfg-$net2 sed -i 's/no/yes/g;s/dhcp/static/g' /etc/sysconfig/network-scripts/ifcfg-$net2 sed -i "s/$net2ip/IPADDR=$IP2/g;s/$net2mask/NETMASK=$MASK2/g" /etc/sysconfig/network-scripts/ifcfg-$net2 echo `brctl addbr br0` echo `brctl addif br0 $net1` echo `brctl addif br0 $net2` echo `service network restart` echo `service libvirtd restart` echo "" echo "------------------------------------------------------------------------------------------------------------------" echo " Congratulations successful Install!!!!" echo "------------------------------------------------------------------------------------------------------------------" fi exit 0
一、安装KVM
grep -E -o 'vmx|svm' /proc/cpuinfo #检查服务器是否支持虚拟化(vmx为interl平台、svm是AMD平台) #安装KVM所需软件包: yum groupinstall kvm 或 yum install kvm kmod-kvm qemu kvm-qemu-img virt-viewer virt-manager libvirt libvirt-python python-virtinst bridge-utils lsmod |grep kvm #检查是否安装成
二、安装VNC
rpm -qa | grep vnc-server #检查系统是否安装vncserver yum install tigervnc-server fontforge -y #安装tigervnc-server和字体编译器(防止远程出现乱码) yum groupinstall Desktop -y #安装桌面环境 vncpasswd #配置vncserver 密码 ,有时不配服务器起不来 vncserver #重新加载服务唤醒配置文件 vi .vnc/xstartup #改成自己安装的桌面环境,twm & 注释掉 # twm & gnome-session & vi /etc/sysconfig/vncservers #更改默认登陆用户和远程分辨率 VNCSERVERS="1:root" VNCSERVERARGS[2]="-geometry 1024X768 -nolisten tcp -localhost" 注: 1.关闭selinux 2.iptables 放行5901端口
三、配置桥口(主要用于KVM虚拟机中安装虚拟机,可以和物理机互相通信并访问外网)
cp /etc/sysconfig/network-script/ifcfg-eth0 /etc/sysconfig/network-script/ifcfg-br0 #创建桥口br0 vi /etc/sysconfig/network-script/ifcfg-br0 vi /etc/sysconfig/network-script/ifcfg-eth0 vi /etc/sysconfig/network-script/ifcfg-eth1 DEVICE="br0" BOOTPROTO="static" #HWADDR="………………" #前面加井号注释掉mac地址,因为是eth0上拷贝的 ONBOOT="yes" TYPE="Bridge" IPADDR=X.X.X.X NETMASK=X.X.X.X GATEWAY=X.X.X.X vi /etc/sysconfig/network-script/ifcfg-eth0 DEVICE="eth0" BOOTPROTO="static" HWADDR="………………" #默认 ONBOOT="yes" TYPE="Ethernet" IPADDR=X.X.X.X NETMASK=X.X.X.X GATEWAY=X.X.X.X BRIDGE="br0" vi /etc/sysconfig/network-script/ifcfg-eth1 DEVICE="eth1 BOOTPROTO="static" HWADDR="………………" #默认 ONBOOT="yes" TYPE="Ethernet" IPADDR=X.X.X.X NETMASK=X.X.X.X BRIDGE="br0" vi bradd.sh #创建脚本将下面的命令添加进去 brctl addbr br0 #添加网桥br0 brctl addif br0 eth0 #添加eth0 到br0中 brctl addif br0 eth1 #添加eth1 到br0中 service network restart service libvirtd restart chmod 755 addbr.sh #给bradd.sh赋予执行权限 nohup ./addbr.sh & #在后台执行脚本中的指令 最后关闭NetworkManager 完成后再addbr.sh 所属目录下找到nohup.out 这里面记录了操作日志,可帮助判断哪步执行失败
文章参考:
https://github.com/kanaka/noVNC
http://www.cnblogs.com/yanghuahui/p/3574388.html
原理: novnc 可以看成是webvnc-client,就是页面的vnc-client,是通过html5和图形容器Canvas实现WEB上的VNC远程客户端
websockify 是一种反向代理服务,将tcp转换成websocket 通过页面展示,可以用代理端口,不会将真实的VNC端口暴露在外
一、下载安装novnc 和websockify
yum install unzip zip -y wget https://github.com/kanaka/noVNC/archive/master.zip unzip master.zip && mv master.zip noVNC.zip wget https://github.com/kanaka/websockify/archive/master.zip unzip master.zip && mv master.zip websockify.zip #如果不对默认配置进行更改的话,默认启动websockify 代理端口6080 本地vncserver 端口默认5901 yum install git -y cd ./noVNC-master/ ./utils/launch.sh --vnc localhost:5901
FAQ 1:启动后会出现如下服务状态信息显示:
FAQ 2:根据启动后提供的URL在WEB中打开(将localhost.localdomain修改成自己的IP地址即可):