Поддержка linux в freebsd

Поддержка linux в freebsd

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

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

% 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 библиотек

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 библиотеки. Если нужно загрузить какую-либо разделяемую библиотеку, FreeBSD сперва будет пытаться найти ее в этом дереве. Так, если программа загружает, например, /lib/libc.so, FreeBSD попытается открыть /compat/linux/lib/libc.so, и если такого файла не существует, будет пытаться открыть /lib/libc.so. Разделяемые библиотеки должны находиться в теневом дереве, а не в пути, сообщаемым командой Linux ld.so.

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

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

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

Читайте также:  Установка yarn linux mint

Если у вас есть доступ к машине, на которой установлен 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 на вашей системе, а также создайте символические ссылки на эти файлы, с именами ссылок из первой колонки соответственно. В итоге у вас на машине должны быть следующие файлы:

/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

Замечание: Заметьте, что если у вас уже есть какая-либо из перечисленных библиотек, то ее не нужно копировать заново. Однако, у вас может быть более старая версия. В этом случае, лучше все-таки скопировать библиотеку поздней версии, изменив соответственно ссылку на нее. Предыдущую версию библиотеки можно удалить. Например, пусть у вас есть следующие библиотеки:

/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
% brandelf -t Linux linux-elf-программа 

В настоящее время 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 навигация в терминале

Источник

21.2. Инсталляция

Начиная с 3.0-RELEASE, больше нет необходимости указывать options LINUX или options COMPAT_LINUX в Вашем файле конфигурации ядра.

Поддержка Linux приложений осуществляется посредством специального модуля ядра (KLD объекта, «Kernel LoaDable object» ), то есть его можно загрузить/выгрузить «на лету» , без необходимости перезагрузки. Вам потребуется убедиться в наличии следующей строки в файле /etc/rc.conf :

Это, в свою очередь, повлияет на выполнение следующего кода в файле /etc/rc.i386 :

# Start the Linux binary compatibility if requested. # case $ in [Yy][Ee][Ss]) echo -n ‘ linux’; linux > /dev/null 2>&1 ;; esac

Если Вы хотите проверить, загружен ли модуль, это можно сделать при помощи команды kldstat :

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Читайте также:  Linux checking network speed

Допустим, Вы скачали по 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 на Вашей системе, а также создайте символические ссылки на эти файлы, с именами ссылок из первой колонки соответственно. В итоге у Вас на машине должны быть следующие файлы:

/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

Note: Заметьте, что если у Вас уже есть какая-либо из перечисленных библиотек, то ее не нужно копировать заново. Однако, у Вас может быть более старая версия. В этом случае, лучше все-таки скопировать библиотеку поздней версии, изменив соответственно ссылку на нее. Предыдущую версию библиотеки можно удалить. Например, пусть у Вас есть следующие библиотеки:

/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

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

21.2.2. Настройка Linux ELF-исполняемых файлов

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

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

то нужно изменить тип исполняемого файла, чтобы ядро FreeBSD правильно определило, что это Linux программа. Это можно сделать при помощи утилиты brandelf (1) :

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

Следует отметить, что программы, для которых необходим «branding» , встречаются все реже и реже, и в недалеком будущем Вы вряд ли прибегнете к нему вообще.

21.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 .

Источник

Оцените статью
Adblock
detector