Запуск linux программ на FreeBSD без полного комплекта linux_base



Введение

Те кто когда-то использовал для бекапирования Veritas Backup Exec знают, что агенты бекапирования есть для всего кроме *BSD. После некоторых мучений был найден способ запуска данного агента в режиме эмуляции linux, но без полного комплекта linux_base. Способ подходит для большинства системных (и не только) утилит использующих штатные библиотеки linux.

Описание метода

Для обеспечения запуска линуксовых программ вам необходим кусок любого linux_base дистрибутива, а именно папка /compat/linux/lib. Установите linux_base-fc4 (к примеру), скопируйте /compat/linux/lib куда-нибудь в другое место и можете смело сносить linux_base-fc4, он Вам не понадобится. Основной проблемой запуска linux программ является то, что программы запускаются в chroot окружении эмулятора. Т.е. запуск программы приводит к полной изоляции её от корня системы. Таким образом бекапирование системных директорий недоступно. Итак начнем.

Во первых уберем ссылку на linux эмулятор из корня системы.

#rm -rf /compat

Делаем symlink linux на наш /.

#ln -s / linux

На всякий пожарный делаем.

#kldunload linux
#kldload linux

Специфика использования для различных версий FreeBSD

FreeBSD 4.X, 5.X - просто копируем заранее скопированное содержимое /compat/linux/lib в /lib. Предварительно желательно визуально сравнить обе директории на предмет одинаковых файлов, но у меня проблем не было.

FreeBSD 4.X,5.X используют libc.so.5, linux эмулятор - libc.so.6 поэтому пересечения библиотек нет. Запуск линуксовой программы производится обычным способом, agent.linux24 от Veritas Backup Exec сразу видит всю систему не ограничивая себя ни в чем.

FreeBSD 6.X,7.X - здесь всё намного сложнее. В этом случае получаем пересекающиеся библиотеки libc.so.6, но выход есть.

Ставим hexedit.

#cd /usr/ports/editors/hexedit
#make install clean

Копируем в /lib все файлы от эмулятора кроме libc.so.6, переименовываем libc.so.6 в libc.so.1 (точно ни с чем не пересечется в будущем). Копируем libc.so.1 в /lib.

Обновляем список библиотек.

#ldconfig -rRm

Теперь наступает время hexedit.

Попытка запустить программу слинкованную на линуксовый libc.so.6 приведет к ошибке на FreeBSD 6.X,7.X Берем hexedit <имя программы>, ищем вхождение libc.so.6 и меняем на libc.so.1, жмем F2, CTRL+X. Пробуем запустить. Скорее всего программа запустится, если не запустилась, делаем ktrace <программа>, потом смотрим kdump и смотрим на чом спотыкается. Возможно не хватает каких-то библиотек которые можно взять из того-же linux_base.

Зачем всё так сложно?

Во первых, вы получаете полноценный доступ эмулируемой программы к ресурсам системы.

Во вторых, экономите дисковое место, 9 МБ (библиотеки) против 125+МБ (linux_base).

Заключение

Данный способ использовался мной для запуска Linux Veritas Backup Exec Agent и hlds_l CS 1.6 сервера на различных FreeBSD платформах.

На 6.X проблема решается именно бинарным хаком исполняемых программ. На 4.X,5.X проблем никогда не возникало.

From: Bad_UID zhecka@gmail.com

Обновлено: 12.03.2015