<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Записки программиста &#187; Linux</title>
	<atom:link href="http://arti.kz/category/linux/feed" rel="self" type="application/rss+xml" />
	<link>http://arti.kz</link>
	<description></description>
	<lastBuildDate>Fri, 17 Jun 2011 03:56:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Chroot как средство усмирения пингвинов</title>
		<link>http://arti.kz/488-chroot-%d0%ba%d0%b0%d0%ba-%d1%81%d1%80%d0%b5%d0%b4%d1%81%d1%82%d0%b2%d0%be-%d1%83%d1%81%d0%bc%d0%b8%d1%80%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bf%d0%b8%d0%bd%d0%b3%d0%b2%d0%b8%d0%bd%d0%be%d0%b2</link>
		<comments>http://arti.kz/488-chroot-%d0%ba%d0%b0%d0%ba-%d1%81%d1%80%d0%b5%d0%b4%d1%81%d1%82%d0%b2%d0%be-%d1%83%d1%81%d0%bc%d0%b8%d1%80%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bf%d0%b8%d0%bd%d0%b3%d0%b2%d0%b8%d0%bd%d0%be%d0%b2#comments</comments>
		<pubDate>Wed, 24 Dec 2008 17:57:20 +0000</pubDate>
		<dc:creator>arti</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://arti.kz/?p=488</guid>
		<description><![CDATA[Многие пользователи GNU/Linux любят устраивать holywars по поводу, какой же дистрибутив лучше: приходя в новый коллектив пытаются поставить на сервер их &#171;единственный верный&#187; Gentoo/Debian/Slackware вместо &#171;убогих&#187; RedHat/Ubuntu, им начинают противостоять злые админы и просто иноверцы и так далее. Описанный далее прием позволяет без особого ущерба нервной системе обеим сторонам работать в своем любимом окружении на [...]]]></description>
			<content:encoded><![CDATA[<p><em><img class="alignright size-full wp-image-491" title="Дерущиеся пингвины" src="http://arti.kz/wp-content/uploads/2008/12/penguins.jpg" alt="Дерущиеся пингвины" width="250" height="171" />Многие пользователи GNU/Linux любят устраивать holywars по поводу, какой же дистрибутив лучше: приходя в новый коллектив пытаются поставить на сервер их &laquo;единственный верный&raquo; Gentoo/Debian/Slackware вместо &laquo;убогих&raquo; RedHat/Ubuntu, им начинают противостоять злые админы и просто иноверцы и так далее. Описанный далее прием позволяет без особого ущерба нервной системе обеим сторонам работать в своем любимом окружении на одной и той же машине одновременно.</em></p>
<p>Те, кто имел опыт работы в <strong>Gentoo</strong>, знают, насколько продумана и удобна здесь система <strong>установки пакетов из исходных кодов</strong>: автоматическое установка зависимостей, управление параметрами компиляции и т.д. Но, к сожалению, не всегда на рабочем сервере удается поставить ту систему, которую мы хотим, и приходится работать с тем, что есть. Так было и в этот раз&#8230;</p>
<p>Сначала опишу типичный процесс компиляции на системах отличных от <strong>Gentoo</strong>, а потом расскажу, как все замечательно в ней, и как добиться этого же где угодно. Показывать буду на примере одного пакета и одной системы, но большая часть сказанного относится и к любым другим конфигурациям. В качестве систем используются: &laquo;убогий&raquo; <strong>RedHat-like</strong> дистрибутив и &laquo;единственно верная&raquo; <strong>Gentoo</strong>.</p>
<p><span id="more-488"></span></p>
<p>Для работы над одним проектом мне необходимо было установить <a title="VLC" href="http://www.videolan.org/"><strong>VLC</strong></a> на сервер, на котором крутилась система на основе <strong>RedHat</strong>. В процессе изучения вопроса было выяснено, что под <strong>RedHat</strong> и ему подобное имеется только, насколько я понял, сторонняя сборка версии 0.8.6 (для сравнения, последняя версия <strong>VLC</strong> &#8211; 0.9.8a), что не вполне приемлемо для данного вида ПО (имеется ввиду, что linux-софт для обработки мультимедиа сейчас активно развивается, и в новых версиях могут быть жизненно необходимые возможности). Таким образом было принято решение &#8211; ставить из исходников. So, let&#8217;s have game started!</p>
<p><strong>Level 1</strong></p>
<p>Скачан архив, запущен стандартный <strong>./configure</strong> и началось: у тебя нету библиотеки <strong>xxx</strong>, добавь опцию <strong>&#8211;disable-xxx</strong> или установи эту библиотеку и начни сначала. И так несколько раз подряд, пока не надоело. Изучение вопроса продолжилось, в результате чего был найден каталог <strong>extras/contrib</strong>, в нем скрипт <strong>bootstrap</strong>, создающий <strong>Makefile</strong>, благодаря которому все зависимости (в идеале) должны сами скачаться и откомпилироваться. <strong>Level 2</strong></p>
<p>Итак, поехали:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">.<span style="color: #000000; font-weight: bold;">/</span>bootstrap
<span style="color: #c20cb9; font-weight: bold;">make</span>
...
fribidi-run.Tpo <span style="color: #660033;">-c</span> fribidi-run.c  <span style="color: #660033;">-fPIC</span> <span style="color: #660033;">-DPIC</span> <span style="color: #660033;">-o</span> .libs<span style="color: #000000; font-weight: bold;">/</span>fribidi-run.o
fribidi-run.c: In <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #ff0000;">'fribidi__new_run__internal__'</span>:
fribidi-run.c:<span style="color: #000000;">70</span>: error: <span style="color: #ff0000;">'PAGE_SIZE'</span> undeclared <span style="color: #7a0874; font-weight: bold;">&#40;</span>first use <span style="color: #000000; font-weight: bold;">in</span> this <span style="color: #000000; font-weight: bold;">function</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
fribidi-run.c:<span style="color: #000000;">70</span>: error: <span style="color: #7a0874; font-weight: bold;">&#40;</span>Each undeclared identifier is reported only once
fribidi-run.c:<span style="color: #000000;">70</span>: error: <span style="color: #000000; font-weight: bold;">for</span> each <span style="color: #000000; font-weight: bold;">function</span> it appears in.<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #c20cb9; font-weight: bold;">make</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">5</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>: <span style="color: #000000; font-weight: bold;">***</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>fribidi-run.lo<span style="color: #7a0874; font-weight: bold;">&#93;</span> Error <span style="color: #000000;">1</span>
...</pre></div></div>

<p>Ладно, отключаем fribidi:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">make</span>
...
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">ld</span>: <span style="color: #000000; font-weight: bold;">/</span>...<span style="color: #000000; font-weight: bold;">/</span>vlc-0.9.8a<span style="color: #000000; font-weight: bold;">/</span>extras<span style="color: #000000; font-weight: bold;">/</span>contrib<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>libz.a<span style="color: #7a0874; font-weight: bold;">&#40;</span>compress.o<span style="color: #7a0874; font-weight: bold;">&#41;</span>: relocation R_X86_64_32 against <span style="color: #000000; font-weight: bold;">`</span>a <span style="color: #7a0874; font-weight: bold;">local</span> symbol<span style="color: #ff0000;">' 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
...</span></pre></div></div>

<p>Узнаем, как включить <strong>-fPIC</strong> (достаточно добавить ее в <strong>CFLAGS</strong> и <strong>CXXFLAGS</strong> в переменных окружения либо в <strong>Makefile</strong>), и с нехорошим предчувствием продолжаем:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">make</span>
...
aclocal.m4:<span style="color: #000000;">17</span>: error: this <span style="color: #c20cb9; font-weight: bold;">file</span> was generated <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #c20cb9; font-weight: bold;">autoconf</span> <span style="color: #000000;">2.61</span>.
You have another version of autoconf.  If you want to use that,
you should regenerate the build system entirely.
...</pre></div></div>

<p>Тихо ругаемся, но не сдаемся: мы упорные, а <strong>Google</strong> &#8211; умный. Оказывается, надо сделать <strong>libtoolize &#8211;copy &#8211;force &amp;&amp; aclocal</strong> в папке соотетствующего пакета. Что-ж продолжаем&#8230;  Сделав это еще несколько раз и отключив установку нескольких некомпилирующихся пакетов, и переходим на следующий уровень.</p>
<p><strong>Level 3</strong></p>
<p>Теперь время комипилировать сам <strong>VLC</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">.<span style="color: #000000; font-weight: bold;">/</span>configure <span style="color: #660033;">--disable-qt4</span> <span style="color: #660033;">--disable-skins2</span> <span style="color: #660033;">--disable-glx</span> <span style="color: #660033;">--disable-fribidi</span>
<span style="color: #c20cb9; font-weight: bold;">make</span>
...
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">ld</span>: <span style="color: #000000; font-weight: bold;">/</span>...<span style="color: #000000; font-weight: bold;">/</span>vlc-0.9.8a<span style="color: #000000; font-weight: bold;">/</span>.<span style="color: #000000; font-weight: bold;">/</span>extras<span style="color: #000000; font-weight: bold;">/</span>contrib<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>libavcodec.a<span style="color: #7a0874; font-weight: bold;">&#40;</span>fft_mmx.o<span style="color: #7a0874; font-weight: bold;">&#41;</span>: relocation R_X86_64_32 against <span style="color: #000000; font-weight: bold;">`</span>a <span style="color: #7a0874; font-weight: bold;">local</span> symbol<span style="color: #ff0000;">' 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</span></pre></div></div>

<p>К сожалению, от этой ошибки избавиться уже не удалось &#8211; видимо бубен утратил волшебную силу <img src='http://arti.kz/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p><strong>Альтернатива</strong></p>
<p>С приятной теплотой думаем, как это просто сделать в <strong>Gentoo</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;media-video/vlc a52 aac aalib fbcon flac httpd id3tag libcaca libv4l2 live matroska rtsp theora v4l v4l2 vlm x264&quot;</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt;<span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>portage<span style="color: #000000; font-weight: bold;">/</span>package.use <span style="color: #000000; font-weight: bold;">&amp;</span>amp;<span style="color: #000000; font-weight: bold;">&amp;</span>amp; emerge <span style="color: #660033;">-av</span> vlc</pre></div></div>

<p>К сожалению, Gentoo на рабочий сервер поставить не получится, но тут, вспоминается магическое слово &#8211; <strong><a title="Change Root" href="http://en.wikipedia.org/wiki/Chroot">chroot</a></strong>&#8230; Поначалу идея кажется слегка нелепой, но немного раздумий и убедительных доводов &laquo;против&raquo; не находится:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">su</span> -
<span style="color: #c20cb9; font-weight: bold;">mkdir</span> gentoo
<span style="color: #7a0874; font-weight: bold;">cd</span> gentoo
<span style="color: #c20cb9; font-weight: bold;">wget</span> ...<span style="color: #000000; font-weight: bold;">/</span>stage3-amd64-<span style="color: #000000;">2008.0</span>.tar.bz2
<span style="color: #c20cb9; font-weight: bold;">tar</span> xjvpf stage3-amd64-<span style="color: #000000;">2008.0</span>.tar.bz2
<span style="color: #c20cb9; font-weight: bold;">wget</span> ...<span style="color: #000000; font-weight: bold;">/</span>portage-latest.tar.bz2
<span style="color: #c20cb9; font-weight: bold;">tar</span> xjvf portage-latest.tar.bz2 <span style="color: #660033;">-C</span> usr<span style="color: #000000; font-weight: bold;">/</span>
<span style="color: #7a0874; font-weight: bold;">cd</span> ..
<span style="color: #c20cb9; font-weight: bold;">mount</span> <span style="color: #660033;">-t</span> proc none gentoo<span style="color: #000000; font-weight: bold;">/</span>proc
<span style="color: #c20cb9; font-weight: bold;">mount</span> <span style="color: #660033;">-o</span> <span style="color: #7a0874; font-weight: bold;">bind</span> <span style="color: #000000; font-weight: bold;">/</span>dev gentoo<span style="color: #000000; font-weight: bold;">/</span>dev
<span style="color: #c20cb9; font-weight: bold;">chroot</span> gentoo <span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">bash</span>
env-update
<span style="color: #7a0874; font-weight: bold;">source</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>profile
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;media-video/vlc a52 aac aalib fbcon flac httpd id3tag libcaca libv4l2 live matroska rtsp theora v4l v4l2 vlm x264&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>portage<span style="color: #000000; font-weight: bold;">/</span>package.use
emerge <span style="color: #660033;">-av</span> vlc</pre></div></div>

<p>Конечно experienced-users должны будут еще настроить <strong>/etc/make.conf</strong>. Ну и желательно добавить непривилегированного юзера.</p>
<p><strong>Final level</strong></p>
<p>Запускать установленные программы можно прямо из <strong>chroot</strong>-окружения, что по идее должно быть немного безопасней в случае, если в запускаемой программе обнаружатся какие-нибудь уязвимости. Но в принципе можно попробовать вынести ее из <strong>chroot</strong>. Здесь может возникнуть проблема с используемыми библиотеками, но, думаю, ее можно будет обойти. Может быть попробую и напишу об этом позже.</p>
<hr />Проблемы с компьютером? Попробуйте <a href="http://www.pc-msk.ru/">компьютерную помощь</a>.</p>
<p><a href="http://www.video-style.kz">фотограф</a></p>
]]></content:encoded>
			<wfw:commentRss>http://arti.kz/488-chroot-%d0%ba%d0%b0%d0%ba-%d1%81%d1%80%d0%b5%d0%b4%d1%81%d1%82%d0%b2%d0%be-%d1%83%d1%81%d0%bc%d0%b8%d1%80%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bf%d0%b8%d0%bd%d0%b3%d0%b2%d0%b8%d0%bd%d0%be%d0%b2/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

