• 10.1. Два способа установки ПО
  • 10.2. Программа rpm
  • 10.3. Компиляция ПО из исходных текстов
  • 10.3.1. Необходимые сведения о программировании на языке Си
  • 10.3.2. Инсталляция пакетов ПО из исходных текстов
  • Глава 10. Установка и обновление программных пакетов

    10.1. Два способа установки ПО

    Необходимость в установке новых программных пакетов под LINUX возникает в двух основных случаях:

    • когда появляется новая версия одного из уже установленных у вас пакетов;

    • когда возникает желание или необходимость использовать какой-то пакет, еще не установленный в системе.

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

    Для дистрибутивов, основанных на Red Hat Linux, существует две основных формы распространения ПО: в исходных текстах и в виде исполняемых модулей. В первом случае пакет ПО обычно поставляется в виде tar-gz архива, во втором случае - в виде rpm-пакета (но это не обязательно, исполняемые модули также могут распространяться в виде tar-gz-архива).

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

    10.2. Программа rpm

    Название этой программы (или команды) является аббревиатурой от Redhat Package Manager. Такая расшифровка дается в большинстве книг и руководств по Linux и кажется мне более правильной и логичной, хотя в главе 6 "The Official Red Hat Linux Reference Guide" говорится: "The RPM Package Manager (RPM), is an open packaging system available for any-one to use, and works on Red Hat Linux as well as other Linux and UNIX systems", т. е. предлагается рекурсивная расшифровка названия RPM, подобная расшифровке GNU - GNU is Not Unix).

    Программа rpm в некотором смысле аналогична программам типа setup wizard для MS Windows. Преимуществом использования этой программы по сравнению с установкой tar gz архивов является то, что она автоматически проделает все необходимые действия по установке ПО: создаст необходимые каталоги, распределит по ним файлы, создаст ссылки. Кроме того, она может быть использована не только для установки нового пакета, но и для обновления версий ПО, получения перечней установленного ПО и проверки установки, а также для деинсталляции отдельных пакетов (например, если после периода пробной работы с программой вы решили отказаться от ее дальнейшего использования). С помощью той же программы rpm можно самому создать пакет формата rpm, однако для начинающих лучше, наверное, этим не заниматься, а воспользоваться готовыми rpm-пакетами.

    Rpm-пакеты - это специальным образом подготовленные архивы, предназначенные для обработки программой rpm. Название rpm-пакетов оканчивается на суффикс .rpm, например, xzip-180-1.i386.rpm или xzip-180-1.src.rpm. Как видите, перед суффиксом .rpm стоит еще один суффикс. Если это .i386, .i686 или .i586, то в пакете находятся исполняемые файлы (оптимизированные для соответствующего типа процессора), а если этот суффикс .src, - то в пакете исходные тексты, которые после установки еще надо скомпилировать. Обычно как на установочных компакт-дисках, так и в интернет-каталогах rpm-пакеты с исполняемыми файлами располагаются в каталогах с названием RPMS, а rpm-пакеты с исходными текстами - в подкаталогах SRPMS. Часто встречаются также rpm-пакеты с суффиксом.noarch.rpm, содержащие файлы, которые просто без всякой дополнительной обработки устанавливаются в соответствующие каталоги (например, файлы страниц интерактивного руководства man). И, наконец, если rpm-пакет рассчитан на версию Linux, предназначенную для другой аппаратной платформы (AMD, DEC Alpha, SUN Sparc, MIPS, PowerPC), это тоже будет отображено в имени пакета: вместо i386 в суффиксе будет стоять, соответственно, athlon, alpha, sparc, mips или ppc.

    В Интернете rpm-пакеты можно найти на различных серверах. По моему опыту наиболее удобным сервером в Интернете для поиска rpm-архивов является сервер http://rufus.w3.org (недаром он имеет другое имя http://rpmfind.net). На нем установлена поисковая система, которая позволяет упорядочивать список пакетов наиболее удобным для вас способом:

    • по именам пакетов;

    • по дистрибутивам;

    • по группам приложений;

    • по датам;

    • по поставщикам (производителям) ПО.

    Общий объем архива rpm-пакетов на этом сервере составляет более 66 Гигабайт. Очень богатые архивы хранят также два ftp-сервера в России: ftp://ftp.chg.ru/pub/Linux и ftp://ftp.nc.orc.ru/.

    Необходимо только заметить, что если для перекачки пакетов из Интернета вы используете компьютер, работающий под Windows 95, то все имена пакетов у вас будут, скорее всего, искажены. Дело в том, что Windows "не любит" имена, в которых несколько точек (например, glib-1.0.6-3.i386.rpm) и заменит "лишние", по его мнению, точки на знаки подчеркивания - glib-1_0_6-3_i386.rpm. Так что после получения пакета (при переносе его на ПК с ОС Linux) желательно эти "исправления" устранить, вернувшись к исходным именам UNIX. Правда, делать это не обязательно, поскольку внутри rpm-пакет все равно правильно идентифицирован, но для единообразия и облегчения поиска файлов все же целесообразно.

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

    [root]# rpm -i имя_rpm-архива

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

    [root]# rpm -U -force имя_rpm-архива

    Здесь параметр -U говорит программе, что надо произвести обновление (upgrade) пакета, а опция -force требует безусловно (и без лишних вопросов) обновить все входящие в пакет файлы. Заметьте, что это очень сильное требование, и в некоторых случаях может быть лучше сохранить какие-то (например, конфигурационные) файлы от предыдущей версии. Если установка проходит нормально, и никаких дополнительных сообщений не появляется, то после завершения работы программы (после появления приглашения оболочки) вы можете пользоваться вновь установленным пакетом.

    К сожалению, не всегда все так просто. Приведу конкретный пример. У меня был установлен RedHat Linux версии 5.2, причем программа Midnight Commander (mc) была версии 4.1.36. На ftp-сервере я увидел версию 4.5.30 этой программы (пакет mc-4.5.30-12.i386.rpm) и, естественно, решил ее поставить. Однако оказалось, что для этого необходимо установить еще 4 других пакета, о чем rpm мне и сообщила:

    ошибка: неудовлетворенные зависимости:

    redhat-logos нужен для mc-4.5.30-12

    libglib-1.2.so.0 нужен для mc-4.5.30-12

    libc.so.6(GLIBC_2.1) нужен для mc-4.5.30-12

    libc.so.6(GLIBC_2.0) нужен для mc-4.5.30-12

    Это не удивительно, если вы вспомните, что и при первоначальной установке Linux программа инсталляции тоже проверяла взаимозависимости пакетов и предлагала установить недостающие. Однако в случае инсталляции с CD-ROM все необходимые пакеты находятся на том же диске, а здесь мне пришлось вначале поискать нужные пакеты. Два пакета (redhat-logos-1.0.5-1.noarch.rpm и glibc-2.1.1-6.i386.rpm) я нашел без труда, после чего rpm перестала просить и GLIBC_2.0. А вот с libglib.so.1 вышло сложнее. Во-первых, я никак не мог найти пакета с таким названием. Как оказалось, такого пакета и не существует, файл libglib.so.1 входит в состав пакета glib-1.0.6-3.i386.rpm.

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

    [root]# rpm -qpl имя_rpm-архива

    А для получения информации о том, для чего служит ПО, содержащееся в rpm-пакете, используйте команду

    [root]# rpm -qpi имя_rpm-архива

    Дело в том, что файлы RPM кроме собственно архива файлов содержат информацию о пакете, включая имя, версию и краткое описание. С помощью той же программы rpm вы можете просмотреть эту дополнительную информацию. Например, для пакета glib-1.0.6-3.i386.rpm вывод команды

    [root]# rpm -qpi glib-1.0.6-3.i386.rpm

    будет примерно таким:

    Name: glib Relocations: (not relocateable)

    Version: 1.0.6 Vendor: Red Hat Software

    Release: 3 Build Date: Суб 10 Окт 1998 04:49:03

    Install date: (not installed)

    Build Host: porky.redhat.com

    Group: Libraries Source RPM: glib-1.0.6-3.i386.rpm

    Size: 55305

    Packager: Red Hat Software ‹bug@redhat.com›

    Summary: Handy library of utility functions

    Description: Handy library of utility functions. Development libs and headers are in gtk+-devel.

    Если дать команду:

    [root]# rpm -qpl glib-1.0.6-3.i386.rpm

    будет выдан список входящих в пакет файлов с указанием того, куда они будут установлены:

    /usr/lib/libglib.so.1

    /usr/lib/libglib.so.1.0.6

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

    [root]# rpm -qа

    вы получите перечень всех установленных в системе пакетов (перечень будет очень большим, так что лучше сразу направить вывод в фильтр more или в файл, который потом просматривать с помощью less или встроенной программы просмотра из оболочки Midnight Commander). Вы можете искать информацию об отдельном пакете или об отдельных файлах. Например, вы можете легко найти, какому пакету принадлежит файл и откуда появился. Команда

    [root]# rpm -qf /etc/bashrc

    сообщит: bash-1.14.7-16.

    Если вы беспокоитесь о том, что случайно удалили важный файл из установленного пакета, просто проверьте это:

    [root]# rpm -Va

    Вы будете оповещены об любых аномалиях. Потом можно переустановить пакет, если это необходимо. Любые конфигурационные файлы будут сохранены.

    Как видите, rpm это очень полезная утилита, и у нее имеется много разных опций. Выше приведено только несколько примеров. Всего rpm имеет 16 основных режимов работы, которые можно объединить в 6 групп (после двоеточия приводится формат команды для соответствующего режима).

    Запросы.

    • Запрос: rpm [-query] [queryoptions]

    • Показать метки запросов (Querytags): rpm [-querytags]

    Установка и поддержка установленных пакетов.

    • Установка: rpm [-install] [installoptions] [package_file]+

    • Обновление: rpm [-freshen|-F] [installoptions] [package_file]+

    • Деинсталляция: rpm [-uninstall|-e] [uninstalloptions] [package]+

    • Проверка: rpm [-verify|-V] [verifyoptions] [package]+

    Подписи (пакеты подписываются электронной цифровой подписью в формате PGP, с целью обеспечения неизменяемости и сохранения авторства пакетов).

    • Проверка подписи: rpm [-verify|-V] [verifyoptions] [package]+

    • Переподписывание: rpm [-resign] [package_file]+

    • Добавление подписи: rpm [-addsign] [package_file]+

    Работа с базой.

    • Инициализация базы: rpm -i [-initdb]

    • Обновление базы (Rebuild Database): rpm -i [-rebuilddb]

    Создание rpm-пакетов.

    • Создать пакет: rpm [-b|t] [package_spec]+

    • Перекомпилировать пакет: rpm [-rebuild] [sourcerpm]+

    • Скомпилировать пакет из tar-архива: rpm [-tarbuild] [tarredsource]+

    Разное.

    • Показать конфигурацию программы rpm: rpm [-showrc]

    • Задать пользователей: rpm [-setperms] [package]+

    • Задать группы: rpm [-setgids] [package]+

    Подробное описание всех возможностей команды rpm выходит за рамки нашей книги Его вы можете найти в RPM-HOWTO, на страницах man и info. Кроме того, большой раздел о программе rpm имеется в книге [П1.3].

    Примечание

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

    Приведенное выше описание программы rpm предполагает, что она запускается с консоли или в эмуляторе терминала. Между тем в разных дистрибутивах имеются графические оболочки для управления rpm-пакетами. В составе графической среды KDE такая оболочка называется kpackage. Вы можете запустить ее либо из командной строки, либо из основного меню KDE. Однако, на мой взгляд, она не дает никаких преимуществ по сравнению с работой из командной строки. Кроме того, она описана в книге А.Федорчука "Офис, графика, Web в Linux" [П1.6], так что я не буду тратить время на ее рассмотрение.

    10.3. Компиляция ПО из исходных текстов

    Если rpm-пакеты с необходимым вам программным обеспечением нужно еще поискать (и не всегда можно найти), то tar-gz-архив любого ПО для Linux найдется в Интернете непременно. В некоторых случаях такие архивы содержат исполняемые модули приложений. Тогда установка приложения лишь немного сложнее, чем в случае установки из rpm-пакета: необходимо просто развернуть архив с помощью программ gunzip и tar, перейти в созданный каталог и можно уже запускать полученное приложение. Но чаще всего приложения поставляются в исходных текстах, т. е. в виде программы на языке Си. Установить их в этом случае немного сложнее, хотя и тут нет ничего невозможного даже для начинающего пользователя. Давайте рассмотрим, как это делается.

    10.3.1. Необходимые сведения о программировании на языке Си

    Начать стоит с того, что операционная система UNIX родилась на свет одновременно с языком программирования C (Си). Более того, язык C был создан специально для разработки этой ОС, значительная часть UNIX была написана на языке С. ОС Linux тоже написана на Си. Поэтому, а также в соответствии с принципом свободного распространения исходных кодов, многие приложения для Linux распространяются в виде текстов на С (а в последнее время - и на С++). Естественно, что для установки и запуска такого приложения на исполнение, его необходимо предварительно скомпилировать. Для выполнения процедур компиляции обычно используется программа gcc (хотя существуют и некоторые альтернативные разработки).

    Примечание

    Изначально аббревиатура GCC имела смысл GNU C Compiler, но в апреле 1999 года сообщество GNU решило взять на себя более сложную миссию и начать создание компиляторов для новых языков с новыми методами оптимизации, поддержкой новых платформ, улучшенных runtime-библиотек и других изменений (http://gcc.gnu.org/gccmission.html). Поэтому сегодня GCC расшифровывается как GNU Compiler Collection (коллекция компиляторов GNU) и содержит в себе компиляторы для языков C, C++, Objective C, Chill, Fortran, Ada и Java, а также библиотеки для этих языков (libstdc++, libgcj, …).

    GNU-компилятор с языка С gcc, содержит в себе 4 основных компонента, соответствующие четырем этапам преобразования исходного кода в исполняемую программу.

    Первый компонент - это препроцессор, который модифицирует исходный код программы перед компиляцией в соответствии с командами препроцессора, содержащимися в С-программе. В соответствии с этими командами выполняются простые подстановки текста. Второй - собственно компилятор, который обрабатывает исходный код и преобразует его в код на языке ассемблера. Третий компонент - ассемблер, который генерирует объектный код. И, наконец, четвертый компонент - компоновщик, который собирает исполняемый файл из файлов объектного кода. Дело в том, что большие программы обычно пишутся по частям, в виде множества отдельных файлов, содержащих исходный код соответствующей части. Компилятор обрабатывает каждый такой файл отдельно и создает отдельные объектные модули (файлы таких модулей обычно имеют расширение o). Создание единой исполняемой программы из таких модулей и является задачей компоновщика. При таком подходе, если в какой-то модуль программист вносит исправление, нет необходимости заново компилировать всю программу: достаточно откомпилировать исправленный модуль и заново запустить компоновщик.

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

    Библиотеки бывают статическими, разделяемыми и динамическими. Статическая библиотека - это библиотека, код которой встраивается в программу при компиляции. Код разделяемой библиотеки не встраивается в программу, а загружается в память одновременно с программой и программа получает доступ к функциям этой библиотеки. Динамические библиотеки - разновидность разделяемых, но библиотечные функции загружаются в память только тогда, когда из программы поступит вызов соответствующей функции. В процессе выполнения программы они могут выгружаться и заменяться другими функциями из той же или другой библиотеки. Имена статических библиотек обычно имеют суффикс.a, а имена разделяемых библиотек - суффикс.so, за которым следует старший и младший номера версии. Имя может быть любой строкой, которая однозначно характеризует библиотеку. Обычно имена библиотек начинаются с lib. Примеры: libm.so.5 - общая математическая библиотека, libX11.so.6 - библиотека для работы с системой X Window. Библиотека libc.so.5 компонуется автоматически, в то время как большинство других библиотек необходимо явно указывать в командной строке при вызове программы gcc. Это делается через опцию -l, за которой следует уникальная часть имени библиотеки, например, для вызова математической библиотеки достаточно указать -lm.

    Многие системные библиотеки располагаются в системных каталогах, например, в /usr/lib и /lib, но некоторые могут располагаться и в других местах. Список этих каталогов помещается в файл /etc/ld.so.conf. Каждый раз, когда разделяемая библиотека изменяется или инсталлируется вновь, нужно выполнять команду ldconfig, чтобы обновить файл /etc/ld.so.conf, а также ссылки на него. Если библиотека инсталлируется из RPM-пакета, это обычно делается автоматически, хотя и не всегда.

    При компиляции больших программ, использующих фрагменты исходного кода, расположенные в разных файлах, бывает очень трудно отследить, какие файлы нужно перекомпилировать, а какие только компоновать. В таких случаях очень помогает утилита make, которая автоматически определяет, следует ли компилировать файл исходного кода, по дате его последней модификации. Утилита make оперирует файлами, исходя из их зависимости друг от друга. Эти зависимости определяются файлом с именем makefile. Строка файла makefile состоит из трех частей: имени целевого файла, списка файлов, от которых он зависит, и команды. Если какой-либо файл из списка изменился после целевого файла, то выполняется указанная в строке команда. В строке может быть указано несколько команд. Обычно команда - это вызов компилятора для компиляции файла исходного кода или компоновки файлов объектного кода. Строки, определяющие зависимости, отделяются друг от друга пустой строкой.

    10.3.2. Инсталляция пакетов ПО из исходных текстов

    Теперь, когда мы получили общее представление о компиляции программ на языке С, можно рассмотреть обращение с пакетами программ, распространяемыми в виде исходных кодов. Первое, что надо сказать в этой связи, это то, что для установки таких пакетов вы, естественно, должны иметь в своей системе утилиты gcc и make.

    Непосредственно процесс инсталляции пакета состоит из следующих шагов:

    1. Перейти (с помощью команды cd) в каталог, содержащий исходные коды устанавливаемого пакета.

    2. Выполнить команду ./configure, которая осуществляет конфигурирование пакета в соответствии с вашей системой. Процесс выполнения этой команды занимает довольно длительное время, причем команда выдает на экран сообщения о том, какие именно особенности системы испытываются.

    3. Выполнить команду make, для того, чтобы скомпилировать пакет.

    4. После этого можно выполнить (это шаг не является обязательным) команду make check, которая вызывает запуск процедур самотестирования, которые поставляются с пакетом.

    5. Выполнить команду make install для установки программ, а также файлов данных и документации.

    6. Заключительный этап состоит в выполнении команды make clean, которая удаляет промежуточные объектные и двоичные файлы из каталога с исходными кодами. Для удаления временных файлов, которые создала команда configure (после чего пакет можно компилировать для другого типа компьютеров), надо выполнить команду make distclean.

    В большинстве случаев выполнение этой последовательности команд достаточно для установки нового пакета.

    Основная проблема, с которой приходится сталкиваться при инсталляции программ из исходных кодов, связана с конфликтами версий: для вновь устанавливаемого пакета требуются новые версии каких-то системных утилит, которые пока еще не установлены в вашей системе. Более того, часто возникает целая цепочка (или даже дерево): для программы нужна какая-то новая версия утилиты, для последней нужно обновить еще какие-то утилиты, и т. д.. Но, если вы не очень давно устанавливали (или обновляли) дистрибутив, то таких проблем не возникает, и обновление пакета пройдет без затруднений. Желаю вам успеха!







     


    Главная | В избранное | Наш E-MAIL | Добавить материал | Нашёл ошибку | Наверх