summaryrefslogtreecommitdiff
path: root/lfs-12.1-sysv/chapter08/pkgmgt.html
diff options
context:
space:
mode:
authorSn4il <sn4il@thedroth.rocks>2024-09-02 15:54:35 +0300
committerSn4il <sn4il@thedroth.rocks>2024-09-02 15:54:35 +0300
commit2203e654b389586650d553251b04544a34f189bf (patch)
tree0125b69fc70a2506c53158ba2020993a5b8985b7 /lfs-12.1-sysv/chapter08/pkgmgt.html
parent200d528e55ca954d37769f4d143f10c9519b00e7 (diff)
downloadsn4il-site-2203e654b389586650d553251b04544a34f189bf.tar.gz
sn4il-site-2203e654b389586650d553251b04544a34f189bf.zip
LFS 12.2
Diffstat (limited to 'lfs-12.1-sysv/chapter08/pkgmgt.html')
-rw-r--r--lfs-12.1-sysv/chapter08/pkgmgt.html539
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">Раздел&nbsp;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 для настройки процесса загрузки">Раздел&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.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>