|
Опубликован проект BSDun, развивающий модуль для ядра Linux, позволяющий распознавать, загружать и запускать в Linux немодифицированные исполняемые файлы в формате ELF, собранные для FreeBSD. Для запуска применяется эмулируемое окружение FreeBSD, размещаемое в каталоге /compat/freebsd. В целом проект является полной противоположностью FreeBSD Linuxulator. Код распространяется под лицензией GPLv2+ и написан с использованием AI-ассистента Claude Code.
При помощи BSDun удалось успешно запустить в Linux многие приложения из пакетов FreeBSD, среди которых pkg, nginx, mc, ping, xeyes, xfce4-panel, Thunar, xfce4-terminal, Libreoffice, Midori, Epiphany, Chromium и VScode. Для запуска Chromium и VScode требуется отключение sandbox-изоляции и ограничение размера видеопамяти при помощи опций "--no-sandbox --force-gpu-mem-available-mb=1024".
Модуль не претендует на включение в основной состав ядра, поскольку с момента удаления ABI Solaris архитектура ядра Linux не допускает включения иных обработчиков исполняемых файлов (OS Personalities) и предусматривает наличие только одной таблицы системных вызовов. Для обхода этой проблемы в BSDun был задействован механизм kprobe, перехватывающий все системные вызовы.
При помощи kprobe cистемные вызовы FreeBSD отделялись от системных вызовов Linux и заворачивались в отдельную таблицу. Одна часть системных вызовов FreeBSD напрямую привязывалась к системным вызовам Linux, для другой выполнялась переупаковка структуры параметров и результата, третья заменялась заглушками (например, связанные с Capcicum), а четвёртая реализовывалась на основе внутренних структур ядра Linux.
Для реализации механизма kevent/kqueue поверх epoll() отдельно была применена модификация компонентов в пространстве пользователя, автоматически осуществляемая при загрузке каждого исполняемого файла FreeBSD.
В общей сложности реализовано около 250 системных вызовов. Также реализованы SystemV IPC, сетевые функции, futex-ы, sysctl MIB, prctl, таймеры и ioctl. Для разграничения файловых систем использовано chroot-окружение на стороне Linux (в процессе экспериментов без chroot автор выполнив "pkg install ..." перезаписал содержимое /usr/local/* в Linux). Тем не менее, некоторые утилиты все ещё могут работать без chroot.
Предложенный модуль может применяться для разработки, сборки и портирования ПО для FreeBSD без использования виртуальных машин. Краткая инструкция по использованию:
make
make load
./bsdun-freebsd-root-resetup.sh
./bsdun-freebsd-enter.sh
uname -a
FreeBSD host 16.0-CURRENT FreeBSD 16.0-CURRENT (bsdun) amd64
|