Linux 下可用的图形界面远程控制软件很多,很久以前写过的一个 Linux 下远程控制简介,感兴趣的可以简要了解一下。NoMachine 是 Linux 下实现远程桌面的另一个非常方便的软件,本文记录了在 Debian/Ubuntu 下安装和使用 NoMachine 的一些注意事项。
1 NX 的优点
NX 的原理和 VNC 很接近,同样也是通过在远程机器上虚拟一个 Xserver 的方式,将远程的应用程序绘制的图像都绘到虚拟的 Xserver 上,再通过 NX 协议将图像发送到客户端来,并接受客户端的键盘和鼠标事件。和 VNC 比起来,NX 主要有以下几大优点:
首先是速度,NX 协议允许对传输的图像进行压缩,在网络带宽有限的情况下,NX 可以动态地牺牲部分图像质量,获得更流畅的操作效果,而 VNC 受协议限制,无法做这样的动态有损压缩。
其次是安全性,VNC 使用自己单独的端口,使用自己定义的协议来传输数据,并且具有自己的一套密码认证方案,因此安全性完全取决于它自身实现的健壮性。NX 使用的是系统 SSH 协议,没有自己单独的一套身份验证机制,因此安全性完全依赖于系统 SSH 的安全性,不会引入新的安全隐患。
最后是其它服务的转发。NX 内置了对于文件共享、打印机共享以及本地声音系统共享的转发机制,连接到远程系统的时候可以非常方便地使用本地的资源。VNC 本身是不支持这些操作的,虽然对于高级用户而言,通过各种辅助软件和精妙的配置,以上功能都能实现,但毕竟不如 NX 这样本身内置了全部支持来得方便。
2 安装指南
NX 的安装很简单,直接到 NX 的官方网站 去,找到适合自己平台的安装包,直接安装就可以了。对于客户端而言,只需要装 nxclient 就行了。对于服务端而言,需要同时安装 nxclient、nxnode 和 nxserver,由于服务端的程序用到了客户端的库,因此安装服务端的时候,必须先在服务端也安装一份客户端才行。安装完毕之后服务端会自动启动,如果没有什么高级需求的话,不需要对服务端进行什么特殊配置。
3 设置分辨率
我们这里说的“分辨率”,指的是 resolution,即“每英寸对应多少个像素”(DPI),不是 geometry,即“屏幕宽度和高度分别是多少像素”。Geometry 在 NX 登录的时候可以直接在客户端设置,登录之后也可以通过拖拽 NX 的窗口进行调节,不需要通过特殊的设置实现。
NX 默认的分辨率是 75dpi,由于 KDE 和 GNOME 程序都能强制 override 系统分辨率,将默认分辨率设置为 96dpi,因此对于 KDE 和 GNOME 程序而言,系统分辨率不正确并没有太大问题。但系统里毕竟还是有一些特殊的程序是不考虑 KDE 和 GNOME 的分辨率设置,直接使用系统分辨率的。
修改 NX 分辨率的方式是,到 NX 的安装路径下,找到 etc 目录 之下的 node.cfg,在文件中查找:AgentExtraOptions 字样,如果这个单词在该文件里完全不存在,则直接在文件尾部添加:
AgentExtraOptions = "-dpi 96"
如果 AgentExtraOptions 已经存在的话,则在原有的 AgentExtraOptions = "..." 的后引号前面加一个空格,补上 -dpi 96,譬如如果原先内容是:
AgentExtraOptions = "-nolisten tcp"
则改为:
AgentExtraOptions = "-nolisten tcp -dpi 96"
4 远程声音配置
Linux 下的声音系统极其混乱,导致在 Linux 下想要让系统正常发声,往往需要很费一番周折。在 NX 下的远程声音效果并不好,延时很严重,而且音质非常糟糕,配置远程声音的主要目的是方便播放一些提示音来监听工作状态,譬如滇狐喜欢在编译的时候设置编译完成后播放一段提示音,这样在 NX 里编译的时候就可以切换到本地玩一些别的事情了。
4.1 客户端
NX 在远程播放声音的时候,是通过把远程的数据转发到本地的一个 EsounD 服务器上实现的,因此,它必须现在本地启动一个 ESD。在 NX 的安装包里,提供了一个 NX 实现的 ESD,叫 nxesd,就在 NX 安装目录的 bin 底下。
然而,这个声音服务器直接通过 OSS 接口和声卡打交道,和本地已有的别的声音服务器并不能和睦相处。为了保证这个不听话的 nxesd 运行正常,我们需要通过本地声音服务器提供的 OSS wrapper 来启动它的声音服务器:如果本地的声音系统是 artsd,则使用 artdsp 作为 wrapper;如果本地的声音系统是 ESD,则使用 esddsp 作为 wrapper;如果本地的声音系统是 alsa,则使用 aoss 作为 wrapper;如果本地的声音系统是 pulseaudio,则使用 padsp 作为 wrapper;如果本地的声音系统不在上面列出的范围里,请自行查找相应的 wrapper 程序。
由于 nxclient 在启动的时候会自动调用 nxesd,因此,为了将我们的 wrapper 添加进去,我们需要先把 nxesd 改个名,让 nxclient 无法直接调用到它:
sudo mv nxesd nxesd.bin