前言
由于个人日用FreeBSD,但.NET Core和OpenWrt等的开发则必须在Linux上进行。因此在内网设置一个不带显示器的Linux设备,并将配置过程以此记录。
配置 X11 远程显示
因为 X11 基于Socket,因此在本机显示远程的X程序是可能的。
(以下配置仅Xorg可用)
测试X11 TCP监听的工作状况
只要执行以下内容即可启动一个监听了TCP的X客户端:
xinit /usr/bin/xterm -- -listen tcp # Linux
xinit /usr/local/bin/xterm -- -listen tcp # FreeBSD
(需要注意的是,FreeBSD默认安装包和配置都在/usr/local/而不是/,因此以下涉及到文件存在于不同位置的配置都以第一行为Linux,第二行为FreeBSD)
按下Ctrl-Alt-Fx组合按键,你将看见空白屏幕中有一个xterm。在xterm中运行以下命令以获取你的DISPLAY环境变量:
echo $DISPLAY
那么我们假设你的输出是:1
在xterm中运行xterm&,再次启动一个终端,使用ssh登录到你的远程机上,并运行以下命令来查看是否启用了访问控制:
DISPLAY=freebsd:1.0 xhost
(此处假设你的主机名或ip地址为freebsd,以下相同。在xhost 前添加DISPLAY 的目的是省去设置环境变量)
假如你的输出类似于以下两种:
access control enabled, only authorized clients can connect
INET:garuda.lan
access control disabled, clients can connect from any host
那么可以不用继续测试。否则,请遵循以下步骤:
在本地xterm中运行
xhost + garuda # 请把garuda替换成你的ip地址
xhost + # 完全取消访问控制,仅如果你确定能访问PC上X服务器的只有你自己
再次在ssh中运行
DISPLAY=freebsd:1.0 xhost
如果输出正常,那么你的X服务访问已经被允许,可以试着运行一个软件了:
DISPLAY=freebsd:1.0 xterm
配置默认启用X11 TCP监听
由于显示管理器各不相同,因此启用的方法也各不相同。
GNOME桌面 / GDM
转载自Xorg服务开启tcp/ip监听,允许其它机器客户端连接,未在FreeBSD上测试
编辑/usr/share/gdm/gdm.schemas:
<schema>
<key>security/DisallowTCP</key>
<signature>b</signature>
<default>true</default>
</schema>
将default标签内的true改成false即可。
KDE Plasma / SDDM
编辑 /etc/sddm.conf (在FreeBSD上,是 /usr/local/etc/sddm.conf),添加:
[XDisplay]
ServerArguments=-listen tcp
Lightdm
转载自X Window的奥秘,未在FreeBSD上测试
运行以下命令以生成Lightdm配置文件:
gzip -cdk /usr/share/doc/lightdm/lightdm.conf.gz | sudo tee -a /etc/lightdm/lightdm.conf
然后编辑/etc/lightdm/lightdm.conf,在末尾添加
xserver-allow-tcp=true
配置自动授权远程主机
仅适用于具有静态IP的网络。如果你在使用DHCP或对此不确定,请断开并重新连接网络并查看断开前后ip是否变化。没有变化则适用于此脚本。
编辑以下文件,保存到~/.local/bin或任何你看不见的地方:
#!/bin/bash
# FreeBSD用户应该将上面的/bin/bash改成/usr/local/bin/bash
if xhost | grep garuda ; then
exit 0
else
xhost + garuda
fi
本文假设远程机的主机名/IP地址是garuda,请按你的实际状况替换garuda。
将它添加到你的Shell先行执行文件中,例如.zshrc、.bashrc 或是.profile 中:
bash ~/.local/bin/configure_xhost.sh
此处假设你将此脚本添加到了~/.local/bin并命名为configure_xhost.sh
配置远程机自动使用本地机的DISPLAY环境变量
在远程机的~/.ssh/rc 上添加以下:
export DISPLAY="freebsd:0.0"
(如果不起作用,那么请添加到默认Shell的先行执行文件rc中)
大功告成!现在试着在ssh中运行一个GUI程序,它应该出现在你本地的桌面上。

配置Verysync
Verysync 微力同步是一个优秀的文件同步方案,使用它传输文件将会很方便。
Linux上
首先进入微力同步官网 - 私有云盘 企业文件同步 团队文件共享协助工具下载一个适用的二进制包
因为现在Linux大多使用systemd,使用Verysync官方的安装脚本看起来很方便:
curl http://www.verysync.com/shell/verysync-linux-installer/go-installer.sh > go-installer.sh
chmod +x go-installer.sh
sudo ./go-installer.sh -l $(pwd)/verysync.tar.gz
rm go-installer.sh
此处认定你将Verysync二进制包放在当前目录下并命名为verysync.tar.gz
然后启用systemd的开机自启:
sudo systemctl enable verysync
最后启动服务:
sudo systemctl start verysync
FreeBSD上
进入微力同步官网 - 私有云盘 企业文件同步 团队文件共享协助工具下载一个适用的二进制包,并解压:
cd
tar -xf Downloads/verysync.tar.gz
mv verysync* verysync
此处认定你下载到了~/Downloads/verysync.tar.gz,并希望解压到~/verysync
在~/.local/bin 编写一个自动启动脚本:
echo "#!/bin/sh
/home/tienyu/verysync/verysync serve --no-browser --no-restart &" >> ~/.local/bin/verysync.sh
chmod +x ~/.local/bin/verysync.sh
并添加到你桌面环境的自动执行上:
大功告成!现在,分别在两台机器上打开一个浏览器,配置Verysync吧!
后记
之所以不用虚拟机而是选择两个物理机协同是出于性能的无奈之举,实际上虚拟机NAT模式因为是从localhost连接所以不用xhost配置,这对我来说也是耗时很长的一项。但实际上经过一点摸索便写成了此文。此文是以FreeBSD用户的立场写的,因此不可能直接搬到Linux上,若介绍得有失偏颇,请斧正。
问题
不知为何,fish和zsh似乎都不会读取ssh设置的环境变量。因此我在它们的rc文件中设置了DISPLAY。但若需在机器上直接接显示器,那么就会出现在终端中执行应用cannot open display的问题。
虽然在内网基本感受不到延迟,但UI若太复杂的话(比如wine中运行的某国产IM)还是会出现明显的延迟,影响到使用。