diff --git a/ru_RU.KOI8-R/books/handbook/linuxemu/chapter.sgml b/ru_RU.KOI8-R/books/handbook/linuxemu/chapter.sgml index c6b25895db..f0b301a687 100644 --- a/ru_RU.KOI8-R/books/handbook/linuxemu/chapter.sgml +++ b/ru_RU.KOI8-R/books/handbook/linuxemu/chapter.sgml @@ -1,960 +1,960 @@ Jim Mock Реструктурировал и частично обновил Brian N. Handy Первоначально предоставили Rich Murphey Алексей Докучаев Перевод на русский язык: Работа с приложениями, написанными для Linux Краткий обзор Linux - бинарная совместимость бинарная совместимость Linux 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 файловая система /proc Конечно, существует некоторые особенности Linux, которые не поддерживаются в полной мере FreeBSD. Например, так обстоят дела с приложениями Linux, использующими файловую систему /proc, так как реализация последней сильно отличается от файловой системы /proc в FreeBSD. Существуют также системные вызовы, специфичные для &i386;, как, например, переключение в виртуальный режим 8086. При чтении этой главы вы узнаете: Как включить бинарную совместимость с Linux в вашей системе. Как установить дополнительные совместно используемые библиотеки Linux. Как установить приложения Linux в систему FreeBSD. Детали реализации совместимости с Linux в FreeBSD. Перед прочтением этой главы вам потребуется: Узнать как устанавливать дополнительное программное обеспечение сторонних разработчиков (). Установка KLD (загружаемый объект ядра) Бинарная совместимость с Linux не включена по умолчанию. Простейший способ включения этой функциональности заключается в загрузке KLD объекта linux (Kernel LoaDable object). Вы можете загрузить этот модуль, просто набрав linux в командной строке. Если вы хотите, чтобы совместимость с Linux была включена постоянно, необходимо добавить в /etc/rc.conf следующую строку: linux_enable="YES" Для проверки того, загружен ли KLD, может быть использована команда &man.kldstat.8;: &prompt.user; kldstat Id Refs Address Size Name 1 2 0xc0100000 16bdb8 kernel 7 1 0xc24db000 d000 linux.ko параметры ядра LINUX Если по какой-либо причине вы не хотите или не можете загрузить KLD, то вы можете статически включить поддержку Linux в ядро посредством опции options COMPAT_LINUX в файле конфигурации ядра. Затем соберите и проинсталлируйте новое ядро, следуя описанию в . Установка необходимых Linux библиотек Linux установка библиотек Linux Установить все требуемые библиотеки можно двумя путями: либо используя порт linux_base, либо установив их вручную. Установка с помощью порта linux_base коллекция портов Этот метод является самым простым, и мы рекомендуем воспользоваться именно им. Процесс аналогичен установке любого другого порта из коллекции портов. Просто выполните следующие команды: &prompt.root; cd /usr/ports/emulators/linux_base &prompt.root; make install distclean Теперь Вы можете работать с приложениями для Linux. Некоторые программы, возможно, будут сообщать о несоответствии подверсий некоторых системных библиотек. Однако, практически, это не вызывает каких-либо неудобств. Возможно наличие нескольких версий порта emulators/linux_base, соответствующих различным версиям разных дистрибутивов Linux. Вы должны - установить порт, наиболее близко соотвествующий требованиям + установить порт, наиболее близко соответствующий требованиям приложений Linux, которые будут установлены. Установка библиотек вручную Если у вас нет установленной коллекции портов, можно установить требуемые библиотеки вручную. Вам понадобятся разделяемые библиотеки для Linux, которые нужны программам, и runtime-компоновщик. Вам также потребуется создать теневой корень: директорию /compat/linux, где будут расположены Linux библиотеки. Если нужно загрузить какую-либо разделяемую библиотеку, FreeBSD сперва будет пытаться найти ее в этом дереве. Так, если программа загружает, например, /lib/libc.so, FreeBSD попытается открыть /compat/linux/lib/libc.so, и если такого файла не существует, будет пытаться открыть /lib/libc.so. Разделяемые библиотеки должны находиться в теневом дереве, а не в пути, сообщаемым командой Linux ld.so. По мере работы с различными Linux программами, у вас будет накапливаться некий базовый набор библиотек, которого будет достаточно для большинства существующих Linux приложений. Как установить дополнительные совместно используемые библиотеки совместно используемые библиотеки Что, если при установленном linux_base порте ваше приложение все равно сообщает об отсутствии необходимой библиотеки? Как узнать, какая именно нужна библиотека и где ее взять? В принципе, есть два способа. Вам необходимо иметь привилегии суперпользователя для их осуществления. Если у вас есть доступ к машине, на которой установлен Linux, узнайте, какие библиотеки использует Linux приложение, и просто скопируйте из на свою машину. Например: Допустим, вы скачали по FTP Linux версию Doom (на Linux машине). Вы можете узнать, какие разделяемые библиотеки нужны Doom при помощи команды ldd linuxdoom: &prompt.user; 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 самостоятельно подберет правильные номера версий библиотек, и вам не нужно об этом беспокоиться.
Установка Linux ELF исполняемых файлов Linux ELF исполняемые файлы Для ELF программ иногда требуется сделать так называемый branding. Если при попытке запустить ELF-файл, Вы получаете следующее сообщение об ошибке: &prompt.user; ./linux-elf-программа ELF binary type not known Abort то нужно изменить тип исполняемого файла, чтобы ядро FreeBSD правильно определило, что это Linux программа. Это можно сделать при помощи утилиты &man.brandelf.1;: &prompt.user; brandelf -t Linux linux-elf-программа GNU toolchain В настоящее время GNU toolchain помещает необходимую информацию в исполняемые файлы ELF автоматически, поэтому необходимость в этом действии случается все реже и реже, и в недалеком будущем вы вряд ли прибегнете к нему вообще. Распознавание доменных имен Если 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.
Murray Stokely Обновил для Mathematica 4.X Bojan Bistrovic Объединено с работой Установка &mathematica; приложения Mathematica Ниже описано, как установить Linux версию пакета &mathematica; 4.X на систему FreeBSD. Linux версия &mathematica; отлично работает под FreeBSD, однако исполняемые файлы, поставляемые Wolfram, должны быть модифицированы утилитой &man.brandelf.1;, чтобы FreeBSD знала о необходимости использования Linux ABI для их выполнения. Linux версия пакета &mathematica; или &mathematica; для студентов может быть заказана непосредственно через Wolfram по адресу . Модификация исполняемых файлов Исполняемые файлы пакета &mathematica; находятся в директории Unix на компакт диске с дистрибутивом. Скопируйте эту директорию (вместе со всеми подкаталогами) на ваш жесткий диск, чтобы модифицировать (утилитой &man.brandelf.1;) исполняемые файлы перед инсталляцией: &prompt.root; mount /cdrom &prompt.root; cp -rp /cdrom/Unix/ /localdir/ &prompt.root; brandelf -t Linux /localdir/Files/SystemFiles/Kernel/Binaries/Linux/* &prompt.root; brandelf -t Linux /localdir/Files/SystemFiles/FrontEnd/Binaries/Linux/* &prompt.root; brandelf -t Linux /localdir/Files/SystemFiles/Installation/Binaries/Linux/* &prompt.root; brandelf -t Linux /localdir/Files/SystemFiles/Graphics/Binaries/Linux/* &prompt.root; brandelf -t Linux /localdir/Files/SystemFiles/Converters/Binaries/Linux/* &prompt.root; brandelf -t Linux /localdir/Files/SystemFiles/LicenseManager/Binaries/Linux/mathlm &prompt.root; cd /localdir/Installers/Linux/ &prompt.root; ./MathInstaller Вы также можете установить ELF brand по умолчанию для всех приложений Linux, которым это требуется, с помощью команды: &prompt.root; sysctl kern.fallback_elf_brand=3 FreeBSD будет считать, что все программы, не обработанные &man.brandelf.1; используют Linux ABI и вы сможете запустить MathInstaller прямо с CDROM. Пароль к пакету &mathematica; Вам необходимо зарегистрировать свою копию пакета &mathematica; и получить от Wolfram специальный пароль, соответствующий идентификатору машины. Ethernet MAC адрес После того, как вы установили необходимые библиотеки и распаковали файлы &mathematica;, получите идентификатор машины, запустив программу mathinfo в инсталляционной директории. Идентификатор машины зависит от MAC-адреса вашей первой Ethernet-карты. &prompt.root; cd /localdir/Files/SystemFiles/Installation/Binaries/Linux &prompt.root; mathinfo disco.example.com 7115-70839-20412 При регистрации, либо по телефону или факсу, либо по электронной почте, вы сообщаете идентификатор машины, а в ответ получаете пароль, состоящий из нескольких чисел. Введите этот пароль при первом запуске &mathematica;, как и для любой другой платформы. Подключение интерфейс &mathematica; через сеть &mathematica; использует специальные шрифты для отображения некоторых символов, которые отсутствуют в стандартных шрифтах (символы интегралов, сумм, греческий алфавит и другие). Протокол X требует, чтобы эти шрифты были установлены локально. Это означает, что вы должны скопировать эти шрифты с компакт диска или сетевого узла &mathematica; на ваш жесткий диск. Обычно, все шрифты должны находиться в каталоге /cdrom/Unix/Files/SystemFiles/Fonts компакт диска или /usr/local/mathematica/SystemFiles/Fonts на винчестере. Собственно файлы со шрифтами находятся в подкаталогах Type1 и X. О том, как их использовать, читайте ниже. Можно просто скопировать их в один из существующих подкаталогов в директории /usr/X11R6/lib/X11/fonts. В этом случае, вам потребуется отредактировать файл fonts.dir, добавив в него названия шрифтов и изменив число шрифтов в первой строке. Или вы можете запустить программу &man.mkfontdir.1;, находясь в том каталоге, куда вы скопировали шрифты. Есть альтернативный способ: скопировать директории в каталог /usr/X11R6/lib/X11/fonts: &prompt.root; cd /usr/X11R6/lib/X11/fonts &prompt.root; mkdir X &prompt.root; mkdir MathType1 &prompt.root; cd /cdrom/Unix/Files/SystemFiles/Fonts &prompt.root; cp X/* /usr/X11R6/lib/X11/fonts/X &prompt.root; cp Type1/* /usr/X11R6/lib/X11/fonts/MathType1 &prompt.root; cd /usr/X11R6/lib/X11/fonts/X &prompt.root; mkfontdir &prompt.root; cd ../MathType1 &prompt.root; mkfontdir Теперь добавьте каталоги с новыми шрифтами в путь к шрифтам: &prompt.root; xset fp+ /usr/X11R6/lib/X11/fonts/X &prompt.root; xset fp+ /usr/X11R6/lib/X11/fonts/MathType1 &prompt.root; xset fp rehash Если вы используете &xfree86;, то можно просто прописать эти каталоги в файле XF86Config. шрифты Если на вашем компьютере нет каталога /usr/X11R6/lib/X11/fonts/Type1, замените MathType1 на Type1 в предыдущем примере. Installing &maple; * Этот раздел не переведен. Installing &matlab; * Этот раздел не переведен. Marcel Moolenaar Предоставил Установка &oracle; приложения Oracle Введение Ниже описан процесс установки &oracle; 8.0.5 и &oracle; 8.0.5.1 Enterprise Edition для Linux на систему FreeBSD. Настройка Linux окружения Удостоверьтесь, что порты emulators/linux_base и devel/linux_devtools установлены на вашей системе. Если у вас возникнут трудности с этими портами, воспользуйтесь более ранней их версией. Если вы хотите использовать intelligent agent, также понадобится TCL пакет от Red Hat: tcl-8.0.3-20.i386.rpm. Для этого воспользуйтесь следующей командой RPM (archivers/rpm): &prompt.root; rpm -i --ignoreos --root /compat/linux --dbpath /var/lib/rpm пакет Установка этого пакета должна пройти без каких-либо ошибок. Настройка окружения &oracle; Прежде чем вы сможете установить &oracle;, вам необходимо обеспечить соответствующее окружение. Ниже дана информация, что именно нужно сделать, чтобы успешно запускать &oracle; для Linux под FreeBSD, а не то, что написано в фирменном руководстве по установке &oracle;. Настройка ядра настройка ядра Как описывается в руководстве по установке &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 Учетная запись &oracle; Создайте специальную учетную запись oracle, как и любую другую учетную запись. Единственное отличие в том, что для oracle необходимо указать командный интерпретатор Linux. Добавьте /compat/linux/bin/bash в /etc/shells и установите для - oracle командный интерпритатор + oracle командный интерпретатор /compat/linux/bin/bash. Переменные окружения Кроме стандартных переменных окружения &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 Установка &oracle; Из-за небольшой несовместимости с Linux эмулятором, вам нужно будет создать подкаталог .oracle в каталоге /var/tmp прежде, чем можно будет начать установку. Либо сделайте ее владельцем пользователя oracle, либо поставьте права на запись для всех. Если вы все сделали правильно, то установка &oracle; должна пройти без проблем. Если какие-либо трудности все же возникли, проверьте еще раз все конфигурационные файлы и/или целостность дистрибутива &oracle;. После окончания установки &oracle; приложите патчи (смотрите следующие два раздела). Одна из часто возникающих проблем — неправильно установленный TCP адаптер. В результате, невозможно запустить TCP сервисы. Вот решение проблемы: &prompt.root; cd $ORACLE_HOME/network/lib &prompt.root; make -f ins_network.mk ntcontab.o &prompt.root; cd $ORACLE_HOME/lib &prompt.root; ar r libnetwork.a ntcontab.o &prompt.root; cd $ORACLE_HOME/network/lib &prompt.root; make -f ins_network.mk install Не забудьте повторно запустить root.sh! Модификация 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. Модификация 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 Запуск &oracle; Теперь, если вы все сделали правильно, то можете использовать &oracle; так же, как и в системе Linux. Installing &sap.r3; * Этот раздел не переведен. Дополнительные сведения Если вы интересуетесь, как работает Linux эмуляция, этот раздел для вас. Большинство материала взято из электронного письма, адресованного &a.chat; by Terry Lambert tlambert@primenet.com (ID письма: <199906020108.SAA07001@usr09.primenet.com>). Как все это устроено? загрузчик исполнимых классов FreeBSD поддерживает абстракцию, называемую загрузчик исполнимых классов, который фактически является первой стадией системного вызова &man.execve.2;. На самом деле, FreeBSD имеет несколько загрузчиков вместо одного, который, в случае неудачи, выполняет программу как сценарий (скрипт). Исторически сложилось, что единственный загрузчик в &unix; системах проверял магическое число (чаще всего первые 4 или 8 байт файла), чтобы определить, известен ли формат исполняемого файла системе, и если да, то вызвал соответствующий загрузчик. Если файл не опознавался системой как исполнимый, &man.execve.2; возвращал ошибку, и текущий командный интерпретатор начинал выполнять файл как скрипт. Позднее, &man.sh.1; был модифицирован, так, чтобы проверять первые два символа в файле, и если они оказывались :\n, то файл выполнялся как сценарий для &man.csh.1; (утверждается, что SCO были первыми, кто сделал эту модификацию). FreeBSD ведет себя по-другому: пробегает по списку загрузчиков, включая специальный #! загрузчик, который вызывает нужный интерпретатор или /bin/sh, если не нашел подходящего. ELF Формат исполняемого файла FreeBSD определяет по магическому числу. На этой стадии пока не различается, для какой операционной системы предназначен файл (Linux, &solaris;, или любой другой, использующей ELF-формат исполняемых файлов). Solaris Далее, ELF-загрузчик определяет марку (специальный комментарий; отсутствует в исполняемых файлах SVR4/&solaris;) исполняемого файла, то есть для какой операционной системы он предназначен. Соответственно, Linux программы должны быть маркированы для Linux (например, с помощью утилиты &man.brandelf.1;): &prompt.root; brandelf -t Linux file ELF branding Когда ELF-загрузчик находит марку Linux, он заменяет соответствующий указатель в структуре proc. Все системные вызовы индексируются через этот указатель (в традиционной &unix; системе это массив sysent[], содержащий системные вызовы). Некоторые особые ситуации и системные вызовы обрабатываются специальным модулем ядра поддержки Linux. Плюс ко всему, Linux эмулятор динамически изменяет корень файловой системы при поиске файлов; фактически так же, как и параметр union при монтировании файловых систем (не путать с unionfs!). Сперва, файл ищется в каталоге /compat/linux/original-path и только затем, в случае неудачи, в /original-path. Это дает возможность Linux программам выполнять FreeBSD команды, если не найдется соответствующих Linux команд. Например, скопировав FreeBSD &man.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 эмуляция.