Проект Документации Freebsd руководство
Вид материала | Руководство |
- Это основная программа установки Freebsd, хотя поставщики могут предлагать свои программы., 852.2kb.
- О. Ю. Пескова таганрогский государственный радиотехнический университет сравнительный, 34.26kb.
- Сельское поселение Салым Нефтеюганский район Ханты-Мансийский автономный округ- югра, 1519.49kb.
- Руководство пользователя 00. 01., 232.92kb.
- Руководство по капиллярно, 157.86kb.
- Методическое руководство для онс. Проект методическое руководство для членов, 1813.96kb.
- Инструкция Участникам размещения заказа, 983.63kb.
- 1. Порядок выполнения курсового проекта, 761.28kb.
- Перечень документов и сведений для анализа документации, 26.85kb.
- Приказ от 27 декабря 1974 г. N 167 об утверждении инструкции о ведении школьной документации, 1174.04kb.
Глава 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
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 эмуляция”.