Skip to content

11.12 故障排除与未竟事宜

本节汇总 Linux 兼容层常见问题及解决方法。

11.12.1 Linux 兼容层的声音

chroot 进入的 Linux 兼容层内部如果没有声音输出,通常需要在 FreeBSD 中直接运行 Linux 程序,而非使用 chroot。

Ubuntu 兼容层:

编辑 /compat/ubuntu/etc/asound.conf 文件,写入以下两行,请注意区分英文感叹号 ! 与数字 1

sh
pcm.!sysdefault pcm.plug:oss
pcm.!default pcm.sysdefault

11.12.2 在 FreeBSD 的命令行运行软件(基于 Ubuntu 兼容层)

直接从 FreeBSD 命令行运行软件而无需 chroot 的方法:

方式一

sh
# sysctl compat.linux.emul_path=/compat/ubuntu # 立即生效
# echo compat.linux.emul_path=/compat/ubuntu >> /etc/sysctl.conf # 永久化设置

方式二

sh
# mv /compat/ubuntu/lib64/ld-linux-x86-64.so.2  /compat/ubuntu/lib64/ld-linux-x86-64.so.2.back
# ln -s /compat/ubuntu/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 /compat/ubuntu/lib64/ld-linux-x86-64.so.2

无需 chroot,可直接在终端运行 Linux 程序(仅部分程序),需指定绝对路径。

Arch 和 openSUSE 兼容层只需要方式一,无需方式二。

11.12.2.1 参考文献

11.12.3 以普通用户权限运行 QQ

兼容层的用户与 FreeBSD 用户存在 UID 映射关系。

假设在 FreeBSD 的普通用户名是 ykla,UID 是 1001(正常情况下默认为 1001):

sh
# useradd --uid 1001 --gid 0 -m ykla # 此步骤在兼容层里操作!

警告

在 Arch 中创建用户 ykla 后,此用户无法用于 yay 安装软件,仍然需要使用 Shell 脚本默认创建的 test 用户。

11.12.4 从图标启动程序

  • 编辑 QQ.desktop 文件,写入以下内容(以 Ubuntu 兼容层为例):
ini
[Desktop Entry]
Name=QQ
Exec=/compat/ubuntu/opt/QQ/qq --no-sandbox --in-process-gpu %U
Terminal=false
Type=Application
Icon=/compat/ubuntu/usr/share/icons/hicolor/512x512/apps/qq.png
StartupWMClass=QQ
Categories=Network;
Comment=QQ
MimeType=x-scheme-handler/tencent;
  • 编辑 Chrome.desktop 文件,写入以下内容(以 Ubuntu 兼容层为例):
ini
[Desktop Entry]
Version=1.0
Type=Application
Name=Chrome
Comment=
Exec=/compat/ubuntu/opt/google/chrome/chrome --no-sandbox --in-process-gpu
Icon=/compat/ubuntu/opt/google/chrome/product_logo_256.png
Path=
Terminal=false
StartupNotify=false

授予上述文件可执行权限后,文件将显示为正常的图标样式,点击即可启动对应软件。

11.12.5 运行 Chrome(以 Ubuntu 兼容层为例)

下载 Chrome:

sh
# wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb # 无需代理软件,可以直连。此时已经位于 Ubuntu 兼容层了。

安装 Chrome:

bash
# apt install ./google-chrome-stable_current_amd64.deb # 此时已经位于 Ubuntu 兼容层了。

启动 Chrome:

sh
# /usr/bin/google-chrome-stable --no-sandbox --no-zygote --in-process-gpu  # 此时已经位于 Ubuntu 兼容层了。

11.12.6 代理软件(以 Clash for Windows 为例)

Linux 兼容层中的代理软件可为 FreeBSD 提供网络代理,因此可直接在兼容层安装 Clash for Windows,按常规方式安装配置即可。

11.12.7 Linux 兼容层网络(Linux QQ 无网络)

本机同时有以太网卡 em0 和无线网卡 wlan0,但实际使用 wlan0 时,Linux 兼容层可能无法正常联网。FreeBSD 的 em0 对应兼容层的 eth0,wlan0 对应 eth1,依此类推。Linux 兼容层无法自动检测哪个接口有网络,且默认使用 eth0。

使用 wlan0 而未使用 em0 时,需要为 em0 分配一个未使用的 IP:

  • 临时设置(重启失效):# ifconfig em0 192.168.11.1
  • 永久性设置:即在 FreeBSD /etc/rc.conf 文件中加入(不影响该网卡正常使用):
sh
# ifconfig_em0_alias0="inet 192.168.11.1 netmask 255.255.255.0"

以上 192.168.11.1 为未使用的 IP,可自行设置为其他值。

11.12.8 中文输入法

/home 路径下的 .profile 文件放到兼容层的 / 目录下:

sh
export LANG=zh_CN.UTF-8
export LANGUAGE=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8

export XMODIFIERS='@im=fcitx'
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx

如果遇到类似“sh: warning: setlocale: LC_ALL: cannot change locale (zh_CN.UTF-8)”的错误,以 openSUSE 为例,安装 glibc-langglibc-locale 这两个包,退出兼容层后重新进入即可。其他系统可搜索相似的包,例如 CentOS 兼容层,应该安装 glibc-locale-sourceglibc-langpack-zh

11.12.9 sysctl 变量

sh
# sysctl -a -d  | grep -E "linux|compat.linux"

可以列出常用变量。

11.12.10 使用命令行下载软件时报错 403 Forbidden

国内某些镜像站可能出于流量限制等原因,只允许通过指定包管理器获取软件包。使用其他方式拉取时会报错“403 Forbidden”(禁止访问)。

这通常是通过限制包管理器的 UA(User-Agent)实现的。在此情况下,最简便的方法是更换无限制的镜像站,如 TUNA/USTC Mirror。

11.12.11 systemd 与 Wine

systemd 不可用,但可使用 service xxx start 命令替代。

此外,曾尝试使用 https://github.com/zq1997/deepin-wine 源以安装 deepin-qq、deepin-wechat 等软件,但均提示“段错误”。所有 Wine 程序均无法正常运行。如果读者能解决这个问题,请提出 issue 或者 PR。