Подробная информация об этом пакете находится в Раздел 8.19.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.1-ml/systemv. Но это более продвинутая тема.
Создание системы LFS — непростая задача. Это требует определенного уровня знаний системного администрирования Unix для решения проблем и правильного выполнения перечисленных команд. В частности, как абсолютный минимум, Вы должны уметь пользоваться командной оболочкой для копирования или перемещения файлов и каталогов, просмотра содержимого каталогов и файлов и изменения текущего каталога. Также ожидается, что у вас есть достаточные знания об использовании и установке программного обеспечения в Linux.
Поскольку книга LFS предполагает наличие хотя бы этого базового уровня навыков, различные форумы поддержки LFS вряд ли смогут предоставить вам большую помощь в этих вопросах. Вы обнаружите, что ваши вопросы, касающиеся таких базовых знаний, скорее всего, останутся без ответа (или вас просто направят к списку основных материалов для предварительного ознакомления).
Перед созданием системы LFS мы настоятельно рекомендуем прочитать следующие статьи:
HOWTO по сборке программного обеспечения https://tldp.org/HOWTO/Software-Building-HOWTO.html
Это исчерпывающее руководство по сборке и установке «универсальных» программ Unix под Linux. Несмотря на то что руководство написано достаточно давно, оно по-прежнему дает хороший обзор основных методов, применяемых для сборки и установки программного обеспечения.
Руководство для начинающих по установке из исходников https://moi.vonos.net/linux/beginners-installing-from-source/
В этом руководстве содержится хороший обзор основных навыков и методов, необходимых для сборки программ из исходного кода
Структура 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
Этот пакет представляет собой содержимое основных справочных страниц 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.1/, прежде чем приступить к сборке. Вы должны внести требуемые изменения и применить их к соответствующему разделу книги по мере сборки системы 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.
Здесь описан процесс сборки системы в двух словах. Подробная информация о каждом шаге обсуждается в следующих главах и описаниях пакетов. Элементы, которые кажутся сложными сейчас, будут разъяснены позже, и все встанет на свои места, по мере прочтения книги.
Ниже приведен список пакетов, обновленных с момента предыдущего выпуска книги.
Обновлены:
Acl-2.3.2
Attr-2.5.2
Autoconf-2.72
Bash-5.2.21
Bc-6.7.5
Binutils-2.42
Coreutils-9.4
Expat-2.6.0
Gawk-5.3.0
Gettext-0.22.4
Glibc-2.39
GRUB-2.12
Gzip-1.13
Iana-Etc-20240125
Inetutils-2.5
IPRoute2-6.7.0
Jinja2-3.1.3
Kbd-2.6.4
Kmod-31
Libelf из Elfutils-0.190
Linux-6.7.4
Man-DB-2.12.0
Man-pages-6.06
MarkupSafe-2.1.5
Meson-1.3.2
MPFR-4.2.1
Ncurses-6.4-20230520
OpenSSL-3.2.1
Perl-5.38.2
Pkgconf-2.1.1
Procps-ng-4.0.4
Python-3.12.2
Setuptools-69.1.0
Shadow-4.14.5
SysVinit-3.08
Texinfo-7.1
Tzdata-2024a
Util-Linux-2.39.3
Vim-9.1.0041
wheel-0.42.0
XML::Parser-2.47
Xz-5.4.6
Zlib-1.3.1
Добавлены:
bash-5.2.21-upstream_fixes-1.patch
readline-8.2-upstream_fixes-3.patch
setuptools-69.1.0
systemd-255-upstream_fixes-1.patch
Удалены:
glibc-2.38-memalign_fix-1.patch
grub-2.06-upstream_fixes-1.patch
readline-8.2-upstream_fix-1.patch
Это версия 12.1 книги Linux From Scratch от 1 марта 2024. Если этой книге больше шести месяцев, возможно, уже доступна более новая, улучшенная версия. Чтобы узнать это, проверьте одно из зеркал https://mirror.linuxfromscratch.ru/mirrors.html.
Ниже приведен список изменений, внесенных с момента предыдущего выпуска книги.
Список изменений:
2024-02-14
[bdubbs] - Update to meson-1.3.2. Fixes #5442.
2024-02-12
[bdubbs] - Update to shadow-4.14.5. Fixes #5437.
[bdubbs] - Update to setuptools-69.1.0 (Python module). Fixes #5439.
[bdubbs] - Update to python-3.12.2. Fixes #5434.
[bdubbs] - Update to pkgconf-2.1.1. Fixes #5432.
[bdubbs] - Update to MarkupSafe-2.1.5 (Python module). Fixes #5431.
[bdubbs] - Update to man-pages-6.06. Fixes #5438.
[bdubbs] - Update to expat-2.6.0. Fixes #5435.
[bdubbs] - Update to linux-6.7.4. Fixes #5433.
2024-02-02
2024-02-01
[bdubbs] - Update to openssl-3.2.1 (security fix). Fixes #5425.
[bdubbs] - Update to zlib-1.3.1. Fixes #5419.
[bdubbs] - Update to xz-5.4.6. Fixes #5423.
[bdubbs] - Update to linux-6.7.2. Fixes #5422.
[bdubbs] - Update to iana-etc-20240125. Addresses #5006.
[bdubbs] - Update to binutils-2.42. Fixes #5424.
[bdubbs] - Update to acl-2.3.2. Fixes #5421.
[bdubbs] - Update upstream fixes for readline-8.2. Fixes #5420.
[bdubbs] - Apply upstream fix for bash-5.2.21. Fixes #5420.
2024-01-21
[xry111] - Apply upstream fix for pkgconf-2.1.0 regression. Fixes #5414.
[xry111] - Update to jinja2-3.1.3 (security fix). Fixes #5411.
[xry111] - Update to bc-6.7.5. Fixes #5408.
[xry111] - Update to attr-2.5.2. Fixes #5412.
[xry111] - Update to ncurses-6.4-20230520 (security fix). Fixes #5416.
[xry111] - Update to markupsafe-2.1.4. Fixes #5418.
[xry111] - Update to linux-6.7.1. Fixes #5406.
[xry111] - Update to iproute2-6.7.0. Fixes #5410.
[xry111] - Update to vim-9.1.0041. Addresses #4500.
[xry111] - Update to iana-etc-20240117. Addresses #5006.
[xry111] - Update to shadow-4.14.3. Fixes #5413.
[xry111] - Fix CVE-2024-0684 for coreutils-9.4. Fixes #5417.
2024-01-18
[xry111] - Edit a ncurses header to always use the wide-character ABI compatible with libncursesw.so because we are faking the 8-bit libncurses.so with it. Fixes #5415.
2024-01-09
[renodr] - Fix the definition of the C.UTF-8 locale. Fixes #5409.
2023-12-31
[xry111] - Add --enable-default-hash-style=gnu configuring binutils. Fixes #5401.
[xry111] - Fix CVE-2023-7008 for systemd-255. Fixes #5405.
[xry111] - Update to iana-etc-20231205. Addresses #5006.
[xry111] - Update to tzdata-2023d. Fixes #5399.
[xry111] - Update to linux-6.6.8. Fixes #5397.
[xry111] - Update to meson-1.3.1. Fixes #5402.
[xry111] - Update to grub-2.12. Fixes #5396.
[xry111] - Update to inetutils-2.5. Fixes #5404.
[xry111] - Update to setuptools-69.0.3. Fixes #5400.
[xry111] - Update to xml-parser-2.47. Fixes #5403.
[xry111] - Update to vim-9.0.2189. Addresses #4500.
[xry111] - Update to autoconf-2.72. Fixes #5398.
2023-12-16
[xry111] - Update to udev from systemd-255. Fixes #5390.
2023-12-14
[bdubbs] - Update to util-linux v2.39.3. Fixes #5388.
[bdubbs] - Update to python3-3.12.1. Fixes #5392.
[bdubbs] - Update to linux-6.6.7. Fixes #5387.
[bdubbs] - Update to kbd-2.6.4. Fixes #5393.
[bdubbs] - Update to bc-6.7.4. Fixes #5389.
[bdubbs] - Reformat util-linux configure parameters. Fixes #5395.
2023-12-04
[thomas] - Modify commands for install Python docs to avoid too restrictive permissions on the files and dirs.
2023-12-01
[xry111] - Restore NIC naming based on physical system characteristics. Fixes #5386.
2023-11-30
[bdubbs] - Update to vim-9.0.2136. Addresses #4500.
[bdubbs] - Update to iana-etc-20231117. Addresses #5006.
[bdubbs] - Update to bc-6.7.3. Fixes #5385.
[bdubbs] - Update to wheel-0.42.0 (Python Module). Fixes #5384.
[bdubbs] - Update to perl-5.38.2. Fixes #5383.
[bdubbs] - Update to pkgconf-2.1.0. Fixes #5382.
[bdubbs] - Update to readline patches 002 through 007. Fixes #5381.
[bdubbs] - Update to openssl-3.2.0. Fixes #5380.
[bdubbs] - Update to setuptools-69.0.2. Fixes #5379.
[bdubbs] - Update to linux-6.6.3. Fixes #5378.
[bdubbs] - Update to meson-1.3.0. Fixes #5377.
[bdubbs] - Update to gettext-0.22.4. Fixes #5376.
2023-11-13
[xry111] - Update to elfutils-0.190. Fixes #5373.
[xry111] - Update to vim-9.0.2103. Addresses #4500.
[xry111] - Update to linux-6.6.1. Fixes #5369.
[xry111] - Update to xz-5.4.5. Fixes #5371.
[xry111] - Update to iana-etc-20231107. Addresses #5006.
[xry111] - Update to gawk-5.3.0. Fixes #5372.
[xry111] - Update to bash-5.2.21. Fixes #5375.
[xry111] - Update to iproute2-6.6.0. Fixes #5374.
2023-11-01
[bdubbs] - Update to iana-etc-20231019. Addresses #5006.
[bdubbs] - Update to wheel-0.41.3. Fixes #5370.
[bdubbs] - Update to shadow-4.14.2. Fixes #5368.
[bdubbs] - Update to openssl-3.1.4. Fixes #5367.
[bdubbs] - Update to texinfo-7.1. Fixes #5364.
[bdubbs] - Update to meson-1.2.3. Fixes #5366.
[bdubbs] - Update to bc-6.7.2. Fixes #5363.
[bdubbs] - Update to linux-6.5.9. Fixes #5365.
[bdubbs] - Update to Python-3.12.0. Fixes #5357.
[bdubbs] - Add setuptools-68.2.2. Fixes #5358.
2023-10-15
2023-10-03
[xry111] - Update Glibc upstream fixes patch to fix CVE-2023-4911.
2023-10-01
[bdubbs] - Disable building nscd in glibc. Fixes #5349.
[bdubbs] - Update to iana-etc-20230929. Addresses #5006.
[bdubbs] - Update to vim-9.0.1968. Addresses #4500.
[bdubbs] - Update to openssl-3.1.3. Fixes #5350.
[bdubbs] - Update to meson-1.2.2. Fixes #5356.
[bdubbs] - Update to man-db-2.12.0. Fixes #5354.
[bdubbs] - Update to linux-6.5.5. Fixes #5352.
[bdubbs] - Update to kmod-31. Fixes #5355.
[bdubbs] - Update to kbd-2.6.3. Fixes #5361.
[bdubbs] - Update to gettext-0.22.2. Fixes #5348.
[bdubbs] - Update to bc-6.7.0. Fixes #5353.
2023-09-24
[xry111] - Update Glibc upstream fixes patch to plug a memory leak introduced by the security fix.
2023-09-17
2023-09-13
[xry111] - Fix CVE-2023-4806 for Glibc-2.38. Fixes #5347.
2023-09-12
[xry111] - Fix CVE-2023-4527 for Glibc-2.38. Fixes #5346.
2023-09-07
[xry111] - Fix an issue in pkgconf-2.0.3 causing BLFS packages fail to build. Fixes #5341.
2023-09-05
2023-09-04
[bdubbs] - Move caution regarding building by mixing different version of LFS to General Compilation Instructions. Fixes #5338.
2023-09-02
[xry111] - Add --no-cache-dir option for pip3 wheel commands. Addresses BLFS #18466.
[bdubbs] - Update to vim-9.0.1837. Addresses #4500.
[bdubbs] - Update to zlib-1.3. Fixes #5324.
[bdubbs] - Update to wheel-0.41.2 (Python Module). Fixes #5328.
[bdubbs] - Update to util-linux-2.39.2. Fixes #5322.
[bdubbs] - Update to sysvinit-3.08. Fixes #5321.
[bdubbs] - Update to shadow-4.14.0. Fixes #5319.
[bdubbs] - Update to Python-3.11.5. Fixes #5330.
[bdubbs] - Update to procps-ng-4.0.4 (security fix for 32-bit systems). Fixes #5335.
[bdubbs] - Update to pkgconf-2.0.2. Fixes #5323.
[bdubbs] - Update to mpfr-4.2.1. Fixes #5326.
[bdubbs] - Update to kbd-2.6.2. Fixes #5318.
[bdubbs] - Update to gzip-1.13. Fixes #5325.
[bdubbs] - Update to coreutils-9.4. Fixes #5334.
[bdubbs] - Remove unused usb group. Fixes #5331.
2023-09-01
[bdubbs] - LFS-12.0 released.
Если во время создания системы 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.1)
Информацию о дистрибутиве и его версия, используемые для сборки LFS
Вывод сценария Системные требования к хостовой машине
Пакет или раздел где возникла проблема
Точное сообщение об ошибке или четкое описание проблемы
Обратите внимание, отклонялись ли вы от книги
Отклонение от этой книги не означает, что мы не поможем вам. В конце концов, LFS зависит от личных предпочтений. Заблаговременное информирование о любых изменениях в процессе сборки помогает нам оценить и определить возможные причины вашей проблемы
Если что-то пойдет не так во время выполнения скрипта
configure,
просмотрите файл config.log
.
Этот файл может содержать ошибки, обнаруженные во время
настройки, которые не были выведены на экран. Включите
соответствующие
строки, если вам нужно обратиться за помощью.
Как вывод на экран, так и содержимое различных файлов полезны для определения причины проблем компиляции. Вывод экрана из скрипта configure и запуска make может быть полезен. Необязательно включать весь вывод целиком, но обязательно включите всю необходимую информацию. Ниже приведен пример информации, которая должна быть включена в экранный вывод make:
gcc -DALIASPATH=\"/mnt/lfs/usr/share/locale:.\"
-DLOCALEDIR=\"/mnt/lfs/usr/share/locale\"
-DLIBDIR=\"/mnt/lfs/usr/lib\"
-DINCLUDEDIR=\"/mnt/lfs/usr/include\" -DHAVE_CONFIG_H -I. -I.
-g -O2 -c getopt1.c
gcc -g -O2 -static -o make ar.o arscan.o commands.o dir.o
expand.o file.o function.o getopt.o implicit.o job.o main.o
misc.o read.o remake.o rule.o signame.o variable.o vpath.o
default.o remote-stub.o version.o opt1.o
-lutil job.o: In function `load_too_high':
/lfs/tmp/make-3.79.1/job.c:1565: undefined reference
to `getloadavg'
collect2: ld returned 1 exit status
make[2]: *** [make] Error 1
make[2]: Leaving directory `/lfs/tmp/make-3.79.1'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/lfs/tmp/make-3.79.1'
make: *** [all-recursive-am] Error 2
В этом случае многие люди просто включили бы только нижнюю часть:
make [2]: *** [make] Error 1
Этой информации недостаточно, чтобы правильно диагностировать проблему, потому что она только указывает на то, что что-то пошло не так, а не на то, что пошло не так. Весь раздел, как в приведенном выше примере, должен быть сохранен, так как он включает в себя выполненную команду и все связанные с ней сообщения об ошибках.
Отличная статья о том, как обращаться за помощью в Интернете, доступна по адресу http://catb.org/~esr/faqs/smart-questions.html. Прочтите этот документ и следуйте советам, чтобы повысить вероятность получения помощи в которой вы нуждаетесь.
В этой главе проверяются и при необходимости устанавливаются основные инструменты, необходимые для построения LFS. Затем подготавливается раздел, в котором будет размещаться система LFS. Мы создадим сам раздел, создадим на нем файловую систему и смонтируем его.
Редакторы LFS рекомендуют, чтобы процессор имел не менее четырех ядер и не менее 8 ГБ памяти. Старые системы, не отвечающие этим требованиям, будут по-прежнему работать, но время сборки пакетов будет значительно больше, чем указано в документации.
Ваша хост-система должна иметь следующее программное
обеспечение с указанными минимальными версиями. Это не должно
быть проблемой для большинства современных дистрибутивов
Linux. Также обратите внимание на то, что многие дистрибутивы
помещают заголовочные файлы в отдельные пакеты, как правило в
формате
или <package-name>
-devel
.
Обязательно установите эти пакеты, если ваш дистрибутив их
предоставляет.
<package-name>
-dev
Более ранние версии перечисленных ниже пакетов могут работать, но это не проверялось.
Bash-3.2 (/bin/sh должен быть символической или жесткой ссылкой на bash)
Binutils-2.13.1 (Версия выше 2.42 не рекомендуется, так как она не тестировалась)
Bison-2.7 (/usr/bin/yacc должен быть ссылкой на bison или небольшой скрипт, запускающий bison)
Coreutils-8.1
Diffutils-2.8.1
Findutils-4.2.31
Gawk-4.0.1 (/usr/bin/awk должен быть ссылкой на gawk)
GCC-5.2, включая компилятор C++, g++ (версии выше 13.2.0 не рекомендуются, поскольку они не тестировались). Также должны присутствовать стандартные библиотеки C и C++ (с заголовочными файлами), чтобы компилятор C++ мог осуществлять сборку программ.
Grep-2.5.1a
Gzip-1.3.12
Linux Kernel-4.19
Причиной, по которой указаны минимальные требования к версии ядра, является то, что мы указываем эту версию при сборке glibc в Глава 5 и Глава 8. Так как более старые ядра не поддерживаются, скомпилированный пакет glibc немного меньше и быстрее. По состоянию на февраль 2024 г. 4.19 является самой старой версией ядра, поддерживаемой разработчиками ядра. Некоторые версии ядра, более старые, чем 4.19, могут по-прежнему поддерживаться сторонними командами, но они не считаются официальными выпусками ядра; подробности читайте на странице https://kernel.org/category/releases.html
Если версия ядра хоста более ранняя, чем 4.19, вам необходимо обновить ядро на более современную версию. Есть два способа сделать это. Во-первых, посмотрите, предоставляет ли ваш дистрибутив Linux пакет ядра 4.19 или более позднюю версию. Если это так, установите его. Если ваш дистрибутив не предлагает приемлемый пакет ядра или вы предпочитаете не устанавливать его, вы можете скомпилировать ядро самостоятельно. Инструкции по компиляции ядра и настройке загрузчика (при условии, что хост использует GRUB) находятся в Глава 10.
Для сборки LFS необходимо, чтобы ядро хоста
поддерживало псевдотерминал UNIX 98 (PTY). Обычно он
включен на всех настольных или серверных дистрибутивах,
поставляющих Linux 4.19 или более новое ядро. Если на
хосте вы используете самостоятельно собранное ядро,
убедитесь, что для параметра CONFIG_UNIX98_PTYS
установлено значение
y
в конфигурационном файле
ядра.
M4-1.4.10
Make-4.0
Patch-2.5.4
Perl-5.8.8
Python-3.4
Sed-4.1.5
Tar-1.22
Texinfo-5.0
Xz-5.0.0
Обратите внимание, что упомянутые выше символические ссылки необходимы для создания системы LFS с использованием инструкций, содержащихся в этой книге. Симлинки, указывающие на другое программное обеспечение (например, dash, mawk и т. д.), могут работать, но не тестируются и не поддерживаются командой разработчиков LFS, и могут потребовать либо отклонения от инструкций, либо дополнительных исправлений для некоторых пакетов.
Чтобы узнать, есть ли в вашей хост-системе все необходимые пакеты и возможность компилировать программы, выполните следующий скрипт:
cat > version-check.sh << "EOF"
#!/bin/bash
# A script to list version numbers of critical development tools
# If you have tools installed in other directories, adjust PATH here AND
# in ~lfs/.bashrc (section 4.4) as well.
LC_ALL=C
PATH=/usr/bin:/bin
bail() { echo "FATAL: $1"; exit 1; }
grep --version > /dev/null 2> /dev/null || bail "grep does not work"
sed '' /dev/null || bail "sed does not work"
sort /dev/null || bail "sort does not work"
ver_check()
{
if ! type -p $2 &>/dev/null
then
echo "ERROR: Cannot find $2 ($1)"; return 1;
fi
v=$($2 --version 2>&1 | grep -E -o '[0-9]+\.[0-9\.]+[a-z]*' | head -n1)
if printf '%s\n' $3 $v | sort --version-sort --check &>/dev/null
then
printf "OK: %-9s %-6s >= $3\n" "$1" "$v"; return 0;
else
printf "ERROR: %-9s is TOO OLD ($3 or later required)\n" "$1";
return 1;
fi
}
ver_kernel()
{
kver=$(uname -r | grep -E -o '^[0-9\.]+')
if printf '%s\n' $1 $kver | sort --version-sort --check &>/dev/null
then
printf "OK: Linux Kernel $kver >= $1\n"; return 0;
else
printf "ERROR: Linux Kernel ($kver) is TOO OLD ($1 or later required)\n" "$kver";
return 1;
fi
}
# Coreutils first because --version-sort needs Coreutils >= 7.0
ver_check Coreutils sort 8.1 || bail "Coreutils too old, stop"
ver_check Bash bash 3.2
ver_check Binutils ld 2.13.1
ver_check Bison bison 2.7
ver_check Diffutils diff 2.8.1
ver_check Findutils find 4.2.31
ver_check Gawk gawk 4.0.1
ver_check GCC gcc 5.2
ver_check "GCC (C++)" g++ 5.2
ver_check Grep grep 2.5.1a
ver_check Gzip gzip 1.3.12
ver_check M4 m4 1.4.10
ver_check Make make 4.0
ver_check Patch patch 2.5.4
ver_check Perl perl 5.8.8
ver_check Python python3 3.4
ver_check Sed sed 4.1.5
ver_check Tar tar 1.22
ver_check Texinfo texi2any 5.0
ver_check Xz xz 5.0.0
ver_kernel 4.19
if mount | grep -q 'devpts on /dev/pts' && [ -e /dev/ptmx ]
then echo "OK: Linux Kernel supports UNIX 98 PTY";
else echo "ERROR: Linux Kernel does NOT support UNIX 98 PTY"; fi
alias_check() {
if $1 --version 2>&1 | grep -qi $2
then printf "OK: %-4s is $2\n" "$1";
else printf "ERROR: %-4s is NOT $2\n" "$1"; fi
}
echo "Aliases:"
alias_check awk GNU
alias_check yacc Bison
alias_check sh Bash
echo "Compiler check:"
if printf "int main(){}" | g++ -x c++ -
then echo "OK: g++ works";
else echo "ERROR: g++ does NOT work"; fi
rm -f a.out
if [ "$(nproc)" = "" ]; then
echo "ERROR: nproc is not available or it produces empty output"
else
echo "OK: nproc reports $(nproc) logical cores are available"
fi
EOF
bash version-check.sh
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, ReiserFS, JFS и XFS, полезны для конкретных задач. Более подробную информацию об этих файловых системах и многих других можно найти по адресу https://en.wikipedia.org/wiki/Comparison_of_file_systems.
LFS предполагает, что корневая файловая система (/) имеет тип
ext4. Чтобы создать файловую систему ext4
на разделе LFS, выполните следующую
команду:
mkfs -v -t ext4 /dev/<xxx>
Замените <xxx>
именем раздела LFS
Если вы используете существующий раздел подкачки
, нет необходимости его
форматировать. Если был создан новый раздел подкачки
, его нужно будет
инициализировать с помощью этой команды:
mkswap /dev/<yyy>
Замените <yyy>
именем раздела подкачки
.
В этой книге переменная окружения 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
Сделайте этот каталог доступным для записи и установите липкий бит. «Липкий бит» означает, что даже если несколько пользователей имеют право на запись в каталог, только владелец файла может удалить файл в таком каталоге. Следующая команда активирует режимы записи и липкий бит:
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.16.5.tar.xz
Контрольная сумма MD5: 4017e96f89fca45ca946f1c5db6be714
Домашняя страница: https://www.gnu.org/software/bash/
Ссылка на загрузку: https://ftp.gnu.org/gnu/bash/bash-5.2.21.tar.gz
Контрольная сумма MD5: ad5b38410e3bf0e9bcc20e2765f5e3f9
Домашняя страница: https://git.gavinhoward.com/gavin/bc
Ссылка на загрузку: https://github.com/gavinhoward/bc/releases/download/6.7.5/bc-6.7.5.tar.xz
Контрольная сумма MD5: e249b1f86f886d6fb71c15f72b65dd3d
Домашняя страница: https://www.gnu.org/software/binutils/
Ссылка на загрузку: https://sourceware.org/pub/binutils/releases/binutils-2.42.tar.xz
Контрольная сумма MD5: a075178a9646551379bfb64040487715
Домашняя страница: 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.4.tar.xz
Контрольная сумма MD5: 459e9546074db2834eefe5421f250025
Домашняя страница: 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
Домашняя страница: http://e2fsprogs.sourceforge.net/
Ссылка на загрузку: https://downloads.sourceforge.net/project/e2fsprogs/e2fsprogs/v1.47.0/e2fsprogs-1.47.0.tar.gz
Контрольная сумма MD5: 6b4f18a33873623041857b4963641ee9
Домашняя страница: https://sourceware.org/elfutils/
Ссылка на загрузку: https://sourceware.org/ftp/elfutils/0.190/elfutils-0.190.tar.bz2
Контрольная сумма MD5: 79ad698e61a052bea79e77df6a08bc4b
Домашняя страница: https://libexpat.github.io/
Ссылка на загрузку: https://prdownloads.sourceforge.net/expat/expat-2.6.0.tar.xz
Контрольная сумма MD5: bd169cb11f4b9bdfddadf9e88a5c4d4b
Домашняя страница: 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.9.0.tar.xz
Контрольная сумма MD5: 4a4a547e888a944b2f3af31d789a1137
Домашняя страница: 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-13.2.0/gcc-13.2.0.tar.xz
Контрольная сумма MD5: e0e48554cc6e4f261d55ddee9ab69075
Домашняя страница: https://www.gnu.org/software/gdbm/
Ссылка на загрузку: https://ftp.gnu.org/gnu/gdbm/gdbm-1.23.tar.gz
Контрольная сумма MD5: 8551961e36bf8c70b7500d255d3658ec
Домашняя страница: https://www.gnu.org/software/gettext/
Ссылка на загрузку: https://ftp.gnu.org/gnu/gettext/gettext-0.22.4.tar.xz
Контрольная сумма MD5: 2d8507d003ef3ddd1c172707ffa97ed8
Домашняя страница: https://www.gnu.org/software/libc/
Ссылка на загрузку: https://ftp.gnu.org/gnu/glibc/glibc-2.39.tar.xz
Контрольная сумма MD5: be81e87f72b5ea2c0ffe2bedfeb680c6
Разработчики Glibc поддерживают Git ветку содержащую исправления, которые заслуживают внимания для Glibc-2.39 но, к сожалению, выпущенные после релиза Glibc-2.39. Редакторы LFS публикуют рекомендации по безопасности, если в ветку добавлено какое-либо исправление безопасности, но для других недавно добавленных патчей не будет предпринято никаких действий. Вы можете самостоятельно просмотреть патчи и включить некоторые из них, если посчитаете их важными.
Домашняя страница: 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/20240125/iana-etc-20240125.tar.gz
Контрольная сумма MD5: aed66d04de615d76c70890233081e584
Домашняя страница: 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.7.0.tar.xz
Контрольная сумма MD5: 35d8277d1469596b7edc07a51470a033
Домашняя страница: https://jinja.palletsprojects.com/en/3.1.x/
Ссылка на загрузку: https://pypi.org/packages/source/J/Jinja2/Jinja2-3.1.3.tar.gz
Контрольная сумма MD5: caf5418c851eac59e70a78d9730d4cea
Домашняя страница: 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-31.tar.xz
Контрольная сумма MD5: 6165867e1836d51795a11ea4762ff66a
Домашняя страница: https://www.greenwoodsoftware.com/less/
Ссылка на загрузку: https://www.greenwoodsoftware.com/less/less-643.tar.gz
Контрольная сумма MD5: cf05e2546a3729492b944b4874dd43dd
Ссылка на загрузку: https://mirror.linuxfromscratch.ru/lfs/downloads/12.1/lfs-bootscripts-20230728.tar.xz
Контрольная сумма MD5: c37ac1c5dbb57fb326d9c32c8f8b49c7
Домашняя страница: https://sites.google.com/site/fullycapable/
Ссылка на загрузку: https://www.kernel.org/pub/linux/libs/security/linux-privs/libcap2/libcap-2.69.tar.xz
Контрольная сумма MD5: 4667bacb837f9ac4adb4a1a0266f4b65
Домашняя страница: https://sourceware.org/libffi/
Ссылка на загрузку: https://github.com/libffi/libffi/releases/download/v3.4.4/libffi-3.4.4.tar.gz
Контрольная сумма MD5: 0da1a5ed7786ac12dcbaf0d499d8a049
Домашняя страница: 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.7.4.tar.xz
Контрольная сумма MD5: 370e1b6155ae63133380e421146619e0
Ядро Linux обновляется достаточно часто из-за обнаружения уязвимостей в системе безопасности. Можно использовать последнюю стабильную версию ядра, если на странице с ошибками и рекомендациями по безопасности не указано иное.
Для пользователей, у которых ограниченный или тарифицируемый выход в интернет, и которые хотят обновить ядро Linux, можно скачать базовую версию ядра, а затем применить к ней патчи, которые могут быть загружены отдельно. Это может сэкономить немного времени или стоимость при обновлению до следующих версий.
Домашняя страница: 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.0.tar.xz
Контрольная сумма MD5: 67e0052fa200901b314fad7b68c9db27
Домашняя страница: https://www.kernel.org/doc/man-pages/
Ссылка на загрузку: https://www.kernel.org/pub/linux/docs/man-pages/man-pages-6.06.tar.xz
Контрольная сумма MD5: 26b39e38248144156d437e1e10cb20bf
Домашняя страница: 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.3.2/meson-1.3.2.tar.gz
Контрольная сумма MD5: 2d0ebd3a24249617b1c4d30026380cf8
Домашняя страница: 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://anduin.linuxfromscratch.org/LFS/ncurses-6.4-20230520.tar.xz
Контрольная сумма MD5: c5367e829b6d9f3f97b280bb3e6bfbc3
Домашняя страница: https://ninja-build.org/
Ссылка на загрузку: https://github.com/ninja-build/ninja/archive/v1.11.1/ninja-1.11.1.tar.gz
Контрольная сумма MD5: 32151c08211d7ca3c1d832064f6939b0
Домашняя страница: https://www.openssl.org/
Ссылка на загрузку: https://www.openssl.org/source/openssl-3.2.1.tar.gz
Контрольная сумма MD5: c239213887804ba00654884918b37441
Домашняя страница: 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.38.2.tar.xz
Контрольная сумма MD5: d3957d75042918a23ec0abac4a2b7e0a
Домашняя страница: http://pkgconf.org/
Ссылка на загрузку: https://distfiles.ariadne.space/pkgconf/pkgconf-2.1.1.tar.xz
Контрольная сумма MD5: bc29d74c2483197deb9f1f3b414b7918
Домашняя страница: 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.6.tar.xz
Контрольная сумма MD5: ed3206da1184ce9e82d607dc56c52633
Домашняя страница: https://www.python.org/
Ссылка на загрузку: https://www.python.org/ftp/python/3.12.2/Python-3.12.2.tar.xz
Контрольная сумма MD5: e7c178b97bf8f7ccd677b94d614f7b3c
Ссылка на загрузку: https://www.python.org/ftp/python/doc/3.12.2/python-3.12.2-docs-html.tar.bz2
Контрольная сумма MD5: 8a6310f6288e7f60c3565277ec3b5279
Домашняя страница: https://tiswww.case.edu/php/chet/readline/rltop.html
Ссылка на загрузку: https://ftp.gnu.org/gnu/readline/readline-8.2.tar.gz
Контрольная сумма MD5: 4aa1b31be779e6b84f9a96cb66bc50f6
Домашняя страница: 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-69.1.0.tar.gz
Контрольная сумма MD5: 6f6eb780ce12c90d81ce243747ed7ab0
Домашняя страница: https://github.com/shadow-maint/shadow/
Ссылка на загрузку: https://github.com/shadow-maint/shadow/releases/download/4.14.5/shadow-4.14.5.tar.xz
Контрольная сумма MD5: 452b0e59f08bf618482228ba3732d0ae
Домашняя страница: https://www.infodrom.org/projects/sysklogd/
Ссылка на загрузку: https://www.infodrom.org/projects/sysklogd/download/sysklogd-1.5.1.tar.gz
Контрольная сумма MD5: c70599ab0d037fde724f7210c2c8d7f8
Домашняя страница: https://www.freedesktop.org/wiki/Software/systemd/
Ссылка на загрузку: https://github.com/systemd/systemd/archive/v255/systemd-255.tar.gz
Контрольная сумма MD5: 521cda27409a9edf0370c128fae3e690
Домашняя страница: https://www.freedesktop.org/wiki/Software/systemd/
Ссылка на загрузку: https://anduin.linuxfromscratch.org/LFS/systemd-man-pages-255.tar.xz
Контрольная сумма MD5: 1ebe54d7a80f9abf8f2d14ddfeb2432d
Команда Linux From Scratch генерирует собственный архив справочных страниц, используя исходный код systemd. Это делается для того, чтобы избежать ненужных зависимостей.
Домашняя страница: https://savannah.nongnu.org/projects/sysvinit
Ссылка на загрузку: https://github.com/slicer69/sysvinit/releases/download/3.08/sysvinit-3.08.tar.xz
Контрольная сумма MD5: 81a05f28d7b67533cfc778fcadea168c
Домашняя страница: https://www.gnu.org/software/tar/
Ссылка на загрузку: https://ftp.gnu.org/gnu/tar/tar-1.35.tar.xz
Контрольная сумма MD5: a2d8042658cfd8ea939e6d911eaf4152
Домашняя страница: http://tcl.sourceforge.net/
Ссылка на загрузку: https://downloads.sourceforge.net/tcl/tcl8.6.13-src.tar.gz
Контрольная сумма MD5: 0e4358aade2f5db8a8b6f2f6d9481ec2
Ссылка на загрузку: https://downloads.sourceforge.net/tcl/tcl8.6.13-html.tar.gz
Контрольная сумма MD5: 4452f2f6d557f5598cca17b786d6eb68
Домашняя страница: 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.39/util-linux-2.39.3.tar.xz
Контрольная сумма MD5: f3591e6970c017bb4bcd24ae762a98f5
Домашняя страница: https://www.vim.org
Ссылка на загрузку: https://github.com/vim/vim/archive/v9.1.0041/vim-9.1.0041.tar.gz
Контрольная сумма MD5: 79dfe62be5d347b1325cbd5ce2a1f9b3
Версия vim меняется ежедневно. Чтобы получить последнюю версию, перейдите на https://github.com/vim/vim/tags.
Домашняя страница: https://pypi.org/project/wheel/
Ссылка на загрузку: https://pypi.org/packages/source/w/wheel/wheel-0.42.0.tar.gz
Контрольная сумма MD5: 802ad6e5f9336fcb1c76b7593f0cd22d
Домашняя страница: 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.4.6/xz-5.4.6.tar.xz
Контрольная сумма MD5: 7ade7bd1181a731328f875bec62a9377
Домашняя страница: 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.5/zstd-1.5.5.tar.gz
Контрольная сумма MD5: 63251602329a106220e0a5ad26ba656f
Общий размер пакетов: примерно 504 MB
В дополнение к пакетам требуется несколько патчей. Эти патчи исправляют ошибки в пакетах, которые должны быть исправлены сопровождающим. Патчи также вносят небольшие изменения, облегчающие работу с пакетами. Для создания системы LFS потребуются следующие исправления:
Ссылка на загрузку: https://mirror.linuxfromscratch.ru/patches/lfs/12.1/bash-5.2.21-upstream_fixes-1.patch
Контрольная сумма MD5: 2d1691a629c558e894dbb78ee6bf34ef
Ссылка на загрузку: https://mirror.linuxfromscratch.ru/patches/lfs/12.1/bzip2-1.0.8-install_docs-1.patch
Контрольная сумма MD5: 6a5ac7e89b791aae556de0f745916f7f
Ссылка на загрузку: https://mirror.linuxfromscratch.ru/patches/lfs/12.1/coreutils-9.4-i18n-1.patch
Контрольная сумма MD5: cca7dc8c73147444e77bc45d210229bb
Ссылка на загрузку: https://mirror.linuxfromscratch.ru/patches/lfs/12.1/glibc-2.39-fhs-1.patch
Контрольная сумма MD5: 9a5997c3452909b1769918c759eff8a2
Ссылка на загрузку: https://mirror.linuxfromscratch.ru/patches/lfs/12.1/kbd-2.6.4-backspace-1.patch
Контрольная сумма MD5: f75cca16a38da6caa7d52151f7136895
Ссылка на загрузку: https://mirror.linuxfromscratch.ru/patches/lfs/12.1/readline-8.2-upstream_fixes-3.patch
Контрольная сумма MD5: 9ed497b6cb8adcb8dbda9dee9ebce791
Ссылка на загрузку: https://mirror.linuxfromscratch.ru/patches/lfs/12.1/sysvinit-3.08-consolidated-1.patch
Контрольная сумма MD5: 17ffccbb8e18c39e8cedc32046f3a475
Общий размер этих патчей: примерно 203.8 KB
Помимо указанных выше обязательных исправлений, существует ряд необязательных патчей, созданных сообществом LFS. Эти необязательные исправления решают незначительные проблемы или включают функции, которые не включены по умолчанию. Не стесняйтесь просматривать базу данных исправлений, расположенную по адресу https://mirror.linuxfromscratch.ru/patches/downloads/, и применять патчи, необходимые вашей системе.
В этой главе мы выполним несколько дополнительных настроек для
подготовки к сборке временной системы. Мы создадим несколько
каталогов в $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.35, «Bash-5.2.21», не
настроен на загрузку или выполнение /etc/bash.bashrc
, поэтому этот файл
бесполезен в готовой системе LFS.
Для многих современных систем с несколькими процессорами (или
ядрами) время компиляции пакета можно сократить, выполнив
«параллельную
сборку», либо установив переменную среды, либо
сообщив программе make, сколько ядер
задействовать для сборки. Например, процессор Intel Core
i9-13900K имеет 8 ядер P (производительность) и 16 ядер E
(энергоэффективность), ядро P может одновременно запускать два
потока, поэтому каждое ядро P моделируется ядром Linux как два
логических ядра. В результате получается 32 логических ядра.
Очевидный способ задействовать все эти логические ядра -
разрешить make
создавать до 32 заданий сборки. Это можно сделать, передав
параметр -j32
команде
make:
make -j32
Или установите переменную окружения MAKEFLAGS
, и ее содержимое будет автоматически
использоваться make в качестве параметров
командной строки:
export MAKEFLAGS=-j32
Никогда не передавайте параметр -j
без номера в make и не устанавливайте
такой параметр в MAKEFLAGS
. Иначе
make будет
создавать бесконечные задания сборки, что вызовет проблемы со
стабильностью системы.
Чтобы использовать все логические ядра, доступные для сборки
пакетов в Глава 5 и Глава 6,
укажите параметр MAKEFLAGS
в
.bashrc сейчас
:
cat >> ~/.bashrc << "EOF"
export MAKEFLAGS=-j$(nproc)
EOF
Замените $(nproc)
количеством логических ядер, которые вы хотите использовать,
если вы планируете использовать не все логические ядра.
Наконец, чтобы убедиться, что среда полностью подготовлена для сборки временных инструментов, перечитайте только что созданный профиль пользователя:
source ~/.bash_profile
Многие люди хотели бы знать заранее, сколько примерно времени потребуется для компиляции и установки каждого пакета. Поскольку Linux From Scratch может быть собран на различных системах, невозможно дать точную оценку времени. Сборка самого большого пакета (gcc) займет около 5 минут на быстрых системах, но может занять несколько дней на более медленных компьютерах! Вместо фактического времени в книге используется показатель "стандартная единица времени сборки" (SBU).
Показатель SBU рассчитывается следующим образом. Первым пакетом, который нужно скомпилировать, является binutils в Глава 5. Время, необходимое для компиляции этого пакета с использованием одного ядра, будет называться стандартной единицей времени сборки или SBU. Время компиляции остальных пакетов будет рассчитано относительно этого времени.
Например, рассмотрим пакет, время компиляции которого составляет 4,5 SBU. Это означает, что если вашей системе потребовалось 10 минут для компиляции и сборки первого прохода binutils, то для сборки этого пакета потребуется примерно 45 минут. К счастью, в большинстве случаев, время сборки меньше, чем у binutils.
В целом, величина SBU не совсем точна, поскольку она зависит от многих факторов, включая версию GCC хост-системы. Она приведены здесь, чтобы дать оценку того, сколько времени может потребоваться для сборки пакета, но в некоторых случаях цифры могут отличаться на десятки минут.
Когда используется несколько ядер, единицы измерения SBU будут различаться еще больше, чем обычно. В некоторых случаях make просто завершится ошибкой. Анализ выходных данных процесса сборки также будет более сложным, поскольку строки разных потоков будут чередоваться. Если вы столкнулись с проблемой на этапе сборки, вернитесь к сборке на одном ядре, чтобы проанализировать сообщения об ошибках.
Представленные здесь значения времени основаны на замерах при использовании четырех ядер (-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.1/, чтобы проверить, ожидаются ли сбои. Этот сайт актуален для всех наборов тестов, описанных в книге.
Эта часть разделена на три этапа: во-первых, сборка кросс-компилятора и связанных с ним библиотек; во-вторых, использование этого набора инструментов для сборки нескольких утилит таким образом, чтобы изолировать их от основного дистрибутива; в-третьих, вход в среду 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
и зафиксировать результат.
Официальный источник, охватывающий все платформы, находится
в файле shlib-versions
в
корне дерева исходного кода glibc.
Чтобы сымитировать кросс-компиляцию в LFS, имя триплета хоста
немного подкорректировали, изменив поле "vendor" в переменной
LFS_TGT
таким образом, чтобы оно
указывало "lfs". Мы также используем параметр --with-sysroot
при сборке
кросс-компоновщика и кросс-компилятора, чтобы сообщить им,
где найти необходимые файлы хоста. Это гарантирует, что ни
одна из программ, входящих в Глава 6,
не сможет ссылаться на библиотеки на машине сборки. Для
корректной работы, обязательны всего два этапа, еще один
рекомендуется для тестирования:
Этап | Сборщик | Хост | Цель | Действие |
---|---|---|---|---|
1 | ПК | ПК | LFS | Сборка кросс-компилятора cc1 с использованием cc-pc на ПК |
2 | ПК | LFS | LFS | Сборка компилятора cc-lfs с использованием cc1 на ПК |
3 | LFS | LFS | LFS | Пересборка и тестирование cc-lfs, используя cc-lfs в lfs |
В приведенной выше таблице «ПК» означает, что команды выполняются на компьютере с использованием уже установленного дистрибутива. «В lfs» означает, что команды выполняются в chroot-окружении.
Это еще не конец истории. Язык С - это не просто компилятор; также он определяет стандартную библиотеку. В этой книге используется библиотека GNU C под названием glibc (есть альтернативный вариант - "musl"). Эта библиотека должна быть скомпилирована для машины lfs, то есть с использованием кросс-компилятора cc1. Но сам компилятор использует внутреннюю библиотеку, реализующую сложные инструкции, недоступные в наборе инструкций ассемблера. Эта внутренняя библиотека называется libgcc, и для полноценной работы ее необходимо связать с библиотекой glibc! Кроме того, стандартная библиотека для C++ (libstdc++) также должна быть связана с glibc. Решение этой проблемы курицы и яйца состоит в том, чтобы сначала собрать деградированную libgcc на основе cc1, в которой отсутствуют некоторые функциональные возможности, такие как потоки и обработка исключений, затем собрать glibc с использованием этого деградированного компилятора (сама glibc не деградирована), а затем собрать libstdc++. В этой последней библиотеке будет не хватать некоторых функциональных возможностей libgcc.
Выводом из предыдущего абзаца является то, что cc1 не может собрать полнофункциональную libstdc++ с деградированной libgcc, но это единственный компилятор, доступный для сборки библиотек C/C++ на этапе 2. Есть две причины, по которым мы не используем сразу компилятор cc-lfs, собранный на этапе 2, для сборки этих библиотек.
Вообще говоря, cc-lfs не может работать на ПК (хост-системе). Хотя триплеты для ПК и LFS совместимы друг с другом, исполняемый файл для lfs должен зависеть от glibc-2.39; хост-дистрибутив может использовать либо другую реализацию libc (например, musl), либо предыдущий выпуск glibc (например, glibc-2.13).
Даже если cc-lfs может работать на ПК, его использование на ПК сопряжено с риском привязки к библиотекам ПК, так как cc-lfs является родным компилятором.
Поэтому, когда мы собираем gcc этап 2, мы даем указание системе сборки пересобрать libgcc и libstdc++ с помощью cc1, но мы связываем libstdc++ с новой пересобранной libgcc вместо старой, деградированной. Это делает пересобранную библиотеку libstdc++ полностью функциональной.
В Глава 8 (или «этап 3») собраны все пакеты, необходимые для системы LFS. Даже если пакет уже был установлен в системе LFS в предыдущей главе, мы все равно пересобираем пакет. Основная причина пересборки этих пакетов состоит в том, чтобы сделать их стабильными: если мы переустанавливаем пакет LFS в готовой системе LFS, содержимое пакета должно совпадать с содержимым того же пакета при первой установке в Глава 8. Временные пакеты, установленные в Глава 6 или Глава 7 не могут удовлетворять этому требованию, потому что некоторые из них собраны без необязательных зависимостей и autoconf не может выполнить некоторые проверки функций в Глава 6 из-за кросс-компиляции, в результате чего во временных пакетах отсутствуют дополнительные функции или используются не оптимальные процедуры кода. Кроме того, второстепенной причиной для пересборки пакетов является выполнение тестов.
Кросс-компилятор будет установлен в отдельный каталог
$LFS/tools
, так как он не будет
частью конечной системы.
Сначала устанавливается Binutils, потому что во время выполнения команды configure gcc и glibc выполняются различные тесты функций на ассемблере и компоновщике, чтобы определить, какие программные функции следует включить или отключить. Это важнее, чем может показаться на первый взгляд. Неправильно настроенный gcc или glibc может привести к незначительной поломке сборочных инструментов, где последствия такой поломки могут проявиться ближе к концу сборки всего дистрибутива. Сбой тестов обычно выявляет эту ошибку до того, как будет выполнено много дополнительной работы.
Binutils устанавливает свой ассемблер и компоновщик в двух
местах: $LFS/tools/bin
и
$LFS/tools/$LFS_TGT/bin
.
Инструменты в одном месте жестко связаны с другими. Важным
аспектом компоновщика является порядок поиска в библиотеке.
Подробную информацию можно получить от ld, передав ей флаг
--verbose
. Например,
$LFS_TGT-ld --verbose | grep
SEARCH покажет текущие пути поиска и их
порядок. Он показывает, какие файлы связаны с помощью
ld, путем
компиляции фиктивной программы и передачи параметра
--verbose
компоновщику. Например, $LFS_TGT-gcc dummy.c -Wl,--verbose
2>&1 | grep succeeded покажет все
файлы, успешно открытые во время компоновки.
Следующий устанавливаемый пакет — gcc. Пример того, что можно увидеть во время запуска configure:
checking what assembler to use... /mnt/lfs/tools/i686-lfs-linux-gnu/bin/as
checking what linker to use... /mnt/lfs/tools/i686-lfs-linux-gnu/bin/ld
Это важно по причинам, упомянутым выше. Также здесь демонстрируется, что сценарий настройки gcc не просматривает значения переменной PATH, чтобы найти, какие инструменты использовать. Однако во время фактической работы самого gcc не обязательно используются одни и те же пути поиска. Чтобы узнать, какой стандартный компоновщик будет использовать gcc, запустите: $LFS_TGT-gcc -print-prog-name=ld.
Подробную информацию можно получить из gcc, передав ему параметр
-v
при компиляции
фиктивной программы. Например, gcc -v dummy.c покажет
подробную информацию об этапах препроцессора, компиляции и
сборки, включая указанные в gcc пути поиска и их
порядок.
Далее устанавливаются очищенные заголовочные файлы Linux API. Они позволяют стандартной библиотеке C (Glibc) взаимодействовать с функциями, предоставляемыми ядром Linux.
Следующий устанавливаемый пакет — glibc. Наиболее важными при
сборке glibc являются компилятор, бинарные инструменты и
заголовочные файлы ядра. С компилятором, как правило, не
бывает проблем, поскольку glibc всегда будет использовать
компилятор, указанный в параметре --host
, переданный скрипту
configure; например, в нашем случае компилятором будет
$LFS_TGT-gcc. С
бинарными инструментами и заголовки ядра может быть немного
сложнее. Поэтому мы не рискуем и используем доступные
параметры конфигурации, чтобы обеспечить правильный выбор.
После запуска configure проверьте
содержимое файла config.make
в
каталоге сборки
на наличие всех
важных деталей. Обратите внимание на использование опции
CC="$LFS_TGT-gcc"
(с
переменной $LFS_TGT
) для
управления используемыми бинарными инструментами и
использование флагов -nostdinc
и -isystem
для управления
включаемым путем поиска компилятора. Эти пункты подчеркивают
важный аспект пакета glibc — он очень самодостаточен с точки
зрения своего механизма сборки и, как правило, не полагается
на значения по умолчанию.
Как было сказано выше, затем компилируется стандартная библиотека C++, а затем в Глава 6 все остальные программы, которым необходимо разрешить проблему циклических зависимостей во время сборки. На этапе установки всех этих пакетов используется переменная DESTDIR, для принудительной установки в файловую систему LFS.
В конце Глава 6
устанавливается собственный компилятор lfs. Сначала
собирается binutils с той же переменной DESTDIR
, что и другие программы, затем
повторно собирается gcc, без сборки некоторых некритических
библиотек. Из-за какой-то странной логики в сценарии
настройки GCC CC_FOR_TARGET
заканчивается как cc, когда хост совпадает с
целью, но отличается от системы сборки. Поэтому значение
CC_FOR_TARGET=$LFS_TGT-gcc
явно
указывается в параметрах конфигурации.
После входа в среду chroot в Глава 7 первой задачей является установка libstdc++. Затем выполняется установка временных программ, необходимых для правильной работы тулчейна. С этого момента основной набор инструментов является самодостаточным и автономным. В Глава 8 собираются, тестируются и устанавливаются окончательные версии всех пакетов, необходимых для полнофункциональной системы.
В процессе разработки LFS инструкции в книге часто изменяются, чтобы адаптироваться к обновлению пакета или использовать преимущества новых функций из обновленных пакетов. Смешение инструкций разных версий книги LFS может привести к незначительным поломкам. Такого рода проблемы обычно являются результатом повторного использования некоторых скриптов, созданных для предыдущей версии LFS. Такое повторное использование настоятельно не рекомендуется. Если вы по какой-либо причине повторно используете скрипты из предыдущей версии LFS, вам нужно быть очень осторожным при обновлении скриптов, чтобы они соответствовали текущей версии книги LFS.
При сборке пакетов в инструкциях делается несколько допущений:
На некоторые пакеты необходимо наложить патчи перед компиляцией, метод используется тогда, когда исправление необходимо для решения проблем сборки. Патчи часто требуются как в этой, так и в следующих главах, но иногда, когда один и тот же пакет собирается более одного раза, патч требуется не сразу. Поэтому не беспокойтесь, если инструкции для скачанного патча отсутствуют. Предупреждающие сообщения о смещении (offset) или размытии (fuzz) также могут появляться при применении патча. Не обращайте внимания на эти предупреждения, патч все равно успешно применен.
Во время компиляции большинства пакетов на экране будут отображаться предупреждения. Это нормально, и их можно смело игнорировать. Предупреждения появляются, например, когда используется устаревший, недопустимый синтаксис C или C++. Стандарты C меняются довольно часто, и некоторые пакеты все еще используют более старый стандарт. Это не является серьезной проблемой, но вызывает появление предупреждений.
Проверьте в последний раз, что переменная среды
LFS
настроена правильно:
echo $LFS
Убедитесь, что в выводе указан путь к точке монтирования
раздела LFS, то есть /mnt/lfs
, как в примере из этой книги.
Наконец, необходимо подчеркнуть два важных момента:
Инструкции по сборке предполагают, что все Требования к хост-системе, включая символические ссылки, установлены правильно:
bash это используемая оболочка.
sh это символическая ссылка на bash.
/usr/bin/awk это символическая ссылка на gawk.
/usr/bin/yacc это символическая ссылка на bison или небольшой скрипт, который выполняет bison
Вот краткое описание процесса сборки:
Поместите все исходники и патчи в каталог,
который будет доступен из среды 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-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-default-hash-style=gnu
По умолчанию компоновщик генерирует как хеш-таблицу в стиле GNU, так и классическую хеш-таблицу ELF для общих библиотек и динамически связанных исполняемых файлов. Хеш-таблицы необходимы только для динамического компоновщика, выполняющего поиск символов. В LFS динамический компоновщик (предоставляемый пакетом Glibc) всегда будет использовать хеш-таблицу в стиле GNU, к которой запросы выполняются быстрее. Так что классическая хеш-таблица ELF совершенно бесполезна. Этот параметр указывает компоновщику по умолчанию генерировать только хеш-таблицу в стиле GNU, поэтому мы можем избежать траты времени на создание классической хеш-таблицы ELF при сборке пакетов или не тратить дисковое пространство для ее хранения.
Скомпилируйте пакет:
make
Установите пакет:
make install
Подробная информация об этом пакете находится в Раздел 8.19.2, «Содержимое пакета Binutils.»
Пакет GCC содержит коллекцию компиляторов GNU, которая включает компиляторы C и C++.
Для GCC требуются пакеты GMP, MPFR и MPC. Поскольку эти пакеты могут отсутствовать в дистрибутиве вашего хоста, они будут собраны с помощью GCC. Распакуйте каждый пакет в исходный каталог GCC и переименуйте получившиеся каталоги, чтобы процедуры сборки GCC использовали их автоматически:
В этой главе часто возникают недоразумения, хотя применяются те же процедуры, что и в любой другой главе, следуйте инструкции которую получили ранее (Инструкции по сборке пакетов). Сначала распакуйте пакет gcc-13.2.0 из архива, а затем перейдите в созданный каталог. Только после этого следует приступить к приведенным ниже инструкциям.
tar -xf ../mpfr-4.2.1.tar.xz mv -v mpfr-4.2.1 mpfr tar -xf ../gmp-6.3.0.tar.xz mv -v gmp-6.3.0 gmp tar -xf ../mpc-1.3.1.tar.gz mv -v mpc-1.3.1 mpc
На хостах 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.39 \ --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.39
Этот параметр указывает версию Glibc, которая будет использоваться на целевой системе. Он не имеет отношения к libc хост-дистрибутива, потому что все, скомпилированное в этом разделе, будет выполняться в среде chroot, которая изолирована от libc хост-дистрибутива.
--with-newlib
Поскольку работающая библиотека C еще недоступна, это гарантирует, что константа inhibit_libc будет определена при сборке libgcc. Это предотвращает компиляцию любого кода, требующего поддержки libc.
--without-headers
При создании полного кросс-компилятора GCC требует наличия стандартных заголовков, совместимых с целевой системой. Для наших целей эти заголовки не понадобятся. Этот параметр предотвращает их поиск GCC.
--enable-default-pie и
--enable-default-ssp
Эти параметры позволяют GCC по умолчанию компилировать программы с некоторые функциями усиливающими безопасность (более подробная информация о них приведена в примечание о PIE и SSP в Главе 8). На данном этапе это не является строго обязательным, поскольку компилятор будет создавать только временные исполняемые файлы. Но лучше, чтобы временные пакеты были максимально приближены к тем, что будут в готовой системе LFS.
--disable-shared
Этот параметр заставляет GCC статически связывать свои внутренние библиотеки. Он необходим потому что общие библиотеки требуют Glibc, который еще не установлен в целевой системе.
--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.28.2, «Содержимое пакета GCC.»
Заголовочные файлы Linux API (в linux-6.7.4.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.39-fhs-1.patch
В документации к Glibc рекомендуется собирать Glibc в отдельном каталоге:
mkdir -v build cd build
Убедитесь, что утилиты ldconfig and sln установлены в
/usr/sbin
:
echo "rootsbindir=/usr/sbin" > configparms
Затем подготовьте Glibc к компиляции:
../configure \ --prefix=/usr \ --host=$LFS_TGT \ --build=$(../scripts/config.guess) \ --enable-kernel=4.19 \ --with-headers=$LFS/usr/include \ --disable-nscd \ 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-13.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++/13.2.0
Значение параметров настройки:
--host=...
Указывает, что должен использоваться кросс-компилятор,
который мы только что собрали, вместо того, который
находится в /usr/bin
.
--disable-libstdcxx-pch
Этот аргумент предотвращает установку предварительно скомпилированных include-файлов, которые на данном этапе не нужны.
--with-gxx-include-dir=/tools/$LFS_TGT/include/c++/13.2.0
Указывает каталог установки для include-файлов.
Поскольку libstdc++ является стандартной библиотекой
C++ для LFS, этот каталог должен соответствовать
местоположению, в котором компилятор C++ ($LFS_TGT-g++) будет
искать стандартные включаемые файлы C++. При обычной
сборке эта информация автоматически передается в
Libstdc++ при выполнении configure из каталога
верхнего уровня. В нашем случае эта информация должна
быть указана явно. Компилятор C++ добавит путь sysroot
$LFS
(указанный при
сборке GCC Проход 1) к пути поиска include-файлов,
поэтому фактически он будет искать в $LFS/tools/$LFS_TGT/include/c++/13.2.0
.
Комбинация переменной DESTDIR
(в приведенной
ниже команде make
install) и этого аргумента обеспечивает
установку заголовочных файлов туда.
Скомпилируйте Libstdc++, выполнив:
make
Установите библиотеку:
make DESTDIR=$LFS install
Удалите архивные файлы libtool, поскольку они потенциально опасны при кросс-компиляции:
rm -v $LFS/usr/lib/lib{stdc++{,exp,fs},supc++}.la
Подробная информация об этом пакете приведена в Раздел 8.28.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.12.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 \ --enable-widec
Значение новых параметров настройки:
--with-manpage-format=normal
Этот аргумент предотвращает установку Ncurses сжатых страниц руководства, это может произойти, если сам дистрибутив хоста содержит сжатые страницы руководства.
--with-shared
Этот аргумент позволяет Ncurses собирать и устанавливать разделяемые библиотеки C.
--without-normal
Этот аргумент предотвращает сборку и установку статических библиотек C.
--without-debug
Этот аргумент предотвращает сборку и установку отладочных библиотек.
--with-cxx-shared
Это аргумент позволяет Ncurses собирать и устанавливать общие привязки C++. А также предотвращает сборку и установку статических привязок C++.
--without-ada
Этот аргумент гарантирует, что Ncurses будет собран без поддержки компилятора Ada, который может присутствовать на хосте, но будет недоступен, как только мы войдем в среду chroot.
--disable-stripping
Этот аргумент не позволяет системе сборки использовать программу strip с хоста. Использование инструментов хоста в кросс-компилируемой программе может привести к сбою.
--enable-widec
Этот аргумент указывает, что необходимо скомпилировать
библиотеки расширенных символов (такие как,
libncursesw.so.6.4-20230520
)
вместо обычных (таких как, libncurses.so.6.4-20230520
). Эти
библиотеки расширенных символов можно использовать как
в многобайтовой, так и традиционной 8-битной локали, в
то время как обычные библиотеки корректно работают
только в 8-битных локалях. Библиотеки расширенных
символов и обычные совместимы на уровне исходного кода,
но не совместимы в двоичном.
Скомпилируйте пакет:
make
Установите пакет:
make DESTDIR=$LFS TIC_PATH=$(pwd)/build/progs/tic install ln -sv libncursesw.so $LFS/usr/lib/libncurses.so sed -e 's/^#if.*XOPEN.*$/#if 1/' \ -i $LFS/usr/include/curses.h
Значение параметров установки:
TIC_PATH=$(pwd)/build/progs/tic
Нам нужно передать путь до только что собранной программы tic, которая работает на сборочной машине, чтобы база данных терминала была создана без ошибок.
Библиотека libncurses.so
необходима для нескольких пакетов, которые мы скоро
соберем. Мы создаем эту символическую ссылку, чтобы
использовать libncursesw.so
в качестве замены.
Заголовочный файл curses.h
содержит определения
различных структур данных Ncurses. С разными
определениями макросов препроцессора могут
использоваться два разных набора определений структуры
данных: 8-битное определение совместимо с libncurses.so
, а определение
расширенного набора символов совместимо с libncursesw.so
. Поскольку мы
используем libncursesw.so
вместо libncurses.so
,
отредактируйте заголовочный файл, чтобы он всегда
использовал определение структуры данных расширенного
набора символов, совместимое с .
libncursesw.so
.
Подробная информация об этом пакете находится в Раздел 8.29.2, «Содержимое пакета Ncurses.»
Пакет Bash содержит Bourne-Again Shell.
Подготовьте Bash к компиляции:
./configure --prefix=/usr \ --build=$(sh support/config.guess) \ --host=$LFS_TGT \ --without-bash-malloc
Значение параметров настройки:
--without-bash-malloc
Этот параметр отключает использование функции
распределения памяти (malloc
) Bash, которая, как известно,
вызывает ошибки сегментации. Если опция отключена, Bash
будет использовать функции malloc
из Glibc, которые более
стабильны.
Скомпилируйте пакет:
make
Установите пакет:
make DESTDIR=$LFS install
Создайте символическую ссылку для программ, которые используют sh как оболочку:
ln -sv bash $LFS/bin/sh
Подробная информация об этом пакете находится в Раздел 8.35.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.57.2, «Содержимое пакета Coreutils.»
Пакет Diffutils содержит программы, которые показывают различия между файлами или каталогами.
Подготовьте Diffutils для компиляции:
./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(./build-aux/config.guess)
Скомпилируйте пакет:
make
Установите пакет:
make DESTDIR=$LFS install
Подробная информация об этом пакете находится в Раздел 8.59.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.10.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.61.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.60.2, «Содержимое пакета Gawk.»
Пакет Grep содержит программы для поиска по содержимому файлов.
Подготовьте Grep к компиляции:
./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(./build-aux/config.guess)
Скомпилируйте пакет:
make
Установите пакет:
make DESTDIR=$LFS install
Подробная информация об этом пакете находится в Раздел 8.34.2, «Содержимое пакета Grep.»
Пакет Gzip содержит программы для сжатия и распаковки файлов.
Подготовьте Gzip к компиляции:
./configure --prefix=/usr --host=$LFS_TGT
Скомпилируйте пакет:
make
Установите пакет:
make DESTDIR=$LFS install
Подробная информация об этом пакете находится в Раздел 8.64.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.68.2, «Содержимое пакета Make.»
Пакет Patch содержит программу для изменения или создания файлов путём наложение «патча», обычно, создаваемого программой diff.
Подготовьте Patch к компиляции:
./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(build-aux/config.guess)
Скомпилируйте пакет:
make
Установите пакет:
make DESTDIR=$LFS install
Подробная информация об этом пакете находится в Раздел 8.69.2, «Содержимое пакета Patch.»
Пакет Sed содержит потоковый редактор текста
Подготовьте Sed к компиляции:
./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(./build-aux/config.guess)
Скомпилируйте пакет:
make
Установите пакет:
make DESTDIR=$LFS install
Подробная информация об этом пакете находится в Раздел 8.30.2, «Содержимое пакета Sed.»
Пакет Tar предоставляет возможность создавать tar архивы, а также производить с ними различные манипуляции. Tar может распаковать предварительно созданный архив, добавить или обновить файлы в нём, вернуть список файлов в архиве.
Подготовьте Tar к компиляции:
./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(build-aux/config.guess)
Скомпилируйте пакет:
make
Установите пакет:
make DESTDIR=$LFS install
Подробная информация об этом пакете находится в Раздел 8.70.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.4.6
Скомпилируйте пакет:
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-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.19.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++
--disable-libsanitizer
Отключает библиотеки среды выполнения GCC sanitizer.
Они не нужны для временного набора инструментов. Этот
параметр необходим для сборки GCC без установки
libcrypt
для целевого
объекта. В GCC-Проход 1 это
решалось с помощью параметра --disable-libstdcxx
, но
теперь мы должны передать его явно.
Скомпилируйте пакет:
make
Установите пакет:
make DESTDIR=$LFS install
В качестве завершающего штриха создайте символическую ссылку на утилиту. Многие программы и скрипты используют cc вместо gcc, чтобы сделать программы более универсальными и, следовательно, для совместимости со всеми типами UNIX-систем, где компилятор GNU C не всегда установлен. Наличие cc оставляет системному администратору право самостоятельно решать, какой компилятор C устанавливать:
ln -sv gcc $LFS/usr/bin/cc
Подробная информация об этом пакете находится в Раздел 8.28.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 -R root:root $LFS/{usr,lib,var,etc,bin,sbin,tools} case $(uname -m) in x86_64) chown -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/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
для того, чтобы
избежать несопоставленных идентификаторов. Другие дистрибутивы
могут обрабатывать этот идентификатор по-разному, поэтому любая
переносимая программа не должна зависеть от этого присвоения.
Для некоторых тестов в Глава 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.32.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.33.2, «Содержимое пакета Bison.»
Пакет Perl содержит практический язык для извлечения данных и составления отчётов (Practical Extraction and Report Language).
Подготовьте Perl к компиляции:
sh Configure -des \ -Dprefix=/usr \ -Dvendorprefix=/usr \ -Duseshrplib \ -Dprivlib=/usr/lib/perl5/5.38/core_perl \ -Darchlib=/usr/lib/perl5/5.38/core_perl \ -Dsitelib=/usr/lib/perl5/5.38/site_perl \ -Dsitearch=/usr/lib/perl5/5.38/site_perl \ -Dvendorlib=/usr/lib/perl5/5.38/vendor_perl \ -Dvendorarch=/usr/lib/perl5/5.38/vendor_perl
Значение новых опций Configure:
-des
Это комбинация из трех параметров: -d использует значения по умолчанию для всех элементов; -e обеспечивает выполнение всех задач; -s отключает несущественные выходные данные.
-Dvendorprefix=/usr
Параметр гарантирует, что perl знает, как указать пакетам, где они должны устанавливать свои модули Perl.
-Duseshrplib
Собрать библиотеку libperl, необходимую некоторым модулям Perl, как общую библиотеку вместо статической.
-Dprivlib,-Darchlib,-Dsitelib,...
Эти настройки определяют, где Perl ищет установленные модули. Редакторы LFS решили поместить их в структуру каталогов, основанную на MAJOR.MINOR версии Perl (5.38), что позволяет обновлять Perl до более новых уровней исправлений (уровень исправления - это последняя разделенная точками часть в строке полной версии, например 5.38.2) без необходимости переустанавливать все модули.
Скомпилируйте пакет:
make
Установите пакет:
make install
Подробная информация об этом пакете находится в Раздел 8.42.2, «Содержимое пакета Perl.»
Пакет Python 3 содержит среду разработчика Python. Его можно использовать для объектно-ориентированного программирования, написания скриптов, прототипирования больших программ и разработка целых приложений. Python — это интерпретируемый язык программирования.
Существует два пакета, имена которых начинаются с префикса
«python». Сейчас необходимо
распаковать файл Python-3.12.2.tar.xz
(обратите внимание
на заглавную первую букву).
Подготовка Python к компиляции:
./configure --prefix=/usr \ --enable-shared \ --without-ensurepip
Значение параметров настройки:
--enable-shared
Этот параметр отключает установку статичных библиотек.
--without-ensurepip
Этот параметр отключает установщик пакетов Python, который на данном этапе не нужен.
Скомпилируйте пакет:
make
Некоторые модули Python 3 не могут быть собраны сейчас,
потому что зависимости еще не установлены. Для модуля
ssl
выводится сообщение
Python требует OpenSSL 1.1.1
или новее
. Сообщение следует проигнорировать. Просто
убедитесь, что команда make верхнего уровня не
завершилась ошибкой. Дополнительные модули сейчас не нужны,
и они будут собраны в
Глава 8.
Установите пакет:
make install
Подробная информация об этом пакете находится в Раздел 8.51.2, «Содержимое пакета Python 3.»
Пакет Texinfo содержит программы для чтения, записи и преобразования информационных страниц.
Подготовьте Texinfo к компиляции:
./configure --prefix=/usr
Скомпилируйте пакет:
make
Установите пакет:
make install
Подробная информация об этом пакете находится в Раздел 8.71.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 \ --without-python \ ADJTIME_PATH=/var/lib/hwclock/adjtime \ --docdir=/usr/share/doc/util-linux-2.39.3
Значение параметров настройки:
ADJTIME_PATH=/var/lib/hwclock/adjtime
Этот параметр устанавливает расположение файла для записи информации об аппаратных часах в соответствии с FHS. Он не обязателен для временного инструментария, но предотвращает создание файла в другом месте, где файл не будет перезаписан или удален при финальной сборке пакета util-linux.
--libdir=/usr/lib
Этот параметр гарантирует, что символические ссылки
.so
, будут указывать на
файл общей библиотеки в том же каталоге (/usr/lib
).
--disable-*
Этот параметр предотвращают появление предупреждений о сборке компонентов, для которых требуются пакеты, отсутствующие или еще не установленные в LFS.
--without-python
Этот параметр отключает использование Python. Это позволяет избежать попыток создания ненужных привязок.
--runstatedir=/run
Этот параметр устанавливает расположение сокета,
используемого uuidd и libuuid
.
Скомпилируйте пакет:
make
Установите пакет:
make install
Подробная информация об этом пакете находится в Раздел 8.78.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.1.tar.xz .
Если вы переходите к главе 8, не забудьте повторно войти в среду chroot, как описано в разделе «Важно» ниже.
В случае, если были допущены какие-либо ошибки и вам нужно
начать все сначала, вы можете использовать эту резервную
копию для восстановления системы и сэкономить время на
восстановление. Поскольку исходники находятся в папке
$LFS
, они также включены в
архив резервной копии, поэтому их не нужно загружать
повторно. Убедившись, что переменная $LFS
настроена правильно, вы можете
восстановить резервную копию, выполнив следующие команды:
Следующие команды чрезвычайно опасны. Если вы запустите
команду rm -rf
./* от имени пользователя root
и не перейдете в каталог $LFS или
переменная окружения LFS
не
будет установлена для пользователя root
, это уничтожит всю вашу
хост-систему. ВЫ ПРЕДУПРЕЖДЕНЫ.
cd $LFS
rm -rf ./*
tar -xpf $HOME/lfs-temp-tools-12.1.tar.xz
Еще раз проверьте, правильно ли настроено окружение, и продолжайте сборку остальной части системы.
Если вы покинули среду chroot, чтобы создать резервную копию или перезапустить сборку с помощью восстановления, не забудьте проверить, что виртуальные файловые системы все еще смонтированы (findmnt | grep $LFS). Если они не смонтированы, перемонтируйте их сейчас, как описано в Раздел 7.3, «Подготовка виртуальных файловых систем ядра», и повторно войдите в среду chroot (см. Раздел 7.4, «Вход в окружение Chroot»), прежде чем продолжить.
В этой главе мы приступаем к сборке конечной системы 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.39) необходимо выполнить некоторые дополнительные действия, чтобы избежать поломки системы. Подробности читайте в Раздел 8.5, «Glibc-2.39».
Если пакет, содержащий общую библиотеку, обновляется и
имя библиотеки изменилось, то любые пакеты, динамически
связанные с библиотекой, необходимо перекомпилировать,
чтобы связать с более новой библиотекой. (Обратите
внимание, что между версией пакета и именем библиотеки
нет никакой связи.) Например, рассмотрим пакет
foo-1.2.3, который устанавливает общую библиотеку с
именем libfoo.so.1
.
Предположим, вы обновили пакет до более новой версии
foo-1.2.4, которая устанавливает общую библиотеку с
именем libfoo.so.2
, все
пакеты, которые динамически связаны с libfoo.so.1
, должны быть
перекомпилированы для связи с libfoo.so.2
, чтобы использовать новую
версию библиотеки. Вы не должны удалять старые
библиотеки, пока все зависимые пакеты не будут
перекомпилированы.
Если пакет (прямо или косвенно) связан как со старым,
так и с новым именем общей библиотеки (например, пакет
ссылается как на libfoo.so.2
, так и на libbar.so.1
, в то время как последний
ссылается на libfoo.so.3
), пакет может работать
неправильно, поскольку разные версии общей библиотеки
содержат несовместимые определения для некоторых имен
символов. Это может быть вызвано перекомпиляцией
некоторых, но не всех, пакетов, связанных со старой
общей библиотекой, после обновления пакета,
предоставляющего общую библиотеку. Чтобы избежать этой
проблемы, пользователям необходимо как можно скорее
пересобрать каждый пакет, связанный с общей
библиотекой, с обновленной версией (например, с
libfoo.so.2 на libfoo.so.3).
Если пакет, содержащий общую библиотеку, обновляется, а
имя библиотеки не меняется, но уменьшается номер версии
файла
библиотеки (например, библиотека по-прежнему называется
libfoo.so.1
, но имя файла
библиотеки изменилось с libfoo.so.1.25
на libfoo.so.1.24
), следует удалить файл
библиотеки ранее установленной версии (в данном случае
libfoo.so.1.25
). В
противном случае, команда ldconfig (запущенная
самостоятельно с помощью командной строки или при
установке какого-либо пакета) приведёт к сбросу
символической ссылки libfoo.so.1
, которая будет указывать
на старый файл библиотеки, потому что кажется, что она
имеет «более
новую» версию, поскольку её номер версии
больше. Такая ситуация может произойти, если вам нужно
понизить версию пакета или авторы изменили схему
управления версиями файлов библиотеки.
Если пакет, содержащий общую библиотеку, обновляется, а
имя библиотеки не меняется, но устраняется серьезная
проблема (особенно уязвимость в системе безопасности),
необходимо перезапустить все работающие программы,
связанные с общей библиотекой. Следующая команда,
запущенная от имени пользователя root
после завершения обновления,
выведет список программ, которые использует старые
версии этих библиотек (замените libfoo
именем
библиотеки):
grep -l 'libfoo
.*deleted' /proc/*/maps | tr -cd 0-9\\n | xargs -r ps u
Если для доступа к системе используется OpenSSH и он связан с обновленной библиотекой, вам необходимо перезапустить службу sshd, затем выйти из системы, снова войти в систему и повторно выполнить предыдущую команду, чтобы убедиться, что удаленные библиотеки более не используются.
Если исполняемая программа или библиотека перезаписаны, процессы, использующие код или данные из них, могут завершиться сбоем. Правильный способ обновить программу или общую библиотеку, не вызывая сбоя процесса, - это сначала удалить его, а затем установить новую версию. Команда install, предоставляемая Coreutils, уже реализовала это, и большинство пакетов используют ее для установки двоичных файлов и библиотек. Это означает, что большую часть времени вас не будет беспокоить эта проблема. Однако процесс установки некоторых пакетов (в частности, SpiderMonkey в BLFS) просто перезаписывает файл, если он существует, и вызывает сбой. Поэтому безопаснее сохранить свою работу и закрыть ненужные запущенные программы перед обновлением пакета.
Ниже приведены некоторые распространенные методы управления пакетами. Прежде чем принять решение о менеджере пакетов, проведите исследование различных методов, особенно недостатки каждой конкретной схемы.
Да, это метод управления пакетами. Некоторым людям не нужен менеджер пакетов, потому что они хорошо знакомы с пакетами и знают, какие файлы устанавливаются каждым пакетом. Некоторым пользователям также не требуется какое-либо управление пакетами, поскольку они планируют пересобирать всю систему при каждом изменении пакета.
Это упрощенный метод управления пакетами, для которого не
требуется специальная программа управления. Каждый пакет
устанавливается в отдельный каталог. Например, пакет
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.39-fhs-1.patch
Документация Glibc рекомендует выполнять компиляцию в отдельном каталоге:
mkdir -v build cd build
Убедитесь, что утилиты ldconfig и sln будут установлены в
/usr/sbin
:
echo "rootsbindir=/usr/sbin" > configparms
Подготовьте Glibc к компиляции:
../configure --prefix=/usr \ --disable-werror \ --enable-kernel=4.19 \ --enable-stack-protector=strong \ --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" -l $(find -name \*.out)
Можно повторно запустить отдельный тест, увеличив
таймаут с помощью команды TIMEOUTFACTOR=<factor>
make
test t=<test
name>
. Например,
TIMEOUTFACTOR=10 make
test t=nss/tst-nss-files-hosts-multi
перезапустит nss/tst-nss-files-hosts-multi,
увеличив начальный таймаут в 10 раз.
Кроме того, некоторые тесты могут завершиться неудачно при использовании относительно старой модели процессора (например, elf/tst-cpu-features-cpuinfo) или версии ядра хоста (например, stdlib/tst-arc4random-thread).
На этапе установки Glibc будет жаловаться на отсутствие файла
/etc/ld.so.conf
, хотя это
безобидное сообщение, предотвратить его появление можно с
помощью команды:
touch /etc/ld.so.conf
Исправьте Makefile, чтобы пропустить устаревшую проверку работоспособности, которая завершается неудачей в современной конфигурации Glibc:
sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile
При обновлении Glibc до новой минорной версии (например, с Glibc-2.36 до Glibc-2.39) в работающей системе LFS вам необходимо принять некоторые дополнительные меры предосторожности, чтобы избежать поломки системы:
Обновление Glibc в системе LFS до версии 11.0 не поддерживается. Пересоберите LFS, если вы используете такую старую систему, но вам нужна более новая Glibc.
При обновлении системы LFS до версии 12.0 установите
Libxcrypt следуя
инструкции Раздел 8.26,
«Libxcrypt-4.4.36.». В дополнение к обычной
установке Libxcrypt,
вы ДОЛЖНЫ следовать
примечанию со страницы Libxcrypt, чтобы установить
libcrypt.so.1*
(заменив
libcrypt.so.1
из
предыдущей установки Glibc).
При обновлении системы LFS до версии 12.1 удалите программу nscd:
rm -f /usr/sbin/nscd
Обновите ядро и перезагрузитесь, если оно старше 4.19 (проверьте текущую версию с помощью uname -r) или, если вы хотите обновить имеющееся ядро, выполните действия из Раздел 10.3, «Linux-6.7.4.»
Обновите заголовочные файлы API ядра, если они старше
4.19 (проверьте текущую версию с помощью cat
/usr/include/linux/version.h) или,
если вы просто хотите обновить их, следуйте Раздел 5.4,
«Заголовочные файлы Linux-6.7.4 API» (но удалив
$LFS
из команды
cp).
Выполните установку DESTDIR
и обновите общие библиотеки
Glibc в системе с помощью одной команды install:
make DESTDIR=$PWD/dest install install -vm755 dest/usr/lib/*.so.* /usr/lib
Крайне важно строго следовать описанным выше шагам, если вы не совсем понимаете, что делаете. Любое неожиданное отклонение может сделать систему полностью непригодной для использования. ВЫ ПРЕДУПРЕЖДЕНЫ.
Затем продолжайте выполнять команды make install,
sed для
/usr/bin/ldd
и команды для
установки локалей. Как только они будут выполнены,
перезагрузите систему.
Установите пакет:
make install
Исправьте жестко заданный путь к исполняемому загрузчику в скрипте ldd:
sed '/RTLDLIST=/s@/usr@@g' -i /usr/bin/ldd
Затем установите локали, которые дадут возможность системе отвечать на разных языках. Ни одна из локалей не требуется системе, но если некоторые из них отсутствуют, то наборы тестов ряда пакетов будут пропускать важные тестовые сценарии.
Отдельные локали можно установить с помощью программы
localedef.
Например, вторая команда localedef приведенная ниже,
объединяет определение независимой от набора символов локали
/usr/share/i18n/locales/cs_CZ
с
набором символов /usr/share/i18n/charmaps/UTF-8.gz
и
добавляет результат в файл /usr/lib/locale/locale-archive
. Следующие
инструкции установят минимальный набор локалей, необходимый
для оптимального охвата тестов
mkdir -pv /usr/lib/locale localedef -i C -f UTF-8 C.UTF-8 localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8 localedef -i de_DE -f ISO-8859-1 de_DE localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro localedef -i de_DE -f UTF-8 de_DE.UTF-8 localedef -i el_GR -f ISO-8859-7 el_GR localedef -i en_GB -f ISO-8859-1 en_GB localedef -i en_GB -f UTF-8 en_GB.UTF-8 localedef -i en_HK -f ISO-8859-1 en_HK localedef -i en_PH -f ISO-8859-1 en_PH localedef -i en_US -f ISO-8859-1 en_US localedef -i en_US -f UTF-8 en_US.UTF-8 localedef -i es_ES -f ISO-8859-15 es_ES@euro localedef -i es_MX -f ISO-8859-1 es_MX localedef -i fa_IR -f UTF-8 fa_IR localedef -i fr_FR -f ISO-8859-1 fr_FR localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro localedef -i fr_FR -f UTF-8 fr_FR.UTF-8 localedef -i is_IS -f ISO-8859-1 is_IS localedef -i is_IS -f UTF-8 is_IS.UTF-8 localedef -i it_IT -f ISO-8859-1 it_IT localedef -i it_IT -f ISO-8859-15 it_IT@euro localedef -i it_IT -f UTF-8 it_IT.UTF-8 localedef -i ja_JP -f EUC-JP ja_JP localedef -i ja_JP -f SHIFT_JIS ja_JP.SJIS 2> /dev/null || true localedef -i ja_JP -f UTF-8 ja_JP.UTF-8 localedef -i nl_NL@euro -f ISO-8859-15 nl_NL@euro localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R localedef -i ru_RU -f UTF-8 ru_RU.UTF-8 localedef -i se_NO -f UTF-8 se_NO.UTF-8 localedef -i ta_IN -f UTF-8 ta_IN.UTF-8 localedef -i tr_TR -f UTF-8 tr_TR.UTF-8 localedef -i zh_CN -f GB18030 zh_CN.GB18030 localedef -i zh_HK -f BIG5-HKSCS zh_HK.BIG5-HKSCS localedef -i zh_TW -f UTF-8 zh_TW.UTF-8
Кроме того, установите локаль для вашей страны, языка и набора символов.
В качестве альтернативы, установите сразу все локали
перечисленные в файле glibc-2.39/localedata/SUPPORTED
(он
включает все локали из списка выше и многие другие), выполнив
команду:
make localedata/install-locales
Затем используйте команду localedef для создания и
установки локалей, не перечисленных в файле glibc-2.39/localedata/SUPPORTED
, когда они
вам понадобятся. Например, для некоторых тестов в этой главе
потребуются следующие две локали:
localedef -i C -f UTF-8 C.UTF-8 localedef -i ja_JP -f SHIFT_JIS ja_JP.SJIS 2> /dev/null || true
Glibc теперь использует libidn2 для разрешения интернационализированных доменных имен. Если такая функция необходима, то инструкцию по установке libidn2 можно найти на странице BLFS libidn2.
Необходимо создать файл /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.4.6
Скомпилируйте пакет:
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 |
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
Теперь устраните проблему, выявленную разработчиками:
patch -Np1 -i ../readline-8.2-upstream_fixes-3.patch
Подготовьте Readline к компиляции:
./configure --prefix=/usr \ --disable-static \ --with-curses \ --docdir=/usr/share/doc/readline-8.2
Значение нового параметра configure:
--with-curses
Этот параметр сообщает Readline, что он может найти
функции библиотеки termcap в библиотеке curses, а не в
отдельной библиотеке termcap. Это позволит
сгенерировать корректный файл readline.pc
.
Скомпилируйте пакет:
make SHLIB_LIBS="-lncursesw"
Значение параметра make:
SHLIB_LIBS="-lncursesw"
Этот параметр принудительно линкует Readline с
библиотекой libncursesw
.
С этим пакетом не поставляется набор тестов.
Установите пакет:
make SHLIB_LIBS="-lncursesw" install
По желанию установите документацию:
install -v -m644 doc/*.{ps,pdf,html,dvi} /usr/share/doc/readline-8.2
Пакет 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
Чтобы протестировать bc, запустите:
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
Соберите пакет:
make sed -e "s|$SRCDIR/unix|/usr/lib|" \ -e "s|$SRCDIR|/usr/include|" \ -i tclConfig.sh sed -e "s|$SRCDIR/unix/pkgs/tdbc1.1.5|/usr/lib/tdbc1.1.5|" \ -e "s|$SRCDIR/pkgs/tdbc1.1.5/generic|/usr/include|" \ -e "s|$SRCDIR/pkgs/tdbc1.1.5/library|/usr/lib/tcl8.6|" \ -e "s|$SRCDIR/pkgs/tdbc1.1.5|/usr/include|" \ -i pkgs/tdbc1.1.5/tdbcConfig.sh sed -e "s|$SRCDIR/unix/pkgs/itcl4.2.3|/usr/lib/itcl4.2.3|" \ -e "s|$SRCDIR/pkgs/itcl4.2.3/generic|/usr/include|" \ -e "s|$SRCDIR/pkgs/itcl4.2.3|/usr/include|" \ -i pkgs/itcl4.2.3/itclConfig.sh unset SRCDIR
Различные инструкции «sed» после команды «make» удаляют ссылки на каталог сборки из файлов конфигурации и заменяют их на созданные каталоги. Это необязательно для остальной части LFS, но может понадобиться в случае, когда пакет, собранный позже, использует Tcl.
Чтобы протестировать пакет, выполните:
make test
Установите пакет:
make install
Сделайте установленную библиотеку доступной для записи, чтобы позже можно было удалить отладочные символы:
chmod -v u+w /usr/lib/libtcl8.6.so
>Установите заголовочные файлы Tcl. Они потребуются для следующего пакета - Expect.
make install-private-headers
Теперь создайте необходимую символическую ссылку:
ln -sfv tclsh8.6 /usr/bin/tclsh
Переименуйте справочную страницу, которая конфликтует со справочной страницей Perl:
mv /usr/share/man/man3/{Thread,Tcl_Thread}.3
При необходимости установите документацию, выполнив следующие команды:
cd .. tar -xf ../tcl8.6.13-html.tar.gz --strip-components=1 mkdir -v -p /usr/share/doc/tcl-8.6.13 cp -v -r ./html/* /usr/share/doc/tcl-8.6.13
Пакет 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), потерпят фатальный сбой, а также
могут произойти другие незначительные сбои.
Подготовьте Expect к компиляции:
./configure --prefix=/usr \ --with-tcl=/usr/lib \ --enable-shared \ --mandir=/usr/share/man \ --with-tclinclude=/usr/include
Значение параметров настройки:
--with-tcl=/usr/lib
Этот параметр необходим для указания configure где находится скрипт tclConfig.sh.
--with-tclinclude=/usr/include
Этот параметр явно указывает Expect, где искать внутренние заголовки Tcl.
Соберите пакет:
make
Чтобы протестировать пакет, выполните:
make test
Установите пакет:
make install ln -svf expect5.45.4/libexpect5.45.4.so /usr/lib
Пакет 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.1.1
Скомпилируйте пакет:
make
Установите пакет:
make install
Для обеспечения совместимости с исходным Pkg-config, создайте две символические ссылки:
ln -sv pkgconf /usr/bin/pkg-config ln -sv pkgconf.1 /usr/share/man/man1/pkg-config.1
Пакет Binutils содержит компоновщик, ассемблер и другие инструменты для работы с объектными файлами.
Документация Binutils рекомендует выполнять компиляцию в отдельном каталоге:
mkdir -v build cd build
Подготовьте Binutils к компиляции:
../configure --prefix=/usr \ --sysconfdir=/etc \ --enable-gold \ --enable-ld=default \ --enable-plugins \ --enable-shared \ --disable-werror \ --enable-64-bit-bfd \ --with-system-zlib \ --enable-default-hash-style=gnu
Значение новых параметров настройки:
--enable-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
Значение новых параметров настройки:
--enable-hashes=strong,glibc
Создает хэши, используя надежные алгоритмы хэширования,
рекомендуемые для безопасности, и алгоритмы
хэширования, предоставляемые традиционной библиотекой
Glibc libcrypt
для
совместимости.
--enable-obsolete-api=no
Отключает устаревшие функции API. Они не нужны для современной системы Linux, собранной из исходного кода.
--disable-failure-tokens
Отключает признак токена сбоя. Он необходим для совместимости с традиционными хэш-библиотеками некоторых платформ, но система Linux, основанная на Glibc, в нем не нуждается.
Скомпилируйте пакет:
make
Чтобы протестировать пакет, выполните:
make check
Установите пакет:
make install
С помощью приведенных выше инструкций были отключены устаревшие функции API, поскольку ни один пакет, установленный путем компиляции из исходных кодов, не будет связываться с ними во время выполнения. Однако известные двоичные приложения, которые используют эти функции, требуют ABI версии 1. Если вам необходим этот функционал для какого-либо приложения, предоставляемого только в бинарном виде, или для совместимости с LSB, соберите пакет заново с помощью следующих команд:
make distclean ./configure --prefix=/usr \ --enable-hashes=strong,glibc \ --enable-obsolete-api=glibc \ --disable-static \ --disable-failure-tokens make cp -av --remove-destination .libs/libcrypt.so.1* /usr/lib
Пакет Shadow содержит программы для безопасной обработки паролей.
Если вы хотите принудительно использовать надежные пароли,
обратитесь к инструкции
https://mirror.linuxfromscratch.ru/blfs/view/12.1/postlfs/cracklib.html
для установки CrackLib перед сборкой. Затем добавьте
параметр --with-libcrack
в приведенную
ниже команду configure.
Отключите установку groups и ее справочных страниц, так как Coreutils предоставляет версию лучше. Кроме того, запретите установку страниц руководств, так как они были установлены в Раздел 8.3, «Man-pages-6.06»:
sed -i 's/groups$(EXEEXT) //' src/Makefile.in find man -name Makefile.in -exec sed -i 's/groups\.1 / /' {} \; find man -name Makefile.in -exec sed -i 's/getspnam\.3 / /' {} \; find man -name Makefile.in -exec sed -i 's/passwd\.5 / /' {} \;
Вместо
используемого по умолчанию метода crypt, используйте более
безопасный метод шифрования паролей YESCRYPT, который также позволяет
использовать пароли длиннее 8 символов. Также необходимо
изменить устаревшее местоположение для почтовых ящиков
пользователей /var/spool/mail
,
которое Shadow использует по умолчанию, на используемое в
настоящее время /var/mail
. И
удалите /bin
и /sbin
из PATH
,
поскольку они являются просто символическими ссылками на их
аналоги в /usr
.
Если вы по какой-либо причине хотите включить /bin
и/или /sbin
в PATH
,
измените PATH
в файле
.bashrc
после сборки LFS.
sed -e 's:#ENCRYPT_METHOD DES:ENCRYPT_METHOD YESCRYPT:' \ -e 's:/var/spool/mail:/var/mail:' \ -e '/PATH=/{s@/sbin:@@;s@/bin:@@}' \ -i etc/login.defs
Если вы решили собрать Shadow с поддержкой Cracklib, выполните эту команду:
sed -i 's:DICTPATH.*:DICTPATH\t/lib/cracklib/pw_dict:' etc/login.defs
Подготовьте Shadow к компиляции:
touch /usr/bin/passwd ./configure --sysconfdir=/etc \ --disable-static \ --with-{b,yes}crypt \ --without-libbsd \ --with-group-name-max-length=32
Значение новых параметров конфигурации:
Файл /usr/bin/passwd
должен существовать, потому что его местоположение
жестко задано в некоторых программах; если он не
существует, скрипт установки создаст его не в том
месте.
--with-{b,yes}crypt
Оболочка расширяет это значение до двух параметров:
--with-bcrypt
и
--with-yescrypt
. Они
позволяют Shadow использовать алгоритмы Bcrypt и
Yescrypt, реализованные в Libxcrypt, для хеширования
паролей. Эти алгоритмы более безопасны (в частности,
гораздо более устойчивы к атакам с использованием
графических процессоров), чем традиционные алгоритмы
SHA.
--with-group-name-max-length=32
Максимально допустимая длина имени пользователя составляет 32 символа. Сделайте такую же длину для названия группы.
--without-libbsd
Не используйте функцию readpassphrase из иблиотеки libbsd, которой нет в LFS. Вместо этого используйте внутреннюю копию.
Скомпилируйте пакет:
make
С этим пакетом не поставляется набор тестов.
Установите пакет:
make exec_prefix=/usr install make -C man install-man
Этот пакет содержит утилиты для добавления, изменения и удаления пользователей и групп; установки и изменения их паролей; и выполнения других задач администрирования. Полное объяснение того, что означает password shadowing, см. в файле doc/HOWTO в дереве распакованных исходных текстов. При использовании Shadow имейте в виду, что программы, которым необходимо проверять пароли (дисплейные менеджеры, FTP-программы, демоны pop3 и т.д.), должны быть совместимы с Shadow. То есть они должны уметь работать с теневыми паролями.
Чтобы включить поддержку теневых паролей, выполните следующую команду::
pwconv
Чтобы включить использование теневых паролей для групп, запустите:
grpconv
Конфигурация Shadow по умолчанию для утилиты useradd имеет несколько
особенностей, требующих пояснения. Во-первых, по умолчанию
утилита useradd
создает пользователя и группу с тем же названием, что и имя
пользователя. По умолчанию, идентификатора пользователя (UID)
и идентификатора группы (GID) начинаются с 1000. Это
означает, что если вы не передадите дополнительные параметры
в useradd,
каждый пользователь будет членом уникальной группы в системе.
Если такое поведение нежелательно, вам нужно передать один из
параметров -g
или
-N
в useradd или изменить
настройку USERGROUPS_ENAB
в файле
/etc/login.defs
. Смотрите
справочную страницу useradd(8) для
получения дополнительной информации.
Во-вторых, чтобы изменить параметры по умолчанию, необходимо
создать файл /etc/default/useradd
и настроить его в
соответствии с вашими потребностями. Создайте его:
mkdir -p /etc/default useradd -D --gid 999
Пояснения к параметрам /etc/default/useradd
GROUP=999
Этот параметр задает начальный номер группы,
используемых в файле /etc/group
. Значение 999 берется из
приведенного выше параметра --gid
. Вы можете
установить любое значение. Обратите внимание, что
useradd
никогда не будет повторно использовать UID или GID.
Если номер, указанный в этом параметре, уже
используется будет выбран следующий доступный номер.
Также обратите внимание, что если в вашей системе нет
группы с идентификатором, равным этому номеру, при
первом использовании useradd без параметра
-g
— вы
получите следующее сообщение об ошибке: useradd: unknown GID 999
, даже
если учетная запись была создана правильно. Поэтому мы
создали группу users
с
этим идентификатором в Раздел 7.6,
«Создание основных файлов и символических ссылок».
CREATE_MAIL_SPOOL=yes
Этот параметр заставит утилиту useradd создавать
файл почтового ящика для каждого нового пользователя.
useradd
сделает этот файл принадлежащим группе mail
с правами доступа 0660. Если
вы предпочитаете, не создавать эти файлы, выполните
следующую команду:
sed -i '/MAIL/s/yes/no/' /etc/default/useradd
Придумайте пароль для root и установите командой:
passwd root
Используется для изменения максимального количества дней между обязательными сменами пароля |
|
Используется для изменения полного имени пользователя и другой информации |
|
Используется для обновления паролей групп в пакетном режиме. |
|
Используется для обновления паролей пользователей в пакетном режиме. |
|
Используется для изменения оболочки входа для пользователя. |
|
Проверяет и применяет текущую политику истечения срока действия пароля |
|
Используется для проверки журнала неудачных попыток входа в систему, для установки максимального количества неудачных попыток до блокировки учетной записи и для сброса счетчика неудачных попыток. |
|
Используется для перечисления подчиненных диапазонов идентификаторов для пользователя |
|
Используется для добавления и удаления пользователей и администраторов в группы. |
|
Создает группу с указанным именем |
|
Удаляет группу с указанным именем |
|
Позволяет пользователю управлять своим собственным списком членов группы без привилегий суперпользователя |
|
Используется для изменения имени группы или GID |
|
Проверяет целостность файлов групп |
|
Создает или изменяет файл теневых групп, используя для этого обычный файл групп |
|
Обновляет |
|
Используется системой для того, чтобы пользователь мог войти в систему |
|
Это демон, используемый для обеспечения соблюдения ограничений на время входа в систему и порты |
|
Используется для сопоставления gid пространства имен пользователя |
|
Используется для изменения GID во время сеанса входа в систему |
|
Используется для сопоставления uid пространства имен пользователя |
|
Используется для создания или изменения последовательности учетных записей |
|
Отображает сообщение о том, что учетная запись недоступна; она предназначена для использования в качестве оболочки по умолчанию для отключенных учетных записей |
|
Используется для изменения пароля для учетной записи пользователя или группы. |
|
Проверяет целостность файлов паролей |
|
Создает или изменяет файл теневых паролей, используя для этого обычный файл паролей |
|
Обновляет |
|
Выполняет указанную команду в случае, если у пользователя идентификатор группы GID совпадает с идентификатором указанной группы |
|
Запускает оболочку с заменой идентификаторов пользователя и группы |
|
Создает нового пользователя с указанным именем, либо изменяет информацию, задаваемую по умолчанию для нового пользователя |
|
Удаляет учетную запись указанного пользователя |
|
Используется для изменения имени пользователя, идентификатора пользователя (UID), оболочки, группы, домашнего каталога и т.д. |
|
Редактирует файлы |
|
Редактирует файлы |
|
библиотека для обработки подчиненных диапазонов идентификаторов пользователей и групп |
Пакет GCC содержит коллекцию компиляторов GNU, которая включает компиляторы C и C++.
При сборке на 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 --prefix=/usr \ LD=ld \ --enable-languages=c,c++ \ --enable-default-pie \ --enable-default-ssp \ --disable-multilib \ --disable-bootstrap \ --disable-fixincludes \ --with-system-zlib
GCC поддерживает семь различных языков программирования, но предварительные условия для большинства из них еще не выполнены. См. страницу BLFS Book GCC для получения инструкций о том, как собрать все языки, поддерживаемые GCC
Значение новых параметров настройки:
LD=ld
Этот параметр указывает скрипту configure использовать ld, установленный программой Binutils, собранной ранее в этой главе, а не кросс версию, которая использовалась бы в противном случае.
--disable-fixincludes
По умолчанию во время установки GCC некоторые системные заголовки будут «исправлены» для использования с GCC. Это не обязательно для современной системы Linux и потенциально опасно, если пакет будет переустановлен после установки GCC. Этот параметр не позволяет GCC «исправлять» заголовки.
--with-system-zlib
Этот параметр указывает GCC ссылаться на установленную в системе копию библиотеки Zlib, а не на собственную внутреннюю копию.
PIE (позиционно-независимые исполняемые файлы) — это двоичные программы, которые можно загружать в любое место памяти. Без PIE функция безопасности под названием ASLR (рандомизация размещения адресного пространства) может применяться к общим библиотекам, но не к самим исполняемым файлам. Включение PIE позволяет использовать ASLR для исполняемых файлов в дополнение к общим библиотекам и смягчает некоторые атаки, основанные на фиксированных адресах конфиденциального кода или данных в исполняемых файлах.
SSP (Stack Smashing Protection - защита от разрушения стека) — это метод, гарантирующий, что стек параметров не будет поврежден. Повреждение стека может, например, изменить адрес возврата подпрограммы, тем самым передав управление какому-то опасному коду (существующему в программе или общих библиотеках или каким-то образом внедренному злоумышленником).
Скомпилируйте пакет:
make
В этом разделе набор тестов для GCC считается важным, но занимает много времени. Начинающим сборщикам не рекомендуется пропускать его. Время выполнения тестов можно значительно сократить, добавив -jx в приведенную ниже команду make -k check, где x - количество ядер процессора в вашей системе.
Известно, что один набор тестов GCC переполняет стек по умолчанию, поэтому увеличьте размер стека перед запуском тестов:
ulimit -s 32768
Выполните тестирование под непривилегированным пользователем, но не останавливайтесь на ошибках:
chown -R tester . su tester -c "PATH=$PATH make -k check"
Чтобы получить сводку результатов набора тестов, выполните:
../contrib/test_summary
Чтобы отфильтровать только итоговую сводку, передайте вывод
через pipe grep -A7
Summ
.
Результаты можно сравнить с результатами, размещенными на https://mirror.linuxfromscratch.ru/lfs/build-logs/12.1/ и https://gcc.gnu.org/ml/gcc-testresults/.
Известно, что восемь тестов gcc (из более чем 185 000):
pr56837.c
и семь тестов из
каталога analyzer
завершились
неудачно. Также провалился один тест libstdc++ (из более чем
15 000) — это copy.cc
.
Известно, что для g++ 21 тест (из примерно 250 000), 14
тестов «AddressSanitizer*» и 7 тестов
interception-malloc-test-1.C
завершились неудачно. Кроме того, несколько тестов из
каталога vect
завершаются
неудачно, если оборудование не поддерживает AVX.
Не всегда удается избежать неожиданных сбоев. Разработчики GCC обычно знают об этих проблемах, но еще не решили их. Если результаты теста не сильно отличаются от результатов по указанному выше URL-адресу, можно продолжать.
Установите пакет:
make install
Каталог сборки GCC теперь принадлежит пользователю
tester
, и владелец каталога
заголовочных файлов (и его содержимого) указан неверно.
Измените владельца на пользователя и группу root
:
chown -v -R root:root \ /usr/lib/gcc/$(gcc -dumpmachine)/13.2.0/include{,-fixed}
Создайте символическую ссылку, требуемую FHS по "историческим" причинам.
ln -svr /usr/bin/cpp /usr/lib
Многие пакеты используют имя cc для вызова компилятора языка Си. Мы уже создали cc как символическую ссылку в GCC-Проход 2, теперь создайте символическую ссылку на его справочную страницу:
ln -sv gcc.1 /usr/share/man/man1/cc.1
Добавьте символическую ссылку совместимости, чтобы включить сборку программ с оптимизацией времени компоновки (LTO):
ln -sfv ../../libexec/gcc/$(gcc -dumpmachine)/13.2.0/liblto_plugin.so \ /usr/lib/bfd-plugins/
Теперь, когда наш окончательный набор инструментов готов, важно еще раз убедиться, что компиляция и компоновка будут работать так, как ожидалось. Мы сделаем это, выполнив проверку работоспособности:
echo 'int main(){}' > dummy.c cc dummy.c -v -Wl,--verbose &> dummy.log readelf -l a.out | grep ': /lib'
Ошибок быть не должно, и вывод последней команды будет (с учетом платформо-зависимых различий в имени динамического компоновщика):
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
Теперь убедитесь, что мы настроили использование правильных стартовых файлов:
grep -E -o '/usr/lib.*/S?crt[1in].*succeeded' dummy.log
Вывод последней команды должен быть:
/usr/lib/gcc/x86_64-pc-linux-gnu/13.2.0/../../../../lib/Scrt1.o succeeded
/usr/lib/gcc/x86_64-pc-linux-gnu/13.2.0/../../../../lib/crti.o succeeded
/usr/lib/gcc/x86_64-pc-linux-gnu/13.2.0/../../../../lib/crtn.o succeeded
В зависимости от архитектуры вашего компьютера вышеуказанные
параметры могут незначительно отличаться. Разница будет
заключаться в имени каталога после /usr/lib/gcc
. Здесь важно обратить внимание
на то, что gcc
нашел все три файла crt*.o
в
каталоге /usr/lib
.
Убедитесь, что компилятор ищет правильные заголовочные файлы:
grep -B4 '^ /usr/include' dummy.log
Эта команда должна вернуть следующий вывод:
#include <...> search starts here:
/usr/lib/gcc/x86_64-pc-linux-gnu/13.2.0/include
/usr/local/include
/usr/lib/gcc/x86_64-pc-linux-gnu/13.2.0/include-fixed
/usr/include
Опять же, имя каталога может отличаться от указанного выше, в зависимости от архитектуры вашей системы.
Затем убедитесь, что новый компоновщик использует правильные пути поиска:
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
Ссылки на пути, содержащие компоненты с '-linux-gnu', следует игнорировать, но в противном случае вывод последней команды должен быть таким:
SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib64")
SEARCH_DIR("/usr/local/lib64")
SEARCH_DIR("/lib64")
SEARCH_DIR("/usr/lib64")
SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib");
32-разрядная система может использовать несколько других каталогов. Например, вот вывод с компьютера i686:
SEARCH_DIR("/usr/i686-pc-linux-gnu/lib32")
SEARCH_DIR("/usr/local/lib32")
SEARCH_DIR("/lib32")
SEARCH_DIR("/usr/lib32")
SEARCH_DIR("/usr/i686-pc-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib");
Затем убедитесь, что мы используем правильную libc:
grep "/lib.*/libc.so.6 " dummy.log
Вывод последней команды должен быть:
attempt to open /usr/lib/libc.so.6 succeeded
Убедитесь, что GCC использует правильный динамический компоновщик:
grep found dummy.log
Вывод последней команды должен быть (с учетом различий в имени динамического компоновщика, зависящих от платформы):
found ld-linux-x86-64.so.2 at /usr/lib/ld-linux-x86-64.so.2
Если вывод выглядит не так, как показано выше, или вообще не получен, значит, где-то серьезная ошибка. Изучите и повторите шаги, чтобы выяснить, в чем проблема, и исправьте ее. Любые проблемы должны быть решены, прежде чем вы продолжите процесс.
Как только все заработает правильно, удалите тестовые файлы:
rm -v dummy.c a.out dummy.log
Наконец, переместите файл:
mkdir -pv /usr/share/gdb/auto-load/usr/lib mv -v /usr/lib/*gdb.py /usr/share/gdb/auto-load/usr/lib
Компилятор С++ |
|
Компилятор C |
|
Препроцессор C; он используется компилятором для расширения инструкций #include, #define и подобные директивы в исходных файлах |
|
Компилятор C++ |
|
Компилятор C |
|
Обертка над ar, добавляющая плагин в командную строку. Эта программа используется только для добавления "оптимизации времени компоновки" и бесполезна с параметрами сборки по умолчанию. |
|
Обертка над nm, добавляющая плагин в командную строку. Эта программа используется только для добавления "оптимизации времени компоновки" и бесполезна с параметрами сборки по умолчанию. |
|
Обертка над ranlib, добавляющая плагин в командную строку. Эта программа используется только для добавления "оптимизации времени компоновки" и бесполезна с параметрами сборки по умолчанию. |
|
Инструмент тестирования; он используется для анализа программ, чтобы определить, где оптимизация будет иметь наибольший эффект. |
|
Автономный инструмент для дампа профилей gcda and gcno |
|
Автономный инструмент обработки профиля gcda |
|
Инструмент для создания дампа объектных файлов, созданных GCC с включенным LTO. |
|
Библиотека времени выполнения Address Sanitizer |
|
Встроенная библиотека времени выполнения GCC atomic |
|
Библиотека, которая позволяет GDB использовать GCC |
|
Содержит средства поддержки времени исполнения для gcc |
|
Эта библиотека компонуется с программой, когда в GCC включено профилирование |
|
GNU реализация интерфейса OpenMP API мультиплатформенного параллельного программирования для языков C/C++ и Fortran с общим доступом к памяти |
|
Библиотека времени выполнения Hardware-Assisted Address Sanitizer (аппаратной очистки адресов) |
|
Библиотека транзакционной памяти GNU |
|
Библиотека времени выполнения Leak Sanitizer (средств защиты от утечек) |
|
Плагин GCC LTO позволяет Binutils обрабатывать объектные файлы, созданные GCC с включенным LTO. |
|
API математической библиотеки GCC Quad Precision |
|
Содержит подпрограммы, поддерживающие функциональность защиты стека GCC. Обычно они не используются, потому что Glibc также предоставляет эти подпрограммы. |
|
Стандартная библиотека C++ |
|
Экспериментальная библиотека контрактов C++ |
|
Библиотека файловой системы ISO/IEC TS 18822:2015 |
|
Предоставляет вспомогательные процедуры для языка программирования C++ |
|
Библиотека времени выполнения Thread Sanitizer (средств очистки потоков) |
|
Библиотека времени выполнения Undefined Behavior Sanitizer (средств очистки неопределенного поведения) |
Пакет Ncurses содержит библиотеки для независимой от терминала обработки ввода/вывода
Подготовьте Ncurses к компиляции:
./configure --prefix=/usr \ --mandir=/usr/share/man \ --with-shared \ --without-debug \ --without-normal \ --with-cxx-shared \ --enable-pc-files \ --enable-widec \ --with-pkg-config-libdir=/usr/lib/pkgconfig
Значение новых параметров настройки:
--with-shared
Этот параметр позволяет Ncurses собирать и устанавливать общие библиотеки C.
--without-normal
Этот параметр отключает сборку и установку большинства статических библиотек C.
--without-debug
Этот параметр предотвращает сборку и установку отладочных библиотек.
--with-cxx-shared
Это аргумент позволяет Ncurses собирать и устанавливать общие привязки C++. А также предотвращает сборку и установку статических привязок C++.
--enable-pc-files
Этот параметр генерирует и устанавливает файлы .pc для pkg-config.
--enable-widec
Этот параметр указывает, что при сборке пакета вместо
обычных библиотек (например, libncurses.so.6.4
) будут
использоваться библиотеки с расширенным набором
символов (например, libncursesw.so.6.4
). Библиотеки с
расширенным набором символов могут использоваться как с
многобайтовыми локалями, так и с традиционными
8-битовыми локалями, тогда как обычные библиотеки
работают только с 8-битовыми локалями. Библиотеки с
расширенным набором символов и обычные библиотеки
совместимы на уровне исходного кода, но не совместимыми
на уровне двоичного.
Скомпилируйте пакет:
make
У этого пакета есть набор тестов, но его можно запустить
только после того, как пакет будет установлен. Тесты
находятся в каталоге test/
.
Дополнительные сведения смотрите в файле README
в этом каталоге.
Установка этого пакета приведет к перезаписи libncursesw.so.6.4
. Это может привести к
сбою процесса оболочки, который использует код и данные из
файла библиотеки. Установите пакет с помощью DESTDIR
и правильно замените файл библиотеки
с помощью команды install(также
отредактирован заголовочный файл curses.h
, чтобы обеспечить использование
ABI расширенного набора символов, как это сделано в Раздел 6.3,
«Ncurses-6.4-20230520»).
make DESTDIR=$PWD/dest install install -vm755 dest/usr/lib/libncursesw.so.6.4 /usr/lib rm -v dest/usr/lib/libncursesw.so.6.4 sed -e 's/^#if.*XOPEN.*$/#if 1/' \ -i dest/usr/include/curses.h cp -av dest/* /
Многие приложения ожидают, что компоновщик может найти
библиотеки Ncurses, не поддерживающие расширенный набор
символов. Используя трюк ниже, свяжите такие приложения с
библиотеками расширенного набора символов с помощью
символических ссылок (обратите внимание, что ссылки
.so
безопасны только в том
случае, если curses.h
отредактирован так, чтобы всегда использовать ABI
расширенного набора символов):
for lib in ncurses form panel menu ; do ln -sfv lib${lib}w.so /usr/lib/lib${lib}.so ln -sfv ${lib}w.pc /usr/lib/pkgconfig/${lib}.pc done
Убедитесь, что старые приложения, которым нужна -lcurses
для сборки, собираются правильно:
ln -sfv libncursesw.so /usr/lib/libcurses.so
По желанию установите документацию Ncurses:
cp -v -R doc -T /usr/share/doc/ncurses-6.4-20230520
С помощью приведенных выше инструкций не создаются библиотеки Ncurses, не использующие расширенный набор символов, поскольку ни один пакет, установленный путем компиляции из исходного кода, не будет связан с ними во время выполнения. Тем не менее, известно что некоторые бинарные приложения, которые связаны с библиотекой Ncurses и не поддерживающие расширенный набор символов, требуют наличия версии 5. Если вам необходимо иметь такие библиотеки из-за какого-либо приложения, имеющегося только в бинарном виде, или для обеспечения совместимости с LSB, соберите пакет с помощью следующих команд:
make distclean ./configure --prefix=/usr \ --with-shared \ --without-normal \ --without-debug \ --without-cxx-binding \ --with-abi-version=5 make sources libs cp -av lib/lib*.so.5* /usr/lib
Преобразует описание termcap в описание terminfo |
|
Очищает экран, если это возможно |
|
Сравнивает или показывает описания terminfo |
|
Преобразует описание terminfo в описание termcap |
|
Предоставляет информацию о конфигурации пакету ncurses |
|
Повторно инициализирует терминал со значениями по умолчанию |
|
Очищает и устанавливает размеры табуляции в терминале |
|
Компилятор описания terminfo, преобразует файл terminfo из исходного формата в двоичный, который необходим для подпрограмм библиотеки ncurses [Файл terminfo содержит информацию о возможностях конкретного терминала.] |
|
Выводит список всех доступных типов терминалов, для каждого из которых указывается его имя и приводится описание |
|
Позволяет использовать в командной оболочке настройки, относящиеся к особенностям конкретного терминала; может также использоваться для сброса или инициализации терминала, либо для вывода полного имени терминала |
|
Может использоваться для инициализации терминалов |
|
Содержит функции, отображающие различными способами текст на экране терминала. Хорошим примером использования этих функций является меню, отображаемое командой make menuconfig при настройке ядра |
|
Содержит функции связывания C++ с другими библиотеками в пакете |
|
Содержит функции, реализующие формы |
|
Содержит функции, реализующие меню |
|
Содержит функции, реализующие панели |
Пакет Sed содержит потоковый редактор текста
Подготовьте Sed к компиляции:
./configure --prefix=/usr
Скомпилируйте пакет и сгенерируйте HTML-документацию:
make make html
Чтобы протестировать пакет, выполните:
chown -R tester . su tester -c "PATH=$PATH make check"
Установите пакет и документацию к нему:
make install install -d -m755 /usr/share/doc/sed-4.9 install -m644 doc/sed.html /usr/share/doc/sed-4.9
Пакет Psmisc содержит программы для отображения информации о запущенных процессах.
Подготовьте Psmisc к компиляции:
./configure --prefix=/usr
Скомпилируйте пакет:
make
Чтобы протестировать пакет, выполните:
make check
Установите пакет:
make install
Сообщает идентификаторы процессов (PID), которые используют данные файлы или файловые системы. |
|
Уничтожает процессы по имени; посылает сигнал всем процессам, выполняющим любую из заданных команд |
|
Просмотривает файловые дескрипторы запущенного процесса с учетом его PID |
|
Выводит информацию о процессе |
|
Сообщает текущий путь к журналам процесса |
|
Отображает запущенные процессы в виде дерева |
|
То же, что и pstree, за исключением того, что он ожидает подтверждения перед выходом. |
Пакет Gettext содержит утилиты для интернационализации и локализации. Они позволяют компилировать программы с поддержкой NLS (Native Language Support), позволяя им выводить сообщения на родном языке пользователя.
Подготовьте Gettext для компиляции:
./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/gettext-0.22.4
Скомпилируйте пакет:
make
Чтобы протестировать пакет (это занимает много времени, около 3 SBU), выполните:
make check
Установите пакет:
make install chmod -v 0755 /usr/lib/preloadable_libintl.so
Копирует файлы стандартной инфраструктуры Gettext в пакет с исходным кодом |
|
Подставляет переменные окружения в строки, используемые командной оболочкой |
|
Переводит сообщение с естественного языка на язык пользователя, осуществляя для этого поиск уже сделанного перевода в каталоге сообщений |
|
В основном служит библиотекой функций оболочки для gettext. |
|
Копирует все стандартные файлы Gettext в указанный каталог верхнего уровня пакета, чтобы начать его интернационализацию. |
|
Фильтрует сообщения каталога переводов в соответствии с их атрибутами и управляет атрибутами |
|
Объединяет указанные файлы |
|
Сравнивает два файла |
|
Находит сообщения, которые являются общими для
указанных файлов |
|
Преобразует каталог переводов в другую кодировку символов |
|
Создает каталог переводов на английский язык |
|
Применяет команду ко всем переводам каталога переводов |
|
Применяет фильтр ко всем переводам каталога переводов |
|
Генерирует каталог двоичных сообщений из каталога переводов |
|
Извлекает все сообщения каталога переводов, которые соответствуют заданному шаблону или принадлежат нескольким указанным исходным файлам |
|
Создает новый файл |
|
Объединяет два необработанных перевода в один файл |
|
Декомпилирует каталог двоичных сообщений в необработанный текст перевода |
|
Объединяет дублирующиеся переводы в каталоге переводов |
|
Отображает перевод текстового сообщения на родной язык, грамматическая форма которого зависит от числа. |
|
Перекодирует сербский текст с кириллицы на латиницу. |
|
Извлекает переводимые строки сообщений из заданных исходных файлов для создания первого шаблона перевода. |
|
Определяет класс autosprintf, который делает подпрограммы вывода в формате C пригодными для использования в программах на C++ для использования со строками <string> и потоками <iostream> |
|
Содержит общие подпрограммы, используемые различными программами Gettext; они не предназначены для общего использования |
|
Используется для написания специализированных
программ, обрабатывающих файлы |
|
Предоставляет общие подпрограммы, используемые различными программами Gettext; они не предназначены для общего использования |
|
Библиотека стилей текста |
|
Библиотека, предназначенная для использования
LD_PRELOAD, которая помогает |
Пакет Bison содержит генератор синтаксического анализа.
Подготовьте Bison к компиляции:
./configure --prefix=/usr --docdir=/usr/share/doc/bison-3.8.2
Скомпилируйте пакет:
make
Для тестирования пакета (около 5,5 SBU), выполните:
make check
Установите пакет:
make install
Генерирует из набора правил программу для анализа структуры текстовых файлов; Bison является заменой Yacc (Yet Another Compiler Compiler) |
|
Обертка для bison,
предназначенная для программ, которые до сих пор
вызывают yacc вместо
bison; он
вызывает bison с
параметром |
|
Библиотека Yacc, содержащая реализации
Yacc-совместимых функций |
Пакет Grep содержит программы для поиска по содержимому файлов.
Во-первых, удалите предупреждение об использовании egrep и fgrep, которое приводит к сбою тестов некоторых пакетов:
sed -i "s/echo/#echo/" src/egrep.sh
Подготовьте Grep к компиляции:
./configure --prefix=/usr
Скомпилируйте пакет:
make
Чтобы протестировать пакет, выполните:
make check
Установите пакет:
make install
Выводит строки, соответствующие расширенному регулярному выражению. Команда устарела, вместо неё используйте grep -E |
|
Выводит строки, соответствующие списку фиксированных строк. Команда устарела, вместо неё используйте grep -F |
|
Выводит строки, соответствующие простому регулярному выражению |
Пакет Bash содержит Bourne-Again Shell.
Во-первых, исправьте некоторые проблемы, выявленные разработчиками:
patch -Np1 -i ../bash-5.2.21-upstream_fixes-1.patch
Подготовьте Bash к компиляции:
./configure --prefix=/usr \ --without-bash-malloc \ --with-installed-readline \ --docdir=/usr/share/doc/bash-5.2.21
Значение нового параметра настройки:
--with-installed-readline
Этот параметр указывает Bash использовать библиотеку
readline
, которая уже
установлена в системе, а не собственную версию
readline.
Скомпилируйте пакет:
make
Перейдите к разделу «Установка пакета», если не планируете запускать тесты.
Перед запуском тестов, убедитесь, что пользователь
tester
может писать в каталог
с исходниками:
chown -R tester .
Набор тестов пакета предназначен для запуска пользователем
без полномочий root, которому принадлежит терминал,
подключенный к стандартному вводу. Чтобы удовлетворить это
требование, создайте новый псевдотерминал с помощью
Expect и запустите тесты от
имени пользователя tester
:
su -s /usr/bin/expect tester << "EOF" set timeout -1 spawn make tests expect eof lassign [wait] _ _ _ value exit $value EOF
Набор тестов использует diff для определения
разницы между выводом тестового сценария и ожидаемым
результатом. Любой вывод diff (с префиксом
<
и >
) указывает на сбой теста, если
нет сообщение о том, что различия можно проигнорировать.
Известно, что один тест с именем run-builtins
не работает на некоторых
хост-дистрибутивах, указывая на различия в первой строке
выходных данных.
Установите пакет:
make install
Запустите только что скомпилированную программу bash (заменив ту, которая выполняется в данный момент):
exec /usr/bin/bash --login
Широко распространенный командный интерпретатор. Выполняет различные дополнения и подстановки в переданной командной строке перед её выполнением, что делает этот интерпретатор мощным инструментом |
|
Скрипт, помогающий пользователю составлять и отправлять по почте отчеты об ошибках bash |
|
Симлинк на программу bash; при вызове sh, bash пытается максимально точно имитировать поведение sh, при этом также соответствуя стандарту POSIX. |
Пакет Libtool содержит сценарий поддержки универсальной библиотеки GNU. Это упрощает использование общих библиотек благодаря согласованному переносимому интерфейсу.
Подготовьте Libtool к компиляции:
./configure --prefix=/usr
Скомпилируйте пакет:
make
Чтобы протестировать пакет, выполните:
make -k check
Известно, что пять тестов в среде сборки LFS завершаются неудачно из-за циклической зависимости, но эти тесты проходят успешно, если запустить их повторно после установки automake. Кроме того, в grep-3.8 или более поздней версии два теста вызовут предупреждение для регулярных выражений, несовместимых с POSIX и завершатся ошибкой.
Установите пакет:
make install
Удалите ненужную статическую библиотеку:
rm -fv /usr/lib/libltdl.a
Пакет GDBM содержит менеджер баз данных GNU. Это библиотека функций базы данных, использующая расширяемое хеширование и работающая аналогично стандартной СУБД UNIX. Библиотека предоставляет примитивы для хранения пар ключ/значение, поиска и извлечения данных по его ключу и удаления ключа вместе с его данными.
Подготовьте GDBM к компиляции:
./configure --prefix=/usr \ --disable-static \ --enable-libgdbm-compat
Значение параметра configure:
--enable-libgdbm-compat
Этот параметр включает сборку библиотеки совместимости libgdbm. Некоторым пакетам за пределами LFS могут потребоваться более старые подпрограммы DBM, которые он предоставляет.
Скомпилируйте пакет:
make
Чтобы протестировать пакет, выполните:
make check
Установите пакет:
make install
Gperf генерирует идеальную хэш-функцию из набора ключей.
Подготовьте Gperf к компиляции:
./configure --prefix=/usr --docdir=/usr/share/doc/gperf-3.1
Скомпилируйте пакет:
make
Известно, что тесты завершаются ошибкой при одновременном выполнении нескольких тестов (параметр -j больше 1). Для выполнения тестов, запустите следующую команду:
make -j1 check
Установите пакет:
make install
Пакет Expat содержит потоковую библиотеку C для синтаксического анализа XML
Подготовьте Expat к компиляции:
./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/expat-2.6.0
Скомпилируйте пакет:
make
Чтобы протестировать пакет, выполните:
make check
Установите пакет:
make install
По желанию установите документацию:
install -v -m644 doc/*.{html,css} /usr/share/doc/expat-2.6.0
Пакет Inetutils содержит базовые программы для работы с сетью.
Подготовьте Inetutils к компиляции:
./configure --prefix=/usr \ --bindir=/usr/bin \ --localstatedir=/var \ --disable-logger \ --disable-whois \ --disable-rcp \ --disable-rexec \ --disable-rlogin \ --disable-rsh \ --disable-servers
Значение параметров настройки:
--disable-logger
Параметр запрещает установку программы logger, используемой скриптами для отправки сообщений системной службе логирования (System Log Daemon). Не устанавливайте её, т.к. Util-linux устанавливает более свежую версию.
--disable-whois
Этот параметр отключает сборку whois-клиента Inetutils, который устарел. Инструкции для сборки более нового клиента whois находятся в книге BLFS.
--disable-r*
Отключает установку устаревших программ, которые не должны использоваться по соображениям безопасности. Функционал этих программы можно получить установкой пакета openssh из книги BLFS.
--disable-servers
Отключает установку различных сетевых серверов, входящих в состав пакета Inetutils. Эти серверы считаются неподходящими для базовой системы LFS. Некоторые из них небезопасны по своей природе и считаются надежными только в доверенных сетях. Обратите внимание, что для многих из них доступны более качественные замены.
Скомпилируйте пакет:
make
Чтобы протестировать пакет, выполните::
make check
Установите пакет:
make install
Переместите программу в правильное место:
mv -v /usr/{,s}bin/ifconfig
Показывает системное DNS имя |
|
Программа для передачи файлов по протоколу FTP |
|
Сообщает или задает имя хоста |
|
Управляет сетевыми интерфейсами |
|
Отправляет пакеты эхо-запросов и сообщает, сколько времени занимают ответы |
|
Версия ping для сетей IPv6 |
|
Используется для общения с другими пользователями |
|
Интерфейс к протоколу TELNET |
|
Программа для передачи файлов по протоколу TFTP (Trivial File Transfer Protocol — простой протокол передачи файлов) |
|
Отслеживает маршрут, по которому проходят ваши пакеты от хоста на которым вы работаете, к другому узлу сети, показывая все промежуточные переходы (шлюзы) на этом пути. |
Пакет Less содержит средство просмотра текстовых файлов
Подготовьте Less к компиляции:
./configure --prefix=/usr --sysconfdir=/etc
Значение параметров настройки:
--sysconfdir=/etc
Этот параметр указывает программам, созданным пакетом,
искать файлы конфигурации в /etc
.
Скомпилируйте пакет:
make
Чтобы протестировать пакет, выполните:
make check
Установите пакет:
make install
Пакет Perl содержит практический язык для извлечения данных и составления отчётов (Practical Extraction and Report Language).
Эта версия Perl собирает модули Compress::Raw::Zlib и Compress::Raw::BZip2. По умолчанию Perl будет использовать внутреннюю копию исходников для сборки. Выполните следующую команду, чтобы Perl использовал библиотеки, установленные в системе:
export BUILD_ZLIB=False export BUILD_BZIP2=0
Чтобы иметь полный контроль над настройкой Perl, вы можете удалить параметры «-des» из следующей команды и вручную выбрать способ сборки этого пакета. В качестве альтернативы, используйте команду точно так, как указано ниже, чтобы использовать значения по умолчанию, которые Perl определяет автоматически:
sh Configure -des \ -Dprefix=/usr \ -Dvendorprefix=/usr \ -Dprivlib=/usr/lib/perl5/5.38/core_perl \ -Darchlib=/usr/lib/perl5/5.38/core_perl \ -Dsitelib=/usr/lib/perl5/5.38/site_perl \ -Dsitearch=/usr/lib/perl5/5.38/site_perl \ -Dvendorlib=/usr/lib/perl5/5.38/vendor_perl \ -Dvendorarch=/usr/lib/perl5/5.38/vendor_perl \ -Dman1dir=/usr/share/man/man1 \ -Dman3dir=/usr/share/man/man3 \ -Dpager="/usr/bin/less -isR" \ -Duseshrplib \ -Dusethreads
Значение параметров Configure:
-Dpager="/usr/bin/less
-isR"
Параметр указывает использовать less
вместо
more
.
-Dman1dir=/usr/share/man/man1
-Dman3dir=/usr/share/man/man3
Так как Groff еще не установлен, Configure не будет создавать man-страницы для Perl. Эти параметры переопределяют это поведение.
-Dusethreads
Собрать Perl с поддержкой потоков.
Скомпилируйте пакет:
make
Чтобы протестировать пакет (примерно 11 SBU), выполните:
TEST_JOBS=$(nproc) make test_harness
Установка пакета и очистка:
make install unset BUILD_ZLIB BUILD_BZIP2
Интерфейс командной строки для Module::CoreList |
|
Позволяет получать из командной строки доступ к архиву документации и программ Perl (Comprehensive Perl Archive Network - CPAN) |
|
Собирает расширение Perl для модуля Encode либо с использование таблицы символов Unicode, либо с использованием файлов кодирования Tcl |
|
Определяет тип кодировки одного или нескольких файлов |
|
Конвертирует заголовочные файлы Си |
|
Конвертирует заголовочные файлы Си |
|
Сценарий оболочки для проверки установленных модулей Perl; он может создать архив из установленного модуля. |
|
Преобразует данные между определенными входными и выходными форматами |
|
Может использоваться для настройки Perl-модуля
|
|
Объединяет лучшие возможности C, sed, awk и sh в одном языке |
|
Жесткая ссылка на perl |
|
Используется для создания отчетов об ошибках в Perl или модулях, которые поставляются с ним, и отправки их по почте |
|
Отображает часть документации в формате pod, которая встроена в дерево установки Perl или в сценарий Perl |
|
Процедура проверки установки Perl; ее можно использовать для проверки правильности установки Perl и его библиотек |
|
Используется для создания сообщения-благодарности, отсылаемого разработчикам Perl |
|
Perl версия конвертера iconv, используемого для кодирования символов |
|
Инструмент для грубого конвертирования файлов
|
|
Преобразует файлы из формата pod в формат HTML |
|
Преобразует данные pod в форматированный входной поток для *roff |
|
Преобразует данные pod в форматированный текст ASCII |
|
Печатает в файл сообщения usage из встроенных документов pod |
|
Проверяет синтаксис файлов документации формата pod |
|
Отображает выбранные разделы документации pod |
|
Инструмент командной строки для выполнения тестов с помощью модуля Test::Harness |
|
Программа, похожая на tar, написанная на Perl |
|
Программа на Perl для сравнения распакованного и нераспакованного архивов |
|
Программа на Perl для текстового поиска по шаблону внутри tar-архива |
|
Печатает или проверяет контрольные суммы SHA |
|
Включает подробные предупреждения для диагностики в Perl |
|
Преобразует код Perl XS в код C |
|
Отображает сведения о внутренней структуре Zip-файла |
Модуль XML::Parser представляет собой Perl-интерфейс к XML-парсеру Джеймса Кларка Expat.
Подготовьте XML::Parser к компиляции:
perl Makefile.PL
Скомпилируйте пакет:
make
Чтобы протестировать пакет, выполните:
make test
Установите пакет:
make install
Intltool — это инструмент интернационализации, используемый для извлечения переводимых строк из исходных файлов.
Сначала исправьте предупреждение, вызываемое perl-5.22 и более поздними версиями:
sed -i 's:\\\${:\\\$\\{:' intltool-update.in
Приведенное выше регулярное выражение выглядит необычно из-за множества слэшей. Что оно делает, так это добавляет обратную косую черту перед правой фигурной скобкой в последовательности '\${' в результате чего получается '\$\{'.
Подготовьте Intltool к компиляции:
./configure --prefix=/usr
Скомпилируйте пакет:
make
Чтобы протестировать пакет, выполните:
make check
Установите пакет:
make install install -v -Dm644 doc/I18N-HOWTO /usr/share/doc/intltool-0.51.0/I18N-HOWTO
Подготавливает пакет для использования intltool |
|
Генерирует заголовочные файлы, которые могут быть прочитаны с помощью gettext |
|
Объединяет переведенные строки в файлы различных типов |
|
Обновляет файлы pot и объединяет их с файлами перевода |
|
Обновляет файлы шаблонов po и объединяет их с переводами |
Пакет Autoconf содержит программы для создания сценариев оболочки, которые могут автоматически настраивать исходный код.
Подготовьте Autoconf к компиляции:
./configure --prefix=/usr
Скомпилируйте пакет:
make
Чтобы протестировать пакет, выполните:
make check
Установите пакет:
make install
Генерирует сценарии оболочки, которые автоматически настраивают пакеты исходного кода программного обеспечения для адаптации ко многим типам Unix-подобных систем; создаваемые сценарии независимы—для их запуска не требуется программа autoconf. |
|
Инструмент для создания файлов шаблонов операторов C #define для использования в configure |
|
Обертка для макропроцессора M4 |
|
Автоматически запускает autoconf, autoheader, aclocal, automake, gettextize и libtoolize в правильном порядке, чтобы сэкономить время, при внесении изменений в файлы шаблонов autoconf и automake. |
|
Помогает создать файл |
|
Изменяет файл |
|
Помогает при написании файла |
Пакет Automake содержит программы генерации Makefile для использования с Autoconf.
Подготовьте Automake к компиляции:
./configure --prefix=/usr --docdir=/usr/share/doc/automake-1.16.5
Скомпилируйте пакет:
make
Использование четырех параллельных заданий ускоряет тестирование даже на системах с меньшим количеством логических ядер из-за внутренних задержек в отдельных тестах. Чтобы протестировать пакет, выполните:
make -j$(($(nproc)>4?$(nproc):4))
check
Замените $((...))
количеством логических ядер, которые вы хотите использовать,
если вы не планируете использовать все.
Известно, что тест t/subobj.sh не проходит.
Установите пакет:
make install
Генерирует файлы |
|
Жесткая ссылка на aclocal |
|
Инструмент для автоматического создания
|
|
Жесткая ссылка на automake |
Пакет OpenSSL содержит инструменты управления и библиотеки, относящиеся к криптографии. Они полезны для предоставления криптографических функций другим пакетам, таким как OpenSSH, приложениям электронной почты и веб-браузерам (для доступа к сайтам по HTTPS).
Подготовьте OpenSSL к компиляции:
./config --prefix=/usr \ --openssldir=/etc/ssl \ --libdir=lib \ shared \ zlib-dynamic
Скомпилируйте пакет:
make
Чтобы протестировать пакет, выполните:
HARNESS_JOBS=$(nproc)
make test
Известно, что один тест, 30-test_afalg.t, завершится ошибкой,
если в ядре хоста не включен параметр CONFIG_CRYPTO_USER_API_SKCIPHER
или
отсутствуют какие-либо опции, обеспечивающих реализацию AES с
CBC (например, комбинация CONFIG_CRYPTO_AES
и CONFIG_CRYPTO_CBC
или CONFIG_CRYPTO_AES_NI_INTEL
, если процессор
поддерживает AES-NI). В случае неудачи его можно смело
игнорировать.
Установите пакет:
sed -i '/INSTALL_LIBS/s/libcrypto.a libssl.a//' Makefile make MANSUFFIX=ssl install
Добавьте версию к имени каталога документации, чтобы структура соответствовала другим пакетам:
mv -v /usr/share/doc/openssl /usr/share/doc/openssl-3.2.1
По желанию, установите дополнительную документацию:
cp -vfr doc/* /usr/share/doc/openssl-3.2.1
Вы должны обновить OpenSSL, когда будет выпущена новая
версия, исправляющая уязвимости. Начиная с OpenSSL 3.0.0,
схема управления версиями OpenSSL следует формату
MAJOR.MINOR.PATCH. Совместимость API/ABI гарантируется для
одной и той же ОСНОВНОЙ (MAJOR) версии. Поскольку LFS
устанавливает только общие библиотеки, нет необходимости
перекомпилировать пакеты, которые ссылаются на libcrypto.so
или libssl.so
, при
обновлении до версии с тем же ОСНОВНЫМ номером
версии.
Все запущенные программы, связанные с этими библиотеками, после обновления необходимо остановить и перезапустить. Для получения более подробной информации ознакомьтесь с соответствующей записью в Раздел 8.2.1, «Проблемы с обновлением».
это Perl скрипт, который сканирует все файлы в каталоге и добавляет символические ссылки к их хеш-значениям. Использование c_rehash считается устаревшим и должно быть заменено командой openssl rehash |
|
это инструмент командной строки для использования различных криптографических функций библиотеки OpenSSL из оболочки. Его можно использовать для различных функций, которые задокументированы в openssl(1) |
|
реализует широкий спектр криптографических алгоритмов, используемых в различных интернет-стандартах. Услуги, предоставляемые этой библиотекой, используют OpenSSL-реализацию SSL, TLS и S/MIME, а также для реализации OpenSSH, OpenPGP и других криптографических стандартов. |
|
реализует протокол безопасности транспортного уровня (TLS v1). Он предоставляет богатый API, документацию по которому можно найти в руководстве ssl(7) |
Пакет Kmod содержит библиотеки и утилиты для загрузки модулей ядра.
Подготовьте Kmod к компиляции:
./configure --prefix=/usr \ --sysconfdir=/etc \ --with-openssl \ --with-xz \ --with-zstd \ --with-zlib
Значение параметров настройки:
--with-openssl
Этот параметр позволяет Kmod обрабатывать сигнатуры PKCS7 для модулей ядра.
--with-xz
, --with-zlib
, и --with-zstd
Эти параметры позволяют Kmod обрабатывать сжатые модули ядра.
Скомпилируйте пакет:
make
Набору тестов этого пакета необходимы необработанные заголовочные файлы ядра (а не «очищенные», установленных ранее), это выходит за рамки LFS.
Установите пакет и создайте символические ссылки для совместимости с Module-Init-Tools (пакетом, который ранее обрабатывал модули ядра Linux):
make install for target in depmod insmod modinfo modprobe rmmod; do ln -sfv ../bin/kmod /usr/sbin/$target done ln -sfv kmod /usr/bin/lsmod
Создает файл зависимостей на основе символов найденных в существующем наборе модулей; этот файл используется программой modprobe для автоматической загрузки необходимых модулей |
|
Устанавливает загружаемый модуль в работающее ядро |
|
Загружает и выгружает модули ядра |
|
Список загруженных в данный момент модулей |
|
Проверяет объектный файл, связанный с модулем ядра, и отображает всю информацию, которую он смог собрать. |
|
Использует файл зависимостей, созданный depmod, для автоматической загрузки соответствующих модулей |
|
Выгружает модули из работающего ядра |
|
Библиотека используемая другими программами для загрузки и выгрузки модулей ядра |
Libelf — это библиотека для обработки файлов ELF (Executable and Linkable Format - формат исполняемых и связываемых файлов).
Libelf является частью пакета elfutils-0.190. Используйте elfutils-0.190.tar.bz2 в качестве исходного архива.
Подготовьте Libelf к компиляции:
./configure --prefix=/usr \ --disable-debuginfod \ --enable-libdebuginfod=dummy
Скомпилируйте пакет:
make
Чтобы протестировать пакет, выполните:
make check
Установите только Libelf:
make -C libelf install install -vm644 config/libelf.pc /usr/lib/pkgconfig rm /usr/lib/libelf.a
Библиотека Libffi предоставляет переносимый высокоуровневый программный интерфейс для различных соглашений о вызовах. Это позволяет программисту вызывать любую функцию, указанную в описании интерфейса вызова во время выполнения.
FFI расшифровывается как интерфейс внешних функций. FFI позволяет программе, написанной на одном языке, вызывать программу, написанную на другом языке. В частности, Libffi может обеспечить связь между интерпретатором, таким как Perl или Python, и подпрограммами общей библиотеки, написанными на C или C++.
Как и GMP, Libffi собирается с учетом оптимизаций,
специфичных для используемого процессора. При сборке для
другой системы измените значение параметра --with-gcc-arch=
в следующей
команде на имя архитектуры, полностью реализованной
процессором в этой системе. Если этого не сделать, все
приложения, ссылающиеся на libffi
, будут вызывать ошибку
«Illegal Operation
- недопустимая операция».
Подготовьте Libffi к компиляции:
./configure --prefix=/usr \ --disable-static \ --with-gcc-arch=native
Значение параметров configure:
--with-gcc-arch=native
Убедитесь, что GCC оптимизируется для текущей системы. Если значение не указано, то архитектура системы угадывается и сгенерированный код может быть неправильным. Если сгенерированный код будет скопирован из родной системы в менее мощную, используйте архитектуру менее мощной системы в качестве параметра. Дополнительные сведения об альтернативных типах систем смотрите в описании параметров x86 в руководстве GCC.
Скомпилируйте пакет:
make
Чтобы протестировать пакет, выполните:
make check
Установите пакет:
make install
Пакет Python 3 содержит среду разработчика Python. Его можно использовать для объектно-ориентированного программирования, написания скриптов, прототипирования больших программ и разработка целых приложений. Python — это интерпретируемый язык программирования.
Подготовьте Python к компиляции:
./configure --prefix=/usr \ --enable-shared \ --with-system-expat \ --enable-optimizations
Значение параметров настройки:
--with-system-expat
Этот параметр выполняет линковку с системной версией Expat.
--enable-optimizations
Этот параметр позволяет выполнить обширные, но отнимающие много времени, действия по оптимизации. Интерпретатор собирается дважды; тесты, выполненные при первой сборке, используются для улучшения финальной версии.
Скомпилируйте пакет:
make
Запускать тесты на этом этапе не рекомендуется. Известно, что тесты зависают на неопределенный срок в неполной среде LFS. При желании тесты можно запустить повторно в конце этой главы или при переустановке Python 3 в BLFS. Чтобы запустить тесты, выполните команду make test.
Установите пакет:
make install
В некоторых местах книги, мы используем команду pip3 для установки программ
и модулей Python 3 от имени пользователя root
. Это противоречит рекомендации
разработчиков Python: устанавливать пакеты в виртуальную
среду или домашний каталог обычного пользователя (путем
запуска pip3 от
имени этого пользователя). Поэтому всякий раз при
использовании pip3 от имени пользователя
root
появляется многострочное
предупреждение.
Основная причина этой рекомендации — избежать конфликта с системным менеджером пакетов (например, dpkg), но в LFS нет общесистемного менеджера пакетов, так что это не проблема. Кроме того, pip3 будет пытаться проверять наличие новой версии при каждом запуске. Поскольку разрешение доменных имен в среде chroot LFS еще не настроено, он не сможет проверить наличие новой версии и выдаст предупреждение.
Как только мы загрузим систему LFS и настроим сетевое подключение, pip3 выдаст предупреждение, сообщающее пользователю о необходимости обновить его с помощью предварительно собранного whl-файла в PyPI (всякий раз, когда будет доступна новая версия). Но LFS считает pip3 частью Python3, поэтому его не следует обновлять отдельно. Кроме того, обновление из whl-файла не соответствует цели проекта — собрать систему Linux из исходного кода, поэтому предупреждение о новой версии pip3 следует игнорировать. По желанию, вы можете отключить все предупреждение, создав следующий файл конфигурации:
cat > /etc/pip.conf << EOF
[global]
root-user-action = ignore
disable-pip-version-check = true
EOF
В LFS и BLFS мы собираем и устанавливаем модули Python с
помощью команды pip3. Убедитесь, что
команда pip3
install в обеих книгах запускаются от имени
пользователя root
(если
только она не для виртуальной среды Python). Запуск
pip3 install
от имени пользователя без полномочий root
может показаться нормальным, но
это приведет к тому, что установленный модуль будет
недоступен для других пользователей.
Команда pip3
install по умолчанию не приведёт к
автоматической переустановке уже установленного модуля.
Чтобы использовать команду pip3 install для
обновления модуля (например, с meson-0.61.3 до
meson-0.62.0), добавьте параметр --upgrade
в командную строку.
Если по какой-то причине необходимо понизить версию модуля
или переустановить ту же версию, используйте параметр
--force-reinstall
--no-deps
.
По желанию установите предварительно отформатированную документацию:
install -v -dm755 /usr/share/doc/python-3.12.2/html tar --no-same-owner \ -xvf ../python-3.12.2-docs-html.tar.bz2 cp -R --no-preserve=mode python-3.12.2-docs-html/* \ /usr/share/doc/python-3.12.2/html
Значение команд установки документации:
--no-same-owner
(tar) и --no-preserve=mode
(cp)
Параметры обеспечивают, что установленные файлы имеют корректные права и владельца файлов. Использование tar без этих параметров приведет к установке файлов с правами пользователя создавшего архив и файлы будут иметь ограниченные разрешения.
программа на Python, которая читает файлы написанные на Python 2.x, применяет к ним серию изменений и переводит их в валидный код Python 3.x. |
|
скрипт-обертка, который открывает графический редактор с поддержкой Python. Для запуска этого скрипта, перед установкой Python необходимо установить Tk, чтобы модуль Tkinter Python был собран. |
|
Установщик пакетов для Python. Вы можете использовать pip для установки пакетов из каталога PyPI (Python Package Index) и других источников. |
|
инструмент документации Python |
|
это интерпретатор для Python, интерпретируемый, интерактивный, объектно-ориентированный язык программирования |
Flit-core — это часть Flit, предназначенная для сборки дистрибутива (инструмента для упаковки простых модулей Python).
Соберите пакет:
pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD
Установите пакет:
pip3 install --no-index --no-user --find-links dist flit_core
Значение параметров конфигурации и команд pip3:
Эта команда создает архив wheel для этого пакета.
-w
dist
Указывает pip поместить созданный архив в каталог
dist
.
--no-cache-dir
Не позволяет pip копировать созданный wheel-пакет в
каталог /root/.cache/pip
.
Эта команда устанавливает пакет.
--no-build-isolation
,
--no-deps
и
--no-index
Эти параметры предотвращают получение файлов из онлайн-репозитория пакетов (PyPI). Если пакеты установлены в правильном порядке, то нет необходимости загружать какие-либо файлы; эти параметры усиливают безопасность в случае ошибки пользователя.
--find-links dist
Указывает pip искать архивы wheel в каталоге
dist
.
Wheel — это библиотека Python, которая является эталонной реализацией стандарта упаковки программ на языке Python.
Скомпилируйте Wheel с помощью следующей команды:
pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD
Установите Wheel:
pip3 install --no-index --find-links=dist wheel
Пакет Setuptools это инструмент, используемый для загрузки, сборки, установки, обновления и удаления пакетов Python.
Соберите пакет:
pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD
Установите пакет:
pip3 install --no-index --find-links dist setuptools
Ninja - небольшая система сборки ориентированная на скорость.
При запуске ninja обычно использует максимальное количество процессов параллельно. По умолчанию это количество ядер в системе плюс два. В некоторых случаях это может привести к перегреву процессора или нехватке памяти в системе. Когда ninja вызывается из командной строки, передача параметра -jN ограничит количество параллельных процессов. Некоторые пакеты встраивают выполнение ninja и параметр -j не передается.
Использование приведенной ниже необязательной процедуры позволяет пользователю ограничить количество параллельных процессов с помощью переменной окружения NINJAJOBS. Пример, настройки:
export NINJAJOBS=4
ограничит ninja четырьмя параллельными процессами.
По желанию, добавьте возможность использовать переменную окружения NINJAJOBS, выполнив следующую команду:
sed -i '/int Guess/a \ int j = 0;\ char* jobs = getenv( "NINJAJOBS" );\ if ( jobs != NULL ) j = atoi( jobs );\ if ( j > 0 ) return j;\ ' src/ninja.cc
Соберите Ninja с помощью команды:
python3 configure.py --bootstrap
Значение параметров сборки:
--bootstrap
Этот параметр перестраивает Ninja под текущую систему.
Чтобы протестировать пакет, выполните:
./ninja ninja_test ./ninja_test --gtest_filter=-SubprocessTest.SetWithLots
Установите пакет:
install -vm755 ninja /usr/bin/ install -vDm644 misc/bash-completion /usr/share/bash-completion/completions/ninja install -vDm644 misc/zsh-completion /usr/share/zsh/site-functions/_ninja
Meson — это система сборки с открытым исходным кодом, разработанная таким образом, чтобы быть очень быстрой и максимально удобной для пользователя.
Скомпилируйте Meson с помощью следующей команды:
pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD
Для набора тестов требуются некоторые пакеты, выходящие за рамки LFS.
Установите пакет:
pip3 install --no-index --find-links dist meson install -vDm644 data/shell-completions/bash/meson /usr/share/bash-completion/completions/meson install -vDm644 data/shell-completions/zsh/_meson /usr/share/zsh/site-functions/_meson
Значение параметров установки:
-w
dist
Помещает собранный wheels в каталог dist
.
--find-links dist
Устанавливает wheels из каталога dist
.
Пакет Coreutils содержит основные утилиты, необходимые каждой операционной системе.
Стандарт POSIX требует, чтобы программы пакета Coreutils правильно распознавали символы даже в случае, если используются многобайтовые локали. Следующий патч исправляет несоответствие этому требованию, а также другие ошибки, касающиеся интернационализации:
patch -Np1 -i ../coreutils-9.4-i18n-1.patch
В этом патче было обнаружено много ошибок. Сообщая о новых ошибках разработчикам Coreutils, сначала проверьте, воспроизводятся ли эти ошибки без этого исправления.
Исправьте уязвимость в утилите split:
sed -e '/n_out += n_hold/,+4 s|.*bufsize.*|//&|' \ -i src/split.c
Теперь подготовьте Coreutils к компиляции:
autoreconf -fiv FORCE_UNSAFE_CONFIGURE=1 ./configure \ --prefix=/usr \ --enable-no-install-program=kill,uptime
Значение параметров настройки:
Патч для интернационализации изменил систему сборки пакета, поэтому файлы конфигурации необходимо сгенерировать заново.
FORCE_UNSAFE_CONFIGURE=1
Эта переменная среды позволяет собрать пакет от имени
пользователя root
.
--enable-no-install-program=kill,uptime
Назначение этого параметра — запретить Coreutils устанавливать программы, которые будут установлены другими пакетами.
Скомпилируйте пакет:
make
Если вы не планируете запускать набор тестов, перейдите к разделу «Установка пакета».
Теперь набор тестов готов к запуску. Сначала запустите тесты,
предназначенные для запуска от имени пользователя
root
:
make NON_ROOT_USERNAME=tester check-root
Мы собираемся выполнить остальные тесты от имени пользователя
tester
. Некоторые тесты
требуют, чтобы пользователь был членом более чем одной
группы. Чтобы эти тесты не были пропущены, добавьте временную
группу и включите в неё пользователя tester
:
groupadd -g 102 dummy -U tester
Исправьте некоторые разрешения, чтобы пользователь без
полномочий root
мог
компилировать и запускать тесты:
chown -R tester .
Теперь запустите тесты:
su tester -c "PATH=$PATH make RUN_EXPENSIVE_TESTS=yes check"
Удалить временную группу:
groupdel dummy
Установите пакет:
make install
Переместите программы туда, где они должны быть в соответствие со спецификациями FHS:
mv -v /usr/bin/chroot /usr/sbin mv -v /usr/share/man/man1/chroot.1 /usr/share/man/man8/chroot.8 sed -i 's/"1"/"8"/' /usr/share/man/man8/chroot.8
Это команда /usr/bin/[, которая является синонимом команды test |
|
Кодирует и декодирует данные в соответствии со спецификацией base32 (RFC 4648) |
|
Кодирует и декодирует данные в соответствии со спецификацией base64 (RFC 4648) |
|
Выводит или проверяет контрольные суммы BLAKE2 (512-битные) |
|
Удаляет любой путь и заданный суффикс из имени файла |
|
Кодирует или декодирует данные с использованием различных алгоритмов |
|
Присоединяет файлы к стандартному выходному потоку |
|
Изменяет контекст безопасности для файлов и каталогов |
|
Изменяет владельцев группы для файлов и директорий |
|
Изменяет разрешения каждого файла на заданный режим; режим может быть либо символьным представлением вносимых изменений, либо восьмеричным числом, представляющим новые разрешения. |
|
Изменяет принадлежность файлов и директорий пользователю и/или группе |
|
Запускает команду с указанным каталогом в качестве
корневого каталога |
|
Выводит контрольную сумму Cyclic Redundancy Check (CRC) и количество байтов для каждого указанного файла. |
|
Сравнивает два отсортированных файла, выводя в три столбца уникальные и общие строки. |
|
Копирует файлы |
|
Разбивает заданный файл на несколько новых файлов, разделяя их в соответствии с заданными шаблонами или номерами строк и выводя количество байтов для каждого нового файла. |
|
Выдает участки строк, выбирая части в соответствии с заданными полями или позициями |
|
Отображает текущее дату и время в заданном формате или устанавливает системные дату и время |
|
Копирует файл, используя заданный размер блока и количество, при необходимости выполняя преобразования на нем. |
|
Сообщает объем доступного (и используемого) дискового пространства во всех смонтированных файловых системах или только в файловых системах, содержащих выбранные файлы. |
|
Выводит содержимое заданного каталога (так же, как команда ls) |
|
Выводит команды для установки переменной среды
|
|
Извлекает часть(части) каталога из заданного(заданных) имени(имён) |
|
Сообщает объем дискового пространства, используемого текущим каталогом, каждым из заданных каталогов (включая все подкаталоги) или каждым из заданных файлов. |
|
Отображает указанные строки |
|
Запускает команду в модифицированной среде окружения |
|
Конвертирует символы табуляции в пробелы |
|
Вычисляет выражения |
|
Выводит простые множители указанных целых чисел |
|
Ничего не делает, указывает на неудачу; всегда завершается с кодом состояния, указывающим на сбой |
|
Форматирует абзацы в указанных файлах |
|
Выполняет перенос строк в указанных файлах |
|
Сообщает о принадлежности пользователя к группам |
|
Выводит первые десять строк (или заданное количество строк) каждого заданного файла. |
|
Выводит числовой идентификатор хоста (в шестнадцатеричном формате) |
|
Выводит действующий идентификатор пользователя, идентификатор группы и принадлежность к группам для текущего или для указанного пользователя |
|
Копирует файлы, одновременно устанавливая для них права доступа, и, если возможно, устанавливая для них владельца и группу |
|
Объединяет строки, которые имеют идентичные объединяемые поля в двух различных файлах |
|
Создает жесткую ссылку (с указанным именем) на файл |
|
Создает жесткие или мягкие (символические) ссылки между файлами |
|
Сообщает имя входа текущего пользователя |
|
Выводит список содержимого для каждого заданного каталога |
|
Выводит или проверяет контрольные суммы Message Digest 5 (MD5) |
|
Создает директории с указанными именами |
|
Создает "именованный канал" "первым пришел — первым ушел" (FIFO), в нотации UNIX с заданными именами |
|
Создает узлы устройств с заданными именами; узел устройства представляет собой специальный символьный файл, специальный файл блока или FIFO. |
|
Создает временные файлы безопасным способом; используется в скриптах |
|
Перемещает или переименовывает файлы или каталоги |
|
Запускает программу с измененным приоритетом исполнения |
|
Нумерует строки в указанных файлах |
|
Запускает команду, невосприимчивую к зависаниям, а ее вывод перенаправляется в файл журнала |
|
Выводит количество дочерних процессов, доступных для процесса. |
|
Преобразует числа в или из удобочитаемых строк |
|
Вывод дампа файла в восьмеричном и других форматах |
|
Объединяет указанные файлы, последовательно соединяя соответствующие строки рядом друг с другом, разделенные символами табуляции. |
|
Проверяет, являются ли имена файлов допустимыми или переносимыми |
|
Легковесный клиент типа finger; выдает некоторую информацию о заданных пользователях |
|
Разбивает файлы для печати на страницы и столбцы |
|
Выдает значения переменных окружения |
|
Выводит аргументы в соответствии с заданным форматом, подобно функции C printf. |
|
Создает перестановочный индекс по содержимому указанных файлов с каждым ключевым словом в своем контексте |
|
Сообщает имя текущего рабочего каталога |
|
Выдает значение указанной символической ссылки |
|
Возвращает приведенное к обычному виду полное имя файла |
|
Удаляет файлы или каталоги |
|
Удаляет каталоги, если они пусты |
|
Запускает команду с указанным контекстом безопасности |
|
Выдает последовательность чисел из указанного диапазона с указанным значением приращения |
|
Выводит или проверяет контрольные суммы 160-битного алгоритма безопасного хеширования 1 (SHA1) |
|
Выводит или проверяет контрольные суммы 224-битного алгоритма безопасного хеширования |
|
Выводит или проверяет контрольные суммы 256-битного алгоритма безопасного хеширования |
|
Выводит или проверяет контрольные суммы 384-битного алгоритма безопасного хеширования |
|
Выводит или проверяет контрольные суммы 512-битного алгоритма безопасного хеширования |
|
Многократно перезаписывает заданные файлы сложными шаблонами, что затрудняет восстановление данных. |
|
Перемешивает строки текста |
|
Делает паузу на заданный промежуток времени |
|
Сортирует строки в указанных файлах |
|
Разбивает заданный файл на несколько частей в соответствии с указанным размером или количеством строк |
|
Отображает статус файла или файловой системы |
|
Запускает команды с измененными операциями буферизации для своих стандартных потоков. |
|
Устанавливает или сообщает настройки терминала |
|
Выводит контрольную сумму и количество блоков для каждого заданного файла |
|
Сбрасывает буферы файловой системы; он принудительно записывает измененные блоки на диск и обновляет суперблок |
|
Конкатенация содержимого указанных файлов в обратном порядке |
|
Выводит последние десять строк (или заданное количество строк) каждого указанного файла |
|
Считывает данные со стандартного потока ввода, записывает как в стандартный вывод, так и в указанные файлы |
|
Сравнивает значения и проверяет типы файловs |
|
Запускает команду с ограничением по времени |
|
Изменяет временные метки файлов, устанавливая время доступа и модификации данных файлов на текущее время; несуществующие файлы создаются с нулевой длиной |
|
Переводит, сжимает и удаляет заданные символы из стандартного потока |
|
Ничего не делает, указывает на успешное выполнение операции; он всегда завершается с кодом состояния, указывающим на успех |
|
Сжимает или расширяет файл до указанного размера |
|
Выполняет топологическую сортировку; записывает полностью упорядоченный список в соответствии с частичным упорядочением в данном файле |
|
Сообщает имя файла терминала, подключенного к стандартному вводу. |
|
Сообщает системную информацию |
|
Преобразует пробелы в табуляции |
|
Удаляет все повторяющиеся копии уже имеющихся строк, кроме одной |
|
Удаляет указанный файл |
|
Сообщает имена пользователей, вошедших в систему в данный момент |
|
То же, что ls -l |
|
Сообщает количество строк, слов и байт для каждого заданного файла, а также общее количество строк, если указано более одного файла |
|
Сообщает, кто вошел в систему |
|
Сообщает имя пользователя, соответствующее идентификатору текущего пользователя |
|
Повторно выводит |
|
Библиотека, используемая командой stdbuf |
Check - это фреймворк модульного тестирования для языка C.
Подготовить Check к компиляции:
./configure --prefix=/usr --disable-static
Соберите пакет:
make
Когда компиляция будет завершена, запустите набор тестов:
make check
Установите пакет:
make docdir=/usr/share/doc/check-0.15.2 install
Пакет Diffutils содержит программы, которые показывают различия между файлами или каталогами.
Подготовьте Diffutils к компиляции:
./configure --prefix=/usr
Скомпилируйте пакет:
make
Чтобы протестровать пакет, выполните:
make check
Установите пакет:
make install
Пакет Gawk содержит программы для работы с текстовыми файлами.
Во-первых, отредактируйте Makefile, чтобы некоторые ненужные файлы не были установлены
sed -i 's/extras//' Makefile.in
Подготовьте Gawk к компиляции:
./configure --prefix=/usr
Скомпилируйте пакет:
make
Чтобы протестировать пакет, выполните:
chown -R tester . su tester -c "PATH=$PATH make check"
Установите пакет:
rm -f /usr/bin/gawk-5.3.0 make install
Значение команды:
Система сборки не будет пересоздавать жесткую ссылку
gawk-5.3.0
, если она
существует. Удалите её, чтобы гарантировать, что
предыдущая жесткая ссылка, созданная в Раздел 6.9, «Gawk-5.3.0»,
будет обновлена.
В процессе установки уже создан awk в виде символической ссылки на gawk, создайте также символическую ссылку на справочную страницу:
ln -sv gawk.1 /usr/share/man/man1/awk.1
По желанию, установите документацию:
mkdir -pv /usr/share/doc/gawk-5.3.0 cp -v doc/{awkforai.txt,*.{eps,pdf,jpg}} /usr/share/doc/gawk-5.3.0
Пакет Findutils содержит программы для поиска файлов. Эти программы предназначены для поиска по всем файлам в дереве каталогов, а также для создания, обслуживания и поиска в базе данных (часто быстрее, чем рекурсивный поиск, но ненадежно, если база данных давно не обновлялась).Findutils также предоставляет программу xargs, которую можно использовать для запуска указанной команды для каждого файла, выбранного при поиске.
Подготовьте Findutils к компиляции:
./configure --prefix=/usr --localstatedir=/var/lib/locate
Значение параметров настройки:
--localstatedir
Этот параметр перемещает базу данных команды
locate в
/var/lib/locate
, что
соответствует расположению, совместимому со стандартом
FHS.
Скомпилируйте пакет:
make
Чтобы протестировать пакет, выполните:
chown -R tester . su tester -c "PATH=$PATH make check"
Установите пакет:
make install
Выполняет поиск в заданных каталогах файлов, соответствующих критериям |
|
Выполняет поиск по базе данных имен файлов и сообщает об именах, которые содержат заданную строку или соответствуют заданному шаблону. |
|
Обновляет базу данных locate; сканирует всю файловую систему (включая другие файловые системы, которые в настоящее время смонтированы, если не указано иное) и записывает найденные имена файлов в базу данных |
|
Может использоваться для применения заданной команды к списку файлов |
Пакет Groff содержит программы для обработки и форматирования текста и изображений.
Groff ожидает, что переменная окружения PAGE
будет содержать размер бумаги по
умолчанию. Для пользователей из США подходит PAGE=letter
. Для других стран
больше подойдет PAGE=A4
. Хотя формат бумаги по
умолчанию настраивается во время компиляции, его можно
переопределить позже, записав «A4» или
«letter» в файл /etc/papersize
.
Подготовьте Groff к компиляции:
PAGE=<paper_size>
./configure --prefix=/usr
Соберите пакет:
make
Чтобы протестировать пакет, выполните:
make check
Установите пакет:
make install
Читает файл шрифта troff и добавляет некоторую дополнительную информацию о метрике шрифта, используемую системой groff. |
|
Создаёт файл шрифта для использования с groff и grops |
|
Препроцессор Groff для создания диаграмм химических структур |
|
Компилирует описания уравнений, имеющихся внутри входных файлов troff, которые понятны troff |
|
Преобразует a troff EQN (уравнение) во фрагмент изображения |
|
Отображает различия между файлами groff/nroff/troff |
|
Преобразует ноты, записанные на языке lilypond в язык groff |
|
Препроцессор для groff, позволяющий вставлять код perl в файлы groff |
|
Препроцессор groff, позволяющий вставлять Pinyin (запись звуков китайского языка с помощью латинского алфавита) в файлы groff. |
|
Преобразует диаграммы grap во фрагмент растрового изображения (grap - это старый язык программирования Unix для создания диаграмм) |
|
Препроцессор groff для файлов gremlin |
|
Драйвер для groff, создающий выходные файлы в формате TeX dvi |
|
Внешний интерфейс к системе форматирования документов groff; обычно он запускает программу troff и постпроцессор, соответствующий выбранному устройству |
|
Отображает файлы groff и справочные страницы на терминалах X и tty |
|
Читает файлы и пытается определить, какие из
параметров groff
|
|
Драйвер groff для принтеров Canon CAPSL (лазерные принтеры серий LBP-4 и LBP-8) |
|
Драйвер для groff который выводит результат в формате PCL5, подходящем для принтера HP LaserJet 4 |
|
Переводит выходные данные GNU troff в формат PDF |
|
Переводит выходные данные GNU troff в формат PostScript |
|
Переводит вывод GNU troff в форму, подходящую для устройств, подобных пишущим машинкам. |
|
Создает файл шрифта для использования с groff -Tlj4 из файла метрик шрифта для HP |
|
Создает инвертированный индекс для библиографических баз данных для указанного файла, используемый с refer, lookbib, и lkbib |
|
Выполняет поиск в библиографических базах данных ссылок, содержащих указанные ключи, и сообщает о любых найденных ссылках |
|
Выводит приглашение при наличии стандартной ошибки (если устройство стандартного ввода не является терминалом), читает из устройства стандартного ввода строку, в которой находится набор ключевых слов, ищет в библиографической базе данных для указанного файла ссылки, содержащие эти ключевые слова, выводит все ссылки, найденные в стандартном выводе и повторяет этот процесс до тех пор, пока не завершится входной поток |
|
Простой препроцессор для groff |
|
Форматирует уравнения для их вывода в формате American Standard Code for Information Interchange (ASCII) |
|
Скрипт, который эмулирует команду nroff с помощью groff |
|
Это обертка над groff которая упрощает создание PDF-документов из файлов, отформатированных с помощью макросов mom. |
|
Создает pdf-документы с помощью groff |
|
Преобразует шрифт PostScript в формате |
|
Компилирует описания изображений, вставленных во входные файлы troff или TeX, в команды, понятные TeX или troff |
|
Преобразует диаграмму PIC во фрагмент изображения |
|
Переводит выходной поток GNU troff в HTML |
|
Преобразует кодировку входных файлов в формат, понимаемый GNU troff |
|
Переводит выходной поток GNU troff в HTML |
|
Копирует содержимое файла в стандартный вывод, кроме тех символов, которые расположены между .[ и .] и интерпретируются как цитаты, и кроме строк между .R1 и .R2, которые интерпретируются как команды, указывающие как цитаты должны быть обработаны |
|
Преобразует файлы roff в формат DVI |
|
Преобразует файлы roff в формат HTML |
|
Преобразует файлы roff в формат PDF |
|
Преобразует файлы roff в файлы ps |
|
Преобразует файлы roff в текстовые файлы |
|
Преобразует файлы roff в другие форматы |
|
Читает файлы и заменяет строки вида .so file содержимым указанного файла file |
|
Компилирует описания таблиц, вставленные во входные файлы troff, в команды, понимаемые troff |
|
Создает файл шрифта для использования с groff -Tdvi |
|
Полностью совместим с Unix troff; его следует вызывать с помощью команды groff, которая также будет запускать препроцессоры и постпроцессоры в соответствующем порядке и с соответствующими параметрами |
Пакет GRUB содержит загрузчик операционной системы от проекта GNU (GRand Unified Bootloader).
Если ваша система поддерживает UEFI и вы хотите загрузить LFS с UEFI, вы можете пропустить установку этого пакета в LFS и установить GRUB с поддержкой UEFI (и его зависимости), следуя инструкции из BLFS.
Сбросьте переменные окружения, которые могут повлиять на сборку:
unset {C,CPP,CXX,LD}FLAGS
Не пытайтесь «настраивать» этот пакет с помощью пользовательских флагов компиляции. Этот пакет является загрузчиком. Низкоуровневые операции в исходном коде могут быть нарушены из-за агрессивной оптимизации.
Добавьте файл, отсутствующий в архиве релиза:
echo depends bli part_gpt
> grub-core/extra_deps.lst
Подготовьте GRUB к компиляции:
./configure --prefix=/usr \ --sysconfdir=/etc \ --disable-efiemu \ --disable-werror
Значение новых параметров настройки:
--disable-werror
Этот параметр позволяет завершить сборку с предупреждениями, появившимися в более поздних версиях Flex.
--disable-efiemu
Этот параметр запрещает установку компонента, отключает функции и некоторые программы тестирования, которые не нужны для LFS.
Скомпилируйте пакет:
make
Запуск набора тестов не рекомендуется. Большинство тестов зависят от пакетов, недоступных в ограниченной среде LFS. Если вы все равно хотите запустить тесты, выполните make check.
Установите пакет:
make install mv -v /etc/bash_completion.d/grub /usr/share/bash-completion/completions
Создание загружаемой системы LFS с помощью GRUB будет обсуждаться в Раздел 10.4, «Использование GRUB для настройки процесса загрузки».
Вспомогательная программа для grub-install |
|
Инструмент для редактирования блока окружения (environment block) |
|
Проверяет, относится ли данный файл к указанному типу |
|
Инструмент для отладки драйвера файловой системы |
|
Объединяет 32-разрядные и 64-разрядные бинарные файлы в один файл (для компьютеров Apple) |
|
Устанавливает GRUB на ваш диск |
|
Скрипт, который преобразует макет xkb в макет, распознаваемый GRUB |
|
Это аналог bless в стиле Mac для файловых систем HFS или HFS+ (команда bless характерна для компьютеров Apple; она делает устройство загрузочным) |
|
Преобразует GRUB Legacy |
|
Генерирует файл |
|
Создаёт загрузочный образ GRUB |
|
Создаёт файл раскладки клавиатуры GRUB |
|
Подготавливает сетевой загрузочный каталог GRUB |
|
Генерирует зашифрованный пароль PBKDF2 для использования в меню загрузки |
|
Создает имена системных путей относительно корня |
|
Создает загрузочный образ GRUB, подходящий для дискеты, CDROM/DVD или USB-накопителя |
|
Генерирует автономный образ |
|
Вспомогательная программа, которая выводит путь к устройству GRUB |
|
Проверяет информацию об устройстве для заданного пути или устройства |
|
Устанавливает пункт меню в GRUB для загрузки по умолчанию, только для следующей загрузки(однократно) |
|
Отображает .disk_label для компьютеров Apple Mac |
|
Проверяет скрипт настройки GRUB на наличие синтаксических ошибок |
|
Устанавливает для GRUB загрузочную запись по умолчанию |
|
Вспомогательная программа для grub-setup |
|
Преобразует файл конфигурации syslinux в формат grub.cfg |
Пакет Gzip содержит программы для сжатия и распаковки файлов.
Подготовьте Gzip к компиляции:
./configure --prefix=/usr
Скомпилируйте пакет:
make
Чтобы протестировать пакет, выполните:
make check
Установите пакет:
make install
Распаковывает gzip-файлы |
|
Создает самораспаковывающиеся исполняемые файлы |
|
Сжимает файлы, используя алгоритм Lempel-Ziv (LZ77). |
|
Распаковывает сжатые файлы |
|
Распаковывает указанные сжатые файлы в стандартный поток вывода |
|
Запускает cmp для архивированных файлов |
|
Запускает diff для архивированных файлов |
|
Запускает egrep для архивированных файлов |
|
Запускает fgrep для архивированных файлов |
|
Принудительно устанавливает расширение |
|
Запускает grep для архивированных файлов |
|
Запускает less для архивированных файлов |
|
Запускает more для архивированных файлов |
|
Повторно сжимает файлы из формата compress в формат
gzip
— из |
Пакет IPRoute2 содержит набор программ для базового и расширенного администрирования сетей IPv4.
Программа arpd, входящая в этот пакет, не будет собрана, поскольку зависит от Berkeley DB, которая не установлена в LFS. Однако каталог и справочная страница для arpd все равно будут установлены. Предотвратить это можно, выполнив приведенные ниже команды.
sed -i /ARPD/d Makefile rm -fv man/man8/arpd.8
Скомпилируйте пакет:
make NETNS_RUN_DIR=/run/netns
Этот пакет не содержит рабочего набора тестов.
Установите пакет:
make SBINDIR=/usr/sbin install
По желанию, установите документацию:
mkdir -pv /usr/share/doc/iproute2-6.7.0 cp -v COPYING README* /usr/share/doc/iproute2-6.7.0
Настраивает сетевые мосты |
|
Утилита состояния подключения |
|
Универсальный интерфейс утилиты netlink |
|
Показывает статистику интерфейса, включая количество переданных и полученных пакетов по интерфейсам. |
|
Основной исполняемый файл. Он имеет несколько различных функций, в том числе эти:
ip link ip addr позволяет пользователям просматривать адреса и их свойства, добавлять новые адреса и удалять старые ip neighbor позволяет пользователям просматривать связи с соседями и их свойства, добавлять новые записи и удалять старые ip rule позволяет пользователям просматривать политики маршрутизации и изменять их ip route позволяет пользователям просматривать таблицу маршрутизации и изменять правила таблицы маршрутизации ip tunnel позволяет пользователям просматривать IP-туннели и их свойства, а также изменять их ip maddr позволяет пользователям просматривать multicast адреса и их свойства и изменять их ip mroute позволяет пользователям устанавливать, изменять или удалять multicast маршрутизацию. ip monitor позволяет пользователям постоянно отслеживать состояние устройств, адресов и маршрутов |
|
Предоставляет сетевую статистику Linux; это обобщенная и более полнофункциональная замена старой программы rtstat |
|
Отображает сетевую статистику |
|
Компонент ip route для просмотра таблиц маршрутизации |
|
Отображает содержимое |
|
Мониторит изменения таблицы маршрутизации |
|
Преобразует вывод ip -o в удобочитаемую форму |
|
Утилита состояния маршрута |
|
Аналогично команде netstat показывает активные соединения |
|
Управление трафиком для реализаций качества обслуживания (QoS) и класса обслуживания (CoS) tc qdisc позволяет пользователям настроить дисциплину обработки очередей tc class позволяет пользователям настраивать классы, на основе планирования дисциплины обработки очередей tc filter позволяет пользователям настроить фильтрацию пакетов QOS/COS tc monitor может использоваться для просмотра изменений, внесенных в управление трафиком в ядре |
Пакет Kbd содержит файлы таблиц клавиш, консольные шрифты и утилиты клавиатуры.
Поведение клавиш backspace и delete не согласуется между раскладками в пакете Kbd. Следующий патч исправляет эту проблему для раскладок i386:
patch -Np1 -i ../kbd-2.6.4-backspace-1.patch
После исправления клавиша backspace генерирует символ с кодом 127, а клавиша delete генерирует хорошо известную escape-последовательность.
Удалите ненужную программу resizecons (она требуется несуществующей svgalib для предоставления файлов видеорежима — для нормального использования setfont, который правильно определяет размеры консоли) вместе с ее справочной страницей.
sed -i '/RESIZECONS_PROGS=/s/yes/no/' configure sed -i 's/resizecons.8 //' docs/man/man8/Makefile.in
Подготовьте Kbd для компиляции:
./configure --prefix=/usr --disable-vlock
Значение параметра configure:
--disable-vlock
Этот параметр предотвращает сборку утилиты vlock, поскольку для неё требуется библиотека PAM, которая недоступна в среде chroot.
Скомпилируйте пакет:
make
Чтобы протестировать пакет, выполните:
make check
Установите пакет:
make install
Для некоторых языков (например белорусского) пакет Kbd не предоставляет подходящую раскладку, штатная раскладка «by» предполагает кодировку ISO-8859-5, а обычно используется раскладка CP1251. Пользователи таких языков должны отдельно загрузить рабочую раскладку.
По желанию, установите документацию::
cp -R -v docs/doc -T /usr/share/doc/kbd-2.6.4
Изменяет используемый виртуальный терминал |
|
Освобождает неиспользуемые виртуальные терминалы |
|
Создает дамп таблиц перевода клавиатуры |
|
Выводит номер активного виртуального терминала |
|
Выводит таблицу ядра соответствия сканкода и кода клавиши |
|
Получает информацию о состоянии консоли |
|
Выводит или устанавливает режим клавиатуры |
|
Устанавливает частоту повторных нажатий клавиш и задержки клавиатуры |
|
Загружает таблицу преобразования клавиатуры |
|
Загружает таблицу ядра отображения символов юникода |
|
Устаревшая программа, которая использовалась для загрузки определяемой пользователем таблицы соответствия выводимых символов в драйвер консоли; теперь эту функцию выполняет setfont |
|
Запускает программу на новом виртуальном терминале (VT) |
|
Добавляет таблицу символов Unicode в консольный шрифт. |
|
Извлекает встроенную таблицу символов Unicode из консольного шрифта. |
|
Удаляет встроенную таблицу символов Unicode из консольного шрифта. |
|
Обрабатывает таблицы символов Unicode для консольных шрифтов. |
|
Изменяет шрифты Enhanced Graphic Adapter (EGA) и Video Graphics Array (VGA), используемые в консоли |
|
Загружает таблицу соответствия сканкодов ядра и кодов клавиш; это удобно, если на клавиатуре есть нестандартные клавиши |
|
Устанавливает значения флагов клавиатуры и индикаторов (обычно - светодиоды) |
|
Определяет обработку метаклавиши на клавиатуре (обычно, это клавиша Win) |
|
Устанавливает цветовую схему консоли для всех виртуальных терминалов |
|
Показывает текущий шрифт экрана консоли EGA/VGA |
|
Показывает сканкоды, код клавиши и код ASCII для клавиш, нажатых на клавиатуре |
|
Переводит клавиатуру и консоль в режим UNICODE. [Не используйте эту программу, если вы не используете файл раскладки для кодировки ISO-8859-1. Для других кодировок эта утилита выдает неправильные результаты]. |
|
Возвращает клавиатуру и консоль из режима UNICODE |
Пакет Libpipeline содержит библиотеку для гибкого и удобного управления подпроцессами.
Подготовьте Libpipeline к компиляции:
./configure --prefix=/usr
Скомпилируйте пакет:
make
Чтобы протестировать пакет, выполните:
make check
Установите пакет:
make install
Пакет Make содержит программу, управляющую генерацией исполняемых и других файлов, из исходного кода.
Подготовьте Make к компиляции:
./configure --prefix=/usr
Скомпилируйте пакет:
make
Чтобы протестировать пакет, выполните:
chown -R tester . su tester -c "PATH=$PATH make check"
Установите пакет:
make install
Пакет Patch содержит программу для изменения или создания файлов путём наложение «патча», обычно, создаваемого программой diff.
Подготовьте Patch к компиляции:
./configure --prefix=/usr
Скомпилируйте пакет:
make
Чтобы протестировать пакет, выполните:
make check
Установите пакет:
make install
Пакет Tar предоставляет возможность создавать tar архивы, а также производить с ними различные манипуляции. Tar может распаковать предварительно созданный архив, добавить или обновить файлы в нём, вернуть список файлов в архиве.
Подготовьте Tar к компиляции:
FORCE_UNSAFE_CONFIGURE=1 \ ./configure --prefix=/usr
Значение параметра configure:
FORCE_UNSAFE_CONFIGURE=1
Этот параметр принудительно запускает тест для
mknod
от имени
пользователя root
.
Обычно считается опасным запускать этот тест от имени
пользователя root
, но,
поскольку он выполняется в системе, которая была
собрана лишь частично, его переопределение допустимо.
Скомпилируйте пакет:
make
Чтобы протестировать пакет, выполните:
make check
Известно, что один тест, capabilities: binary store/restore, завершается ошибкой при запуске, потому что в LFS отсутствует selinux, он будет пропущен, если ядро хоста не поддерживает расширенные атрибуты или метки безопасности файловой системы, используемой для сборки LFS.
Установите пакет:
make install make -C doc install-html docdir=/usr/share/doc/tar-1.35
Пакет Texinfo содержит программы для чтения, записи и преобразования информационных страниц.
Подготовьте Texinfo к компиляции:
./configure --prefix=/usr
Скомпилируйте пакет:
make
Чтобы протестировать пакет, выполните:
make check
Установите пакет:
make install
По желанию установите компоненты, входящие в пакет TeX::
make TEXMF=/usr/share/texmf install-tex
Значение параметра make:
TEXMF=/usr/share/texmf
Переменная makefile TEXMF
содержит расположение корня дерева TeX, это
понадобится, если, например, пакет TeX планируется
установить позже.
Система документации использует простой текстовый файл для
хранения списка пунктов меню. Файл находится в /usr/share/info/dir
. К сожалению, из-за
случайных проблем в Makefile различных пакетов он иногда
может не синхронизироваться с информационными страницами,
установленными в системе. Если когда-либо потребуется
пересоздать файл /usr/share/info/dir
, следующие
необязательные команды решают эту задачу:
pushd /usr/share/info rm -v dir for f in * do install-info $f dir 2>/dev/null done popd
Используется для чтения информационных страниц, которые похожи на справочные страницы, но гораздо подробнее описывают применение всех доступных параметров командной строки [Например, сравните man bison и info bison.] |
|
Используется для установки информационных страниц; он обновляет записи в индексном файле команды info |
|
Переводит исходные документы Texinfo в информационные страницы, обычный текст или HTML. |
|
Используется для форматирования документа Texinfo в файл Portable Document Format (PDF). |
|
Преобразует Pod в формат Texinfo |
|
Переводит исходную документацию Texinfo в различные другие форматы. |
|
Используется для форматирования документа Texinfo в независимый от устройства файл, который можно распечатать |
|
Используется для форматирования данного документа Texinfo в файл Portable Document Format (PDF). |
|
Используется для сортировки индексных файлов Texinfo. |
Пакет Vim содержит мощный текстовый редактор.
.Если вы предпочитаете другой текстовый редактор, например, Emacs, Joe или Nano, обратитесь к https://mirror.linuxfromscratch.ru/blfs/view/12.1/postlfs/editors.html за рекомендациями по установке.
Во-первых, измените расположение файла конфигурации
vimrc
на /etc
:
echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h
Подготовьте Vim к компиляции:
./configure --prefix=/usr
Скомпилируйте пакет:
make
Чтобы подготовить тесты, убедитесь, что пользователь
tester
может писать в
исходное дерево:
chown -R tester .
Теперь запустите тесты от имени пользователя tester
:
su tester -c "TERM=xterm-256color LANG=en_US.UTF-8 make -j1 test" \ &> vim-test.log
Набор тестов выводит на экран много двоичных данных. Это
может вызвать проблемы с настройками текущего терминала
(особенно, когда мы переопределяем переменную TERM
, чтобы удовлетворить некоторые требования
набора тестов). Чтобы этого избежать, перенаправьте вывод в
файл журнала, как показано выше. Тест пройден успешно, если
лог по завершении содержит текст: ALL DONE
.
Установите пакет:
make install
Многие пользователи рефлекторно набирают vi вместо vim. Чтобы разрешить выполнение vim, когда пользователи вводят vi, создайте символическую ссылку как для двоичного файла, так и для справочной страницы:
ln -sv vim /usr/bin/vi for L in /usr/share/man/{,*/}man1/vim.1; do ln -sv vim.1 $(dirname $L)/vi.1 done
По умолчанию документация Vim установливается в каталог
/usr/share/vim
. Следующая
символическая ссылка позволяет получить доступ к документации
через каталог /usr/share/doc/vim-9.1.0041
, что
согласуется с расположением документации остальных пакетов:
ln -sv ../vim/vim91/doc /usr/share/doc/vim-9.1.0041
Если в LFS будет установлена система X Window, может потребоваться перекомпилировать Vim после установки X. Vim поставляется с графической версией редактора, для которой требуется установка X и некоторых дополнительных библиотек. Для получения дополнительной информации об этом процессе обратитесь к документации по Vim и странице установки Vim в книге BLFS по адресу https://mirror.linuxfromscratch.ru/blfs/view/12.1/postlfs/vim.html.
По умолчанию vim работает в режиме, несовместимом с vi. Это может показаться необычным для пользователей, которые в прошлом использовали другие редакторы. Параметр «nocompatible» включен ниже, чтобы подчеркнуть тот факт, что используется новое поведение. Настройка также напоминает тем, кто хотел бы перейти в режим «compatible», что параметр должен быть первым в файле конфигурации. Это необходимо, потому что изменяются другие параметры, и переопределения происходят после этой настройки. Создайте файл конфигурации vim по умолчанию, выполнив следующие действия:
cat > /etc/vimrc << "EOF"
" Begin /etc/vimrc
" Ensure defaults are set before customizing settings, not after
source $VIMRUNTIME/defaults.vim
let skip_defaults_vim=1
set nocompatible
set backspace=2
set mouse=
syntax on
if (&term == "xterm") || (&term == "putty")
set background=dark
endif
" End /etc/vimrc
EOF
Параметр set
nocompatible
заставляет vim вести себя более
правильно (по умолчанию), чем vi-совместимый способ. Удалите
«no»,
чтобы сохранить старое поведение vi. Параметр set backspace=2
позволяет
удалять символы через перенос строки, автоматические отступы
и начало вставки. Параметр syntax
on
включает подсветку синтаксиса vim. Параметр
set mouse=
позволяет
правильно вставлять текст с помощью мыши при работе в chroot
или через удаленное соединение. Наконец, оператор
if с параметром
set background=dark
корректирует предположение vim о цвете фона некоторых
эмуляторов терминала. Это придает подсветке лучшую цветовую
схему для использования на черном фоне этих программ.
Документацию по другим доступным параметрам можно получить, выполнив следующую команду:
vim -c ':options'
По умолчанию vim устанавливает файлы проверки орфографии
только для английского языка. Для установки файлов проверки
орфографии других языков, скопируйте файлы .spl
и, при необходимости, .sug
для вашего языка и кодировки
символов из runtime/spell
,
сохраните их в /usr/share/vim/vim91/spell/
.
Чтобы использовать эти файлы проверки орфографии,
необходимо указать параметры для vim в файле /etc/vimrc
, пример:
set spelllang=en,ru
set spell
Дополнительные сведения смотрите в файле runtime/spell/README.txt
.
Запускает vim в режиме ex |
|
Это ограниченная версия view; никакие команды оболочки не могут быть запущены, и view не может быть приостановлен |
|
Это ограниченная версия vim; никакие команды оболочки не могут быть запущены, и vim не может быть приостановлен |
|
Ссылка на vim |
|
Запускает vim в режиме только для чтения |
|
Сам редактор |
|
Редактирует две или три версии файла с помощью vim и показывает различия |
|
Обучает основным горячим клавишам и командам vim |
|
Создает шестнадцатеричный дамп данного файла; он также может выполнять обратную операцию, поэтому его можно использовать для бинарных патчей |
MarkupSafe — это модуль Python, реализующий безопасное использование строк в языках разметки XML/HTML/XHTML
Скомпилируйте MarkupSafe с помощью следующей команды:
pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD
С этим пакетом не поставляется тестов.
Установите пакет:
pip3 install --no-index --no-user --find-links dist Markupsafe
Jinja2 - это модуль Python, который реализует простой язык шаблонов pythonic
Соберите пакет:
pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD
Установите пакет:
pip3 install --no-index --no-user --find-links dist Jinja2
Пакет Udev содержит программы для динамического создания узлов устройств.
Udev является частью пакета systemd-255. Используйте файл systemd-255.tar.xz в качестве исходного архива.
Удалите две ненужные группы render
и sgx
, из правил udev по умолчанию:
sed -i -e 's/GROUP="render"/GROUP="video"/' \ -e 's/GROUP="sgx", //' rules.d/50-udev-default.rules.in
Удалите одно правило udev, требующее полной установки Systemd:
sed '/systemd-sysctl/s/^/#/' -i rules.d/99-systemd.rules.in
Измените жестко заданные пути к файлам конфигурации сети для автономной установки udev:
sed '/NETWORK_DIRS/s/systemd/udev/' -i src/basic/path-lookup.h
Подготовьте Udev к компиляции:
mkdir -p build cd build meson setup \ --prefix=/usr \ --buildtype=release \ -Dmode=release \ -Ddev-kvm-mode=0660 \ -Dlink-udev-shared=false \ -Dlogind=false \ -Dvconsole=false \ ..
Значение параметров meson:
--buildtype=release
Этот параметр переопределяет тип сборки по умолчанию («debug»), который создает неоптимизированные двоичные файлы.
-Dmode=release
Отключает некоторые функции, которые разработчики считают экспериментальными.
-Ddev-kvm-mode=0660
По умолчанию правило udev разрешает всем пользователям
доступ к /dev/kvm
.
Редакторы LFS считают это опасным. Данная опция
переопределяет разрешение по умолчанию.
-Dlink-udev-shared=false
Эта опция запрещает udev связываться с внутренней общей
библиотекой systemd libsystemd-shared
. Эта библиотека
предназначена для совместного использования многими
компонентами Systemd, и ее использование избыточно,
когда установлен только udev.
-Dlogind=false
-Dvconsole=false
Эти параметры предотвращают создание нескольких файлов правил udev, принадлежащих другим компонентам Systemd, которые мы не будем устанавливать.
Получите список предоставляемых udev helpers и сохраните его в переменной (экспортировать его не обязательно, но это упрощает сборку от имени обычного пользователя или при использовании менеджера пакетов):
export udev_helpers=$(grep "'name' :" ../src/udev/meson.build | \ awk '{print $3}' | tr -d ",'" | grep -v 'udevadm')
Соберите только компоненты, необходимые для udev:
ninja udevadm systemd-hwdb \ $(ninja -n | grep -Eo '(src/(lib)?udev|rules.d|hwdb.d)/[^ ]*') \ $(realpath libudev.so --relative-to .) \ $udev_helpers
Установите пакет:
install -vm755 -d {/usr/lib,/etc}/udev/{hwdb.d,rules.d,network} install -vm755 -d /usr/{lib,share}/pkgconfig install -vm755 udevadm /usr/bin/ install -vm755 systemd-hwdb /usr/bin/udev-hwdb ln -svfn ../bin/udevadm /usr/sbin/udevd cp -av libudev.so{,*[0-9]} /usr/lib/ install -vm644 ../src/libudev/libudev.h /usr/include/ install -vm644 src/libudev/*.pc /usr/lib/pkgconfig/ install -vm644 src/udev/*.pc /usr/share/pkgconfig/ install -vm644 ../src/udev/udev.conf /etc/udev/ install -vm644 rules.d/* ../rules.d/README /usr/lib/udev/rules.d/ install -vm644 $(find ../rules.d/*.rules \ -not -name '*power-switch*') /usr/lib/udev/rules.d/ install -vm644 hwdb.d/* ../hwdb.d/{*.hwdb,README} /usr/lib/udev/hwdb.d/ install -vm755 $udev_helpers /usr/lib/udev install -vm644 ../network/99-default.link /usr/lib/udev/network
Установите некоторые пользовательские правила и вспомогательные файлы, полезные в среде LFS:
tar -xvf ../../udev-lfs-20230818.tar.xz make -f udev-lfs-20230818/Makefile.lfs install
Установите справочные страницы:
tar -xf ../../systemd-man-pages-255.tar.xz \ --no-same-owner --strip-components=1 \ -C /usr/share/man --wildcards '*/udev*' '*/libudev*' \ '*/systemd.link.5' \ '*/systemd-'{hwdb,udevd.service}.8 sed 's|systemd/network|udev/network|' \ /usr/share/man/man5/systemd.link.5 \ > /usr/share/man/man5/udev.link.5 sed 's/systemd\(\\\?-\)/udev\1/' /usr/share/man/man8/systemd-hwdb.8 \ > /usr/share/man/man8/udev-hwdb.8 sed 's|lib.*udevd|sbin/udevd|' \ /usr/share/man/man8/systemd-udevd.service.8 \ > /usr/share/man/man8/udevd.8 rm /usr/share/man/man*/systemd*
Наконец, сбросьте значение переменной udev_helpers
:
unset udev_helpers
Информация об аппаратных устройствах хранится в каталогах
/etc/udev/hwdb.d
и /usr/lib/udev/hwdb.d
. Udev необходимо, чтобы эта информация
была скомпилирована в двоичную базу данных /etc/udev/hwdb.bin
. Создайте исходную базу
данных:
udev-hwdb update
Эту команду необходимо запускать каждый раз при обновлении информации об оборудовании.
Универсальный инструмент администрирования udev: управляет демоном udevd, предоставляет информацию из базы данных Udev, отслеживает uevents, ожидает завершения uevents, проверяет конфигурацию Udev и запускает uevents для данного устройства |
|
Демон, который прослушивает uevents в сокете netlink, создает устройства и запускает настроенные внешние программы в ответ на эти uevents |
|
Обновляет или запрашивает базу данных оборудования |
|
Библиотека для получения информации об устройствах udev |
|
Содержит файлы конфигурации Udev, разрешения для устройств и правила именования устройств |
Пакет Man-DB содержит программы для поиска и просмотра справочных страниц.
Подготовьте Man-DB к компиляции:
./configure --prefix=/usr \ --docdir=/usr/share/doc/man-db-2.12.0 \ --sysconfdir=/etc \ --disable-setuid \ --enable-cache-owner=bin \ --with-browser=/usr/bin/lynx \ --with-vgrind=/usr/bin/vgrind \ --with-grap=/usr/bin/grap \ --with-systemdtmpfilesdir= \ --with-systemdsystemunitdir=
Значение параметров настройки:
--disable-setuid
Отключает установку setuid пользователю man
при сборке программы
man.
--enable-cache-owner=bin
Изменяет владельца файлов общесистемного кэша на
пользователя bin
.
--with-...
Эти три аргумента используются для настройки программ по умолчанию. lynx текстовый веб-браузер (см. инструкции по установке в книге BLFS), vgrind преобразует исходные коды программ во входные данные Groff, grap удобен для набора графов в документах Groff. Программы vgrind и grap обычно не нужны для просмотра справочных страниц. Они не входят в состав книг LFS или BLFS, но вы можете установить их самостоятельно после сборки LFS.
--with-systemd...
Эти параметры предотвращают установку ненужных каталогов и файлов systemd.
Скомпилируйте пакет:
make
Чтобы протестировать пакет, выполните:
make check
Установите пакет:
make install
В следующей таблице приведены наборы символов, в которых
могут быть закодированы страницы руководств пакета Man-DB,
устанавливаемые в директории /usr/share/man/<ll>
. Кроме этого,
Man-DB правильно определяет, имеют ли справочные страницы,
установленные в этом каталоге, кодировку UTF-8.
Таблица 8.1. Допустимые кодировки старых 8-битных страниц руководств
Язык (код) | Кодировка | Язык (код) | Кодировка |
---|---|---|---|
Датский (da) | ISO-8859-1 | Хорватский (hr) | ISO-8859-2 |
Немецкий (de) | ISO-8859-1 | Венгерский (hu) | ISO-8859-2 |
Английский (en) | ISO-8859-1 | Японский (ja) | EUC-JP |
Испанский (es) | ISO-8859-1 | Корейский (ko) | EUC-KR |
Эстонский (et) | ISO-8859-1 | Литовский (lt) | ISO-8859-13 |
Финский (fi) | ISO-8859-1 | Латышский (lv) | ISO-8859-13 |
Французский (fr) | ISO-8859-1 | Македонский (mk) | ISO-8859-5 |
Ирландский (ga) | ISO-8859-1 | Польский (pl) | ISO-8859-2 |
Галисийский (gl) | ISO-8859-1 | Румынский (ro) | ISO-8859-2 |
Индонезийский (id) | ISO-8859-1 | Русский (ru) | KOI8-R |
Исландский (is) | ISO-8859-1 | Словацкий (sk) | ISO-8859-2 |
Итальянский (it) | ISO-8859-1 | Словенский (sl) | ISO-8859-2 |
Норвежский букмол (nb) | ISO-8859-1 | Сербский латинский (sr@latin) | ISO-8859-2 |
Голландский (nl) | ISO-8859-1 | Сербский (sr) | ISO-8859-5 |
Норвежский нюнорск (nn) | ISO-8859-1 | Турецкий (tr) | ISO-8859-9 |
Норвежский (no) | ISO-8859-1 | Украинский (uk) | KOI8-U |
Португальский (pt) | ISO-8859-1 | Вьетнамский (vi) | TCVN5712-1 |
Шведский (sv) | ISO-8859-1 | Упрощенный китайский (zh_CN) | GBK |
Белорусский (be) | CP1251 | Упрощенный китайский, Сингапур (zh_SG) | GBK |
Болгарский (bg) | CP1251 | Традиционный китайский, Гонконг (zh_HK) | BIG5HKSCS |
Чешский (cs) | ISO-8859-2 | Традиционный китайский (zh_TW) | BIG5 |
Греческий (el) | ISO-8859-7 |
Страницы руководств на языках, которые не указаны в списке, не поддерживаются.
Выводит содержимое базы данных whatis в удобочитаемой форме. |
|
Выполняет поиск в базе данных whatis и отображает краткое описание системных команд, содержащих заданную строку |
|
Создает или обновляет предварительно отформатированные страницы руководств |
|
Отображает однострочную сводную информацию о данной странице руководства |
|
Форматирует и отображает запрошенную страницу руководства |
|
Преобразует страницы руководства в другую кодировку |
|
Создает или обновляет базу данных whatis |
|
Отображает содержимое переменной $MANPATH или (если переменная $MANPATH не установлена) соответствующий путь поиска, определяемый в настройках man.conf и в пользовательском окружении |
|
Выполняет поиск в базе данных whatis и отображает краткие описания системных команд, в которых в описании ключей указано искомое слово |
|
Включает поддержку man во время выполнения |
|
Включает поддержку man во время выполнения |
Пакет Procps-ng содержит программы для мониторинга процессов.
Подготовьте Procps-ng к компиляции:
./configure --prefix=/usr \ --docdir=/usr/share/doc/procps-ng-4.0.4 \ --disable-static \ --disable-kill
Значение параметра configure:
--disable-kill
Этот параметр отключает сборку команды kill; она будет установлена из пакета Util-linux.
Скомпилируйте пакет:
make
Чтобы запустить набор тестов, выполните:
make -k check
Известно, что тест ps with output flag
bsdtime,cputime,etime,etimes
завершается неудачно,
если ядро хоста собрано с выключенным параметром CONFIG_BSD_PROCESS_ACCT
. Также известно, что
два теста: pmap X with unreachable
process
и pmap XX with
unreachable process
иногда завершаются неудачно.
Установите пакет:
make install
Сообщает объем свободной и используемой памяти (как физической, так и файла подкачки) в системе. |
|
Выполняет поиск процессов на основе их имени и других атрибутов |
|
Сообщает PIDы указанных программ |
|
Отправка сигналов процессам на основе их имени и других атрибутов |
|
Команда выводит детальную информацию об использование оперативной памяти процессами |
|
Список запущенных процессов |
|
Сообщает текущий рабочий каталог процесса |
|
Отображает подробную информацию о кэш-памяти ядра в режиме реального времени. |
|
Изменяет параметры ядра во время выполнения |
|
Выводит график текущей средней загрузки системы |
|
Отображает список процессов, наиболее интенсивно использующих ЦП; обеспечивает просмотр активности процессора в режиме реального времени |
|
Сообщает сколько времени работает система, сколько пользователей вошли в систему и средние значения загрузки системы. |
|
Сообщает статистику виртуальной памяти, содержащую информацию о процессах, памяти, подкачке, блочном вводе/выводе (IO), прерываниях и активности ЦП. |
|
Показывает, какие пользователи в настоящее время вошли в систему и с какого момента |
|
Выполняет заданную команду повторно, отображая первый экран, заполненный ее выводом; это позволяет пользователю наблюдать за изменениями с течением времени |
|
Содержит функции, используемые большинством программ в этом пакете. |
Пакет Util-linux содержит различные служебные программы. Среди них утилиты для работы с файловыми системами, консолями, разделами и сообщениями.
Сначала отключите проблемный тест:
sed -i '/test_mkfds/s/^/#/' tests/helpers/Makemodule.am
Подготовьте Util-linux к компиляции:
./configure --bindir=/usr/bin \ --libdir=/usr/lib \ --runstatedir=/run \ --sbindir=/usr/sbin \ --disable-chfn-chsh \ --disable-login \ --disable-nologin \ --disable-su \ --disable-setpriv \ --disable-runuser \ --disable-pylibmount \ --disable-static \ --without-python \ --without-systemd \ --without-systemdsystemunitdir \ ADJTIME_PATH=/var/lib/hwclock/adjtime \ --docdir=/usr/share/doc/util-linux-2.39.3
Параметры --disable и --without предотвращают появление предупреждений о сборке компонентов, для которых требуются пакеты, отсутствующие в LFS, или которые несовместимы с программами, установленными другими пакетами.
Скомпилируйте пакет:
make
По желанию запустите набор тестов от имени пользователя без
полномочий root
:
Запуск набора тестов от имени пользователя root
может повредить вашу систему.
Чтобы запустить тесты, опция CONFIG_SCSI_DEBUG для ядра
должна быть доступна в текущей работающей системе и должна
быть собрана как модуль. Включение её в ядро будет
прерывать загрузку. Для полного охвата тестами в систему
необходимо установить другие пакеты из BLFS. По желанию,
этот тест можно запустить после загрузки в готовую систему
LFS:
bash tests/run.sh --srcdir=$PWD --builddir=$PWD
chown -R tester . su tester -c "make -k check"
Тесты с жесткими
ссылками завершатся неудачей, если в ядре хоста
не включена опция CONFIG_CRYPTO_USER_API_HASH
или не включено
никаких опций, обеспечивающих реализацию SHA256 (например,
CONFIG_CRYPTO_SHA256
или
CONFIG_CRYPTO_SHA256_SSSE3
, если
процессор поддерживает инструкции SSE3). Кроме того,
известно, что два подтеста из misc: mbsencode и один подтест
из script: replay не проходят.
Установите пакет:
make install
Сообщает ядру Linux о новых разделах |
|
Открывает порт tty, запрашивает имя для входа, а затем вызывает программу login |
|
Очищает сектора на устройстве |
|
Утилита командной строки для вывода атрибутов блочного устройства |
|
Используется для управления зонированными блочными системами хранения |
|
Позволяет пользователям вызывать ioctl блочного устройства из командной строки |
|
Отображает простой календарь |
|
Управляет таблицей разделов данного устройства |
|
Изменяет состояние процессоров |
|
Настраивает память |
|
Отображает и регулирует оценки OOM-killer, используемые для определения того, какой процесс следует завершить первым, когда в Linux заканчивается память |
|
Манипулирует атрибутами процесса в режиме реального времени |
|
Фильтрует обратные переносы строк из входного потока |
|
Фильтрует данные, выдаваемые командой nroff на терминалы, у которых отсутствует ряд возможностей, например, отображение перечеркнутых символов или верхних и нижних индексов |
|
Фильтрует вывод указанных столбцов |
|
Форматирует заданный файл в несколько столбцов |
|
Устанавливает для комбинации символов Ctrl+Alt+Del жесткую или мягкую перезагрузку |
|
Запрашивает у ядра Linux удаление раздела |
|
Выводит загрузочные сообщения ядра |
|
Извлекает съемный носитель |
|
Предварительное выделение места под файл |
|
Манипулирует таблицей разделов указанного устройства |
|
Подчитывает сколько страниц приложение хранит в памяти ядра |
|
Находит файловую систему по метке или универсальному уникальному идентификатору (UUID) |
|
Представляет собой интерфейс командной строки к библиотеке libmount для работы с файлами mountinfo, fstab и mtab |
|
Осуществляет блокировку файла, а затем выполняет команду, не снимая блокировку |
|
Используется для проверки и, при необходимости, восстановления файловых систем |
|
Выполняет проверку целостности файловой системы Cramfs на данном устройстве |
|
Выполняет проверку целостности файловой системы Minix на данном устройстве |
|
Очень простая программа-обертка для выполнение операций с драйвером ядра FIFREEZE/FITHAW ioctl |
|
Освобождает неиспользованные блоки смонтированной файловой системы |
|
Разбирает параметры указанной командной строки |
|
Объединяет дубликаты файлов путем создания жестких ссылок |
|
Создает дамп указанного файла в шестнадцатеричном, десятичном, восьмеричном или ascii-формате |
|
Читает или устанавливает значение аппаратных часов системы, называемых также часами реального времени (RTC- Real-Time Clock) или часами БИОС (BIOS - Basic Input-Output System) |
|
Символьная ссылка на setarch |
|
Читает или устанавливает класс и приоритет обработки ввода/вывода для программ |
|
Создает различные ресурсы межпроцессного взаимодействия (IPC) |
|
Удаляет указанный ресурс межпроцессного взаимодействия (IPC) |
|
Предоставляет информацию о состоянии IPC |
|
Отображает информацию о счетчике прерываний ядра в стиле top(1) |
|
Сообщает о размере файловой системы iso9660 |
|
Посылает сигналы процессам |
|
Показывает, какие пользователи в последний раз
входили (и выходили), выполняя поиск в файле
|
|
Показывает неудачные попытки входа в систему,
зарегистрированные в |
|
Назначает устройству последовательного доступа алгоритм, определяющий дисциплину обслуживания этого устройства |
|
Символическая ссылка на setarch |
|
Символическая ссылка на setarch |
|
Добавляет указанное сообщение в системный журнал |
|
Отображает строки, начинающиеся с указанной последовательности символов |
|
Настраивает и управляет устройствами типа loop |
|
Выводит информацию обо всех или выбранных блочных устройствах в древовидном формате |
|
Выводит информацию об архитектуре процессора |
|
Отображает информацию об открытых файлах; заменяет lsof |
|
Выводит информацию об объектах IPC, которые в настоящее время используются в системе |
|
Отображает информацию о счетчике прерываний ядра |
|
Отображает список всех заблокированных в настоящее время файлов в системе |
|
Выводит информацию о пользователях, группах и системных учетных записях |
|
Отображает диапазоны доступной памяти с указанием их оперативного статуса |
|
Отображает список пространств имен |
|
Генерирует для xauth магические куки (128-битные случайные числа в шестнадцатеричном формате) |
|
Определяет, могут ли другие пользователи отправлять сообщения на терминал текущего пользователя |
|
Создает файловую систему на устройстве (обычно это раздел жесткого диска) |
|
Создает файловую систему Santa Cruz Operations (SCO) bfs |
|
Создает файловую систему cramfs |
|
Создает файловую систему Minix |
|
Инициализирует данное устройство или файл для использования в качестве области подкачки |
|
Фильтр постраничного вывода текста |
|
Подключение файловой системы, находящейся на заданном устройстве, к указанному каталогу в дереве файловой системы |
|
Проверяет, является ли каталог точкой монтирования |
|
Разделяет на составляющие путь к файлу или каталогу, показывая информацию о типе каждого элемента |
|
Запускает программу в пространстве имен других процессов |
|
Сообщает ядру информацию о наличии и количестве разделов, находящихся на диске |
|
Делает данную файловую систему новой корневой файловой системой текущего процесса |
|
Получает и устанавливает ограничения использования ресурсов процесса |
|
Читает информацию о профилировании ядра |
|
Переименовывает заданные файлы, заменяя одну строку другой |
|
Изменяет приоритет запущенных процессов |
|
Запрашивает у ядра Linux изменение размера раздела |
|
Меняет в указанном файле порядок строк на обратный |
|
Bнструмент командной строки для управления беспроводными устройствами |
|
Используется для перехода системы в спящий режим до указанного времени пробуждения |
|
Создает скрипт терминальной сессии |
|
Перезапускает скрипт терминальной сессии, используя информацию о времени |
|
Воспроизводит скрипт в соответствие с указанным временем запуска |
|
В окружении, используемом новой программой, изменяет информацию об архитектуре и устанавливает флаги персонализации |
|
Запускает указанную программу в новом сеансе |
|
Устанавливает атрибуты терминала |
|
Управляет таблицей разделов диска |
|
Позволяет пользователю |
|
Изменяет UUID и метку раздела подкачки |
|
Отключает устройства и файлы подкачки |
|
Включает устройства и файлы, применяемые для раздела подкачки, а также выводит список устройств и файлов, используемых в данный момент |
|
Переключается на другую файловую систему и устанавливает её в качестве корневой |
|
Устанавливает привязку процессора к процессу |
|
Управляет атрибутами ограничения использования системы или процесса |
|
Фильтр для преобразования символов подчеркивания в escape-последовательности |
|
Размонтирует файловую систему из дерева ФС |
|
Символическая ссылка на setarch |
|
Позволяет процессу (или потоку) отделить части своего контекста выполнения, которые используются совместно с другими процессами (или потоками) |
|
Отображает содержимое указанного файла входа в систему в удобном для пользователя формате |
|
Демон, используемый библиотекой UUID для создания безопасных и гарантированно уникальных идентификаторов UUID |
|
Создает новые идентификаторы (UUID). Каждый новый UUID - это случайная последовательность, которая, будет с очень высокой вероятностью уникальной среди всех идентификаторов, созданных как на локальной машине, так и на любых других системах, в прошлом и будущем (2128 или около 3,4 х 1038 вариантов) |
|
Утилита для анализа уникальных идентификаторов |
|
Отображает содержимое файла или, по умолчанию, его вывод на терминалах всех пользователей, вошедших в систему в данный момент |
|
Показывает статус аппаратного сторожевого таймера |
|
Сообщает местоположение двоичного файла, исходного кода и справочной страницы для указанной команды |
|
Стирает с устройства сигнатуру файловой системы |
|
Символическая ссылка на setarch |
|
Программа для настройки и управления устройствами zram (сжатый RAM-диск) |
|
Содержит подпрограммы для идентификации устройства и извлечения токена |
|
Содержит подпрограммы для управления таблицами разделов |
|
Содержит подпрограммы для монтирования и размонтирования блочных устройств |
|
Содержит подпрограммы для более удобного вывода на экран информации в табличном виде |
|
Содержит подпрограммы для генерации уникальных идентификаторов для объектов, которые могут быть доступны за пределами локальной системы |
Пакет E2fsprogs содержит утилиты для работы с файловой
системой ext2
. Также он
поддерживает журналируемые файловые системы ext3
и ext4
.
В документации к E2fsprogs рекомендуется выполнять сборку в подкаталоге папки с исходниками:
mkdir -v build cd build
Подготовьте E2fsprogs к компиляции:
../configure --prefix=/usr \ --sysconfdir=/etc \ --enable-elf-shlibs \ --disable-libblkid \ --disable-libuuid \ --disable-uuidd \ --disable-fsck
Значение параметров настройки:
--enable-elf-shlibs
Параметр создает общие библиотеки, которые используют некоторые программы в этом пакете.
--disable-*
Эти параметры предотвращают сборку и установку
библиотек libuuid
и
libblkid
, демона
uuidd
, и обертку для
fsck,
поскольку util-linux устанавливает более свежие версии.
Скомпилируйте пакет:
make
Чтобы запустить тесты, выполните:
make check
Известно, что один тест, с именем m_assume_storage_prezeroed
, завершается
ошибкой.
Установите пакет:
make install
Удалите ненужные статические библиотеки:
rm -fv /usr/lib/{libcom_err,libe2p,libext2fs,libss}.a
Этот пакет устанавливает сжатый файл .info
но не обновляет общесистемный файл
dir
. Разархивируйте этот файл,
а затем обновите системный файл dir
, используя следующие команды:
gunzip -v /usr/share/info/libext2fs.info.gz install-info --dir-file=/usr/share/info/dir /usr/share/info/libext2fs.info
По желанию, создайте и установите дополнительную документацию, выполнив следующие команды:
makeinfo -o doc/com_err.info ../lib/et/com_err.texinfo install -v -m644 doc/com_err.info /usr/share/info install-info --dir-file=/usr/share/info/dir /usr/share/info/com_err.info
Файл /etc/mke2fs.conf
содержит
значения по умолчанию для различных параметров командной
строки mke2fs.
Вы можете отредактировать файл, чтобы значения по умолчанию
соответствовали вашим потребностям. Например, некоторые
утилиты (не в LFS или BLFS) не могут распознать файловую
систему ext4
с включенным
параметром metadata_csum_seed
.
Если вам нужна
такая утилита, вы можете удалить параметр из списка по
умолчанию для ext4
с помощью
команды:
sed 's/metadata_csum_seed,//' -i /etc/mke2fs.conf
Подробности читайте на странице руководства mke2fs.conf(5).
Выполняет поиск поврежденных блоков на устройстве (обычно на разделе диска) |
|
Изменяет атрибуты файлов в файловых системах
|
|
Компилятор таблицы ошибок; конвертирует таблицу
имен кодов ошибок и сообщений в файл исходного кода
на языке С с тем, чтобы ее можно было использовать
с библиотекой |
|
Отладчик файловой системы; его можно использовать
для проверки и изменения состояния файловых систем
|
|
Выводит информацию о суперблоке и группе блоков для файловой системы, присутствующей на указанном устройстве. |
|
Сообщает информацию о фрагментации свободного пространства |
|
Используется для проверки и, при необходимости,
восстановления файловых систем |
|
Используется для сохранения важных данных файловых
систем |
|
Отображает или изменяет метку файловой системы в
файловой системе |
|
Проверяет состояние MMP (Multiple Mount Protection
- защита от множественного монтирования) файловой
системы |
|
Проверяет содержимое смонтированной файловой
системы |
|
Проверяет все смонтированные файловые системы
|
|
Воспроизводит журнал отмены (undo_log) для файловой
системы |
|
Утилита шифрования файловой системы |
|
Онлайн дефрагментатор для файловой системы
|
|
Сообщает о том, насколько сильно может быть фрагментирован конкретный файл |
|
По умолчанию проверяет файловые системы
|
|
По умолчанию проверяет файловые системы
|
|
По умолчанию проверяет файловые системы
|
|
Сохраняет вывод команды в файл журнала |
|
Перечисляет атрибуты файлов во второй расширенной файловой системе. |
|
Преобразует таблицу имен команд и справочных
сообщений в исходный файл C, подходящий для
использования с библиотекой подсистемы |
|
Создает файловую систему |
|
По умолчанию создает файловую систему |
|
По умолчанию создает файловую систему |
|
По умолчанию создает файловую систему |
|
Используется для создания каталога |
|
Может использоваться для увеличения или уменьшения
файловой системы |
|
Позволяет настроить параметры для файловой системы
|
|
Стандартная процедура отображения ошибок |
|
Используется dumpe2fs, chattr, и lsattr |
|
Содержит подпрограммы, позволяющие программам
пользовательского уровня управлять файловой
системой |
|
Используется debugfs |
Пакет Sysklogd содержит программы для логирования системных сообщений, таких как сообщения ядра, когда происходят различные события.
Во-первых, устраните проблему, которая при некоторых условиях вызывает в klogd ошибку сегментирования и исправьте устаревшую программную конструкцию:
sed -i '/Error loading kernel symbols/{n;n;d}' ksym_mod.c sed -i 's/union wait/int/' syslogd.c
Скомпилируйте пакет:
make
Этот пакет не содержит набора тестов.
Установите пакет:
make BINDIR=/sbin install
Создайте новый файл /etc/syslog.conf
, выполнив следующую
команду:
cat > /etc/syslog.conf << "EOF"
# Begin /etc/syslog.conf
auth,authpriv.* -/var/log/auth.log
*.*;auth,authpriv.none -/var/log/sys.log
daemon.* -/var/log/daemon.log
kern.* -/var/log/kern.log
mail.* -/var/log/mail.log
user.* -/var/log/user.log
*.emerg *
# End /etc/syslog.conf
EOF
Пакет Sysvinit содержит программы для управления загрузкой, выполнением и выключением системы.
Сначала примените патч, который удаляет несколько программ, установленных другими пакетами и исправляет предупреждение компилятора:
patch -Np1 -i ../sysvinit-3.08-consolidated-1.patch
Скомпилируйте пакет:
make
С этим пакетом не поставляется набор тестов.
Установите пакет:
make install
Логирует сообщения при загрузке системы |
|
Запускает команду с аргументами, заданными в fstab |
|
Обычно вызывает команду shutdown с
параметром |
|
Первый процесс, который запускается после инициализации оборудования; init берет на себя процесс загрузки и запускает все процессы, которые указанны в его файле конфигурации |
|
Посылает сигнал всем процессам, за исключением процессов в его собственном сеансе; он не завершит свою родительскую оболочку |
|
Посылает ядру команду остановить систему и выключить компьютер (смотрите команду halt) |
|
Посылает ядру команду перезагрузить систему (смотрите команду halt) |
|
Сообщает о предыдущем и текущем уровнях выполнения
так, как это указано в последней записи в файле
|
|
Безопасно останавливает систему, отправляя сигналы всем процессам и оповещая всех пользователей, находящихся в системе |
|
Сообщает init на какой уровень выполнения перейти |
Большинство программ и библиотек по умолчанию компилируются с
отладочными символами (gcc с параметром -g
). Это означает, что при
отладке программы или библиотеки, которые были скомпилированы с
использованием отладочной информации, отладчик может
предоставить не только адреса памяти, но и имена подпрограмм и
переменных.
Включение отладочных символов значительно увеличивает размер программы или библиотеки. Ниже приведена информация по объему пространства, занимаемого отладочными символами:
Двоичный файл bash с отладочными символами: 1200 KB
Двоичный файл bash без отладочных символов: 480 KB (на 60% меньше)
Файлы Glibc и GCC (/lib
и
/usr/lib
) с отладочными
символами: 87 MB
Файлы Glibc и GCC без отладочных символов: 16 MB (на 82% меньше)
Размеры могут варьироваться в зависимости от используемого компилятора и библиотеки Си, но программа, в которой были удалены отладочные символы, обычно примерно на 50-80% меньше, чем ее аналог с ними. Поскольку большинство пользователей никогда не будут использовать отладчик в своем программном обеспечении, удаление отладочных символов может освободить много места на диске. В следующем разделе показано, как удалить все отладочные символы из программ и библиотек.
Этот раздел является необязательным. Если предполагаемый пользователь не является программистом и не планирует выполнять какую-либо отладку системного программного обеспечения, размер системы можно уменьшить примерно на 2 ГБ, удалив отладочные символы и некоторые ненужные записи таблицы символов из двоичных файлов и библиотек. Это не вызывает никаких неудобств для обычного пользователя Linux.
Большинство людей, использующих приведенные ниже команды, не испытывают никаких трудностей. Однако легко допустить опечатку и сделать новую систему непригодной для использования. Поэтому перед выполнением команды strip рекомендуется сделать резервную копию системы LFS.
Команда strip с
параметром --strip-unneeded
удаляет все
отладочные символы из двоичного файла или библиотеки. Кроме
этого, она удаляет все записи таблицы символов, ненужные
компоновщику (для статических библиотек) или динамическому
компоновщику (для динамически подключаемых двоичных файлов и
общих библиотек).
Отладочные символы из выбранных библиотек сжимаются с помощью Zlib и сохраняются в отдельных файлах. Эта отладочная информация необходима при выполнении регрессионных тестов, с помощью valgrind или gdb позже, в BLFS.
Обратите внимание, что команда strip перезапишет двоичный
файл или библиотеку, которую она обрабатывает. Это может
привести к сбою процессов, использующих код или данные из
файла. Если это затронет сам процесс, выполняющий strip, удаляемый двоичный
файл или библиотека могут быть уничтожены; это может сделать
систему полностью непригодной для использования. Чтобы избежать
этого, мы скопируем некоторые библиотеки и двоичные файлы в
/tmp
, очистим их и переустановим
с помощью команды install. Прочтите статью
Раздел 8.2.1, «Проблемы с
обновлением», чтобы понять, почему следует использовать
команду install
здесь.
Имя загрузчика ELF — ld-linux-x86-64.so.2 в 64-битных
системах. и ld-linux.so.2 в 32-битных системах. Конструкция
ниже выбирает правильное имя для текущей архитектуры,
исключая всё, что заканчивается на g
, если приведенные ниже команды уже были
выполнены.
Если есть какой-либо пакет, версия которого отличается от
версии, указанной в книге (либо в соответствии с
рекомендациями по безопасности, либо в соответствии с личными
предпочтениями), может потребоваться обновить имя файла
библиотеки в save_usrlib
или
online_usrlib
. В противном случае система может стать
полностью непригодной для использования.
save_usrlib="$(cd /usr/lib; ls ld-linux*[^g]) libc.so.6 libthread_db.so.1 libquadmath.so.0.0.0 libstdc++.so.6.0.32 libitm.so.1.0.0 libatomic.so.1.2.0" cd /usr/lib for LIB in $save_usrlib; do objcopy --only-keep-debug --compress-debug-sections=zlib $LIB $LIB.dbg cp $LIB /tmp/$LIB strip --strip-unneeded /tmp/$LIB objcopy --add-gnu-debuglink=$LIB.dbg /tmp/$LIB install -vm755 /tmp/$LIB /usr/lib rm /tmp/$LIB done online_usrbin="bash find strip" online_usrlib="libbfd-2.42.so libsframe.so.1.0.0 libhistory.so.8.2 libncursesw.so.6.4-20230520 libm.so.6 libreadline.so.8.2 libz.so.1.3.1 libzstd.so.1.5.5 $(cd /usr/lib; find libnss*.so* -type f)" for BIN in $online_usrbin; do cp /usr/bin/$BIN /tmp/$BIN strip --strip-unneeded /tmp/$BIN install -vm755 /tmp/$BIN /usr/bin rm /tmp/$BIN done for LIB in $online_usrlib; do cp /usr/lib/$LIB /tmp/$LIB strip --strip-unneeded /tmp/$LIB install -vm755 /tmp/$LIB /usr/lib rm /tmp/$LIB done for i in $(find /usr/lib -type f -name \*.so* ! -name \*dbg) \ $(find /usr/lib -type f -name \*.a) \ $(find /usr/{bin,sbin,libexec} -type f); do case "$online_usrbin $online_usrlib $save_usrlib" in *$(basename $i)* ) ;; * ) strip --strip-unneeded $i ;; esac done unset BIN LIB save_usrlib online_usrbin online_usrlib
Большое количество файлов будет помечено как ошибочные, потому что формат файла не распознан. Эти предупреждения можно смело игнорировать. Они указывают на то, что файлы являются скриптами, а не двоичными файлами.
Наконец, удалите некоторые лишние файлы, оставшиеся после запуска тестов:
rm -rf /tmp/*
Также в каталогах /usr/lib и /usr/libexec есть несколько файлов с расширением .la. Это файлы «архива libtool». Как было сказано ранее, в современной системе Linux файлы .la libtool необходимы только для libltdl. Предполагается, что libltdl не будет загружать библиотеки в LFS, кроме этого известно, что некоторые файлы .la могут нарушить сборку пакетов BLFS. Удалите эти файлы сейчас:
find /usr/lib /usr/libexec -name \*.la -delete
Дополнительные сведения об архивных файлах Libtool смотрите в книге BLFS "О файлах Libtool Archive (.la)".
Компилятор, собранный в Глава 6 и Глава 7 все еще установлен, но больше не нужен. Удалите его с помощью команды:
find /usr -depth -name $(uname -m)-lfs-linux-gnu\* | xargs rm -rf
Наконец, удалите временную учетную запись пользователя 'tester', созданную в начале предыдущей главы.
userdel -r tester
Загрузка системы Linux включает в себя несколько задач. Процесс должен монтировать как виртуальные, так и реальные файловые системы, инициализировать устройства, активировать файл подкачки, проверять целостность файловых систем, монтировать любые разделы или файл подкачки, устанавливать системные часы, запускать сеть, запускать требуемые системой службы и выполнять любые другие необходимые пользователю задачи. Этот процесс должен быть организован таким образом, чтобы задачи выполнялись в правильном порядке, но в то же время как можно быстрее.
System V это классический процесс загрузки, который использовался в Unix и Unix-подобных системах, таких как Linux с 1983 года. Он состоит из небольшой программы init, которая настраивает базовые программы, такие как login (через getty) и запускает скрипт. Этот скрипт, обычно именуемый rc управляет выполнением дополнительных сценариев, необходимых для инициализации системы.
Программа init
управляется файлом /etc/inittab
и разделена по уровням выполнения, которые могут быть выбраны
пользователем. В LFS используются следующие уровни:
0 — выключение
1 — Однопользовательский режим
2 — Определяемый пользователем
3 — Полный многопользовательский режим
4 — Определяемый пользователем
5 — Полный многопользовательский режим с дисплей-менеджером
6 — перезагрузка
Уровень выполнения по умолчанию равен 3 или 5.
Устоявшаяся, хорошо отлаженная система.
Легко настраивается.
Может загружаться медленнее. Загрузка базовой системы LFS в среднем занимает 8-12 секунд, при этом время загрузки измеряется от первого сообщения ядра до запроса на вход в систему. Подключение к сети обычно устанавливается примерно через 2 секунды после запроса на вход в систему.
Последовательная обработка задач загрузки. Это связано с предыдущим пунктом. Задержка в работе любого процесса, например, проверка файловой системы, приведет к задержке всего процесса загрузки.
Напрямую не поддерживает дополнительные функции, такие как контрольные группы (cgroups) и диспетчер системных ресурсов для каждого пользователя.
Добавление init-скриптов требует ручных однотипных действий.
Пакет LFS-Bootscripts содержит набор скриптов для запуска/остановки системы LFS при загрузке/завершении работы. Файлы конфигурации и процедуры, необходимые для настройки /процесса загрузки, описаны в следующих разделах.
Установите пакет:
make install
Проверяет целостность файловых систем перед их монтированием (за исключением журналируемых и сетевых файловых систем) |
|
Удаляет файлы, которые не должны сохраняться между
перезагрузками, например, те, которые находятся в
директориях |
|
Загружает правильную таблицу раскладок для требуемой раскладки клавиатуры; он также устанавливает экранный шрифт |
|
Содержит общие функции, такие как проверка ошибок и состояния, которые используются несколькими загрузочными скриптами |
|
Останавливает работу системы |
|
Останавливает сетевое устройство |
|
Инициализирует сетевое устройство |
|
Настраивает имя хоста системы и локальное устройство loopback |
|
Загружает модули ядра из списка, который находится
в файле |
|
Монтирует все файловые системы, кроме тех, которые помечены как noauto или сетевых файловых систем |
|
Монтирует виртуальные файловые системы, такие как
|
|
Выполняет настройку сетевых интерфейсов, например, сетевых карт, и настаивает шлюз по-умолчанию (где это применимо) |
|
Основной сценарий управления; он отвечает за запуск всех остальных загрузочных скриптов один за другим, в последовательности, определяемой именами символических ссылок на другие скрипты. |
|
Перезагружает систему |
|
Обеспечивает завершение каждого процесса перед перезагрузкой или остановкой системы. |
|
Сбрасывает системные часы на местное время, если аппаратные часы не установлены на всемирное координированное время (UTC). |
|
Предоставляет функциональные возможности, необходимые для назначения статического адреса сетевому интерфейсу. |
|
Включает и отключает файлы и разделы, используемые для подкачки. |
|
Загружает в работающее ядро значения системных
настроек из файла |
|
Запускает и останавливает демоны журналирования сообщений, выдаваемых системой и ядром. |
|
Шаблон для создания пользовательских загрузочных скриптов для других демонов |
|
Подготавливает каталог |
|
Повторяет неудачные попытки запуска udev uevents и
копирует сгенерированные файлы правил из
|
В Глава 8, мы установили демон udev во время сборки udev . Прежде чем мы углубимся в детали того, как работает udev, необходимо кратко рассказать о предыдущих методах взаимодействия с устройствами.
Системы Linux традиционно использовали метод статического
создания устройств, при котором огромное количество узлов
устройств(иногда буквально тысячи узлов) создавалось в
/dev
, независимо от того,
существовали ли соответствующие аппаратные устройства на самом
деле. Обычно это делалось с помощью скрипта MAKEDEV, который содержал ряд
вызовов команды mknod с соответствующими
основными и второстепенными номерами устройств, для всех
возможных вариантов, которые только могут существовать в мире.
Используя метод udev, узлы устройств создаются только для тех
устройств, которые обнаружены ядром. Эти узлы устройств
создаются каждый раз при загрузке системы; они хранятся в
файловой системе devtmpfs
(виртуальная файловая система, которая полностью находится в
оперативной памяти). Узлы не занимают много места в памяти и их
общий размер незначителен.
В феврале 2000 года, новая файловая система devfs
была принята в ветку ядра 2.3.46 и
была доступна на протяжении выпуска стабильных релизов ветки
2.4. Хотя она и присутствовала в ядре, такой способ
динамического создания устройств никогда не получал поддержки
от разработчиков ядра.
Основная проблема с подходом, принятым devfs
была связана с обработкой
обнаружения, создания и назначения имен устройствам. Проблема
связанная с именованием узлов была самой важной. Общепринято,
что если имена устройств можно настраивать, политика
именования устройств должна выбираться системными
администраторами, а не навязываться разработчиками. Файловая
система devfs
также страдала
от состояния гонки, присущего её архитектуре; оно не могло
быть исправлено без существенной переработки ядра.
devfs
долгое время была
помечена как устаревшая и, наконец, была удалена из ядра в
июне 2006 года.
При разработке нестабильной ветки ядра 2.5, позднее,
выпущенной как стабильный релиз 2.6, появилась новая
виртуальная файловая система sysfs
. Задача этой файловой системы
заключалась в предоставление информации о конфигурации
оборудования системы процессам пользовательского
пространства. С помощью этого представления, видимого в
пользовательском пространстве, стало возможным разработать
замену пользовательского пространства для devfs
.
Краткое описание файловой системы sysfs
было представлено выше. Можно
задаться вопросом, как sysfs
получает информацию об
устройствах в системе, и о том, какие номера устройств
должны использоваться для них. Драйверы, скомпилированные в
ядро, регистрируют свои объекты в sysfs
(внутри devtmpfs
), по мере обнаружения ядром.
Для драйверов, которые скомпилированы в виде модулей,
регистрация происходит при его загрузке. После монтирования
файловой системы sysfs
(в
каталог /sys
), данные,
зарегистрированные драйверами, в sysfs
, станут доступны для
пользовательского пространства и udevd для обработки
(включая модификацию узлов устройств).
Файлы устройств создаются ядром в файловой системе
devtmpfs
. Любой драйвер,
которому необходимо зарегистрировать узел устройства, будет
использовать для этого devtmpfs
(через системный драйвер
ядра). Когда экземпляр devtmpfs
монтируется в каталог
/dev
, узел устройства будет
доступен в пользовательском пространстве с фиксированным
именем, разрешениями и владельцем.
Через некоторое время, ядро отправит uevent в udevd. На основе правил,
которые указанны в файлах в каталогах /etc/udev/rules.d
, /lib/udev/rules.d
, и /run/udev/rules.d
, udevd создаст
дополнительные символические ссылки на узлы устройств, или
сменит разрешения, владельца или группу, или изменит запись
(имя) во внутренней базе данных udevd для этого объекта.
Правила в этих трёх каталогах пронумерованы и используются
совместно. Если udevd не может найти
правило для устройства, он оставит права доступа и
владельца на devtmpfs
,
которые были установлены изначально.
Драйверы устройств, скомпилированные в виде модулей ядра
могут содержать встроенные псевдонимы. Псевдонимы можно
увидеть просмотрев вывод программы modinfo, обычно они
связаны со специфичными для шины идентификаторами
устройств, которые поддерживается модулем. Например,
драйвер snd-fm801
подерживает PCI устройства с идентификатором поставщика
0x1319 и идентификатором устройства 0x0801, и имеет
псевдоним pci:v00001319d00000801sv*sd*bc04sc01i*
.
Для большинства устройств, драйвер шины экспортирует
псевдонимы драйвера, которые будет обрабатывать устройство
через sysfs
. Например, файл
/sys/bus/pci/devices/0000:00:0d.0/modalias
может содержать строку pci:v00001319d00000801sv00001319sd00001319bc04sc01i00
.
Правила по умолчанию, которые предоставлены Udev, заставят
udevd вызвать
/sbin/modprobe с
содержимым, которое находится в значении переменной
окружения MODALIAS
uevent
(которое должно совпадать с содержимым файла modalias
в sysfs), тем самым загружая все
модули, чьи псевдонимы совпадают в строке после расширения
подстановочных знаков
В указанном примере, это означает, что в дополнение к snd-fm801 будет загружен устаревший (и нежелательный) драйвер forte, если он будет доступен. Ниже приведены способы, как можно предотвратить загрузку нежелательных драйверов.
Само ядро также способно загружать модули для сетевых протоколов, файловых систем и поддержки NLS по запросу.
При подключении устройства, например, MP3-плеер, к универсальной последовательной шине (USB), ядро распознает, что устройство подключено, и генерирует событие uevent. Затем это событие обрабатывается udevd, как было описано выше.
Существует несколько возможных проблем, связанных с автоматическим созданием узлов устройств.
Udev загрузит модуль только в том случае, если у него есть
псевдоним, специфичный для шины, и драйвер шины правильно
экспортирует необходимые псевдонимы в sysfs
. В других случаях следует
организовать загрузку модуля иными способами. Известно,
что, начиная с версии Linux-6.7.4, udev, выполняет загрузку
правильно написанных драйверов для INPUT, IDE, PCI, USB,
SCSI, SERIO, и FireWire устройств.
Чтобы определить, имеет ли требуемый драйвер устройства
необходимую поддержку Udev, запустите modinfo с именем модуля в
качестве аргумента. Далее, попробуйте найти каталог
устройства в /sys/bus
и
проверьте, есть ли там файл modalias
.
Если файл modalias
существует
в sysfs
, то драйвер,
который поддерживает устройство, может обращаться к нему
напрямую, но не имеет псевдонима, это ошибка в драйвере.
Загрузите драйвер без помощи Udev и ожидайте, что проблема
будет исправлена позднее.
Если же в каталоге /sys/bus
нет файла modalias
, это
означает, что разработчики ядра еще не добавили поддержку
modalias
к этому типу шины. В
Linux-6.7.4 это относится к шиной ISA. Ожидайте, что эта
проблема будет исправлена в более поздних версиях ядра.
Udev не предназначен для загрузки драйверов «обёрток», таких как snd-pcm-oss и не аппаратных драйверов, например, loop.
Если модуль «обёртка» только расширяет
функциональность, предоставляемую каким-либо другим модулем
(например модуль snd-pcm-oss расширяет
функциональность модуля snd-pcm, давая возможность
звуковым картам быть доступными для OSS приложений),
настройте modprobe для загрузки
оболочки после того, как Udev загрузит обернутый модуль.
Для этого добавьте строку «softdep» в файл, который находится в
каталоге /etc/modprobe.d/
.
Например:
<filename>
.conf
softdep snd-pcm post: snd-pcm-oss
Обратите внимание, что команда «softdep»
разрешает добавлять pre:
зависимости, или одновременно pre:
и post:
зависимости. Обратитесь к документации modprobe.d(5)
для изучения синтаксиса и возможностей «softdep».
Если рассматриваемый модуль не является обёрткой, и полезен
сам по себе, настройте загрузочный скрипт modules, чтобы он
инициализировался при загрузке системы. Для этого добавьте
имя модуля в файл /etc/sysconfig/modules
в отдельной
строке. Этот способ сработает и для модулей-обёрток, но не
является оптимальным.
Либо не создавайте модуль, либо занесите его в черный
список в файле /etc/modprobe.d/blacklist.conf
, как это
сделано с модулем forte в примере ниже:
blacklist forte
Модули, занесенные в черный список, можно загрузить вручную с помощью явной команды modprobe.
Это обычно происходит, если правило неожиданно совпадает с другим устройством. Например, плохо написанное поставщиком оборудования правило может соответствовать как диску SCSI(искомое устройство), так и универсальному устройству SCSI (неправильно). Найдите ошибочное правило и исправьте его с помощью команды udevadm info.
Это может быть проявлением предыдущей проблемы. В ином
случае, если правило использует атрибуты файловой системы
sysfs
, то это может быть
проблемой синхронизации ядра, которая будет исправлена в
более поздних версиях ядра. Но вы можете обойти проблему,
создав правило, которое ожидает используемый атрибут
sysfs
и добавляет его к
файлу правил /etc/udev/rules.d/10-wait_for_sysfs.rules
(создайте его, если файл не существует). Пожалуйста,
сообщите в списке рассылки разработчиков LFS, если это
решение вам поможет.
Во-первых, убедитесь, что драйвер встроен в ядро или уже загружен как модуль, и, что udev не создает устройство с неправильным именем.
Если драйвер ядра не экспортирует свои данные в
sysfs
, udev не хватает
информации, необходимой для создания узла устройства. Это,
вероятнее всего, произойдет со сторонними драйверами,
которых нет в дереве исходного кода ядра. Создайте
статический узел в каталоге /usr/lib/udev/devices
с соответствующими
старшим/младшим номерами (смотрите файл devices.txt в
документации к ядру или документации, предоставленной
сторонним поставщиком драйвера). Статический узел будет
скопирован в /dev
с помощью
udev.
Это связано с тем, что udev обрабатывает события uevents и загружает модули параллельно, а значит в непредсказуемом порядке. Это никогда не будет «исправлено». Вы не должны полагаться на то что имена устройств ядра стабильны. Вместо этого создайте свои собственные правила, которые делают символические ссылки со стабильными именами на основе некоторых неизменяемых атрибутов устройства, таких как серийный номер или вывод различных утилит *_id, установленных Udev. Смотрите Раздел 9.4, «Управление устройствами» и Раздел 9.5, «Настройка сети» для примера.
Дополнительную документацию можно получить на следующих сайтах:
Реализация пользовательского пространства в
devfs
http://www.kroah.com/linux/talks/ols_2003_udev_paper/Reprint-Kroah-Hartman-OLS2003.pdf
Файловая система sysfs
https://www.kernel.org/pub/linux/kernel/people/mochel/doc/papers/ols-2005/mochel.pdf
Udev по умолчанию присваивает имена сетевым устройствам в соответствии с данными прошивки, BIOS'а или физическими характеристиками, такими как шина, слот или MAC-адрес. Целью такого соглашения об именовании является обеспечение того, чтобы сетевые устройства именовались последовательно, а не основывались на времени обнаружения сетевой карты. Например, в более старых версиях Linux—на компьютере с двумя сетевыми картами производства Intel и Realtek, сетевая карта производства Intel могла стать eth0, а карта Realtek — eth1. Иногда после перезагрузки карты именовались наоборот.
В новой схеме именования, типичными именами сетевых устройств являются enp5s0 или wlp3s0. Если такие имена для вас нежелательны, то может быть реализована традиционная схема именования или своя собственная.
Традиционная схема именования - eth0, eth1, и так далее,
может быть включена путем добавления параметра
net.ifnames=0
в командную
строку ядра. Это решение подходит для систем, которые имеют
только одно сетевое устройство каждого типа. Часто в
ноутбуках несколько сетевых устройств с именами eth0 и
wlan0; в таких ноутбуках также может использоваться этот
метод. Командная строка указывается в файле конфигурации
GRUB. Подробности смотрите на странице Раздел 10.4.4,
«Создание файла конфигурации GRUB».
Схему именования можно настроить, создав пользовательские правила udev. В состав книги включен скрипт, который генерирует начальные правила. Чтобы их сгенерировать, выполните команду:
bash /usr/lib/udev/init-net-rules.sh
Теперь, проверьте файл /etc/udev/rules.d/70-persistent-net.rules
,
чтобы узнать какое имя с каким сетевым устройством
сопоставлено:
cat /etc/udev/rules.d/70-persistent-net.rules
В некоторых случаях, например, когда MAC-адреса были назначены сетевой карте вручную или в виртуальной среде, такой как Qemu или Xen, возможно, файл сетевых правил не будет сгенерирован, поскольку адреса назначаются не последовательно. В таких случаях, этот способ не применим.
Файл начинается с блока комментариев, далее следуют две строки для каждой сетевой карты (NIC). Первая строка представляет собой описание с комментариями и содержит аппаратные идентификаторы (например, поставщика PCI и идентификаторы устройств, если это PCI-карта), а также информацию о драйвере (если его удалось обнаружить). Ни идентификатор оборудования, ни драйвер не используются для определения того, какое имя присвоить интерфейсу; эта информация предназначена только для справки. Вторая строка - это правило udev, которое соответствует этому сетевому адаптеру и фактически присваивает ему имя.
Все правила udev состоят из нескольких ключевых слов, разделенных запятыми и необязательными пробелами. Ниже приведены ключевые слова и пояснения по каждому из них:
SUBSYSTEM=="net"
-
указывает Udev игнорировать устройства, которые не
являются сетевыми картами.
ACTION=="add"
-
указывает Udev игнорировать правила для событий,
отличных от добавления (события "удалить" и
"изменить" также происходят, но не требуют
переименования сетевых интерфейсов).
DRIVERS=="?*"
-
существует для того, чтобы Udev проигнорировал
подинтерфейсы VLAN или моста (потому что эти
подинтерфейсы не имеют драйверов). Эти подинтерфейсы
пропускаются, потому что назначенные им имена будут
конфликтовать с именами их родительских устройств.
ATTR{address}
-
значением этого ключевого слова является MAC-адрес
сетевой карты.
ATTR{type}=="1"
- этот
ключ гарантирует выполнение правила соответствующего
только основному интерфейсу, при использовании
определенных беспроводных драйверов, которые создают
несколько виртуальных интерфейсов. Дополнительные
интерфейсы пропускаются по той же причине, что и
подинтерфейсы VLAN и мост, в ином случае произошел бы
конфликт имен.
NAME
- значением этого
ключевого слова является имя, которое udev присвоит
этому интерфейсу.
Значение NAME
является очень
важным. Прежде чем продолжить, убедитесь, что вы знаете,
какое имя назначено каждой из сетевых карт и обязательно
используйте это значение NAME
при создании файлов конфигурации сети.
Даже если создан пользовательский файл правил udev, udev
все равно может назначить одно или несколько альтернативных
имен для сетевой карты на основе физических характеристик.
Если пользовательское правило udev переименовывает
какой-либо сетевой адаптер, используя имя, уже назначенное
в качестве альтернативного имени другого сетевого адаптера,
это правило udev не будет выполнено. Если возникает эта
проблема, вы можете создать файл конфигурации /etc/udev/network/99-default.link
с
пустой альтернативной политикой назначения,
переопределяющей файл конфигурации по умолчанию
/usr/lib/udev/network/99-default.link
:
sed -e '/^AlternativeNamesPolicy/s/=.*$/=/' \ -i /usr/lib/udev/network/99-default.link \ > /etc/udev/network/99-default.link
Некоторое программное обеспечение, которое вы, возможно,
захотите установить позже (например, различные медиаплееры)
ожидают, что устройства /dev/cdrom
или /dev/dvd
и символические ссылки на CD-ROM
или DVD-ROM устройства должны существовать. Кроме того, может
быть удобно использовать эти символические ссылки в
/etc/fstab
. Udev поставляется с
файлом сценария, который будет генерировать правила для
создания этих символических ссылок, в зависимости от
возможностей каждого устройства, но вам нужно решить, какой
из двух режимов работы вы хотите использовать.
Во-первых, скрипт может работать в режиме «by-path» (используется по умолчанию для USB и FireWire устройств), где создаваемые им правила зависят от физического пути к CD или DVD устройству. Во-вторых, он может работать в режиме «by-id» (по умолчанию для устройств IDE и SCSI), где создаваемые им правила зависят от строк идентификации, хранящихся в самом устройстве CD или DVD. Путь определяется сценарием Udev path_id, а идентификационные строки считываются с оборудования командами ata_id или scsi_id, в зависимости от того, какой тип устройства у вас есть.
У каждого подхода есть свои преимущества; правильный подход к использованию будет зависеть от того, какие изменения устройств могут произойти. Если вы ожидаете, что физический путь к устройству (порты и/или слоты, в который оно подключено), изменится, например, потому, что вы планируете переместить диск в другой порт IDE или другой разъем USB, то вы должны использовать режим «by-id». С другой стороны, если вы ожидаете, что идентификация устройства изменится, например, потому, что оно может выйти из строя, и вы замените его другим устройством с теми же характеристиками и подключите к тем же разъемам, тогда вы должны использовать режим «by-path».
Если с вашим устройством возможен любой из вариантов, выберите тот, который по вашему мнению случается чаще.
Внешние устройства (например, привод компакт-дисков, подключенный через USB) не следует подключать методом «by-path», потому что каждый раз, когда устройство подключено в новый внешний порт, изменится его физический путь. Все внешние устройства подвержены этой проблеме, если при написании правил Udev применять режим распознавания по их физическому пути. К тому же, эта проблема не ограничивается CD и DVD-приводами.
Если вы хотите увидеть значения, которые будут использовать
скрипты udev, то для требуемого устройства CD-ROM найдите
соответствующий каталог в /sys
(например, это может быть /sys/block/hdd
) и выполните команду,
аналогичную следующей:
udevadm test /sys/block/hdd
Обратите внимание на строки, содержащие вывод различных идентификаторов *_id. Режим «by-id» будет использовать значение ID_SERIAL если оно существует и не пустое, иначе будет использована комбинация ID_MODEL и ID_REVISION. Режим «by-path» будет использовать значение ID_PATH.
Если режим по умолчанию не подходит для вашей ситуации, то в
файл /etc/udev/rules.d/83-cdrom-symlinks.rules
можно внести следующие изменения (где mode
является одним из
значений «by-id» или «by-path»):
sed -e 's/"write_cd_rules"/"write_cd_rules mode
"/' \
-i /etc/udev/rules.d/83-cdrom-symlinks.rules
Обратите внимание, что на данный момент, нет необходимости
создавать файлы правил или символические ссылки, так как вы
смонтировали каталог /dev
хоста
в систему LFS, и мы предполагаем, что символические ссылки
уже существуют. Правила и символические ссылки будут
создаваться при первой загрузке LFS системы.
Однако, если у вас есть несколько устройств CD-ROM, то
символические ссылки, сгенерированные в это время, могут
указывать на другие устройства, и иметь различия от хост
системы, потому что устройства не будут обнаружены в
предсказуемом порядке. Назначения, созданные при первой
загрузке системы LFS, будут правильными, проблема возникнет
только в том случае, если символические ссылки в обеих
системах указывают на одно и то же устройство. Если
потребуется, проверьте (и, возможно, отредактируйте)
сгенерированные правила в файле /etc/udev/rules.d/70-persistent-cd.rules
после загрузки, чтобы убедиться, что назначенные
символические ссылки соответствуют тому, что вам нужно.
Как поясняется в Раздел 9.3,
«Взаимодействие с устройствами и модулями», порядок
отображения устройства с одинаковой функциональностью в
/dev
является, как правило,
случайным. Например, если у вас есть веб камера и TV тюнер,
иногда /dev/video0
ссылается на
камеру, а /dev/video1
ссылается
на TV тюнер, а иногда, например, после перезагрузки системы,
порядок поменяется на противоположный. Для всех классов
оборудования, за исключением звуковых и сетевых карт, это
можно исправить, написав правила udev для создания постоянных
символических ссылок. Случай с сетевыми картами описан
отдельно в Раздел 9.5, «Настройка сети»,
инструкции по настройке звуковых карт можно найти в
BLFS.
Для каждого из ваших устройств, которые могут иметь такую
проблему (даже если проблема не существует в текущем
дистрибутиве Linux ), найдите соответствующий каталог в
/sys/class
или /sys/block
. Для видеоустройств это может
быть /sys/class/video4linux/video
. Определите
атрибуты, которые однозначно идентифицируют устройство
(обычно это идентификаторы поставщика и продукта и/или
серийные номера):
X
udevadm info -a -p /sys/class/video4linux/video0
Затем напишите правила, которые создают символические ссылки, например:
cat > /etc/udev/rules.d/83-duplicate_devs.rules << "EOF"
# Persistent symlinks for webcam and tuner
KERNEL=="video*", ATTRS{idProduct}=="1910", ATTRS{idVendor}=="0d81", SYMLINK+="webcam"
KERNEL=="video*", ATTRS{device}=="0x036f", ATTRS{vendor}=="0x109e", SYMLINK+="tvtuner"
EOF
В результате устройства /dev/video0
и /dev/video1
по-прежнему случайным образом
ссылаются на TV тюнер и веб-камеру (и, следовательно, никогда
не должны использоваться напрямую), но есть символические
ссылки /dev/tvtuner и /dev/webcam, которые всегда указывают
на правильное устройство.
Файлы в каталоге /etc/sysconfig/
обычно определяют, какие
интерфейсы запускаются и выключаются сетевым скриптом. Этот
каталог должен содержать файл для каждого настраиваемого
интерфейса, например ifconfig.xyz
, где «xyz» описывает
сетевую карту. Имя интерфейса (например, eth0) обычно
является подходящим. Каждый файл содержит атрибуты одного
интерфейса, такие как его IP-адреса, маски подсетей и так
далее. Имя файла должно быть ifconfig.
Если процедура именования из предыдущего раздела не использовалась, udev будет назначать имена интерфейсов сетевых карт на основе физических характеристик системы, например, enp2s1. Если вы не знаете имя вашего интерфейса, вы всегда можете запустить ip link или ls /sys/class/net после загрузки системы.
Имена интерфейсов зависят от реализации и конфигурации демона udev, работающего в системе. Демон udev для LFS (установленный в Раздел 8.75, «Udev из Systemd-255») не запустится, пока система LFS не будет загружена. Таким образом, имена интерфейсов в системе LFS не всегда можно определить, запустив эти команды в хост-дистрибутиве, даже в среде chroot.
Следующая команда создает пример конфигурационного файла для устройства eth0 со статическим IP-адресом:
cd /etc/sysconfig/ cat > ifconfig.eth0
<< "EOF"ONBOOT=
EOFyes
IFACE=eth0
SERVICE=ipv4-static
IP=192.168.1.2
GATEWAY=192.168.1.1
PREFIX=24
BROADCAST=192.168.1.255
Значения, выделенные курсивом, должны быть изменены в каждом файле, чтобы правильно настроить интерфейсы.
Если переменной ONBOOT
присвоено
значение yes
, сценарий загрузки
сети System V вызовет сетевую карту (NIC) в процессе загрузки
системы. Если задано значение, отличное от yes
сетевой адаптер будет проигнорирован
сетевым скриптом и не будет запущен автоматически. Интерфейсы
можно запускать или останавливать вручную с помощью команд
ifup и
ifdown.
Переменная IFACE
определяет имя
сетевого интерфейса, например, eth0. Она необходима для всех
файлов конфигураций сетевых устройств. Расширение файла
должно соответствовать этому значению.
Переменная SERVICE
определяет
метод получения IP-адреса. Пакет LFS-Bootscripts имеет
модульный формат назначения IP, а создание дополнительных
файлов в каталоге /lib/services/
позволит использовать другие
методы назначения IP. Переменная обычно используется для
протокола DHCP (Dynamic Host Configuration Protocol), который
рассматривается в книге BLFS
Переменная GATEWAY
должна
содержать IP-адрес шлюза по умолчанию, если таковой имеется.
Если нет, то закомментируйте эту строку.
Переменная PREFIX
указывает
количество бит, используемых в подсети. Каждый сегмент
IP-адреса состоит из 8 бит. Если маска подсети равна
255.255.255.0, то для указания номера сети используются
первые три сегмента (24 бита). Если сетевая маска
255.255.255.240, подсеть использует первые 28 бит. Префиксы
длиннее 24 бит обычно используются DSL и кабельными
интернет-провайдерами (ISP). В этом примере (PREFIX=24) маска
сети — 255.255.255.0. Измените переменную PREFIX
в соответствии c конфигурацией вашей
сети. Если этот параметр не указан, то ПРЕФИКС по умолчанию
равен 24.
Для получения дополнительной информации смотрите справочную страницу ifup.
Системе потребуются дополнительные настройки службы доменных
имен (DNS) для преобразования имен сети Интернет в IP-адреса
и наоборот. Это достигается путем указания IP-адреса
DNS-сервера, доступного от провайдера или администратора
сети, в /etc/resolv.conf
.
Создайте файл, выполнив следующие действия:
cat > /etc/resolv.conf << "EOF"
# Begin /etc/resolv.conf
domain <Ваше доменное имя>
nameserver <IP-адрес вашего основного DNS-сервера>
nameserver <IP-адрес вашего дополнительного DNS-сервера>
# End /etc/resolv.conf
EOF
Оператор domain
может быть
опущен или заменён оператором search
. Смотрите справочную страницу
resolv.conf для получения подробной информации.
Замените <IP-адрес вашего
основного DNS-сервера>
адресом наиболее
подходящего DNS сервера. DNS серверов, может быть указано
более одной записи (дополнительные серверы необходимы для
возможности резервного переключения). Если вам нужен только
один DNS-сервер, удалите вторую строку nameserver из файла. DNS-сервер
также может выступать шлюзом в локальной сети.
Адреса общедоступных DNS серверов Google - 8.8.8.8 и 8.8.4.4.
В процессе загрузки файл /etc/hostname
используется для настройки
имени хоста системы.
Создайте файл /etc/hostname
и
внесите имя хоста, выполнив команду:
echo "<lfs>
" > /etc/hostname
<lfs>
замените на имя вашего компьютера. Не вносите сюда полное
доменное имя(FQDN). Эта информация помещается в файл
/etc/hosts
.
Выберите полное доменное имя (FQDN) и возможные псевдонимы
для использования в файле /etc/hosts
. Если вы используете статические
IP-адреса, вам также необходимо определиться с IP-адресом.
Синтаксис для записи в файле hosts следующий:
IP_address myhost.example.org aliases
Если компьютер не должен быть виден в Интернете (т. е. нет зарегистрированного домена и действительного блока назначенных IP-адресов—у большинства пользователей этого нет), убедитесь, что IP-адрес находится в диапазоне внутренних сетевых IP-адресов. Допустимые диапазоны:
Диапазон адресов локальной сети Стандартный префикс
10.0.0.1 - 10.255.255.254 8
172.x.0.1 - 172.x.255.254 16
192.168.y.1 - 192.168.y.254 24
x может быть любым числом в диапазоне 16-31. y может быть любым числом в диапазоне 0-255.
Правильным IP адресом в локальной сети может быть 192.168.1.1.
Если компьютер должен быть виден в Интернете, действительным полным доменным именем может быть само имя домена или строка, полученная путем объединения префикса (часто имени хоста) и домена с помощью символа «.». Кроме того, вам необходимо обратиться к администратору домена, чтобы связать полное доменное имя и ваш общедоступный IP-адрес.
Даже если компьютер не виден из Интернета, полное доменное
имя все равно необходимо для правильной работы некоторых
программ, таких как MTA. Для этих целей можно использовать
специальное полное доменное имя localhost.localdomain
.
Создайте файл /etc/hosts
,
выполнив команду:
cat > /etc/hosts << "EOF"
# Begin /etc/hosts
127.0.0.1 localhost.localdomain localhost
127.0.1.1 <FQDN>
<HOSTNAME>
<192.168.1.1>
<FQDN>
<HOSTNAME>
[alias1] [alias2 ...]
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
# End /etc/hosts
EOF
Значения <192.168.1.1>
,
<FQDN>
, и
<HOSTNAME>
должны быть изменены в соответствии с предпочтениями
пользователя или требованиями сети (если имеется IP-адрес
выданный сетевым/системным администратором и машина
подключена к существующей сети). Необязательные параметры
могут быть опущены.
В этой версии LFS используется специальное средство загрузки под названием SysVinit, основанное на наборе уровней выполнения (run-levels). Процедура загрузки может сильно отличаться от одной системы к другой; и тот факт, что в конкретном дистрибутиве Linux все работало должным образом, не гарантирует, что оно будут работать так же в LFS. LFS работает по-своему, но соблюдает общепринятые стандарты.
Существует альтернативная система загрузки, которая называется systemd. Мы не будем обсуждать этот вариант загрузки здесь. Для получения подробного описания, посетите https://www.linux.com/training-tutorials/understanding-and-using-systemd/.
SysVinit (в дальнейшем именуемый «init») использует схему уровней выполнения. Существует семь уровней выполнения, пронумерованных от 0 до 6. (На самом деле уровней больше, но они предназначены для особых случаев и обычно не используются. Подробности смотрите в руководстве init(8)). Каждый из них соответствует действиям, которые компьютер должен выполнить при запуске и выключении. Уровень выполнения по умолчанию — 3. Ниже приведено описание различных уровней в том виде, в каком они реализованы в LFS:
0: выключение компьютера
1: однопользовательский режим
2: зарезервировано для настройки, в остальном аналогично 3
3: многопользовательский режим с поддержкой сети
4: зарезервировано для настройки, в остальном аналогично 3
5: то же, что и 4, обычно используется для входа в систему с графическим интерфейсом (например,
gdm от GNOME или lxdm от LXDE)
6: перезагрузка компьютера
Раньше, много лет назад, уровень выполнения 2 обозначался как «многопользовательский режим без поддержки сети», тогда, несколько пользователей могли подключаться к системе через последовательные порты. В сегодняшних условиях это не имеет смысла, и мы обозначаем этот уровень как «зарезервировано».
Во время инициализации ядра первой запускаемой программой
(если она не переопределена в командной строке) является
init. Эта
программа считывает файл инициализации /etc/inittab
. Создайте этот файл:
cat > /etc/inittab << "EOF"
# Begin /etc/inittab
id:3:initdefault:
si::sysinit:/etc/rc.d/init.d/rc S
l0:0:wait:/etc/rc.d/init.d/rc 0
l1:S1:wait:/etc/rc.d/init.d/rc 1
l2:2:wait:/etc/rc.d/init.d/rc 2
l3:3:wait:/etc/rc.d/init.d/rc 3
l4:4:wait:/etc/rc.d/init.d/rc 4
l5:5:wait:/etc/rc.d/init.d/rc 5
l6:6:wait:/etc/rc.d/init.d/rc 6
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
su:S06:once:/sbin/sulogin
s1:1:respawn:/sbin/sulogin
1:2345:respawn:/sbin/agetty --noclear tty1 9600
2:2345:respawn:/sbin/agetty tty2 9600
3:2345:respawn:/sbin/agetty tty3 9600
4:2345:respawn:/sbin/agetty tty4 9600
5:2345:respawn:/sbin/agetty tty5 9600
6:2345:respawn:/sbin/agetty tty6 9600
# End /etc/inittab
EOF
Пояснения по содержимому этого файла инициализации находится
на справочной странице inittab. Для LFS основной командой
является rc. В
приведенном выше файле инициализации, rc будет выполнять все
сценарии, начинающиеся с символа S в каталоге /etc/rc.d/rcS.d
, за которыми следуют все
скрипты, начинающиеся с S в каталоге /etc/rc.d/rc?.d
, где знак вопроса задается
значением initdefault.
Для удобства, скрипт rc считывает библиотеку
функций из /lib/lsb/init-functions
. Эта библиотека
также читает необязательный файл конфигурации /etc/sysconfig/rc.site
. В этот файл можно
поместить любой из параметров конфигурации системы, описанных
в последующих разделах, что позволяет объединить все
параметры системы в одном файле.
Для удобства отладки скрипт functions также записывает весь
вывод в /run/var/bootlog
.
Поскольку каталог /run
является
tmpfs, этот файл не сохраняется при загрузке; однако его
содержимое добавляется в файл /var/log/boot.log
по окончании процесса
загрузки.
Изменить уровень выполнения можно с помощью команды
init <runlevel>
,
где <runlevel>
- это
целевой уровнем выполнения. Например, чтобы перезагрузить
компьютер, пользователь должен выполнить команду
init 6,
которая является псевдонимом для команды reboot. Аналогично, init
0 является псевдонимом для команды halt.
В каталоге /etc/rc.d
есть ещё
несколько каталогов, которые выглядят как rc?.d
(где ? - номер уровня выполнения),
все они содержат ряд символических ссылок. Некоторые ссылки
начинаются с K,
другие начинаются с S, и все они содержат две цифры
после начальной буквы. K означает остановить (убить)
службу, а S означает запустить службу. Числа определяют
порядок выполнения сценариев от 00 до 99—чем меньше число,
тем раньше запускается скрипт. Когда init переключается на
другой уровень выполнения, соответствующие службы либо
запускаются, либо останавливаются, в зависимости от
выбранного уровня выполнения.
Реальные скрипты находятся в каталоге /etc/rc.d/init.d
. Они выполняют
фактическую работу, и символические ссылки указывают на
них. Ссылки К и S указывают на один и тот же скрипт в
/etc/rc.d/init.d
. Это связано
с тем, что скрипты могут вызываться с разными параметрами,
такими как start
,
stop
, restart
, reload
, и status
. Когда встречается
ссылка K, соответствующий скрипт запускается с аргументом
stop
. Когда
встречается S-ссылка, соответствующий скрипт запускается с
аргументом start
.
Ниже приведено описание к аргументам скриптов:
start
Служба запущена.
stop
Служба остановлена.
restart
Служба остановлена и снова запущена.
reload
Конфигурация сервиса обновлена. Используется после изменения файла конфигурации службы, когда перезапуск не требуется.
status
Сообщает, запущена ли служба и с какими ИД процессов.
Не стесняйтесь изменять работу процесса загрузки (в конце концов, это ваша собственная система LFS). Приведенные здесь файлы являются примером того, как это можно сделать.
Инит-скрипт /etc/rc.d/init.d/udev
запускает
udevd, который
инициализирует все устройства "холодного подключения",
которые уже были созданы ядром, и ожидает выполнения всех
правил. Скрипт также отключает обработчик uevent по умолчанию
/sbin/hotplug
. Это сделано
потому, что ядру больше не нужно обращаться к внешнему
бинарному файлу. Вместо этого udevd будет прослушивать
сокет netlink на предмет событий, которые вызывает ядро.
Инит-скрипт /etc/rc.d/init.d/udev_retry
решает задачу повторного запуска событий для подсистем,
правила которых могут зависеть от файловых систем, которые не
монтируются до запуска скрипта mountfs (в частности, его
вызывают /usr
и /var
). Этот скрипт запускается после
скрипта mountfs, поэтому эти
правила (при повторном запуске) должны сработать во второй
раз. Он настраивается в файле /etc/sysconfig/udev_retry
; любые слова в
этом файле, кроме комментариев, являются именами подсистем,
которые запускаются при повторной попытке. Чтобы найти
подсистему устройства, используйте udevadm info --attribute-walk
<device>, где <device> - это
абсолютный путь в /dev или /sys, такой как /dev/sr0 или
/sys/class/rtc.
Для получения информации о загрузке модуля ядра и udev смотрите Раздел 9.3.2.3, «Загрузка модуля».
Скрипт setclock
считывает время с аппаратных часов, также известных как часы
BIOS или CMOS (Complementary Metal Oxide Semiconductor). Если
на аппаратных часах установлено время UTC (всемирное
скоординированное время), этот скрипт преобразует полученное
значение в локальное время, используя файл /etc/localtime
(который сообщает программе
hwclock, в
какой временной зоне находится пользователь). Невозможно
определить, установленное на аппаратных часах время UTC или
же локальное, поэтому необходимо указать его вручную.
Скрипт setclock запускается системой udev при загрузке, когда ядро определяет возможности аппаратного обеспечения. Также его можно запустить вручную с параметром stop, чтобы сохранить системное время в аппаратные часы CMOS.
Если Вы не можете вспомнить, установлено на аппаратных часах
UTC или локальное время, запустите команду hwclock --localtime --show
.
Она отобразит текущее время в соответствии с аппаратными
часами. Если оно совпадает с тем, что показывают ваши
настенные/наручные часы, значит на часах CMOS установлено
локальное время. Если вывод hwclock не совпадает с
локальным временем, скорее всего, это UTC. Проверьте это,
добавив или вычитая нужное количество часов для вашего
часового пояса ко времени, отображаемому hwclock. Например, если ваш
часовой пояс это MSK, также известный как GMT +0300, то нужно
вычесть три часа из локального времени.
Измените значение переменной UTC
ниже на 0
(ноль),
если на аппаратных часах установлено НЕ UTC.
Создайте новый файл /etc/sysconfig/clock
выполнив:
cat > /etc/sysconfig/clock << "EOF"
# Begin /etc/sysconfig/clock
UTC=1
# Set this to any options you might need to give to hwclock,
# such as machine hardware clock type for Alphas.
CLOCKPARAMS=
# End /etc/sysconfig/clock
EOF
Хороший совет, объясняющий, как обращаться с временем в LFS,
доступен по адресу
https://mirror.linuxfromscratch.ru/hints/downloads/files/time.txt.
Там объясняются такие вопросы, как часовые пояса, UTC и
переменная окружения TZ
.
Параметры CLOCKPARAMS и UTC также могут быть указаны в
файле /etc/sysconfig/rc.site
.
Эта секция описывает настройку скрипта console, который
устанавливает раскладку клавиатуры, шрифт консоли и уровень
подробности информации, выводимой ядром на консоль. Если Вы
не планируете использовать символы, не соответствующие
стандарту ASCII (например, знак копирайта, символы фунта и
евро), и собираетесь печатать только в английской раскладке,
то можете пропустить большую часть секции. Без файла
конфигурации (или эквивалентных настроек в rc.site
), скрипт console не будет ничего
делать.
Скрипт console
считывает конфигурацию из файла /etc/sysconfig/console
. Решите для себя,
какую раскладку клавиатуры и какой шрифт намерены
использовать. В этом также могут помочь различные HOWTO для
конкретных языков; смотрите https://tldp.org/HOWTO/HOWTO-INDEX/other-lang.html.
Если вы все еще сомневаетесь, посмотрите в каталогах
/usr/share/keymaps
и
/usr/share/consolefonts
допустимые раскладки и экранные шрифты. Прочтите справочные
страницы loadkeys(1) и
setfont(8),
чтобы определить правильные аргументы для этих программ.
Файл /etc/sysconfig/console
должен содержать строки вида: ПЕРЕМЕННАЯ=значение
. Допустимы следующие
переменные:
Эта переменная задает уровень подробности сообщений,
посылаемых ядром на системную консоль. Значение этой
переменной передается в качестве аргумента утилите
dmesg -n.
Допустимы уровни от 1
(нет
сообщений) до 8
. По
умолчанию 7
, что является
довольно подробным.
Эта переменная указывает аргументы для программы
loadkeys,
обычно это имя загружаемой раскладки, например,
it
. Если эта переменная не
установлена, загрузочный скрипт не будет запускать
программу loadkeys, и будет использоваться раскладка по
умолчанию. Обратите внимание, что некоторые раскладки
имеют несколько версий с одним и тем же именем (cz и
его варианты в qwerty/ и qwertz/, es в olpc/ и qwerty/
и trf в fgGIod/ и qwerty/). В этих случаях также
следует указать родительский каталог (например,
qwerty/es), чтобы обеспечить загрузку правильной
раскладки.
Эта (крайне редко используемая) переменная задает
аргументы для второго вызова программы loadkeys. Она
полезна, если стандартная раскладка вас не совсем
устраивает и необходимо внести небольшую корректировку.
Например, чтобы добавить символ евро в раскладку,
которая его не содержит, присвойте этой переменной
значение euro2
.
Эта переменная определяет аргументы для программы
setfont.
Обычно она включает в себя имя шрифта -m
и имя загружаемой таблицы символов.
Например, чтобы загрузить шрифт «lat1-16»
вместе с таблицей символов «8859-1»
(подходит для США), установите эту переменную в
lat1-16 -m 8859-1
. В
режиме UTF-8 ядро использует таблицу символов для
преобразования 8-битных кодов клавиш в UTF-8, поэтому
аргумент параметра "-m" должен быть установлен на
кодировку соответствующих кодов клавиш в раскладке.
Присвойте этой переменной значение 1
, yes
или true
, чтобы
переключить консоль в режим UTF-8. Это полезно при
использовании локали, основанной на UTF-8, и не
рекомендуется в иных случаях.
Для многих раскладок клавиатуры в пакете Kbd не существует готового Unicode-варианта. Скрипт console будет на лету конвертировать имеющуюся раскладку в UTF-8, если присвоить этой переменной имя доступной не-UTF-8 раскладки.
Несколько примеров:
Мы будем использовать C.UTF-8
в качестве локали для
интерактивных сеансов в консоли Linux в Раздел 9.7,
«Настройка системной локали,», поэтому нам следует
установить значение переменной UNICODE
в 1
. Консольные шрифты, поставляемые
пакетом Kbd,
содержащие глифы для всех символов сообщений программы
в C.UTF-8
являются
LatArCyrHeb*.psfu.gz
,
LatGrkCyr*.psfu.gz
,
Lat2-Terminus16.psfu.gz
и
pancyrillic.f16.psfu.gz
из каталога /usr/share/consolefonts
(в других
поставляемых консольных шрифтах отсутствуют глифы
некоторых символов Unicode, таких как левые/правые
кавычки и английское тире). Поэтому установите один из
них, например Lat2-Terminus16.psfu.gz
, в качестве
шрифта консоли по умолчанию:
cat > /etc/sysconfig/console << "EOF"
# Begin /etc/sysconfig/console
UNICODE="1"
FONT="Lat2-Terminus16"
# End /etc/sysconfig/console
EOF
Для русскоязычных пользователей может подойти такой вариант:
cat > /etc/sysconfig/console << "EOF"
# Begin /etc/sysconfig/console
UNICODE="1"
KEYMAP="ruwin_alt_sh-UTF-8"
FONT="cyr-sun16"
# End /etc/sysconfig/console
EOF
Для поиска нужной раскладки, выполните команду: find /usr/share/keymaps -type f
ruwin_alt-UTF-8
-
переключение раскладки по Alt.
ruwin_alt_sh-UTF-8
-
переключение раскладки по Alt+Shift.
ruwin_cplk-UTF-8
-
переключение раскладки по Caps Lock.
ruwin_ct_sh-UTF-8
-
переключение раскладки по Ctrl+Shift.
ruwin_ctrl-UTF-8
-
переключение раскладки по Ctrl.
Посмотреть список доступных шрифтов можно с помощью следующей команды: ls /usr/share/consolefonts
Для не-Unicode настройки необходимы только переменные KEYMAP и FONT. Например, для польских пользователей может подойти такой вариант:
cat > /etc/sysconfig/console << "EOF"
# Begin /etc/sysconfig/console
KEYMAP="pl2"
FONT="lat2a-16 -m 8859-2"
# End /etc/sysconfig/console
EOF
Как упоминалось выше, иногда бывает необходимо подкорректировать раскладку. Следующий пример добавляет символ евро к немецкой раскладке:
cat > /etc/sysconfig/console << "EOF"
# Begin /etc/sysconfig/console
KEYMAP="de-latin1"
KEYMAP_CORRECTIONS="euro2"
FONT="lat0-16 -m 8859-15"
UNICODE="1"
# End /etc/sysconfig/console
EOF
Ниже приведен пример с поддержкой Unicode для болгарского языка, где существует стандартная раскладка UTF-8:
cat > /etc/sysconfig/console << "EOF"
# Begin /etc/sysconfig/console
UNICODE="1"
KEYMAP="bg_bds-utf8"
FONT="LatArCyrHeb-16"
# End /etc/sysconfig/console
EOF
Из-за использования 512-символьного шрифта LatArCyrHeb-16 в предыдущем примере, яркие цвета больше не доступны в консоли Linux, если используется фреймбуфер. Если Вы хотите использовать яркие цвета без фреймбуфера и можете обходиться без символов, не относящихся к вашему языку, тогда можно использовать специфичный для вашего языка 256-символьный шрифт, как показано ниже:
cat > /etc/sysconfig/console << "EOF"
# Begin /etc/sysconfig/console
UNICODE="1"
KEYMAP="bg_bds-utf8"
FONT="cyr-sun16"
# End /etc/sysconfig/console
EOF
Следующий пример демонстрирует автоматическое преобразование раскладки из ISO-8859-15 в UTF-8 и включает "мертвые" клавиши в режиме Unicode:
cat > /etc/sysconfig/console << "EOF"
# Begin /etc/sysconfig/console
UNICODE="1"
KEYMAP="de-latin1"
KEYMAP_CORRECTIONS="euro2"
LEGACY_CHARSET="iso-8859-15"
FONT="LatArCyrHeb-16 -m 8859-15"
# End /etc/sysconfig/console
EOF
Некоторые раскладки включают в себя "мертвые" клавиши (то есть клавиши, нажатие которых само по себе не приводит к появлению на экране символа, но которые влияют на символ, генерируемый следующей клавишей) или определяют слияние символов (например: «нажмите Ctrl+. A E чтобы получить Æ» в раскладке по умолчанию). Linux-6.7.4 правильно интерпретирует "мертвые" клавиши и слияния, только когда исходные символы имеют 8-битные коды. Эта особенность не влияет на раскладки для европейских языков, поскольку в них "сливаются" два ASCII-символа или добавляются подчеркивания к неподчеркнутым ASCII-символам. Однако, в режиме UTF-8 могут быть проблемы, например, для греческого языка, когда необходимо подчеркнуть символ α. Решением в этой ситуации будет отказ от использования UTF-8 или установка графической системы X Window, не имеющих подобных ограничений.
Для китайского, японского, корейского и некоторых других языков невозможно настроить консоль Linux так, чтобы она отображала все необходимые символы. Пользователи, которым требуются эти языки, должны установить систему X Window, шрифты, покрывающие необходимый диапазон символов, и правильный метод ввода (например, SCIM поддерживает большое число разнообразных языков).
Файл /etc/sysconfig/console
управляет только локализацией текстовой консоли Linux. Он
никак не влияет на настройки раскладки клавиатуры и шрифтов
в системе X Window, в сессиях SSH или на последовательном
терминале. В этих ситуациях ограничения, описанные в двух
расположенных выше абзацах, не применяются.
Иногда необходимо создавать файлы во время загрузки.
Например, часто требуется каталог /tmp/.ICE-unix
. Это можно сделать, создав
запись в скрипте /etc/sysconfig/createfiles
. Формат этого
файла описан в комментариях файла конфигурации по умолчанию.
Скрипт sysklogd
вызывает
программу syslogd как часть
инициализации System V. Параметр -m 0
отключает периодическую
(по умолчанию - каждые 20 минут) запись временных меток в
файлы журналов, производимую syslogd. Если Вам
необходимо включить периодическую запись временных меток,
отредактируйте файл /etc/sysconfig/rc.site
и присвойте
переменной SYSKLOGD_PARMS требуемое значение. Например, чтобы
сбросить все параметры, присвойте переменной пустое значение:
SYSKLOGD_PARMS=
Дополнительные параметры смотрите в man syslogd
.
Необязательный файл /etc/sysconfig/rc.site
содержит настройки,
автоматически применяемые всеми загрузочными скриптами. Этот
файл может содержать парамеры, обычно указываемые в файлах
hostname
, console
и clock
из каталога /etc/sysconfig/
. Если значение одной и той
же переменной присваивается, как в одном из этих файлов, так
и в rc.site
, приоритет имеет
значение из специализированного файла.
rc.site
также содержит
параметры, которые могут настраивать другие аспекты процесса
загрузки. Установка переменной IPROMPT позволит выборочно
запускать загрузочные скрипты. Другие параметры описаны в
комментариях к файлу. Версия файла по умолчанию выглядит
следующим образом:
# rc.site # Optional parameters for boot scripts. # Distro Information # These values, if specified here, override the defaults #DISTRO="Linux From Scratch" # The distro name #DISTRO_CONTACT="lfs-dev@lists.linuxfromscratch.org" # Bug report address #DISTRO_MINI="LFS" # Short name used in filenames for distro config # Define custom colors used in messages printed to the screen # Please consult `man console_codes` for more information # under the "ECMA-48 Set Graphics Rendition" section # # Warning: when switching from a 8bit to a 9bit font, # the linux console will reinterpret the bold (1;) to # the top 256 glyphs of the 9bit font. This does # not affect framebuffer consoles # These values, if specified here, override the defaults #BRACKET="\\033[1;34m" # Blue #FAILURE="\\033[1;31m" # Red #INFO="\\033[1;36m" # Cyan #NORMAL="\\033[0;39m" # Grey #SUCCESS="\\033[1;32m" # Green #WARNING="\\033[1;33m" # Yellow # Use a colored prefix # These values, if specified here, override the defaults #BMPREFIX=" " #SUCCESS_PREFIX="${SUCCESS} * ${NORMAL} " #FAILURE_PREFIX="${FAILURE}*****${NORMAL} " #WARNING_PREFIX="${WARNING} *** ${NORMAL} " # Manually set the right edge of message output (characters) # Useful when resetting console font during boot to override # automatic screen width detection #COLUMNS=120 # Interactive startup #IPROMPT="yes" # Whether to display the interactive boot prompt #itime="3" # The amount of time (in seconds) to display the prompt # The total length of the distro welcome string, without escape codes #wlen=$(echo "Welcome to ${DISTRO}" | wc -c ) #welcome_message="Welcome to ${INFO}${DISTRO}${NORMAL}" # The total length of the interactive string, without escape codes #ilen=$(echo "Press 'I' to enter interactive startup" | wc -c ) #i_message="Press '${FAILURE}I${NORMAL}' to enter interactive startup" # Set scripts to skip the file system check on reboot #FASTBOOT=yes # Skip reading from the console #HEADLESS=yes # Write out fsck progress if yes #VERBOSE_FSCK=no # Speed up boot without waiting for settle in udev #OMIT_UDEV_SETTLE=y # Speed up boot without waiting for settle in udev_retry #OMIT_UDEV_RETRY_SETTLE=yes # Skip cleaning /tmp if yes #SKIPTMPCLEAN=no # For setclock #UTC=1 #CLOCKPARAMS= # For consolelog (Note that the default, 7=debug, is noisy) #LOGLEVEL=7 # For network #HOSTNAME=mylfs # Delay between TERM and KILL signals at shutdown #KILLDELAY=3 # Optional sysklogd parameters #SYSKLOGD_PARMS="-m 0" # Console parameters #UNICODE=1 #KEYMAP="de-latin1" #KEYMAP_CORRECTIONS="euro2" #FONT="lat0-16 -m 8859-15" #LEGACY_CHARSET=
Загрузочные скрипты LFS загружают и завершают работу
системы довольно эффективно, но есть несколько настроек,
которые вы можете внести в файл rc.site, чтобы еще больше
повысить скорость и настроить сообщения в соответствии с
вашими предпочтениями. Чтобы сделать это, измените
настройки в приведенном выше файле /etc/sysconfig/rc.site
.
Во время работы загрузочного скрипта udev
происходит вызов udev settle, для
завершения которого требуется некоторое время. Это
время может и не потребоваться в зависимости от
конфигурации устройств в системе. Если у вас имеются
только простые разделы и одна сетевая карта, процессу
загрузки, вероятно, не нужно будет ждать завершения
работы этой команды. Чтобы пропустить её, установите
переменную OMIT_UDEV_SETTLE=y.
Скрипт загрузки udev_retry
также по умолчанию
запускает udev
settle. Команда необходима только
тогда, когда каталог /var
смонтирован в отдельный
раздел. Это связано с тем, что часам нужен доступ к
файлу /var/lib/hwclock/adjtime
. Для
других настроек также может потребоваться дождаться
завершения udev, но в большинстве случаев в этом нет
необходимости. Пропустите команду, установив
переменную OMIT_UDEV_RETRY_SETTLE=y.
По умолчанию проверка файловой системы выполняется в "тихом" режиме. Это может показаться задержкой во время процесса загрузки. Чтобы включить вывод fsck, установите переменную VERBOSE_FSCK=y.
При перезагрузке вы, возможно, захотите полностью
пропустить проверку файловой системы, fsck. Чтобы сделать
это, либо создайте файл /fastboot
, либо перезагрузите
систему командой /sbin/shutdown -f -r
now. С другой стороны, вы можете
принудительно проверить все файловые системы, создав
/forcefsck
или запустив
shutdown с
параметром -F
вместо -f
.
Установка переменной FASTBOOT=y отключит fsck во время процесса загрузки до тех пор, пока она не будет удалена. Это не рекомендуется делать на постоянной основе.
Обычно все файлы в каталоге /tmp
удаляются во время загрузки. В
зависимости от количества имеющихся файлов или
каталогов это может привести к заметной задержке в
процессе загрузки. Чтобы пропустить удаление этих
файлов, установите переменную SKIPTMPCLEAN=y.
Во время завершения работы, init отправляет сигнал TERM каждой запущенной программе (например, agetty), ожидает установленное время (по умолчанию 3 секунды), затем посылает каждому процессу сигнал завершения(KILL) и снова ждёт. Этот процесс повторяется в сценарии sendsignals для любых процессов, которые не завершаются их собственными скриптами. Задержка для init может быть установлена путем передачи параметра. Например, чтобы устранить задержку в init, передайте параметр -t0 при выключении или перезагрузке (например, /sbin/shutdown -t0 -r now). Задержку для скрипта sendsignals можно пропустить, установив параметр KILLDELAY=0.
Некоторые переменные окружения, необходимые для поддержки вашего языка. Правильная их установка влияет на:
Выходные данные программ, переводятся на ваш родной язык
Правильную интерпретацию символов в буквы, цифры и другие классы. Это необходимо для того, чтобы bash правильно принимал не-ASCII символы, в командной строке в неанглоязычных языковых системах
Правильную для страны сортировку по алфавиту
Подходящий формат бумаги по умолчанию
Правильное форматирование денежных значений, значений времени и дат
Ниже замените <ll>
двухбуквенным кодом
нужного вам языка (например en
), а
<CC>
двухбуквенным кодом соответствующей страны (например
GB
). <charmap>
нужно заменить
на каноническую кодировку для выбраной вами локали. Также могут
присутствовать необязательные модификаторы, такие как
@euro
.
Список всех локалей, поддерживаемых Glibc, можно получить, выполнив следующую команду:
locale -a
Таблицы символов могут иметь несколько синонимов. Например
ISO-8859-1
так же называют
iso8859-1
и iso88591
. Некоторые приложения не могут
корректно обрабатывать различные синонимы (например
UTF-8
должно быть указано как
UTF-8
, а не utf8
), поэтому в большинстве случаев
безопаснее всего выбрать каноническое имя для конкретной
локали. Для определения канонического имени локали выполните
команду ниже, заменив <locale
name>
на вывод locale -a для желаемой локали
(например en_GB.iso88591
в нашем
примере).
LC_ALL=<locale name>
locale charmap
Для локали en_GB.iso88591
приведенная выше команда напечатает:
ISO-8859-1
Окончательная настройка локали будет выглядеть так:
en_GB.ISO-8859-1
. Важно, чтобы
локаль, найденная с помощью приведенной выше методики, была
проверена перед её добавлением в файлы запуска Bash:
LC_ALL=<locale name> locale language LC_ALL=<locale name> locale charmap LC_ALL=<locale name> locale int_curr_symbol LC_ALL=<locale name> locale int_prefix
Приведенные выше команды должны вывести название языка, кодировку символов, используемую в локали, местную валюту и телефонный код страны. Если какая-либо из команд завершается с сообщением об ошибке, похожим на указанное ниже, это означает, что ваша локаль либо не была установлена в Главе 8, либо не поддерживается стандартной установкой Glibc.
locale: Cannot set LC_* to default locale: No such file or directory
Если это произойдет, вам следует либо установить желаемую локаль с помощью команды localedef, либо рассмотреть возможность выбора другой локали. Дальнейшие инструкции не предполагают таких сообщений об ошибках от Glibc.
Другие пакеты также могут работать некорректно (но не всегда будут отображать какие-либо сообщения об ошибках), если название локали не соответствует их ожиданиям. В таких случаях изучите, какие ещё дистрибутивы Linux поддерживают ваш язык, возможно, это даст некоторую полезную информацию
Программа оболочки /bin/bash (далее именуемая
как «оболочка») использует начальный набор
файлов, чтобы помочь создать среду для запуска. Каждый файл
имеет определенное назначение и может по-разному влиять на вход
в систему и интерактивное окружение. Файлы в каталоге
/etc
содержат глобальные
настройки. Если в домашнем каталоге существуют эквивалентные
файлы, они могут переопределить глобальные настройки.
Интерактивная оболочка входа запускается после успешного входа
с использованием /bin/login, прочитав файл
/etc/passwd
. Интерактивная
оболочка без входа в систему запускается из командной строки
(например, [prompt]$
/bin/bash). Неинтерактивная
оболочка обычно присутствует когда выполняется скрипт оболочки.
Он неинтерактивен, поскольку обрабатывает скрипт и не ожидает
ввода пользователем между командами.
Создайте файл /etc/profile
после того, как будут определены
правильные настройки локали, чтобы установить желаемый
язык, но вместо этого установите локаль C.UTF-8
при запуске консоли Linux (чтобы
программы не выводили символы, которые консоль Linux не может
отобразить):
cat > /etc/profile << "EOF"
# Begin /etc/profile
for i in $(locale); do
unset ${i%=*}
done
if [[ "$TERM" = linux ]]; then
export LANG=C.UTF-8
else
export LANG=<ll>_<CC>.<charmap><@modifiers>
fi
# End /etc/profile
EOF
Локаль C
(используемая по
умолчанию) и en_US
(одна из
рекомендуемых для англоязычных пользователей в Соединенных
Штатах) это разные локали. C
использует 7-битный набор символов US-ASCII и обрабатывает
байты с установленным старшим битом как недопустимые символы.
Вот почему, например, команда ls заменяет их
вопросительными знаками в этой локали. Кроме того, попытка
отправить почту с такими символами из Mutt или Pine приводит к
тому что, отправляемые сообщения не соответствуют RFC
(кодировка в исходящей почте указана как unknown 8-bit
). Рекомендуется
использовать локаль C
, если вы
уверены, что вам никогда не понадобятся 8-битные символы.
Файл inputrc
это конфигурационный
файл библиотеки readline, который предоставляет возможности
редактирования, когда пользователь вводит строку с терминала.
Он работает путем преобразования ввода с клавиатуры в
определенные действия. Readline используется bash и
большинством других оболочек, а также многими другими
приложениями.
Большинство людей не нуждаются в специальных настройках,
поэтому приведенная ниже команда создает глобальный
/etc/inputrc
, используемый всеми,
кто входит в систему. Если позже вы решите, что вам нужно
переопределить значения по умолчанию для одного из
пользователей, вы можете создать файл .inputrc
в домашнем каталоге пользователя и
указать в нём измененные настройки.
Дополнительные сведения о редактировании файла inputrc
см. в разделе info bash в секции
Readline Init File.
Также хорошим источником информации является info readline.
Ниже приведен общий глобальный inputrc
с комментариями, объясняющими, что
делают различные параметры. Обратите внимание, что комментарии
не могут находиться в той же строке, что и команды. Создайте
файл с помощью следующей команды:
cat > /etc/inputrc << "EOF"
# Begin /etc/inputrc
# Modified by Chris Lynn <roryo@roryo.dynup.net>
# Разрешить перенос приглашения оболочки на следующую строку
set horizontal-scroll-mode Off
# Разрешить 8-битный ввод
set meta-flag On
set input-meta On
# Отключить обрезание восьмого бита в вводимых символах
set convert-meta Off
# Выводить на экран все восемь бит
set output-meta On
# Звуковой сигнал - none, visible или audible, соответственно никакого, видимый или слышимый
set bell-style none
# Нижеследующие команды привязывают escape-последовательности (первый аргумент)
# к специфичным для Readline функциям (второй аргумент)
"\eOd": backward-word
"\eOc": forward-word
# для консоли linux
"\e[1~": beginning-of-line
"\e[4~": end-of-line
"\e[5~": beginning-of-history
"\e[6~": end-of-history
"\e[3~": delete-char
"\e[2~": quoted-insert
# для xterm
"\eOH": beginning-of-line
"\eOF": end-of-line
# для Konsole
"\e[H": beginning-of-line
"\e[F": end-of-line
# End /etc/inputrc
EOF
Файл shells
содержит список
оболочек входа в систему. Приложения используют этот файл для
определения корректности оболочки. Для каждой оболочки должна
присутствовать одна строка, состоящая из пути к файлу оболочки
относительно корня структуры каталогов (/).
Например, chsh обращается к этому файлу, чтобы определить, может ли непривилегированный пользователь изменить оболочку входа для своей учетной записи. Если имя команды не указано в списке, пользователю будет отказано в возможности изменять оболочки.
Это обязательное условие для таких приложений, как GDM, которые не заполняют список
пользователей, если ему не удаётся найти /etc/shells
, или демонов FTP, которые
традиционно запрещают доступ пользователям с оболочками, не
включенными в этот файл.
cat > /etc/shells << "EOF"
# Begin /etc/shells
/bin/sh
/bin/bash
# End /etc/shells
EOF
Пришло время сделать систему LFS загрузочной. В этой главе
обсуждается создание файла /etc/fstab
, сборка ядра для новой системы и
установка загрузчика GRUB, чтобы система LFS могла быть выбрана
для загрузки при запуске.
Файл /etc/fstab
используется
некоторыми программами для определения того, какие файловые
системы должны монтироваться по умолчанию, в каком порядке и
какие из них должны быть проверены (на наличие ошибок
целостности) перед монтированием. Создайте новую таблицу
файловых систем следующим образом:
cat > /etc/fstab << "EOF"
# Begin /etc/fstab
# file system mount-point type options dump fsck
# order
/dev/<xxx>
/ <fff>
defaults 1 1
/dev/<yyy>
swap swap pri=1 0 0
proc /proc proc nosuid,noexec,nodev 0 0
sysfs /sys sysfs nosuid,noexec,nodev 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
tmpfs /run tmpfs defaults 0 0
devtmpfs /dev devtmpfs mode=0755,nosuid 0 0
tmpfs /dev/shm tmpfs nosuid,nodev 0 0
cgroup2 /sys/fs/cgroup cgroup2 nosuid,noexec,nodev 0 0
# End /etc/fstab
EOF
Замените <xxx>
,
<yyy>
, и
<fff>
подходящими для системы значениями, например, sda2
, sda5
, и
ext4
. Для получения подробной
информации о параметрах в этом файле, смотрите fstab(5).
Файловым системам операционных систем MS DOS и Windows (таким
как vfat, ntfs, smbfs, cifs, iso9660, udf) требуется
специальная опция utf8, чтобы не-ASCII символы в именах файлов
интерпретировались правильно. Для локалей, отличных от UTF-8,
значение iocharset
должно быть
таким же, как набор символов локали и настроено так, чтобы ядро
понимало его. Это будет работать, если соответствующее
определение набора символов (находится в разделе File systems
-> Native Language Support при настройке ядра) было
скомпилировано в ядро или собрано как модуль. Однако, если
набор символов локали — UTF-8, параметр iocharset=utf8
сделает файловую систему
чувствительной к регистру. Чтобы исправить это, используйте
специальную опцию utf8
вместо
iocharset=utf8
для локалей UTF-8.
Параметр «codepage» также необходим для файловых
систем vfat и smbfs. Он должен быть установлен на номер кодовой
страницы, используемый в MS-DOS в вашей стране. Например, для
монтирования флешек пользователь локали ru_RU.KOI8-R должен
установить следующие значения в группе параметров строки
монтирования в /etc/fstab
:
noauto,user,quiet,showexec,codepage=866,iocharset=koi8r
Соответствующий фрагмент параметров для пользователей ru_RU.UTF-8 выглядит следующим образом:
noauto,user,quiet,showexec,codepage=866,utf8
Обратите внимание, что iocharset
используется по умолчанию для iso8859-1
(которая сохраняет файловую систему
нечувствительной к регистру), а параметр utf8
указывает ядру, что нужно преобразовать
имена файлов с использованием UTF-8, чтобы их можно было
интерпретировать в локали UTF-8.
Также возможно указать значения кодовой страницы по умолчанию и
iocharset для некоторых файловых систем во время настройки
ядра. Соответствующие параметры называются «Default NLS Option»
(CONFIG_NLS_DEFAULT)
, «Default Remote NLS
Option» (CONFIG_SMB_NLS_DEFAULT
), «Default codepage for
FAT» (CONFIG_FAT_DEFAULT_CODEPAGE
) и «Default iocharset for
FAT» (CONFIG_FAT_DEFAULT_IOCHARSET
). Нет возможности
указать эти параметры для файловой системы ntfs во время
компиляции ядра.
Для некоторых типов жестких дисков можно сделать файловую
систему ext3 более устойчивой к сбоям питания. Чтобы сделать
это, добавьте параметр barrier=1
к
соответствующей записи в /etc/fstab
. Чтобы проверить, поддерживает ли
диск эту опцию, запустите
hdparm на соответствуюшем разделе. Например, если:
hdparm -I /dev/sda | grep NCQ
возвращает непустой вывод, опция поддерживается.
Примечание: разделы на основе управления логическими томами
(LVM) не могут использовать параметр barrier
.
Этот пакет содержит ядро Linux.
Сборка ядра состоит из нескольких этапов—настройка,
компиляция и установка. Ознакомьтесь с файлом README
в дереве исходных текстов, чтобы
узнать об альтернативных способах настройки ядра.
Сборка ядра Linux в первый раз — одна из самых сложных задач в LFS. Правильный выбор параметров зависит от конкретного оборудования для целевой системы и ваших потребностей. Для ядра доступно почти 12 000 элементов конфигурации, хотя для большинства компьютеров требуется только около трети из них. Редакторы LFS рекомендуют пользователям, не знакомым с этим процессом, внимательно следовать описанным ниже процедурам. Главная цель сейчас состоит в том, чтобы довести первоначальную систему до состояния, когда вы сможете войти в систему из командной строки при последующей перезагрузке в Раздел 11.3, «Перезагрузка системы». Вопросы оптимизация и кастомизация второстепенны.
Для получения общей информации о конфигурации ядра смотрите https://mirror.linuxfromscratch.ru/hints/downloads/files/kernel-configuration.txt. Дополнительную информацию о настройке и сборке ядра можно найти по адресу https://anduin.linuxfromscratch.org/LFS/kernel-nutshell/. Эти ссылки немного устарели, но все же дают разумное представление о процессе.
Если ничего не помогает, вы можете обратиться за помощью в список рассылки lfs-support. Обратите внимание, что подписка необходима для того, чтобы рассылка не содержала спама.
Подготовьте пакет к компиляции, выполнив следующую команду:
make mrproper
Выполнение этой команды гарантирует, что дерево исходников будет абсолютно чистым. Разработчики ядра рекомендуют запускать эту команду перед каждой компиляцией. Не следует полагаться на то, что дерево исходных текстов ядра будет чистым после распаковки.
Существует несколько способов настройки параметров ядра. Обычно это делается с помощью псевдографического интерфейса, например так:
make menuconfig
Значения необязательных переменных окружения make:
LANG=<переменная_LANG_хоста>
LC_ALL=
Устанавливает значение локали на то, которое используется на хосте. Это может понадобиться для правильного отображения интерфейса menuconfig с помощью ncurses в текстовой консоли Linux с UTF-8.
Если это необходимо, обязательно замените значение
<переменной_LANG>
на значение переменной $LANG
вашего хоста. В качестве альтернативы вы можете
использовать значения переменных $LC_ALL
или $LC_CTYPE
.
Эта команда запускает интерфейс на основе ncurses. Для использования других (графических) интерфейсов, выполните make help.
Хорошей отправной точкой для настройки ядра, может стать запуск команды make defconfig. В результате её выполнения будет создана базовая конфигурация с учётом архитектуры системы.
Обязательно включите/отключите/настройте следующие параметры, иначе система может работать некорректно или вообще не загружаться:
General setup ---> [ ] Compile the kernel with warnings as errors [WERROR] CPU/Task time and stats accounting ---> [*] Pressure stall information tracking [PSI] [ ] Require boot parameter to enable pressure stall information tracking ... [PSI_DEFAULT_DISABLED] < > Enable kernel headers through /sys/kernel/kheaders.tar.xz [IKHEADERS] [*] Control Group support ---> [CGROUPS] [*] Memory controller [MEMCG] [ ] Configure standard kernel features (expert users) ---> [EXPERT] Processor type and features ---> [*] Build a relocatable kernel [RELOCATABLE] [*] Randomize the address of the kernel image (KASLR) [RANDOMIZE_BASE] General architecture-dependent options ---> [*] Stack Protector buffer overflow detection [STACKPROTECTOR] [*] Strong Stack Protector [STACKPROTECTOR_STRONG] Device Drivers ---> Generic Driver Options ---> [ ] Support for uevent helper [UEVENT_HELPER] [*] Maintain a devtmpfs filesystem to mount at /dev [DEVTMPFS] [*] Automount devtmpfs at /dev, after the kernel mounted the rootfs ... [DEVTMPFS_MOUNT] Graphics support ---> < /*/M> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) ---> ... [DRM] # If [DRM] is selected as * or M, this must be selected: [ /*] Enable legacy fbdev support for your modesetting driver ... [DRM_FBDEV_EMULATION] Console display driver support ---> # If [DRM] is selected as * or M, this must be selected: [ /*] Framebuffer Console support [FRAMEBUFFER_CONSOLE]
Включите некоторые дополнительные функции, если вы
собираете 64-битную систему. Если вы используете
menuconfig, включите их в следующем порядке: сначала
CONFIG_PCI_MSI
,
затем CONFIG_IRQ_REMAP
, и, наконец,
CONFIG_X86_X2APIC
,
потому что параметр отображается только после выбора его
зависимости.
Processor type and features ---> [*] Support x2apic [X86_X2APIC] Device Drivers ---> [*] PCI support ---> [PCI] [*] Message Signaled Interrupts (MSI and MSI-X) [PCI_MSI] [*] IOMMU Hardware Support ---> [IOMMU_SUPPORT] [*] Support for Interrupt Remapping [IRQ_REMAP]
Если вы создаете 32-разрядную систему, работающую на оборудовании с объемом оперативной памяти более 4 ГБ, измените конфигурацию таким образом, чтобы ядро могло использовать до 64 ГБ оперативной памяти:
Processor type and features ---> High Memory Support ---> (X) 64GB [HIGHMEM64G]
Если раздел для системы LFS находится на NVME SSD (то есть
узлом устройства для раздела является /dev/nvme*
, а не /dev/sd*
), включите параметр NVME
support, иначе система LFS не будет загружаться:
Device Drivers ---> NVME Support ---> <*> NVM Express block device [BLK_DEV_NVME]
Есть несколько других параметров, которые могут понадобиться в зависимости от особенностей системы. Для получения списка необходимых опций для пакетов BLFS смотрите Список опций ядра BLFS.
Если ваша хост поддерживает UEFI и вы хотите загрузить LFS с помощью него, вам необходимо настроить некоторые параметры ядра, следуя инструкции на странице BLFS, даже если вы будете использовать загрузчик UEFI из основного дистрибутива.
Пояснения для выбранных выше параметров ядра:
Randomize
the address of the kernel image
(KASLR)
Включите ASLR для образа ядра, чтобы уменьшить вероятность некоторых атак, основанных на фиксированных адресах конфиденциальных данных или кода в ядре.
Compile
the kernel with warnings as errors
Включение этого параметра может привести к сбою сборки, если компилятор и/или конфигурация отличается от конфигурации ядра разработчиков.
Enable
kernel headers through
/sys/kernel/kheaders.tar.xz
Для сборки ядра с этим параметром необходим пакет cpio. cpio не устанавливается в LFS.
Configure
standard kernel features (expert
users)
Эта опция приведет к отображению некоторых параметров в интерфейсе конфигурации, но изменение этих параметров может быть опасным. Не используйте её, если вы не знаете, что делаете.
Strong
Stack Protector
Включите SSP для ядра. Мы включили его для всего
пользовательского пространства с помощью --enable-default-ssp
,
настроив GCC, но ядро не использует настройки GCC по
умолчанию для SSP. Мы включаем это явно здесь.
Support
for uevent helper
Включение этого параметра может вызвать сбои при управление устройствами через Udev.
Maintain a
devtmpfs
С помощью этого параметра узлы устройств создаются автоматически и заполняются самим ядром, даже без запуска Udev. Udev будет работать поверх, управляя разрешениями и добавляя необходимые символические ссылки. Этот элемент конфигурации необходим всем пользователям Udev.
Automount
devtmpfs at /dev
Этот параметр позволит смонтировать представление ядра устройств в /dev при переключении на корневую файловую систему непосредственно перед запуском init.
Enable
legacy fbdev support for your modesetting
driver
и Framebuffer Console
support
Они необходимы для отображения консоли Linux на
графическом процессоре, управляемом драйвером DRI
(Direct Rendering Infrastructure - инфраструктура
прямого рендеринга). Если CONFIG_DRM
(Direct Rendering Manager -
диспетчер прямого рендеринга) включен, вам также
следует включить эти две опции, иначе вы увидите пустой
экран после загрузки драйвера DRI.
Support
x2apic
Поддержка запуска 64-разрядного контроллера прерываний для x86 процессоров в режиме x2APIC. x2APIC может быть включен в BIOS на системах x86 и у ядра собранного без этой опции будет kernel panic при загрузке. Эта опция не окажет никакого эффекта, но и не причиняет вреда, если x2APIC отключен в BIOS.
В качестве альтернативы, в некоторых ситуациях может быть
уместно использование команды make oldconfig. Смотрите
файл README
для получения
дополнительной информации.
По желанию, вы можете пропустить настройку ядра, скопировав
конфигурационный файл ядра .config
, из хост системы(если он доступен)
в каталог куда было распаковано ядро linux-6.7.4
. Однако, мы не рекомендуем этот
вариант. Намного лучше изучить все параметры меню и создать
конфигурацию ядра с нуля.
Скомпилируйте образ ядра и модули:
make
При использовании модулей, могут потребоваться файлы
конфигурации, которые расположены в каталоге /etc/modprobe.d
. Информация о модулях и
конфигурации ядра находится в Раздел 9.3,
«Взаимодействие с устройствами и модулями» и в
документации к ядру linux-6.7.4/Documentation
. Кроме этого,
стоит ознакомиться с руководством modprobe.d(5).
Если поддержка модулей не была отключена в параметрах ядра, установите модули с помощью:
make modules_install
После окончания компиляции, необходимо выполнить еще
несколько шагов для завершения установки ядра. Некоторые
файлы должны быть скопированы в каталог /boot
.
Если вы решили использовать отдельный /boot
раздел для системы LFS (возможно,
общий раздел /boot
с
хост-дистрибутивом), скопированные ниже файлы должны быть
помещены туда. Самый простой способ сделать это — сначала
создать запись для /boot
в
/etc/fstab
(подробности
читайте в предыдущем разделе), затем выполните следующую
команду от имени пользователя root
в среде chroot:
mount /boot
Путь к узлу устройства в команде опущен, поскольку
mount может
прочитать его из /etc/fstab
.
Путь к образу ядра может различаться в зависимости от используемой платформы. Имя файла, может быть произвольным, но начинаться должно с vmlinuz для обеспечения совместимости с автоматической настройкой процесса загрузки, описанного в следующем разделе. Следующая команда предполагает архитектуру x86:
cp -iv arch/x86/boot/bzImage /boot/vmlinuz-6.7.4-lfs-12.1
System.map
- это символьный
файл для ядра. Он содержит точки входа каждой функции в API
ядра, а также адреса структур данных для запущенного ядра. Он
используется в качестве ресурса при исследовании проблем с
ядром. Выполните следующую команду для установки файла:
cp -iv System.map /boot/System.map-6.7.4
Файл конфигурации ядра .config
создается на шаге make
menuconfig и содержит все параметры ядра,
которое было скомпилировано только что. Рекомендуется
сохранить этот файл на будущее:
cp -iv .config /boot/config-6.7.4
Установите документацию ядра:
cp -r Documentation -T /usr/share/doc/linux-6.7.4
Важно отметить, что файлы в каталоге с исходным кодом ядра не принадлежат пользователю root. Всякий раз, когда пакет распаковывается от имени пользователя root (как это и выполнялось внутри среды chroot), файлы имеют те идентификаторы пользователя и группы, которые были присвоены при распаковке. Обычно это не вызывает проблем для других устанавливаемых пакетов, так как каталог с исходниками удаляется после установки пакета. Однако исходный код ядра Linux часто сохраняется в течение длительного времени. Из-за этого существует вероятность того, что идентификатор пользователя, используемый при распаковке, будет назначен другому пользователю. В таком случае, этот пользователь будет иметь доступ на запись в этот каталог.
В ряде случаев требуется обновить конфигурацию ядра для пакетов, которые будут установлены позже в BLFS. В отличии от других пакетов, нет необходимости удалять дерево исходного кода ядра после установки только что собранного ядра.
Если вы планируете оставить каталог с исходным кодом ядра,
выполните команду chown -R
0:0 * находясь в каталоге linux-6.7.4
, чтобы все файлы принадлежали
пользователю root.
Иногда, в документации к ядру, рекомендуют создать
символическую ссылку /usr/src/linux
указывающую на каталог с
исходниками ядра. Эта рекомендация относится к ядрам до
версии 2.6 и не
должна выполняться в системе LFS, так как это
может вызвать проблемы с пакетами, которые вы, возможно,
захотите собрать, когда ваша базовая система LFS будет
готова.
Заголовочные файлы в системном каталоге include
(/usr/include
) всегда используются те, которые
применялись при компиляции Glibc, то есть подготовленные
заголовочные файлы, установленные в Раздел 5.4,
«Заголовочные файлы Linux-6.7.4 API». Поэтому их
никогда не следует
заменять на чистые заголовочные файлы ядра или любые другие
подготовленные заголовочные файлы.
В большинстве случаев модули Linux загружаются автоматически,
но иногда требуется определенный порядок. Программа, которая
загружает модули, modprobe или insmod, использует файл
/etc/modprobe.d/usb.conf
как
раз для этой цели. Этот файл должен быть заполнен таким
образом, что если USB-драйверы (ehci_hcd, ohci_hcd и
uhci_hcd) были собраны в виде модулей, то они будут загружены
в правильном порядке; ehci_hcd должен быть загружен до
ohci_hcd и uhci_hcd для того, чтобы избежать предупреждений
во время загрузки.
Создайте новый файл /etc/modprobe.d/usb.conf
, выполнив
следующую команду:
install -v -m755 -d /etc/modprobe.d
cat > /etc/modprobe.d/usb.conf << "EOF"
# Begin /etc/modprobe.d/usb.conf
install ohci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i ohci_hcd ; true
install uhci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i uhci_hcd ; true
# End /etc/modprobe.d/usb.conf
EOF
Содержит в себе все параметры конфигурации ядра |
|
Ядро системы Linux. При включении компьютера ядро — это первая загружаемая часть операционной системы. Оно обнаруживает и инициализирует все компоненты аппаратного обеспечения компьютера, делает их доступными в виде дерева каталогов с файлами для доступа к ним программ и превращает один процессор в мультизадачную машину, способную выполнять множество программ как будто одновременно. |
|
Список адресов и символов; файл содержит точки входа и адреса всех функций и структур данных в ядре |
Если ваша система поддерживает UEFI и вы хотите загрузить LFS
с помощью UEFI, вам следует пропустить инструкции на этой
странице, но все равно изучить синтаксис grub.cfg
и способ указания раздела в файле
с этой страницы, а также настроить GRUB с поддержкой UEFI
используя инструкции, приведенные на
странице BLFS.
При неправильной настройке GRUB ваша система перестанет загружаться без вспомогательно загрузочного CD-ROM или USB-накопителя. Для загрузки системы LFS этот раздел необязателен. Вы можете просто использовать существующий загрузчик, например Grub-Legacy, GRUB2 или LILO.
Убедитесь, что аварийный загрузочный диск готов к
«спасению» компьютера, если он
перестанет загружаться. Если у вас еще нет загрузочного
диска, вы можете создать его. Для этого необходимо перейти в
раздел BLFS и установить программу xorriso
из пакета
libisoburn.
cd /tmp grub-mkrescue --output=grub-img.iso xorriso -as cdrecord -v dev=/dev/cdrw blank=as_needed grub-img.iso
GRUB использует собственную структуру именования дисков и
разделов в виде (hdn,m), где n — номер жесткого диска, а
m — номер раздела.
Номера жестких дисков начинаются с нуля, а номера разделов
начинаются с единицы для обычных разделов (с пяти для
расширенных разделов). Обратите внимание, что это отличается
от более ранних версий, где оба номера начинались с нуля.
Например, раздел sda1
это
(hd0,1) в GRUB, а
sdb3
(hd1,3). В отличие от Linux, GRUB
не считает приводы CD-ROM жесткими дисками. Например, если
используемый CD-привода определяется как hdb
, а второй жесткий диск как hdc
, этот второй жесткий диск все равно
будет (hd1).
GRUB записывает данные на первый физический сектор жесткого диска. Эта область не является частью какой-либо файловой системы. Программа в загрузочном разделе имеет доступ к модулям GRUB расположенным по умолчанию в /boot/grub/.
Расположение загрузочного раздела - это выбор пользователя,
который влияет на конфигурацию. Одна из рекомендаций
заключается в том, чтобы иметь отдельный небольшой раздел
(примерно 200 МБ) исключительно для загрузочной информации. В
этом случае каждая сборка, будь то LFS или другой
дистрибутив, может обращаться к тем же загрузочным файлам, а
доступ может быть получен из любой загруженной системы. Если
вы решите так сделать, вам необходимо примонтировать
отдельный раздел, переместить все файлы из текущего каталога
/boot
(например, ядро Linux,
которое вы создали на предыдущем этапе) в новый раздел. Затем
нужно отмонтировать раздел и примонтировать его заново в
каталог /boot
. Когда вы это
сделаете, обязательно обновите данные в файле /etc/fstab
.
Оставить /boot
на текущем
разделе LFS это тоже рабочее решение, но его настройка для
загрузки нескольких систем сложнее.
Используя информацию выше, определите соответствующие точки
монтирования для корневого раздела (или загрузочного раздела,
если используется отдельный). В следующем примере
предполагается, что корневым (или отдельным загрузочным)
разделом является sda2
.
Установите файлы GRUB в каталог /boot/grub
и настройте загрузочный сектор:
Следующая команда перезапишет текущий загрузчик. Не выполняйте эту команду, если это не нужно, например, если вы используете сторонний менеджер загрузки для управления главной загрузочной записью (MBR).
grub-install /dev/sda
Если система была загружена с использованием UEFI,
grub-install
попытается установить файлы для x86_64-efi, но эти файлы не были
установлены в
Глава 8. Если это так, добавьте --target i386-pc
к приведенной выше
команде.
Создайте файл /boot/grub/grub.cfg
:
cat > /boot/grub/grub.cfg << "EOF"
# Begin /boot/grub/grub.cfg
set default=0
set timeout=5
insmod part_gpt
insmod ext2
set root=(hd0,2)
menuentry "GNU/Linux, Linux 6.7.4-lfs-12.1" {
linux /boot/vmlinuz-6.7.4-lfs-12.1 root=/dev/sda2 ro
}
EOF
Команды insmod
загружают модули GRUB с
именами part_gpt
и ext2
. Несмотря на название, ext2
фактически поддерживаются файловые
системы ext2
, ext3
и ext4
. Команда grub-install встроила
некоторые модули в основной образ GRUB (установленный в MBR или раздел
GRUB BIOS) для доступа к другим модулям (в /boot/grub/i386-pc
), поэтому в стандартной
конфигурации эти два модуля уже встроены и эти две команды
insmod ничего
не будут делать. В любом случае, от них нет никакого вреда,
но они могут понадобиться в некоторых редких конфигурациях.
С точки зрения GRUB, файлы ядра относятся к используемому разделу. Если вы используется отдельный раздел /boot, удалите /boot из приведенной выше строки linux. Вам также потребуется изменить строку set root так, чтобы она указывала на загрузочный раздел.
Наименование раздела для GRUB может измениться, если вы
добавили или удалили некоторые диски (это могут быть как
съемные диски, так и USB-устройства). Изменение может
привести к сбою загрузки, потому что grub.cfg
ссылается на «старые»
указатели. Чтобы не столкнуться с этой проблемой,
необходимо использовать UUID раздела и файловой системы
вместо указателя GRUB для указания устройства. Запустите
команду lsblk -o
UUID,PARTUUID,PATH,MOUNTPOINT, чтобы
посмотреть UUID ваших файловых систем (в столбце
UUID
) и разделов (в столбце
PARTUUID
). Затем замените
set root=(hdx,y)
на
search --set=root --fs-uuid
, и замените
<UUID файловой системы, в
которой установлено ядро>
root=/dev/sda2
на root=PARTUUID=
.
<UUID раздела, в котором собрана
LFS>
Обратите внимание, что UUID раздела и UUID файловой системы
на этом разделе это совершенно разные вещи. Некоторые
онлайн-ресурсы могут предлагать вам использовать
root=UUID=
вместо <UUID файловой
системы>
root=PARTUUID=
, но для этого требуется
initramfs, которая не рассматривается в LFS.
<UUID
раздела>
Имя узла устройства для раздела в /dev
также может измениться (хотя это
менее вероятно, чем изменение указателя GRUB). Вы можете
заменить пути к узлам устройств, таким как /dev/sda1
на PARTUUID=
, в <UUID
раздела>
/etc/fstab
, чтобы избежать потенциального
сбоя загрузки в случае, если имя узла устройства
изменилось.
GRUB - чрезвычайно мощная программа, предоставляющая огромное количество вариантов загрузки с самых разных устройств, работающих систем и типов разделов. Существует также множество опций настройки, таких как графические экраны-заставки, воспроизведение звука, ввод с помощью мыши и т. д., детали этих опций выходят за рамки этой инструкции.
Существует команда grub-mkconfig, которая может автоматически записывать файл конфигурации. Она использует набор скриптов из каталога /etc/grub.d/ и уничтожит любые сделанные вами настройки. Эти скрипты предназначены в первую очередь для обычных дистрибутивов и не рекомендуются для LFS. Если вы устанавливаете коммерческий дистрибутив Linux, есть вероятность, что эта программа будет запущена. Обязательно создайте резервную копию файла grub.cfg.
Отлично! Новая система LFS установлена! Желаем успехов в работе с вашей новой, блестящей, самостоятельно собранной Linux системой.
Может быть хорошей идеей создать файл /etc/lfs-release
. Имея этот файл, вам (и нам,
если вам в какой-то момент понадобится обратиться за помощью)
будет проще узнать, какая версия LFS установлена в системе.
Создайте этот файл, выполнив следующую команду:
echo 12.1 > /etc/lfs-release
Следующие два файла, содержащие описание установленной системы, могут использоваться пакетами, устанавливаемыми позже, либо в бинарном виде, либо путем их сборки.
Первый показывает статус вашей новой системы по отношению к стандарту LSB. Чтобы создать этот файл, выполните:
cat > /etc/lsb-release << "EOF" DISTRIB_ID="Linux From Scratch" DISTRIB_RELEASE="12.1" DISTRIB_CODENAME="<your name here>" DISTRIB_DESCRIPTION="Linux From Scratch" EOF
Второй содержит примерно ту же информацию и используется systemd и некоторыми графическими средами рабочего стола. Чтобы создать этот файл, выполните:
cat > /etc/os-release << "EOF" NAME="Linux From Scratch" VERSION="12.1" ID=lfs PRETTY_NAME="Linux From Scratch 12.1" VERSION_CODENAME="<your name here>" HOME_URL="https://mirror.linuxfromscratch.ru/lfs/" EOF
Обязательно настройте значения 'DISTRIB_CODENAME' и 'VERSION_CODENAME', чтобы сделать название вашей новой системы уникальным.
Теперь, когда вы закончили изучение книги LFS, хотите добавить себя в список пользователей LFS? Перейдите по ссылке https://www.linuxfromscratch.org/cgi-bin/lfscounter.php и зарегистрируйтесь. Введите ваше имя и версию LFS, которую вы использовали.
Давайте выполним перезагрузку в систему LFS.
Теперь, когда все программное обеспечение установлено, пришло время перезагрузить ваш компьютер. Однако есть несколько вещей, которые нужно проверить. Вот некоторые предложения:
Установить прошивки, если они необходимы для правильной работы вашего оборудования.
Убедитесь, что установлен пароль для пользователя
root
.
На данном этапе также уместно ознакомиться со следующими конфигурационными файлами.
/etc/bashrc
/etc/dircolors
/etc/fstab
/etc/hosts
/etc/inputrc
/etc/profile
/etc/resolv.conf
/etc/vimrc
/root/.bash_profile
/root/.bashrc
/etc/sysconfig/ifconfig.eth0
Теперь, после всего, давайте перейдём к первой загрузке нашей новой системы LFS. Для начала, выйдем из chroot-окружения:
logout
Затем размонтируйте виртуальные файловые системы:
umount -v $LFS/dev/pts mountpoint -q $LFS/dev/shm && umount -v $LFS/dev/shm umount -v $LFS/dev umount -v $LFS/run umount -v $LFS/proc umount -v $LFS/sys
Если было создано несколько разделов, размонтируйте их перед размонтированием основного, вот так:
umount -v $LFS/home umount -v $LFS/usr
Размонтируйте саму файловую систему LFS:
umount -v $LFS
Теперь, выполните перезагрузку системы.
Предполагается, что загрузчик GRUB был настроен ранее, поэтому пункт меню LFS 12.1 будет загружен автоматически.
После завершения перезагрузки, система LFS будет готова к использованию. Вы увидите простую подсказку «login: ». На этом этапе вы можете перейти к книге BLFS, где вы установите дополнительное программное обеспечение в соответствии с вашими потребностями.
Если перезагрузка завершилась неудачей, самое время устранить эти неполадки. Советы по решению проблем с начальной загрузкой, смотрите на странице https://www.linuxfromscratch.org/lfs/troubleshooting.html.
Благодарим за прочтение книги LFS. Мы надеемся, что эта книга была полезна и вы узнали больше о процессе создания системы с нуля.
Теперь, когда система LFS установлена, вы можете задаться вопросом «Что дальше?» Чтобы ответить на этот вопрос, мы составили для вас список ресурсов.
Обслуживание
Для всего программного обеспечения регулярно появляются сообщения об ошибках и уведомления безопасности. Поскольку система LFS компилируется из исходного кода, вы должны быть в курсе таких отчетов. Существует несколько онлайн-ресурсов, которые отслеживают такие отчеты, некоторые из них приведены ниже:
Рекомендации по безопасности LFS
Это список уязвимостей системы безопасности, обнаруженных в книге LFS после ее публикации.
Список рассылки по безопасности ПО с открытым исходным кодом
Это список рассылки для обсуждения недостатков безопасности, концепций и практик в сообществе Open Source.
Советы LFS
Советы LFS представляют собой коллекцию обучающих материалов, собранную добровольцами сообщества LFS. Советы доступны по адресу https://mirror.linuxfromscratch.ru/hints/downloads/files/.
Списки рассылки
Существует несколько списков рассылки LFS, на которые вы можете подписаться, если нуждаетесь в помощи, хотите быть в курсе последних событий, хотите внести свой вклад в проект и многое другое. Посетите Глава 1 - Списки рассылки для получения дополнительной информации.
Проект документации по Linux (TLDP)
Целью проекта TLDP является сотрудничество по всем вопросам связанным с документацией по Linux. TLDP содержит большую коллекцию инструкций, руководств и справочных страниц. Она расположена по адресу https://tldp.org/.
Теперь, когда LFS собрана и у вас есть загружаемая система, необходимо решить, что же делать дальше? Следующий шаг - определиться, как использовать систему. Как правило, следует учитывать две широкие категории: рабочая станция или сервер. Действительно, эти категории не являются взаимоисключающими. Приложения, необходимые для каждой категории, можно объединить в одну систему, но пока давайте рассмотрим их по отдельности.
Сервер — более простая категория. Как правило, это веб-сервер, такой как Apache, и сервер баз данных, например, MariaDB. Однако возможны и другие варианты. К этой же категории относятся операционные системы для встраиваемых устройств.
Рабочая станция же, гораздо сложнее. Обычно для нее требуется среда рабочего стола, например, LXDE, XFCE, KDE, или Gnome основанные на базовом графическом окружении и наборе графических приложений, таких как веб-браузер Firefox, почтовый клиент Thunderbird, или пакет офисных приложений LibreOffice. Для этих приложений требуется множество (может быть несколько сотен, в зависимости от ваших потребностей) пакетов вспомогательных приложений и библиотек.
В дополнение к вышесказанному, существует набор приложений для управления системой. Все эти приложения есть в справочнике BLFS, но не все пакеты необходимы в каждом конкретном окружении. Например клиент dhcpcd, обычно не требуется на серверах или управление параметрами беспроводных сетей - полезно только для ноутбуков и других портативных систем.
Когда вы впервые загружаетесь в LFS, у вас есть все необходимые инструменты для сборки дополнительных пакетов. К сожалению, набор программ пользовательского окружения довольно скудный. Есть несколько способов исправить это:
Этот метод обеспечивает полноценную графическую среду, в которой доступен полнофункциональный браузер и возможности копирования/вставки. Также он позволяет использовать приложения хоста, такие как wget, для загрузки исходных текстов пакетов в каталог, доступный при работе в среде chroot.
Чтобы правильно собрать пакеты в chroot, вам необходимо не забыть смонтировать виртуальные файловые системы, если они еще не смонтированы. Один из способов сделать это — создать скрипт в ХОСТОВОЙ системе:
cat > ~/mount-virt.sh << "EOF"
#!/bin/bash
function mountbind
{
if ! mountpoint $LFS/$1 >/dev/null; then
$SUDO mount --bind /$1 $LFS/$1
echo $LFS/$1 mounted
else
echo $LFS/$1 already mounted
fi
}
function mounttype
{
if ! mountpoint $LFS/$1 >/dev/null; then
$SUDO mount -t $2 $3 $4 $5 $LFS/$1
echo $LFS/$1 mounted
else
echo $LFS/$1 already mounted
fi
}
if [ $EUID -ne 0 ]; then
SUDO=sudo
else
SUDO=""
fi
if [ x$LFS == x ]; then
echo "LFS not set"
exit 1
fi
mountbind dev
mounttype dev/pts devpts devpts -o gid=5,mode=620
mounttype proc proc proc
mounttype sys sysfs sysfs
mounttype run tmpfs run
if [ -h $LFS/dev/shm ]; then
install -v -d -m 1777 $LFS$(realpath /dev/shm)
else
mounttype dev/shm tmpfs tmpfs -o nosuid,nodev
fi
#mountbind usr/src
#mountbind boot
#mountbind home
EOF
Обратите внимание, что последние три команды в скрипте закомментированы. Они пригодятся, если эти каталоги монтируются как отдельные разделы в хост-системе и будут монтироваться при загрузке завершенной системы LFS/BLFS.
Скрипт можно запустить с помощью bash ~/mount-virt.sh либо
от имени обычного пользователя (рекомендуется), либо от
имени root
. При запуске от
имени обычного пользователя в хост-системе требуется sudo.
Еще одна проблема, на которую указывает скрипт, заключается в том, где хранить загруженные файлы пакетов. Это местоположение является произвольным. Оно может находиться в домашнем каталоге обычного пользователя, таком как ~/sources, или в глобальном каталоге /usr/src. Наша рекомендация - не смешивать источники BLFS и источники LFS в (из среды chroot) /sources. В любом случае, пакеты должны быть доступны внутри среды chroot.
Последняя удобная функция, представленная здесь, предназначена для упрощения процесса входа в среду chroot. Это можно сделать с помощью псевдонима, помещенного в пользовательский файл ~/.bashrc в хост-системе:
alias lfs='sudo /usr/sbin/chroot /mnt/lfs /usr/bin/env -i HOME=/root TERM="$TERM" PS1="\u:\w\\\\$ "
PATH=/bin:/usr/bin:/sbin:/usr/sbin /bin/bash --login'
Этот псевдоним немного сложен для восприятия из-за кавычек и слэшей. Всё это должно быть в одной строке. Вышеуказанная команда была разделена на две части для презентационных целей.
Этот метод также предоставляет полноценную графическую среду, но сначала требует установки sshd в системе LFS, обычно в chroot. Кроме этого потребуется второй компьютер. Преимущество этого метода в том, что он прост, поскольку не требует сложной среды chroot. Он также использует собранное вами ядро LFS для всех дополнительных пакетов и по-прежнему предоставляет полную систему для установки пакетов.
Вы можете использовать команду scp для загрузки исходных текстов пакетов, которые будут собраны в системе LFS. Если вместо этого вы хотите загрузить исходные тексты непосредственно в систему LFS, установите libtasn1, p11-kit, make-ca и wget в chroot (или загрузите их исходники с помощью scp после загрузки системы LFS).
Этот метод требует установки libtasn1, p11-kit, make-ca, wget, gpm и links (или lynx) в chroot, а затем перезагрузки в новую систему LFS. На данный момент система по умолчанию имеет шесть виртуальных консолей. Переключать консоли так же просто, как использовать комбинации клавиш Alt+Fx , где Fx это клавиши от F1 до F6. Комбинации Alt+→ и Alt+← также переключают консоль.
На этом этапе вы можете войти в две разные виртуальные консоли и запустить браузер links или lynx в одной консоли и bash в другой. GPM позволяет копировать команды из браузера с помощью левой кнопки мыши, переключать консоли и вставлять их в другую консоль.
Вместо примечания: переключение виртуальных консолей также может быть выполнено из экземпляра X Window с помощью комбинации клавиш Ctrl+Alt+Fx ,но операция копирования мышью не работает между графическим интерфейсом и виртуальной консолью. Вы можете вернуться к дисплею X Window с помощью комбинации Ctrl+Alt+Fx ,где Fx обычно F1, но может быть F7.
ABI |
Application Binary Interface - Двоичный (бинарный) интерфейс приложений |
ALFS |
Automated Linux From Scratch - Проект автоматической сборки системы LFS |
API |
Application Programming Interface - Программный интерфейс приложения |
ASCII |
American Standard Code for Information Interchange — Американский стандартный код для обмена информацией |
BIOS |
Basic Input/Output System - Базовая система ввода/вывода |
BLFS |
Beyond Linux From Scratch - Проект, расширяющий возможности Linux From Scratch |
BSD |
Berkeley Software Distribution - Система распространения программного обеспечения в исходных кодах |
chroot |
change root - Команда изменения корневого каталога |
CMOS |
Complementary Metal Oxide Semiconductor - Комплементарная структура металл-оксид-полупроводник |
COS |
Class Of Service - Класс обслуживания |
CPU |
Central Processing Unit - Центральный процессор, процессор |
CRC |
Cyclic Redundancy Check - Циклический избыточный код |
CVS |
Concurrent Versions System - Централизованная система управления версиями |
DHCP |
Dynamic Host Configuration Protocol - Протокол динамической настройки узла |
DNS |
Domain Name Service - Служба доменных имён |
EGA |
Enhanced Graphics Adapter - Усовершенствованный графический адаптер |
ELF |
Executable and Linkable Format - Формат исполняемых и компонуемых файлов |
EOF |
End of File - Конец файла, символ конца файла |
EQN |
equation - уравнение |
ext2 |
second extended file system - вторая расширенная файловая система |
ext3 |
third extended file system - третья расширенная файловая система |
ext4 |
fourth extended file system - четвёртая расширенная файловая система |
FAQ |
Frequently Asked Questions - Часто задаваемые вопросы |
FHS |
Filesystem Hierarchy Standard - Стандарт иерархии файловой системы |
FIFO |
First-In, First Out - Схема обслуживания очереди "первый пришел — первым ушёл" |
FQDN |
Fully Qualified Domain Name - Полное доменное имя |
FTP |
File Transfer Protocol - Протокол передачи файлов |
GB |
Gigabytes - Гигабайты |
GCC |
GNU Compiler Collection - Коллекция компиляторов GNU |
GID |
Group Identifier - Идентификатор группы |
GMT |
Greenwich Mean Time - Среднее время по Гринвичу |
HTML |
Hypertext Markup Language - Язык гипертекстовой разметки |
IDE |
Integrated Drive Electronics - Интерфейс подключения дисковых устройств |
IEEE |
Institute of Electrical and Electronic Engineers - Институт инженеров электротехники и электроники |
IO |
Input/Output - Ввод/вывод |
IP |
Internet Protocol - Межсетевой протокол |
IPC |
Inter-Process Communication - Обмен данными между потоками одного или разных процессов |
IRC |
Internet Relay Chat - Ретранслируемый интернет-чат |
ISO |
International Organization for Standardization - Международная организация по стандартизации |
ISP |
Internet Service Provider - Провайдер интернет услуг |
KB |
Kilobytes - Килобайты |
LED |
Light Emitting Diode - Светодиод |
LFS |
Linux From Scratch - Линукс с нуля |
LSB |
Linux Standard Base - Совместный проект семейства операционных систем, основанных на Linux (то есть дистрибутивов Linux), при организации Linux Foundation, целью которого является стандартизация их внутренней структуры. LSB опирается на существующие спецификации, такие как POSIX, Single UNIX Specification, и другие открытые стандарты, при этом расширяя и дополняя их. |
MB |
Megabytes - Мегабайты |
MBR |
Master Boot Record - Главная загрузочная запись |
MD5 |
Message Digest 5 - 128-битный алгоритм хеширования |
NIC |
Network Interface Card - Сетевой адаптер |
NLS |
Native Language Support - Поддержка естественного языка |
NNTP |
Network News Transport Protocol - Сетевой транспортный протокол новостных групп |
NPTL |
Native POSIX Threading Library - Библиотека потоков POSIX |
OSS |
Open Sound System - Унифицированный драйвер для звуковых карт и других звуковых устройств |
PCH |
Pre-Compiled Headers - Предварительно скомпилированные заголовки |
PCRE |
Perl Compatible Regular Expression - Регулярные выражения, совместимые с Perl |
PID |
Process Identifier - Идентификатор процесса |
PTY |
pseudo terminal - Псевдотерминал |
QOS |
Quality Of Service - Качество обслуживания |
RAM |
Random Access Memory - Оперативная память |
RPC |
Remote Procedure Call - Удаленный вызов процедур |
RTC |
Real Time Clock - Часы реального времени |
SBU |
Standard Build Unit - Стандартная единица (времени) сборки |
SCO |
The Santa Cruz Operation - Компания-разработчик программного обеспечения |
SHA1 |
Secure-Hash Algorithm 1 - Алгоритм криптографического хеширования |
TLDP |
The Linux Documentation Project - Проект документации Linux |
TFTP |
Trivial File Transfer Protocol - Простейший протокол передачи файлов |
TLS |
Thread-Local Storage - Локальное хранилище потока |
UID |
User Identifier - Идентификатор пользователя |
umask |
user file-creation mask - Команда, определяющая маску создания пользовательских файлов |
USB |
Universal Serial Bus - Универсальная последовательная шина |
UTC |
Coordinated Universal Time - Всемирное координированное время |
UUID |
Universally Unique Identifier - Универсальный уникальный идентификатор |
VC |
Virtual Console - Виртуальная консоль |
VGA |
Video Graphics Array - Компонентный видеоинтерфейс |
VT |
Virtual Terminal - Виртуальный терминал |
Мы хотели бы поблагодарить следующих людей и организации за их вклад в проект Linux From Scratch.
Gerard Beekmans <gerard AT linuxfromscratch D0T org> – Основатель проекта LFS
Bruce Dubbs <bdubbs AT linuxfromscratch D0T org> – Главный редактор LFS
Jim Gifford <jim AT linuxfromscratch D0T org> – Второй руководитель проекта CLFS
Pierre Labastie <pierre AT linuxfromscratch D0T org> – Редактор BLFS и руководитель ALFS
DJ Lucas <dj AT linuxfromscratch D0T org> – Редактор проектов LFS и BLFS
Ken Moffat <ken AT linuxfromscratch D0T org> – Редактор BLFS
Бесчисленное множество других людей из различных списков рассылки проектов LFS и BLFS, которые помогали в создании этой книги, присылая свои предложения, проверяя книгу и отправляя отчеты об ошибках, инструкции и собственный опыт установки различных пакетов.
Manuel Canales Esparcia <macana AT macana-es D0T com> – Перевод проекта LFS на испанский язык
Johan Lenglet <johan AT linuxfromscratch D0T org> – Перевод проекта LFS на французский язык до 2008 г.
Jean-Philippe Mengual <jmengual AT linuxfromscratch D0T org> – Перевод проекта LFS на французский язык 2008-2016 гг
Julien Lepiller <jlepiller AT linuxfromscratch D0T org> – Перевод проекта LFS на французский язык с 2017-по настоящее время
Anderson Lizardo <lizardo AT linuxfromscratch D0T org> – Перевод проекта LFS на португальский язык до 2022 г.
Jamenson Espindula <jafesp AT gmail D0T com> – Перевод проекта LFS на португальский язык 2022-по настоящее время
Thomas Reitelbach <tr AT erdfunkstelle D0T de> – Перевод проекта LFS на немецкий язык
Anton Maisak <info AT linuxfromscratch D0T ru> – Перевод проекта LFS на русский язык 2018-2020 гг
Elena Shevcova <info AT linuxfromscratch D0T ru> – Перевод проекта LFS на русский язык 2018-2020 гг
Vladimir Pertsev <info AT linuxfromscratch D0T ru> – Перевод проекта LFS на русский язык 2022-по настоящее время
Scott Kveton <scott AT osuosl D0T org> – зеркало lfs.oregonstate.edu
William Astle <lost AT l-w D0T net> – зеркало ca.linuxfromscratch.org
Eujon Sellers <jpolen@rackspace.com> – зеркало lfs.introspeed.com
Justin Knierim <tim@idge.net> – зеркало lfs-matrix.net
Manuel Canales Esparcia <manuel AT linuxfromscratch D0T org> – зеркало lfsmirror.lfs-es.info
Luis Falcon <Luis Falcon> – зеркало torredehanoi.org
Guido Passet <guido AT primerelay D0T net> – зеркало nl.linuxfromscratch.org
Bastiaan Jacques <baafie AT planet D0T nl> – зеркало lfs.pagefault.net
Sven Cranshoff <sven D0T cranshoff AT lineo D0T be> – зеркало lfs.lineo.be
Scarlet Belgium – зеркало lfs.scarlet.be
Sebastian Faulborn <info AT aliensoft D0T org> – зеркало lfs.aliensoft.org
Stuart Fox <stuart AT dontuse D0T ms> – зеркало lfs.dontuse.ms
Ralf Uhlemann <admin AT realhost D0T de> – зеркало lfs.oss-mirror.org
Antonin Sprinzl <Antonin D0T Sprinzl AT tuwien D0T ac D0T at> – зеркало at.linuxfromscratch.org
Fredrik Danerklint <fredan-lfs AT fredan D0T org> – зеркало se.linuxfromscratch.org
Franck <franck AT linuxpourtous D0T com> – зеркало lfs.linuxpourtous.com
Philippe Baque <baque AT cict D0T fr> – зеркало lfs.cict.fr
Benjamin Heil <kontakt AT wankoo D0T org> – зеркало lfs.wankoo.org
Vladimir Pertsev <info AT linuxfromscratch D0T ru> – зеркало mirror.linuxfromscratch.ru
Satit Phermsawang <satit AT wbac D0T ac D0T th> – зеркало lfs.phayoune.org
Shizunet Co.,Ltd. <info AT shizu-net D0T jp> – зеркало lfs.mirror.shizu-net.jp
Jason Andrade <jason AT dstc D0T edu D0T au> – зеркало au.linuxfromscratch.org
Christine Barczak <theladyskye AT linuxfromscratch D0T org> – Редактор книги LFS
Archaic <archaic@linuxfromscratch.org> – Технический писатель/редактор LFS, руководитель проекта HLFS, редактор BLFS, Сопровождающий проекта Советы и патчи
Matthew Burgess <matthew AT linuxfromscratch D0T org> – Руководитель проекта LFS, технический писатель/редактор LFS
Nathan Coulson <nathan AT linuxfromscratch D0T org> – Сопровождающий LFS-Bootscripts
Timothy Bauscher
Robert Briggs
Ian Chilton
Jeroen Coumans <jeroen AT linuxfromscratch D0T org> – Разработчик веб-сайта, сопровождающий FAQ
Manuel Canales Esparcia <manuel AT linuxfromscratch D0T org> – Сопровождающий XML и XSL проектов LFS/BLFS/HLFS
Alex Groenewoud – Технический писатель LFS
Marc Heerdink
Jeremy Huntwork <jhuntwork AT linuxfromscratch D0T org> – Технический писатель LFS, сопровождающий LFS LiveCD
Bryan Kadzban <bryan AT linuxfromscratch D0T org> – Технический писатель LFS
Mark Hymers
Seth W. Klein – Сопровождающий FAQ
Nicholas Leippe <nicholas AT linuxfromscratch D0T org> – Сопровождающий Wiki
Anderson Lizardo <lizardo AT linuxfromscratch D0T org> – Сопровождающий движка сайта
Randy McMurchy <randy AT linuxfromscratch D0T org> – Руководитель проекта BLFS, редактор LFS
Dan Nicholson <dnicholson AT linuxfromscratch D0T org> – Редактор LFS и BLFS
Alexander E. Patrakov <alexander AT linuxfromscratch D0T org> – Технический писатель LFS, редактор интернационализации LFS, сопровождающий LFS Live CD
Simon Perreault
Scot Mc Pherson <scot AT linuxfromscratch D0T org> – Сопровождающий шлюза NNTP для проекта LFS
Douglas R. Reno <renodr AT linuxfromscratch D0T org> – Редактор Systemd
Ryan Oliver <ryan AT linuxfromscratch D0T org> – Один из руководителей проекта CLFS
Greg Schafer <gschafer AT zip D0T com D0T au> – Технический писатель проекта LFS и архитектор методов сборки пакетов следующего поколения, предназначенных для 64-битной архитектуры
Jesse Tie-Ten-Quee – Технический писатель LFS
James Robertson <jwrober AT linuxfromscratch D0T org> – Сопровождающий Bugzilla
Tushar Teredesai <tushar AT linuxfromscratch D0T org> – Редактор книги BLFS, руководитель проекта Советы и Патчи
Jeremy Utley <jeremy AT linuxfromscratch D0T org> – Технический писатель проекта LFS, сопровождающий Bugzilla, сопровождающий LFS-Bootscripts
Zack Winkles <zwinkles AT gmail D0T com> – Технический писатель проекта LFS
Каждый пакет в системе LFS для правильной сборки и установки может ссылаться на один или несколько других пакетов. Некоторые пакеты могут иметь циклические зависимости, то есть первый пакет зависит от второго, который в свою очередь, зависит от первого. Именно по этой причине, указанный порядок сборки пакетов в LFS очень важен. Цель этой страницы - документировать зависимости каждого пакета, собранного в LFS
Для каждого собираемого пакета существует от трёх до пяти типов зависимостей, перечисленных ниже. В первом списке перечислены другие пакеты, которые должны быть доступны для компиляции и установки рассматриваемого пакета. Во втором перечислены пакеты, которые должны быть доступны, когда какие-либо программы или библиотеки из пакета используются во время его выполнения. В третьем списке перечислены пакеты, которые, в дополнение к пакетам из первого списка, должны быть доступны для запуска наборов тестов. Четвертый список зависимостей — это пакеты, которые требуют, чтобы некий пакет был собран и установлен по определенному пути, прежде чем они будут собраны и установлены.
Последний список зависимостей - это необязательные пакеты, которые не рассматриваются в LFS, но могут быть полезны пользователю. Эти пакеты могут иметь дополнительные как обязательные, так и необязательные зависимости. Такие зависимости - рекомендуется разрешать после завершения сборки всей системы LFS. В некоторых случаях, повторная установка некоторых таких пакетов рассматривается в BLFS.
Скрипты в приложении перечислены с указанием каталога, в котором
они обычно находятся. Порядок такой: /etc/rc.d/init.d
, /etc/sysconfig
, /etc/sysconfig/network-devices
, и /etc/sysconfig/network-devices/services
. В
каждом разделе файлы перечислены в том порядке, в котором они
обычно вызываются.
Скрипт rc
это первый скрипт,
вызываемый системой инициализации init и инициирующий процесс загрузки.
#!/bin/bash ######################################################################## # Begin rc # # Description : Main Run Level Control Script # # Authors : Gerard Beekmans - gerard AT linuxfromscratch D0T org # : DJ Lucas - dj AT linuxfromscratch D0T org # Updates : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # : Pierre Labastie - pierre AT linuxfromscratch D0T org # # Version : LFS 7.0 # # Notes : Updates March 24th, 2022: new semantics of S/K files # - Instead of testing that S scripts were K scripts in the # previous runlevel, test that they were not S scripts # - Instead of testing that K scripts were S scripts in the # previous runlevel, test that they were not K scripts # - S scripts in runlevel 0 or 6 are now run with # "script start" (was "script stop" previously). ######################################################################## . /lib/lsb/init-functions print_error_msg() { log_failure_msg # $i is set when called MSG="FAILURE:\n\nYou should not be reading this error message.\n\n" MSG="${MSG}It means that an unforeseen error took place in\n" MSG="${MSG}${i},\n" MSG="${MSG}which exited with a return value of ${error_value}.\n" MSG="${MSG}If you're able to track this error down to a bug in one of\n" MSG="${MSG}the files provided by the ${DISTRO_MINI} book,\n" MSG="${MSG}please be so kind to inform us at ${DISTRO_CONTACT}.\n" log_failure_msg "${MSG}" log_info_msg "Press Enter to continue..." wait_for_user } check_script_status() { # $i is set when called if [ ! -f ${i} ]; then log_warning_msg "${i} is not a valid symlink." SCRIPT_STAT="1" fi if [ ! -x ${i} ]; then log_warning_msg "${i} is not executable, skipping." SCRIPT_STAT="1" fi } run() { if [ -z $interactive ]; then ${1} ${2} return $? fi while true; do read -p "Run ${1} ${2} (Yes/no/continue)? " -n 1 runit echo case ${runit} in c | C) interactive="" ${i} ${2} ret=${?} break; ;; n | N) return 0 ;; y | Y) ${i} ${2} ret=${?} break ;; esac done return $ret } # Read any local settings/overrides [ -r /etc/sysconfig/rc.site ] && source /etc/sysconfig/rc.site DISTRO=${DISTRO:-"Linux From Scratch"} DISTRO_CONTACT=${DISTRO_CONTACT:-"lfs-dev@lists.linuxfromscratch.org (Registration required)"} DISTRO_MINI=${DISTRO_MINI:-"LFS"} IPROMPT=${IPROMPT:-"no"} # These 3 signals will not cause our script to exit trap "" INT QUIT TSTP [ "${1}" != "" ] && runlevel=${1} if [ "${runlevel}" == "" ]; then echo "Usage: ${0} <runlevel>" >&2 exit 1 fi previous=${PREVLEVEL} [ "${previous}" == "" ] && previous=N if [ ! -d /etc/rc.d/rc${runlevel}.d ]; then log_info_msg "/etc/rc.d/rc${runlevel}.d does not exist.\n" exit 1 fi if [ "$runlevel" == "6" -o "$runlevel" == "0" ]; then IPROMPT="no"; fi # Note: In ${LOGLEVEL:-7}, it is ':' 'dash' '7', not minus 7 if [ "$runlevel" == "S" ]; then [ -r /etc/sysconfig/console ] && source /etc/sysconfig/console dmesg -n "${LOGLEVEL:-7}" fi if [ "${IPROMPT}" == "yes" -a "${runlevel}" == "S" ]; then # The total length of the distro welcome string, without escape codes wlen=${wlen:-$(echo "Welcome to ${DISTRO}" | wc -c )} welcome_message=${welcome_message:-"Welcome to ${INFO}${DISTRO}${NORMAL}"} # The total length of the interactive string, without escape codes ilen=${ilen:-$(echo "Press 'I' to enter interactive startup" | wc -c )} i_message=${i_message:-"Press '${FAILURE}I${NORMAL}' to enter interactive startup"} # dcol and icol are spaces before the message to center the message # on screen. itime is the amount of wait time for the user to press a key wcol=$(( ( ${COLUMNS} - ${wlen} ) / 2 )) icol=$(( ( ${COLUMNS} - ${ilen} ) / 2 )) itime=${itime:-"3"} echo -e "\n\n" echo -e "\\033[${wcol}G${welcome_message}" echo -e "\\033[${icol}G${i_message}${NORMAL}" echo "" read -t "${itime}" -n 1 interactive 2>&1 > /dev/null fi # Make lower case [ "${interactive}" == "I" ] && interactive="i" [ "${interactive}" != "i" ] && interactive="" # Read the state file if it exists from runlevel S [ -r /run/interactive ] && source /run/interactive # Stop all services marked as K, except if marked as K in the previous # runlevel: it is the responsibility of the script to not try to kill # a non running service if [ "${previous}" != "N" ]; then for i in $(ls -v /etc/rc.d/rc${runlevel}.d/K* 2> /dev/null) do check_script_status if [ "${SCRIPT_STAT}" == "1" ]; then SCRIPT_STAT="0" continue fi suffix=${i#/etc/rc.d/rc${runlevel}.d/K[0-9][0-9]} [ -e /etc/rc.d/rc${previous}.d/K[0-9][0-9]$suffix ] && continue run ${i} stop error_value=${?} if [ "${error_value}" != "0" ]; then print_error_msg; fi done fi if [ "${previous}" == "N" ]; then export IN_BOOT=1; fi if [ "$runlevel" == "6" -a -n "${FASTBOOT}" ]; then touch /fastboot fi # Start all services marked as S in this runlevel, except if marked as # S in the previous runlevel # it is the responsibility of the script to not try to start an already running # service for i in $( ls -v /etc/rc.d/rc${runlevel}.d/S* 2> /dev/null) do if [ "${previous}" != "N" ]; then suffix=${i#/etc/rc.d/rc${runlevel}.d/S[0-9][0-9]} [ -e /etc/rc.d/rc${previous}.d/S[0-9][0-9]$suffix ] && continue fi check_script_status if [ "${SCRIPT_STAT}" == "1" ]; then SCRIPT_STAT="0" continue fi run ${i} start error_value=${?} if [ "${error_value}" != "0" ]; then print_error_msg; fi done # Store interactive variable on switch from runlevel S and remove if not if [ "${runlevel}" == "S" -a "${interactive}" == "i" ]; then echo "interactive=\"i\"" > /run/interactive else rm -f /run/interactive 2> /dev/null fi # Copy the boot log on initial boot only if [ "${previous}" == "N" -a "${runlevel}" != "S" ]; then cat $BOOTLOG >> /var/log/boot.log # Mark the end of boot echo "--------" >> /var/log/boot.log # Remove the temporary file rm -f $BOOTLOG 2> /dev/null fi # End rc
#!/bin/sh ######################################################################## # # Begin /lib/lsb/init-funtions # # Description : Run Level Control Functions # # Authors : Gerard Beekmans - gerard AT linuxfromscratch D0T org # : DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # # Notes : With code based on Matthias Benkmann's simpleinit-msb # http://winterdrache.de/linux/newboot/index.html # # The file should be located in /lib/lsb # ######################################################################## ## Environmental setup # Setup default values for environment umask 022 export PATH="/bin:/usr/bin:/sbin:/usr/sbin" ## Set color commands, used via echo # Please consult `man console_codes for more information # under the "ECMA-48 Set Graphics Rendition" section # # Warning: when switching from a 8bit to a 9bit font, # the linux console will reinterpret the bold (1;) to # the top 256 glyphs of the 9bit font. This does # not affect framebuffer consoles NORMAL="\\033[0;39m" # Standard console grey SUCCESS="\\033[1;32m" # Success is green WARNING="\\033[1;33m" # Warnings are yellow FAILURE="\\033[1;31m" # Failures are red INFO="\\033[1;36m" # Information is light cyan BRACKET="\\033[1;34m" # Brackets are blue # Use a colored prefix BMPREFIX=" " SUCCESS_PREFIX="${SUCCESS} * ${NORMAL} " FAILURE_PREFIX="${FAILURE}*****${NORMAL} " WARNING_PREFIX="${WARNING} *** ${NORMAL} " SKIP_PREFIX="${INFO} S ${NORMAL}" SUCCESS_SUFFIX="${BRACKET}[${SUCCESS} OK ${BRACKET}]${NORMAL}" FAILURE_SUFFIX="${BRACKET}[${FAILURE} FAIL ${BRACKET}]${NORMAL}" WARNING_SUFFIX="${BRACKET}[${WARNING} WARN ${BRACKET}]${NORMAL}" SKIP_SUFFIX="${BRACKET}[${INFO} SKIP ${BRACKET}]${NORMAL}" BOOTLOG=/run/bootlog KILLDELAY=3 SCRIPT_STAT="0" # Set any user specified environment variables e.g. HEADLESS [ -r /etc/sysconfig/rc.site ] && . /etc/sysconfig/rc.site ## Screen Dimensions # Find current screen size if [ -z "${COLUMNS}" ]; then COLUMNS=$(stty size) COLUMNS=${COLUMNS##* } fi # When using remote connections, such as a serial port, stty size returns 0 if [ "${COLUMNS}" = "0" ]; then COLUMNS=80 fi ## Measurements for positioning result messages COL=$((${COLUMNS} - 8)) WCOL=$((${COL} - 2)) ## Set Cursor Position Commands, used via echo SET_COL="\\033[${COL}G" # at the $COL char SET_WCOL="\\033[${WCOL}G" # at the $WCOL char CURS_UP="\\033[1A\\033[0G" # Up one line, at the 0'th char CURS_ZERO="\\033[0G" ################################################################################ # start_daemon() # # Usage: start_daemon [-f] [-n nicelevel] [-p pidfile] pathname [args...] # # # # Purpose: This runs the specified program as a daemon # # # # Inputs: -f: (force) run the program even if it is already running. # # -n nicelevel: specify a nice level. See 'man nice(1)'. # # -p pidfile: use the specified file to determine PIDs. # # pathname: the complete path to the specified program # # args: additional arguments passed to the program (pathname) # # # # Return values (as defined by LSB exit codes): # # 0 - program is running or service is OK # # 1 - generic or unspecified error # # 2 - invalid or excessive argument(s) # # 5 - program is not installed # ################################################################################ start_daemon() { local force="" local nice="0" local pidfile="" local pidlist="" local retval="" # Process arguments while true do case "${1}" in -f) force="1" shift 1 ;; -n) nice="${2}" shift 2 ;; -p) pidfile="${2}" shift 2 ;; -*) return 2 ;; *) program="${1}" break ;; esac done # Check for a valid program if [ ! -e "${program}" ]; then return 5; fi # Execute if [ -z "${force}" ]; then if [ -z "${pidfile}" ]; then # Determine the pid by discovery pidlist=`pidofproc "${1}"` retval="${?}" else # The PID file contains the needed PIDs # Note that by LSB requirement, the path must be given to pidofproc, # however, it is not used by the current implementation or standard. pidlist=`pidofproc -p "${pidfile}" "${1}"` retval="${?}" fi # Return a value ONLY # It is the init script's (or distribution's functions) responsibility # to log messages! case "${retval}" in 0) # Program is already running correctly, this is a # successful start. return 0 ;; 1) # Program is not running, but an invalid pid file exists # remove the pid file and continue rm -f "${pidfile}" ;; 3) # Program is not running and no pidfile exists # do nothing here, let start_deamon continue. ;; *) # Others as returned by status values shall not be interpreted # and returned as an unspecified error. return 1 ;; esac fi # Do the start! nice -n "${nice}" "${@}" } ################################################################################ # killproc() # # Usage: killproc [-p pidfile] pathname [signal] # # # # Purpose: Send control signals to running processes # # # # Inputs: -p pidfile, uses the specified pidfile # # pathname, pathname to the specified program # # signal, send this signal to pathname # # # # Return values (as defined by LSB exit codes): # # 0 - program (pathname) has stopped/is already stopped or a # # running program has been sent specified signal and stopped # # successfully # # 1 - generic or unspecified error # # 2 - invalid or excessive argument(s) # # 5 - program is not installed # # 7 - program is not running and a signal was supplied # ################################################################################ killproc() { local pidfile local program local prefix local progname local signal="-TERM" local fallback="-KILL" local nosig local pidlist local retval local pid local delay="30" local piddead local dtime # Process arguments while true; do case "${1}" in -p) pidfile="${2}" shift 2 ;; *) program="${1}" if [ -n "${2}" ]; then signal="${2}" fallback="" else nosig=1 fi # Error on additional arguments if [ -n "${3}" ]; then return 2 else break fi ;; esac done # Check for a valid program if [ ! -e "${program}" ]; then return 5; fi # Check for a valid signal check_signal "${signal}" if [ "${?}" -ne "0" ]; then return 2; fi # Get a list of pids if [ -z "${pidfile}" ]; then # determine the pid by discovery pidlist=`pidofproc "${1}"` retval="${?}" else # The PID file contains the needed PIDs # Note that by LSB requirement, the path must be given to pidofproc, # however, it is not used by the current implementation or standard. pidlist=`pidofproc -p "${pidfile}" "${1}"` retval="${?}" fi # Return a value ONLY # It is the init script's (or distribution's functions) responsibility # to log messages! case "${retval}" in 0) # Program is running correctly # Do nothing here, let killproc continue. ;; 1) # Program is not running, but an invalid pid file exists # Remove the pid file. progname=${program##*/} if [[ -e "/run/${progname}.pid" ]]; then pidfile="/run/${progname}.pid" rm -f "${pidfile}" fi # This is only a success if no signal was passed. if [ -n "${nosig}" ]; then return 0 else return 7 fi ;; 3) # Program is not running and no pidfile exists # This is only a success if no signal was passed. if [ -n "${nosig}" ]; then return 0 else return 7 fi ;; *) # Others as returned by status values shall not be interpreted # and returned as an unspecified error. return 1 ;; esac # Perform different actions for exit signals and control signals check_sig_type "${signal}" if [ "${?}" -eq "0" ]; then # Signal is used to terminate the program # Account for empty pidlist (pid file still exists and no # signal was given) if [ "${pidlist}" != "" ]; then # Kill the list of pids for pid in ${pidlist}; do kill -0 "${pid}" 2> /dev/null if [ "${?}" -ne "0" ]; then # Process is dead, continue to next and assume all is well continue else kill "${signal}" "${pid}" 2> /dev/null # Wait up to ${delay}/10 seconds to for "${pid}" to # terminate in 10ths of a second while [ "${delay}" -ne "0" ]; do kill -0 "${pid}" 2> /dev/null || piddead="1" if [ "${piddead}" = "1" ]; then break; fi sleep 0.1 delay="$(( ${delay} - 1 ))" done # If a fallback is set, and program is still running, then # use the fallback if [ -n "${fallback}" -a "${piddead}" != "1" ]; then kill "${fallback}" "${pid}" 2> /dev/null sleep 1 # Check again, and fail if still running kill -0 "${pid}" 2> /dev/null && return 1 fi fi done fi # Check for and remove stale PID files. if [ -z "${pidfile}" ]; then # Find the basename of $program prefix=`echo "${program}" | sed 's/[^/]*$//'` progname=`echo "${program}" | sed "s@${prefix}@@"` if [ -e "/run/${progname}.pid" ]; then rm -f "/run/${progname}.pid" 2> /dev/null fi else if [ -e "${pidfile}" ]; then rm -f "${pidfile}" 2> /dev/null; fi fi # For signals that do not expect a program to exit, simply # let kill do its job, and evaluate kill's return for value else # check_sig_type - signal is not used to terminate program for pid in ${pidlist}; do kill "${signal}" "${pid}" if [ "${?}" -ne "0" ]; then return 1; fi done fi } ################################################################################ # pidofproc() # # Usage: pidofproc [-p pidfile] pathname # # # # Purpose: This function returns one or more pid(s) for a particular daemon # # # # Inputs: -p pidfile, use the specified pidfile instead of pidof # # pathname, path to the specified program # # # # Return values (as defined by LSB status codes): # # 0 - Success (PIDs to stdout) # # 1 - Program is dead, PID file still exists (remaining PIDs output) # # 3 - Program is not running (no output) # ################################################################################ pidofproc() { local pidfile local program local prefix local progname local pidlist local lpids local exitstatus="0" # Process arguments while true; do case "${1}" in -p) pidfile="${2}" shift 2 ;; *) program="${1}" if [ -n "${2}" ]; then # Too many arguments # Since this is status, return unknown return 4 else break fi ;; esac done # If a PID file is not specified, try and find one. if [ -z "${pidfile}" ]; then # Get the program's basename prefix=`echo "${program}" | sed 's/[^/]*$//'` if [ -z "${prefix}" ]; then progname="${program}" else progname=`echo "${program}" | sed "s@${prefix}@@"` fi # If a PID file exists with that name, assume that is it. if [ -e "/run/${progname}.pid" ]; then pidfile="/run/${progname}.pid" fi fi # If a PID file is set and exists, use it. if [ -n "${pidfile}" -a -e "${pidfile}" ]; then # Use the value in the first line of the pidfile pidlist=`/bin/head -n1 "${pidfile}"` # This can optionally be written as 'sed 1q' to repalce 'head -n1' # should LFS move /bin/head to /usr/bin/head else # Use pidof pidlist=`pidof "${program}"` fi # Figure out if all listed PIDs are running. for pid in ${pidlist}; do kill -0 ${pid} 2> /dev/null if [ "${?}" -eq "0" ]; then lpids="${lpids}${pid} " else exitstatus="1" fi done if [ -z "${lpids}" -a ! -f "${pidfile}" ]; then return 3 else echo "${lpids}" return "${exitstatus}" fi } ################################################################################ # statusproc() # # Usage: statusproc [-p pidfile] pathname # # # # Purpose: This function prints the status of a particular daemon to stdout # # # # Inputs: -p pidfile, use the specified pidfile instead of pidof # # pathname, path to the specified program # # # # Return values: # # 0 - Status printed # # 1 - Input error. The daemon to check was not specified. # ################################################################################ statusproc() { local pidfile local pidlist if [ "${#}" = "0" ]; then echo "Usage: statusproc [-p pidfle] {program}" exit 1 fi # Process arguments while true; do case "${1}" in -p) pidfile="${2}" shift 2 ;; *) if [ -n "${2}" ]; then echo "Too many arguments" return 1 else break fi ;; esac done if [ -n "${pidfile}" ]; then pidlist=`pidofproc -p "${pidfile}" $@` else pidlist=`pidofproc $@` fi # Trim trailing blanks pidlist=`echo "${pidlist}" | sed -r 's/ +$//'` base="${1##*/}" if [ -n "${pidlist}" ]; then /bin/echo -e "${INFO}${base} is running with Process" \ "ID(s) ${pidlist}.${NORMAL}" else if [ -n "${base}" -a -e "/run/${base}.pid" ]; then /bin/echo -e "${WARNING}${1} is not running but" \ "/run/${base}.pid exists.${NORMAL}" else if [ -n "${pidfile}" -a -e "${pidfile}" ]; then /bin/echo -e "${WARNING}${1} is not running" \ "but ${pidfile} exists.${NORMAL}" else /bin/echo -e "${INFO}${1} is not running.${NORMAL}" fi fi fi } ################################################################################ # timespec() # # # # Purpose: An internal utility function to format a timestamp # # a boot log file. Sets the STAMP variable. # # # # Return value: Not used # ################################################################################ timespec() { STAMP="$(echo `date +"%b %d %T %:z"` `hostname`) " return 0 } ################################################################################ # log_success_msg() # # Usage: log_success_msg ["message"] # # # # Purpose: Print a successful status message to the screen and # # a boot log file. # # # # Inputs: $@ - Message # # # # Return values: Not used # ################################################################################ log_success_msg() { /bin/echo -n -e "${BMPREFIX}${@}" /bin/echo -e "${CURS_ZERO}${SUCCESS_PREFIX}${SET_COL}${SUCCESS_SUFFIX}" # Strip non-printable characters from log file logmessage=`echo "${@}" | sed 's/\\\033[^a-zA-Z]*.//g'` timespec /bin/echo -e "${STAMP} ${logmessage} OK" >> ${BOOTLOG} return 0 } log_success_msg2() { /bin/echo -n -e "${BMPREFIX}${@}" /bin/echo -e "${CURS_ZERO}${SUCCESS_PREFIX}${SET_COL}${SUCCESS_SUFFIX}" echo " OK" >> ${BOOTLOG} return 0 } ################################################################################ # log_failure_msg() # # Usage: log_failure_msg ["message"] # # # # Purpose: Print a failure status message to the screen and # # a boot log file. # # # # Inputs: $@ - Message # # # # Return values: Not used # ################################################################################ log_failure_msg() { /bin/echo -n -e "${BMPREFIX}${@}" /bin/echo -e "${CURS_ZERO}${FAILURE_PREFIX}${SET_COL}${FAILURE_SUFFIX}" # Strip non-printable characters from log file timespec logmessage=`echo "${@}" | sed 's/\\\033[^a-zA-Z]*.//g'` /bin/echo -e "${STAMP} ${logmessage} FAIL" >> ${BOOTLOG} return 0 } log_failure_msg2() { /bin/echo -n -e "${BMPREFIX}${@}" /bin/echo -e "${CURS_ZERO}${FAILURE_PREFIX}${SET_COL}${FAILURE_SUFFIX}" echo "FAIL" >> ${BOOTLOG} return 0 } ################################################################################ # log_warning_msg() # # Usage: log_warning_msg ["message"] # # # # Purpose: Print a warning status message to the screen and # # a boot log file. # # # # Return values: Not used # ################################################################################ log_warning_msg() { /bin/echo -n -e "${BMPREFIX}${@}" /bin/echo -e "${CURS_ZERO}${WARNING_PREFIX}${SET_COL}${WARNING_SUFFIX}" # Strip non-printable characters from log file logmessage=`echo "${@}" | sed 's/\\\033[^a-zA-Z]*.//g'` timespec /bin/echo -e "${STAMP} ${logmessage} WARN" >> ${BOOTLOG} return 0 } log_skip_msg() { /bin/echo -n -e "${BMPREFIX}${@}" /bin/echo -e "${CURS_ZERO}${SKIP_PREFIX}${SET_COL}${SKIP_SUFFIX}" # Strip non-printable characters from log file logmessage=`echo "${@}" | sed 's/\\\033[^a-zA-Z]*.//g'` /bin/echo "SKIP" >> ${BOOTLOG} return 0 } ################################################################################ # log_info_msg() # # Usage: log_info_msg message # # # # Purpose: Print an information message to the screen and # # a boot log file. Does not print a trailing newline character. # # # # Return values: Not used # ################################################################################ log_info_msg() { /bin/echo -n -e "${BMPREFIX}${@}" # Strip non-printable characters from log file logmessage=`echo "${@}" | sed 's/\\\033[^a-zA-Z]*.//g'` timespec /bin/echo -n -e "${STAMP} ${logmessage}" >> ${BOOTLOG} return 0 } log_info_msg2() { /bin/echo -n -e "${@}" # Strip non-printable characters from log file logmessage=`echo "${@}" | sed 's/\\\033[^a-zA-Z]*.//g'` /bin/echo -n -e "${logmessage}" >> ${BOOTLOG} return 0 } ################################################################################ # evaluate_retval() # # Usage: Evaluate a return value and print success or failure as appropriate # # # # Purpose: Convenience function to terminate an info message # # # # Return values: Not used # ################################################################################ evaluate_retval() { local error_value="${?}" if [ ${error_value} = 0 ]; then log_success_msg2 else log_failure_msg2 fi } ################################################################################ # check_signal() # # Usage: check_signal [ -{signal} ] # # # # Purpose: Check for a valid signal. This is not defined by any LSB draft, # # however, it is required to check the signals to determine if the # # signals chosen are invalid arguments to the other functions. # # # # Inputs: Accepts a single string value in the form of -{signal} # # # # Return values: # # 0 - Success (signal is valid # # 1 - Signal is not valid # ################################################################################ check_signal() { local valsig # Add error handling for invalid signals valsig=" -ALRM -HUP -INT -KILL -PIPE -POLL -PROF -TERM -USR1 -USR2" valsig="${valsig} -VTALRM -STKFLT -PWR -WINCH -CHLD -URG -TSTP -TTIN" valsig="${valsig} -TTOU -STOP -CONT -ABRT -FPE -ILL -QUIT -SEGV -TRAP" valsig="${valsig} -SYS -EMT -BUS -XCPU -XFSZ -0 -1 -2 -3 -4 -5 -6 -8 -9" valsig="${valsig} -11 -13 -14 -15 " echo "${valsig}" | grep -- " ${1} " > /dev/null if [ "${?}" -eq "0" ]; then return 0 else return 1 fi } ################################################################################ # check_sig_type() # # Usage: check_signal [ -{signal} | {signal} ] # # # # Purpose: Check if signal is a program termination signal or a control signal # # This is not defined by any LSB draft, however, it is required to # # check the signals to determine if they are intended to end a # # program or simply to control it. # # # # Inputs: Accepts a single string value in the form or -{signal} or {signal} # # # # Return values: # # 0 - Signal is used for program termination # # 1 - Signal is used for program control # ################################################################################ check_sig_type() { local valsig # The list of termination signals (limited to generally used items) valsig=" -ALRM -INT -KILL -TERM -PWR -STOP -ABRT -QUIT -2 -3 -6 -9 -14 -15 " echo "${valsig}" | grep -- " ${1} " > /dev/null if [ "${?}" -eq "0" ]; then return 0 else return 1 fi } ################################################################################ # wait_for_user() # # # # Purpose: Wait for the user to respond if not a headless system # # # ################################################################################ wait_for_user() { # Wait for the user by default [ "${HEADLESS=0}" = "0" ] && read ENTER return 0 } ################################################################################ # is_true() # # # # Purpose: Utility to test if a variable is true | yes | 1 # # # ################################################################################ is_true() { [ "$1" = "1" ] || [ "$1" = "yes" ] || [ "$1" = "true" ] || [ "$1" = "y" ] || [ "$1" = "t" ] } # End /lib/lsb/init-functions
#!/bin/sh ######################################################################## # Begin mountvirtfs # # Description : Ensure proc, sysfs, run, and dev are mounted # # Authors : Gerard Beekmans - gerard AT linuxfromscratch D0T org # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # Xi Ruoyao - xry111@xry111.site # # Version : LFS 12.0 # ######################################################################## ### BEGIN INIT INFO # Provides: mountvirtfs # Required-Start: $first # Should-Start: # Required-Stop: # Should-Stop: # Default-Start: S # Default-Stop: # Short-Description: Mounts various special fs needed at start # Description: Mounts /sys and /proc virtual (kernel) filesystems. # Mounts /run (tmpfs) and /dev (devtmpfs). # This is done only if they are not already mounted. # with the kernel config proposed in the book, dev # should be automatically mounted by the kernel. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions case "${1}" in start) # Make sure /run is available before logging any messages if ! mountpoint /run >/dev/null; then mount /run || failed=1 fi mkdir -p /run/lock chmod 1777 /run/lock log_info_msg "Mounting virtual file systems: ${INFO}/run" if ! mountpoint /proc >/dev/null; then log_info_msg2 " ${INFO}/proc" mount -o nosuid,noexec,nodev /proc || failed=1 fi if ! mountpoint /sys >/dev/null; then log_info_msg2 " ${INFO}/sys" mount -o nosuid,noexec,nodev /sys || failed=1 fi if ! mountpoint /dev >/dev/null; then log_info_msg2 " ${INFO}/dev" mount -o mode=0755,nosuid /dev || failed=1 fi mkdir -p /dev/shm log_info_msg2 " ${INFO}/dev/shm" mount -o nosuid,nodev /dev/shm || failed=1 mkdir -p /sys/fs/cgroup log_info_msg2 " ${INFO}/sys/fs/cgroup" mount -o nosuid,noexec,nodev /sys/fs/cgroup || failed=1 (exit ${failed}) evaluate_retval if [ "${failed}" = 1 ]; then exit 1 fi log_info_msg "Create symlinks in /dev targeting /proc: ${INFO}/dev/stdin" ln -sf /proc/self/fd/0 /dev/stdin || failed=1 log_info_msg2 " ${INFO}/dev/stdout" ln -sf /proc/self/fd/1 /dev/stdout || failed=1 log_info_msg2 " ${INFO}/dev/stderr" ln -sf /proc/self/fd/2 /dev/stderr || failed=1 log_info_msg2 " ${INFO}/dev/fd" ln -sf /proc/self/fd /dev/fd || failed=1 if [ -e /proc/kcore ]; then log_info_msg2 " ${INFO}/dev/core" ln -sf /proc/kcore /dev/core || failed=1 fi (exit ${failed}) evaluate_retval exit $failed ;; *) echo "Usage: ${0} {start}" exit 1 ;; esac # End mountvirtfs
#!/bin/sh ######################################################################## # Begin modules # # Description : Module auto-loading script # # Authors : Zack Winkles # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: modules # Required-Start: mountvirtfs # Should-Start: # Required-Stop: # Should-Stop: # Default-Start: S # Default-Stop: # Short-Description: Loads required modules. # Description: Loads modules listed in /etc/sysconfig/modules. # X-LFS-Provided-By: LFS ### END INIT INFO # Assure that the kernel has module support. [ -e /proc/modules ] || exit 0 . /lib/lsb/init-functions case "${1}" in start) # Exit if there's no modules file or there are no # valid entries [ -r /etc/sysconfig/modules ] || exit 0 grep -E -qv '^($|#)' /etc/sysconfig/modules || exit 0 log_info_msg "Loading modules:" # Only try to load modules if the user has actually given us # some modules to load. while read module args; do # Ignore comments and blank lines. case "$module" in ""|"#"*) continue ;; esac # Attempt to load the module, passing any arguments provided. modprobe ${module} ${args} >/dev/null # Print the module name if successful, otherwise take note. if [ $? -eq 0 ]; then log_info_msg2 " ${module}" else failedmod="${failedmod} ${module}" fi done < /etc/sysconfig/modules # Print a message about successfully loaded modules on the correct line. log_success_msg2 # Print a failure message with a list of any modules that # may have failed to load. if [ -n "${failedmod}" ]; then log_failure_msg "Failed to load modules:${failedmod}" exit 1 fi ;; *) echo "Usage: ${0} {start}" exit 1 ;; esac exit 0 # End modules
#!/bin/sh ######################################################################## # Begin udev # # Description : Udev cold-plugging script # # Authors : Zack Winkles, Alexander E. Patrakov # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # Xi Ruoyao - xry111@xry111.site # # Version : LFS 12.0 # ######################################################################## ### BEGIN INIT INFO # Provides: udev $time # Required-Start: localnet # Should-Start: modules # Required-Stop: # Should-Stop: # Default-Start: S # Default-Stop: # Short-Description: Populates /dev with device nodes. # Description: Mounts a tempfs on /dev and starts the udevd daemon. # Device nodes are created as defined by udev. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions case "${1}" in start) log_info_msg "Populating /dev with device nodes... " if ! grep -q '[[:space:]]sysfs' /proc/mounts; then log_failure_msg2 msg="FAILURE:\n\nUnable to create " msg="${msg}devices without a SysFS filesystem\n\n" msg="${msg}After you press Enter, this system " msg="${msg}will be halted and powered off.\n\n" log_info_msg "$msg" log_info_msg "Press Enter to continue..." wait_for_user /etc/rc.d/init.d/halt start fi # Start the udev daemon to continually watch for, and act on, # uevents SYSTEMD_LOG_TARGET=kmsg /sbin/udevd --daemon # Now traverse /sys in order to "coldplug" devices that have # already been discovered /bin/udevadm trigger --action=add --type=subsystems /bin/udevadm trigger --action=add --type=devices /bin/udevadm trigger --action=change --type=devices # Now wait for udevd to process the uevents we triggered if ! is_true "$OMIT_UDEV_SETTLE"; then /bin/udevadm settle fi # If any LVM based partitions are on the system, ensure they # are activated so they can be used. if [ -x /sbin/vgchange ]; then /sbin/vgchange -a y >/dev/null; fi log_success_msg2 ;; *) echo "Usage ${0} {start}" exit 1 ;; esac exit 0 # End udev
#!/bin/sh ######################################################################## # Begin swap # # Description : Swap Control Script # # Authors : Gerard Beekmans - gerard AT linuxfromscratch D0T org # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: swap # Required-Start: udev # Should-Start: modules # Required-Stop: localnet # Should-Stop: $local_fs # Default-Start: S # Default-Stop: 0 6 # Short-Description: Activates and deactivates swap partitions. # Description: Activates and deactivates swap partitions defined in # /etc/fstab. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions case "${1}" in start) log_info_msg "Activating all swap files/partitions..." swapon -a evaluate_retval ;; stop) log_info_msg "Deactivating all swap files/partitions..." swapoff -a evaluate_retval ;; restart) ${0} stop sleep 1 ${0} start ;; status) log_success_msg "Retrieving swap status." swapon -s ;; *) echo "Usage: ${0} {start|stop|restart|status}" exit 1 ;; esac exit 0 # End swap
#!/bin/sh ######################################################################## # Begin setclock # # Description : Setting Linux Clock # # Authors : Gerard Beekmans - gerard AT linuxfromscratch D0T org # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: # Required-Start: # Should-Start: modules # Required-Stop: # Should-Stop: $syslog # Default-Start: S # Default-Stop: # Short-Description: Stores and restores time from the hardware clock # Description: On boot, system time is obtained from hwclock. The # hardware clock can also be set on shutdown. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions [ -r /etc/sysconfig/clock ] && . /etc/sysconfig/clock case "${UTC}" in yes|true|1) CLOCKPARAMS="${CLOCKPARAMS} --utc" ;; no|false|0) CLOCKPARAMS="${CLOCKPARAMS} --localtime" ;; esac case ${1} in start) hwclock --hctosys ${CLOCKPARAMS} >/dev/null ;; stop) log_info_msg "Setting hardware clock..." hwclock --systohc ${CLOCKPARAMS} >/dev/null evaluate_retval ;; *) echo "Usage: ${0} {start|stop}" exit 1 ;; esac exit 0
#!/bin/sh ######################################################################## # Begin checkfs # # Description : File System Check # # Authors : Gerard Beekmans - gerard AT linuxfromscratch D0T org # A. Luebke - luebke@users.sourceforge.net # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # # Based on checkfs script from LFS-3.1 and earlier. # # From man fsck # 0 - No errors # 1 - File system errors corrected # 2 - System should be rebooted # 4 - File system errors left uncorrected # 8 - Operational error # 16 - Usage or syntax error # 32 - Fsck canceled by user request # 128 - Shared library error # ######################################################################### ### BEGIN INIT INFO # Provides: checkfs # Required-Start: udev swap # Should-Start: # Required-Stop: # Should-Stop: # Default-Start: S # Default-Stop: # Short-Description: Checks local filesystems before mounting. # Description: Checks local filesystems before mounting. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions case "${1}" in start) if [ -f /fastboot ]; then msg="/fastboot found, will omit " msg="${msg} file system checks as requested.\n" log_info_msg "${msg}" exit 0 fi log_info_msg "Mounting root file system in read-only mode... " mount -n -o remount,ro / >/dev/null if [ ${?} != 0 ]; then log_failure_msg2 msg="\n\nCannot check root " msg="${msg}filesystem because it could not be mounted " msg="${msg}in read-only mode.\n\n" msg="${msg}After you press Enter, this system will be " msg="${msg}halted and powered off.\n\n" log_failure_msg "${msg}" log_info_msg "Press Enter to continue..." wait_for_user /etc/rc.d/init.d/halt start else log_success_msg2 fi if [ -f /forcefsck ]; then msg="/forcefsck found, forcing file" msg="${msg} system checks as requested." log_success_msg "$msg" options="-f" else options="" fi log_info_msg "Checking file systems..." # Note: -a option used to be -p; but this fails e.g. on fsck.minix if is_true "$VERBOSE_FSCK"; then fsck ${options} -a -A -C -T else fsck ${options} -a -A -C -T >/dev/null fi error_value=${?} if [ "${error_value}" = 0 ]; then log_success_msg2 fi if [ "${error_value}" = 1 ]; then msg="\nWARNING:\n\nFile system errors " msg="${msg}were found and have been corrected.\n" msg="${msg} You may want to double-check that " msg="${msg}everything was fixed properly." log_warning_msg "$msg" fi if [ "${error_value}" = 2 -o "${error_value}" = 3 ]; then msg="\nWARNING:\n\nFile system errors " msg="${msg}were found and have been " msg="${msg}corrected, but the nature of the " msg="${msg}errors require this system to be rebooted.\n\n" msg="${msg}After you press enter, " msg="${msg}this system will be rebooted\n\n" log_failure_msg "$msg" log_info_msg "Press Enter to continue..." wait_for_user reboot -f fi if [ "${error_value}" -gt 3 -a "${error_value}" -lt 16 ]; then msg="\nFAILURE:\n\nFile system errors " msg="${msg}were encountered that could not be " msg="${msg}fixed automatically.\nThis system " msg="${msg}cannot continue to boot and will " msg="${msg}therefore be halted until those " msg="${msg}errors are fixed manually by a " msg="${msg}System Administrator.\n\n" msg="${msg}After you press Enter, this system will be " msg="${msg}halted and powered off.\n\n" log_failure_msg "$msg" log_info_msg "Press Enter to continue..." wait_for_user /etc/rc.d/init.d/halt start fi if [ "${error_value}" -ge 16 ]; then msg="FAILURE:\n\nUnexpected failure " msg="${msg}running fsck. Exited with error " msg="${msg} code: ${error_value}.\n" log_info_msg $msg exit ${error_value} fi exit 0 ;; *) echo "Usage: ${0} {start}" exit 1 ;; esac # End checkfs
#!/bin/sh ######################################################################## # Begin mountfs # # Description : File System Mount Script # # Authors : Gerard Beekmans - gerard AT linuxfromscratch D0T org # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: $local_fs # Required-Start: udev checkfs # Should-Start: modules # Required-Stop: localnet # Should-Stop: # Default-Start: S # Default-Stop: 0 6 # Short-Description: Mounts/unmounts local filesystems defined in /etc/fstab. # Description: Remounts root filesystem read/write and mounts all # remaining local filesystems defined in /etc/fstab on # start. Remounts root filesystem read-only and unmounts # remaining filesystems on stop. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions case "${1}" in start) log_info_msg "Remounting root file system in read-write mode..." mount --options remount,rw / >/dev/null evaluate_retval # Remove fsck-related file system watermarks. rm -f /fastboot /forcefsck # Make sure /dev/pts exists mkdir -p /dev/pts # This will mount all filesystems that do not have _netdev in # their option list. _netdev denotes a network filesystem. log_info_msg "Mounting remaining file systems..." failed=0 mount --all --test-opts no_netdev >/dev/null || failed=1 evaluate_retval exit $failed ;; stop) # Don't unmount virtual file systems like /run log_info_msg "Unmounting all other currently mounted file systems..." # Ensure any loop devices are removed losetup -D umount --all --detach-loop --read-only \ --types notmpfs,nosysfs,nodevtmpfs,noproc,nodevpts >/dev/null evaluate_retval # Make sure / is mounted read only (umount bug) mount --options remount,ro / # Make all LVM volume groups unavailable, if appropriate # This fails if swap or / are on an LVM partition #if [ -x /sbin/vgchange ]; then /sbin/vgchange -an > /dev/null; fi if [ -r /etc/mdadm.conf ]; then log_info_msg "Mark arrays as clean..." mdadm --wait-clean --scan evaluate_retval fi ;; *) echo "Usage: ${0} {start|stop}" exit 1 ;; esac # End mountfs
#!/bin/sh ######################################################################## # Begin udev_retry # # Description : Udev cold-plugging script (retry) # # Authors : Alexander E. Patrakov # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # Bryan Kadzban - # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: udev_retry # Required-Start: udev # Should-Start: $local_fs cleanfs # Required-Stop: # Should-Stop: # Default-Start: S # Default-Stop: # Short-Description: Replays failed uevents and creates additional devices. # Description: Replays any failed uevents that were skipped due to # slow hardware initialization, and creates those needed # device nodes # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions case "${1}" in start) log_info_msg "Retrying failed uevents, if any..." rundir=/run/udev # From Debian: "copy the rules generated before / was mounted # read-write": for file in ${rundir}/tmp-rules--*; do dest=${file##*tmp-rules--} [ "$dest" = '*' ] && break cat $file >> /etc/udev/rules.d/$dest rm -f $file done # Re-trigger the uevents that may have failed, # in hope they will succeed now /bin/sed -e 's/#.*$//' /etc/sysconfig/udev_retry | /bin/grep -v '^$' | \ while read line ; do for subsystem in $line ; do /bin/udevadm trigger --subsystem-match=$subsystem --action=add done done # Now wait for udevd to process the uevents we triggered if ! is_true "$OMIT_UDEV_RETRY_SETTLE"; then /bin/udevadm settle fi evaluate_retval ;; *) echo "Usage ${0} {start}" exit 1 ;; esac exit 0 # End udev_retry
#!/bin/sh ######################################################################## # Begin cleanfs # # Description : Clean file system # # Authors : Gerard Beekmans - gerard AT linuxfromscratch D0T org # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: cleanfs # Required-Start: $local_fs # Should-Start: # Required-Stop: # Should-Stop: # Default-Start: S # Default-Stop: # Short-Description: Cleans temporary directories early in the boot process. # Description: Cleans temporary directories /run, /var/lock, and # optionally, /tmp. cleanfs also creates /run/utmp # and any files defined in /etc/sysconfig/createfiles. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions # Function to create files/directory on boot. create_files() { # Input to file descriptor 9 and output to stdin (redirection) exec 9>&0 < /etc/sysconfig/createfiles while read name type perm usr grp dtype maj min junk do # Ignore comments and blank lines. case "${name}" in ""|\#*) continue ;; esac # Ignore existing files. if [ ! -e "${name}" ]; then # Create stuff based on its type. case "${type}" in dir) mkdir "${name}" ;; file) :> "${name}" ;; dev) case "${dtype}" in char) mknod "${name}" c ${maj} ${min} ;; block) mknod "${name}" b ${maj} ${min} ;; pipe) mknod "${name}" p ;; *) log_warning_msg "\nUnknown device type: ${dtype}" ;; esac ;; *) log_warning_msg "\nUnknown type: ${type}" continue ;; esac # Set up the permissions, too. chown ${usr}:${grp} "${name}" chmod ${perm} "${name}" fi done # Close file descriptor 9 (end redirection) exec 0>&9 9>&- return 0 } case "${1}" in start) log_info_msg "Cleaning file systems:" if [ "${SKIPTMPCLEAN}" = "" ]; then log_info_msg2 " /tmp" cd /tmp && find . -xdev -mindepth 1 ! -name lost+found -delete || failed=1 fi > /run/utmp if grep -q '^utmp:' /etc/group ; then chmod 664 /run/utmp chgrp utmp /run/utmp fi (exit ${failed}) evaluate_retval if grep -E -qv '^(#|$)' /etc/sysconfig/createfiles 2>/dev/null; then log_info_msg "Creating files and directories... " create_files # Always returns 0 evaluate_retval fi exit $failed ;; *) echo "Usage: ${0} {start}" exit 1 ;; esac # End cleanfs
#!/bin/sh ######################################################################## # Begin console # # Description : Sets keymap and screen font # # Authors : Gerard Beekmans - gerard AT linuxfromscratch D0T org # Alexander E. Patrakov # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: console # Required-Start: $local_fs # Should-Start: udev_retry # Required-Stop: # Should-Stop: # Default-Start: S # Default-Stop: # Short-Description: Sets up a localised console. # Description: Sets up fonts and language settings for the user's # local as defined by /etc/sysconfig/console. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions # Native English speakers probably don't have /etc/sysconfig/console at all [ -r /etc/sysconfig/console ] && . /etc/sysconfig/console failed=0 case "${1}" in start) # See if we need to do anything if [ -z "${KEYMAP}" ] && [ -z "${KEYMAP_CORRECTIONS}" ] && [ -z "${FONT}" ] && [ -z "${LEGACY_CHARSET}" ] && ! is_true "${UNICODE}"; then exit 0 fi # There should be no bogus failures below this line! log_info_msg "Setting up Linux console..." # Figure out if a framebuffer console is used [ -d /sys/class/graphics/fb0 ] && use_fb=1 || use_fb=0 # Figure out the command to set the console into the # desired mode is_true "${UNICODE}" && MODE_COMMAND="echo -en '\033%G' && kbd_mode -u" || MODE_COMMAND="echo -en '\033%@\033(K' && kbd_mode -a" # On framebuffer consoles, font has to be set for each vt in # UTF-8 mode. This doesn't hurt in non-UTF-8 mode also. ! is_true "${use_fb}" || [ -z "${FONT}" ] || MODE_COMMAND="${MODE_COMMAND} && setfont ${FONT}" # Apply that command to all consoles mentioned in # /etc/inittab. Important: in the UTF-8 mode this should # happen before setfont, otherwise a kernel bug will # show up and the unicode map of the font will not be # used. for TTY in `grep '^[^#].*respawn:/sbin/agetty' /etc/inittab | grep -o '\btty[[:digit:]]*\b'` do openvt -f -w -c ${TTY#tty} -- \ /bin/sh -c "${MODE_COMMAND}" || failed=1 done # Set the font (if not already set above) and the keymap [ "${use_fb}" == "1" ] || [ -z "${FONT}" ] || setfont $FONT || failed=1 [ -z "${KEYMAP}" ] || loadkeys ${KEYMAP} >/dev/null 2>&1 || failed=1 [ -z "${KEYMAP_CORRECTIONS}" ] || loadkeys ${KEYMAP_CORRECTIONS} >/dev/null 2>&1 || failed=1 # Convert the keymap from $LEGACY_CHARSET to UTF-8 [ -z "$LEGACY_CHARSET" ] || dumpkeys -c "$LEGACY_CHARSET" | loadkeys -u >/dev/null 2>&1 || failed=1 # If any of the commands above failed, the trap at the # top would set $failed to 1 ( exit $failed ) evaluate_retval exit $failed ;; *) echo "Usage: ${0} {start}" exit 1 ;; esac # End console
#!/bin/sh ######################################################################## # Begin localnet # # Description : Loopback device # # Authors : Gerard Beekmans - gerard AT linuxfromscratch D0T org # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: localnet # Required-Start: mountvirtfs # Should-Start: modules # Required-Stop: # Should-Stop: # Default-Start: S # Default-Stop: 0 6 # Short-Description: Starts the local network. # Description: Sets the hostname of the machine and starts the # loopback interface. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions [ -r /etc/sysconfig/network ] && . /etc/sysconfig/network [ -r /etc/hostname ] && HOSTNAME=`cat /etc/hostname` case "${1}" in start) log_info_msg "Bringing up the loopback interface..." ip addr add 127.0.0.1/8 label lo dev lo ip link set lo up evaluate_retval log_info_msg "Setting hostname to ${HOSTNAME}..." hostname ${HOSTNAME} evaluate_retval ;; stop) log_info_msg "Bringing down the loopback interface..." ip link set lo down evaluate_retval ;; restart) ${0} stop sleep 1 ${0} start ;; status) echo "Hostname is: $(hostname)" ip link show lo ;; *) echo "Usage: ${0} {start|stop|restart|status}" exit 1 ;; esac exit 0 # End localnet
#!/bin/sh ######################################################################## # Begin sysctl # # Description : File uses /etc/sysctl.conf to set kernel runtime # parameters # # Authors : Nathan Coulson (nathan AT linuxfromscratch D0T org) # Matthew Burgress (matthew AT linuxfromscratch D0T org) # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: sysctl # Required-Start: mountvirtfs # Should-Start: console # Required-Stop: # Should-Stop: # Default-Start: S # Default-Stop: # Short-Description: Makes changes to the proc filesystem # Description: Makes changes to the proc filesystem as defined in # /etc/sysctl.conf. See 'man sysctl(8)'. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions case "${1}" in start) if [ -f "/etc/sysctl.conf" ]; then log_info_msg "Setting kernel runtime parameters..." sysctl -q -p evaluate_retval fi ;; status) sysctl -a ;; *) echo "Usage: ${0} {start|status}" exit 1 ;; esac exit 0 # End sysctl
#!/bin/sh ######################################################################## # Begin sysklogd # # Description : Sysklogd loader # # Authors : Gerard Beekmans - gerard AT linuxfromscratch D0T org # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: $syslog # Required-Start: $first localnet # Should-Start: # Required-Stop: $local_fs # Should-Stop: sendsignals # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Starts kernel and system log daemons. # Description: Starts kernel and system log daemons. # /etc/fstab. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions case "${1}" in start) log_info_msg "Starting system log daemon..." parms=${SYSKLOGD_PARMS-'-m 0'} start_daemon /sbin/syslogd $parms evaluate_retval log_info_msg "Starting kernel log daemon..." start_daemon /sbin/klogd evaluate_retval ;; stop) log_info_msg "Stopping kernel log daemon..." killproc /sbin/klogd evaluate_retval log_info_msg "Stopping system log daemon..." killproc /sbin/syslogd evaluate_retval ;; reload) log_info_msg "Reloading system log daemon config file..." pid=`pidofproc syslogd` kill -HUP "${pid}" evaluate_retval ;; restart) ${0} stop sleep 1 ${0} start ;; status) statusproc /sbin/syslogd statusproc klogd ;; *) echo "Usage: ${0} {start|stop|reload|restart|status}" exit 1 ;; esac exit 0 # End sysklogd
#!/bin/sh ######################################################################## # Begin network # # Description : Network Control Script # # Authors : Gerard Beekmans - gerard AT linuxfromscratch D0T org # Nathan Coulson - nathan AT linuxfromscratch D0T org # Kevin P. Fleming - kpfleming@linuxfromscratch.org # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: $network # Required-Start: $local_fs localnet swap # Should-Start: $syslog firewalld iptables nftables # Required-Stop: $local_fs localnet swap # Should-Stop: $syslog firewalld iptables nftables # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Starts and configures network interfaces. # Description: Starts and configures network interfaces. # X-LFS-Provided-By: LFS ### END INIT INFO case "${1}" in start) # if the default route exists, network is already configured if ip route | grep -q "^default"; then return 0; fi # Start all network interfaces for file in /etc/sysconfig/ifconfig.* do interface=${file##*/ifconfig.} # Skip if $file is * (because nothing was found) if [ "${interface}" = "*" ]; then continue; fi /sbin/ifup ${interface} done ;; stop) # Unmount any network mounted file systems umount --all --force --types nfs,cifs,nfs4 # Reverse list net_files="" for file in /etc/sysconfig/ifconfig.* do net_files="${file} ${net_files}" done # Stop all network interfaces for file in ${net_files} do interface=${file##*/ifconfig.} # Skip if $file is * (because nothing was found) if [ "${interface}" = "*" ]; then continue; fi # See if interface exists if [ ! -e /sys/class/net/$interface ]; then continue; fi # Is interface UP? ip link show $interface 2>/dev/null | grep -q "state UP" if [ $? -ne 0 ]; then continue; fi /sbin/ifdown ${interface} done ;; restart) ${0} stop sleep 1 ${0} start ;; *) echo "Usage: ${0} {start|stop|restart}" exit 1 ;; esac exit 0 # End network
#!/bin/sh ######################################################################## # Begin sendsignals # # Description : Sendsignals Script # # Authors : Gerard Beekmans - gerard AT linuxfromscratch D0T org # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: sendsignals # Required-Start: # Should-Start: # Required-Stop: $local_fs swap localnet # Should-Stop: # Default-Start: # Default-Stop: 0 6 # Short-Description: Attempts to kill remaining processes. # Description: Attempts to kill remaining processes. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions case "${1}" in stop) omit=$(pidof mdmon) [ -n "$omit" ] && omit="-o $omit" log_info_msg "Sending all processes the TERM signal..." killall5 -15 $omit error_value=${?} sleep ${KILLDELAY} if [ "${error_value}" = 0 -o "${error_value}" = 2 ]; then log_success_msg else log_failure_msg fi log_info_msg "Sending all processes the KILL signal..." killall5 -9 $omit error_value=${?} sleep ${KILLDELAY} if [ "${error_value}" = 0 -o "${error_value}" = 2 ]; then log_success_msg else log_failure_msg fi ;; *) echo "Usage: ${0} {stop}" exit 1 ;; esac exit 0 # End sendsignals
#!/bin/sh ######################################################################## # Begin reboot # # Description : Reboot Scripts # # Authors : Gerard Beekmans - gerard AT linuxfromscratch D0T org # DJ Lucas - dj AT linuxfromscratch D0T org # Updates : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # : Pierre Labastie - pierre AT linuxfromscratch D0T org # # Version : LFS 7.0 # # Notes : Update March 24th, 2022: change "stop" to "start". # Add the $last facility to Required-start # ######################################################################## ### BEGIN INIT INFO # Provides: reboot # Required-Start: $last # Should-Start: # Required-Stop: # Should-Stop: # Default-Start: 6 # Default-Stop: # Short-Description: Reboots the system. # Description: Reboots the System. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions case "${1}" in start) log_info_msg "Restarting system..." reboot -d -f -i ;; *) echo "Usage: ${0} {start}" exit 1 ;; esac # End reboot
#!/bin/sh ######################################################################## # Begin halt # # Description : Halt Script # # Authors : Gerard Beekmans - gerard AT linuxfromscratch D0T org # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # : Pierre Labastie - pierre AT linuxfromscratch D0T org # # Version : LFS 7.0 # # Notes : Update March 24th, 2022: change "stop" to "start". # Add the $last facility to Required-start # ######################################################################## ### BEGIN INIT INFO # Provides: halt # Required-Start: $last # Should-Start: # Required-Stop: # Should-Stop: # Default-Start: 0 # Default-Stop: # Short-Description: Halts the system. # Description: Halts the System. # X-LFS-Provided-By: LFS ### END INIT INFO case "${1}" in start) halt -d -f -i -p ;; *) echo "Usage: {start}" exit 1 ;; esac # End halt
#!/bin/sh ######################################################################## # Begin scriptname # # Description : # # Authors : # # Version : LFS x.x # # Notes : # ######################################################################## ### BEGIN INIT INFO # Provides: template # Required-Start: # Should-Start: # Required-Stop: # Should-Stop: # Default-Start: # Default-Stop: # Short-Description: # Description: # X-LFS-Provided-By: ### END INIT INFO . /lib/lsb/init-functions case "${1}" in start) log_info_msg "Starting..." # if it is possible to use start_daemon start_daemon fully_qualified_path # if it is not possible to use start_daemon # (command to start the daemon is not simple enough) if ! pidofproc daemon_name_as_reported_by_ps >/dev/null; then command_to_start_the_service fi evaluate_retval ;; stop) log_info_msg "Stopping..." # if it is possible to use killproc killproc fully_qualified_path # if it is not possible to use killproc # (the daemon shouldn't be stopped by killing it) if pidofproc daemon_name_as_reported_by_ps >/dev/null; then command_to_stop_the_service fi evaluate_retval ;; restart) ${0} stop sleep 1 ${0} start ;; *) echo "Usage: ${0} {start|stop|restart}" exit 1 ;; esac exit 0 # End scriptname
######################################################################## # Begin /etc/sysconfig/modules # # Description : Module auto-loading configuration # # Authors : # # Version : 00.00 # # Notes : The syntax of this file is as follows: # <module> [<arg1> <arg2> ...] # # Each module should be on its own line, and any options that you want # passed to the module should follow it. The line deliminator is either # a space or a tab. ######################################################################## # End /etc/sysconfig/modules
######################################################################## # Begin /etc/sysconfig/createfiles # # Description : Createfiles script config file # # Authors : # # Version : 00.00 # # Notes : The syntax of this file is as follows: # if type is equal to "file" or "dir" # <filename> <type> <permissions> <user> <group> # if type is equal to "dev" # <filename> <type> <permissions> <user> <group> <devtype> # <major> <minor> # # <filename> is the name of the file which is to be created # <type> is either file, dir, or dev. # file creates a new file # dir creates a new directory # dev creates a new device # <devtype> is either block, char or pipe # block creates a block device # char creates a character device # pipe creates a pipe, this will ignore the <major> and # <minor> fields # <major> and <minor> are the major and minor numbers used for # the device. ######################################################################## # End /etc/sysconfig/createfiles
######################################################################## # Begin /etc/sysconfig/udev_retry # # Description : udev_retry script configuration # # Authors : # # Version : 00.00 # # Notes : Each subsystem that may need to be re-triggered after mountfs # runs should be listed in this file. Probable subsystems to be # listed here are rtc (due to /var/lib/hwclock/adjtime) and sound # (due to both /var/lib/alsa/asound.state and /usr/sbin/alsactl). # Entries are whitespace-separated. ######################################################################## rtc # End /etc/sysconfig/udev_retry
#!/bin/sh ######################################################################## # Begin /sbin/ifup # # Description : Interface Up # # Authors : Nathan Coulson - nathan AT linuxfromscratch D0T org # Kevin P. Fleming - kpfleming@linuxfromscratch.org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # DJ Lucas - dj AT linuxfromscratch D0T org # # Version : LFS 7.7 # # Notes : The IFCONFIG variable is passed to the SERVICE script # in the /lib/services directory, to indicate what file the # service should source to get interface specifications. # ######################################################################## up() { log_info_msg "Bringing up the ${1} interface..." if ip link show $1 > /dev/null 2>&1; then link_status=`ip link show $1` if [ -n "${link_status}" ]; then if ! echo "${link_status}" | grep -q UP; then ip link set $1 up fi fi else log_failure_msg "Interface ${IFACE} doesn't exist." exit 1 fi evaluate_retval } RELEASE="7.7" USAGE="Usage: $0 [ -hV ] [--help] [--version] interface" VERSTR="LFS ifup, version ${RELEASE}" while [ $# -gt 0 ]; do case "$1" in --help | -h) help="y"; break ;; --version | -V) echo "${VERSTR}"; exit 0 ;; -*) echo "ifup: ${1}: invalid option" >&2 echo "${USAGE}" >& 2 exit 2 ;; *) break ;; esac done if [ -n "$help" ]; then echo "${VERSTR}" echo "${USAGE}" echo cat << HERE_EOF ifup is used to bring up a network interface. The interface parameter, e.g. eth0 or eth0:2, must match the trailing part of the interface specifications file, e.g. /etc/sysconfig/ifconfig.eth0:2. HERE_EOF exit 0 fi file=/etc/sysconfig/ifconfig.${1} # Skip backup files [ "${file}" = "${file%""~""}" ] || exit 0 . /lib/lsb/init-functions if [ ! -r "${file}" ]; then log_failure_msg "Unable to bring up ${1} interface! ${file} is missing or cannot be accessed." exit 1 fi . $file if [ "$IFACE" = "" ]; then log_failure_msg "Unable to bring up ${1} interface! ${file} does not define an interface [IFACE]." exit 1 fi # Do not process this service if started by boot, and ONBOOT # is not set to yes if [ "${IN_BOOT}" = "1" -a "${ONBOOT}" != "yes" ]; then exit 0 fi # Bring up the interface if [ "$VIRTINT" != "yes" ]; then up ${IFACE} fi for S in ${SERVICE}; do if [ ! -x "/lib/services/${S}" ]; then MSG="\nUnable to process ${file}. Either " MSG="${MSG}the SERVICE '${S} was not present " MSG="${MSG}or cannot be executed." log_failure_msg "$MSG" exit 1 fi done if [ "${SERVICE}" = "wpa" ]; then log_success_msg; fi # Create/configure the interface for S in ${SERVICE}; do IFCONFIG=${file} /lib/services/${S} ${IFACE} up done # Set link up virtual interfaces if [ "${VIRTINT}" == "yes" ]; then up ${IFACE} fi # Bring up any additional interface components for I in $INTERFACE_COMPONENTS; do up $I; done # Set MTU if requested. Check if MTU has a "good" value. if test -n "${MTU}"; then if [[ ${MTU} =~ ^[0-9]+$ ]] && [[ $MTU -ge 68 ]] ; then for I in $IFACE $INTERFACE_COMPONENTS; do ip link set dev $I mtu $MTU; done else log_info_msg2 "Invalid MTU $MTU" fi fi # Set the route default gateway if requested if [ -n "${GATEWAY}" ]; then if ip route | grep -q default; then log_warning_msg "Gateway already setup; skipping." else log_info_msg "Adding default gateway ${GATEWAY} to the ${IFACE} interface..." ip route add default via ${GATEWAY} dev ${IFACE} evaluate_retval fi fi # End /sbin/ifup
#!/bin/bash ######################################################################## # Begin /sbin/ifdown # # Description : Interface Down # # Authors : Nathan Coulson - nathan AT linuxfromscratch D0T org # Kevin P. Fleming - kpfleming@linuxfromscratch.org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # # Notes : the IFCONFIG variable is passed to the scripts found # in the /lib/services directory, to indicate what file the # service should source to get interface specifications. # ######################################################################## RELEASE="7.0" USAGE="Usage: $0 [ -hV ] [--help] [--version] interface" VERSTR="LFS ifdown, version ${RELEASE}" while [ $# -gt 0 ]; do case "$1" in --help | -h) help="y"; break ;; --version | -V) echo "${VERSTR}"; exit 0 ;; -*) echo "ifup: ${1}: invalid option" >&2 echo "${USAGE}" >& 2 exit 2 ;; *) break ;; esac done if [ -n "$help" ]; then echo "${VERSTR}" echo "${USAGE}" echo cat << HERE_EOF ifdown is used to bring down a network interface. The interface parameter, e.g. eth0 or eth0:2, must match the trailing part of the interface specifications file, e.g. /etc/sysconfig/ifconfig.eth0:2. HERE_EOF exit 0 fi file=/etc/sysconfig/ifconfig.${1} # Skip backup files [ "${file}" = "${file%""~""}" ] || exit 0 . /lib/lsb/init-functions if [ ! -r "${file}" ]; then log_warning_msg "${file} is missing or cannot be accessed." exit 1 fi . ${file} if [ "$IFACE" = "" ]; then log_failure_msg "${file} does not define an interface [IFACE]." exit 1 fi # We only need to first service to bring down the interface S=`echo ${SERVICE} | cut -f1 -d" "` if ip link show ${IFACE} > /dev/null 2>&1; then if [ -n "${S}" -a -x "/lib/services/${S}" ]; then IFCONFIG=${file} /lib/services/${S} ${IFACE} down else MSG="Unable to process ${file}. Either " MSG="${MSG}the SERVICE variable was not set " MSG="${MSG}or the specified service cannot be executed." log_failure_msg "$MSG" exit 1 fi else log_warning_msg "Interface ${1} doesn't exist." fi # Leave the interface up if there are additional interfaces in the device link_status=`ip link show ${IFACE} 2>/dev/null` if [ -n "${link_status}" ]; then if [ "$(echo "${link_status}" | grep UP)" != "" ]; then if [ "$(ip addr show ${IFACE} | grep 'inet ')" == "" ]; then log_info_msg "Bringing down the ${IFACE} interface..." ip link set ${IFACE} down evaluate_retval fi fi fi # End /sbin/ifdown
#!/bin/sh ######################################################################## # Begin /lib/services/ipv4-static # # Description : IPV4 Static Boot Script # # Authors : Nathan Coulson - nathan AT linuxfromscratch D0T org # Kevin P. Fleming - kpfleming@linuxfromscratch.org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # ######################################################################## . /lib/lsb/init-functions . ${IFCONFIG} if [ -z "${IP}" ]; then log_failure_msg "\nIP variable missing from ${IFCONFIG}, cannot continue." exit 1 fi if [ -z "${PREFIX}" -a -z "${PEER}" ]; then log_warning_msg "\nPREFIX variable missing from ${IFCONFIG}, assuming 24." PREFIX=24 args="${args} ${IP}/${PREFIX}" elif [ -n "${PREFIX}" -a -n "${PEER}" ]; then log_failure_msg "\nPREFIX and PEER both specified in ${IFCONFIG}, cannot continue." exit 1 elif [ -n "${PREFIX}" ]; then args="${args} ${IP}/${PREFIX}" elif [ -n "${PEER}" ]; then args="${args} ${IP} peer ${PEER}" fi if [ -n "${LABEL}" ]; then args="${args} label ${LABEL}" fi if [ -n "${BROADCAST}" ]; then args="${args} broadcast ${BROADCAST}" fi case "${2}" in up) if [ "$(ip addr show ${1} 2>/dev/null | grep ${IP}/)" = "" ]; then log_info_msg "Adding IPv4 address ${IP} to the ${1} interface..." ip addr add ${args} dev ${1} evaluate_retval else log_warning_msg "Cannot add IPv4 address ${IP} to ${1}. Already present." fi ;; down) if [ "$(ip addr show ${1} 2>/dev/null | grep ${IP}/)" != "" ]; then log_info_msg "Removing IPv4 address ${IP} from the ${1} interface..." ip addr del ${args} dev ${1} evaluate_retval fi if [ -n "${GATEWAY}" ]; then # Only remove the gateway if there are no remaining ipv4 addresses if [ "$(ip addr show ${1} 2>/dev/null | grep 'inet ')" != "" ]; then log_info_msg "Removing default gateway..." ip route del default evaluate_retval fi fi ;; *) echo "Usage: ${0} [interface] {up|down}" exit 1 ;; esac # End /lib/services/ipv4-static
#!/bin/sh ######################################################################## # Begin /lib/services/ipv4-static-route # # Description : IPV4 Static Route Script # # Authors : Kevin P. Fleming - kpfleming@linuxfromscratch.org # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # ######################################################################## . /lib/lsb/init-functions . ${IFCONFIG} case "${TYPE}" in ("" | "network") need_ip=1 need_gateway=1 ;; ("default") need_gateway=1 args="${args} default" desc="default" ;; ("host") need_ip=1 ;; ("unreachable") need_ip=1 args="${args} unreachable" desc="unreachable " ;; (*) log_failure_msg "Unknown route type (${TYPE}) in ${IFCONFIG}, cannot continue." exit 1 ;; esac if [ -n "${GATEWAY}" ]; then MSG="The GATEWAY variable cannot be set in ${IFCONFIG} for static routes.\n" log_failure_msg "$MSG Use STATIC_GATEWAY only, cannot continue" exit 1 fi if [ -n "${need_ip}" ]; then if [ -z "${IP}" ]; then log_failure_msg "IP variable missing from ${IFCONFIG}, cannot continue." exit 1 fi if [ -z "${PREFIX}" ]; then log_failure_msg "PREFIX variable missing from ${IFCONFIG}, cannot continue." exit 1 fi args="${args} ${IP}/${PREFIX}" desc="${desc}${IP}/${PREFIX}" fi if [ -n "${need_gateway}" ]; then if [ -z "${STATIC_GATEWAY}" ]; then log_failure_msg "STATIC_GATEWAY variable missing from ${IFCONFIG}, cannot continue." exit 1 fi args="${args} via ${STATIC_GATEWAY}" fi if [ -n "${SOURCE}" ]; then args="${args} src ${SOURCE}" fi case "${2}" in up) log_info_msg "Adding '${desc}' route to the ${1} interface..." ip route add ${args} dev ${1} evaluate_retval ;; down) log_info_msg "Removing '${desc}' route from the ${1} interface..." ip route del ${args} dev ${1} evaluate_retval ;; *) echo "Usage: ${0} [interface] {up|down}" exit 1 ;; esac # End /lib/services/ipv4-static-route
Правила в этом приложении перечислены для удобства. Установка обычно выполняются с помощью инструкций приведенных в Раздел 8.75, «Udev из Systemd-255».
# /etc/udev/rules.d/55-lfs.rules: Rule definitions for LFS. # Core kernel devices # This causes the system clock to be set as soon as /dev/rtc becomes available. SUBSYSTEM=="rtc", ACTION=="add", MODE="0644", RUN+="/etc/rc.d/init.d/setclock start" KERNEL=="rtc", ACTION=="add", MODE="0644", RUN+="/etc/rc.d/init.d/setclock start"
Настоящая книга распространяется на условиях лицензии Creative Commons Attribution-NonCommercial-ShareAlike 2.0 License.
Инструкции, предназначенные для использования на компьютере, могут использоваться отдельно от книги на условиях лицензии MIT.
Creative Commons Legal Code
Attribution-NonCommercial-ShareAlike 2.0
CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE.
License
THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.
Definitions
"Collective Work" means a work, such as a periodical issue, anthology or encyclopedia, in which the Work in its entirety in unmodified form, along with a number of other contributions, constituting separate and independent works in themselves, are assembled into a collective whole. A work that constitutes a Collective Work will not be considered a Derivative Work (as defined below) for the purposes of this License.
"Derivative Work" means a work based upon the Work or upon the Work and other pre-existing works, such as a translation, musical arrangement, dramatization, fictionalization, motion picture version, sound recording, art reproduction, abridgment, condensation, or any other form in which the Work may be recast, transformed, or adapted, except that a work that constitutes a Collective Work will not be considered a Derivative Work for the purpose of this License. For the avoidance of doubt, where the Work is a musical composition or sound recording, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered a Derivative Work for the purpose of this License.
"Licensor" means the individual or entity that offers the Work under the terms of this License.
"Original Author" means the individual or entity who created the Work.
"Work" means the copyrightable work of authorship offered under the terms of this License.
"You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation.
"License Elements" means the following high-level license attributes as selected by Licensor and indicated in the title of this License: Attribution, Noncommercial, ShareAlike.
Fair Use Rights. Nothing in this license is intended to reduce, limit, or restrict any rights arising from fair use, first sale or other limitations on the exclusive rights of the copyright owner under copyright law or other applicable laws.
License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below:
to reproduce the Work, to incorporate the Work into one or more Collective Works, and to reproduce the Work as incorporated in the Collective Works;
to create and reproduce Derivative Works;
to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission the Work including as incorporated in Collective Works;
to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission Derivative Works;
The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. All rights not expressly granted by Licensor are hereby reserved, including but not limited to the rights set forth in Sections 4(e) and 4(f).
Restrictions.The license granted in Section 3 above is expressly made subject to and limited by the following restrictions:
You may distribute, publicly display, publicly perform, or publicly digitally perform the Work only under the terms of this License, and You must include a copy of, or the Uniform Resource Identifier for, this License with every copy or phonorecord of the Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Work that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Work itself to be made subject to the terms of this License. If You create a Collective Work, upon notice from any Licensor You must, to the extent practicable, remove from the Collective Work any reference to such Licensor or the Original Author, as requested. If You create a Derivative Work, upon notice from any Licensor You must, to the extent practicable, remove from the Derivative Work any reference to such Licensor or the Original Author, as requested.
You may distribute, publicly display, publicly perform, or publicly digitally perform a Derivative Work only under the terms of this License, a later version of this License with the same License Elements as this License, or a Creative Commons iCommons license that contains the same License Elements as this License (e.g. Attribution-NonCommercial-ShareAlike 2.0 Japan). You must include a copy of, or the Uniform Resource Identifier for, this License or other license specified in the previous sentence with every copy or phonorecord of each Derivative Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Derivative Works that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder, and You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Derivative Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Derivative Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Derivative Work itself to be made subject to the terms of this License.
You may not exercise any of the rights granted to You in Section 3 above in any manner that is primarily intended for or directed toward commercial advantage or private monetary compensation. The exchange of the Work for other copyrighted works by means of digital file-sharing or otherwise shall not be considered to be intended for or directed toward commercial advantage or private monetary compensation, provided there is no payment of any monetary compensation in connection with the exchange of copyrighted works.
If you distribute, publicly display, publicly perform, or publicly digitally perform the Work or any Derivative Works or Collective Works, You must keep intact all copyright notices for the Work and give the Original Author credit reasonable to the medium or means You are utilizing by conveying the name (or pseudonym if applicable) of the Original Author if supplied; the title of the Work if supplied; to the extent reasonably practicable, the Uniform Resource Identifier, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and in the case of a Derivative Work, a credit identifying the use of the Work in the Derivative Work (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). Such credit may be implemented in any reasonable manner; provided, however, that in the case of a Derivative Work or Collective Work, at a minimum such credit will appear where any other comparable authorship credit appears and in a manner at least as prominent as such other comparable authorship credit.
For the avoidance of doubt, where the Work is a musical composition:
Performance Royalties Under Blanket Licenses. Licensor reserves the exclusive right to collect, whether individually or via a performance rights society (e.g. ASCAP, BMI, SESAC), royalties for the public performance or public digital performance (e.g. webcast) of the Work if that performance is primarily intended for or directed toward commercial advantage or private monetary compensation.
Mechanical Rights and Statutory Royalties. Licensor reserves the exclusive right to collect, whether individually or via a music rights agency or designated agent (e.g. Harry Fox Agency), royalties for any phonorecord You create from the Work ("cover version") and distribute, subject to the compulsory license created by 17 USC Section 115 of the US Copyright Act (or the equivalent in other jurisdictions), if Your distribution of such cover version is primarily intended for or directed toward commercial advantage or private monetary compensation. 6. Webcasting Rights and Statutory Royalties. For the avoidance of doubt, where the Work is a sound recording, Licensor reserves the exclusive right to collect, whether individually or via a performance-rights society (e.g. SoundExchange), royalties for the public digital performance (e.g. webcast) of the Work, subject to the compulsory license created by 17 USC Section 114 of the US Copyright Act (or the equivalent in other jurisdictions), if Your public digital performance is primarily intended for or directed toward commercial advantage or private monetary compensation.
Webcasting Rights and Statutory Royalties. For the avoidance of doubt, where the Work is a sound recording, Licensor reserves the exclusive right to collect, whether individually or via a performance-rights society (e.g. SoundExchange), royalties for the public digital performance (e.g. webcast) of the Work, subject to the compulsory license created by 17 USC Section 114 of the US Copyright Act (or the equivalent in other jurisdictions), if Your public digital performance is primarily intended for or directed toward commercial advantage or private monetary compensation.
Representations, Warranties and Disclaimer
UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
Termination
This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Derivative Works or Collective Works from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License.
Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above.
Miscellaneous
Each time You distribute or publicly digitally perform the Work or a Collective Work, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License.
Each time You distribute or publicly digitally perform a Derivative Work, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License.
If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent.
This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You.
Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor.
Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, neither party will use the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time.
Creative Commons may be contacted at http://creativecommons.org/.
Copyright © 1999-2024 Gerard Beekmans
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.