From: Bad_UID <zhecka@gmail.com.>
Newsgroups: email
Date: Mon, 5 Oct 2006 14:31:37 +0000 (UTC)
Subject: Запуск 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, но выход есть.
Копируем в /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 проблем никогда не возникало.
Ссылки
- Библиотеки от linux_base для тех, кто
не хочет ставить linux_base.
382 Прочтений • [Запуск linux программ на FreeBSD без полного комплекта linux_base (linux freebsd)] [08.05.2012] [Комментариев: 0]