最近基于工作的需求,需要安装和配置一个Linux桌面系统用于Node Web应用程序的开发和测试。一般情况下,开发工作是在Windows系统上完成的,使用的工具是VSCode。但是,开发完成之后,应用会部署到Linux系统上,Nodejs的执行环境和开发并不完全相同,所以可能偶尔会做一些部署、调试、分析和排错的工作,纯命令行方式的Linux有时候就不是那么方便了。 所以,笔者就想到可以使用一个Linux桌面环境来帮助完成这个工作。
需求
基于上面的场景,笔者对这个系统的基本使用需求和要求是:
- 轻量高效,而且在虚拟环境中也可以运行良好(因为现成的硬件包括老旧电脑甚至虚拟机系统)
- 可以使用使用远程桌面进行操作,最好是RDP协议
- 界面简单美观,选择要点是xfce4
- 软件安装配置方便
经过相关的评估和对比,加之笔者想要尝试不同类型的Linux桌面系统,笔者选择了分别在老旧电脑和Proxmox虚拟环境中,安装和使用EndeavourOS(简称为EOS)操作系统。相关的需求满足要点如下:
- EndeavourOS,基于Archlinux系统,相对而言其运行效率和资源占用方面有一定优势
- 在远程桌面协议方面,选择RDP协议,在比较重的桌面操作体验方面要好于VNC,使用的软件包是xrdp
- 和所有Linux发行版一样,EOS的桌面环境是可以选择的,我们选择xfce4这个比较轻量高效的版本
- EOS是ArchLinux系列的,使用pacman作为包管理工具,笔者个人感觉其使用体验和简便性要好于apt和yum
- 这些选择的缺点在于使用的广泛性略差,另外ArchLinux的发展策略相对更激进一点,可能会影响到一些稳定性
图为EOS操作系统桌面环境。
系统安装
我们以虚拟机安装为例,来说明一下这个系统的安装过程(其实几乎没有任何特别的地方)。
EOS本身定位于桌面操作系统。所以其安装过程是基于一个LiveCD系统的,没有像Debian一样的可选完全网络和命令行安装方式。这个LiveCD可以在这个地址下载(不到2G,比较轻量):
endeavouros.com/latest-rele…
下载ISO文件后,如果在实体机上安装,需要将其写入U盘。如果在虚拟机上安装,需要上传到虚拟机管理平台上,配置虚机使用ISO文件进行启动。LiveCD启动后,其实就进入了一个临时的EOS系统,同时会运行一个系统安装程序,让用户可以将系统安装到系统硬盘上。
可能需要注意这个系统在全球的软件库分布并不是特别多,在中国安装尽量使用离线方式。另外它的磁盘分区功能使用比较奇怪,当然我们如果是安装单一系统和单一硬盘就比较简单,直接使用整个磁盘并初始化即可。安装过程还是比较顺利,和一般的CentOS GUI安装过程并无大异。
图为EOS LiveCD运行环境和安装工具。
安装后配置
在安装完成重新启动后,一般需要再做一些可能的操作和配置。包括:
- 检查和配置主机时间
date
sudo ntpdate pool.ntp.org
- 更新密钥
应当经常性的更新archlinux的软件公钥集合,否则很容易出现软件包验证错误的信息。
sudo pacman -S archlinux-keyring
- 系统更新
使用下列命令可以进行系统的更新:
sudo pacman -Syu
- 安装其他常用软件
sudo pacman -S net-tools curl htop
- 打开和管理防火墙
ArchLinux系统一般使用firewalld来管理防火墙。当然EOS也可以使用防火墙管理工具和图形界面来管理防火墙。
- 后续工作
简单的使用后,整体感觉还是不错的,包括UI,响应,软件的安装和配置过程,系统资源占用等等。但现在的主要问题是:
1 系统安装是使用的简体中文,安装完成后也是中文的界面,但没有直接内置输入法
2 没有内置的GUI远程访问方式
这两点对于构造开发和测试环境是比较重要的。下面的步骤就是主要解决这两个问题。
输入法的安装和配置
输入法的安装,也不太顺利,反复了几次,主要原因是不太清楚应该选择哪些软件。按照网上的资料,首先选择使用fcitx5软件,但出现的问题主要是安装后,虽然可以切换输入法,但无法显示输入候选字面板。然后改为安装ibus,但ibus安装需要安装并编译python,过程很长,而且安装完成后仍然看不到候选字面板。
最后还是回答选择使用fcitx5作为输入法,但需要注意相关的安装和配置过程:
- 安装软件模块
这个软件不在默认的ArchLinux软件库中,需要使用AUR(Archlinux User Reposity, 用户软件仓库)和yar命令安装。
$ yay -S fcitx5 fcitx5-configtool fcitx5-chinese-addons fcitx5-material-color
- 检查并编辑 ~/.pam_environment 文件
增加以下内容
GTK_IM_MODULE DEFAULT=fcitx
QT_IM_MODULE DEFAULT=fcitx
XMODIFIERS DEFAULT=@im=fcitx
SDL_IM_MODULE DEFAULT=fcitx
- 注销或者重启后,在开始菜单中选择并启动fcitx。
打开任意文本编辑程序,切换到中文输入法,应该就可以进行中文输入了。
- 故障排查
如果上述设置不能生效,如表示出无法切换输入法和选字面板,可能是由于环境变量没有正常加载,检查方式为:
echo $GTK_IM_MODULE
经过研究,可能需要直接修改 /etc/environment 文件(而且不能使用上述设置格式,设置完成后需要重启):
GTK_IM_MODULE=fcitx
QT_IM_MODULE=fcitx
XMODIFIERS=@im=fcitx
XRDP的安装和配置
xrdp是linux系统上,可以作为rdp服务端支持rdp连接的软件。Linux本来也有VNC远程桌面软件,但可能是由于协议和实现方式的差异,个人感觉起码在这个系统上,VNC运行的不如RDP好。
笔者还尝试了x11vnc,配置和使用确实方便,但问题是运行一段时间后,系统的运行效率明显降低,在加上VNC的一些功能性的缺失(剪切板共享),随后就放弃了这一方案。所以在可能的情况下,还是优先选择xrdp作为远程GUI操作的技术方案。
xrdp安装
在EOS系统上,笔者的XRDP也是几经尝试才安装成功的,看起来这个系统的成熟和兼容程度还是有一定的问题。
安装和测试前,最好先打开防火墙。RDP协议默认使用的端口是3389。
安装前,需要先安装一个VNC软件作为依赖,这里使用tigervnc,并使用pacman命令。
安装过程不复杂,主要使用yay命令,选择xrdp和xorgxrdp两个软件。这里xrdp应该就是主体程序,xorgxrdp是用于xorg作为后端来支撑的。默认情况xrdp会使用VNC作为后端,但可能使用xorg会更好一些,所以需要安装相关的支持组件。安装完成后,可以将xrdp和xrdp-sesman作为服务启动,相关的命令操作如下:
# sudo pacman -S tigervnc
$ yay xrdp xorgxrdp
$ sudo systemctl enable xrdp-sesman
$ sudo systemctl enable xrdp
$ sudo systemctl start xrdp-sesman
$ sudo systemctl start xrdp
$ sudo systemctl status xrdp-sesman
$ sudo systemctl status xrdp
// 检查侦听 3389和3150
$ netstat -lpnt
使用netstat -lpnt 检查端口状态,并确认相关的防火墙端口是打开的(EOS系统有图形化的防火墙配置程序)
配置xrdp
道理上来说,在服务端xrdp启动后,就可以使用RDP客户端进行连接和使用的。但可能是这个安装程序在EOS上没有进行正确的安装后配置的原因,连接并且登录后,系统会显示一个空的屏幕和有关于用户会话错误信息。 经过一段时间的研究和测试,发现需要再进行相关的手动配置,才可以正常连接和使用。
先简单的说明一下本人理解的XRDP的连接过程。XRPD服务启动后,RDP客户端软件,首先连接XRDP侦听的端口,连接正常建立后,xrdp会在窗口中展示一个二次连接菜单,用户可以在这里选择连接方式如xorg或者vnc等,并需要输入要创建会话的用户名和密码。选择和登录后,xorg会基于当前认证的用户身份运行一个启动程序(startwm.sh),启动窗口管理器,从而最终建立一个远程桌面连接。
所以,具体的检查和配置过程如下(完成后需要重启xrdp服务):
- 检查/etc/xrdp/xrdp.ini
这个文件应该用于一些配置信息和菜单项目,确认里面有xorg相关的项目,如:
[Xorg]
name=Xorg
lib=libxup.so
username=ask
password=ask
ip=127.0.0.1
port=-1
code=20
- 检查 /etc/xrdp/startwm.sh
查看wm_start这个方法,里面会通过检查 xinitrc这个文件,来决定执行的过程。如果没有匹配的方式,默认情况下会启动xterm。
由于默认情况下,EOS确实是应该没有 ~/.xinitrc 的项目,但存在/etc/X11/xinit/xinitrc这个文件,所以这就是EOS启动窗口管理器检查的内容。并且脚本程序会运行这个文件中的内容。
问题解决的重点应该就是编辑此文件中的内容,让其能够启动正确的窗口管理程序。
- 检查 /etc/X11/xinit/xinitrc
根据场景和需要,我们应该编辑此文件中的内容。注释掉最后几行 xterm相关内容,并增加以下内容
#twm &
#xclock -geometry 50x50-1+1 &
#xterm -geometry 80x50+494+51 &
#xterm -geometry 80x20+494-0 &
#exec xterm -geometry 80x66+0+0 -name login
export XDG_SESSION_TYPE=x11
exec dbus-launch xfce4-session
这两行命令,首先是先声明会话类型是x11,然后指定窗口管理器的会话类型为xfce4(所选择的桌面类型)。
- ~/.xsession文件
如果有必要(如果存在),可能需要检查这个文件,确认如下内容:
xfce4-session
- 快速替代解决方案
如果前面的操作都没有效果,如笔者就遇到了连接不能正常建立,提示如下的错误信息,或者其他无法连接的情况:
sesman_data_in scp_process_msg failed
sesman_main_loop: trans_check_wait_objs failed
这些可能都和sesman(会话管理器)相关,这时可以尝试以下解决方案:
强行创建并编辑 /etc/X11/Xwrapper.conf文件,增加以下内容:
allowed_users=anybody
直接编辑/etc/xrdp/startwm.sh ,在wm_start方法中,添加以下内容:
dbus-launch --sh-syntax startxfce4
exit 0
这个设置不检查当前环境、设置和用户配置,直接强行启动xfce4。
问题排查
出现问题时,首先应该检查相关错误信息和服务状态(状态信息中也有错误日志):
sudo cat /var/log/xrdp
sudo cat /var/log/xrdp-sesman
sudo systemctl status xrdp-sesman
sudo systemctl status xrdp
一般情况下都可以获得一些相关有用的信息和思路。然后就可以进一步结合故障表现,进行排查了。常见的故障和排查思路操作可能包括:
- 无法连接
检查网络是否通畅,IP地址是否正确,主机是否可以直接连接,防火墙是否打开
- 无法登录
检查在服务端的用户和密码,可以先确认用户在本机或者远程终端中能够正常登录。
- 连接后黑屏灰屏
应该是窗口管理程序没有正常启动,需要检查系统的类型后后续处理,窗口程序类型,启动命令是否被调用和正常运行等等。
- 登录后提示没有权限
这个问题笔者曾经遇到过,重新安装和配置后就解决了,猜想和 dbus-lunch 没有正确执行有关。
- vigervnc安装,作为一个依赖项目,可能需要在xrdp安装前完成
安装和配置开发工具
作为开发测试使用的桌面系统,我们需要安装一系列相关的软件和工具,包括开发工具(VSCode)、版本管理工具(Git)和应用执行环境(Nodejs)和运行管理程序(PM2)。
sudo -i
// vscode
pacman -S code
// git
pacman -S git
// node
pacman -S nodejs npm
// pm2
npm install pm2 -g
而标准的Web服务,笔者使用caddy,详细的安装、配置和使用详见相关另外的文章。