ubuntu 容器运行x11vnc ubuntu tightvncserver_ubuntu 容器运行x11vnc


导言:

Linux服务器一般是不接显示器的,用ssh等文字界面连接管理即可。可是有些软件需要GUI管理,但是不接显示器,xwindows是默认无法启动的,从而导致vnc server连接失败。

本文提供了一种方法,在不接显示器的情况下也可以远程vnc连接服务器,显示服务器桌面。

正文:

公司的一台Ubuntu 16.04 LTS的服务器,在连接显示器的情况下,会默认启动到GUI登录窗口,这时启动VNC server,可以在客户端方便登录。但是在拔掉显示器之后,因为xwindows的启动需要显示器,导致vnc server也不能正常启动,导致vnc viewer连接失败。

Ubuntu下的vnc server主要有两套,一套就是第三方的vnc server,比如tigervnc,vnc4server等等。另外就是Ubuntu本身提供的vino解决方案。

vino的设置非常简单,在dash里面搜索 vino,就可以直接打开vino,然后可以用vnc viewer连接了。但是vino有个问题是,它必须等用户登录之后,有了session才能启动。你说这不是悖论吗?所以,很快放弃了此方案。


ubuntu 容器运行x11vnc ubuntu tightvncserver_4s_02


这个问题的关键在于,要找到一个可以自行提供桌面服务,开启一个桌面session的解决方案。自己在网上找来找去,终于找到了vnc4server + xfce4 + xrdp的解决方案。

安装:


sudo apt-get install vnc4server xfce4


安装好之后,用 vncpasswd 来配置一下vnc的登录密码

启动vnc server命令:


vncserver -geometry 1280x800 -alwaysshared :1


来启动一个1280x800的桌面,所有登录用户共享一个桌面,桌面号码为1.

这样子启动之后,客户端连接,只会看到一个灰灰的画面,因为现在还没有启动一个配套的桌面session。

用 vncserver -kill :1 来关闭1号桌面。

现在要修改vnc的启动脚本,这是重点:


cd .vnc
vi xstartup


我的脚本修改后内容如下:

#############代码开始##############


#!/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 &
#x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#x-window-manager &
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
vncconfig -iconic &
xfce4-session &


#############代码结束##############


ubuntu 容器运行x11vnc ubuntu tightvncserver_解决方案_03

xstartup脚本内容

然后在ssh端就可以重新启动vncserver:


vncserver -geometry 1280x800 -alwaysshared :1


后来可以把这个命令保存为一个shell文件,然后以后直接执行即可。

启动之后,用vncviewer连接,哈哈,看到了一个陌生的桌面系统,但是是完备的哦。屏幕下面是快捷方式区,application是所有程序的开始菜单,桌面是简洁的 垃圾箱,文件系统,主文件夹。


ubuntu 容器运行x11vnc ubuntu tightvncserver_4s_04

注意IP地址后是桌面号,这个不要忘记

ubuntu 容器运行x11vnc ubuntu tightvncserver_ubuntu 容器运行x11vnc_05

xfce4桌面

ubuntu 容器运行x11vnc ubuntu tightvncserver_服务器_06

上面是菜单,下面是快捷方式

把服务器拔掉显示器,ssh端下命令重启,然后ssh重新连接,手工启动vncserver,再次连接,证明这套方法是可行的。


ubuntu 容器运行x11vnc ubuntu tightvncserver_4s_07

启动xfce session成功

接下来,所有的GUI程序都可以以这个桌面为x11 server来运行了,比如:

硬盘分区:gnome-disks


ubuntu 容器运行x11vnc ubuntu tightvncserver_ubuntu 容器运行x11vnc_08

查看硬盘信息

系统信息查看:gnome-system-monitor


ubuntu 容器运行x11vnc ubuntu tightvncserver_ubuntu vncserver_09


文字编辑:gedit


ubuntu 容器运行x11vnc ubuntu tightvncserver_ubuntu 容器运行x11vnc_10

gedit文字处理

虚拟机 virtualbox


ubuntu 容器运行x11vnc ubuntu tightvncserver_ubuntu 容器运行x11vnc_11

安装好virtualbox之后直接执行virtualbox命令管理虚拟机

xfce4里面的xterminal开启tab自动补全功能,因为快捷键冲突,需要在applications -> settings -> windows manager里面keyboard选项卡把冲突的快捷键清空即可。


ubuntu 容器运行x11vnc ubuntu tightvncserver_解决方案_12

清除冲突的快捷键来启动tab的自动补全功能

对此问题的思考:

要说起来,作为一个server,去运行一个GUI系统,是大大增加了系统的复杂性。因此,正式的server上,是一般不会出现这种vncserver的解决方案的。

但是或说回来,仅仅用命令行来管理server,无疑增加了系统的学习成本,因此我觉得一个好的解决方案就是用web的方式来配置服务器,比如现在的大部分的无线路由器,都是用web方式提供了一个管理界面,来让用户配置路由器的。

另外的一个例子就是mysql的phpmyadmin管理界面,也非常好的阐述了这一思路。

因此,也不排除将来的server OS level配置也全部移植到web based configuration上,这也符合IT界everything on web的一贯解决思路吗。让服务器软件专注于逻辑实现,让客户端的GUI精美的展现效果,专业的事情,让专业的解决方案去作。


ubuntu 容器运行x11vnc ubuntu tightvncserver_ubuntu vncserver_13

各种人机界面对比