Запуск Linux-приложений из FreeBSD

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

Разумеется, проделать такую процедуру можно только в том случае, если исходные тексты нужной программы доступны. И тут выступает оборотная сторона медали популярности Linux, привлекшей к ней внимание производителей проприетарного софта. Каковые распространяют свои достижения, пусть подчас и бесплатно (при некоторых ограничениях), но — только в прекомпилированном специально под Linux виде (а иногда и под конкретный его дистрибутив, чаще всего — под RedHat и его клоны).

Однако на самое хитрое ухо всегда найдется палец с левой резьбой. И в данном случае таким «леворезьбовым» инструментом оказывается режим бинарной совместимости с Linux, реализованный во FreeBSD, который позволяет запустить минимум 90% всех Linux-приложений. Он основывается, насколько нам известно, на подмене системных вызовов ядра Linux соответствующими вызовами ядра FreeBSD. И, в отличие от большинства эмуляторов (и, тем более, виртуальных машин типа VMWare), практически не приводит к снижению производительности. Высказывается даже мнение, что Linux-программы в режиме совместимости во FreeBSD выполняются быстрее, чем в родной среде. Впрочем, количественные данные на этот предмет нам не известны.

Доступ к режиму совместимости требует двух действий — установки пакета linux-base и внесения изменений в конфигурационный файл /etc/rc.conf. Самый простой путь к этому — программа sysinstall. Запустив оную, следует отправиться в меню Configure, перейти в пункт Packages и в списке доступных (на CD, ftp- или http-сервере) пакетов выбрать в разделе emulators тот, который называется linux_base.

После установки пакета нужно будет подняться до пункта Startup в том же меню Configure и отметить опцию Linux (расшифровывающуюся как This host wants to be able to run Linux binaries).

Все, теперь после перезапуска машины режим Linux-совместимости будет доступным.

Можно поступить еще проще — сразу отправиться в пункт Configure → Startup и отметить опцию Linux. По выходе из него будет автоматически предложено установить пакет linux_base, с чем, естественно, следует согласиться.

Другой путь — установить linux_base посредством системы портов, для чего нужно перейти в каталог /usr/ports/emulators/linux_base и дать команду.

% make install clean

А затем в любом текстовом редакторе вручную добавить в файл /etc/rc.conf строку:

linux_enable="YES"

и перезагрузить машину.

Результат в любом случае будет одинаков — появление в каталоге /usr/compat подкаталога linux (и символической ссылки на него в корневом каталоге — /compat/linux. Он представляет собой обычное дерево файловой системы Linux, с подкаталогами bin, etc, libs и так далее, который может быть сделан корневым с помощью столь же обычной команды chroot. Впрочем, в режиме Linux-совместимости исполнимые файлы автоматически ищутся в соответствующих ветвях каталога /usr/compat/linux, и необходимости в смене корня в большинстве случаев не возникает.

Устанавливая linux_base по умолчанию, мы получаем своего рода теневую Linux-систему, соответствующую (в текущей ветке FreeBSD) примерно RedHat 7.X. Дополнительный к чему бонус — получение возможности работы с rpm-пакетами вообще (хотя сам rpm можно установить и независимо). Однако из портов можно при необходимости установить совместимость с более старым RedHat (версий 6.X) или даже Debian (порты для них находятся в каталогах /usr/ports/emulators/linux_base-6 и /usr/ports/emulators/linux_base-debian, соответственно.

Получив доступ к режиму Linux-совместимости, дело остается за малым установить сами Linux-программы. Делается это различными, иногда не совсем тривиальными, способами, некоторые из которых описаны во FreeBSD Handbook. Однако для некоторых Linux-программ установка во FreeBSD проста, как грабли.

Как мы уже говорили, устанавливая linux_base по умолчанию, мы одновременно получаем возможность прямой установки прекомпилированных для Linux rpm-пакетов. Делается это точно так же, как в RedHat, ASP- или Altlinux — командой rpm -i (hv при необходимости). Однако она потребует некоторых дополнительных опций — указания нового корня (очевидно, что им должен быть /usr/compat/linux), пути к базе данных rpm-пакетов и игнорирования ОС:

% rpm -i --ignoreos --root /usr/compat/linux --dbpath /var/lib/rpm package_name.rpm

Установленные таким образом пакеты должны запускаться с указанием полного пути — /usr/compat/linux/usr/bin, например.

Теперь можно смело переходит к статье «Установка сервера под операционную систему Linux».

Правовая информация

Статья и авторские права на статью принадлежат сайту www.citforum.ru
Алексей Федорчук
Евгений Чайкин aka StraNNick