Сборка и установка программ из исходников [206.1]

Рейтинг: 59.6% · 10 голосов
Курс LPIC-2 (201-450 и 202-450): емкостное планирование, ядро, хранилище и RAID/LVM, продвинутая сеть, DNS/BIND, Apache/Nginx, Samba/NFS, DHCP/LDAP, почта, безопасность и VPN.
Ответить
Аватара пользователя
Sergey_Sysadmin
Сообщения: 134
Зарегистрирован: 11 май 2026, 05:31

Сборка и установка программ из исходников [206.1]

Сообщение Sergey_Sysadmin »

Оглавление курса (41)
  1. Введение в LPIC-2 и уровень инженера
  2. Измерение и устранение проблем с ресурсами [200.1]
  3. Прогнозирование потребности в ресурсах
  4. Компоненты ядра Linux [201.1]
  5. Сборка ядра из исходников [201.2]
  6. Управление модулями ядра в рантайме [201.3]
  7. Кастомизация запуска системы [202.1]
  8. Восстановление системы [202.2]
  9. Альтернативные загрузчики [202.3]
  10. Работа с файловой системой Linux [203.1]
  11. Обслуживание файловых систем [203.2]
  12. Создание и настройка опций ФС [203.3]
  13. Программный RAID [204.1]
  14. Тюнинг доступа к устройствам хранения [204.2]
  15. Менеджер логических томов LVM [204.3]
  16. Базовая конфигурация сети [205.1]
  17. Продвинутая конфигурация сети [205.2]
  18. Диагностика сетевых проблем [205.3]
  19. Сборка и установка программ из исходников [206.1] (вы здесь)
  20. Резервное копирование [206.2]
  21. Оповещение пользователей о событиях
  22. DNS-сервер BIND: базовая настройка [207.1]
  23. Зоны DNS: создание и сопровождение [207.2]
  24. Безопасность DNS-сервера [207.3]
  25. Веб-сервер Apache: базовая настройка [208.1]
  26. Apache и HTTPS [208.2]
  27. Кэширующий прокси Squid [208.3]
  28. Веб-сервер и обратный прокси Nginx [208.4]
  29. Файловый сервер Samba [209.1]
  30. Файловый сервер NFS [209.2]
  31. DHCP-сервер [210.1]
  32. Аутентификация PAM и SSSD [210.2]
  33. Использование LDAP-клиента
  34. Сервер OpenLDAP [210.4]
  35. Почтовый сервер Postfix [211.1]
  36. Управление доставкой почты и Sieve [211.2]
  37. Доступ к почтовым ящикам: Dovecot [211.3]
  38. Linux как маршрутизатор и фильтр [212.1]
  39. FTP-серверы [212.2]
  40. SSH углублённо [212.3]
  41. Безопасность, IDS и VPN [212.4 + 212.5]
Урок 18. Сборка и установка программ из исходников

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

Изображение

Как это работает

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

configure - это обычно сгенерированный скрипт (Autotools, иногда руками). Он прощупывает систему десятками мелких тестовых компиляций: есть ли заголовок такой-то, поддерживает ли компилятор такой флаг, лежит ли библиотека там, где надо. На выходе он создаёт Makefile и config.h под вашу машину. Если чего-то не хватает - падает с ошибкой ещё до компиляции, и это хорошо: лучше узнать сразу.

make читает Makefile и запускает компилятор по правилам: какой файл из какого собирается, в каком порядке, что перекомпилировать при изменении. Make ленив - пересобирает только устаревшее, поэтому повторный make после правки одного файла быстрый.

make install копирует готовые бинарники, библиотеки, man-страницы и конфиги в систему. По умолчанию - в /usr/local, чтобы не конфликтовать с пакетным менеджером, который владеет /usr.

Ключевой момент про заголовки. Когда вы ставите библиотеку из пакета (например libssl), приходит только сам .so для запуска программ. Чтобы собирать что-то ПРОТИВ этой библиотеки, нужны заголовочные файлы (.h) и линковочные символы - они лежат в отдельном пакете с суффиксом -dev (Debian/Ubuntu) или -devel (RHEL/Fedora). Без них configure будет ругаться, что не нашёл библиотеку, хотя сама она стоит.

Современный нюанс: чистый Autotools встречается всё реже. Многие проекты в 2026 используют CMake (cmake .. - cmake --build .) или Meson с Ninja (meson setup build - ninja -C build). Логика та же - конфигурация, сборка, установка - но команды другие. Цель экзамена 206.1 завязана на классику Autotools, её и держим в фокусе.

Команды и примеры

Сначала ставим инструменты сборки. На Debian 13 / Ubuntu 24.04:

Код: Выделить всё

sudo apt update
sudo apt install build-essential autoconf automake pkg-config
# devel-пакет под пример: заголовки OpenSSL
sudo apt install libssl-dev zlib1g-dev
На RHEL 10 / Fedora 41+:

Код: Выделить всё

sudo dnf groupinstall "Development Tools"
# или явно:
sudo dnf install gcc make autoconf automake pkgconf-pkg-config
sudo dnf install openssl-devel zlib-devel
Классическая цепочка. Распаковали архив, зашли внутрь:

Код: Выделить всё

tar xzf foo-2.4.tar.gz
cd foo-2.4
./configure --prefix=/usr/local --enable-shared --disable-debug
make -j$(nproc)
sudo make install
Разберём ключи configure. --prefix задаёт корень установки (по умолчанию /usr/local); файлы лягут в prefix/bin, prefix/lib, prefix/share. Полезно ставить в отдельный каталог, например --prefix=/opt/foo, чтобы потом удалить одним rm -rf. Флаги вида --enable-X / --disable-X и --with-Y / --without-Y включают опции сборки; полный список даёт ./configure --help. Флаг make -j$(nproc) распараллеливает компиляцию по числу ядер.

Применение патчей. Патч - это diff, описывающий правки. Накладываем из корня дерева исходников:

Код: Выделить всё

# обычный формат, -p1 срезает один уровень пути (a/ b/)
patch -p1 < fix-build-gcc14.patch
# проверить, что наложится, ничего не меняя:
patch -p1 --dry-run < fix-build-gcc14.patch
# откатить:
patch -p1 -R < fix-build-gcc14.patch
Главная проблема установки из исходников - make install не ведёт учёта файлов, и пакетный менеджер о них не знает. Два способа это решить.

checkinstall - перехватывает make install и собирает из него настоящий пакет (.deb или .rpm), который потом ставится и удаляется штатно:

Код: Выделить всё

sudo checkinstall --pkgname=foo --pkgversion=2.4 make install
# дальше удаляется как обычный пакет:
sudo apt remove foo      # Debian/Ubuntu
sudo dnf remove foo      # RHEL/Fedora
GNU Stow - другой подход. Ставим каждую программу в свой каталог /usr/local/stow/foo-2.4, а stow создаёт симлинки в /usr/local/bin и т.д. Удаление - одной командой, без следов:

Код: Выделить всё

./configure --prefix=/usr/local/stow/foo-2.4
make && sudo make install
cd /usr/local/stow
sudo stow foo-2.4      # создать симлинки
sudo stow -D foo-2.4   # снять симлинки (удалить)
Частые грабли
  • configure не находит библиотеку, хотя она стоит - забыли поставить -dev/-devel пакет с заголовками. Читайте, какой именно заголовок он искал.
  • Поставили в /usr (не /usr/local) и затёрли файлы пакетного менеджера - конфликт версий, который чинится только переустановкой пакета.
  • make install без учёта (checkinstall/stow) - через год не вспомнить, что и откуда поставлено, а удалить нечем.
  • Бинарник не запускается: error while loading shared libraries - библиотека легла в нестандартный prefix/lib, которого нет в путях. Добавьте каталог в /etc/ld.so.conf.d/ и выполните ldconfig.
  • Патч не накладывается - не угадали уровень -pN. Сравните пути в diff с реальным деревом и подберите -p0 или -p1.
  • Запустили configure от root в распакованном архиве из интернета - так делать опасно; собирайте от обычного пользователя, root только на make install.
Мини-лаба
  • Поставьте инструменты сборки и devel-пакет zlib (zlib1g-dev или zlib-devel) на своём стенде.
  • Скачайте исходники любой небольшой утилиты на Autotools (например GNU hello) и распакуйте.
  • Запустите ./configure --prefix=/usr/local/stow/hello-X.Y и изучите вывод: что он нашёл, что нет.
  • Соберите проект через make -j$(nproc), затем sudo make install.
  • Через GNU Stow создайте симлинки и проверьте, что бинарник доступен в PATH.
  • Снимите установку командой stow -D и убедитесь, что симлинки исчезли, а каталог hello-X.Y остался.
  • Повторите установку, но через checkinstall, и удалите получившийся пакет штатным apt/dnf.
Контрольные вопросы
  • Чем отличается пакет libssl от libssl-dev и зачем второй нужен при сборке?
  • Что делает опция --prefix скрипта configure и почему по умолчанию это /usr/local, а не /usr?
  • Как проверить, наложится ли патч, не меняя файлов, и как его откатить?
  • Зачем нужны checkinstall и stow, если есть make install?
  • Что означает ошибка error while loading shared libraries и как её устранить для софта из своего prefix?
  • Когда установка из исходников оправдана, а когда лучше взять пакет из репозитория?
👍2 ❤️8 🔥1 😄 🤔1
Аватара пользователя
wireguard98
Сообщения: 1
Зарегистрирован: 18 май 2026, 00:14

Re: Сборка и установка программ из исходников [206.1]

Сообщение wireguard98 »

А если у меня и cmake-проект, и autotools-проект - checkinstall с обоими сработает? Или он только make install перехватывает?
👍1 ❤️ 🔥 😄 🤔
Аватара пользователя
kennedyg
Сообщения: 1
Зарегистрирован: 14 май 2026, 17:10

Re: Сборка и установка программ из исходников [206.1]

Сообщение kennedyg »

Поймал error while loading shared libraries после установки в /opt/foo. Помог файл в /etc/ld.so.conf.d/ с путём до lib плюс ldconfig, спасибо что предупредили про это в граблях
👍 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
Диагностика сетевых проблем [205.3]
Следующая глава →
Резервное копирование [206.2]

Все главы курса «LPIC-2: инженер Linux (201 + 202)»

Поделиться темой: ✈ Telegram VK

Вернуться в «LPIC-2: инженер Linux»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость