11.2. Установка
Пред. | Глава 11. Двоичная совместимость с Linux | След.

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

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

`#` `kldload 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` в файл конфигурации ядра. Затем соберите и установите новое ядро, следуя описанию в Глава 9, Настройка ядра FreeBSD.

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

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

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

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

`#` `cd /usr/ports/emulators/linux_base-fc4` `#` `make install distclean`

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

### Примечание:

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

#### 11.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-программ без дополнительных действий.

#### 11.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 самостоятельно подберет правильные номера версий библиотек, и вам не нужно об этом беспокоиться.

### 11.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-файлы автоматически, поэтому необходимость в этом действии возникает всё реже.

### 11.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`.

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

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

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