第 21.5 节 Linux 兼容层——基于 archlinux-pacman

待补充

  • 使用 AUR Helper 开启 AUR 包的安装和管理

  • 简要解析一下 FreeBSD Linuxulator 路径翻译过程当中存在的一些 magic

  • 以及我们应该如何利用这一机制来提高生产力

Arch Linux 兼容层安装步骤

  1. 切换至 latest 源并使用 pkg 命令安装 archlinux-pacmanarchlinux-keyring 软件包

# ee /usr/local/etc/pkg/repos/FreeBSD.conf
FreeBSD: { url: "https://mirrors.ustc.edu.cn/freebsd-pkg/${ABI}/latest" }
# pkg update && pkg install archlinux-pacman archlinux-keyring
  1. 编辑 /usr/local/etc/pacman.conf 文件加入 Arch Linux 的软件仓库

# ee /usr/local/etc/pacman.conf
[core]
Server = https://mirrors.ustc.edu.cn/archlinux/$repo/os/x86_64

[extra]
Server = https://mirrors.ustc.edu.cn/archlinux/$repo/os/x86_64
  1. 创建软链接将 /compat/linux 指向 /compat/archlinux 目录并启动 linux 服务

# ln -s archlinux /compat/linux
# service linux enable && service linux start

这样做的好处在于你不需要通过手动编辑 FreeBSD 层的 /etc/fstab 文件来实现 Linux 文件系统的自动挂载,也不需要配置 compat.linux.emul_path 选项

即使是在 /etc/sysctl.conf 文件里设置了 compat.linux.emul_path ,也会因为 linux 这个服务的启动时机要早于 /etc/sysctl.conf 里面的设置被加载的时机,从而导致重启后各个 Linux 文件系统还是去了 /compat/linux 目录下。然后必须在系统重启完毕后手动重启 linux 服务才能使 compat.linux.emul_path 设置生效

因此直接做软链接是事实上最简单、有效的

  1. 更新 pacman 源并安装 Arch Linux 的 C/C++ 运行时库

# pacman -Sy glibc gcc-libs
  1. 将 FreeBSD 层的 /etc/resolv.conf 文件绑定至 Arch Linux 兼容层内

# mount -t nullfs -o ro /etc/resolv.conf /compat/archlinux/etc/resolv.conf

跳过这一步会导致 Linux 应用程序无法正常执行 DNS 解析,以至于 Linux 应用程序无法上网

  1. 将 FreeBSD 层的 /etc/passwd 文件和 /etc/group 文件绑定至 Arch Linux 兼容层内

# mount -t nullfs -o ro /etc/passwd /compat/archlinux/etc/passwd
# mount -t nullfs -o ro /etc/group  /compat/archlinux/etc/group

跳过这一步会导致 Linux 应用程序无法识别你在 FreeBSD 层的用户名,以至于部分 Linux 应用程序把你的用户名显示为 I have no name!

关于 Arch Linux 兼容层的使用

你可以把上面涉及到的所有绑定操作放到 FreeBSD 层的 /etc/fstab 中去

# ee /etc/fstab
/etc/resolv.conf  /compat/archlinux/etc/resolv.conf  nullfs  ro  0  0
/etc/passwd       /compat/archlinux/etc/passwd       nullfs  ro  0  0
/etc/group        /compat/archlinux/etc/group        nullfs  ro  0  0

去下载一些原本只支持 Linux 的应用程序,理论上这个时候你已经可以直接尝试在 FreeBSD 层运行了

这时候 FreeBSD 会自动调用 Arch Linux 兼容层里的 C/C++ 运行时库

将 Arch Linux 兼容层升级为完整的 chroot 环境

如果你相信自己确有必要将 Arch Linux 兼容层升级为完整的 chroot 环境,那么你可以在 FreeBSD 层用 pacman 将必要软件包予以补齐

# pacman -S base
# chroot /compat/archlinux bash

(chroot) # uname -srv
Linux 4.4.0 FreeBSD 13.2-RELEASE releng/13.2-n254617-525ecfdad597 GENERIC

最后更新于

FreeBSD 中文社区 2024