Подробная информация об этом пакете находится в Раздел 8.20.2, «Содержимое пакета Binutils.»
Авторские права © 1999-2024 Gerard Beekmans
Все права защищены.
Эта книга распространяется на условиях Лицензия 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 являются процессоры 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.2-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/
В этом руководстве содержится хороший обзор основных навыков и методов, необходимых для сборки программ из исходного кода
Структура LFS максимально соответствует стандартам Linux. Первичными стандартами являются:
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.
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 (Необязательные): |
Нет |
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 является создание законченной и пригодной для использования базовой системы, которая содержит все пакеты, необходимые для её функционирования, состоящую при этом из относительно небольшого набора программ, и возможности которой можно расширять в зависимости от потребностей пользователя. Это не означает, что 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
Этот пакет содержит основные справочные(man) страницы 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). Поэтому
весь этот раздел обычно печатается как есть.
<ЗАМЕНЯЕМЫЙ
ТЕКСТ>
Этот формат используется для текста, который не должен быть напечатан так, как отображается, или для операций копирования и вставки.
[НЕОБЯЗАТЕЛЬНЫЙ ТЕКСТ]
Этот формат используется для текста, который является необязательным.
Этот формат используется для ссылки на определенную страницу
руководства (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.
Эта книга разделена на несколько частей.
Эта часть содержит важные замечания о том, как выполнить установку LFS. Также здесь представлена метаинформация о книге
Часть II описывает, как подготовиться к процессу сборки — создать разделы, загрузить пакеты и выполнить компиляцию временных инструментов.
Часть III содержит инструкции по созданию инструментов, необходимых для создания конечной системы LFS.
Часть IV проводит читателя через сборку системы LFS—компиляцию и установку всех пакетов один за другим, настройку сценариев загрузки и установку ядра. Полученная в результате система Linux является основой, на которой можно собрать другое программное обеспечение для расширения возможностей системы. В конце этой книги есть простой в использовании справочник со списком всех программ, библиотек и важных файлов, которые были установлены.
Часть V содержит информацию о самой книге, включая акронимы и термины, благодарности, зависимости пакетов, список загрузочных сценариев LFS, лицензии на распространение книги и исчерпывающий указатель пакетов, программ, библиотек и сценариев.
Программное обеспечение, используемое для создания системы LFS, постоянно обновляется и совершенствуется. Предупреждения безопасности и исправления ошибок могут появиться после выхода книги LFS. Чтобы проверить, нуждаются ли пакеты или инструкции в этом выпуске LFS в каких-либо изменениях для устранения уязвимостей в системе безопасности или исправления других ошибок, посетите https://mirror.linuxfromscratch.ru/lfs/errata/12.2/, прежде чем приступить к сборке. Вы должны внести требуемые изменения и применить их к соответствующему разделу книги по мере сборки системы LFS.
Кроме того, редакторы Linux From Scratch ведут список уязвимостей безопасности, обнаруженных после выхода книги. Чтобы проверить наличие каких-либо известных уязвимостей безопасности, посетите https://mirror.linuxfromscratch.ru/lfs/advisories/, прежде чем продолжить сборку. И, если вы будете использовать систему LFS в качестве реальной настольной или серверной системы, вам следует обращаться к рекомендациям и устранять любые уязвимости в системе безопасности, даже когда система 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.
Здесь описан процесс сборки системы в двух словах. Подробная информация о каждом шаге рассматривается в следующих главах и описаниях пакетов. Элементы, которые кажутся сложными сейчас, будут разъяснены позже, и все встанет на свои места, по мере прочтения книги.
Ниже приведен список пакетов, обновленных с момента предыдущего выпуска книги.
Обновлены:
Automake-1.17
Bash-5.2.32
Bc-6.7.6
Binutils-2.43.1
Coreutils-9.5
E2fsprogs-1.47.1
Expat-2.6.2
Findutils-4.10.0
GCC-14.2.0
GDBM-1.24
Gettext-0.22.5
Glibc-2.40
Iana-Etc-20240806
IPRoute2-6.10.0
Jinja2-3.1.4
Kmod-33
Less-661
Libcap-2.70
Libelf из Elfutils-0.191
Libffi-3.4.6
Linux-6.10.5
Lz4-1.10.0
Man-DB-2.12.1
Man-pages-6.9.1
Meson-1.5.1
Ncurses-6.5
Ninja-1.12.1
OpenSSL-3.3.1
Perl-5.40.0
Pkgconf-2.3.0
Psmisc-23.7
Python-3.12.5
Readline-8.2.13
Setuptools-72.2.0
Shadow-4.16.0
Sysklogd-2.6.1
Systemd-256.4
SysVinit-3.10
Tcl-8.6.14
Udev из Systemd-256.4
Util-linux-2.40.2
Vim-9.1.0660
Wheel-0.44.0
Xz-5.6.2
Zstd-1.5.6
Добавлены:
Lz4-1.10.0
Удалены:
bash-5.2.21-upstream_fixes-1.patch
readline-8.2-upstream_fixes-3.patch
Это версия 12.2 книги Linux From Scratch от 1 сентября 2024. Если этой книге больше шести месяцев, возможно, уже доступна более новая, улучшенная версия. Чтобы узнать это, проверьте одно из зеркал https://mirror.linuxfromscratch.ru/mirrors.html.
Ниже приведен список изменений, внесенных с момента предыдущего выпуска книги.
Список изменений:
2024-08-23
[xry111] - Update to lfs-bootscripts-20240825. Only trivial non-functional changes.
2024-08-23
[xry111] - Update to lfs-bootscripts-20240823, to fix an issue causing VT 2-6 not affected by the FONT= setting in /etc/sysconfig/console.
2024-08-17
2024-08-15
2024-08-05
[bdubbs] - Update to bash-5.2.32. Fixes #5532.
[bdubbs] - Update to iana-etc-20240801. Addresses #5006.
[bdubbs] - Update to vim-9.1.0660. Addresses #4500.
[bdubbs] - Update to binutils-2.43. Fixes #5535.
[bdubbs] - Update to linux-6.10.3. Fixes #5534.
[bdubbs] - Update to readline-8.2.13. Fixes #5533.
[bdubbs] - Update to wheel-0.44.0. Fixes #5536.
2024-08-01
[bdubbs] - Update to gcc-14.2.0. Fixes #5530.
[bdubbs] - Update to iana-etc-20240723. Addresses #5006.
[bdubbs] - Update to glibc-2.40. Fixes #5529.
[bdubbs] - Update to iproute2-6.10.0. Fixes #5523.
[bdubbs] - Update to linux-6.10.2. Fixes #5521.
[bdubbs] - Update to lz4-1.10.0. Fixes #5526.
[bdubbs] - Update to meson-1.5.1. Fixes #5527.
[bdubbs] - Update to setuptools-72.1.0. Fixes #5531.
[bdubbs] - Update to sysklogd-2.6.1. Fixes #5522.
[bdubbs] - Update to sysvinit-3.10. Fixes #5528.
2024-07-15
[bdubbs] - Update to iana-etc-20240701. Addresses #5006.
[bdubbs] - Update to vim-9.1.0580. Addresses #4500.
[bdubbs] - Update to automake-1.17. Fixes #5520.
[bdubbs] - Update to gdbm-1.24. Fixes #5515.
[bdubbs] - Update to linux-6.9.9. Fixes #5517.
[bdubbs] - Update to less-661. Fixes #5513.
[bdubbs] - Update to meson-1.5.0. Fixes #5519.
[bdubbs] - Update to setuptools-70.3.0. Fixes #5514.
[bdubbs] - Update to util-linux-2.40.2. Fixes #5516.
2024-07-01
[bdubbs] - Update lfs-bootscripts to only output escape sequences to a terminal.
2024-07-01
[bdubbs] - Update to iana-etc-20240612. Addresses #5006.
[bdubbs] - Update to bc-6.7.6. Fixes #5506.
[bdubbs] - Update to man-pages-6.9.1. Fixes #5507.
[bdubbs] - Update to linux-6.9.7. Fixes #5508.
[bdubbs] - Update to sysklogd-2.5.2. Fixes #5509.
[bdubbs] - Update to shadow-4.16.0. Fixes #5510.
[bdubbs] - Update to setuptools-70.1.1. Fixes #5512.
2024-06-15
[bdubbs] - Update to vim-9.1.0478. Addresses #4500.
[bdubbs] - Update to iana-etc-20240607. Addresses #5006.
[bdubbs] - Update to python3-3.12.4. Fixes #5502.
[bdubbs] - Update to perl-5.40.0. Fixes #5503.
[bdubbs] - Update to openssl-3.3.1 (Security fix). Fixes #5500.
[bdubbs] - Update to linux-6.9.4. Fixes #5505.
[bdubbs] - Update to findutils-4.10.0. Fixes #5499.
2024-05-31
[bdubbs] - Update to meson-1.4.1. Fixes #5498.
[bdubbs] - Update to xz-5.6.2. Fixes #5471.
[bdubbs] - Add linux-6.9.x compatibility instructions to udev. Fixes #5496.
[bdubbs] - Update to setuptools-70.0.0 (python module). Fixes #5491.
[bdubbs] - Update to ninja-1.12.1. Fixes #5489.
[bdubbs] - Update to man-pages-6.8. Fixes #5494.
[bdubbs] - Update to linux-6.9.3. Fixes #5491.
[bdubbs] - Update to libcap-2.70. Fixes #5493.
[bdubbs] - Update to iproute2-6.9.0. Fixes #5492.
[bdubbs] - Update to e2fsprogs-1.47.1. Fixes #5495.
2024-05-13
[xry111] - Synchronize coreutils i18n patch from Fedora to fix a build failure on 32-bit x86 and an alarming compiler warning on both 32-bit x86 and x86_64 with GCC 14.1 or later.
2024-05-11
[bdubbs] - Update to vim-9.1.0405. Addresses #4500.
[bdubbs] - Update to util-linux-2.40.1. Fixes #5482.
[bdubbs] - Update to linux-6.8.9. Fixes #5484.
[bdubbs] - Update to jinja2-3.1.4 (Python module). Fixes #5485.
[bdubbs] - Update to iana-etc-20240502. Addresses #5006.
[bdubbs] - Update to gcc-14.1.0. Fixes #5486.
2024-05-01
2024-04-16
[bdubbs] - Make minor change to ifup script output text.
2024-04-15
[bdubbs] - Update to setuptools-69.5.1. Fixes #5478.
[bdubbs] - Update to python3-3.12.3. Fixes #5476.
[bdubbs] - Update to openssl-3.3.0. Fixes #5475.
[bdubbs] - Update to ninja-1.12.0. Fixes #5477.
[bdubbs] - Update to man-db-2.12.1. Fixes #5474.
[bdubbs] - Update to linux-6.8.6. Fixes #5472.
[bdubbs] - Update to iana-etc-20240412. Addresses #5006.
[bdubbs] - Update to vim-9.1.0330. Addresses #4500.
2024-03-31
[bdubbs] - Update to iana-etc-20240318. Addresses #5006.
[bdubbs] - Update to zstd-1.5.6. Fixes #5468.
[bdubbs] - Update to util-linux-2.40. Fixes #5430.
[bdubbs] - Update to shadow-4.15.1. Fixes #5465.
[bdubbs] - Update to pkgconf-2.2.0. Fixes #5469.
[bdubbs] - Update to linux-6.8.2. Fixes #5467.
[bdubbs] - Update to coreutils-9.5. Fixes #5470.
2024-03-29
[bdubbs] - Revert to xz-5.4.6 due to upstream compromise.
2024-03-25
[timtas] - Update to sysvinit-3.09. Fixes #5466.
2024-03-19
2024-03-15
[bdubbs] - Update to wheel-0.43.0. Fixes #5459.
[bdubbs] - Update to setuptools-69.2.0 (Python module). Fixes #5462.
[bdubbs] - Update to meson-1.4.0. Fixes #5460.
[bdubbs] - Update to expat-2.6.2 (Security fix). Fixes #5461.
[bdubbs] - Update to iana-etc-20240305. Addresses #5006.
[bdubbs] - Update to vim-9.1.0161. Addresses #4500.
[bdubbs] - Update to xz-5.6.1. Fixes #5457.
[bdubbs] - Update to shadow-4.15.0. Fixes #5456.
[bdubbs] - Update to psmisc-23.7. Fixes #5454.
[bdubbs] - Update to kmod-32. Fixes #5455.
[bdubbs] - Update to elfutils-0.191. Fixes #5451.
2024-03-02
[bdubbs] - Update to iana-etc-20240222. Addresses #5006.
[bdubbs] - Update to vim-9.1.0145. Addresses #4500.
[bdubbs] - Update to xz-5.6.0. Fixes #5447.
[bdubbs] - Update to tcl-8.6.14. Fixes #5448.
[bdubbs] - Update to shadow-4.14.6. Fixes #5450.
[bdubbs] - Update to setuptools-69.1.1. Fixes #5446.
[bdubbs] - Update to linux-6.7.7. Fixes #5444.
[bdubbs] - Update to libffi-3.4.6. Fixes #5443.
[bdubbs] - Update to gettext-0.22.5. Fixes #5445.
[bdubbs] - Update to expat-2.6.1. Fixes #5449.
2024-03-01
[bdubbs] - LFS-12.1 released.
Если во время создания системы LFS вы столкнетесь с какими-либо ошибками, у вас возникнут какие-либо вопросы или вам кажется, что в книге допущена опечатка, пожалуйста, для начала ознакомьтесь со списком часто задаваемых вопросов (FAQ), расположенным по адресу https://mirror.linuxfromscratch.ru/faq/.
На сервере linuxfromscratch.org
размещен ряд списков
рассылки, используемых для разработки проекта LFS. Эти списки
включают, среди прочего, основные списки разработки и
поддержки. Если вы не можете найти ответ на странице часто
задаваемых вопросов, следующим шагом будет поиск решения в
списках рассылки по адресу https://mirror.linuxfromscratch.ru/search.html.
Для получения информации о списках рассылки, способах подписки, архивах и дополнительной информации посетите https://mirror.linuxfromscratch.ru/mail.html.
Некоторые члены сообщества LFS предлагают помощь в Internet
Relay Chat (IRC). Прежде чем воспользоваться этим способом,
убедитесь, что на ваш вопрос еще нет ответа в разделе часто
задаваемых вопросов LFS или в архивах списков рассылки. Вы
можете найти нас в irc.libera.chat
. Канал поддержки
называется #lfs-support.
Проект LFS имеет несколько зеркал по всему миру, чтобы сделать доступ к веб-сайту и загрузку необходимых пакетов более удобными. Пожалуйста, посетите веб-сайт LFS по адресу https://mirror.linuxfromscratch.ru/mirrors.html для получения списка текущих зеркал.
Если вы столкнулись с проблемой при сборки одного пакета с помощью инструкцией из 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, «Ресурсы» этой книги). Мы получаем много вопросов в службу поддержки каждый день, и на многие из них можно легко ответить, зайдя в раздел часто задаваемых вопросов и предварительно выполнив поиск в списках рассылки. Чтобы мы могли оказать помощь, вам необходимо сначала провести самостоятельное исследование. Это позволяет нам сосредоточиться на более сложных вопросах в поддержке. Если ваши поиски не привели к решению проблемы, включите всю необходимую информацию (упомянутую ниже) в свой запрос о помощи.
Помимо краткого объяснения возникшей проблемы, в любой запрос о помощи необходимо включить следующую важную информацию:
Используемая версия книги (в данном случае 12.2)
Информацию о дистрибутиве и его версия, используемые для сборки LFS
Вывод сценария Системные требования к хостовой машине
Пакет или раздел где возникла проблема
Точное сообщение об ошибке или четкое описание проблемы
Обратите внимание, отклонялись ли вы от книги
Отклонение от этой книги не означает, что мы не поможем вам. В конце концов, LFS зависит от личных предпочтений. Заблаговременное информирование о любых изменениях в процессе сборки помогает нам оценить и определить возможные причины вашей проблемы
Если что-то пойдет не так во время выполнения скрипта
configure,
просмотрите файл config.log
.
Этот файл может содержать ошибки, обнаруженные во время
настройки, которые не были выведены на экран. Включите
соответствующие
строки, если вам нужно обратиться за помощью.
Как вывод на экран, так и содержимое различных файлов полезны для определения причины проблем компиляции. Вывод экрана из скрипта configure и запуска make может быть полезен. Необязательно включать весь вывод целиком, но обязательно включите всю необходимую информацию. Ниже приведен пример информации, которая должна быть включена в экранный вывод make:
gcc -D ALIASPATH=\"/mnt/lfs/usr/share/locale:.\"
-D LOCALEDIR=\"/mnt/lfs/usr/share/locale\"
-D LIBDIR=\"/mnt/lfs/usr/lib\"
-D INCLUDEDIR=\"/mnt/lfs/usr/include\" -D HAVE_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. Прочтите этот документ и следуйте советам, чтобы повысить вероятность получения помощи в которой вы нуждаетесь.
В этой главе проверяются и при необходимости устанавливаются основные инструменты, необходимые для построения LFS. Затем подготавливается раздел, в котором будет размещаться система LFS. Мы создадим сам раздел, создадим на нем файловую систему и смонтируем его.
Редакторы LFS рекомендуют, чтобы процессор имел не менее четырех ядер и не менее 8 ГБ памяти. Старые системы, не отвечающие этим требованиям, будут по-прежнему работать, но время сборки пакетов будет значительно больше, чем указано в документации.
Ваша хост-система должна иметь следующее программное
обеспечение с указанными минимальными версиями. Это не должно
быть проблемой для большинства современных дистрибутивов
Linux. Также обратите внимание на то, что многие дистрибутивы
помещают заголовочные файлы в отдельные пакеты, как правило в
формате
или <package-name>
-devel
.
Обязательно установите эти пакеты, если ваш дистрибутив их
предоставляет.
<package-name>
-dev
Более ранние версии перечисленных ниже пакетов могут работать, но это не проверялось.
Bash-3.2 (/bin/sh должен быть символической или жесткой ссылкой на bash)
Binutils-2.13.1 (Версия выше 2.43.1 не рекомендуется, так как она не тестировалась)
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++ (версии выше 14.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
LFS разработан для сборки за один сеанс. То есть инструкция предполагает, что система не будет выключаться в процессе. Это не означает, что система должна быть собрана за один присест. Для возобновления сборки в точке предыдущей остановки (после перезагрузки/выключения), необходимо выполнить некоторые процедуры повторно.
Эти главы выполняются на хост-системе. После перезагрузки обратите внимание на следующее:
При выполнении операций, от имени пользователя
root
после Раздела 2.4,
ДЛЯ ПОЛЬЗОВАТЕЛЯ
root
должна быть
установлена переменная окружения LFS.
Раздел /mnt/lfs должен быть смонтирован.
Эти две главы должны быть выполнены из-под
пользователя lfs
. Перед
выполнением любой задачи в этих главах необходимо
выполнить команду su -
lfs. В противном случае вы рискуете
установить пакеты на хост и сделать его непригодным для
использования.
Выполнение процедур из Общие инструкции по компиляции имеет решающее значение. Если есть какие-либо сомнения по поводу установки пакета, убедитесь, что все ранее распакованные tar-архивы удалены, затем повторно извлеките файлы и выполните все инструкции, приведенные в этом разделе.
Раздел /mnt/lfs должен быть смонтирован.
Некоторые операции, такие как «Смена
владельца» или «Вход в среду
Chroot», должны быть выполнены от имени
пользователя root
с
переменной окружения $LFS, установленной для
пользователя root
.
При входе в chroot переменная среды LFS должна быть
установлена для пользователя root
. Переменная LFS не
используется после входа в среду chroot.
Виртуальные файловые системы должны быть смонтированы.
Это можно сделать до или после входа в chroot,
переключившись на виртуальный терминал хоста и от имени
пользователя root
выполнив команды, описанные в Раздел 7.3.1,
«Монтирование и заполнение /dev» и Раздел 7.3.2,
«Монтирование виртуальных файловых систем ядра».
Как и большинство других операционных систем, 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
.
Рекомендации по созданию разделов системы часто публикуются в списках рассылки LFS. Это очень субъективная тема. По умолчанию для большинства дистрибутивов используется весь диск, за исключением небольшого раздела подкачки. Это не оптимально для LFS по нескольким причинам. Это снижает гибкость, затрудняет совместное использование данных между несколькими дистрибутивами или сборками LFS, делает резервное копирование более трудоемким и может тратить дисковое пространство из-за неэффективно распределенной файловой системы.
Корневой раздел LFS (не путать с каталогом /root
) размером в 20 гигабайт является
хорошим компромиссом для большинства систем. Он
обеспечивает достаточно места для построения LFS и большей
части BLFS, но достаточно мал, чтобы можно было легко
создать несколько разделов для экспериментов.
Большинство дистрибутивов автоматически создают раздел подкачки. Обычно рекомендуемый размер раздела подкачки примерно в два раза превышает объем физической памяти, однако это требуется редко. Если дисковое пространство ограничено, установите размер раздела подкачки в два гигабайта и контролируйте его объемом.
Если вы хотите использовать режим гибернации (suspend-to-disk) Linux, которая записывает содержимое ОЗУ в раздел подкачки перед выключением машины. Установите размер раздела подкачки не меньше объема установленной оперативной памяти.
Использование файла подкачки - это не очень хорошо. Для механических жестких дисков вы можете определить, что система использует раздел подкачки, просто слыша активность диска и наблюдая, как система реагирует на команды. Для SSD-накопителя вы не сможете услышать, что используется раздел подкачки, но сможете оценить, сколько места на разделе подкачки занято, используя команды top или free. По возможности следует избегать использования SSD-накопителя для раздела подкачки. Первой реакцией на активность раздела подкачки должна быть проверка на необоснованное применение какой-либо команды, например, попытка редактирования пятигигабайтного файла. Если использование раздела подкачки становится обычным явлением, лучшее решение — приобретение большего объема оперативной памяти для вашей системы.
Если загрузочный диск размечен с помощью таблицы разделов GUID (GPT), необходимо создать небольшой раздел, обычно размером 1 МБ, если он еще не существует. Этот раздел не форматируется, но должен быть доступен для использования GRUB во время установки загрузчика. Обычно он помечен как 'BIOS Boot' при использовании fdisk или имеет код EF02 при использовании gdisk.
Раздел Grub Bios должен находиться на диске, который BIOS использует для загрузки системы. Это не обязательно тот же диск, на котором расположен корневой раздел LFS. Диски в системе могут использовать разные типы таблиц разделов. Наличие раздела Grub Bios зависит только от типа таблицы разделов на загрузочном диске.
Есть несколько других разделов, которые не являются обязательными, но их следует учитывать при разработке схемы диска. Следующий список не является исчерпывающим, а представлен в качестве справочного руководства.
/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».
Раздел - это всего лишь диапазон секторов на диске, указанный в таблице разделов. Прежде чем операционная система сможет использовать раздел для хранения каких-либо файлов, он должен быть отформатирован, чтобы содержать файловую систему, обычно состоящую из метки, блоков каталогов, блоков данных и схемы индексации для поиска конкретного файла по запросу. Файловая система также помогает операционной системе отслеживать свободное пространство на разделе, резервировать необходимые секторы при создании нового файла или расширении существующего и повторно использует свободные сегменты данных, полученные в результате удаления файлов. Она также может обеспечивать поддержку избыточности данных и восстановления после ошибок.
LFS может использовать любую файловую систему, распознаваемую ядром Linux, но наиболее распространенными типами являются ext3 и ext4. Выбор правильной файловой системы может быть сложным; это зависит от характеристик файлов и размера раздела. Например:
подходит для небольших разделов, которые редко обновляются, например /boot.
это обновленная файловая система ext2, которая включает в себя журнал, помогающий восстановить состояние раздела в случае некорректного завершения работы. Обычно используется в качестве файловой системы общего назначения.
является последней версией файловых систем семейства ext. Она предоставляет несколько новых возможностей, включая временные метки с точностью до наносекунды, создание и использование очень больших файлов (16 ТБ) и повышение скорости работы.
Другие файловые системы, включая FAT32, NTFS, 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>
именем раздела подкачки
.
В этой книге переменная окружения 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.
Обязательно разместите команду экспорта перед тестом для не
интерактивного использования.
Теперь, когда файловая система создана, раздел должен быть
смонтирован, чтобы хост-система могла получить доступ к нему. В
книге предполагается, что файловая система монтируется в
каталог, указанный в переменной 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 готов к работе, пришло время загрузить пакеты.
Эта глава содержит список пакетов, которые необходимо загрузить для сборки базовой системы 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
Сделайте этот каталог доступным для записи и установите sticky bit (дословно "липкий бит"). Атрибут «Sticky bit» означает, что даже если несколько пользователей имеют право на запись в каталог, только владелец файла может удалить файл в таком каталоге. Следующая команда активирует режимы записи и sticky bit:
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/*
Ознакомьтесь с рекомендациями по безопасности перед загрузкой пакетов, чтобы узнать, следует ли использовать более новую версию пакета, чтобы избежать проблем безопасности.
При выходе новых версий, старые версии пакетов могут быть удалены, особенно, если они содержали уязвимости. Если одна или несколько ссылок ниже недоступны, сначала ознакомьтесь с рекомендациями по безопасности, чтобы понять следует ли использовать более новую версию (с исправленной уязвимостью). Если нет, попробуйте скачать удаленный пакет с зеркала. Хотя старый релиз можно скачать с зеркала (даже если он был удален из-за уязвимости), для сборки системы не рекомендуется использовать версию, которая уязвима.
Загрузите или иным образом получите следующие пакеты:
Домашняя страница: https://savannah.nongnu.org/projects/acl
Ссылка на загрузку: https://download.savannah.gnu.org/releases/acl/acl-2.3.2.tar.xz
Контрольная сумма MD5: 590765dee95907dbc3c856f7255bd669
Домашняя страница: https://savannah.nongnu.org/projects/attr
Ссылка на загрузку: https://download.savannah.gnu.org/releases/attr/attr-2.5.2.tar.gz
Контрольная сумма MD5: 227043ec2f6ca03c0948df5517f9c927
Домашняя страница: https://www.gnu.org/software/autoconf/
Ссылка на загрузку: https://ftp.gnu.org/gnu/autoconf/autoconf-2.72.tar.xz
Контрольная сумма MD5: 1be79f7106ab6767f18391c5e22be701
Домашняя страница: https://www.gnu.org/software/automake/
Ссылка на загрузку: https://ftp.gnu.org/gnu/automake/automake-1.17.tar.xz
Контрольная сумма MD5: 7ab3a02318fee6f5bd42adfc369abf10
Домашняя страница: https://www.gnu.org/software/bash/
Ссылка на загрузку: https://ftp.gnu.org/gnu/bash/bash-5.2.32.tar.gz
Контрольная сумма MD5: f204835b2e06c06e37b5ad776ff907f4
Домашняя страница: https://git.gavinhoward.com/gavin/bc
Ссылка на загрузку: https://github.com/gavinhoward/bc/releases/download/6.7.6/bc-6.7.6.tar.xz
Контрольная сумма MD5: a47aa5e4e7395fbcd159a9228613b97b
Домашняя страница: https://www.gnu.org/software/binutils/
Ссылка на загрузку: https://sourceware.org/pub/binutils/releases/binutils-2.43.1.tar.xz
Контрольная сумма MD5: 9202d02925c30969d1917e4bad5a2320
Домашняя страница: https://www.gnu.org/software/bison/
Ссылка на загрузку: https://ftp.gnu.org/gnu/bison/bison-3.8.2.tar.xz
Контрольная сумма MD5: c28f119f405a2304ff0a7ccdcc629713
Ссылка на загрузку: https://www.sourceware.org/pub/bzip2/bzip2-1.0.8.tar.gz
Контрольная сумма MD5: 67e051268d0c475ea773822f7500d0e5
Домашняя страница: https://libcheck.github.io/check
Ссылка на загрузку: https://github.com/libcheck/check/releases/download/0.15.2/check-0.15.2.tar.gz
Контрольная сумма MD5: 50fcafcecde5a380415b12e9c574e0b2
Домашняя страница: https://www.gnu.org/software/coreutils/
Ссылка на загрузку: https://ftp.gnu.org/gnu/coreutils/coreutils-9.5.tar.xz
Контрольная сумма MD5: e99adfa059a63db3503cc71f3d151e31
Домашняя страница: https://www.gnu.org/software/dejagnu/
Ссылка на загрузку: https://ftp.gnu.org/gnu/dejagnu/dejagnu-1.6.3.tar.gz
Контрольная сумма MD5: 68c5208c58236eba447d7d6d1326b821
Домашняя страница: https://www.gnu.org/software/diffutils/
Ссылка на загрузку: https://ftp.gnu.org/gnu/diffutils/diffutils-3.10.tar.xz
Контрольная сумма MD5: 2745c50f6f4e395e7b7d52f902d075bf
Домашняя страница: https://e2fsprogs.sourceforge.net/
Ссылка на загрузку: https://downloads.sourceforge.net/project/e2fsprogs/e2fsprogs/v1.47.1/e2fsprogs-1.47.1.tar.gz
Контрольная сумма MD5: 75e6d1353cbe6d5728a98fb0267206cb
Домашняя страница: https://sourceware.org/elfutils/
Ссылка на загрузку: https://sourceware.org/ftp/elfutils/0.191/elfutils-0.191.tar.bz2
Контрольная сумма MD5: 636547248fb3fae58ec48030298d3ef7
Домашняя страница: https://libexpat.github.io/
Ссылка на загрузку: https://prdownloads.sourceforge.net/expat/expat-2.6.2.tar.xz
Контрольная сумма MD5: 0cb75c8feb842c0794ba89666b762a2d
Домашняя страница: https://core.tcl.tk/expect/
Ссылка на загрузку: https://prdownloads.sourceforge.net/expect/expect5.45.4.tar.gz
Контрольная сумма MD5: 00fce8de158422f5ccd2666512329bd2
Домашняя страница: https://www.darwinsys.com/file/
Ссылка на загрузку: https://astron.com/pub/file/file-5.45.tar.gz
Контрольная сумма MD5: 26b2a96d4e3a8938827a1e572afd527a
Домашняя страница: https://www.gnu.org/software/findutils/
Ссылка на загрузку: https://ftp.gnu.org/gnu/findutils/findutils-4.10.0.tar.xz
Контрольная сумма MD5: 870cfd71c07d37ebe56f9f4aaf4ad872
Домашняя страница: https://github.com/westes/flex
Ссылка на загрузку: https://github.com/westes/flex/releases/download/v2.6.4/flex-2.6.4.tar.gz
Контрольная сумма MD5: 2882e3179748cc9f9c23ec593d6adc8d
Домашняя страница: https://pypi.org/project/flit-core/
Ссылка на загрузку: https://pypi.org/packages/source/f/flit-core/flit_core-3.9.0.tar.gz
Контрольная сумма MD5: 3bc52f1952b9a78361114147da63c35b
Домашняя страница: https://www.gnu.org/software/gawk/
Ссылка на загрузку: https://ftp.gnu.org/gnu/gawk/gawk-5.3.0.tar.xz
Контрольная сумма MD5: 97c5a7d83f91a7e1b2035ebbe6ac7abd
Домашняя страница: https://gcc.gnu.org/
Ссылка на загрузку: https://ftp.gnu.org/gnu/gcc/gcc-14.2.0/gcc-14.2.0.tar.xz
Контрольная сумма MD5: 2268420ba02dc01821960e274711bde0
Домашняя страница: https://www.gnu.org/software/gdbm/
Ссылка на загрузку: https://ftp.gnu.org/gnu/gdbm/gdbm-1.24.tar.gz
Контрольная сумма MD5: c780815649e52317be48331c1773e987
Домашняя страница: https://www.gnu.org/software/gettext/
Ссылка на загрузку: https://ftp.gnu.org/gnu/gettext/gettext-0.22.5.tar.xz
Контрольная сумма MD5: 3ae5580599d84be93e6213930facb2db
Домашняя страница: https://www.gnu.org/software/libc/
Ссылка на загрузку: https://ftp.gnu.org/gnu/glibc/glibc-2.40.tar.xz
Контрольная сумма MD5: b390feef233022114950317f10c4fa97
Разработчики Glibc поддерживают Git ветку содержащую исправления, которые заслуживают внимания для Glibc-2.40 но, к сожалению, выпущенные после релиза Glibc-2.40. Редакторы LFS публикуют рекомендации по безопасности, если в ветку добавлено какое-либо исправление безопасности, но для других недавно добавленных патчей не будет предпринято никаких действий. Вы можете самостоятельно просмотреть патчи и включить некоторые из них, если посчитаете их важными.
Домашняя страница: https://www.gnu.org/software/gmp/
Ссылка на загрузку: https://ftp.gnu.org/gnu/gmp/gmp-6.3.0.tar.xz
Контрольная сумма MD5: 956dc04e864001a9c22429f761f2c283
Домашняя страница: https://www.gnu.org/software/gperf/
Ссылка на загрузку: https://ftp.gnu.org/gnu/gperf/gperf-3.1.tar.gz
Контрольная сумма MD5: 9e251c0a618ad0824b51117d5d9db87e
Домашняя страница: https://www.gnu.org/software/grep/
Ссылка на загрузку: https://ftp.gnu.org/gnu/grep/grep-3.11.tar.xz
Контрольная сумма MD5: 7c9bbd74492131245f7cdb291fa142c0
Домашняя страница: https://www.gnu.org/software/groff/
Ссылка на загрузку: https://ftp.gnu.org/gnu/groff/groff-1.23.0.tar.gz
Контрольная сумма MD5: 5e4f40315a22bb8a158748e7d5094c7d
Домашняя страница: https://www.gnu.org/software/grub/
Ссылка на загрузку: https://ftp.gnu.org/gnu/grub/grub-2.12.tar.xz
Контрольная сумма MD5: 60c564b1bdc39d8e43b3aab4bc0fb140
Домашняя страница: https://www.gnu.org/software/gzip/
Ссылка на загрузку: https://ftp.gnu.org/gnu/gzip/gzip-1.13.tar.xz
Контрольная сумма MD5: d5c9fc9441288817a4a0be2da0249e29
Домашняя страница: https://www.iana.org/protocols
Ссылка на загрузку: https://github.com/Mic92/iana-etc/releases/download/20240806/iana-etc-20240806.tar.gz
Контрольная сумма MD5: ea3c37c00d22f1159fc3b7d988de8476
Домашняя страница: https://www.gnu.org/software/inetutils/
Ссылка на загрузку: https://ftp.gnu.org/gnu/inetutils/inetutils-2.5.tar.xz
Контрольная сумма MD5: 9e5a6dfd2d794dc056a770e8ad4a9263
Домашняя страница: https://freedesktop.org/wiki/Software/intltool
Ссылка на загрузку: https://launchpad.net/intltool/trunk/0.51.0/+download/intltool-0.51.0.tar.gz
Контрольная сумма MD5: 12e517cac2b57a0121cda351570f1e63
Домашняя страница: https://www.kernel.org/pub/linux/utils/net/iproute2/
Ссылка на загрузку: https://www.kernel.org/pub/linux/utils/net/iproute2/iproute2-6.10.0.tar.xz
Контрольная сумма MD5: 6282e47de9c5b230e83537fba7181c9c
Домашняя страница: https://jinja.palletsprojects.com/en/3.1.x/
Ссылка на загрузку: https://pypi.org/packages/source/J/Jinja2/jinja2-3.1.4.tar.gz
Контрольная сумма MD5: 02ca9a6364c92e83d14b037bef4732bc
Домашняя страница: https://kbd-project.org/
Ссылка на загрузку: https://www.kernel.org/pub/linux/utils/kbd/kbd-2.6.4.tar.xz
Контрольная сумма MD5: e2fd7adccf6b1e98eb1ae8d5a1ce5762
Домашняя страница: https://github.com/kmod-project/kmod
Ссылка на загрузку: https://www.kernel.org/pub/linux/utils/kernel/kmod/kmod-33.tar.xz
Контрольная сумма MD5: c451c4aa61521adbe8af147f498046f8
Домашняя страница: https://www.greenwoodsoftware.com/less/
Ссылка на загрузку: https://www.greenwoodsoftware.com/less/less-661.tar.gz
Контрольная сумма MD5: 44f54b6313c5d71fa1ac224d8d84766a
Ссылка на загрузку: https://mirror.linuxfromscratch.ru/lfs/downloads/12.2/lfs-bootscripts-20240825.tar.xz
Контрольная сумма MD5: e121b5920071ae9a1351f3f44f8b1e77
Домашняя страница: https://sites.google.com/site/fullycapable/
Ссылка на загрузку: https://www.kernel.org/pub/linux/libs/security/linux-privs/libcap2/libcap-2.70.tar.xz
Контрольная сумма MD5: df0e20c6eeca849347b87d5d6a8870c0
Домашняя страница: https://sourceware.org/libffi/
Ссылка на загрузку: https://github.com/libffi/libffi/releases/download/v3.4.6/libffi-3.4.6.tar.gz
Контрольная сумма MD5: b9cac6c5997dca2b3787a59ede34e0eb
Домашняя страница: https://libpipeline.nongnu.org/
Ссылка на загрузку: https://download.savannah.gnu.org/releases/libpipeline/libpipeline-1.5.7.tar.gz
Контрольная сумма MD5: 1a48b5771b9f6c790fb4efdb1ac71342
Домашняя страница: https://www.gnu.org/software/libtool/
Ссылка на загрузку: https://ftp.gnu.org/gnu/libtool/libtool-2.4.7.tar.xz
Контрольная сумма MD5: 2fc0b6ddcd66a89ed6e45db28fa44232
Домашняя страница: https://github.com/besser82/libxcrypt/
Ссылка на загрузку: https://github.com/besser82/libxcrypt/releases/download/v4.4.36/libxcrypt-4.4.36.tar.xz
Контрольная сумма MD5: b84cd4104e08c975063ec6c4d0372446
Домашняя страница: https://www.kernel.org/
Ссылка на загрузку: https://www.kernel.org/pub/linux/kernel/v6.x/linux-6.10.5.tar.xz
Контрольная сумма MD5: 276ef1f11ed3713ec5d6f506ff55ac12
Ядро Linux обновляется достаточно часто из-за обнаружения уязвимостей в системе безопасности. Можно использовать последнюю стабильную версию ядра, если на странице с ошибками и рекомендациями по безопасности не указано иное.
Для пользователей, у которых ограниченный или тарифицируемый выход в интернет, и которые хотят обновить ядро Linux, можно скачать базовую версию ядра, а затем применить к ней патчи, которые могут быть загружены отдельно. Это может сэкономить немного времени или стоимость при обновлению до следующих версий.
Домашняя страница: https://lz4.org/
Ссылка на загрузку: https://github.com/lz4/lz4/releases/download/v1.10.0/lz4-1.10.0.tar.gz
Контрольная сумма MD5: dead9f5f1966d9ae56e1e32761e4e675
Домашняя страница: https://www.gnu.org/software/m4/
Ссылка на загрузку: https://ftp.gnu.org/gnu/m4/m4-1.4.19.tar.xz
Контрольная сумма MD5: 0d90823e1426f1da2fd872df0311298d
Домашняя страница: https://www.gnu.org/software/make/
Ссылка на загрузку: https://ftp.gnu.org/gnu/make/make-4.4.1.tar.gz
Контрольная сумма MD5: c8469a3713cbbe04d955d4ae4be23eeb
Домашняя страница: https://www.nongnu.org/man-db/
Ссылка на загрузку: https://download.savannah.gnu.org/releases/man-db/man-db-2.12.1.tar.xz
Контрольная сумма MD5: 7b044e5020aab89db41ac7ee59d6d84a
Домашняя страница: https://www.kernel.org/doc/man-pages/
Ссылка на загрузку: https://www.kernel.org/pub/linux/docs/man-pages/man-pages-6.9.1.tar.xz
Контрольная сумма MD5: 4d56775b6cce4edf1e496249e7c01c1a
Домашняя страница: https://palletsprojects.com/p/markupsafe/
Ссылка на загрузку: https://pypi.org/packages/source/M/MarkupSafe/MarkupSafe-2.1.5.tar.gz
Контрольная сумма MD5: 8fe7227653f2fb9b1ffe7f9f2058998a
Домашняя страница: https://mesonbuild.com
Ссылка на загрузку: https://github.com/mesonbuild/meson/releases/download/1.5.1/meson-1.5.1.tar.gz
Контрольная сумма MD5: c4f2b3e5ea632685f61ba1b833c4905c
Домашняя страница: https://www.multiprecision.org/
Ссылка на загрузку: https://ftp.gnu.org/gnu/mpc/mpc-1.3.1.tar.gz
Контрольная сумма MD5: 5c9bc658c9fd0f940e8e3e0f09530c62
Домашняя страница: https://www.mpfr.org/
Ссылка на загрузку: https://ftp.gnu.org/gnu/mpfr/mpfr-4.2.1.tar.xz
Контрольная сумма MD5: 523c50c6318dde6f9dc523bc0244690a
Домашняя страница: https://www.gnu.org/software/ncurses/
Ссылка на загрузку: https://invisible-mirror.net/archives/ncurses/ncurses-6.5.tar.gz
Контрольная сумма MD5: ac2d2629296f04c8537ca706b6977687
Домашняя страница: https://ninja-build.org/
Ссылка на загрузку: https://github.com/ninja-build/ninja/archive/v1.12.1/ninja-1.12.1.tar.gz
Контрольная сумма MD5: 6288992b05e593a391599692e2f7e490
Домашняя страница: https://www.openssl.org/
Ссылка на загрузку: https://www.openssl.org/source/openssl-3.3.1.tar.gz
Контрольная сумма MD5: 8a4342b399c18f870ca6186299195984
Домашняя страница: https://savannah.gnu.org/projects/patch/
Ссылка на загрузку: https://ftp.gnu.org/gnu/patch/patch-2.7.6.tar.xz
Контрольная сумма MD5: 78ad9937e4caadcba1526ef1853730d5
Домашняя страница: https://www.perl.org/
Ссылка на загрузку: https://www.cpan.org/src/5.0/perl-5.40.0.tar.xz
Контрольная сумма MD5: cfe14ef0709b9687f9c514042e8e1e82
Домашняя страница: https://github.com/pkgconf/pkgconf
Ссылка на загрузку: https://distfiles.ariadne.space/pkgconf/pkgconf-2.3.0.tar.xz
Контрольная сумма MD5: 833363e77b5bed0131c7bc4cc6f7747b
Домашняя страница: https://gitlab.com/procps-ng/procps/
Ссылка на загрузку: https://sourceforge.net/projects/procps-ng/files/Production/procps-ng-4.0.4.tar.xz
Контрольная сумма MD5: 2f747fc7df8ccf402d03e375c565cf96
Домашняя страница: https://gitlab.com/psmisc/psmisc
Ссылка на загрузку: https://sourceforge.net/projects/psmisc/files/psmisc/psmisc-23.7.tar.xz
Контрольная сумма MD5: 53eae841735189a896d614cba440eb10
Домашняя страница: https://www.python.org/
Ссылка на загрузку: https://www.python.org/ftp/python/3.12.5/Python-3.12.5.tar.xz
Контрольная сумма MD5: 02c7d269e077f4034963bba6befdc715
Ссылка на загрузку: https://www.python.org/ftp/python/doc/3.12.5/python-3.12.5-docs-html.tar.bz2
Контрольная сумма MD5: 52274d813236ca4a972fb6988480dc56
Домашняя страница: https://tiswww.case.edu/php/chet/readline/rltop.html
Ссылка на загрузку: https://ftp.gnu.org/gnu/readline/readline-8.2.13.tar.gz
Контрольная сумма MD5: 05080bf3801e6874bb115cd6700b708f
Домашняя страница: https://www.gnu.org/software/sed/
Ссылка на загрузку: https://ftp.gnu.org/gnu/sed/sed-4.9.tar.xz
Контрольная сумма MD5: 6aac9b2dbafcd5b7a67a8a9bcb8036c3
Домашняя страница: https://pypi.org/project/setuptools/
Ссылка на загрузку: https://pypi.org/packages/source/s/setuptools/setuptools-72.2.0.tar.gz
Контрольная сумма MD5: 2e0ffd0f6fc632a11442b79d9b1c68bd
Домашняя страница: https://github.com/shadow-maint/shadow/
Ссылка на загрузку: https://github.com/shadow-maint/shadow/releases/download/4.16.0/shadow-4.16.0.tar.xz
Контрольная сумма MD5: eb70bad3316d08f0d3bb3d4bbeccb3b4
Домашняя страница: https://www.infodrom.org/projects/sysklogd/
Ссылка на загрузку: https://github.com/troglobit/sysklogd/releases/download/v2.6.1/sysklogd-2.6.1.tar.gz
Контрольная сумма MD5: dcf0836a0fcc6568efaad230850d9c86
Домашняя страница: https://www.freedesktop.org/wiki/Software/systemd/
Ссылка на загрузку: https://github.com/systemd/systemd/archive/v256.4/systemd-256.4.tar.gz
Контрольная сумма MD5: 03bd1ff158ec0bc55428c77a8f8495bd
Домашняя страница: https://www.freedesktop.org/wiki/Software/systemd/
Ссылка на загрузку: https://anduin.linuxfromscratch.org/LFS/systemd-man-pages-256.4.tar.xz
Контрольная сумма MD5: 8dbcf0ff0d8e5e9d3565f9d2fc153310
Команда Linux From Scratch генерирует собственный архив справочных страниц, используя исходный код systemd. Это делается для того, чтобы избежать ненужных зависимостей.
Домашняя страница: https://savannah.nongnu.org/projects/sysvinit
Ссылка на загрузку: https://github.com/slicer69/sysvinit/releases/download/3.10/sysvinit-3.10.tar.xz
Контрольная сумма MD5: b8fbe11062cf16d3b6a3709b7f6978d2
Домашняя страница: https://www.gnu.org/software/tar/
Ссылка на загрузку: https://ftp.gnu.org/gnu/tar/tar-1.35.tar.xz
Контрольная сумма MD5: a2d8042658cfd8ea939e6d911eaf4152
Домашняя страница: https://tcl.sourceforge.net/
Ссылка на загрузку: https://downloads.sourceforge.net/tcl/tcl8.6.14-src.tar.gz
Контрольная сумма MD5: c30b57c6051be28fa928d09aca82841e
Ссылка на загрузку: https://downloads.sourceforge.net/tcl/tcl8.6.14-html.tar.gz
Контрольная сумма MD5: 5467198f8d57c54835bf80b98ffb0170
Домашняя страница: https://www.gnu.org/software/texinfo/
Ссылка на загрузку: https://ftp.gnu.org/gnu/texinfo/texinfo-7.1.tar.xz
Контрольная сумма MD5: edd9928b4a3f82674bcc3551616eef3b
Домашняя страница: https://www.iana.org/time-zones
Ссылка на загрузку: https://www.iana.org/time-zones/repository/releases/tzdata2024a.tar.gz
Контрольная сумма MD5: 2349edd8335245525cc082f2755d5bf4
Ссылка на загрузку: https://anduin.linuxfromscratch.org/LFS/udev-lfs-20230818.tar.xz
Контрольная сумма MD5: acd4360d8a5c3ef320b9db88d275dae6
Домашняя страница: https://git.kernel.org/pub/scm/utils/util-linux/util-linux.git/
Ссылка на загрузку: https://www.kernel.org/pub/linux/utils/util-linux/v2.40/util-linux-2.40.2.tar.xz
Контрольная сумма MD5: 88faefc8fefced097e58142077a3d14e
Домашняя страница: https://www.vim.org
Ссылка на загрузку: https://github.com/vim/vim/archive/v9.1.0660/vim-9.1.0660.tar.gz
Контрольная сумма MD5: c512a99b3704f193be1a181cc644b2b2
Версия vim меняется ежедневно. Чтобы получить последнюю версию, перейдите на https://github.com/vim/vim/tags.
Домашняя страница: https://pypi.org/project/wheel/
Ссылка на загрузку: https://pypi.org/packages/source/w/wheel/wheel-0.44.0.tar.gz
Контрольная сумма MD5: 440ff4fe51579b7ed16f02af8f8d9494
Домашняя страница: https://github.com/chorny/XML-Parser
Ссылка на загрузку: https://cpan.metacpan.org/authors/id/T/TO/TODDR/XML-Parser-2.47.tar.gz
Контрольная сумма MD5: 89a8e82cfd2ad948b349c0a69c494463
Домашняя страница: https://tukaani.org/xz
Ссылка на загрузку: https://github.com//tukaani-project/xz/releases/download/v5.6.2/xz-5.6.2.tar.xz
Контрольная сумма MD5: bbf73fb28425cebb854328599f85c4cf
Домашняя страница: https://zlib.net/
Ссылка на загрузку: https://zlib.net/fossils/zlib-1.3.1.tar.gz
Контрольная сумма MD5: 9855b6d802d7fe5b7bd5b196a2271655
Домашняя страница: https://facebook.github.io/zstd/
Ссылка на загрузку: https://github.com/facebook/zstd/releases/download/v1.5.6/zstd-1.5.6.tar.gz
Контрольная сумма MD5: 5a473726b3445d0e5d6296afd1ab6854
Общий размер пакетов: примерно 517 MB
В дополнение к пакетам требуется несколько патчей. Эти патчи исправляют ошибки в пакетах, которые должны быть исправлены сопровождающими. Патчи также вносят небольшие изменения, облегчающие работу с пакетами. Для сборки системы LFS потребуются следующие патчи:
Ссылка на загрузку: https://mirror.linuxfromscratch.ru/patches/lfs/12.2/bzip2-1.0.8-install_docs-1.patch
Контрольная сумма MD5: 6a5ac7e89b791aae556de0f745916f7f
Ссылка на загрузку: https://mirror.linuxfromscratch.ru/patches/lfs/12.2/coreutils-9.5-i18n-2.patch
Контрольная сумма MD5: 58961caf5bbdb02462591fa506c73b6d
Download: https://mirror.linuxfromscratch.ru/patches/lfs/12.2/expect-5.45.4-gcc14-1.patch
MD5 sum: 0b8b5ac411d011263ad40b0664c669f0
Ссылка на загрузку: https://mirror.linuxfromscratch.ru/patches/lfs/12.2/glibc-2.40-fhs-1.patch
Контрольная сумма MD5: 9a5997c3452909b1769918c759eff8a2
Ссылка на загрузку: https://mirror.linuxfromscratch.ru/patches/lfs/12.2/kbd-2.6.4-backspace-1.patch
Контрольная сумма MD5: f75cca16a38da6caa7d52151f7136895
Ссылка на загрузку: https://mirror.linuxfromscratch.ru/patches/lfs/12.2/sysvinit-3.10-consolidated-1.patch
Контрольная сумма MD5: 17ffccbb8e18c39e8cedc32046f3a475
Общий размер этих патчей: примерно 190.7 KB
Помимо указанных выше обязательных исправлений, существует ряд необязательных патчей, созданных сообществом LFS. Эти необязательные исправления решают незначительные проблемы или включают функции, которые не включены по умолчанию. Не стесняйтесь просматривать базу данных исправлений, расположенную по адресу https://mirror.linuxfromscratch.ru/patches/downloads/, и применять патчи, необходимые вашей системе.
В этой главе мы выполним несколько дополнительных настроек для
подготовки к сборке временной системы. Мы создадим несколько
каталогов в $LFS
(в котором
установим временные инструменты), добавим непривилегированного
пользователя и настроим окружение для этого пользователя. Кроме
этого, будут даны пояснения по стандартной единице времени
сборки, или «SBU», которую мы используем для измерения
времени необходимого для сборки пакетов 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
Программы в Глава 6 будут скомпилированы с помощью кросс-компилятора (более подробная информация приведена в разделе Технические примечания по сборочным инструментам). Чтобы отделить кросс-компилятор от других программ, он будет установлен в специальный каталог. Создайте этот каталог с помощью следующей команды:
mkdir -pv $LFS/tools
Редакторы LFS намеренно решили не использовать каталог
/usr/lib64
. В процессе сборки
предпринимается ряд шагов, чтобы убедиться, что набор
инструментов не будет его использовать. Если по какой-либо
причине этот каталог появится (это может произойти, если вы
допустили ошибку, следуя инструкциям, или потому что вы
установили бинарный пакет, создавший его после сборки 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
В некоторых хост-системах следующая команда не выполняется
должным образом и приостанавливает вход пользователя
lfs
в фоновом режиме. Если
подсказка "lfs:~$" не появляется сразу, ввод команды
fg устранит
проблему.
Затем запустите оболочку, работающую от имени пользователя
lfs
. Это можно сделать, войдя в
систему как lfs
на виртуальной
консоли или с помощью следующей команды замены/переключения
пользователя:
su - lfs
Аргумент «-
» передает
значение команде su для запуска оболочки входа
в систему, а не обычной оболочки. Разница между этими двумя
типами оболочек подробно описана в bash(1) и
info bash.
Настроим хорошо работающее окружение, создав два новых файла
запуска для оболочки 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=$(uname -m)-lfs-linux-gnu
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 PATH CONFIG_SITE
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.32», не
настроен на загрузку или выполнение /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
Многие люди хотели бы знать заранее, сколько примерно времени потребуется для компиляции и установки каждого пакета. Поскольку Linux From Scratch может быть собран на различных системах, невозможно дать точную оценку времени. Сборка самого большого пакета (gcc) займет около 5 минут на быстрых системах, но может занять несколько дней на более медленных компьютерах! Вместо фактического времени в книге используется показатель "стандартная единица времени сборки" (SBU).
Показатель SBU рассчитывается следующим образом. Первым пакетом, который нужно скомпилировать, является binutils в Глава 5. Время, необходимое для компиляции этого пакета с использованием одного ядра, будет называться стандартной единицей времени сборки или SBU. Время компиляции остальных пакетов будет рассчитано относительно этого времени.
Например, рассмотрим пакет, время компиляции которого составляет 4,5 SBU. Это означает, что если вашей системе потребовалось 4 минуты для компиляции и сборки первого прохода binutils, то для сборки этого пакета потребуется примерно 18 минут. К счастью, в большинстве случаев, время сборки меньше, чем у binutils.
В целом, величина SBU не совсем точна, поскольку она зависит от множества факторов, начиная от версии GCC хост-системы. Она приведены здесь, чтобы дать оценку того, сколько времени может потребоваться для сборки пакета, но в некоторых случаях цифры могут отличаться на десятки минут.
В современных материнских платах есть возможность управлять тактовой частотой процессора. Это можно сделать с помощью команды, такой как, powerprofilesctl. Данная возможность отсутствует в LFS, но может быть доступна в хост-дистрибутиве. После сборки LFS управление производительностью и электропитанием можно добавить в систему с помощью инструкций, описанных на странице BLFS power-profiles-daemon.
Перед измерением времени сборки любого пакета рекомендуется задействовать профиль энергопотребления системы, настроенный на максимальную производительность (и максимальное энергопотребление).
В противном случае измеренное значение SBU может быть неточным, поскольку система может по-разному реагировать на сборку binutils-pass1 или других пакетов.
Имейте в виду, что даже если для обоих пакетов используется один и тот же профиль, все равно могут возникнуть существенные неточности, поскольку система может реагировать медленнее, если система простаивает при запуске процедуры сборки. Установка для профиля питания режима «производительность» сведет к минимуму эту проблему. И, очевидно, это также ускорит сборку LFS.
Если powerprofilesctl доступен,
введите команду powerprofilesctl
set performance, чтобы выбрать профиль
производительность
. Некоторые
дистрибутивы для управления профилями предоставляют команду
tuned-adm вместо
powerprofilesctl,
в этих дистрибутивах введите команду tuned-adm profile
throughput-performance, чтобы выбрать профиль
производительность
.
Когда используется несколько ядер, единицы измерения SBU будут различаться еще больше, чем обычно. В некоторых случаях make просто завершится ошибкой. Анализ выходных данных процесса сборки также будет более сложным, поскольку строки разных потоков будут чередоваться. Если вы столкнулись с проблемой на этапе сборки, вернитесь к сборке на одном ядре, чтобы проанализировать сообщения об ошибках.
Представленные здесь значения времени для всех пакетов (за исключением binutils-pass1, который собирается на одном ядре) рассчитаны при использовании четырех ядер (-j4). Время, указанное в главе 8, также включает время выполнения регрессионных тестов для пакета, если не указано иное.
Большинство пакетов предоставляют набор тестов. Запуск набора тестов для только что собранного пакета — хорошая идея, потому что он может обеспечить «проверку работоспособности», указывающую, что все скомпилировано правильно. Набор тестов, который проходит свой набор проверок, обычно доказывает, что пакет работает так, как задумал разработчик. Однако это не гарантирует, что пакет полностью без ошибок.
Некоторые наборы тестов более важны, чем другие. Например, наборы тестов для основных инструментов — 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.2/, чтобы проверить, ожидаются ли сбои. Этот сайт актуален для всех наборов тестов, описанных в книге.
Эта часть разделена на три этапа: во-первых, сборка кросс-компилятора и связанных с ним библиотек; во-вторых, использование этого набора инструментов для сборки нескольких утилит таким образом, чтобы изолировать их от основного дистрибутива; в-третьих, вход в среду 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 создают код для машины, на которой они выполняются. Такие компиляторы называются нативными компиляторами.
Все кросс-компилируемые пакеты в этой книге используют систему сборки на основе 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
и зафиксировать результат.
Официальный источник, охватывающий все платформы, находится
на вики-странице
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.40; хост-дистрибутив может использовать либо другую реализацию 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 всегда использует параметры, передаваемые скрипту
configure, которые указаны в --host
, например, в нашем
случае компилятором будет $LFS_TGT-gcc, а
инструментом readelf будет $LFS_TGT-readelf. С
заголовочными файлами ядра может быть немного сложнее.
Поэтому мы не рискуем и используем доступный параметр
configure, чтобы обеспечить правильный выбор. После
выполнения команды configure проверьте
содержимое файла config.make
в
каталоге build
на наличие всех
нужных параметров. Эти элементы подчеркивают важный аспект
пакета 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
Вот краткое описание процесса сборки:
Поместите все исходники и патчи в каталог,
который будет доступен из среды chroot, например,
/mnt/lfs/sources/
.
Перейдите в каталог /mnt/lfs/sources/
.
С помощью программы tar извлеките пакет для сборки. В Глава 5 и Глава 6 убедитесь, что при извлечении пакета вы залогинены под пользователем lfs.
Не используйте никаких методов, кроме команды tar, для извлечения исходного кода. Примечательно, что использование команды cp -R для копирования дерева исходного кода в другое место может привести к уничтожению меток времени в дереве исходного кода и привести к сбою сборки.
Перейдите в каталог, созданный при извлечении пакета.
Следуйте инструкциям по сборке пакета.
Вернитесь в исходный каталог, когда сборка будет завершена.
Удалите извлеченный каталог, если не указано иное.
В этой главе дано описание, как создать кросс-компилятор и связанные с ним инструменты. Несмотря на то, что на данном этапе кросс-компиляция имитируется, принципы его работы те же, что и для настоящего кросс-тулчейна.
Программы, скомпилированные в этой главе, будут установлены в
каталог $LFS/tools
, чтобы они
были отделены от файлов, установленных в следующих главах.
Библиотеки, же, устанавливаются на свое постоянное место,
поскольку они относятся к системе, которую мы хотим создать.
Пакет 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-new-dtags \ --enable-default-hash-style=gnu
Значение параметров настройки:
--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-new-dtags
Этот параметр заставляет компоновщик использовать тег «runpath» для встраивания путей поиска библиотек в исполняемые файлы и общие библиотеки вместо традиционного тега «rpath». Это упрощает отладку динамически подключаемых исполняемых файлов и устраняет потенциальные проблемы в наборах тестов некоторых пакетов.
--enable-default-hash-style=gnu
По умолчанию компоновщик генерирует как хеш-таблицу в стиле GNU, так и классическую хеш-таблицу ELF для общих библиотек и динамически связанных исполняемых файлов. Хеш-таблицы необходимы только для динамического компоновщика, выполняющего поиск символов. В LFS динамический компоновщик (предоставляемый пакетом Glibc) всегда будет использовать хеш-таблицу в стиле GNU, к которой запросы выполняются быстрее. Так что классическая хеш-таблица ELF совершенно бесполезна. Этот параметр указывает компоновщику по умолчанию генерировать только хеш-таблицу в стиле GNU, поэтому мы можем избежать траты времени на создание классической хеш-таблицы ELF при сборке пакетов или не тратить дисковое пространство для ее хранения.
Скомпилируйте пакет:
make
Установите пакет:
make install
Подробная информация об этом пакете находится в Раздел 8.20.2, «Содержимое пакета Binutils.»
Пакет GCC содержит коллекцию компиляторов GNU, которая включает компиляторы C и C++.
Для GCC требуются пакеты GMP, MPFR и MPC. Поскольку эти пакеты могут отсутствовать в дистрибутиве вашего хоста, они будут собраны с помощью GCC. Распакуйте каждый пакет в исходный каталог GCC и переименуйте получившиеся каталоги, чтобы процедуры сборки GCC использовали их автоматически:
В этой главе часто возникают недоразумения, хотя применяются те же процедуры, что и в любой другой главе, следуйте инструкции которую получили ранее (Инструкции по сборке пакетов). Сначала распакуйте пакет gcc-14.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
На хостах x86_64 измените имя каталога по умолчанию для 64-битных библиотек на «lib»:
case $(uname -m) in x86_64) sed -e '/m64=/s/lib64/lib/' \ -i.orig gcc/config/i386/t-linux64 ;; esac
В документации к GCC рекомендуется собирать GCC в отдельном каталоге:
mkdir -v build cd build
Подготовьте GCC к компиляции:
../configure \ --target=$LFS_TGT \ --prefix=$LFS/tools \ --with-glibc-version=2.40 \ --with-sysroot=$LFS \ --with-newlib \ --without-headers \ --enable-default-pie \ --enable-default-ssp \ --disable-nls \ --disable-shared \ --disable-multilib \ --disable-threads \ --disable-libatomic \ --disable-libgomp \ --disable-libquadmath \ --disable-libssp \ --disable-libvtv \ --disable-libstdcxx \ --enable-languages=c,c++
Значение параметров настройки:
--with-glibc-version=2.40
Этот параметр указывает версию 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, который еще не установлен в целевой системе.
--disable-multilib
На x86_64, LFS не поддерживает конфигурацию multilib. Этот аргумент никак не влияет на работу с архитектурой x86.
--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.»
Заголовочные файлы Linux API (в linux-6.10.5.tar.xz) предоставляют API ядра для использования Glibc.
Ядро 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
Заголовочные файлы Linux API ASM |
|
Заголовочные файлы Linux API ASM Generic |
|
Заголовочные файлы Linux API DRM |
|
Заголовочные файлы Linux API Linux |
|
Заголовочные файлы Linux API Miscellaneous |
|
Заголовочные файлы API MTD |
|
Заголовочные файлы Linux API RDMA |
|
Заголовочные файлы Linux API SCSI |
|
Заголовочные файлы Linux API Sound |
|
Заголовочные файлы Linux API Video |
|
Заголовочные файлы Linux API Xen |
Пакет Glibc содержит основную библиотеку C. Эта библиотека предоставляет основные процедуры для выделения памяти, поиска в каталогах, открытия и закрытия файлов, чтения и записи файлов, обработки строк, сопоставления с образцом, арифметики и так далее
Во-первых, создайте символическую ссылку для соответствия требованиям LSB. Кроме того, для совместимости с x86_64 создайте символическую ссылку, необходимую для правильной работы загрузчика динамической библиотеки:
case $(uname -m) in i?86) ln -sfv ld-linux.so.2 $LFS/lib/ld-lsb.so.3 ;; 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 ;; esac
Приведенная выше команда верна. Команда ln имеет несколько вариантов синтаксиса, поэтому обязательно ознакомьтесь с info coreutils ln и ln(1), прежде чем сообщать об ошибке.
Некоторые программы, использующие Glibc, применяют
несовместимый с FHS каталог /var/db
для хранения своих данных времени
выполнения. Установите следующий патч, чтобы такие программы
хранили свои данные в местах, совместимых с FHS:
patch -Np1 -i ../glibc-2.40-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 \ 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]
Обратите внимание, что для 32-разрядных машин имя
интерпретатора будет /lib/ld-linux.so.2
.
Если выходные данные отображаются не так, как указано выше, или их вообще нет, значит, что-то сделано неправильно. Разберитесь с проблемой и повторите шаги выше, чтобы исправить ее. Эта проблема должна быть решена, прежде чем вы продолжите.
Как только все будет хорошо, удалите тестовый файл:
rm -v a.out
Сборка пакетов в следующей главе послужит дополнительной проверкой правильности сборки временного кросс-тулчейна. Если какой-либо пакет, особенно Binutils или GCC, не удается собрать, это указывает на то, что что-то пошло не так с установленными ранее Binutils, GCC, или Glibc.
Подробная информация об этом пакете находится в Раздел 8.5.3, «Содержимое пакета Glibc.»
Libstdc++ — это стандартная библиотека C++. Она нужна для компиляции кода C++ (часть GCC написана на C++), когда мы собирали GCC-Проход 1, нам пришлось отложить её установку, потому что она зависит от библиотеки Glibc, которой еще не было в целевом каталоге.
Libstdc++ является частью
исходников GCC. Сначала вы должны распаковать архив GCC и
перейти в каталог gcc-14.2.0
.
Создайте отдельный каталог сборки для libstdc++ и перейдите в него:
mkdir -v build cd build
Подготовьте libstdc++ к компиляции:
../libstdc++-v3/configure \ --host=$LFS_TGT \ --build=$(../config.guess) \ --prefix=/usr \ --disable-multilib \ --disable-nls \ --disable-libstdcxx-pch \ --with-gxx-include-dir=/tools/$LFS_TGT/include/c++/14.2.0
Значение параметров настройки:
--host=...
Указывает, что должен использоваться кросс-компилятор,
который мы только что собрали, вместо того, который
находится в /usr/bin
.
--disable-libstdcxx-pch
Этот аргумент предотвращает установку предварительно скомпилированных include-файлов, которые на данном этапе не нужны.
--with-gxx-include-dir=/tools/$LFS_TGT/include/c++/14.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++/14.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.»
В этой главе рассказывается, как выполнить кросс-компиляцию базовых утилит с использованием только что собранного кросс-тулчейна. Эти утилиты установлены в свое конечное местоположение, но пока не могут быть использованы. Выполняемые инструкции по-прежнему зависят от инструментария хоста. Тем не менее, установленные библиотеки используются при компоновке.
Использование утилит станет возможным в следующей главе после входа в среду «chroot». Все пакеты из этой главы, должны быть собраны до того, как мы это сделаем. Поэтому пока наша система зависима от хост-системы.
Еще раз напомним, что неправильная настройка LFS
вместе со сборкой от root
может сделать ваш компьютер
непригодным для использования. Всю эту главу нужно выполнить от
имени пользователя lfs
, в его
рабочем окружении, как описано в Раздел 4.4, «Настройка
окружения».
Пакет M4 содержит макропроцессор.
Подготовьте пакет M4 к компиляции:
./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(build-aux/config.guess)
Скомпилируйте пакет:
make
Установите пакет:
make DESTDIR=$LFS install
Подробная информация об этом пакете находится в Раздел 8.13.2, «Содержимое пакета M4.»
Пакет 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
Значение новых параметров настройки:
--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 с хоста. Использование инструментов хоста в кросс-компилируемой программе может привести к сбою.
Скомпилируйте пакет:
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, которая работает на сборочной машине, чтобы база данных терминала была создана без ошибок.
Библиотека libncurses.so
необходима для нескольких пакетов, которые мы скоро
соберем. Мы создаем эту символическую ссылку, чтобы
использовать libncursesw.so
в качестве замены.
Заголовочный файл curses.h
содержит определения
различных структур данных Ncurses. С разными
определениями макросов препроцессора могут
использоваться два разных набора определений структуры
данных: 8-битное определение совместимо с libncurses.so
, а определение
расширенного набора символов совместимо с libncursesw.so
. Поскольку мы
используем libncursesw.so
вместо libncurses.so
,
отредактируйте заголовочный файл, чтобы он всегда
использовал определение структуры данных расширенного
набора символов, совместимое с .
libncursesw.so
.
Подробная информация об этом пакете находится в Раздел 8.30.2, «Содержимое пакета Ncurses.»
Пакет Bash содержит Bourne-Again Shell.
Подготовьте Bash к компиляции:
./configure --prefix=/usr \ --build=$(sh support/config.guess) \ --host=$LFS_TGT \ --without-bash-malloc \ bash_cv_strtold_broken=no
Значение параметров настройки:
--without-bash-malloc
Этот параметр отключает использование функции
распределения памяти (malloc
) Bash, которая, как известно,
вызывает ошибки сегментации. Если опция отключена, Bash
будет использовать функции malloc
из Glibc, которые более
стабильны.
Скомпилируйте пакет:
make
Установите пакет:
make DESTDIR=$LFS install
Создайте символическую ссылку для программ, которые используют sh как оболочку:
ln -sv bash $LFS/bin/sh
Подробная информация об этом пакете находится в Раздел 8.36.2, «Содержимое пакета Bash.»
Пакет 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.»
Пакет Diffutils содержит программы, которые показывают различия между файлами или каталогами.
Подготовьте Diffutils для компиляции:
./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(./build-aux/config.guess)
Скомпилируйте пакет:
make
Установите пакет:
make DESTDIR=$LFS install
Подробная информация об этом пакете находится в Раздел 8.60.2, «Содержимое пакета Diffutils.»
Пакет 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.11.2, «Содержимое пакета File.»
Пакет Findutils содержит программы для поиска файлов. Эти программы предназначены для поиска по всем файлам в дереве каталогов, а также для создания, обслуживания и поиска в базе данных (часто быстрее, чем рекурсивный поиск, но ненадежно, если база данных давно не обновлялась).Findutils также предоставляет программу xargs, которую можно использовать для запуска указанной команды для каждого файла, выбранного при поиске.
Подготовьте 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.»
Пакет 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.»
Пакет Grep содержит программы для поиска по содержимому файлов.
Подготовьте Grep к компиляции:
./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(./build-aux/config.guess)
Скомпилируйте пакет:
make
Установите пакет:
make DESTDIR=$LFS install
Подробная информация об этом пакете находится в Раздел 8.35.2, «Содержимое пакета Grep.»
Пакет Gzip содержит программы для сжатия и распаковки файлов.
Подготовьте Gzip к компиляции:
./configure --prefix=/usr --host=$LFS_TGT
Скомпилируйте пакет:
make
Установите пакет:
make DESTDIR=$LFS install
Подробная информация об этом пакете находится в Раздел 8.65.2, «Содержимое пакета Gzip.»
Пакет 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.»
Пакет Patch содержит программу для изменения или создания файлов путём наложение «патча», обычно, создаваемого программой diff.
Подготовьте Patch к компиляции:
./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(build-aux/config.guess)
Скомпилируйте пакет:
make
Установите пакет:
make DESTDIR=$LFS install
Подробная информация об этом пакете находится в Раздел 8.70.2, «Содержимое пакета Patch.»
Пакет Sed содержит потоковый редактор текста
Подготовьте Sed к компиляции:
./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(./build-aux/config.guess)
Скомпилируйте пакет:
make
Установите пакет:
make DESTDIR=$LFS install
Подробная информация об этом пакете находится в Раздел 8.31.2, «Содержимое пакета Sed.»
Пакет Tar предоставляет возможность создавать tar архивы, а также производить с ними различные манипуляции. Tar может распаковать предварительно созданный архив, добавить или обновить файлы в нём, вернуть список файлов в архиве.
Подготовьте Tar к компиляции:
./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(build-aux/config.guess)
Скомпилируйте пакет:
make
Установите пакет:
make DESTDIR=$LFS install
Подробная информация об этом пакете находится в Раздел 8.71.2, «Содержимое пакета Tar.»
Пакет Xz содержит программы для сжатия и распаковки файлов. Он предоставляет возможности для lzma и более новых форматов сжатия xz. Сжатие текстовых файлов с помощью xz дает лучший процент сжатия, чем с традиционные gzip или bzip2.
Подготовьте Xz к компиляции:
./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(build-aux/config.guess) \ --disable-static \ --docdir=/usr/share/doc/xz-5.6.2
Скомпилируйте пакет:
make
Установите пакет:
make DESTDIR=$LFS install
Удалите архивный файл libtool, поскольку он потенциально опасен при кросс-компиляции:
rm -v $LFS/usr/lib/liblzma.la
Подробная информация об этом пакете находится в Раздел 8.8.2, «Содержимое пакета Xz.»
Пакет 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-new-dtags \ --enable-default-hash-style=gnu
Значение новых параметров настройки:
--enable-shared
Собирает libbfd
как
разделяемую библиотеку
--enable-64-bit-bfd
Включает 64-разрядную поддержку (на хостах с меньшим размером слова). В 64-разрядных системах это может и не понадобиться, но вреда от этого не будет
Скомпилируйте пакет:
make
Установите пакет:
make DESTDIR=$LFS install
Удалите архивные файлы libtool, поскольку они потенциально опасны при кросс-компиляции, также удалите ненужные статические библиотеки
rm -v $LFS/usr/lib/lib{bfd,ctf,ctf-nobfd,opcodes,sframe}.{a,la}
Подробная информация об этом пакете находится в Раздел 8.20.2, «Содержимое пакета Binutils.»
Пакет GCC содержит коллекцию компиляторов GNU, которая включает компиляторы C и C++.
Как и при первой сборке 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
При сборке на x86_64 измените имя каталога по умолчанию для 64-разрядных библиотек на «lib»:
case $(uname -m) in x86_64) sed -e '/m64=/s/lib64/lib/' \ -i.orig gcc/config/i386/t-linux64 ;; esac
Переопределите правила сборки заголовочных файлов 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 к компиляции:
../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 \ --disable-multilib \ --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++, поскольку она была собрана
без поддержки libc
--disable-libsanitizer
Отключает библиотеки среды выполнения GCC sanitizer.
Они не нужны для временного набора инструментов. В
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.»
В этой главе рассказывается, как собрать последние недостающие части временной системы: инструменты, необходимые для сборки различных пакетов. Теперь, когда все циклические зависимости устранены, для сборки можно использовать среду «chroot», полностью изолированную от операционной системы хоста (за исключением работающего ядра).
Для правильной работы изолированной среды необходимо установить связь с работающим ядром. Это делается с помощью так называемых виртуальных файловых систем ядра, которые будут смонтированы перед входом в среду chroot. Вы можете проверить, смонтированы ли они, выполнив команду findmnt.
До Раздел 7.4, «Вход в
окружение Chroot» команды должны выполняться от имени
root
с установленной переменной
LFS
. После входа в chroot все
команды выполняются от имени root
, к счастью, без доступа к операционной
системе компьютера, на котором вы собираете LFS. В любом случае
будьте осторожны, так как неверными командами легко разрушить
всю систему LFS.
Команды, приведенные в оставшейся части книги, должны
выполняться от имени пользователя root
, а не lfs
. Дважды проверьте, что переменная
$LFS
установлена в переменных
окружения пользователя root
.
В настоящее время вся иерархия каталогов в $LFS
принадлежит пользователю lfs
, существующему только на хост-системе.
Если права на файлы и каталоги внутри $LFS
оставить как есть, то они будут
принадлежать ID пользователя без существующей учетной записи.
Это опасно, так как созданная позже учетная запись, может
получить такой же ID пользователя и стать владельцем всех
файлов в $LFS
, тем самым делая
эти файлы уязвимыми для возможных злонамеренных манипуляций.
Для решения проблемы измените владельца каталогов $LFS/*
на пользователя root
, выполнив следующую команду:
chown --from lfs -R root:root $LFS/{usr,lib,var,etc,bin,sbin,tools} case $(uname -m) in x86_64) chown --from lfs -R root:root $LFS/lib64 ;; esac
Приложения, работающие в пользовательском пространстве, используют различные файловые системы, созданные ядром, для взаимодействия с самим ядром. Эти файловые системы являются виртуальными: для них не используется дисковое пространство. Содержимое файловых систем находится в памяти. Эти файловые системы должны быть смонтированы в дереве каталогов $LFS, чтобы приложения могли найти их в среде chroot.
Начните с создания каталогов, в которые будут смонтированы эти виртуальные файловые системы:
mkdir -pv $LFS/{dev,proc,sys,run}
Во время обычной загрузки ядро автоматически монтирует
файловую систему devtmpfs
в
каталог /dev
; ядро создает узлы
устройств в этой виртуальной файловой системе в процессе
загрузки или при первом обнаружении устройства, или доступе к
нему. Демон udev может изменять владельца или разрешения
узлов устройств, созданных ядром, или создавать новые узлы
устройств или символические ссылки, чтобы облегчить работу
разработчиков дистрибутива или системных администраторов.
(Подробности смотрите в Раздел 9.3.2.2,
«Создание узла устройства».) Если ядро хоста поддерживает
devtmpfs
, мы можем просто
смонтировать devtmpfs
в
$LFS/dev
и положиться на ядро
для его заполнения.
Но в некоторых ядрах хоста отсутствует поддержка devtmpfs
, эти хост-дистрибутивы
используют разные методы для создания содержимого
/dev
. Таким образом,
единственный независимый от хоста способ заполнить каталог
$LFS/dev
- это привязка к
каталогу /dev
хост-системы.
Связное монтирование - это особый тип монтирования, который
делает дерево каталога или файл видимым в каком-либо другом
месте. Для этого используйте следующую команду:
mount -v --bind /dev $LFS/dev
Теперь смонтируйте оставшиеся виртуальные файловые системы:
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
Теперь, когда все пакеты, необходимые для сборки остальных
инструментов установлены в системе, пришло время войти в
окружение 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 для продолжения установки.
Пришло время создать полную структуру каталогов в файловой системе 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/lib/locale 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
По умолчанию каталоги создаются с правами 755, но это
нежелательно делать для всех каталогов. В приведенных выше
командах вносятся два изменения — одно в домашний каталог
пользователя root
, а другое в
каталоги для временных файлов.
Первое изменение гарантирует, что никто не сможет войти в
каталог /root
— точно так же, как
обычный пользователь сделал бы это со своим собственным
домашним каталогом. Второе изменение гарантирует, что любой
пользователь может писать в каталоги /tmp
и /var/tmp
, но не может удалять из них файлы
другого пользователя. Последнее запрещено так называемым
«sticky bit (липким
битом)», старшим битом (1) в битовой маске 1777
Это дерево каталогов основано на стандарте иерархии файловой
системы (FHS) (доступен по адресу https://refspecs.linuxfoundation.org/fhs.shtml).
FHS также указывает, что наличие некоторых каталогов
необязательно, например, /usr/local/games
и /usr/share/games
. В LFS мы создаем только
те каталоги, которые действительно необходимы. Однако, не
стесняйтесь создавать дополнительные каталоги, если хотите.
FHS не требует наличия каталога /usr/lib64
, и редакторы LFS решили его не
использовать. Чтобы инструкции в LFS и BLFS работали
корректно, крайне важно, чтобы этот каталог не существовал.
Время от времени вам следует проверять, что он не
существует, потому что его легко создать непреднамеренно, и
это, вероятно, приведет к поломке вашей системы.
Исторически сложилось, что 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
для того, чтобы
избежать несопоставленных идентификаторов. Другие дистрибутивы
могут обрабатывать этот идентификатор по-разному, поэтому любая
переносимая программа не должна зависеть от этого присвоения.
Для некоторых пакетов требуется локаль.
localedef -i C -f UTF-8 C.UTF-8
Для некоторых тестов в Глава 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 года"). Многие пакеты перестали их
использовать, другие же, собираются прекратить их
использование. Вероятно, лучше считать их устаревшими.
Пакет Gettext содержит утилиты для интернационализации и локализации. Они позволяют компилировать программы с поддержкой NLS (Native Language Support), позволяя им выводить сообщения на родном языке пользователя.
Для временного набора инструментов нам нужно установить только три программы из пакета 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.»
Пакет 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.»
Пакет Perl содержит практический язык для извлечения данных и составления отчётов (Practical Extraction and Report Language).
Подготовьте Perl к компиляции:
sh Configure -des \ -D prefix=/usr \ -D vendorprefix=/usr \ -D useshrplib \ -D privlib=/usr/lib/perl5/5.40/core_perl \ -D archlib=/usr/lib/perl5/5.40/core_perl \ -D sitelib=/usr/lib/perl5/5.40/site_perl \ -D sitearch=/usr/lib/perl5/5.40/site_perl \ -D vendorlib=/usr/lib/perl5/5.40/vendor_perl \ -D vendorarch=/usr/lib/perl5/5.40/vendor_perl
Значение новых опций Configure:
-des
Это комбинация из трех параметров: -d использует значения по умолчанию для всех элементов; -e обеспечивает выполнение всех задач; -s отключает несущественные выходные данные.
-D
vendorprefix=/usr
Параметр гарантирует, что perl знает, как указать пакетам, где они должны устанавливать свои модули Perl.
-D
useshrplib
Собрать библиотеку libperl, необходимую некоторым модулям Perl, как общую библиотеку вместо статической.
-D
privlib,-D archlib,-D sitelib,...
Эти настройки определяют, где Perl ищет установленные модули. Редакторы LFS решили поместить их в структуру каталогов, основанную на MAJOR.MINOR версии Perl (5.40), что позволяет обновлять Perl до более новых уровней исправлений (уровень исправления - это последняя разделенная точками часть в строке полной версии, например 5.40.0) без необходимости переустанавливать все модули.
Скомпилируйте пакет:
make
Установите пакет:
make install
Подробная информация об этом пакете находится в Раздел 8.43.2, «Содержимое пакета Perl.»
Пакет Python 3 содержит среду разработчика Python. Его можно использовать для объектно-ориентированного программирования, написания скриптов, прототипирования больших программ и разработка целых приложений. Python — это интерпретируемый язык программирования.
Существует два пакета, имена которых начинаются с префикса
«python». Сейчас необходимо
распаковать файл Python-3.12.5.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.»
Пакет Texinfo содержит программы для чтения, записи и преобразования информационных страниц.
Подготовьте Texinfo к компиляции:
./configure --prefix=/usr
Скомпилируйте пакет:
make
Установите пакет:
make install
Подробная информация об этом пакете находится в Раздел 8.72.2, «Содержимое пакета Texinfo.»
Пакет 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 \ --disable-liblastlog2 \ --without-python \ ADJTIME_PATH=/var/lib/hwclock/adjtime \ --docdir=/usr/share/doc/util-linux-2.40.2
Значение параметров настройки:
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
Подробная информация об этом пакете находится в Раздел 8.79.2, «Содержимое пакета Util-linux.»
Во-первых, удалите установленную документацию, чтобы предотвратить ее попадание в конечную систему и сэкономить около 35 МБ места:
rm -rf /usr/share/{info,man,doc}/*
Во-вторых, в современных системах Linux файлы .la библиотеки libtool полезны только для libltdl. Никакие библиотеки в LFS не загружаются с помощью libltdl. Известно, что некоторые файлы .la могут привести к сбою во время сборки пакетов BLFS. Удалите эти файлы сейчас:
find /usr/{lib,libexec} -name \*.la -delete
Сейчас размер системы составляет около 3 ГБ, однако каталог /tools больше не понадобится. Удалите его, чтобы освободить около 1 ГБ дискового пространства:
rm -rf /tools
На данный момент основные программы и библиотеки собраны, и ваша система 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.2.tar.xz .
Если вы переходите к главе 8, не забудьте повторно войти в среду chroot, как описано в разделе «Важно» ниже.
В случае, если были допущены какие-либо ошибки и вам нужно
начать все сначала, вы можете использовать эту резервную
копию для восстановления системы и сэкономить время на
восстановление. Поскольку исходники находятся в папке
$LFS
, они также включены в
архив резервной копии, поэтому их не нужно загружать
повторно. Убедившись, что переменная $LFS
настроена правильно, вы можете
восстановить резервную копию, выполнив следующие команды:
Следующие команды чрезвычайно опасны. Если вы запустите
команду rm -rf
./* от имени пользователя root
и не перейдете в каталог $LFS или
переменная окружения LFS
не
будет установлена для пользователя root
, это уничтожит всю вашу
хост-систему. ВЫ ПРЕДУПРЕЖДЕНЫ.
cd $LFS
rm -rf ./*
tar -xpf $HOME/lfs-temp-tools-12.2.tar.xz
Еще раз проверьте, правильно ли настроено окружение, и продолжайте сборку остальной части системы.
Если вы покинули среду chroot, чтобы создать резервную копию или перезапустить сборку с помощью восстановления, не забудьте проверить, что виртуальные файловые системы все еще смонтированы (findmnt | grep $LFS). Если они не смонтированы, перемонтируйте их сейчас, как описано в Раздел 7.3, «Подготовка виртуальных файловых систем ядра», и повторно войдите в среду chroot (см. Раздел 7.4, «Вход в окружение Chroot»), прежде чем продолжить.
В этой главе мы приступаем к сборке конечной системы LFS.
Установка программного обеспечения проста. Хотя во многих случаях инструкции по установке можно было бы сделать короче и универсальнее, мы решили предоставить полные инструкции для каждого пакета, чтобы свести к минимуму вероятность ошибок. Ключом к пониманию того, что заставляет систему Linux работать, является знание того, для чего используется каждый пакет и зачем он вам (или системе) может понадобиться.
Мы не рекомендуем использовать оптимизации. С ними программа
может работать немного быстрее, но также они могут вызвать
сложности при компиляции и проблемы при запуске программы. Если
пакет не компилируется при использовании оптимизации,
попробуйте скомпилировать его без оптимизации и посмотрите,
решает ли это проблему. Даже если пакет компилируется при
использовании оптимизации, существует риск, что он может быть
скомпилирован неправильно из-за сложных взаимодействий между
кодом и инструментами сборки. Также обратите внимание, что
параметры -march
и -mtune
, не тестировались со значениями
отличными от указанных в книге. Это может вызвать проблемы с
пакетами набора инструментов (Binutils, GCC и Glibc). Небольшие
потенциальные плюсы, достигаемые за счет оптимизации, часто
перевешиваются рисками. Тем кто собирает LFS впервые
рекомендуется делать это без пользовательских оптимизаций.
С другой стороны, мы сохраняем оптимизацию включенной в
конфигурации пакетов по умолчанию. Кроме того, иногда мы явно
включаем оптимизированную конфигурацию, предоставляемую
пакетом, но не включенную по умолчанию. Сопровождающие пакета
уже протестировали эти конфигурации и считают их безопасными,
поэтому маловероятно, что они сломают сборку. Как правило,
конфигурация по умолчанию уже включает параметры -O2
или -O3
,
поэтому результирующая система по-прежнему будет работать очень
быстро без какой-либо пользовательской оптимизации и в то же
время будет стабильной.
Перед инструкцией по установке на каждой странице представлена информация о пакете, включая краткое описание того, что он содержит, примерное время, необходимое для сборки, и сколько места на диске требуется в процессе сборки. После инструкции по установке идет список программ и библиотек (вместе с кратким описанием), которые устанавливает пакет.
Для всех пакетов в Глава 8 значения SBU и требуемое дисковое пространство указано с учетом тестов. Значения SBU были рассчитаны с использованием четырех ядер ЦП (-j4) для всех операций, если не указано иное.
Как правило, редакторы LFS не рекомендуют собирать и устанавливать статические библиотеки. Большинство статических библиотек устарели в современной системе Linux. Кроме того, линковка статической библиотеки с программой может быть вредна. Если для устранения проблемы безопасности требуется обновление библиотеки, все программы, использующие статическую библиотеку, необходимо будет повторно перелинковать с новой библиотекой. Поскольку использование статических библиотек не всегда очевидно, соответствующие программы (и процедуры, необходимые для линковки) могут быть даже неизвестны.
В инструкциях этой главы мы удаляем или отключаем установку
большинства статических библиотек. Обычно это делается путем
передачи параметра --disable-static
при выполнении configure. Иногда
необходимо использовать альтернативные методы. В некоторых
случаях, в частности в пакетах Glibc и GCC, использование
статических библиотек остается важным элементом процесса
сборки пакетов.
Более подробное обсуждение библиотек смотрите Библиотеки: статические или общие? в книге BLFS.
Управление пакетами — часто cпрашиваемое дополнение к книге LFS. Менеджер пакетов позволяет отслеживать установку файлов, упрощая удаление и обновление пакетов. Хороший менеджер пакетов также будет обрабатывать конфигурационные файлы, чтобы сохранить пользовательские настройки при переустановке или обновлении пакета. Прежде чем вы начнете задаваться вопросом, НЕТ—в этом разделе не будет ни говориться, ни рекомендоваться какой-либо конкретный менеджер пакетов. Что он действительно предоставляет, так это обзор наиболее популярных методов и того, как они работают. Идеальным менеджером пакетов для вас может быть один из этих методов или комбинация двух и более методов. В этом разделе кратко упоминаются проблемы, которые могут возникнуть при обновлении пакетов.
Некоторые причины, по которым менеджер пакетов не упоминается в LFS или BLFS представлены ниже:
Рассмотрение управления пакетами отвлекает внимание от целей этих книг—обучения тому, как строится система Linux.
Существует множество решений для управления пакетами, каждое из которых имеет свои сильные и слабые стороны. Трудно найти такое, которое удовлетворит всех.
Есть несколько советов, написанных на тему управления пакетами. Посетите проект Советы возможно вы найдете решение, которое соответствует вашим потребностям.
Менеджер пакетов упрощает обновление до более новых версий после их выпуска. Как правило, инструкции в книгах LFS и BLFS можно использовать для обновления до более новых версий. Вот некоторые моменты, о которых следует помнить при обновлении пакетов, особенно в работающей системе.
Если нужно обновить ядро Linux (например, с 5.10.17 до 5.10.18 или 5.11.1), дополнительно пересобирать ничего не нужно. Система продолжит нормально работать благодаря четко определенной границе между ядром и пользовательским пространством. В частности, заголовки Linux API не нужно обновлять вместе с ядром. Вам просто нужно перезагрузить систему, чтобы использовать обновленное ядро.
Если необходимо обновить Glibc до более новой версии (например, с Glibc-2.36 до Glibc-2.40) необходимо выполнить некоторые дополнительные действия, чтобы избежать поломки системы. Подробности читайте в Раздел 8.5, «Glibc-2.40».
Если пакет, содержащий общую библиотеку, обновляется и
имя библиотеки изменилось, то любые пакеты, динамически
связанные с библиотекой, необходимо перекомпилировать,
чтобы связать с более новой библиотекой. (Обратите
внимание, что между версией пакета и именем библиотеки
нет никакой связи.) Например, рассмотрим пакет
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) просто перезаписывает файл, если он существует, и вызывает сбой. Поэтому безопаснее сохранить свою работу и закрыть ненужные запущенные программы перед обновлением пакета.
Ниже приведены некоторые распространенные методы управления пакетами. Прежде чем принять решение о менеджере пакетов, проведите исследование различных методов, особенно недостатки каждой конкретной схемы.
Да, это метод управления пакетами. Некоторым людям не нужен менеджер пакетов, потому что они хорошо знакомы с пакетами и знают, какие файлы устанавливаются каждым пакетом. Некоторым пользователям также не требуется какое-либо управление пакетами, поскольку они планируют пересобирать всю систему при каждом изменении пакета.
Это упрощенный метод управления пакетами, для которого не
требуется специальная программа управления. Каждый пакет
устанавливается в отдельный каталог. Например, пакет
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) могут плохо работать с такой структурой. Никогда не используйте её в масштабах всей системы.
Это разновидность предыдущей техники.Каждый пакет
устанавливается аналогично, но вместо создания
символической ссылки на общее имя пакета, каждому файлу
создаётся символическая ссылка в иерархии каталогов
/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
.
В этом методе файлу присваивается временная метка перед установкой пакета. После установки простое использование команды find с соответствующими параметрами может создать журнал всех файлов, установленных после создания файла с временной метки. Менеджером пакетов, использующим этот подход, является install-log.
Хотя преимущество этой схемы в том, что она проста, у нее есть два недостатка. Если во время установки, файлы устанавливаются с отметкой времени, отличной от текущего времени, эти файлы не будут отслеживаться менеджером пакетов. Кроме того, эта схема может использоваться только при установке пакетов по одному. Журналы ненадежны, если два пакета устанавливаются одновременно на двух разных консолях.
При таком подходе, записываются команды, выполняемые сценариями установки. Есть два метода, которые можно использовать:
Переменная среды LD_PRELOAD
может быть установлена так, чтобы она указывала на
библиотеку, которую нужно предварительно загрузить перед
установкой. Во время установки эта библиотека отслеживает
устанавливаемые пакеты, присоединяясь к различным
исполняемым файлам, таким как cp, install, mv, и отслеживая
системные вызовы, изменяющие файловую систему. Чтобы этот
подход работал, все исполняемые файлы должны быть
динамически связаны без битов suid или sgid.
Предварительная загрузка библиотеки может вызвать некоторые
нежелательные побочные эффекты во время установки. Поэтому
рекомендуется выполнить некоторые тесты, чтобы убедиться,
что менеджер пакетов ничего не сломает и что он
регистрирует все соответствующие файлы.
Другой метод заключается в использовании strace, который регистрирует все системные вызовы, сделанные во время выполнения сценариев установки.
В этой схеме установка пакета имитируется в отдельном дереве, как описано ранее в разделе управление пакетами с использованием символических ссылок. После установки из установленных файлов создается архив пакета. Затем этот архив используется для установки пакета на локальный компьютер или даже на другие компьютеры.
Этот подход используется большинством менеджеров пакетов, имеющихся в коммерческих дистрибутивах. Примерами менеджеров пакетов, которые следуют этому подходу, являются 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.
Эта схема, уникальная для LFS, была разработана Маттиасом Бенкманом и доступна в проекте Hints. В этой схеме каждый пакет устанавливается отдельным пользователем в стандартные папки. Файлы, принадлежащие пакету, легко идентифицируются путем проверки идентификатора пользователя. Особенности и недостатки этого подхода слишком сложны, чтобы описывать их в этом разделе. Для получения более подробной информации, пожалуйста, ознакомьтесь с советами по адресу https://mirror.linuxfromscratch.ru/hints/downloads/files/more_control_and_pkg_man.txt.
Одним из преимуществ системы 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 для настройки процесса загрузки».
Пакет Man-pages содержит более 2400 справочных руководств.
Удалите две справочные страницы для функций хэширования паролей. Libxcrypt предоставит улучшенную версию этих справочных страниц:
rm -v man3/crypt*
Установите пакет Man-pages выполнив команду:
make prefix=/usr install
Пакет Iana-Etc предоставляет данные для сетевых служб и протоколов.
Для этого пакета необходимо лишь скопировать нужные файлы:
cp services protocols /etc
Пакет Glibc содержит основную библиотеку C. Эта библиотека предоставляет основные процедуры для выделения памяти, поиска в каталогах, открытия и закрытия файлов, чтения и записи файлов, обработки строк, сопоставления с образцом, арифметики и так далее
Некоторые программы Glibc используют не совместимый с FHS
каталог /var/db
для хранения
своих данных во время выполнения. Примените следующий патч,
чтобы эти программы хранили свои данные в каталогах,
совместимых с FHS:
patch -Np1 -i ../glibc-2.40-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 \ --disable-nscd \ 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" $(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.40) в работающей системе 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.10.5.»
Обновите заголовочные файлы API ядра, если они старше
4.19 (проверьте текущую версию с помощью cat
/usr/include/linux/version.h) или,
если вы просто хотите обновить их, следуйте Раздел 5.4,
«Заголовочные файлы Linux-6.10.5 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
. Следующие
инструкции установят минимальный набор локалей, необходимый
для оптимального охвата тестов
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.40/localedata/SUPPORTED
(он
включает все локали из списка выше и многие другие), выполнив
команду:
make localedata/install-locales
Затем используйте команду localedef для создания и
установки локалей, не перечисленных в файле glibc-2.40/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.
Необходимо создать файл /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
Установите и настройте часовой пояс следующим образом:
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).
По умолчанию, динамический загрузчик (/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
Создает каталоги сообщений |
|
Отображает настройки системы для специфичных переменных файловой системы |
|
Получает записи из административной базы данных |
|
Выполняет преобразование набора символов |
|
Создает быстрозагружаемые файлы настроек модуля iconv |
|
Создаёт необходимые привязки и кэш динамических библиотек, который используется компоновщиком для связывания во время выполнения |
|
Сообщает, какие общие библиотеки требуются каждой программе или общей библиотеке |
|
Помогает ldd работать с объектными файлами. Он не существует на более новых архитектурах, таких как x86_64 |
|
Выводит различную информацию о текущей локали |
|
Компилирует спецификации локали |
|
Создает простую базу данных на основе текстового ввода |
|
Читает и интерпретирует файл трассировки памяти; отображает сводку в удобочитаемом формате |
|
Создает дамп информации, генерируемой при профилировании ПК |
|
Перечисляет динамические общие объекты, используемые запущенными процессами. |
|
Статически скомпонованная программа ln |
|
Отслеживает вызовы процедур общей библиотеки указанной команды |
|
Читает и отображает данные профилирования общих объектов. |
|
Запрашивает у пользователя информацию о текущем местоположении системы и выводит описание соответствующего часового пояса. |
|
Отслеживает выполнение программы, отображая выполняемую в данный момент функцию |
|
Выдает дамп часового пояса |
|
Компилятор часовых поясов |
|
Вспомогательная программа для исполняемых файлов общей библиотеки |
|
Используется внутри Glibc как грубый хак для
запуска сломанных программ (например, некоторые
приложения Motif). Прочитайте комментарии в
|
|
Библиотека-заглушка, не содержащая функций. Ранее
это была библиотека асинхронного поиска имен,
функции которой теперь находятся в |
|
Основная библиотека C |
|
Включает проверку выделения памяти при предварительной загрузке |
|
Библиотека-заглушка, не содержащая функций. Ранее
была библиотекой интерфейса динамической
компоновки, функции которой теперь находятся в
|
|
Библиотека-заглушка без функций. Раньше была библиотекой среды выполнения для g++ |
|
Математическая библиотека |
|
Библиотека векторных математических вычислений,
подключаемая по мере необходимости при
использовании |
|
Включает проверку выделения памяти при подключении к |
|
Используется memusage для сбора информации об использовании памяти программой |
|
Библиотека сетевых служб, которая в настоящее время устарела |
|
Модули Name Service Switch, содержащие функции для
разрешения имен хостов, имен пользователей, имен
групп, псевдонимов, служб, протоколов и т. д.
Загружаются |
|
Содержит функции профилирования, используемые для отслеживания времени, потраченного процессором в конкретных строках исходного кода |
|
Библиотека-заглушка, не содержащая функций. Ранее
содержала функции, обеспечивающие большинство
интерфейсов, заданных POSIX.1c Threads Extensions
(расширения реализации потоков) и интерфейсы
семафоров, указанных в POSIX.1b Real-time Extension
(расширения реального времени), теперь эти функции
находятся в |
|
Содержит функции создания, пересылки и интерпретации пакетов, используемых на серверах доменных имен в сети интернет |
|
Содержит функции, реализующие большую часть интерфейсов, определяемых в POSIX.1b Real-time Extension (расширения реального времени) |
|
Содержит функции, полезные для сборки отладчиков для многопоточных программ |
|
Библиотека-заглушка, не содержащая функций. Ранее
содержал код для «стандартных» функций,
используемых во многих утилитах Unix. Эти функции
теперь находятся в |
Пакет Zlib содержит подпрограммы сжатия и распаковки, используемые некоторыми программами.
Подготовьте Zlib к компиляции:
./configure --prefix=/usr
Скомпилируйте пакет:
make
Чтобы протестировать пакет, выполните:
make check
Установите пакет:
make install
Удалите бесполезную статическую библиотеку:
rm -fv /usr/lib/libz.a
Пакет Bzip2 содержит программы для сжатия и распаковки файлов. Сжатие текстовых файлов с помощью bzip2 даёт больший процент сжатия, чем традиционный gzip.
Примените патч, который установит документацию для этого пакета:
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
Распаковывает bzip-файлы |
|
Распаковывает в поток стандартного вывода |
|
Запускает программу cmp для bzip файлов |
|
Запускает программу diff для bzip файлов |
|
Запускает программу egrep для bzip файлов |
|
Запускает программу fgrep для bzip файлов |
|
Запускает программу grep для bzip файлов |
|
Сжимает файлы, используя алгоритм сжатия текста с блочной сортировкой Барроуза — Уилера и кодирование Хафмана; степень сжатия лучше, чем у более традиционных архиваторов, использующих алгоритмы «Lempel-Ziv», например gzip |
|
Пытается восстанавливать данные из поврежденных архивов |
|
Запускает программу less для bzip файлов |
|
Запускает программу more для bzip файлов |
|
Библиотека, реализующая сжатие данных без потерь с использованием алгоритма Барроуза-Уилера. |
Пакет Xz содержит программы для сжатия и распаковки файлов. Он предоставляет возможности для lzma и более новых форматов сжатия xz. Сжатие текстовых файлов с помощью xz дает лучший процент сжатия, чем с традиционные gzip или bzip2.
Подготовьте Xz к компиляции:
./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/xz-5.6.2
Скомпилируйте пакет:
make
Чтобы протестировать пакет, выполните:
make check
Установите пакет:
make install
Распаковывает в стандартный поток вывода |
|
Запускает cmp для файлов сжатых LZMA |
|
Запускает diff для файлов сжатых LZMA |
|
Запускает egrep для файлов сжатых LZMA |
|
Запускает fgrep для файлов сжатых LZMA |
|
Запускает grep для файлов сжатых LZMA |
|
Запускает less для файлов сжатых LZMA |
|
Сжимает или распаковывает файлы в формате LZMA |
|
Небольшой и быстрый декодер для файлов сжатых LZMA. |
|
Показывает информацию, хранящуюся в заголовке сжатого файла LZMA |
|
Запускает more для файлов сжатых LZMA |
|
Распаковывает файлы в формате LZMA |
|
Распаковывает файлы в формате XZ |
|
Сжимает или распаковывает файлы в формате XZ. |
|
Распаковывает в стандартный поток вывода |
|
Запускает cmp для сжатых XZ файлов |
|
Небольшой и быстрый декодер для файлов сжатых XZ |
|
Запускает diff для сжатых XZ файлов |
|
Запускает egrep для сжатых XZ файлов |
|
Запускает fgrep для сжатых XZ файлов |
|
Запускает grep для сжатых XZ файлов |
|
Запускает less для сжатых XZ файлов |
|
Запускает more для сжатых XZ файлов |
|
Библиотека, реализующая сжатие данных без потерь с блочной сортировкой с использованием алгоритма Lempel-Ziv-Markov |
Lz4 - это алгоритм сжатия без потерь, обеспечивающий скорость сжатия более 500 МБ/с на ядро. Он оснащен чрезвычайно быстрым декодером со скоростью несколько ГБ/с. Lz4 может работать с Zstandard, позволяя обоим алгоритмам быстрее сжимать данные.
Скомпилируйте пакет:
make BUILD_STATIC=no PREFIX=/usr
Чтобы протестировать пакет, выполните:
make -j1 check
Установите пакет:
make BUILD_STATIC=no PREFIX=/usr install
Zstandard — это алгоритм сжатия в реальном времени, обеспечивающий высокую степень сжатия. Он предлагает очень широкий диапазон компромиссов между сжатием и скоростью при поддержке очень быстрого декодера.
Скомпилируйте пакет:
make prefix=/usr
В выходных данных теста есть несколько мест, выводящих сообщение 'failed'. Они ожидаемы, и только 'FAIL' является фактическим сбоем теста. Сбоев при тестировании быть не должно.
Чтобы протестировать пакет, выполните:
make check
Установите пакет:
make prefix=/usr install
Удалите статическую библиотеку:
rm -v /usr/lib/libzstd.a
Пакет File содержит утилиту для определения типа указанного файла или файлов
Подготовьте File к компиляции:
./configure --prefix=/usr
Скомпилируйте пакет:
make
Чтобы протестировать пакет, выполните:
make check
Установите пакет:
make install
Пакет Readline представляет собой набор библиотек, предлагающих возможности редактирования прямо в командной строке и просмотра истории команд.
Переустановка пакета Readline приводит к перемещению старых библиотек в <libraryname>.old. Обычно это не вызывает проблем, но в некоторых случаях могут возникать ошибки линковки с ldconfig. Этого можно избежать, выполнив следующие две команды sed:
sed -i '/MV.*old/d' Makefile.in sed -i '/{OLDSUFF}/c:' support/shlib-install
Запретите использование библиотеки поиска списка жестко запрограммированных путей (rpath) в общих библиотеках. Этому пакету не требуется rpath для установки в стандартное местоположение, кроме того, rpath иногда может вызывать нежелательные эффекты или даже проблемы с безопасностью:
sed -i 's/-Wl,-rpath,[^ ]*//' support/shobj-conf
Подготовьте Readline к компиляции:
./configure --prefix=/usr \ --disable-static \ --with-curses \ --docdir=/usr/share/doc/readline-8.2.13
Значение нового параметра 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.13
Пакет M4 содержит макропроцессор.
Подготовьте M4 к компиляции:
./configure --prefix=/usr
Скомпилируйте пакет:
make
Чтобы протестировать пакет, выполните:
make check
Установите пакет:
make install
Копирует указанные файлы, одновременно расширяя содержащиеся в них макросы. Эти макросы являются либо встроенными, либо определяемыми пользователем и могут принимать любое количество аргументов. Помимо выполнения макросов, m4 имеет встроенные функции для включения указанных файлов, выполнения команд Unix, выполнения целочисленной арифметики, манипулирования текстом, рекурсии и т.д. Программа m4 может использоваться либо как интерфейс к компилятору, либо как самостоятельный макропроцессор |
Пакет Bc содержит язык для обработки чисел произвольной точности.
Подготовьте Bc к компиляции:
CC=gcc ./configure --prefix=/usr -G -O3 -r
Значение параметров настройки:
CC=gcc
Этот параметр определяет используемый компилятор
-G
Пропускает часть тестов, которые не будут работать, пока не будет установлена программа bc.
-O3
Указывает используемый уровень оптимизации.
-r
Включает использование Readline для улучшения функции редактирования строк в bc.
Скомпилируйте пакет:
make
Чтобы протестировать пакет, выполните:
make test
Установите пакет:
make install
Пакет 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
Инструмент для создания программ, распознающих текст по шаблону; это позволяет гибко указывать правила поиска паттернов, устраняя необходимость разработки специализированной программы. |
|
Расширение flex используется для генерации кода и классов C++. Является символической ссылкой на flex |
|
Символическая ссылка, запускает flex в режиме эмуляции lex |
|
Библиотека |
Пакет Tcl содержит Tool Command Language, надежный скриптовый язык общего назначения. Пакет Expect написан на языке Tcl (произносится как "тикл").
Этот пакет и следующие два (Expect и DejaGNU) устанавливаются для поддержки возможности тестирования Binutils, GCC и других пакетов. Установка трех пакетов для целей тестирования может показаться избыточной, но вы будете чувствовать себя увереннее, когда знаете, что наиболее важные инструменты работают правильно.
Подготовьте Tcl к компиляции:
SRCDIR=$(pwd) cd unix ./configure --prefix=/usr \ --mandir=/usr/share/man \ --disable-rpath
Значение новых параметров конфигурации:
--disable-rpath
Этот параметр предотвращает использование библиотеки поиска списка жестко запрограммированных путей (rpath) в двоичных исполняемых файлах и общих библиотеках. Этому пакету не требуется rpath для установки в стандартное местоположение, кроме того, rpath иногда может вызывать нежелательные эффекты или даже проблемы с безопасностью.
Соберите пакет:
make sed -e "s|$SRCDIR/unix|/usr/lib|" \ -e "s|$SRCDIR|/usr/include|" \ -i tclConfig.sh sed -e "s|$SRCDIR/unix/pkgs/tdbc1.1.7|/usr/lib/tdbc1.1.7|" \ -e "s|$SRCDIR/pkgs/tdbc1.1.7/generic|/usr/include|" \ -e "s|$SRCDIR/pkgs/tdbc1.1.7/library|/usr/lib/tcl8.6|" \ -e "s|$SRCDIR/pkgs/tdbc1.1.7|/usr/include|" \ -i pkgs/tdbc1.1.7/tdbcConfig.sh sed -e "s|$SRCDIR/unix/pkgs/itcl4.2.4|/usr/lib/itcl4.2.4|" \ -e "s|$SRCDIR/pkgs/itcl4.2.4/generic|/usr/include|" \ -e "s|$SRCDIR/pkgs/itcl4.2.4|/usr/include|" \ -i pkgs/itcl4.2.4/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.14-html.tar.gz --strip-components=1 mkdir -v -p /usr/share/doc/tcl-8.6.14 cp -v -r ./html/* /usr/share/doc/tcl-8.6.14
Пакет Expect содержит инструменты для автоматизации работы интерактивных приложений, таких как telnet, ftp, passwd, fsck, rlogin и tip, с помощью скриптовых диалогов и макросов. Кроме того Expect полезен для тестирования перечисленных выше приложений, а также для решения сложных задач взаимодействия с другими средствами. Фреймворк DejaGnu написан на языке 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), потерпят фатальный сбой, а также
могут произойти другие незначительные сбои.
Теперь внесите некоторые изменения, чтобы разрешить использование пакета с gcc-14.1 или более поздней версией:
patch -Np1 -i ../expect-5.45.4-gcc14-1.patch
Подготовьте Expect к компиляции:
./configure --prefix=/usr \ --with-tcl=/usr/lib \ --enable-shared \ --disable-rpath \ --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
Пакет DejaGnu содержит фреймворк для запуска наборов тестов на инструментах GNU. Он написан на expect, который в свою очередь использует Tcl (командный язык инструментов).
Разработчики рекомендуют собирать 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
Пакет pkgconf является преемником pkg-config и содержит инструмент, который позволяет передавать пути установки или пути к библиотекам для инструментов сборки на этапе настройки (configure) и сборки(make) пакетов.
Подготовьте Pkgconf к компиляции:
./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/pkgconf-2.3.0
Скомпилируйте пакет:
make
Установите пакет:
make install
Для обеспечения совместимости с исходным Pkg-config, создайте две символические ссылки:
ln -sv pkgconf /usr/bin/pkg-config ln -sv pkgconf.1 /usr/share/man/man1/pkg-config.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 \ --enable-new-dtags \ --with-system-zlib \ --enable-default-hash-style=gnu
Значение новых параметров настройки:
--enable-gold
Собирает компоновщик gold и устанавливает его как ld.gold (вместе с компоновщиком по умолчанию).
--enable-ld=default
Собирает оригинальный компоновщик bfd и устанавливает его как ld (компоновщик по умолчанию) и как ld.bfd
--enable-plugins
Включает поддержку плагинов для компоновщика.
--with-system-zlib
Указывает, что необходимо использовать установленную библиотеку zlib вместо сборки собственной.
Скомпилируйте пакет:
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
.
Установите пакет:
make tooldir=/usr install
Удалите бесполезные статические библиотеки:
rm -fv /usr/lib/lib{bfd,ctf,ctf-nobfd,gprofng,opcodes,sframe}.a
Переводит адреса программ в имена файлов и номера строк; учитывая адрес и имя исполняемого файла, использует отладочную информацию в исполняемом файле, для определения файла исходного кода и номера строки, ассоциированной с адресом |
|
Создаёт, изменяет и распаковывает архивы |
|
Ассемблер, который собирает результат работы gcc в объектные файлы |
|
Используется компоновщиком для исправления символов C++ и Java и предотвращения конфликтов перегруженных функций. |
|
Утилита для упаковки DWARF |
|
Обновляет ELF заголовки в ELF файлах |
|
Отображает в графическом виде информацию о профилировании |
|
Собирает и анализирует данные о производительности |
|
Компоновщик, который объединяет несколько объектных и архивных файлов в один файл, перемещая их данные и связывая символическими ссылками |
|
Урезанная версия ld, которая поддерживает только формат объектных файлов elf |
|
Жесткая ссылка на ld |
|
Выводит список символов, используемых в данном объектном файле |
|
Преобразует один тип объектного файла в другой |
|
Отображает информацию о данном объектном файле; можно указать параметры, определяющие, какая конкретно информация будет отображаться. Отображаемая информация полезна для программистов, которые работают над инструментами, используемыми при компиляции |
|
Создает индекс содержимого архива и сохраняет его в архиве; в индексе перечислены все символы, определенные в перемещаемых объектных файлах, содержащихся в архиве |
|
Отображает информацию о двоичных файлах типа ELF |
|
Отображает размеры секций и общий размер указанных объектных файлов |
|
Выводит для каждого указанного файла последовательности печатаемых символов, которые имеют по крайней мере указанную длину (по умолчанию четыре); для объектных файлов по умолчанию печатаются только строки из секций инициализации и загрузки, в то время как для других файлов он сканирует весь файл. |
|
Удаляет символы из объектных файлов |
|
Библиотека дескрипторов двоичных файлов |
|
Библиотека отладки формата Compat ANSI-C Type |
|
Вариант libctf, не использующий функциональность libbfd. |
|
Библиотека, содержащая большинство подпрограмм, используемых gprofng |
|
Библиотека для работы с опкодами—«читаемыми» версиями инструкций для процессора. Используется для сборки таких утилит как objdump |
|
Библиотека для поддержки обратной онлайн-трассировки с использованием простого декодера разделов .sframe. |
Пакет 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
Пакет MPFR содержит функции для двоичных вычислений с плавающей запятой произвольной точности.
Подготовьте MPFR к компиляции:
./configure --prefix=/usr \ --disable-static \ --enable-thread-safe \ --docdir=/usr/share/doc/mpfr-4.2.1
Скомпилируйте пакет и сгенерируйте HTML-документацию:
make make html
Набор тестов для MPFR в этом разделе считается критически важным. Ни в коем случае не пропускайте его.
Выполните тестирование и убедитесь, что все 198 тестов пройдены:
make check
Установите пакет и документацию к нему:
make install make install-html
Пакет MPC содержит библиотеку для арифметики комплексных чисел с высокой точностью и правильным округлением результата.
Подготовьте MPC к компиляции:
./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/mpc-1.3.1
Скомпилируйте пакет и сгенерируйте HTML-документацию:
make make html
Чтобы протестировать пакет, выполните:
make check
Установите пакет и документацию к нему:
make install make install-html
Пакет Attr содержит утилиты для управления расширенными атрибутами объектов файловой системы.
Подготовьте Attr к компиляции:
./configure --prefix=/usr \ --disable-static \ --sysconfdir=/etc \ --docdir=/usr/share/doc/attr-2.5.2
Скомпилируйте пакет:
make
Тесты необходимо запускать в файловой системе, которая поддерживает расширенные атрибуты, например, ext2, ext3 или ext4. Чтобы протестировать пакет, выполните:
make check
Установите пакет:
make install
Пакет Acl содержит утилиты для администрирования списков контроля доступа, которые используются для определения расширенных дискреционных прав доступа к файлам и каталогам.
Подготовьте Acl к компиляции:
./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/acl-2.3.2
Скомпилируйте пакет:
make
Тесты Acl необходимо запускать в файловой системе, поддерживающей списки контроля доступа, после сборки пакета Coreutils с использованием библиотек Acl. По желанию вернитесь к этому пакету и запустите make check после того, как будет собран пакет Coreutils.
Установите пакет:
make install
Пакет Libcap реализует интерфейсы пользовательского пространства для возможностей POSIX 1003.1e, доступных в ядрах Linux. Эти возможности разделяют полномочия суперпользователя root на набор отдельных привилегий.
Запретите установку статических библиотек:
sed -i '/install -m.*STA/d' libcap/Makefile
Скомпилируйте пакет:
make prefix=/usr lib=lib
Значение опции make:
lib=lib
Этот параметр устанавливает библиотеки в каталог
/usr/lib
, а не
/usr/lib64
на x86_64. На
x86 это никак не влияет.
Чтобы протестировать пакет, выполните:
make test
Установите пакет:
make prefix=/usr lib=lib install
Обёртка к оболочке для исследования и ограничения поддержки возможностей Linux |
|
Проверяет возможности файлов |
|
Отображает возможности запрашиваемого процесса (процессов) |
|
Устанавливает возможности файлов |
|
Содержит функции для управления возможностями POSIX 1003.1e. |
|
Содержит функции для поддержки семантики POSIX для системных вызовов, связанных с библиотекой pthread |
Пакет Libxcrypt содержит современную библиотеку для одностороннего хэширования паролей.
Подготовьте Libxcrypt к компиляции:
./configure --prefix=/usr \ --enable-hashes=strong,glibc \ --enable-obsolete-api=no \ --disable-static \ --disable-failure-tokens
Зна