Запуск программного обеспечения из чужой ОС


Традиционно в операционной системе применяется программное обеспечение, написанное специально для нее, и программы могут выполняться только на той платформе, для которой они разработаны. Многие неплохо заработали, изменяя программы, написанные для одной платформы, для работы в другой системе. Такой процесс называется переносом (porting), или «портированием». Как администратор FreeBSD, вы можете по-разному применять программы, написанные для другой платформы. Самый эффективный способ состоит в том, чтобы заново скомпилировать исходный код, сделав эти программы «родными» для FreeBSD. Если это невозможно, «неродную» программу можно запустить под управлением эмулятора, такого как Wune, или реализовав машинный двоичный интерфейс прикладных программ (Application Binary Interface, ABI) «родной» платформы.

Перекомпиляция

Многие программы в коллекции «портов» на самом деле представляют собой «порты» программ, первоначально разработанных для других платформ (именно поэтому она и называется коллекцией «портов»). Программы, написанные для Linux, Solaris и других разновидностей UNIX, зачастую можно собрать из исходного кода (перекомпилировать). Чтобы эти программы выполнялись во FreeBSD без сучка и задоринки, требуется внести в их исходный код минимальные изменения, а порой можно и вовсе обойтись и без таковых. Просто взяв исходный код и собрав его на машине FreeBSD, можно запускать эти программы во FreeBSD, словно «родные».

Перекомпиляция дает лучшие результаты, если платформы похожи. Например, FreeBSD и Linux предоставляют много идентичных системных функций: они собраны на стандартных функциях С, используют сходные инструменты сборки и т. д. Однако с годами различные платформы UNIX отдалились друг от друга. В каждой версии UNIX реализованы новые функции, которым, в свою очередь, нужны новые библиотеки и функции. Если той или иной программе необходимы особые функции, ее не удастся собрать на других платформах. Отчасти стандарт POSIX был введен для смягчения этой проблемы. POSIX — это стандарт, описывающий минимально приемлемую систему UNIX и UNIX-подобные операционные системы. Программы, в которых применяются только POSIX-совместимые системные вызовы и библиотеки, можно непосредственно переносить в любую другую операционную систему, реализующую POSIX. Большинство производителей UNIX разрабатывают программное обеспечение в соответствии с POSIX. Самое трудное — добиться того, чтобы разработчики следовали стандарту POSIX. Многие разработчики, создающие программы с открытым кодом, заботятся только о том, чтобы их программы запускались на их любимой платформе.

Например, есть довольно много программ для Linux, не совместимых с POSIX. В свою очередь, код, полностью соответствующий POSIX, не может вобрать в себя преимущества специальных функций, предлагаемых той или иной операционной системой. Например, во FreeBSD есть сверхэффективный системный вызов чтения данных kqueue(2). Вместо него другие системы применяют select(2) и poll(2). Вопрос, которым задаются разработчики приложений, состоит в том, что именно использовать: kqueue(2) — при этом программа молниеносно выполняется во FreeBSD и не работает в других системах, или select(2) и poll(2) — программа выполняется медленнее, но сможет работать и на других платформах. Конечно, разработчик мог бы поднапрячься и реализовать поддержку как kqueue(2), так и select(2) и poll(2), но, к сожалению, задача осчастливить пользователей не входит в круг интересов разработчика.

Проект FreeBSD выбирает средний путь. Если программу можно скомпилировать и запустить должным образом во FreeBSD, команда программистов, разрабатывающих «порты», реализует такую возможность. Если программе требуются незначительные заплатки, члены команды создают их и высылают разработчику этой программы. Большинство разработчиков программ охотно принимают заплатки, позволяющие поддерживать другую операционную систему. У них может не быть той или иной ОС для тестирования, или эта система может быть им неизвестна, однако если подходящая с виду заплатка пришла из уважаемого источника, скорее всего, она не будет отвергнута.

Эмуляция

Если для поддержки FreeBSD программа потребовала бы значительной переделки либо исходный код просто недоступен, возможен другой вариант: эмуляция. Программа эмуляции преобразует системные вызовы одной операционной системы в системные вызовы локальной операционной системы. Программы, запускаемые в эмуляторе, работают, словно в «родной» системе. Однако преобразование системных вызовов означает дополнительные системные издержки, снижающие скорость выполнения программ в эмуляторе.

FreeBSD поддерживает множество разнообразных эмуляторов, большая часть которых представлена в коллекции «портов» (каталог /usr/ports/emulators). В большинстве случаев эмуляторы полезны для обучения и развлечений. Если у вас есть неутолимое желание вновь запустить старую игру Commodore 64, можно установить /usr/ports/emulators/frodo. (Также можно попробовать установить дисковод С64 и заставить его работать во FreeBSD. При этом вы узнаете о дисках больше, чем когда-либо.) Есть эмуляторы Nintendo GameCube (/usr/ports/emulators/gcube), PDP-11 (/usr/ports/emulators/sim) и т.д. Но поскольку эмуляторы практически не нужны на сервере, подробно они здесь не рассматриваются.

Реализация ABI

В дополнение к перекомпиляции и эмуляции есть последний вариант, благодаря которому система FreeBSD снискала известность: реализация машинного интерфейса прикладных программ (Application Binary Interface, ABI). ABI — это часть ядра, предоставляющая программам различные сервисы — от доступа к звуковым картам и чтения файлов до вывода изображения на экран и запуска других программ — все, что может понадобиться программам. С точки зрения программ, ABI — это операционная система. Полностью реализовав ABI той или иной операционной системы в своей системе, вы сможете выполнять «неродные» программы так, как они выполняются на «родной» платформе.

Хотя реализация ABI часто трактуется как эмуляция, это не так. Предоставляя ABI, система FreeBSD не эмулирует системные вызовы, а реализует их естественным образом. В этом случае отсутствует программное обеспечение, которое транслировало бы системные вызовы «чужой» операционной системы в их эквиваленты FreeBSD или вызовы библиотечных функций в эквивалентные вызовы аналогичных библиотек FreeBSD. Ко всему прочему, было бы неверным сказать, что «FreeBSD реализует Linux» или «FreeBSD реализует Solaris». На самом деле, после создания этой технологии никому не удалось в двух словах описать, что же сделала команда FreeBSD. Даже сегодня неясно, как объяснить это вкратце. Вы можете сказать, что FreeBSD реализует интерфейс системных вызовов Linux и включает поддержку перенаправления вызовов в соответствующий интерфейс системных вызовов. Чаще всего применяют термин режим (mode), например «режим Linux» или «режим System V».

Трудности с эмуляцией ABI происходят из-за наложения имен. В большинстве операционных систем есть системные вызовы с общими именами, например read, write и т. д. Системный вызов read(2) во FreeBSD работает совершенно иначе по сравнению с системным вызовом read() в системе Windows. Когда программа вызывает read, FreeBSD должна отличать, какой это вызов — «родной» или «неродной». Системным вызовам можно дать различные имена, но тогда это будет нарушением стандарта POSIX. Либо надо предоставлять различные интерфейсы ABI и предписывать той или иной программе, какой ABI использовать. Именно такая схема идентификации реализована во FreeBSD.

Проверка типа исполняемого файла

Как правило, запуск программ в операционных системах выполняет специальная системная функция. Когда ядро отправляет программу этому модулю исполнения, он запускает программу.

Однако несколько десятилетий тому назад в BSD (в то время — UNIX) в систему запуска программ была добавлена специальная проверка. Если программа начинается с #!/bin/sh, то она передается не модулю исполнения, а командному интерпретатору. В BSD эта идея была логически продолжена: модуль исполнения взаимодействует с различными типами исполняемых файлов. Согласно своему типу, каждая программа перенаправляется соответствующему ABI. Таким образом, в системе BSD может быть несколько интерфейсов ABI, следовательно, она может поддерживать программы из различных операционных систем.

Отличительная черта такого механизма перенаправления — отсутствие издержек. Раз система так или иначе справляется с запуском программы, то почему бы ей не выбирать и ABI? В конце концов, исполняемые файлы, созданные для различных операционных систем, можно идентифицировать по характерным признакам; механизм идентификации и перенаправления делает этот процесс прозрачным для конечного пользователя. Идентификация двоичных исполняемых файлов называется брендингом (branding), или типизацией. Двоичные исполняемые файлы FreeBSD несут в себе опознавательный признак (клеймо) FreeBSD, а файлы из других операционных систем различаются по признакам принадлежности к соответствующей операционной системе.

Поддерживаемые ABI

Благодаря возможностям перенаправления программ разным ABI система FreeBSD способна запускать программы Linux и SVR4, как будто они были скомпилированы в ней самой. В ранних версиях FreeBSD имелась и возможность запускать исполняемые файлы из операционных систем OSF/1 и SCO, но потребность в поддержке этих платформ существенно снизилась.*

SVR4, или System V Release 4, была последним основным «выпуском» UNIX от AT&T. Она встречается в ранних версиях Solaris и SCO UNIX. (По некоторым отзывам, в режиме SVR4 системы FreeBSD некоторые программы SCO выполняются быстрее, чем в самой SCO UNIX.) В настоящее время программное обеспечение для SVR4 уже практически не применяется, но вы должны знать, что его все еще можно использовать.

Режим Linux, также известный как Linuxulator, позволяет запускать программы Linux во FreeBSD. Этот ABI был протестирован наиболее тщательно, потому что исходный код Linux доступен, a ABI хорошо документирован. На самом деле режим Linux работает так хорошо, что на него опираются многие программы из коллекции «портов». Я спокойно использую версии для Linux таких программ, как Macromedia Flash и Adobe Acrobat Reader, и даже коммерческое программное обеспечение, такое как PGP Command Line, прекрасно работает в режиме Linux. Основное внимание мы уделим именно режиму Linux как наиболее ценному для среднего пользователя.

Библиотеки программ из других систем

Хотя реализация ABI решает одну основную задачу, но программам требуется не только ABI. Большинство программ не смогут работать в отсутствие поддержки разделяемых библиотек. Какой бы ABI ни применялся, обеспечить доступ к пространству пользователя данной платформы необходимо.

Для работы в режиме SVR4 потребуется компакт-диск Sun Solaris 2.5.1. Ранние версии операционной системы Solaris являются коммерческими продуктами, поэтому проект FreeBSD не может просто так взять и передать их вам. Это вполне преодолимо, но делает использование режима SVR4 более трудоемким и дорогостоящим. Если у вас имеется этот компакт-диск, загляните в /usr/ports/emulators/svr4_base.

Библиотеки для режима Linux — самые доступные. Поскольку препятствия к доступу незначительны, мы рассмотрим совместимость с Linux более подробно. Изучив режим Linux, вы сможете применить знания для реализации любого ABI.

Комментарии запрещены.