Запуск Linux-приложений из FreeBSD
aka StraNNick
Но на каждую тетку с резьбою
Обнаружится дядька с винтом.
Тимур Шаов
Существует устоявшееся мнение о том, что применение 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 проста, как грабли. Примером чему - RealPlayer.
Конечно, формат Real и для аудио, и для видео, - далеко не верх совершенства, особенно учитывая его закрытый характер. Однако ничего не поделаешь - лучшая на Руси (и не только) подборка существует только в этом формате, и до доведения до ума свободных альтернатив (тип Hylix) приходится слушать ее посредством проприетарного RealPlayer'а. Да и не крутит Hylix старые Real'ы - почему, остается загадкой.
Благо, для установки его Linux версии во FreeBSD достаточно скачать оную (например, можно взять rp8_linux20_libc6_i386_cs2.bin с диска OpenOffice.org сборки Altlinux), проверить, имеет ли этот файл бит исполнения (при скачивании, например, из под 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, например.
Многие из нас люблят периодически смотреть флэшки. Да-да, как это ни странно... Поэтому одним из первых портов, которые ставят такие любители (в из числе и один из авторов этой заметки), будет linuxplaginwrapper, включающий в себя flash-player для различных браузеров. Установка его проста, как кусок хозяйственного мыла. И столь же обманчива... Собственно, в самом процессе нет ничего сложного. Сложное начинается потом... Итак:
% cd /usr/ports/www/linuxpluginwrapper % make install clean % less /var/db/pkg/linuxpluginwrapper-20050320/+DISPLAY
И вот из этого-то less, или из вывода команды
$ pkg_info -Dx linuxpluginwrapper
мы и узнаем, что надо скопировать приведённый там текст в /etc/libmap.conf. Затем правим этот файл ручками (ничего сложного, всё хорошо документировано). На этом всё сложное и заканчивается...
Вуаля, флэшки проигрываются в браузере.
Но этого мало. Хотелось бы проигрывать их и, так сказать, стэндэлон. К сожалению, подходящего плейера не нашлось (те, что есть - не проигрывали тестовый файл).
В результате, оптимальным выходом оказался самый простой - запускать windows-версию flash-player'а из под wine. Результат оказался вполне удовлетворительным. Файл проигрывается, скорость нормальная, звук есть. Однако это - совсем другая история. Заметим лишь, что использовался , а в качестве тестового - (3,4 Mb).