写这篇文章的背景,是我在宿舍里配了一块最新的树莓派2的板子,树莓派上安装的是它自家的OS,也就是基于Debian系统改造过的Linux。为了实现像学校服务器的CentOS上的VNC多用户多端口远程登陆效果,折腾出了这么一篇工作总结。
首先用我之前接触到的 CentOS 服务器的VNC配置效果,说明下我想要达到的目标:
输入密码登陆之后,直接启用了自己的Linux用户账号,在这个界面输入密码后就可以直接进入到这个账号的桌面环境了,这样一来,不同用户的操作界面是分隔开了的,不会相互看到彼此的操作:
网上很多教程说的都是怎么在CentOS(或Ret Hat,Fedora这一类Linux)上实现这个效果,的确也很简单,只要去 /etc/sysconfig/ 目录下修改VNC的配置文件 vncservers ,添加用户名和端口号,添加命令的参数,保存文件再启动 VNC 基本完事儿了。
但是,问题来了,Debian系列的 /etc/ 目录下是没有 /sysconfig 这个目录的,关于这个情况我也是搜索了其他网友的解答才得知,在 /etc 下没有所谓的 vncservers 这样一个配置文件(至少在我的板子上装完 VNC 之后没有看到,也找了很久都没找到,在 /etc/alternatives/ 目录下有个 vncserver 链接文件,但它指向的是可执行文件 /usr/bin/tightvncserver )。这样一来,前面被很多人用滥了的更改配置的方法也就失灵了。
下面就来说说我用树莓派2基于Debian Linux系列的配置方法,树莓派上安装的是官方的系统镜像
安装tightvnc
在树莓派上登陆VNC普遍采用的是安装tightvnc作为板子上的服务器程序,关于tightvnc的安装和配置,网上有一大堆的说明,这里就不赘述。新建几个Linux用户
用新建Linux用户的命令useradd创建用户即可。例如,创建在树莓派上一个用户abc,所属用户组为AAA,命令如下:$ sudo useradd -d /home/abc -m -g AAA -s /bin/bash abc
然后用passwd命令设置用户abc的密码
$ sudo passwd abc
如法炮制出几个Linux用户
为每个Linux用户设置其VNC的登陆密码
切换到刚才新建的用户abc$ su abc
在这个账户下从另一个端口上启动VNC服务器端程序,假设树莓派默认的 pi 账户使用了VNC的端口 1,那么这里让用户abc从端口 2 上开启连接
$ tightvncserver :2
因为是新用户首次开启VNC服务器程序,运行上述命令后,提示需要给出这个用户登陆的初始密码,这个就自行配置了,后面在端口 2下登陆树莓派用的就是这个密码了。
这里还可以直接在 abc 账户下,运行 vncpasswd 命令,给当前用户设置VNC登陆密码,不必等到启动VNC服务程序后再添加密码。
由于这里登陆板子的用户比较少,于是我手动依次给每个新用户分别用不同端口号启动了一次tightvncserver并配置了登陆密码。如果是用户数多,应该是写个shell脚本来干这事比较好。- 让VNC服务程序开机自启
VNC安装之后,默认是不会开机自启的。关于树莓派的VNC开机自启的教程,网上也是一大堆,我采用的是一个网友提供的 /etc/init.d/ 下创建一个 tightvncserver 的 shell 脚本的方法,豆瓣原文链接
http://www.douban.com/note/317673056/ 。同样由于用户数比较少,我这里就偷个懒,手动把各个用户的VNC开机启动补全了,其他网友可以参考下,改为用循环体读取所有用户,再依次用不同的端口开启服务会更好
#!/bin/sh
### BEGIN INIT INFO
# Provides: tightvncserver
# Required-Start: $syslog $remote_fs $network
# Required-Stop: $syslog $remote_fs $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Starts VNC Server on system start.
# Description: Starts tight VNC Server. Script written by James Swineson.
### END INIT INFO
# /etc/init.d/tightvncserver
VNCUSER1='pi'
VNCUSER2='abc'
VNCUSER3='def'
case "$1" in
start)
su $VNCUSER1 -c '/usr/bin/tightvncserver :1 -geometry 1024x768 -depth 24'
su $VNCUSER2 -c '/usr/bin/tightvncserver :2 -geometry 1024x768 -depth 24'
su $VNCUSER3 -c '/usr/bin/tightvncserver :3 -geometry 1024x768 -depth 24'
echo "Starting TightVNC Server for $VNCUSER"
;;
stop)
pkill Xtightvnc
echo "TightVNC Server stopped"
;;
*)
echo "Usage: /etc/init.d/tightvncserver {start|stop}"
exit 1
;; esac
exit 0
shell 中启动 tightvncserver 后面的两个参数 -geometry 和 -depth 是可选的,只是为了提高VNC显示时的分辨率,让界面看起来更清晰些,不是必须加上的。 写完这个脚本之后运行如下命令,添加开机启动
$ sudo chmod 755 /etc/init.d/tightvncserver
$ sudo update-rc.d tightvncserver defaults
重启树莓派即可用VNC通过IP地址和端口号登陆到不同用户的操作界面,彼此间不会相互干扰。
注意:
给Linux新用户开启 tightvncserver 服务,务必事先给该用户配置VNC登陆密码,我一开始就想在VNC的开机启动脚本 tightvncserver 中仿照 pi 用户的启动命令样式,添加其它用户的启动服务,结果因为没有先给新用户配置VNC密码导致开机启动失败,连 pi 的VNC服务都没能启动起来。
另外,建议给每个用户创建各自的用户 home 目录,因为每个用户的VNC服务会去该用户的 home 目录下建立隐藏目录 .vnc,里面含有一些VNC的登陆信息。虽然我没尝试在新建用户时,不创建其 home目录的做法是否可行,这里提出来,供网友在遇到配置问题时进行参考。
关于开机自启后的问题,我们这里是用一个脚本帮助我们成功给每个用户启动了各自的VNC服务,能够保证每个用户用自己的端口和密码登陆后进入的是自己的操作界面,但是我发现,每个用户在图形化界面中单击终端后, 其命令行终端所在的当前路径为根目录 / ,而我希望给让每个用户启动终端后,进入都是各自的 home 路径下。一开始我以为是要去那个tightvncserver启动脚本中,给每个用户在各自su的下面添加一个相应的 cd ~$VNCUSERx,但这个命令没有什么实际作用。最后我只好手动去给每个用户的 .bashrc 文件末尾加上一个 cd(或者 eval cd),确保每个用户启动命令行终端之后,是在自己的 home 目录下。