Утилиты для работы с пакетами
Установщик
Для того, чтобы пакет установить, удалить или просмотреть о нем информацию, используется специальная программа --- установщик пакетов. Заметим, что эта же программа по традиции отвечает за сборку пакета из исходных текстов по заранее составленной "инструкции" --- так называемому spec-файлу. В подавляющем большинстве случаев установщик пакетов работает ровно с одним пакетом: этот пакет может быть как установлен в системе, так и нет. Установщик пакетов в ПСПО ALT Linux называется RPM (RPM Package Manager, ранее Red Hat Package Manager, то есть установщик пакетов в дистрибутивах Red Hat Linux).
Возьмем уже скачанный нами пакет zip-2.32-alt2.S40.1.i586.rpm и воспользуемся утилитой rpm для просмотра списка файлов в этом пакете (ранее мы уже проделывали такую операцию "вручную" --- с помощью программы rpm2cpio):
$ rpm -qpl zip-2.32-alt2.S40.1.i586.rpm /usr/bin/zip /usr/bin/zipcloak /usr/bin/zipnote /usr/bin/zipsplit /usr/share/doc/zip-2.32 /usr/share/doc/zip-2.32/BUGS /usr/share/doc/zip-2.32/CHANGES /usr/share/doc/zip-2.32/LICENSE /usr/share/doc/zip-2.32/MANUAL /usr/share/doc/zip-2.32/README /usr/share/doc/zip-2.32/TODO /usr/share/doc/zip-2.32/WHATSNEW /usr/share/doc/zip-2.32/WHERE /usr/share/man/man1/zip.1.bz2
Ключ -q задает один из основных режимов работы утилиты rpm и означает "выполнить запрос" (query). Ключ -p (package) заставляет утилиту работать не с установленным в системе пакетом, а с пакетом, лежащим в указанном файле (это один из способов указать на нужный пакет), а ключ -l (file list) задает нужное нам действие: показать список файлов. (Заметим, что запрос можно было осуществить и с помощью команды rpmquery -pl zip-2.32-alt2.S40.1.i586.rpm.) Если же требуется вывести список файлов, относящихся к уже установленному пакету, ключ -p использовать не следует. В этом случае выбор пакета будет осуществляться по его имени (достаточно использовать краткую форму --- zip).
Выполним еще несколько запросов с помощью rpm. Просмотрим информацию (ключ -i --- info) об установленном в системе пакете tar (tape archiver):
[george@demo ~]$ rpm -qi tar Name : tar Relocations: (not relocateable) Version : 1.15.1 Vendor: ALT Linux Team Release : alt8 Build Date: Сбт 14 Апр 2007 20:01:52 Install date: Втр 15 Июл 2008 21:23:38 Build Host: ldv.hasher.altlinux.org Group : Архивирование/Резервное копирование Source RPM: tar-1.15.1-alt8.src.rpm Size : 1213918 License: GPL Packager : Dmitry V. Levin <ldv@altlinux.org> URL : http://www.gnu.org/software/tar/ Summary : Утилита проекта GNU для архивации файлов Description : The GNU tar program saves many files together into one archive and can restore individual files (or all of the files) from the archive. tar can also be used to add supplemental files to an archive and to update or list files in the archive. tar includes multivolume support, automatic archive compression/decompression, the ability to perform remote archives and the ability to perform incremental and full backups.
Посмотрим теперь историю изменений (changelog) в сборке tar:
[george@demo ~]$ rpm -q --changelog tar * Сбт Апр 14 2007 Dmitry V. Levin <ldv@altlinux.org> 1.15.1-alt8 - Reduced macro abuse in specfile. * Втр Ноя 28 2006 Dmitry V. Levin <ldv@altlinux.org> 1.15.1-alt7 - Disabled GNUTYPE_NAMES handling by default and added --allow-name-mangling option to re-enable it. (CVE-2006-6097, patch from Kees Cook). ...
Отметим еще раз, что запросы можно осуществлять как с помощью rpm -q, так и с помощью rpmquery.
Займемся теперь установкой пакетов из файлов. Скачаем несколько архивов из хранилища и используем утилиту rpm с ключом -i (install). Заметим, что в данном случае ключ -i задает основной режим работы rpm и имеет отличное от рассмотренного выше значения. Естественно, для установки пакетов требуются права суперпользователя.
[root@demo ~]# rpm -i xvfb-run-1.2-alt2.noarch.rpm error: failed dependencies: xorg-x11-xvfb is needed by xvfb-run-1.2-alt2 fakeroot is needed by xvfb-run-1.2-alt2
Как видно, установщик отказывается устанавливать пакет: для установки xvfb-run-1.2-alt2 оказались нужны отсутствующие в системе xorg-x11-xvfb и fakeroot. Возьмем теперь пакет без неудовлетворенных зависимостей:
[root@demo ~]# rpm -i vim-plugin-moin-syntax-1.8-alt2.noarch.rpm
Утилита rpm молча завершает работу, что свидетельствует об успешном выполнении запрошенной операции. Какие же файлы появились в нашей системе?
[root@demo ~]# rpm -ql vim-plugin-moin-syntax /etc/alternatives/packages.d/moinmoin.vim /usr/share/vim/ftplugin/moin.vim /usr/share/vim/syntax/moinmoin.vim
Как видно, их всего три. Давайте теперь вернемся к неустановившемуся пакету xvfb-run-1.2-alt2. Его установка привела бы к появлению в системе лишь одного нового файла:
[root@demo ~]# rpm -qpl xvfb-run-1.2-alt2.noarch.rpm /usr/bin/xvfb-run
Посмотрим, наличия чего требует (requires) для установки этот пакет:
[root@demo ~]# rpm -qpR xvfb-run-1.2-alt2.noarch.rpm xorg-x11-xauth xorg-x11-xvfb fakeroot rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames) <= 3.0.4-1 coreutils sh
Утилита rpm с ключом -R выдает список зависимостей пакета. В нашем случае неудовлетворенными остались, как мы помним, две (а для того, чтобы rpm отказалась устанавливать пакет, достаточно было и одной).
Попробуем теперь выполнить удаление (ключ -e, erase) пакета vim-plugin-moin-syntax: его мы установили только что, поэтому никакой другой из имеющихся в системе пакетов от него не зависит.
[root@demo ~]# rpm -e vim-plugin-moin-syntax
Как мы видим, удаление прошло успешно. Если же попробовать удалить пакет, от которого зависят другие установленные пакеты, то rpm откажется это делать:
[root@demo ~]# rpm -e coreutils error: removing these packages would break dependencies: coreutils is needed by dmsetup-1.02.22-alt1 coreutils is needed by less-394-alt1 coreutils is needed by module-init-tools-compat-3.3-alt0.5.pre6 ...
Диспетчер
Из приведенных примеров понятно, что установщик --- это сугубо техническая утилита. Обычный пользователь не может и не должен к ней обращаться. Для пользовательской (административной) работы с пакетами требуется как более разумный интерфейс, так и дополнительная функциональность. Такие задачи решаются другими классом утилит --- диспетчерами пакетов. Главное отличие диспетчера от установщика заключается в том, что установщик работает с отдельным пакетом, а диспетчер --- с целым хранилищем: диском, веткой, дистрибутивом. Диспетчер пакетов должен уметь использовать различные типы хранилищ, чтобы обеспечить возможность выполнения следующих действий:
- рекурсивная установка пакетов --- автоматическое удовлетворение зависимостей путем установки недостающих пакетов (установщик не может выполнять эту функцию, поскольку не знает, откуда взять дополнительные пакеты);
- рекурсивное удаление --- аналогично рекурсивной установке, но со следующей разницей: при рекурсивной установке просматриваются индексы пакетов в хранилищах, а при рекурсивном удалении --- локальные индексы;
- обновление --- установка новой версии уже установленного пакета (это действие отделено от установки в силу особенностей обработки индексов).
В ПСПО ALT Linux традиционно используется портированный из дистрибутивов Debian GNU/Linux диспетчер APT (Advanced Package Tool), изначально ориентированный на использование установщика dpkg и формата пакетов deb. APT предоставляет целый комплект утилит для работы с хранилищами. Мы рассмотрим две из них:
- утилиту apt-get, работающую с хранилищами непосредственно;
- утилиту apt-cache, работающую с индексами --- информацией о том, что находится в хранилище.
Смысл разделения на apt-get и apt-cache состоит в следующем: apt-get при своей работе обыкновенно использует сеть, скачивая информацию о пакетах и формируя индексы, apt-cache же сети для своей работы не требует, используя информацию из локальных копий индексов. Какие именно хранилища используются утилитой apt-get, указано в специальном месте. Речь об этом пойдет далее, а мы сейчас установим-таки xvfb-run, воспользовавшись возможностями APT:
[root@demo ~]# apt-get install xvfb-run Reading Package Lists... Done Building Dependency Tree... Done The following extra packages will be installed: fakeroot xorg-x11-xvfb The following NEW packages will be installed: fakeroot xorg-x11-xvfb xvfb-run 0 upgraded, 3 newly installed, 0 removed and 0 not upgraded. Need to get 1708kB of archives. After unpacking 4341kB of additional disk space will be used. Do you want to continue? [Y/n] Get:1 ftp://ftp.altlinux.org i586/classic fakeroot 1.9.4-alt2 [48.5kB] Get:2 ftp://ftp.altlinux.org i586/classic xorg-x11-xvfb 2:1.3.0.0-alt21.M40.10 [1656kB] Get:3 ftp://ftp.altlinux.org noarch/classic xvfb-run 1.2-alt2 [4107B] Fetched 1708kB in 0s (3963kB/s) Committing changes... Preparing... ####################################################### [100%] 1: fakeroot ####################################################### [ 33%] 2: xorg-x11-xvfb ####################################################### [ 66%] 3: xvfb-run ####################################################### [100%] Done.
Как видно, мы использовали команду apt-get с параметром install. В нашем случае она выполнила следующие операции:
- Просмотрела все индексы.
- Построила дерево зависимостей.
- Нашла пакет --- кандидат на установку (заметим, что мы могли потребовать установить сразу несколько пакетов).
- Предупредила, что помимо этого (для удовлетворения зависимостей) надо установить еще два пакета.
- Запросила подтверждение на установку дополнительных пакетов.
- Скачала все необходимые пакеты из хранилища.
- Установила их в правильном порядке.
Отметим, что команду apt-get install можно использовать и для обновления уже установленного пакета до версии из хранилища. Для обновления же всей системы целиком используется команда apt-get dist-upgrade (непосредственно перед этим действием рекомендуется дать команду apt-get update для обновления индексов --- но об этом чуть позже).
Заметим, что с рекурсивной установкой и рекурсивным удалением есть свои проблемы. Предположим, мы установили пакет, который рекурсивно потянул за собой много дополнительных пакетов. Через некоторое время после этого мы решаем все установленные таким образом пакеты удалить. Как это сделать? Увы, в общем случае ответ --- никак. Дело в том, что при рекурсивном удалении удалятся лишь те пакеты, которые зависят от выбранного (те, которые не могут существовать без него). Пакеты же, от которых зависел выбранный пакет, удалены не будут. В результате в системе останется довольно много пакетов, которые на самом деле никому не нужны.
Одно из решений описанной проблемы используется в дистрибутивах Debian. Каждому установленному пакету сопоставляется специальное поле, в котором записывается, был ли пакет установлен по явному требованию пользователя или для автоматического удовлетворения зависимостей. При удалении любого пакета происходит просмотр всех пакетов, установленных по зависимостям. В случае, если от какого-либо из них уже не зависит ни один из оставшихся в системе пакетов, пользователю (администратору) будет предложено такой пакет удалить.
Однако и такой подход имеет свои недостатки. Допустим, мы установили виртуальный пакет (то есть пакет, не имеющий собственных файлов, однако имеющий содержательный список зависимостей) --- таким является, например, пакет kde. Пусть теперь мы хотим удалить одну из автономных составляющих системы, которая была установлена по зависимостям этого виртуального пакета --- к примеру, мы желаем удалить все игры из KDE. Однако удаление пакета, отвечающего за игры, приведет к удалению виртуального пакета kde, после чего окажется, что все остальные компоненты KDE помечены как установленные по зависимостям, но никем не используются, а следовательно, система предложит их удалить. Как видно, решение об использовании такой схемы может привести к нежелательным последствиям.
Рассмотрим теперь, как происходит рекурсивное удаление. Попробуем избавиться от пакета fakeroot, от которого зависит установленный нами xvfb-run. Для этого нам понадобится параметр remove утилиты apt-get:
root@demo ~]# apt-get remove fakeroot Reading Package Lists... Done Building Dependency Tree... Done The following packages will be REMOVED: fakeroot xvfb-run 0 upgraded, 0 newly installed, 2 removed and 0 not upgraded. Need to get 0B of archives. After unpacking 77.9kB disk space will be freed. Do you want to continue? [Y/n] n Abort.
Здесь, увидев, что xvfb-run тоже придется удалить, мы одумались и отменили запрошенные действия. Попробуем теперь удалить пакет coreutils --- это пакет, который жизненно необходим системе:
[root@demo ~]# apt-get remove coreutils Reading Package Lists... Done Building Dependency Tree... Done The following packages will be REMOVED: GConf ImageMagick SysVinit Thunar a2ps abiword acpid alsa-utils alt-docs-genextras alt-docs-main alterator alterator-aptgroups alterator-auth alterator-backend-x11 alterator-browser-qt alterator-control alterator-datetime alterator-lookout ... WARNING: The following essential packages will be removed This should NOT be done unless you know exactly what you are doing! apt rpm (due to apt) gnupg (due to apt) basesystem coreutils (due to basesystem) etcskel (due to basesystem) service (due to basesystem) shadow-utils (due to basesystem) startup (due to basesystem) SysVinit (due to basesystem) util-linux (due to basesystem) vitmp (due to basesystem) 0 upgraded, 0 newly installed, 562 removed and 0 not upgraded. Need to get 0B of archives. After unpacking 1494MB disk space will be freed. You are about to do something potentially harmful To continue type in the phrase 'Yes, do as I say!'
Диспетчер предупреждает, что некоторые из пакетов, которые придется удалить, помечены как essential (жизненно важные для системы) и просит для подтверждения набрать не просто y (yes --- да), а целую фразу "Yes, do as I say!" ("Да, сделай так, как я говорю!"). Естественно, подтверждать удаление надо только в случае абсолютной уверенности в своих действиях. Откажемся теперь от удаления coreutils.
Рассмотрим еще некоторые возможности диспетчера. Для поиска пакетов используется утилита apt-cache с параметром search:
[root@demo ~]# apt-cache search kde amarok - Amarok is a music player for KDE. arts - aRts (analog realtime synthesizer) - the KDE sound system desktop-file-utils - Utilities for manipulating .desktop files digikam - A Photo Management Application for KDE docs-linux_gui - Graphical user interface in Linux gambas-gb-qt-kde - The Gambas KDE component gambas-gb-qt-kde-html - The Gambas KHTML component kaffeine - A Xine-based Media Player for KDE kchmviewer - KchmViewer is a chm (MS HTML help file format) viewer kde-common - The basic directory layout for KDE kde-common-devel - Development utils for KDE ...
Заметим, что apt-cache search ищет ключевое слово не только в коротком, но и в длинном описании пакета. Естественно, при поиске используются не сами хранилища, а локальные индексы (за поиск отвечает apt-cache, а не apt-get). Чтобы просмотреть информацию о лежащем в хранилище пакете, можно воспользоваться параметром show:
[root@demo ~]# apt-cache show xword Package: xword Section: Text tools Installed Size: 63480 Maintainer: Vitaly Lipatov <lav@altlinux.ru> Version: 1.0-alt1 Pre-Depends: rpmlib(PayloadFilesHavePrefix) (<= 4.0-1), rpmlib(CompressedFileNames) (<= 3.0.4-1) Depends: python-module-pygtk, coreutils Provides: gedam, xword (= 1.0-alt1) Obsoletes: gedam Architecture: noarch Size: 21742 MD5Sum: 5d9baebcbbb103782b3918d7c555742c Filename: xword-1.0-alt1.noarch.rpm Description: Xword is a GNOME crossword puzzle program Gedam is a GNOME program I wrote for doing crossword puzzles. It is similar to the AcrossLite program for Windows, and it can read and write the file format of that program. Consequently, it works well for doing puzzles from The New York Times. Although there is an existing version of AcrossLite for Linux, it has several glaring problems: poor support, the use of Motif, and the lack of a clock. For crossword files search in Google by "AcrossLite", f.i. http://puzzles.about.com/library/weekly/aa040697.htm
Скажем теперь несколько слов об индексах. Для их обновления используется команда apt-get с параметром update. Она скачивает с используемых хранилищ все индексы и заново формирует локальный кэш:
[root@demo ~]# apt-get update Get:1 ftp://updates.altlinux.org i586 release [720B] Get:2 ftp://ftp.altlinux.org i586 release [1005B] Get:3 ftp://ftp.altlinux.org i586 release [730B] Get:4 ftp://ftp.altlinux.org noarch release [728B] Get:5 ftp://ftp.altlinux.org i586 release [702B] Fetched 3885B in 0s (7192B/s) Hit ftp://updates.altlinux.org i586/updates pkglist Hit ftp://ftp.altlinux.org i586/classic pkglist Hit ftp://updates.altlinux.org i586/updates release Hit ftp://ftp.altlinux.org i586/classic release Hit ftp://ftp.altlinux.org i586/classic pkglist Hit ftp://ftp.altlinux.org i586/classic release Hit ftp://ftp.altlinux.org noarch/classic pkglist Hit ftp://ftp.altlinux.org noarch/classic release Hit ftp://ftp.altlinux.org i586/backports pkglist Hit ftp://ftp.altlinux.org i586/backports release Reading Package Lists... Done Building Dependency Tree... Done
Какие именно хранилища используются при работе утилитами семейства APT, указано в конфигурационных файлах каталога /etc/apt. В файле apt.conf содержатся общие настройки системы APT, а за используемые хранилища отвечает файл sources.list (он вполне может быть пустым) вместе со всеми файлами каталога sources.list.d. В этом каталоге может лежать значительное количество файлов, содержащих информацию о различных хранилищах пакетов в разнообразных местах. Типичная строка в файле из этого каталога выглядит примерно так:
# rpm [updates] ftp://ftp.altlinux.org/pub/distributions/ALTLinux/4.0/branch noarch classic
Символ решетки в начале строки является маркировкой комментария --- иными словами, соответствующая запись в данный момент не используется вовсе. Формат записи таков: вначале --- тип пакета (rpm), затем --- идентификатор цифровой подписи в прямых скобках (иногда пропускается), далее --- URL хранилища, название хранилища, одно или несколько названий веток.
Отметим, что наличие большого количества файлов в /etc/apt/sources.list.d объясняется существованием большого числа зеркал различных хранилищ. Использование того или иного зеркала может оказаться более или менее удобным по сетевым соображениям. Чтобы воспользоваться хранилищем, необходимо раскомментировать соответствующие строки (их может быть несколько) в нужном файле, удостовериться, что ненужных раскомментированных строк нет (учитываются все файлы в sources.list.d и, кроме них, файл sources.list), и дать команду apt-get update для обновления локальных индексов. Обновлять индексы следует также непосредственно перед выполнением apt-get dist-upgrade, чтобы при обновлении системы использовались актуальные их версии.
Сведения о ресурсах
Продолжительность (ак. ч.) |
Подготовка (календ. ч.) |
Полный текст (раб. д.) |
Предварительные знания |
Level |
1 |
1 |
1 |
|
1 |