FreeBSD 中文社区 2025 第二季度问卷调查
FreeBSD 中文社区(CFC)
VitePress 镜像站QQ 群 787969044视频教程Ⅰ视频教程Ⅱ
  • FreeBSD 从入门到追忆
  • 中文期刊
  • 状态报告
  • 发行说明
  • 手册
  • 网络文章集锦
  • 笔记本支持报告
  • Port 开发者手册
  • 架构手册
  • 开发者手册
  • 中文 man 手册
  • 文章与书籍
  • UNIX 四分之一世纪
  • Unix 痛恨者手册
  • FreeBSD 从入门到追忆(第三版:草稿)
  • 编辑日志
  • 贡献指南与开放任务
  • 目录
  • 前言
    • 致读者
    • 致谢
    • 初版序言:好望角与塔吊
    • 再版序言:回到复制粘贴,面向教程本身
    • 三版序言:且有大觉而后知此其大梦也(草稿)
    • 本书的组织结构
    • 本书中使用的一些约定
  • 第 1 章 FreeBSD 初见
    • 第 1.1 节 操作系统的历程:UNIX、BSD、Linux 的演化
    • 第 1.2 节 欢迎来到 FreeBSD
    • 第 1.3 节 关于 FreeBSD 项目
    • 第 1.4 节 George Berkeley(乔治·贝克莱)与 BSD 命名的文化背景
    • 第 1.5 节 加州大学伯克利分校与“Fiat Lux”(要有光)
  • 第 2 章 安装 FreeBSD
    • 第 2.1 节 安装前的准备工作
    • 第 2.2 节 使用 bsdinstall 开始安装
    • 第 2.3 节 键盘布局和主机名
    • 第 2.4 节 选择安装组件
    • 第 2.5 节 分配磁盘空间
    • 第 2.6 节 设置 root 密码
    • 第 2.7 节 网络设置
    • 第 2.8 节 时区、服务、安全、固件和账户
    • 第 2.9 节 完成安装
    • 第 2.10 节 故障排除
  • 第 3 章 FreeBSD 基础
    • 第 3.1 节 Windows 用户迁移指南
    • 第 3.2 节 Linux 用户迁移指南
    • 第 3.3 节 虚拟控制台和终端
    • 第 3.4 节 认识 shell
    • 第 3.5 节 命令行基础
    • 第 3.6 节 文本编辑器
    • 第 3.7 节 用户和基本账户管理
    • 第 3.8 节 权限
    • 第 3.9 节 sudo 与 doas
    • 第 3.10 节 文件系统的挂载与卸载
    • 第 3.11 节 磁盘结构
    • 第 3.12 节 目录结构
  • 第 4 章 软件管理与系统升级
    • 第 4.1 节 FreeBSD 镜像站现状
    • 第 4.2 节 更换 FreeBSD 软件源
    • 第 4.3 节 gitup 的用法
    • 第 4.4 节 使用 pkg 管理二进制包
    • 第 4.5 节 使用 Ports 以源代码方式安装软件
    • 第 4.6 节 使用 DVD 安装软件
    • 第 4.7 节 使用 freebsd-update 更新 FreeBSD
    • 第 4.8 节 使用源代码更新 FreeBSD
    • 第 4.9 节 使用 pkgbase 更新 FreeBSD
  • 第 5 章 桌面环境
    • 第 5.1 节 Intel 与 AMD 显卡驱动
    • 第 5.2 节 NVIDIA 显卡驱动
    • 第 5.3 节 KDE6
    • 第 5.4 节 GNOME
    • 第 5.5 节 Mate
    • 第 5.6 节 Xfce
    • 第 5.7 节 Cinnamon
    • 第 5.8 节 Lumina
    • 第 5.9 节 LXQt
    • 第 5.10 节 Budgie
    • 第 5.11 节 CDE
    • 第 5.12 节 LXDE
    • 第 5.13 节 主题美化
    • 第 5.14 节 远程桌面
    • 第 5.15 节 启用 root 桌面登录
  • 第 6 章 本地化——i18n/L10n
    • 第 6.1 节 本地化环境变量
    • 第 6.2 节 Fcitx 输入法框架
    • 第 6.3 节 IBus 输入法框架
    • 第 6.4 节 五笔输入法
    • 第 6.5 节 网络浏览器
    • 第 6.6 节 QQ(Linux 版)
    • 第 6.7 节 更换字体
    • 第 6.8 节 金山 WPS(Linux 版)
    • 第 6.9 节 压缩与解压
    • 第 6.10 节 微信(Linux 版)
  • 第 7 章 多媒体与外部设备
    • 第 7.1 节 音频设备配置
    • 第 7.2 节 蓝牙
    • 第 7.3 节 打印机
    • 第 7.4 节 触摸板
    • 第 7.5 节 音频播放器
    • 第 7.6 节 视频播放器
    • 第 7.7 节 多媒体处理工具
  • 第 8 章 代理服务器
    • 第 8.1 节 HTTP 代理
    • 第 8.2 节 V2ray
    • 第 8.3 节 Mihomo(原 Clash)
    • 第 8.4 节 OpenVPN
  • 第 9 章 Jail
    • 第 9.1 节 配置 Jail
    • 第 9.2 节 更新 jail
    • 第 9.3 节 使用 Qjail 管理 Jail
    • 第 9.4 节 Linux Jail
  • 第 10 章 虚拟化与容器
    • 第 10.1 节 通过 BVCP 以网页管理 BHyve
    • 第 10.2 节 使用 bhyve 安装 Windows 11(vm-bhyve)
    • 第 10.3 节 Podman
    • 第 10.4 节 在 FreeBSD 上安装 VirtualBox
  • 第 11 章 FreeBSD 安装实践
    • 第 11.1 节 使用 Hyper-V 安装 FreeBSD
    • 第 11.2 节 使用 VMware Workstation Pro 安装 FreeBSD
    • 第 11.3 节 使用 Virtual Box 安装 FreeBSD
    • 第 11.4 节 手动安装双系统(先安装 FreeBSD)
    • 第 11.5 节 手动安装双系统(后安装 FreeBSD)
    • 第 11.6 节 基于 Apple M1 & Parallels Desktop 20 安装 FreeBSD
    • 第 11.7 节 基于 Apple M1 & VMware Fusion Pro 安装 FreeBSD
    • 第 11.8 节 使用 Qemu 安装 RISC-V FreeBSD(基于 x86 Windows)
    • 第 11.9 节 云服务器安装 FreeBSD(基于腾讯云轻量云)
    • 第 11.10 节 配置 rEFInd(双系统用)
  • 第 12 章 窗口管理器
    • 第 12.1 节 bspwm
    • 第 12.2 节 IceWM
    • 第 12.3 节 i3wm
    • 第 12.4 节 Hyprland
    • 第 12.5 节 Window Maker
    • 第 12.6 节 Fluxbox
  • 第 13 章 FreeBSD 系统管理
    • 第 13.1 节 引导界面与虚拟控制台
    • 第 13.2 节 管理 FreeBSD 中的服务
    • 第 13.3 节 bsdconfig 系统配置工具
    • 第 13.4 节 SSH 配置与相关工具
    • 第 13.5 节 单用户模式与密码重置
    • 第 13.6 节 Grub & UEFI 与 efibootmgr
  • 第 14 章 网络管理
    • 第 14.1 节 设置网络
    • 第 14.2 节 无线网络
    • 第 14.3 节 USB 网络共享(USB tethering)
    • 第 14.4 节 TCP 堆栈
  • 第 15 章 FreeBSD 防火墙
    • 第 15.1 节 Fail2Ban(基于 IPFW、PF、IPF)
    • 第 15.2 节 Packet Filter(PF)
    • 第 15.3 节 IPFilter(IPF)
    • 第 15.4 节 ipfirewall(IPFW)
  • 第 16 章 服务器
    • 第 16.1 节 FTP 服务器
    • 第 16.2 节 MinIO 对象存储服务
    • 第 16.3 节 Gitlab-EE
    • 第 16.4 节 时间服务
    • 第 16.5 节 WildFly
    • 第 16.6 节 Rsync 同步服务
    • 第 16.7 节 Samba 服务器
    • 第 16.8 节 NFS 服务器
    • 第 16.9 节 Webmin
  • 第 17 章 Web 服务器与监控平台
    • 第 17.1 节 Apache
    • 第 17.2 节 Nginx
    • 第 17.3 节 PHP 8.X
    • 第 17.4 节 Zabbix 监控(基于 PostgreSQL)
    • 第 17.5 节 NextCloud——基于 PostgreSQL
    • 第 17.6 节 Telegraf+InfluxDB+Grafana 监控平台
    • 第 17.7 节 AList
    • 第 17.8 节 Prometheus 监控部署
    • 第 17.9 节 Tomcat
    • 第 17.10 节 Caddy
    • 第 17.11 节 OnlyOffice(基于 PostgreSQL)
  • 第 18 章 嵌入式平台
    • 第 18.1 节 树莓派简介与配件选用
    • 第 18.2 节 树莓派安装 FreeBSD
    • 第 18.3 节 树莓派 FreeBSD 配置
    • 第 18.4 节 树莓派与 Linux 兼容层
    • 第 18.5 节 Radxa X4(x86)
  • 第 19 章 数据库管理
    • 第 19.1 节 PostgreSQL
    • 第 19.2 节 pgAdmin4
    • 第 19.3 节 MySQL 5.X
    • 第 19.4 节 MySQL 8.X
    • 第 19.5 节 MongoDB 8.0
  • 第 20 章 游戏、科学计算与专业工具
    • 第 20.1 节 游戏
    • 第 20.2 节 我的世界(Minecraft)
    • 第 20.3 节 科研与专业工具
  • 第 21 章 Linux 二进制兼容层
    • 第 21.1 节 Linux 兼容层实现
    • 第 21.2 节 RockyLinux 兼容层(FreeBSD Port)
    • 第 21.3 节 Ubuntu/Debian 兼容层
    • 第 21.4 节 ArchLinux 兼容层(基于 ArchLinux bootstrap)
    • 第 21.5 节 ArchLinux 兼容层(基于 archlinux-pacman)
    • 第 21.6 节 OpenSUSE 兼容层
    • 第 21.7 节 Gentoo Linux 兼容层
    • 第 21.8 节 Rocky Linux 兼容层
    • 第 21.9 节 Slackware Linux 兼容层
    • 第 21.10 节 Deepin 兼容层
    • 第 21.11 节 故障排除与未竟事宜
  • 第 22 章 开发生态与贡献社区
    • 第 22.1 节 如何报告 Bug
    • 第 22.2 节 如何开发一个 Port
    • 第 22.3 节 如何参与 FreeBSD 开发
    • 第 22.4 节 C/C++ 环境的配置
    • 第 22.5 节 Java 环境的配置
    • 第 22.6 节 QT 环境的配置
    • 第 22.7 节 Python 与 VS Code
    • 第 22.8 节 Rust/Go 环境的配置
    • 第 22.9 节 配置 Shell
    • 第 22.10 节 通过 IDA 7 调试 FreeBSD
    • 第 22.11 节 如何订阅 FreeBSD 的邮件列表
    • 第 22.12 节 code-server 和 clangd
    • 第 22.13 节 Node.js
    • 第 22.14 节 利用脚本自动生成 BSDlibc 库文本
  • 第 23 章 存储管理与文件系统
    • 第 23.1 节 自动挂载文件系统
    • 第 23.2 节 ZFS 文件系统
    • 第 23.3 节 磁盘扩容与分区调整
    • 第 23.4 节 Windows 文件系统
    • 第 23.5 节 Swap 交换分区的设置
    • 第 23.6 节 Linux 文件系统
  • 第 24 章 DragonFly BSD 入门
    • 第 24.1 节 DragonFly BSD 概述
    • 第 24.2 节 安装 DragonFly BSD
    • 第 24.3 节 配置 DragonFly BSD
  • 第 25 章 TwinCAT/BSD 入门
    • 第 25.1 节 TwinCAT/BSD 系统安装与基本配置
    • 第 25.2 节 TwinCAT/BSD 开发环境配置
  • 第 26 章 OpenBSD 入门
    • 第 26.1 节 OpenBSD 概述
    • 第 26.2 节 安装 OpenBSD
    • 第 26.3 节 配置 OpenBSD
    • 第 26.4 节 OpenBSD 包管理器
    • 第 26.5 节 桌面与其他软件
    • 第 26.6 节 在 RISC-V 开发板上安装 OpenBSD
    • 第 26.7 节 树莓派与 OpenBSD
  • 第 27 章 NetBSD 入门
    • 第 27.1 节 NetBSD 概述
    • 第 27.2 节 NetBSD 安装图解
    • 第 27.3 节 NetBSD 换源与包管理器
    • 第 27.4 节 桌面与中文环境常用软件
  • 附录 Ⅰ 计算机概论
    • 存储卡参数简介与测试
    • 总线接口与协议
    • 网络基础
    • 操作系统
    • MySQL 数据库
  • 附录 Ⅱ 工具与资源
    • 适用于 FreeBSD 的以太网卡、USB 以太网卡和 USB 无线网卡
    • BSD 许可证概览
    • FreeBSD 桌面发行版评述
  • 附录 Ⅲ 文学故事
    • 我与 FreeBSD 的故事
    • 两次告别
    • 小说:大教堂与集市
    • 小说:吾乡何处
    • 小说:你与暗
    • 诗歌选
    • 杂记
  • 附录 Ⅳ 参考文献与术语
    • 参考书目
    • 术语表
由 GitBook 提供支持
LogoLogo

FreeBSD 中文社区(CFC) 2025

在本页
  • 何为 Linuxulator
  • man 页面
  • 什么是 Linux 兼容层
  • 题外话:为什么使用 Linux 兼容层不是苦难哲学?
在GitHub上编辑
导出为 PDF
  1. 第 21 章 Linux 二进制兼容层

第 21.1 节 Linux 兼容层实现

注意

一个常见误解就是把 FreeBSD 的 Linux 兼容层当做虚拟机,认为这样做会降低软件的运行效率。实际情况是不仅不会慢,而且有些软件的运行速度还会比在 Linux 中更快,运行效率更高。因为他不是模拟器,也不是转译,而是 Linux ABI 实现。

https://cgit.freebsd.org/src/tree/sys/compat/linux/linux_file.c

从这里不难看出。做的事情只有一个:识别 Linux 系统调用,然后找到对应的 FreeBSD 系统调用实现。把原 Linux syscall 请求劫持到 FreeBSD syscall 的入口上面去。

何为 Linuxulator

既然要谈 FreeBSD 兼容 Linux 应用程序,那么一切都要从 Linuxluator 开始说起。Linuxulator 的含义是 Linux Emulator——很容易让人联想到这是 Linux 模拟器。然而 Linuxulator 并不是传统意义上的模拟器,其本身甚至都不是具有单独可执行文件的 FreeBSD 应用程序。Linuxulator 只是 FreeBSD 官方文档中对一个 FreeBSD 内核模块的通俗称呼,这个内核模块的本名叫 linux。

先自己看一下 linux 这个内核模块的 man 页面吧。

man 页面

$ man 4 linux

man 4 linux 的输出翻译如下:


LINUX(4) FreeBSD 内核接口手册 LINUX(4)

名称 linux – Linux ABI 支持

简介 要在启动时启用 Linux ABI,请在 rc.conf(5) 中添加以下行:

linux_enable="YES"

描述 Linux 内核模块提供了有限的 Linux ABI(应用二进制接口)兼容性,使得无需虚拟化和仿真即可运行许多未修改的 Linux 应用程序。提供的一些功能包括:

  • Linux 到原生系统调用的转换

  • Linux 特有的系统调用

  • Linux 进程的特殊信号处理

  • 路径转换机制

  • Linux 特有的虚拟文件系统

    路径转换机制使得 Linux 进程在查找文件路径时,会首先在 emul_path(默认为 /compat/linux)下查找,然后才是 /。例如,当一个 Linux 进程尝试打开 /etc/passwd 时,它会首先访问 /compat/linux/etc/passwd,如果兼容路径不存在,则回退到 /etc/passwd。此机制确保 Linux 进程加载的是 Linux 共享库,而非它们对应的 FreeBSD 版本,并且为某些其他文件和虚拟文件系统提供替代版本。

    要将 Linux 共享库和系统文件安装到 /compat/linux,可以使用 Port emulators/linux_base-c7 或包,或者从 sysutils/debootstrap 安装 debootstrap(8)。

    为避免在启动时挂载 Linux 特有的文件系统,可以在 rc.conf(5) 文件中添加以下行:

linux_mounts_enable="NO"

SYSCTL 变量 以下变量既可作为 sysctl(8) 变量,亦可作为 loader(8) 可调参数使用:

  • compat.linux.debug 启用调试消息。设置为 0 可静音。默认为 3。设置为 1 时打印调试消息,报告未实现的功能(仅一次)。设置为 2 时类似于 1,但也会打印已实现但未测试的功能的消息(仅一次)。设置为 3 及更高时,类似于 2,但没有消息频率限制。

  • compat.linux.default_openfiles Linux 应用程序的默认软打开文件资源限制。设置为 -1 即禁用该限制。默认为 1024。

  • compat.linux.emul_path Linux 运行时环境的路径。默认为 /compat/linux。

  • compat.linux.osname Linux 内核操作系统名称。默认为 "Linux"。

  • compat.linux.osrelease Linux 内核操作系统发布版本。不建议在非开发系统上修改此值,因为这可能会影响 Linux 程序的工作方式。已知某些版本的 GNU libc 会根据该值的不同使用不同的系统调用。

  • compat.linux.oss_version Linux 开放音频系统版本。默认为 198144。

  • compat.linux.preserve_vstatus 设置为 1 时,防止 Linux 应用程序重置 termios(4) 的 VSTATUS 设置。从用户角度来看,这使得 SIGINFO 对 Linux 可执行文件有效。默认为 1。

  • compat.linux.setid_allowed 启用处理新进程镜像文件的用户 ID 和组 ID 设置模式位(set-user-ID 和 set-group-ID)。设置为 0 时,新的 Linux 镜像始终使用发出 execve(2) 调用的程序的凭证,而忽略镜像文件的模式。因为 FreeBSD 没有完全仿真 Linux 环境,缺失的功能可能会导致安全漏洞。默认为 1。

    compat.linux32.emulate_i386 在 x86_64(amd64)环境中启用真实的 i386 Linuxulator 行为。例如,当设置为 0 时,即使 uname 是 i386 Linux 可执行文件,uname -m 也会返回 "x86_64"。当设置为 1 时,Linux i386 uname -m 会返回 "i686"。默认为 0。

文件/compat/linux Linux 运行时环境/compat/linux/dev 设备文件系统,参见 devfs(5)/compat/linux/dev/fd 文件描述符文件系统,挂载了 linrdlnk 选项,参见 fdescfs(5)/compat/linux/dev/shm 内存文件系统,参见 tmpfs(5)/compat/linux/proc Linux 进程文件系统,参见 linprocfs(5)/compat/linux/sys Linux 内核对象文件系统,参见 linsysfs(5)

参见brandelf(1), pty(4), elf(5), fdescfs(5), linprocfs(5), linsysfs(5),tmpfs(5)

历史 Linux ABI 支持首次出现在 FreeBSD 2.1 中。对 amd64 二进制文件的支持首次出现在 FreeBSD 10.3 中。对 arm64 二进制文件的支持首次出现在 FreeBSD 12.0 中。

BUG 某些 Linux 特有的系统调用和系统调用参数的支持仍然缺失。

FreeBSD 14.2-RELEASE 2022 年 1 月 9 日 FreeBSD 14.2-RELEASE


这是个什么概念呢?就是说 Linuxulator 既不是 WSL2 的套壳虚拟机,也不是 WINE 的解释执行。其原理是由 FreeBSD 内核识别并捕获 Linux 进程的系统调用请求,找到 FreeBSD 与之对应的系统调用实现,再用 FreeBSD 内核的系统调用实现来回应 Linux 进程的系统调用请求。

注意

Linuxulator 是用 FreeBSD 内核的系统调用实现来回应 Linux 进程的系统调用请求。

换句话说就是,借助 Linuxulator 这个内核模块,FreeBSD 内核可以把自己伪装成一个 Linux 内核,但实际上在运行 Linux 进程的依旧是 FreeBSD 内核,负责处理 Linux 系统调用的依旧是 FreeBSD 内核里的代码。并且站在 FreeBSD 内核的角度,通过 Linuxulator 运行的 Linux 进程和 FreeBSD 进程 无本质区别。Linux 进程就是 FreeBSD 进程。

什么是 Linux 兼容层

路径转换机制使 Linux 进程在 / 之前查找 emul_path(默认为 /compat/linux)下的文件路径。例如,当 Linux 进程试图打开 /etc/passwd 时,它将真正访问 /compat/linux/etc/passwd,除非后者不存在。这被用来确保 Linux 进程加载 Linux 共享库,而不是类似名字的 FreeBSD 对应库,同时也提供了某些其他文件和虚拟文件系统的替代版本。

由于本质上不存在真实的 Linux 内核,FreeBSD 所声明的 Linux 内核版本没有意义,喜欢的话可将版本定义成 255.255 都没关系。

但是请注意,不同的软件对内核版本有不同的要求,所暴露的接口也不一样。比如 Arch Linux 低了就 chroot 不进去,会报错 kernel too old。

题外话:为什么使用 Linux 兼容层不是苦难哲学?

开机就 kldload linux64、kldload linux 并不应该被责难和讽刺,殊不知荀子曾曰“君子生非异也,善假于物也”。使用 Linux 兼容层亦如此。这并没有什么荒唐可笑的地方,类似的技术如 Linux 上用 Wine/Crossover(乃至于 ReactOS);Windows 上的 Linux 兼容层和 Android 兼容层都很受欢迎。

上一页第 20.3 节 科研与专业工具下一页第 21.2 节 RockyLinux 兼容层(FreeBSD Port)

最后更新于10天前