Режим Linux


Чтобы установить Linuxulator, выберите программы, которым требуется режим Linux, и установите их. Система «портов» самостоятельно определит, что для работы программе требуется режим Linux, и установит соответствующее программное обеспечение Linux. Например, для просмотра документов в формате PDF я использую Adobe Acrobat Reader (/usr/ports/print/acroread7). Попытка установить эту программу автоматически вызовет установку режима Linux.

В ходе установки «порта» будет загружено и установлено в каталог /usr/compat/linux множество системных файлов Linux. Вместо библиотек FreeBSD программы для Linux будут использовать библиотеки из этого каталога.

Кроме того, будет загружен модуль ядра, обеспечивающий работу режима Linux. Чтобы этот модуль автоматически загружался при загрузке FreeBSD, добавьте в файл rc.conf следующую строку:

linux_enable="YES"

Вот и все! Теперь вы можете запускать программы для Linux без дополнительной настройки. Осталось лишь ликвидировать незначительные шероховатости режима Linux, которые, к сожалению, имеют место.

Библиотеки Linuxulator

Поддержку Linux ABI обеспечивает модуль ядра linux.ko, для работы Linuxulator тоже требуется несколько библиотек Linux. В каталоге /usr/compat/linux вы увидите примерно такой список каталогов:

# ls
bin    etc    lib    media    mnt    opt    proc    sbin    selinux srv
sys    usr    var

Похоже на содержимое корневого каталога FreeBSD, не правда ли? Если присмотреться внимательнее, можно заметить, что содержимое /usr/compat/linux в общих чертах схоже с содержимым основной системы FreeBSD. Здесь можно найти те же программы, что и в базовой системе FreeBSD.

Приверженец Linux сразу отметит, что содержимое «порта» linux_base лишь отчасти повторяет типичную систему Linux, потому что каждый «порт» linux_base устанавливает лишь то, что ему нужно для работы. При установке новых «портов» система расширяет набор библиотек Linux, если это требуется.

По возможности программы режима Linux пытаются «остаться» в /usr/compat/linux, что отчасти напоминает незапертую клетку (глава 9). Когда система выполняет программу Linux, вызывающую другие программы, Linux ABI сначала ищет их в /usr/compat/linux. Если в этом каталоге программа не найдена, то ABI ищет ее в основной системе FreeBSD. Например, представим программу Linux, которая вызывает ping(8). Сначала ABI будет искать программу ping в /usr/compat/linux. Обнаружив, что ее там нет, ABI обратится к основной системе FreeBSD, найдет /sbin/ping и использует ее. Данная возможность позволяет сократить число библиотек Linux, устанавливаемых режимом Linux.

Другой пример. Предположим, программа Linux хочет вызвать sh(1). Linux ABI сначала проверит /usr/compat/linux и найдет /usr/compat/linux/bin/sh, а затем запустит ее вместо «родной» программы /bin/sh системы FreeBSD.

Что такое linux_base?

Вам нередко будут встречаться упоминания чего-то под названием linux_base. Раньше поддержка режима Linux устанавливалась из «порта» с именем linux_base, и лишь после этого устанавливалось программное обеспечение, работающее в этом режиме. Современная операционная система FreeBSD делает это автоматически, незаметно для пользователя, что позволяет устанавливать необходимое программное обеспечение, не заботясь о предъявляемых требованиях. Различные «порты» linux_base, которые можно увидеть в каталоге /usr/ports/emulators, предназначены для разработчиков и проверки совместимости, но не для того, чтобы вы их устанавливали.

Тестирование режима Linux

Теперь, когда вы получили некоторое представление о том, что устанавливается для поддержки режима Linux, можно протестировать его работу. Запустите командную оболочку Linux и спросите ее о типе операционной системы:

На запрос типа операционной системы (1) командный интерпретатор отвечает, что это операционная система Linux (2), основанная на ядре Linux 2.4.2 (3) с названием FreeBSD (4). Круто, да?

Однако не нужно забывать, что режим Linux — это не полное окружение Linux. В режиме Linux невозможно выполнить кросс-компиляцию программ. Вы сможете решать только самые общие задачи.

Идентификация и типизация

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

Посмотрим и изменим клеймо с помощью утилиты brandelf(1):

# brandelf /bin/sh
File '/bin/sh' is of brand 'FreeBSD' (9).

Ничего удивительного. Это двоичный исполняемый файл из операционной системы FreeBSD, поэтому он будет запускаться под управлением FreeBSD ABI. Попробуем посмотреть клеймо программы Linux:

# brandelf /usr/compat/linux/bin/sh
File '/usr/compat/linux/bin/sh' is of brand 'Linux' (3).

Если имеется «неродная» программа, которая не желает запускаться, следует проверить ее клеймо. Если клеймо отсутствует или оно неправильное, то, возможно, вы обнаружили причину проблемы: FreeBSD пытается запустить программу под управлением «родного» FreeBSD ABI. Измените клеймо вручную с помощью команды brandelf -t. Например, типизация программы Linux выполняется следующим образом:

# brandelf -t Linux /usr/local/bin/имя_программы

При следующем запуске программы FreeBSD выполнит ее под управлением Linux ABI с применением библиотек Linux, и тогда программа должна заработать.

linprocfs

В операционной системе Linux используется файловая система процессов, или procfs. В операционной системе FreeBSD несколько лет тому назад эта файловая система была ликвидирована из соображений безопасности, но некоторые программы Linux, работающие в режиме Linux, требуют присутствия этой файловой системы. Применять программное обеспечение Linux, требующее наличия procfs, рискованно. В операционной системе FreeBSD файловая система procfs Linux доступна как linprocfs(5).

Чтобы разрешить использование linprocfs(5), нужно после установки режима Linux добавить в файл /etc/fstab следующую строку:

linproc       /compat/linux/proc      linprocfs rw      0     0

FreeBSD загружает модули ядра, обеспечивающие поддержку файловой системы, по требованию, поэтому для активизации linprocfs(5) достаточно просто ввести команду mount /compat/linux/proc.

Отладка режима Linux с помощью truss(1)

Режим Linux — это не Linux, что только осложняет поиск причин, вызывающих ошибки в работе программ. Многие программы и без того выводят малопонятные сообщения об ошибках, а режим Linux может усилить неясность. Лучшим инструментом для отладки режима Linux из тех, которые мне когда-либо встречались, является truss(1) — трассировщик системных вызовов FreeBSD. Некоторые специалисты говорят, что применять truss(1) для этих целей — все равно что поставить 12-цилиндровый двигатель от грузовика «Бульдог» на фольксваген «Жук», но после тщательного и вдумчивого изучения я решил, что не согласен с ними. Это работает. Познакомившись с truss(1) поближе, вы удивитесь тому, что раньше могли обходиться без этой утилиты.

Утилита truss(1) точно идентифицирует, к каким системным вызовам обращается программа и какие результаты она получает. Не забывайте, что системные вызовы — это программный интерфейс ядра. Когда программа пытается выполнить некоторую операцию в сети, открыть файл или даже выделить память, она производит системный вызов. Это делает утилиту truss(1) превосходным инструментом поиска причин, вызывающих ошибки в работе программы. Программы производят большое число системных вызовов, а это означает, что truss(1) генерирует огромный объем данных, которые лучше обрабатывать с помощью script(1).

Например, как-то раз я установил в операционную систему FreeBSD версию PGP Command Line для Linux.* Согласно справочному руководству, при запуске с ключом -h программа выводит инструкции по пользованию программой. У меня имеется полное руководство, тем не менее при запуске в режиме Linux программа сообщает:

# pgp -h
/home/mwlucas:unknown (3078: could not create directory, Permission denied) (Перевод: /home/mwlucas:unknown (3078: невозможно создать каталог, доступ запрещен))

Хорошая новость: программа запускается! Плохая новость: она где-то «спотыкается». Какой каталог она пытается создать? Это можно узнать с помощью truss(1). Запустите сеанс script(1), запустите программу и выйдите из script(1).

Созданный файл будет заполнен сотнями или тысячами строк — как отыскать среди них причину ошибки? Ищите часть сообщения об ошибке или строку ERR. В данном случае я искал строку directory и нашел ее недалеко от конца полученного файла:

...
linux_open("/home/mwlucas/.pgp/randseed.rnd",0x8002,00) ERR#2 'No such file or directory'
linux_open("/home/mwlucas/.pgp/randseed.rnd",0x80c1,0600) ERR#2 'No such file or directory'
linux_open("/home/mwlucas/.pgp/randseed.rnd",0x8002,00) ERR#2 'No such file or directory'
...

Ага! Программа не может открыть файл в каталоге /home/mwlucas/.pgp, потому что этот каталог отсутствует. Как только я создал каталог .pgp, программа стала не только запускаться с ключом -h, но прекрасно справлялась и с более сложными заданиями.

В дополнение к truss(1) можно было бы использовать утилиты ktrace(1) и linux_kdump (/usr/ports/devel/linux_kdump) для анализа полученных результатов. Я рекомендую попробовать оба инструмента и выбрать наиболее удобный для себя.

Коммерческое программное обеспечение для Linux и режим Linux

Не забывайте, что производители коммерческого программного обеспечения для Linux не заботятся о поддержке режима Linux в операционной системе FreeBSD. Если вы работаете в организации, которая заключает с клиентами соглашения на обслуживание, и в случае появления проблем вам грозит денежный штраф — семь раз подумайте, прежде чем использовать режим Linux. Главное преимущество коммерческого программного обеспечения состоит в том, что у него имеется производитель, которому можно пожаловаться, если что-то пойдет не так, но режим Linux отменяет это преимущество.

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