% ! Hey Emacs, it's a *latex-mode*
\documentclass[russian, a4paper, 12pt]{article}
\usepackage[margin=20pt,head=20pt,headsep=20pt,foot=20pt]{geometry}
\usepackage[koi8-r]{inputenc}
\usepackage[T2A]{fontenc}
\usepackage{babel}
%\usepackage{charter}
%\usepackage[pdftex=true,colorlinks=true,urlcolor=blue]{hyperref}
%\usepackage[pdftex]{graphicx}
\gdef \distribution {ALT Linux Master\ }
\title{Использование усовершенствованного средства управления пакетами APT для обеспечения целостности \distribution}
\author{Александр Боковой \verb~<ab@altlinux.ru>~}
\begin{document}
\maketitle


\section{Введение}

Усовершенствованное средство управления программными пакетами APT
(Advanced Packaging Tool) первоначально было разработано для
управления пакетами в дистрибутиве Debian GNU/Linux. Основной целью,
которая ставилась при разработке APT, была замена системы выбора
пакетов dselect в Debian на более мощную, способную сочетать в себе
простоту пользовательского интерфейса с возможностью установки,
обновления и повседневной работы с установленными на машине
программами без необходимости изучения пользователем тонкостей
используемой в дистрибутиве системы управления пакетами,
предоставляющими эти программы. Долгое время система APT была доступна
только пользователям Debian GNU/Linux, поскольку поддерживала только
один тип системы управления пакетами~--- применяемый в Debian
GNU/Linux менеджер dpkg. Dpkg несовместим с используемой в \distribution
 системой управления пакетами RPM и эта несовместимость
заключается не только в выборе разных форматов, используемыми для
хранения данных о пакетах программ, она значительно глубже.

Однако APT изначально проектировалась как система, не зависящая от
метода управления установленными в системе пакетами, и эта особенность
позволила разработчикам из бразильской компании Conectiva
(www.conectiva.com.br) реализовать в ней поддержку менеджера пакетов
RPM. Таким образом, пользователи дистрибутивов, базирующихся на RPM
(\distribution входит в их число), также получили возможность
использовать эту мощную систему.

APT по-прежнему находится в стадии разработки и ее текущая версия,
поддерживающая RPM, классифицируется как нестабильная. Тем не менее,
это не означает, что операции, выполняемые посредством APT, могут
привести к нестабильности системы. Более того, посредством APT
возможен строгий контроль за целостностью системы~--- проверка
нарушенных зависимостей между установленными пакетами, исправление
ошибок.

Системы управления пакетами RPM и Dpkg используют похожие концепции
представления программного обеспечения в виде набора компонент
(пакетов). Эти компоненты содержат в себе набор программ и
вспомогательных файлов, необходимых для корректной работы ПО. Часто
компоненты, используемые  различными программами, выделяют в отдельные
пакеты и помечают, что для работы ПО, представленного, например,
пакетом A, необходимо установить пакет B.

Отслеживание зависимостей между такими пакетами представляет собой
серьезную задачу для любого дистрибутива, учитывая то, что некоторые
компоненты могут быть взаимозаменяемыми и при удовлетворении
требований на ту или иную компоненту, может обнаружиться несколько
пакетов, на самом деле предлагающих требуемый ресурс.

Еще сложнее задача контроля целостности и непротиворечивости
установленного в системе ПО. Представим, что некая программа A требует
компоненту B версии 1.0, а программа C также требует компоненту B
версии 1.0. Обновление пакета A до новой версии, требующей обновление
компоненты B новой версии (скажем, 2.0), в которой используется новый
интерфейс доступа,  влечет за собой обязательное обновление программы
C.

Для автоматизации этого процесса и применяется APT. Достигается это
созданием одного или нескольких внешних репозитариев, в которых хранятся 
пакеты программ и относительно
которых производится сверка пакетов, установленных в 
системе. Репозитарии могут содержать как официальную версию
дистрибутива, обновляемую его разработчиками по мере выхода новых
версий программ, так и локальные наработки, например, пакеты,
разработанные внутри компании.

Таким образом, в распоряжении APT находятся две базы данных~--- одна,
описывающая установленные в системы пакеты, вторая~--- с описанием
внешнего репозитария. APT отслеживает целостность установленной системы
и в случае обнаружения противоречий в межпакетных зависимостях, руководствуется
базой данных о внешнем репозитарии для разрешения конфликтов и поиска
корректного решения их устранения.

\section{Использование APT}

Система APT состоит из нескольких утилит. Главной и наиболее часто
используемой является apt-get, утилита управления пакетами. Apt-get
автоматически определяет зависимости между пакетами и строго следит за
их соблюдением при выполнении любой из следующих операций: установка,
удаление или обновление пакетов.

Apt-get позволяет устанавливать в систему пакеты, которые требуют
наличия других, пока еще не установленных, пакетов программ. В этом
случае apt-get вычисляет, какие из неустановленных пакетов требуются,
и доустанавливает их, пользуясь всеми известными ему
репозитариями. Для того, чтобы apt-get мог использовать тот или иной
репозитарий, информацию о нем необходимо поместить в файл
\verb|/etc/apt/sources.list| и выполнить команду

\verb|apt-get update|

Эту команду необходимо также выполнять каждый раз, когда Вы
собираетесь работать с репозитарием после длительного перерыва, так
как APT при поиске пакетов руководствуется базой данных о репозитарии,
отражающей его состояние. Эта база данных создается заново каждый раз,
когда в репозитарии происходит изменение (добавление, удаление или
переименование пакета). Для ускорения работы apt-get хранит локальную
копию базы данных и потому она через некоторое время вполне может не
соответствовать реальному состоянию репозитария.

В качестве репозитария можно использовать компакт--диски дистрибутива, 
поскольку на каждом диске присутствует вся необходимая для APT информация
о содержащихся на нем пакетах программ. Для этого необходимо использовать
утилиту \verb|apt-cdrom| с единственной командой \verb|add|:

\begin{verbatim}
# apt-cdrom add
Используется точка монтирования CD-ROM /mnt/cdrom/
Размонтирование CD-ROM
Пожалуйста, вставьте диск в устройство и нажмите <Enter> 
Монтирование CD-ROM
Используется точка монтирования CD-ROM /mnt/cdrom
Определение... [8d56fef8c93e5255540c843e4b9f49fa-2]
Сканирование диска в поисках индексных файлов... 
Найдено 1 бинарных пакетов и 1 исходных пакетов.
Пожалуйста, укажите имя этого диска, например, 'Мой Дистрибутив Диск 1':
Master Disk 1
Этот диск называется 
 'Master Disk 1'
Reading Indexes... Завершено
Reading Indexes... Завершено
Запись нового списка источников
Список источников для этого диска:
rpm cdrom:[Master Disk 1]/ i586/Mandrake sisyphus
rpm-src cdrom:[Master Disk 1]/ i586/Mandrake sisyphus
Повторите этот процесс для всех CD в Вашем наборе.
\end{verbatim}

После этого в \verb|/etc/apt/sources.list| появится запись о подключенном диске:
\begin{verbatim}
rpm cdrom:[Master Disk 1]/ i586/Mandrake sisyphus
rpm-src cdrom:[Master Disk 1]/ i586/Mandrake sisyphus
\end{verbatim}

Если отсутствует подключение к Интернет, то следует закомментировать
те строчки в \verb|/etc/apt/sources.list|, в которых говорится о ресурсах,
доступных через Интернет. После установки дистрибутива \distribution в
\verb|/etc/apt/sources.list| указаны несколько таких источника:
\begin{itemize}
\item репозитарий обновлений в системе безопасности дистрибутива;

\item бинарные пакеты из репозитария ``Сизиф'';

\item исходные архивов, использовавшихся для сборки пакетов в репозитарии ``Сизиф''.
\end{itemize}

Проект ``Сизиф'' команды ALT Linux Team содержит большое количество программ,
в том числе и не вошедших в дистрибутив. Периодически на базе этого проекта
выпускаются отдельные оттестированные ``срезы''--дистрибутивы. Репозитарий
``Сизиф'' ежедневно обновляется разработчиками, поэтому при его использовании
синхронизация локальной базы данных с сервером ALT Linux (или его зеркалами) перед началом
работы с APT является необходимостью. Такую синхронизацию достаточно
делать один раз в день командой \verb|apt-get update|. Для репозитариев, 
подключенных командой \verb|apt-cdrom add| синхронизацию достаточно сделать однажды.

\subsection{Установка или обновление пакета}

Чтобы установить пакет программ посредством APT, необходимо
воспользоваться командой

\verb|apt-get install имя-пакета|

Иногда в результате операций с пакетами минуя APT, целостность системы
нарушается и apt-get отказывается выполнять операции установки,
удаления или обновления. В этом случае необходимо повторить операцию,
задав опцию \verb|-f|, заставляющую apt-get исправить нарушенные зависимости,
если это возможно. В этом случае необходимо внимательно следить за
сообщениями, которые выдает \textit{apt-get}, и четко им следовать.

Команда

\verb|apt-get install имя-пакета|

также используется и для обновления уже установленного пакета или
группы пакетов. В этом случае apt-get дополнительно проверяет,
обновилась ли версия пакета в репозитарии по сравнению  с
установленным в системе. Если Вы не знаете точное название пакета, для
его поиска можно воспользоваться утилитой apt-cache, описанной ниже.

Пример: установка пакета clanbomber командой \verb|apt-get install clanbomber|
приведет к следующему диалогу с APT:

\begin{verbatim}
Обработка файловых зависимостей... Завершено
Чтение списков пакетов... Завершено         
Построение дерева зависимостей... Завершено
Следующие дополнительные пакеты будут установлены:
  clanlib clanlib-mikmod clanlib-sound libmikmod 
Следующие НОВЫЕ пакеты будут установлены:
  clanbomber clanlib clanlib-mikmod clanlib-sound libmikmod 
0 пакетов будет обновлено, 5 будет добавлено новых, 
0 будет удалено(заменено) и 0 не будет обновлено.
Необходимо получить 0B/2577kB архивов. После распаковки 3862kБ будет использовано.
Продолжить? [Y/n] y
Выполняется программа RPM (/bin/rpm -Uv --replacepkgs -h)...
Подготовка...                ##########################################
libmikmod                    ##########################################
clanlib                      ##########################################
clanlib-mikmod               ##########################################
clanlib-sound                ##########################################
clanbomber                   ##########################################
\end{verbatim}

Внимание:   apt-get всегда спрашивает подтверждение выполнения
операции установки и обновления, за исключением случая, когда реально
требуется установить в систему (или обновить) только один пакет. Если
Вы не уверены в том, что результате выполнения операции система
останется работоспособной, запустите apt-get с опцией -S, которая
покажет отчет выполнения операции обновления, но реально обновление
произведено не будет.

В случае имеющихся противоречий между установленными в системе пакетами
необходимо запустить команду \verb|apt-get -f install| и APT постарается разрешить
эти конфликты, предложив удалить или заменить конфликтующие пакеты. Любые действия в
этом режиме обязательно требуют подтверждения со стороны пользователя.

\subsection{Удаление установленного пакета}

Для удаления пакета используется команда 
\verb|apt-get remove имя-пакета|. Все пакеты, которые зависят от удаляемого, также будут
удалены, чтобы не нарушать целостность системы (если отсутствует
необходимая для работы приложения библиотека, то само приложение
становится бесполезным). В случае удаления пакета, который относится к
базовым компонентам системы, apt-get потребует дополнительного
подтверждения производимой операции с целью предотвратить возможную
случайную ошибку.

Запрос на подтверждение операции удаления базовой компоненты системы
выглядит следующим образом:

\begin{verbatim}
# apt-get remove filesystem
Обработка файловых зависимостей... Завершено
Чтение списков пакетов... Завершено         
Построение дерева зависимостей... Завершено
Следующие пакеты будут УДАЛЕНЫ:
  basesystem filesystem ppp sudo 
Внимание: следующие базовые пакеты будут удалены:
В обычных условиях этого не должно было произойти, надеемся, Вы точно 
представляете, что требуете!
  basesystem filesystem (по причине basesystem)
0 пакетов будет обновлено, 0 будет добавлено новых, 4 будет удалено(заменено) и 
0 не будет обновлено.
Необходимо получить 0B архивов. После распаковки 588kБ будет освобождено.
Вы собираетесь предпринять что-то потенциально вредное
Для продолжения, наберите по-английски 'Yes, I understand this may be bad' 
(Да, я понимаю, что это может быть плохо).
 ?]
\end{verbatim}

Каждую ситуацию, когда APT генерирует такое сообщение, необходимо рассматривать
отдельно, однако в общем случае с высокой степенью вероятности в результате 
исполнения этой команды установленная система станет неработоспособной.

\subsection{Обновление всех установленных пакетов}

Для обновления всех установленных пакетов используется команда \verb|apt-get upgrade|.
Она позволяет обновить те и только те установленные пакеты,
для которых имеются новые версии в репозитариях, перечисленных в
\verb|/etc/apt/sources.list|. При этом из системы не будут удалены никакие
другие пакеты. Этот способ полезен при работе со стабильными пакетами
приложений, относительно которых известно, что они не изменяются
существенно при смене версии.

Однако иногда происходят изменения в способах наименования пакетов или
изменение их зависимостей. Такие ситуации не обрабатываются командой
\verb|apt-get upgrade|, в результате чего происходит нарушение целостности
системы: появляются неудовлетворенные зависимости. Например,
переименование пакета MySQL-shared, содержащего динамически
загружаемые библиотеки для работы с СУБД MySQL, в libMySQL (отражая
общую тенденцию к наименованию библиотек в дистрибутиве) не приводит к
тому, что установка обновленной версии libMySQL требует удаление
старой версии MySQL-shared. Для разрешения этой проблемы существует
режим обновления в масштабе дистрибутива --- \verb|apt-get dist-upgrade|.

В случае обновления всего дистрибутива APT проведет сравнение 
системы с репозитарием и удалит устаревшие пакеты, установит новые
версии присутствующих в системе пакетов, а также отследит ситуации с
переименованиями пакетов или изменения зависимостей между старыми и
новыми версиями программ. Все, что потребуется поставить (или удалить)
дополнительно к уже имеющемуся в системе, будет указано в отчете
apt-get, которым APT предварит само обновление.

\textit{При работе с репозитарием пакетов ``Сизиф'' рекомендуется 
для обновления системы использовать команду apt-get dist-upgrade}

\subsection{Поиск в репозитарии}

Для поиска в репозитарии нужного пакета можно воспользоваться утилитой
\verb|apt-cache|, которая позволяет искать не только по имени пакета, но и по
его описанию.

Команда \verb|apt-cache search| подстрока позволяет найти все пакеты, в
именах или описании которых присутствует указанная подстрока. Например:

\begin{verbatim}
$ apt-cache search master
xcdroast - A GUI program for burning CDs
bluefish - A WYSIWYG GPLized HTML editor
xmess - X-Mess Multi Emulator Super System
mkisofs - Creates an image of an ISO9660 filesystem
\end{verbatim}

В кратком описании каждого из перечисленных пакетов не присутствует слово master.
Для того, чтобы подробнее узнать о пакете, можно воспользоваться командой \verb|apt-cache show|,
которая покажет информацию о пакете из репозитария и в том числе:

\begin{verbatim}
Пакет: bluefish
Секция: Networking/WWW
Размер установленных пакетов: 2018
Упаковщик: AEN <aen@logic.ru>
Версия: 1:0.7-alt0.1
..
Предоставляет: bluefish
Архитектура: i586
..
Имя файла: bluefish-0.7-alt0.1.i586.rpm
Описание: A WYSIWYG GPLized HTML editor
 Bluefish is a programmer's HTML editor, designed to save the experienced
 webmaster some keystrokes.
 
 It features a multiple file editor, multiple toolbars, custom menus, image
 and thumbnail dialogs,  open from the web, HTML validation and lots of wizards.
 
 It is in continuous development, but it's already one of the best WYSIWYG HTML
 editors.
\end{verbatim}

Наличие слова \textit{webmaster} и объясняет наличие этого пакета в результате поиска
по слову \textit{master}.


\subsection{Настройка APT}

APT позволяет общаться с репозитарием посредством различных протоколов. Наиболее популярные ---
HTTP и FTP, именно они используются для работы с репозитарием проекта Sisyphus команды ALT Linux Team.
Однако существуют и некоторые дополнительные методы получения данных из репозитария.

Настройка описаний репозитариев задается в файле \verb|/etc/apt/sources.list| в следующем виде:

\begin{verbatim}
rpm [подпись] метод:путь база название
rpm-src [подпись] метод:путь база название
\end{verbatim}

\begin{tabular}{l|p{400pt}}
rpm или rpm-src & тип репозитария (скомпилированные программы или исходные тексты)\\
подпись & опциональная строка-указатель на сигнатуру разработчиков. Сигнатуры описываются в файле \verb|/etc/apt/vendor.list|\\
метод & способ доступа к репозитарию: ftp, http, file, rsh, ssh, cdrom\\
путь & путь к репозитарию в терминах выбранного метода\\
база & относительный путь к базе данных репозитария\\
название & название репозитария
\end{tabular}

Например, при установке \distribution в \verb|/etc/sources.list| записываются следующие
настройки:
{\small
\begin{verbatim}
# Sisyphus
rpm [alt] ftp://ftp.altlinux.ru/pub/distributions/ALTLinux/Sisyphus i586/Mandrake sisyphus
rpm-src [alt] ftp://ftp.altlinux.ru/pub/distributions/ALTLinux/Sisyphus i586/Mandrake sisyphus
\end{verbatim}
}

При этом, реальная структура репозитария по адресу {\tiny ftp://ftp.altlinux.ru/pub/distributions/ALTLinux/Sisyphus}
выглядит следующим образом:

{\small
\begin{verbatim}
ftp://ftp.altlinux.ru/pub/distributions/ALTLinux/Sisyphus
|-- SRPMS
|-- i586
|   |-- Mandrake
|   |   |-- RPMS
|   |   |-- RPMS.sisyphus -> RPMS
|   |   |-- SRPMS.sisyphus -> ../../SRPMS
|   |   |-- base
\end{verbatim}
}

Более подробное описание команд программы apt-get можно найти в
справочной системе дистрибутива на страницах \verb|apt-get(8)| и \verb|apt.conf(5)|.

\subsection{Создание собственного репозитария}

Вы также можете создавать собственные репозитарии и использовать их для обновления или
установки своих программ. Для этого необходимо создать структуру каталогов, подобную 
описанной выше. Вы можете варьировать следующие компоненты (перечисляются по дереву выше):

\begin{tabular}{l|p{400pt}}
\textbf{i586} & архитектура, под которую собраны пакет (совпадает с архитектурой в имени бинарных RPM--пакетов).\\
\textbf{Mandrake} & название подсистемы. Этот уровень в дереве может отсутствовать (то есть, каталоги \textbf{RPMS} и 
\textbf{base} могут идти сразу следом за архитектурой).\\
\textbf{RPMS} & Каталог, в котором размещены бинарные пакеты.\\
\textbf{SRPMS} & Каталог, в котором размещены пакеты с исходными текстами программ.\\
\textbf{RPMS.\textit{sisyphus}} & ссылка на каталог \textbf{RPMS}. При этом \textbf{sisyphus} заменяется
на собственное название репозитария, например, \textbf{local}.\\
\textbf{SRPMS.\textit{sisyphus}} & ссылка на каталог \textbf{../../SRPMS}. При этом \textbf{sisyphus} заменяется
на собственное название репозитария, например, \textbf{local}.\\
\textbf{base} & служебный каталог, в котором размещается база данных APT.\\
\end{tabular}

Следующий шаг в создании своего репозитария заключается в помещении бинарных пакетов в каталог \textbf{RPMS},
а пакетов с исходными текстами --- в каталог \textbf{SRPMS} и в генерации служебной информации для APT, используя
команду \verb|genbasedir|.

Формат команды \verb|genbasedir|:

\verb|genbasedir| {\small [опции] <название подсистемы> <репозитарий 1> [<репозитарий 2> .. <репозитарий N>]}

Из опций, список которых можно увидеть при запуске \verb|genbasedir| без параметров, наиболее важной 
является опция \verb|--topdir|, позволяющая указать путь к репозитарию. Все остальные параметры задаются 
относительно этого пути. Выглядит это следующим образом. Допустим, что наше дерево каталогов выглядит так:

\begin{verbatim}
/opt/repository/
|-- SRPMS
|-- SRPMS.security
|-- i386
|   |-- MyDistro
|   |   |-- RPMS
|   |   |-- RPMS.local -> RPMS
|   |   |-- RPMS.security
|   |   |-- SRPMS.local -> ../../SRPMS
|   |   |-- SRPMS.security -> ../../SRPMS.security
|   |   |-- base
\end{verbatim}


Тогда строка запуска \verb|genbasedir| будет выглядеть так:

\verb|genbasedir --topdir=/opt/repository i386/MyDistro local security|

Этой строкой мы создадим информацию для APT в двух репозитариях --- local и security.
Для того, чтобы воспользоваться этой информацией, необходимо прописать доступ к репозитариям
в \verb|/etc/apt/sources.list|:

\begin{verbatim}
rpm file:/opt/repository i386/MyDistro local
rpm-src file:/opt/repository i386/MyDistro local
rpm file:/opt/repository i386/MyDistro security
rpm-src file:/opt/repository i386/MyDistro security
\end{verbatim}

Репозитарий MyDistro.security, хранящий пакеты с исправлениями ошибок в системе безопасности,
имеет смысл подписывать PGP--ключем, чтобы при установке пакета можно было проверить
аутентичность репозитария и хранящихся в нем пакетов. Для этого необходимо создать соответствующий
PGP--ключ, используя программу GnuPG (\verb|gpg|) и запомнить его отпечаток (fingerprint) на клиентских
машинах в файле \verb|/etc/apt/vendors.list| в формате:

\begin{verbatim}
simple-key "краткое название ключа" {
        Fingerprint "отпечаток ключа";
        Name "Полное название ключа";
}
\end{verbatim}

Примером может служить ключ службы безопасности ALT Linux Team, которым подписаны репозитарии
``Сизиф'' и обновления безопасности для различных дистрибутивов ALT Linux:

\begin{verbatim}
simple-key "alt" {
        Fingerprint "BB1DD157A9722953847C5DB25B433A0EEAC91CA0";
        Name "ALT Security Team <security@altlinux.ru>";
}
\end{verbatim}

Для того, чтобы APT проверял аутентичность подписи, необходимо указать, что соответствующий репозитарий
подписан PGP--ключем в \verb|/etc/apt/sources.list|:

\begin{verbatim}
rpm [alt] file:/opt/repository i386/MyDistro security
rpm-src [alt] file:/opt/repository i386/MyDistro security
\end{verbatim}

Необходимо также сгенерировать информацию для APT в репозитарии с указанием опции \verb|--sign| команды
\verb|genbasedir|. Дополнительно, можно указать идентификатор ключа, если он отличается от
ключа по умолчанию, используя опцию \verb|--uid=идентификатор|. Значением этой опции является идентификатор
ключа в том виде, как он передается программе GnuPG в опции \verb|--default-key|:

\verb|genbasedir --topdir=/opt/repository --sign \|\\
\verb|              --uid='ALT Security Team' i386/MyDistro security|

Операцию создания служебной информации для APT необходимо производить каждый раз, когда вносятся
изменения в репозитарий.

\end{document}
