Руководство FreeBSD
Пред. | Глава 10. Двоичная совместимость с Linux | След.

# 10.2. Установка

Двоичная совместимость с Linux не включена по умолчанию. Простейший способ включения этой функциональности заключается в загрузке KLD-объекта linux (''Kernel LoaDable object''). Вы можете загрузить этот модуль, просто набрав `linux` в командной строке.

Если вы хотите, чтобы совместимость с Linux была включена постоянно, необходимо добавить в `/etc/rc.conf` следующую строку:

    linux_enable="YES"

Для проверки того, загружен ли модуль, может быть использована команда kldstat(8):

    % kldstat
    Id Refs Address    Size     Name
     1    2 0xc0100000 16bdb8   kernel
     7    1 0xc24db000 d000     linux.ko

Если по какой-либо причине вы не хотите или не можете загрузить KLD, вы можете статически включить поддержку Linux в ядро, добавив опцию options COMPAT_LINUX в файл конфигурации ядра. Затем соберите и установите новое ядро, следуя описанию в Гл. 8.

## 10.2.1. Установка необходимых библиотек Linux

Установить все требуемые библиотеки можно двумя путями: либо используя порт linux_base, либо установив их вручную.

### 10.2.1.1. Установка с помощью порта linux_base

Этот метод является самым простым, и мы рекомендуем воспользоваться именно им. Процесс аналогичен установке любого другого порта из коллекции портов. Просто выполните следующие команды:

    # cd /usr/ports/emulators/linux_base
    # make install distclean

Теперь вы можете работать с приложениями для Linux. Некоторые программы, возможно, будут сообщать о несоответствии подверсий некоторых системных библиотек. Однако обычно это не вызывает каких-либо неудобств.

> Замечание: Возможно наличие нескольких версий порта `emulators/linux_base`, соответствующих различным версиям разных дистрибутивов Linux. Вы должны установить порт, наиболее близко соответствующий требованиям приложений Linux, которые будут установлены.

### 10.2.1.2. Установка библиотек вручную

Если у вас не установлена коллекция портов, можно установить требуемые библиотеки вручную. Вам понадобятся совместно используемые библиотеки для Linux, которые нужны программам, и runtime-компоновщик. Вам также потребуется создать ''теневой корневой каталог'', `/compat/linux`, где будут расположены Linux-библиотеки. Если Linux-программе нужно загрузить какую-либо совместно используемую библиотеку, FreeBSD сперва будет пытаться найти ее в этом дереве. Так, если программа загружает, например, `/lib/libc.so`, FreeBSD попытается открыть `/compat/linux/lib/libc.so`, и если такого файла не существует, будет пытаться открыть `/lib/libc.so`. Разделяемые библиотеки должны находиться в теневом дереве, а не в каталогах, выдаваемых загрузчиком Linux `ld.so`.

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

### 10.2.1.3. Как установить дополнительные совместно используемые библиотеки

Что, если при установленном `linux_base` порте ваше приложение все равно сообщает об отсутствии необходимой библиотеки? Как узнать, какая именно нужна библиотека и где ее взять? В принципе, есть два способа. Вам необходимо иметь привилегии пользователя `root` для их осуществления.

Если у вас есть доступ к машине, на которой установлен Linux, узнайте, какие библиотеки использует Linux-приложение, и просто скопируйте из на свою машину. Рассмотрим следующий пример:

Допустим, вы скачали по FTP Linux-версию Doom и установили ее на Linux-машине. Вы можете узнать, какие совместно используемые библиотеки нужны Doom, с помощью команды `ldd linuxdoom`:

    % ldd linuxdoom
    libXt.so.3 (DLL Jump 3.1) => /usr/X11/lib/libXt.so.3.1.0
    libX11.so.3 (DLL Jump 3.1) => /usr/X11/lib/libX11.so.3.1.0
    libc.so.4 (DLL Jump 4.5pl26) => /lib/libc.so.4.6.29

Вам потребуются все файлы, перечисленные в последнем столбце. Скопируйте их в дерево `/compat/linux` на вашей системе, а также создайте символические ссылки на эти файлы с именами из первого столбца, соответственно. В итоге, у вас в системе FreeBSD должны быть следующие файлы:

    /compat/linux/usr/X11/lib/libXt.so.3.1.0
    /compat/linux/usr/X11/lib/libXt.so.3 -> libXt.so.3.1.0
    /compat/linux/usr/X11/lib/libX11.so.3.1.0
    /compat/linux/usr/X11/lib/libX11.so.3 -> libX11.so.3.1.0
    /compat/linux/lib/libc.so.4.6.29
    /compat/linux/lib/libc.so.4 -> libc.so.4.6.29

> > Замечание: Учтите, что если у вас уже есть совместно используемая библиотека Linux с соответствующим первому столбцу результатов `ldd` основным номером версии, вам не обязательно копировать файл, указанный в последнем столбце, в вашу систему. Уже существующий файл должен подойти. Рекомендуется, однако, все равно скопировать совместно используемую библиотеку, если ее версия новее. Предыдущую версию библиотеки можно удалить, если вы создали символическую ссылку на новую. Итак, если у вас в системе есть следующие библиотеки:

> >     /compat/linux/lib/libc.so.4.6.27
> >     /compat/linux/lib/libc.so.4 -> libc.so.4.6.27

> > и какое-либо приложение требует библиотеку более поздней версии, судя по результатам команды `ldd`:

> >     libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29

> > Если версии немного отличаются в последней цифре, копировать `/lib/libc.so.4.6.29` необязательно, так как программа, скорее всего, будет нормально работать и с немного устаревшей версией. Тем не менее, вы можете заменить `libc.so`:

> >     /compat/linux/lib/libc.so.4.6.29
> >     /compat/linux/lib/libc.so.4 -> libc.so.4.6.29

> > Замечание: Символические ссылки важны только для Linux-программ. Runtime-компоновщик FreeBSD самостоятельно подберет правильные номера версий библиотек, и вам не нужно об этом беспокоиться.

## 10.2.2. Установка двоичных файлов Linux ELF

Для ELF-файлов иногда требуется сделать так называемый ''branding'' (маркировать его). Если попытаться запустить немаркированный ELF-файл, вы получите следующее сообщение об ошибке:

    % ./моя-linux-elf-программа
    ELF binary type not known
    Abort

Чтобы помочь ядру FreeBSD отличить ELF-файл FreeBSD от двоичного файла Linux, используется утилита brandelf(1):

    % brandelf -t Linux моя-linux-elf-программа

В настоящее время набор инструментальных средств GNU (GNU toolchain) помещает необходимую маркировочную информацию в двоичные ELF-файлы автоматически, поэтому необходимость в этом действии возникает всё реже.

## 10.2.3. Конфигурирование распознавания имен хостов

Если DNS не работает или вы получаете это сообщение:

    resolv+: "bind" is an invalid keyword resolv+:
    "hosts" is an invalid keyword

то вам нужно создать (изменить) файл `/compat/linux/etc/host.conf`, содержащий:

    order hosts, bind
    multi on

Таким образом, вы указываете, то сначала производится поиск в файле `/etc/hosts`, а только затем запрашивается DNS. Когда файл `/compat/linux/etc/host.conf` отсутствует, Linux-приложения находят файл `/etc/host.conf` для FreeBSD и сообщают о несовместимом синтаксисе. Если вы не настраивали сервер имен с помощью файла `/etc/resolv.conf`, уберите bind из файла `/compat/linux/etc/host.conf`.

Пред. | Начало | След.
Двоичная совместимость с Linux | Уровень выше | Установка Mathematica®

Этот, и другие документы, могут быть скачаны с ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

По вопросам связанными с FreeBSD, прочитайте документацию прежде чем писать в <questions@FreeBSD.org>.
По вопросам связанным с этой документацией, пишите <doc@FreeBSD.org>.
По вопросам связанным с русским переводом документации, пишите в рассылку <frdp@FreeBSD.org.ua>.
Информация по подписке на эту рассылку находится на сайте проекта перевода.