diff options
Diffstat (limited to 'lfs-12.2-sysv/chapter08/pkgmgt.html')
-rw-r--r-- | lfs-12.2-sysv/chapter08/pkgmgt.html | 539 |
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">Раздел 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 для настройки процесса загрузки">Раздел 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> |