четверг, 9 апреля 2009 г.

План перехода с Windows на Linux: Часть 9. Установка программного обеспечения

В этом пособии Крис Волден, автор состоящей из 9 частей серии пособий от developerWorks по переходу с Windows на Linux, расскажет, что такое RPM, научит загружать и компилировать пакеты, опишет плюсы и минусы автоматизированного управления пакетами.

Одна из первых вещей, на которые вы обращаете внимание при установке Linux -- это большое количество входящих в дистрибутив пакетов. Большинство дистрибутивов содержат операционную систему Linux, средства для инсталляции и средства администрирования. Кроме того, в них включаются средства для работы в Интернете, средства разработки, офисные пакеты, игры, а также некоторые средства, о которых вы даже не слышали. Дистрибутивы Linux, содержащие тысячи доступных пакетов, не редкость. Если вы не выбрали "установить все", будет установлено некоторое подмножество этих пакетов.

Теперь у вас могут возникнуть вопросы "Как удалить ненужные пакеты? Как установить что-то недостающее? Могу ли я использовать программное обеспечение, не входящее в мой дистрибутив?"

Пакеты RPM

В ходе установки Linux вы, вероятно, обратили внимание на информацию об устанавливаемых пакетах RPM. RPM, сокращение от Redhat Package Manager, созданный в Red Hat, стал стандартным средством управления программным обеспечением для Red Hat и UnitedLinux, а также для многих других дистрибутивов.

RPM -- в сущности пакет, содержащий программное обеспечение для Linux, готовое для установки и запуска на компьютере определенной архитектуры. Например, в "Части 3. Введение в Webmin" мы устанавливали RPM-пакет webmin. Все программное обеспечение, изначально входящее в ваш дистрибутив, устанавливается из RPM.

Структура RPM

RPM -- это набор файлов. В него входит файл .spec, предоставляющий информацию о пакете, его назначении и зависимостях (какие пакеты должны быть установлены, чтобы этот пакет мог работать). Файл .spec также содержит манифест файлов пакета, информацию о том, куда в системе эти файлы должны быть загружены и какие они имеют изначальные права доступа. RPM также содержит преинсталляционный скрипт, написанный разработчиком пакета. Кроме того, RPM содержит скомпилированные бинарные файлы. И наконец, RPM содержит постинсталляционный скрипт.

Структура RPM

.spec преинсталляционный скриптбинарный файлбинарный файл ... бинарный файлпостинсталляционный скрипт

При установке RPM система сначала проверяет, удовлетворяются ли имеющиеся зависимости. Если нет, процесс инсталляции прекращается, за исключением случаев, когда используются специальные опции, вынуждающие осуществить инсталляцию.

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

Что изменяют RPM

В ходе установки пакетов RPM происходит копирование файлов в систему и выполнение скриптов. Поскольку RPM запускает root, все эти действия доступны только root'у. Поэтому, прежде чем устанавливать пакет в систему, важно знать его происхождение. Так же, как и в случае с программным обеспечением для Windows, в RPM может быть включен враждебный программный код. Пакеты RPM от производителей как правило безопасны, но будьте осторожны при загрузке и установке пакетов, имеющих неизвестное происхождение.

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

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

База данных RPM

База данных RPM -- элемент, добавляющий пакетам RPM элегантности. Обычно эта база данных хранится в каталоге /var/lib/rpm и содержит информацию о каждом установленном в системе пакете. База данных знает о взаимных зависимостях между пакетами, и от нее поступит предупреждение, если удаление пакета может привести к повреждению других пакетов. База данных знает обо всех файлах, которые изначально установлены при инсталляции пакетов, и знает их изначальное состояние в системе. Ей также известно местоположение документации и конфигурационных файлов для каждого пакета. Может показаться, что информации очень много, и это действительно так. Но она не является раздутой и громоздкой. В системе, содержащей 1,066 пакетов, включающих в себя 203,272 файлов, файлы базы данных занимают всего 45 MB! RPM использует базу данных для проверки зависимостей между пакетами, а также при загрузке и выгрузке пакетов. Кроме того, к базе данных за информацией о пакетах могут обращаться пользователи.

Использование RPM

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

rpm -i (install)

При установке пакета в первый раз используется опция -i (install). Просто укажите команде rpm в качестве аргумента бинарный пакет. Пакет установится в систему. Процесс инсталляции обычно занимает секунды. При установке пакета часто добавляют опцию -v (verbose), которая обеспечивает вывод подробной информации о ходе процесса, а также опцию -h (hash bar), которая по ходу выполнения процесса установки пакета выводит на консоль знаки диез (#). Вот пример инсталляции пакета:


Листинг 1. Инсталляция пакета MyPackage
$ rpm -ivh MyPackage-1.0.0.i386.rpm
Preparing... ########################################### [100%]
1:MyPackage ########################################### [100%]

Вот как! Теперь MyPackage установлен и готов к использованию.

Команду rpm может выполнить только root

Использовать rpm для установки и удаления пакетов может только root, поскольку необходим доступ файловой системе и базе данных rpm.

rpm -e (erase)

Для удаления установленного пакета используется опция -e, 'стирающая' его. rpm обратится к базе данных, чтобы удалить все файлы данного пакета. Если в системе есть пакеты, имеющие зависимости от удаляемого пакета, выполнение команды rpm прервется. Вы можете принудительно удалить пакет, воспользовавшись опцией nodeps. (nodeps может также использоваться для принудительной инсталляции.) При использовании опций принудительной установки или удаления пакета будьте крайне осторожны. Удаление пакетов, от которых зависят другие пакеты, может иметь плачевные последствия. Ниже приведена команда для удаления ранее установленного пакета:

$ rpm -e MyPackage

Обратите внимание, что при удалении пакета не требуется указывать его полную версию. Полное наименование пакета было необходимо при его установке, поскольку мы указывали имя файла. На установленные пакеты обычно ссылаются только по их имени. Имя пакета -- это все вплоть до номера версии.

rpm -V (verify)

Опция verify очень полезна. Она сравнивает текущее состояние установленных файлов пакета с их изначальным состоянием. Для отображения различий используются специальные обозначения:

Результаты проверки файлов

SРазличается размер файлов (Size)
MРазличается состояние (Mode) (включая права доступа и тип файла)
5Различается сумма MD5
DНе совпадают major/minor-номера
LНе совпадает путь readLink(2)
UНе совпадает имя пользователя
GНе совпадает группа
TРазличается mTime

Если применив к пакету команду rpm -V вы обнаружили, что изменился размер исполняемых файлов, это может быть признаком нарушения безопасности.

rpm -U (upgrade)

Если пакет установлен, любая попытка установить пакет с тем же именем выдаст сообщение, что такой пакет уже установлен. Если вы хотите обновить пакет до более поздней версии, используйте опцию -U. При одновременном обновлении нескольких пакетов будет предпринята попытка установить их в таком порядке, чтобы удовлетворялись взаимные зависимости. Другими словами, первыми установятся пакеты, от которых зависят другие. Опция -U может использоваться и в случае, когда пакет не установлен. Многие используют эту опцию не только для обновления, но и и для установки (вместо -i). Ниже приведен пример использования опции upgrade для установки нескольких пакетов:


Листинг 2. Обновление взаимозависимых пакетов
$ rpm -Uvh My*.rpm
Preparing... ########################################### [100%]
1:bMyPackageDep ########################################### [ 50%]
1:aMyPackageNew ########################################### [100%]

В приведенном примере пакет bMyPackageDep был необходим для aMyPackageNew, поэтому rpm сначала установил пакет bMyPackageDep, а затем aMyPackageNew, несмотря на то, что имена файлов были расположены в обратном порядке.

rpm -q (query)

Из базы данных rpm может быть получена полезная информация. Запросы может делать любой пользователь, имеющий права на чтение базы данных rpm. По умолчанию право на чтение имеют все пользователи. Для запроса используется опция -q, затем указывается имя пакета. Ответом будет версия пакета.

$ rpm -q MyPackage
MyPackage-1.0.0

Имя пакета должно быть указано точно. Использование метасимволов не допускается. Однако если вы не помните полное имя пакета, можете воспользоваться командой grep, которая поможет найти нужный пакет. Воспользуйтесь опциями -qa для запроса обо всех установленных в системе пакетах, а затем передайте информацию при помощи pipe команде grep с последующим указанием той части имени пакета, которую помните. Например:

Удобство команды grep

grep -- средство поиска в тексте, имеющее широкие возможности. По умолчанию при поиске в файле grep показывает те строки файла, которые содержат искомый текст. В нашем примере мы будем искать "IBM". grep -- мощный инструмент, используемый при создании скриптов и работе в консоли.

$ rpm -qa | grep IBM
IBMWSAppDev-Product-5.0-0
IBMWSSiteDevExp-Core-5.0-0
IBMWSSiteDev-Core-5.0-0
IBMWSTools-WAS-BASE-V5-5.0-0
IBMJava118-SDK-1.1.8-5.0
IBMWSWB-samples-5.0-0
IBMWSWB-5.0-0
IBMWSAppDev-Core-5.0-0
IBMWSAppDev-5.0-0
IBMWSTools-5.0-0

Помимо номера версии, rpm -q может выдавать и другую полезную информацию о пакете. Ниже приведены несколько примеров:

Получение информации при помощи rpm -q

rpm -q changelogПоказывает историю изменений при разработке пакета
rpm -qcПоказывает конфигурационные файлы для пакета
rpm -qdПоказывает файлы документации для пакета
rpm -qiПоказывает описание пакета
rpm -qlПоказывает список файлов пакета
rpm -qRПоказывает зависимости для пакета

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

rpm -q whatprovides

Приведенная выше команда определит, какой пакет связан с данным файлом. Имя файла должно включать абсолютный путь до файла, так как именно в таком виде информация хранится в базе данных rpm.

front-end'ы для RPM

Работа с rpm в консоли не сложна, но иногда бывает удобнее использовать графический интерфейс. В Linux обычно присутствуют front-end программы, предоставляющие интерфейс для программы rpm. В каждый дистрибутив включен свой front-end, и они могут различаться. Информацию об используемых в вашем дистрибутиве средствах управления пакетами вы найдете в документации к дистрибутиву.

Программные пакеты Webmin

Webmin также предоставляет несложный основанный на Web-интерфейсе front-end для взаимодействия с пакетами RPM.


Рисунок 1. Интерфейс Webmin
Рисунок 1. Интерфейс Webmin

С помощью этого средства вы можете легко установить, удалить программное обеспечение и получить информацию о нем. Кроме того, программное обеспечение может быть установлено непосредственно с сайта. Если в вашей системе установлены такие инструменты, как apt или Red Hat Network, Webmin соберет их и предоставит интерфейс доступа к ним.

Исходный код

Поскольку Linux является операционной системой с открытыми исходными кодами, он поставляется со всеми средствами разработки, необходимыми для компиляции программного обеспечения. Несмотря на то, что большинство используемых пакетов предоставляются в виде бинарных RPM, вы не ограничены только этими пакетами. При желании вы можете загрузить сырой исходный код и скомпилировать его для своей системы.

При компиляции из исходных кодов на production-системах следует проявлять осторожность, поскольку это может вызвать некоторые проблемы или прекращение поддержки коммерческого программного обеспечения, используемого в вашей системе, например, IBM DB2. Однако умение компилировать из исходных кодов позволит вам прикладывать к программам патчи и работать с пакетами, перенесенными из других окружений. Стоит вам провести успешную компиляцию из исходников, и вы сможете создать даже свой собственный RPM!

Демонстрация компиляции из исходников на примере игры Corewars

Для демонстрации того, насколько прост процесс компиляции из исходных кодов, скомпилируем моделирующую игру под названием Corewars (см. ссылку в разделе Ресурсы). Вот информация о Corewars с соответствующего сайта: "Corewars -- моделирующая игра, в которой на виртуальном компьютере воины пытаются разбить друг друга. Воины могут быть созданы при помощи одного из двух ассемблер-подобных языков, Corewars или Redcode. Corewars -- язык, используемый по умолчанию, он проще для изучения и понимания. Redcode предоставляет более продвинутые и развернутые инструкции, но и требует большего времени для изучения".

Первый этап компилирования из исходных кодов -- загрузка пакета исходников с веб-сайта:

Загрузив пакет, я распаковываю архив.

tar -xvzf corewars-0.9.13.tar.gz

Распаковывание файлов производится в мой текущий каталог. Стандартный подход -- размещать исходные коды в каталоге с названием, соответствующем наименованию продукта. В нашем случае это каталог corewars-0.9.13.

Я перехожу в этот каталог и нахожу там исходные коды, документацию, конфигурационные скрипты и файлы README. Большинство пакетов исходников имеет файл INSTALL и файл README. Прочтите их, прежде чем приступить к компиляции. Обычно это позволяет сохранить ваши усилия, поскольку вы получите информацию о том, как предотвратить возникновение возможных проблем, и получите инструкции по корректному проведению компиляции и инсталляции. Большинство проблем, которые возникали у меня при компиляции из исходников, были связаны с тем, что я не следовал указаниям.

Чаще всего следующим этапом идет запуск скрипта configure. configure -- часть пакета Autoconf, входящего в средства разработки вашего дистрибутива Linux. Вот цитата из описания пакета Autoconf: "Autoconf -- средство GNU для конфигурирования исходных кодов и Makefile'ов. При помощи Autoconf программисты могут создавать компактные и настраиваемые пакеты, поскольку автор пакета может предусмотреть различные опции конфигурации".

Скрипт configure запускает в системе ряд тестов, чтобы определить оптимальный способ компиляции пакета для вашего дистрибутива и архитектуры. Затем он создает Makefile специально для вашей системы. При возникновении проблем компиляции скрипт configure выдаст соответствующее сообщение. Обычно configure позволяет выбрать возможности, которые вы хотите включить при компиляции или задать параметры, указывающие местоположение библиотек или необходимых файлов, чтобы сборка пакета прошла успешно. Сейчас мы запустим configure без дополнительных параметров:

./configure

Несколько тестов, выполняемых в системе, наконец успешно завершились. Теперь создадим программу при помощи

make

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

make install

Файлы копируются в соответствующие области системы, права доступа к файлам обновляются, конфигурационные файлы копируются и документация добавляется в справочные страницы.

Теперь давайте протестируем наше изделие, запустив программу. Это графическая программа, поэтому для ее запуска нам понадобится графическая сессия. Выполненная нами команда make install должна поместить программу в наш путь поиска исполняемых файлов.

corewars

В награду должен появиться графический экран.


Рисунок 2. Удача!
Рисунок 2. Игра Corewars

Обсуждение правил игры corewars выходит за рамки нашей статьи, но вы можете найти соответствующую документацию на странице man (man corewars).

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

Поскольку наша программа была установлена без использования rpm, она не попала в базу данных rpm. На случай, если установленная программа не работает, большинство Makefile'ов имеет параметр для деинсталляции, позволяющий удалить программу:

make uninstall

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

Исходные RPM'ы

При создании RPM используется термин исходные RPM (Source RPM). Это SPEC-файл в сочетании с исходным кодом, предназначенные для сборки на одной или нескольких архитектурах. Из двух возможных вариантов этот является лучшим. Используя исходные коды, вы можете скомпилировать программу на своей системе, но конечный продукт будет пригодным для установки пакетом RPM, а не сырым бинарником. Большая часть пакетов доступна как в виде предварительно скомпилированных RPM, так и в виде SRPM. Это позволяет легко переносить программы между разными платформами в Linux. Если вы успешно пересобрали пакет для другой платформы, подумайте о том, чтобы сделать ваш конечный RPM доступным сообществу Linux.

Пусть исходники будут с вами

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

Для работы с пакетами rpm из консоли вы должны хорошо знать, какие опции для чего используются, но для повседневного использования существуют варианты front-end интерфейсов, которые облегчают процесс управления пакетами rpm. Помимо тех, которые входят в ваш дистрибутив, доступны и другие, например, Webmin.

Вы не ограничены использованием только предварительно собранных пакетов. Вы можете воспользоваться преимуществами открытых исходников и собирать приложения непосредственно из исходников. В зрелых проектах сборка для как правило не вызывает затруднений. Помните, что программа, установленная из исходных кодов, не попадет в вашу базу данных rpm. Работая с исходниками, старайтесь использовать source rpm'ы, которые сочетают в себе возможность компиляции исходного кода и легкость управления пакетами rpm.

Комментариев нет:

Отправить комментарий