03.04.2014 Views

Май - Xakep Online

Май - Xakep Online

Май - Xakep Online

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

unixoid<br />

Linux в гостях<br />

у FreeBSD<br />

Все об эмуляции Linux во FreeBSD<br />

Linux<br />

Евгений «j1m» Зобнин<br />

/ j1m@list.ru /<br />

FreeBSD<br />

Несмотря на то что современная FreeBSD достаточно популярна и хорошо подходит для применения в самых<br />

различных сферах: от высоконагруженных серверов до домашних компьютеров, она все же уступает<br />

Linux в одном немаловажном отношении — доступности программного обеспечения. Разработчики<br />

коммерческого ПО неохотно портируют свои продукты во FreeBSD, останавливаясь на ее гораздо более<br />

популярном конкуренте. К счастью, есть выход — эмуляция Linux.<br />

Как это работает<br />

Перед тем как приступать к настройке, мы посвятим несколько минут изучению<br />

внутренней структуры и механизмов работы эмулятора Linux. Это<br />

нужно для того, чтобы в случае возникновения ошибки или каких-либо<br />

трудностей ты смог правильно идентифицировать и устранить проблему.<br />

Во-первых, эмуляция Linux — это вовсе не эмуляция, а имитация, прослойка,<br />

которая позволяет FreeBSD выдавать себя за Linux. Несмотря на то что почти<br />

все серьезные UNIX-подобные операционные системы совместимы между<br />

собой на уровне API (Application Programming Interface) и следуют стандарту<br />

POSIX, бинарный интерфейс (ABI — Application Binary Interface) этих ОС в<br />

большинстве случаев не совпадает. Например, FreeBSD использует Си-конвенцию<br />

системных вызовов, которая предусматривает передачу аргументов<br />

через стек, в то время как Linux требует, чтобы аргументы системных вызовов<br />

передавались в регистрах общего назначения. Кроме того, наборы системных<br />

вызовов Linux и FreeBSD в некоторых местах не совпадают.<br />

Если исходный код программы доступен и написан с соблюдением<br />

общепринятых стандартов (в первую очередь, POSIX), то не составит<br />

труда пересобрать программу для конкретной операционной системы (о<br />

совместимости ABI позаботится компилятор и низкоуровневые библиотеки),<br />

но что делать, если доступ к исходному коду закрыт? На этот случай<br />

во FreeBSD и других BSD-системах предусмотрен уровень совместимости,<br />

позволяющий операционной системе имитировать ABI другой<br />

UNIX-подобной ОС. Благодаря этому уровню «чужие» программы даже не<br />

догадываются о том, что их исполнение происходит в другой операционной<br />

системе.<br />

/ 116<br />

Если мы рассмотрим процесс загрузки и исполнения бинарного файла<br />

Linux во FreeBSD подробнее, то увидим следующее. Прочитав заголовок<br />

исполняемого файла, FreeBSD найдет в нем специальную метку,<br />

говорящую о том, что это бинарный файл Linux, и активизирует уровень<br />

совместимости, который предоставит созданному процессу таблицу<br />

системных вызовов, совместимую с Linux. При этом сам процесс будет<br />

помещен в chroot-окружение (/compat/linux), содержащее копию среды<br />

Linux (то есть все, что может потребоваться программе во время работы, и<br />

в первую очередь библиотеки). Исполняясь в этой среде, процесс сможет<br />

обращаться к системным вызовам, загружать библиотеки, читать/писать<br />

файлы и делать все, что позволит ОС.<br />

Несколько лет назад для запуска программ Linux во FreeBSD от пользователя<br />

требовалось пометить исполняемый файл специальным флагом<br />

(команда «brandelf -t Linux файл»), чтобы ядро смогло определить, что<br />

запускается бинарный файл Linux, и активировать режим совместимости.<br />

Современные версии компиляторов выставляют такую метку самостоятельно,<br />

и необходимость в этой процедуре возникает только в том случае,<br />

если пользователь запускает очень древнюю программу.<br />

Настройка<br />

Настройку двоичной совместимости с Linux условно можно разделить на<br />

два этапа. Первый — это конфигурирование ядра таким образом, чтобы<br />

научить его правильно обрабатывать исполняемые файлы, собранные для<br />

Linux. А второй — установка Linux-окружения, в котором эти файлы смогут<br />

корректно исполняться.<br />

xàêåð 05 /101/ 07

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!