用Docke和VNC制作Ubuntu的远程桌面

个人终端总是有很多的限制,一是没有办法随时随地携带,二是各种应用安装删除,时间一长,系统很乱,三是在外时连接家庭局域网困难。所以在家中安装一台服务器并运行桌面系统还是有需要的。实现方案比较流行的是远程控制软件,经过比较,多数体验不是很好,主要是连接效果不理想或者是要安装各种终端软件,并依赖软件开发商,各种注册或购买。

参考了不同的实现方法之后,决定自己用Docker搭建一个Web版的远程桌面,实现一个浏览器基本满足要求,网络上已经有比较好的成熟方案,但比较少,大家可以直接下载来使用,效果是不错的,这里我还是自己动手搭建,记录一下过程并分享几点经验。

一、安装基于Ubuntu官方镜像的docker容器

1、下载官方镜像 docker pull ubuntu

这里直接下载20.04版本比较好,以前版本也没有问题,20.04版自带的python是3.8.5,以后安装noVNC时可以不用再安装一堆python的依赖。

这个系统仅有73MB,只非常简单的一个核心,所有的基础应用都要从头安装。

2、启动容器并更新国内源

由于后面安装的桌面系统庞大,首先是要将ubuntu换成国内源,否则无法进行后面的操作。

2.1 SSH连接服务器,直接 docker run -p 6080:6080 ubuntu:latest 启动ubuntu容器。

2.2 进入容器并更新源

apt-get update  #更新ubuntu的官方列表

apt-get install nano ca-certificates  #安装编辑器和源证书

nano /etc/apt/souces.list #打开源的配置文件并把以下中科大的源复制到文件中

deb https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse

deb https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse

deb https://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse

deb https://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse

二、在容器中安装轻量级的桌面系统

1、安装桌面

典型桌面发行版的ubuntu界面比较漂亮,但十分臃肿庞大,用于远程桌面资源占用太大,选用轻量的系统比较适合,这里安装台湾人开发的LXDE系统,简洁大方。

apt-get update  #不要忘记这一步,这样就可以将源切换到国内了

apt-get install lxde-core galculator gpicview mousepad xarchiver lxterminal git

# lxde桌面完整版组件比较多,仅安装核心模块和几个常用工具。

2、安装用于远程显示的组件

远程连接显示有多种选择,主要是VNC方案,VNC也有多种选择,比较方便简单的是安装tightvncserver,一条安装命令后就可以直接进行连接,不足是连接后在桌面调节显示不方便。网络上有很多的教程,简单实用。

从保证显示效果和运行效率,以及高可用性考虑,这里选用x11vnc方案,搭建起来比较麻烦一些。

apt-get install xorg xvfb x11vnc

xorg和xvfb可以只装一个,都是x server。而x11vnc则是vnc的 server。

3、安装语言支持

apt-get install language-pack-zh-hans
apt-get install ttf-wqy-zenhei

这个语言包一定要装,否则很可能桌面起来后全部乱码。

三、调试系统的虚拟显示

1、调试Xvfb

进入容器,以root用户运行 Xvfb :1

检查系统的返回信息,不能有报错,顺利进入终端占用状态是正常的,这一步大概率会出错,可以百度解决。

2、调试x11vnc

另外开启SSH重新进入容器,以root用户运行 x11vnc -display :1

同样检查系统的返回信息,不能有报错,顺利进入终端占用状态是正常的,这一步也大概率会出错,可以百度解决。

3、调试openbox

开启SSH重新进入容器,以root用户运行 openbox

openbox是lxde桌面安装时装好的桌面管理器,同样不能有运行错误。

四、安装进程管理程序

1、安装进行守护程序

由于Docker自身设计的运行机制要求,仅允许运行一个用户进程,所以以上安装的那么多应用没有特殊的措施是不能同时运行的,也就没有办法显示桌面。上文提到tightvncserver运行时能够把其他程序也带起来,所以可以完成桌面的显示,这也是用vncserver部署方便的原因,但x11vnc没有这种能力,所以要安装进程守护程序,把其它的程序作为它的子进程来管理。

1.1 apt-get install supervisor

1.2 echo_supervisord_conf > /etc/supervisor/supervisord.conf

创建默认配置文件  并将配置文件修改好,其中在program模块要将xvfb openbox lxpanel pcmanfm x11vnc noVNC按优先顺序配置好。

这里也有大量的工作,要深入学习各种教程。

1.3 supervisord -c /etc/supervisor/supervisord.conf 启动supervisor 服务进行排错

2、安装错误进程回收处理程序

由于在实际运行中,有的进程会因各种原因崩溃死亡,容器部署在服务器长期运行,这种错误不处理积累下来可能会对系统造成一定的影响,也可能会影响容器的运行效率,所以部署一个进程处理程序有利于系统的长久稳定。

apt-get install tini #这个程序要求以PID1运行,所以要用脚本在容器启动时首先运行,具体可以教参官网。

以上两种程序的基本原理是,用supervisor保证所有进程正常运行,失败或崩溃后及时拉起来,保证各种服务正常,用tini处理进程错误,保证系统干净,不影响效率。

五、安装远程Web工具

前面安装完成后,启动系统就可以用vnc viewer软件进行连接了,要求是你的终端上安装了这个软件。还有一种选择是安装noVNC,一种广泛应用的web vnc连接方式,好处是只要用浏览器就可以VNC连接,不用另外安装什么东西。

1、git clone https://github.com/novnc/noVNC.git #下载noVNC代码

2、安装noVNC并检查安装错误

cd noVNC/utils

bash launch.sh –vnc localhost:5900

这里系统会自动下载各种依赖程序进行安装,包括其中重要的组件websockify,如果基础镜像是ubuntu18.04就要自己先升级python3并安装pip,再安装setup-tools,再手动安装websockify,过程复杂,很容易出错,但肯定也能正常运行,具体看官网说明。

六、验证整个系统是否安装正确,能否正常运行

1、先docker stop 停止容器,再dcoker start启动容器,并用 ps -a 检查系统用户进程情况,使容器有一个干净的环境。

2、启动tini,检查程序运行,只要能运行就可以,如果系统警告不是PID1运行不用管。

3、用supervisor启动桌面系统

supervisord -c /etc/supervisor/supervisord.conf

用ps -a检查系统进程情况,如果program模块中配置的进程全部正常运行则表示安装成功,否则根据信息进行排错处理。

由于配置文件中只要有一个进程错误,就可能导致所有进程起不来,所以排查错误的时候可以先只留一个程序,其它注释掉,正常运行再加入下一个,直到全部正常运行。

4、在浏览器中运行 IP:6080 系统进入桌面

七、在容器中安装基础应用

1、安装火狐浏览器,这个浏览器是ubuntu的默认配置,兼容性良好。

apt-get install firefox

这里安装的是国际版,安装后在选项的语言中选添加语言,选chinese(china),应用并重新启动后就是中文界面了。不要另外安装中文字体,否则字体可能更难看。

2、安装输入法、WPS等软件,根据需要安装相关应用并完成配置。

八、生成基础镜像

用docker commit命令将以上配置好的容器保存为基础镜像。

基础镜像生成后,原有的容器就没有用了,暂时停止容器运行,后面工作如果没有问题可以删除此容器。

九、用配置好的基础镜像制作以脚本启动的webvnc的docker镜像

1、编写容器启动脚本

在主机的用户目录下建立start.sh启动脚本,主要可以包括以下内容:

if [ -n “$PASSWORD” ]; then
echo -n “$PASSWORD” > /.passwd1
x11vnc -storepasswd $(cat /.passwd1) /.passwd2
sed -i ‘s/^command=x11vnc.*/& -rfbauth \/.passwd2/’ /etc/supervisor/supervisord.conf
export PASSWORD=

exec /bin/tini — supervisord -n -c /etc/supervisor/supervisord.conf

2、编写Dockerfile

ROM ubuntu:tag
COPY start.sh /
RUN chmod +x start.sh
ENTRYPOINT [“/start.sh”]

ubuntu:tag就是在上一步生成的基础镜像

3、生成web vnc的成品镜像

dcoker build -t vncubuntu:newtag .

十、运行web vnc容器

docker run -p 6080:6080 -e PASSWORD=passwd vncubuntu:newtag

系统正常启动过程如下:

02:07:12,361 INFO supervisord started with pid 11

02:07:13,371 INFO spawned: ‘xvfb’ with pid 15

02:07:13,373 INFO spawned: ‘openbox’ with pid 16

02:07:13,375 INFO spawned: ‘lxpanel’ with pid 17

02:07:13,377 INFO spawned: ‘pcmanfm’ with pid 18

02:07:13,390 INFO spawned: ‘x11vnc’ with pid 19

02:07:13,394 INFO spawned: ‘novnc’ with pid 20

在浏览器中输入 IP:6080  ,系统显示登录界面,输入启动容器时设置的密码,进入系统。

其它

到现在仅局域网内可以运行,要想在外网访问局域网,需要配置主机可以外网访问并映射好端口,特别注意,上述安装没有配置SSL,仅能http访问并不安全,可以在主机中安装反向代理并配置好SSL,这样就可以https访问了。

几个问题:

1、xvfb或x11vnc命令出现 access control disabled,clients can connect from any host以及 unable to open display

这个问题是启动VNC服务时,系统需要定向到指定的内部显示环境,因此要进行相关设置。

终端执行 export DISPLAY= :1

xhost +

此时,系统提示“access control disabled, clients can connect from any host”才正确。然后再重新执行服务器命令。

2、supervisor命令启动时是服务端和客户端一起启动,如果配置文件有问题,有可能导致服务端运行不正常,显示unix:///var/run/supervisor.sock refused connection等问题,表示客户端无法正常连接。

解决问题的关键是该命令的conf配置文件要正常,只要配置改好了,服务端就能启动,客户端能不能正常连接不是大问题,因为客户端只是用于辅助运行和获取信息,这里没有太大用处,也就是这个问题可以不处理。

用ps 命令查看supervisor守护运行的进程是否起来,全部起来了表示成功,否则继续调试。

3、中文输入法的问题

系统安装好后,系统已经附带安装好了ibus输入法,但是原始配置没有中文,而且安装中文输入后在浏览器和wps中无法输入中文,网上有很多教程,主要是推荐安装fcitx,其实没有必要,ibus是linux默认的输入法,非常好用,只是中文环境下要做一定的配置。

3.1 补充安装中文拼音和五笔输入

apt-get install ibus-table-wubi ibus-pinyin

3.2 配置中文输入

编辑.bashrc文件,nano /home/**/.bashrc 加入以下语句:

export GTK_IM_MODULE=ibus
export QT_IM_MODULE=ibus
export XMODIFIERS=@im=ibus

这样在浏览器和文本编辑器中就能输入中文了,但在wps中还是不行,终端中打开wps的四个配置文件,/usr/bin/wps,/usr/bin/et,/usr/bin/wpp,/usr/bin/wpspdf,加入以下语句就可以了。

export XMODIFIERS=”@im=ibus”
export QT_IM_MODULE=”ibus”

Chrome浏览器的安装

在Linux中安装谷歌的浏览器有时候会有各种问题,几点Ubuntu20.04中安装经验分享。

  1. 安装

用deb包安装是比较方便的

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb

sudo dpkg -i google-chrome-stable_current_amd64.deb

2. 运行

一般运行命令是 /usr/bin/google-chrome-stable  如果运行正常则过程结束,但往往会提示错误。

我的情况是,浏览器安装好后自动在桌面的启动菜单中有快捷方式,但点击快捷方式没有反应,用以上命令在终端中启动chrome,则提示以下错误:[31560:31560:0207/085601.085852:ERROR:zygote_host_impl_linux.cc(90)] Running as root without –no-sandbox is not supported.

经查找资料,似乎是说要求你以非普通用户运行chrome,根用户运行时要加上非沙箱的定义,所以在传统快捷方式后面要加上 –no-sandbox

在终端中以修改后命令运行,可以启动。

修改启动菜单中的快捷方式,直接改为 google-chrome –no-sandbox

相关资料参考:

https://blog.csdn.net/sinolover/article/details/94380049

https://my.oschina.net/u/4272712/blog/3540674

PLEX的播放设置

在群晖NAS中用套件安装好后plex后,在浏览器中播放有卡的现象,手机app更是无法播放,打开就卡在起始画面不动,参考了许多文章都无解。

痛定思痛,利用休息天时间,打开NAS的资源监控器,再在不同环境下测试播放视频时的进程和资源占用,优化播放转码设置,终于找到一点窍门。

一、带+的型号都是支持硬件加速的,可以在设置中开启,开启后浏览器播放很流畅,从进程表中明确可以看出plex启用了转码服务,开始播放后CPU占用也不高,正常播放一段时间后,CPU占用就很低了。

二、客户端的播放质量设置关系能否正常播放,服务器转码并不能适应所有设置

1、不宜设置自动,在客户端的播放质量设置中,如果设置自动转换,无论是浏览器还是app,都可能卡死,只要带宽够设置高码率是没有问题的。

浏览器访问可以自己设置端口转发,相当于plex的直联,不通过plex的帐户远程转联,这样应该也没有问题。

2、app的播放首先取决于是局域网还是外网,plex的网络设置很不好,要做好端口自动转发,还要与他自己的服务器关联,大概率弄不好的。

可以看官网的介绍:

2.1 局域网内plex称为直连,要设置成原始质量播放,避免发生转码情况,否则就可能卡,如果不行有可能是plex没有正确识别视频的真实原始码率,先设一下其它码率,然后再切换回原始码率,就有可能识别正确了。

2.2 局域网外plex称remote,网络设置是通过plex帐户转译的,很难联通。

总之,如果在外网很可能你无法正确连接到自己的服务器,浏览器可以自己设置端口,再通过域名地址连接,app就没有这种设置,只能不用了。还好,群晖的DSvedio比较好用,转码也不错。所以综合解决方案是,浏览器可以访问plex服务器,手机等就用其他的了。

三、资料库的扫描问题

1、资料能扫描,但扫描不出文件

碰到了好几次这种问题,以前加入的文件都能刷新数据,但新建立的资料库就是无法更新资料,在网上搜索得到启发,根本问题是plex没有文件的读取权限,将要扫描的文件夹设置plex用户拥有读取权限就可以了。

由于plex没有报错信息,这个问题经常会让人摸不着头脑。

还有一种情况有时也让人头痛,plex能扫描到文件夹,但显示文件夹是空的,明明文件夹中有可以播放的视频,折腾了一阵后明白其中的原因,plex不能识别该文件的视频格式,将视频进行格式转换到通用的mp4后正常识别。

2、音乐库不能扫描

音乐库加了一个目录,发现无法更新资料库,而其它资料都能顺利更新,只有这个库不能更新,报错信息显示没有登录plex的web服务器,登录https://plex.tv/web后再连接,又显示本地服务器没有联网,明明从plex访问互联网上plex官方的内容没有任何问题。

折腾了很长时间没有解决,进官方网站按要求查找也没有对应解决方案,帐户已经登录在plex的服务器上,决定还是自己从各项内部设置检查。

最终这个问题的原因是音乐库本身设置有问题,在建立资料库时有一个高级选项,其中的扫描器和相关选项设置为要访问国外网站,所以plex报不能连接网络错误。因此,大家设立音乐库时高级选项要设置一下,不要使用默认值,否则有可能连不上国外扫描服务器而报错。

扫描器选plex music scanner

Conerts中Genres选择None,这个是关键,其它都需要访问外网

四、音乐文件乱码

如果音乐文件是mp3格式,很有可能出现在plex的资料库中文件名、艺术家等信息显示为乱码,而这些文件在操作系统的资源管理器中都是正常的。

显示乱码的原因是音乐播放器处理音乐文件的信息时显示在播放器界面,主要不是读操作系统下的文件名,而是音乐文件特有的信息标签IDtag,这个标签中储存了曲目名、专辑、艺术家、码率等很多数据,并且这个标签是有格式规定的,出现乱码的原因主要是有可能标签中的信息是以老版本的格式保存,现在的播放器不能兼容。

乱码问题的原因和解决方法网络上有很多的文章,其实plex中解决这个问题非常简单,因为plex可以直接批量修改文件信息,完全不需要用专门的软件在操作系统进行修改。

五、外网连接问题

外网连接有两种方式,一是外网通过IP地址或域名直接连接Plex的媒体服务器,二是在外网通过官方帐户连接Plex的媒体服务器,如Plex pass等。

我在设置过程中发现,通过第一种方式正常,但第二方式连接不上,无论是在台式机上联接,还是用Plex的APP,都连不上,特别是如果是台式机直接用第一种方式也不影响使用,但APP没有地址或域名连接方式,导致Plex直接用不了。

这个问题自己摸索了一下,发现用帐户登录后一直提示网络连接问题,在网络上也了搜索一下类似问题,没有相同的解决方案,仅提到网络设置方面,考虑媒体服务器安装中涉及的网络设置问题,推测有可能是端口问题,即路由器外部端口需要设置为32400,这样通过帐户登录后连接局域网就可以通过默认端口(32400)正确接入内部网络,否则经由互联网就没有对应的路由器入口进入内部网络,同时在系统设置的远程访问中,要钩选手动指定端口,并填32400。

改变默认端口应该怎么设置没有试验过,应该也有解决办法吧。

所以,在外网使用Plex,正确进行端口映射很关键,利用自己的域名用浏览器直接连接很方便,但APP使用就有可能出问题。

六、其它

Plex已经使用比较长一段时间了,熟悉之后有些不同的感受。比如资料库扫描问题,网络上一直是热点话题,各种设置方法,还有各种用专用工具扫描整理好资料再给Plex用等教程,其实Plex可以不用任何特殊设置,几乎可以完成所有电影、电视剧的扫描,方法如下:

1、按要求电影、电视剧分别设置好资料库,在资料库的设置中,代理都选The Movie Database,Country (used for release date and content rating)都选中国,这样可以把中文的海报都搜索出来,英文的当然也更加没有问题。

2、回到主页面,选中一部电影或电视剧,点右下角… 选修正匹配。

这里是问题的关键所在,进去之后,系统会自己运行自动匹配,这时候有可能出现你希望的结果,但大概率是找不到你想要的结果。

2.1、点“搜索选项”,系统将为你展示标题、代理、年份、语言四个选项。

2.2、除代理基本不用动外,对其它三个不同选项进修改并搜索

a、优先修改标题

在豆瓣网找到该部影片,将中文片名拷到标题栏,然后搜索,绝大部分影片基本都可以找到正确资料,其中就有中文海报。如果搜不到可以用英文片名,可能只有英文的海报。

b、如果以上修改找不到影片,可以检查年份是否正确,年份不正确会导致错误,这一步可以和上一步一次完成。

c、如果以上资料都正确,仍不能找到对应的资料,有可能这部影片比较特殊,很有可能它没有中文语言,最后可以修改语言选项进行搜索,比较有一部影片在看过网络资料后改选成德语才正确搜到,但这种情况极少,主要是一些非常小众的片子。

其它还有转码、字幕等问题,其实只要你熟悉了它的使用逻辑,就能用的很好,根本不需要另外的设置和辅助工具。