Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

Часть IV. Рекомендации, связанные с программным обеспечением

Глава 9. Функциональные возможности компилятора

Общий обзор.

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

Необходимые пакеты

Следующие пакеты нужны, чтобы осуществлять компиляцию в Вашей системе после создания нового ядра. Эти пакеты находятся на Red Hat Linux 6.1 или 6.2 Part 1 CD-ROM в каталоге RedHat/RPMS:

Red Hat 6.1Red Hat 6.2
autoconf-2.13-5.noarch.rpm
m4-1.4-12.i386.rpm
automake-1.4-5.noarch.rpm
dev86-0.14.9-1.i386.rpm
bison-1.28-1.i386.rpm
byacc-1.9-11.i386.rpm
cdecl-2.5-9.i386.rpm
cpp-1.1.2-24.i386.rpm
cproto-4.6-2.i386.rpm
ctags-3.2-1.i386.rpm
egcs-1.1.2-24.i386.rpm
ElectricFence-2.1-1.i386.rpm
flex-2.5.4a-7.i386.rpm
gdb-4.18-4.i386.rpm
kernel-headers-2.2.12-20.i386.rpm
glibc-devel-2.1.2-11.i386.rpm
make-3.77-6.i386.rpm
patch-2.5-9.i386.rpm
autoconf-2.13-5.noarch.rpm
m4-1.4-12.i386.rpm
automake-1.4-6.noarch.rpm
dev86-0.15.0-2.i386.rpm
bison-1.28-2.i386.rpm
byacc-1.9-12.i386.rpm
cdecl-2.5-10.i386.rpm
cpp-1.1.2-30.i386.rpm
cproto-4.6-3.i386.rpm
ctags-3.4-1.i386.rpm
egcs-1.1.2-30.i386.rpm
ElectricFence-2.1-3.i386.rpm
flex-2.5.4a-9.i386.rpm
gdb-4.18-11.i386.rpm
kernel-headers-2.2.14-5.0.i386.rpm
glibc-devel-2.1.3-15.i386.rpm
make-3.78.1-4.i386.rpm
patch-2.5-10.i386.rpm

ЗАМЕЧАНИЕ. Лучше все программы описанные выше инсталлировать одновременно, чтобы избежать сообщений об ошибках зависимостей от RPM. Если Вы следовали по всем шагам, описанным в главе 2 "Инсталляция Вашего Linux-сервера", то все эти пакеты уже проинсталлированы в Вашей системе, и Вам нет необходимости заново их переинсталлировать.

RPM-команда для инсталляции пакета:

[root@deep /]# rpm -Uvh foo-1.0-2.i386.rpm

RPM-команда для проверки, инсталлирован ли пакет или нет:

[root@deep /]# rpm -q foo

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

Для перемещения rpm на дискету:

[root@deep /]# mount /dev/fd0 /mnt/floppy
[root@deep /]# mv /bin/rpm /mnt/floppy/
[root@deep /]# umount /mnt/floppy

Для возврата rpm в оригинальный каталог:

[root@deep /]# mount /dev/fd0 /mnt/floppy/
[root@deep /]# cp /mnt/floppy/rpm /bin/
[root@deep /]# umount /mnt/floppy/

ЗАМЕЧАНИЕ. Никогда не деинсталлируйте пакет RPM полностью с вашего сервера, иначе вы не сможете проинсталлировать его по новой, потому что для инсталляции любого rpm пакета требуется наличие программы rpm.

Почему мы выбираем использование архивов?

Все дистрибутивы Red Hat поставляются в RPM-файлах, которые известны также как пакеты. Этот способ поставки программ характеризуется упрощением процесса их инсталляции, обновления и удаления. Однако, в мире UNIX стандартом де-факто для пакетов программ является архив. Архив представляет собой просто сжатые файлы, которые могут быть прочитаны и раскрыты при помощи утилиты tar. Инсталляция программ из архива более тяжелый процесс, чем из rpm. Так почему мы будем использовать именно архивы?

  1. К сожалению требуется несколько недель, чтобы вышел rpm-пакет новой версии программы, так как разработчики выпускают их обычно в архиве.
  2. Когда разработчики и поставщики выпускают rpm-пакет, они включают в них много разных опций, часто не нужных. Эти организации и компании не знают какие опции Вам нужны, а какие нет, поэтому включают наиболее часто используемые.
  3. Часто RPM не оптимизирован под определенный процессор; компании, подобные Red Hat, создают пакет, базирующийся на стандартном PC. Это позволяет инсталлировать программы на всех компьютерах, начиная с i386.
  4. Иногда Вы скачиваете и инсталлируете RPM, которые другие люди создали и сделали доступным для Ваших целей. В зависимости от того, как создавался пакет, может возникать множество разных проблем, таких как ошибки, проблемы с безопасностью и прочие, описанные выше.

Компиляция программного обеспечения в Вашей системе

Программы это то, что компьютер может выполнять. Изначально, кто-то написал исходные коды на языке программирования который он/она знает (например, C, C++ и т. д.). Исходные коды обрабатываются компилятором, который преобразует инструкции в двоичные коды, подходящие под требуемый процессор (например, 386). Современным форматом исполняемых фалов является elf. Программист передает исходные коды компилятору и получает исполняемые файлы. Часто процесс компиляции завершается ошибкой или полученная программа не работает как надо. Половину времени процесса программирования составляет отслеживание и исправление этих проблем.

Для начинающих имеется много аспектов и новых терминов, относящихся к компиляции, которые Вы должны знать. Ниже описаны некоторые из них:

Multiple Files.
Программы, состоящие из одного файла, встречаются редко. Обычно в программу входит несколько файлов (скажем, *.c, *.cpp и т. д.), каждый из которых компилируется в объектные коды, а затем они все компонуются в исполняемый файл. Компилятор обычно используется для компоновки и вызывает в заключение программу-компоновщик ld.

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

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

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

Ошибки при компиляции и компоновке.
Ошибки при компиляции и компоновке часто возникают из-за недосмотра и неправильного использования языка. Проверьте, что для функций, которые Вы вызываете используются правильные заголовочные файлы. Неупомянутые символы (Unreferenced symbols) являются признаком незавершенности шага компоновки. Также проверьте, все ли необходимые библиотеки (GLIBC) и утилиты (GCC, DEV86, AUTOMAKE и т. д.) установлены на Вашей системе.

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

Создание и инсталляция программ в Вашей системе

С 10 по 20 главы Вы увидите, что мы используем много разных команд компиляции для создания и инсталляции программ на сервере. Эти команды совместимы с UNIX и используются на всех вариантах *nix-систем для компиляции и инсталляции программного обеспечения.

Ниже приводятся шаги, необходимые для компиляции и инсталляции программного обеспечения из архивов.

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

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

[root@deep /]# tar xzpf foo.tar.gz

Вышеприведенная команда извлечет все файлы из архива foo.tar.gz и поместит их в новый каталог с именем этой программы, который создаст автоматически в месте, где Вы сейчас расположены.

Опция x говорит tar извлечь все файлы из архива.
Опция z говорит, что tar архив был сжат при помощи gzip.
Опция p сохраняет оригинал и права доступа к файлам в том виде, каком они существовали при создании архива.
Опция f говорит tar, что следующий аргумент это имя файла.

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

./configure
make
make install

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

Другие специальные команды, которые Вы встретите в этой книге:

make depend
strip
chown

make depand будет создавать необходимые зависимости для различных файлов. strip будет удалять все символы из объектных файлов. В результате все исполняемые файлы будут меньшего размера. Это улучшит производительность программы, так как системе будет необходимо читать меньше строк при исполнении данного двоичного файла. chown будет устанавливать правильных владельцев файлов и разрешения для групп.

Редактирование файлов с vi

Текстовый редактор vi может быть использован для редактирования любых текстовых файлов. В процессе инсталляции программ, пользователь должен часто редактировать текстовые файлы, подобные Makefile, или конфигурационные файлы. Ниже представлено несколько наиболее важных ключевых строк, необходимых для работы с vi:

i говорит vi вставить текст перед курсором.
a говорит vi добавить текст после курсора.
dd говорит vi удалить текущую строку.
x говорит vi удалить текущий символ.
Esc говорит vi выйти из режима вставки или добавления.
u говорит vi отменить действие последней команды.
Ctrl+f прокрутить текст на одну страницу вверх.
Ctrl+b прокрутить текст на одну страницу вниз.
/string искать строку.
:f вывести имя файла и текущий номер строки
:q закончить редактирование
:q! выйти из редактора без записи изменений
:wq записать изменения и выйти из редактора

Некоторые последние комментарии

Перед переходом к чтению следующей части книги мне бы хотелось отметить, что в тексте подразумевается расположение некоторых файлов в определенных каталогах. Для соглашения, мы принимаем, что они расположены там, где это определено в дистрибутиве Red Hat. Если Вы используете другой дистрибутив Linux, или эти файлы расположены у Вас в других местах, будьте очень внимательны при копировании примеров из текста книги.

В этой части книги все программное обеспечение, перечисленное в главах с 10 по 21 необязательно, и зависит от того, что необходимо Вашему серверу (например, какие задачи будет решать Ваш сервер и для какой части Интернет/Интранет). Хотя некоторые программы могут быть очень важны для Вас. Полезно заменить telnet на ssh для более безопасного удаленного администрирования сервера. Другая интересная программа, Tripware, которая помогает следить за целостностью определенных программ в системе.