第 21.13 节 Linux 兼容层故障排除与配置

Linux 兼容层的声音

目前 Chroot 的 Linux 兼容层内部中没有声音,要想有声音必须在 FreeBSD 中直接运行 Linux 程序,而非 chroot

Ubuntu 兼容层:

# ee /compat/ubuntu/etc/asound.conf # 写入以下两行,注意那是感叹号 ! 不是 1 
pcm.!sysdefault pcm.plug:oss
pcm.!default pcm.sysdefault

直接从 FreeBSD 的命令行运行软件(以 Ubuntu 兼容层为例)

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

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

# 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

然后就不需要 choot 可以直接在终端运行 Linux 的程序了(只是部分)需要指定绝对路径。

Arch 兼容层只需要 ①,无需 ②

参考文献:

以普通用户权限运行 QQ

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

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

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

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

设置图标双击启动程序

  • QQ.desktop 内容(以 Arch 兼容层为例):

[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 兼容层为例):

[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

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

# wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb # 无需代理软件,可以直连。此时已经位于 Ubuntu 兼容层了。
# apt install ./google-chrome-stable_current_amd64.deb # 此时已经位于 Ubuntu 兼容层了。
# /usr/bin/google-chrome-stable --no-sandbox --no-zygote --in-process-gpu  # 此时已经位于 Ubuntu 兼容层了。

代理软件(以 clash for windows 为例)

Linux 兼容层的代理软件同时会影响 FreeBSD 的网络状态,因此直接在兼容层安装 clash for windows,设置代理的话 FreeBSD 一样可以使用代理访问网站。正常安装配置即可

Linux 兼容层网络(Linux QQ 没有网络)

如果本机有以太网卡 em0,和无线网卡 wlan0。但是使用的是 wlan0 的网络,则 Linux 兼容层可能会出现没有网络的情况。因为 FreeBSD 的 em0 对应兼容层的 eth0,wlan0 对应 eth1,以此类推。但是 Linux 兼容层不能自动识别哪个有网,且默认使用 eh0。

所以,如果以太网 em0 没用,用的 wlan0,这时候要给不用的以太网卡 em0 随便指定一个不用的 ip:

  • 临时设置(重启生效):# ifconfig em0 192.168.11.1

  • 永久性设置:即在 FreeBSD /etc/tc.conf 中加入(不影响该网卡正常使用):

# ifconfig_em0_alias0="inet 192.168.11.1 netmask 255.255.255.0" 

以上 192.168.11.1 为未分配的假 IP,你可以随便自己设置成别的。

中文输入

/home 下的 .profile 放到兼容层的 / 目录下:

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

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

sysctl 变量(基于 FreeBSD 14.0)

root@ykla:~ # sysctl -a -d  | grep -E "linux|compat.linux"

以下是输出的翻译和表格化:

参数说明

kern.features.linux64

64 位 Linux 支持

kern.features.linux

32 位 Linux 支持

kern.features.linuxulator_v4l2

在 linux 兼容层中支持 V4L2 ioctl wrapper

kern.features.linuxulator_v4l

在 linux 兼容层中支持 V4L ioctl wrapper

vm.uma.linux_dma_object

vm.uma.linux_dma_object.stats

vm.uma.linux_dma_object.stats.xdomain

从错误域调用的空闲调用

vm.uma.linux_dma_object.stats.fails

分配失败的数量

vm.uma.linux_dma_object.stats.frees

总共的空闲调用

vm.uma.linux_dma_object.stats.allocs

总共的分配调用

vm.uma.linux_dma_object.stats.current

当前分配的项目数量

vm.uma.linux_dma_object.domain

vm.uma.linux_dma_object.domain.0

vm.uma.linux_dma_object.domain.0.timin

自零以来的长时间最小项目计数时间

vm.uma.linux_dma_object.domain.0.limin

长时间最小项目计数

vm.uma.linux_dma_object.domain.0.wss

工作集大小

vm.uma.linux_dma_object.domain.0.bimin

此批次中的最小项目计数

vm.uma.linux_dma_object.domain.0.imin

此时期的最小项目计数

vm.uma.linux_dma_object.domain.0.imax

此时期的最大项目计数

vm.uma.linux_dma_object.domain.0.nitems

此域中的项目数量

vm.uma.linux_dma_object.limit

vm.uma.linux_dma_object.limit.bucket_max

每个域的桶缓存中的最大项目数

vm.uma.linux_dma_object.limit.sleeps

总区限制休眠

vm.uma.linux_dma_object.limit.sleepers

在限制处休眠的线程数

vm.uma.linux_dma_object.limit.max_items

最大分配和缓存项目数

vm.uma.linux_dma_object.limit.items

如果设置了限制,则为当前分配的项目数

vm.uma.linux_dma_object.keg

vm.uma.linux_dma_object.keg.domain

vm.uma.linux_dma_object.keg.domain.0

vm.uma.linux_dma_object.keg.domain.0.free_slabs

未使用的 slabs

vm.uma.linux_dma_object.keg.domain.0.free_items

在 slab 层中的空闲项目

vm.uma.linux_dma_object.keg.domain.0.pages

从 VM 分配的总页数

vm.uma.linux_dma_object.keg.efficiency

Slab 利用率(100 - 内部碎片化%)

vm.uma.linux_dma_object.keg.reserve

预留项目数量

vm.uma.linux_dma_object.keg.align

项目对齐掩码

vm.uma.linux_dma_object.keg.ipers

每个 slab 可用的项目数

vm.uma.linux_dma_object.keg.ppera

每个 slab 分配的页数

vm.uma.linux_dma_object.keg.rsize

带有对齐的实际对象大小

vm.uma.linux_dma_object.keg.name

Keg 名称

vm.uma.linux_dma_object.bucket_size_max

最大允许的每 CPU 缓存大小

vm.uma.linux_dma_object.bucket_size

期望的每 CPU 缓存大小

vm.uma.linux_dma_object.flags

分配器配置标志

vm.uma.linux_dma_object.size

分配大小

vm.uma.linux_dma_pctrie

vm.uma.linux_dma_pctrie.stats

vm.uma.linux_dma_pctrie.stats.xdomain

从错误域调用的空闲调用

vm.uma.linux_dma_pctrie.stats.fails

分配失败的数量

vm.uma.linux_dma_pctrie.stats.frees

总共的空闲调用

vm.uma.linux_dma_pctrie.stats.allocs

总共的分配调用

vm.uma.linux_dma_pctrie.stats.current

当前分配的项目数量

vm.uma.linux_dma_pctrie.domain

vm.uma.linux_dma_pctrie.domain.0

vm.uma.linux_dma_pctrie.domain.0.timin

自零以来的长时间最小项目计数时间

vm.uma.linux_dma_pctrie.domain.0.limin

长时间最小项目计数

vm.uma.linux_dma_pctrie.domain.0.wss

工作集大小

vm.uma.linux_dma_pctrie.domain.0.bimin

此批次中的最小项目计数

vm.uma.linux_dma_pctrie.domain.0.imin

此时期的最小项目计数

vm.uma.linux_dma_pctrie.domain.0.imax

此时期的最大项目计数

vm.uma.linux_dma_pctrie.domain.0.nitems

此域中的项目数量

vm.uma.linux_dma_pctrie.limit

vm.uma.linux_dma_pctrie.limit.bucket_max

每个域的桶缓存中的最大项目数

vm.uma.linux_dma_pctrie.limit.sleeps

总区限制休眠

vm.uma.linux_dma_pctrie.limit.sleepers

在限制处休眠的线程数

vm.uma.linux_dma_pctrie.limit.max_items

最大分配和缓存项目数

vm.uma.linux_dma_pctrie.limit.items

如果设置了限制,则为当前分配的项目数

vm.uma.linux_dma_pctrie.keg

vm.uma.linux_dma_pctrie.keg.domain

vm.uma.linux_dma_pctrie.keg.domain.0

vm.uma.linux_dma_pctrie.keg.domain.0.free_slabs

未使用的 slabs

vm.uma.linux_dma_pctrie.keg.domain.0.free_items

在 slab 层中的空闲项目

vm.uma.linux_dma_pctrie.keg.domain.0.pages

从 VM 分配的总页数

vm.uma.linux_dma_pctrie.keg.efficiency

Slab 利用率(100 - 内部碎片化%)

vm.uma.linux_dma_pctrie.keg.reserve

预留项目数量

vm.uma.linux_dma_pctrie.keg.align

项目对齐掩码

vm.uma.linux_dma_pctrie.keg.ipers

每个 slab 可用的项目数

vm.uma.linux_dma_pctrie.keg.ppera

每个 slab 分配的页数

vm.uma.linux_dma_pctrie.keg.rsize

带有对齐的实际对象大小

vm.uma.linux_dma_pctrie.keg.name

Keg 名称

vm.uma.linux_dma_pctrie.bucket_size_max

最大允许的每 CPU 缓存大小

vm.uma.linux_dma_pctrie.bucket_size

期望的每 CPU 缓存大小

vm.uma.linux_dma_pctrie.flags

分配器配置标志

vm.uma.linux_dma_pctrie.size

分配大小

vfs.nfsd.linux42server

启用 Linux 风格 NFSv4.2 服务器(非 RFC 兼容)

vfs.nfsd.flexlinuxhack

对于 Linux 客户端,绕过 Flex File Layout 错误

net.netlink.debug.nl_linux_debug_level

调试级别

hw.snd.compat_linux_mmap

Linux mmap (内存映射)兼容性(-1=强制禁用 0=自动 1=强制启用)

security.jail.param.linux

Jail Linux 参数

security.jail.param.linux.oss_version

Jail Linux OSS 版本

security.jail.param.linux.osrelease

Jail Linux 内核版本

security.jail.param.linux.osname

Jail Linux 内核 OS 名称

security.jail.param.linux.

Jail Linux 参数

compat.linux32

32 位 Linux 兼容层

compat.linux32.emulate_i386

兼容真实的 i386

compat.linux32.maxvmem

compat.linux32.maxssiz

compat.linux32.maxdsiz

compat.linux

Linux 模式

compat.linux.use_real_ifnames

使用 FreeBSD 接口名称而不是生成 ethN 别名

compat.linux.emul_path

Linux 运行时环境路径

compat.linux.oss_version

Linux OSS 版本

compat.linux.osrelease

Linux 内核版本

compat.linux.osname

Linux 内核 OS 名称

compat.linux.setid_allowed

允许在执行 Linux 二进制文件时设置 setuid/setgid

compat.linux.map_sched_prio

将调度程序优先级映射到 Linux 优先级(不符合 POSIX 标准)

compat.linux.preserve_vstatus

保留 VSTATUS termios(4) 参数

compat.linux.ignore_ip_recverr

忽略启用 IP_RECVERR

compat.linux.dummy_rlimits

返回不支持的 Linux 特定 rlimits 的虚拟值

compat.linux.default_stacksize

默认软堆栈大小资源限制,或-1 表示无限制

compat.linux.default_openfiles

默认软打开文件资源限制,或-1 表示无限制

compat.linux.debug

记录来自 linux(4) 的警告;或 0 以禁用

compat.linuxkpi

LinuxKPI 参数

compat.linuxkpi.skb

LinuxKPI skbuff

compat.linuxkpi.skb.mem_limit

SKB 内存限制:0=无限制,1=32 位,2=36 位,其他=未定义(目前为 32 位)

compat.linuxkpi.lkpi_pci_nseg1_fail

单段 busdma 映射失败次数

compat.linuxkpi.task_struct_reserve

保留用于不可休眠分配的 struct task 和 struct mm 的数量

compat.linuxkpi.net_ratelimit

限制每秒发送的 LinuxKPI net 消息的数量

compat.linuxkpi.warn_dump_stack

设置以启用 WARN_ON() 的堆栈跟踪。清除以禁用。

compat.linuxkpi.debug

设置以启用 pr_debug() 打印。清除以禁用。

最后更新于