Проект Документации Freebsd   руководство

Вид материалаРуководство

Содержание


Глава 10. Работа с приложениями, написанными для Linux
10.1. Краткий обзор
10.2.1. Установка необходимых Linux библиотек
10.2.1.1. Установка с помощью порта linux_base
10.2.1.2. Установка библиотек вручную
10.2.1.3. Как установить дополнительные совместно используемые библиотеки
10.2.2. Установка Linux ELF исполняемых файлов
10.2.3. Распознавание доменных имен
10.3. Установка Mathematica®
10.3.1. Модификация исполняемых файлов
10.3.2. Пароль к пакету Mathematica
10.3.3. Подключение интерфейс Mathematica через сеть
10.4. Installing Maple™ * Этот раздел не переведен. 10.5. Installing MATLAB®
10.6.2. Настройка Linux окружения
10.6.3. Настройка окружения Oracle
10.6.3.1. Настройка ядра
10.6.3.2. Учетная запись Oracle
10.6.3.3. Переменные окружения
10.6.4. Установка Oracle
10.6.4.1. Модификация root.sh
...
Полное содержание
Подобный материал:
1   ...   20   21   22   23   24   25   26   27   ...   69

Глава 10. Работа с приложениями, написанными для Linux


Реструктурировал и частично обновил Jim Mock. Первоначально предоставили Brian N. Handy, Rich Murphey. Перевод на русский язык: Алексей Докучаев.

10.1. Краткий обзор


FreeBSD предоставляет бинарную совместимость с несколькими другими UNIX подобными операционными системами, включая Linux. Возможно, Вы спрашиваете себя, зачем FreeBSD нужно уметь работать с приложениями, написанными для Linux. Ответ на этот вопрос достаточно прост: многие компании и разработчики производят программное обеспечение только для Linux, так как эта операционная система очень быстро завоевала огромную популярность в компьютерном мире. Пользователям же FreeBSD приходится обращаться к этим компаниям и разработчикам с просьбами выпустить версии своих программ специально для FreeBSD. Проблема в том, что большинство производителей программного обеспечения не осознают, насколько бы увеличился их рынок сбыта, выпускай они FreeBSD версии наряду с Linux версиями, и продолжают разрабатывать только под Linux. Что же делать пользователям FreeBSD? В этой ситуации на помощь приходит Linux эмуляция.

Вкратце, FreeBSD позволяет Вам работать с 90% приложений для Linux без каких-либо модификаций последних. Среди них: StarOffice, Linux версия Netscape, Adobe® Acrobat®, RealPlayer® 5 и 7, VMware™, Oracle, WordPerfect®, Doom, Quake, и многие другие. Есть сведения, что в некоторых ситуациях эти Linux программы показывали более высокую производительность при работе под FreeBSD, чем под Linux.

Конечно, существует некоторые особенности Linux, которые не поддерживаются в полной мере FreeBSD. Например, так обстоят дела с приложениями Linux, использующими файловую систему /proc, так как реализация последней сильно отличается от файловой системы /proc в FreeBSD. Существуют также системные вызовы, специфичные для i386, как, например, переключение в виртуальный режим 8086.

При чтении этой главы вы узнаете:

• Как включить бинарную совместимость с Linux в вашей системе.

• Как установить дополнительные совместно используемые библиотеки Linux.

• Как установить приложения Linux в систему FreeBSD.

• Детали реализации совместимости с Linux в FreeBSD.

Перед прочтением этой главы вам потребуется:

• Узнать как устанавливать дополнительное программное обеспечение сторонних разработчиков (Гл. 4).

10.2. Установка


Бинарная совместимость с Linux не включена по умолчанию. Простейший способ включения этой функциональности заключается в загрузке KLD объекта linux (“Kernel LoaDable object”). Вы можете загрузить этот модуль, просто набрав linux в командной строке.

Если вы хотите, чтобы совместимость с Linux была включена постоянно, необходимо добавить в /etc/rc.conf следующую строку:

linux_enable="YES"

Для проверки того, загружен ли KLD, может быть использована команда kldstat(8):

% kldstat

Id Refs Address Size Name

1 2 0xc0100000 16bdb8 kernel

7 1 0xc24db000 d000 linux.ko

Если по какой-либо причине вы не хотите или не можете загрузить KLD, то вы можете статически включить поддержку Linux в ядро посредством опции options COMPAT_LINUX в файле конфигурации ядра. Затем соберите и проинсталлируйте новое ядро, следуя описанию в Гл. 8.

10.2.1. Установка необходимых Linux библиотек


Установить все требуемые библиотеки можно двумя путями: либо используя порт linux_base, либо установив их вручную.
10.2.1.1. Установка с помощью порта linux_base

Этот метод является самым простым, и мы рекомендуем воспользоваться именно им. Процесс аналогичен установке любого другого порта из коллекции портов (/usr/ports/). Просто выполните следующие команды:

# cd /usr/ports/emulators/linux_base

# make install distclean

Теперь Вы можете работать с приложениями для Linux. Некоторые программы, возможно, будут сообщать о несоответствии подверсий некоторых системных библиотек. Однако, практически, это не вызывает каких-либо неудобств.

Замечание: Возможно наличие нескольких версий порта emulators/linux_base, соответствующих различным версиям разных дистрибутивов Linux. Вы должны установить порт, наиболее близко соответствующий требованиям приложений Linux, которые будут установлены.
10.2.1.2. Установка библиотек вручную

Если у вас нет установленной коллекции портов, можно установить требуемые библиотеки вручную. Вам понадобятся разделяемые библиотеки для Linux, которые нужны программам, и runtime-компоновщик. Вам также потребуется создать “теневой корень”: директорию /compat/linux, где будут расположены Linux библиотеки. Если нужно загрузить какую-либо разделяемую библиотеку, FreeBSD сперва будет пытаться найти ее в этом дереве. Так, если программа загружает, например, /lib/libc.so, FreeBSD попытается открыть /compat/linux/lib/libc.so, и если такого файла не существует, будет пытаться открыть /lib/libc.so. Разделяемые библиотеки должны находиться в теневом дереве, а не в пути, сообщаемым командой Linux ld.so.

По мере работы с различными Linux программами, у вас будет накапливаться некий базовый набор библиотек, которого будет достаточно для большинства существующих Linux приложений.
10.2.1.3. Как установить дополнительные совместно используемые библиотеки

Что, если при установленном linux_base порте ваше приложение все равно сообщает об отсутствии необходимой библиотеки? Как узнать, какая именно нужна библиотека и где ее взять? В принципе, есть два способа. Вам необходимо иметь привилегии суперпользователя для их осуществления.

Если у вас есть доступ к машине, на которой установлен Linux, узнайте, какие библиотеки использует Linux приложение, и просто скопируйте из на свою машину. Например:

Допустим, вы скачали по FTP Linux версию Doom (на Linux машине). Вы можете узнать, какие разделяемые библиотеки нужны Doom при помощи команды ldd linuxdoom:

% 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

Вам потребуются все файлы, перечисленные в последней колонке. Скопируйте их в директорию /compat/linux на вашей системе, а также создайте символические ссылки на эти файлы, с именами ссылок из первой колонки соответственно. В итоге у вас на машине должны быть следующие файлы:

/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

Замечание: Заметьте, что если у вас уже есть какая-либо из перечисленных библиотек, то ее не нужно копировать заново. Однако, у вас может быть более старая версия. В этом случае, лучше все-таки скопировать библиотеку поздней версии, изменив соответственно ссылку на нее. Предыдущую версию библиотеки можно удалить. Например, пусть у вас есть следующие библиотеки:

/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

Если подверсии немного отличаются, копировать /lib/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 программ. Runtime-компоновщик FreeBSD самостоятельно подберет правильные номера версий библиотек, и вам не нужно об этом беспокоиться.

10.2.2. Установка Linux ELF исполняемых файлов


Для ELF программ иногда требуется сделать так называемый “branding”. Если при попытке запустить ELF-файл, Вы получаете следующее сообщение об ошибке:

% ./linux-elf-программа

ELF binary type not known

Abort

то нужно изменить тип исполняемого файла, чтобы ядро FreeBSD правильно определило, что это Linux программа. Это можно сделать при помощи утилиты brandelf(1):

% brandelf -t Linux linux-elf-программа

В настоящее время GNU toolchain помещает необходимую информацию в исполняемые файлы ELF автоматически, поэтому необходимость в этом действии случается все реже и реже, и в недалеком будущем вы вряд ли прибегнете к нему вообще.

10.2.3. Распознавание доменных имен


Если 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 и сообщают о несовместимом синтаксисе. Если вы не настраивали сервер имен (/etc/resolv.conf), уберите bind из файла /compat/linux/etc/host.conf.

10.3. Установка Mathematica®


Обновил для Mathematica 4.X Murray Stokely. Объединено с работой Bojan Bistrovic.

Ниже описано, как установить Linux версию пакета Mathematica 4.X на систему FreeBSD.

Linux версия Mathematica отлично работает под FreeBSD, однако исполняемые файлы, поставляемые Wolfram, должны быть модифицированы утилитой brandelf(1), чтобы FreeBSD знала о необходимости использования Linux ABI для их выполнения.

Linux версия пакета Mathematica или Mathematica для студентов может быть заказана непосредственно через Wolfram по адресу am.com/.

10.3.1. Модификация исполняемых файлов


Исполняемые файлы пакета Mathematica находятся в директории Unix на компакт диске с дистрибутивом. Скопируйте эту директорию (вместе со всеми подкаталогами) на ваш жесткий диск, чтобы модифицировать (утилитой brandelf(1)) исполняемые файлы перед инсталляцией:

# mount /cdrom

# cp -rp /cdrom/Unix/ /localdir/

# brandelf -t Linux /localdir/Files/SystemFiles/Kernel/Binaries/Linux/*

# brandelf -t Linux /localdir/Files/SystemFiles/FrontEnd/Binaries/Linux/*

# brandelf -t Linux /localdir/Files/SystemFiles/Installation/Binaries/Linux/*

# brandelf -t Linux /localdir/Files/SystemFiles/Graphics/Binaries/Linux/*

# brandelf -t Linux /localdir/Files/SystemFiles/Converters/Binaries/Linux/*

# brandelf -t Linux /localdir/Files/SystemFiles/LicenseManager/Binaries/Linux/mathlm

# cd /localdir/Installers/Linux/

# ./MathInstaller

Вы также можете установить ELF brand по умолчанию для всех приложений Linux, которым это требуется, с помощью команды:

# sysctl kern.fallback_elf_brand=3

FreeBSD будет считать, что все программы, не обработанные brandelf(1) используют Linux ABI и вы сможете запустить MathInstaller прямо с CDROM.

10.3.2. Пароль к пакету Mathematica


Вам необходимо зарегистрировать свою копию пакета Mathematica и получить от Wolfram специальный пароль, соответствующий “идентификатору машины”.

После того, как вы установили необходимые библиотеки и распаковали файлы Mathematica, получите “идентификатор машины”, запустив программу mathinfo в инсталляционной директории. Идентификатор машины зависит от MAC-адреса вашей первой Ethernet-карты.

# cd /localdir/Files/SystemFiles/Installation/Binaries/Linux

# mathinfo

disco.example.com 7115-70839-20412

При регистрации, либо по телефону или факсу, либо по электронной почте, вы сообщаете “идентификатор машины”, а в ответ получаете пароль, состоящий из нескольких чисел. Введите этот пароль при первом запуске Mathematica, как и для любой другой платформы.

10.3.3. Подключение интерфейс Mathematica через сеть


Mathematica использует специальные шрифты для отображения некоторых символов, которые отсутствуют в стандартных шрифтах (символы интегралов, сумм, греческий алфавит и другие). Протокол X требует, чтобы эти шрифты были установлены локально. Это означает, что вы должны скопировать эти шрифты с компакт диска или сетевого узла Mathematica на ваш жесткий диск. Обычно, все шрифты должны находиться в каталоге /cdrom/Unix/Files/SystemFiles/Fonts компакт диска или /usr/local/mathematica/SystemFiles/Fonts на винчестере. Собственно файлы со шрифтами находятся в подкаталогах Type1 и X. О том, как их использовать, читайте ниже.

Можно просто скопировать их в один из существующих подкаталогов в директории /usr/X11R6/lib/X11/fonts. В этом случае, вам потребуется отредактировать файл fonts.dir, добавив в него названия шрифтов и изменив число шрифтов в первой строке. Или вы можете запустить программу mkfontdir(1), находясь в том каталоге, куда вы скопировали шрифты.

Есть альтернативный способ: скопировать директории в каталог /usr/X11R6/lib/X11/fonts:

# cd /usr/X11R6/lib/X11/fonts

# mkdir X

# mkdir MathType1

# cd /cdrom/Unix/Files/SystemFiles/Fonts

# cp X/* /usr/X11R6/lib/X11/fonts/X

# cp Type1/* /usr/X11R6/lib/X11/fonts/MathType1

# cd /usr/X11R6/lib/X11/fonts/X

# mkfontdir

# cd ../MathType1

# mkfontdir

Теперь добавьте каталоги с новыми шрифтами в путь к шрифтам:

# xset fp+ /usr/X11R6/lib/X11/fonts/X

# xset fp+ /usr/X11R6/lib/X11/fonts/MathType1

# xset fp rehash

Если вы используете XFree86, то можно просто прописать эти каталоги в файле XF86Config.

Если на вашем компьютере нет каталога /usr/X11R6/lib/X11/fonts/Type1, замените MathType1 на Type1 в предыдущем примере.

10.4. Installing Maple™ *


Этот раздел не переведен.

10.5. Installing MATLAB® *


Этот раздел не переведен.

10.6. Установка Oracle®


Предоставил Marcel Moolenaar.

10.6.1. Введение


Ниже описан процесс установки Oracle 8.0.5 и Oracle 8.0.5.1 Enterprise Edition для Linux на систему FreeBSD.

10.6.2. Настройка Linux окружения


Удостоверьтесь, что порты emulators/linux_base и devel/linux_devtools установлены на вашей системе. Если у вас возникнут трудности с этими портами, воспользуйтесь более ранней их версией.

Если вы хотите использовать intelligent agent, также понадобится TCL пакет от Red Hat: tcl-8.0.3-20.i386.rpm. Для этого воспользуйтесь следующей командой RPM (archivers/rpm):

# rpm -i --ignoreos --root /compat/linux --dbpath /var/lib/rpm пакет

Установка этого пакета должна пройти без каких-либо ошибок.

10.6.3. Настройка окружения Oracle


Прежде чем вы сможете установить Oracle, вам необходимо обеспечить соответствующее окружение. Ниже дана информация, что именно нужно сделать, чтобы успешно запускать Oracle для Linux под FreeBSD, а не то, что написано в фирменном руководстве по установке Oracle.
10.6.3.1. Настройка ядра

Как описывается в руководстве по установке Oracle, необходимо установить максимальный размер разделяемой памяти. Не используйте SHMMAX под FreeBSD. SHMMAX высчитывается, исходя из SHMMAXPGS и PGSIZE. Следовательно, нужно задавать SHMMAXPGS. За информацией о прочих опциях обратитесь к фирменному руководству. Пример настроек:

options SHMMAXPGS=10000

options SHMMNI=100

options SHMSEG=10

options SEMMNS=200

options SEMMNI=70

options SEMMSL=61

Установите эти опции в зависимости от того, как и для чего вы будете использовать Oracle.

Не забудьте добавить следующие строки в файл конфигурации ядра:

options SYSVSHM # разделяемая память SysV

options SYSVSEM # семафоры SysV

options SYSVMSG # межпроцессное взаимодействие SysV
10.6.3.2. Учетная запись Oracle

Создайте специальную учетную запись oracle, как и любую другую учетную запись. Единственное отличие в том, что для oracle необходимо указать командный интерпретатор Linux. Добавьте /compat/linux/bin/bash в /etc/shells и установите для oracle командный интерпретатор /compat/linux/bin/bash.
10.6.3.3. Переменные окружения

Кроме стандартных переменных окружения Oracle, таких как ORACLE_HOME и ORACLE_SID, вам нужно будет установить следующие дополнительные переменные:

Переменная

Значение

LD_LIBRARY_PATH

$ORACLE_HOME/lib

CLASSPATH

$ORACLE_HOME/jdbc/lib/classes111.zip

PATH

/compat/linux/bin /compat/linux/sbin /compat/linux/usr/bin /compat/linux/usr/sbin /bin /sbin /usr/bin /usr/sbin /usr/local/bin $ORACLE_HOME/bin


Желательно устанавливать их в файле .profile. Вот реальный пример:

ORACLE_BASE=/oracle; export ORACLE_BASE

ORACLE_HOME=/oracle; export ORACLE_HOME

LD_LIBRARY_PATH=$ORACLE_HOME/lib

export LD_LIBRARY_PATH

ORACLE_SID=ORCL; export ORACLE_SID

ORACLE_TERM=386x; export ORACLE_TERM

CLASSPATH=$ORACLE_HOME/jdbc/lib/classes111.zip

export CLASSPATH

PATH=/compat/linux/bin:/compat/linux/sbin:/compat/linux/usr/bin

PATH=$PATH:/compat/linux/usr/sbin:/bin:/sbin:/usr/bin:/usr/sbin

PATH=$PATH:/usr/local/bin:$ORACLE_HOME/bin

export PATH

10.6.4. Установка Oracle


Из-за небольшой несовместимости с Linux эмулятором, вам нужно будет создать подкаталог .oracle в каталоге /var/tmp прежде, чем можно будет начать установку. Либо сделайте ее владельцем пользователя oracle, либо поставьте права на запись для всех. Если вы все сделали правильно, то установка Oracle должна пройти без проблем. Если какие-либо трудности все же возникли, проверьте еще раз все конфигурационные файлы и/или целостность дистрибутива Oracle. После окончания установки Oracle приложите патчи (смотрите следующие два раздела).

Одна из часто возникающих проблем — неправильно установленный TCP адаптер. В результате, невозможно запустить TCP сервисы. Вот решение проблемы:

# cd $ORACLE_HOME/network/lib

# make -f ins_network.mk ntcontab.o

# cd $ORACLE_HOME/lib

# ar r libnetwork.a ntcontab.o

# cd $ORACLE_HOME/network/lib

# make -f ins_network.mk install

Не забудьте повторно запустить root.sh!
10.6.4.1. Модификация root.sh

При установке Oracle необходимо выполнить некоторые действия (имея при этом привилегии суперпользователя). Фактически это сводится к выполнению скрипта root.sh, который находится в директории orainst. Перед запуском, приложите к нему следующий патч (исправляет местонахождение утилиты chown), либо запускайте его в командном интерпретаторе Linux.

*** orainst/root.sh.orig Tue Oct 6 21:57:33 1998

--- orainst/root.sh Mon Dec 28 15:58:53 1998

***************

*** 31,37 ****

# This is the default value for CHOWN

# It will redefined later in this script for those ports

# which have it conditionally defined in ss_install.h

! CHOWN=/bin/chown

#

# Define variables to be used in this script

--- 31,37 ----

# This is the default value for CHOWN

# It will redefined later in this script for those ports

# which have it conditionally defined in ss_install.h

! CHOWN=/usr/sbin/chown

#

# Define variables to be used in this script

Если вы устанавливаете Oracle не с компакт диска, можно модифицировать исходный файл root.sh. Он называется rthd.sh и находится в каталоге orainst.
10.6.4.2. Модификация genclntsh

Скрипт genclntsh используется для того, чтобы создать единую совместно используемую клиентскую библиотеку, которая используется для создания демонстраций. Приложите следующий патч, чтобы закомментировать определение переменной PATH:

*** bin/genclntsh.orig Wed Sep 30 07:37:19 1998

--- bin/genclntsh Tue Dec 22 15:36:49 1998

***************

*** 32,38 ****

#

# Explicit path to ensure that we're using the correct commands

#PATH=/usr/bin:/usr/ccs/bin export PATH

! PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin export PATH

#

# each product MUST provide a $PRODUCT/admin/shrept.lst

--- 32,38 ----

#

# Explicit path to ensure that we're using the correct commands

#PATH=/usr/bin:/usr/ccs/bin export PATH

! #PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin export PATH

#

# each product MUST provide a $PRODUCT/admin/shrept.lst

10.6.5. Запуск Oracle


Теперь, если вы все сделали правильно, то можете использовать Oracle так же, как и в системе Linux.

10.7. Installing SAP® R/3® *


Этот раздел не переведен.

10.8. Дополнительные сведения


Если вы интересуетесь, как работает Linux эмуляция, этот раздел для вас. Большинство материала взято из электронного письма, адресованного Список рассылки, посвящённый неформальным беседам о FreeBSD (eBSD.org/mailman/listinfo/freebsd-chat) by Terry Lambert (ID письма: <199906020108.SAA07001@usr09.primenet.com>).

10.8.1. Как все это устроено?


FreeBSD поддерживает абстракцию, называемую “загрузчик исполнимых классов”, который фактически является первой стадией системного вызова execve(2).

На самом деле, FreeBSD имеет несколько загрузчиков вместо одного, который, в случае неудачи, выполняет программу как сценарий (скрипт).

Исторически сложилось, что единственный загрузчик в UNIX системах проверял “магическое число” (чаще всего первые 4 или 8 байт файла), чтобы определить, известен ли формат исполняемого файла системе, и если да, то вызвал соответствующий загрузчик.

Если файл не опознавался системой как исполнимый, execve(2) возвращал ошибку, и текущий командный интерпретатор начинал выполнять файл как скрипт.

Позднее, sh(1) был модифицирован, так, чтобы проверять первые два символа в файле, и если они оказывались :\n, то файл выполнялся как сценарий для csh(1) (утверждается, что SCO были первыми, кто сделал эту модификацию).

FreeBSD ведет себя по-другому: пробегает по списку загрузчиков, включая специальный #! загрузчик, который вызывает нужный интерпретатор или /bin/sh, если не нашел подходящего.

Формат исполняемого файла FreeBSD определяет по “магическому числу”. На этой стадии пока не различается, для какой операционной системы предназначен файл (Linux, Solaris, или любой другой, использующей ELF-формат исполняемых файлов).

Далее, ELF-загрузчик определяет “марку” (специальный комментарий; отсутствует в исполняемых файлах SVR4/Solaris) исполняемого файла, то есть для какой операционной системы он предназначен.

Соответственно, Linux программы должны быть “маркированы” для Linux (например, с помощью утилиты brandelf(1)):

# brandelf -t Linux file

Когда ELF-загрузчик находит “марку” Linux, он заменяет соответствующий указатель в структуре proc. Все системные вызовы индексируются через этот указатель (в традиционной UNIX системе это массив sysent[], содержащий системные вызовы). Некоторые особые ситуации и системные вызовы обрабатываются специальным модулем ядра поддержки Linux.

Плюс ко всему, Linux эмулятор динамически “изменяет корень” файловой системы при поиске файлов; фактически так же, как и параметр union при монтировании файловых систем (не путать с unionfs!). Сперва, файл ищется в каталоге /compat/linux/original-path и только затем, в случае неудачи, в /original-path. Это дает возможность Linux программам выполнять FreeBSD команды, если не найдется соответствующих Linux команд. Например, скопировав FreeBSD uname(1) в каталог /compat/linux/bin/, можно “заставить” Linux программы сообщать, что они запускаются под FreeBSD.

На самом деле, ядра FreeBSD и Linux во многом похожи: системные операции, виртуальная память, система сигналов и сообщений, межпроцессное взаимодействие и прочее. Разница в том, что FreeBSD программы обращаются к системным вызовам FreeBSD, Linux программы соответственно к системным вызовам Linux. Во многих операционных системах прошлого адреса системных вызовов были зашиты в статический глобальный массив sysent[], вместо обращения по указателю в структуре proc, который инициализируется динамически, позволяя таким образом запускать программы, написанные для разных операционных систем.

В чем же разница между системными вызовами Linux и FreeBSD? Фактически никакой. Единственное различие (на данный момент, в будущем все может и, вероятно, изменится), пожалуй, в том, что функции системных вызовов FreeBSD зашиты в ядро, а для Linux они могут быть либо в ядре, либо в динамически загружаемом модуле.

Можно ли назвать это эмуляцией? Нет. Это реализация ABI, а не эмуляция. Как таковой, эмулятор (или симулятор) отсутствует.

В таком случае, почему же тогда говорят “Linux эмуляция”? Чтобы “насолить” FreeBSD?!. На самом деле, это вопрос терминологии: не существовало слова, которое бы точнее описывало этот процесс. Нельзя сказать, что FreeBSD запускает приложения Linux (без перекомпиляции или загрузки соответствующего модуля ядра). Поэтому и придумали термин “Linux эмуляция”.