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


Но на каждую тетку с резьбою
Обнаружится дядька с винтом.
Тимур Шаов

Существует устоявшееся мнение о том, что применение FreeBSD в качестве настольной системы затрудняется недостаточным (по сравнению, скажем, с Linux) количеством приложений общего назначения. При этом забывают часто, что база пользовательских программ этих систем практически одинакова. И почти все приложения, доступные в исходных текстах на условиях свободных лицензий, можно найти если не в коллекции пакетов FreeBSD, то уж в системе ее портов - точно (недавно прошло сообщение, что число портированных под FreeBSD программ дошло до 9 тысяч - не каждый дистрибутив 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 (в версии 5.1 это будет linux_base-7.1_X).

После установки пакета нужно будет подняться до пункта 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 проста, как грабли. Примером чему - RealPlayer.

Конечно, формат Real и для аудио, и для видео, - далеко не верх совершенства, особенно учитывая его закрытый характер. Однако ничего не поделаешь - лучшая на Руси (и не только) подборка авторской песни существует только в этом формате, и до доведения до ума свободных альтернатив (тип Hylix) приходится слушать ее посредством проприетарного RealPlayer'а.

Благо, для установки его Linux версии во FreeBSD достаточно скачать оную (у меня под рукой оказалась версия rp8_linux20_libc6_i386_cs2.bin), проверить, имеет ли этот файл бит исполнения (при скачивании, например, из под Windows он теряется), а затем просто запустить его (из-под root'а) в терминальном окне X-сессии:
$ ./rp8_linux20_libc6_i386_cs2.bin

Далее отвечаем на ряд обычных занудных вопросов (типа адреса электронной почты, страны, почтового кода - зачем бы он? - скорости соединения, после чего обнаруживаем в каталоге /usr/local подкаталог RealPlayer8. Из которого его можно запускать на исполнение (от имени уже обычного пользователя) с указанием полного пути
$ /usr/local/RealPlayer8/realplay

или создать символическую ссылку в любом охваченном переменной PATH каталоге.

Как я уже говорил, устанавливая 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, например

Обновлено: 12.03.2015