Chroot как средство усмирения пингвинов
Многие пользователи GNU/Linux любят устраивать holywars по поводу, какой же дистрибутив лучше: приходя в новый коллектив пытаются поставить на сервер их “единственный верный” Gentoo/Debian/Slackware вместо “убогих” RedHat/Ubuntu, им начинают противостоять злые админы и просто иноверцы и так далее. Описанный далее прием позволяет без особого ущерба нервной системе обеим сторонам работать в своем любимом окружении на одной и той же машине одновременно.
Те, кто имел опыт работы в Gentoo, знают, насколько продумана и удобна здесь система установки пакетов из исходных кодов: автоматическое установка зависимостей, управление параметрами компиляции и т.д. Но, к сожалению, не всегда на рабочем сервере удается поставить ту систему, которую мы хотим, и приходится работать с тем, что есть. Так было и в этот раз…
Сначала опишу типичный процесс компиляции на системах отличных от Gentoo, а потом расскажу, как все замечательно в ней, и как добиться этого же где угодно. Показывать буду на примере одного пакета и одной системы, но большая часть сказанного относится и к любым другим конфигурациям. В качестве систем используются: “убогий” RedHat-like дистрибутив и “единственно верная” Gentoo.
Для работы над одним проектом мне необходимо было установить VLC на сервер, на котором крутилась система на основе RedHat. В процессе изучения вопроса было выяснено, что под RedHat и ему подобное имеется только, насколько я понял, сторонняя сборка версии 0.8.6 (для сравнения, последняя версия VLC – 0.9.8a), что не вполне приемлемо для данного вида ПО (имеется ввиду, что linux-софт для обработки мультимедиа сейчас активно развивается, и в новых версиях могут быть жизненно необходимые возможности). Таким образом было принято решение – ставить из исходников. So, let’s have game started!
Level 1
Скачан архив, запущен стандартный ./configure и началось: у тебя нету библиотеки xxx, добавь опцию –disable-xxx или установи эту библиотеку и начни сначала. И так несколько раз подряд, пока не надоело. Изучение вопроса продолжилось, в результате чего был найден каталог extras/contrib, в нем скрипт bootstrap, создающий Makefile, благодаря которому все зависимости (в идеале) должны сами скачаться и откомпилироваться. Level 2
Итак, поехали:
./bootstrap make ... fribidi-run.Tpo -c fribidi-run.c -fPIC -DPIC -o .libs/fribidi-run.o fribidi-run.c: In function 'fribidi__new_run__internal__': fribidi-run.c:70: error: 'PAGE_SIZE' undeclared (first use in this function) fribidi-run.c:70: error: (Each undeclared identifier is reported only once fribidi-run.c:70: error: for each function it appears in.) make[5]: *** [fribidi-run.lo] Error 1 ...
Ладно, отключаем fribidi:
make ... /usr/bin/ld: /.../vlc-0.9.8a/extras/contrib/lib/libz.a(compress.o): relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC /.../vlc-0.9.8a/extras/contrib/lib/libz.a: could not read symbols: Bad value collect2: ld returned 1 exit status ...
Узнаем, как включить -fPIC (достаточно добавить ее в CFLAGS и CXXFLAGS в переменных окружения либо в Makefile), и с нехорошим предчувствием продолжаем:
make ... aclocal.m4:17: error: this file was generated for autoconf 2.61. You have another version of autoconf. If you want to use that, you should regenerate the build system entirely. ...
Тихо ругаемся, но не сдаемся: мы упорные, а Google – умный. Оказывается, надо сделать libtoolize –copy –force && aclocal в папке соотетствующего пакета. Что-ж продолжаем… Сделав это еще несколько раз и отключив установку нескольких некомпилирующихся пакетов, и переходим на следующий уровень.
Level 3
Теперь время комипилировать сам VLC:
./configure --disable-qt4 --disable-skins2 --disable-glx --disable-fribidi make ... /usr/bin/ld: /.../vlc-0.9.8a/./extras/contrib/lib/libavcodec.a(fft_mmx.o): relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC /.../vlc-0.9.8a/./extras/contrib/lib/libavcodec.a: could not read symbols: Bad value collect2: ld returned 1 exit status
К сожалению, от этой ошибки избавиться уже не удалось – видимо бубен утратил волшебную силу
Альтернатива
С приятной теплотой думаем, как это просто сделать в Gentoo:
echo "media-video/vlc a52 aac aalib fbcon flac httpd id3tag libcaca libv4l2 live matroska rtsp theora v4l v4l2 vlm x264" >> /etc/portage/package.use && emerge -av vlc
К сожалению, Gentoo на рабочий сервер поставить не получится, но тут, вспоминается магическое слово – chroot… Поначалу идея кажется слегка нелепой, но немного раздумий и убедительных доводов “против” не находится:
su - mkdir gentoo cd gentoo wget .../stage3-amd64-2008.0.tar.bz2 tar xjvpf stage3-amd64-2008.0.tar.bz2 wget .../portage-latest.tar.bz2 tar xjvf portage-latest.tar.bz2 -C usr/ cd .. mount -t proc none gentoo/proc mount -o bind /dev gentoo/dev chroot gentoo /bin/bash env-update source /etc/profile echo "media-video/vlc a52 aac aalib fbcon flac httpd id3tag libcaca libv4l2 live matroska rtsp theora v4l v4l2 vlm x264" >> /etc/portage/package.use emerge -av vlc
Конечно experienced-users должны будут еще настроить /etc/make.conf. Ну и желательно добавить непривилегированного юзера.
Final level
Запускать установленные программы можно прямо из chroot-окружения, что по идее должно быть немного безопасней в случае, если в запускаемой программе обнаружатся какие-нибудь уязвимости. Но в принципе можно попробовать вынести ее из chroot. Здесь может возникнуть проблема с используемыми библиотеками, но, думаю, ее можно будет обойти. Может быть попробую и напишу об этом позже.
Проблемы с компьютером? Попробуйте компьютерную помощь.
| Print article | This entry was posted by arti on December 24, 2008 at 11:57 pm, and is filed under Linux. Follow any responses to this post through RSS 2.0. Вы можете оставить комментарий или трэкбэк с вашего сайта. |
Русский
English
1 год назад
Замеч человечеству понадобились еще пингвины???
6 месяцев назад
а кто замеч к нам придет, тот от замеча и получит.
linux rules.