21.4 Arch Linux 兼容层(基于 Arch Linux bootstrap)
注意
在完成兼容层构建并执行 chroot 进入环境后,终端界面可能看似处于无响应状态;这一现象的实际原因是 bash 进程未产生任何输出,但该进程仍然可以正常接收输入并执行命令。
即使将默认 shell 切换至 zsh,该现象仍会持续存在,且 TTY 终端会报告如下错误信息:linux: jid 0 pid 1154 (bash): linux_ioctl_fallback fd=0, cmd=0x802c542a ('T',42) is not implemented。
根据 FreeBSD 源代码仓库中的相关提交记录 linux: support termios2 ioctls,该 bug 已在 FreeBSD 15.0-STABLE 版本中得到修复。
视频教程:07-FreeBSD-Arch Linux 兼容层脚本使用说明


Arch Linux 兼容层看起来占用的资源略高于 Ubuntu 兼容层,这是因为系统中正在运行谷歌 Chrome 浏览器。
构建基本系统
构建 Arch Linux 兼容层需要先处理一些必要的服务项和设置。
处理所需服务项
Linux 服务项
D-Bus
通常桌面环境已经配置了 D-Bus 服务,如果未安装 D-Bus,请自行安装。
调整 Linux 兼容层默认内核版本
对于滚动发行版,Linux 兼容层的默认内核版本通常较低。若直接构建,Arch Linux 兼容层在 chroot 时会报错 FATAL: kernel too old。因此,需要将 Linux 兼容层的内核版本调整为 6.12.63(或其他较高版本)。
查看当前 Linux 兼容层的内核版本:
注意
你必须先启动
linux服务才能查看当前的 Linux 内核版本。
将其调整到较新的版本号(参见 The Linux Kernel Archives 可获得所需版本号):
放置自举系统
--strip-components=1 即在解压 archlinux-bootstrap-x86_64.tar.zst 文件时去掉外层路径 root.x86_64,直接解压到指定路径中。
挂载文件系统
将 nullfs_load="YES" 写入 /boot/loader.conf(如需立刻生效,可使用 kldload nullfs)。
将以下内容添加到 /etc/fstab 文件中:
加入后的 /etc/fstab 示例(请勿复制粘贴下方代码):
警告
请勿看错行、照抄上面的示例,否则你将需要进入急救模式!
检查挂载过程中是否有报错:
挂载 /etc/fstab 中所有未挂载的文件系统。
基本配置
初始化 pacman 密钥环
换源
由于新安装的 Arch 没有任何文本编辑器,所以我们需要在 FreeBSD 中编辑相关文件,设置 Arch Linux pacman 使用清华大学镜像源:
启用 DisableSandbox
我们需要为 pacman 启用 DisableSandbox,否则会报错 error: restricting filesystem access failed because landlock is not supported by the kernel!,因为 FreeBSD 未实现此沙箱。
在 pacman.conf 文件中取消 DisableSandbox 选项的注释:
检查是否启用成功,在 pacman.conf 中查找 DisableSandbox 所在行及行号:
使用 pacman 安装基本系统、开发工具、文本编辑器 nano、AUR 助手 yay 以及文泉驿字体 wqy-zenhei:
参考文献
pacman.conf(5) 指出“在 Linux 系统上,禁用为下载文件进程应用默认的 sandbox。当因当前 Linux 内核不支持该特性而导致下载文件时出现 landlock 相关失败时,这会很有用。” 该文档系统说明 pacman 配置项 DisableSandbox 的用途,为本章节配置提供官方技术依据。
archlinuxcn 源配置
配置 Arch Linux CN 仓库使用清华大学镜像:
安装 Arch Linux CN 仓库密钥环:
技巧
在
==> Locally signing trusted keys in keyring...这一步可能需要十分钟或更长时间。请耐心等待。
由于 yay 及其他用于安装 AUR 的软件禁止以 root 用户直接操作,因此需要在 chroot 中创建一个具有普通权限的新用户(经测试,FreeBSD 中现有普通用户不可用)。
创建用户 test,并加入 wheel 组,同时创建用户主目录:
使用 nano 编辑 sudoers 文件,配置用户权限(若有红色警告请无视之):
删除 # %wheel ALL=(ALL) ALL 前的注释符号 #。
删除 # %sudo ALL=(ALL:ALL) ALL 前的注释符号 #。
卸载 fakeroot 更改为 fakeroot-tcp,否则无法使用 AUR。
该 Bug 见 Problem with fakeroot and qemu 。
使用 pacman 安装 fakeroot-tcp 工具:
技巧
如果为用户
test设置了密码后仍提示密码错误,需要新开一个终端,执行reboot重启 FreeBSD,然后继续操作。
区域设置
提示
如果不进行此设置,Arch Linux 的图形化程序将无法使用中文输入法。
编辑 /etc/locale.gen,将 zh_CN.UTF-8 UTF-8 前面的注释 # 删掉。
生成系统本地化语言环境:
Shell 脚本
脚本内容如下:
参考文献
linux --Linux ABI support 该文档详细介绍 FreeBSD Linux 兼容层的技术原理与配置方法。
从现有 Linux 发行版安装 Arch Linux 该文档提供从现有系统安装 Arch Linux 的标准流程指引。
课后习题
尝试在 FreeBSD 14.x 上复现 Arch Linux 兼容层的 termios2 ioctl 问题,对比 FreeBSD 15.x 的修复方案,分析该 bug 产生的原因。
在 Arch Linux 兼容层中,保持
DisableSandbox启用或尝试在 FreeBSD 内核中实现 landlock,实现 pacman 的沙箱机制。分析为什么必须在兼容层内创建新用户才能使用 yay,而不能直接使用 FreeBSD 的现有用户,优化这一机制。
最后更新于