При установке ПО в Unix используется один из трех вариантов:
Первый вариант -- самый удобный и предпочтительный. Но при этом надо, чтобы нужное ПО существовало именно в виде .rpm-пакета. Второй вариант очень часто используется с программами "от третьих поставщиков". К примеру, самая последняя версия Netscape обычно становится доступна в виде .tar.gz-архива (и лишь несколько позже появляется .rpm-пакет). Третий вариант до недавнего времени был самым распространенным, да и до сих пор множество программ научного и развлекательного назначения распространяются именно в виде исходных текстов. Достоинство этого способа -- то, что собрать программу из исходных текстов можно практически под любым Unix, даже если сам автор этого не сделал. К недостаткам же относится то, что "сходу" программа может и не откомпилироваться (или даже просто не заработать), так что могут потребоваться навыки программиста. Если дистрибутив берется из .tar.gz-архива, то чаще всего его может установить не только "root", но и любой пользователь (естественно, в свою личную директорию, а не в системную). В случае же .rpm-пакета обычному пользователю придется повозиться, чтобы извлечь оттуда файлы для "ручной" установки. | ||
При установке из готового пакета rpm автоматически выбирает директории (они проросту зашиты в .rpm-файле). При установке же из бинарных дистрибутивов или из исходных текстов обычно есть выбор, в какое место дерева директорий поместить файлы.
Как очевидно, "вручную" программы надо устанавливать именно в /usr/local/. В каждой из этих иерархий имеются поддиректории bin/, lib/, man/ и doc/, служащие для исполняемых файлов, библиотек, man-страниц и документации соответственно. /usr/ | +--bin/ +--doc/ +--lib/ +--man/ | +--X11R6/ | | | +--bin/ | +--doc/ | +--lib/ | +--man/ | +--local/ | +--bin/ +--doc/ +--lib/ +--man/ В переменной окружения PATH есть ссылки на /usr/bin, /usr/X11R6/bin и /usr/local/bin, так что все программы запускаются просто по имени. Команда man же, соответственно, ищет man-страницы также во всех трех man-директориях. Естественно, весь дистрибутив следует ставить внутрь одной иерархии. Так, если исполняемые файлы располагаются в /usr/local/bin/, то man-страницы -- в /usr/local/man/, а библиотечные файлы -- в /usr/local/lib/. Некоторые пакеты (например, Wabi -- эмулятор Windows 3.x) устанавливаются в директорию /opt/. В этом случае создается директория вида /opt/имя-программы/ (например, /opt/wabi/), и в ней размещаются все файлы пакета. Такие пакеты обычно не предлагают выбор директории, а просто сами ставятся в /opt/. Подробно про то, какие директории в файловой системе для чего предназначены, можно прочитать в "Filesystem Hierarchy Standard" (прежнее название -- "Linux FSSTND") по адресу http://www.pathname.com/fhs/ | ||||||||||
Установку ПО из .rpm-пакетов может выполнять только "root". При установке же из бинарного дистрибутива или из исходных текстов следует придерживаться следующих правил:
| ||
Как уже упоминалось в разделе "Добавление и удаление пакетов", rpm (Redhat Package Manager) служит для работы с пакетами -- установка, удаление, проверка и т.д. При установке пакета rpm записывает информацию о нем в свою базу данных, что и позволяет в дальнейшем удалять пакет, просматривать информацию о нем и т.д. Такой подход к установке ПО имеет несколько достоинств, в частности:
| ||
Если вызвать rpm без параметров, то он покажет "краткий" список ключей. Обычно же формат вызова rpm такой:
КлючРежима, указываемый первым, определяет режим работы. Самые частоиспользуемые режимы перечислены в таблице.
Установку, обновление и удаление пакетов мы рассмотрели ранее, поэтому сейчас остановимся лишь на общих параметрах, получении информации и проверке. | ||||||||||||||||
В аргументах обычно используется два варианта ссылок на пакеты. Имя-файла-пакета.rpm для режимов -i и -U -- это полное (с директорией) имя файла. Например, ~/RPMS/apache-1.3.3-1.i386.rpm. В принципе, rpm понимает имена файлов в виде ftp-URL, т.е. ftp://сервер/директория/файл.rpm, но ими имеет смысл пользоваться только в быстрой и надежной сети (в нашей стране -- в локальной). Впрочем, в локальной сети (и любой быстрой) удобнее пользоваться NFS-сервером, если он есть. Пакет -- это имя уже установленного пакета для режимов -e, -q и -y. Оно может указываться как с номером версии, так и без него. Примеры: acroread-3.01-4, acroread. Если вместо списка пакетов указать ключ "-a" (all), то это будет означать "все пакеты". Кроме того, ключ "-f" позволяет вместо имени пакета указать какой-либо файл, принадлежащий этому пакету (см. ниже). Можно указывать не один файл-пакета или пакет, а сразу несколько, разделяя их пробелами. | ||
Команда rpm -q позволяет получать следующую информацию о пакете:
Просто "rpm -qимя-пакета" выдает полное название пакета, вместе с версией:
Но чаще всего команда "rpm -q" используется для получения списка файлов пакета. Краткая информация о пакете -- rpm -qi Команда "rpm -qi" (info) выдает сводку информации о пакете -- название, версия, объем и т.д., плюс краткую аннотацию:
Список файлов пакета -- rpm -ql Для получения списка файлов используется ключ "-l" (list):
Поскольку некоторые пакеты содержат очень большое количество файлов, то стоит отправлять вывод от rpm -ql команде less:
Для получения "полной" информации о пакете (аннотации и списка файлов) можно указать ключи "-i" и "-l" одновременно:
Какому пакету принадлежит файл Часто возникает необходимость узнать, какому пакету принадлежит какой-то файл (например, чтобы знать, где искать к нему документацию). Для этого можно воспользоваться ключом "-f" (file):
При этом надо указывать полное имя файла -- с директорией. Кроме того, если к файлу есть "несколько путей" (из-за символьных линков на директории), то следует указывать "основной" (обычно тот, который без символьных линков), иначе rpm не сможет дать ответ:
Вообще-то действие ключа "-f" не ограничивается простым запросом "скажи кому принадлежит файл". Этот ключ позволяет другим способом сослаться на пакет, т.е. вместо имени пакета указать один из принадлежащих ему файлов. Так, команды и эквивалентны. А как там назывался пакет... Иногда возникает такая ситуация: примерно помнишь, как назывался некий пакет, но только примерно (а мало ли где в имени были заглавные буквы, где маленькие, где дефисы...). В этой ситуации можно заставить rpm выдать список всех пакетов (ключ "-a") и найти нужное при помощи grep. Пример ("как назывались пакеты, содержащие netscape?"):
Другой пример ("к чему там относится afterstep?"):
Где же был этот файл... Аналогично иногда возникает необходимость найти некий файл, имя которого помнишь весьма приблизительно, а уж в какой он лежит директории... Вместо того, чтобы делать поиск по всему диску (что очень долго), можно заставить rpm выдать список файлов всех пакетов (ключ "-al") и отфильтровать нужное при помощи grep. Пример ("где там был файл с параметрами разных мониторов?"):
Искомый файл в данном примере -- второй. Информация о неинсталлированном пакете Перед установкой нового пакета обычно имеет смысл посмотреть информацию о нем и/или список содержащихся в нем файлов. Получить информацию о содержимом .rpm-файла можно, если вместо имени пакета указать ключ "-p" (package) и полное имя .rpm-файла, содержащего пакет. Пример:
Чего требует пакет -- rpm -qR Ключ "-R" (Requirements) позволяет узнать, какие пакеты и библиотеки требуются пакету. Особенно часто это требуется перед установкой пакета. Пример:
В вышеприведенном примере видно, что данный пакет установить не удастся, как минимум потому, что установленная версия пакета gtk+ слишком старая. | |||||||||||||
Команда rpm -y пакет позволяет сравнить текущее состояние файлов пакета с информацией, записанной в базе данных. Это требуется, например, при проверке, не испорчены ли какие-нибудь важные для системы файлы (такое случается после внезапного отключения питания). При нахождении различий печатается ключевая строка, с обозначением отличий и имя файла, в котором они найдены. Сравниваются следующие параметры:
Проверку лучше выполнять как "root", так как некоторые файлы (например, /usr/X11R6/bin/xterm) могут быть недоступны на чтение другим пользователям и для них всегда будет выдаваться несовпадение по контрольной сумме. Пример:
Как видно из этого примера, в некоторых файлах обязательно будут отличия, поскольку тот же /etc/passwd изменяется при создании и изменении пользователей. Аналогично команде rpm -q, rpm -y можно вместо имени пакета указывать "-f файл" или "-a". Команда rpm -ya полезна для проверки всей системы, но ее исполнение занимает много времени.
| |||||||||
Основные сведения содержатся в man-странице по rpm. Кроме того, с системой поставляется "HOWTO" документация --
Самое лучшее справочное пособие по rpm -- книга Ed Bailey "Maximum RPM". Она есть в электронном виде на сайте rpm: http://www.rpm.org/ | ||
Первым делом надо развернуть архив. Это следует делать, находясь в какой-нибудь специальной директории (например, ~/soft/), поскольку файлы в архиве могут быть заархивированы без директорий. В дистрибутивах всегда в верхней директории есть файлы с именами типа README, INSTALL или подобные (чаще всего -- README). Они содержат описание программы и инструкции по установке. Программы из бинарных дистрибутивов обычно устанавливаются одним из двух способов. В первом случае в файле README написано, что надо "руками" переложить такие-то файлы в такое-то место на диске. Во втором случае в дистрибутиве присутствует небольшая программа (обычно скрипт), который надо запустить, и он сам выполнит инсталляцию, возможно, задав несколько вопросов. Рассмотрим оба варианта на примере программ X11Amp (версия 0.7) и Adobe Acrobat Reader (версия 4.0). | ||
X11Amp -- это программа-проигрыватель файлов .mp3, очень похожая на широко известный WinAmp. Ее домашняя страница -- http://www.x11amp.bz.nu/ мы же воспользуемся локальной копией версии 0.7. Сначала развернем архив:
Это оказался самый простой случай -- один бинарный файл и файл README. Прочитав README, узнаем, что для минимальной установки достаточно просто скопировать исполняемый файл в какую-нибудь директорию с программами (ссылка на которую есть в переменной окружения PATH). Стандартным местом для программ от третьих поставщиков является директория /usr/local/bin/. Копируем и устанавливаем права доступа:
Вот и все, программой можно пользоваться -- достаточно набрать "x11amp" и появится окно программы.
Впрочем, X11Amp -- не такая простая программа, в README содержатся еще и инструкции как сделать лучше внешний вид, чтобы window manager не декорировал это окно (в случае AnotherLevel все и так работает нормально), а также о том, как заставить X11Amp потреблять меньше процессорного времени и играть качественнее. | ||||||
Adobe Acrobat Reader -- это программа для просмотра файлов .pdf, которая может работать как самостоятельно, так и в качестве plugin для Netscape. Версия 4.0 для Linux имеется на ftp-сервере фирмы Adobe в директории ftp://ftp.adobe.com/pub/adobe/acrobatreader/unix/4.x/ Опять первым делом развернем архив:
Итак, мы видим исполняемый файл INSTALL, пару больших .tar-файлов (содержащих собственно файлы программы) и два .txt-файла. Из названий ясно, что инструкции по установке -- в INSTGUID.TXT. Внимательно прочитав его, мы узнаем, что надо перейти в директорию с дистрибутивом и запустить скрипт INSTALL. Итак,
После выдачи на экран лицензионного соглашения программа просит набрать "accept", если мы согласны с его положениями. Затем она укажет требуемое свободное место на диске и спросит, в какую директорию надо ставить программу. По умолчанию предлагается /usr/local/Acrobat4, на что мы и согласимся, нажав <Enter>. После вопроса, надо ли создать эту директорию (поскольку она не существует) программа проведет собственно инсталляцию.
Как и следовало ожидать, в директории /usr/local/Acrobat4 появились файлы программы:
Но вот незадача -- их владельцем является несуществующий пользователь с uid=1436 и группа users. Но владельцем всех программ (за исключением так называемых "сюидных" (setuid, suid)) должны быть пользователь "root" и группа "root". Для исправления ситуации достаточно команды
Далее, программа acroread в директории Acrobat4/bin/ имеет права доступа "-rwxr-x--x", что не позволяет запускать ее обычным пользователям (поскольку это скрипт, то кроме "x" требуется еще и "r"). Исправляем:
Теперь запустив как обычный пользователь файл /usr/local/Acrobat4/bin/acroread, после некоторой паузы видим окно программы.
Последнее что осталось сделать -- настроить запуск программы по короткой команде, без /usr/local/... Для этого достаточно сделать в /usr/local/bin/ символьный линк, указывающий на исполняемый файл:
| ||||||||
Не всегда установка из бинарного дистрибутива проходит так гладко и просто -- мы выбрали самые несложные примеры, чтобы проиллюстрировать процесс установки. Многие программы кроме собственно исполняемого файла (а чаще файлов) содержат еще некоторое количество файлов конфигурации и библиотек, которые следует поместить в строго определенные места (обычно внутри директории lib/) и man-страниц. Кроме того, часто после установки требуется выполнить "руками" некоторые дополнительные действия -- например, добавить в стартовые файлы shell установку некоторых переменных окружения, модифицировать конфигурацию window manager'а (добавить программу в меню или настроить ее автоматический запуск). Именно поэтому желательно перед установкой программы подробно изучить ее документацию, особенно файлы README, INSTALL или их аналоги. Там почти наверняка будут отражены эти особенности. | ||
Создание исполняемого файла из одиночного файла .c выглядит довольно просто. Сначала .c-файл компилируется в объектный код (файл .o -- "object"), который затем при помощи сборщика (loader; его еще называют линкером -- linker) с добавлением системных библиотек превращается собственно в исполняемый файл.
Большинство же программ состоят из нескольких исходных файлов (крупные программы содержат по несколько сотен и даже тысяч файлов). Эти файлы также компилируются в объектный код, а потом сборщик делает из них исполняемый файл.
Многие пакеты состоят из нескольких исполняемых файлов, в этом случае каждый из них собирается точно так же. При этом многие пакеты содержат собственные библиотеки, которые также компилируются из исходных текстов в объектные файлы (совершенно аналогично обычным исходным файлам -- на рисунке это показано упрощенно для экономии места) и затем при помощи программы-библиотекаря (archiver) собираются в т.н. архивы -- файлы .a. Компиляторы языка Си в Unix обычно называются cc (C Compiler), а зачастую (особенно в Linux) используется т.н. GNU C Compiler -- gcc. Компиляторы Си++ аналогично называются c++ и g++. Сборщики именуются ld, хотя можно для этих целей пользоваться и gcc. Библиотекарь-архиватор -- программа ar.
| ||||||||||||
Для чего нужен make Приведенная в предыдущем разделе картина способна повергнуть в уныние -- неужели все эти действия надо выполнять "вручную"? Естественно, нет -- для этого существует утилита make, которая все и делает ("make" -- дословно "делать"). Утилита make считывает из специального файла с именем Makefile или makefile в текущей директории инструкции о том, как (при помощи каких команд) компилировать и собирать программы, а также информацию, из каких файлов состоит программа, которую надо "сделать". Одним из главных достоинств make (чрезвычайно полезным при создании больших программ) является то, что он сравнивает времена модификации файлов, и если, к примеру, файл file1.c новее, чем получаемый из него file1.o, то make поймет, что перекомпилировать надо только его, а остальные -- не нужно (если они не изменились). Формат Makefile Makefile содержат три основных компонента:
Ниже приведен пример простейшего Makefile (он и используемые файлы .c доступны здесь):
Определения переменных. Строки вида "ИМЯ=значение" -- это определения переменных. Для получения значения переменной используется запись "$(ИМЯ)" (знак доллара, а за ним имя переменной в скобках). Переменная может определяться через значения других переменных, например:
Правила. Запись ".c.o:" с последующей командой означает: "для любого файла .c, чтобы из него получить одноименный файл .o, надо выполнить такую-то команду"; в данном случае --
В правилах всегда используются специальные переменные "$@" и "$<". Переменная "$@" обозначает "тот файл, который надо получить" (в данном случае .o), а "$<" -- "исходный файл" (в данном случае .c). Такие переменные называются автоматическими. Команда располагается на следующей строке, причем эта строка обязательно должна начинаться с символа табуляции. Это довольно странное правило является основным источником ошибок и запутанности Makefile'ов -- ведь визуально отличить символ табуляции от цепочки пробелов невозможно. Поэтому, к примеру, редактор Midnight Commander автоматически цветом выделяет строки, начинающиеся с символа табуляции.
Зависимости. Запись вида означает, что файл proggie зависит от файлов prg_main.o и prg_funcs.o. Файл proggie называется целью (target), а файлы .o -- зависимостями (dependencies). Несмотря на то, что зависимости по внешнему виду похожи на правила, make их различает. В принципе в данном Makefile не помешали бы и строки но у make хватит интеллекта догадаться об этом самому (исходя из правила ".c.o").prog_main.o: prog_main.c prog_funcs.o: prog_funcs.c Более длинные правила и зависимости. В правилах можно указывать не только одну команду, но и несколько. Дополнительные команды должны располагаться на следующих строках, причем дополнительные строки также должны начинаться с символа табуляции. Аналогично после зависимости на следующих строках можно указать команды, при помощи которых ее надо "делать". Например, prog_main.o: prog_main.c $(CC) $(CFLAGS) -D_GNU_SOURCE -o prog_main.o prog_main.c При этом команды, определяемые в правиле ".c.o" использоваться не будут.
Запуск make При запуске без параметров make пытается сделать самую первую цель из перечисленных в Makefile. Обычно в качестве первой ставят дополнительную цель "all", зависящую от всех файлов, которые надо сделать для изготовления программы. Если же указать в командной строке имя цели, то make выполнит команды, необходимые для этой цели (и, при надобности, команды для изготовления промежуточных целей). Например, команда выполнит только команду компиляции файла prog_main.c в prog_main.o, да и то только если файл .c новее чем .o. Если запустить make с ключом "-n", то он лишь напечатает на экране команды, которые следует выполнить, не не станет реально их запускать. (Мнемоника для запоминания: "-n" -- "do Nothing" -- "Nичего не делай".) Ключ "-f" позволяет заставить make читать инструкции из указанного файла, вместо Makefile или makefile, используемых по умолчанию. Пример:
Если при компиляции или сборке возникает ошибка, то make прекращает процесс, не выполняя последующие команды. Если возникает необходимость создать свой Makefile, то лучше всего взять за образец Makefile от какой-нибудь несложной программы. Кроме того, очень подробная документация (включая введение для начинающих) есть в info-документации на GNU Make, вызываемой командой "info make", -- там содержится буквально "все, что вы хотели знать о Make, но боялись спросить". | |||||||||||
Imakefile и программа xmkmf К моменту появления системы X-Window проблема различий при компиляции под разные клоны Unix стала уже широко известна, и был разработан способ, позволяющий унифицированно компилировать ПО для X под разными системами. Идея заключалась в том, чтобы перед компиляцией Makefile автоматически генерировался специальной утилитой xmkmf, "знающей" про специфику конкретной системы, из другого файла, под названием Imakefile. В Imakefile же на некоем специальном языке записывается примерно та же информация, что в Makefile.
Хотя замысел был очень хороший, реализация оставляет желать лучшего. Во-первых, язык Imakefile'ов -- не менее "птичий", чем у Makefile, так что людей, умеющих их создавать, еще меньше. Во-вторых, xmkmf берет описание системы из нескольких файлов конфигурации (в глубине директории /usr/X11R6/), а они зачастую оказываются несовместимы с конкретным Imakefile, и xmkmf просто завершается с каким-нибудь маловразумительным сообщением об ошибке. Тем не менее, большинство программ под X-Window поставляются именно с Imakefile. Пример сборки и установки программы под X-Window В качестве примера рассмотрим сборку и установку программы XRoach (той самой, что пускает бегать по экрану тараканов). Воспользуемся локальной копией дистрибутива. Сначала развернем дистрибутив:
Прочтя файл README.linux, мы узнаем лишь, что при компиляции должно быть предупреждение (warning) в строке 373. Запускаем xmkmf и затем make:
Теперь, аналогично обычным программам, делаем "make install":
Единственно что, автор поленился сделать автоматическую установку man-страницы, хотя она и есть. Что ж, не беда -- скопируем ее в нужное место "руками":
(Поскольку "make install" установил программу в /usr/X11R6/bin/, то и man-страницу надо положить "рядом" -- внутри /usr/X11R6/. А поскольку xroach -- пользовательская программа, то ее man-страница должна лежать в разделе 1 (поддиректория man1/.) | ||||||||||||
| ||