diff options
Diffstat (limited to 'lfs-12.1-sysv/chapter08/pkgmgt.html')
-rw-r--r-- | lfs-12.1-sysv/chapter08/pkgmgt.html | 539 |
1 files changed, 0 insertions, 539 deletions
diff --git a/lfs-12.1-sysv/chapter08/pkgmgt.html b/lfs-12.1-sysv/chapter08/pkgmgt.html deleted file mode 100644 index b8b3f94..0000000 --- a/lfs-12.1-sysv/chapter08/pkgmgt.html +++ /dev/null @@ -1,539 +0,0 @@ -<!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.1"> - <div class="navheader"> - <h4> - Линукс с нуля - Версия 12.1 - </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.06">След.</a> - <p> - Man-pages-6.06 - </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.1">Начало</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.39) необходимо выполнить - некоторые дополнительные действия, чтобы избежать поломки - системы. Подробности читайте в <a class="xref" href= - "glibc.html" title="8.5. Glibc-2.39">Раздел 8.5, - «Glibc-2.39»</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.06">След.</a> - <p> - Man-pages-6.06 - </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.1">Начало</a> - </li> - </ul> - </div> - </body> -</html> |