- Поддержка linux в freebsd
- 10.2.1. Установка необходимых Linux библиотек
- 10.2.2. Установка Linux ELF исполняемых файлов
- 10.2.3. Распознавание доменных имен
- 21.2. Инсталляция
- 21.2.1. Установка необходимых Linux библиотек
- 21.2.1.1. Установка с помощью порта linux_base
- 21.2.1.2. Установка библиотек вручную
- 21.2.1.3. Как установить дополнительные разделяемые библиотеки
- 21.2.2. Настройка Linux ELF-исполняемых файлов
- 21.2.3. Распознавание доменных имен
Поддержка 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 порте ваше приложение все равно сообщает об отсутствии необходимой библиотеки? Как узнать, какая именно нужна библиотека и где ее взять? В принципе, есть два способа. Вам необходимо иметь привилегии суперпользователя для их осуществления.
Если у вас есть доступ к машине, на которой установлен 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.
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 приложение, и просто скопируйте из на свою машину. Например:
Допустим, Вы скачали по 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 .