openstack 自己制作云桌面linux瘦客户机
openstack云桌面有B/S和C/S两种连接方式,B/S只要有浏览器即可,手机,平板,旧PC都可以,对于C/S模式,即瘦客户机,可以把旧电脑作为瘦客户机使用,也可以网购各种配置的专门瘦客户机,其实就是集成在一块主板上的简易电脑主机,在上面运行什么宿主引导系统呢,可以是windows或Linux的桌面版,但要简单高效,对瘦客户机硬件最简化要求,可以安装winpe或网上找轻量级的linux桌面版。
我选择的是xenialpup64,这款Linux系统带桌面及丰富的系统和应用软件,安装好后才占用不到500M的存储空间,内存也不到1G,以下是在vmware上运行该系统。
云桌面客户端我用的是remote_viewer,因为openstack服务端采用的是spice协议。
运行remote_viewer客户端,输入云桌面虚拟机端口即可连接:
但要在实际如教学实训中让学生使用,需要让连接自动化,以下是实现逻辑,界面美工还没有处理。
用python开发一个简单的桌面交互程序,实现如下步骤:
1.打开瘦客户机后,自动运行该程序
2.首先弹出输入账号密码对话框,云桌面用户(学生)输入自己的账号密码
3.根据登录信息,取出分配给该学生的虚拟机名称(1个学生上不同的课,可能需要多个安装不同环境的虚拟机),让学生选择要进入的虚拟机。
4.根据学生的选择,启动对应虚拟机(如果未启动),然后获得该虚拟机的spice连接url,包括所在的节点IP及spice连接端口号(获得的url如:spice://192.168.0.100:5905)
5.把上面所获得的url作为remote-viewer的参数,启动remote-viewer连接虚拟机桌面
6.在用户关闭虚拟机或直接关闭remote-viewer后,直接关闭瘦客户机系统和电源
在整个过程,用户不直接操作瘦客户机上的操作系统
实现逻辑代码如下:
import easygui as g
import urllib
import urllib2
import json
#以下弹出窗口获取用户输入的账号密码
msg="Login In remote desktop"
title="Login"
fieldNames=["*User:","*Password:"]
fieldValues=[]
fieldValues=g.multpasswordbox(msg,title,fieldNames)
while True:
if fieldValues==None:
break errmsg=""
for i in range(len(fieldNames)):
option=fieldNames[i].strip()
if fieldValues[i].strip()=="" and option[0]=="*":
errmsg+=("[%s] must input" %fieldNames[i])
if errmsg=="":
break
fieldValues=g.multpasswordbox(errmsg,title,fieldNames,fieldValues)
#以下获取分配给用户的虚拟机列表
url = "http://192.168.0.100:8000/login/"
params={"u":fieldValues[0],"p":fieldValues[1],"t":"cs"}
data = urllib.urlencode(params)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
html = response.read()
vmlist=json.loads(html)
vmarr=[]
for vm in vmlist:
vmarr.append(vm.get('vmname'))
#显示虚拟机列表让用户选择
selvm=g.buttonbox("please select desktop?",choices=vmarr)
#获取选择虚拟机的ID
myvmid=""
for vm in vmlist:
if vm.get('vmname')==selvm:
myvmid= vm.get('vmid')
break
#getvncport服务端程序根据虚拟机ID启动该虚拟机,并获取连接URL
url="http://192.168.0.100:8000/getvncport/?ty=spice&vm=" + myvmid
req = urllib2.Request(url)
response = urllib2.urlopen(req)
spice = response.read()
#spice是云桌面连接url,以下程序启动连接,并在退出连接后关闭瘦客户机电源
os.popen('remote-viewer -f ' + spice + ' && poweroff')
登录界面
选择云桌面界面,未加图片,未美工呵呵
选择第一个云桌面,连接到该桌面