summaryrefslogtreecommitdiff
path: root/lfs-12.2-sysv/chapter08/pkgmgt.html
diff options
context:
space:
mode:
Diffstat (limited to 'lfs-12.2-sysv/chapter08/pkgmgt.html')
-rw-r--r--lfs-12.2-sysv/chapter08/pkgmgt.html539
1 files changed, 539 insertions, 0 deletions
diff --git a/lfs-12.2-sysv/chapter08/pkgmgt.html b/lfs-12.2-sysv/chapter08/pkgmgt.html
new file mode 100644
index 0000000..ddc3326
--- /dev/null
+++ b/lfs-12.2-sysv/chapter08/pkgmgt.html
@@ -0,0 +1,539 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
+ <title>
+ 8.2. Управление пакетами
+ </title>
+ <link rel="stylesheet" type="text/css" href="../stylesheets/lfs.css" />
+ <meta name="generator" content="DocBook XSL Stylesheets Vsnapshot" />
+ <link rel="stylesheet" href="../stylesheets/lfs-print.css" type=
+ "text/css" media="print" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ </head>
+ <body class="lfs" id="lfs-12.2">
+ <div class="navheader">
+ <h4>
+ Линукс с нуля - Версия 12.2
+ </h4>
+ <h3>
+ Глава 8. Установка базового системного программного обеспечения
+ </h3>
+ <ul>
+ <li class="prev">
+ <a accesskey="p" href="introduction.html" title=
+ "Введение">Пред.</a>
+ <p>
+ Введение
+ </p>
+ </li>
+ <li class="next">
+ <a accesskey="n" href="man-pages.html" title=
+ "Man-pages-6.9.1">След.</a>
+ <p>
+ Man-pages-6.9.1
+ </p>
+ </li>
+ <li class="up">
+ <a accesskey="u" href="chapter08.html" title=
+ "Глава 8. Установка базового системного программного обеспечения">Наверх</a>
+ </li>
+ <li class="home">
+ <a accesskey="h" href="../index.html" title=
+ "Линукс с нуля - Версия 12.2">Начало</a>
+ </li>
+ </ul>
+ </div>
+ <h1 class="sect1">
+ <a id="ch-system-pkgmgt" name="ch-system-pkgmgt"></a>8.2. Управление
+ пакетами
+ </h1>
+ <div class="sect1" lang="ru" xml:lang="ru">
+ <p>
+ Управление пакетами — часто cпрашиваемое дополнение к книге LFS.
+ Менеджер пакетов позволяет отслеживать установку файлов, упрощая
+ удаление и обновление пакетов. Хороший менеджер пакетов также будет
+ обрабатывать конфигурационные файлы, чтобы сохранить пользовательские
+ настройки при переустановке или обновлении пакета. Прежде чем вы
+ начнете задаваться вопросом, НЕТ—в этом разделе не будет ни
+ говориться, ни рекомендоваться какой-либо конкретный менеджер
+ пакетов. Что он действительно предоставляет, так это обзор наиболее
+ популярных методов и того, как они работают. Идеальным менеджером
+ пакетов для вас может быть один из этих методов или комбинация двух и
+ более методов. В этом разделе кратко упоминаются проблемы, которые
+ могут возникнуть при обновлении пакетов.
+ </p>
+ <p>
+ Некоторые причины, по которым менеджер пакетов не упоминается в LFS
+ или BLFS представлены ниже:
+ </p>
+ <div class="itemizedlist">
+ <ul>
+ <li class="listitem">
+ <p>
+ Рассмотрение управления пакетами отвлекает внимание от целей
+ этих книг—обучения тому, как строится система Linux.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ Существует множество решений для управления пакетами, каждое из
+ которых имеет свои сильные и слабые стороны. Трудно найти
+ такое, которое удовлетворит всех.
+ </p>
+ </li>
+ </ul>
+ </div>
+ <p>
+ Есть несколько советов, написанных на тему управления пакетами.
+ Посетите проект <a class="ulink" href=
+ "https://mirror.linuxfromscratch.ru/hints/downloads/files/">Советы</a>
+ возможно вы найдете решение, которое соответствует вашим
+ потребностям.
+ </p>
+ <div class="sect2" lang="ru" xml:lang="ru">
+ <h2 class="sect2">
+ <a id="pkgmgmt-upgrade-issues" name=
+ "pkgmgmt-upgrade-issues"></a>8.2.1. Проблемы с обновлением
+ </h2>
+ <p>
+ Менеджер пакетов упрощает обновление до более новых версий после их
+ выпуска. Как правило, инструкции в книгах LFS и BLFS можно
+ использовать для обновления до более новых версий. Вот некоторые
+ моменты, о которых следует помнить при обновлении пакетов, особенно
+ в работающей системе.
+ </p>
+ <div class="itemizedlist">
+ <ul>
+ <li class="listitem">
+ <p>
+ Если нужно обновить ядро Linux (например, с 5.10.17 до
+ 5.10.18 или 5.11.1), дополнительно пересобирать ничего не
+ нужно. Система продолжит нормально работать благодаря четко
+ определенной границе между ядром и пользовательским
+ пространством. В частности, заголовки Linux API не нужно
+ обновлять вместе с ядром. Вам просто нужно перезагрузить
+ систему, чтобы использовать обновленное ядро.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ Если необходимо обновить Glibc до более новой версии
+ (например, с Glibc-2.36 до Glibc-2.40) необходимо выполнить
+ некоторые дополнительные действия, чтобы избежать поломки
+ системы. Подробности читайте в <a class="xref" href=
+ "glibc.html" title="8.5. Glibc-2.40">Раздел&nbsp;8.5,
+ «Glibc-2.40»</a>.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ Если пакет, содержащий общую библиотеку, обновляется и имя
+ библиотеки изменилось, то любые пакеты, динамически связанные
+ с библиотекой, необходимо перекомпилировать, чтобы связать с
+ более новой библиотекой. (Обратите внимание, что между
+ версией пакета и именем библиотеки нет никакой связи.)
+ Например, рассмотрим пакет foo-1.2.3, который устанавливает
+ общую библиотеку с именем <code class=
+ "filename">libfoo.so.1</code>. Предположим, вы обновили пакет
+ до более новой версии foo-1.2.4, которая устанавливает общую
+ библиотеку с именем <code class=
+ "filename">libfoo.so.2</code>, все пакеты, которые
+ динамически связаны с <code class=
+ "filename">libfoo.so.1</code>, должны быть перекомпилированы
+ для связи с <code class="filename">libfoo.so.2</code>, чтобы
+ использовать новую версию библиотеки. Вы не должны удалять
+ старые библиотеки, пока все зависимые пакеты не будут
+ перекомпилированы.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ Если пакет (прямо или косвенно) связан как со старым, так и с
+ новым именем общей библиотеки (например, пакет ссылается как
+ на <code class="filename">libfoo.so.2</code>, так и на
+ <code class="filename">libbar.so.1</code>, в то время как
+ последний ссылается на <code class=
+ "filename">libfoo.so.3</code>), пакет может работать
+ неправильно, поскольку разные версии общей библиотеки
+ содержат несовместимые определения для некоторых имен
+ символов. Это может быть вызвано перекомпиляцией некоторых,
+ но не всех, пакетов, связанных со старой общей библиотекой,
+ после обновления пакета, предоставляющего общую библиотеку.
+ Чтобы избежать этой проблемы, пользователям необходимо как
+ можно скорее пересобрать каждый пакет, связанный с общей
+ библиотекой, с обновленной версией (например, с libfoo.so.2
+ на libfoo.so.3).
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ Если пакет, содержащий общую библиотеку, обновляется, а имя
+ библиотеки не меняется, но уменьшается номер версии
+ <span class="bold"><strong>файла</strong></span> библиотеки
+ (например, библиотека по-прежнему называется <code class=
+ "filename">libfoo.so.1</code>, но имя файла библиотеки
+ изменилось с <code class="filename">libfoo.so.1.25</code> на
+ <code class="filename">libfoo.so.1.24</code>), следует
+ удалить файл библиотеки ранее установленной версии (в данном
+ случае <code class="filename">libfoo.so.1.25</code>). В
+ противном случае, команда <span class=
+ "command"><strong>ldconfig</strong></span> (запущенная
+ самостоятельно с помощью командной строки или при установке
+ какого-либо пакета) приведёт к сбросу символической ссылки
+ <code class="filename">libfoo.so.1</code>, которая будет
+ указывать на старый файл библиотеки, потому что кажется, что
+ она имеет <span class="quote">«<span class="quote">более
+ новую</span>»</span> версию, поскольку её номер версии
+ больше. Такая ситуация может произойти, если вам нужно
+ понизить версию пакета или авторы изменили схему управления
+ версиями файлов библиотеки.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ Если пакет, содержащий общую библиотеку, обновляется, а имя
+ библиотеки не меняется, но устраняется серьезная проблема
+ (особенно уязвимость в системе безопасности), необходимо
+ перезапустить все работающие программы, связанные с общей
+ библиотекой. Следующая команда, запущенная от имени
+ пользователя <code class="systemitem">root</code> после
+ завершения обновления, выведет список программ, которые
+ использует старые версии этих библиотек (замените <em class=
+ "replaceable"><code>libfoo</code></em> именем библиотеки):
+ </p>
+ <pre class="userinput"><kbd class="command">grep -l '<em class=
+ "replaceable"><code>libfoo</code></em>.*deleted' /proc/*/maps | tr -cd 0-9\\n | xargs -r ps u</kbd></pre>
+ <p>
+ Если для доступа к системе используется <span class=
+ "application">OpenSSH</span> и он связан с обновленной
+ библиотекой, вам необходимо перезапустить службу <span class=
+ "command"><strong>sshd</strong></span>, затем выйти из
+ системы, снова войти в систему и повторно выполнить
+ предыдущую команду, чтобы убедиться, что удаленные библиотеки
+ более не используются.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ Если исполняемая программа или библиотека перезаписаны,
+ процессы, использующие код или данные из них, могут
+ завершиться сбоем. Правильный способ обновить программу или
+ общую библиотеку, не вызывая сбоя процесса, - это сначала
+ удалить его, а затем установить новую версию. Команда
+ <span class="command"><strong>install</strong></span>,
+ предоставляемая <span class="application">Coreutils</span>,
+ уже реализовала это, и большинство пакетов используют ее для
+ установки двоичных файлов и библиотек. Это означает, что
+ большую часть времени вас не будет беспокоить эта проблема.
+ Однако процесс установки некоторых пакетов (в частности,
+ SpiderMonkey в BLFS) просто перезаписывает файл, если он
+ существует, и вызывает сбой. Поэтому безопаснее сохранить
+ свою работу и закрыть ненужные запущенные программы перед
+ обновлением пакета.
+ </p>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="sect2" lang="ru" xml:lang="ru">
+ <h2 class="sect2">
+ 8.2.2. Методы управления пакетами
+ </h2>
+ <p>
+ Ниже приведены некоторые распространенные методы управления
+ пакетами. Прежде чем принять решение о менеджере пакетов, проведите
+ исследование различных методов, особенно недостатки каждой
+ конкретной схемы.
+ </p>
+ <div class="sect3">
+ <h3 class="sect3">
+ 8.2.2.1. Всё у меня в голове!
+ </h3>
+ <p>
+ Да, это метод управления пакетами. Некоторым людям не нужен
+ менеджер пакетов, потому что они хорошо знакомы с пакетами и
+ знают, какие файлы устанавливаются каждым пакетом. Некоторым
+ пользователям также не требуется какое-либо управление пакетами,
+ поскольку они планируют пересобирать всю систему при каждом
+ изменении пакета.
+ </p>
+ </div>
+ <div class="sect3">
+ <h3 class="sect3">
+ 8.2.2.2. Установка в отдельные каталоги
+ </h3>
+ <p>
+ Это упрощенный метод управления пакетами, для которого не
+ требуется специальная программа управления. Каждый пакет
+ устанавливается в отдельный каталог. Например, пакет foo-1.1
+ устанавливается в <code class="filename">/opt/foo-1.1</code>, а
+ символическая ссылка создается из <code class=
+ "filename">/opt/foo</code> в <code class=
+ "filename">/opt/foo-1.1</code>. Когда появляется новая версия
+ foo-1.2, она устанавливается в <code class=
+ "filename">/opt/foo-1.2</code> и предыдущая символическая ссылка
+ заменяется символической ссылкой на новую версию.
+ </p>
+ <p>
+ Переменные окружения, такие как <code class="envar">PATH</code>,
+ <code class="envar">MANPATH</code>, <code class=
+ "envar">INFOPATH</code>, <code class=
+ "envar">PKG_CONFIG_PATH</code>, <code class=
+ "envar">CPPFLAGS</code>, <code class="envar">LDFLAGS</code> и
+ файл конфигурации <code class="filename">/etc/ld.so.conf</code>,
+ возможно, потребуется расширить, включив соответствующие
+ подкаталоги в <code class="filename">/opt/foo-x.y</code>.
+ </p>
+ <p>
+ Этот подход используется в книге BLFS для установки некоторых
+ очень больших пакетов, чтобы упростить их обновление. Если вы
+ устанавливаете много таких пакетов, эта схема становится
+ неуправляемой. Некоторые пакеты (например, заголовки Linux API и
+ Glibc) могут плохо работать с такой структурой. <span class=
+ "bold"><strong>Никогда не используйте её в масштабах всей
+ системы.</strong></span>
+ </p>
+ </div>
+ <div class="sect3">
+ <h3 class="sect3">
+ 8.2.2.3. Управление пакетами с использованием символических
+ ссылок
+ </h3>
+ <p>
+ Это разновидность предыдущей техники.Каждый пакет устанавливается
+ аналогично, но вместо создания символической ссылки на общее имя
+ пакета, каждому файлу создаётся символическая ссылка в иерархии
+ каталогов <code class="filename">/usr</code>. Это исключает
+ необходимость модификации значений переменных окружения. Хотя
+ такие ссылки могут быть созданы пользователем, многие менеджеры
+ пакетов используют именной такой подход. Наиболее популярные из
+ них - Stow, Epkg, Graft и Depot.
+ </p>
+ <p>
+ Установку нужно сымитировать, чтобы пакет думал, что он
+ установлен в <code class="filename">/usr</code>, хотя на самом
+ деле он установлен в иерархии <code class=
+ "filename">/usr/pkg</code>. Установка таким способом обычно
+ является нетривиальной задачей. Например, предположим, что вы
+ устанавливаете пакет libfoo-1.1. Следующие инструкции могут
+ привести к неправильной установке пакета:
+ </p>
+ <pre class="userinput"><kbd class=
+ "command">./configure --prefix=/usr/pkg/libfoo/1.1
+make
+make install</kbd></pre>
+ <p>
+ Установка будет выполнена, но зависимые пакеты не смогут
+ ссылаться на libfoo. Если вы скомпилируете пакет, который
+ ссылается на libfoo, вы заметите, что он связан с <code class=
+ "filename">/usr/pkg/libfoo/1.1/lib/libfoo.so.1</code> вместо
+ <code class="filename">/usr/lib/libfoo.so.1</code>, как вы
+ ожидаете. Правильный подход заключается в использовании
+ переменной <code class="envar">DESTDIR</code> для управления
+ установкой. Этот подход работает следующим образом:
+ </p>
+ <pre class="userinput"><kbd class=
+ "command">./configure --prefix=/usr
+make
+make DESTDIR=/usr/pkg/libfoo/1.1 install</kbd></pre>
+ <p>
+ Большинство пакетов поддерживают этот подход, но есть и такие,
+ которые этого не делают. Для несовместимых пакетов вам может
+ потребоваться либо установить пакет вручную, либо вы можете
+ установить проблемные пакеты в <code class=
+ "filename">/opt</code>.
+ </p>
+ </div>
+ <div class="sect3">
+ <h3 class="sect3">
+ 8.2.2.4. На основе временной метки
+ </h3>
+ <p>
+ В этом методе файлу присваивается временная метка перед
+ установкой пакета. После установки простое использование команды
+ <span class="command"><strong>find</strong></span> с
+ соответствующими параметрами может создать журнал всех файлов,
+ установленных после создания файла с временной метки. Менеджером
+ пакетов, использующим этот подход, является install-log.
+ </p>
+ <p>
+ Хотя преимущество этой схемы в том, что она проста, у нее есть
+ два недостатка. Если во время установки, файлы устанавливаются с
+ отметкой времени, отличной от текущего времени, эти файлы не
+ будут отслеживаться менеджером пакетов. Кроме того, эта схема
+ может использоваться только при установке пакетов по одному.
+ Журналы ненадежны, если два пакета устанавливаются одновременно
+ на двух разных консолях.
+ </p>
+ </div>
+ <div class="sect3">
+ <h3 class="sect3">
+ 8.2.2.5. Отслеживание сценариев установки
+ </h3>
+ <p>
+ При таком подходе, записываются команды, выполняемые сценариями
+ установки. Есть два метода, которые можно использовать:
+ </p>
+ <p>
+ Переменная среды <code class="envar">LD_PRELOAD</code> может быть
+ установлена так, чтобы она указывала на библиотеку, которую нужно
+ предварительно загрузить перед установкой. Во время установки эта
+ библиотека отслеживает устанавливаемые пакеты, присоединяясь к
+ различным исполняемым файлам, таким как <span class=
+ "command"><strong>cp</strong></span>, <span class=
+ "command"><strong>install</strong></span>, <span class=
+ "command"><strong>mv</strong></span>, и отслеживая системные
+ вызовы, изменяющие файловую систему. Чтобы этот подход работал,
+ все исполняемые файлы должны быть динамически связаны без битов
+ suid или sgid. Предварительная загрузка библиотеки может вызвать
+ некоторые нежелательные побочные эффекты во время установки.
+ Поэтому рекомендуется выполнить некоторые тесты, чтобы убедиться,
+ что менеджер пакетов ничего не сломает и что он регистрирует все
+ соответствующие файлы.
+ </p>
+ <p>
+ Другой метод заключается в использовании <span class=
+ "command"><strong>strace</strong></span>, который регистрирует
+ все системные вызовы, сделанные во время выполнения сценариев
+ установки.
+ </p>
+ </div>
+ <div class="sect3">
+ <h3 class="sect3">
+ 8.2.2.6. Создание архивов пакетов
+ </h3>
+ <p>
+ В этой схеме установка пакета имитируется в отдельном дереве, как
+ описано ранее в разделе управление пакетами с использованием
+ символических ссылок. После установки из установленных файлов
+ создается архив пакета. Затем этот архив используется для
+ установки пакета на локальный компьютер или даже на другие
+ компьютеры.
+ </p>
+ <p>
+ Этот подход используется большинством менеджеров пакетов,
+ имеющихся в коммерческих дистрибутивах. Примерами менеджеров
+ пакетов, которые следуют этому подходу, являются RPM (который,
+ кстати, требуется согласно спецификации <a class="ulink" href=
+ "https://refspecs.linuxfoundation.org/lsb.shtml">Linux Standard
+ Base Specification</a>), pkg-utils, apt Debian и система Portage
+ Gentoo. Описание того, как использовать этот стиль управления
+ пакетами для систем LFS, находится по адресу <a class="ulink"
+ href=
+ "https://mirror.linuxfromscratch.ru/hints/downloads/files/fakeroot.txt">
+ https://mirror.linuxfromscratch.ru/hints/downloads/files/fakeroot.txt</a>.
+ </p>
+ <p>
+ Создание файлов пакетов, содержащих информацию о зависимостях,
+ является сложной задачей и выходит за рамки LFS.
+ </p>
+ <p>
+ Slackware использует систему на основе <span class=
+ "command"><strong>tar</strong></span> для архивов пакетов. Эта
+ система намеренно не обрабатывает зависимости пакетов, как это
+ делают более сложные менеджеры пакетов. Подробнее об управлении
+ пакетами Slackware см. <a class="ulink" href=
+ "https://www.slackbook.org/html/package-management.html">https://www.slackbook.org/html/package-management.html</a>.
+ </p>
+ </div>
+ <div class="sect3">
+ <h3 class="sect3">
+ 8.2.2.7. Пользовательское управление пакетами
+ </h3>
+ <p>
+ Эта схема, уникальная для LFS, была разработана Маттиасом
+ Бенкманом и доступна в проекте <a class="ulink" href=
+ "https://mirror.linuxfromscratch.ru/hints/downloads/files/">Hints</a>.
+ В этой схеме каждый пакет устанавливается отдельным пользователем
+ в стандартные папки. Файлы, принадлежащие пакету, легко
+ идентифицируются путем проверки идентификатора пользователя.
+ Особенности и недостатки этого подхода слишком сложны, чтобы
+ описывать их в этом разделе. Для получения более подробной
+ информации, пожалуйста, ознакомьтесь с советами по адресу
+ <a class="ulink" href=
+ "https://mirror.linuxfromscratch.ru/hints/downloads/files/more_control_and_pkg_man.txt">
+ https://mirror.linuxfromscratch.ru/hints/downloads/files/more_control_and_pkg_man.txt</a>.
+ </p>
+ </div>
+ </div>
+ <div class="sect2" lang="ru" xml:lang="ru">
+ <h2 class="sect2">
+ 8.2.3. Развертывание LFS на нескольких системах
+ </h2>
+ <p>
+ Одним из преимуществ системы LFS является отсутствие файлов,
+ зависящих от положения файлов на диске. Клонировать сборку LFS на
+ другой компьютер с той же архитектурой, что и у базовой системы,
+ так же просто, как использовать <span class=
+ "command"><strong>tar</strong></span> для архивации раздела LFS,
+ содержащем корневой каталог (около 900 МБ в несжатом виде для
+ базовой сборки LFS), скопировать этот файл по сети или с помощью CD
+ / USB носителя в новую систему и распаковать его. После этого
+ необходимо изменить несколько конфигурационных файлов. Файлы,
+ которые, возможно, потребуется изменить представлены в списке ниже:
+ <code class="filename">/etc/hosts</code>, <code class=
+ "filename">/etc/fstab</code>, <code class=
+ "filename">/etc/passwd</code>, <code class=
+ "filename">/etc/group</code>, <span class="phrase"><code class=
+ "filename">/etc/shadow</code>, <code class=
+ "filename">/etc/ld.so.conf</code>, <code class=
+ "filename">/etc/sysconfig/rc.site</code>, <code class=
+ "filename">/etc/sysconfig/network</code>, и <code class=
+ "filename">/etc/sysconfig/ifconfig.eth0</code>.</span>
+ </p>
+ <p>
+ Возможно, потребуется собрать собственное ядро для новой системы в
+ зависимости от различий в системном оборудовании и исходной
+ конфигурации ядра.
+ </p>
+ <div class="admon note">
+ <img alt="[Примечание]" src="../images/note.png" />
+ <h3>
+ Примечание
+ </h3>
+ <p>
+ Поступали сообщения о некоторых проблемах при копировании между
+ похожими, но не идентичными архитектурами. Например, набор
+ инструкций для Intel не идентичен набору инструкций для
+ процессора AMD, и более поздние версии некоторых процессоров
+ могут содержать инструкции, недоступные в более ранних версиях.
+ </p>
+ </div>
+ <p>
+ Наконец, новую систему необходимо сделать загрузочной так, как это
+ описано в <a class="xref" href="../chapter10/grub.html" title=
+ "10.4. Использование GRUB для настройки процесса загрузки">Раздел&nbsp;10.4,
+ «Использование GRUB для настройки процесса загрузки»</a>.
+ </p>
+ </div>
+ </div>
+ <div class="navfooter">
+ <ul>
+ <li class="prev">
+ <a accesskey="p" href="introduction.html" title=
+ "Введение">Пред.</a>
+ <p>
+ Введение
+ </p>
+ </li>
+ <li class="next">
+ <a accesskey="n" href="man-pages.html" title=
+ "Man-pages-6.9.1">След.</a>
+ <p>
+ Man-pages-6.9.1
+ </p>
+ </li>
+ <li class="up">
+ <a accesskey="u" href="chapter08.html" title=
+ "Глава 8. Установка базового системного программного обеспечения">Наверх</a>
+ </li>
+ <li class="home">
+ <a accesskey="h" href="../index.html" title=
+ "Линукс с нуля - Версия 12.2">Начало</a>
+ </li>
+ </ul>
+ </div>
+ </body>
+</html>