Установка linux на freebsd
дЧПЙЮОБС УПЧНЕУФЙНПУФШ У Linux ОЕ ЧЛМАЮЕОБ РП ХНПМЮБОЙА. рТПУФЕКЫЙК УРПУПВ ЧЛМАЮЕОЙС ЬФПК ЖХОЛГЙПОБМШОПУФЙ ЪБЛМАЮБЕФУС Ч ЪБЗТХЪЛЕ KLD-ПВЯЕЛФБ linux ( Kernel LoaDable object >> ). чЩ НПЦЕФЕ ЪБЗТХЪЙФШ ЬФПФ НПДХМШ, ОБВТБЧ УМЕДХАЭЕЕ, ЛБЛ РПМШЪПЧБФЕМШ root :
еУМЙ ЧЩ ИПФЙФЕ, ЮФПВЩ УПЧНЕУФЙНПУФШ У Linux ВЩМБ ЧЛМАЮЕОБ РПУФПСООП, ОЕПВИПДЙНП ДПВБЧЙФШ Ч /etc/rc.conf УМЕДХАЭХА УФТПЛХ:
дМС РТПЧЕТЛЙ ФПЗП, ЪБЗТХЦЕО МЙ НПДХМШ, НПЦЕФ ВЩФШ ЙУРПМШЪПЧБОБ ЛПНБОДБ kldstat (8) :
еУМЙ РП ЛБЛПК-МЙВП РТЙЮЙОЕ ЧЩ ОЕ ИПФЙФЕ ЙМЙ ОЕ НПЦЕФЕ ЪБЗТХЪЙФШ KLD, ЧЩ НПЦЕФЕ УФБФЙЮЕУЛЙ ЧЛМАЮЙФШ РПДДЕТЦЛХ Linux Ч СДТП, ДПВБЧЙЧ ПРГЙА options COMPAT_LINUX Ч ЖБКМ ЛПОЖЙЗХТБГЙЙ СДТБ. ъБФЕН УПВЕТЙФЕ Й ХУФБОПЧЙФЕ ОПЧПЕ СДТП, УМЕДХС ПРЙУБОЙА Ч зМБЧБљ9, оБУФТПКЛБ СДТБ FreeBSD.
11.2.1. хУФБОПЧЛБ ОЕПВИПДЙНЩИ ВЙВМЙПФЕЛ Linux
хУФБОПЧЙФШ ЧУЕ ФТЕВХЕНЩЕ ВЙВМЙПФЕЛЙ НПЦОП ДЧХНС РХФСНЙ: МЙВП ЙУРПМШЪХС РПТФ linux_base, МЙВП ХУФБОПЧЙЧ ЙИ ЧТХЮОХА.
11.2.1.1. хУФБОПЧЛБ У РПНПЭША РПТФБ linux_base
ьФПФ НЕФПД СЧМСЕФУС УБНЩН РТПУФЩН, Й НЩ ТЕЛПНЕОДХЕН ЧПУРПМШЪПЧБФШУС ЙНЕООП ЙН. рТПГЕУУ БОБМПЗЙЮЕО ХУФБОПЧЛЕ МАВПЗП ДТХЗПЗП РПТФБ ЙЪ лПММЕЛГЙЙ рПТФПЧ. рТПУФП ЧЩРПМОЙФЕ УМЕДХАЭЙЕ ЛПНБОДЩ:
фЕРЕТШ ЧЩ НПЦЕФЕ ТБВПФБФШ У РТЙМПЦЕОЙСНЙ ДМС 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 :
чБН РПФТЕВХАФУС ЧУЕ ЖБКМЩ, РЕТЕЮЙУМЕООЩЕ Ч РПУМЕДОЕН УФПМВГЕ. уЛПРЙТХКФЕ ЙИ Ч ДЕТЕЧП /compat/linux ОБ ЧБЫЕК УЙУФЕНЕ, Б ФБЛЦЕ УПЪДБКФЕ УЙНЧПМЙЮЕУЛЙЕ УУЩМЛЙ ОБ ЬФЙ ЖБКМЩ У ЙНЕОБНЙ ЙЪ РЕТЧПЗП УФПМВГБ, УППФЧЕФУФЧЕООП. ч ЙФПЗЕ, Х ЧБУ Ч УЙУФЕНЕ FreeBSD ДПМЦОЩ ВЩФШ УМЕДХАЭЙЕ ЖБКМЩ:
рТЙНЕЮБОЙЕ:
хЮФЙФЕ, ЮФП ЕУМЙ Х ЧБУ ХЦЕ ЕУФШ УПЧНЕУФОП ЙУРПМШЪХЕНБС ВЙВМЙПФЕЛБ Linux У УППФЧЕФУФЧХАЭЙН РЕТЧПНХ УФПМВГХ ТЕЪХМШФБФПЧ ldd ПУОПЧОЩН ОПНЕТПН ЧЕТУЙЙ, ЧБН ОЕ ПВСЪБФЕМШОП ЛПРЙТПЧБФШ ЖБКМ, ХЛБЪБООЩК Ч РПУМЕДОЕН УФПМВГЕ, Ч ЧБЫХ УЙУФЕНХ. хЦЕ УХЭЕУФЧХАЭЙК ЖБКМ ДПМЦЕО РПДПКФЙ. тЕЛПНЕОДХЕФУС, ПДОБЛП, ЧУЕ ТБЧОП УЛПРЙТПЧБФШ УПЧНЕУФОП ЙУРПМШЪХЕНХА ВЙВМЙПФЕЛХ, ЕУМЙ ЕЕ ЧЕТУЙС ОПЧЕЕ. рТЕДЩДХЭХА ЧЕТУЙА ВЙВМЙПФЕЛЙ НПЦОП ХДБМЙФШ, ЕУМЙ ЧЩ УПЪДБМЙ УЙНЧПМЙЮЕУЛХА УУЩМЛХ ОБ ОПЧХА. йФБЛ, ЕУМЙ Х ЧБУ Ч УЙУФЕНЕ ЕУФШ УМЕДХАЭЙЕ ВЙВМЙПФЕЛЙ:
Й ЛБЛПЕ-МЙВП РТЙМПЦЕОЙЕ ФТЕВХЕФ ВЙВМЙПФЕЛХ ВПМЕЕ РПЪДОЕК ЧЕТУЙЙ, УХДС РП ТЕЪХМШФБФБН ЛПНБОДЩ ldd :
еУМЙ ЧЕТУЙЙ ОЕНОПЗП ПФМЙЮБАФУС Ч РПУМЕДОЕК ГЙЖТЕ, ЛПРЙТПЧБФШ /lib/libc.so.4.6.29 ОЕПВСЪБФЕМШОП, ФБЛ ЛБЛ РТПЗТБННБ, УЛПТЕЕ ЧУЕЗП, ВХДЕФ ОПТНБМШОП ТБВПФБФШ Й У ОЕНОПЗП ХУФБТЕЧЫЕК ЧЕТУЙЕК. фЕН ОЕ НЕОЕЕ, ЧЩ НПЦЕФЕ ЪБНЕОЙФШ libc.so :
рТЙНЕЮБОЙЕ:
уЙНЧПМЙЮЕУЛЙЕ УУЩМЛЙ ЧБЦОЩ ФПМШЛП ДМС Linux-РТПЗТБНН. Runtime-ЛПНРПОПЧЭЙЛ FreeBSD УБНПУФПСФЕМШОП РПДВЕТЕФ РТБЧЙМШОЩЕ ОПНЕТБ ЧЕТУЙК ВЙВМЙПФЕЛ, Й ЧБН ОЕ ОХЦОП ПВ ЬФПН ВЕУРПЛПЙФШУС.
11.2.2. хУФБОПЧЛБ ДЧПЙЮОЩИ ЖБКМПЧ Linux ELF
дМС ELF-ЖБКМПЧ ЙОПЗДБ ФТЕВХЕФУС УДЕМБФШ ФБЛ ОБЪЩЧБЕНЩК branding >> (НБТЛЙТПЧБФШ ЕЗП). еУМЙ РПРЩФБФШУС ЪБРХУФЙФШ ОЕ НБТЛЙТПЧБООЩК ELF-ЖБКМ, ЧЩ РПМХЮЙФЕ УМЕДХАЭЕЕ УППВЭЕОЙЕ ПВ ПЫЙВЛЕ:
юФПВЩ РПНПЮШ СДТХ FreeBSD ПФМЙЮЙФШ ELF-ЖБКМ FreeBSD ПФ ДЧПЙЮОПЗП ЖБКМБ Linux, ЙУРПМШЪХЕФУС ХФЙМЙФБ brandelf (1) :
ч ОБУФПСЭЕЕ ЧТЕНС ОБВПТ ЙОУФТХНЕОФБМШОЩИ УТЕДУФЧ GNU (GNU toolchain) РПНЕЭБЕФ ОЕПВИПДЙНХА НБТЛЙТПЧПЮОХА ЙОЖПТНБГЙА Ч ДЧПЙЮОЩЕ ELF-ЖБКМЩ БЧФПНБФЙЮЕУЛЙ, РПЬФПНХ ОЕПВИПДЙНПУФШ Ч ЬФПН ДЕКУФЧЙЙ ЧПЪОЙЛБЕФ ЧУЈ ТЕЦЕ.
11.2.3. лПОЖЙЗХТЙТПЧБОЙЕ ТБУРПЪОБЧБОЙС ЙНЕО ИПУФПЧ
еУМЙ DNS ОЕ ТБВПФБЕФ ЙМЙ ЧЩ РПМХЮБЕФЕ ЬФП УППВЭЕОЙЕ:
ФП ЧБН ОХЦОП УПЪДБФШ (ЙЪНЕОЙФШ) ЖБКМ /compat/linux/etc/host.conf , УПДЕТЦБЭЙК:
фБЛЙН ПВТБЪПН, ЧЩ ХЛБЪЩЧБЕФЕ, ФП УОБЮБМБ РТПЙЪЧПДЙФУС РПЙУЛ Ч ЖБКМЕ /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 (R) |
рП ЧПРТПУБН, УЧСЪБООЩН У FreeBSD, РТПЮЙФБКФЕ ДПЛХНЕОФБГЙА РТЕЦДЕ ЮЕН РЙУБФШ Ч .
рП ЧПРТПУБН, УЧСЪБООЩН У ЬФПК ДПЛХНЕОФБГЙЕК, РЙЫЙФЕ Ч ТБУУЩМЛХ .
» Статьи » Все об эмуляции Linux во FreeBSD
Все об эмуляции Linux во FreeBSD | Статьи |
Несмотря на то что современная FreeBSD достаточно популярна и хорошо подходит для применения в самых различных сферах: от высоконагруженных серверов до домашних компьютеров, она все же уступает Linux в одном немаловажном отношении — доступности программного обеспечения. Разработчики коммерческого ПО неохотно портируют свои продукты во FreeBSD, останавливаясь на ее гораздо более популярном конкуренте. К счастью, есть выход — эмуляция Linux.
Как это работает
Перед тем как приступать к настройке, мы посвятим несколько минут изучению внутренней структуры и механизмов работы эмулятора Linux. Это нужно для того, чтобы в случае возникновения ошибки или каких-либо трудностей ты смог правильно идентифицировать и устранить проблему.
Во-первых, эмуляция Linux — это вовсе не эмуляция, а имитация, прослойка, которая позволяет FreeBSD выдавать себя за Linux. Несмотря на то что почти все серьезные UNIX-подобные операционные системы совместимы между собой на уровне API (Application Programming Interface) и следуют стандарту POSIX, бинарный интерфейс (ABI — Application Binary Interface) этих ОС в большинстве случаев не совпадает. Например, FreeBSD использует Си-конвенцию системных вызовов, которая предусматривает передачу аргументов через стек, в то время как Linux требует, чтобы аргументы системных вызовов передавались в регистрах общего назначения. Кроме того, наборы системных вызовов Linux и FreeBSD в некоторых местах не совпадают.
Если исходный код программы доступен и написан с соблюдением общепринятых стандартов (в первую очередь POSIX), то не составит труда пересобрать программу для конкретной операционной системы (о совместимости ABI позаботится компилятор и низкоуровневые библиотеки), но что делать, если доступ к исходному коду закрыт? На этот случай во FreeBSD и других BSD-системах предусмотрен уровень совместимости, позволяющий операционной системе имитировать ABI другой UNIX-подобной ОС. Благодаря этому уровню «чужие» программы даже не догадываются о том, что их исполнение происходит в другой операционной системе.
Если мы рассмотрим процесс загрузки и исполнения бинарного файла Linux во FreeBSD подробнее, то увидим следующее. Прочитав заголовок исполняемого файла, FreeBSD найдет в нем специальную метку, говорящую о том, что это бинарный файл Linux, и активизирует уровень совместимости, который предоставит созданному процессу таблицу системных вызовов, совместимую с Linux. При этом сам процесс будет помещен в chroot-окружение (/compat/linux), содержащее копию среды Linux (то есть все, что может потребоваться программе во время работы, и в первую очередь библиотеки). Исполняясь в этой среде, процесс сможет обращаться к системным вызовам, загружать библиотеки, читать/писать файлы и делать все, что позволит ОС.
Несколько лет назад для запуска программ Linux во FreeBSD от пользователя требовалось пометить исполняемый файл специальным флагом (команда «brandelf -t Linux файл»), чтобы ядро смогло определить, что запускается бинарный файл Linux, и активировать режим совместимости. Современные версии компиляторов выставляют такую метку самостоятельно, и необходимость в этой процедуре возникает только в том случае, если пользователь запускает очень древнюю программу.
Настройка
Настройку двоичной совместимости с Linux условно можно разделить на два этапа. Первый — это конфигурирование ядра таким образом, чтобы научить его правильно обрабатывать исполняемые файлы, собранные для Linux. А второй — установка Linux-окружения, в котором эти файлы смогут корректно исполняться.
Пространство ядра
Для того чтобы научить ядро FreeBSD понимать исполняемые файлы Linux, достаточно подгрузить модуль linux.ko (kldload linux), содержащий все необходимые обработчики и альтернативную таблицу системных вызовов. После этого операционная система фактически будет готова к принятию «чужого» кода. Для «закрепления результата» следует добавить строку « linux_load=»YES» » в /boot/loader.conf (загрузка одновременно с ядром), либо « linux_enable=»YES» » в /etc/rc.conf (загрузка во время инициализации системы).
Поклонники монолитной модели ядра могут избежать необходимости ручной загрузки модуля, просто включив код совместимости в ядро. Конфигурационный файл ядра должен содержать следующие строки:
Если сборка будет происходить для архитектуры amd64, то вместо COMPAT_LINUX следует указать строку COMPAT_LINUX32. Последние две строки указывают на то, что код Linux-реализаций файловых систем proc и sys также должен быть включен в ядро. Делать это не обязательно, каждая из них может быть собрана модулем.
На этом настройка ядра заканчивается, и мы переходим к конфигурированию Linux-окружения.
Пространство пользователя
Как уже было сказано ранее, исполнение бинарных файлов Linux происходит в изолированном окружении, которое располагается в каталоге /compat/linux. Чтобы программы могли работать в таком окружении, им требуется доступ ко всем необходимым библиотекам, конфигурационным файлам и специальным файлам, вроде тех, что находятся в каталоге /proc. Есть несколько способов обеспечить наличие этих файлов, мы рассмотрим их все.
Вариант первый. Классический
Первый и самый правильный прием, рекомендуемый разработчиками FreeBSD, заключается в установке окружения через коллекцию портов. Существует несколько портов, воссоздающих окружение времени исполнения различных дистрибутивов Linux. В современных версиях FreeBSD средой исполнения по умолчанию является набор пакетов из дистрибутива Fedora Core 4 (emulators/linux_base-fc4), также доступны коллекции пакетов из дистрибутива Gentoo 2006.0 (linux_base-gentoo-stage1, linux_base-gentoo-stage2 и linux_base-gentoo-stage3). По большому счету неважно, какой из них использовать. Необходимость в переключении на окружение другого дистрибутива может возникнуть только в случае, если программа откажется работать в среде, установленной в данный момент.
В случае если Linux-окружение не было установлено во время инсталляции операционной системы, необходимо воспользоваться командой pkg_add /cdrom/packages/All/linux_base-fc-4_9.tbz (имя пакета может отличаться в зависимости от версии FreeBSD), либо пройти в каталог /usr/ports/emulators/linux_base-fc4 и набрать «make install clean». После того как одна из этих операций будет проделана, каталог /compat/linux превратится в локальную версию дистрибутива Linux.
Теперь необходимо обеспечить доступ к виртуальным файловым системам, без этого действия некоторые программы Linux откажутся работать. Открываем файл /etc/fstab и добавляем в него следующие строки:
none /compat/linux/proc linprocfs rw 0 0
none /compat/linux/sys linsysfs rw 0 0
none /compat/linux/dev devfs rw 0 0
Первые две строки указывают на то, что к каталогам proc и sys, находящимся внутри окружения Linux, необходимо подключить Linux-версии файловых систем procfs и sysfs. Последняя же строка говорит о том, что к каталогу dev также должна быть примонтирована родная файловая система devfs. Это может показаться абсурдом, так как практически ни один специальный файл этого каталога не совпадает по имени у FreeBSD и Linux. На самом деле, файловая система devfs нужна только для того, чтобы Linux-программы смогли выводить звук, ведь интерфейс OSS, используемый в обеих операционных системах, является стандартом и одинаков в Linux и FreeBSD.
После того как операция по модификации файла /etc/fstab будет закончена, набираем «mount –a», чтобы изменения вступили в силу. Это все, теперь внутри твоей FreeBSD поселился самый настоящий Linux. Ты даже можешь переместиться в него, набрав от имени суперпользователя команду chroot /compat/linux /bin/bash. Все программы Linux теперь должны запускаться и корректно работать. Это относится не только к простым программам, вроде xcalc, но и к комплексным, вроде Quake4 или UT2004. При этом гарантируется, что программа будет работать с такой скоростью, как если бы она была запущена в настоящем Linux.
Вариант второй. Грязный
Второй вариант настройки среды исполнения заключается в ручном копировании необходимых файлов в каталог /compat/linux, без использования коллекции портов или пакетов. Достоинство подхода в том, что он не требует выкачивания из сети сотен мегабайт данных и позволяет использовать уже имеющееся дерево файлов Linux (например, взятое с дистрибутивного диска). Описывать способ нет смысла, потому что подробности совершаемых операций зависят от дистрибутива Linux и не универсальны.
В общем случае все, что требуется сделать, — это скопировать базовый комплект дистрибутивных пакетов и распаковать их в каталог /compat/linux. Это не так трудно, как кажется на первый взгляд. Следует установить FreeBSD-версию пакетного менеджера подопытного дистрибутива (например, archivers/rpm4 или archivers/dpkg) и с его помощью накатить нужные пакеты. Впоследствии недостающие пакеты можно добавить, используя уже родные Linux-версии этих программ:
Установка дополнительных пакетов
Red Hat/Fedora Core
# /compat/linux/bin/rpm -ihv —root=/compat/linux пакет.rpm
Debian/Ubuntu
# /compat/linux/usr/bin/dpkg -i —root=/compat/linux пакет.dpkg
Вариант третий. Простой
Процесс создания среды исполнения существенно упростится, если дистрибутив Linux уже установлен на смежном разделе. В этом случае не потребуется даже копирование, останется только подключить Linux-раздел к каталогу /compat/linux, и среда исполнения готова. Конечно, чтобы использовать этот прием, придется расместить Linux на файловой системе, поддерживаемой FreeBSD хотя бы в режиме чтения.
Вариант четвертый. Радикальный
Четвертый и последний вариант довольно радикальный и издевательский по своей задумке. Он применим в тех случаях, когда необходимо обеспечить Linux-программе доступ к корневой файловой системе (например, если программа должна обращаться к «настоящей» версии каталога /etc). Chroot-окружение, в которое помещается любой процесс Linux, не предоставляет такой возможности (в этом и заключается смысл песочницы). Но есть выход: можно просто создать ссылку /compat/linux, указывающую на корень ( rm -rf /compat/linux && ln -s / /compat/linux ), и тогда chroot-окружение станет идентичным корню. Проблема только в том, что Linux-программы не смогут работать с библиотеками FreeBSD, им нужны их нативные версии. Просто скопировать эти библиотеки в корень не удастся по причине пересечения имен, поэтому следует переименовать их по определенной схеме (например, libc.so.6 в libc-linux.so.6). После этого в файл /etc/libmap.conf можно добавить такие строки:
И так для всех библиотек, требуемых программе. Сами же Linux-программы следует положить в каталог /home/username/linux, именно для него будет действовать приведенное переназначение имен. Описанный способ может показаться слишком грубым, но он действительно работает и может помочь в определенных обстоятельствах.
Для тех отважных юниксоидов, что идут в ногу с прогрессом и используют последний срез CVS седьмой версии FreeBSD, рекомендую переключить режим совместимости на имитацию ядра Linux версии 2.6.19: sysctl compat.linux.osrelease=2.6.19. Версия 2.4.2, имитируемая по умолчанию, уже не удовлетворяет потребностям современных Linux-программ.
Коллекция портов FreeBSD насчитывает несколько десятков так называемых Linux-портов. Чтобы найти их, находясь в каталоге /usr/ports, набери команду make search name=linux-.
Переменные sysctl
Существует три переменные ядра, напрямую относящиеся к уровню совместимости с Linux: compat.linux.osname — имя имитируемой операционной системы; compat.linux.osrelease — версия ядра Linux, стабильные версии FreeBSD поддерживают только совместимость с ядром версии 2.4.2 (во FreeBSD 7 была добавлена поддержка ядра 2.6.19); compat.linux.oss_version — версия интерфейса OSS (Open Sound System).
Развеиваем миф о драйверах nVidia
Среди пользователей широко распространено мнение о том, что фирменные драйверы nVidia для FreeBSD — это не что иное, как драйверы Linux, работающие в режиме совместимости с Linux. Это, конечно же, неправда, на данный момент FreeBSD способна имитировать только ABI Linux, а не постоянно изменяющийся интерфейс между ядром и драйверами. Модуль совместимости с Linux, который так «любят» драйверы nVidia, нужен только для того, чтобы позволить пользователю играть в Linux-версии коммерческих игр.