第30.3节 Linux 兼容层——基于 Ubuntu/Debian
Ubuntu 兼容层

以下教程仅在 FreeBSD 13.1-release 测试通过。构建的是 Ubuntu 22.04 LTS(18.04\20.04 亦可)。兼容层使用技术实际上是 Linux jail,并非 chroot。
类似的方法可以构建 Debian 兼容层。
需要先配置好原生的 CentOS 兼容层。
更多其他系统请看/usr/local/share/debootstrap/scripts/
开始构建
# sysrc linux_enable="YES"
# sysrc kld_list+="linux linux64"
# kldload linux64
# service linux start
# sysrc dbus_enable="YES" #一般桌面已经配置
# service dbus start #一般桌面已经配置
# pkg install debootstrap
# chmod 0755 /usr/local/sbin/debootstrap # 见 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=268205
# debootstrap jammy /compat/ubuntu http://mirrors.ustc.edu.cn/ubuntu/
# reboot
挂载文件系统
将 nullfs_load="YES"
写入 /boot/loader.conf
。
将以下行写入 /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 -al
如果提示没有 home 文件夹,请新建之:
# mkdir /compat/ubuntu/home
重启:
# reboot
进入 Ubuntu 兼容层
首先 chroot 进去 Ubuntu,移除会报错的软件:
# chroot /compat/ubuntu /bin/bash
# apt remove rsyslog # 此时已经位于 Ubuntu 兼容层了。
换源
在卸载 rsyslog 之后,换源,由于 SSL 证书没有更新,所以还不能用 https 源:
# ee /compat/ubuntu/etc/apt/sources.list #此时处于 FreeBSD 系统!因为 Ubuntu 兼容层还没有文本编辑器。
写入:
deb http://mirrors.ustc.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
进入 Ubuntu 兼容层,开始更新系统,安装常用软件:
# LANG=C #设定字符集,防止错误
# apt update && apt upgrade && apt install nano wget # 此时已经位于 Ubuntu 兼容层了。
安装 Windows 11 字体【可选。自制包,打包同时兼容与低版本 Ubuntu】
# apt install git
# git clone https://github.com/ykla/ttf-mswin11-zh-deb
# cd ttf-mswin11-zh-deb
# dpkg -i ttf-ms-win11-*.deb
运行 X11 软件
# xhost +local:#此时处于 FreeBSD 系统!
不知道程序的命令行启动命令是什么?
请按以下方法依次查找(以 gedit
为例):
- 直接执行软件包名
# gedit
; whereis 软件包名
,定位后执行。whereis gedit
;- 通过软件图标定位,找到路径
/usr/share/applications
,根据软件包名找到软件,用文本编辑器(如ee
、nano
)打开。(软件图标本质上是一个文本文件,不是软连接或者图片),找到程序运行的命令复制到终端运行即可; - 通过
find
命令全局查找# find / —name 软件包名
——# find / —name gedit
。
如何查找软件?
#apt search --names-only XXX
把 XXX 换成想要搜索的软件名即可。
缺失 .so 文件
- 首先看看缺失哪些 .so 文件,一般不会只缺失一个。
[email protected]:/# ldd /usr/bin/qq
linux_vdso.so.1 (0x00007ffffffff000)
libffmpeg.so => not found
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x0000000801061000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x0000000801066000)
…………………………以下省略……………………………………
可以看到 libffmpeg.so => not found
,缺“libffmpeg.so”。
- 安装工具
# apt install apt-file
# apt-file update
- 查看
libffmpeg.so
属于哪个包:
[email protected]:/# apt-file search libffmpeg.so
qmmp: /usr/lib/qmmp/plugins/Input/libffmpeg.so
webcamoid-plugins: /usr/lib/x86_64-linux-gnu/avkys/submodules/MultiSink/libffmpeg.so
webcamoid-plugins: /usr/lib/x86_64-linux-gnu/avkys/submodules/MultiSrc/libffmpeg.so
webcamoid-plugins: /usr/lib/x86_64-linux-gnu/avkys/submodules/VideoCapture/libffmpeg.so
[email protected]:/#
可以看到多个包都提供了这个 so 文件,随便安装一个:
# apt install webcamoid-plugins
- 按照上述路径复制文件,并刷新 ldd 缓存:
# cp /usr/lib/x86_64-linux-gnu/avkys/submodules/MultiSink/libffmpeg.so /usr/lib #复制到系统的 lib 中
# ldconfig
- 查看:
[email protected]:/# ldd /usr/bin/qq
linux_vdso.so.1 (0x00007ffffffff000)
libffmpeg.so => /lib/libffmpeg.so (0x0000000801063000)
…………………………以下省略……………………………………
示例:运行 Chrome
# 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 兼容层了。
Systemd 不可用,但可以用
server xxx start
。导入过 https://github.com/zq1997/deepin-wine 源以安装 deepin-qq,deepin-wechat 等软件,但都提示
段错误
。所有 Wine 程序都无法正常运行。如果你能解决这个问题,请提出 issue 或者 pull。