12.3.Linux 用户空间

Linux 软件正常工作所依赖的不只是 ABI。为了运行这样的 Linux 软件,必须首先安装 Linux 用户空间。

技巧

如果只是想运行一些已经包含在 Ports 中的软件, 可以通过软件包管理器来安装, pkg(8) 将自动设置所需的 Linux 用户空间。

例如,要安装 Sublime Text 4,以及它所依赖的所有 Linux 库,运行这个命令:

# pkg install linux-sublime-text4

12.3.1.从 FreeBSD 软件包安装 CentOS 基础系统

要安装 CentOS 用户空间,请执行以下命令:

# pkg install linux_base-c7

emulators/linux_base-c7 将衍生自 CentOS 7 的基本系统安装在 /compat/linux 路径下。

安装这个包后,通过执行下列命令查看 /compat/linux 路径下的内容来确认 CentOS 用户空间已经被成功安装:

# ls -l /compat/linux/

输出应该和下面类似:

total 30
lrwxr-xr-x   1 root  wheel    7 Apr 11  2018 bin -> usr/bin
drwxr-xr-x  13 root  wheel  512 Apr 11 21:10 dev
drwxr-xr-x  25 root  wheel   64 Apr 11 21:10 etc
lrwxr-xr-x   1 root  wheel    7 Apr 11  2018 lib -> usr/lib
lrwxr-xr-x   1 root  wheel    9 Apr 11  2018 lib64 -> usr/lib64
drwxr-xr-x   2 root  wheel    2 Apr 11 21:10 opt
dr-xr-xr-x   1 root  wheel    0 Apr 11 21:25 proc
lrwxr-xr-x   1 root  wheel    8 Feb 18 02:10 run -> /var/run
lrwxr-xr-x   1 root  wheel    8 Apr 11  2018 sbin -> usr/sbin
drwxr-xr-x   2 root  wheel    2 Apr 11 21:10 srv
dr-xr-xr-x   1 root  wheel    0 Apr 11 21:25 sys
drwxr-xr-x   8 root  wheel    9 Apr 11 21:10 usr
drwxr-xr-x  16 root  wheel   17 Apr 11 21:10 var

12.3.2.使用 debootstrap 构建 Debian/Ubuntu 基本系统

另一种提供 Linux 共享库的方法是使用 sysutils/debootstrap。这样做的好处是可以提供一个完整的 Debian 或 Ubuntu 发行版。

执行下列命令安装 debootstrap:

# pkg install debootstrap

debootstrap(8) 需要启用 linux(4) ABI 支持。启用后,执行以下命令在 /compat/ubuntu 路径下安装 Ubuntu 或 Debian:

# debootstrap focal /compat/ubuntu

注意

虽然从技术上来说可以安装到 /compat/linux 路径下,但是为了避免和基于 CentOS 的软件包发生冲突,不建议这样做。因此,应该从发行版或版本名称中导出目录名称,例如,/compat/ubuntu

输出应该和下面类似:

I: Retrieving InRelease
I: Checking Release signature
I: Valid Release signature (key id F6ECB3762474EDA9D21B7022871920D1991BC93C)
I: Retrieving Packages
I: Validating Packages
I: Resolving dependencies of required packages...
I: Resolving dependencies of base packages...
I: Checking component main on http://archive.ubuntu.com/ubuntu...
[...]
I: Configuring console-setup...
I: Configuring kbd...
I: Configuring ubuntu-minimal...
I: Configuring libc-bin...
I: Configuring ca-certificates...
I: Base system installed successfully.

然后在 /etc/fstab 中设置挂载。

技巧

如果家目录的内容会被共享,以及为了能够运行 X11 软件,/home/tmp 目录应该使用 nullfs(5) 挂载在 linux compat 区域用于回环。

下面的例子可以添加在 /etc/fstab 文件中:

# Device        Mountpoint              FStype          Options                      Dump    Pass#
devfs           /compat/ubuntu/dev      devfs           rw,late                      0       0
tmpfs           /compat/ubuntu/dev/shm  tmpfs           rw,late,size=1g,mode=1777    0       0
fdescfs         /compat/ubuntu/dev/fd   fdescfs         rw,late,linrdlnk             0       0
linprocfs       /compat/ubuntu/proc     linprocfs       rw,late                      0       0
linsysfs        /compat/ubuntu/sys      linsysfs        rw,late                      0       0
/tmp            /compat/ubuntu/tmp      nullfs          rw,late                      0       0
/home           /compat/ubuntu/home     nullfs          rw,late                      0       0

然后执行 mount(8)

# mount -al

要使用 chroot(8) 访问系统,请执行以下命令:

# chroot /compat/ubuntu /bin/bash

然后可以执行 uname(1) 来检查 Linux 环境:

# uname -s -r -m

输出应该和下面类似:

Linux 3.17.0 x86_64

进入 chroot 后,系统的表现与正常的 Ubuntu 安装一样。虽然 systemd 没有运行,但 service(8) 命令照常工作。

技巧

想要添加默认源中缺少的软件包库,请编辑 /compat/ubuntu/etc/apt/sources.list 文件。

对于 amd64 架构,可以使用下面的例子:

deb http://archive.ubuntu.com/ubuntu focal main universe restricted multiverse
deb http://security.ubuntu.com/ubuntu/ focal-security universe multiverse restricted main
deb http://archive.ubuntu.com/ubuntu focal-backports universe multiverse restricted main
deb http://archive.ubuntu.com/ubuntu focal-updates universe multiverse restricted main

对于 amd64 架构,另一个可以使用的例子:

deb http://ports.ubuntu.com/ubuntu-ports bionic main universe restricted multiverse