# sysrc linux_enable="YES"
Глава 12. Двоичная совместимость с Linux
Этот перевод может быть устаревшим. Для того, чтобы помочь с переводом, пожалуйста, обратитесь к Сервер переводов FreeBSD.
Содержание
12.1. Обзор
FreeBSD предоставляет опциональную двоичную совместимость с Linux®, часто называемую Linuxulator, что позволяет пользователям устанавливать и запускать неизменённые Linux-бинарники. Это доступно для архитектур x86 (как 32, так и 64 бит) и AArch64. Некоторые специфичные для Linux функции операционной системы пока не поддерживаются; в основном это касается функциональности, связанной с оборудованием или управлением системой, такой как cgroups или пространства имён.
Прежде чем читать эту главу, вы должны:
Знать, как установить дополнительное стороннее программное обеспечение.
Прочитав эту главу, вы будете знать:
Как включить двоичную совместимость с Linux в системе FreeBSD.
Как установить дополнительные общие библиотеки Linux.
Как установить Linux-приложения в системе FreeBSD.
Как реализована совместимость с Linux в FreeBSD.
12.2. Настройка бинарной совместимости с Linux
По умолчанию бинарная совместимость с linux(4) не включена.
Чтобы включить ABI Linux при загрузке, выполните следующую команду:
После включения его можно запустить без перезагрузки, выполнив следующую команду:
# service linux startЭтого достаточно для работы статически связанных Linux-библиотек.
Сервис Linux загрузит необходимые модули ядра и смонтирует файловые системы, ожидаемые Linux-приложениями, в /compat/linux. Их можно запускать так же, как и родные FreeBSD-приложения; они ведут себя почти так же, как родные процессы, и их можно трассировать и отлаживать обычными способами.
Текущее содержимое /compat/linux можно проверить, выполнив следующую команду:
# ls -l /compat/linux/Вывод должен быть похож на следующий:
total 1 dr-xr-xr-x 13 root wheel 512 Apr 11 19:12 dev dr-xr-xr-x 1 root wheel 0 Apr 11 21:03 proc dr-xr-xr-x 1 root wheel 0 Apr 11 21:03 sys
12.3. Пользовательские окружения Linux
Программное обеспечение Linux требует не только ABI для работы. Для запуска программ Linux необходимо сначала установить пользовательское пространство Linux.
Если требуется только запустить какое-либо программное обеспечение, уже включённое в дерево портов, его можно установить через менеджер пакетов, и pkg(8) автоматически настроит необходимую пользовательскую среду Linux. Например, чтобы установить Sublime Text 4 вместе со всеми необходимыми библиотеками Linux, выполните следующую команду: |
12.3.1. Базовая система Rocky Linux из пакетов FreeBSD
Для установки пользовательской среды Rocky Linux 9 выполните следующую команду:
# pkg install linux_base-rl9Пакет emulators/linux_base-rl9 разместит базовую систему, основанную на Rocky Linux 9, в /compat/linux.
После установки пакета содержимое /compat/linux можно проверить, выполнив следующую команду, чтобы убедиться, что пользовательская среда Rocky Linux установлена:
# ls -l /compat/linux/Вывод должен быть похож на следующий:
total 36 drwxr-xr-x 2 root wheel 512 Oct 9 17:28 afs lrwxr-xr-x 1 root wheel 7 May 16 2022 bin -> usr/bin drwxr-xr-x 3 root wheel 512 Oct 9 17:28 dev drwxr-xr-x 24 root wheel 1536 Oct 9 17:28 etc lrwxr-xr-x 1 root wheel 7 May 16 2022 lib -> usr/lib lrwxr-xr-x 1 root wheel 9 May 16 2022 lib64 -> usr/lib64 drwxr-xr-x 2 root wheel 512 Oct 9 17:28 opt drwxr-xr-x 2 root wheel 512 Oct 9 17:28 proc lrwxr-xr-x 1 root wheel 8 Oct 1 03:11 run -> /var/run lrwxr-xr-x 1 root wheel 8 May 16 2022 sbin -> usr/sbin drwxr-xr-x 2 root wheel 512 Oct 9 17:28 srv drwxr-xr-x 2 root wheel 512 Oct 9 17:28 sys drwxr-xr-x 8 root wheel 512 Oct 9 17:28 usr drwxr-xr-x 16 root wheel 512 Oct 9 17:28 var
12.3.2. Базовая система CentOS из пакетов FreeBSD
Пакет emulators/linux_base-c7 устарел после прекращения поддержки вышестоящего проекта. Это означает, что emulators/linux_base-c7 больше не будет получать обновления безопасности. Рекомендуется использовать базовую систему Rocky Linux, если не требуется совместимость с 32-битными системами. |
Для установки пользовательской среды 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.3. Debian / Ubuntu Базовая система с debootstrap
Альтернативный способ предоставления общих библиотек Linux — использование sysutils/debootstrap. Это имеет преимущество в виде предоставления полного дистрибутива Debian или Ubuntu.
Чтобы установить debootstrap, выполните следующую команду:
# pkg install debootstrapДля работы debootstrap(8) требуется включённый linux(4) ABI. После его активации выполните следующую команду для установки Ubuntu или Debian в /compat/ubuntu:
# 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 следует подключить в области совместимости linux с использованием nullfs(5) для loopback (обратной петли). Следующий пример можно добавить в /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): |
Для доступа к системе с использованием 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 Для arm64 можно использовать следующий пример: deb http://ports.ubuntu.com/ubuntu-ports bionic main universe restricted multiverse |
12.4. Сложные темы
Некоторые приложения требуют подключения определенных файловых систем.
Обычно это обрабатывается скриптом /etc/rc.d/linux, но можно отключить при загрузке, выполнив следующую команду:
sysrc linux_mounts_enable="NO"
Файловые системы, смонтированные скриптом rc, не будут работать для Linux-процессов внутри chroot или клетки. При необходимости настройте их в /etc/fstab:
devfs /compat/linux/dev devfs rw,late 0 0 tmpfs /compat/linux/dev/shm tmpfs rw,late,size=1g,mode=1777 0 0 fdescfs /compat/linux/dev/fd fdescfs rw,late,linrdlnk 0 0 linprocfs /compat/linux/proc linprocfs rw,late 0 0 linsysfs /compat/linux/sys linsysfs rw,late 0 0
Поскольку уровень двоичной совместимости с Linux получил поддержку выполнения как 32-, так и 64-битных бинарных файлов Linux, стало невозможно статически линковать функциональность эмуляции в пользовательское ядро.
12.4.1. Установка дополнительных библиотек вручную
Для подкаталогов базовой системы, созданных с помощью debootstrap(8), используйте приведенные выше инструкции. |
Если приложение Linux жалуется на отсутствие общих библиотек после настройки совместимости с двоичными файлами Linux, определите, какие общие библиотеки нужны двоичному файлу Linux, и установите их вручную.
С системы Linux с той же архитектурой CPU можно использовать ldd для определения того, какие разделяемые библиотеки необходимы приложению.
Например, чтобы проверить, какие разделяемые библиотеки требуются для linuxdoom, выполните следующую команду в системе Linux, где установлен Doom:
% ldd linuxdoomВывод должен быть похож на следующий:
libXt.so.3 (DLL Jump 3.1) => /usr/X11/lib/libXt.so.3.1.0 libX11.so.3 (DLL Jump 3.1) => /usr/X11/lib/libX11.so.3.1.0 libc.so.4 (DLL Jump 4.5pl26) => /lib/libc.so.4.6.29
Затем скопируйте все файлы из последнего столбца вывода с системы Linux в /compat/linux на системе FreeBSD. После копирования создайте символические ссылки на имена из первого столбца.
Этот пример приведёт к следующим файлам в системе FreeBSD:
/compat/linux/usr/X11/lib/libXt.so.3.1.0 /compat/linux/usr/X11/lib/libXt.so.3 -> libXt.so.3.1.0 /compat/linux/usr/X11/lib/libX11.so.3.1.0 /compat/linux/usr/X11/lib/libX11.so.3 -> libX11.so.3.1.0 /compat/linux/lib/libc.so.4.6.29 /compat/linux/lib/libc.so.4 -> libc.so.4.6.29
Если уже существует общая библиотека Linux с соответствующим номером старшей версии (первый столбец вывода ldd), её не нужно копировать в файл, указанный в последнем столбце, так как существующая библиотека должна работать. Однако рекомендуется скопировать общую библиотеку, если она является более новой версией. Старую версию можно удалить, при условии что символическая ссылка указывает на новую.
Например, эти библиотеки уже существуют в системе FreeBSD:
/compat/linux/lib/libc.so.4.6.27 /compat/linux/lib/libc.so.4 -> libc.so.4.6.27
и ldd показывает, что для бинарного файла требуется более новая версия:
libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29
Поскольку существующая библиотека устарела всего на одну или две версии в последней цифре, программа должна по-прежнему работать с немного более старой версией. Однако можно безопасно заменить существующий libc.so на более новую версию:
/compat/linux/lib/libc.so.4.6.29 /compat/linux/lib/libc.so.4 -> libc.so.4.6.29
Как правило, необходимость искать разделяемые библиотеки, от которых зависят Linux-бинарники, возникает только в первые несколько раз при установке Linux-программ на FreeBSD. Через некоторое время в системе накопится достаточный набор разделяемых библиотек Linux, что позволит запускать вновь устанавливаемые Linux-бинарники без дополнительных усилий.
12.4.2. Маркировка ELF-бинарников Linux
Ядро FreeBSD использует несколько методов для определения, является ли запускаемый двоичный файл Linux-программой: оно проверяет бренд в заголовке ELF-файла, ищет известные пути к ELF-интерпретаторам и проверяет ELF-заметки; наконец, по умолчанию небрендированные ELF-исполняемые файлы в любом случае считаются Linux-программами.
Если все эти методы не сработают, попытка выполнить двоичный файл может привести к сообщению об ошибке:
% ./my-linux-elf-binaryВывод должен быть похож на следующий:
ELF binary type not known Abort
Чтобы помочь ядру FreeBSD отличить ELF-программу FreeBSD от Linux-программы, используйте brandelf(1):
% brandelf -t Linux my-linux-elf-binary12.4.3. Установка приложения на основе Linux RPM
Для установки приложения на основе RPM в Linux сначала установите пакет archivers/rpm4 или порт. После установки пользователь root может использовать следующую команду для установки файла .rpm:
# cd /compat/linux
# rpm2cpio < /path/to/linux.archive.rpm | cpio -idПри необходимости выполните brandelf для установленных ELF-бинарников. Заметим, что это сделает невозможной чистую деинсталляцию.
12.4.4. Настройка преобразователя имен хостов
Если DNS не работает или появляется эта ошибка:
resolv+: "bind" is an invalid keyword resolv+: "hosts" is an invalid keyword
Настройте файл /compat/linux/etc/host.conf следующим образом:
order hosts, bind multi on
Это указывает, что сначала выполняется поиск в /etc/hosts, а затем в DNS. Если /compat/linux/etc/host.conf отсутствует, Linux-приложения используют /etc/host.conf основной системы, но выдают ошибку, так как этот файл отсутствует в FreeBSD. Удалите bind, если сервер имён не настроен в /etc/resolv.conf.
12.4.5. Разное
Дополнительная информация о работе двоичной совместимости с Linux® доступна в статье Эмуляция Linux в FreeBSD.
Изменено: 20 октября 2025 г. by Vladlen Popolitov