Линукс с нуля

Версия 12.1-multilib

Дата публикации 3 марта 2024

Создатель: Gerard Beekmans

Главный редактор: Bruce Dubbs

Редактор: Thomas Trepl

Автор перевода: Владимир Перцев

Все права защищены.

Эта книга распространяется на условиях Лицензия Creative Commons.

Инструкции для компьютера могут быть извлечены из книги на условиях Лицензия MIT.

Linux® является зарегистрированным товарным знаком Линуса Торвальдса.


Содержание

Предисловие

Предисловие

Мой путь к изучению и лучшему пониманию Linux начался еще в 1998 году. Я только что установил свой первый дистрибутив Linux и быстро увлекся его концепцией и философией.

У задачи может быть несколько вариантов решения. То же самое можно сказать и о дистрибутивах Linux. Многие из них существовали годами. Некоторые всё еще существуют, некоторые превратились во что-то иное, а некоторые остались только в наших воспоминаниях. Все они выполняют задачи по-разному, чтобы удовлетворить потребности своей целевой аудитории. И я понял - раз существует так много всевозможных способов добиться поставленной цели, мне больше не нужно ограничивать себя какой-то одной реализацией. До появления Linux мы просто мирились с проблемами в других операционных системах, поскольку у нас не было выбора. Что есть, то есть, нравилось нам это или нет. С Linux появился выбор. Если вам что-то не понравилось, вы можете изменить это, к тому же, это всецело поощряется.

Я попробовал разные дистрибутивы, но так и не смог ни на одном остановиться. Oни были отличными системами сами по себе. Это больше не было вопросом правильно или неправильно. Это стало делом личного вкуса. При всём разнообразии выбора не было ни одного дистрибутива, который был для меня идеален. Поэтому я решил создать свою собственную Linux-систему, которая бы полностью соответствовала моим личным предпочтениям.

Чтобы создать свою собственную систему, я решил скомпилировать всё из исходного кода вместо использования предварительно скомпилированных пакетов. Эта «идеальная» Linux-система должна была иметь сильные стороны других систем без их недостатков. Сначала эта мысль казалась пугающей. Но я придерживался идеи, что такая система должна быть создана.

Разобравшись с такими проблемами, как циклические зависимости и ошибки во время компиляции, я, наконец, создал собственную систему Linux. Она была полностью работоспособна и вполне пригодна для использования, как и любая другая Linux-система того времени. Но это было мое собственное творение. Было очень приятно собрать такую систему самому. Единственное, что было бы лучше, это создавать каждую часть программного обеспечения самостоятельно. Это было следующее, к чему я стремился

Когда я поделился своими идеями и опытом с другими членами сообщества Linux, стал очевиден явный интерес к ним. Вскоре стало понятно, что такие специально созданные Linux-системы служат не только для удовлетворения специфических потребностей пользователей, но и являются идеальной возможностью для обучения программистов и системных администраторов, чтобы улучшить их (существующие) навыки работы с Linux. Так родился проект Linux From Scratch.

Книга Linux From Scratch является ядром этого проекта. В ней содержится информация и инструкции, необходимые для разработки и создания собственной системы. Хотя эта книга представляет шаблон, который позволит создать правильно работающую систему, вы можете изменить инструкции по своему усмотрению, что отчасти является важной частью этого проекта. Вы всё контролируете; мы просто протягиваем руку помощи, чтобы вы начали свой собственный путь.

Я искренне надеюсь, что вы прекрасно проведете время, работая над своей собственной системой Linux From Scratch, и оцените ее многочисленные преимущества.

--
Gerard Beekmans
gerard AT linuxfromscratch D0T org

Аудитория, на которую рассчитана эта книга

Есть много причин, по которым вы хотели бы прочитать эту книгу. Один из вопросов, который задают многие люди, звучит так: «Зачем тратить время на сборку Linux-системы вручную с нуля, если можно просто загрузить и установить существующую?»

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

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

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

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

Цель Linux From Scratch — создать законченную и пригодную для использования систему базового уровня. Если вы не хотите создавать свою собственную систему Linux с нуля, вы, тем не менее, можете извлечь пользу из информации, содержащейся в этой книге.

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

Целевые архитектуры LFS

Основными целевыми архитектурами LFS являются процессоры AMD/Intel x86 (32-разрядные) и x86_64 (64-разрядные). Однако, известно, что инструкции, приведенные в этой книге, с некоторыми изменениями работают с процессорами Power PC и ARM. Для создания системы, использующей один из этих процессоров, основным предварительным условием, в дополнение к описанным на следующей странице, является существующая система Linux, например, собранная ранее LFS, Ubuntu, Red Hat/Fedora, SuSE или другой дистрибутив, ориентированный на имеющуюся у вас архитектуру. Также обратите внимание, что 32-разрядный дистрибутив можно установить и использовать в качестве хост-системы на 64-разрядном компьютере AMD/Intel.

При сборке LFS выигрыш от сборки на 64-битной системе по сравнению с 32-битной системой минимален. Например, в тестовой сборке LFS-9.1 в системе на базе процессора Core i7-4790 с использованием 4 ядер были получены следующие статистические данные:

Архитектура     Время сборки    Размер сборки
x86             239.9 минут     3.6 ГБ
x64             233.2 минут     4.4 ГБ

Как видите, на том же оборудовании 64-битная сборка всего на 3% быстрее и на 22% больше, чем 32-битная. Если вы планируете использовать LFS в качестве LAMP-сервера или брандмауэра, 32-разрядной сборки может быть достаточно. С другой стороны, для сборки и/или запуска некоторых пакетов в BLFS теперь требуется более 4 ГБ ОЗУ, поэтому, если вы планируете использовать LFS в качестве настольной ОС, авторы LFS рекомендуют собирать 64-битную систему.

По умолчанию 64-разрядная сборка LFS, считается «чистой» 64-разрядной системой. То есть она поддерживает только 64-разрядные исполняемые файлы. Сборка «multilib» системы требует компиляции многих программ дважды - один раз для 32-битной и один раз для 64-битной. Напрямую в книге данная опция не поддерживается, потому что это будет только мешать образовательной цели этой книги, предлагающей инструкции, необходимые для сборки базовой системы. Некоторые редакторы LFS/BLFS поддерживают ответвление LFS для multilib, которое доступно по адресу https://book.linuxfromscratch.ru/12.1-ml/systemv. Но это более продвинутая тема.

Предпосылки

Создание системы LFS — непростая задача. Это требует определенного уровня знаний системного администрирования Unix для решения проблем и правильного выполнения перечисленных команд. В частности, как абсолютный минимум, Вы должны уметь пользоваться командной оболочкой для копирования или перемещения файлов и каталогов, просмотра содержимого каталогов и файлов и изменения текущего каталога. Также ожидается, что у вас есть достаточные знания об использовании и установке программного обеспечения в Linux.

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

Перед созданием системы LFS мы настоятельно рекомендуем прочитать следующие статьи:

  • HOWTO по сборке программного обеспечения https://tldp.org/HOWTO/Software-Building-HOWTO.html

    Это исчерпывающее руководство по сборке и установке «универсальных» программ Unix под Linux. Несмотря на то что руководство написано достаточно давно, оно по-прежнему дает хороший обзор основных методов, применяемых для сборки и установки программного обеспечения.

  • Руководство для начинающих по установке из исходников https://moi.vonos.net/linux/beginners-installing-from-source/

    В этом руководстве содержится хороший обзор основных навыков и методов, необходимых для сборки программ из исходного кода

О выпуске Multilib

Что такое Multilib

Сегодня большинство систем в мире имеют размер слова 64 бита. Размер слова - это количество бит, которое может быть использовано одновременно наиболее эффективным способом. Предыдущие архитектуры процессоров x86 имели размер слова 32 бита, это означает, что у них другое понимание того, как лучше выравнивать данные в памяти, а также у них свой механизм обращения к памяти другого размера. Хотя набор команд 64-разрядных процессоров довольно схож с инструкциями 32-разрядных процессоров, двоичные файлы (объекты, скомпилированные в машинный код) не могут быть непосредственно выполнены в 64-разрядных системах.

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

Зачем делать Multilib-систему?

С образовательной точки зрения LFS в своей классической форме, вероятно, является лучшим способом увидеть, как система Linux собирается из исходного кода. Нет необходимости смешивать различные архитектуры. Но когда необходимо запустить 32-битные двоичные файлы и вы не хотите собирать полностью 32-битную систему (что в наши дни было бы пустой тратой ресурсов), тогда LFS-multilib — это вариант. Примерами такой необходимости могут быть

  • Программное обеспечение с закрытым исходным кодом/без исходного кода доступное только для 32-разрядной версии. Это может относиться к драйверу принтера или любым другим драйвером оборудования, двоичные файлы которого предоставляет компания-разработчик. Если у вас есть такой драйвер, LFS-multilib может помочь вам запустить его

  • Если вы хотите выйти далеко за рамки LFS и настроить платформу виртуализации, такую как VirtualBox, вам понадобится поддержка multilib

  • или даже просто потому, что вы можете

Multilib версия LFS дополняет то, что было сказано в предыдущем разделе, когда речь шла о целевых архитектурах. С одной стороны, multilib версия ориентирована и ограничена только архитектурой x86_64, с другой стороны, она расширяет инструкции для использования обеих возможных архитектур, а именно 32-разрядной как и 64-разрядной.

Сборка multilib-системы также немного выходит за рамки базового образовательного подхода LFS, который заключается в том, чтобы показать вам, как собрать систему Linux с нуля. Для этого не требуется поддержка дополнительных архитектур, отличных от архитектуры вашей системы по умолчанию. Если ранее вы не собирали систему по классической книге LFS, вам рекомендуется сделать это перед использованием этого издания.

Сборка Multilib системы

Сборка multilib системы не сильно отличается от сборки системы с использованием классической книги LFS. Помимо некоторых настроек, наиболее заметным отличием является то, что multilib требует компиляции некоторых приложений до трех раз: один раз для основной 64-разрядной архитектуры, второй - для 32-разрядной архитектуры (m32) и еще раз для 32-разрядной архитектуры с 32-битным доступом к памяти и 64-битным набором команд (mx32).

Продолжайте только в том случае, если ваша система удовлетворяете следующим требованиям:

  • у вас компьютер, совместимый с x86_64

    Примечание

    Если у вас есть доступ к конфигурации ядра вашей системы, вам потребуется установить параметры: CONFIG_IA32_EMULATION=y, чтобы выполнить сборку для m32 и CONFIG_X86_X32=y, чтобы собрать пакет для mx32.

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

    echo 'int main(){}' > dummy.c
    gcc -m32 dummy.c
    ./a.out
    
    gcc -mx32 dummy.c
    ./a.out

    Если какая-либо из команд ./a.out возвращает сообщения "Exec format error", то ваше ядро собрано без поддержки нужных параметров для этой архитектуры в рамках LFS, поэтому вам, вероятно, следует собрать систему LFS без Multilib, но с необходимыми возможностями ядра и использовать ее для сборки системы Multilib.

  • у вас уже есть некоторый опыт работы с LFS

  • вам необходима поддержка 32-битных версий библиотек

Если выполнены все три условия, продолжайте собирать LFS в режиме multilib.

LFS и стандарты

Структура LFS максимально соответствует стандартам Linux. Первичными стандартами являются:

  • POSIX.1-2008.

  • Filesystem Hierarchy Standard (FHS) Version 3.0

  • Linux Standard Base (LSB) Version 5.0 (2015)

    LSB имеет четыре отдельных стандарта: Core, Desktop, Runtime Languages и Imaging. Некоторые части спецификаций Core и Desktop зависят от архитектуры. Есть также две области не являющиеся обязательными: Gtk3 и Graphics. LFS старается соответствовать стандартам LSB, для архитектур IA32 (32-bit x86) или AMD64 (x86_64), рассмотренных в предыдущем разделе.

    Примечание

    Многие не согласны с требованиями LSB. Основные цели стандартов - быть уверенным в том, что проприетарное ПО будет правильно установлено и сможет корректно работать на совместимой системе. Поскольку в LFS установка программ идёт из исходных кодов, у пользователя имеется полный контроль над тем, какие пакеты ему необходимы, вы можете не устанавливать некоторые пакеты, определяемые в LSB.

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

Пакеты LFS, которые необходимы для удовлетворения требований LSB

LSB Core:

Bash, Bc, Binutils, Coreutils, Diffutils, File, Findutils, Gawk, Grep, Gzip, M4, Man-DB, Ncurses, Procps, Psmisc, Sed, Shadow, Tar, Util-linux, Zlib

LSB Desktop:

Нет

LSB Runtime Languages:

Perl, Python

LSB Imaging:

Нет

LSB Gtk3 и LSB Graphics (Необязательные):

Нет

Пакеты, поставляемые BLFS, необходимые для удовлетворения требований LSB

LSB Core:

At, Batch (часть At), Cpio, Ed, Fcrontab, LSB-Tools, NSPR, NSS, PAM, Pax, Sendmail (или Postfix, или Exim), time

LSB Desktop:

Alsa, ATK, Cairo, Desktop-file-utils, Freetype, Fontconfig, Gdk-pixbuf, Glib2, GTK+2, Icon-naming-utils, Libjpeg-turbo, Libpng, Libtiff, Libxml2, MesaLib, Pango, Xdg-utils, Xorg

LSB Runtime Languages:

Libxml2, Libxslt

LSB Imaging:

CUPS, Cups-filters, Ghostscript, SANE

LSB Gtk3 и LSB Graphics (Необязательные):

GTK3+

Пакеты, не поставляемые LFS или BLFS, необходимые для удовлетворения требований LSB

LSB Core:

Нет

LSB Desktop:

Qt4 (но предоставляется Qt5)

LSB Runtime Languages:

Нет

LSB Imaging:

Нет

LSB Gtk3 и LSB Graphics (Необязательные):

Нет

Информация о пакетах, используемых в этой книге

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

  • Acl

    Access Control List или ACL — список управления доступом, который определяет, кто или что может получать доступ к объекту (программе, процессу или файлу), и какие именно операции разрешено или запрещено выполнять субъекту (пользователю, группе пользователей).Данный пакет содержит утилиты для администрирования списков управления доступом, которые используются для определения дискреционных прав доступа к файлам и каталогам.

  • Attr

    Этот пакет содержит программы для управления расширенными атрибутами объектов файловой системы.

  • Autoconf

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

  • Automake

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

  • Bash

    Этот пакет удовлетворяет требования LSB по предоставлению интерфейса Bourne Shell для системы. Он был выбран среди других пакетов оболочки из-за его повсеместного использования и широких возможностей.

  • Bc

    Этот пакет предоставляет язык числовой обработки произвольной точности. Он необходимым для сборки ядра Linux

  • Binutils

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

  • Bison

    Этот пакет содержит GNU-версию yacc (Yet Another Compiler Compiler), необходимого для сборки некоторых пакетов в LFS.

  • Bzip2

    Этот пакет содержит программы для сжатия и распаковки файлов. Используется для распаковки множества пакетов LFS.

  • Check

    Этот пакет содержит тестовую обвязку для других программ.

  • Coreutils

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

  • DejaGNU

    Этот пакет предоставляет фреймворк для тестирования других программ.

  • Diffutils

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

  • E2fsprogs

    Этот пакет содержит утилиты для работы с файловыми системами ext2, ext3 и ext4. Это наиболее распространенные и тщательно протестированные файловые системы, поддерживаемые Linux

  • Expat

    Этот пакет содержит небольшую библиотеку разбора XML.Она необходима для модуля Perl XML::Parser.

  • Expect

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

  • File

    Этот пакет содержит утилиту для определения типа файла или файлов. Некоторым пакетам она нужна в сценариях сборки.

  • Findutils

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

  • Flex

    Этот пакет содержит утилиту для генерации программ, распознающих шаблоны в тексте. Это версия GNU программы lex (лексический анализатор). Пакет необходим для сборки некоторых пакетов LFS.

  • Gawk

    Этот пакет содержит программы для работы с текстовыми файлами. Это GNU версия awk (Aho-Weinberg-Kernighan). Он используется во многих сценариях сборки пакетов.

  • GCC

    Это коллекция компиляторов Gnu. Он содержит компиляторы C и C++, а также несколько других компиляторов, поддержка которых не предусмотрена в LFS.

  • GDBM

    Этот пакет содержит библиотеку GNU Database Manager. Он используется пакетом Man-DB

  • Gettext

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

  • Glibc

    Этот пакет содержит основную библиотеку C. Программы Linux не будут работать без неё.

  • GMP

    Этот пакет содержит математические библиотеки, предоставляющие полезные функции для вычислений с плавающей точкой. Требуется для сборки GCC.

  • Gperf

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

  • Grep

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

  • Groff

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

  • GRUB

    Это загрузчик операционной системы (GRand Unified Bootloader). Самый гибкий из нескольких доступных загрузчиков.

  • Gzip

    Этот пакет содержит программы для сжатия и распаковки файлов. Он необходим для распаковки множества пакетов в LFS.

  • Iana-etc

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

  • Inetutils

    Этот пакет содержит программы для базового сетевого администрирования.

  • Intltool

    Этот пакет содержит инструменты для извлечения переводимых строк из исходных файлов.

  • IProute2

    Этот пакет содержит программы для базовой и расширенной работы в сетях IPv4 и IPv6. Он был выбран среди других распространенных пакетов сетевых инструментов (net-tools) из-за его поддержки IPv6.

  • Kbd

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

  • Kmod

    Этот пакет содержит программы, необходимые для администрирования модулей ядра Linux.

  • Less

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

  • Libcap

    Этот пакет реализует интерфейсы пользовательского пространства для возможностей POSIX 1003.1e, доступных в ядре Linux.

  • Libelf

    Проект elfutils предоставляет библиотеки и инструменты для файлов ELF и данных DWARF. Большинство утилит в этом пакете доступны в других пакетах, но эта библиотека необходима для сборки ядра Linux с использованием стандартной (и наиболее эффективной) конфигурации.

  • Libffi

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

  • Libpipeline

    Пакет Libpipeline содержит библиотеку для гибкого и удобного управления конвейерами подпроцессов. Она необходима для Man-DB.

  • Libtool

    Этот пакет содержит сценарий поддержки универсальной библиотеки GNU. Он объединяет сложность использования общих библиотек в согласованный переносимый интерфейс. Библиотека необходима наборам тестов в других пакетах LFS.

  • Libxcrypt

    Этот пакет предоставляет библиотеку libcrypt, необходимую различным пакетам (в частности, Shadow) для хеширования паролей. Он заменяет устаревшую реализацию libcrypt в Glibc.

  • Linux Kernel

    Этот пакет является ядром операционной системой.

  • M4

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

  • Make

    Этот пакет содержит программу для управления сборкой пакетов. При сборке она необходима почти для каждого пакета в LFS.

  • Man-DB

    Этот пакет содержит программы для поиска и просмотра справочных страниц. Он был выбран вместо пакета man из-за превосходных возможностей интернационализации. Содержит man.

  • Man-pages

    Этот пакет представляет собой содержимое основных справочных страниц Linux.

  • Meson

    Этот пакет предоставляет программный инструмент для автоматизации создания программного обеспечения. Основная цель Meson — свести к минимуму количество времени, которое разработчики программного обеспечения должны тратить на настройку своей системы сборки. Требуется для сборки Systemd, а также многих пакетов BLFS.

  • MPC

    Этот пакет содержит функции для арифметики комплексных чисел. Необходим GCC.

  • MPFR

    Этот пакет содержит функции для арифметики с произвольной точностью. Необходим GCC.

  • Ninja

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

  • Ncurses

    Этот пакет содержит библиотеки для независимой от терминала обработки символьных экранов. Он часто используется для управления курсором в меню. Необходим ряду пакетов в LFS.

  • Openssl

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

  • Patch

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

  • Perl

    Этот пакет является интерпретатором языка PERL. Он необходим для установки и тестирования некоторых пакетов LFS.

  • Pkgconf

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

  • Procps-NG

    Этот пакет содержит программы для мониторинга процессов. Набор полезен для системного администрирования, а также используются загрузочными сценариями LFS.

  • Psmisc

    Этот пакет содержит программы для отображения информации о запущенных процессах. Этот набор программ полезен для системного администрирования.

  • Python 3

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

  • Readline

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

  • Sed

    Этот пакет позволяет редактировать текст, не открывая его в текстовом редакторе. Он необходим сценариям настройки многих пакетов LFS.

  • Shadow

    Этот пакет содержит программы для безопасной обработки паролей.

  • Sysklogd

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

  • Sysvinit

    Этот пакет содержит систему инициализации init, родительской элемент всех остальных процессов в работающей системе Linux.

  • Udev

    Этот пакет представляет собой диспетчер устройств. Он контролирует разрешения, имена и символические ссылки устройств в каталоге /dev, когда устройства добавляются или удаляются из системы.

  • Tar

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

  • Tcl

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

  • Texinfo

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

  • Util-linux

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

  • Vim

    Этот пакет содержит редактор. Его выбрали из-за совместимости с классическим редактором vi и огромного количества возможностей. Редактор является очень личным выбором для каждого пользователя. По желанию можно заменить любым другим редактором.

  • Wheel

    Этот пакет содержит модуль Python, который представляет собой эталонную реализацию механизма упаковки Python.

  • XML::Parser

    Этот пакет представляет собой модуль Perl, который взаимодействует с Expat.

  • XZ Utils

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

  • Zlib

    Этот пакет содержит процедуры сжатия и распаковки, используемые некоторыми программами.

  • Zstd

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

Оформление

Чтобы облегчить понимание, в этой книге используются условные обозначения. Этот раздел содержит примеры оформления, используемые в Linux From Scratch.

./configure --prefix=/usr

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

В некоторых случаях логическая строка расширяется до двух или более физических строк с обратной косой чертой в конце строки.

CC="gcc -B/usr/bin/" ../binutils-2.18/configure \
  --prefix=/tools --disable-nls --disable-werror

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

install-info: unknown option '--dir-file=/mnt/lfs/usr/info/dir'

Такое оформление (текст фиксированной ширины) показывает вывод на экран, как правило, в результате выполнения команд. Этот формат также используется для отображения имен файлов, таких как /etc/ld.so.conf.

Примечание

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

Акцент

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

https://mirror.linuxfromscratch.ru/

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

cat > $LFS/etc/group << "EOF"
root:x:0:
bin:x:1:
......
EOF

Этот формат используется при создании файлов конфигурации. Первая команда указывает системе создать файл $LFS/etc/group из всего, что введено далее, пока не встретится последовательность End Of File (EOF). Поэтому весь этот раздел обычно печатается как есть.

<ЗАМЕНЯЕМЫЙ ТЕКСТ>

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

[НЕОБЯЗАТЕЛЬНЫЙ ТЕКСТ]

Этот формат используется для текста, который является необязательным.

passwd(5)

Этот формат используется для ссылки на определенную страницу руководства (man). Число в скобках указывает на конкретный раздел внутри руководств. Например, у passwd есть две справочные страницы. В соответствии с инструкциями по установке LFS эти две справочные страницы будут расположены в /usr/share/man/man1/passwd.1 и /usr/share/man/man5/passwd.5. Когда в книге используется passwd(5), имеется в виду конкретно /usr/share/man/man5/passwd.5. man passwd напечатает первую найденную справочную страницу, совпадающую с «passwd» - это будет /usr/share/man/man1/passwd.1. В этом примере вам нужно будет запустить man 5 passwd, чтобы прочитать указанную страницу. Обратите внимание, что большинство справочных страниц не имеют повторяющихся страниц в разных разделах. Поэтому обычно достаточно man <имя программы>. В книге LFS ссылки на справочные страницы также являются гиперссылками, поэтому нажатие на такую ссылку откроет справочную страницу, в формате HTML, со страниц руководства Arch Linux.

Структура

Эта книга разделена на несколько частей.

Часть I - Введение

Эта часть содержит важные замечания о том, как выполнить установку LFS. Также здесь представлена метаинформация о книге

Часть II - Подготовка к сборке

Часть II описывает, как подготовиться к процессу сборки — создать разделы, загрузить пакеты и выполнить компиляцию временных инструментов.

Часть III - Создание кросс-тулчейна LFS и временных инструментов

Часть III содержит инструкции по созданию инструментов, необходимых для создания конечной системы LFS.

Часть IV - Сборка системы LFS

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

Часть V - Приложения

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

Ошибки и рекомендации по безопасности

Программное обеспечение, используемое для создания системы LFS, постоянно обновляется и совершенствуется. Предупреждения безопасности и исправления ошибок могут появиться после выхода книги LFS. Чтобы проверить, нуждаются ли пакеты или инструкции в этом выпуске LFS в каких-либо изменениях для устранения уязвимостей в системе безопасности или исправления других ошибок, посетите https://mirror.linuxfromscratch.ru/lfs/errata/12.1/, прежде чем приступить к сборке. Вы должны внести требуемые изменения и применить их к соответствующему разделу книги по мере сборки системы LFS.

Кроме того, редакторы Linux From Scratch ведут список уязвимостей безопасности, обнаруженных после выхода книги. Чтобы проверить наличие каких-либо известных уязвимостей безопасности, посетите https://mirror.linuxfromscratch.ru/lfs/advisories/, прежде чем продолжить сборку. И, если вы будете использовать систему LFS в качестве реальной настольной или серверной системы, вам следует обращаться к рекомендациям и устранять любые уязвимости в системе безопасности, даже когда система LFS полностью собрана.

Часть I. Введение

Глава 1. Введение

1.1. Как собрать систему LFS

Система LFS будет собрана с использованием уже установленного дистрибутива Linux (например, Debian, OpenMandriva, Fedora или openSUSE). Существующая система Linux (хост) будет использоваться в качестве отправной точки для предоставления необходимых программ, включая компилятор, компоновщик и оболочку, для создания новой системы. Выберите опцию «разработка» во время установки дистрибутива, чтобы получить доступ к этим инструментам.

Примечание

Существует множество способов установки дистрибутива Linux, и значения по умолчанию обычно не оптимальны для сборки системы LFS. Предложения по настройке дистрибутива смотрите: https://mirror.linuxfromscratch.ru/hints/downloads/files/partitioning-for-lfs.txt.

В качестве альтернативы установке отдельного дистрибутива на свой компьютер вы можете использовать LiveCD другого дистрибутива.

Глава 2 этой книги содержит информацию, о том, как создать новые разделы Linux и файловую систему, где будет скомпилирована и установлена новая система LFS. Глава 3 содержит информацию, о том, какие пакеты и исправления необходимо загрузить для сборки системы LFS и как их хранить на файловой системе. Глава 4 освещает вопросы настройки рабочего окружения. Пожалуйста, внимательно прочитайте Глава 4, так как в ней объясняется несколько важных моментов, о которых вам необходимо знать, прежде чем вы начнёте работать со следующими главами.

Глава 5 содержит информацию об установке первоначального набора инструментов (binutils, gcc и glibc) с использованием методов кросс-компиляции для изоляции новых инструментов от хост-системы.

Глава 6 рассказывает, как выполнить кросс-компиляцию базовых утилит с использованием только что собранного временного набора инструментов.

В Глава 7 будет осуществлен переход в среду chroot, где мы будет использовать новые инструменты для сборки остальных инструментов, необходимых для создания конечной системы.

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

В Глава 8 будет собрана полноценная система LFS. Еще одно преимущество среды chroot заключается в том, что она позволяет вам продолжать использовать хост-систему во время сборки LFS. Ожидая завершения компиляции пакетов, вы можете продолжать пользоваться своим компьютером в обычном режиме.

Чтобы завершить установку, в Глава 9 происходит настройка базовой конфигурации системы, в Глава 10 настраиваются ядро и загрузчик. Глава 11 содержит информацию о том как расширить возможности системы LFS. После выполнения шагов, описанных в этой главе, компьютер будет готов к загрузке в новую систему LFS.

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

1.2. Что нового с момента последнего релиза

Ниже приведен список пакетов, обновленных с момента предыдущего выпуска книги.

Обновлены:

  • Acl-2.3.2

  • Attr-2.5.2

  • Autoconf-2.72

  • Bash-5.2.21

  • Bc-6.7.5

  • Binutils-2.42

  • Coreutils-9.4

  • Expat-2.6.0

  • Gawk-5.3.0

  • Gettext-0.22.4

  • Glibc-2.39

  • GRUB-2.12

  • Gzip-1.13

  • Iana-Etc-20240125

  • Inetutils-2.5

  • IPRoute2-6.7.0

  • Jinja2-3.1.3

  • Kbd-2.6.4

  • Kmod-31

  • Libelf из Elfutils-0.190

  • Linux-6.7.4

  • Man-DB-2.12.0

  • Man-pages-6.06

  • MarkupSafe-2.1.5

  • Meson-1.3.2

  • MPFR-4.2.1

  • Ncurses-6.4-20230520

  • OpenSSL-3.2.1

  • Perl-5.38.2

  • Pkgconf-2.1.1

  • Procps-ng-4.0.4

  • Python-3.12.2

  • Setuptools-69.1.0

  • Shadow-4.14.5

  • SysVinit-3.08

  • Texinfo-7.1

  • Tzdata-2024a

  • Util-Linux-2.39.3

  • Vim-9.1.0041

  • wheel-0.42.0

  • XML::Parser-2.47

  • Xz-5.4.6

  • Zlib-1.3.1

Добавлены:

  • bash-5.2.21-upstream_fixes-1.patch

  • readline-8.2-upstream_fixes-3.patch

  • setuptools-69.1.0

  • systemd-255-upstream_fixes-1.patch

Удалены:

  • glibc-2.38-memalign_fix-1.patch

  • grub-2.06-upstream_fixes-1.patch

  • readline-8.2-upstream_fix-1.patch

1.3. Журнал изменений

Это версия 12.1-multilib книги Linux From Scratch от 3 марта 2024. Если этой книге больше шести месяцев, возможно, уже доступна более новая, улучшенная версия. Чтобы узнать это, проверьте одно из зеркал https://mirror.linuxfromscratch.ru/mirrors.html.

Ниже приведен список изменений, внесенных с момента предыдущего выпуска книги.

Список изменений:

  • 2024-02-14

    • [bdubbs] - Update to meson-1.3.2. Fixes #5442.

  • 2024-02-12

    • [bdubbs] - Update to shadow-4.14.5. Fixes #5437.

    • [bdubbs] - Update to setuptools-69.1.0 (Python module). Fixes #5439.

    • [bdubbs] - Update to python-3.12.2. Fixes #5434.

    • [bdubbs] - Update to pkgconf-2.1.1. Fixes #5432.

    • [bdubbs] - Update to MarkupSafe-2.1.5 (Python module). Fixes #5431.

    • [bdubbs] - Update to man-pages-6.06. Fixes #5438.

    • [bdubbs] - Update to expat-2.6.0. Fixes #5435.

    • [bdubbs] - Update to linux-6.7.4. Fixes #5433.

  • 2024-02-02

    • [xry111] - Update to tzdata-2024a. Fixes #5428.

    • [xry111] - Update to glibc-2.39 (security fix). Fixes #5426.

    • [xry111] - Update to linux-6.7.3. Fixes #5427.

  • 2024-02-01

    • [bdubbs] - Update to openssl-3.2.1 (security fix). Fixes #5425.

    • [bdubbs] - Update to zlib-1.3.1. Fixes #5419.

    • [bdubbs] - Update to xz-5.4.6. Fixes #5423.

    • [bdubbs] - Update to linux-6.7.2. Fixes #5422.

    • [bdubbs] - Update to iana-etc-20240125. Addresses #5006.

    • [bdubbs] - Update to binutils-2.42. Fixes #5424.

    • [bdubbs] - Update to acl-2.3.2. Fixes #5421.

    • [bdubbs] - Update upstream fixes for readline-8.2. Fixes #5420.

    • [bdubbs] - Apply upstream fix for bash-5.2.21. Fixes #5420.

  • 2024-01-21

    • [xry111] - Apply upstream fix for pkgconf-2.1.0 regression. Fixes #5414.

    • [xry111] - Update to jinja2-3.1.3 (security fix). Fixes #5411.

    • [xry111] - Update to bc-6.7.5. Fixes #5408.

    • [xry111] - Update to attr-2.5.2. Fixes #5412.

    • [xry111] - Update to ncurses-6.4-20230520 (security fix). Fixes #5416.

    • [xry111] - Update to markupsafe-2.1.4. Fixes #5418.

    • [xry111] - Update to linux-6.7.1. Fixes #5406.

    • [xry111] - Update to iproute2-6.7.0. Fixes #5410.

    • [xry111] - Update to vim-9.1.0041. Addresses #4500.

    • [xry111] - Update to iana-etc-20240117. Addresses #5006.

    • [xry111] - Update to shadow-4.14.3. Fixes #5413.

    • [xry111] - Fix CVE-2024-0684 for coreutils-9.4. Fixes #5417.

  • 2024-01-18

    • [xry111] - Edit a ncurses header to always use the wide-character ABI compatible with libncursesw.so because we are faking the 8-bit libncurses.so with it. Fixes #5415.

  • 2024-01-09

    • [renodr] - Fix the definition of the C.UTF-8 locale. Fixes #5409.

  • 2023-12-31

    • [xry111] - Add --enable-default-hash-style=gnu configuring binutils. Fixes #5401.

    • [xry111] - Fix CVE-2023-7008 for systemd-255. Fixes #5405.

    • [xry111] - Update to iana-etc-20231205. Addresses #5006.

    • [xry111] - Update to tzdata-2023d. Fixes #5399.

    • [xry111] - Update to linux-6.6.8. Fixes #5397.

    • [xry111] - Update to meson-1.3.1. Fixes #5402.

    • [xry111] - Update to grub-2.12. Fixes #5396.

    • [xry111] - Update to inetutils-2.5. Fixes #5404.

    • [xry111] - Update to setuptools-69.0.3. Fixes #5400.

    • [xry111] - Update to xml-parser-2.47. Fixes #5403.

    • [xry111] - Update to vim-9.0.2189. Addresses #4500.

    • [xry111] - Update to autoconf-2.72. Fixes #5398.

  • 2023-12-16

    • [xry111] - Update to udev from systemd-255. Fixes #5390.

  • 2023-12-14

    • [bdubbs] - Update to util-linux v2.39.3. Fixes #5388.

    • [bdubbs] - Update to python3-3.12.1. Fixes #5392.

    • [bdubbs] - Update to linux-6.6.7. Fixes #5387.

    • [bdubbs] - Update to kbd-2.6.4. Fixes #5393.

    • [bdubbs] - Update to bc-6.7.4. Fixes #5389.

    • [bdubbs] - Reformat util-linux configure parameters. Fixes #5395.

  • 2023-12-04

    • [thomas] - Modify commands for install Python docs to avoid too restrictive permissions on the files and dirs.

  • 2023-12-01

    • [xry111] - Restore NIC naming based on physical system characteristics. Fixes #5386.

  • 2023-11-30

    • [bdubbs] - Update to vim-9.0.2136. Addresses #4500.

    • [bdubbs] - Update to iana-etc-20231117. Addresses #5006.

    • [bdubbs] - Update to bc-6.7.3. Fixes #5385.

    • [bdubbs] - Update to wheel-0.42.0 (Python Module). Fixes #5384.

    • [bdubbs] - Update to perl-5.38.2. Fixes #5383.

    • [bdubbs] - Update to pkgconf-2.1.0. Fixes #5382.

    • [bdubbs] - Update to readline patches 002 through 007. Fixes #5381.

    • [bdubbs] - Update to openssl-3.2.0. Fixes #5380.

    • [bdubbs] - Update to setuptools-69.0.2. Fixes #5379.

    • [bdubbs] - Update to linux-6.6.3. Fixes #5378.

    • [bdubbs] - Update to meson-1.3.0. Fixes #5377.

    • [bdubbs] - Update to gettext-0.22.4. Fixes #5376.

  • 2023-11-13

    • [xry111] - Update to elfutils-0.190. Fixes #5373.

    • [xry111] - Update to vim-9.0.2103. Addresses #4500.

    • [xry111] - Update to linux-6.6.1. Fixes #5369.

    • [xry111] - Update to xz-5.4.5. Fixes #5371.

    • [xry111] - Update to iana-etc-20231107. Addresses #5006.

    • [xry111] - Update to gawk-5.3.0. Fixes #5372.

    • [xry111] - Update to bash-5.2.21. Fixes #5375.

    • [xry111] - Update to iproute2-6.6.0. Fixes #5374.

  • 2023-11-01

    • [bdubbs] - Update to iana-etc-20231019. Addresses #5006.

    • [bdubbs] - Update to wheel-0.41.3. Fixes #5370.

    • [bdubbs] - Update to shadow-4.14.2. Fixes #5368.

    • [bdubbs] - Update to openssl-3.1.4. Fixes #5367.

    • [bdubbs] - Update to texinfo-7.1. Fixes #5364.

    • [bdubbs] - Update to meson-1.2.3. Fixes #5366.

    • [bdubbs] - Update to bc-6.7.2. Fixes #5363.

    • [bdubbs] - Update to linux-6.5.9. Fixes #5365.

    • [bdubbs] - Update to Python-3.12.0. Fixes #5357.

    • [bdubbs] - Add setuptools-68.2.2. Fixes #5358.

  • 2023-10-15

    • [bdubbs] - Update to linux-6.5.7. Fixes #5362.

    • [bdubbs] - Update to shadow-4.14.1. Fixes #5361.

    • [bdubbs] - Update to gettext-0.22.3. Fixes #5359.

  • 2023-10-03

    • [xry111] - Update Glibc upstream fixes patch to fix CVE-2023-4911.

  • 2023-10-01

    • [bdubbs] - Disable building nscd in glibc. Fixes #5349.

    • [bdubbs] - Update to iana-etc-20230929. Addresses #5006.

    • [bdubbs] - Update to vim-9.0.1968. Addresses #4500.

    • [bdubbs] - Update to openssl-3.1.3. Fixes #5350.

    • [bdubbs] - Update to meson-1.2.2. Fixes #5356.

    • [bdubbs] - Update to man-db-2.12.0. Fixes #5354.

    • [bdubbs] - Update to linux-6.5.5. Fixes #5352.

    • [bdubbs] - Update to kmod-31. Fixes #5355.

    • [bdubbs] - Update to kbd-2.6.3. Fixes #5361.

    • [bdubbs] - Update to gettext-0.22.2. Fixes #5348.

    • [bdubbs] - Update to bc-6.7.0. Fixes #5353.

  • 2023-09-24

    • [xry111] - Update Glibc upstream fixes patch to plug a memory leak introduced by the security fix.

  • 2023-09-17

    • [xry111] - Update to linux-6.5.3. Fixes #5343.

    • [xry111] - Update to iana-etc-20230912. Addresses #5006.

    • [xry111] - Update to iproute2-6.5.0. Fixes #5342.

  • 2023-09-13

    • [xry111] - Fix CVE-2023-4806 for Glibc-2.38. Fixes #5347.

  • 2023-09-12

    • [xry111] - Fix CVE-2023-4527 for Glibc-2.38. Fixes #5346.

  • 2023-09-07

    • [xry111] - Fix an issue in pkgconf-2.0.3 causing BLFS packages fail to build. Fixes #5341.

  • 2023-09-05

    • [xry111] - Move pkgconf before binutils for binutils building system to detect zstd properly. Fixes #5340.

    • [xry111] - Update to linux-6.5.1. Fixes #5332.

    • [xry111] - Update to pkgconf-2.0.3. Fixes #5339.

    • [xry111] - Update to dbus-1.14.10. Fixes #5337.

  • 2023-09-04

    • [bdubbs] - Move caution regarding building by mixing different version of LFS to General Compilation Instructions. Fixes #5338.

  • 2023-09-02

    • [xry111] - Add --no-cache-dir option for pip3 wheel commands. Addresses BLFS #18466.

    • [bdubbs] - Update to vim-9.0.1837. Addresses #4500.

    • [bdubbs] - Update to zlib-1.3. Fixes #5324.

    • [bdubbs] - Update to wheel-0.41.2 (Python Module). Fixes #5328.

    • [bdubbs] - Update to util-linux-2.39.2. Fixes #5322.

    • [bdubbs] - Update to sysvinit-3.08. Fixes #5321.

    • [bdubbs] - Update to shadow-4.14.0. Fixes #5319.

    • [bdubbs] - Update to Python-3.11.5. Fixes #5330.

    • [bdubbs] - Update to procps-ng-4.0.4 (security fix for 32-bit systems). Fixes #5335.

    • [bdubbs] - Update to pkgconf-2.0.2. Fixes #5323.

    • [bdubbs] - Update to mpfr-4.2.1. Fixes #5326.

    • [bdubbs] - Update to kbd-2.6.2. Fixes #5318.

    • [bdubbs] - Update to gzip-1.13. Fixes #5325.

    • [bdubbs] - Update to coreutils-9.4. Fixes #5334.

    • [bdubbs] - Remove unused usb group. Fixes #5331.

  • 2023-09-01

    • [bdubbs] - LFS-12.0 released.

1.4. Ресурсы

1.4.1. Часто задаваемые вопросы

Если во время создания системы LFS вы столкнетесь с какими-либо ошибками, у вас возникнут какие-либо вопросы или вам кажется, что в книге допущена опечатка, пожалуйста, для начала ознакомьтесь со списком часто задаваемых вопросов (FAQ), расположенным по адресу https://mirror.linuxfromscratch.ru/faq/.

1.4.2. Списки рассылки

На сервере linuxfromscratch.org размещен ряд списков рассылки, используемых для разработки проекта LFS. Эти списки включают, среди прочего, основные списки разработки и поддержки. Если вы не можете найти ответ на странице часто задаваемых вопросов, следующим шагом будет поиск решения в списках рассылки по адресу https://mirror.linuxfromscratch.ru/search.html.

Для получения информации о списках рассылки, способах подписки, архивах и дополнительной информации посетите https://mirror.linuxfromscratch.ru/mail.html.

1.4.3. IRC

Некоторые члены сообщества LFS предлагают помощь в Internet Relay Chat (IRC). Прежде чем воспользоваться этим способом, убедитесь, что на ваш вопрос еще нет ответа в разделе часто задаваемых вопросов LFS или в архивах списков рассылки. Вы можете найти нас в irc.libera.chat. Канал поддержки называется #lfs-support.

1.4.4. Зеркала проекта

Проект LFS имеет несколько зеркал по всему миру, чтобы сделать доступ к веб-сайту и загрузку необходимых пакетов более удобными. Пожалуйста, посетите веб-сайт LFS по адресу https://mirror.linuxfromscratch.ru/mirrors.html для получения списка текущих зеркал.

1.4.5. Контактная информация

Пожалуйста, направляйте все свои вопросы и комментарии в один из списков рассылки LFS (см. выше).

1.5. Помощь

Примечание

Если вы столкнулись с проблемой при сборки одного пакета с помощью инструкцией из LFS, мы настоятельно не рекомендуем публиковать проблему непосредственно в канале поддержки разработчиков пакета до обсуждения через канал поддержки LFS, указанный в Раздел 1.4, «Ресурсы». Часто это неэффективно, потому что разработчики редко знакомы с процедурой сборки LFS. Даже если вы действительно столкнулись с проблемой в пакете, сообщество LFS все равно может помочь выделить информацию, необходимую специалистам по поддержке пакета, и составить соответствующий отчет.

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

Если при работе с этой книгой у вас возникнут проблемы или вопросы, посетите страницу часто задаваемых вопросов по адресу https://mirror.linuxfromscratch.ru/faq/#generalfaq. Часто там уже есть ответы на большинство вопросов. Если на этой странице нет ответа на ваш вопрос, попробуйте самостоятельно найти источник проблемы. Следующий документ даст вам некоторые рекомендации по устранению неполадок: https://mirror.linuxfromscratch.ru/hints/downloads/files/errors.txt.

Если вы не можете найти решение своей проблемы в разделе часто задаваемых вопросов, выполните поиск в списках рассылки по адресу https://mirror.linuxfromscratch.ru/search.html.

У нас также есть замечательное сообщество LFS, которое готово предложить помощь через списки рассылки и IRC (см. Раздел 1.4, «Ресурсы» этой книги). Мы получаем много вопросов в службу поддержки каждый день, и на многие из них можно легко ответить, зайдя в раздел часто задаваемых вопросов и предварительно выполнив поиск в списках рассылки. Чтобы мы могли оказать помощь, вам необходимо сначала провести самостоятельное исследование. Это позволяет нам сосредоточиться на более сложных вопросах в поддержке. Если ваши поиски не привели к решению проблемы, включите всю необходимую информацию (упомянутую ниже) в свой запрос о помощи.

1.5.1. Что следует упомянуть

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

  • Используемая версия книги (в данном случае 12.1-multilib)

  • Информацию о дистрибутиве и его версия, используемые для сборки LFS

  • Вывод сценария Системные требования к хостовой машине

  • Пакет или раздел где возникла проблема

  • Точное сообщение об ошибке или четкое описание проблемы

  • Обратите внимание, отклонялись ли вы от книги

Примечание

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

1.5.2. Проблемы со скриптом configure

Если что-то пойдет не так во время выполнения скрипта configure, просмотрите файл config.log. Этот файл может содержать ошибки, обнаруженные во время настройки, которые не были выведены на экран. Включите соответствующие строки, если вам нужно обратиться за помощью.

1.5.3. Проблемы компиляции

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

gcc -DALIASPATH=\"/mnt/lfs/usr/share/locale:.\"
-DLOCALEDIR=\"/mnt/lfs/usr/share/locale\"
-DLIBDIR=\"/mnt/lfs/usr/lib\"
-DINCLUDEDIR=\"/mnt/lfs/usr/include\" -DHAVE_CONFIG_H -I. -I.
-g -O2 -c getopt1.c
gcc -g -O2 -static -o make ar.o arscan.o commands.o dir.o
expand.o file.o function.o getopt.o implicit.o job.o main.o
misc.o read.o remake.o rule.o signame.o variable.o vpath.o
default.o remote-stub.o version.o opt1.o
-lutil job.o: In function `load_too_high':
/lfs/tmp/make-3.79.1/job.c:1565: undefined reference
to `getloadavg'
collect2: ld returned 1 exit status
make[2]: *** [make] Error 1
make[2]: Leaving directory `/lfs/tmp/make-3.79.1'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/lfs/tmp/make-3.79.1'
make: *** [all-recursive-am] Error 2

В этом случае многие люди просто включили бы только нижнюю часть:

make [2]: *** [make] Error 1

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

Отличная статья о том, как обращаться за помощью в Интернете, доступна по адресу http://catb.org/~esr/faqs/smart-questions.html. Прочтите этот документ и следуйте советам, чтобы повысить вероятность получения помощи в которой вы нуждаетесь.

Часть II. Подготовка к сборке

Глава 2. Подготовка хост-системы

2.1. Введение

В этой главе проверяются и при необходимости устанавливаются основные инструменты, необходимые для построения LFS. Затем подготавливается раздел, в котором будет размещаться система LFS. Мы создадим сам раздел, создадим на нем файловую систему и смонтируем его.

2.2. Требования к хост-системе

2.2.1. Аппаратное обеспечение

Редакторы LFS рекомендуют, чтобы процессор имел не менее четырех ядер и не менее 8 ГБ памяти. Старые системы, не отвечающие этим требованиям, будут по-прежнему работать, но время сборки пакетов будет значительно больше, чем указано в документации.

2.2.2. Программное обеспечение

Ваша хост-система должна иметь следующее программное обеспечение с указанными минимальными версиями. Это не должно быть проблемой для большинства современных дистрибутивов Linux. Также обратите внимание на то, что многие дистрибутивы помещают заголовочные файлы в отдельные пакеты, как правило в формате <package-name>-devel или <package-name>-dev. Обязательно установите эти пакеты, если ваш дистрибутив их предоставляет.

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

  • Bash-3.2 (/bin/sh должен быть символической или жесткой ссылкой на bash)

  • Binutils-2.13.1 (Версия выше 2.42 не рекомендуется, так как она не тестировалась)

  • Bison-2.7 (/usr/bin/yacc должен быть ссылкой на bison или небольшой скрипт, запускающий bison)

  • Coreutils-8.1

  • Diffutils-2.8.1

  • Findutils-4.2.31

  • Gawk-4.0.1 (/usr/bin/awk должен быть ссылкой на gawk)

  • GCC-5.2, включая компилятор C++, g++ (версии выше 13.2.0 не рекомендуются, поскольку они не тестировались). Также должны присутствовать стандартные библиотеки C и C++ (с заголовочными файлами), чтобы компилятор C++ мог осуществлять сборку программ.

  • Grep-2.5.1a

  • Gzip-1.3.12

  • Linux Kernel-4.19

    Причиной, по которой указаны минимальные требования к версии ядра, является то, что мы указываем эту версию при сборке glibc в Глава 5 и Глава 8. Так как более старые ядра не поддерживаются, скомпилированный пакет glibc немного меньше и быстрее. По состоянию на февраль 2024 г. 4.19 является самой старой версией ядра, поддерживаемой разработчиками ядра. Некоторые версии ядра, более старые, чем 4.19, могут по-прежнему поддерживаться сторонними командами, но они не считаются официальными выпусками ядра; подробности читайте на странице https://kernel.org/category/releases.html

    Если версия ядра хоста более ранняя, чем 4.19, вам необходимо обновить ядро на более современную версию. Есть два способа сделать это. Во-первых, посмотрите, предоставляет ли ваш дистрибутив Linux пакет ядра 4.19 или более позднюю версию. Если это так, установите его. Если ваш дистрибутив не предлагает приемлемый пакет ядра или вы предпочитаете не устанавливать его, вы можете скомпилировать ядро самостоятельно. Инструкции по компиляции ядра и настройке загрузчика (при условии, что хост использует GRUB) находятся в Глава 10.

    Для сборки LFS необходимо, чтобы ядро хоста поддерживало псевдотерминал UNIX 98 (PTY). Обычно он включен на всех настольных или серверных дистрибутивах, поставляющих Linux 4.19 или более новое ядро. Если на хосте вы используете самостоятельно собранное ядро, убедитесь, что для параметра CONFIG_UNIX98_PTYS установлено значение y в конфигурационном файле ядра.

  • M4-1.4.10

  • Make-4.0

  • Patch-2.5.4

  • Perl-5.8.8

  • Python-3.4

  • Sed-4.1.5

  • Tar-1.22

  • Texinfo-5.0

  • Xz-5.0.0

Важно

Обратите внимание, что упомянутые выше символические ссылки необходимы для создания системы LFS с использованием инструкций, содержащихся в этой книге. Симлинки, указывающие на другое программное обеспечение (например, dash, mawk и т. д.), могут работать, но не тестируются и не поддерживаются командой разработчиков LFS, и могут потребовать либо отклонения от инструкций, либо дополнительных исправлений для некоторых пакетов.

Чтобы узнать, есть ли в вашей хост-системе все необходимые пакеты и возможность компилировать программы, выполните следующий скрипт:

cat > version-check.sh << "EOF"
#!/bin/bash
# A script to list version numbers of critical development tools

# If you have tools installed in other directories, adjust PATH here AND
# in ~lfs/.bashrc (section 4.4) as well.

LC_ALL=C 
PATH=/usr/bin:/bin

bail() { echo "FATAL: $1"; exit 1; }
grep --version > /dev/null 2> /dev/null || bail "grep does not work"
sed '' /dev/null || bail "sed does not work"
sort   /dev/null || bail "sort does not work"

ver_check()
{
   if ! type -p $2 &>/dev/null
   then 
     echo "ERROR: Cannot find $2 ($1)"; return 1; 
   fi
   v=$($2 --version 2>&1 | grep -E -o '[0-9]+\.[0-9\.]+[a-z]*' | head -n1)
   if printf '%s\n' $3 $v | sort --version-sort --check &>/dev/null
   then 
     printf "OK:    %-9s %-6s >= $3\n" "$1" "$v"; return 0;
   else 
     printf "ERROR: %-9s is TOO OLD ($3 or later required)\n" "$1"; 
     return 1; 
   fi
}

ver_kernel()
{
   kver=$(uname -r | grep -E -o '^[0-9\.]+')
   if printf '%s\n' $1 $kver | sort --version-sort --check &>/dev/null
   then 
     printf "OK:    Linux Kernel $kver >= $1\n"; return 0;
   else 
     printf "ERROR: Linux Kernel ($kver) is TOO OLD ($1 or later required)\n" "$kver"; 
     return 1; 
   fi
}

# Coreutils first because --version-sort needs Coreutils >= 7.0
ver_check Coreutils      sort     8.1 || bail "Coreutils too old, stop"
ver_check Bash           bash     3.2
ver_check Binutils       ld       2.13.1
ver_check Bison          bison    2.7
ver_check Diffutils      diff     2.8.1
ver_check Findutils      find     4.2.31
ver_check Gawk           gawk     4.0.1
ver_check GCC            gcc      5.2
ver_check "GCC (C++)"    g++      5.2
ver_check Grep           grep     2.5.1a
ver_check Gzip           gzip     1.3.12
ver_check M4             m4       1.4.10
ver_check Make           make     4.0
ver_check Patch          patch    2.5.4
ver_check Perl           perl     5.8.8
ver_check Python         python3  3.4
ver_check Sed            sed      4.1.5
ver_check Tar            tar      1.22
ver_check Texinfo        texi2any 5.0
ver_check Xz             xz       5.0.0
ver_kernel 4.19

if mount | grep -q 'devpts on /dev/pts' && [ -e /dev/ptmx ]
then echo "OK:    Linux Kernel supports UNIX 98 PTY";
else echo "ERROR: Linux Kernel does NOT support UNIX 98 PTY"; fi

alias_check() {
   if $1 --version 2>&1 | grep -qi $2
   then printf "OK:    %-4s is $2\n" "$1";
   else printf "ERROR: %-4s is NOT $2\n" "$1"; fi
}
echo "Aliases:"
alias_check awk GNU
alias_check yacc Bison
alias_check sh Bash

echo "Compiler check:"
if printf "int main(){}" | g++ -x c++ -
then echo "OK:    g++ works";
else echo "ERROR: g++ does NOT work"; fi
rm -f a.out

if [ "$(nproc)" = "" ]; then
   echo "ERROR: nproc is not available or it produces empty output"
else
   echo "OK: nproc reports $(nproc) logical cores are available"
fi
EOF

bash version-check.sh

Для сборки multilib-системы требуется, чтобы в ядре хост-системы была включена поддержка 32-разрядной эмуляции.

Binary Emulations  --->
    [*] IA32 Emulation
    <M>   IA32 a.out support
    [*] x32 ABI for 64-bit mode

Опция 'IA32 a.out support' является необязательной. Если в вашем ядре не включена опция 'x32 ABI for 64-bit mode', но включена 'IA32 Emulation', вы можете продолжить сборку своей системы, однако, вам придется исключить любые разделы, содержащие инструкции по сборке объектов x32. Если ни 'IA32 Emulation', ни 'x32 ABI for 64-bit mode' не включены, будут возникать ошибки при сборке glibc в главе 6, поэтому необходимо обновление ядра вашей хост-системы.

2.3. Этапы сборки системы LFS

LFS разработан для сборки за один сеанс. То есть инструкция предполагает, что система не будет выключаться в процессе. Это не означает, что система должна быть собрана за один присест. Для возобновления сборки в точке предыдущей остановки (после перезагрузки/выключения), необходимо выполнить некоторые процедуры повторно.

2.3.1. Главы 1–4

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

  • При выполнении операций, от имени пользователя root после Раздела 2.4, ДЛЯ ПОЛЬЗОВАТЕЛЯ root должна быть установлена переменная окружения LFS.

2.3.2. Главы 5–6

  • Раздел /mnt/lfs должен быть смонтирован.

  • Эти две главы должны быть выполнены из-под пользователя lfs. Перед выполнением любой задачи в этих главах необходимо выполнить команду su - lfs. В противном случае вы рискуете установить пакеты на хост и сделать его непригодным для использования.

  • Выполнение процедур из Общие инструкции по компиляции имеет решающее значение. Если есть какие-либо сомнения по поводу установки пакета, убедитесь, что все ранее распакованные tar-архивы удалены, затем повторно извлеките файлы и выполните все инструкции, приведенные в этом разделе.

2.3.3. Главы 7–10

  • Раздел /mnt/lfs должен быть смонтирован.

  • Некоторые операции, такие как «Смена владельца» или «Вход в среду Chroot», должны быть выполнены от имени пользователя root с переменной окружения $LFS, установленной для пользователя root.

  • При входе в chroot переменная среды LFS должна быть установлена для пользователя root. Переменная LFS не используется после входа в среду chroot.

  • Виртуальные файловые системы должны быть смонтированы. Это можно сделать до или после входа в chroot, переключившись на виртуальный терминал хоста и от имени пользователя root выполнив команды, описанные в Раздел 7.3.1, «Монтирование и заполнение /dev» и Раздел 7.3.2, «Монтирование виртуальных файловых систем ядра».

2.4. Создание нового раздела

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

Минимальная система требует раздел размером около 10 гигабайт (ГБ). Этого достаточно для хранения всех архивов с исходным кодом и компиляции пакетов. Однако, если система LFS предназначена для использования в качестве основной системы Linux, вероятно, будет установлено дополнительное программное обеспечение, для которого потребуется дополнительное пространство. Раздел размером 30 ГБ является разумным размером для расширения. Сама система LFS не займет столько места. Большая часть этого требования заключается в предоставлении достаточного временного хранилища, а также в добавлении дополнительных возможностей после сборки LFS. Кроме того, для компиляции пакетов может потребоваться много места на диске, которое будет освобождено после установки пакета.

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

Запустите программу создания разделов диска, такую как cfdisk или fdisk, с параметром командной строки, указав имя жесткого диска, на котором будет создан новый раздел, например, /dev/sda для основного диска. Создайте раздел Linux и раздел подкачки, если это необходимо. Пожалуйста, обратитесь к справке cfdisk(8) или fdisk(8), если вы еще не знаете, как пользоваться этими программами.

Примечание

Для опытных пользователей возможны и другие схемы разбиения. Система LFS может располагаться на программном RAID-массиве или логическом томе LVM. Однако для некоторых опций требуется initramfs, что является сложной темой. Эти методы разбиения не рекомендуются начинающим пользователям LFS.

Запомните обозначение созданного раздела (например, sda5). В этой книге он будет называться разделом LFS. Также запомните обозначение раздела подкачки. Эти имена понадобятся позже для файла /etc/fstab.

2.4.1. Другие вопросы по созданию разделов

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

2.4.1.1. Корневой раздел

Корневой раздел LFS (не путать с каталогом /root) размером в 20 гигабайт является хорошим компромиссом для большинства систем. Он обеспечивает достаточно места для построения LFS и большей части BLFS, но достаточно мал, чтобы можно было легко создать несколько разделов для экспериментов.

2.4.1.2. Раздел подкачки

Большинство дистрибутивов автоматически создают раздел подкачки. Обычно рекомендуемый размер раздела подкачки примерно в два раза превышает объем физической памяти, однако это требуется редко. Если дисковое пространство ограничено, установите размер раздела подкачки в два гигабайта и контролируйте его объемом.

Если вы хотите использовать режим гибернации (suspend-to-disk) Linux, которая записывает содержимое ОЗУ в раздел подкачки перед выключением машины. Установите размер раздела подкачки не меньше объема установленной оперативной памяти.

Использование файла подкачки - это не очень хорошо. Для механических жестких дисков вы можете определить, что система использует раздел подкачки, просто слыша активность диска и наблюдая, как система реагирует на команды. Для SSD-накопителя вы не сможете услышать, что используется раздел подкачки, но сможете оценить, сколько места на разделе подкачки занято, используя команды top или free. По возможности следует избегать использования SSD-накопителя для раздела подкачки. Первой реакцией на активность раздела подкачки должна быть проверка на необоснованное применение какой-либо команды, например, попытка редактирования пятигигабайтного файла. Если использование раздела подкачки становится обычным явлением, лучшее решение — приобретение большего объема оперативной памяти для вашей системы.

2.4.1.3. Раздел GRUB

Если загрузочный диск размечен с помощью таблицы разделов GUID (GPT), необходимо создать небольшой раздел, обычно размером 1 МБ, если он еще не существует. Этот раздел не форматируется, но должен быть доступен для использования GRUB во время установки загрузчика. Обычно он помечен как 'BIOS Boot' при использовании fdisk или имеет код EF02 при использовании gdisk.

Примечание

Раздел Grub Bios должен находиться на диске, который BIOS использует для загрузки системы. Это не обязательно тот же диск, на котором расположен корневой раздел LFS. Диски в системе могут использовать разные типы таблиц разделов. Наличие раздела Grub Bios зависит только от типа таблицы разделов на загрузочном диске.

2.4.1.4. Разделы, используемые для удобства

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

  • /boot – Настоятельно рекомендуется. Используйте этот раздел для хранения ядер и другой загрузочной информации. Чтобы свести к минимуму возможные проблемы с загрузкой дисков большого размера, сделайте этот раздел первым физическим разделом на первом диске. Размер раздела в 200 мегабайт вполне достаточен.

  • /boot/efi – Системный раздел EFI, используемый для загрузки системы с помощью UEFI. Подробнее читайте на странице BLFS.

  • /home – Настоятельно рекомендуется. Предоставьте общий доступ к своему домашнему каталогу и пользовательским настройкам нескольким дистрибутивам или сборкам LFS. Размер, как правило, довольно большой и зависит от доступного места на диске.

  • /usr – в LFS, /bin, /lib, и /sbin являются символическими ссылками на их аналоги в /usr. Таким образом /usr содержит все двоичные файлы, необходимые для работы системы. Для LFS отдельный раздел /usr не требуется. Если он вам необходим, вы должны сделать раздел достаточно большим, чтобы поместить туда все программы и библиотеки в системе. В этой конфигурации, корневой раздел может быть очень маленьким (возможно, всего один гигабайт), поэтому он подходит для тонкого клиента или бездисковой рабочей станции (где /usr монтируется с удаленного сервера). Однако вы должны знать, что для загрузки системы с отдельного раздела /usr потребуется initramfs (не включенный в LFS).

  • /opt – Этот каталог наиболее полезен для BLFS, в него можно установить некоторые большие пакеты, такие как KDE или Texlive, без использования иерархии /usr. Для /opt достаточно размера от 5 до 10 гигабайт.

  • /tmp – Отдельный раздел /tmp используется редко, он полезен при настройке тонкого клиента. Обычно, его размер не должен превышать пару гигабайт. Если у вас достаточно оперативной памяти, вы можете смонтировать /tmp как tmpfs, чтобы ускорить доступ к временным файлам.

  • /usr/src – Этот раздел очень удобен для хранения исходников BLFS и совместного использования их в сборках LFS. Его также можно использовать в качестве места для сборки пакетов BLFS. Размера в 30-50 гигабайт вполне достаточно.

Любой отдельный раздел, который вы хотите автоматически монтировать при загрузке, должен быть указан в файле /etc/fstab. Подробности о том, как указать разделы, будут обсуждаться в Раздел 10.2, «Создание файла /etc/fstab».

2.5. Создание файловой системы на разделе

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

LFS может использовать любую файловую систему, распознаваемую ядром Linux, но наиболее распространенными типами являются ext3 и ext4. Выбор правильной файловой системы может быть сложным; это зависит от характеристик файлов и размера раздела. Например:

ext2

подходит для небольших разделов, которые редко обновляются, например /boot.

ext3

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

ext4

является последней версией файловых систем семейства ext. Она предоставляет несколько новых возможностей, включая временные метки с точностью до наносекунды, создание и использование очень больших файлов (16 ТБ) и повышение скорости работы.

Другие файловые системы, включая FAT32, NTFS, ReiserFS, JFS и XFS, полезны для конкретных задач. Более подробную информацию об этих файловых системах и многих других можно найти по адресу https://en.wikipedia.org/wiki/Comparison_of_file_systems.

LFS предполагает, что корневая файловая система (/) имеет тип ext4. Чтобы создать файловую систему ext4 на разделе LFS, выполните следующую команду:

mkfs -v -t ext4 /dev/<xxx>

Замените <xxx> именем раздела LFS

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

mkswap /dev/<yyy>

Замените <yyy> именем раздела подкачки.

2.6. Установка переменной $LFS

В этой книге переменная окружения LFS будет использоваться несколько раз. Вы должны убедиться, что эта переменная всегда определена в процессе сборки LFS. Она должна быть установлена на каталог, в котором вы будете создавать свою систему LFS — мы, для примера, будем использовать /mnt/lfs, но вы можете выбрать любой другой. Если вы собираете LFS на отдельном разделе, этот каталог будет точкой монтирования для раздела. Выберите расположение каталога и установите переменную с помощью следующей команды:

export LFS=/mnt/lfs

Установка этой переменной полезна тем, что такие команды, как mkdir -v $LFS/tools, можно вводить буквально. Оболочка автоматически заменит «$LFS» на «/mnt/lfs» (или любое другое значение переменной) при обработке команды.

Внимание

Не забывайте проверять, что переменная LFS установлена, всякий раз, когда вы покидаете и снова входите в текущую рабочую среду (например, когда выполняете su для root или другого пользователя). Убедитесь, что переменная LFS настроена правильно:

echo $LFS

Убедитесь, что в выходных данных указан путь к местоположению сборки вашей системы LFS, то есть /mnt/lfs, если вы следовали примеру. Если вывод неверен, используйте команду, указанную ранее, чтобы установить $LFS в правильное значение каталога LFS.

Примечание

Один из способов гарантировать, что переменная LFS всегда установлена, — отредактировать файл .bash_profile как в вашем личном домашнем каталоге, так и в /root/.bash_profile и добавить приведенную выше команду экспорта. Кроме того, оболочка, указанная в файле /etc/passwd для всех пользователей, которым нужна переменная LFS, должна быть bash, чтобы гарантировать, что файл /root/.bash_profile используется как часть процесса входа в систему.

Еще один способ, который используется для входа в хост-систему. При входе в систему через диспетчер графического дисплея пользовательский .bash_profile не используется при запуске виртуального терминала. В этом случае добавьте команду экспорта в файл .bashrc для своего пользователя и root. Кроме того, некоторые дистрибутивы используют тест "if" и не запускают оставшиеся инструкции .bashrc для не интерактивного вызова bash. Обязательно разместите команду экспорта перед тестом для не интерактивного использования.

2.7. Монтирование нового раздела

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

Строго говоря, нельзя «смонтировать раздел». Монтируется файловая система на этом разделе. Но так как один раздел не может содержать несколько файловых систем, люди часто говорят о разделе и связанной с ним файловой системе так, как если бы они были одним и тем же.

Создайте точку монтирования и смонтируйте файловую систему LFS с помощью этих команд:

mkdir -pv $LFS
mount -v -t ext4 /dev/<xxx> $LFS

Замените <xxx> на имя раздела LFS.

Если вы используете несколько разделов для LFS (например, один для /, а другой для /home), смонтируйте их вот так:

mkdir -pv $LFS
mount -v -t ext4 /dev/<xxx> $LFS
mkdir -v $LFS/home
mount -v -t ext4 /dev/<yyy> $LFS/home

Замените <xxx> и <yyy> соответствующими именами разделов.

Убедитесь, что этот новый раздел не смонтирован со слишком строгими разрешениями (такими как параметры nosuid или nodev). Запустите команду mount без каких-либо параметров, чтобы увидеть, какие параметры установлены для смонтированного раздела LFS. Если установлены nosuid и/или nodev, раздел должен быть размонтирован и смонтирован повторно.

Предупреждение

Приведенные выше инструкции предполагают, что вы не будете перезагружать компьютер в процессе сборки LFS. Если вы выключите свою систему, вам придется либо перемонтировать раздел LFS каждый раз, когда вы перезапускаете процесс сборки, либо изменить файл /etc/fstab вашей хост-системы, чтобы он автоматически монтировал его при загрузке. Например, вы можете добавить эту строку в свой /etc/fstab:

/dev/<xxx>  /mnt/lfs ext4   defaults      1     1

Если вы используете дополнительные разделы, обязательно добавьте их.

Если вы используете раздел подкачки, убедитесь, что он включен с помощью команды swapon:

/sbin/swapon -v /dev/<zzz>

Замените <zzz> именем раздела подкачки.

Теперь, когда новый раздел LFS готов к работе, пришло время загрузить пакеты.

Глава 3. Пакеты и патчи

3.1. Введение

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

Для некоторых пакетов архив релиза и архив снимка репозитория (Git или SVN) для этого выпуска могут быть опубликованы с одинаковыми именами файлов. Релиз содержит сгенерированные файлы (например, скрипт configure, сгенерированный пакетом autoconf) в дополнение к содержимому соответствующего моментального снимка репозитория. В книге везде, где это возможно, используются релизные архивы. Использование моментального снимка вместо tar-архива, указанного в книге, может вызвать проблемы.

Источники загрузки могут быть недоступны. Если источник изменился с момента публикации этой книги, Google (https://www.google.com/) предоставляет удобную поисковую систему для поиска большинства пакетов. Если поиск не увенчался успехом, попробуйте один из альтернативных способов загрузки, расположенных по адресу https://mirror.linuxfromscratch.ru/lfs/mirrors.html#files.

Загруженные пакеты и патчи необходимо где-нибудь хранить, чтобы они были доступны на протяжении всей сборки. Рабочий каталог также необходим для распаковки исходников и их сборки. $LFS/sources можно использовать и как место для хранения архивов и патчей, и как рабочий каталог. При использовании этого каталога необходимые элементы будут расположены в разделе LFS и будут доступны на всех этапах процесса сборки.

Чтобы создать этот каталог, выполните следующую команду от имени пользователя root перед началом загрузки:

mkdir -v $LFS/sources

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

chmod -v a+wt $LFS/sources

Есть несколько способов получить все необходимые пакеты и патчи для сборки LFS:

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

  • Для стабильных версий книги архив со всеми необходимыми файлами можно загрузить с одного из зеркал LFS, перечисленных на странице https://mirror.linuxfromscratch.ru/mirrors.html#files.

  • Файлы можно загрузить с помощью wget и wget-list.

Чтобы загрузить все пакеты и патчи, используя wget-list-sysv в качестве входных данных для команды wget, наберите команду:

wget --input-file=wget-list-sysv --continue --directory-prefix=$LFS/sources

Начиная с LFS-7.0, существует отдельный файл md5sums, который можно использовать для проверки всех пакетов. Поместите этот файл в $LFS/sources и выполните:

pushd $LFS/sources
  md5sum -c md5sums
popd

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

Если пакеты и исправления загружаются от имени пользователя, без привилегий root, то файлы будут принадлежать этому пользователю. Файловая система записывает владельца по его UID, а UID обычного пользователя в хост-дистрибутиве не будет присвоен в LFS. Таким образом, файлы останутся принадлежащими безымянному UID в конечной системе LFS. Если вы не назначили тот же UID для своего пользователя в системе LFS, измените владельца этих файлов на root сейчас, чтобы избежать этой проблемы:

chown root:root $LFS/sources/*

3.2. Все пакеты

Примечание

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

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

Загрузите или иным образом получите следующие пакеты:

Acl (2.3.2) - 363 KB:

Домашняя страница: https://savannah.nongnu.org/projects/acl

Ссылка на загрузку: https://download.savannah.gnu.org/releases/acl/acl-2.3.2.tar.xz

Контрольная сумма MD5: 590765dee95907dbc3c856f7255bd669

Attr (2.5.2) - 484 KB:

Домашняя страница: https://savannah.nongnu.org/projects/attr

Ссылка на загрузку: https://download.savannah.gnu.org/releases/attr/attr-2.5.2.tar.gz

Контрольная сумма MD5: 227043ec2f6ca03c0948df5517f9c927

Autoconf (2.72) - 1,360 KB:

Домашняя страница: https://www.gnu.org/software/autoconf/

Ссылка на загрузку: https://ftp.gnu.org/gnu/autoconf/autoconf-2.72.tar.xz

Контрольная сумма MD5: 1be79f7106ab6767f18391c5e22be701

Automake (1.16.5) - 1,565 KB:

Домашняя страница: https://www.gnu.org/software/automake/

Ссылка на загрузку: https://ftp.gnu.org/gnu/automake/automake-1.16.5.tar.xz

Контрольная сумма MD5: 4017e96f89fca45ca946f1c5db6be714

Bash (5.2.21) - 10,696 KB:

Домашняя страница: https://www.gnu.org/software/bash/

Ссылка на загрузку: https://ftp.gnu.org/gnu/bash/bash-5.2.21.tar.gz

Контрольная сумма MD5: ad5b38410e3bf0e9bcc20e2765f5e3f9

Bc (6.7.5) - 460 KB:

Домашняя страница: https://git.gavinhoward.com/gavin/bc

Ссылка на загрузку: https://github.com/gavinhoward/bc/releases/download/6.7.5/bc-6.7.5.tar.xz

Контрольная сумма MD5: e249b1f86f886d6fb71c15f72b65dd3d

Binutils (2.42) - 26,922 KB:

Домашняя страница: https://www.gnu.org/software/binutils/

Ссылка на загрузку: https://sourceware.org/pub/binutils/releases/binutils-2.42.tar.xz

Контрольная сумма MD5: a075178a9646551379bfb64040487715

Bison (3.8.2) - 2,752 KB:

Домашняя страница: https://www.gnu.org/software/bison/

Ссылка на загрузку: https://ftp.gnu.org/gnu/bison/bison-3.8.2.tar.xz

Контрольная сумма MD5: c28f119f405a2304ff0a7ccdcc629713

Bzip2 (1.0.8) - 792 KB:

Ссылка на загрузку: https://www.sourceware.org/pub/bzip2/bzip2-1.0.8.tar.gz

Контрольная сумма MD5: 67e051268d0c475ea773822f7500d0e5

Check (0.15.2) - 760 KB:

Домашняя страница: https://libcheck.github.io/check

Ссылка на загрузку: https://github.com/libcheck/check/releases/download/0.15.2/check-0.15.2.tar.gz

Контрольная сумма MD5: 50fcafcecde5a380415b12e9c574e0b2

Coreutils (9.4) - 5,840 KB:

Домашняя страница: https://www.gnu.org/software/coreutils/

Ссылка на загрузку: https://ftp.gnu.org/gnu/coreutils/coreutils-9.4.tar.xz

Контрольная сумма MD5: 459e9546074db2834eefe5421f250025

DejaGNU (1.6.3) - 608 KB:

Домашняя страница: https://www.gnu.org/software/dejagnu/

Ссылка на загрузку: https://ftp.gnu.org/gnu/dejagnu/dejagnu-1.6.3.tar.gz

Контрольная сумма MD5: 68c5208c58236eba447d7d6d1326b821

Diffutils (3.10) - 1,587 KB:

Домашняя страница: https://www.gnu.org/software/diffutils/

Ссылка на загрузку: https://ftp.gnu.org/gnu/diffutils/diffutils-3.10.tar.xz

Контрольная сумма MD5: 2745c50f6f4e395e7b7d52f902d075bf

E2fsprogs (1.47.0) - 9,412 KB:

Домашняя страница: http://e2fsprogs.sourceforge.net/

Ссылка на загрузку: https://downloads.sourceforge.net/project/e2fsprogs/e2fsprogs/v1.47.0/e2fsprogs-1.47.0.tar.gz

Контрольная сумма MD5: 6b4f18a33873623041857b4963641ee9

Elfutils (0.190) - 8,949 KB:

Домашняя страница: https://sourceware.org/elfutils/

Ссылка на загрузку: https://sourceware.org/ftp/elfutils/0.190/elfutils-0.190.tar.bz2

Контрольная сумма MD5: 79ad698e61a052bea79e77df6a08bc4b

Expat (2.6.0) - 473 KB:

Домашняя страница: https://libexpat.github.io/

Ссылка на загрузку: https://prdownloads.sourceforge.net/expat/expat-2.6.0.tar.xz

Контрольная сумма MD5: bd169cb11f4b9bdfddadf9e88a5c4d4b

Expect (5.45.4) - 618 KB:

Домашняя страница: https://core.tcl.tk/expect/

Ссылка на загрузку: https://prdownloads.sourceforge.net/expect/expect5.45.4.tar.gz

Контрольная сумма MD5: 00fce8de158422f5ccd2666512329bd2

File (5.45) - 1,218 KB:

Домашняя страница: https://www.darwinsys.com/file/

Ссылка на загрузку: https://astron.com/pub/file/file-5.45.tar.gz

Контрольная сумма MD5: 26b2a96d4e3a8938827a1e572afd527a

Findutils (4.9.0) - 1,999 KB:

Домашняя страница: https://www.gnu.org/software/findutils/

Ссылка на загрузку: https://ftp.gnu.org/gnu/findutils/findutils-4.9.0.tar.xz

Контрольная сумма MD5: 4a4a547e888a944b2f3af31d789a1137

Flex (2.6.4) - 1,386 KB:

Домашняя страница: https://github.com/westes/flex

Ссылка на загрузку: https://github.com/westes/flex/releases/download/v2.6.4/flex-2.6.4.tar.gz

Контрольная сумма MD5: 2882e3179748cc9f9c23ec593d6adc8d

Flit-core (3.9.0) - 41 KB:

Домашняя страница: https://pypi.org/project/flit-core/

Ссылка на загрузку: https://pypi.org/packages/source/f/flit-core/flit_core-3.9.0.tar.gz

Контрольная сумма MD5: 3bc52f1952b9a78361114147da63c35b

Gawk (5.3.0) - 3,356 KB:

Домашняя страница: https://www.gnu.org/software/gawk/

Ссылка на загрузку: https://ftp.gnu.org/gnu/gawk/gawk-5.3.0.tar.xz

Контрольная сумма MD5: 97c5a7d83f91a7e1b2035ebbe6ac7abd

GCC (13.2.0) - 85,800 KB:

Домашняя страница: https://gcc.gnu.org/

Ссылка на загрузку: https://ftp.gnu.org/gnu/gcc/gcc-13.2.0/gcc-13.2.0.tar.xz

Контрольная сумма MD5: e0e48554cc6e4f261d55ddee9ab69075

GDBM (1.23) - 1,092 KB:

Домашняя страница: https://www.gnu.org/software/gdbm/

Ссылка на загрузку: https://ftp.gnu.org/gnu/gdbm/gdbm-1.23.tar.gz

Контрольная сумма MD5: 8551961e36bf8c70b7500d255d3658ec

Gettext (0.22.4) - 10,016 KB:

Домашняя страница: https://www.gnu.org/software/gettext/

Ссылка на загрузку: https://ftp.gnu.org/gnu/gettext/gettext-0.22.4.tar.xz

Контрольная сумма MD5: 2d8507d003ef3ddd1c172707ffa97ed8

Glibc (2.39) - 18,092 KB:

Домашняя страница: https://www.gnu.org/software/libc/

Ссылка на загрузку: https://ftp.gnu.org/gnu/glibc/glibc-2.39.tar.xz

Контрольная сумма MD5: be81e87f72b5ea2c0ffe2bedfeb680c6

Примечание

Разработчики Glibc поддерживают Git ветку содержащую исправления, которые заслуживают внимания для Glibc-2.39 но, к сожалению, выпущенные после релиза Glibc-2.39. Редакторы LFS публикуют рекомендации по безопасности, если в ветку добавлено какое-либо исправление безопасности, но для других недавно добавленных патчей не будет предпринято никаких действий. Вы можете самостоятельно просмотреть патчи и включить некоторые из них, если посчитаете их важными.

GMP (6.3.0) - 2,046 KB:

Домашняя страница: https://www.gnu.org/software/gmp/

Ссылка на загрузку: https://ftp.gnu.org/gnu/gmp/gmp-6.3.0.tar.xz

Контрольная сумма MD5: 956dc04e864001a9c22429f761f2c283

Gperf (3.1) - 1,188 KB:

Домашняя страница: https://www.gnu.org/software/gperf/

Ссылка на загрузку: https://ftp.gnu.org/gnu/gperf/gperf-3.1.tar.gz

Контрольная сумма MD5: 9e251c0a618ad0824b51117d5d9db87e

Grep (3.11) - 1,664 KB:

Домашняя страница: https://www.gnu.org/software/grep/

Ссылка на загрузку: https://ftp.gnu.org/gnu/grep/grep-3.11.tar.xz

Контрольная сумма MD5: 7c9bbd74492131245f7cdb291fa142c0

Groff (1.23.0) - 7,259 KB:

Домашняя страница: https://www.gnu.org/software/groff/

Ссылка на загрузку: https://ftp.gnu.org/gnu/groff/groff-1.23.0.tar.gz

Контрольная сумма MD5: 5e4f40315a22bb8a158748e7d5094c7d

GRUB (2.12) - 6,524 KB:

Домашняя страница: https://www.gnu.org/software/grub/

Ссылка на загрузку: https://ftp.gnu.org/gnu/grub/grub-2.12.tar.xz

Контрольная сумма MD5: 60c564b1bdc39d8e43b3aab4bc0fb140

Gzip (1.13) - 819 KB:

Домашняя страница: https://www.gnu.org/software/gzip/

Ссылка на загрузку: https://ftp.gnu.org/gnu/gzip/gzip-1.13.tar.xz

Контрольная сумма MD5: d5c9fc9441288817a4a0be2da0249e29

Iana-Etc (20240125) - 589 KB:

Домашняя страница: https://www.iana.org/protocols

Ссылка на загрузку: https://github.com/Mic92/iana-etc/releases/download/20240125/iana-etc-20240125.tar.gz

Контрольная сумма MD5: aed66d04de615d76c70890233081e584

Inetutils (2.5) - 1,632 KB:

Домашняя страница: https://www.gnu.org/software/inetutils/

Ссылка на загрузку: https://ftp.gnu.org/gnu/inetutils/inetutils-2.5.tar.xz

Контрольная сумма MD5: 9e5a6dfd2d794dc056a770e8ad4a9263

Intltool (0.51.0) - 159 KB:

Домашняя страница: https://freedesktop.org/wiki/Software/intltool

Ссылка на загрузку: https://launchpad.net/intltool/trunk/0.51.0/+download/intltool-0.51.0.tar.gz

Контрольная сумма MD5: 12e517cac2b57a0121cda351570f1e63

IPRoute2 (6.7.0) - 900 KB:

Домашняя страница: https://www.kernel.org/pub/linux/utils/net/iproute2/

Ссылка на загрузку: https://www.kernel.org/pub/linux/utils/net/iproute2/iproute2-6.7.0.tar.xz

Контрольная сумма MD5: 35d8277d1469596b7edc07a51470a033

ISL (0.24) - 2,216 KB:

Домашняя страница: http://isl.gforge.inria.fr/

Ссылка на загрузку: https://gcc.gnu.org/pub/gcc/infrastructure/isl-0.24.tar.bz2

Контрольная сумма MD5: dd2f7b78e118c25bd96134a52aae7f4d

Jinja2 (3.1.3) - 264 KB:

Домашняя страница: https://jinja.palletsprojects.com/en/3.1.x/

Ссылка на загрузку: https://pypi.org/packages/source/J/Jinja2/Jinja2-3.1.3.tar.gz

Контрольная сумма MD5: caf5418c851eac59e70a78d9730d4cea

Kbd (2.6.4) - 1,470 KB:

Домашняя страница: https://kbd-project.org/

Ссылка на загрузку: https://www.kernel.org/pub/linux/utils/kbd/kbd-2.6.4.tar.xz

Контрольная сумма MD5: e2fd7adccf6b1e98eb1ae8d5a1ce5762

Kmod (31) - 558 KB:

Домашняя страница: https://github.com/kmod-project/kmod

Ссылка на загрузку: https://www.kernel.org/pub/linux/utils/kernel/kmod/kmod-31.tar.xz

Контрольная сумма MD5: 6165867e1836d51795a11ea4762ff66a

Less (643) - 579 KB:

Домашняя страница: https://www.greenwoodsoftware.com/less/

Ссылка на загрузку: https://www.greenwoodsoftware.com/less/less-643.tar.gz

Контрольная сумма MD5: cf05e2546a3729492b944b4874dd43dd

LFS-Bootscripts (20230728) - 33 KB:

Ссылка на загрузку: https://mirror.linuxfromscratch.ru/lfs/downloads/12.1/lfs-bootscripts-20230728.tar.xz

Контрольная сумма MD5: 027415905b9e964894f7153b5a1bc20e

Libcap (2.69) - 185 KB:

Домашняя страница: https://sites.google.com/site/fullycapable/

Ссылка на загрузку: https://www.kernel.org/pub/linux/libs/security/linux-privs/libcap2/libcap-2.69.tar.xz

Контрольная сумма MD5: 4667bacb837f9ac4adb4a1a0266f4b65

Libffi (3.4.4) - 1,331 KB:

Домашняя страница: https://sourceware.org/libffi/

Ссылка на загрузку: https://github.com/libffi/libffi/releases/download/v3.4.4/libffi-3.4.4.tar.gz

Контрольная сумма MD5: 0da1a5ed7786ac12dcbaf0d499d8a049

Libpipeline (1.5.7) - 956 KB:

Домашняя страница: https://libpipeline.nongnu.org/

Ссылка на загрузку: https://download.savannah.gnu.org/releases/libpipeline/libpipeline-1.5.7.tar.gz

Контрольная сумма MD5: 1a48b5771b9f6c790fb4efdb1ac71342

Libtool (2.4.7) - 996 KB:

Домашняя страница: https://www.gnu.org/software/libtool/

Ссылка на загрузку: https://ftp.gnu.org/gnu/libtool/libtool-2.4.7.tar.xz

Контрольная сумма MD5: 2fc0b6ddcd66a89ed6e45db28fa44232

Libxcrypt (4.4.36) - 610 KB:

Домашняя страница: https://github.com/besser82/libxcrypt/

Ссылка на загрузку: https://github.com/besser82/libxcrypt/releases/download/v4.4.36/libxcrypt-4.4.36.tar.xz

Контрольная сумма MD5: b84cd4104e08c975063ec6c4d0372446

Linux (6.7.4) - 138,130 KB:

Домашняя страница: https://www.kernel.org/

Ссылка на загрузку: https://www.kernel.org/pub/linux/kernel/v6.x/linux-6.7.4.tar.xz

Контрольная сумма MD5: 370e1b6155ae63133380e421146619e0

Примечание

Ядро Linux обновляется достаточно часто из-за обнаружения уязвимостей в системе безопасности. Можно использовать последнюю стабильную версию ядра, если на странице с ошибками и рекомендациями по безопасности не указано иное.

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

M4 (1.4.19) - 1,617 KB:

Домашняя страница: https://www.gnu.org/software/m4/

Ссылка на загрузку: https://ftp.gnu.org/gnu/m4/m4-1.4.19.tar.xz

Контрольная сумма MD5: 0d90823e1426f1da2fd872df0311298d

Make (4.4.1) - 2,300 KB:

Домашняя страница: https://www.gnu.org/software/make/

Ссылка на загрузку: https://ftp.gnu.org/gnu/make/make-4.4.1.tar.gz

Контрольная сумма MD5: c8469a3713cbbe04d955d4ae4be23eeb

Man-DB (2.12.0) - 1,941 KB:

Домашняя страница: https://www.nongnu.org/man-db/

Ссылка на загрузку: https://download.savannah.gnu.org/releases/man-db/man-db-2.12.0.tar.xz

Контрольная сумма MD5: 67e0052fa200901b314fad7b68c9db27

Man-pages (6.06) - 2,116 KB:

Домашняя страница: https://www.kernel.org/doc/man-pages/

Ссылка на загрузку: https://www.kernel.org/pub/linux/docs/man-pages/man-pages-6.06.tar.xz

Контрольная сумма MD5: 26b39e38248144156d437e1e10cb20bf

MarkupSafe (2.1.5) - 19 KB:

Домашняя страница: https://palletsprojects.com/p/markupsafe/

Ссылка на загрузку: https://pypi.org/packages/source/M/MarkupSafe/MarkupSafe-2.1.5.tar.gz

Контрольная сумма MD5: 8fe7227653f2fb9b1ffe7f9f2058998a

Meson (1.3.2) - 2,172 KB:

Домашняя страница: https://mesonbuild.com

Ссылка на загрузку: https://github.com/mesonbuild/meson/releases/download/1.3.2/meson-1.3.2.tar.gz

Контрольная сумма MD5: 2d0ebd3a24249617b1c4d30026380cf8

MPC (1.3.1) - 756 KB:

Домашняя страница: https://www.multiprecision.org/

Ссылка на загрузку: https://ftp.gnu.org/gnu/mpc/mpc-1.3.1.tar.gz

Контрольная сумма MD5: 5c9bc658c9fd0f940e8e3e0f09530c62

MPFR (4.2.1) - 1,459 KB:

Домашняя страница: https://www.mpfr.org/

Ссылка на загрузку: https://ftp.gnu.org/gnu/mpfr/mpfr-4.2.1.tar.xz

Контрольная сумма MD5: 523c50c6318dde6f9dc523bc0244690a

Ncurses (6.4-20230520) - 2,156 KB:

Домашняя страница: https://www.gnu.org/software/ncurses/

Ссылка на загрузку: https://anduin.linuxfromscratch.org/LFS/ncurses-6.4-20230520.tar.xz

Контрольная сумма MD5: c5367e829b6d9f3f97b280bb3e6bfbc3

Ninja (1.11.1) - 225 KB:

Домашняя страница: https://ninja-build.org/

Ссылка на загрузку: https://github.com/ninja-build/ninja/archive/v1.11.1/ninja-1.11.1.tar.gz

Контрольная сумма MD5: 32151c08211d7ca3c1d832064f6939b0

OpenSSL (3.2.1) - 17,318 KB:

Домашняя страница: https://www.openssl.org/

Ссылка на загрузку: https://www.openssl.org/source/openssl-3.2.1.tar.gz

Контрольная сумма MD5: c239213887804ba00654884918b37441

Patch (2.7.6) - 766 KB:

Домашняя страница: https://savannah.gnu.org/projects/patch/

Ссылка на загрузку: https://ftp.gnu.org/gnu/patch/patch-2.7.6.tar.xz

Контрольная сумма MD5: 78ad9937e4caadcba1526ef1853730d5

Perl (5.38.2) - 13,359 KB:

Домашняя страница: https://www.perl.org/

Ссылка на загрузку: https://www.cpan.org/src/5.0/perl-5.38.2.tar.xz

Контрольная сумма MD5: d3957d75042918a23ec0abac4a2b7e0a

Pkgconf (2.1.1) - 305 KB:

Домашняя страница: http://pkgconf.org/

Ссылка на загрузку: https://distfiles.ariadne.space/pkgconf/pkgconf-2.1.1.tar.xz

Контрольная сумма MD5: bc29d74c2483197deb9f1f3b414b7918

Procps (4.0.4) - 1,369 KB:

Домашняя страница: https://gitlab.com/procps-ng/procps/

Ссылка на загрузку: https://sourceforge.net/projects/procps-ng/files/Production/procps-ng-4.0.4.tar.xz

Контрольная сумма MD5: 2f747fc7df8ccf402d03e375c565cf96

Psmisc (23.6) - 415 KB:

Домашняя страница: https://gitlab.com/psmisc/psmisc

Ссылка на загрузку: https://sourceforge.net/projects/psmisc/files/psmisc/psmisc-23.6.tar.xz

Контрольная сумма MD5: ed3206da1184ce9e82d607dc56c52633

Python (3.12.2) - 20,109 KB:

Домашняя страница: https://www.python.org/

Ссылка на загрузку: https://www.python.org/ftp/python/3.12.2/Python-3.12.2.tar.xz

Контрольная сумма MD5: e7c178b97bf8f7ccd677b94d614f7b3c

Python Documentation (3.12.2) - 8,065 KB:

Ссылка на загрузку: https://www.python.org/ftp/python/doc/3.12.2/python-3.12.2-docs-html.tar.bz2

Контрольная сумма MD5: 8a6310f6288e7f60c3565277ec3b5279

Readline (8.2) - 2,973 KB:

Домашняя страница: https://tiswww.case.edu/php/chet/readline/rltop.html

Ссылка на загрузку: https://ftp.gnu.org/gnu/readline/readline-8.2.tar.gz

Контрольная сумма MD5: 4aa1b31be779e6b84f9a96cb66bc50f6

Sed (4.9) - 1,365 KB:

Домашняя страница: https://www.gnu.org/software/sed/

Ссылка на загрузку: https://ftp.gnu.org/gnu/sed/sed-4.9.tar.xz

Контрольная сумма MD5: 6aac9b2dbafcd5b7a67a8a9bcb8036c3

Setuptools (69.1.0) - 2,168 KB:

Домашняя страница: https://pypi.org/project/setuptools/

Ссылка на загрузку: https://pypi.org/packages/source/s/setuptools/setuptools-69.1.0.tar.gz

Контрольная сумма MD5: 6f6eb780ce12c90d81ce243747ed7ab0

Shadow (4.14.5) - 1,765 KB:

Домашняя страница: https://github.com/shadow-maint/shadow/

Ссылка на загрузку: https://github.com/shadow-maint/shadow/releases/download/4.14.5/shadow-4.14.5.tar.xz

Контрольная сумма MD5: 452b0e59f08bf618482228ba3732d0ae

Sysklogd (1.5.1) - 88 KB:

Домашняя страница: https://www.infodrom.org/projects/sysklogd/

Ссылка на загрузку: https://www.infodrom.org/projects/sysklogd/download/sysklogd-1.5.1.tar.gz

Контрольная сумма MD5: c70599ab0d037fde724f7210c2c8d7f8

Systemd (255) - 14,516 KB:

Домашняя страница: https://www.freedesktop.org/wiki/Software/systemd/

Ссылка на загрузку: https://github.com/systemd/systemd/archive/v255/systemd-255.tar.gz

Контрольная сумма MD5: 521cda27409a9edf0370c128fae3e690

Systemd Man Pages(255) - 652 KB:

Домашняя страница: https://www.freedesktop.org/wiki/Software/systemd/

Ссылка на загрузку: https://anduin.linuxfromscratch.org/LFS/systemd-man-pages-255.tar.xz

Контрольная сумма MD5: 1ebe54d7a80f9abf8f2d14ddfeb2432d

Примечание

Команда Linux From Scratch генерирует собственный архив справочных страниц, используя исходный код systemd. Это делается для того, чтобы избежать ненужных зависимостей.

Sysvinit (3.08) - 263 KB:

Домашняя страница: https://savannah.nongnu.org/projects/sysvinit

Ссылка на загрузку: https://github.com/slicer69/sysvinit/releases/download/3.08/sysvinit-3.08.tar.xz

Контрольная сумма MD5: 81a05f28d7b67533cfc778fcadea168c

Tar (1.35) - 2,263 KB:

Домашняя страница: https://www.gnu.org/software/tar/

Ссылка на загрузку: https://ftp.gnu.org/gnu/tar/tar-1.35.tar.xz

Контрольная сумма MD5: a2d8042658cfd8ea939e6d911eaf4152

Tcl (8.6.13) - 10,581 KB:

Домашняя страница: http://tcl.sourceforge.net/

Ссылка на загрузку: https://downloads.sourceforge.net/tcl/tcl8.6.13-src.tar.gz

Контрольная сумма MD5: 0e4358aade2f5db8a8b6f2f6d9481ec2

Tcl Documentation (8.6.13) - 1,165 KB:

Ссылка на загрузку: https://downloads.sourceforge.net/tcl/tcl8.6.13-html.tar.gz

Контрольная сумма MD5: 4452f2f6d557f5598cca17b786d6eb68

Texinfo (7.1) - 5,416 KB:

Домашняя страница: https://www.gnu.org/software/texinfo/

Ссылка на загрузку: https://ftp.gnu.org/gnu/texinfo/texinfo-7.1.tar.xz

Контрольная сумма MD5: edd9928b4a3f82674bcc3551616eef3b

Time Zone Data (2024a) - 444 KB:

Домашняя страница: https://www.iana.org/time-zones

Ссылка на загрузку: https://www.iana.org/time-zones/repository/releases/tzdata2024a.tar.gz

Контрольная сумма MD5: 2349edd8335245525cc082f2755d5bf4

Udev-lfs Tarball (udev-lfs-20230818) - 10 KB:

Ссылка на загрузку: https://anduin.linuxfromscratch.org/LFS/udev-lfs-20230818.tar.xz

Контрольная сумма MD5: acd4360d8a5c3ef320b9db88d275dae6

Util-linux (2.39.3) - 8,327 KB:

Домашняя страница: https://git.kernel.org/pub/scm/utils/util-linux/util-linux.git/

Ссылка на загрузку: https://www.kernel.org/pub/linux/utils/util-linux/v2.39/util-linux-2.39.3.tar.xz

Контрольная сумма MD5: f3591e6970c017bb4bcd24ae762a98f5

Vim (9.1.0041) - 17,224 KB:

Домашняя страница: https://www.vim.org

Ссылка на загрузку: https://github.com/vim/vim/archive/v9.1.0041/vim-9.1.0041.tar.gz

Контрольная сумма MD5: 79dfe62be5d347b1325cbd5ce2a1f9b3

Примечание

Версия vim меняется ежедневно. Чтобы получить последнюю версию, перейдите на https://github.com/vim/vim/tags.

Wheel (0.42.0) - 97 KB:

Домашняя страница: https://pypi.org/project/wheel/

Ссылка на загрузку: https://pypi.org/packages/source/w/wheel/wheel-0.42.0.tar.gz

Контрольная сумма MD5: 802ad6e5f9336fcb1c76b7593f0cd22d

XML::Parser (2.47) - 276 KB:

Домашняя страница: https://github.com/chorny/XML-Parser

Ссылка на загрузку: https://cpan.metacpan.org/authors/id/T/TO/TODDR/XML-Parser-2.47.tar.gz

Контрольная сумма MD5: 89a8e82cfd2ad948b349c0a69c494463

Xz Utils (5.4.6) - 1,645 KB:

Домашняя страница: https://tukaani.org/xz

Ссылка на загрузку: https://github.com/tukaani-project/xz/releases/download/v5.4.6/xz-5.4.6.tar.xz

Контрольная сумма MD5: 7ade7bd1181a731328f875bec62a9377

Zlib (1.3.1) - 1,478 KB:

Домашняя страница: https://zlib.net/

Ссылка на загрузку: https://zlib.net/fossils/zlib-1.3.1.tar.gz

Контрольная сумма MD5: 9855b6d802d7fe5b7bd5b196a2271655

Zstd (1.5.5) - 2,314 KB:

Домашняя страница: https://facebook.github.io/zstd/

Ссылка на загрузку: https://github.com/facebook/zstd/releases/download/v1.5.5/zstd-1.5.5.tar.gz

Контрольная сумма MD5: 63251602329a106220e0a5ad26ba656f

Общий размер пакетов: примерно 506 MB

3.3. Необходимые патчи

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

Bash Upstream Fixes Patch - 5.9 KB:

Ссылка на загрузку: https://mirror.linuxfromscratch.ru/patches/lfs/12.1/bash-5.2.21-upstream_fixes-1.patch

Контрольная сумма MD5: 2d1691a629c558e894dbb78ee6bf34ef

Bzip2 Documentation Patch - 1.6 KB:

Ссылка на загрузку: https://mirror.linuxfromscratch.ru/patches/lfs/12.1/bzip2-1.0.8-install_docs-1.patch

Контрольная сумма MD5: 6a5ac7e89b791aae556de0f745916f7f

Coreutils Internationalization Fixes Patch - 166 KB:

Ссылка на загрузку: https://mirror.linuxfromscratch.ru/patches/lfs/12.1/coreutils-9.4-i18n-1.patch

Контрольная сумма MD5: cca7dc8c73147444e77bc45d210229bb

Glibc FHS Patch - 2.8 KB:

Ссылка на загрузку: https://mirror.linuxfromscratch.ru/patches/lfs/12.1/glibc-2.39-fhs-1.patch

Контрольная сумма MD5: 9a5997c3452909b1769918c759eff8a2

Kbd Backspace/Delete Fix Patch - 12 KB:

Ссылка на загрузку: https://mirror.linuxfromscratch.ru/patches/lfs/12.1/kbd-2.6.4-backspace-1.patch

Контрольная сумма MD5: f75cca16a38da6caa7d52151f7136895

Readline Upstream Fix Patch - 13 KB:

Ссылка на загрузку: https://mirror.linuxfromscratch.ru/patches/lfs/12.1/readline-8.2-upstream_fixes-3.patch

Контрольная сумма MD5: 9ed497b6cb8adcb8dbda9dee9ebce791

Sysvinit Consolidated Patch - 2.5 KB:

Ссылка на загрузку: https://mirror.linuxfromscratch.ru/patches/lfs/12.1/sysvinit-3.08-consolidated-1.patch

Контрольная сумма MD5: 17ffccbb8e18c39e8cedc32046f3a475

Общий размер этих патчей: примерно 203.8 KB

Помимо указанных выше обязательных исправлений, существует ряд необязательных патчей, созданных сообществом LFS. Эти необязательные исправления решают незначительные проблемы или включают функции, которые не включены по умолчанию. Не стесняйтесь просматривать базу данных исправлений, расположенную по адресу https://mirror.linuxfromscratch.ru/patches/downloads/, и применять патчи, необходимые вашей системе.

Глава 4. Заключительный этап подготовки

4.1. Введение

В этой главе мы выполним несколько дополнительных настроек для подготовки к сборке временной системы. Мы создадим несколько каталогов в $LFS (в котором установим временные инструменты), добавим непривилегированного пользователя и настроим окружение для этого пользователя. Кроме этого, будут даны пояснения по стандартной единице времени сборки, или «SBU», которую мы используем для измерения времени необходимого для сборки пакетов LFS, и предоставим некоторую информацию о наборах тестов.

4.2. Создание ограниченной иерархии папок в файловой системе LFS

В этом разделе мы начинаем заполнять файловую систему LFS элементами, которые будут основой конечной системы Linux. Первым шагом является создание ограниченной иерархии каталогов, чтобы программы, скомпилированные в Глава 6 (а также glibc и libstdc++ в Глава 5), могли быть установлены в их конечном расположении. Это необходимо для того, чтобы эти временные программы были перезаписаны при сборке окончательных версий в Глава 8.

Создайте необходимую иерархию каталогов, выполнив следующую команду от имени root:

mkdir -pv $LFS/{etc,var} $LFS/usr/{bin,lib,sbin}

for i in bin lib sbin; do
  ln -sv usr/$i $LFS/$i
done

case $(uname -m) in
  x86_64) mkdir -pv $LFS/lib64 ;;
esac
mkdir -pv $LFS/usr/lib32
ln -sv usr/lib32 $LFS/lib32

Программы в Глава 6 будут скомпилированы с помощью кросс-компилятора (более подробная информация приведена в разделе Технические примечания по сборочным инструментам). Чтобы отделить кросс-компилятор от других программ, он будет установлен в специальный каталог. Создайте этот каталог с помощью следующей команды:

mkdir -pv $LFS/tools

Примечание

Редакторы LFS намеренно решили не использовать каталог /usr/lib64. В процессе сборки предпринимается ряд шагов, чтобы убедиться, что набор инструментов не будет его использовать. Если по какой-либо причине этот каталог появится (это может произойти, если вы допустили ошибку, следуя инструкциям, или потому что вы установили бинарный пакет, создавший его после сборки LFS), это может привести к поломке вашей системы. Вы должны быть уверены, что этого каталога не существует.

4.3. Создание пользователя LFS

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

groupadd lfs
useradd -s /bin/bash -g lfs -m -k /dev/null lfs

Значение параметров командной строки:

-s /bin/bash

Устанавливает bash оболочкой по умолчанию для пользователя lfs.

-g lfs

Эта опция добавляет пользователя lfs в группу lfs.

-m

Создает домашний каталог для пользователя lfs.

-k /dev/null

Этот параметр предотвращает возможное копирование файлов из предустановленного набора каталогов (по умолчанию /etc/skel) путем изменения местоположения ввода на специальное null-устройство.

lfs

Это имя нового пользователя.

Если вы хотите войти в систему как lfs или переключиться на lfs из учетной записи непривилегированного пользователя (в отличие от переключения на пользователя lfs при входе в систему как root, для которого не требуется пароль пользователя lfs), вам необходимо установить пароль для lfs. Выполните следующую команду от имени пользователя root, чтобы установить пароль:

passwd lfs

Предоставьте пользователю lfs полный доступ ко всем каталогам в папке $LFS, назначив lfs владельцем:

chown -v lfs $LFS/{usr{,/*},lib,var,etc,bin,sbin,tools}
case $(uname -m) in
  x86_64) chown -v lfs $LFS/lib64 ;;
esac
chown -v lfs $LFS/lib32

Примечание

В некоторых хост-системах следующая команда не выполняется должным образом и приостанавливает вход пользователя lfs в фоновом режиме. Если подсказка "lfs:~$" не появляется сразу, ввод команды fg устранит проблему.

Затем запустите оболочку, работающую от имени пользователя lfs. Это можно сделать, войдя в систему как lfs на виртуальной консоли или с помощью следующей команды замены/переключения пользователя:

su - lfs

Аргумент «-» передает значение команде su для запуска оболочки входа в систему, а не обычной оболочки. Разница между этими двумя типами оболочек подробно описана в bash(1) и info bash.

4.4. Настройка окружения

Настроим хорошо работающее окружение, создав два новых файла запуска для оболочки bash. Войдя в систему как пользователь lfs, введите следующую команду, чтобы создать новый .bash_profile:

cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF

При входе в систему под учетной записью пользователя lfs или при переключении на lfs, используя команду su с опцией «-», начальная оболочка представляет собой оболочку login, которая читает данные из /etc/profile хоста (который, вероятно, содержит некоторые настройки и переменные среды), а затем .bash_profile. Команда exec env -i.../bin/bash в файле .bash_profile заменяет запущенную оболочку новой, не содержащей переменные среды, за исключением переменных HOME, TERM, и PS1. Это гарантирует, что никакие нежелательные и потенциально опасные переменные среды из хост-системы не попадут в среду сборки.

Новый экземпляр оболочки представляет собой non-login оболочку, которая не считывает и не выполняет содержимое файлов /etc/profile и .bash_profile, а вместо этого выполняет чтение из файла .bashrc. Создайте файл .bashrc:

cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=x86_64-lfs-linux-gnu
LFS_TGT32=i686-lfs-linux-gnu
LFS_TGTX32=x86_64-lfs-linux-gnux32
PATH=/usr/bin
if [ ! -L /bin ]; then PATH=/bin:$PATH; fi
PATH=$LFS/tools/bin:$PATH
CONFIG_SITE=$LFS/usr/share/config.site
export LFS LC_ALL LFS_TGT LFS_TGT32 LFS_TGTX32 PATH
EOF

Значение настроек в .bashrc

set +h

Команда set +h отключает хэш-функцию bash. Хеширование является полезной функцией —bash использует хеш-таблицу для запоминания полного пути к исполняемому файлу, чтобы избежать многократного поиска одного и того же исполняемого файла в переменной окружения PATH. Однако новые инструменты требуется использовать сразу же после их установки. Отключение хэш-функции, заставляет оболочку искать переменную окружения PATH, всякий раз, когда программу необходимо запустить. Таким образом, оболочка найдет вновь скомпилированные инструменты в $LFS/tools/bin, как только они станут доступны, не запоминая предыдущую версию той же программы, предоставленную хост-дистрибутивом, в /usr/bin или /bin.

umask 022

Установка значения пользовательской маски создания файлов (umask) 022 гарантирует, что вновь созданные файлы и каталоги доступны для записи только их владельцу, но будут доступны для чтения и выполнения остальным пользователям (при условии, что системный вызов open(2) использует режимы по умолчанию, новые файлы получат разрешения 644, а каталоги 755).

LFS=/mnt/lfs

Переменная окружения LFS должна указывать на выбранную точку монтирования.

LC_ALL=POSIX

Переменная LC_ALL управляет локализацией определенных программ, и формирует сообщения в соответствии с локализацией указанной страны. Установка в LC_ALL значения «POSIX» или «C» (они эквивалентны) гарантирует, что все будет работать должным образом в среде кросс-компиляции.

LFS_TGT=$(uname -m)-lfs-linux-gnu

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

PATH=/usr/bin

Многие современные дистрибутивы Linux объединили /bin и /usr/bin. В этом случае стандартной переменной PATH необходимо установить значение /usr/bin/ для окружения из Глава 6. Когда это не так, следующая строка добавит /bin к пути.

if [ ! -L /bin ]; then PATH=/bin:$PATH; fi

Если /bin не является символической ссылкой, то его необходимо добавить в переменную PATH.

PATH=$LFS/tools/bin:$PATH

Поместив $LFS/tools/bin перед стандартным PATH, кросс-компилятор, установленный в начале Глава 5, будет обнаружен оболочкой сразу после его установки. Это, в сочетании с отключением хеширования, ограничивает риск использования компилятора хоста вместо кросс-компилятора.

CONFIG_SITE=$LFS/usr/share/config.site

В Глава 5 и Глава 6, если эта переменная не задана, сценарии configure могут попытаться загрузить элементы конфигурации, специфичные для некоторых дистрибутивов, из /usr/share/config.site в хост-системе. Переопределите её, чтобы предотвратить потенциальное влияние хоста.

export ...

Приведенные выше команды установили некоторые переменные, чтобы сделать их видимыми в любых вложенных оболочках, мы экспортируем их.

Важно

Некоторые коммерческие дистрибутивы добавляют недокументированный экземпляр /etc/bash.bashrc для инициализации bash. Этот файл потенциально может изменить среду пользователя lfs таким образом, что это может повлиять на сборку важных пакетов LFS. Чтобы убедиться, что пользовательская среда lfs чиста, проверьте наличие файла /etc/bash.bashrc и, если он есть, переименуйте его. От имени пользователя root, запустите:

[ ! -e /etc/bash.bashrc ] || mv -v /etc/bash.bashrc /etc/bash.bashrc.NOUSE

Когда пользователь lfs больше не нужен (в начале Глава 7 ) вы можете безопасно восстановить /etc/bash.bashrc (по желанию).

Обратите внимание, что пакет LFS Bash, который мы создадим в Раздел 8.36, «Bash-5.2.21», не настроен на загрузку или выполнение /etc/bash.bashrc, поэтому этот файл бесполезен в готовой системе LFS.

Для многих современных систем с несколькими процессорами (или ядрами) время компиляции пакета можно сократить, выполнив «параллельную сборку», либо установив переменную среды, либо сообщив программе make, сколько ядер задействовать для сборки. Например, процессор Intel Core i9-13900K имеет 8 ядер P (производительность) и 16 ядер E (энергоэффективность), ядро P может одновременно запускать два потока, поэтому каждое ядро P моделируется ядром Linux как два логических ядра. В результате получается 32 логических ядра. Очевидный способ задействовать все эти логические ядра - разрешить make создавать до 32 заданий сборки. Это можно сделать, передав параметр -j32 команде make:

make -j32

Или установите переменную окружения MAKEFLAGS, и ее содержимое будет автоматически использоваться make в качестве параметров командной строки:

export MAKEFLAGS=-j32

Важно

Никогда не передавайте параметр -j без номера в make и не устанавливайте такой параметр в MAKEFLAGS. Иначе make будет создавать бесконечные задания сборки, что вызовет проблемы со стабильностью системы.

Чтобы использовать все логические ядра, доступные для сборки пакетов в Глава 5 и Глава 6, укажите параметр MAKEFLAGS в .bashrc сейчас:

cat >> ~/.bashrc << "EOF"
export MAKEFLAGS=-j$(nproc)
EOF

Замените $(nproc) количеством логических ядер, которые вы хотите использовать, если вы планируете использовать не все логические ядра.

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

source ~/.bash_profile

4.5. О SBU (Стандартная единица времени сборки)

Многие люди хотели бы знать заранее, сколько примерно времени потребуется для компиляции и установки каждого пакета. Поскольку Linux From Scratch может быть собран на различных системах, невозможно дать точную оценку времени. Сборка самого большого пакета (gcc) займет около 5 минут на быстрых системах, но может занять несколько дней на более медленных компьютерах! Вместо фактического времени в книге используется показатель "стандартная единица времени сборки" (SBU).

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

Например, рассмотрим пакет, время компиляции которого составляет 4,5 SBU. Это означает, что если вашей системе потребовалось 10 минут для компиляции и сборки первого прохода binutils, то для сборки этого пакета потребуется примерно 45 минут. К счастью, в большинстве случаев, время сборки меньше, чем у binutils.

В целом, величина SBU не совсем точна, поскольку она зависит от многих факторов, включая версию GCC хост-системы. Она приведены здесь, чтобы дать оценку того, сколько времени может потребоваться для сборки пакета, но в некоторых случаях цифры могут отличаться на десятки минут.

Примечание

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

Представленные здесь значения времени основаны на замерах при использовании четырех ядер (-j4). Время, указанное в главе 8, также включает время выполнения регрессионных тестов для пакета, если не указано иное.

4.6. О наборах тестов

Большинство пакетов предоставляют набор тестов. Запуск набора тестов для только что собранного пакета — хорошая идея, потому что он может обеспечить «проверку работоспособности», указывающую, что все скомпилировано правильно. Набор тестов, который проходит свой набор проверок, обычно доказывает, что пакет работает так, как задумал разработчик. Однако это не гарантирует, что пакет полностью без ошибок.

Некоторые наборы тестов более важны, чем другие. Например, наборы тестов для основных инструментов — GCC, binutils и glibc — имеют первостепенное значение из-за их центральной роли в правильно функционирующей системе. Выполнение наборов тестов для GCC и glibc может занять очень много времени, особенно на медленном оборудовании, но их выполнение настоятельно рекомендуется.

Примечание

Запуск наборов тестов, описанных в Глава 5 и Глава 6, не имеет смысла, поскольку программы компилируются с помощью кросс-компилятора, они, вероятно, не могут работать на хосте сборки.

Распространенной проблемой при запуске наборов тестов для binutils и GCC является нехватка псевдотерминалов (PTY). Это может привести к большому количеству неудачных тестов. Причин может быть несколько, но наиболее вероятная причина заключается в том, что в хост-системе неправильно настроена файловая система devpts. Этот вопрос более подробно обсуждается на странице https://mirror.linuxfromscratch.ru/lfs/faq.html#no-ptys.

Иногда наборы тестов не работают, по причинам, о которых знают разработчики и которые они считают некритичными. Просмотрите журналы, расположенные по адресу https://mirror.linuxfromscratch.ru/lfs/build-logs/12.1/, чтобы проверить, ожидаются ли сбои. Этот сайт актуален для всех наборов тестов, описанных в книге.

Часть III. Сборка кросс-компилятора и набора временных инструментов

Важный предварительный материал

Введение

Эта часть разделена на три этапа: во-первых, сборка кросс-компилятора и связанных с ним библиотек; во-вторых, использование этого набора инструментов для сборки нескольких утилит таким образом, чтобы изолировать их от основного дистрибутива; в-третьих, вход в среду chroot (что ещё больше улучшает изоляцию от хоста), и сборка оставшихся инструментов, необходимых для создания конечной системы.

Важно

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

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

Технические примечания по сборочным инструментам

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

Основная задача Глава 5 и Глава 6 состоит в том, чтобы создать временную область, содержащую заведомо исправный набор инструментов, которые можно изолировать от хост-системы. Использовании команды chroot в последующих главах, обеспечит чистую и безотказную сборку целевой системы LFS. Процесс сборки разработан таким образом, чтобы свести к минимуму риски для новых читателей и в то же время обеспечить наибольшую образовательную ценность.

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

О кросс-компиляции

Примечание

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

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

Давайте определим некоторые термины, используемые в этом контексте.

сборщик

это машина, на которой мы собираем программы. Обратите внимание, что этот компьютер упоминается как «хост» в других разделах.

хост

это машина/система, на которой будут выполняться встроенные программы. Обратите внимание, что используемое здесь значение слова «хост» отличается от того, которое применяется в других разделах.

цель

используется только для компиляторов. Это машина, для которой компилятор создает код. Он может отличаться как от «сборщика», так и от «хоста».

В качестве примера представим следующий сценарий (иногда называемый «канадским крестом»): у нас есть компилятор на медленной машине, назовем ее машиной A и компилятор ccA. У нас также есть быстрая машина (B), но без компилятора, и мы хотим создать код для другой медленной машины (C). Чтобы собрать компилятор для машины C, у нас будет три этапа:

Этап Сборщик Хост Цель Действие
1 A A B Сборка кросс-компилятора cc1 с использованием ccA на машине A
2 A B C Сборка кросс-компилятора cc2 с использованием cc1 на машине A
3 B C C Сборка компилятора ccC с использованием cc2 на машине B

Затем все другие программы, необходимые для машины C, могут быть скомпилированы с помощью cc2 на быстрой машине B. Обратите внимание, что до тех пор, пока B не может запускать программы, собранные для C, нет способа протестировать программы, пока не будет запущена сама машина C. Например, чтобы запустить набор тестов на ccC мы можем добавить четвертый этап:

Этап Сборщик Хост Цель Действие
4 C C C Пересобрать и протестировать ccC, используя ccC на машине C

В приведенном выше примере только cc1 и cc2 являются кросс-компиляторами, то есть они создают код для машины, отличной от той, на которой они выполняются. Компиляторы ccA и ccC создают код для машины, на которой они выполняются. Такие компиляторы называются нативными компиляторами.

Реализация кросс-компиляции для LFS

Примечание

Все кросс-компилируемые пакеты в этой книге используют систему сборки на основе autoconf. Система сборки на основе autoconf принимает типы систем вида cpu-vendor-kernel-os, называемые системным триплетом. Поскольку поле vendor часто не содержит значения, autoconf позволяет вам опустить его.

Проницательный читатель может задаться вопросом, почему название «триплет» применяется к имени из четырех компонентов. Поле kernel и поле os ранее применялись как единый элемент: «system». Такая форма с тремя полями все еще актуальна для некоторых систем, например, x86_64-unknown-freebsd. Но две системы могут использовать одно и то же ядро и все же быть слишком разными, чтобы использовать одинаковый триплет для их описания. Например, Android, работающий на мобильном телефоне полностью отличается от Ubuntu, работающей на ARM64 сервере, хотя они оба работают на одном и том же типе процессора (ARM64) и с одним ядром (Linux).

Без слоя эмуляции вы не сможете запустить исполняемый файл c сервера на мобильном телефоне и наоборот. Итак, поле «system» было разделено на поля kernel и os, чтобы однозначно их интерпретировать. В нашем примере Android обозначается как aarch64-unknown-linux-android, а Ubuntu aarch64-unknown-linux-gnu.

Слово «триплет» сохранилось в лексиконе. Простой способ определить триплет вашей машины — запустить скрипт config.guess, который входит в исходный код многих пакетов. Распакуйте исходники binutils и запустите скрипт: ./config.guess, обратите внимание на вывод. Например, для 32-разрядного процессора Intel вывод будет i686-pc-linux-gnu. В 64-битной системе это будет x86_64-pc-linux-gnu. В большинстве систем Linux используют еще более простую команду gcc -dumpmachine, которая предоставит вам аналогичную информацию.

Вы также должны знать имя динамического компоновщика платформы, часто называемого динамическим загрузчиком (не путать со стандартным компоновщиком ld, который является частью binutils). Динамический компоновщик, предоставляемый glibc, находит и загружает общие библиотеки, необходимые программе, подготавливает программу к запуску, а затем запускает ее. Имя динамического компоновщика для 32-разрядной машины Intel — ld-linux.so.2, а для 64-разрядных систем — ld-linux-x86-64.so.2. Надежный способ определить имя динамического компоновщика — проверить случайный двоичный файл из хост-системы, выполнив следующую команду: readelf -l <имя исполняемого файла> | grep interpreter и зафиксировать результат. Официальный источник, охватывающий все платформы, находится в файле shlib-versions в корне дерева исходного кода glibc.

Чтобы сымитировать кросс-компиляцию в LFS, имя триплета хоста немного подкорректировали, изменив поле "vendor" в переменной LFS_TGT таким образом, чтобы оно указывало "lfs". Мы также используем параметр --with-sysroot при сборке кросс-компоновщика и кросс-компилятора, чтобы сообщить им, где найти необходимые файлы хоста. Это гарантирует, что ни одна из программ, входящих в Глава 6, не сможет ссылаться на библиотеки на машине сборки. Для корректной работы, обязательны всего два этапа, еще один рекомендуется для тестирования:

Этап Сборщик Хост Цель Действие
1 ПК ПК LFS Сборка кросс-компилятора cc1 с использованием cc-pc на ПК
2 ПК LFS LFS Сборка компилятора cc-lfs с использованием cc1 на ПК
3 LFS LFS LFS Пересборка и тестирование cc-lfs, используя cc-lfs в lfs

В приведенной выше таблице «ПК» означает, что команды выполняются на компьютере с использованием уже установленного дистрибутива. «В lfs» означает, что команды выполняются в chroot-окружении.

Это еще не конец истории. Язык С - это не просто компилятор; также он определяет стандартную библиотеку. В этой книге используется библиотека GNU C под названием glibc (есть альтернативный вариант - "musl"). Эта библиотека должна быть скомпилирована для машины lfs, то есть с использованием кросс-компилятора cc1. Но сам компилятор использует внутреннюю библиотеку, реализующую сложные инструкции, недоступные в наборе инструкций ассемблера. Эта внутренняя библиотека называется libgcc, и для полноценной работы ее необходимо связать с библиотекой glibc! Кроме того, стандартная библиотека для C++ (libstdc++) также должна быть связана с glibc. Решение этой проблемы курицы и яйца состоит в том, чтобы сначала собрать деградированную libgcc на основе cc1, в которой отсутствуют некоторые функциональные возможности, такие как потоки и обработка исключений, затем собрать glibc с использованием этого деградированного компилятора (сама glibc не деградирована), а затем собрать libstdc++. В этой последней библиотеке будет не хватать некоторых функциональных возможностей libgcc.

Выводом из предыдущего абзаца является то, что cc1 не может собрать полнофункциональную libstdc++ с деградированной libgcc, но это единственный компилятор, доступный для сборки библиотек C/C++ на этапе 2. Есть две причины, по которым мы не используем сразу компилятор cc-lfs, собранный на этапе 2, для сборки этих библиотек.

  • Вообще говоря, cc-lfs не может работать на ПК (хост-системе). Хотя триплеты для ПК и LFS совместимы друг с другом, исполняемый файл для lfs должен зависеть от glibc-2.39; хост-дистрибутив может использовать либо другую реализацию libc (например, musl), либо предыдущий выпуск glibc (например, glibc-2.13).

  • Даже если cc-lfs может работать на ПК, его использование на ПК сопряжено с риском привязки к библиотекам ПК, так как cc-lfs является родным компилятором.

Поэтому, когда мы собираем gcc этап 2, мы даем указание системе сборки пересобрать libgcc и libstdc++ с помощью cc1, но мы связываем libstdc++ с новой пересобранной libgcc вместо старой, деградированной. Это делает пересобранную библиотеку libstdc++ полностью функциональной.

В Глава 8 (или «этап 3») собраны все пакеты, необходимые для системы LFS. Даже если пакет уже был установлен в системе LFS в предыдущей главе, мы все равно пересобираем пакет. Основная причина пересборки этих пакетов состоит в том, чтобы сделать их стабильными: если мы переустанавливаем пакет LFS в готовой системе LFS, содержимое пакета должно совпадать с содержимым того же пакета при первой установке в Глава 8. Временные пакеты, установленные в Глава 6 или Глава 7 не могут удовлетворять этому требованию, потому что некоторые из них собраны без необязательных зависимостей и autoconf не может выполнить некоторые проверки функций в Глава 6 из-за кросс-компиляции, в результате чего во временных пакетах отсутствуют дополнительные функции или используются не оптимальные процедуры кода. Кроме того, второстепенной причиной для пересборки пакетов является выполнение тестов.

Другие детали процесса

Кросс-компилятор будет установлен в отдельный каталог $LFS/tools, так как он не будет частью конечной системы.

Сначала устанавливается Binutils, потому что во время выполнения команды configure gcc и glibc выполняются различные тесты функций на ассемблере и компоновщике, чтобы определить, какие программные функции следует включить или отключить. Это важнее, чем может показаться на первый взгляд. Неправильно настроенный gcc или glibc может привести к незначительной поломке сборочных инструментов, где последствия такой поломки могут проявиться ближе к концу сборки всего дистрибутива. Сбой тестов обычно выявляет эту ошибку до того, как будет выполнено много дополнительной работы.

Binutils устанавливает свой ассемблер и компоновщик в двух местах: $LFS/tools/bin и $LFS/tools/$LFS_TGT/bin. Инструменты в одном месте жестко связаны с другими. Важным аспектом компоновщика является порядок поиска в библиотеке. Подробную информацию можно получить от ld, передав ей флаг --verbose. Например, $LFS_TGT-ld --verbose | grep SEARCH покажет текущие пути поиска и их порядок. Он показывает, какие файлы связаны с помощью ld, путем компиляции фиктивной программы и передачи параметра --verbose компоновщику. Например, $LFS_TGT-gcc dummy.c -Wl,--verbose 2>&1 | grep succeeded покажет все файлы, успешно открытые во время компоновки.

Следующий устанавливаемый пакет — gcc. Пример того, что можно увидеть во время запуска configure:

checking what assembler to use... /mnt/lfs/tools/i686-lfs-linux-gnu/bin/as
checking what linker to use... /mnt/lfs/tools/i686-lfs-linux-gnu/bin/ld

Это важно по причинам, упомянутым выше. Также здесь демонстрируется, что сценарий настройки gcc не просматривает значения переменной PATH, чтобы найти, какие инструменты использовать. Однако во время фактической работы самого gcc не обязательно используются одни и те же пути поиска. Чтобы узнать, какой стандартный компоновщик будет использовать gcc, запустите: $LFS_TGT-gcc -print-prog-name=ld.

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

Далее устанавливаются очищенные заголовочные файлы Linux API. Они позволяют стандартной библиотеке C (Glibc) взаимодействовать с функциями, предоставляемыми ядром Linux.

Следующий устанавливаемый пакет — glibc. Наиболее важными при сборке glibc являются компилятор, бинарные инструменты и заголовочные файлы ядра. С компилятором, как правило, не бывает проблем, поскольку glibc всегда будет использовать компилятор, указанный в параметре --host, переданный скрипту configure; например, в нашем случае компилятором будет $LFS_TGT-gcc. С бинарными инструментами и заголовки ядра может быть немного сложнее. Поэтому мы не рискуем и используем доступные параметры конфигурации, чтобы обеспечить правильный выбор. После запуска configure проверьте содержимое файла config.make в каталоге сборки на наличие всех важных деталей. Обратите внимание на использование опции CC="$LFS_TGT-gcc" (с переменной $LFS_TGT) для управления используемыми бинарными инструментами и использование флагов -nostdinc и -isystem для управления включаемым путем поиска компилятора. Эти пункты подчеркивают важный аспект пакета glibc — он очень самодостаточен с точки зрения своего механизма сборки и, как правило, не полагается на значения по умолчанию.

Как было сказано выше, затем компилируется стандартная библиотека C++, а затем в Глава 6 все остальные программы, которым необходимо разрешить проблему циклических зависимостей во время сборки. На этапе установки всех этих пакетов используется переменная DESTDIR, для принудительной установки в файловую систему LFS.

В конце Глава 6 устанавливается собственный компилятор lfs. Сначала собирается binutils с той же переменной DESTDIR, что и другие программы, затем повторно собирается gcc, без сборки некоторых некритических библиотек. Из-за какой-то странной логики в сценарии настройки GCC CC_FOR_TARGET заканчивается как cc, когда хост совпадает с целью, но отличается от системы сборки. Поэтому значение CC_FOR_TARGET=$LFS_TGT-gcc явно указывается в параметрах конфигурации.

После входа в среду chroot в Глава 7 первой задачей является установка libstdc++. Затем выполняется установка временных программ, необходимых для правильной работы тулчейна. С этого момента основной набор инструментов является самодостаточным и автономным. В Глава 8 собираются, тестируются и устанавливаются окончательные версии всех пакетов, необходимых для полнофункциональной системы.

Общие инструкции по компиляции

Внимание

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

При сборке пакетов в инструкциях делается несколько допущений:

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

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

  • Проверьте в последний раз, что переменная среды LFS настроена правильно:

    echo $LFS

    Убедитесь, что в выводе указан путь к точке монтирования раздела LFS, то есть /mnt/lfs, как в примере из этой книги.

  • Наконец, необходимо подчеркнуть два важных момента:

    Важно

    Инструкции по сборке предполагают, что все Требования к хост-системе, включая символические ссылки, установлены правильно:

    • bash это используемая оболочка.

    • sh это символическая ссылка на bash.

    • /usr/bin/awk это символическая ссылка на gawk.

    • /usr/bin/yacc это символическая ссылка на bison или небольшой скрипт, который выполняет bison

    Важно

    Вот краткое описание процесса сборки:

    1. Поместите все исходники и патчи в каталог, который будет доступен из среды chroot, например, /mnt/lfs/sources/.

    2. Перейдите в каталог /mnt/lfs/sources/.

    3. Для каждого пакета:

      1. С помощью программы tar извлеките пакет для сборки. В Глава 5 и Глава 6 убедитесь, что при извлечении пакета вы залогинены под пользователем lfs.

        Не используйте никаких методов, кроме команды tar, для извлечения исходного кода. Примечательно, что использование команды cp -R для копирования дерева исходного кода в другое место может привести к уничтожению ссылок и меток времени в дереве исходного кода и привести к сбою сборки.

      2. Перейдите в каталог, созданный при извлечении пакета.

      3. Следуйте инструкциям по сборке пакета.

      4. Вернитесь в исходный каталог, когда сборка будет завершена.

      5. Удалите извлеченный каталог, если не указано иное.

Глава 5. Сборка кросс-тулчейна

5.1. Введение

В этой главе дано описание, как создать кросс-компилятор и связанные с ним инструменты. Несмотря на то, что на данном этапе кросс-компиляция имитируется, принципы его работы те же, что и для настоящего кросс-тулчейна.

Программы, скомпилированные в этой главе, будут установлены в каталог $LFS/tools, чтобы они были отделены от файлов, установленных в следующих главах. Библиотеки, же, устанавливаются на свое постоянное место, поскольку они относятся к системе, которую мы хотим создать.

5.2. Binutils-2.42 - Проход 1

Пакет Binutils содержит компоновщик, ассемблер и другие инструменты для работы с объектными файлами.

Приблизительное время сборки: 1 SBU
Требуемое дисковое пространство: 663 MB

5.2.1. Установка кросс-пакета Binutils

Примечание

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

Очень важно, чтобы Binutils был скомпилированным первым, потому что и Glibc, и GCC выполняют различные тесты на доступных компоновщике и ассемблере, чтобы определить, какие из их функций следует включить.

В документации пакета Binutils рекомендуется выполнять сборку в отдельном каталоге, создадим его:

mkdir -v build
cd       build

Примечание

Для того, чтобы значения SBU, перечисленные в остальной части книги, были вам полезны, измерьте время, необходимое для сборки этого пакета, начиная с настройки и заканчивая установкой. Чтобы добиться этого, оберните команды сборки командой time: time { ../configure ... && make && make install; }.

Теперь подготовьте Binutils к компиляции:

../configure --prefix=$LFS/tools       \
             --with-sysroot=$LFS \
             --target=$LFS_TGT   \
             --disable-nls       \
             --enable-gprofng=no \
             --disable-werror    \
             --enable-default-hash-style=gnu \
             --enable-multilib

Значение параметров настройки:

--prefix=$LFS/tools

Указывает сценарию configure подготовить к установке пакет Binutils в каталог $LFS/tools.

--with-sysroot=$LFS

Для кросс-компляции указывает системе сборки искать в $LFS библиотеки целевой системы, если необходимо.

--target=$LFS_TGT

Поскольку название машины в значении переменной LFS_TGT может отличаться от значения, которое возвращает сценарий config.guess, этот аргумент укажет сценарию configure как настроить систему сборки пакета Binutils для создания кросс-компоновщика.

--disable-nls

Этот параметр отключает интернационализацию, так как i18n не требуется для временных инструментов.

--enable-gprofng=no

Этот параметр отключает сборку gprofng, который не нужен для временного инструментария.

--disable-werror

Этот параметр предотвращает остановку сборки в случае появления предупреждений от компилятора хоста.

--enable-default-hash-style=gnu

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

--enable-multilib

Включает поддержку multilib.

Скомпилируйте пакет:

make

Установите пакет:

make install

Подробная информация об этом пакете находится в Раздел 8.19.2, «Содержимое пакета Binutils.»

5.3. GCC-13.2.0 - Проход 1

Пакет GCC содержит коллекцию компиляторов GNU, которая включает компиляторы C и C++.

Приблизительное время сборки: 3.8 SBU
Требуемое дисковое пространство: 4.1 GB

5.3.1. Установка кросс-пакета GCC

Для GCC требуются пакеты GMP, MPFR и MPC. Поскольку эти пакеты могут отсутствовать в дистрибутиве вашего хоста, они будут собраны с помощью GCC. Распакуйте каждый пакет в исходный каталог GCC и переименуйте получившиеся каталоги, чтобы процедуры сборки GCC использовали их автоматически:

Примечание

В этой главе часто возникают недоразумения, хотя применяются те же процедуры, что и в любой другой главе, следуйте инструкции которую получили ранее (Инструкции по сборке пакетов). Сначала распакуйте пакет gcc-13.2.0 из архива, а затем перейдите в созданный каталог. Только после этого следует приступить к приведенным ниже инструкциям.

tar -xf ../mpfr-4.2.1.tar.xz
mv -v mpfr-4.2.1 mpfr
tar -xf ../gmp-6.3.0.tar.xz
mv -v gmp-6.3.0 gmp
tar -xf ../mpc-1.3.1.tar.gz
mv -v mpc-1.3.1 mpc

Измените имя каталога по умолчанию для библиотек:

sed -e '/m64=/s/lib64/lib/' \
    -e '/m32=/s/m32=.*/m32=..\/lib32$(call if_multiarch,:i386-linux-gnu)/' \
    -i.orig gcc/config/i386/t-linux64

В документации к GCC рекомендуется собирать GCC в отдельном каталоге:

mkdir -v build
cd       build

Подготовьте GCC к компиляции:

mlist=m64,m32
../configure                  \
    --target=$LFS_TGT                              \
    --prefix=$LFS/tools                            \
    --with-glibc-version=2.39                      \
    --with-sysroot=$LFS                            \
    --with-newlib                                  \
    --without-headers                              \
    --enable-default-pie                           \
    --enable-default-ssp                           \
    --enable-initfini-array                        \
    --disable-nls                                  \
    --disable-shared                               \
    --enable-multilib --with-multilib-list=$mlist  \
    --disable-decimal-float                        \
    --disable-threads                              \
    --disable-libatomic                            \
    --disable-libgomp                              \
    --disable-libquadmath                          \
    --disable-libssp                               \
    --disable-libvtv                               \
    --disable-libstdcxx                            \
    --enable-languages=c,c++

Значение параметров настройки:

--with-glibc-version=2.39

Этот параметр указывает версию Glibc, которая будет использоваться на целевой системе. Он не имеет отношения к libc хост-дистрибутива, потому что все, скомпилированное в этом разделе, будет выполняться в среде chroot, которая изолирована от libc хост-дистрибутива.

--with-newlib

Поскольку работающая библиотека C еще недоступна, это гарантирует, что константа inhibit_libc будет определена при сборке libgcc. Это предотвращает компиляцию любого кода, требующего поддержки libc.

--without-headers

При создании полного кросс-компилятора GCC требует наличия стандартных заголовков, совместимых с целевой системой. Для наших целей эти заголовки не понадобятся. Этот параметр предотвращает их поиск GCC.

--enable-default-pie и --enable-default-ssp

Эти параметры позволяют GCC по умолчанию компилировать программы с некоторые функциями усиливающими безопасность (более подробная информация о них приведена в примечание о PIE и SSP в Главе 8). На данном этапе это не является строго обязательным, поскольку компилятор будет создавать только временные исполняемые файлы. Но лучше, чтобы временные пакеты были максимально приближены к тем, что будут в готовой системе LFS.

--disable-shared

Этот параметр заставляет GCC статически связывать свои внутренние библиотеки. Он необходим потому что общие библиотеки требуют Glibc, который еще не установлен в целевой системе.

--enable-multilib --with-multilib-list=...

LFS можно использовать с поддержкой multilib для архитектур которые указаны в списке with-multilib-list.

--disable-threads, --disable-libatomic, --disable-libgomp, --disable-libquadmath, --disable-libssp, --disable-libvtv, --disable-libstdcxx

Эти аргументы отключают поддержку расширений для работы с многопоточностью, libatomic, libgomp, libquadmath, libssp, libvtv и стандартной библиотеки C++ соответственно. Эти функции могут не скомпилироваться при сборке кросс-компилятора и не нужны для задач кросс-компиляции временной libc

--enable-languages=c,c++

Этот параметр обеспечивает сборку только компиляторов C и C++. Это единственные языки, которые нужны сейчас.

Скомпилируйте GCC, выполнив:

make

Установите пакет:

make install

Во время сборки GCC установил пару внутренних системных заголовочных файлов. Обычно один из файлов limits.h, включает соответствующие системные ограничения limits.h, в данном случае $LFS/usr/include/limits.h. Однако во время сборки GCC $LFS/usr/include/limits.h не существует, поэтому только что установленный внутренний заголовочный файл является частичным, автономным файлом и не включает расширенные функции системного файла. Этого достаточно для сборки Glibc, но полный внутренний заголовочный файл понадобится позже. Создайте полную версию внутреннего заголовочного файла с помощью команды, идентичной той, что система сборки GCC использует обычно:

Примечание

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

cd ..
cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
  `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include/limits.h

Подробная информация об этом пакете находится в Раздел 8.29.2, «Содержимое пакета GCC.»

5.4. Заголовочные файлы Linux-6.7.4 API

Заголовочные файлы Linux API (в linux-6.7.4.tar.xz) предоставляют API ядра для использования Glibc.

Приблизительное время сборки: менее 0.1 SBU
Требуемое дисковое пространство: 1.5 GB

5.4.1. Установка заголовочных файлов

Ядро Linux должно предоставлять интерфейс прикладного программирования (API) для использования системной библиотекой C (Glibc в LFS). Это делается путем установки заголовочных файлов C, которые поставляются в архиве с исходным кодом ядра Linux.

Убедитесь, что в пакете нет устаревших файлов:

make mrproper

Теперь извлеките видимые пользователю заголовочные файлы ядра из исходного кода. Рекомендуемый способ make «headers_install» использовать нельзя, так как для этого требуется rsync, который может быть недоступен. Заголовочные файлы сначала помещаются в /usr, а затем копируются в нужное место.

make headers
find usr/include -type f ! -name '*.h' -delete
cp -rv usr/include $LFS/usr

5.4.2. Содержимое заголовочных файлов Linux API

Установленные заголовочные файлы:: /usr/include/asm/*.h, /usr/include/asm-generic/*.h, /usr/include/drm/*.h, /usr/include/linux/*.h, /usr/include/misc/*.h, /usr/include/mtd/*.h, /usr/include/rdma/*.h, /usr/include/scsi/*.h, /usr/include/sound/*.h, /usr/include/video/*.h, and /usr/include/xen/*.h
Созданные каталоги:: /usr/include/asm, /usr/include/asm-generic, /usr/include/drm, /usr/include/linux, /usr/include/misc, /usr/include/mtd, /usr/include/rdma, /usr/include/scsi, /usr/include/sound, /usr/include/video, and /usr/include/xen

Краткое описание

/usr/include/asm/*.h

Заголовочные файлы Linux API ASM

/usr/include/asm-generic/*.h

Заголовочные файлы Linux API ASM Generic

/usr/include/drm/*.h

Заголовочные файлы Linux API DRM

/usr/include/linux/*.h

Заголовочные файлы Linux API Linux

/usr/include/misc/*.h

Заголовочные файлы Linux API Miscellaneous

/usr/include/mtd/*.h

Заголовочные файлы API MTD

/usr/include/rdma/*.h

Заголовочные файлы Linux API RDMA

/usr/include/scsi/*.h

Заголовочные файлы Linux API SCSI

/usr/include/sound/*.h

Заголовочные файлы Linux API Sound

/usr/include/video/*.h

Заголовочные файлы Linux API Video

/usr/include/xen/*.h

Заголовочные файлы Linux API Xen

5.5. Glibc-2.39

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

Приблизительное время сборки: 1.5 SBU
Требуемое дисковое пространство: 846 MB

5.5.1. Установка пакета Glibc

Во-первых, создайте символическую ссылку для соответствия требованиям LSB. Кроме того, для совместимости с x86_64 создайте символическую ссылку, необходимую для правильной работы загрузчика динамической библиотеки:

ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64
ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64/ld-lsb-x86-64.so.3

Примечание

Приведенная выше команда верна. Команда ln имеет несколько вариантов синтаксиса, поэтому обязательно ознакомьтесь с info coreutils ln и ln(1), прежде чем сообщать об ошибке.

Некоторые программы, использующие Glibc, применяют несовместимый с FHS каталог /var/db для хранения своих данных времени выполнения. Установите следующий патч, чтобы такие программы хранили свои данные в местах, совместимых с FHS:

patch -Np1 -i ../glibc-2.39-fhs-1.patch

В документации к Glibc рекомендуется собирать Glibc в отдельном каталоге:

mkdir -v build
cd       build

Убедитесь, что утилиты ldconfig and sln установлены в /usr/sbin:

echo "rootsbindir=/usr/sbin" > configparms

Затем подготовьте Glibc к компиляции:

../configure                             \
      --prefix=/usr                      \
      --host=$LFS_TGT                    \
      --build=$(../scripts/config.guess) \
      --enable-kernel=4.19                \
      --with-headers=$LFS/usr/include    \
      --disable-nscd                     \
      --enable-multi-arch                \
      libc_cv_slibdir=/usr/lib

Значение параметров настройки:

--host=$LFS_TGT, --build=$(../scripts/config.guess)

Комбинация этих опций указывает на то, что система сборки Glibc настраивается на кросс-компиляцию с использованием кросс-компоновщика и кросс-компилятора в $LFS/tools.

--enable-kernel=4.19

Этот параметр позволяет Glibc выполнять компиляцию библиотеки с поддержкой ядра 4.19 и более поздних версий. Поддержка более старых ядер не включена.

--with-headers=$LFS/usr/include

Этот аргумент позволяет скомпилировать библиотеку с заголовочными файлами, недавно установленными в каталоге $LFS/usr/include, таким образом, пакету будет известно, какие функции есть у ядра, чтобы оптимизировать себя.

libc_cv_slibdir=/usr/lib

Этот аргумент гарантирует, что библиотека будет установлена в /usr/lib вместо стандартного /lib64 на 64-битных машинах.

--disable-nscd

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

На этом этапе может появиться следующее предупреждение:

configure: WARNING:
*** These auxiliary programs are missing or
*** incompatible versions: msgfmt
*** some features will be disabled.
*** Check the INSTALL file for required versions.

Отсутствующая или несовместимая программа msgfmt, как правило, безвредна. msgfmt является частью пакета Gettext, который должен предоставлять хост-дистрибутив.

Примечание

Поступали сообщения о том, что этот пакет может не компилироваться при «параллельной сборке». Если это произойдет, повторно запустите команду make с параметром -j1.

Скомпилируйте пакет:

make

Установите пакет:

Предупреждение

Если переменная LFS настроена неправильно, и, несмотря на рекомендации, вы выполняете сборку от имени пользователя root, следующая команда установит только что собранный Glibc в вашу хост-систему, что, скорее всего, сделает её непригодной для использования. Поэтому дважды проверьте, правильность настройки среды и что вы вошли в систему не под учетной записью root, прежде чем запускать следующую команду.

make DESTDIR=$LFS install

Значение опции make install:

DESTDIR=$LFS

Переменная make DESTDIR используется почти всеми пакетами для определения места установки пакета. Если она не задана, по умолчанию для установки используется корневой каталог (/). Здесь мы указываем, что пакет должен быть установлен в $LFS, который станет корневым каталогом в Раздел 7.4, «Вход в окружение Chroot».

Исправьте жестко запрограммированный путь к исполняемому загрузчику в ldd:

sed '/RTLDLIST=/s@/usr@@g' -i $LFS/usr/bin/ldd

Внимание

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

echo 'int main(){}' | $LFS_TGT-gcc -xc -
readelf -l a.out | grep ld-linux

Если все работает правильно, ошибок быть не должно и вывод последней команды будет иметь вид:

[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

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

Как только все будет хорошо, удалите тестовый файл:

rm -v a.out

Примечание

Сборка пакетов в следующей главе послужит дополнительной проверкой правильности сборки временного кросс-тулчейна. Если какой-либо пакет, особенно Binutils или GCC, не удается собрать, это указывает на то, что что-то пошло не так с установленными ранее Binutils, GCC, или Glibc.

5.5.2. Сборка Glibc — 32-битная версия

Теперь перекомпилируйте Glibc для m32. Извлеченный исходный код можно использовать повторно, но его необходимо очистить перед установкой версии Glibc m32.

Очистите каталог сборки и удалите артефакты от предыдущей сборки:

make clean
find .. -name "*.a" -delete

Сконфигурируйте Glibc для m32 с помощью следующих команд:

CC="$LFS_TGT-gcc -m32" \
CXX="$LFS_TGT-g++ -m32" \
../configure                             \
      --prefix=/usr                      \
      --host=$LFS_TGT32                  \
      --build=$(../scripts/config.guess) \
      --enable-kernel=4.19                \
      --with-headers=$LFS/usr/include    \
      --enable-multi-arch                \
      --libdir=/usr/lib32                \
      --libexecdir=/usr/lib32            \
      libc_cv_slibdir=/usr/lib32

Скомпилируйте пакет:

make

Установите пакет:

make DESTDIR=$PWD/DESTDIR install
cp -a DESTDIR/usr/lib32 $LFS/usr/
install -vm644 DESTDIR/usr/include/gnu/{lib-names,stubs}-32.h \
               $LFS/usr/include/gnu/
ln -svf ../lib32/ld-linux.so.2 $LFS/lib/ld-linux.so.2

Внимание

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

echo 'int main(){}' > dummy.c
$LFS_TGT-gcc -m32 dummy.c
readelf -l a.out | grep '/ld-linux'

Если все работает правильно, ошибок быть не должно и вывод последней команды будет иметь вид:

[Requesting program interpreter: /lib/ld-linux.so.2]

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

Как только все будет хорошо, удалите тестовый файл:

rm -v dummy.c a.out

Подробная информация об этом пакете находится в Раздел 8.5.4, «Содержимое пакета Glibc.»

5.6. Libstdc++ из GCC-13.2.0

Libstdc++ — это стандартная библиотека C++. Она нужна для компиляции кода C++ (часть GCC написана на C++), когда мы собирали GCC-Проход 1, нам пришлось отложить её установку, потому что она зависит от библиотеки Glibc, которой еще не было в целевом каталоге.

Приблизительное время сборки: 0.2 SBU
Требуемое дисковое пространство: 1.1 GB

5.6.1. Установка библиотеки Libstdc++

Примечание

Libstdc++ является частью исходников GCC. Сначала вы должны распаковать архив GCC и перейти в каталог gcc-13.2.0.

Создайте отдельный каталог сборки для libstdc++ и перейдите в него:

mkdir -v build
cd       build

Подготовьте libstdc++ к компиляции:

../libstdc++-v3/configure           \
    --host=$LFS_TGT                 \
    --build=$(../config.guess)      \
    --prefix=/usr                   \
    --enable-multilib               \
    --disable-nls                   \
    --disable-libstdcxx-pch         \
    --with-gxx-include-dir=/tools/$LFS_TGT/include/c++/13.2.0

Значение параметров настройки:

--host=...

Указывает, что должен использоваться кросс-компилятор, который мы только что собрали, вместо того, который находится в /usr/bin.

--enable-multilib

Включает сборку объектов multilib.

--disable-libstdcxx-pch

Этот аргумент предотвращает установку предварительно скомпилированных include-файлов, которые на данном этапе не нужны.

--with-gxx-include-dir=/tools/$LFS_TGT/include/c++/13.2.0

Указывает каталог установки для include-файлов. Поскольку libstdc++ является стандартной библиотекой C++ для LFS, этот каталог должен соответствовать местоположению, в котором компилятор C++ ($LFS_TGT-g++) будет искать стандартные включаемые файлы C++. При обычной сборке эта информация автоматически передается в Libstdc++ при выполнении configure из каталога верхнего уровня. В нашем случае эта информация должна быть указана явно. Компилятор C++ добавит путь sysroot $LFS (указанный при сборке GCC Проход 1) к пути поиска include-файлов, поэтому фактически он будет искать в $LFS/tools/$LFS_TGT/include/c++/13.2.0. Комбинация переменной DESTDIR (в приведенной ниже команде make install) и этого аргумента обеспечивает установку заголовочных файлов туда.

Скомпилируйте Libstdc++, выполнив:

make

Установите библиотеку:

make DESTDIR=$LFS install

Удалите архивные файлы libtool, поскольку они потенциально опасны при кросс-компиляции:

rm -v $LFS/usr/lib/lib{stdc++{,exp,fs},supc++}.la

Подробная информация об этом пакете приведена в Раздел 8.29.2, «Содержимое пакета GCC.»

Глава 6. Кросс-Компиляция временных инструментов

6.1. Введение

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

Использование утилит станет возможным в следующей главе после входа в среду «chroot». Все пакеты из этой главы, должны быть собраны до того, как мы это сделаем. Поэтому пока наша система зависима от хост-системы.

Еще раз напомним, что неправильная настройка LFS вместе со сборкой от root может сделать ваш компьютер непригодным для использования. Всю эту главу нужно выполнить от имени пользователя lfs, в его рабочем окружении, как описано в Раздел 4.4, «Настройка окружения».

6.2. M4-1.4.19

Пакет M4 содержит макропроцессор.

Приблизительное время сборки: 0.1 SBU
Требуемое дисковое пространство: 31 MB

6.2.1. Установка пакета M4

Подготовьте пакет M4 к компиляции:

./configure --prefix=/usr   \
            --host=$LFS_TGT \
            --build=$(build-aux/config.guess)

Скомпилируйте пакет:

make

Установите пакет:

make DESTDIR=$LFS install

Подробная информация об этом пакете находится в Раздел 8.12.2, «Содержимое пакета M4.»

6.3. Ncurses-6.4-20230520

Пакет Ncurses содержит библиотеки для независимой от терминала обработки ввода/вывода

Приблизительное время сборки: 0.3 SBU
Требуемое дисковое пространство: 51 MB

6.3.1. Установка пакета Ncurses

Во-первых, убедитесь, что gawk найден первым во время настройки:

sed -i s/mawk// configure

Затем выполните следующие команды, чтобы собрать программу «tic» на хосте сборки:

mkdir build
pushd build
  ../configure
  make -C include
  make -C progs tic
popd

Подготовьте Ncurses к компиляции:

./configure --prefix=/usr                \
            --host=$LFS_TGT              \
            --build=$(./config.guess)    \
            --mandir=/usr/share/man      \
            --with-manpage-format=normal \
            --with-shared                \
            --without-normal             \
            --with-cxx-shared            \
            --without-debug              \
            --without-ada                \
            --disable-stripping          \
            --enable-widec

Значение новых параметров настройки:

--with-manpage-format=normal

Этот аргумент предотвращает установку Ncurses сжатых страниц руководства, это может произойти, если сам дистрибутив хоста содержит сжатые страницы руководства.

--with-shared

Этот аргумент позволяет Ncurses собирать и устанавливать разделяемые библиотеки C.

--without-normal

Этот аргумент предотвращает сборку и установку статических библиотек C.

--without-debug

Этот аргумент предотвращает сборку и установку отладочных библиотек.

--with-cxx-shared

Это аргумент позволяет Ncurses собирать и устанавливать общие привязки C++. А также предотвращает сборку и установку статических привязок C++.

--without-ada

Этот аргумент гарантирует, что Ncurses будет собран без поддержки компилятора Ada, который может присутствовать на хосте, но будет недоступен, как только мы войдем в среду chroot.

--disable-stripping

Этот аргумент не позволяет системе сборки использовать программу strip с хоста. Использование инструментов хоста в кросс-компилируемой программе может привести к сбою.

--enable-widec

Этот аргумент указывает, что необходимо скомпилировать библиотеки расширенных символов (такие как, libncursesw.so.6.4-20230520) вместо обычных (таких как, libncurses.so.6.4-20230520). Эти библиотеки расширенных символов можно использовать как в многобайтовой, так и традиционной 8-битной локали, в то время как обычные библиотеки корректно работают только в 8-битных локалях. Библиотеки расширенных символов и обычные совместимы на уровне исходного кода, но не совместимы в двоичном.

Скомпилируйте пакет:

make

Установите пакет:

make DESTDIR=$LFS TIC_PATH=$(pwd)/build/progs/tic install
ln -sv libncursesw.so $LFS/usr/lib/libncurses.so
sed -e 's/^#if.*XOPEN.*$/#if 1/' \
    -i $LFS/usr/include/curses.h

Значение параметров установки:

TIC_PATH=$(pwd)/build/progs/tic

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

ln -sv libncursesw.so $LFS/usr/lib/libncurses.so

Библиотека libncurses.so необходима для нескольких пакетов, которые мы скоро соберем. Мы создаем эту символическую ссылку, чтобы использовать libncursesw.so в качестве замены.

sed -e 's/^#if.*XOPEN.*$/#if 1/' ...

Заголовочный файл curses.h содержит определения различных структур данных Ncurses. С разными определениями макросов препроцессора могут использоваться два разных набора определений структуры данных: 8-битное определение совместимо с libncurses.so, а определение расширенного набора символов совместимо с libncursesw.so . Поскольку мы используем libncursesw.so вместо libncurses.so, отредактируйте заголовочный файл, чтобы он всегда использовал определение структуры данных расширенного набора символов, совместимое с . libncursesw.so.

6.3.2. Сборка Ncurses — 32-битная версия

Выполните очистку после предыдущей сборки:

make distclean

Подготовьте Ncurses к компиляции:

CC="$LFS_TGT-gcc -m32"              \
CXX="$LFS_TGT-g++ -m32"             \
./configure --prefix=/usr           \
            --host=$LFS_TGT32       \
            --build=$(./config.guess)    \
            --libdir=/usr/lib32     \
            --mandir=/usr/share/man \
            --with-shared           \
            --without-normal        \
            --with-cxx-shared       \
            --without-debug         \
            --without-ada           \
            --disable-stripping     \
            --enable-widec

Скомпилируйте пакет:

make

Установите пакет:

make DESTDIR=$PWD/DESTDIR TIC_PATH=$(pwd)/build/progs/tic install
ln -s libncursesw.so DESTDIR/usr/lib32/libcursesw.so
cp -Rv DESTDIR/usr/lib32/* $LFS/usr/lib32
rm -rf DESTDIR

Подробная информация об этом пакете находится в Раздел 8.30.3, «Содержимое пакета Ncurses.»

6.4. Bash-5.2.21

Пакет Bash содержит Bourne-Again Shell.

Приблизительное время сборки: 0.2 SBU
Требуемое дисковое пространство: 67 MB

6.4.1. Установка пакета Bash

Подготовьте Bash к компиляции:

./configure --prefix=/usr                      \
            --build=$(sh support/config.guess) \
            --host=$LFS_TGT                    \
            --without-bash-malloc

Значение параметров настройки:

--without-bash-malloc

Этот параметр отключает использование функции распределения памяти (malloc) Bash, которая, как известно, вызывает ошибки сегментации. Если опция отключена, Bash будет использовать функции malloc из Glibc, которые более стабильны.

Скомпилируйте пакет:

make

Установите пакет:

make DESTDIR=$LFS install

Создайте символическую ссылку для программ, которые используют sh как оболочку:

ln -sv bash $LFS/bin/sh

Подробная информация об этом пакете находится в Раздел 8.36.2, «Содержимое пакета Bash.»

6.5. Coreutils-9.4

Пакет Coreutils содержит основные утилиты, необходимые каждой операционной системе.

Приблизительное время сборки: 0.3 SBU
Требуемое дисковое пространство: 173 MB

6.5.1. Установка пакета Coreutils

Подготовьте Coreutils к компиляции:

./configure --prefix=/usr                     \
            --host=$LFS_TGT                   \
            --build=$(build-aux/config.guess) \
            --enable-install-program=hostname \
            --enable-no-install-program=kill,uptime

Значение параметров настройки:

--enable-install-program=hostname

Этот параметр позволяет создать и установить двоичный файл hostname – по умолчанию он отключен, но требуется для набора тестов Perl.

Скомпилируйте пакет:

make

Установите пакет:

make DESTDIR=$LFS install

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

mv -v $LFS/usr/bin/chroot              $LFS/usr/sbin
mkdir -pv $LFS/usr/share/man/man8
mv -v $LFS/usr/share/man/man1/chroot.1 $LFS/usr/share/man/man8/chroot.8
sed -i 's/"1"/"8"/'                    $LFS/usr/share/man/man8/chroot.8

Подробная информация об этом пакете находится в Раздел 8.58.2, «Содержимое пакета Coreutils.»

6.6. Diffutils-3.10

Пакет Diffutils содержит программы, которые показывают различия между файлами или каталогами.

Приблизительное время сборки: 0.1 SBU
Требуемое дисковое пространство: 29 MB

6.6.1. Установка пакета Diffutils

Подготовьте Diffutils для компиляции:

./configure --prefix=/usr   \
            --host=$LFS_TGT \
            --build=$(./build-aux/config.guess)

Скомпилируйте пакет:

make

Установите пакет:

make DESTDIR=$LFS install

Подробная информация об этом пакете находится в Раздел 8.60.2, «Содержимое пакета Diffutils.»

6.7. File-5.45

Пакет File содержит утилиту для определения типа указанного файла или файлов

Приблизительное время сборки: 0.1 SBU
Требуемое дисковое пространство: 37 MB

6.7.1. Установка пакета File

Команда file на хосте сборки должна быть той же версии, что и собираемая, чтобы создать файл подписи. Выполните следующие команды, чтобы создать временную копию команды file.

mkdir build
pushd build
  ../configure --disable-bzlib      \
               --disable-libseccomp \
               --disable-xzlib      \
               --disable-zlib
  make
popd

Значение новой опции настройки:

--disable-*

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

Подготовьте файл для компиляции:

./configure --prefix=/usr --host=$LFS_TGT --build=$(./config.guess)

Скомпилируйте пакет:

make FILE_COMPILE=$(pwd)/build/src/file

Установите пакет:

make DESTDIR=$LFS install

Удалите архивный файл libtool, поскольку он потенциально опасен при кросс-компиляции:

rm -v $LFS/usr/lib/libmagic.la

Подробная информация об этом пакете находится в Раздел 8.10.3, «Содержимое пакета File.»

6.8. Findutils-4.9.0

Пакет Findutils содержит программы для поиска файлов. Эти программы предназначены для поиска по всем файлам в дереве каталогов, а также для создания, обслуживания и поиска в базе данных (часто быстрее, чем рекурсивный поиск, но ненадежно, если база данных давно не обновлялась).Findutils также предоставляет программу xargs, которую можно использовать для запуска указанной команды для каждого файла, выбранного при поиске.

Приблизительное время сборки: 0.1 SBU
Требуемое дисковое пространство: 42 MB

6.8.1. Установка пакета Findutils

Подготовьте Findutils к компиляции:

./configure --prefix=/usr                   \
            --localstatedir=/var/lib/locate \
            --host=$LFS_TGT                 \
            --build=$(build-aux/config.guess)

Скомпилируйте пакет:

make

Установите пакет:

make DESTDIR=$LFS install

Подробная информация об этом пакете находится в Раздел 8.62.2, «Содержимое пакета Findutils.»

6.9. Gawk-5.3.0

Пакет Gawk содержит программы для работы с текстовыми файлами.

Приблизительное время сборки: 0.1 SBU
Требуемое дисковое пространство: 47 MB

6.9.1. Установка пакета Gawk

Во-первых, убедитесь, что некоторые ненужные файлы не будут установлены:

sed -i 's/extras//' Makefile.in

Подготовьте Gawk к компиляции:

./configure --prefix=/usr   \
            --host=$LFS_TGT \
            --build=$(build-aux/config.guess)

Скомпилируйте пакет:

make

Установите пакет:

make DESTDIR=$LFS install

Подробная информация об этом пакете находится в Раздел 8.61.2, «Содержимое пакета Gawk.»

6.10. Grep-3.11

Пакет Grep содержит программы для поиска по содержимому файлов.

Приблизительное время сборки: 0.1 SBU
Требуемое дисковое пространство: 27 MB

6.10.1. Установка пакета Grep

Подготовьте Grep к компиляции:

./configure --prefix=/usr   \
            --host=$LFS_TGT \
            --build=$(./build-aux/config.guess)

Скомпилируйте пакет:

make

Установите пакет:

make DESTDIR=$LFS install

Подробная информация об этом пакете находится в Раздел 8.35.2, «Содержимое пакета Grep.»

6.11. Gzip-1.13

Пакет Gzip содержит программы для сжатия и распаковки файлов.

Приблизительное время сборки: 0.1 SBU
Требуемое дисковое пространство: 11 MB

6.11.1. Установка пакета Gzip

Подготовьте Gzip к компиляции:

./configure --prefix=/usr --host=$LFS_TGT

Скомпилируйте пакет:

make

Установите пакет:

make DESTDIR=$LFS install

Подробная информация об этом пакете находится в Раздел 8.65.2, «Содержимое пакета Gzip.»

6.12. Make-4.4.1

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

Приблизительное время сборки: менее 0.1 SBU
Требуемое дисковое пространство: 15 MB

6.12.1. Установка пакета Make

Подготовьте Make к компиляции:

./configure --prefix=/usr   \
            --without-guile \
            --host=$LFS_TGT \
            --build=$(build-aux/config.guess)

Значение новой опции настройки:

--without-guile

Несмотря на то, что мы выполняем кросс-компиляцию, configure пытается использовать guile с узла сборки, если он его находит. Это приводит к сбою компиляции, этот аргумент предотвращает его использование.

Скомпилируйте пакет:

make

Установите пакет:

make DESTDIR=$LFS install

Подробная информация об этом пакете находится в Раздел 8.69.2, «Содержимое пакета Make.»

6.13. Patch-2.7.6

Пакет Patch содержит программу для изменения или создания файлов путём наложение «патча», обычно, создаваемого программой diff.

Приблизительное время сборки: 0.1 SBU
Требуемое дисковое пространство: 12 MB

6.13.1. Установка пакета Patch

Подготовьте Patch к компиляции:

./configure --prefix=/usr   \
            --host=$LFS_TGT \
            --build=$(build-aux/config.guess)

Скомпилируйте пакет:

make

Установите пакет:

make DESTDIR=$LFS install

Подробная информация об этом пакете находится в Раздел 8.70.2, «Содержимое пакета Patch.»

6.14. Sed-4.9

Пакет Sed содержит потоковый редактор текста

Приблизительное время сборки: 0.1 SBU
Требуемое дисковое пространство: 21 MB

6.14.1. Установка пакета Sed

Подготовьте Sed к компиляции:

./configure --prefix=/usr   \
            --host=$LFS_TGT \
            --build=$(./build-aux/config.guess)

Скомпилируйте пакет:

make

Установите пакет:

make DESTDIR=$LFS install

Подробная информация об этом пакете находится в Раздел 8.31.2, «Содержимое пакета Sed.»

6.15. Tar-1.35

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

Приблизительное время сборки: 0.1 SBU
Требуемое дисковое пространство: 42 MB

6.15.1. Установка пакета Tar

Подготовьте Tar к компиляции:

./configure --prefix=/usr                     \
            --host=$LFS_TGT                   \
            --build=$(build-aux/config.guess)

Скомпилируйте пакет:

make

Установите пакет:

make DESTDIR=$LFS install

Подробная информация об этом пакете находится в Раздел 8.71.2, «Содержимое пакета Tar.»

6.16. Xz-5.4.6

Пакет Xz содержит программы для сжатия и распаковки файлов. Он предоставляет возможности для lzma и более новых форматов сжатия xz. Сжатие текстовых файлов с помощью xz дает лучший процент сжатия, чем с традиционные gzip или bzip2.

Приблизительное время сборки: 0.1 SBU
Требуемое дисковое пространство: 22 MB

6.16.1. Установка пакета Xz

Подготовьте Xz к компиляции:

./configure --prefix=/usr                     \
            --host=$LFS_TGT                   \
            --build=$(build-aux/config.guess) \
            --disable-static                  \
            --docdir=/usr/share/doc/xz-5.4.6

Скомпилируйте пакет:

make

Установите пакет:

make DESTDIR=$LFS install

Удалите архивный файл libtool, поскольку он потенциально опасен при кросс-компиляции:

rm -v $LFS/usr/lib/liblzma.la

Подробная информация об этом пакете находится в Раздел 8.8.3, «Содержимое пакета Xz.»

6.17. Binutils-2.42 - Проход 2

Пакет Binutils содержит компоновщик, ассемблер и другие инструменты для работы с объектными файлами.

Приблизительное время сборки: 0.5 SBU
Требуемое дисковое пространство: 537 MB

6.17.1. Установка пакета Binutils

Система сборки Binutils использует содержащуюся в пакете копию libtool для линковки с внутренними статическими библиотеками, но копии libiberty и zlib, поставляемые с пакетом, не используют libtool. Это несоответствие может привести к тому, что созданные двоичные файлы будут ошибочно связаны с библиотеками из основного дистрибутива. Решение этой проблемы:

sed '6009s/$add_dir//' -i ltmain.sh

Создайте отдельный каталог для сборки:

mkdir -v build
cd       build

Подготовьте Binutils к компиляции:

../configure                   \
    --prefix=/usr              \
    --build=$(../config.guess) \
    --host=$LFS_TGT            \
    --disable-nls              \
    --enable-shared            \
    --enable-gprofng=no        \
    --disable-werror           \
    --enable-64-bit-bfd        \
    --enable-default-hash-style=gnu \
    --enable-multilib

Значение новых параметров настройки:

--enable-shared

Собирает libbfd как разделяемую библиотеку

--enable-64-bit-bfd

Включает 64-разрядную поддержку (на хостах с меньшим размером слова). В 64-разрядных системах это может и не понадобиться, но вреда от этого не будет

--enable-multilib

Включает поддержку multilib в bintutils.

Скомпилируйте пакет:

make

Установите пакет:

make DESTDIR=$LFS install

Удалите архивные файлы libtool, поскольку они потенциально опасны при кросс-компиляции, также удалите ненужные статические библиотеки

rm -v $LFS/usr/lib/lib{bfd,ctf,ctf-nobfd,opcodes,sframe}.{a,la}

Подробная информация об этом пакете находится в Раздел 8.19.2, «Содержимое пакета Binutils.»

6.18. GCC-13.2.0 - Проход 2

Пакет GCC содержит коллекцию компиляторов GNU, которая включает компиляторы C и C++.

Приблизительное время сборки: 4.4 SBU
Требуемое дисковое пространство: 4.8 GB

6.18.1. Установка пакета GCC

Как и при первой сборке GCC, требуются пакеты GMP, MPFR и MPC. Распакуйте архивы и переименуйте каталоги:

tar -xf ../mpfr-4.2.1.tar.xz
mv -v mpfr-4.2.1 mpfr
tar -xf ../gmp-6.3.0.tar.xz
mv -v gmp-6.3.0 gmp
tar -xf ../mpc-1.3.1.tar.gz
mv -v mpc-1.3.1 mpc

Измените имя каталога по умолчанию для библиотек:

sed -e '/m64=/s/lib64/lib/' \
    -e '/m32=/s/m32=.*/m32=..\/lib32$(call if_multiarch,:i386-linux-gnu)/' \
    -i.orig gcc/config/i386/t-linux64

Переопределите правила сборки заголовочных файлов libgcc и libstdc++, чтобы разрешить создание этих библиотек с поддержкой потоков POSIX:

sed '/thread_header =/s/@.*@/gthr-posix.h/' \
    -i libgcc/Makefile.in libstdc++-v3/include/Makefile.in

Снова создайте отдельный каталог сборки:

mkdir -v build
cd       build

Перед началом сборки GCC не забудьте отключить все переменные среды, которые переопределяют флаги оптимизации по умолчанию.

Теперь подготовьте GCC к компиляции:

mlist=m64,m32
../configure                                       \
    --build=$(../config.guess)                     \
    --host=$LFS_TGT                                \
    --target=$LFS_TGT                              \
    LDFLAGS_FOR_TARGET=-L$PWD/$LFS_TGT/libgcc      \
    --prefix=/usr                                  \
    --with-build-sysroot=$LFS                      \
    --enable-default-pie                           \
    --enable-default-ssp                           \
    --disable-nls                                  \
    --enable-multilib --with-multilib-list=$mlist  \
    --disable-libatomic                            \
    --disable-libgomp                              \
    --disable-libquadmath                          \
    --disable-libsanitizer                         \
    --disable-libssp                               \
    --disable-libvtv                               \
    --enable-languages=c,c++

Значение новых параметров настройки:

--with-build-sysroot=$LFS

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

--target=$LFS_TGT

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

LDFLAGS_FOR_TARGET=...

Разрешить libstdc++ использовать общую библиотеку libgcc, собранную на этом этапе, вместо статической версии, собранной в GCC Проход 1. Это необходимо для поддержки обработки исключений C++

--disable-libsanitizer

Отключает библиотеки среды выполнения GCC sanitizer. Они не нужны для временного набора инструментов. Этот параметр необходим для сборки GCC без установки libcrypt для целевого объекта. В GCC-Проход 1 это решалось с помощью параметра --disable-libstdcxx, но теперь мы должны передать его явно.

Скомпилируйте пакет:

make

Установите пакет:

make DESTDIR=$LFS install

В качестве завершающего штриха создайте символическую ссылку на утилиту. Многие программы и скрипты используют cc вместо gcc, чтобы сделать программы более универсальными и, следовательно, для совместимости со всеми типами UNIX-систем, где компилятор GNU C не всегда установлен. Наличие cc оставляет системному администратору право самостоятельно решать, какой компилятор C устанавливать:

ln -sv gcc $LFS/usr/bin/cc

Подробная информация об этом пакете находится в Раздел 8.29.2, «Содержимое пакета GCC.»

Глава 7. Вход в окружение Chroot и создание дополнительных временных инструментов

7.1. Введение

В этой главе рассказывается, как собрать последние недостающие части временной системы: инструменты, необходимые для сборки различных пакетов. Теперь, когда все циклические зависимости устранены, для сборки можно использовать среду «chroot», полностью изолированную от операционной системы хоста (за исключением работающего ядра).

Для правильной работы изолированной среды необходимо установить связь с работающим ядром. Это делается с помощью так называемых виртуальных файловых систем ядра, которые будут смонтированы перед входом в среду chroot. Вы можете проверить, смонтированы ли они, выполнив команду findmnt.

До Раздел 7.4, «Вход в окружение Chroot» команды должны выполняться от имени root с установленной переменной LFS. После входа в chroot все команды выполняются от имени root, к счастью, без доступа к операционной системе компьютера, на котором вы собираете LFS. В любом случае будьте осторожны, так как неверными командами легко разрушить всю систему LFS.

7.2. Смена владельца

Примечание

Команды, приведенные в оставшейся части книги, должны выполняться от имени пользователя root, а не lfs. Дважды проверьте, что переменная $LFS установлена в переменных окружения пользователя root.

В настоящее время вся иерархия каталогов в $LFS принадлежит пользователю lfs, существующему только на хост-системе. Если права на файлы и каталоги внутри $LFS оставить как есть, то они будут принадлежать ID пользователя без существующей учетной записи. Это опасно, так как созданная позже учетная запись, может получить такой же ID пользователя и стать владельцем всех файлов в $LFS, тем самым делая эти файлы уязвимыми для возможных злонамеренных манипуляций.

Для решения проблемы измените владельца каталогов $LFS/* на пользователя root, выполнив следующую команду:

chown -R root:root $LFS/{usr,lib,var,etc,bin,sbin,tools}
case $(uname -m) in
  x86_64) chown -R root:root $LFS/lib64 ;;
esac

Существует еще несколько каталогов, которые присутствуют в системах с поддержкой multilib. Измените их владельца тоже:

chown -R root:root $LFS/lib32

7.3. Подготовка виртуальных файловых систем ядра

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

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

mkdir -pv $LFS/{dev,proc,sys,run}

7.3.1. Монтирование и заполнение /dev

Во время обычной загрузки ядро автоматически монтирует файловую систему devtmpfs в каталог /dev; ядро создает узлы устройств в этой виртуальной файловой системе в процессе загрузки или при первом обнаружении устройства, или доступе к нему. Демон udev может изменять владельца или разрешения узлов устройств, созданных ядром, или создавать новые узлы устройств или символические ссылки, чтобы облегчить работу разработчиков дистрибутива или системных администраторов. (Подробности смотрите в Раздел 9.3.2.2, «Создание узла устройства».) Если ядро хоста поддерживает devtmpfs, мы можем просто смонтировать devtmpfs в $LFS/dev и положиться на ядро для его заполнения.

Но в некоторых ядрах хоста отсутствует поддержка devtmpfs, эти хост-дистрибутивы используют разные методы для создания содержимого /dev. Таким образом, единственный независимый от хоста способ заполнить каталог $LFS/dev - это привязка к каталогу /dev хост-системы. Связное монтирование - это особый тип монтирования, который делает дерево каталога или файл видимым в каком-либо другом месте. Для этого используйте следующую команду:

mount -v --bind /dev $LFS/dev

7.3.2. Монтирование виртуальных файловых систем ядра

Теперь смонтируйте оставшиеся виртуальные файловые системы:

mount -vt devpts devpts -o gid=5,mode=0620 $LFS/dev/pts
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
mount -vt tmpfs tmpfs $LFS/run

Значение параметров монтирования для devpts:

gid=5

Этот параметр гарантирует, что все узлы устройств, созданные devpts, принадлежат группе с идентификатором 5. Это идентификатор, который мы будем использовать позже для группы tty. Мы используем идентификатор группы вместо имени, поскольку хост-система может использовать другой идентификатор для своей группы tty.

mode=0620

Этот параметр гарантирует, что все узлы устройств, созданные devpts, будут иметь права 0620 (доступен для чтения и записи пользователем, доступен для записи группе). Вместе с вышеуказанной опцией это гарантирует, что devpts создаст узлы устройств, соответствующие требованиям grantpt(), а это означает, что вспомогательный файл Glibc pt_chown (который не установлен по умолчанию) не требуется.

В некоторых хост-системах /dev/shm является символической ссылкой на каталог /run/shm. /run tmpfs был смонтирован выше, поэтому сейчас необходимо только создать каталог с правильными разрешениями.

В других хост-системах /dev/shm является точкой монтирования для tmpfs. В этом случае монтирование /dev приведет только к созданию /dev/shm как каталога в среде chroot. В этой ситуации мы должны явно смонтировать tmpfs:

if [ -h $LFS/dev/shm ]; then
  install -v -d -m 1777 $LFS$(realpath /dev/shm)
else
  mount -vt tmpfs -o nosuid,nodev tmpfs $LFS/dev/shm
fi

7.4. Вход в окружение Chroot

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

chroot "$LFS" /usr/bin/env -i   \
    HOME=/root                  \
    TERM="$TERM"                \
    PS1='(lfs chroot) \u:\w\$ ' \
    PATH=/usr/bin:/usr/sbin     \
    MAKEFLAGS="-j$(nproc)"      \
    TESTSUITEFLAGS="-j$(nproc)" \
    /bin/bash --login

Если вы не хотите использовать все доступные логические ядра, замените параметр $(nproc) количеством логических ядер, которые вы хотите использовать для сборки пакетов в этой и последующих главах. На наборы тестов некоторых пакетов (в частности Autoconf, Libtool и Tar) в Глава 8 не влияет установка переменной MAKEFLAGS, вместо этого они используют переменную среды TESTSUITEFLAGS. Мы также установили её здесь для запуска тестов с поддержкой нескольких ядер.

Параметр -i команды env, очистит все переменные в среде chroot. После этого переменные HOME, TERM, PS1 и PATH будут установлены заново. Конструкция TERM=$TERM установит переменную TERM внутри chroot в то же значение, что и вне chroot. Эта переменная необходима для корректной работы таких программ как vim и less. Если понадобятся другие переменные окружения, такие как CFLAGS или CXXFLAGS, то это подходящее место для их установки.

С этого момента больше нет необходимости использовать переменную LFS, поскольку вся работа будет ограничена файловой системой LFS; команда chroot запускает оболочку Bash с корневым каталогом (/), установленным в $LFS.

Обратите внимание, что каталог /tools/bin не указан в переменной окружения PATH. Это означает, что кросс-тулчейн больше не будет использоваться.

Также обратите внимание, что в командной строке bash будет указано I have no name!. Это нормально, поскольку файл /etc/passwd еще не создан.

Примечание

Важно, чтобы все команды в оставшейся части этой главы и следующих главах выполнялись из среды chroot. Если вы покидаете эту среду по какой-либо причине (например, при перезагрузке), убедитесь, что файловые системы виртуального ядра смонтированы, как описано в Раздел 7.3.1, «Монтирование и заполнение /dev» и Раздел 7.3.2, «Монтирование виртуальных файловых систем ядра», а затем войдите в среду chroot для продолжения установки.

7.5. Создание каталогов

Пришло время создать полную структуру каталогов в файловой системе LFS.

Примечание

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

Создайте несколько каталогов, которые не входили в ограниченный набор, используемый в предыдущих главах, выполнив следующую команду:

mkdir -pv /{boot,home,mnt,opt,srv}

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

mkdir -pv /etc/{opt,sysconfig}
mkdir -pv /lib/firmware
mkdir -pv /media/{floppy,cdrom}
mkdir -pv /usr/{,local/}{include,src}
mkdir -pv /usr/local/{bin,lib,sbin}
mkdir -pv /usr/{,local/}share/{color,dict,doc,info,locale,man}
mkdir -pv /usr/{,local/}share/{misc,terminfo,zoneinfo}
mkdir -pv /usr/{,local/}share/man/man{1..8}
mkdir -pv /var/{cache,local,log,mail,opt,spool}
mkdir -pv /var/lib/{color,misc,locate}

ln -sfv /run /var/run
ln -sfv /run/lock /var/lock

install -dv -m 0750 /root
install -dv -m 1777 /tmp /var/tmp

Необходимые каталоги для поддержки multilib были созданы на предыдущих этапах установки.

По умолчанию каталоги создаются с правами 755, но это нежелательно делать для всех каталогов. В приведенных выше командах вносятся два изменения — одно в домашний каталог пользователя root, а другое в каталоги для временных файлов.

Первое изменение гарантирует, что никто не сможет войти в каталог /root — точно так же, как обычный пользователь сделал бы это со своим собственным домашним каталогом. Второе изменение гарантирует, что любой пользователь может писать в каталоги /tmp и /var/tmp, но не может удалять из них файлы другого пользователя. Последнее запрещено так называемым «sticky bit (липким битом)», старшим битом (1) в битовой маске 1777

7.5.1. Примечание о соответствии требованиям FHS

Это дерево каталогов основано на стандарте иерархии файловой системы (FHS) (доступен по адресу https://refspecs.linuxfoundation.org/fhs.shtml). FHS также указывает, что наличие некоторых каталогов необязательно, например, /usr/local/games и /usr/share/games. В LFS мы создаем только те каталоги, которые действительно необходимы. Однако, не стесняйтесь создавать дополнительные каталоги, если хотите.

Предупреждение

FHS не требует наличия каталога /usr/lib64, и редакторы LFS решили его не использовать. Чтобы инструкции в LFS и BLFS работали корректно, крайне важно, чтобы этот каталог не существовал. Время от времени вам следует проверять, что он не существует, потому что его легко создать непреднамеренно, и это, вероятно, приведет к поломке вашей системы.

7.6. Создание основных файлов и символических ссылок

Исторически сложилось, что Linux хранит список примонтированных файловых систем в файле /etc/mtab. Современные ядра хранят этот список внутри себя и предоставляют его пользователю через файловую систему /proc. Чтобы удовлетворять требованиям утилит, которые ожидают наличия /etc/mtab, создайте следующую символическую ссылку:

ln -sv /proc/self/mounts /etc/mtab

Создайте файл /etc/hosts, на который будут ссылаться некоторые наборы тестов, а также один из файлов конфигурации Perl:

cat > /etc/hosts << EOF
127.0.0.1  localhost $(hostname)
::1        localhost
EOF

Чтобы пользователь root мог войти в систему и распознавался системой, в файлах /etc/passwd и /etc/group должны быть соответствующие записи.

Создайте файл /etc/passwd выполнив следующую команду:

cat > /etc/passwd << "EOF"
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/dev/null:/usr/bin/false
daemon:x:6:6:Daemon User:/dev/null:/usr/bin/false
messagebus:x:18:18:D-Bus Message Daemon User:/run/dbus:/usr/bin/false
uuidd:x:80:80:UUID Generation Daemon User:/dev/null:/usr/bin/false
nobody:x:65534:65534:Unprivileged User:/dev/null:/usr/bin/false
EOF

Пароль пользователя root будет задан позднее.

Создайте файл /etc/group, выполнив следующую команду:

cat > /etc/group << "EOF"
root:x:0:
bin:x:1:daemon
sys:x:2:
kmem:x:3:
tape:x:4:
tty:x:5:
daemon:x:6:
floppy:x:7:
disk:x:8:
lp:x:9:
dialout:x:10:
audio:x:11:
video:x:12:
utmp:x:13:
cdrom:x:15:
adm:x:16:
messagebus:x:18:
input:x:24:
mail:x:34:
kvm:x:61:
uuidd:x:80:
wheel:x:97:
users:x:999:
nogroup:x:65534:
EOF

Созданные группы не являются частью какого-либо стандарта — это группы, определяемые частично требованиями конфигурации Udev в главе 9, а частично общими соглашениями, используемыми в ряде существующих дистрибутивов Linux. Кроме того, некоторые наборы тестов зависят от конкретных пользователей или групп. Спецификация LSB (доступна по адресу https://refspecs.linuxfoundation.org/lsb.shtml) рекомендует, чтобы, помимо группы root с идентификатор (GID) 0 присутствовала группа bin с GID 1. GID 5 широко используется для группы tty, число 5 также используется в /etc/fstab для файловой системы devpts. Все остальные имена групп и GID могут свободно выбираться системным администратором, так как хорошо написанные программы не зависят от номеров GID, а чаще используют название группы.

Идентификатор 65534 используется ядром для NFS и отдельных пользовательских пространств имен для несопоставленных пользователей и групп (они существуют на сервере NFS или родительском пространстве имен пользователя, но «не существует» на локальном компьютере или в отдельном пространстве имен). Мы присваиваем nobody и nogroup для того, чтобы избежать несопоставленных идентификаторов. Другие дистрибутивы могут обрабатывать этот идентификатор по-разному, поэтому любая переносимая программа не должна зависеть от этого присвоения.

Для некоторых тестов в Глава 8 требуется обычный пользователь. Добавим такого пользователя здесь и удалим эту учетную запись в конце главы.

echo "tester:x:101:101::/home/tester:/bin/bash" >> /etc/passwd
echo "tester:x:101:" >> /etc/group
install -o tester -d /home/tester

Чтобы удалить приглашение «I have no name!», запустите новую оболочку. Поскольку файлы /etc/passwd и /etc/group были созданы, разрешение имен пользователей и групп теперь будет работать:

exec /usr/bin/bash --login

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

touch /var/log/{btmp,lastlog,faillog,wtmp}
chgrp -v utmp /var/log/lastlog
chmod -v 664  /var/log/lastlog
chmod -v 600  /var/log/btmp

В файл /var/log/wtmp записываются все входы и выходы из системы. В файл /var/log/lastlog записывается время последнего входа каждого пользователя в систему. В файл /var/log/faillog записываются неудачные попытки входа в систему. В файл /var/log/btmp также записываются неудачные попытки входа в систему.

Примечание

В файл /run/utmp записываются пользователи, которые в данный момент вошли в систему. Он создаётся динамически, в процессе выполнения сценариев загрузки.

Примечание

Файлы utmp, wtmp, btmp и lastlog используют для временных меток 32-разрядные целые числа, значения счетчика достигнет максимума (2 147 483 647) 19 января 2038 года ("проблема 2038 года"). Многие пакеты перестали их использовать, другие же, собираются прекратить их использование. Вероятно, лучше считать их устаревшими.

7.7. Gettext-0.22.4

Пакет Gettext содержит утилиты для интернационализации и локализации. Они позволяют компилировать программы с поддержкой NLS (Native Language Support), позволяя им выводить сообщения на родном языке пользователя.

Приблизительное время сборки: 1.1 SBU
Требуемое дисковое пространство: 306 MB

7.7.1. Установка пакета Gettext

Для временного набора инструментов нам нужно установить только три программы из пакета Gettext.

Подготовьте Gettext к компиляции:

./configure --disable-shared

Значение параметров настройки:

--disable-shared

В настоящее время нам не нужно устанавливать какие-либо общие библиотеки Gettext, поэтому нет необходимости их собирать.

Скомпилируйте пакет:

make

Установите программы msgfmt, msgmerge, и xgettext programs:

cp -v gettext-tools/src/{msgfmt,msgmerge,xgettext} /usr/bin

Подробная информация об этом пакете находится в Раздел 8.33.2, «Содержимое пакета Gettext.»

7.8. Bison-3.8.2

Пакет Bison содержит генератор синтаксического анализа.

Приблизительное время сборки: 0.2 SBU
Требуемое дисковое пространство: 57 MB

7.8.1. Установка пакета Bison

Подготовьте Bison к компиляции:

./configure --prefix=/usr \
            --docdir=/usr/share/doc/bison-3.8.2

Значение нового параметра конфигурации:

--docdir=/usr/share/doc/bison-3.8.2

Этот параметр указывает системе сборки установить документацию к bison в каталог с версией пакета.

Скомпилируйте пакет:

make

Установите пакет:

make install

Подробная информация об этом пакете находится в Раздел 8.34.2, «Содержимое пакета Bison.»

7.9. Perl-5.38.2

Пакет Perl содержит практический язык для извлечения данных и составления отчётов (Practical Extraction and Report Language).

Приблизительное время сборки: 0.6 SBU
Требуемое дисковое пространство: 280 MB

7.9.1. Установка пакета Perl

Подготовьте Perl к компиляции:

sh Configure -des                                        \
             -Dprefix=/usr                               \
             -Dvendorprefix=/usr                         \
             -Duseshrplib                                \
             -Dprivlib=/usr/lib/perl5/5.38/core_perl     \
             -Darchlib=/usr/lib/perl5/5.38/core_perl     \
             -Dsitelib=/usr/lib/perl5/5.38/site_perl     \
             -Dsitearch=/usr/lib/perl5/5.38/site_perl    \
             -Dvendorlib=/usr/lib/perl5/5.38/vendor_perl \
             -Dvendorarch=/usr/lib/perl5/5.38/vendor_perl

Значение новых опций Configure:

-des

Это комбинация из трех параметров: -d использует значения по умолчанию для всех элементов; -e обеспечивает выполнение всех задач; -s отключает несущественные выходные данные.

-Dvendorprefix=/usr

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

-Duseshrplib

Собрать библиотеку libperl, необходимую некоторым модулям Perl, как общую библиотеку вместо статической.

-Dprivlib,-Darchlib,-Dsitelib,...

Эти настройки определяют, где Perl ищет установленные модули. Редакторы LFS решили поместить их в структуру каталогов, основанную на MAJOR.MINOR версии Perl (5.38), что позволяет обновлять Perl до более новых уровней исправлений (уровень исправления - это последняя разделенная точками часть в строке полной версии, например 5.38.2) без необходимости переустанавливать все модули.

Скомпилируйте пакет:

make

Установите пакет:

make install

Подробная информация об этом пакете находится в Раздел 8.43.2, «Содержимое пакета Perl.»

7.10. Python-3.12.2

Пакет Python 3 содержит среду разработчика Python. Его можно использовать для объектно-ориентированного программирования, написания скриптов, прототипирования больших программ и разработка целых приложений. Python — это интерпретируемый язык программирования.

Приблизительное время сборки: 0.5 SBU
Требуемое дисковое пространство: 598 MB

7.10.1. Установка пакета Python

Примечание

Существует два пакета, имена которых начинаются с префикса «python». Сейчас необходимо распаковать файл Python-3.12.2.tar.xz (обратите внимание на заглавную первую букву).

Подготовка Python к компиляции:

./configure --prefix=/usr   \
            --enable-shared \
            --without-ensurepip

Значение параметров настройки:

--enable-shared

Этот параметр отключает установку статичных библиотек.

--without-ensurepip

Этот параметр отключает установщик пакетов Python, который на данном этапе не нужен.

Скомпилируйте пакет:

make

Примечание

Некоторые модули Python 3 не могут быть собраны сейчас, потому что зависимости еще не установлены. Для модуля ssl выводится сообщение Python требует OpenSSL 1.1.1 или новее. Сообщение следует проигнорировать. Просто убедитесь, что команда make верхнего уровня не завершилась ошибкой. Дополнительные модули сейчас не нужны, и они будут собраны в Глава 8.

Установите пакет:

make install

Подробная информация об этом пакете находится в Раздел 8.52.2, «Содержимое пакета Python 3.»

7.11. Texinfo-7.1

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

Приблизительное время сборки: 0.2 SBU
Требуемое дисковое пространство: 130 MB

7.11.1. Установка пакета Texinfo

Подготовьте Texinfo к компиляции:

./configure --prefix=/usr

Скомпилируйте пакет:

make

Установите пакет:

make install

Подробная информация об этом пакете находится в Раздел 8.72.2, «Содержимое пакета Texinfo.»

7.12. Util-linux-2.39.3

Пакет Util-linux содержит различные служебные программы. Среди них утилиты для работы с файловыми системами, консолями, разделами и сообщениями.

Приблизительное время сборки: 0.2 SBU
Требуемое дисковое пространство: 172 MB

7.12.1. Установка пакета Util-linux

FHS рекомендует использовать каталог /var/lib/hwclock вместо каталога /etc в качестве местоположения для файла adjtime. Создайте этот каталог:

mkdir -pv /var/lib/hwclock

Подготовьте Util-linux к компиляции:

./configure --libdir=/usr/lib    \
            --runstatedir=/run   \
            --disable-chfn-chsh  \
            --disable-login      \
            --disable-nologin    \
            --disable-su         \
            --disable-setpriv    \
            --disable-runuser    \
            --disable-pylibmount \
            --disable-static     \
            --without-python     \
            ADJTIME_PATH=/var/lib/hwclock/adjtime \
            --docdir=/usr/share/doc/util-linux-2.39.3

Значение параметров настройки:

ADJTIME_PATH=/var/lib/hwclock/adjtime

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

--libdir=/usr/lib

Этот параметр гарантирует, что символические ссылки .so, будут указывать на файл общей библиотеки в том же каталоге (/usr/lib).

--disable-*

Этот параметр предотвращают появление предупреждений о сборке компонентов, для которых требуются пакеты, отсутствующие или еще не установленные в LFS.

--without-python

Этот параметр отключает использование Python. Это позволяет избежать попыток создания ненужных привязок.

--runstatedir=/run

Этот параметр устанавливает расположение сокета, используемого uuidd и libuuid.

Скомпилируйте пакет:

make

Установите пакет:

make install

7.12.2. Установка Util-linux - 32-битная версия

Выполните очистку после предыдущей сборки:

make distclean

Подготовьте Util-linux к компиляции:

CC="gcc -m32" \
./configure ADJTIME_PATH=/var/lib/hwclock/adjtime    \
            --libdir=/usr/lib32      \
            --host=i686-pc-linux-gnu \
            --docdir=/usr/share/doc/util-linux-2.39.3 \
            --disable-chfn-chsh  \
            --disable-login      \
            --disable-nologin    \
            --disable-su         \
            --disable-setpriv    \
            --disable-runuser    \
            --disable-pylibmount \
            --disable-static     \
            --without-python     \
            runstatedir=/run

Скомпилируйте пакет:

make

Установите пакет:

make DESTDIR=$PWD/DESTDIR install
cp -Rv DESTDIR/usr/lib32/* /usr/lib32
rm -rf DESTDIR

Подробная информация об этом пакете находится в Раздел 8.79.3, «Содержимое пакета Util-linux.»

7.13. Очистка и сохранение временной системы

7.13.1. Очистка

Во-первых, удалите установленную документацию, чтобы предотвратить ее попадание в конечную систему и сэкономить около 35 МБ места:

rm -rf /usr/share/{info,man,doc}/*

Во-вторых, в современных системах Linux файлы .la библиотеки libtool полезны только для libltdl. Никакие библиотеки в LFS не загружаются с помощью libltdl. Известно, что некоторые файлы .la могут привести к сбою во время сборки пакетов BLFS. Удалите эти файлы сейчас:

find /usr/{lib,libexec} -name \*.la -delete
find /usr/lib32 -name \*.la -delete

Сейчас размер системы составляет около 3 ГБ, однако каталог /tools больше не понадобится. Удалите его, чтобы освободить около 1 ГБ дискового пространства:

rm -rf /tools

7.13.2. Резервное копирование

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

Примечание

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

Следующие шаги выполняются вне среды chroot. Это означает, что прежде чем продолжить вы должны покинуть среду chroot. Причиной этого является то, что необходимо получить доступ к расположению файловой системы за пределами среды chroot для хранения/чтения архива резервных копий, который не должен размещаться в иерархии $LFS.

Если вы решили сделать резервную копию, покиньте среду chroot:

exit

Важно

Все следующие инструкции выполняются пользователем root в вашей хост-системе. Будьте особенно внимательны к командам, которые вы собираетесь запускать, поскольку ошибки, допущенные здесь, могут изменить вашу хост-систему. Имейте в виду, что переменная окружения LFS по умолчанию установлена для пользователя lfs, но может не быть установлена для root.

Всякий раз, когда команды должны выполняться от root, убедитесь, что вы установили переменную LFS.

Это обсуждалось в Раздел 2.6, «Установка переменной $LFS».

Перед созданием резервной копии размонтируйте виртуальные файловые системы:

mountpoint -q $LFS/dev/shm && umount $LFS/dev/shm
umount $LFS/dev/pts
umount $LFS/{sys,proc,run,dev}

Убедитесь, что у вас есть как минимум 1 ГБ свободного места на диске (исходные tar-архивы будут включены в архив резервных копий) в файловой системе, содержащей каталог, в котором вы создаете архив резервных копий.

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

Создайте архив резервной копии, выполнив следующую команду:

Примечание

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

cd $LFS
tar -cJpf $HOME/lfs-temp-tools-12.1.tar.xz .

Примечание

Если вы переходите к главе 8, не забудьте повторно войти в среду chroot, как описано в разделе «Важно» ниже.

7.13.3. Восстановление

В случае, если были допущены какие-либо ошибки и вам нужно начать все сначала, вы можете использовать эту резервную копию для восстановления системы и сэкономить время на восстановление. Поскольку исходники находятся в папке $LFS, они также включены в архив резервной копии, поэтому их не нужно загружать повторно. Убедившись, что переменная $LFS настроена правильно, вы можете восстановить резервную копию, выполнив следующие команды:

Предупреждение

Следующие команды чрезвычайно опасны. Если вы запустите команду rm -rf ./* от имени пользователя root и не перейдете в каталог $LFS или переменная окружения LFS не будет установлена для пользователя root, это уничтожит всю вашу хост-систему. ВЫ ПРЕДУПРЕЖДЕНЫ.

cd $LFS
rm -rf ./*
tar -xpf $HOME/lfs-temp-tools-12.1.tar.xz

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

Важно

Если вы покинули среду chroot, чтобы создать резервную копию или перезапустить сборку с помощью восстановления, не забудьте проверить, что виртуальные файловые системы все еще смонтированы (findmnt | grep $LFS). Если они не смонтированы, перемонтируйте их сейчас, как описано в Раздел 7.3, «Подготовка виртуальных файловых систем ядра», и повторно войдите в среду chroot (см. Раздел 7.4, «Вход в окружение Chroot»), прежде чем продолжить.

Часть IV. Сборка системы LFS

Глава 8. Установка базового системного программного обеспечения

8.1. Введение

В этой главе мы приступаем к сборке конечной системы LFS.

Установка программного обеспечения проста. Хотя во многих случаях инструкции по установке можно было бы сделать короче и универсальнее, мы решили предоставить полные инструкции для каждого пакета, чтобы свести к минимуму вероятность ошибок. Ключом к пониманию того, что заставляет систему Linux работать, является знание того, для чего используется каждый пакет и зачем он вам (или системе) может понадобиться.

Мы не рекомендуем использовать оптимизации. С ними программа может работать немного быстрее, но также они могут вызвать сложности при компиляции и проблемы при запуске программы. Если пакет не компилируется при использовании оптимизации, попробуйте скомпилировать его без оптимизации и посмотрите, решает ли это проблему. Даже если пакет компилируется при использовании оптимизации, существует риск, что он может быть скомпилирован неправильно из-за сложных взаимодействий между кодом и инструментами сборки. Также обратите внимание, что параметры -march и -mtune, не тестировались со значениями отличными от указанных в книге. Это может вызвать проблемы с пакетами набора инструментов (Binutils, GCC и Glibc). Небольшие потенциальные плюсы, достигаемые за счет оптимизации, часто перевешиваются рисками. Тем кто собирает LFS впервые рекомендуется делать это без пользовательских оптимизаций.

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

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

Примечание

Для всех пакетов в Глава 8 значения SBU и требуемое дисковое пространство указано с учетом тестов. Значения SBU были рассчитаны с использованием четырех ядер ЦП (-j4) для всех операций, если не указано иное.

8.1.1. О библиотеках

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

В инструкциях этой главы мы удаляем или отключаем установку большинства статических библиотек. Обычно это делается путем передачи параметра --disable-static при выполнении configure. Иногда необходимо использовать альтернативные методы. В некоторых случаях, в частности в пакетах Glibc и GCC, использование статических библиотек остается важным элементом процесса сборки пакетов.

Более подробное обсуждение библиотек смотрите Библиотеки: статические или общие? в книге BLFS.

8.2. Управление пакетами

Управление пакетами — часто cпрашиваемое дополнение к книге LFS. Менеджер пакетов позволяет отслеживать установку файлов, упрощая удаление и обновление пакетов. Хороший менеджер пакетов также будет обрабатывать конфигурационные файлы, чтобы сохранить пользовательские настройки при переустановке или обновлении пакета. Прежде чем вы начнете задаваться вопросом, НЕТ—в этом разделе не будет ни говориться, ни рекомендоваться какой-либо конкретный менеджер пакетов. Что он действительно предоставляет, так это обзор наиболее популярных методов и того, как они работают. Идеальным менеджером пакетов для вас может быть один из этих методов или комбинация двух и более методов. В этом разделе кратко упоминаются проблемы, которые могут возникнуть при обновлении пакетов.

Некоторые причины, по которым менеджер пакетов не упоминается в LFS или BLFS представлены ниже:

  • Рассмотрение управления пакетами отвлекает внимание от целей этих книг—обучения тому, как строится система Linux.

  • Существует множество решений для управления пакетами, каждое из которых имеет свои сильные и слабые стороны. Трудно найти такое, которое удовлетворит всех.

Есть несколько советов, написанных на тему управления пакетами. Посетите проект Советы возможно вы найдете решение, которое соответствует вашим потребностям.

8.2.1. Проблемы с обновлением

Менеджер пакетов упрощает обновление до более новых версий после их выпуска. Как правило, инструкции в книгах LFS и BLFS можно использовать для обновления до более новых версий. Вот некоторые моменты, о которых следует помнить при обновлении пакетов, особенно в работающей системе.

  • Если нужно обновить ядро Linux (например, с 5.10.17 до 5.10.18 или 5.11.1), дополнительно пересобирать ничего не нужно. Система продолжит нормально работать благодаря четко определенной границе между ядром и пользовательским пространством. В частности, заголовки Linux API не нужно обновлять вместе с ядром. Вам просто нужно перезагрузить систему, чтобы использовать обновленное ядро.

  • Если необходимо обновить Glibc до более новой версии (например, с Glibc-2.36 до Glibc-2.39) необходимо выполнить некоторые дополнительные действия, чтобы избежать поломки системы. Подробности читайте в Раздел 8.5, «Glibc-2.39».

  • Если пакет, содержащий общую библиотеку, обновляется и имя библиотеки изменилось, то любые пакеты, динамически связанные с библиотекой, необходимо перекомпилировать, чтобы связать с более новой библиотекой. (Обратите внимание, что между версией пакета и именем библиотеки нет никакой связи.) Например, рассмотрим пакет foo-1.2.3, который устанавливает общую библиотеку с именем libfoo.so.1. Предположим, вы обновили пакет до более новой версии foo-1.2.4, которая устанавливает общую библиотеку с именем libfoo.so.2, все пакеты, которые динамически связаны с libfoo.so.1, должны быть перекомпилированы для связи с libfoo.so.2, чтобы использовать новую версию библиотеки. Вы не должны удалять старые библиотеки, пока все зависимые пакеты не будут перекомпилированы.

  • Если пакет (прямо или косвенно) связан как со старым, так и с новым именем общей библиотеки (например, пакет ссылается как на libfoo.so.2, так и на libbar.so.1, в то время как последний ссылается на libfoo.so.3), пакет может работать неправильно, поскольку разные версии общей библиотеки содержат несовместимые определения для некоторых имен символов. Это может быть вызвано перекомпиляцией некоторых, но не всех, пакетов, связанных со старой общей библиотекой, после обновления пакета, предоставляющего общую библиотеку. Чтобы избежать этой проблемы, пользователям необходимо как можно скорее пересобрать каждый пакет, связанный с общей библиотекой, с обновленной версией (например, с libfoo.so.2 на libfoo.so.3).

  • Если пакет, содержащий общую библиотеку, обновляется, а имя библиотеки не меняется, но уменьшается номер версии файла библиотеки (например, библиотека по-прежнему называется libfoo.so.1, но имя файла библиотеки изменилось с libfoo.so.1.25 на libfoo.so.1.24), следует удалить файл библиотеки ранее установленной версии (в данном случае libfoo.so.1.25). В противном случае, команда ldconfig (запущенная самостоятельно с помощью командной строки или при установке какого-либо пакета) приведёт к сбросу символической ссылки libfoo.so.1, которая будет указывать на старый файл библиотеки, потому что кажется, что она имеет «более новую» версию, поскольку её номер версии больше. Такая ситуация может произойти, если вам нужно понизить версию пакета или авторы изменили схему управления версиями файлов библиотеки.

  • Если пакет, содержащий общую библиотеку, обновляется, а имя библиотеки не меняется, но устраняется серьезная проблема (особенно уязвимость в системе безопасности), необходимо перезапустить все работающие программы, связанные с общей библиотекой. Следующая команда, запущенная от имени пользователя root после завершения обновления, выведет список программ, которые использует старые версии этих библиотек (замените libfoo именем библиотеки):

    grep -l 'libfoo.*deleted' /proc/*/maps | tr -cd 0-9\\n | xargs -r ps u

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

  • Если исполняемая программа или библиотека перезаписаны, процессы, использующие код или данные из них, могут завершиться сбоем. Правильный способ обновить программу или общую библиотеку, не вызывая сбоя процесса, - это сначала удалить его, а затем установить новую версию. Команда install, предоставляемая Coreutils, уже реализовала это, и большинство пакетов используют ее для установки двоичных файлов и библиотек. Это означает, что большую часть времени вас не будет беспокоить эта проблема. Однако процесс установки некоторых пакетов (в частности, SpiderMonkey в BLFS) просто перезаписывает файл, если он существует, и вызывает сбой. Поэтому безопаснее сохранить свою работу и закрыть ненужные запущенные программы перед обновлением пакета.

8.2.2. Методы управления пакетами

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

8.2.2.1. Всё у меня в голове!

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

8.2.2.2. Установка в отдельные каталоги

Это упрощенный метод управления пакетами, для которого не требуется специальная программа управления. Каждый пакет устанавливается в отдельный каталог. Например, пакет foo-1.1 устанавливается в /opt/foo-1.1, а символическая ссылка создается из /opt/foo в /opt/foo-1.1. Когда появляется новая версия foo-1.2, она устанавливается в /opt/foo-1.2 и предыдущая символическая ссылка заменяется символической ссылкой на новую версию.

Переменные окружения, такие как PATH, MANPATH, INFOPATH, PKG_CONFIG_PATH, CPPFLAGS, LDFLAGS и файл конфигурации /etc/ld.so.conf, возможно, потребуется расширить, включив соответствующие подкаталоги в /opt/foo-x.y.

Этот подход используется в книге BLFS для установки некоторых очень больших пакетов, чтобы упростить их обновление. Если вы устанавливаете много таких пакетов, эта схема становится неуправляемой. Некоторые пакеты (например, заголовки Linux API и Glibc) могут плохо работать с такой структурой. Никогда не используйте её в масштабах всей системы.

8.2.2.3. Управление пакетами с использованием символических ссылок

Это разновидность предыдущей техники.Каждый пакет устанавливается аналогично, но вместо создания символической ссылки на общее имя пакета, каждому файлу создаётся символическая ссылка в иерархии каталогов /usr. Это исключает необходимость модификации значений переменных окружения. Хотя такие ссылки могут быть созданы пользователем, многие менеджеры пакетов используют именной такой подход. Наиболее популярные из них - Stow, Epkg, Graft и Depot.

Установку нужно сымитировать, чтобы пакет думал, что он установлен в /usr, хотя на самом деле он установлен в иерархии /usr/pkg. Установка таким способом обычно является нетривиальной задачей. Например, предположим, что вы устанавливаете пакет libfoo-1.1. Следующие инструкции могут привести к неправильной установке пакета:

./configure --prefix=/usr/pkg/libfoo/1.1
make
make install

Установка будет выполнена, но зависимые пакеты не смогут ссылаться на libfoo. Если вы скомпилируете пакет, который ссылается на libfoo, вы заметите, что он связан с /usr/pkg/libfoo/1.1/lib/libfoo.so.1 вместо /usr/lib/libfoo.so.1, как вы ожидаете. Правильный подход заключается в использовании переменной DESTDIR для управления установкой. Этот подход работает следующим образом:

./configure --prefix=/usr
make
make DESTDIR=/usr/pkg/libfoo/1.1 install

Большинство пакетов поддерживают этот подход, но есть и такие, которые этого не делают. Для несовместимых пакетов вам может потребоваться либо установить пакет вручную, либо вы можете установить проблемные пакеты в /opt.

8.2.2.4. На основе временной метки

В этом методе файлу присваивается временная метка перед установкой пакета. После установки простое использование команды find с соответствующими параметрами может создать журнал всех файлов, установленных после создания файла с временной метки. Менеджером пакетов, использующим этот подход, является install-log.

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

8.2.2.5. Отслеживание сценариев установки

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

Переменная среды LD_PRELOAD может быть установлена так, чтобы она указывала на библиотеку, которую нужно предварительно загрузить перед установкой. Во время установки эта библиотека отслеживает устанавливаемые пакеты, присоединяясь к различным исполняемым файлам, таким как cp, install, mv, и отслеживая системные вызовы, изменяющие файловую систему. Чтобы этот подход работал, все исполняемые файлы должны быть динамически связаны без битов suid или sgid. Предварительная загрузка библиотеки может вызвать некоторые нежелательные побочные эффекты во время установки. Поэтому рекомендуется выполнить некоторые тесты, чтобы убедиться, что менеджер пакетов ничего не сломает и что он регистрирует все соответствующие файлы.

Другой метод заключается в использовании strace, который регистрирует все системные вызовы, сделанные во время выполнения сценариев установки.

8.2.2.6. Создание архивов пакетов

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

Этот подход используется большинством менеджеров пакетов, имеющихся в коммерческих дистрибутивах. Примерами менеджеров пакетов, которые следуют этому подходу, являются RPM (который, кстати, требуется согласно спецификации Linux Standard Base Specification), pkg-utils, apt Debian и система Portage Gentoo. Описание того, как использовать этот стиль управления пакетами для систем LFS, находится по адресу https://mirror.linuxfromscratch.ru/hints/downloads/files/fakeroot.txt.

Создание файлов пакетов, содержащих информацию о зависимостях, является сложной задачей и выходит за рамки LFS.

Slackware использует систему на основе tar для архивов пакетов. Эта система намеренно не обрабатывает зависимости пакетов, как это делают более сложные менеджеры пакетов. Подробнее об управлении пакетами Slackware см. https://www.slackbook.org/html/package-management.html.

8.2.2.7. Пользовательское управление пакетами

Эта схема, уникальная для LFS, была разработана Маттиасом Бенкманом и доступна в проекте Hints. В этой схеме каждый пакет устанавливается отдельным пользователем в стандартные папки. Файлы, принадлежащие пакету, легко идентифицируются путем проверки идентификатора пользователя. Особенности и недостатки этого подхода слишком сложны, чтобы описывать их в этом разделе. Для получения более подробной информации, пожалуйста, ознакомьтесь с советами по адресу https://mirror.linuxfromscratch.ru/hints/downloads/files/more_control_and_pkg_man.txt.

8.2.3. Развертывание LFS на нескольких системах

Одним из преимуществ системы LFS является отсутствие файлов, зависящих от положения файлов на диске. Клонировать сборку LFS на другой компьютер с той же архитектурой, что и у базовой системы, так же просто, как использовать tar для архивации раздела LFS, содержащем корневой каталог (около 900 МБ в несжатом виде для базовой сборки LFS), скопировать этот файл по сети или с помощью CD / USB носителя в новую систему и распаковать его. После этого необходимо изменить несколько конфигурационных файлов. Файлы, которые, возможно, потребуется изменить представлены в списке ниже: /etc/hosts, /etc/fstab, /etc/passwd, /etc/group, /etc/shadow, /etc/ld.so.conf, /etc/sysconfig/rc.site, /etc/sysconfig/network, и /etc/sysconfig/ifconfig.eth0.

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

Примечание

Поступали некоторые сообщения о проблемах при копировании между похожими, но не идентичными архитектурами. Например, набор инструкций для Intel не идентичен набору инструкций для процессора AMD, и более поздние версии некоторых процессоров могут содержать инструкции, недоступные в более ранних версиях.

Наконец, новую систему необходимо сделать загрузочной так, как это описано в Раздел 10.4, «Использование GRUB для настройки процесса загрузки».

8.3. Man-pages-6.06

Пакет Man-pages содержит более 2400 справочных руководств.

Приблизительное время сборки: менее 0.1 SBU
Требуемое дисковое пространство: 33 MB

8.3.1. Установка пакета Man-pages

Удалите две справочные страницы для функций хэширования паролей. Libxcrypt предоставит улучшенную версию этих справочных страниц:

rm -v man3/crypt*

Установите пакет Man-pages выполнив команду:

make prefix=/usr install

8.3.2. Содержимое пакета Man-pages

Установленные файлы: различные справочные страницы

Краткое описание

man pages

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

8.4. Iana-Etc-20240125

Пакет Iana-Etc предоставляет данные для сетевых служб и протоколов.

Приблизительное время сборки: менее 0.1 SBU
Требуемое дисковое пространство: 4.8 MB

8.4.1. Установка пакета Iana-Etc

Для этого пакета необходимо лишь скопировать нужные файлы:

cp services protocols /etc

8.4.2. Содержимое пакета Iana-Etc

Установленные файлы: /etc/protocols и /etc/services

Краткое описание

/etc/protocols

Описывает различные интернет-протоколы DARPA, которые доступны из подсистемы TCP/IP

/etc/services

Обеспечивает сопоставление понятных текстовых имен для интернет-сервисов с назначенными им номерами портов и типами протоколов.

8.5. Glibc-2.39

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

Приблизительное время сборки: 12 SBU
Требуемое дисковое пространство: 3.1 GB

8.5.1. Установка пакета Glibc

Некоторые программы Glibc используют не совместимый с FHS каталог /var/db для хранения своих данных во время выполнения. Примените следующий патч, чтобы эти программы хранили свои данные в каталогах, совместимых с FHS:

patch -Np1 -i ../glibc-2.39-fhs-1.patch

Документация Glibc рекомендует выполнять компиляцию в отдельном каталоге:

mkdir -v build
cd       build

Убедитесь, что утилиты ldconfig и sln будут установлены в /usr/sbin:

echo "rootsbindir=/usr/sbin" > configparms

Подготовьте Glibc к компиляции:

../configure --prefix=/usr                            \
             --disable-werror                         \
             --enable-kernel=4.19                      \
             --enable-stack-protector=strong          \
             --with-headers=/usr/include              \
             --enable-multi-arch                      \
             libc_cv_slibdir=/usr/lib

Значение параметров настройки:

--disable-werror

Отключает параметр -Werror, передаваемый GCC. Это необходимо для запуска набора тестов.

--enable-kernel=4.19

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

--enable-stack-protector=strong

Этот параметр повышает безопасность системы за счет добавления дополнительного кода для проверки переполнения буфера. Обратите внимание, что Glibc всегда явно переопределяет параметры GCC по умолчанию, поэтому необходимо всегда указывать эту опцию, несмотря на то, что мы уже указали --enable-default-ssp для GCC.

--disable-nscd

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

libc_cv_slibdir=/usr/lib

Эта переменная устанавливает правильную библиотеку для всей системы. Мы не хотим, чтобы использовалась lib64

Скомпилируйте пакет:

make

Важно

В этом разделе набор тестов для Glibc считается критически важным. Ни в коем случае не пропускайте его.

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

make check

Вы можете увидеть, что ряд тестов завершились неудачей. Набор тестов Glibc в некоторой степени зависит от хост-системы. Несколько ошибок из более чем 5000 тестов можно игнорировать. Список наиболее распространенных проблем последних версий LFS:

  • Известно, что io/tst-lchmod не работает в среде chroot LFS.

  • Известно, что некоторые тесты, например nss/tst-nss-files-hosts-multi и nptl/tst-thread-affinity* завершаются неудачей из-за тайм-аута (особенно когда система работает относительно медленно и/или набор тестов запущен в несколько потоков). Эти тесты могут быть идентифицированы с помощью следующей команды:

    grep "Timed out" -l $(find -name \*.out)

    Можно повторно запустить отдельный тест, увеличив таймаут с помощью команды TIMEOUTFACTOR=<factor> make test t=<test name>. Например, TIMEOUTFACTOR=10 make test t=nss/tst-nss-files-hosts-multi перезапустит nss/tst-nss-files-hosts-multi, увеличив начальный таймаут в 10 раз.

  • Кроме того, некоторые тесты могут завершиться неудачно при использовании относительно старой модели процессора (например, elf/tst-cpu-features-cpuinfo) или версии ядра хоста (например, stdlib/tst-arc4random-thread).

На этапе установки Glibc будет жаловаться на отсутствие файла /etc/ld.so.conf, хотя это безобидное сообщение, предотвратить его появление можно с помощью команды:

touch /etc/ld.so.conf

Исправьте Makefile, чтобы пропустить устаревшую проверку работоспособности, которая завершается неудачей в современной конфигурации Glibc:

sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile

Важно

При обновлении Glibc до новой минорной версии (например, с Glibc-2.36 до Glibc-2.39) в работающей системе LFS вам необходимо принять некоторые дополнительные меры предосторожности, чтобы избежать поломки системы:

  • Обновление Glibc в системе LFS до версии 11.0 не поддерживается. Пересоберите LFS, если вы используете такую старую систему, но вам нужна более новая Glibc.

  • При обновлении системы LFS до версии 12.0 установите Libxcrypt следуя инструкции Раздел 8.27, «Libxcrypt-4.4.36.». В дополнение к обычной установке Libxcrypt, вы ДОЛЖНЫ следовать примечанию со страницы Libxcrypt, чтобы установить libcrypt.so.1* (заменив libcrypt.so.1 из предыдущей установки Glibc).

  • При обновлении системы LFS до версии 12.1 удалите программу nscd:

    rm -f /usr/sbin/nscd
  • Обновите ядро и перезагрузитесь, если оно старше 4.19 (проверьте текущую версию с помощью uname -r) или, если вы хотите обновить имеющееся ядро, выполните действия из Раздел 10.3, «Linux-6.7.4.»

  • Обновите заголовочные файлы API ядра, если они старше 4.19 (проверьте текущую версию с помощью cat /usr/include/linux/version.h) или, если вы просто хотите обновить их, следуйте Раздел 5.4, «Заголовочные файлы Linux-6.7.4 API» (но удалив $LFS из команды cp).

  • Выполните установку DESTDIR и обновите общие библиотеки Glibc в системе с помощью одной команды install:

    make DESTDIR=$PWD/dest install
    install -vm755 dest/usr/lib/*.so.* /usr/lib

Крайне важно строго следовать описанным выше шагам, если вы не совсем понимаете, что делаете. Любое неожиданное отклонение может сделать систему полностью непригодной для использования. ВЫ ПРЕДУПРЕЖДЕНЫ.

Затем продолжайте выполнять команды make install, sed для /usr/bin/ldd и команды для установки локалей. Как только они будут выполнены, перезагрузите систему.

Установите пакет:

make install

Исправьте жестко заданный путь к исполняемому загрузчику в скрипте ldd:

sed '/RTLDLIST=/s@/usr@@g' -i /usr/bin/ldd

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

Отдельные локали можно установить с помощью программы localedef. Например, вторая команда localedef приведенная ниже, объединяет определение независимой от набора символов локали /usr/share/i18n/locales/cs_CZ с набором символов /usr/share/i18n/charmaps/UTF-8.gz и добавляет результат в файл /usr/lib/locale/locale-archive. Следующие инструкции установят минимальный набор локалей, необходимый для оптимального охвата тестов

mkdir -pv /usr/lib/locale
localedef -i C -f UTF-8 C.UTF-8
localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8
localedef -i de_DE -f ISO-8859-1 de_DE
localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro
localedef -i de_DE -f UTF-8 de_DE.UTF-8
localedef -i el_GR -f ISO-8859-7 el_GR
localedef -i en_GB -f ISO-8859-1 en_GB
localedef -i en_GB -f UTF-8 en_GB.UTF-8
localedef -i en_HK -f ISO-8859-1 en_HK
localedef -i en_PH -f ISO-8859-1 en_PH
localedef -i en_US -f ISO-8859-1 en_US
localedef -i en_US -f UTF-8 en_US.UTF-8
localedef -i es_ES -f ISO-8859-15 es_ES@euro
localedef -i es_MX -f ISO-8859-1 es_MX
localedef -i fa_IR -f UTF-8 fa_IR
localedef -i fr_FR -f ISO-8859-1 fr_FR
localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro
localedef -i fr_FR -f UTF-8 fr_FR.UTF-8
localedef -i is_IS -f ISO-8859-1 is_IS
localedef -i is_IS -f UTF-8 is_IS.UTF-8
localedef -i it_IT -f ISO-8859-1 it_IT
localedef -i it_IT -f ISO-8859-15 it_IT@euro
localedef -i it_IT -f UTF-8 it_IT.UTF-8
localedef -i ja_JP -f EUC-JP ja_JP
localedef -i ja_JP -f SHIFT_JIS ja_JP.SJIS 2> /dev/null || true
localedef -i ja_JP -f UTF-8 ja_JP.UTF-8
localedef -i nl_NL@euro -f ISO-8859-15 nl_NL@euro
localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R
localedef -i ru_RU -f UTF-8 ru_RU.UTF-8
localedef -i se_NO -f UTF-8 se_NO.UTF-8
localedef -i ta_IN -f UTF-8 ta_IN.UTF-8
localedef -i tr_TR -f UTF-8 tr_TR.UTF-8
localedef -i zh_CN -f GB18030 zh_CN.GB18030
localedef -i zh_HK -f BIG5-HKSCS zh_HK.BIG5-HKSCS
localedef -i zh_TW -f UTF-8 zh_TW.UTF-8

Кроме того, установите локаль для вашей страны, языка и набора символов.

В качестве альтернативы, установите сразу все локали перечисленные в файле glibc-2.39/localedata/SUPPORTED (он включает все локали из списка выше и многие другие), выполнив команду:

make localedata/install-locales

Затем используйте команду localedef для создания и установки локалей, не перечисленных в файле glibc-2.39/localedata/SUPPORTED, когда они вам понадобятся. Например, для некоторых тестов в этой главе потребуются следующие две локали:

localedef -i C -f UTF-8 C.UTF-8
localedef -i ja_JP -f SHIFT_JIS ja_JP.SJIS 2> /dev/null || true

Примечание

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

8.5.2. Настройка Glibc

8.5.2.1. Добавление nsswitch.conf

Необходимо создать файл /etc/nsswitch.conf, потому что настроенный по умолчанию Glibc плохо работает в сетевой среде.

Создайте новый фай /etc/nsswitch.conf, выполнив следующие действия:

cat > /etc/nsswitch.conf << "EOF"
# Begin /etc/nsswitch.conf

passwd: files
group: files
shadow: files

hosts: files dns
networks: files

protocols: files
services: files
ethers: files
rpc: files

# End /etc/nsswitch.conf
EOF

8.5.2.2. Добавление данных о часовом поясе

Установите и настройте часовой пояс следующим образом:

tar -xf ../../tzdata2024a.tar.gz

ZONEINFO=/usr/share/zoneinfo
mkdir -pv $ZONEINFO/{posix,right}

for tz in etcetera southamerica northamerica europe africa antarctica  \
          asia australasia backward; do
    zic -L /dev/null   -d $ZONEINFO       ${tz}
    zic -L /dev/null   -d $ZONEINFO/posix ${tz}
    zic -L leapseconds -d $ZONEINFO/right ${tz}
done

cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO
zic -d $ZONEINFO -p America/New_York
unset ZONEINFO

Значение команд zic:

zic -L /dev/null ...

Создаёт часовые пояса posix без секунд координации. Обычно их помещают как в zoneinfo так и в zoneinfo/posix. Часовые пояса POSIX должны быть прописаны в zoneinfo, иначе различные тесты будут сообщать об ошибках. На встраиваемых системах с небольшим диском, где часовые пояса никогда не будут обновляться, можно сэкономить примерно 1.9 MB не используя каталог posix, однако некоторые приложения или наборы тестов могут вызывать сбои.

zic -L leapseconds ...

Создаёт правильные часовые пояса с секундами координации. На встраиваемых системах с небольшим диском, где часовые пояса никогда не будут обновляться, а правильность времени неважна, можно выиграть примерно 1.9 MB, исключив каталог right.

zic ... -p ...

Создаёт файл posixrules. Используется New York, потому что POSIX требует, чтобы правила перехода на летнее время соответствовали правилам США.

Один из способов определить местный часовой пояс — запустить следующий скрипт:

tzselect

После нескольких вопросов о местоположении скрипт выдаст наименование часового пояса (например America/Edmonton). В файле /usr/share/zoneinfo перечислены и другие возможные часовые пояса, такие как Canada/Eastern или EST5EDT, которые не распознаются скриптом, но могут быть использованы.

Создайте файл /etc/localtime выполнив:

ln -sfv /usr/share/zoneinfo/<xxx> /etc/localtime

Замените <xxx> на имя выбранного часового пояса (например, Europe/Moscow).

8.5.2.3. Настройка динамического загрузчика

По умолчанию, динамический загрузчик (/lib/ld-linux.so.2) ищет в каталоге /usr/lib, нужные для работы программ библиотеки. Однако, если библиотеки находятся в другом каталоге, то его необходимо указать в файле /etc/ld.so.conf, чтобы динамический загрузчик мог их найти. Два каталога - /usr/local/lib и /opt/lib часто используются для дополнительных библиотек, поэтому добавьте их в пути поиска для динамического загрузчика.

Создайте новый файл /etc/ld.so.conf выполнив:

cat > /etc/ld.so.conf << "EOF"
# Begin /etc/ld.so.conf
/usr/local/lib
/opt/lib

EOF

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

cat >> /etc/ld.so.conf << "EOF"
# Add an include directory
include /etc/ld.so.conf.d/*.conf

EOF
mkdir -pv /etc/ld.so.conf.d

8.5.3. Сборка Glibc — 32-битная версия

Теперь перекомпилируйте Glibc для m32. Извлеченный исходный код можно использовать повторно, но его необходимо очистить перед установкой Glibc m32.

Очистите каталог сборки и удалите артефакты от предыдущей сборки:

rm -rf ./*
find .. -name "*.a" -delete

Сконфигурируйте Glibc для m32 с помощью следующих команд:

CC="gcc -m32" CXX="g++ -m32" \
../configure                             \
      --prefix=/usr                      \
      --host=i686-pc-linux-gnu           \
      --build=$(../scripts/config.guess) \
      --enable-kernel=4.19                \
      --with-headers=/usr/include        \
      --enable-multi-arch                \
      --libdir=/usr/lib32                \
      --libexecdir=/usr/lib32            \
      libc_cv_slibdir=/usr/lib32

Скомпилируйте пакет:

make

Установите пакет:

make DESTDIR=$PWD/DESTDIR install
cp -a DESTDIR/usr/lib32/* /usr/lib32/
install -vm644 DESTDIR/usr/include/gnu/{lib-names,stubs}-32.h \
               /usr/include/gnu/

Добавьте имя библиотеки в файл конфигурации динамического загрузчика:

echo "/usr/lib32" >> /etc/ld.so.conf

Внимание

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

echo 'int main(){}' > dummy.c
gcc -m32 dummy.c
readelf -l a.out | grep '/ld-linux'

Если все работает правильно, ошибок быть не должно, а вывод последней команды будет иметь вид:

[Requesting program interpreter: /lib/ld-linux.so.2]

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

Как только все будет хорошо, удалите тестовые файлы:

rm -v dummy.c a.out

8.5.4. Содержимое пакета Glibc

Установленные программы: gencat, getconf, getent, iconv, iconvconfig, ldconfig, ldd, lddlibc4, ld.so (symlink to ld-linux-x86-64.so.2 or ld-linux.so.2), locale, localedef, makedb, mtrace, pcprofiledump, pldd, sln, sotruss, sprof, tzselect, xtrace, zdump и zic
Установленные библиотеки: ld-linux-x86-64.so.2, ld-linux.so.2, libBrokenLocale.{a,so}, libanl.{a,so}, libc.{a,so}, libc_nonshared.a, libc_malloc_debug.so, libdl.{a,so.2}, libg.a, libm.{a,so}, libmcheck.a, libmemusage.so, libmvec.{a,so}, libnsl.so.1, libnss_compat.so, libnss_dns.so, libnss_files.so, libnss_hesiod.so, libpcprofile.so, libpthread.{a,so.0}, libresolv.{a,so}, librt.{a,so.1}, libthread_db.so и libutil.{a,so.1}
Созданные каталоги: /usr/include/arpa, /usr/include/bits, /usr/include/gnu, /usr/include/net, /usr/include/netash, /usr/include/netatalk, /usr/include/netax25, /usr/include/neteconet, /usr/include/netinet, /usr/include/netipx, /usr/include/netiucv, /usr/include/netpacket, /usr/include/netrom, /usr/include/netrose, /usr/include/nfs, /usr/include/protocols, /usr/include/rpc, /usr/include/sys, /usr/lib/audit, /usr/lib/gconv, /usr/lib/locale, /usr/libexec/getconf, /usr/share/i18n, /usr/share/zoneinfo и /var/lib/nss_db

Краткое описание

gencat

Создает каталоги сообщений

getconf

Отображает настройки системы для специфичных переменных файловой системы

getent

Получает записи из административной базы данных

iconv

Выполняет преобразование набора символов

iconvconfig

Создает быстрозагружаемые файлы настроек модуля iconv

ldconfig

Настраивает привязки времени выполнения динамического компоновщика

ldd

Сообщает, какие общие библиотеки требуются каждой программе или общей библиотеке

lddlibc4

Помогает ldd работать с объектными файлами. Он не существует на более новых архитектурах, таких как x86_64

locale

Выводит различную информацию о текущей локали

localedef

Компилирует спецификации локали

makedb

Создает простую базу данных на основе текстового ввода

mtrace

Читает и интерпретирует файл трассировки памяти; отображает сводку в удобочитаемом формате

pcprofiledump

Создает дамп информации, генерируемой при профилировании ПК

pldd

Перечисляет динамические общие объекты, используемые запущенными процессами.

sln

Статически скомпонованная программа ln

sotruss

Отслеживает вызовы процедур общей библиотеки указанной команды

sprof

Читает и отображает данные профилирования общих объектов.

tzselect

Запрашивает у пользователя информацию о текущем местоположении системы и выводит описание соответствующего часового пояса.

xtrace

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

zdump

Выдает дамп часового пояса

zic

Компилятор часовых поясов

ld-*.so

Вспомогательная программа для исполняемых файлов общей библиотеки

libBrokenLocale

Используется внутри Glibc как грубый хак для запуска сломанных программ (например, некоторые приложения Motif). Прочитайте комментарии в glibc-2.39/locale/broken_cur_max.c для получения дополнительной информации

libanl

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

libc

Основная библиотека C

libc_malloc_debug

Включает проверку выделения памяти при предварительной загрузке

libdl

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

libg

Библиотека-заглушка без функций. Раньше была библиотекой среды выполнения для g++

libm

Математическая библиотека

libmvec

Библиотека векторных математических вычислений, подключаемая по мере необходимости при использовании libm

libmcheck

Включает проверку выделения памяти при подключении к

libmemusage

Используется memusage для сбора информации об использовании памяти программой

libnsl

Библиотека сетевых служб, которая в настоящее время устарела

libnss_*

Модули Name Service Switch, содержащие функции для разрешения имен хостов, имен пользователей, имен групп, псевдонимов, служб, протоколов и т. д. Загружаются libc в соответствии с конфигурацией в /etc/nsswitch.conf

libpcprofile

Содержит функции профилирования, используемые для отслеживания времени, потраченного процессором в конкретных строках исходного кода

libpthread

Библиотека-заглушка, не содержащая функций. Ранее содержала функции, обеспечивающие большинство интерфейсов, заданных POSIX.1c Threads Extensions (расширения реализации потоков) и интерфейсы семафоров, указанных в POSIX.1b Real-time Extension (расширения реального времени), теперь эти функции находятся в libc

libresolv

Содержит функции создания, пересылки и интерпретации пакетов, используемых на серверах доменных имен в сети интернет

librt

Содержит функции, реализующие большую часть интерфейсов, определяемых в POSIX.1b Real-time Extension (расширения реального времени)

libthread_db

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

libutil

Библиотека-заглушка, не содержащая функций. Ранее содержал код для «стандартных» функций, используемых во многих утилитах Unix. Эти функции теперь находятся в libc

8.6. Zlib-1.3.1

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

Приблизительное время сборки: менее 0.1 SBU
Требуемое дисковое пространство: 6.4 MB

8.6.1. Установка пакета Zlib

Подготовьте Zlib к компиляции:

./configure --prefix=/usr

Скомпилируйте пакет:

make

Чтобы протестировать пакет, выполните:

make check

Установите пакет:

make install

Удалите бесполезную статическую библиотеку:

rm -fv /usr/lib/libz.a

8.6.2. Установка Zlib - 32-битная версия

Выполните очистку после предыдущей сборки:

make distclean

Подготовьте Zlib к компиляции:

CFLAGS+=" -m32" CXXFLAGS+=" -m32" \
./configure --prefix=/usr \
    --libdir=/usr/lib32

Скомпилируйте пакет:

make

Установите пакет:

make DESTDIR=$PWD/DESTDIR install
cp -Rv DESTDIR/usr/lib32/* /usr/lib32
rm -rf DESTDIR

8.6.3. Содержимое пакета Zlib

Установленные библиотеки: libz.so

Краткое описание

libz

Содержит функции сжатия и распаковки, используемые некоторыми программами.

8.7. Bzip2-1.0.8

Пакет Bzip2 содержит программы для сжатия и распаковки файлов. Сжатие текстовых файлов с помощью bzip2 даёт больший процент сжатия, чем традиционный gzip.

Приблизительное время сборки: менее 0.1 SBU
Требуемое дисковое пространство: 7.2 MB

8.7.1. Установка пакета Bzip2

Примените патч, который установит документацию для этого пакета:

patch -Np1 -i ../bzip2-1.0.8-install_docs-1.patch

Следующая команда гарантирует установку символических ссылок с относительным путём:

sed -i 's@\(ln -s -f \)$(PREFIX)/bin/@\1@' Makefile

Убедитесь, что справочные страницы установлены в правильном месте:

sed -i "s@(PREFIX)/man@(PREFIX)/share/man@g" Makefile

Подготовьте Bzip2 к компиляции:

make -f Makefile-libbz2_so
make clean

Значение параметра make:

-f Makefile-libbz2_so

Этот параметр позволяет выполнить сборку, с использованием другого Makefile, в данном случае Makefile-libbz2_so, который создает динамическую библиотеку libbz2.so и связывает с ней Bzip2.

Скомпилируйте и протестируйте пакет:

make

Установите пакет:

make PREFIX=/usr install

Установите библиотеку:

cp -av libbz2.so.* /usr/lib
ln -sv libbz2.so.1.0.8 /usr/lib/libbz2.so

Установите общий бинарный файл bzip2 в каталог /usr/bin, и замените две копии bzip2 символическими ссылками:

cp -v bzip2-shared /usr/bin/bzip2
for i in /usr/bin/{bzcat,bunzip2}; do
  ln -sfv bzip2 $i
done

Удалите ненужную статическую библиотеку:

rm -fv /usr/lib/libbz2.a

8.7.2. Установка Bzip2 - 32-битная версия

Выполните очистку после предыдущей сборки:

make clean

Скомпилируйте пакет:

sed -e "s/^CC=.*/CC=gcc -m32/" -i Makefile{,-libbz2_so}
make -f Makefile-libbz2_so
make libbz2.a

Установите пакет:

install -Dm755 libbz2.so.1.0.8 /usr/lib32/libbz2.so.1.0.8
ln -sf libbz2.so.1.0.8 /usr/lib32/libbz2.so
ln -sf libbz2.so.1.0.8 /usr/lib32/libbz2.so.1
ln -sf libbz2.so.1.0.8 /usr/lib32/libbz2.so.1.0
install -Dm644 libbz2.a /usr/lib32/libbz2.a

8.7.3. Содержимое пакета Bzip2

Установленные программы: bunzip2 (ссылка на bzip2), bzcat (ссылка на bzip2), bzcmp (ссылка на bzdiff), bzdiff, bzegrep (ссылка на bzgrep), bzfgrep (ссылка на bzgrep), bzgrep, bzip2, bzip2recover, bzless (ссылка на bzmore) и bzmore
Установленные библиотеки: libbz2.so
Созданные каталоги: /usr/share/doc/bzip2-1.0.8

Краткое описание

bunzip2

Распаковывает bzip-файлы

bzcat

Распаковывает в поток стандартного вывода

bzcmp

Запускает программу cmp для bzip файлов

bzdiff

Запускает программу diff для bzip файлов

bzegrep

Запускает программу egrep для bzip файлов

bzfgrep

Запускает программу fgrep для bzip файлов

bzgrep

Запускает программу grep для bzip файлов

bzip2

Сжимает файлы, используя алгоритм сжатия текста с блочной сортировкой Барроуза — Уилера и кодирование Хафмана; степень сжатия лучше, чем у более традиционных архиваторов, использующих алгоритмы «Lempel-Ziv», например gzip

bzip2recover

Пытается восстанавливать данные из поврежденных архивов

bzless

Запускает программу less для bzip файлов

bzmore

Запускает программу more для bzip файлов

libbz2

Библиотека, реализующая сжатие данных без потерь с использованием алгоритма Барроуза-Уилера.

8.8. Xz-5.4.6

Пакет Xz содержит программы для сжатия и распаковки файлов. Он предоставляет возможности для lzma и более новых форматов сжатия xz. Сжатие текстовых файлов с помощью xz дает лучший процент сжатия, чем с традиционные gzip или bzip2.

Приблизительное время сборки: 0.1 SBU
Требуемое дисковое пространство: 25 MB

8.8.1. Установка пакета Xz

Подготовьте Xz к компиляции:

./configure --prefix=/usr    \
            --disable-static \
            --docdir=/usr/share/doc/xz-5.4.6

Скомпилируйте пакет:

make

Чтобы протестировать пакет, выполните:

make check

Установите пакет:

make install

8.8.2. Установка Xz - 32-битная версия

Выполните очистку после предыдущей сборки:

make distclean

Подготовьте Xz к компиляции:

CC="gcc -m32" ./configure \
    --host=i686-pc-linux-gnu      \
    --prefix=/usr                 \
    --libdir=/usr/lib32           \
    --disable-static

Скомпилируйте пакет:

make

Установите пакет:

make DESTDIR=$PWD/DESTDIR install
cp -Rv DESTDIR/usr/lib32/* /usr/lib32
rm -rf DESTDIR

8.8.3. Содержимое пакета Xz

Установленные программы: lzcat (ссылка на xz), lzcmp (ссылка на xzdiff), lzdiff (ссылка на xzdiff), lzegrep (ссылка на xzgrep), lzfgrep (ссылка на xzgrep), lzgrep (ссылка на xzgrep), lzless (ссылка на xzless), lzma (ссылка на xz), lzmadec, lzmainfo, lzmore (ссылка на xzmore), unlzma (ссылка на xz), unxz (ссылка на xz), xz, xzcat (ссылка на xz), xzcmp (ссылка на xzdiff), xzdec, xzdiff, xzegrep (ссылка на xzgrep), xzfgrep (ссылка на xzgrep), xzgrep, xzless и xzmore
Установленные библиотеки: liblzma.so
Созданные каталоги: /usr/include/lzma и /usr/share/doc/xz-5.4.6

Краткое описание

lzcat

Распаковывает в стандартный поток вывода

lzcmp

Запускает cmp для файлов сжатых LZMA

lzdiff

Запускает diff для файлов сжатых LZMA

lzegrep

Запускает egrep для файлов сжатых LZMA

lzfgrep

Запускает fgrep для файлов сжатых LZMA

lzgrep

Запускает grep для файлов сжатых LZMA

lzless

Запускает less для файлов сжатых LZMA

lzma

Сжимает или распаковывает файлы в формате LZMA

lzmadec

Небольшой и быстрый декодер для файлов сжатых LZMA.

lzmainfo

Показывает информацию, хранящуюся в заголовке сжатого файла LZMA

lzmore

Запускает more для файлов сжатых LZMA

unlzma

Распаковывает файлы в формате LZMA

unxz

Распаковывает файлы в формате XZ

xz

Сжимает или распаковывает файлы в формате XZ.

xzcat

Распаковывает в стандартный поток вывода

xzcmp

Запускает cmp для сжатых XZ файлов

xzdec

Небольшой и быстрый декодер для файлов сжатых XZ

xzdiff

Запускает diff для сжатых XZ файлов

xzegrep

Запускает egrep для сжатых XZ файлов

xzfgrep

Запускает fgrep для сжатых XZ файлов

xzgrep

Запускает grep для сжатых XZ файлов

xzless

Запускает less для сжатых XZ файлов

xzmore

Запускает more для сжатых XZ файлов

liblzma

Библиотека, реализующая сжатие данных без потерь с блочной сортировкой с использованием алгоритма Lempel-Ziv-Markov

8.9. Zstd-1.5.5

Zstandard — это алгоритм сжатия в реальном времени, обеспечивающий высокую степень сжатия. Он предлагает очень широкий диапазон компромиссов между сжатием и скоростью при поддержке очень быстрого декодера.

Приблизительное время сборки: 0.5 SBU
Требуемое дисковое пространство: 77 MB

8.9.1. Установка пакета Zstd

Скомпилируйте пакет:

make prefix=/usr

Примечание

В выходных данных теста есть несколько мест, выводящих сообщение 'failed'. Они ожидаемы, и только 'FAIL' является фактическим сбоем теста. Сбоев при тестировании быть не должно.

Чтобы протестировать пакет, выполните:

make check

Установите пакет:

make prefix=/usr install

Удалите статическую библиотеку:

rm -v /usr/lib/libzstd.a

8.9.2. Установка Zstd - 32-битная версия

Выполните очистку после предыдущей сборки:

make clean

Скомпилируйте пакет:

CC="gcc -m32" make prefix=/usr

Установите пакет:

make prefix=/usr DESTDIR=$PWD/DESTDIR install
cp -Rv DESTDIR/usr/lib/* /usr/lib32/
sed -e "/^libdir/s/lib$/lib32/" -i /usr/lib32/pkgconfig/libzstd.pc
rm -rf DESTDIR

8.9.3. Содержимое пакета Zstd

Установленные программы: zstd, zstdcat (ссылка на zstd), zstdgrep, zstdless, zstdmt (ссылка на zstd) и unzstd (ссылка на zstd)
Установленные библиотеки: libzstd.so

Краткое описание

zstd

Сжимает или распаковывает файлы в формате ZSTD

zstdgrep

Запускает grep на сжатых ZSTD файлах

zstdless

Запускает less на сжатых ZSTD файлах

libzstd

Библиотека, реализующая сжатие данных без потерь, с использованием алгоритма ZSTD

8.10. File-5.45

Пакет File содержит утилиту для определения типа указанного файла или файлов

Приблизительное время сборки: менее 0.1 SBU
Требуемое дисковое пространство: 17 MB

8.10.1. Установка пакета File

Подготовьте File к компиляции:

./configure --prefix=/usr

Скомпилируйте пакет:

make

Чтобы протестировать пакет, выполните:

make check

Установите пакет:

make install

8.10.2. Установка File - 32-битная версия

Выполните очистку после предыдущей сборки:

make distclean

Подготовьте File к компиляции:

CC="gcc -m32" ./configure \
    --prefix=/usr         \
    --libdir=/usr/lib32   \
    --host=i686-pc-linux-gnu

Скомпилируйте пакет:

make

Установите пакет:

make DESTDIR=$PWD/DESTDIR install
cp -Rv DESTDIR/usr/lib32/* /usr/lib32
rm -rf DESTDIR

8.10.3. Содержимое пакета File

Установленные программы: file
Установленные библиотеки: libmagic.so

Краткое описание

file

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

libmagic

Содержит функции распознавания магических чисел используемые программой file

8.11. Readline-8.2

Пакет Readline представляет собой набор библиотек, предлагающих возможности редактирования прямо в командной строке и просмотра истории команд.

Приблизительное время сборки: менее 0.1 SBU
Требуемое дисковое пространство: 16 MB

8.11.1. Установка пакета Readline

Переустановка пакета Readline приводит к перемещению старых библиотек в <libraryname>.old. Обычно это не вызывает проблем, но в некоторых случаях могут возникать ошибки линковки с ldconfig. Этого можно избежать, выполнив следующие две команды sed:

sed -i '/MV.*old/d' Makefile.in
sed -i '/{OLDSUFF}/c:' support/shlib-install

Теперь устраните проблему, выявленную разработчиками:

patch -Np1 -i ../readline-8.2-upstream_fixes-3.patch

Подготовьте Readline к компиляции:

./configure --prefix=/usr    \
            --disable-static \
            --with-curses    \
            --docdir=/usr/share/doc/readline-8.2

Значение нового параметра configure:

--with-curses

Этот параметр сообщает Readline, что он может найти функции библиотеки termcap в библиотеке curses, а не в отдельной библиотеке termcap. Это позволит сгенерировать корректный файл readline.pc.

Скомпилируйте пакет:

make SHLIB_LIBS="-lncursesw"

Значение параметра make:

SHLIB_LIBS="-lncursesw"

Этот параметр принудительно линкует Readline с библиотекой libncursesw.

С этим пакетом не поставляется набор тестов.

Установите пакет:

make SHLIB_LIBS="-lncursesw" install

По желанию установите документацию:

install -v -m644 doc/*.{ps,pdf,html,dvi} /usr/share/doc/readline-8.2

8.11.2. Установка Readline - 32-битная версия

Выполните очистку после предыдущей сборки:

make distclean

Подготовьте Readline к компиляции:

CC="gcc -m32" ./configure \
    --host=i686-pc-linux-gnu      \
    --prefix=/usr                 \
    --libdir=/usr/lib32           \
    --disable-static              \
    --with-curses

Скомпилируйте пакет:

make SHLIB_LIBS="-lncursesw"

Установите пакет:

make SHLIB_LIBS="-lncursesw" DESTDIR=$PWD/DESTDIR install
cp -Rv DESTDIR/usr/lib32/* /usr/lib32
rm -rf DESTDIR

8.11.3. Содержимое пакета Readline

Установленные библиотеки: libhistory.so и libreadline.so
Созданные каталоги: /usr/include/readline и /usr/share/doc/readline-8.2

Краткое описание

libhistory

Обеспечивает согласованный пользовательский интерфейс для вызова строк из истории

libreadline

Предоставляет набор команд для управления текстом, введенным в интерактивном сеансе программы.

8.12. M4-1.4.19

Пакет M4 содержит макропроцессор.

Приблизительное время сборки: 0.3 SBU
Требуемое дисковое пространство: 49 MB

8.12.1. Установка пакета M4

Подготовьте M4 к компиляции:

./configure --prefix=/usr

Скомпилируйте пакет:

make

Чтобы протестировать пакет, выполните:

make check

Установите пакет:

make install

8.12.2. Содержимое пакета M4

Установленные программы: m4

Краткое описание

m4

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

8.13. Bc-6.7.5

Пакет Bc содержит язык для обработки чисел произвольной точности.

Приблизительное время сборки: менее 0.1 SBU
Требуемое дисковое пространство: 7.8 MB

8.13.1. Установка пакета Bc

Подготовьте Bc к компиляции:

CC=gcc ./configure --prefix=/usr -G -O3 -r

Значение параметров настройки:

CC=gcc

Этот параметр определяет используемый компилятор

-G

Пропускает часть тестов, которые не будут работать, пока не будет установлена программа bc.

-O3

Указывает используемый уровень оптимизации.

-r

Включает использование Readline для улучшения функции редактирования строк в bc.

Скомпилируйте пакет:

make

Чтобы протестировать bc, запустите:

make test

Установите пакет:

make install

8.13.2. Содержимое пакета Bc

Установленные программы: bc и dc

Краткое описание

bc

Калькулятор командной строки

dc

Калькулятор командной строки с обратной польской нотацией

8.14. Flex-2.6.4

Пакет Flex содержит инструмент для генерации программ, распознающих заданные шаблоны в тексте

Приблизительное время сборки: 0.1 SBU
Требуемое дисковое пространство: 33 MB

8.14.1. Установка пакета Flex

Подготовьте Flex к компиляции:

./configure --prefix=/usr \
            --docdir=/usr/share/doc/flex-2.6.4 \
            --disable-static

Скомпилируйте пакет:

make

Для тестирования пакета (около 0,5 SBU) выполните:

make check

Установите пакет:

make install

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

ln -sv flex   /usr/bin/lex
ln -sv flex.1 /usr/share/man/man1/lex.1

8.14.2. Содержимое пакета Flex

Установленные программы: flex, flex++ (ссылка на flex), и lex (ссылка на flex)
Установленные библиотеки: libfl.so
Созданные каталоги: /usr/share/doc/flex-2.6.4

Краткое описание

flex

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

flex++

Расширение flex используется для генерации кода и классов C++. Является символической ссылкой на flex

lex

Символическая ссылка, запускает flex в режиме эмуляции lex

libfl

Библиотека flex

8.15. Tcl-8.6.13

Пакет Tcl содержит Tool Command Language, надежный скриптовый язык общего назначения. Пакет Expect написан на языке Tcl (произносится как "тикл").

Приблизительное время сборки: 2.7 SBU
Требуемое дисковое пространство: 89 MB

8.15.1. Установка пакета Tcl

Этот пакет и следующие два (Expect и DejaGNU) устанавливаются для поддержки возможности тестирования Binutils, GCC и других пакетов. Установка трех пакетов для целей тестирования может показаться избыточной, но вы будете чувствовать себя увереннее, когда знаете, что наиболее важные инструменты работают правильно.

Подготовьте Tcl к компиляции:

SRCDIR=$(pwd)
cd unix
./configure --prefix=/usr           \
            --mandir=/usr/share/man

Соберите пакет:

make

sed -e "s|$SRCDIR/unix|/usr/lib|" \
    -e "s|$SRCDIR|/usr/include|"  \
    -i tclConfig.sh

sed -e "s|$SRCDIR/unix/pkgs/tdbc1.1.5|/usr/lib/tdbc1.1.5|" \
    -e "s|$SRCDIR/pkgs/tdbc1.1.5/generic|/usr/include|"    \
    -e "s|$SRCDIR/pkgs/tdbc1.1.5/library|/usr/lib/tcl8.6|" \
    -e "s|$SRCDIR/pkgs/tdbc1.1.5|/usr/include|"            \
    -i pkgs/tdbc1.1.5/tdbcConfig.sh

sed -e "s|$SRCDIR/unix/pkgs/itcl4.2.3|/usr/lib/itcl4.2.3|" \
    -e "s|$SRCDIR/pkgs/itcl4.2.3/generic|/usr/include|"    \
    -e "s|$SRCDIR/pkgs/itcl4.2.3|/usr/include|"            \
    -i pkgs/itcl4.2.3/itclConfig.sh

unset SRCDIR

Различные инструкции «sed» после команды «make» удаляют ссылки на каталог сборки из файлов конфигурации и заменяют их на созданные каталоги. Это необязательно для остальной части LFS, но может понадобиться в случае, когда пакет, собранный позже, использует Tcl.

Чтобы протестировать пакет, выполните:

make test

Установите пакет:

make install

Сделайте установленную библиотеку доступной для записи, чтобы позже можно было удалить отладочные символы:

chmod -v u+w /usr/lib/libtcl8.6.so

>Установите заголовочные файлы Tcl. Они потребуются для следующего пакета - Expect.

make install-private-headers

Теперь создайте необходимую символическую ссылку:

ln -sfv tclsh8.6 /usr/bin/tclsh

Переименуйте справочную страницу, которая конфликтует со справочной страницей Perl:

mv /usr/share/man/man3/{Thread,Tcl_Thread}.3

При необходимости установите документацию, выполнив следующие команды:

cd ..
tar -xf ../tcl8.6.13-html.tar.gz --strip-components=1
mkdir -v -p /usr/share/doc/tcl-8.6.13
cp -v -r  ./html/* /usr/share/doc/tcl-8.6.13

8.15.2. Содержимое пакета Tcl

Установленные программы: tclsh (ссылка на tclsh8.6) и tclsh8.6
Установленные библиотеки: libtcl8.6.so и libtclstub8.6.a

Краткое описание

tclsh8.6

Командная оболочка Tcl

tclsh

Ссылка на tclsh8.6

libtcl8.6.so

Библиотека Tcl

libtclstub8.6.a

Библиотека-заглушка Tcl

8.16. Expect-5.45.4

Пакет Expect содержит инструменты для автоматизации работы интерактивных приложений, таких как telnet, ftp, passwd, fsck, rlogin и tip, с помощью скриптовых диалогов и макросов. Кроме того Expect полезен для тестирования перечисленных выше приложений, а также для решения сложных задач взаимодействия с другими средствами. Фреймворк DejaGnu написан на языке Expect.

Приблизительное время сборки: 0.2 SBU
Требуемое дисковое пространство: 3.9 MB

8.16.1. Установка пакета Expect

Expect для работы необходим псевдотерминал(PTY). Убедитесь, что PTY работают правильно в среде chroot, выполнив простой тест:

python3 -c 'from pty import spawn; spawn(["echo", "ok"])'

Эта команда должна вывести ok. Если вместо этого вывод содержит OSError: out of pty devices, то среда не настроена для правильной работы PTY. Вам необходимо выйти из среды chroot, ещё раз прочитать Раздел 7.3, «Подготовка виртуальных файловых систем ядра» и убедиться, что файловая система devpts (и другие файловые системы виртуального ядра) смонтирована правильно. Затем повторно войдите в среду chroot, следуя инструкции Раздел 7.4, «Вход в окружение Chroot». Эту проблему необходимо решить, прежде чем вы продолжите, иначе наборы тестов, зависимые от Expect (например, наборы тестов Bash, Binutils, GCC, GDBM и, конечно, самого Expect), потерпят фатальный сбой, а также могут произойти другие незначительные сбои.

Подготовьте Expect к компиляции:

./configure --prefix=/usr           \
            --with-tcl=/usr/lib     \
            --enable-shared         \
            --mandir=/usr/share/man \
            --with-tclinclude=/usr/include

Значение параметров настройки:

--with-tcl=/usr/lib

Этот параметр необходим для указания configure где находится скрипт tclConfig.sh.

--with-tclinclude=/usr/include

Этот параметр явно указывает Expect, где искать внутренние заголовки Tcl.

Соберите пакет:

make

Чтобы протестировать пакет, выполните:

make test

Установите пакет:

make install
ln -svf expect5.45.4/libexpect5.45.4.so /usr/lib

8.16.2. Содержимое пакета Expect

Установленные программы: expect
Установленные библиотеки: libexpect5.45.4.so

Краткое описание

expect

Взаимодействует с другими интерактивными программами в соответствии со сценарием

libexpect-5.45.4.so

Содержит функции, которые позволяют использовать Expect в качестве расширения Tcl или непосредственно из C или C++ (без Tcl).

8.17. DejaGNU-1.6.3

Пакет DejaGnu содержит фреймворк для запуска наборов тестов на инструментах GNU. Он написан на expect, который в свою очередь использует Tcl (командный язык инструментов).

Приблизительное время сборки: 0.1 SBU
Требуемое дисковое пространство: 6.9 MB

8.17.1. Установка пакета DejaGNU

Разработчики рекомендуют собирать DejaGNU в отдельном каталоге:

mkdir -v build
cd       build

Подготовьте DejaGNU к компиляции:

../configure --prefix=/usr
makeinfo --html --no-split -o doc/dejagnu.html ../doc/dejagnu.texi
makeinfo --plaintext       -o doc/dejagnu.txt  ../doc/dejagnu.texi

Чтобы протестировать пакет, выполните:

make check

Установите пакет:

make install
install -v -dm755  /usr/share/doc/dejagnu-1.6.3
install -v -m644   doc/dejagnu.{html,txt} /usr/share/doc/dejagnu-1.6.3

8.17.2. Содержимое пакета DejaGNU

Установленные программы: dejagnu и runtest

Short Descriptions

dejagnu

Вспомогательная программа запуска команд DejaGNU

runtest

Скрипт-обертка, который находит соответствующую оболочку expect и запускает DejaGnu

8.18. Pkgconf-2.1.1

Пакет pkgconf является преемником pkg-config и содержит инструмент, который позволяет передавать пути установки или пути к библиотекам для инструментов сборки на этапе настройки (configure) и сборки(make) пакетов.

Приблизительное время сборки: менее 0.1 SBU
Требуемое дисковое пространство: 4.6 MB

8.18.1. Установка пакета Pkgconf

Подготовьте Pkgconf к компиляции:

./configure --prefix=/usr              \
            --disable-static           \
            --docdir=/usr/share/doc/pkgconf-2.1.1

Скомпилируйте пакет:

make

Установите пакет:

make install

Для обеспечения совместимости с исходным Pkg-config, создайте две символические ссылки:

ln -sv pkgconf   /usr/bin/pkg-config
ln -sv pkgconf.1 /usr/share/man/man1/pkg-config.1

8.18.2. Содержимое пакета Pkgconf

Установленные программы: pkgconf, pkg-config (ссылка на pkgconf) и bomtool
Установленные библиотеки: libpkgconf.so
Созданные каталоги: /usr/share/doc/pkgconf-2.1.1

Краткое описание

pkgconf

Возвращает метаданные указанной библиотеки или пакета

bomtool

Генерирует спецификацию программного обеспечения из файлов pkg-config с расширением .pc

libpkgconf

Содержит большую часть функций pkgconf, позволяя другим инструментам, таким как IDE и компиляторы, использовать его фреймворки

8.19. Binutils-2.42

Пакет Binutils содержит компоновщик, ассемблер и другие инструменты для работы с объектными файлами.

Приблизительное время сборки: 2.2 SBU
Требуемое дисковое пространство: 2.7 GB

8.19.1. Установка пакета Binutils

Документация Binutils рекомендует выполнять компиляцию в отдельном каталоге:

mkdir -v build
cd       build

Подготовьте Binutils к компиляции:

../configure --prefix=/usr       \
             --sysconfdir=/etc   \
             --enable-gold       \
             --enable-ld=default \
             --enable-plugins    \
             --enable-shared     \
             --disable-werror    \
             --enable-64-bit-bfd \
             --with-system-zlib  \
             --enable-default-hash-style=gnu \
             --enable-multilib

Значение параметров настройки:

--enable-gold

Собирает компоновщик gold и устанавливает его как ld.gold (вместе с компоновщиком по умолчанию).

--enable-ld=default

Собирает оригинальный компоновщик bfd и устанавливает его как ld (компоновщик по умолчанию) и как ld.bfd

--enable-plugins

Включает поддержку плагинов для компоновщика.

--with-system-zlib

Использовать установленную библиотеку zlib вместо сборки собственной.

--enable-multilib

Включает поддержку multilib в bintutils.

Скомпилируйте пакет:

make tooldir=/usr

Значение параметра make:

tooldir=/usr

Обычно для tooldir (каталога, в котором будут расположены исполняемые файлы) установлено значение $(exec_prefix)/$(target_alias). Например, машины x86_64 преобразуют это значение в /usr/x86_64-unknown-linux-gnu. Поскольку это пользовательская система, то целевой каталог в /usr не требуется. Параметр $(exec_prefix)/$(target_alias) использовался, если бы система применялась для кросс-компиляции (например, при компиляции пакета на компьютере Intel, который генерирует код, который может быть выполнен на компьютерах PowerPC).

Важно

Набор тестов для Binutils в этом разделе считается критически важным. Ни в коем случае не пропускайте его.

Выполните тестирование:

make -k check

Чтобы получить список неудачных тестов, запустите:

grep '^FAIL:' $(find -name '*.log')

Двенадцать тестов завершаются неудачно в наборе тестов gold, когда GCC собирается с параметрами --enable-default-pie и --enable-default-ssp.

Также известно, что завершаются неудачно три теста в пакете gprofng.

Установите пакет:

make tooldir=/usr install

Удалите бесполезные статические библиотеки:

rm -fv /usr/lib/lib{bfd,ctf,ctf-nobfd,gprofng,opcodes,sframe}.a

8.19.2. Содержимое пакета Binutils

Установленные программы: addr2line, ar, as, c++filt, dwp, elfedit, gprof, gprofng, ld, ld.bfd, ld.gold, nm, objcopy, objdump, ranlib, readelf, size, strings и strip
Установленные библиотеки: libbfd.so, libctf.so, libctf-nobfd.so, libgprofng.so, libopcodes.so и libsframe.so
Созданные каталоги: /usr/lib/ldscripts

Краткое описание

addr2line

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

ar

Создаёт, изменяет и распаковывает архивы

as

Ассемблер, который собирает результат работы gcc в объектные файлы

c++filt

Используется компоновщиком для исправления символов C++ и Java и предотвращения конфликтов перегруженных функций.

dwp

Утилита для упаковки DWARF

elfedit

Обновляет ELF заголовки в ELF файлах

gprof

Отображает в графическом виде информацию о профилировании

gprofng

Собирает и анализирует данные о производительности

ld

Компоновщик, который объединяет несколько объектных и архивных файлов в один файл, перемещая их данные и связывая символическими ссылками

ld.gold

Урезанная версия ld, которая поддерживает только формат объектных файлов elf

ld.bfd

Жесткая ссылка на ld

nm

Выводит список символов, используемых в данном объектном файле

objcopy

Преобразует один тип объектного файла в другой

objdump

Отображает информацию о данном объектном файле; можно указать параметры, определяющие, какая конкретно информация будет отображаться. Отображаемая информация полезна для программистов, которые работают над инструментами, используемыми при компиляции

ranlib

Создает индекс содержимого архива и сохраняет его в архиве; в индексе перечислены все символы, определенные в перемещаемых объектных файлах, содержащихся в архиве

readelf

Отображает информацию о двоичных файлах типа ELF

size

Отображает размеры секций и общий размер указанных объектных файлов

strings

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

strip

Удаляет символы из объектных файлов

libbfd

Библиотека дескрипторов двоичных файлов

libctf

Библиотека отладки формата Compat ANSI-C Type

libctf-nobfd

Вариант libctf, не использующий функциональность libbfd.

libgprofng

Библиотека, содержащая большинство подпрограмм, используемых gprofng

libopcodes

Библиотека для работы с опкодами—«читаемыми» версиями инструкций для процессора. Используется для сборки таких утилит как objdump

libsframe

Библиотека для поддержки обратной онлайн-трассировки с использованием простого декодера разделов .sframe.

8.20. GMP-6.3.0

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

Приблизительное время сборки: 0.3 SBU
Требуемое дисковое пространство: 54 MB

8.20.1. Установка пакета GMP

Примечание

Если вы выполняете сборку для 32-разрядной архитектуры x86, но ваш процессор, способен выполнять 64-разрядный код, и вы указали в переменных окружения CFLAGS, скрипт configure попытается выполнить настройку для 64-разрядной системы и завершится ошибкой. Чтобы избежать этого, необходимо вызвать команду configure с приведенным ниже параметром

ABI=32 ./configure ...

Примечание

Настройки GMP по умолчанию собирают библиотеки, оптимизированные для процессора хоста. Если требуются библиотеки, подходящие для процессоров с меньшей производительностью, чем у процессора хоста, можно собрать общие библиотеки, добавив параметр --host=none-linux-gnu в команде configure.

Подготовьте GMP к компиляции:

./configure --prefix=/usr    \
            --enable-cxx     \
            --disable-static \
            --docdir=/usr/share/doc/gmp-6.3.0

Значение новых параметров настройки:

--enable-cxx

Этот параметр включает поддержку C++

--docdir=/usr/share/doc/gmp-6.3.0

Эта переменная указывает местоположение для документации.

Скомпилируйте пакет и сгенерируйте HTML-документацию:

make
make html

Важно

Набор тестов для GMP в этом разделе считается критически важным. Ни в коем случае не пропускайте его.

Проверьте результаты:

make check 2>&1 | tee gmp-check-log

Внимание

Код в GMP сильно оптимизирован для процессора, на котором он собран. Иногда код, определяющий процессор, неверно определяет возможности системы, и в тестах или других приложениях, использующих библиотеки gmp, возникают ошибки с сообщением Illegal instruction. В этом случае gmp следует переконфигурировать с параметром --host=none-linux-gnu и пересобрать.

Убедитесь, что все 199 тестов в наборе пройдены. Проверьте результат, выполнив следующую команду:

awk '/# PASS:/{total+=$3} ; END{print total}' gmp-check-log

Установите пакет и его документацию:

make install
make install-html

8.20.2. Установка GMP - 32-битная версия

Выполните очистку после предыдущей сборки:

make distclean

Универсальные библиотеки можно создать, выполнив следующие действия:

cp -v configfsf.guess config.guess
cp -v configfsf.sub   config.sub

Подготовьте GMP к компиляции:

ABI="32" \
CFLAGS="-m32 -O2 -pedantic -fomit-frame-pointer -mtune=generic -march=i686" \
CXXFLAGS="$CFLAGS" \
PKG_CONFIG_PATH="/usr/lib32/pkgconfig" \
./configure                      \
    --host=i686-pc-linux-gnu     \
    --prefix=/usr                \
    --disable-static             \
    --enable-cxx                 \
    --libdir=/usr/lib32          \
    --includedir=/usr/include/m32/gmp

Значение новых параметров настройки:

--includedir=/usr/include/m32/gmp

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

Скомпилируйте пакет:

sed -i 's/$(exec_prefix)\/include/$\(includedir\)/' Makefile
make

Важно

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

Проверьте результаты:

make check 2>&1 | tee gmp-check-log

Убедитесь, что все 199 тестов в наборе пройдены. Проверьте результат, выполнив следующую команду:

awk '/# PASS:/{total+=$3} ; END{print total}' gmp-check-log

Установите пакет:

make DESTDIR=$PWD/DESTDIR install
cp -Rv DESTDIR/usr/lib32/* /usr/lib32
cp -Rv DESTDIR/usr/include/m32/* /usr/include/m32/
rm -rf DESTDIR

8.20.3. Содержимое пакета GMP

Установленные библиотеки: libgmp.so и libgmpxx.so
Созданные каталоги: /usr/share/doc/gmp-6.3.0

Краткое описание

libgmp

Содержит точные математические функции

libgmpxx

Содержит точные математические функции C++

8.21. MPFR-4.2.1