Линукс с нуля. Версия 12.1 [Герард Бикманс] (pdf) читать онлайн

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]

Линукс с нуля
Версия 12.1
Дата публикации 1 марта 2024

Создатель: Gerard Beekmans
Главный редактор: Bruce Dubbs
Автор перевода: Владимир Перцев

Линукс с нуля: Версия 12.1: Дата публикации 1 марта 2024
Создатель: Gerard Beekmans, Главный редактор: Bruce Dubbs, Автор перевода: Владимир Перцев
Авторские права © 1999-2024 Gerard Beekmans
Все права защищены.
Эта книга распространяется на условиях Лицензия Creative Commons.
Инструкции для компьютера могут быть извлечены из книги на условиях Лицензия MIT.
Linux® является зарегистрированным товарным знаком Линуса Торвальдса.

Линукс с нуля - Версия 12.1

Содержание
Предисловие ............................................................................................................................................................ 8
i. Предисловие ................................................................................................................................................... 8
ii. Аудитория, на которую рассчитана эта книга .......................................................................................... 9
iii. Целевые архитектуры LFS ......................................................................................................................... 9
iv. Предпосылки .............................................................................................................................................. 10
v. LFS и стандарты ......................................................................................................................................... 10
vi. Информация о пакетах, используемых в этой книге ............................................................................. 11
vii. Оформление .............................................................................................................................................. 17
viii. Структура ................................................................................................................................................. 19
ix. Ошибки и рекомендации по безопасности ............................................................................................. 19
I. Введение ............................................................................................................................................................. 20
1. Введение ...................................................................................................................................................... 21
1.1. Как собрать систему LFS ................................................................................................................. 21
1.2. Что нового с момента последнего релиза ...................................................................................... 21
1.3. Журнал изменений ............................................................................................................................ 23
1.4. Ресурсы ............................................................................................................................................... 27
1.5. Помощь ............................................................................................................................................... 28
II. Подготовка к сборке ........................................................................................................................................ 31
2. Подготовка хост-системы .......................................................................................................................... 32
2.1. Введение ............................................................................................................................................. 32
2.2. Требования к хост-системе ............................................................................................................... 32
2.3. Этапы сборки системы LFS ............................................................................................................. 35
2.4. Создание нового раздела .................................................................................................................. 35
2.5. Создание файловой системы на разделе ......................................................................................... 38
2.6. Установка переменной $LFS ............................................................................................................ 38
2.7. Монтирование нового раздела ......................................................................................................... 39
3. Пакеты и патчи ........................................................................................................................................... 41
3.1. Введение ............................................................................................................................................. 41
3.2. Все пакеты .......................................................................................................................................... 42
3.3. Необходимые патчи ........................................................................................................................... 50
4. Заключительный этап подготовки ............................................................................................................ 52
4.1. Введение ............................................................................................................................................. 52
4.2. Создание ограниченной иерархии папок в файловой системе LFS ............................................. 52
4.3. Создание пользователя LFS ............................................................................................................. 52
4.4. Настройка окружения ....................................................................................................................... 53
4.5. О SBU (Стандартная единица времени сборки) ............................................................................ 56
4.6. О наборах тестов ............................................................................................................................... 56
III. Сборка кросс-компилятора и набора временных инструментов ............................................................... 58
Важный предварительный материал ............................................................................................................ 59
i. Введение ................................................................................................................................................. 59
ii. Технические примечания по сборочным инструментам .................................................................. 59
iii. Общие инструкции по компиляции .................................................................................................. 64
5. Сборка кросс-тулчейна .............................................................................................................................. 66
5.1. Введение ............................................................................................................................................. 66
5.2. Binutils-2.42 - Проход 1 .................................................................................................................... 67
5.3. GCC-13.2.0 - Проход 1 ...................................................................................................................... 69
5.4. Заголовочные файлы Linux-6.7.4 API ............................................................................................. 72
5.5. Glibc-2.39 ............................................................................................................................................ 73
3

Линукс с нуля - Версия 12.1
5.6. Libstdc++ из GCC-13.2.0 ................................................................................................................... 76
6. Кросс-Компиляция временных инструментов ........................................................................................ 78
6.1. Введение ............................................................................................................................................. 78
6.2. M4-1.4.19 ............................................................................................................................................ 79
6.3. Ncurses-6.4-20230520 ......................................................................................................................... 80
6.4. Bash-5.2.21 .......................................................................................................................................... 82
6.5. Coreutils-9.4 ........................................................................................................................................ 83
6.6. Diffutils-3.10 ....................................................................................................................................... 84
6.7. File-5.45 ............................................................................................................................................... 85
6.8. Findutils-4.9.0 ...................................................................................................................................... 86
6.9. Gawk-5.3.0 .......................................................................................................................................... 87
6.10. Grep-3.11 ........................................................................................................................................... 88
6.11. Gzip-1.13 ........................................................................................................................................... 89
6.12. Make-4.4.1 ......................................................................................................................................... 90
6.13. Patch-2.7.6 ......................................................................................................................................... 91
6.14. Sed-4.9 ............................................................................................................................................... 92
6.15. Tar-1.35 .............................................................................................................................................. 93
6.16. Xz-5.4.6 ............................................................................................................................................. 94
6.17. Binutils-2.42 - Проход 2 .................................................................................................................. 95
6.18. GCC-13.2.0 - Проход 2 .................................................................................................................... 96
7. Вход в окружение Chroot и создание дополнительных временных инструментов .............................. 98
7.1. Введение ............................................................................................................................................. 98
7.2. Смена владельца ................................................................................................................................ 98
7.3. Подготовка виртуальных файловых систем ядра .......................................................................... 98
7.4. Вход в окружение Chroot ............................................................................................................... 100
7.5. Создание каталогов ......................................................................................................................... 100
7.6. Создание основных файлов и символических ссылок ................................................................ 101
7.7. Gettext-0.22.4 .................................................................................................................................... 104
7.8. Bison-3.8.2 ........................................................................................................................................ 105
7.9. Perl-5.38.2 ......................................................................................................................................... 106
7.10. Python-3.12.2 ................................................................................................................................... 107
7.11. Texinfo-7.1 ....................................................................................................................................... 108
7.12. Util-linux-2.39.3 .............................................................................................................................. 109
7.13. Очистка и сохранение временной системы ................................................................................ 111
IV. Сборка системы LFS .................................................................................................................................... 113
8. Установка базового системного программного обеспечения .............................................................. 114
8.1. Введение ........................................................................................................................................... 114
8.2. Управление пакетами ...................................................................................................................... 115
8.3. Man-pages-6.06 ................................................................................................................................. 120
8.4. Iana-Etc-20240125 ............................................................................................................................ 121
8.5. Glibc-2.39 .......................................................................................................................................... 122
8.6. Zlib-1.3.1 ........................................................................................................................................... 130
8.7. Bzip2-1.0.8 ........................................................................................................................................ 131
8.8. Xz-5.4.6 ............................................................................................................................................. 133
8.9. Zstd-1.5.5 ........................................................................................................................................... 135
8.10. File-5.45 ........................................................................................................................................... 136
8.11. Readline-8.2 ..................................................................................................................................... 137
8.12. M4-1.4.19 ........................................................................................................................................ 139
8.13. Bc-6.7.5 ........................................................................................................................................... 140
8.14. Flex-2.6.4 ......................................................................................................................................... 141
4

Линукс с нуля - Версия 12.1
8.15.
8.16.
8.17.
8.18.
8.19.
8.20.
8.21.
8.22.
8.23.
8.24.
8.25.
8.26.
8.27.
8.28.
8.29.
8.30.
8.31.
8.32.
8.33.
8.34.
8.35.
8.36.
8.37.
8.38.
8.39.
8.40.
8.41.
8.42.
8.43.
8.44.
8.45.
8.46.
8.47.
8.48.
8.49.
8.50.
8.51.
8.52.
8.53.
8.54.
8.55.
8.56.
8.57.
8.58.
8.59.
8.60.
8.61.
8.62.
8.63.
8.64.

Tcl-8.6.13 .........................................................................................................................................
Expect-5.45.4 ...................................................................................................................................
DejaGNU-1.6.3 ................................................................................................................................
Pkgconf-2.1.1 ...................................................................................................................................
Binutils-2.42 ....................................................................................................................................
GMP-6.3.0 .......................................................................................................................................
MPFR-4.2.1 .....................................................................................................................................
MPC-1.3.1 .......................................................................................................................................
Attr-2.5.2 .........................................................................................................................................
Acl-2.3.2 ..........................................................................................................................................
Libcap-2.69 ......................................................................................................................................
Libxcrypt-4.4.36 ..............................................................................................................................
Shadow-4.14.5 .................................................................................................................................
GCC-13.2.0 ......................................................................................................................................
Ncurses-6.4-20230520 .....................................................................................................................
Sed-4.9 .............................................................................................................................................
Psmisc-23.6 ......................................................................................................................................
Gettext-0.22.4 ..................................................................................................................................
Bison-3.8.2 ......................................................................................................................................
Grep-3.11 .........................................................................................................................................
Bash-5.2.21 ......................................................................................................................................
Libtool-2.4.7 ....................................................................................................................................
GDBM-1.23 .....................................................................................................................................
Gperf-3.1 .........................................................................................................................................
Expat-2.6.0 .......................................................................................................................................
Inetutils-2.5 ......................................................................................................................................
Less-643 ..........................................................................................................................................
Perl-5.38.2 .......................................................................................................................................
XML::Parser-2.47 ............................................................................................................................
Intltool-0.51.0 ..................................................................................................................................
Autoconf-2.72 ..................................................................................................................................
Automake-1.16.5 .............................................................................................................................
OpenSSL-3.2.1 ................................................................................................................................
Kmod-31 ..........................................................................................................................................
Libelf из Elfutils-0.190 ...................................................................................................................
Libffi-3.4.4 .......................................................................................................................................
Python-3.12.2 ...................................................................................................................................
Flit-Core-3.9.0 .................................................................................................................................
Wheel-0.42.0 ...................................................................................................................................
Setuptools-69.1.0 .............................................................................................................................
Ninja-1.11.1 .....................................................................................................................................
Meson-1.3.2 .....................................................................................................................................
Coreutils-9.4 ....................................................................................................................................
Check-0.15.2 ....................................................................................................................................
Diffutils-3.10 ...................................................................................................................................
Gawk-5.3.0 ......................................................................................................................................
Findutils-4.9.0 ..................................................................................................................................
Groff-1.23.0 .....................................................................................................................................
GRUB-2.12 ......................................................................................................................................
Gzip-1.13 .........................................................................................................................................
5

142
144
146
147
148
151
153
154
155
156
157
158
160
164
170
173
174
175
177
178
179
181
182
183
184
185
187
188
191
192
193
195
196
198
200
201
203
206
207
208
209
210
211
217
218
219
221
222
225
228

Линукс с нуля - Версия 12.1
8.65. IPRoute2-6.7.0 ................................................................................................................................. 229
8.66. Kbd-2.6.4 ......................................................................................................................................... 231
8.67. Libpipeline-1.5.7 ............................................................................................................................. 233
8.68. Make-4.4.1 ....................................................................................................................................... 234
8.69. Patch-2.7.6 ....................................................................................................................................... 235
8.70. Tar-1.35 ............................................................................................................................................ 236
8.71. Texinfo-7.1 ...................................................................................................................................... 237
8.72. Vim-9.1.0041 ................................................................................................................................... 239
8.73. MarkupSafe-2.1.5 ............................................................................................................................ 242
8.74. Jinja2-3.1.3 ...................................................................................................................................... 243
8.75. Udev из Systemd-255 ..................................................................................................................... 244
8.76. Man-DB-2.12.0 ................................................................................................................................ 247
8.77. Procps-ng-4.0.4 ................................................................................................................................ 250
8.78. Util-linux-2.39.3 .............................................................................................................................. 252
8.79. E2fsprogs-1.47.0 .............................................................................................................................. 258
8.80. Sysklogd-1.5.1 ................................................................................................................................. 261
8.81. Sysvinit-3.08 .................................................................................................................................... 262
8.82. Об отладочных символах .............................................................................................................. 263
8.83. Удаление отладочных символов .................................................................................................. 263
8.84. Очистка ........................................................................................................................................... 265
9. Системные настройки .............................................................................................................................. 266
9.1. Введение ........................................................................................................................................... 266
9.2. LFS-Bootscripts-20230728 ............................................................................................................... 267
9.3. Взаимодействие с устройствами и модулями .............................................................................. 269
9.4. Управление устройствами .............................................................................................................. 272
9.5. Настройка сети ................................................................................................................................ 275
9.6. Настройка и использование загрузочных скриптов System V .................................................... 278
9.7. Настройка системной локали ......................................................................................................... 287
9.8. Создание файла /etc/inputrc ............................................................................................................ 289
9.9. Создание файла /etc/shells ............................................................................................................... 290
10. Делаем систему LFS загрузочной ........................................................................................................ 292
10.1. Введение ......................................................................................................................................... 292
10.2. Создание файла /etc/fstab .............................................................................................................. 292
10.3. Linux-6.7.4 ...................................................................................................................................... 294
10.4. Использование GRUB для настройки процесса загрузки ......................................................... 300
11. Заключение .............................................................................................................................................. 303
11.1. Заключение ..................................................................................................................................... 303
11.2. Вступите в ряды пользователей LFS ........................................................................................... 303
11.3. Перезагрузка системы ................................................................................................................... 303
11.4. Дополнительные ресурсы ............................................................................................................. 304
11.5. Начало работы после сборки LFS ............................................................................................... 305
V. Приложения .................................................................................................................................................... 308
A. Сокращения и условные обозначения ................................................................................................... 309
B. Благодарности .......................................................................................................................................... 312
C. Зависимости ............................................................................................................................................. 315
D. Скрипты загрузки и настройки системы-20230728 ............................................................................. 336
D.1. /etc/rc.d/init.d/rc ................................................................................................................................ 336
D.2. /lib/lsb/init-functions ......................................................................................................................... 339
D.3. /etc/rc.d/init.d/mountvirtfs ................................................................................................................. 351
D.4. /etc/rc.d/init.d/modules ...................................................................................................................... 353
6

Линукс с нуля - Версия 12.1
D.5. /etc/rc.d/init.d/udev ........................................................................................................................... 354
D.6. /etc/rc.d/init.d/swap ........................................................................................................................... 355
D.7. /etc/rc.d/init.d/setclock ...................................................................................................................... 356
D.8. /etc/rc.d/init.d/checkfs ....................................................................................................................... 357
D.9. /etc/rc.d/init.d/mountfs ...................................................................................................................... 360
D.10. /etc/rc.d/init.d/udev_retry ................................................................................................................ 361
D.11. /etc/rc.d/init.d/cleanfs ...................................................................................................................... 362
D.12. /etc/rc.d/init.d/console ..................................................................................................................... 364
D.13. /etc/rc.d/init.d/localnet ..................................................................................................................... 366
D.14. /etc/rc.d/init.d/sysctl ........................................................................................................................ 367
D.15. /etc/rc.d/init.d/sysklogd ................................................................................................................... 367
D.16. /etc/rc.d/init.d/network .................................................................................................................... 369
D.17. /etc/rc.d/init.d/sendsignals ............................................................................................................... 370
D.18. /etc/rc.d/init.d/reboot ....................................................................................................................... 371
D.19. /etc/rc.d/init.d/halt ........................................................................................................................... 372
D.20. /etc/rc.d/init.d/template ................................................................................................................... 373
D.21. /etc/sysconfig/modules .................................................................................................................... 374
D.22. /etc/sysconfig/createfiles ................................................................................................................. 374
D.23. /etc/sysconfig/udev-retry ................................................................................................................. 375
D.24. /sbin/ifup ......................................................................................................................................... 375
D.25. /sbin/ifdown .................................................................................................................................... 377
D.26. /lib/services/ipv4-static ................................................................................................................... 379
D.27. /lib/services/ipv4-static-route .......................................................................................................... 380
E. Правила настройки Udev ........................................................................................................................ 382
E.1. 55-lfs.rules ......................................................................................................................................... 382
F. Лицензии LFS ........................................................................................................................................... 383
F.1. Лицензия Creative Commons .......................................................................................................... 383
F.2. Лицензия MIT .................................................................................................................................. 387
Предметный указатель ....................................................................................................................................... 388

7

Линукс с нуля - Версия 12.1

Предисловие
Предисловие
Мой путь к изучению и лучшему пониманию 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@linuxfromscratch.org

8

Линукс с нуля - Версия 12.1

Аудитория, на которую рассчитана эта книга
Есть много причин, по которым вы хотели бы прочитать эту книгу. Один из вопросов, который задают
многие люди, звучит так: «Зачем тратить время на сборку Linux-системы вручную с нуля, если можно просто
загрузить и установить существующую?»
Одной из важных целей существования этого проекта является помощь в изучении того, как работает
система Linux изнутри. Создание системы LFS помогает продемонстрировать, что заставляет работать
Linux, как все работает вместе и зависит друг от друга. Одна из лучших вещей, которую может дать
этот учебный опыт, — это возможность настроить систему Linux в соответствии с вашими уникальными
потребностями.
Другое ключевое преимущество - LFS предоставляет более глубокий контроль, не полагаясь на чью-либо
реализацию Linux. С LFS вы находитесь в кресле водителя, и Вы управляете каждым аспектом системы.
LFS позволяет создавать очень компактные системы Linux. При установке обычных дистрибутивов вам
часто приходится устанавливать очень много программ, которые, вероятно, никогда не используются.
Эти программы тратят ресурсы впустую. Вы можете возразить, что с сегодняшними жесткими дисками
и процессорами такие ресурсы не имеют значения. Иногда, однако, вы все еще ограничены размером.
Подумайте о загрузочных компакт-дисках, USB-накопителях и встраиваемых системах. Это области, в
которых LFS может быть полезным.
Ещё одним преимуществом собственной сборки Linux является безопасность. При компиляции каждого
компонента системы из исходных кодов вы можете всё проверить и применить необходимые патчи. Больше
не нужно ждать, когда кто-то другой скомпилирует пакет с требуемыми исправлениями. Если вы не изучите
патч и не примените его самостоятельно, нет гарантий, что новый пакет будет собран корректно и устранит
проблему.
Цель Linux From Scratch — создать законченную и пригодную для использования систему базового уровня.
Если вы не хотите создавать свою собственную систему Linux с нуля, вы, тем не менее, можете извлечь
пользу из информации, содержащейся в этой книге.
Есть много других веских причин для создания собственной системы LFS. В конце концов, образование,
безусловно, является самой важной из них. Продолжая работать с LFS, вы откроете для себя силу, которую
действительно приносят информация и знания.

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

Время сборки
239.9 минут
233.2 минут

Размер сборки
3.6 ГБ
4.4 ГБ

9

Линукс с нуля - Версия 12.1
Как видите, на том же оборудовании 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-installingfrom-source/
В этом руководстве содержится хороший обзор основных навыков и методов, необходимых для сборки
программ из исходного кода

LFS и стандарты
Структура LFS максимально соответствует стандартам Linux. Первичными стандартами являются:
• POSIX.1-2008.
• Filesystem Hierarchy Standard (FHS) Version 3.0
• Linux Standard Base (LSB) Version 5.0 (2015)
LSB имеет четыре отдельных стандарта: Core, Desktop, Runtime Languages и Imaging. Некоторые
части спецификаций Core и Desktop зависят от архитектуры. Есть также две области не являющиеся
обязательными: Gtk3 и Graphics. LFS старается соответствовать стандартам LSB, для архитектур IA32
(32-bit x86) или AMD64 (x86_64), рассмотренных в предыдущем разделе.
10

Линукс с нуля - Версия 12.1

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

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

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

LSB Desktop:

Нет

LSB Runtime Languages:

Perl, Python

LSB Imaging:

Нет

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

Нет

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

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

LSB Desktop:

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

LSB Runtime Languages:

Libxml2, Libxslt

LSB Imaging:

CUPS, Cups-filters, Ghostscript, SANE

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

GTK3+

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

Нет

LSB Desktop:

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

LSB Runtime Languages:

Нет

LSB Imaging:

Нет

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

Нет

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

Линукс с нуля - Версия 12.1
пользователя. Это не означает, что 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
12

Линукс с нуля - Версия 12.1
Этот пакет предоставляет фреймворк для тестирования других программ.
• Diffutils
Этот пакет содержит программы, которые показывают различия между файлами или каталогами. Их
можно использовать для создания патчей, а также они применяются во многих процедурах сборки
• E2fsprogs
Этот пакет содержит утилиты для работы с файловыми системами ext2, ext3 и ext4. Это наиболее
распространенные и тщательно протестированные файловые системы, поддерживаемые Linux
• Expat
Этот пакет содержит небольшую библиотеку разбора XML.Она необходима для модуля Perl
XML::Parser.
• Expect
Этот пакет содержит инструменты для автоматизации и тестирования, и является расширением
к скриптовому языку Tcl, для многих интерактивных приложений. Он обычно используется для
тестирования других пакетов.
• File
Этот пакет содержит утилиту для определения типа файла или файлов. Некоторым пакетам она нужна в
сценариях сборки.
• Findutils
Этот пакет предоставляет программы для поиска файлов. Он используется во многих сценариях сборки
пакетов.
• Flex
Этот пакет содержит утилиту для генерации программ, распознающих шаблоны в тексте. Это версия
GNU программы lex (лексический анализатор). Пакет необходим для сборки некоторых пакетов LFS.
• Gawk
Этот пакет содержит программы для работы с текстовыми файлами. Это GNU версия awk (AhoWeinberg-Kernighan). Он используется во многих сценариях сборки пакетов.
• GCC
Это коллекция компиляторов Gnu. Он содержит компиляторы C и C++, а также несколько других
компиляторов, поддержка которых не предусмотрена в LFS.
• GDBM
Этот пакет содержит библиотеку GNU Database Manager. Он используется пакетом Man-DB
• Gettext
Этот пакет содержит утилиты и библиотеки для интернационализации и локализации многочисленных
пакетов.
• Glibc
Этот пакет содержит основную библиотеку C. Программы Linux не будут работать без неё.
• GMP
Этот пакет содержит математические библиотеки, предоставляющие полезные функции для вычислений
с плавающей точкой. Требуется для сборки GCC.
• Gperf

13

Линукс с нуля - Версия 12.1
Этот пакет содержит программу, которая генерирует идеальную хеш-функцию из набора ключей.
Необходим для пакета 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

14

Линукс с нуля - Версия 12.1
Этот пакет реализует переносимый программный интерфейс высокого уровня для различных
соглашений о вызовах. Некоторые программы могут не знать во время компиляции, какие аргументы
должны быть переданы в функцию. Например, интерпретатору во время выполнения может быть
сообщено о количестве и типах аргументов, используемых для вызова данной функции. 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.
15

Линукс с нуля - Версия 12.1
• 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.
16

Линукс с нуля - Версия 12.1
• 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

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

Линукс с нуля - Версия 12.1
В некоторых случаях логическая строка расширяется до двух или более физических строк с обратной косой
чертой в конце строки.
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 version-check.sh /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

33

Линукс с нуля - Версия 12.1

}

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

34

Линукс с нуля - Версия 12.1

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

2.3.1. Главы 1–4
Эти главы выполняются на хост-системе. После перезагрузки обратите внимание на следующее:
• При выполнении операций, от имени пользователя root после Раздела 2.4, ДЛЯ ПОЛЬЗОВАТЕЛЯ root
должна быть установлена переменная окружения LFS.

2.3.2. Главы 5–6
• Раздел /mnt/lfs должен быть смонтирован.
• Эти две главы должны быть выполнены из-под пользователя lfs. Перед выполнением любой задачи в
этих главах необходимо выполнить команду su - lfs. В противном случае вы рискуете установить пакеты
на хост и сделать его непригодным для использования.
• Выполнение процедур из Общие инструкции по компиляции имеет решающее значение. Если есть
какие-либо сомнения по поводу установки пакета, убедитесь, что все ранее распакованные tar-архивы
удалены, затем повторно извлеките файлы и выполните все инструкции, приведенные в этом разделе.

2.3.3. Главы 7–10
• Раздел /mnt/lfs должен быть смонтирован.
• Некоторые операции, такие как «Смена владельца» или «Вход в среду Chroot», должны быть выполнены
от имени пользователя root с переменной окружения $LFS, установленной для пользователя root.
• При входе в chroot переменная среды LFS должна быть установлена для пользователя root. Переменная
LFS не используется после входа в среду chroot.
• Виртуальные файловые системы должны быть смонтированы. Это можно сделать до или после входа
в chroot, переключившись на виртуальный терминал хоста и от имени пользователя root выполнив
команды, описанные в Раздел 7.3.1, «Монтирование и заполнение /dev» и Раздел 7.3.2, «Монтирование
виртуальных файловых систем ядра».

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

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

Примечание
Для опытных пользователей возможны и другие схемы разбиения. Система LFS может
располагаться на программном RAID-массиве или логическом томе LVM. Однако для некоторых
опций требуется initramfs, что является сложной темой. Эти методы разбиения не рекомендуются
начинающим пользователям LFS.
Запомните обозначение созданного раздела (например, sda5). В этой книге он будет называться разделом
LFS. Также запомните обозначение раздела подкачки. Эти имена понадобятся позже для файла /etc/fstab .

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

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

2.4.1.2. Раздел подкачки
Большинство дистрибутивов автоматически создают раздел подкачки. Обычно рекомендуемый размер
раздела подкачки примерно в два раза превышает объем физической памяти, однако это требуется
редко. Если дисковое пространство ограничено, установите размер раздела подкачки в два гигабайта и
контролируйте его объемом.
Если вы хотите использовать режим гибернации (suspend-to-disk) Linux, которая записывает содержимое
ОЗУ в раздел подкачки перед выключением машины. Установите размер раздела подкачки не меньше объема
установленной оперативной памяти.
Использование файла подкачки - это не очень хорошо. Для механических жестких дисков вы можете
определить, что система использует раздел подкачки, просто слыша активность диска и наблюдая, как
система реагирует на команды. Для SSD-накопителя вы не сможете услышать, что используется раздел
подкачки, но сможете оценить, сколько места на разделе подкачки занято, используя команды top или
free. По возможности следует избегать использования SSD-накопителя для раздела подкачки. Первой
реакцией на активность раздела подкачки должна быть проверка на необоснованное применение какойлибо команды, например, попытка редактирования пятигигабайтного файла. Если использование раздела
подкачки становится обычным явлением, лучшее решение — приобретение большего объема оперативной
памяти для вашей системы.
36

Линукс с нуля - Версия 12.1

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

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

2.4.1.4. Разделы, используемые для удобства
Есть несколько других разделов, которые не являются обязательными, но их следует учитывать при
разработке схемы диска. Следующий список не является исчерпывающим, а представлен в качестве
справочного руководства.
• /boot – Настоятельно рекомендуется. Используйте этот раздел для хранения ядер и другой загрузочной
информации. Чтобы свести к минимуму возможные проблемы с загрузкой дисков большого размера,
сделайте этот раздел первым физическим разделом на первом диске. Размер раздела в 200 мегабайт
вполне достаточен.
• /boot/efi – Системный раздел EFI, используемый для загрузки системы с помощью UEFI. Подробнее
читайте на странице BLFS.
• /home – Настоятельно рекомендуется. Предоставьте общий доступ к своему домашнему каталогу и
пользовательским настройкам нескольким дистрибутивам или сборкам LFS. Размер, как правило,
довольно большой и зависит от доступного места на диске.
• /usr – в LFS, /bin , /lib , и /sbin являются символическими ссылками на их аналоги в /usr . Таким
образом /usr содержит все двоичные файлы, необходимые для работы системы. Для LFS отдельный
раздел /usr не требуется. Если он вам необходим, вы должны сделать раздел достаточно большим,
чтобы поместить туда все программы и библиотеки в системе. В этой конфигурации, корневой раздел
может быть очень маленьким (возможно, всего один гигабайт), поэтому он подходит для тонкого
клиента или бездисковой рабочей станции (где /usr монтируется с удаленного сервера). Однако
вы должны знать, что для загрузки системы с отдельного раздела /usr потребуется initramfs (не
включенный в LFS).
• /opt – Этот каталог наиболее полезен для BLFS, в него можно установить некоторые большие пакеты,
такие как KDE или Texlive, без использования иерархии /usr. Для /opt достаточно размера от 5 до 10
гигабайт.
• /tmp – Отдельный раздел /tmp используется редко, он полезен при настройке тонкого клиента. Обычно,
его размер не должен превышать пару гигабайт. Если у вас достаточно оперативной памяти, вы можете
смонтировать /tmp как tmpfs, чтобы ускорить доступ к временным файлам.
• /usr/src – Этот раздел очень удобен для хранения исходников BLFS и совместного использования их в
сборках LFS. Его также можно использовать в качестве места для сборки пакетов BLFS. Размера в 30-50
гигабайт вполне достаточно.
Любой отдельный раздел, который вы хотите автоматически монтировать при загрузке, должен быть указан
в файле /etc/fstab . Подробности о том, как указать разделы, будут обсуждаться в Раздел 10.2, «Создание
файла /etc/fstab».
37

Линукс с нуля - Версия 12.1

2.5. Создание файловой системы на разделе
Раздел - это всего лишь диапазон секторов на диске, указанный в таблице разделов. Прежде чем
операционная система сможет использовать раздел для хранения каких-либо файлов, он должен быть
отформатирован, чтобы содержать файловую систему, обычно состоящую из метки, блоков каталогов,
блоков данных и схемы индексации для поиска конкретного файла по запросу. Файловая система
также помогает операционной системе отслеживать свободное пространство на разделе, резервировать
необходимые секторы при создании нового файла или расширении существующего и повторно использует
свободные сегменты данных, полученные в результате удаления файлов. Она также может обеспечивать
поддержку избыточности данных и восстановления после ошибок.
LFS может использовать любую файловую систему, распознаваемую ядром Linux, но наиболее
распространенными типами являются ext3 и ext4. Выбор правильной файловой системы может быть
сложным; это зависит от характеристик файлов и размера раздела. Например:
ext2
подходит для небольших разделов, которые редко обновляются, например /boot.
ext3
это обновленная файловая система ext2, которая включает в себя журнал, помогающий восстановить
состояние раздела в случае некорректного завершения работы. Обычно используется в качестве
файловой системы общего назначения.
ext4
является последней версией файловых систем семейства ext. Она предоставляет несколько новых
возможностей, включая временные метки с точностью до наносекунды, создание и использование
очень больших файлов (16 ТБ) и повышение скорости работы.
Другие файловые системы, включая FAT32, NTFS, ReiserFS, JFS и XFS, полезны для конкретных задач.
Более подробную информацию об этих файловых системах и многих других можно найти по адресу https://
en.wikipedia.org/wiki/Comparison_of_file_systems.
LFS предполагает, что корневая файловая система (/) имеет тип ext4. Чтобы создать файловую систему ext4
на разделе LFS, выполните следующую команду:
mkfs -v -t ext4 /dev/

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

Замените именем раздела

подкачки.

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

38

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

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

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

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

2.7. Монтирование нового раздела
Теперь, когда файловая система создана, раздел должен быть смонтирован, чтобы хост-система могла
получить доступ к нему. В книге предполагается, что файловая система монтируется в каталог, указанный
в переменной LFS, описанной в предыдущем разделе.
Строго говоря, нельзя «смонтировать раздел». Монтируется файловая система на этом разделе. Но так как
один раздел не может содержать несколько файловых систем, люди часто говорят о разделе и связанной с
ним файловой системе так, как если бы они были одним и тем же.
Создайте точку монтирования и смонтируйте файловую систему LFS с помощью этих команд:
mkdir -pv $LFS
mount -v -t ext4 /dev/ $LFS

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

-pv $LFS
-v -t ext4 /dev/ $LFS
-v $LFS/home
-v -t ext4 /dev/ $LFS/home

Замените и соответствующими именами разделов.
39

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

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

/mnt/lfs ext4

defaults

1

1

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

подкачки,

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

/sbin/swapon -v /dev/

Замените именем раздела

подкачки.

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

40

Линукс с нуля - Версия 12.1

Глава 3. Пакеты и патчи
3.1. Введение
Эта глава содержит список пакетов, которые необходимо загрузить для сборки базовой системы Linux.
Перечисленные версии программного обеспечения, соответствуют версиям, которые, проверены и работают,
книга основана на их использовании. Мы настоятельно рекомендуем не использовать другие версии пакетов,
потому что команды сборки для одной версии могут не работать с другой, если только другая версия не
указана в сообщениях об ошибках LFS или рекомендациях по безопасности. В новейших версиях пакетов
также могут быть проблемы, требующие обходных путей. Эти обходные пути будут стабилизированы в
разрабатываемой версии книги.
Для некоторых пакетов архив релиза и архив снимка репозитория (Git или SVN) для этого выпуска могут
быть опубликованы с одинаковыми именами файлов. Релиз содержит сгенерированные файлы (например,
скрипт configure, сгенерированный пакетом autoconf) в дополнение к содержимому соответствующего
моментального снимка репозитория. В книге везде, где это возможно, используются релизные архивы.
Использование моментального снимка вместо tar-архива, указанного в книге, может вызвать проблемы.
Источники загрузки могут быть недоступны. Если источник изменился с момента публикации этой книги,
Google (https://www.google.com/) предоставляет удобную поисковую систему для поиска большинства
пакетов. Если поиск не увенчался успехом, попробуйте один из альтернативных способов загрузки,
расположенных по адресу https://mirror.linuxfromscratch.ru/lfs/mirrors.html#files.
Загруженные пакеты и патчи необходимо где-нибудь хранить, чтобы они были доступны на протяжении всей
сборки. Рабочий каталог также необходим для распаковки исходников и их сборки. $LFS/sources можно
использовать и как место для хранения архивов и патчей, и как рабочий каталог. При использовании этого
каталога необходимые элементы будут расположены в разделе LFS и будут доступны на всех этапах процесса
сборки.
Чтобы создать этот каталог, выполните следующую команду от имени пользователя
загрузки:

root

перед началом

mkdir -v $LFS/sources

Сделайте этот каталог доступным для записи и установите липкий бит. «Липкий бит» означает, что даже
если несколько пользователей имеют право на запись в каталог, только владелец файла может удалить файл
в таком каталоге. Следующая команда активирует режимы записи и липкий бит:
chmod -v a+wt $LFS/sources

Есть несколько способов получить все необходимые пакеты и патчи для сборки LFS:
• Файлы можно загрузить по отдельности, как описано в следующих двух разделах.
• Для стабильных версий книги архив со всеми необходимыми файлами можно загрузить с одного из
зеркал LFS, перечисленных на странице https://mirror.linuxfromscratch.ru/mirrors.html#files.
• Файлы можно загрузить с помощью wget и wget-list.
Чтобы загрузить все пакеты и патчи, используя wget-list-sysv в качестве входных данных для команды wget,
наберите команду:
wget --input-file=wget-list-sysv --continue --directory-prefix=$LFS/sources

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

41

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

3.2. Все пакеты
Примечание
Ознакомьтесь с рекомендациями по безопасности перед загрузкой пакетов, чтобы узнать, следует
ли использовать более новую версию пакета, чтобы избежать проблем безопасности.
При выходе новых версий, старые версии пакетов могут быть удалены, особенно, если они
содержали уязвимости. Если одна или несколько ссылок ниже недоступны, сначала ознакомьтесь
с рекомендациями по безопасности, чтобы понять следует ли использовать более новую версию (с
исправленной уязвимостью). Если нет, попробуйте скачать удаленный пакет с зеркала. Хотя старый
релиз можно скачать с зеркала (даже если он был удален из-за уязвимости), для сборки системы не
рекомендуется использовать версию, которая уязвима.
Загрузите или иным образом получите следующие пакеты:
• Acl (2.3.2) - 363 KB:
Домашняя страница: https://savannah.nongnu.org/projects/acl
Ссылка на загрузку: https://download.savannah.gnu.org/releases/acl/acl-2.3.2.tar.xz
Контрольная сумма MD5: 590765dee95907dbc3c856f7255bd669
• Attr (2.5.2) - 484 KB:
Домашняя страница: https://savannah.nongnu.org/projects/attr
Ссылка на загрузку: https://download.savannah.gnu.org/releases/attr/attr-2.5.2.tar.gz
Контрольная сумма MD5: 227043ec2f6ca03c0948df5517f9c927
• Autoconf (2.72) - 1,360 KB:
Домашняя страница: https://www.gnu.org/software/autoconf/
Ссылка на загрузку: https://ftp.gnu.org/gnu/autoconf/autoconf-2.72.tar.xz
Контрольная сумма MD5: 1be79f7106ab6767f18391c5e22be701
• Automake (1.16.5) - 1,565 KB:
Домашняя страница: https://www.gnu.org/software/automake/
Ссылка на загрузку: https://ftp.gnu.org/gnu/automake/automake-1.16.5.tar.xz
Контрольная сумма MD5: 4017e96f89fca45ca946f1c5db6be714
• Bash (5.2.21) - 10,696 KB:
Домашняя страница: https://www.gnu.org/software/bash/
Ссылка на загрузку: https://ftp.gnu.org/gnu/bash/bash-5.2.21.tar.gz
Контрольная сумма MD5: ad5b38410e3bf0e9bcc20e2765f5e3f9
• Bc (6.7.5) - 460 KB:
Домашняя страница: https://git.gavinhoward.com/gavin/bc
Ссылка на загрузку: https://github.com/gavinhoward/bc/releases/download/6.7.5/bc-6.7.5.tar.xz
Контрольная сумма MD5: e249b1f86f886d6fb71c15f72b65dd3d
42

Линукс с нуля - Версия 12.1
• Binutils (2.42) - 26,922 KB:
Домашняя страница: https://www.gnu.org/software/binutils/
Ссылка на загрузку: https://sourceware.org/pub/binutils/releases/binutils-2.42.tar.xz
Контрольная сумма MD5: a075178a9646551379bfb64040487715
• Bison (3.8.2) - 2,752 KB:
Домашняя страница: https://www.gnu.org/software/bison/
Ссылка на загрузку: https://ftp.gnu.org/gnu/bison/bison-3.8.2.tar.xz
Контрольная сумма MD5: c28f119f405a2304ff0a7ccdcc629713
• Bzip2 (1.0.8) - 792 KB:
Ссылка на загрузку: https://www.sourceware.org/pub/bzip2/bzip2-1.0.8.tar.gz
Контрольная сумма MD5: 67e051268d0c475ea773822f7500d0e5
• Check (0.15.2) - 760 KB:
Домашняя страница: https://libcheck.github.io/check
Ссылка на загрузку: https://github.com/libcheck/check/releases/download/0.15.2/check-0.15.2.tar.gz
Контрольная сумма MD5: 50fcafcecde5a380415b12e9c574e0b2
• Coreutils (9.4) - 5,840 KB:
Домашняя страница: https://www.gnu.org/software/coreutils/
Ссылка на загрузку: https://ftp.gnu.org/gnu/coreutils/coreutils-9.4.tar.xz
Контрольная сумма MD5: 459e9546074db2834eefe5421f250025
• DejaGNU (1.6.3) - 608 KB:
Домашняя страница: https://www.gnu.org/software/dejagnu/
Ссылка на загрузку: https://ftp.gnu.org/gnu/dejagnu/dejagnu-1.6.3.tar.gz
Контрольная сумма MD5: 68c5208c58236eba447d7d6d1326b821
• Diffutils (3.10) - 1,587 KB:
Домашняя страница: https://www.gnu.org/software/diffutils/
Ссылка на загрузку: https://ftp.gnu.org/gnu/diffutils/diffutils-3.10.tar.xz
Контрольная сумма MD5: 2745c50f6f4e395e7b7d52f902d075bf
• E2fsprogs (1.47.0) - 9,412 KB:
Домашняя страница: http://e2fsprogs.sourceforge.net/
Ссылка на загрузку: https://downloads.sourceforge.net/project/e2fsprogs/e2fsprogs/v1.47.0/e2fsprogs-1.47.0.tar.
gz
Контрольная сумма MD5: 6b4f18a33873623041857b4963641ee9
• Elfutils (0.190) - 8,949 KB:
Домашняя страница: https://sourceware.org/elfutils/
Ссылка на загрузку: https://sourceware.org/ftp/elfutils/0.190/elfutils-0.190.tar.bz2
Контрольная сумма MD5: 79ad698e61a052bea79e77df6a08bc4b
• Expat (2.6.0) - 473 KB:
Домашняя страница: https://libexpat.github.io/
Ссылка на загрузку: https://prdownloads.sourceforge.net/expat/expat-2.6.0.tar.xz
Контрольная сумма MD5: bd169cb11f4b9bdfddadf9e88a5c4d4b
• Expect (5.45.4) - 618 KB:
Домашняя страница: https://core.tcl.tk/expect/
Ссылка на загрузку: https://prdownloads.sourceforge.net/expect/expect5.45.4.tar.gz
Контрольная сумма MD5: 00fce8de158422f5ccd2666512329bd2
43

Линукс с нуля - Версия 12.1
• File (5.45) - 1,218 KB:
Домашняя страница: https://www.darwinsys.com/file/
Ссылка на загрузку: https://astron.com/pub/file/file-5.45.tar.gz
Контрольная сумма MD5: 26b2a96d4e3a8938827a1e572afd527a
• Findutils (4.9.0) - 1,999 KB:
Домашняя страница: https://www.gnu.org/software/findutils/
Ссылка на загрузку: https://ftp.gnu.org/gnu/findutils/findutils-4.9.0.tar.xz
Контрольная сумма MD5: 4a4a547e888a944b2f3af31d789a1137
• Flex (2.6.4) - 1,386 KB:
Домашняя страница: https://github.com/westes/flex
Ссылка на загрузку: https://github.com/westes/flex/releases/download/v2.6.4/flex-2.6.4.tar.gz
Контрольная сумма MD5: 2882e3179748cc9f9c23ec593d6adc8d
• Flit-core (3.9.0) - 41 KB:
Домашняя страница: https://pypi.org/project/flit-core/
Ссылка на загрузку: https://pypi.org/packages/source/f/flit-core/flit_core-3.9.0.tar.gz
Контрольная сумма MD5: 3bc52f1952b9a78361114147da63c35b
• Gawk (5.3.0) - 3,356 KB:
Домашняя страница: https://www.gnu.org/software/gawk/
Ссылка на загрузку: https://ftp.gnu.org/gnu/gawk/gawk-5.3.0.tar.xz
Контрольная сумма MD5: 97c5a7d83f91a7e1b2035ebbe6ac7abd
• GCC (13.2.0) - 85,800 KB:
Домашняя страница: https://gcc.gnu.org/
Ссылка на загрузку: https://ftp.gnu.org/gnu/gcc/gcc-13.2.0/gcc-13.2.0.tar.xz
Контрольная сумма MD5: e0e48554cc6e4f261d55ddee9ab69075
• GDBM (1.23) - 1,092 KB:
Домашняя страница: https://www.gnu.org/software/gdbm/
Ссылка на загрузку: https://ftp.gnu.org/gnu/gdbm/gdbm-1.23.tar.gz
Контрольная сумма MD5: 8551961e36bf8c70b7500d255d3658ec
• Gettext (0.22.4) - 10,016 KB:
Домашняя страница: https://www.gnu.org/software/gettext/
Ссылка на загрузку: https://ftp.gnu.org/gnu/gettext/gettext-0.22.4.tar.xz
Контрольная сумма MD5: 2d8507d003ef3ddd1c172707ffa97ed8
• Glibc (2.39) - 18,092 KB:
Домашняя страница: https://www.gnu.org/software/libc/
Ссылка на загрузку: https://ftp.gnu.org/gnu/glibc/glibc-2.39.tar.xz
Контрольная сумма MD5: be81e87f72b5ea2c0ffe2bedfeb680c6

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

Линукс с нуля - Версия 12.1
• GMP (6.3.0) - 2,046 KB:
Домашняя страница: https://www.gnu.org/software/gmp/
Ссылка на загрузку: https://ftp.gnu.org/gnu/gmp/gmp-6.3.0.tar.xz
Контрольная сумма MD5: 956dc04e864001a9c22429f761f2c283
• Gperf (3.1) - 1,188 KB:
Домашняя страница: https://www.gnu.org/software/gperf/
Ссылка на загрузку: https://ftp.gnu.org/gnu/gperf/gperf-3.1.tar.gz
Контрольная сумма MD5: 9e251c0a618ad0824b51117d5d9db87e
• Grep (3.11) - 1,664 KB:
Домашняя страница: https://www.gnu.org/software/grep/
Ссылка на загрузку: https://ftp.gnu.org/gnu/grep/grep-3.11.tar.xz
Контрольная сумма MD5: 7c9bbd74492131245f7cdb291fa142c0
• Groff (1.23.0) - 7,259 KB:
Домашняя страница: https://www.gnu.org/software/groff/
Ссылка на загрузку: https://ftp.gnu.org/gnu/groff/groff-1.23.0.tar.gz
Контрольная сумма MD5: 5e4f40315a22bb8a158748e7d5094c7d
• GRUB (2.12) - 6,524 KB:
Домашняя страница: https://www.gnu.org/software/grub/
Ссылка на загрузку: https://ftp.gnu.org/gnu/grub/grub-2.12.tar.xz
Контрольная сумма MD5: 60c564b1bdc39d8e43b3aab4bc0fb140
• Gzip (1.13) - 819 KB:
Домашняя страница: https://www.gnu.org/software/gzip/
Ссылка на загрузку: https://ftp.gnu.org/gnu/gzip/gzip-1.13.tar.xz
Контрольная сумма MD5: d5c9fc9441288817a4a0be2da0249e29
• Iana-Etc (20240125) - 589 KB:
Домашняя страница: https://www.iana.org/protocols
Ссылка на загрузку: https://github.com/Mic92/iana-etc/releases/download/20240125/iana-etc-20240125.tar.gz
Контрольная сумма MD5: aed66d04de615d76c70890233081e584
• Inetutils (2.5) - 1,632 KB:
Домашняя страница: https://www.gnu.org/software/inetutils/
Ссылка на загрузку: https://ftp.gnu.org/gnu/inetutils/inetutils-2.5.tar.xz
Контрольная сумма MD5: 9e5a6dfd2d794dc056a770e8ad4a9263
• Intltool (0.51.0) - 159 KB:
Домашняя страница: https://freedesktop.org/wiki/Software/intltool
Ссылка на загрузку: https://launchpad.net/intltool/trunk/0.51.0/+download/intltool-0.51.0.tar.gz
Контрольная сумма MD5: 12e517cac2b57a0121cda351570f1e63
• IPRoute2 (6.7.0) - 900 KB:
Домашняя страница: https://www.kernel.org/pub/linux/utils/net/iproute2/
Ссылка на загрузку: https://www.kernel.org/pub/linux/utils/net/iproute2/iproute2-6.7.0.tar.xz
Контрольная сумма MD5: 35d8277d1469596b7edc07a51470a033
• Jinja2 (3.1.3) - 264 KB:
Домашняя страница: https://jinja.palletsprojects.com/en/3.1.x/
Ссылка на загрузку: https://pypi.org/packages/source/J/Jinja2/Jinja2-3.1.3.tar.gz
Контрольная сумма MD5: caf5418c851eac59e70a78d9730d4cea
45

Линукс с нуля - Версия 12.1
• Kbd (2.6.4) - 1,470 KB:
Домашняя страница: https://kbd-project.org/
Ссылка на загрузку: https://www.kernel.org/pub/linux/utils/kbd/kbd-2.6.4.tar.xz
Контрольная сумма MD5: e2fd7adccf6b1e98eb1ae8d5a1ce5762
• Kmod (31) - 558 KB:
Домашняя страница: https://github.com/kmod-project/kmod
Ссылка на загрузку: https://www.kernel.org/pub/linux/utils/kernel/kmod/kmod-31.tar.xz
Контрольная сумма MD5: 6165867e1836d51795a11ea4762ff66a
• Less (643) - 579 KB:
Домашняя страница: https://www.greenwoodsoftware.com/less/
Ссылка на загрузку: https://www.greenwoodsoftware.com/less/less-643.tar.gz
Контрольная сумма MD5: cf05e2546a3729492b944b4874dd43dd
• LFS-Bootscripts (20230728) - 33 KB:
Ссылка на загрузку: https://mirror.linuxfromscratch.ru/lfs/downloads/12.1/lfs-bootscripts-20230728.tar.xz
Контрольная сумма MD5: c37ac1c5dbb57fb326d9c32c8f8b49c7
• Libcap (2.69) - 185 KB:
Домашняя страница: https://sites.google.com/site/fullycapable/
Ссылка на загрузку: https://www.kernel.org/pub/linux/libs/security/linux-privs/libcap2/libcap-2.69.tar.xz
Контрольная сумма MD5: 4667bacb837f9ac4adb4a1a0266f4b65
• Libffi (3.4.4) - 1,331 KB:
Домашняя страница: https://sourceware.org/libffi/
Ссылка на загрузку: https://github.com/libffi/libffi/releases/download/v3.4.4/libffi-3.4.4.tar.gz
Контрольная сумма MD5: 0da1a5ed7786ac12dcbaf0d499d8a049
• Libpipeline (1.5.7) - 956 KB:
Домашняя страница: https://libpipeline.nongnu.org/
Ссылка на загрузку: https://download.savannah.gnu.org/releases/libpipeline/libpipeline-1.5.7.tar.gz
Контрольная сумма MD5: 1a48b5771b9f6c790fb4efdb1ac71342
• Libtool (2.4.7) - 996 KB:
Домашняя страница: https://www.gnu.org/software/libtool/
Ссылка на загрузку: https://ftp.gnu.org/gnu/libtool/libtool-2.4.7.tar.xz
Контрольная сумма MD5: 2fc0b6ddcd66a89ed6e45db28fa44232
• Libxcrypt (4.4.36) - 610 KB:
Домашняя страница: https://github.com/besser82/libxcrypt/
Ссылка на загрузку: https://github.com/besser82/libxcrypt/releases/download/v4.4.36/libxcrypt-4.4.36.tar.xz
Контрольная сумма MD5: b84cd4104e08c975063ec6c4d0372446
• Linux (6.7.4) - 138,130 KB:
Домашняя страница: https://www.kernel.org/
Ссылка на загрузку: https://www.kernel.org/pub/linux/kernel/v6.x/linux-6.7.4.tar.xz
Контрольная сумма MD5: 370e1b6155ae63133380e421146619e0

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

Линукс с нуля - Версия 12.1
• M4 (1.4.19) - 1,617 KB:
Домашняя страница: https://www.gnu.org/software/m4/
Ссылка на загрузку: https://ftp.gnu.org/gnu/m4/m4-1.4.19.tar.xz
Контрольная сумма MD5: 0d90823e1426f1da2fd872df0311298d
• Make (4.4.1) - 2,300 KB:
Домашняя страница: https://www.gnu.org/software/make/
Ссылка на загрузку: https://ftp.gnu.org/gnu/make/make-4.4.1.tar.gz
Контрольная сумма MD5: c8469a3713cbbe04d955d4ae4be23eeb
• Man-DB (2.12.0) - 1,941 KB:
Домашняя страница: https://www.nongnu.org/man-db/
Ссылка на загрузку: https://download.savannah.gnu.org/releases/man-db/man-db-2.12.0.tar.xz
Контрольная сумма MD5: 67e0052fa200901b314fad7b68c9db27
• Man-pages (6.06) - 2,116 KB:
Домашняя страница: https://www.kernel.org/doc/man-pages/
Ссылка на загрузку: https://www.kernel.org/pub/linux/docs/man-pages/man-pages-6.06.tar.xz
Контрольная сумма MD5: 26b39e38248144156d437e1e10cb20bf
• MarkupSafe (2.1.5) - 19 KB:
Домашняя страница: https://palletsprojects.com/p/markupsafe/
Ссылка на загрузку: https://pypi.org/packages/source/M/MarkupSafe/MarkupSafe-2.1.5.tar.gz
Контрольная сумма MD5: 8fe7227653f2fb9b1ffe7f9f2058998a
• Meson (1.3.2) - 2,172 KB:
Домашняя страница: https://mesonbuild.com
Ссылка на загрузку: https://github.com/mesonbuild/meson/releases/download/1.3.2/meson-1.3.2.tar.gz
Контрольная сумма MD5: 2d0ebd3a24249617b1c4d30026380cf8
• MPC (1.3.1) - 756 KB:
Домашняя страница: https://www.multiprecision.org/
Ссылка на загрузку: https://ftp.gnu.org/gnu/mpc/mpc-1.3.1.tar.gz
Контрольная сумма MD5: 5c9bc658c9fd0f940e8e3e0f09530c62
• MPFR (4.2.1) - 1,459 KB:
Домашняя страница: https://www.mpfr.org/
Ссылка на загрузку: https://ftp.gnu.org/gnu/mpfr/mpfr-4.2.1.tar.xz
Контрольная сумма MD5: 523c50c6318dde6f9dc523bc0244690a
• Ncurses (6.4-20230520) - 2,156 KB:
Домашняя страница: https://www.gnu.org/software/ncurses/
Ссылка на загрузку: https://anduin.linuxfromscratch.org/LFS/ncurses-6.4-20230520.tar.xz
Контрольная сумма MD5: c5367e829b6d9f3f97b280bb3e6bfbc3
• Ninja (1.11.1) - 225 KB:
Домашняя страница: https://ninja-build.org/
Ссылка на загрузку: https://github.com/ninja-build/ninja/archive/v1.11.1/ninja-1.11.1.tar.gz
Контрольная сумма MD5: 32151c08211d7ca3c1d832064f6939b0
• OpenSSL (3.2.1) - 17,318 KB:
Домашняя страница: https://www.openssl.org/
Ссылка на загрузку: https://www.openssl.org/source/openssl-3.2.1.tar.gz
Контрольная сумма MD5: c239213887804ba00654884918b37441
47

Линукс с нуля - Версия 12.1
• Patch (2.7.6) - 766 KB:
Домашняя страница: https://savannah.gnu.org/projects/patch/
Ссылка на загрузку: https://ftp.gnu.org/gnu/patch/patch-2.7.6.tar.xz
Контрольная сумма MD5: 78ad9937e4caadcba1526ef1853730d5
• Perl (5.38.2) - 13,359 KB:
Домашняя страница: https://www.perl.org/
Ссылка на загрузку: https://www.cpan.org/src/5.0/perl-5.38.2.tar.xz
Контрольная сумма MD5: d3957d75042918a23ec0abac4a2b7e0a
• Pkgconf (2.1.1) - 305 KB:
Домашняя страница: http://pkgconf.org/
Ссылка на загрузку: https://distfiles.ariadne.space/pkgconf/pkgconf-2.1.1.tar.xz
Контрольная сумма MD5: bc29d74c2483197deb9f1f3b414b7918
• Procps (4.0.4) - 1,369 KB:
Домашняя страница: https://gitlab.com/procps-ng/procps/
Ссылка на загрузку: https://sourceforge.net/projects/procps-ng/files/Production/procps-ng-4.0.4.tar.xz
Контрольная сумма MD5: 2f747fc7df8ccf402d03e375c565cf96
• Psmisc (23.6) - 415 KB:
Домашняя страница: https://gitlab.com/psmisc/psmisc
Ссылка на загрузку: https://sourceforge.net/projects/psmisc/files/psmisc/psmisc-23.6.tar.xz
Контрольная сумма MD5: ed3206da1184ce9e82d607dc56c52633
• Python (3.12.2) - 20,109 KB:
Домашняя страница: https://www.python.org/
Ссылка на загрузку: https://www.python.org/ftp/python/3.12.2/Python-3.12.2.tar.xz
Контрольная сумма MD5: e7c178b97bf8f7ccd677b94d614f7b3c
• Python Documentation (3.12.2) - 8,065 KB:
Ссылка на загрузку: https://www.python.org/ftp/python/doc/3.12.2/python-3.12.2-docs-html.tar.bz2
Контрольная сумма MD5: 8a6310f6288e7f60c3565277ec3b5279
• Readline (8.2) - 2,973 KB:
Домашняя страница: https://tiswww.case.edu/php/chet/readline/rltop.html
Ссылка на загрузку: https://ftp.gnu.org/gnu/readline/readline-8.2.tar.gz
Контрольная сумма MD5: 4aa1b31be779e6b84f9a96cb66bc50f6
• Sed (4.9) - 1,365 KB:
Домашняя страница: https://www.gnu.org/software/sed/
Ссылка на загрузку: https://ftp.gnu.org/gnu/sed/sed-4.9.tar.xz
Контрольная сумма MD5: 6aac9b2dbafcd5b7a67a8a9bcb8036c3
• Setuptools (69.1.0) - 2,168 KB:
Домашняя страница: https://pypi.org/project/setuptools/
Ссылка на загрузку: https://pypi.org/packages/source/s/setuptools/setuptools-69.1.0.tar.gz
Контрольная сумма MD5: 6f6eb780ce12c90d81ce243747ed7ab0
• Shadow (4.14.5) - 1,765 KB:
Домашняя страница: https://github.com/shadow-maint/shadow/
Ссылка на загрузку: https://github.com/shadow-maint/shadow/releases/download/4.14.5/shadow-4.14.5.tar.xz
Контрольная сумма MD5: 452b0e59f08bf618482228ba3732d0ae
48

Линукс с нуля - Версия 12.1
• Sysklogd (1.5.1) - 88 KB:
Домашняя страница: https://www.infodrom.org/projects/sysklogd/
Ссылка на загрузку: https://www.infodrom.org/projects/sysklogd/download/sysklogd-1.5.1.tar.gz
Контрольная сумма MD5: c70599ab0d037fde724f7210c2c8d7f8
• Systemd (255) - 14,516 KB:
Домашняя страница: https://www.freedesktop.org/wiki/Software/systemd/
Ссылка на загрузку: https://github.com/systemd/systemd/archive/v255/systemd-255.tar.gz
Контрольная сумма MD5: 521cda27409a9edf0370c128fae3e690
• Systemd Man Pages(255) - 652 KB:
Домашняя страница: https://www.freedesktop.org/wiki/Software/systemd/
Ссылка на загрузку: https://anduin.linuxfromscratch.org/LFS/systemd-man-pages-255.tar.xz
Контрольная сумма MD5: 1ebe54d7a80f9abf8f2d14ddfeb2432d

Примечание
Команда Linux From Scratch генерирует собственный архив справочных страниц, используя
исходный код systemd. Это делается для того, чтобы избежать ненужных зависимостей.
• Sysvinit (3.08) - 263 KB:
Домашняя страница: https://savannah.nongnu.org/projects/sysvinit
Ссылка на загрузку: https://github.com/slicer69/sysvinit/releases/download/3.08/sysvinit-3.08.tar.xz
Контрольная сумма MD5: 81a05f28d7b67533cfc778fcadea168c
• Tar (1.35) - 2,263 KB:
Домашняя страница: https://www.gnu.org/software/tar/
Ссылка на загрузку: https://ftp.gnu.org/gnu/tar/tar-1.35.tar.xz
Контрольная сумма MD5: a2d8042658cfd8ea939e6d911eaf4152
• Tcl (8.6.13) - 10,581 KB:
Домашняя страница: http://tcl.sourceforge.net/
Ссылка на загрузку: https://downloads.sourceforge.net/tcl/tcl8.6.13-src.tar.gz
Контрольная сумма MD5: 0e4358aade2f5db8a8b6f2f6d9481ec2
• Tcl Documentation (8.6.13) - 1,165 KB:
Ссылка на загрузку: https://downloads.sourceforge.net/tcl/tcl8.6.13-html.tar.gz
Контрольная сумма MD5: 4452f2f6d557f5598cca17b786d6eb68
• Texinfo (7.1) - 5,416 KB:
Домашняя страница: https://www.gnu.org/software/texinfo/
Ссылка на загрузку: https://ftp.gnu.org/gnu/texinfo/texinfo-7.1.tar.xz
Контрольная сумма MD5: edd9928b4a3f82674bcc3551616eef3b
• Time Zone Data (2024a) - 444 KB:
Домашняя страница: https://www.iana.org/time-zones
Ссылка на загрузку: https://www.iana.org/time-zones/repository/releases/tzdata2024a.tar.gz
Контрольная сумма MD5: 2349edd8335245525cc082f2755d5bf4
• Udev-lfs Tarball (udev-lfs-20230818) - 10 KB:
Ссылка на загрузку: https://anduin.linuxfromscratch.org/LFS/udev-lfs-20230818.tar.xz
Контрольная сумма MD5: acd4360d8a5c3ef320b9db88d275dae6
• Util-linux (2.39.3) - 8,327 KB:
Домашняя страница: https://git.kernel.org/pub/scm/utils/util-linux/util-linux.git/
Ссылка на загрузку:https://www.kernel.org/pub/linux/utils/util-linux/v2.39/util-linux-2.39.3.tar.xz
Контрольная сумма MD5: f3591e6970c017bb4bcd24ae762a98f5
49

Линукс с нуля - Версия 12.1
• Vim (9.1.0041) - 17,224 KB:
Домашняя страница: https://www.vim.org
Ссылка на загрузку: https://github.com/vim/vim/archive/v9.1.0041/vim-9.1.0041.tar.gz
Контрольная сумма MD5: 79dfe62be5d347b1325cbd5ce2a1f9b3

Примечание
Версия vim меняется ежедневно. Чтобы получить последнюю версию, перейдите на https://
github.com/vim/vim/tags.
• Wheel (0.42.0) - 97 KB:
Домашняя страница: https://pypi.org/project/wheel/
Ссылка на загрузку: https://pypi.org/packages/source/w/wheel/wheel-0.42.0.tar.gz
Контрольная сумма MD5: 802ad6e5f9336fcb1c76b7593f0cd22d
• XML::Parser (2.47) - 276 KB:
Домашняя страница: https://github.com/chorny/XML-Parser
Ссылка на загрузку: https://cpan.metacpan.org/authors/id/T/TO/TODDR/XML-Parser-2.47.tar.gz
Контрольная сумма MD5: 89a8e82cfd2ad948b349c0a69c494463
• Xz Utils (5.4.6) - 1,645 KB:
Домашняя страница: https://tukaani.org/xz
Ссылка на загрузку: https://github.com/tukaani-project/xz/releases/download/v5.4.6/xz-5.4.6.tar.xz
Контрольная сумма MD5: 7ade7bd1181a731328f875bec62a9377
• Zlib (1.3.1) - 1,478 KB:
Домашняя страница: https://zlib.net/
Ссылка на загрузку: https://zlib.net/fossils/zlib-1.3.1.tar.gz
Контрольная сумма MD5: 9855b6d802d7fe5b7bd5b196a2271655
• Zstd (1.5.5) - 2,314 KB:
Домашняя страница: https://facebook.github.io/zstd/
Ссылка на загрузку: https://github.com/facebook/zstd/releases/download/v1.5.5/zstd-1.5.5.tar.gz
Контрольная сумма MD5: 63251602329a106220e0a5ad26ba656f
Общий размер пакетов: примерно 504 MB

3.3. Необходимые патчи
В дополнение к пакетам требуется несколько патчей. Эти патчи исправляют ошибки в пакетах, которые
должны быть исправлены сопровождающим. Патчи также вносят небольшие изменения, облегчающие
работу с пакетами. Для создания системы LFS потребуются следующие исправления:
• Bash Upstream Fixes Patch - 5.9 KB:
Ссылка на загрузку: https://mirror.linuxfromscratch.ru/patches/lfs/12.1/bash-5.2.21-upstream_fixes-1.patch
Контрольная сумма MD5: 2d1691a629c558e894dbb78ee6bf34ef
• Bzip2 Documentation Patch - 1.6 KB:
Ссылка на загрузку: https://mirror.linuxfromscratch.ru/patches/lfs/12.1/bzip2-1.0.8-install_docs-1.patch
Контрольная сумма MD5: 6a5ac7e89b791aae556de0f745916f7f
• Coreutils Internationalization Fixes Patch - 166 KB:
Ссылка на загрузку: https://mirror.linuxfromscratch.ru/patches/lfs/12.1/coreutils-9.4-i18n-1.patch
Контрольная сумма MD5: cca7dc8c73147444e77bc45d210229bb
50

Линукс с нуля - Версия 12.1
• Glibc FHS Patch - 2.8 KB:
Ссылка на загрузку: https://mirror.linuxfromscratch.ru/patches/lfs/12.1/glibc-2.39-fhs-1.patch
Контрольная сумма MD5: 9a5997c3452909b1769918c759eff8a2
• Kbd Backspace/Delete Fix Patch - 12 KB:
Ссылка на загрузку: https://mirror.linuxfromscratch.ru/patches/lfs/12.1/kbd-2.6.4-backspace-1.patch
Контрольная сумма MD5: f75cca16a38da6caa7d52151f7136895
• Readline Upstream Fix Patch - 13 KB:
Ссылка на загрузку: https://mirror.linuxfromscratch.ru/patches/lfs/12.1/readline-8.2-upstream_fixes-3.patch
Контрольная сумма MD5: 9ed497b6cb8adcb8dbda9dee9ebce791
• Sysvinit Consolidated Patch - 2.5 KB:
Ссылка на загрузку: https://mirror.linuxfromscratch.ru/patches/lfs/12.1/sysvinit-3.08-consolidated-1.patch
Контрольная сумма MD5: 17ffccbb8e18c39e8cedc32046f3a475
Общий размер этих патчей: примерно 203.8 KB
Помимо указанных выше обязательных исправлений, существует ряд необязательных патчей, созданных
сообществом LFS. Эти необязательные исправления решают незначительные проблемы или включают
функции, которые не включены по умолчанию. Не стесняйтесь просматривать базу данных исправлений,
расположенную по адресу https://mirror.linuxfromscratch.ru/patches/downloads/, и применять патчи,
необходимые вашей системе.

51

Линукс с нуля - Версия 12.1

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

4.2. Создание ограниченной иерархии папок в файловой
системе LFS
В этом разделе мы начинаем заполнять файловую систему LFS элементами, которые будут основой конечной
системы Linux. Первым шагом является создание ограниченной иерархии каталогов, чтобы программы,
скомпилированные в Глава 6 (а также glibc и libstdc++ в Глава 5), могли быть установлены в их конечном
расположении. Это необходимо для того, чтобы эти временные программы были перезаписаны при сборке
окончательных версий в Глава 8.
Создайте необходимую иерархию каталогов, выполнив следующую команду от имени root:
mkdir -pv $LFS/{etc,var} $LFS/usr/{bin,lib,sbin}
for i in bin lib sbin; do
ln -sv usr/$i $LFS/$i
done
case $(uname -m) in
x86_64) mkdir -pv $LFS/lib64 ;;
esac

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

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

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

Линукс с нуля - Версия 12.1
упростить настройку рабочей среды, создайте нового пользователя с именем 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.

4.4. Настройка окружения
Настроим хорошо работающее окружение, создав два новых файла запуска для оболочки bash. Войдя в
систему как пользователь lfs, введите следующую команду, чтобы создать новый .bash_profile :
cat > ~/.bash_profile ~/.bashrc > ~/.bashrc &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 собираются, тестируются и
устанавливаются окончательные версии всех пакетов, необходимых для полнофункциональной системы.
63

Линукс с нуля - Версия 12.1

Общие инструкции по компиляции
Внимание
В процессе разработки 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

64

Линукс с нуля - Версия 12.1

Важно
Вот краткое описание процесса сборки:
1. Поместите все исходники и патчи в каталог, который будет доступен из среды chroot,
например, /mnt/lfs/sources/ .
2. Перейдите в каталог /mnt/lfs/sources/ .
3. Для каждого пакета:
a. С помощью программы tar извлеките пакет для сборки. В Глава 5 и Глава 6 убедитесь,
что при извлечении пакета вы залогинены под пользователем lfs.

b.
c.
d.
e.

Не используйте никаких методов, кроме команды tar, для извлечения исходного кода.
Примечательно, что использование команды cp -R для копирования дерева исходного
кода в другое место может привести к уничтожению ссылок и меток времени в дереве
исходного кода и привести к сбою сборки.
Перейдите в каталог, созданный при извлечении пакета.
Следуйте инструкциям по сборке пакета.
Вернитесь в исходный каталог, когда сборка будет завершена.
Удалите извлеченный каталог, если не указано иное.

65

Линукс с нуля - Версия 12.1

Глава 5. Сборка кросс-тулчейна
5.1. Введение
В этой главе дано описание, как создать кросс-компилятор и связанные с ним инструменты. Несмотря на
то, что на данном этапе кросс-компиляция имитируется, принципы его работы те же, что и для настоящего
кросс-тулчейна.
Программы, скомпилированные в этой главе, будут установлены в каталог $LFS/tools , чтобы они были
отделены от файлов, установленных в следующих главах. Библиотеки, же, устанавливаются на свое
постоянное место, поскольку они относятся к системе, которую мы хотим создать.

66

Линукс с нуля - Версия 12.1

5.2. Binutils-2.42 - Проход 1
Пакет Binutils содержит компоновщик, ассемблер и другие инструменты для работы с объектными файлами.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

1 SBU
663 MB

5.2.1. Установка кросс-пакета Binutils
Примечание
Вернитесь назад и перечитайте примечания в разделе Общие инструкции по компиляции.
Понимание информации, помеченной как важная, может впоследствии избавить вас от многих
проблем.
Очень важно, чтобы Binutils был скомпилированным первым, потому что и Glibc, и GCC выполняют
различные тесты на доступных компоновщике и ассемблере, чтобы определить, какие из их функций следует
включить.
В документации пакета Binutils рекомендуется выполнять сборку в отдельном каталоге, создадим его:
mkdir -v build
cd
build

Примечание
Для того, чтобы значения SBU, перечисленные в остальной части книги, были вам полезны,
измерьте время, необходимое для сборки этого пакета, начиная с настройки и заканчивая
установкой. Чтобы добиться этого, оберните команды сборки командой time: time { ../
configure ... && make && make install; }.
Теперь подготовьте Binutils к компиляции:
../configure --prefix=$LFS/tools \
--with-sysroot=$LFS \
--target=$LFS_TGT
\
--disable-nls
\
--enable-gprofng=no \
--disable-werror
\
--enable-default-hash-style=gnu

Значение параметров настройки:
--prefix=$LFS/tools

Указывает сценарию configure подготовить к установке пакет Binutils в каталог $LFS/tools .
--with-sysroot=$LFS

Для кросс-компляции указывает системе сборки искать в $LFS библиотеки целевой системы, если
необходимо.
--target=$LFS_TGT

Поскольку название машины в значении переменной LFS_TGT может отличаться от значения, которое
возвращает сценарий config.guess, этот аргумент укажет сценарию configure как настроить систему
сборки пакета Binutils для создания кросс-компоновщика.
--disable-nls

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

Линукс с нуля - Версия 12.1
--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.»

68

Линукс с нуля - Версия 12.1

5.3. GCC-13.2.0 - Проход 1
Пакет GCC содержит коллекцию компиляторов GNU, которая включает компиляторы C и C++.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

3.8 SBU
4.1 GB

5.3.1. Установка кросс-пакета GCC
Для GCC требуются пакеты GMP, MPFR и MPC. Поскольку эти пакеты могут отсутствовать в дистрибутиве
вашего хоста, они будут собраны с помощью GCC. Распакуйте каждый пакет в исходный каталог GCC и
переименуйте получившиеся каталоги, чтобы процедуры сборки GCC использовали их автоматически:

Примечание
В этой главе часто возникают недоразумения, хотя применяются те же процедуры, что и в любой
другой главе, следуйте инструкции которую получили ранее (Инструкции по сборке пакетов).
Сначала распакуйте пакет gcc-13.2.0 из архива, а затем перейдите в созданный каталог. Только
после этого следует приступить к приведенным ниже инструкциям.
tar -xf ../mpfr-4.2.1.tar.xz
mv -v mpfr-4.2.1 mpfr
tar -xf ../gmp-6.3.0.tar.xz
mv -v gmp-6.3.0 gmp
tar -xf ../mpc-1.3.1.tar.gz
mv -v mpc-1.3.1 mpc

На хостах 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

69

Линукс с нуля - Версия 12.1
Подготовьте 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
70

Линукс с нуля - Версия 12.1
--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.»

71

Линукс с нуля - Версия 12.1

5.4. Заголовочные файлы Linux-6.7.4 API
Заголовочные файлы Linux API (в linux-6.7.4.tar.xz) предоставляют API ядра для использования Glibc.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

менее 0.1 SBU
1.5 GB

5.4.1. Установка заголовочных файлов
Ядро Linux должно предоставлять интерфейс прикладного программирования (API) для использования
системной библиотекой C (Glibc в LFS). Это делается путем установки заголовочных файлов C, которые
поставляются в архиве с исходным кодом ядра Linux.
Убедитесь, что в пакете нет устаревших файлов:
make mrproper

Теперь извлеките видимые пользователю заголовочные файлы ядра из исходного кода. Рекомендуемый
способ make «headers_install» использовать нельзя, так как для этого требуется rsync, который может быть
недоступен. Заголовочные файлы сначала помещаются в /usr , а затем копируются в нужное место.
make headers
find usr/include -type f ! -name '*.h' -delete
cp -rv usr/include $LFS/usr

5.4.2. Содержимое заголовочных файлов Linux API
Установленные
заголовочные файлы::
Созданные каталоги::

/usr/include/asm/*.h, /usr/include/asm-generic/*.h, /usr/include/drm/*.h, /usr/
include/linux/*.h, /usr/include/misc/*.h, /usr/include/mtd/*.h, /usr/include/rdma/
*.h, /usr/include/scsi/*.h, /usr/include/sound/*.h, /usr/include/video/*.h, and /usr/
include/xen/*.h
/usr/include/asm, /usr/include/asm-generic, /usr/include/drm, /usr/include/linux, /
usr/include/misc, /usr/include/mtd, /usr/include/rdma, /usr/include/scsi, /usr/include/
sound, /usr/include/video, and /usr/include/xen

Краткое описание
/usr/include/asm/*.h

Заголовочные файлы Linux API ASM

/usr/include/asm-generic/*.h

Заголовочные файлы Linux API ASM Generic

/usr/include/drm/*.h

Заголовочные файлы Linux API DRM

/usr/include/linux/*.h

Заголовочные файлы Linux API Linux

/usr/include/misc/*.h

Заголовочные файлы Linux API Miscellaneous

/usr/include/mtd/*.h

Заголовочные файлы API MTD

/usr/include/rdma/*.h

Заголовочные файлы Linux API RDMA

/usr/include/scsi/*.h

Заголовочные файлы Linux API SCSI

/usr/include/sound/*.h

Заголовочные файлы Linux API Sound

/usr/include/video/*.h

Заголовочные файлы Linux API Video

/usr/include/xen/*.h

Заголовочные файлы Linux API Xen

72

Линукс с нуля - Версия 12.1

5.5. Glibc-2.39
Пакет Glibc содержит основную библиотеку C. Эта библиотека предоставляет основные процедуры для
выделения памяти, поиска в каталогах, открытия и закрытия файлов, чтения и записи файлов, обработки
строк, сопоставления с образцом, арифметики и так далее
Приблизительное
время сборки:
Требуемое дисковое
пространство:

1.5 SBU
846 MB

5.5.1. Установка пакета Glibc
Во-первых, создайте символическую ссылку для соответствия требованиям 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 .
73

Линукс с нуля - Версия 12.1
--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

74

Линукс с нуля - Версия 12.1

Внимание
На этом этапе необходимо остановиться и убедиться, что основные функции (компиляция и
компоновка) нового кросс-тулчейна работают должным образом. Чтобы выполнить проверку
работоспособности, выполните следующие команды:
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.»

75

Линукс с нуля - Версия 12.1

5.6. Libstdc++ из GCC-13.2.0
Libstdc++ — это стандартная библиотека C++. Она нужна для компиляции кода C++ (часть GCC написана
на C++), когда мы собирали GCC-Проход 1, нам пришлось отложить её установку, потому что она зависит
от библиотеки Glibc, которой еще не было в целевом каталоге.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.2 SBU
1.1 GB

5.6.1. Установка библиотеки Libstdc++
Примечание
Libstdc++ является частью исходников GCC. Сначала вы должны распаковать архив GCC и перейти
в каталог gcc-13.2.0 .
Создайте отдельный каталог сборки для libstdc++ и перейдите в него:
mkdir -v build
cd
build

Подготовьте libstdc++ к компиляции:
../libstdc++-v3/configure
\
--host=$LFS_TGT
\
--build=$(../config.guess)
\
--prefix=/usr
\
--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

76

Линукс с нуля - Версия 12.1
Установите библиотеку:
make DESTDIR=$LFS install

Удалите архивные файлы libtool, поскольку они потенциально опасны при кросс-компиляции:
rm -v $LFS/usr/lib/lib{stdc++{,exp,fs},supc++}.la

Подробная информация об этом пакете приведена в Раздел 8.28.2, «Содержимое пакета GCC.»

77

Линукс с нуля - Версия 12.1

Глава 6. Кросс-Компиляция временных
инструментов
6.1. Введение
В этой главе рассказывается, как выполнить кросс-компиляцию базовых утилит с использованием только
что собранного кросс-тулчейна. Эти утилиты установлены в свое конечное местоположение, но пока не
могут быть использованы. Выполняемые инструкции по-прежнему зависят от инструментария хоста. Тем
не менее, установленные библиотеки используются при компоновке.
Использование утилит станет возможным в следующей главе после входа в среду «chroot». Все пакеты из
этой главы, должны быть собраны до того, как мы это сделаем. Поэтому пока наша система зависима от
хост-системы.
Еще раз напомним, что неправильная настройка LFS вместе со сборкой от root может сделать ваш компьютер
непригодным для использования. Всю эту главу нужно выполнить от имени пользователя lfs, в его рабочем
окружении, как описано в Раздел 4.4, «Настройка окружения».

78

Линукс с нуля - Версия 12.1

6.2. M4-1.4.19
Пакет M4 содержит макропроцессор.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.1 SBU
31 MB

6.2.1. Установка пакета M4
Подготовьте пакет M4 к компиляции:
./configure --prefix=/usr
\
--host=$LFS_TGT \
--build=$(build-aux/config.guess)

Скомпилируйте пакет:
make

Установите пакет:
make DESTDIR=$LFS install

Подробная информация об этом пакете находится в Раздел 8.12.2, «Содержимое пакета M4.»

79

Линукс с нуля - Версия 12.1

6.3. Ncurses-6.4-20230520
Пакет Ncurses содержит библиотеки для независимой от терминала обработки ввода/вывода
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.3 SBU
51 MB

6.3.1. Установка пакета Ncurses
Во-первых, убедитесь, что gawk найден первым во время настройки:
sed -i s/mawk// configure

Затем выполните следующие команды, чтобы собрать программу «tic» на хосте сборки:
mkdir build
pushd build
../configure
make -C include
make -C progs tic
popd

Подготовьте Ncurses к компиляции:
./configure --prefix=/usr
--host=$LFS_TGT
--build=$(./config.guess)
--mandir=/usr/share/man
--with-manpage-format=normal
--with-shared
--without-normal
--with-cxx-shared
--without-debug
--without-ada
--disable-stripping
--enable-widec

\
\
\
\
\
\
\
\
\
\
\

Значение новых параметров настройки:
--with-manpage-format=normal

Этот аргумент предотвращает установку Ncurses сжатых страниц руководства, это может произойти,
если сам дистрибутив хоста содержит сжатые страницы руководства.
--with-shared

Этот аргумент позволяет Ncurses собирать и устанавливать разделяемые библиотеки C.
--without-normal

Этот аргумент предотвращает сборку и установку статических библиотек C.
--without-debug

Этот аргумент предотвращает сборку и установку отладочных библиотек.
--with-cxx-shared

Это аргумент позволяет Ncurses собирать и устанавливать общие привязки C++. А также предотвращает
сборку и установку статических привязок C++.
--without-ada

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

Линукс с нуля - Версия 12.1
--disable-stripping

Этот аргумент не позволяет системе сборки использовать программу strip с хоста. Использование
инструментов хоста в кросс-компилируемой программе может привести к сбою.
--enable-widec

Этот аргумент указывает, что необходимо скомпилировать библиотеки расширенных символов (такие
как, libncursesw.so.6.4-20230520
) вместо обычных (таких как, libncurses.so.6.4-20230520
).
Эти библиотеки расширенных символов можно использовать как в многобайтовой, так и традиционной
8-битной локали, в то время как обычные библиотеки корректно работают только в 8-битных
локалях. Библиотеки расширенных символов и обычные совместимы на уровне исходного кода, но не
совместимы в двоичном.
Скомпилируйте пакет:
make

Установите пакет:
make DESTDIR=$LFS TIC_PATH=$(pwd)/build/progs/tic install
ln -sv libncursesw.so $LFS/usr/lib/libncurses.so
sed -e 's/^#if.*XOPEN.*$/#if 1/' \
-i $LFS/usr/include/curses.h

Значение параметров установки:
TIC_PATH=$(pwd)/build/progs/tic

Нам нужно передать путь до только что собранной программы tic, которая работает на сборочной
машине, чтобы база данных терминала была создана без ошибок.
ln -sv libncursesw.so $LFS/usr/lib/libncurses.so
Библиотека libncurses.so необходима для нескольких пакетов, которые мы скоро соберем. Мы создаем
эту символическую ссылку, чтобы использовать libncursesw.so в качестве замены.
sed -e 's/^#if.*XOPEN.*$/#if 1/' ...
Заголовочный файл curses.h содержит определения различных структур данных Ncurses. С разными
определениями макросов препроцессора могут использоваться два разных набора определений
структуры данных: 8-битное определение совместимо с libncurses.so , а определение расширенного
набора символов совместимо с libncursesw.so . Поскольку мы используем libncursesw.so вместо
libncurses.so , отредактируйте заголовочный файл, чтобы он всегда использовал определение
структуры данных расширенного набора символов, совместимое с . libncursesw.so .
Подробная информация об этом пакете находится в Раздел 8.29.2, «Содержимое пакета Ncurses.»

81

Линукс с нуля - Версия 12.1

6.4. Bash-5.2.21
Пакет Bash содержит Bourne-Again Shell.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.2 SBU
67 MB

6.4.1. Установка пакета Bash
Подготовьте Bash к компиляции:
./configure --prefix=/usr
\
--build=$(sh support/config.guess) \
--host=$LFS_TGT
\
--without-bash-malloc

Значение параметров настройки:
--without-bash-malloc

Этот параметр отключает использование функции распределения памяти (malloc) Bash, которая, как
известно, вызывает ошибки сегментации. Если опция отключена, Bash будет использовать функции
malloc из Glibc, которые более стабильны.
Скомпилируйте пакет:
make

Установите пакет:
make DESTDIR=$LFS install

Создайте символическую ссылку для программ, которые используют sh как оболочку:
ln -sv bash $LFS/bin/sh

Подробная информация об этом пакете находится в Раздел 8.35.2, «Содержимое пакета Bash.»

82

Линукс с нуля - Версия 12.1

6.5. Coreutils-9.4
Пакет Coreutils содержит основные утилиты, необходимые каждой операционной системе.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.3 SBU
173 MB

6.5.1. Установка пакета Coreutils
Подготовьте Coreutils к компиляции:
./configure --prefix=/usr
\
--host=$LFS_TGT
\
--build=$(build-aux/config.guess) \
--enable-install-program=hostname \
--enable-no-install-program=kill,uptime

Значение параметров настройки:
--enable-install-program=hostname

Этот параметр позволяет создать и установить двоичный файл hostname – по умолчанию он отключен,
но требуется для набора тестов Perl.
Скомпилируйте пакет:
make

Установите пакет:
make DESTDIR=$LFS install

Переместите программы в их конечное местоположение. Хотя во временной среде в этом нет необходимости,
мы должны это сделать, потому что некоторые программы жестко прописывают местоположение
исполняемых файлов:
mv -v $LFS/usr/bin/chroot
$LFS/usr/sbin
mkdir -pv $LFS/usr/share/man/man8
mv -v $LFS/usr/share/man/man1/chroot.1 $LFS/usr/share/man/man8/chroot.8
sed -i 's/"1"/"8"/'
$LFS/usr/share/man/man8/chroot.8

Подробная информация об этом пакете находится в Раздел 8.57.2, «Содержимое пакета Coreutils.»

83

Линукс с нуля - Версия 12.1

6.6. Diffutils-3.10
Пакет Diffutils содержит программы, которые показывают различия между файлами или каталогами.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.1 SBU
29 MB

6.6.1. Установка пакета Diffutils
Подготовьте Diffutils для компиляции:
./configure --prefix=/usr
\
--host=$LFS_TGT \
--build=$(./build-aux/config.guess)

Скомпилируйте пакет:
make

Установите пакет:
make DESTDIR=$LFS install

Подробная информация об этом пакете находится в Раздел 8.59.2, «Содержимое пакета Diffutils.»

84

Линукс с нуля - Версия 12.1

6.7. File-5.45
Пакет File содержит утилиту для определения типа указанного файла или файлов
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.1 SBU
37 MB

6.7.1. Установка пакета File
Команда file на хосте сборки должна быть той же версии, что и собираемая, чтобы создать файл подписи.
Выполните следующие команды, чтобы создать временную копию команды file.
mkdir build
pushd build
../configure --disable-bzlib
\
--disable-libseccomp \
--disable-xzlib
\
--disable-zlib
make
popd

Значение новой опции настройки:
--disable-*

Сценарий конфигурации пытается использовать некоторые пакеты из основного дистрибутива, если
существуют соответствующие файлы библиотек. Это может привести к сбою компиляции, если
файлы библиотек существует, но отсутствуют соответствующие заголовочные файлы. Эти параметры
предотвращают использование ненужных возможностей хоста.
Подготовьте файл для компиляции:
./configure --prefix=/usr --host=$LFS_TGT --build=$(./config.guess)

Скомпилируйте пакет:
make FILE_COMPILE=$(pwd)/build/src/file

Установите пакет:
make DESTDIR=$LFS install

Удалите архивный файл libtool, поскольку он потенциально опасен при кросс-компиляции:
rm -v $LFS/usr/lib/libmagic.la

Подробная информация об этом пакете находится в Раздел 8.10.2, «Содержимое пакета File.»

85

Линукс с нуля - Версия 12.1

6.8. Findutils-4.9.0
Пакет Findutils содержит программы для поиска файлов. Эти программы предназначены для поиска по
всем файлам в дереве каталогов, а также для создания, обслуживания и поиска в базе данных (часто
быстрее, чем рекурсивный поиск, но ненадежно, если база данных давно не обновлялась).Findutils также
предоставляет программу xargs, которую можно использовать для запуска указанной команды для каждого
файла, выбранного при поиске.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.1 SBU
42 MB

6.8.1. Установка пакета Findutils
Подготовьте Findutils к компиляции:
./configure --prefix=/usr
\
--localstatedir=/var/lib/locate \
--host=$LFS_TGT
\
--build=$(build-aux/config.guess)

Скомпилируйте пакет:
make

Установите пакет:
make DESTDIR=$LFS install

Подробная информация об этом пакете находится в Раздел 8.61.2, «Содержимое пакета Findutils.»

86

Линукс с нуля - Версия 12.1

6.9. Gawk-5.3.0
Пакет Gawk содержит программы для работы с текстовыми файлами.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.1 SBU
47 MB

6.9.1. Установка пакета Gawk
Во-первых, убедитесь, что некоторые ненужные файлы не будут установлены:
sed -i 's/extras//' Makefile.in

Подготовьте Gawk к компиляции:
./configure --prefix=/usr
\
--host=$LFS_TGT \
--build=$(build-aux/config.guess)

Скомпилируйте пакет:
make

Установите пакет:
make DESTDIR=$LFS install

Подробная информация об этом пакете находится в Раздел 8.60.2, «Содержимое пакета Gawk.»

87

Линукс с нуля - Версия 12.1

6.10. Grep-3.11
Пакет Grep содержитпрограммы для поиска по содержимому файлов.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.1 SBU
27 MB

6.10.1. Установка пакета Grep
Подготовьте Grep к компиляции:
./configure --prefix=/usr
\
--host=$LFS_TGT \
--build=$(./build-aux/config.guess)

Скомпилируйте пакет:
make

Установите пакет:
make DESTDIR=$LFS install

Подробная информация об этом пакете находится в Раздел 8.34.2, «Содержимое пакета Grep.»

88

Линукс с нуля - Версия 12.1

6.11. Gzip-1.13
Пакет Gzip содержит программы для сжатия и распаковки файлов.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.1 SBU
11 MB

6.11.1. Установка пакета Gzip
Подготовьте Gzip к компиляции:
./configure --prefix=/usr --host=$LFS_TGT

Скомпилируйте пакет:
make

Установите пакет:
make DESTDIR=$LFS install

Подробная информация об этом пакете находится в Раздел 8.64.2, «Содержимое пакета Gzip.»

89

Линукс с нуля - Версия 12.1

6.12. Make-4.4.1
Пакет Make содержит программу, управляющую генерацией исполняемых и других файлов, из исходного
кода.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

менее 0.1 SBU
15 MB

6.12.1. Установка пакета Make
Подготовьте Make к компиляции:
./configure --prefix=/usr
\
--without-guile \
--host=$LFS_TGT \
--build=$(build-aux/config.guess)

Значение новой опции настройки:
--without-guile

Несмотря на то, что мы выполняем кросс-компиляцию, configure пытается использовать guile с узла
сборки, если он его находит. Это приводит к сбою компиляции, этот аргумент предотвращает его
использование.
Скомпилируйте пакет:
make

Установите пакет:
make DESTDIR=$LFS install

Подробная информация об этом пакете находится в Раздел 8.68.2, «Содержимое пакета Make.»

90

Линукс с нуля - Версия 12.1

6.13. Patch-2.7.6
Пакет Patch содержит программу для изменения или создания файлов путём наложение «патча», обычно,
создаваемого программой diff.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.1 SBU
12 MB

6.13.1. Установка пакета Patch
Подготовьте Patch к компиляции:
./configure --prefix=/usr
\
--host=$LFS_TGT \
--build=$(build-aux/config.guess)

Скомпилируйте пакет:
make

Установите пакет:
make DESTDIR=$LFS install

Подробная информация об этом пакете находится в Раздел 8.69.2, «Содержимое пакета Patch.»

91

Линукс с нуля - Версия 12.1

6.14. Sed-4.9
Пакет Sed содержит потоковый редактор текста
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.1 SBU
21 MB

6.14.1. Установка пакета Sed
Подготовьте Sed к компиляции:
./configure --prefix=/usr
\
--host=$LFS_TGT \
--build=$(./build-aux/config.guess)

Скомпилируйте пакет:
make

Установите пакет:
make DESTDIR=$LFS install

Подробная информация об этом пакете находится в Раздел 8.30.2, «Содержимое пакета Sed.»

92

Линукс с нуля - Версия 12.1

6.15. Tar-1.35
Пакет Tar предоставляет возможность создавать tar архивы, а также производить с ними различные
манипуляции. Tar может распаковать предварительно созданный архив, добавить или обновить файлы в нём,
вернуть список файлов в архиве.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.1 SBU
42 MB

6.15.1. Установка пакета Tar
Подготовьте Tar к компиляции:
./configure --prefix=/usr
\
--host=$LFS_TGT
\
--build=$(build-aux/config.guess)

Скомпилируйте пакет:
make

Установите пакет:
make DESTDIR=$LFS install

Подробная информация об этом пакете находится в Раздел 8.70.2, «Содержимое пакета Tar.»

93

Линукс с нуля - Версия 12.1

6.16. Xz-5.4.6
Пакет Xz содержит программы для сжатия и распаковки файлов. Он предоставляет возможности для lzma
и более новых форматов сжатия xz. Сжатие текстовых файлов с помощью xz дает лучший процент сжатия,
чем с традиционные gzip или bzip2.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.1 SBU
22 MB

6.16.1. Установка пакета Xz
Подготовьте Xz к компиляции:
./configure --prefix=/usr
--host=$LFS_TGT
--build=$(build-aux/config.guess)
--disable-static
--docdir=/usr/share/doc/xz-5.4.6

\
\
\
\

Скомпилируйте пакет:
make

Установите пакет:
make DESTDIR=$LFS install

Удалите архивный файл libtool, поскольку он потенциально опасен при кросс-компиляции:
rm -v $LFS/usr/lib/liblzma.la

Подробная информация об этом пакете находится в Раздел 8.8.2, «Содержимое пакета Xz.»

94

Линукс с нуля - Версия 12.1

6.17. Binutils-2.42 - Проход 2
Пакет Binutils содержит компоновщик, ассемблер и другие инструменты для работы с объектными файлами.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.5 SBU
537 MB

6.17.1. Установка пакета Binutils
Система сборки Binutils использует содержащуюся в пакете копию libtool для линковки с внутренними
статическими библиотеками, но копии libiberty и zlib, поставляемые с пакетом, не используют libtool.
Это несоответствие может привести к тому, что созданные двоичные файлы будут ошибочно связаны с
библиотеками из основного дистрибутива. Решение этой проблемы:
sed '6009s/$add_dir//' -i ltmain.sh

Создайте отдельный каталог для сборки:
mkdir -v build
cd
build

Подготовьте Binutils к компиляции:
../configure
\
--prefix=/usr
\
--build=$(../config.guess) \
--host=$LFS_TGT
\
--disable-nls
\
--enable-shared
\
--enable-gprofng=no
\
--disable-werror
\
--enable-64-bit-bfd
\
--enable-default-hash-style=gnu

Значение новых параметров настройки:
--enable-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.»

95

Линукс с нуля - Версия 12.1

6.18. GCC-13.2.0 - Проход 2
Пакет GCC содержит коллекцию компиляторов GNU, которая включает компиляторы C и C++.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

4.4 SBU
4.8 GB

6.18.1. Установка пакета GCC
Как и при первой сборке GCC, требуются пакеты GMP, MPFR и MPC. Распакуйте архивы и переименуйте
каталоги:
tar -xf ../mpfr-4.2.1.tar.xz
mv -v mpfr-4.2.1 mpfr
tar -xf ../gmp-6.3.0.tar.xz
mv -v gmp-6.3.0 gmp
tar -xf ../mpc-1.3.1.tar.gz
mv -v mpc-1.3.1 mpc

При сборке на 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++

\
\
\
\
\
\
\
\
\
\
\
\
\
\
\
\
\

96

Линукс с нуля - Версия 12.1
Значение новых параметров настройки:
--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.»

97

Линукс с нуля - Версия 12.1

Глава 7. Вход в окружение Chroot и создание
дополнительных временных инструментов
7.1. Введение
В этой главе рассказывается, как собрать последние недостающие части временной системы: инструменты,
необходимые для сборки различных пакетов. Теперь, когда все циклические зависимости устранены, для
сборки можно использовать среду «chroot», полностью изолированную от операционной системы хоста (за
исключением работающего ядра).
Для правильной работы изолированной среды необходимо установить связь с работающим ядром. Это
делается с помощью так называемых виртуальных файловых систем ядра, которые будут смонтированы
перед входом в среду chroot. Вы можете проверить, смонтированы ли они, выполнив команду findmnt.
До Раздел 7.4, «Вход в окружение Chroot» команды должны выполняться от имени root с установленной
переменной LFS. После входа в chroot все команды выполняются от имени root, к счастью, без доступа к
операционной системе компьютера, на котором вы собираете LFS. В любом случае будьте осторожны, так
как неверными командами легко разрушить всю систему LFS.

7.2. Смена владельца
Примечание
Команды, приведенные в оставшейся части книги, должны выполняться от имени пользователя
root, а не lfs. Дважды проверьте, что переменная $LFS установлена в переменных окружения
пользователя root.
В настоящее время вся иерархия каталогов в $LFS принадлежит пользователю lfs, существующему только
на хост-системе. Если права на файлы и каталоги внутри $LFS оставить как есть, то они будут принадлежать
ID пользователя без существующей учетной записи. Это опасно, так как созданная позже учетная запись,
может получить такой же ID пользователя и стать владельцем всех файлов в $LFS, тем самым делая эти файлы
уязвимыми для возможных злонамеренных манипуляций.
Для решения проблемы измените владельца каталогов $LFS/* на пользователя root, выполнив следующую
команду:
chown -R root:root $LFS/{usr,lib,var,etc,bin,sbin,tools}
case $(uname -m) in
x86_64) chown -R root:root $LFS/lib64 ;;
esac

7.3. Подготовка виртуальных файловых систем ядра
Приложения, работающие в пользовательском пространстве, используют различные файловые системы,
созданные ядром, для взаимодействия с самим ядром. Эти файловые системы являются виртуальными:
для них не используется дисковое пространство. Содержимое файловых систем находится в памяти. Эти
файловые системы должны быть смонтированы в дереве каталогов $LFS, чтобы приложения могли найти
их в среде chroot.
Начните с создания каталогов, в которые будут смонтированы эти виртуальные файловые системы:
mkdir -pv $LFS/{dev,proc,sys,run}

98

Линукс с нуля - Версия 12.1

7.3.1. Монтирование и заполнение /dev
Во время обычной загрузки ядро автоматически монтирует файловую систему devtmpfs в каталог /dev ;
ядро создает узлы устройств в этой виртуальной файловой системе в процессе загрузки или при первом
обнаружении устройства, или доступе к нему. Демон udev может изменять владельца или разрешения
узлов устройств, созданных ядром, или создавать новые узлы устройств или символические ссылки, чтобы
облегчить работу разработчиков дистрибутива или системных администраторов. (Подробности смотрите
в Раздел 9.3.2.2, «Создание узла устройства».) Если ядро хоста поддерживает devtmpfs, мы можем просто
смонтировать devtmpfs в $LFS/dev и положиться на ядро для его заполнения.
Но в некоторых ядрах хоста отсутствует поддержка devtmpfs, эти хост-дистрибутивы используют разные
методы для создания содержимого /dev . Таким образом, единственный независимый от хоста способ
заполнить каталог $LFS/dev - это привязка к каталогу /dev хост-системы. Связное монтирование - это
особый тип монтирования, который делает дерево каталога или файл видимым в каком-либо другом месте.
Для этого используйте следующую команду:
mount -v --bind /dev $LFS/dev

7.3.2. Монтирование виртуальных файловых систем ядра
Теперь смонтируйте оставшиеся виртуальные файловые системы:
mount
mount
mount
mount

-vt
-vt
-vt
-vt

devpts devpts -o gid=5,mode=0620 $LFS/dev/pts
proc proc $LFS/proc
sysfs sysfs $LFS/sys
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

99

Линукс с нуля - Версия 12.1

7.4. Вход в окружение Chroot
Теперь, когда все пакеты, необходимые для сборки остальных инструментов установлены в системе, пришло
время войти в окружение chroot и завершить установку временных инструментов. Эта среда также будет
использоваться для установки конечной системы. От имени пользователя root выполните следующую
команду для входа в chroot, в которой на данный момент нет ничего, кроме временных инструментов:
chroot "$LFS" /usr/bin/env -i
HOME=/root
TERM="$TERM"
PS1='(lfs chroot) \u:\w\$ '
PATH=/usr/bin:/usr/sbin
MAKEFLAGS="-j$(nproc)"
TESTSUITEFLAGS="-j$(nproc)"
/bin/bash --login

\
\
\
\
\
\
\

Если вы не хотите использовать все доступные логические ядра, замените параметр $(nproc) количеством
логических ядер, которые вы хотите использовать для сборки пакетов в этой и последующих главах. На
наборы тестов некоторых пакетов (в частности Autoconf, Libtool и Tar) в Глава 8 не влияет установка
переменной MAKEFLAGS, вместо этого они используют переменную среды TESTSUITEFLAGS. Мы также
установили её здесь для запуска тестов с поддержкой нескольких ядер.
Параметр -i команды env, очистит все переменные в среде chroot. После этого переменные HOME, TERM, PS1
и PATH будут установлены заново. Конструкция TERM=$TERM установит переменную TERM внутри chroot в то
же значение, что и вне chroot. Эта переменная необходима для корректной работы таких программ как vim
и less. Если понадобятся другие переменные окружения, такие как CFLAGS или CXXFLAGS, то это подходящее
место для их установки.
С этого момента больше нет необходимости использовать переменную LFS, поскольку вся работа будет
ограничена файловой системой LFS; команда chroot запускает оболочку Bash с корневым каталогом (/),
установленным в $LFS.
Обратите внимание, что каталог /tools/bin не указан в переменной окружения
кросс-тулчейн больше не будет использоваться.
Также обратите внимание, что в командной строке bash будет указано
поскольку файл /etc/passwd еще не создан.

PATH.

Это означает, что

I have no name!.

Это нормально,

Примечание
Важно, чтобы все команды в оставшейся части этой главы и следующих главах выполнялись из
среды chroot. Если вы покидаете эту среду по какой-либо причине (например, при перезагрузке),
убедитесь, что файловые системы виртуального ядра смонтированы, как описано в Раздел 7.3.1,
«Монтирование и заполнение /dev» и Раздел 7.3.2, «Монтирование виртуальных файловых систем
ядра», а затем войдите в среду chroot для продолжения установки.

7.5. Создание каталогов
Пришло время создать полную структуру каталогов в файловой системе LFS.

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

Линукс с нуля - Версия 12.1
Создайте несколько каталогов, которые не входили в ограниченный набор, используемый в предыдущих
главах, выполнив следующую команду:
mkdir -pv /{boot,home,mnt,opt,srv}

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

-pv
-pv
-pv
-pv
-pv
-pv
-pv
-pv
-pv
-pv

/etc/{opt,sysconfig}
/lib/firmware
/media/{floppy,cdrom}
/usr/{,local/}{include,src}
/usr/local/{bin,lib,sbin}
/usr/{,local/}share/{color,dict,doc,info,locale,man}
/usr/{,local/}share/{misc,terminfo,zoneinfo}
/usr/{,local/}share/man/man{1..8}
/var/{cache,local,log,mail,opt,spool}
/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

7.5.1. Примечание о соответствии требованиям FHS
Это дерево каталогов основано на стандарте иерархии файловой системы (FHS) (доступен по адресу
https://refspecs.linuxfoundation.org/fhs.shtml). FHS также указывает, что наличие некоторых каталогов
необязательно, например, /usr/local/games
и /usr/share/games . В LFS мы создаем только те каталоги,
которые действительно необходимы. Однако, не стесняйтесь создавать дополнительные каталоги, если
хотите.

Предупреждение
FHS не требует наличия каталога /usr/lib64 , и редакторы LFS решили его не использовать.
Чтобы инструкции в LFS и BLFS работали корректно, крайне важно, чтобы этот каталог не
существовал. Время от времени вам следует проверять, что он не существует, потому что его легко
создать непреднамеренно, и это, вероятно, приведет к поломке вашей системы.

7.6. Создание основных файлов и символических ссылок
Исторически сложилось, что Linux хранит список примонтированных файловых систем в файле /etc/
mtab . Современные ядра хранят этот список внутри себя и предоставляют его пользователю через файловую
систему /proc . Чтобы удовлетворять требованиям утилит, которые ожидают наличия /etc/mtab , создайте
следующую символическую ссылку:
ln -sv /proc/self/mounts /etc/mtab

101

Линукс с нуля - Версия 12.1
Создайте файл /etc/hosts , на который будут ссылаться некоторые наборы тестов, а также один из файлов
конфигурации Perl:
cat > /etc/hosts /etc/passwd /etc/group > /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
chgrp
chmod
chmod

/var/log/{btmp,lastlog,faillog,wtmp}
-v utmp /var/log/lastlog
-v 664 /var/log/lastlog
-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 года").
Многие пакеты перестали их использовать, другие же, собираются прекратить их использование.
Вероятно, лучше считать их устаревшими.

103

Линукс с нуля - Версия 12.1

7.7. Gettext-0.22.4
Пакет Gettext содержит утилиты для интернационализации и локализации. Они позволяют компилировать
программы с поддержкой NLS (Native Language Support), позволяя им выводить сообщения на родном языке
пользователя.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

1.1 SBU
306 MB

7.7.1. Установка пакета Gettext
Для временного набора инструментов нам нужно установить только три программы из пакета Gettext.
Подготовьте Gettext к компиляции:
./configure --disable-shared

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

В настоящее время нам не нужно устанавливать какие-либо общие библиотеки Gettext, поэтому нет
необходимости их собирать.
Скомпилируйте пакет:
make

Установите программы msgfmt, msgmerge, и xgettext programs:
cp -v gettext-tools/src/{msgfmt,msgmerge,xgettext} /usr/bin

Подробная информация об этом пакете находится в Раздел 8.32.2, «Содержимое пакета Gettext.»

104

Линукс с нуля - Версия 12.1

7.8. Bison-3.8.2
Пакет Bison содержит генератор синтаксического анализа.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.2 SBU
57 MB

7.8.1. Установка пакета Bison
Подготовьте Bison к компиляции:
./configure --prefix=/usr \
--docdir=/usr/share/doc/bison-3.8.2

Значение нового параметра конфигурации:
--docdir=/usr/share/doc/bison-3.8.2

Этот параметр указывает системе сборки установить документацию к bison в каталог с версией пакета.
Скомпилируйте пакет:
make

Установите пакет:
make install

Подробная информация об этом пакете находится в Раздел 8.33.2, «Содержимое пакета Bison.»

105

Линукс с нуля - Версия 12.1

7.9. Perl-5.38.2
Пакет Perl содержит практический язык для извлечения данных и составления отчётов (Practical Extraction
and Report Language).
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.6 SBU
280 MB

7.9.1. Установка пакета Perl
Подготовьте Perl к компиляции:
sh Configure -des
\
-Dprefix=/usr
\
-Dvendorprefix=/usr
\
-Duseshrplib
\
-Dprivlib=/usr/lib/perl5/5.38/core_perl
\
-Darchlib=/usr/lib/perl5/5.38/core_perl
\
-Dsitelib=/usr/lib/perl5/5.38/site_perl
\
-Dsitearch=/usr/lib/perl5/5.38/site_perl
\
-Dvendorlib=/usr/lib/perl5/5.38/vendor_perl \
-Dvendorarch=/usr/lib/perl5/5.38/vendor_perl

Значение новых опций Configure:
-des

Это комбинация из трех параметров: -d использует значения по умолчанию для всех элементов; -e
обеспечивает выполнение всех задач; -s отключает несущественные выходные данные.
-Dvendorprefix=/usr

Параметр гарантирует, что perl знает, как указать пакетам, где они должны устанавливать свои модули
Perl.
-Duseshrplib

Собрать библиотеку libperl, необходимую некоторым модулям Perl, как общую библиотеку вместо
статической.
-Dprivlib,-Darchlib,-Dsitelib,...

Эти настройки определяют, где Perl ищет установленные модули. Редакторы LFS решили поместить их
в структуру каталогов, основанную на MAJOR.MINOR версии Perl (5.38), что позволяет обновлять Perl
до более новых уровней исправлений (уровень исправления - это последняя разделенная точками часть
в строке полной версии, например 5.38.2) без необходимости переустанавливать все модули.
Скомпилируйте пакет:
make

Установите пакет:
make install

Подробная информация об этом пакете находится в Раздел 8.42.2, «Содержимое пакета Perl.»

106

Линукс с нуля - Версия 12.1

7.10. Python-3.12.2
Пакет Python 3 содержит среду разработчика Python. Его можно использовать для объектноориентированного программирования, написания скриптов, прототипирования больших программ и
разработка целых приложений. Python — это интерпретируемый язык программирования.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.5 SBU
598 MB

7.10.1. Установка пакета Python
Примечание
Существует два пакета, имена которых начинаются с префикса «python». Сейчас необходимо
распаковать файл Python-3.12.2.tar.xz
(обратите внимание на заглавную первую букву).
Подготовка Python к компиляции:
./configure --prefix=/usr
\
--enable-shared \
--without-ensurepip

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

Этот параметр отключает установку статичных библиотек.
--without-ensurepip

Этот параметр отключает установщик пакетов Python, который на данном этапе не нужен.
Скомпилируйте пакет:
make

Примечание
Некоторые модули Python 3 не могут быть собраны сейчас, потому что зависимости еще не
установлены. Для модуля ssl выводится сообщение Python требует OpenSSL 1.1.1 или новее .
Сообщение следует проигнорировать. Просто убедитесь, что команда make верхнего уровня не
завершилась ошибкой. Дополнительные модули сейчас не нужны, и они будут собраны в Глава 8.
Установите пакет:
make install

Подробная информация об этом пакете находится в Раздел 8.51.2, «Содержимое пакета Python 3.»

107

Линукс с нуля - Версия 12.1

7.11. Texinfo-7.1
Пакет Texinfo содержит программы для чтения, записи и преобразования информационных страниц.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.2 SBU
130 MB

7.11.1. Установка пакета Texinfo
Подготовьте Texinfo к компиляции:
./configure --prefix=/usr

Скомпилируйте пакет:
make

Установите пакет:
make install

Подробная информация об этом пакете находится в Раздел 8.71.2, «Содержимое пакета Texinfo.»

108

Линукс с нуля - Версия 12.1

7.12. Util-linux-2.39.3
Пакет Util-linux содержит различные служебные программы. Среди них утилиты для работы с файловыми
системами, консолями, разделами и сообщениями.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.2 SBU
172 MB

7.12.1. Установка пакета Util-linux
FHS рекомендует использовать каталог /var/lib/hwclock
местоположения для файла adjtime. Создайте этот каталог:

вместо каталога

/etc

в качестве

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

109

Линукс с нуля - Версия 12.1
Подробная информация об этом пакете находится в Раздел 8.78.2, «Содержимое пакета Util-linux.»

110

Линукс с нуля - Версия 12.1

7.13. Очистка и сохранение временной системы
7.13.1. Очистка
Во-первых, удалите установленную документацию, чтобы предотвратить ее попадание в конечную систему
и сэкономить около 35 МБ места:
rm -rf /usr/share/{info,man,doc}/*

Во-вторых, в современных системах Linux файлы .la библиотеки libtool полезны только для libltdl. Никакие
библиотеки в LFS не загружаются с помощью libltdl. Известно, что некоторые файлы .la могут привести к
сбою во время сборки пакетов BLFS. Удалите эти файлы сейчас:
find /usr/{lib,libexec} -name \*.la -delete

Сейчас размер системы составляет около 3 ГБ, однако каталог /tools больше не понадобится. Удалите его,
чтобы освободить около 1 ГБ дискового пространства:
rm -rf /tools

7.13.2. Резервное копирование
На данный момент основные программы и библиотеки собраны, и ваша система LFS находится в хорошем
состоянии. Можно создать резервную копию вашей системы для последующего повторного использования.
В случае фатальных сбоев в следующих главах часто оказывается, что удалить все и начать заново (более
осторожно) — лучший вариант восстановления. К сожалению, все временные файлы также будут удалены.
Чтобы не тратить лишнее время на повторную сборку того, что было успешно собрано, полезно создать
резервную копию текущей системы LFS.

Примечание
Все остальные шаги в этом разделе являются необязательными. Тем не менее, как только вы начнете
устанавливать пакеты в Глава 8, временные файлы будут перезаписаны. Поэтому рекомендуется
создание резервной копии текущей системы, как описано ниже.
Следующие шаги выполняются вне среды chroot. Это означает, что прежде чем продолжить вы должны
покинуть среду chroot. Причиной этого является то, что необходимо получить доступ к расположению
файловой системы за пределами среды chroot для хранения/чтения архива резервных копий, который не
должен размещаться в иерархии $LFS.
Если вы решили сделать резервную копию, покиньте среду chroot:
exit

Важно
Все следующие инструкции выполняются пользователем root в вашей хост-системе. Будьте
особенно внимательны к командам, которые вы собираетесь запускать, поскольку ошибки,
допущенные здесь, могут изменить вашу хост-систему. Имейте в виду, что переменная окружения
LFS по умолчанию установлена для пользователя lfs, но может не быть установлена для root.
Всякий раз, когда команды должны выполняться от root, убедитесь, что вы установили переменную
LFS.
Это обсуждалось в Раздел 2.6, «Установка переменной $LFS».
111

Линукс с нуля - Версия 12.1
Перед созданием резервной копии размонтируйте виртуальные файловые системы:
mountpoint -q $LFS/dev/shm && umount $LFS/dev/shm
umount $LFS/dev/pts
umount $LFS/{sys,proc,run,dev}

Убедитесь, что у вас есть как минимум 1 ГБ свободного места на диске (исходные tar-архивы будут включены
в архив резервных копий) в файловой системе, содержащей каталог, в котором вы создаете архив резервных
копий.
Обратите внимание, что в приведенных ниже инструкциях указан домашний каталог пользователя root хостсистемы, который обычно находится в корневой файловой системе. Замените $HOME каталогом на ваш выбор,
если вы не хотите, чтобы резервная копия хранилась в домашнем каталоге пользователя root.
Создайте архив резервной копии, выполнив следующую команду:

Примечание
Поскольку архив резервной копии сжимается, процесс занимает довольно много времени (более
10 минут) даже на достаточно быстрой системе.
cd $LFS
tar -cJpf $HOME/lfs-temp-tools-12.1.tar.xz .

Примечание
Если вы переходите к главе 8, не забудьте повторно войти в среду chroot, как описано в разделе
«Важно» ниже.

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

Предупреждение
Следующие команды чрезвычайно опасны. Если вы запустите команду rm -rf ./* от
имени пользователя root и не перейдете в каталог $LFS или переменная окружения LFS
не будет установлена для пользователя root, это уничтожит всю вашу хост-систему. ВЫ
ПРЕДУПРЕЖДЕНЫ.
cd $LFS
rm -rf ./*
tar -xpf $HOME/lfs-temp-tools-12.1.tar.xz

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

Важно
Если вы покинули среду chroot, чтобы создать резервную копию или перезапустить сборку с
помощью восстановления, не забудьте проверить, что виртуальные файловые системы все еще
смонтированы (findmnt | grep $LFS). Если они не смонтированы, перемонтируйте их сейчас, как
описано в Раздел 7.3, «Подготовка виртуальных файловых систем ядра», и повторно войдите в
среду chroot (см. Раздел 7.4, «Вход в окружение Chroot»), прежде чем продолжить.
112

Линукс с нуля - Версия 12.1

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

Линукс с нуля - Версия 12.1

Глава 8. Установка базового системного
программного обеспечения
8.1. Введение
В этой главе мы приступаем к сборке конечной системы LFS.
Установка программного обеспечения проста. Хотя во многих случаях инструкции по установке можно было
бы сделать короче и универсальнее, мы решили предоставить полные инструкции для каждого пакета, чтобы
свести к минимуму вероятность ошибок. Ключом к пониманию того, что заставляет систему Linux работать,
является знание того, для чего используется каждый пакет и зачем он вам (или системе) может понадобиться.
Мы не рекомендуем использовать оптимизации. С ними программа может работать немного быстрее, но
также они могут вызвать сложности при компиляции и проблемы при запуске программы. Если пакет
не компилируется при использовании оптимизации, попробуйте скомпилировать его без оптимизации и
посмотрите, решает ли это проблему. Даже если пакет компилируется при использовании оптимизации,
существует риск, что он может быть скомпилирован неправильно из-за сложных взаимодействий между
кодом и инструментами сборки. Также обратите внимание, что параметры -march и -mtune , не
тестировались со значениями отличными от указанных в книге. Это может вызвать проблемы с пакетами
набора инструментов (Binutils, GCC и Glibc). Небольшие потенциальные плюсы, достигаемые за счет
оптимизации, часто перевешиваются рисками. Тем кто собирает LFS впервые рекомендуется делать это без
пользовательских оптимизаций.
С другой стороны, мы сохраняем оптимизацию включенной в конфигурации пакетов по умолчанию.
Кроме того, иногда мы явно включаем оптимизированную конфигурацию, предоставляемую пакетом, но не
включенную по умолчанию. Сопровождающие пакета уже протестировали эти конфигурации и считают их
безопасными, поэтому маловероятно, что они сломают сборку. Как правило, конфигурация по умолчанию
уже включает параметры -O2 или -O3 , поэтому результирующая система по-прежнему будет работать очень
быстро без какой-либо пользовательской оптимизации и в то же время будет стабильной.
Перед инструкцией по установке на каждой странице представлена информация о пакете, включая краткое
описание того, что он содержит, примерное время, необходимое для сборки, и сколько места на диске
требуется в процессе сборки. После инструкции по установке идет список программ и библиотек (вместе с
кратким описанием), которые устанавливает пакет.

Примечание
Для всех пакетов в Глава 8 значения SBU и требуемое дисковое пространство указано с учетом
тестов. Значения SBU были рассчитаны с использованием четырех ядер ЦП (-j4) для всех операций,
если не указано иное.

8.1.1. О библиотеках
Как правило, редакторы LFS не рекомендуют собирать и устанавливать статические библиотеки.
Большинство статических библиотек устарели в современной системе Linux. Кроме того, линковка
статической библиотеки с программой может быть вредна. Если для устранения проблемы безопасности
требуется обновление библиотеки, все программы, использующие статическую библиотеку, необходимо
будет повторно перелинковать с новой библиотекой. Поскольку использование статических библиотек не
всегда очевидно, соответствующие программы (и процедуры, необходимые для линковки) могут быть даже
неизвестны.
114

Линукс с нуля - Версия 12.1
В инструкциях этой главы мы удаляем или отключаем установку большинства статических библиотек.
Обычно это делается путем передачи параметра --disable-static
при выполнении configure. Иногда
необходимо использовать альтернативные методы. В некоторых случаях, в частности в пакетах Glibc и GCC,
использование статических библиотек остается важным элементом процесса сборки пакетов.
Более подробное обсуждение библиотек смотрите Библиотеки: статические или общие? в книге BLFS.

8.2. Управление пакетами
Управление пакетами — часто cпрашиваемое дополнение к книге LFS. Менеджер пакетов позволяет
отслеживать установку файлов, упрощая удаление и обновление пакетов. Хороший менеджер пакетов
также будет обрабатывать конфигурационные файлы, чтобы сохранить пользовательские настройки при
переустановке или обновлении пакета. Прежде чем вы начнете задаваться вопросом, НЕТ—в этом разделе не
будет ни говориться, ни рекомендоваться какой-либо конкретный менеджер пакетов. Что он действительно
предоставляет, так это обзор наиболее популярных методов и того, как они работают. Идеальным
менеджером пакетов для вас может быть один из этих методов или комбинация двух и более методов. В этом
разделе кратко упоминаются проблемы, которые могут возникнуть при обновлении пакетов.
Некоторые причины, по которым менеджер пакетов не упоминается в LFS или BLFS представлены ниже:
• Рассмотрение управления пакетами отвлекает внимание от целей этих книг—обучения тому, как
строится система Linux.
• Существует множество решений для управления пакетами, каждое из которых имеет свои сильные и
слабые стороны. Трудно найти такое, которое удовлетворит всех.
Есть несколько советов, написанных на тему управления пакетами. Посетите проект Советы возможно вы
найдете решение, которое соответствует вашим потребностям.

8.2.1. Проблемы с обновлением
Менеджер пакетов упрощает обновление до более новых версий после их выпуска. Как правило, инструкции
в книгах LFS и BLFS можно использовать для обновления до более новых версий. Вот некоторые моменты,
о которых следует помнить при обновлении пакетов, особенно в работающей системе.
• Если нужно обновить ядро Linux (например, с 5.10.17 до 5.10.18 или 5.11.1), дополнительно
пересобирать ничего не нужно. Система продолжит нормально работать благодаря четко определенной
границе между ядром и пользовательским пространством. В частности, заголовки Linux API не нужно
обновлять вместе с ядром. Вам просто нужно перезагрузить систему, чтобы использовать обновленное
ядро.
• Если необходимо обновить Glibc до более новой версии (например, с Glibc-2.36 до Glibc-2.39)
необходимо выполнить некоторые дополнительные действия, чтобы избежать поломки системы.
Подробности читайте в Раздел 8.5, «Glibc-2.39».
• Если пакет, содержащий общую библиотеку, обновляется и имя библиотеки изменилось, то любые
пакеты, динамически связанные с библиотекой, необходимо перекомпилировать, чтобы связать с
более новой библиотекой. (Обратите внимание, что между версией пакета и именем библиотеки нет
никакой связи.) Например, рассмотрим пакет foo-1.2.3, который устанавливает общую библиотеку
с именем libfoo.so.1 . Предположим, вы обновили пакет до более новой версии foo-1.2.4, которая
устанавливает общую библиотеку с именем libfoo.so.2 , все пакеты, которые динамически связаны с
libfoo.so.1 , должны быть перекомпилированы для связи с libfoo.so.2 , чтобы использовать новую
версию библиотеки. Вы не должны удалять старые библиотеки, пока все зависимые пакеты не будут
перекомпилированы.
• Если пакет (прямо или косвенно) связан как со старым, так и с новым именем общей библиотеки
(например, пакет ссылается как на libfoo.so.2 , так и на libbar.so.1 , в то время как последний
ссылается на libfoo.so.3 ), пакет может работать неправильно, поскольку разные версии общей
115

Линукс с нуля - Версия 12.1
библиотеки содержат несовместимые определения для некоторых имен символов. Это может быть
вызвано перекомпиляцией некоторых, но не всех, пакетов, связанных со старой общей библиотекой,
после обновления пакета, предоставляющего общую библиотеку. Чтобы избежать этой проблемы,
пользователям необходимо как можно скорее пересобрать каждый пакет, связанный с общей
библиотекой, с обновленной версией (например, с libfoo.so.2 на libfoo.so.3).
• Если пакет, содержащий общую библиотеку, обновляется, а имя библиотеки не меняется, но
уменьшается номер версии файла библиотеки (например, библиотека по-прежнему называется libfoo.
so.1 , но имя файла библиотеки изменилось с libfoo.so.1.25
на libfoo.so.1.24 ), следует удалить
файл библиотеки ранее установленной версии (в данном случае libfoo.so.1.25 ). В противном
случае, команда ldconfig (запущенная самостоятельно с помощью командной строки или при установке
какого-либо пакета) приведёт к сбросу символической ссылки libfoo.so.1 , которая будет указывать на
старый файл библиотеки, потому что кажется, что она имеет «более новую» версию, поскольку её номер
версии больше. Такая ситуация может произойти, если вам нужно понизить версию пакета или авторы
изменили схему управления версиями файлов библиотеки.
• Если пакет, содержащий общую библиотеку, обновляется, а имя библиотеки не меняется, но устраняется
серьезная проблема (особенно уязвимость в системе безопасности), необходимо перезапустить все
работающие программы, связанные с общей библиотекой. Следующая команда, запущенная от имени
пользователя root после завершения обновления, выведет список программ, которые использует старые
версии этих библиотек (замените libfoo именем библиотеки):
grep -l 'libfoo.*deleted' /proc/*/maps | tr -cd 0-9\\n | xargs -r ps u

Если для доступа к системе используется OpenSSH и он связан с обновленной библиотекой, вам
необходимо перезапустить службу sshd, затем выйти из системы, снова войти в систему и повторно
выполнить предыдущую команду, чтобы убедиться, что удаленные библиотеки более не используются.
• Если исполняемая программа или библиотека перезаписаны, процессы, использующие код или данные
из них, могут завершиться сбоем. Правильный способ обновитьпрограмму или общую библиотеку, не
вызывая сбоя процесса, - это сначала удалить его, а затем установить новую версию. Команда install,
предоставляемая Coreutils, уже реализовала это, и большинство пакетов используют ее для установки
двоичных файлов и библиотек. Это означает, что большую часть времени вас не будет беспокоить эта
проблема. Однако процесс установки некоторых пакетов (в частности, SpiderMonkey в BLFS) просто
перезаписывает файл, если он существует, и вызывает сбой. Поэтому безопаснее сохранить свою работу
и закрыть ненужные запущенные программы перед обновлением пакета.

8.2.2. Методы управления пакетами
Ниже приведены некоторые распространенные методы управления пакетами. Прежде чем принять решение
о менеджере пакетов, проведите исследование различных методов, особенно недостатки каждой конкретной
схемы.

8.2.2.1. Всё у меня в голове!
Да, это метод управления пакетами. Некоторым людям не нужен менеджер пакетов, потому что они хорошо
знакомы с пакетами и знают, какие файлы устанавливаются каждым пакетом. Некоторым пользователям
также не требуется какое-либо управление пакетами, поскольку они планируют пересобирать всю систему
при каждом изменении пакета.

8.2.2.2. Установка в отдельные каталоги
Это упрощенный метод управления пакетами, для которого не требуется специальная программа
управления. Каждый пакет устанавливается в отдельный каталог. Например, пакет foo-1.1 устанавливается
в /opt/foo-1.1
, а символическая ссылка создается из /opt/foo в /opt/foo-1.1
. Когда появляется
новая версия foo-1.2, она устанавливается в /opt/foo-1.2
и предыдущая символическая ссылка
заменяется символической ссылкой на новую версию.
116

Линукс с нуля - Версия 12.1
Переменные окружения, такие как
файл конфигурации /etc/ld.so.conf
подкаталоги в /opt/foo-x.y
.

PATH, MANPATH, INFOPATH, PKG_CONFIG_PATH

, CPPFLAGS, LDFLAGS и
, возможно, потребуется расширить, включив соответствующие

Этот подход используется в книге BLFS для установки некоторых очень больших пакетов, чтобы упростить
их обновление. Если вы устанавливаете много таких пакетов, эта схема становится неуправляемой.
Некоторые пакеты (например, заголовки Linux API и Glibc) могут плохо работать с такой структурой.
Никогда не используйте её в масштабах всей системы.

8.2.2.3. Управление пакетами с использованием символических ссылок
Это разновидность предыдущей техники.Каждый пакет устанавливается аналогично, но вместо создания
символической ссылки на общее имя пакета, каждому файлу создаётся символическая ссылка в иерархии
каталогов /usr . Это исключает необходимость модификации значений переменных окружения. Хотя такие
ссылки могут быть созданы пользователем, многие менеджеры пакетов используют именной такой подход.
Наиболее популярные из них - Stow, Epkg, Graft и Depot.
Установку нужно сымитировать, чтобы пакет думал, что он установлен в /usr , хотя на самом деле он
установлен в иерархии /usr/pkg . Установка таким способом обычно является нетривиальной задачей.
Например, предположим, что вы устанавливаете пакет libfoo-1.1. Следующие инструкции могут привести
к неправильной установке пакета:
./configure --prefix=/usr/pkg/libfoo/1.1
make
make install

Установка будет выполнена, но зависимые пакеты не смогут ссылаться на libfoo. Если вы скомпилируете
пакет, который ссылается на libfoo, вы заметите, что он связан с /usr/pkg/libfoo/1.1/lib/libfoo.so.
1 вместо /usr/lib/libfoo.so.1
, как вы ожидаете. Правильный подход заключается в использовании
переменной DESTDIR для управления установкой. Этот подход работает следующим образом:
./configure --prefix=/usr
make
make DESTDIR=/usr/pkg/libfoo/1.1 install

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

8.2.2.4. На основе временной метки
В этом методе файлу присваивается временная метка перед установкой пакета. После установки простое
использование команды find с соответствующими параметрами может создать журнал всех файлов,
установленных после создания файла с временной метки. Менеджером пакетов, использующим этот подход,
является install-log.
Хотя преимущество этой схемы в том, что она проста, у нее есть два недостатка. Если во время
установки, файлы устанавливаются с отметкой времени, отличной от текущего времени, эти файлы не будут
отслеживаться менеджером пакетов. Кроме того, эта схема может использоваться только при установке
пакетов по одному. Журналы ненадежны, если два пакета устанавливаются одновременно на двух разных
консолях.

8.2.2.5. Отслеживание сценариев установки
При таком подходе, записываются команды, выполняемые сценариями установки. Есть два метода, которые
можно использовать:
117

Линукс с нуля - Версия 12.1
Переменная среды LD_PRELOAD может быть установлена так, чтобы она указывала на библиотеку, которую
нужно предварительно загрузить перед установкой. Во время установки эта библиотека отслеживает
устанавливаемые пакеты, присоединяясь к различным исполняемым файлам, таким как cp, install, mv,
и отслеживая системные вызовы, изменяющие файловую систему. Чтобы этот подход работал, все
исполняемые файлы должны быть динамически связаны без битов suid или sgid. Предварительная загрузка
библиотеки может вызвать некоторые нежелательные побочные эффекты во время установки. Поэтому
рекомендуется выполнить некоторые тесты, чтобы убедиться, что менеджер пакетов ничего не сломает и
что он регистрирует все соответствующие файлы.
Другой метод заключается в использовании strace, который регистрирует все системные вызовы, сделанные
во время выполнения сценариев установки.

8.2.2.6. Создание архивов пакетов
В этой схеме установка пакета имитируется в отдельном дереве, как описано ранее в разделе управление
пакетами с использованием символических ссылок. После установки из установленных файлов создается
архив пакета. Затем этот архив используется для установки пакета на локальный компьютер или даже на
другие компьютеры.
Этот подход используется большинством менеджеров пакетов, имеющихся в коммерческих дистрибутивах.
Примерами менеджеров пакетов, которые следуют этому подходу, являются RPM (который, кстати,
требуется согласно спецификации Linux Standard Base Specification), pkg-utils, apt Debian и система Portage
Gentoo. Описание того, как использовать этот стиль управления пакетами для систем LFS, находится по
адресу https://mirror.linuxfromscratch.ru/hints/downloads/files/fakeroot.txt.
Создание файлов пакетов, содержащих информацию о зависимостях, является сложной задачей и выходит
за рамки LFS.
Slackware использует систему на основе tar для архивов пакетов. Эта система намеренно не обрабатывает
зависимости пакетов, как это делают более сложные менеджеры пакетов. Подробнее об управлении
пакетами Slackware см. https://www.slackbook.org/html/package-management.html.

8.2.2.7. Пользовательское управление пакетами
Эта схема, уникальная для LFS, была разработана Маттиасом Бенкманом и доступна в проекте
Hints. В этой схеме каждый пакет устанавливается отдельным пользователем в стандартные папки.
Файлы, принадлежащие пакету, легко идентифицируются путем проверки идентификатора пользователя.
Особенности и недостатки этого подхода слишком сложны, чтобы описывать их в этом разделе. Для
получения более подробной информации, пожалуйста, ознакомьтесь с советами по адресу https://mirror.
linuxfromscratch.ru/hints/downloads/files/more_control_and_pkg_man.txt.

8.2.3. Развертывание LFS на нескольких системах
Одним из преимуществ системы LFS является отсутствие файлов, зависящих от положения файлов на диске.
Клонировать сборку LFS на другой компьютер с той же архитектурой, что и у базовой системы, так же
просто, как использовать tar для архивации раздела LFS, содержащем корневой каталог (около 900 МБ в
несжатом виде для базовой сборки LFS), скопировать этот файл по сети или с помощью CD / USB носителя
в новую систему и распаковать его. После этого необходимо изменить несколько конфигурационных
файлов. Файлы, которые, возможно, потребуется изменить представлены в списке ниже: /etc/hosts , /etc/
fstab , /etc/passwd , /etc/group , /etc/shadow , /etc/ld.so.conf
, /etc/sysconfig/rc.site
, /etc/
sysconfig/network , и /etc/sysconfig/ifconfig.eth0
.
Возможно, потребуется собрать собственное ядро для новой системы в зависимости от различий в
системном оборудовании и исходной конфигурации ядра.
118

Линукс с нуля - Версия 12.1

Примечание
Поступали некоторые сообщения о проблемах при копировании между похожими, но не
идентичными архитектурами. Например, набор инструкций для Intel не идентичен набору
инструкций для процессора AMD, и более поздние версии некоторых процессоров могут содержать
инструкции, недоступные в более ранних версиях.
Наконец, новую систему необходимо сделать загрузочной так, как это описано в Раздел 10.4, «Использование
GRUB для настройки процесса загрузки».

119

Линукс с нуля - Версия 12.1

8.3. Man-pages-6.06
Пакет Man-pages содержит более 2400 справочных руководств.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

менее 0.1 SBU
33 MB

8.3.1. Установка пакета Man-pages
Удалите две справочные страницы для функций хэширования паролей. Libxcrypt предоставит улучшенную
версию этих справочных страниц:
rm -v man3/crypt*

Установите пакет Man-pages выполнив команду:
make prefix=/usr install

8.3.2. Содержимое пакета Man-pages
Установленные файлы:

различные справочные страницы

Краткое описание
man pages

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

120

Линукс с нуля - Версия 12.1

8.4. Iana-Etc-20240125
Пакет Iana-Etc предоставляет данные для сетевых служб и протоколов.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

менее 0.1 SBU
4.8 MB

8.4.1. Установка пакета Iana-Etc
Для этого пакета необходимо лишь скопировать нужные файлы:
cp services protocols /etc

8.4.2. Содержимое пакета Iana-Etc
Установленные файлы:

/etc/protocols и /etc/services

Краткое описание
/etc/protocols

Описывает различные интернет-протоколы DARPA, которые доступны из подсистемы
TCP/IP

/etc/services

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

121

Линукс с нуля - Версия 12.1

8.5. Glibc-2.39
Пакет Glibc содержит основную библиотеку C. Эта библиотека предоставляет основные процедуры для
выделения памяти, поиска в каталогах, открытия и закрытия файлов, чтения и записи файлов, обработки
строк, сопоставления с образцом, арифметики и так далее
Приблизительное
время сборки:
Требуемое дисковое
пространство:

12 SBU
3.1 GB

8.5.1. Установка пакета Glibc
Некоторые программы Glibc используют не совместимый с FHS каталог /var/db для хранения своих
данных во время выполнения. Примените следующий патч, чтобы эти программы хранили свои данные в
каталогах, совместимых с FHS:
patch -Np1 -i ../glibc-2.39-fhs-1.patch

Документация Glibc рекомендует выполнять компиляцию в отдельном каталоге:
mkdir -v build
cd
build

Убедитесь, что утилиты ldconfig и sln будут установлены в /usr/sbin :
echo "rootsbindir=/usr/sbin" > configparms

Подготовьте Glibc к компиляции:
../configure --prefix=/usr
--disable-werror
--enable-kernel=4.19
--enable-stack-protector=strong
--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
122

Линукс с нуля - Версия 12.1
Скомпилируйте пакет:
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= make test t=. Например, TIMEOUTFACTOR=10 make test
t=nss/tst-nss-files-hosts-multi перезапустит nss/tst-nss-files-hosts-multi, увеличив начальный таймаут в 10
раз.
• Кроме того, некоторые тесты могут завершиться неудачно при использовании относительно старой
модели процессора (например, elf/tst-cpu-features-cpuinfo) или версии ядра хоста (например, stdlib/tstarc4random-thread).
На этапе установки Glibc будет жаловаться на отсутствие файла /etc/ld.so.conf
сообщение, предотвратить его появление можно с помощью команды:

, хотя это безобидное

touch /etc/ld.so.conf

Исправьте Makefile, чтобы пропустить устаревшую проверку работоспособности, которая завершается
неудачей в современной конфигурации Glibc:
sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile

123

Линукс с нуля - Версия 12.1

Важно
При обновлении 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

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

124

Линукс с нуля - Версия 12.1
Отдельные локали можно установить с помощью программы localedef. Например, вторая команда localedef
приведенная ниже, объединяет определение независимой от набора символов локали /usr/share/i18n/
locales/cs_CZ
с набором символов /usr/share/i18n/charmaps/UTF-8.gz
и добавляет результат
в файл /usr/lib/locale/locale-archive
. Следующие инструкции установят минимальный набор
локалей, необходимый для оптимального охвата тестов
mkdir -pv
localedef
localedef
localedef
localedef
localedef
localedef
localedef
localedef
localedef
localedef
localedef
localedef
localedef
localedef
localedef
localedef
localedef
localedef
localedef
localedef
localedef
localedef
localedef
localedef
localedef
localedef
localedef
localedef
localedef
localedef
localedef
localedef
localedef
localedef
localedef

/usr/lib/locale
-i C -f UTF-8 C.UTF-8
-i cs_CZ -f UTF-8 cs_CZ.UTF-8
-i de_DE -f ISO-8859-1 de_DE
-i de_DE@euro -f ISO-8859-15 de_DE@euro
-i de_DE -f UTF-8 de_DE.UTF-8
-i el_GR -f ISO-8859-7 el_GR
-i en_GB -f ISO-8859-1 en_GB
-i en_GB -f UTF-8 en_GB.UTF-8
-i en_HK -f ISO-8859-1 en_HK
-i en_PH -f ISO-8859-1 en_PH
-i en_US -f ISO-8859-1 en_US
-i en_US -f UTF-8 en_US.UTF-8
-i es_ES -f ISO-8859-15 es_ES@euro
-i es_MX -f ISO-8859-1 es_MX
-i fa_IR -f UTF-8 fa_IR
-i fr_FR -f ISO-8859-1 fr_FR
-i fr_FR@euro -f ISO-8859-15 fr_FR@euro
-i fr_FR -f UTF-8 fr_FR.UTF-8
-i is_IS -f ISO-8859-1 is_IS
-i is_IS -f UTF-8 is_IS.UTF-8
-i it_IT -f ISO-8859-1 it_IT
-i it_IT -f ISO-8859-15 it_IT@euro
-i it_IT -f UTF-8 it_IT.UTF-8
-i ja_JP -f EUC-JP ja_JP
-i ja_JP -f SHIFT_JIS ja_JP.SJIS 2> /dev/null || true
-i ja_JP -f UTF-8 ja_JP.UTF-8
-i nl_NL@euro -f ISO-8859-15 nl_NL@euro
-i ru_RU -f KOI8-R ru_RU.KOI8-R
-i ru_RU -f UTF-8 ru_RU.UTF-8
-i se_NO -f UTF-8 se_NO.UTF-8
-i ta_IN -f UTF-8 ta_IN.UTF-8
-i tr_TR -f UTF-8 tr_TR.UTF-8
-i zh_CN -f GB18030 zh_CN.GB18030
-i zh_HK -f BIG5-HKSCS zh_HK.BIG5-HKSCS
-i zh_TW -f UTF-8 zh_TW.UTF-8

Кроме того, установите локаль для вашей страны, языка и набора символов.
В качестве альтернативы, установите сразу все локали перечисленные в файле glibc-2.39/localedata/
SUPPORTED (он включает все локали из списка выше и многие другие), выполнив команду:
make localedata/install-locales

Затем используйте команду localedef для создания и установки локалей, не перечисленных в файле glibc2.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.
125

Линукс с нуля - Версия 12.1

8.5.2. Настройка Glibc
8.5.2.1. Добавление nsswitch.conf
Необходимо создать файл
работает в сетевой среде.

/etc/nsswitch.conf

Создайте новый фай /etc/nsswitch.conf

, потому что настроенный по умолчанию Glibc плохо

, выполнив следующие действия:

cat > /etc/nsswitch.conf /etc/ld.so.conf > /etc/ld.so.conf Установите заголовочные файлы Tcl. Они потребуются для следующего пакета - Expect.
make install-private-headers

142

Линукс с нуля - Версия 12.1
Теперь создайте необходимую символическую ссылку:
ln -sfv tclsh8.6 /usr/bin/tclsh

Переименуйте справочную страницу, которая конфликтует со справочной страницей Perl:
mv /usr/share/man/man3/{Thread,Tcl_Thread}.3

При необходимости установите документацию, выполнив следующие команды:
cd ..
tar -xf ../tcl8.6.13-html.tar.gz --strip-components=1
mkdir -v -p /usr/share/doc/tcl-8.6.13
cp -v -r ./html/* /usr/share/doc/tcl-8.6.13

8.15.2. Содержимое пакета Tcl
Установленные
программы:
Установленные
библиотеки:

tclsh (ссылка на tclsh8.6) и tclsh8.6
libtcl8.6.so и libtclstub8.6.a

Краткое описание
tclsh8.6

Командная оболочка Tcl

tclsh

Ссылка на tclsh8.6

libtcl8.6.so

Библиотека Tcl

libtclstub8.6.a

Библиотека-заглушка Tcl

143

Линукс с нуля - Версия 12.1

8.16. Expect-5.45.4
Пакет Expect содержит инструменты для автоматизации работы интерактивных приложений, таких как
telnet, ftp, passwd, fsck, rlogin и tip, с помощью скриптовых диалогов и макросов. Кроме того Expect полезен
для тестирования перечисленных выше приложений, а также для решения сложных задач взаимодействия с
другими средствами. Фреймворк DejaGnu написан на языке Expect.
Приблизительное
0.2 SBU
время сборки:
Требуемое дисковое
3.9 MB
пространство:

8.16.1. Установка пакета Expect
Expect для работы необходим псевдотерминал(PTY). Убедитесь, что PTY работают правильно в среде chroot,
выполнив простой тест:
python3 -c 'from pty import spawn; spawn(["echo", "ok"])'

Эта команда должна вывести ok. Если вместо этого вывод содержит OSError: out of pty devices, то
среда не настроена для правильной работы PTY. Вам необходимо выйти из среды chroot, ещё раз прочитать
Раздел 7.3, «Подготовка виртуальных файловых систем ядра» и убедиться, что файловая система devpts (и
другие файловые системы виртуального ядра) смонтирована правильно. Затем повторно войдите в среду
chroot, следуя инструкции Раздел 7.4, «Вход в окружение Chroot». Эту проблему необходимо решить,
прежде чем вы продолжите, иначе наборы тестов, зависимые от Expect (например, наборы тестов Bash,
Binutils, GCC, GDBM и, конечно, самого Expect), потерпят фатальный сбой, а также могут произойти другие
незначительные сбои.
Подготовьте Expect к компиляции:
./configure --prefix=/usr
\
--with-tcl=/usr/lib
\
--enable-shared
\
--mandir=/usr/share/man \
--with-tclinclude=/usr/include

Значение параметров настройки:
--with-tcl=/usr/lib

Этот параметр необходим для указания configure где находится скрипт tclConfig.sh.
--with-tclinclude=/usr/include

Этот параметр явно указывает Expect, где искать внутренние заголовки Tcl.
Соберите пакет:
make

Чтобы протестировать пакет, выполните:
make test

Установите пакет:
make install
ln -svf expect5.45.4/libexpect5.45.4.so /usr/lib

8.16.2. Содержимое пакета Expect
Установленные
программы:
Установленные
библиотеки:

expect
libexpect5.45.4.so
144

Линукс с нуля - Версия 12.1

Краткое описание
expect

Взаимодействует с другими интерактивными программами в соответствии со
сценарием

libexpect-5.45.4.so

Содержит функции, которые позволяют использовать Expect в качестве
расширения Tcl или непосредственно из C или C++ (без Tcl).

145

Линукс с нуля - Версия 12.1

8.17. DejaGNU-1.6.3
Пакет DejaGnu содержит фреймворк для запуска наборов тестов на инструментах GNU. Он написан на
expect, который в свою очередь использует Tcl (командный язык инструментов).
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.1 SBU
6.9 MB

8.17.1. Установка пакета DejaGNU
Разработчики рекомендуют собирать DejaGNU в отдельном каталоге:
mkdir -v build
cd
build

Подготовьте DejaGNU к компиляции:
../configure --prefix=/usr
makeinfo --html --no-split -o doc/dejagnu.html ../doc/dejagnu.texi
makeinfo --plaintext
-o doc/dejagnu.txt ../doc/dejagnu.texi

Чтобы протестировать пакет, выполните:
make check

Установите пакет:
make install
install -v -dm755
install -v -m644

/usr/share/doc/dejagnu-1.6.3
doc/dejagnu.{html,txt} /usr/share/doc/dejagnu-1.6.3

8.17.2. Содержимое пакета DejaGNU
Установленные
программы:

dejagnu и runtest

Short Descriptions
dejagnu

Вспомогательная программа запуска команд DejaGNU

runtest

Скрипт-обертка, который находит соответствующую оболочку expect и запускает DejaGnu

146

Линукс с нуля - Версия 12.1

8.18. Pkgconf-2.1.1
Пакет pkgconf является преемником pkg-config и содержит инструмент, который позволяет передавать пути
установки или пути к библиотекам для инструментов сборки на этапе настройки (configure) и сборки(make)
пакетов.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

менее 0.1 SBU
4.6 MB

8.18.1. Установка пакета Pkgconf
Подготовьте Pkgconf к компиляции:
./configure --prefix=/usr
\
--disable-static
\
--docdir=/usr/share/doc/pkgconf-2.1.1

Скомпилируйте пакет:
make

Установите пакет:
make install

Для обеспечения совместимости с исходным Pkg-config, создайте две символические ссылки:
ln -sv pkgconf
/usr/bin/pkg-config
ln -sv pkgconf.1 /usr/share/man/man1/pkg-config.1

8.18.2. Содержимое пакета Pkgconf
Установленные
программы:
Установленные
библиотеки:
Созданные каталоги:

pkgconf, pkg-config (ссылка на pkgconf) и bomtool
libpkgconf.so
/usr/share/doc/pkgconf-2.1.1

Краткое описание
pkgconf

Возвращает метаданные указанной библиотеки или пакета

bomtool

Генерирует спецификацию
расширением .pc

libpkgconf

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

программного

147

обеспечения

из

файлов

pkg-config

с

Линукс с нуля - Версия 12.1

8.19. Binutils-2.42
Пакет Binutils содержит компоновщик, ассемблер и другие инструменты для работы с объектными файлами.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

2.2 SBU
2.7 GB

8.19.1. Установка пакета Binutils
Документация Binutils рекомендует выполнять компиляцию в отдельном каталоге:
mkdir -v build
cd
build

Подготовьте Binutils к компиляции:
../configure --prefix=/usr
\
--sysconfdir=/etc
\
--enable-gold
\
--enable-ld=default \
--enable-plugins
\
--enable-shared
\
--disable-werror
\
--enable-64-bit-bfd \
--with-system-zlib \
--enable-default-hash-style=gnu

Значение новых параметров настройки:
--enable-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 в этом разделе считается критически важным. Ни в коем случае не
пропускайте его.
148

Линукс с нуля - Версия 12.1
Выполните тестирование:
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

8.19.2. Содержимое пакета Binutils
Установленные
программы:
Установленные
библиотеки:
Созданные каталоги:

addr2line, ar, as, c++filt, dwp, elfedit, gprof, gprofng, ld, ld.bfd, ld.gold, nm, objcopy,
objdump, ranlib, readelf, size, strings и strip
libbfd.so, libctf.so, libctf-nobfd.so, libgprofng.so, libopcodes.so и libsframe.so
/usr/lib/ldscripts

Краткое описание
addr2line

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

ar

Создаёт, изменяет и распаковывает архивы

as

Ассемблер, который собирает результат работы gcc в объектные файлы

c++filt

Используется компоновщиком для исправления символов C++ и Java и предотвращения
конфликтов перегруженных функций.

dwp

Утилита для упаковки DWARF

elfedit

Обновляет ELF заголовки в ELF файлах

gprof

Отображает в графическом виде информацию о профилировании

gprofng

Собирает и анализирует данные о производительности

ld

Компоновщик, который объединяет несколько объектных и архивных файлов в один
файл, перемещая их данные и связывая символическими ссылками

ld.gold

Урезанная версия ld, которая поддерживает только формат объектных файлов elf

ld.bfd

Жесткая ссылка на ld

nm

Выводит список символов, используемых в данном объектном файле

objcopy

Преобразует один тип объектного файла в другой

objdump

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

ranlib

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

Линукс с нуля - Версия 12.1
readelf

Отображает информацию о двоичных файлах типа ELF

size

Отображает размеры секций и общий размер указанных объектных файлов

strings

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

strip

Удаляет символы из объектных файлов

libbfd

Библиотека дескрипторов двоичных файлов

libctf

Библиотека отладки формата Compat ANSI-C Type

libctf-nobfd

Вариант libctf, не использующий функциональность libbfd.

libgprofng

Библиотека, содержащая большинство подпрограмм, используемых gprofng

libopcodes

Библиотека для работы с опкодами—«читаемыми» версиями инструкций для
процессора. Используется для сборки таких утилит как objdump

libsframe

Библиотека для поддержки обратной онлайн-трассировки с использованием простого
декодера разделов .sframe.

150

Линукс с нуля - Версия 12.1

8.20. GMP-6.3.0
Пакет GMP содержит математические библиотеки. Они содержат полезные функции для арифметики с
произвольной точностью.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.3 SBU
54 MB

8.20.1. Установка пакета GMP
Примечание
Если вы выполняете сборку для 32-разрядной архитектуры x86, но ваш процессор, способен
выполнять 64-разрядный код, и вы указали в переменных окружения CFLAGS, скрипт configure
попытается выполнить настройку для 64-разрядной системы и завершится ошибкой. Чтобы
избежать этого, необходимо вызвать команду configure с приведенным ниже параметром
ABI=32 ./configure ...

Примечание
Настройки GMP по умолчанию собирают библиотеки, оптимизированные для процессора хоста.
Если требуются библиотеки, подходящие для процессоров с меньшей производительностью, чем у
процессора хоста, можно собрать общие библиотеки, добавив параметр --host=none-linux-gnu
в команде configure.
Подготовьте GMP к компиляции:
./configure --prefix=/usr
\
--enable-cxx
\
--disable-static \
--docdir=/usr/share/doc/gmp-6.3.0

Значение новых параметров настройки:
--enable-cxx

Этот параметр включает поддержку C++
--docdir=/usr/share/doc/gmp-6.3.0

Эта переменная указывает местоположение для документации.
Скомпилируйте пакет и сгенерируйте HTML-документацию:
make
make html

Важно
Набор тестов для GMP в этом разделе считается критически важным. Ни в коем случае не
пропускайте его.
Проверьте результаты:
make check 2>&1 | tee gmp-check-log

151

Линукс с нуля - Версия 12.1

Внимание
Код в GMP сильно оптимизирован для процессора, на котором он собран. Иногда код,
определяющий процессор, неверно определяет возможности системы, и в тестах или других
приложениях, использующих библиотеки gmp, возникают ошибки с сообщением Illegal
instruction. В этом случае gmp следует переконфигурировать с параметром --host=none-linuxgnu и пересобрать.
Убедитесь, что все 199 тестов в наборе пройдены. Проверьте результат, выполнив следующую команду:
awk '/# PASS:/{total+=$3} ; END{print total}' gmp-check-log

Установите пакет и его документацию:
make install
make install-html

8.20.2. Содержимое пакета GMP
Установленные
библиотеки:
Созданные каталоги:

libgmp.so и libgmpxx.so
/usr/share/doc/gmp-6.3.0

Краткое описание
libgmp

Содержит точные математические функции

libgmpxx

Содержит точные математические функции C++

152

Линукс с нуля - Версия 12.1

8.21. MPFR-4.2.1
Пакет MPFR содержит функции для двоичных вычислений с плавающей запятой произвольной точности.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.3 SBU
44 MB

8.21.1. Установка пакета 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

8.21.2. Содержимое пакета MPFR
Установленные
библиотеки:
Созданные каталоги:

libmpfr.so
/usr/share/doc/mpfr-4.2.1

Краткое описание
libmpfr

Содержит математические функции с произвольной точностью

153

Линукс с нуля - Версия 12.1

8.22. MPC-1.3.1
Пакет MPC содержит библиотеку для арифметики комплексных чисел с высокой точностью и правильным
округлением результата.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.1 SBU
22 MB

8.22.1. Установка пакета 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

8.22.2. Содержимое пакета MPC
Установленные
библиотеки:
Созданные каталоги:

libmpc.so
/usr/share/doc/mpc-1.3.1

Краткое описание
libmpc

Содержит сложные математические функции

154

Линукс с нуля - Версия 12.1

8.23. Attr-2.5.2
Пакет Attr содержит утилиты для управления расширенными атрибутами объектов файловой системы.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

менее 0.1 SBU
4.2 MB

8.23.1. Установка пакета 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

8.23.2. Содержимое пакета Attr
Установленные
программы:
Установленные
библиотеки:
Созданные каталоги:

attr, getfattr, и setfattr
libattr.so
/usr/include/attr и /usr/share/doc/attr-2.5.2

Краткое описание
attr

Расширяет атрибуты объектов файловой системы

getfattr

Получает расширенные атрибуты объектов файловой системы

setfattr

Устанавливает расширенные атрибуты объектов файловой системы

libattr

Содержит библиотечные функции для управления расширенными атрибутами.

155

Линукс с нуля - Версия 12.1

8.24. Acl-2.3.2
Пакет Acl содержит утилиты для администрирования списков контроля доступа, которые используются для
определения расширенных дискреционных прав доступа к файлам и каталогам.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

менее 0.1 SBU
6.3 MB

8.24.1. Установка пакета Acl
Подготовьте Acl к компиляции:
./configure --prefix=/usr
\
--disable-static
\
--docdir=/usr/share/doc/acl-2.3.2

Скомпилируйте пакет:
make

Тесты Acl необходимо запускать в файловой системе, поддерживающей списки контроля доступа, после
сборки пакета Coreutils с использованием библиотек Acl. По желанию вернитесь к этому пакету и запустите
make check после того, как будет собран пакет Coreutils.
Установите пакет:
make install

8.24.2. Содержимое пакета Acl
Установленные
программы:
Установленные
библиотеки:
Созданные каталоги:

chacl, getfacl, и setfacl
libacl.so
/usr/include/acl и /usr/share/doc/acl-2.3.2

Краткое описание
chacl

Изменяет список контроля доступа файла или каталога

getfacl

Получает списки контроля доступа файла

setfacl

Устанавливает списки контроля доступа к файлам

libacl

Содержит библиотечные функции для управления списками контроля доступа.

156

Линукс с нуля - Версия 12.1

8.25. Libcap-2.69
Пакет Libcap реализует интерфейсы пользовательского пространства для возможностей POSIX 1003.1e,
доступных в ядрах Linux. Эти возможности разделяют полномочия суперпользователя root на набор
отдельных привилегий.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

менее 0.1 SBU
2.9 MB

8.25.1. Установка пакета Libcap
Запретите установку статических библиотек:
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

8.25.2. Содержимое пакета Libcap
Установленные
программы:
Установленные
библиотеки:

capsh, getcap, getpcaps и setcap
libcap.so и libpsx.so

Краткое описание
capsh

Обёртка к оболочке для исследования и ограничения поддержки возможностей Linux

getcap

Проверяет возможности файлов

getpcaps

Отображает возможности запрашиваемого процесса (процессов)

setcap

Устанавливает возможности файлов

libcap

Содержит функции для управления возможностями POSIX 1003.1e.

libpsx

Содержит функции для поддержки семантики POSIX для системных вызовов, связанных с
библиотекой pthread

157

Линукс с нуля - Версия 12.1

8.26. Libxcrypt-4.4.36
Пакет Libxcrypt содержит современную библиотеку для одностороннего хэширования паролей.
Приблизительное
0.1 SBU
время сборки:
Требуемое дисковое
15 MB
пространство:

8.26.1. Установка пакета 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

158

Линукс с нуля - Версия 12.1

8.26.2. Содержимое пакета Libxcrypt
Установленные
библиотеки:

libcrypt.so

Краткое описание
libcrypt

Содержит функции для хэширования паролей

159

Линукс с нуля - Версия 12.1

8.27. Shadow-4.14.5
Пакет Shadow содержит программы для безопасной обработки паролей.
Приблизительное
0.1 SBU
время сборки:
Требуемое дисковое
49 MB
пространство:

8.27.1. Установка пакета 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
-e
-e
-i

's:#ENCRYPT_METHOD DES:ENCRYPT_METHOD YESCRYPT:' \
's:/var/spool/mail:/var/mail:'
\
'/PATH=/{s@/sbin:@@;s@/bin:@@}'
\
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

Значение новых параметров конфигурации:

touch /usr/bin/passwd
Файл /usr/bin/passwd
должен существовать, потому что его местоположение жестко задано в
некоторых программах; если он не существует, скрипт установки создаст его не в том месте.
160

Линукс с нуля - Версия 12.1
--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

8.27.2. Настройка Shadow
Этот пакет содержит утилиты для добавления, изменения и удаления пользователей и групп; установки
и изменения их паролей; и выполнения других задач администрирования. Полное объяснение того, что
означает 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 . Вы можете установить любое значение. Обратите
161

Линукс с нуля - Версия 12.1
внимание, что 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

8.27.3. Установка пароля пользователя root
Придумайте пароль для root и установите командой:
passwd root

8.27.4. Содержимое пакета Shadow
Установленные
программы:

Установленные
библиотеки:
Созданные каталоги:

chage, chfn, chgpasswd, chpasswd, chsh, expiry, faillog, getsubids, gpasswd,
groupadd, groupdel, groupmems, groupmod, grpck, grpconv, grpunconv, login,
logoutd, newgidmap, newgrp, newuidmap, newusers, nologin, passwd, pwck,
pwconv, pwunconv, sg (ссылка на newgrp), su, useradd, userdel, usermod, vigr
(ссылка на vipw) и vipw
libsubid.so
/etc/default и /usr/include/shadow

Краткое описание
chage

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

chfn

Используется для изменения полного имени пользователя и другой информации

chgpasswd

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

chpasswd

Используется для обновления паролей пользователей в пакетном режиме.

chsh

Используется для изменения оболочки входа для пользователя.

expiry

Проверяет и применяет текущую политику истечения срока действия пароля

faillog

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

getsubids

Используется
пользователя

gpasswd

Используется для добавления и удаления пользователей и администраторов в группы.

groupadd

Создает группу с указанным именем

groupdel

Удаляет группу с указанным именем

groupmems

Позволяет пользователю управлять своим собственным списком членов группы без
привилегий суперпользователя

для

перечисления

162

подчиненных

диапазонов

идентификаторов

для

Линукс с нуля - Версия 12.1
groupmod

Используется для изменения имени группы или GID

grpck

Проверяет целостность файлов групп /etc/group

grpconv

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

grpunconv

Обновляет /etc/group

login

Используется системой для того, чтобы пользователь мог войти в систему

logoutd

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

newgidmap

Используется для сопоставления gid пространства имен пользователя

newgrp

Используется для изменения GID во время сеанса входа в систему

newuidmap

Используется для сопоставления uid пространства имен пользователя

newusers

Используется для создания или изменения последовательности учетных записей

nologin

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

passwd

Используется для изменения пароля для учетной записи пользователя или группы.

pwck

Проверяет целостность файлов паролей /etc/passwd

pwconv

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

pwunconv

Обновляет /etc/passwd

sg

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

su

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

useradd

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

userdel

Удаляет учетную запись указанного пользователя

usermod

Используется для изменения имени пользователя, идентификатора пользователя (UID),
оболочки, группы, домашнего каталога и т.д.

vigr

Редактирует файлы /etc/group

или /etc/gshadow

vipw

Редактирует файлы /etc/passwd

или /etc/shadow

libsubid

библиотека для обработки подчиненных диапазонов идентификаторов пользователей и групп

и /etc/gshadow

из /etc/gshadow , а затем удаляет последний

из /etc/shadow

163

и /etc/shadow

а затем удаляет последний

Линукс с нуля - Версия 12.1

8.28. GCC-13.2.0
Пакет GCC содержит коллекцию компиляторов GNU, которая включает компиляторы C и C++.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

42 SBU (с тестами)
5.5 GB

8.28.1. Установка пакета GCC
При сборке на 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, а не на
собственную внутреннюю копию.

164

Линукс с нуля - Версия 12.1

Примечание
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-malloctest-1.C
завершились неудачно. Кроме того, несколько тестов из каталога vect завершаются неудачно,
если оборудование не поддерживает AVX.
Не всегда удается избежать неожиданных сбоев. Разработчики GCC обычно знают об этих проблемах, но
еще не решили их. Если результаты теста не сильно отличаются от результатов по указанному выше URLадресу, можно продолжать.
Установите пакет:
make install

165

Линукс с нуля - Версия 12.1
Каталог сборки 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'

166

Линукс с нуля - Версия 12.1
Ссылки на пути, содержащие компоненты с '-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

8.28.2. Содержимое пакета GCC
Установленные
программы:
Установленные
библиотеки:
Созданные каталоги:

c++, cc (link to gcc), cpp, g++, gcc, gcc-ar, gcc-nm, gcc-ranlib, gcov, gcov-dump,
gcov-tool, и lto-dump
libasan.{a,so}, libatomic.{a,so}, libcc1.so, libgcc.a, libgcc_eh.a, libgcc_s.so,
libgcov.a, libgomp.{a,so}, libhwasan.{a,so}, libitm.{a,so}, liblsan.{a,so},
liblto_plugin.so, libquadmath.{a,so}, libssp.{a,so}, libssp_nonshared.a, libstdc++.
{a,so}, libstdc++exp.a, libstdc++fs.a, libsupc++.a, libtsan.{a,so} и libubsan.{a,so}
/usr/include/c++, /usr/lib/gcc, /usr/libexec/gcc и /usr/share/gcc-13.2.0
167

Линукс с нуля - Версия 12.1

Краткое описание
c++

Компилятор С++

cc

Компилятор C

cpp

Препроцессор C; он используется компилятором для расширения инструкций #include,
#define и подобные директивы в исходных файлах

g++

Компилятор C++

gcc

Компилятор C

gcc-ar

Обертка над ar, добавляющая плагин в командную строку. Эта программа
используется только для добавления "оптимизации времени компоновки" и бесполезна
с параметрами сборки по умолчанию.

gcc-nm

Обертка над nm, добавляющая плагин в командную строку. Эта программа
используется только для добавления "оптимизации времени компоновки" и бесполезна
с параметрами сборки по умолчанию.

gcc-ranlib

Обертка над ranlib, добавляющая плагин в командную строку. Эта программа
используется только для добавления "оптимизации времени компоновки" и бесполезна
с параметрами сборки по умолчанию.

gcov

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

gcov-dump

Автономный инструмент для дампа профилей gcda and gcno

gcov-tool

Автономный инструмент обработки профиля gcda

lto-dump

Инструмент для создания дампа объектных файлов, созданных GCC с включенным
LTO.

libasan

Библиотека времени выполнения Address Sanitizer

libatomic

Встроенная библиотека времени выполнения GCC atomic

libcc1

Библиотека, которая позволяет GDB использовать GCC

libgcc

Содержит средства поддержки времени исполнения для gcc

libgcov

Эта библиотека компонуется с программой, когда в GCC включено профилирование

libgomp

GNU реализация интерфейса OpenMP API мультиплатформенного параллельного
программирования для языков C/C++ и Fortran с общим доступом к памяти

libhwasan

Библиотека времени выполнения Hardware-Assisted Address Sanitizer (аппаратной
очистки адресов)

libitm

Библиотека транзакционной памяти GNU

liblsan

Библиотека времени выполнения Leak Sanitizer (средств защиты от утечек)

liblto_plugin

Плагин GCC LTO позволяет Binutils обрабатывать объектные файлы, созданные GCC
с включенным LTO.

libquadmath

API математической библиотеки GCC Quad Precision

libssp

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

libstdc++

Стандартная библиотека C++

libstdc++exp

Экспериментальная библиотека контрактов C++

libstdc++fs

Библиотека файловой системы ISO/IEC TS 18822:2015
168

Линукс с нуля - Версия 12.1
libsupc++

Предоставляет вспомогательные процедуры для языка программирования C++

libtsan

Библиотека времени выполнения Thread Sanitizer (средств очистки потоков)

libubsan

Библиотека времени выполнения Undefined Behavior Sanitizer (средств очистки
неопределенного поведения)

169

Линукс с нуля - Версия 12.1

8.29. Ncurses-6.4-20230520
Пакет Ncurses содержит библиотеки для независимой от терминала обработки ввода/вывода
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.2 SBU
45 MB

8.29.1. Установка пакета 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 в этом каталоге.

170

Линукс с нуля - Версия 12.1
Установка этого пакета приведет к перезаписи 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

8.29.2. Содержимое пакета Ncurses
Установленные
программы:
Установленные
библиотеки:
Созданные каталоги:

captoinfo (ссылка на tic), clear, infocmp, infotocap (ссылка на tic), ncursesw6config, reset (ссылка на tset), tabs, tic, toe, tput и tset
libcurses.so (символическая ссылка), libform.so (символическая ссылка),
libformw.so, libmenu.so (символическая ссылка), libmenuw.so, libncurses.so
(символическая ссылка), libncursesw.so, libncurses++w.so, libpanel.so
(символическая ссылка) и libpanelw.so,
/usr/share/tabset, /usr/share/terminfo и /usr/share/doc/ncurses-6.4-20230520
171

Линукс с нуля - Версия 12.1

Краткое описание
captoinfo

Преобразует описание termcap в описание terminfo

clear

Очищает экран, если это возможно

infocmp

Сравнивает или показывает описания terminfo

infotocap

Преобразует описание terminfo в описание termcap

ncursesw6-config

Предоставляет информацию о конфигурации пакету ncurses

reset

Повторно инициализирует терминал со значениями по умолчанию

tabs

Очищает и устанавливает размеры табуляции в терминале

tic

Компилятор описания terminfo, преобразует файл terminfo из исходного формата в
двоичный, который необходим для подпрограмм библиотеки ncurses [Файл terminfo
содержит информацию о возможностях конкретного терминала.]

toe

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

tput

Позволяет использовать в командной оболочке настройки, относящиеся к
особенностям конкретного терминала; может также использоваться для сброса или
инициализации терминала, либо для вывода полного имени терминала

tset

Может использоваться для инициализации терминалов

libncursesw

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

libncurses++w

Содержит функции связывания C++ с другими библиотеками в пакете

libformw

Содержит функции, реализующие формы

libmenuw

Содержит функции, реализующие меню

libpanelw

Содержит функции, реализующие панели

172

Линукс с нуля - Версия 12.1

8.30. Sed-4.9
Пакет Sed содержит потоковый редактор текста
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.3 SBU
30 MB

8.30.1. Установка пакета 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

8.30.2. Содержимое пакета Sed
Установленные
программы:
Созданные каталоги:

sed
/usr/share/doc/sed-4.9

Краткое описание
sed

Фильтрует и преобразует текстовые файлы за один проход

173

Линукс с нуля - Версия 12.1

8.31. Psmisc-23.6
Пакет Psmisc содержит программы для отображения информации о запущенных процессах.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

менее 0.1 SBU
6.6 MB

8.31.1. Установка пакета Psmisc
Подготовьте Psmisc к компиляции:
./configure --prefix=/usr

Скомпилируйте пакет:
make

Чтобы протестировать пакет, выполните:
make check

Установите пакет:
make install

8.31.2. Содержимое пакета Psmisc
Установленные
программы:

fuser, killall, peekfd, prtstat, pslog, pstree и pstree.x11 (ссылка на pstree)

Краткое описание
fuser

Сообщает идентификаторы процессов (PID), которые используют данные файлы или
файловые системы.

killall

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

peekfd

Просмотривает файловые дескрипторы запущенного процесса с учетом его PID

prtstat

Выводит информацию о процессе

pslog

Сообщает текущий путь к журналам процесса

pstree

Отображает запущенные процессы в виде дерева

pstree.x11

То же, что и pstree, за исключением того, что он ожидает подтверждения перед выходом.

174

Линукс с нуля - Версия 12.1

8.32. Gettext-0.22.4
Пакет Gettext содержит утилиты для интернационализации и локализации. Они позволяют компилировать
программы с поддержкой NLS (Native Language Support), позволяя им выводить сообщения на родном языке
пользователя.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

1.4 SBU
250 MB

8.32.1. Установка пакета Gettext
Подготовьте 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

8.32.2. Содержимое пакета Gettext
Установленные
программы:
Установленные
библиотеки:
Созданные каталоги:

autopoint, envsubst, gettext, gettext.sh, gettextize, msgattrib, msgcat, msgcmp,
msgcomm, msgconv, msgen, msgexec, msgfilter, msgfmt, msggrep, msginit,
msgmerge, msgunfmt, msguniq, ngettext, recode-sr-latin, и xgettext
libasprintf.so, libgettextlib.so, libgettextpo.so, libgettextsrc.so, libtextstyle.so и
preloadable_libintl.so
/usr/lib/gettext, /usr/share/doc/gettext-0.22.4, /usr/share/gettext и /usr/share/
gettext-0.22.4

Краткое описание
autopoint

Копирует файлы стандартной инфраструктуры Gettext в пакет с исходным
кодом

envsubst

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

gettext

Переводит сообщение с естественного языка на язык пользователя,
осуществляя для этого поиск уже сделанного перевода в каталоге сообщений

gettext.sh

В основном служит библиотекой функций оболочки для gettext.

gettextize

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

msgattrib

Фильтрует сообщения каталога переводов в соответствии с их атрибутами и
управляет атрибутами

msgcat

Объединяет указанные файлы .po
175

Линукс с нуля - Версия 12.1
msgcmp

Сравнивает два файла .po , чтобы проверить, что оба содержат один и тот же
набор строк msgid

msgcomm

Находит сообщения, которые являются общими для указанных файлов .po

msgconv

Преобразует каталог переводов в другую кодировку символов

msgen

Создает каталог переводов на английский язык

msgexec

Применяет команду ко всем переводам каталога переводов

msgfilter

Применяет фильтр ко всем переводам каталога переводов

msgfmt

Генерирует каталог двоичных сообщений из каталога переводов

msggrep

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

msginit

Создает новый файл
среды пользователя.

msgmerge

Объединяет два необработанных перевода в один файл

msgunfmt

Декомпилирует каталог двоичных сообщений в необработанный текст
перевода

msguniq

Объединяет дублирующиеся переводы в каталоге переводов

ngettext

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

recode-sr-latin

Перекодирует сербский текст с кириллицы на латиницу.

xgettext

Извлекает переводимые строки сообщений из заданных исходных файлов для
создания первого шаблона перевода.

libasprintf

Определяет класс autosprintf, который делает подпрограммы вывода в формате
C пригодными для использования в программах на C++ для использования со
строками и потоками

libgettextlib

Содержит общие подпрограммы, используемые различными программами
Gettext; они не предназначены для общего использования

libgettextpo

Используется
для
написания
специализированных
программ,
обрабатывающих файлы .po ; эта библиотека используется, когда стандартных
приложений, поставляемых с Gettext (таких как msgcomm, msgcmp, msgattrib,
и msgen), недостаточно.

libgettextsrc

Предоставляет
общие
подпрограммы,
используемые
различными
программами Gettext; они не предназначены для общего использования

libtextstyle

Библиотека стилей текста

preloadable_libintl

Библиотека, предназначенная для использования LD_PRELOAD, которая
помогает libintl записывать в журнал непереведённые сообщения

.po

176

, инициализируя метаинформацию значениями из

Линукс с нуля - Версия 12.1

8.33. Bison-3.8.2
Пакет Bison содержит генератор синтаксического анализа.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

2.3 SBU
62 MB

8.33.1. Установка пакета Bison
Подготовьте Bison к компиляции:
./configure --prefix=/usr --docdir=/usr/share/doc/bison-3.8.2

Скомпилируйте пакет:
make

Для тестирования пакета (около 5,5 SBU), выполните:
make check

Установите пакет:
make install

8.33.2. Содержимое пакета Bison
Установленные
программы:
Установленные
библиотеки:
Созданные каталоги:

bison и yacc
liby.a
/usr/share/bison

Краткое описание
bison

Генерирует из набора правил программу для анализа структуры текстовых файлов; Bison является
заменой Yacc (Yet Another Compiler Compiler)

yacc

Обертка для bison, предназначенная для программ, которые до сих пор вызывают yacc вместо
bison; он вызывает bison с параметром -y

liby

Библиотека Yacc, содержащая реализации Yacc-совместимых функций yyerror и main; обычно эта
библиотека не очень нужна, но требуется POSIX

177

Линукс с нуля - Версия 12.1

8.34. Grep-3.11
Пакет Grep содержит программы для поиска по содержимому файлов.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.4 SBU
39 MB

8.34.1. Установка пакета Grep
Во-первых, удалите предупреждение об использовании egrep и fgrep, которое приводит к сбою тестов
некоторых пакетов:
sed -i "s/echo/#echo/" src/egrep.sh

Подготовьте Grep к компиляции:
./configure --prefix=/usr

Скомпилируйте пакет:
make

Чтобы протестировать пакет, выполните:
make check

Установите пакет:
make install

8.34.2. Содержимое пакета Grep
Установленные
программы:

egrep, fgrep, и grep

Краткое описание
egrep

Выводит строки, соответствующие расширенному регулярному выражению. Команда устарела,
вместо неё используйте grep -E

fgrep

Выводит строки, соответствующие списку фиксированных строк. Команда устарела, вместо неё
используйте grep -F

grep

Выводит строки, соответствующие простому регулярному выражению

178

Линукс с нуля - Версия 12.1

8.35. Bash-5.2.21
Пакет Bash содержит Bourne-Again Shell.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

1.2 SBU
52 MB

8.35.1. Установка пакета Bash
Во-первых, исправьте некоторые проблемы, выявленные разработчиками:
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 ) указывает на сбой теста, если нет сообщение о том, что
различия можно проигнорировать. Известно, что один тест с именем run-builtins не работает на некоторых
хост-дистрибутивах, указывая на различия в первой строке выходных данных.
Установите пакет:
make install

Запустите только что скомпилированную программу bash (заменив ту, которая выполняется в данный
момент):
exec /usr/bin/bash --login

179

Линукс с нуля - Версия 12.1

8.35.2. Содержимое пакета Bash
Установленные
программы:
Созданные каталоги:

bash, bashbug и sh (ссылка на bash)
/usr/include/bash, /usr/lib/bash, and /usr/share/doc/bash-5.2.21

Краткое описание
bash

Широко распространенный командный интерпретатор. Выполняет различные дополнения
и подстановки в переданной командной строке перед её выполнением, что делает этот
интерпретатор мощным инструментом

bashbug

Скрипт, помогающий пользователю составлять и отправлять по почте отчеты об ошибках bash

sh

Симлинк на программу bash; при вызове sh, bash пытается максимально точно имитировать
поведение sh, при этом также соответствуя стандарту POSIX.

180

Линукс с нуля - Версия 12.1

8.36. Libtool-2.4.7
Пакет Libtool содержит сценарий поддержки универсальной библиотеки GNU. Это упрощает использование
общих библиотек благодаря согласованному переносимому интерфейсу.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.6 SBU
45 MB

8.36.1. Установка пакета Libtool
Подготовьте Libtool к компиляции:
./configure --prefix=/usr

Скомпилируйте пакет:
make

Чтобы протестировать пакет, выполните:
make -k check

Известно, что пять тестов в среде сборки LFS завершаются неудачно из-за циклической зависимости, но
эти тесты проходят успешно, если запустить их повторно после установки automake. Кроме того, в grep-3.8
или более поздней версии два теста вызовут предупреждение для регулярных выражений, несовместимых
с POSIX и завершатся ошибкой.
Установите пакет:
make install

Удалите ненужную статическую библиотеку:
rm -fv /usr/lib/libltdl.a

8.36.2. Содержимое пакета Libtool
Установленные
программы:
Установленные
библиотеки:
Созданные каталоги:

libtool и libtoolize
libltdl.so
/usr/include/libltdl и /usr/share/libtool

Краткое описание
libtool

Обеспечивает общие услуги поддержки при сборке библиотек

libtoolize

Предоставляет стандартный способ добавления поддержки libtool в пакет

libltdl

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

181

Линукс с нуля - Версия 12.1

8.37. GDBM-1.23
Пакет GDBM содержит менеджер баз данных GNU. Это библиотека функций базы данных, использующая
расширяемое хеширование и работающая аналогично стандартной СУБД UNIX. Библиотека предоставляет
примитивы для хранения пар ключ/значение, поиска и извлечения данных по его ключу и удаления ключа
вместе с его данными.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

менее 0.1 SBU
13 MB

8.37.1. Установка пакета GDBM
Подготовьте GDBM к компиляции:
./configure --prefix=/usr
\
--disable-static \
--enable-libgdbm-compat

Значение параметра configure:
--enable-libgdbm-compat

Этот параметр включает сборку библиотеки совместимости libgdbm. Некоторым пакетам за пределами
LFS могут потребоваться более старые подпрограммы DBM, которые он предоставляет.
Скомпилируйте пакет:
make

Чтобы протестировать пакет, выполните:
make check

Установите пакет:
make install

8.37.2. Содержимое пакета GDBM
Установленные
программы:
Установленные
библиотеки:

gdbm_dump, gdbm_load, и gdbmtool
libgdbm.so и libgdbm_compat.so

Краткое описание
gdbm_dump

Сохраняет дамп базы данных GDBM в файл

gdbm_load

Восстанавливает базу данных GDBM из дампа.

gdbmtool

Проверяет и изменяет базу данных GDBM

libgdbm

Содержит функции для управления хэшированной базой данных

libgdbm_compat

Библиотека совместимости, содержащая более старые функции DBM

182

Линукс с нуля - Версия 12.1

8.38. Gperf-3.1
Gperf генерирует идеальную хэш-функцию из набора ключей.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

менее 0.1 SBU
6.1 MB

8.38.1. Установка пакета Gperf
Подготовьте Gperf к компиляции:
./configure --prefix=/usr --docdir=/usr/share/doc/gperf-3.1

Скомпилируйте пакет:
make

Известно, что тесты завершаются ошибкой при одновременном выполнении нескольких тестов (параметр j больше 1). Для выполнения тестов, запустите следующую команду:
make -j1 check

Установите пакет:
make install

8.38.2. Содержимое пакета Gperf
Установленные
программы:
Созданные каталоги:

gperf
/usr/share/doc/gperf-3.1

Краткое описание
gperf

Генерирует идеальный хэш из набора ключей

183

Линукс с нуля - Версия 12.1

8.39. Expat-2.6.0
Пакет Expat содержит потоковую библиотеку C для синтаксического анализа XML
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.1 SBU
13 MB

8.39.1. Установка пакета Expat
Подготовьте 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

8.39.2. Содержимое пакета Expat
Установленные
программы:
Установленные
библиотеки:
Созданные каталоги:

xmlwf
libexpat.so
/usr/share/doc/expat-2.6.0

Краткое описание
xmlwf

Утилита проверки правильности формирования XML документов

libexpat

Содержит функции API для синтаксического анализа XML

184

Линукс с нуля - Версия 12.1

8.40. Inetutils-2.5
Пакет Inetutils содержит базовые программы для работы с сетью.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.2 SBU
35 MB

8.40.1. Установка пакета 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

185

Линукс с нуля - Версия 12.1

8.40.2. Содержимое пакета Inetutils
Установленные
программы:

dnsdomainname, ftp, ifconfig, hostname, ping, ping6, talk, telnet, tftp и traceroute

Краткое описание
dnsdomainname

Показывает системное DNS имя

ftp

Программа для передачи файлов по протоколу FTP

hostname

Сообщает или задает имя хоста

ifconfig

Управляет сетевыми интерфейсами

ping

Отправляет пакеты эхо-запросов и сообщает, сколько времени занимают ответы

ping6

Версия ping для сетей IPv6

talk

Используется для общения с другими пользователями

telnet

Интерфейс к протоколу TELNET

tftp

Программа для передачи файлов по протоколу TFTP (Trivial File Transfer Protocol —
простой протокол передачи файлов)

traceroute

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

186

Линукс с нуля - Версия 12.1

8.41. Less-643
Пакет Less содержит средство просмотра текстовых файлов
Приблизительное
время сборки:
Требуемое дисковое
пространство:

менее 0.1 SBU
12 MB

8.41.1. Установка пакета Less
Подготовьте Less к компиляции:
./configure --prefix=/usr --sysconfdir=/etc

Значение параметров настройки:
--sysconfdir=/etc

Этот параметр указывает программам, созданным пакетом, искать файлы конфигурации в /etc .
Скомпилируйте пакет:
make

Чтобы протестировать пакет, выполните:
make check

Установите пакет:
make install

8.41.2. Содержимое пакета Less
Установленные
программы:

less, lessecho и lesskey

Краткое описание
less

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

lessecho

Требуется для расширения метасимволов, таких как * и ?, в именах файлов в системах Unix

lesskey

Используется для привязки клавиш в программе less

187

Линукс с нуля - Версия 12.1

8.42. Perl-5.38.2
Пакет Perl содержит практический язык для извлечения данных и составления отчётов (Practical Extraction
and Report Language).
Приблизительное
время сборки:
Требуемое дисковое
пространство:

1.5 SBU
239 MB

8.42.1. Установка пакета Perl
Эта версия 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

188

Линукс с нуля - Версия 12.1

8.42.2. Содержимое пакета Perl
Установленные
программы:

Установленные
библиотеки:
Созданные каталоги:

corelist, cpan, enc2xs, encguess, h2ph, h2xs, instmodsh, json_pp, libnetcfg, perl,
perl5.38.2 (жесткая ссылка на perl), perlbug, perldoc, perlivp, perlthanks (жесткая
ссылка на perlbug), piconv, pl2pm, pod2html, pod2man, pod2text, pod2usage,
podchecker, podselect, prove, ptar, ptardiff, ptargrep, shasum, splain, xsubpp и
zipdetails
Список слишком большой для перечисления
/usr/lib/perl5

Краткое описание
corelist

Интерфейс командной строки для Module::CoreList

cpan

Позволяет получать из командной строки доступ к архиву документации и программ Perl
(Comprehensive Perl Archive Network - CPAN)

enc2xs

Собирает расширение Perl для модуля Encode либо с использование таблицы символов
Unicode, либо сиспользованием файлов кодирования Tcl

encguess

Определяет тип кодировки одного или нескольких файлов

h2ph

Конвертирует заголовочные файлы Си .h в заголовочные файлы Perl .ph

h2xs

Конвертирует заголовочные файлы Си .h в расширения Perl

instmodsh

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

json_pp

Преобразует данные между определенными входными и выходными форматами

libnetcfg

Может использоваться для настройки Perl-модуля libnet

perl

Объединяет лучшие возможности C, sed, awk и sh в одном языке

perl5.38.2

Жесткая ссылка на perl

perlbug

Используется для создания отчетов об ошибках в Perl или модулях, которые поставляются
с ним, и отправки их по почте

perldoc

Отображает часть документации в формате pod, которая встроена в дерево установки Perl
или в сценарий Perl

perlivp

Процедура проверки установки Perl; ее можно использовать для проверки правильности
установки Perl и его библиотек

perlthanks

Используется для создания сообщения-благодарности, отсылаемого разработчикам Perl

piconv

Perl версия конвертера iconv, используемого для кодирования символов

pl2pm

Инструмент для грубого конвертирования файлов .pl Perl4 в модули .pm Perl5

pod2html

Преобразует файлы из формата pod в формат HTML

pod2man

Преобразует данные pod в форматированный входной поток для *roff

pod2text

Преобразует данные pod в форматированный текст ASCII

pod2usage

Печатает в файл сообщения usage из встроенных документов pod

podchecker

Проверяет синтаксис файлов документации формата pod

podselect

Отображает выбранные разделы документации pod

prove

Инструмент командной строки для выполнения тестов с помощью модуля Test::Harness

ptar

Программа, похожая на tar, написанная на Perl
189

Линукс с нуля - Версия 12.1
ptardiff

Программа на Perl для сравнения распакованного и нераспакованного архивов

ptargrep

Программа на Perl для текстового поиска по шаблону внутри tar-архива

shasum

Печатает или проверяет контрольные суммы SHA

splain

Включает подробные предупреждения для диагностики в Perl

xsubpp

Преобразует код Perl XS в код C

zipdetails

Отображает сведения о внутренней структуре Zip-файла

190

Линукс с нуля - Версия 12.1

8.43. XML::Parser-2.47
Модуль XML::Parser представляет собой Perl-интерфейс к XML-парсеру Джеймса Кларка Expat.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

менее 0.1 SBU
2.4 MB

8.43.1. Установка пакета XML::Parser
Подготовьте XML::Parser к компиляции:
perl Makefile.PL

Скомпилируйте пакет:
make

Чтобы протестировать пакет, выполните:
make test

Установите пакет:
make install

8.43.2. Содержимое XML::Parser
Установленный модуль:

Expat.so

Краткое описание
Expat

предоставляет Perl интерфейс для Expat

191

Линукс с нуля - Версия 12.1

8.44. Intltool-0.51.0
Intltool — это инструмент интернационализации, используемый для извлечения переводимых строк из
исходных файлов.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

менее 0.1 SBU
1.5 MB

8.44.1. Установка пакета 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

8.44.2. Содержимое пакета Intltool
Установленные
программы:
Созданные каталоги:

intltool-extract, intltool-merge, intltool-prepare, intltool-update и intltoolize
/usr/share/doc/intltool-0.51.0 и /usr/share/intltool

Краткое описание
intltoolize

Подготавливает пакет для использования intltool

intltool-extract

Генерирует заголовочные файлы, которые могут быть прочитаны с помощью
gettext

intltool-merge

Объединяет переведенные строки в файлы различных типов

intltool-prepare

Обновляет файлы pot и объединяет их с файлами перевода

intltool-update

Обновляет файлы шаблонов po и объединяет их с переводами

192

Линукс с нуля - Версия 12.1

8.45. Autoconf-2.72
Пакет Autoconf содержит программы для создания сценариев оболочки, которые могут автоматически
настраивать исходный код.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

менее 0.1 SBU (около 0.5 SBU с тестами)
25 MB

8.45.1. Установка пакета Autoconf
Подготовьте Autoconf к компиляции:
./configure --prefix=/usr

Скомпилируйте пакет:
make

Чтобы протестировать пакет, выполните:
make check

Установите пакет:
make install

8.45.2. Содержимое пакета Autoconf
Установленные
программы:
Созданные каталоги:

autoconf, autoheader, autom4te, autoreconf, autoscan, autoupdate, и ifnames
/usr/share/autoconf

Краткое описание
autoconf

Генерирует сценарии оболочки, которые автоматически настраивают пакеты исходного
кода программного обеспечения для адаптации ко многим типам Unix-подобных систем;
создаваемые сценарии независимы—для их запуска не требуется программа autoconf.

autoheader

Инструмент для создания файлов шаблонов операторов C #define для использования в
configure

autom4te

Обертка для макропроцессора M4

autoreconf

Автоматически запускает autoconf, autoheader, aclocal, automake, gettextize и libtoolize
в правильном порядке, чтобы сэкономить время, при внесении изменений в файлы
шаблонов autoconf и automake.

autoscan

Помогает создать файл configure.in для пакета программного обеспечения; проверяет
исходные файлы в дереве каталогов, ищет в них распространенные проблемы с
переносимостью и создает файл configure.scan , который является предварительным
файлом configure.in для пакета.

autoupdate

Изменяет файл configure.in , вызывающий макросы autoconf по их старым именам для
использования текущих имен макросов

ifnames

Помогает при написании файла configure.in для пакета; выводит идентификаторы,
которые использует пакет в условных выражениях препроцессора C. (Если пакет уже
был настроен для некоторой переносимости, эта программа может помочь определить,
193

Линукс с нуля - Версия 12.1
что нужно проверить сценарию configure. Он также может заполнить пробелы в файле
configure.in , сгенерированном командой autoscan.)

194

Линукс с нуля - Версия 12.1

8.46. Automake-1.16.5
Пакет Automake содержит программы генерации Makefile для использования с Autoconf.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

менее 0.1 SBU (около 1.6 SBU с тестами)
115 MB

8.46.1. Установка пакета Automake
Подготовьте 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

8.46.2. Содержимое пакета Automake
Установленные
программы:
Созданные каталоги:

aclocal, aclocal-1.16 (жестко связан с aclocal), automake, и automake-1.16 (жестко
связан с automake)
/usr/share/aclocal-1.16, /usr/share/automake-1.16, и /usr/share/doc/automake-1.16.5

Краткое описание
aclocal

Генерирует файлы aclocal.m4 на основе содержимого файла configure.in

aclocal-1.16

Жесткая ссылка на aclocal

automake

Инструмент для автоматического создания Makefile.in из файлов Makefile.am [Чтобы
создать все файлы Makefile.in запустите эту программу в каталоге верхнего уровня.
Сканируя файл configure.in , он автоматически находит все подходящие файлы
Makefile.am и создает соответствующий Makefile.in .]

automake-1.16

Жесткая ссылка на automake

195

Линукс с нуля - Версия 12.1

8.47. OpenSSL-3.2.1
Пакет OpenSSL содержит инструменты управления и библиотеки, относящиеся к криптографии.
Они полезны для предоставления криптографических функций другим пакетам, таким как OpenSSH,
приложениям электронной почты и веб-браузерам (для доступа к сайтам по HTTPS).
Приблизительное
время сборки:
Требуемое дисковое
пространство:

1.8 SBU
805 MB

8.47.1. Установка пакета OpenSSL
Подготовьте 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, «Проблемы с обновлением».
196

Линукс с нуля - Версия 12.1

8.47.2. Содержимое пакета OpenSSL
Установленные
программы:
Установленные
библиотеки:
Созданные каталоги:

c_rehash и openssl
libcrypto.so и libssl.so
/etc/ssl, /usr/include/openssl, /usr/lib/engines и /usr/share/doc/openssl-3.2.1

Краткое описание
c_rehash

это Perl скрипт, который сканирует все файлы в каталоге и добавляет символические
ссылки к их хеш-значениям. Использование c_rehash считается устаревшим и должно
быть заменено командой openssl rehash

openssl

это инструмент командной строки для использования различных криптографических
функций библиотеки OpenSSL из оболочки. Его можно использовать для различных
функций, которые задокументированы в openssl(1)

libcrypto.so

реализует широкий спектр криптографических алгоритмов, используемых в различных
интернет-стандартах. Услуги, предоставляемые этой библиотекой, используют
OpenSSL-реализацию SSL, TLS и S/MIME, а также для реализации OpenSSH, OpenPGP
и других криптографических стандартов.

libssl.so

реализует протокол безопасности транспортного уровня (TLS v1). Он предоставляет
богатый API, документацию по которому можно найти в руководстве ssl(7)

197

Линукс с нуля - Версия 12.1

8.48. Kmod-31
Пакет Kmod содержит библиотеки и утилиты для загрузки модулей ядра.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

менее 0.1 SBU
12 MB

8.48.1. Установка пакета 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

8.48.2. Содержимое пакета Kmod
Установленные
программы:
Установленные
библиотеки:

depmod (ссылка на kmod), insmod (ссылка на kmod), kmod, lsmod (ссылка на
kmod), modinfo (ссылка на kmod), modprobe (ссылка на kmod) и rmmod (ссылка
на kmod)
libkmod.so

Краткое описание
depmod

Создает файл зависимостей на основе символов найденных в существующем наборе модулей;
этот файл используется программой modprobe для автоматической загрузки необходимых
модулей

insmod

Устанавливает загружаемый модуль в работающее ядро
198

Линукс с нуля - Версия 12.1
kmod

Загружает и выгружает модули ядра

lsmod

Список загруженных в данный момент модулей

modinfo

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

modprobe

Использует файл зависимостей, созданный depmod, для автоматической загрузки
соответствующих модулей

rmmod

Выгружает модули из работающего ядра

libkmod

Библиотека используемая другими программами для загрузки и выгрузки модулей ядра

199

Линукс с нуля - Версия 12.1

8.49. Libelf из Elfutils-0.190
Libelf — это библиотека для обработки файлов ELF (Executable and Linkable Format - формат исполняемых
и связываемых файлов).
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.3 SBU
124 MB

8.49.1. Установка пакета Libelf
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

8.49.2. Содержимое пакета Libelf
Установленные
библиотеки:
Созданные каталоги:

libelf.so
/usr/include/elfutils

Краткое описание
libelf.so

Содержит функции API для обработки объектных файлов ELF

200

Линукс с нуля - Версия 12.1

8.50. Libffi-3.4.4
Библиотека Libffi предоставляет переносимый высокоуровневый программный интерфейс для различных
соглашений о вызовах. Это позволяет программисту вызывать любую функцию, указанную в описании
интерфейса вызова во время выполнения.
FFI расшифровывается как интерфейс внешних функций. FFI позволяет программе, написанной на одном
языке, вызывать программу, написанную на другом языке. В частности, Libffi может обеспечить связь между
интерпретатором, таким как Perl или Python, и подпрограммами общей библиотеки, написанными на C или
C++.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

1.8 SBU
11 MB

8.50.1. Установка пакета Libffi
Примечание
Как и 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

8.50.2. Содержимое пакета Libffi
Установленные
библиотеки:

libffi.so
201

Линукс с нуля - Версия 12.1

Краткое описание
libffi

Содержит внешний интерфейс для API-функций

202

Линукс с нуля - Версия 12.1

8.51. Python-3.12.2
Пакет Python 3 содержит среду разработчика Python. Его можно использовать для объектноориентированного программирования, написания скриптов, прототипирования больших программ и
разработка целых приложений. Python — это интерпретируемый язык программирования.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

1.8 SBU
485 MB

8.51.1. Установка пакета Python 3
Подготовьте 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-файла не соответствует цели
203

Линукс с нуля - Версия 12.1
проекта — собрать систему Linux из исходного кода, поэтому предупреждение о новой версии pip3
следует игнорировать. По желанию, вы можете отключить все предупреждение, создав следующий файл
конфигурации:
cat > /etc/pip.conf 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

225

Линукс с нуля - Версия 12.1
Создание загружаемой системы LFS с помощью GRUB будет обсуждаться в Раздел 10.4, «Использование
GRUB для настройки процесса загрузки».

8.63.2. Содержимое пакета GRUB
Установленные
программы:

Созданные каталоги:

grub-bios-setup, grub-editenv, grub-file, grub-fstest, grub-glue-efi, grub-install, grubkbdcomp, grub-macbless, grub-menulst2cfg, grub-mkconfig, grub-mkimage, grubmklayout, grub-mknetdir, grub-mkpasswd-pbkdf2, grub-mkrelpath, grub-mkrescue,
grub-mkstandalone, grub-ofpathname, grub-probe, grub-reboot, grub-render-label,
grub-script-check, grub-set-default, grub-sparc64-setup и grub-syslinux2cfg
/usr/lib/grub, /etc/grub.d, /usr/share/grub и /boot/grub (при первом запуске grubinstall)

Краткое описание
grub-bios-setup

Вспомогательная программа для grub-install

grub-editenv

Инструмент для редактирования блока окружения (environment block)

grub-file

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

grub-fstest

Инструмент для отладки драйвера файловой системы

grub-glue-efi

Объединяет 32-разрядные и 64-разрядные бинарные файлы в один файл (для
компьютеров Apple)

grub-install

Устанавливает GRUB на ваш диск

grub-kbdcomp

Скрипт, который преобразует макет xkb в макет, распознаваемый GRUB

grub-macbless

Это аналог bless в стиле Mac для файловых систем HFS или HFS+ (команда
bless характерна для компьютеров Apple; она делает устройство загрузочным)

grub-menulst2cfg

Преобразует GRUB Legacy menu.lst в grub.cfg для использования с GRUB
2

grub-mkconfig

Генерирует файл grub.cfg

grub-mkimage

Создаёт загрузочный образ GRUB

grub-mklayout

Создаёт файл раскладки клавиатуры GRUB

grub-mknetdir

Подготавливает сетевой загрузочный каталог GRUB

grub-mkpasswd-pbkdf2

Генерирует зашифрованный пароль PBKDF2 для использования в меню
загрузки

grub-mkrelpath

Создает имена системных путей относительно корня

grub-mkrescue

Создает загрузочный образ GRUB, подходящий для дискеты, CDROM/DVD
или USB-накопителя

grub-mkstandalone

Генерирует автономный образ

grub-ofpathname

Вспомогательная программа, которая выводит путь к устройству GRUB

grub-probe

Проверяет информацию об устройстве для заданного пути или устройства

grub-reboot

Устанавливает пункт меню в GRUB для загрузки по умолчанию, только для
следующей загрузки(однократно)

grub-render-label

Отображает .disk_label для компьютеров Apple Mac

grub-script-check

Проверяет скрипт настройки GRUB на наличие синтаксических ошибок

grub-set-default

Устанавливает для GRUB загрузочную запись по умолчанию

grub-sparc64-setup

Вспомогательная программа для grub-setup
226

Линукс с нуля - Версия 12.1
grub-syslinux2cfg

Преобразует файл конфигурации syslinux в формат grub.cfg

227

Линукс с нуля - Версия 12.1

8.64. Gzip-1.13
Пакет Gzip содержит программы для сжатия и распаковки файлов.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.3 SBU
21 MB

8.64.1. Установка пакета Gzip
Подготовьте Gzip к компиляции:
./configure --prefix=/usr

Скомпилируйте пакет:
make

Чтобы протестировать пакет, выполните:
make check

Установите пакет:
make install

8.64.2. Содержимое пакета Gzip
Установленные
программы:

gunzip, gzexe, gzip, uncompress (жесткая ссылка на gunzip), zcat, zcmp, zdiff,
zegrep, zfgrep, zforce, zgrep, zless, zmore и znew

Краткое описание
gunzip

Распаковывает gzip-файлы

gzexe

Создает самораспаковывающиеся исполняемые файлы

gzip

Сжимает файлы, используя алгоритм Lempel-Ziv (LZ77).

uncompress

Распаковывает сжатые файлы

zcat

Распаковывает указанные сжатые файлы в стандартный поток вывода

zcmp

Запускает cmp для архивированных файлов

zdiff

Запускает diff для архивированных файлов

zegrep

Запускает egrep для архивированных файлов

zfgrep

Запускает fgrep для архивированных файлов

zforce

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

zgrep

Запускает grep для архивированных файлов

zless

Запускает less для архивированных файлов

zmore

Запускает more для архивированных файлов

znew

Повторно сжимает файлы из формата compress в формат gzip — из .Z в .gz

228

Линукс с нуля - Версия 12.1

8.65. IPRoute2-6.7.0
Пакет IPRoute2 содержит набор программ для базового и расширенного администрирования сетей IPv4.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.1 SBU
17 MB

8.65.1. Установка пакета IPRoute2
Программа 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

8.65.2. Содержимое пакета IPRoute2
Установленные
программы:
Созданные каталоги:

bridge, ctstat (ссылка на lnstat), genl, ifstat, ip, lnstat, nstat, routel, rtacct, rtmon, rtpr,
rtstat (ссылка на lnstat), ss и tc
/etc/iproute2, /usr/lib/tc и /usr/share/doc/iproute2-6.7.0

Краткое описание
bridge

Настраивает сетевые мосты

ctstat

Утилита состояния подключения

genl

Универсальный интерфейс утилиты netlink

ifstat

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

ip

Основной исполняемый файл. Он имеет несколько различных функций, в том числе эти:
ip link позволяет пользователям просматривать состояние устройств и вносить
изменения
ip addr позволяет пользователям просматривать адреса и их свойства, добавлять новые адреса
и удалять старые
ip neighbor позволяет пользователям просматривать связи с соседями и их свойства, добавлять
новые записи и удалять старые
ip rule позволяет пользователям просматривать политики маршрутизации и изменять их
ip route позволяет пользователям просматривать таблицу маршрутизации и изменять правила
таблицы маршрутизации
229

Линукс с нуля - Версия 12.1
ip tunnel позволяет пользователям просматривать IP-туннели и их свойства, а также изменять их
ip maddr позволяет пользователям просматривать multicast адреса и их свойства и изменять их
ip mroute позволяет пользователям устанавливать, изменять или удалять multicast
маршрутизацию.
ip monitor позволяет пользователям постоянно отслеживать состояние устройств, адресов и
маршрутов
lnstat

Предоставляет сетевую статистику Linux; это обобщенная и более полнофункциональная замена
старой программы rtstat

nstat

Отображает сетевую статистику

routel

Компонент ip route для просмотра таблиц маршрутизации

rtacct

Отображает содержимое /proc/net/rt_acct

rtmon

Мониторит изменения таблицы маршрутизации

rtpr

Преобразует вывод ip -o в удобочитаемую форму

rtstat

Утилита состояния маршрута

ss

Аналогично команде netstat показывает активные соединения

tc

Управление трафиком для реализаций качества обслуживания (QoS) и класса обслуживания (CoS)
tc qdisc позволяет пользователям настроить дисциплину обработки очередей
tc class позволяет пользователям настраивать классы, на основе планирования дисциплины
обработки очередей
tc filter позволяет пользователям настроить фильтрацию пакетов QOS/COS
tc monitor может использоваться для просмотра изменений, внесенных в управление трафиком
в ядре

230

Линукс с нуля - Версия 12.1

8.66. Kbd-2.6.4
Пакет Kbd содержит файлы таблиц клавиш, консольные шрифты и утилиты клавиатуры.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.1 SBU
34 MB

8.66.1. Установка пакета 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

231

Линукс с нуля - Версия 12.1

8.66.2. Содержимое пакета Kbd
Установленные
программы:

Созданные каталоги:

chvt, deallocvt, dumpkeys, fgconsole, getkeycodes, kbdinfo, kbd_mode, kbdrate,
loadkeys, loadunimap, mapscrn, openvt, psfaddtable (ссылка на psfxtable),
psfgettable (ссылка на psfxtable), psfstriptable (ссылка на psfxtable), psfxtable,
setfont, setkeycodes, setleds, setmetamode, setvtrgb, showconsolefont, showkey,
unicode_start и unicode_stop
/usr/share/consolefonts, /usr/share/consoletrans, /usr/share/keymaps, /usr/share/doc/
kbd-2.6.4 и /usr/share/unimaps

Краткое описание
chvt

Изменяет используемый виртуальный терминал

deallocvt

Освобождает неиспользуемые виртуальные терминалы

dumpkeys

Создает дамп таблиц перевода клавиатуры

fgconsole

Выводит номер активного виртуального терминала

getkeycodes

Выводит таблицу ядра соответствия сканкода и кода клавиши

kbdinfo

Получает информацию о состоянии консоли

kbd_mode

Выводит или устанавливает режим клавиатуры

kbdrate

Устанавливает частоту повторных нажатий клавиш и задержки клавиатуры

loadkeys

Загружает таблицу преобразования клавиатуры

loadunimap

Загружает таблицу ядра отображения символов юникода

mapscrn

Устаревшая программа, которая использовалась для загрузки определяемой
пользователем таблицы соответствия выводимых символов в драйвер консоли;
теперь эту функцию выполняет setfont

openvt

Запускает программу на новом виртуальном терминале (VT)

psfaddtable

Добавляет таблицу символов Unicode в консольный шрифт.

psfgettable

Извлекает встроенную таблицу символов Unicode из консольного шрифта.

psfstriptable

Удаляет встроенную таблицу символов Unicode из консольного шрифта.

psfxtable

Обрабатывает таблицы символов Unicode для консольных шрифтов.

setfont

Изменяет шрифты Enhanced Graphic Adapter (EGA) и Video Graphics Array (VGA),
используемые в консоли

setkeycodes

Загружает таблицу соответствия сканкодов ядра и кодов клавиш; это удобно, если на
клавиатуре есть нестандартные клавиши

setleds

Устанавливает значения флагов клавиатуры и индикаторов (обычно - светодиоды)

setmetamode

Определяет обработку метаклавиши на клавиатуре (обычно, это клавиша Win)

setvtrgb

Устанавливает цветовую схему консоли для всех виртуальных терминалов

showconsolefont

Показывает текущий шрифт экрана консоли EGA/VGA

showkey

Показывает сканкоды, код клавиши и код ASCII для клавиш, нажатых на клавиатуре

unicode_start

Переводит клавиатуру и консоль в режим UNICODE. [Не используйте эту программу,
если вы не используете файл раскладки для кодировки ISO-8859-1. Для других
кодировок эта утилита выдает неправильные результаты].

unicode_stop

Возвращает клавиатуру и консоль из режима UNICODE
232

Линукс с нуля - Версия 12.1

8.67. Libpipeline-1.5.7
Пакет Libpipeline содержит библиотеку для гибкого и удобного управления подпроцессами.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.1 SBU
10 MB

8.67.1. Установка пакета Libpipeline
Подготовьте Libpipeline к компиляции:
./configure --prefix=/usr

Скомпилируйте пакет:
make

Чтобы протестировать пакет, выполните:
make check

Установите пакет:
make install

8.67.2. Содержимое пакета Libpipeline
Установленные
библиотеки:

libpipeline.so

Краткое описание
libpipeline

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

233

Линукс с нуля - Версия 12.1

8.68. Make-4.4.1
Пакет Make содержит программу, управляющую генерацией исполняемых и других файлов, из исходного
кода.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.5 SBU
13 MB

8.68.1. Установка пакета Make
Подготовьте Make к компиляции:
./configure --prefix=/usr

Скомпилируйте пакет:
make

Чтобы протестировать пакет, выполните:
chown -R tester .
su tester -c "PATH=$PATH make check"

Установите пакет:
make install

8.68.2. Содержимое пакета Make
Установленные
программы:

make

Краткое описание
make

Автоматически определяет, какие части пакета необходимо (пере)компилировать и запускает
соответствующие команды.

234

Линукс с нуля - Версия 12.1

8.69. Patch-2.7.6
Пакет Patch содержит программу для изменения или создания файлов путём наложение «патча», обычно,
создаваемого программой diff.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.1 SBU
12 MB

8.69.1. Установка пакета Patch
Подготовьте Patch к компиляции:
./configure --prefix=/usr

Скомпилируйте пакет:
make

Чтобы протестировать пакет, выполните:
make check

Установите пакет:
make install

8.69.2. Содержимое пакета Patch
Установленные
программы:

patch

Краткое описание
patch

Изменяет файлы в соответствии с файлом исправления (патч обычно представляет собой список
отличий, создаваемый с помощью программы diff. Применяя их к исходным файлам, patch создает
исправленные версии.)

235

Линукс с нуля - Версия 12.1

8.70. Tar-1.35
Пакет Tar предоставляет возможность создавать tar архивы, а также производить с ними различные
манипуляции. Tar может распаковать предварительно созданный архив, добавить или обновить файлы в нём,
вернуть список файлов в архиве.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.5 SBU
43 MB

8.70.1. Установка пакета 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

8.70.2. Содержимое пакета Tar
Установленные
программы:
Созданные каталоги:

tar
/usr/share/doc/tar-1.35

Краткое описание
tar

Создает архивы, извлекает файлы и отображает содержимое архивов, также известных как Тарболл.

236

Линукс с нуля - Версия 12.1

8.71. Texinfo-7.1
Пакет Texinfo содержит программы для чтения, записи и преобразования информационных страниц.
Приблизительное
0.3 SBU
время сборки:
Требуемое дисковое
139 MB
пространство:

8.71.1. Установка пакета 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

8.71.2. Содержимое пакета Texinfo
Установленные
программы:
Установленные
библиотеки:
Созданные каталоги:

info, install-info, makeinfo (ссылка на texi2any), pdftexi2dvi, pod2texi, texi2any,
texi2dvi, texi2pdf, и texindex
MiscXS.so, Parsetexi.so и XSParagraph.so (все в /usr/lib/texinfo)
/usr/share/texinfo и /usr/lib/texinfo

Краткое описание
info

Используется для чтения информационных страниц, которые похожи на справочные
страницы, но гораздо подробнее описывают применение всех доступных параметров
командной строки [Например, сравните man bison и info bison.]
237

Линукс с нуля - Версия 12.1
install-info

Используется для установки информационных страниц; он обновляет записи в
индексном файле команды info

makeinfo

Переводит исходные документы Texinfo в информационные страницы, обычный текст
или HTML.

pdftexi2dvi

Используется для форматирования документа Texinfo в файл Portable Document Format
(PDF).

pod2texi

Преобразует Pod в формат Texinfo

texi2any

Переводит исходную документацию Texinfo в различные другие форматы.

texi2dvi

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

texi2pdf

Используется для форматирования данного документа Texinfo в файл Portable Document
Format (PDF).

texindex

Используется для сортировки индексных файлов Texinfo.

238

Линукс с нуля - Версия 12.1

8.72. Vim-9.1.0041
Пакет Vim содержит мощный текстовый редактор.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

2.5 SBU
236 MB

Альтернативы Vim
.Если вы предпочитаете другой текстовый редактор, например, Emacs, Joe или Nano, обратитесь к
https://mirror.linuxfromscratch.ru/blfs/view/12.1/postlfs/editors.html за рекомендациями по установке.

8.72.1. Установка пакета Vim
Во-первых, измените расположение файла конфигурации 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

239

Линукс с нуля - Версия 12.1
Если в LFS будет установлена система X Window, может потребоваться перекомпилировать Vim после
установки X. Vim поставляется с графической версией редактора, для которой требуется установка X
и некоторых дополнительных библиотек. Для получения дополнительной информации об этом процессе
обратитесь к документации по Vim и странице установки Vim в книге BLFS по адресу https://mirror.
linuxfromscratch.ru/blfs/view/12.1/postlfs/vim.html.

8.72.2. Настройка Vim
По умолчанию vim работает в режиме, несовместимом с vi. Это может показаться необычным для
пользователей, которые в прошлом использовали другие редакторы. Параметр «nocompatible» включен
ниже, чтобы подчеркнуть тот факт, что используется новое поведение. Настройка также напоминает тем,
кто хотел бы перейти в режим «compatible», что параметр должен быть первым в файле конфигурации.
Это необходимо, потому что изменяются другие параметры, и переопределения происходят после этой
настройки. Создайте файл конфигурации vim по умолчанию, выполнив следующие действия:
cat > /etc/vimrc /etc/udev/network/99-default.link

9.4.2. Символические ссылки CD-ROM
Некоторое программное обеспечение, которое вы, возможно, захотите установить позже (например,
различные медиаплееры) ожидают, что устройства /dev/cdrom или /dev/dvd и символические ссылки на
CD-ROM или DVD-ROM устройства должны существовать. Кроме того, может быть удобно использовать
273

Линукс с нуля - Версия 12.1
эти символические ссылки в /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-cdromsymlinks.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, будут правильными, проблема возникнет только в том случае, если символические ссылки в обеих
274

Линукс с нуля - Версия 12.1
системах указывают на одно и то же устройство. Если потребуется, проверьте (и, возможно, отредактируйте)
сгенерированные правила в файле /etc/udev/rules.d/70-persistent-cd.rules
после загрузки, чтобы
убедиться, что назначенные символические ссылки соответствуют тому, что вам нужно.

9.4.3. Работа с дубликатами устройств
Как поясняется в Раздел 9.3, «Взаимодействие с устройствами и модулями», порядок отображения
устройства с одинаковой функциональностью в /dev является, как правило, случайным. Например, если
у вас есть веб камера и TV тюнер, иногда /dev/video0 ссылается на камеру, а /dev/video1 ссылается
на TV тюнер, а иногда, например, после перезагрузки системы, порядок поменяется на противоположный.
Для всех классов оборудования, за исключением звуковых и сетевых карт, это можно исправить, написав
правила udev для создания постоянных символических ссылок. Случай с сетевыми картами описан отдельно
в Раздел 9.5, «Настройка сети», инструкции по настройке звуковых карт можно найти в BLFS.
Для каждого из ваших устройств, которые могут иметь такую проблему (даже если проблема не существует
в текущем дистрибутиве Linux ), найдите соответствующий каталог в /sys/class или /sys/block .
Для видеоустройств это может быть /sys/class/video4linux/videoX
. Определите атрибуты, которые
однозначно идентифицируют устройство (обычно это идентификаторы поставщика и продукта и/или
серийные номера):
udevadm info -a -p /sys/class/video4linux/video0

Затем напишите правила, которые создают символические ссылки, например:
cat > /etc/udev/rules.d/83-duplicate_devs.rules ifconfig.eth0 /etc/resolv.conf /etc/hostname
замените на имя вашего компьютера. Не вносите сюда полное доменное имя(FQDN). Эта информация

помещается в файл /etc/hosts .

9.5.4. Настройка файла /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
172.x.0.1 - 172.x.255.254
192.168.y.1 - 192.168.y.254

Стандартный префикс
8
16
24

x может быть любым числом в диапазоне 16-31. y может быть любым числом в диапазоне 0-255.
Правильным IP адресом в локальной сети может быть 192.168.1.1.
Если компьютер должен быть виден в Интернете, действительным полным доменным именем может быть
само имя домена или строка, полученная путем объединения префикса (часто имени хоста) и домена с
помощью символа «.». Кроме того, вам необходимо обратиться к администратору домена, чтобы связать
полное доменное имя и ваш общедоступный IP-адрес.
Даже если компьютер не виден из Интернета, полное доменное имя все равно необходимо для правильной
работы некоторых программ, таких как MTA. Для этих целей можно использовать специальное полное
доменное имя localhost.localdomain .
Создайте файл /etc/hosts , выполнив команду:
cat > /etc/hosts /etc/inittab /etc/sysconfig/clock /etc/sysconfig/console /etc/sysconfig/console /etc/sysconfig/console /etc/sysconfig/console /etc/sysconfig/console /etc/sysconfig/console /etc/sysconfig/console /etc/profile /etc/inputrc /etc/shells /etc/fstab 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.
292

Линукс с нуля - Версия 12.1
Также возможно указать значения кодовой страницы по умолчанию и 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.

293

Линукс с нуля - Версия 12.1

10.3. Linux-6.7.4
Этот пакет содержит ядро Linux.
Приблизительное
время сборки:
Требуемое дисковое
пространство:

0.6 - 20.4 SBU (обычно около 1.4 SBU)
1.8 - 10.6 GB (обычно около 2 GB)

10.3.1. Установка ядра
Сборка ядра состоит из нескольких этапов—настройка, компиляция и установка. Ознакомьтесь с файлом
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= LC_ALL=

Устанавливает значение локали на то, которое используется на хосте. Это может понадобиться для
правильного отображения интерфейса menuconfig с помощью ncurses в текстовой консоли Linux с
UTF-8.
Если это необходимо, обязательно замените значение на значение переменной $LANG
вашего хоста. В качестве альтернативы вы можете использовать значения переменных $LC_ALL или $LC_
CTYPE .
294

Линукс с нуля - Версия 12.1
make menuconfig
Эта команда запускает интерфейс на основе 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
[*]
Randomize the address of the kernel image (KASLR)
General architecture-dependent options --->
[*] Stack Protector buffer overflow detection
[*]
Strong Stack Protector

[RELOCATABLE]
[RANDOMIZE_BASE]
[STACKPROTECTOR]
[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 --->
[*] Message Signaled Interrupts (MSI and MSI-X)
[*] IOMMU Hardware Support --->
[*] Support for Interrupt Remapping

295

[PCI]
[PCI_MSI]
[IOMMU_SUPPORT]
[IRQ_REMAP]

Линукс с нуля - Версия 12.1
Если вы создаете 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.
296

Линукс с нуля - Версия 12.1
и Framebuffer Console support
Они необходимы для отображения консоли Linux на графическом процессоре, управляемом драйвером
DRI (Direct Rendering Infrastructure - инфраструктура прямого рендеринга). Если CONFIG_DRM (Direct
Rendering Manager - диспетчер прямого рендеринга) включен, вам также следует включить эти две
опции, иначе вы увидите пустой экран после загрузки драйвера DRI.

Enable legacy fbdev support for your modesetting driver

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

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

cp -iv System.map /boot/System.map-6.7.4

297

Линукс с нуля - Версия 12.1
Файл конфигурации ядра .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». Поэтому их никогда не следует
заменять на чистые заголовочные файлы ядра или любые другие подготовленные заголовочные
файлы.

10.3.2. Настройка порядка загрузки модулей Linux
В большинстве случаев модули Linux загружаются автоматически, но иногда требуется определенный
порядок. Программа, которая загружает модули, modprobe или insmod, использует файл /etc/modprobe.
d/usb.conf
как раз для этой цели. Этот файл должен быть заполнен таким образом, что если USBдрайверы (ehci_hcd, ohci_hcd и uhci_hcd) были собраны в виде модулей, то они будут загружены в
правильном порядке; ehci_hcd должен быть загружен до ohci_hcd и uhci_hcd для того, чтобы избежать
предупреждений во время загрузки.

298

Линукс с нуля - Версия 12.1
Создайте новый файл /etc/modprobe.d/usb.conf

, выполнив следующую команду:

install -v -m755 -d /etc/modprobe.d
cat > /etc/modprobe.d/usb.conf /boot/grub/grub.cfg /etc/lfs-release

Следующие два файла, содержащие описание установленной системы, могут использоваться пакетами,
устанавливаемыми позже, либо в бинарном виде, либо путем их сборки.
Первый показывает статус вашей новой системы по отношению к стандарту LSB. Чтобы создать этот файл,
выполните:
cat > /etc/lsb-release /etc/os-release ~/mount-virt.sh /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

306

Линукс с нуля - Версия 12.1
Обратите внимание, что последние три команды в скрипте закомментированы. Они пригодятся, если
эти каталоги монтируются как отдельные разделы в хост-системе и будут монтироваться при загрузке
завершенной системы 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'

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

11.5.2.2. Работа удаленно по ssh
Этот метод также предоставляет полноценную графическую среду, но сначала требует установки sshd в
системе LFS, обычно в chroot. Кроме этого потребуется второй компьютер. Преимущество этого метода в
том, что он прост, поскольку не требует сложной среды chroot. Он также использует собранное вами ядро LFS
для всех дополнительных пакетов и по-прежнему предоставляет полную систему для установки пакетов.
Вы можете использовать команду scp для загрузки исходных текстов пакетов, которые будут собраны в
системе LFS. Если вместо этого вы хотите загрузить исходные тексты непосредственно в систему LFS,
установите libtasn1, p11-kit, make-ca и wget в chroot (или загрузите их исходники с помощью scp после
загрузки системы LFS).

11.5.2.3. Работа из командной строки 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.

307

Линукс с нуля - Версия 12.1

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

Линукс с нуля - Версия 12.1

Приложение A. Сокращения и условные
обозначения
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 - Интерфейс подключения дисковых устройств
309

Линукс с нуля - Версия 12.1
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 - Команда, определяющая маску создания пользовательских файлов
310

Линукс с нуля - Версия 12.1
USB

Universal Serial Bus - Универсальная последовательная шина

UTC

Coordinated Universal Time - Всемирное координированное время

UUID

Universally Unique Identifier - Универсальный уникальный идентификатор

VC

Virtual Console - Виртуальная консоль

VGA

Video Graphics Array - Компонентный видеоинтерфейс

VT

Virtual Terminal - Виртуальный терминал

311

Линукс с нуля - Версия 12.1

Приложение B. Благодарности
Мы хотели бы поблагодарить следующих людей и организации за их вклад в проект Linux From Scratch.
• Gerard Beekmans – Основатель проекта LFS
• Bruce Dubbs – Главный редактор LFS
• Jim Gifford – Второй руководитель проекта CLFS
• Pierre Labastie – Редактор BLFS и руководитель ALFS
• DJ Lucas – Редактор проектов LFS и BLFS
• Ken Moffat – Редактор BLFS
• Бесчисленное множество других людей из различных списков рассылки проектов LFS и BLFS, которые
помогали в создании этой книги, присылая свои предложения, проверяя книгу и отправляя отчеты об
ошибках, инструкции и собственный опыт установки различных пакетов.

Переводчики
• Manuel Canales Esparcia – Перевод проекта LFS на испанский язык
• Johan Lenglet – Перевод проекта LFS на французский язык до 2008 г.
• Jean-Philippe Mengual – Перевод проекта LFS на французский язык
2008-2016 гг
• Julien Lepiller – Перевод проекта LFS на французский язык с 2017-по
настоящее время
• Anderson Lizardo – Перевод проекта LFS на португальский язык до 2022
г.
• Jamenson Espindula – Перевод проекта LFS на португальский язык 2022-по
настоящее время
• Thomas Reitelbach – Перевод проекта LFS на немецкий язык
• Anton Maisak – Перевод проекта LFS на русский язык 2018-2020 гг
• Elena Shevcova – Перевод проекта LFS на русский язык 2018-2020 гг
• Vladimir Pertsev – Перевод проекта LFS на русский язык 2022-по настоящее
время

Зеркала проекта
Североамериканские зеркала
• Scott Kveton – зеркало lfs.oregonstate.edu
• William Astle – зеркало ca.linuxfromscratch.org
• Eujon Sellers – зеркало lfs.introspeed.com
• Justin Knierim – зеркало lfs-matrix.net

Южноамериканские зеркала
• Manuel Canales Esparcia – зеркало lfsmirror.lfs-es.info
• Luis Falcon – зеркало torredehanoi.org
312

Линукс с нуля - Версия 12.1

Европейские зеркала
• Guido Passet – зеркало nl.linuxfromscratch.org
• Bastiaan Jacques – зеркало lfs.pagefault.net
• Sven Cranshoff – зеркало lfs.lineo.be
• Scarlet Belgium – зеркало lfs.scarlet.be
• Sebastian Faulborn – зеркало lfs.aliensoft.org
• Stuart Fox – зеркало lfs.dontuse.ms
• Ralf Uhlemann – зеркало lfs.oss-mirror.org
• Antonin Sprinzl – зеркало at.linuxfromscratch.org
• Fredrik Danerklint – зеркало se.linuxfromscratch.org
• Franck – зеркало lfs.linuxpourtous.com
• Philippe Baque – зеркало lfs.cict.fr
• Benjamin Heil – зеркало lfs.wankoo.org
• Vladimir Pertsev – зеркало mirror.linuxfromscratch.ru

Азиатские зеркала
• Satit Phermsawang – зеркало lfs.phayoune.org
• Shizunet Co.,Ltd. – зеркало lfs.mirror.shizu-net.jp

Австралийские зеркала
• Jason Andrade – зеркало au.linuxfromscratch.org

Бывшие участники проекта
• Christine Barczak – Редактор книги LFS
• Archaic – Технический писатель/редактор LFS, руководитель проекта
HLFS, редактор BLFS, Сопровождающий проекта Советы и патчи
• Matthew Burgess – Руководитель проекта LFS, технический писатель/
редактор LFS
• Nathan Coulson – Сопровождающий LFS-Bootscripts
• Timothy Bauscher
• Robert Briggs
• Ian Chilton
• Jeroen Coumans – Разработчик веб-сайта, сопровождающий FAQ
• Manuel Canales Esparcia – Сопровождающий XML и XSL проектов LFS/
BLFS/HLFS
• Alex Groenewoud – Технический писатель LFS
• Marc Heerdink
• Jeremy Huntwork – Технический писатель LFS, сопровождающий LFS
LiveCD
• Bryan Kadzban – Технический писатель LFS
313

Линукс с нуля - Версия 12.1
• Mark Hymers
• Seth W. Klein – Сопровождающий FAQ
• Nicholas Leippe – Сопровождающий Wiki
• Anderson Lizardo – Сопровождающий движка сайта
• Randy McMurchy – Руководитель проекта BLFS, редактор LFS
• Dan Nicholson – Редактор LFS и BLFS
• Alexander E. Patrakov – Технический писатель LFS, редактор
интернационализации LFS, сопровождающий LFS Live CD
• Simon Perreault
• Scot Mc Pherson – Сопровождающий шлюза NNTP для проекта LFS
• Douglas R. Reno – Редактор Systemd
• Ryan Oliver – Один из руководителей проекта CLFS
• Greg Schafer – Технический писатель проекта LFS и архитектор методов сборки
пакетов следующего поколения, предназначенных для 64-битной архитектуры
• Jesse Tie-Ten-Quee – Технический писатель LFS
• James Robertson – Сопровождающий Bugzilla
• Tushar Teredesai – Редактор книги BLFS, руководитель проекта Советы и
Патчи
• Jeremy Utley – Технический писатель проекта LFS, сопровождающий
Bugzilla, сопровождающий LFS-Bootscripts
• Zack Winkles – Технический писатель проекта LFS

314

Линукс с нуля - Версия 12.1

Приложение C. Зависимости
Каждый пакет в системе LFS для правильной сборки и установки может ссылаться на один или несколько
других пакетов. Некоторые пакеты могут иметь циклические зависимости, то есть первый пакет зависит от
второго, который в свою очередь, зависит от первого. Именно по этой причине, указанный порядок сборки
пакетов в LFS очень важен. Цель этой страницы - документировать зависимости каждого пакета, собранного
в LFS
Для каждого собираемого пакета существует от трёх до пяти типов зависимостей, перечисленных ниже. В
первом списке перечислены другие пакеты, которые должны быть доступны для компиляции и установки
рассматриваемого пакета. Во втором перечислены пакеты, которые должны быть доступны, когда какиелибо программы или библиотеки из пакета используются во время его выполнения. В третьем списке
перечислены пакеты, которые, в дополнение к пакетам из первого списка, должны быть доступны для
запуска наборов тестов. Четвертый список зависимостей — это пакеты, которые требуют, чтобы некий пакет
был собран и установлен по определенному пути, прежде чем они будут собраны и установлены.
Последний список зависимостей - это необязательные пакеты, которые не рассматриваются в LFS, но
могут быть полезны пользователю. Эти пакеты могут иметь дополнительные как обязательные, так и
необязательные зависимости. Такие зависимости - рекомендуется разрешать после завершения сборки всей
системы LFS. В некоторых случаях, повторная установка некоторых таких пакетов рассматривается в BLFS.

Acl
Установка зависит от:

Attr, Bash, Binutils, Coreutils, GCC, Gettext, Grep, M4, Make, Perl, Sed и Texinfo

Требуется во время
выполнения:

Attr и Glibc

Набор тестов зависит
от:

Automake, Diffutils, Findutils и Libtool

Должен быть
установлен до:

Coreutils, Sed, Tar и Vim

Необязательные
зависимости:

Нет

Attr
Установка зависит от:

Bash, Binutils, Coreutils, GCC, Gettext, Glibc, Grep, M4, Make, Perl, Sed и Texinfo

Требуется во время
выполнения:

Glibc

Набор тестов зависит
от:

Automake, Diffutils, Findutils и Libtool

Должен быть
установлен до:

Acl, Libcap и Patch

Необязательные
зависимости:

Нет

315

Линукс с нуля - Версия 12.1

Autoconf
Установка зависит от:

Bash, Coreutils, Grep, M4, Make, Perl, Sed и Texinfo

Требуется во время
выполнения:

Bash, Coreutils, Grep, M4, Make, Sed и Texinfo

Набор тестов зависит
от:

Automake, Diffutils, Findutils, GCC и Libtool

Должен быть
установлен до:

Automake и Coreutils

Необязательные
зависимости:

Emacs

Automake
Установка зависит от:

Autoconf, Bash, Coreutils, Gettext, Grep, M4, Make, Perl, Sed, и Texinfo

Требуется во время
выполнения:

Bash, Coreutils, Grep, M4, Sed и Texinfo

Набор тестов зависит
от:

Binutils, Bison, Bzip2, DejaGNU, Diffutils, Expect, Findutils, Flex, GCC, Gettext,
Gzip, Libtool и Tar

Должен быть
установлен до:

Coreutils

Необязательные
зависимости:

Нет

Bash
Установка зависит от:

Bash, Binutils, Bison, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make, Ncurses,
Patch, Readline, Sed и Texinfo

Требуется во время
выполнения:

Glibc, Ncurses и Readline

Набор тестов зависит
от:

Expect и Shadow

Должен быть
установлен до:

Нет

Необязательные
зависимости:

Xorg

Bc
Установка зависит от:

Bash, Binutils, Coreutils, GCC, Glibc, Grep, Make и Readline

Требуется во время
выполнения:

Glibc, Ncurses и Readline

Набор тестов зависит
от:

Gawk

Должен быть
установлен до:

Linux

Необязательные
зависимости:

Нет
316

Линукс с нуля - Версия 12.1

Binutils
Установка зависит от:

Bash, Binutils, Coreutils, Diffutils, File, Flex, Gawk, GCC, Glibc, Grep, Make, Perl,
Pkgconf, Sed, Texinfo, Zlib и Zstd

Требуется во время
выполнения:

Glibc, Zlib и Zstd

Набор тестов зависит
от:

DejaGNU и Expect

Должен быть
установлен до:

Нет

Необязательные
зависимости:

Elfutils и Jansson

Bison
Установка зависит от:

Bash, Binutils, Coreutils, GCC, Gettext, Glibc, Grep, M4, Make, Perl и Sed

Требуется во время
выполнения:

Glibc

Набор тестов зависит
от:

Diffutils, Findutils и Flex

Должен быть
установлен до:

Kbd и Tar

Необязательные
зависимости:

Doxygen

Bzip2
Установка зависит от:

Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Make и Patch

Требуется во время
выполнения:

Glibc

Набор тестов зависит
от:

Нет

Должен быть
установлен до:

File и Libelf

Необязательные
зависимости:

Нет

Check
Установка зависит от:

Gawk, GCC, Grep, Make, Sed и Texinfo

Требуется во время
выполнения:

Bash и Gawk

Набор тестов зависит
от:

Нет

Должен быть
установлен до:

Нет

Необязательные
зависимости:

libsubunit и patchutils
317

Линукс с нуля - Версия 12.1

Coreutils
Установка зависит от:

Autoconf, Automake, Bash, Binutils, Coreutils, GCC, Gettext, Glibc, GMP, Grep,
Libcap, Make, OpenSSL, Patch, Perl, Sed и Texinfo

Требуется во время
выполнения:

Glibc

Набор тестов зависит
от:

Diffutils, E2fsprogs, Findutils, Shadow и Util-linux

Должен быть
установлен до:

Bash, Diffutils, Findutils, Man-DB и Udev

Необязательные
зависимости:

Expect.pm и IO::Tty

DejaGNU
Установка зависит от:

Bash, Coreutils, Diffutils, Expect, GCC, Grep, Make, Sed и Texinfo

Требуется во время
выполнения:

Expect и Bash

Набор тестов зависит
от:

Нет

Должен быть
установлен до:

Нет

Необязательные
зависимости:

Нет

Diffutils
Установка зависит от:

Bash, Binutils, Coreutils, Gawk, GCC, Gettext, Glibc, Grep, Make, Sed и Texinfo

Требуется во время
выполнения:

Glibc

Набор тестов зависит
от:

Perl

Должен быть
установлен до:

Нет

Необязательные
зависимости:

Нет

E2fsprogs
Установка зависит от:

Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Gzip, Make, Pkgconf,
Sed, Texinfo и Util-linux

Требуется во время
выполнения:

Glibc и Util-linux

Набор тестов зависит
от:

Procps-ng и Psmisc

Должен быть
установлен до:

Нет

Необязательные
зависимости:

Нет
318

Линукс с нуля - Версия 12.1

Expat
Установка зависит от:

Bash, Binutils, Coreutils, Gawk, GCC, Glibc, Grep, Make и Sed

Требуется во время
выполнения:

Glibc

Набор тестов зависит
от:

Нет

Должен быть
установлен до:

Python и XML::Parser

Необязательные
зависимости:

Нет

Expect
Установка зависит от:

Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make, Patch, Sed и Tcl

Требуется во время
выполнения:

Glibc и Tcl

Набор тестов зависит
от:

Нет

Должен быть
установлен до:

Нет

Необязательные
зависимости:

Tk

File
Установка зависит от:

Bash, Binutils, Bzip2, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make, Sed, Xz
и Zlib

Требуется во время
выполнения:

Glibc, Bzip2, Xz и Zlib

Набор тестов зависит
от:

Нет

Должен быть
установлен до:

Нет

Необязательные
зависимости:

libseccomp

Findutils
Установка зависит от:

Bash, Binutils, Coreutils, GCC, Gettext, Glibc, Grep, Make, Sed, и Texinfo

Требуется во время
выполнения:

Bash и Glibc

Набор тестов зависит
от:

DejaGNU, Diffutils и Expect

Должен быть
установлен до:

Нет

Необязательные
зависимости:

Нет
319

Линукс с нуля - Версия 12.1

Flex
Установка зависит от:

Bash, Binutils, Coreutils, GCC, Gettext, Glibc, Grep, M4, Make, Patch, Sed и Texinfo

Требуется во время
выполнения:

Bash, Glibc и M4

Набор тестов зависит
от:

Bison и Gawk

Должен быть
установлен до:

Binutils, IProute2, Kbd, Kmod и Man-DB

Необязательные
зависимости:

Нет

Flit-Core
Установка зависит от:

Python

Требуется во время
выполнения:

Python

Набор тестов зависит
от:

Набор тестов недоступен

Должен быть
установлен до:

Wheel

Необязательные
зависимости:

pytest и testpath

Gawk
Установка зависит от:

Bash, Binutils, Coreutils, GCC, Gettext, Glibc, GMP, Grep, Make, MPFR, Patch,
Readline, Sed и Texinfo

Требуется во время
выполнения:

Bash, Glibc и Mpfr

Набор тестов зависит
от:

Diffutils

Должен быть
установлен до:

Нет

Необязательные
зависимости:

libsigsegv

GCC
Установка зависит от:

Bash, Binutils, Coreutils, Diffutils, Findutils, Gawk, GCC, Gettext, Glibc, GMP,
Grep, Libxcrypt, M4, Make, MPC, MPFR, Patch, Perl, Sed, Tar, Texinfo и Zstd

Требуется во время
выполнения:

Bash, Binutils, Glibc, Mpc и Python

Набор тестов зависит
от:

DejaGNU, Expect и Shadow

Должен быть
установлен до:

Нет

Необязательные
зависимости:

GDC, GNAT, и ISL
320

Линукс с нуля - Версия 12.1

GDBM
Установка зависит от:

Bash, Binutils, Coreutils, Diffutils, GCC, Grep, Make и Sed

Требуется во время
выполнения:

Bash, Glibc и Readline

Набор тестов зависит
от:

Нет

Должен быть
установлен до:

Нет

Необязательные
зависимости:

Нет

Gettext
Установка зависит от:

Bash, Binutils, Coreutils, Gawk, GCC, Glibc, Grep, Make, Ncurses, Sed и Texinfo

Требуется во время
выполнения:

Acl, Bash, Gcc и Glibc

Набор тестов зависит
от:

Diffutils, Perl и Tcl

Должен быть
установлен до:

Automake и Bison

Необязательные
зависимости:

libunistring и libxml2

Glibc
Установка зависит от:

Bash, Binutils, Bison, Coreutils, Diffutils, Gawk, GCC, Gettext, Grep, Gzip, Linux
API Headers, Make, Perl, Python, Sed и Texinfo

Требуется во время
выполнения:

Нет

Набор тестов зависит
от:

File

Должен быть
установлен до:

Нет

Необязательные
зависимости:

Нет

GMP
Установка зависит от:

Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, M4, Make, Sed и
Texinfo

Требуется во время
выполнения:

GCC и Glibc

Набор тестов зависит
от:

Нет

Должен быть
установлен до:

MPFR и GCC

Необязательные
зависимости:

Нет
321

Линукс с нуля - Версия 12.1

Gperf
Установка зависит от:
Требуется во время
выполнения:
Набор тестов зависит
от:
Должен быть
установлен до:
Необязательные
зависимости:

Bash, Binutils, Coreutils, GCC, Glibc и Make
GCC и Glibc
Diffutils и Expect
Нет
Нет

Grep
Установка зависит от:
Требуется во время
выполнения:
Набор тестов зависит
от:
Должен быть
установлен до:
Необязательные
зависимости:

Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Patch, Sed и
Texinfo
Glibc
Gawk
Man-DB
PCRE2 и libsigsegv

Groff
Установка зависит от:
Требуется во время
выполнения:
Набор тестов зависит
от:
Должен быть
установлен до:
Необязательные
зависимости:

Bash, Binutils, Bison, Coreutils, Gawk, GCC, Glibc, Grep, Make, Patch, Sed и
Texinfo
GCC, Glibc и Perl
Набор тестов недоступен
Man-DB
ghostscript и Uchardet

GRUB
Установка зависит от:
Требуется во время
выполнения:
Набор тестов зависит
от:
Должен быть
установлен до:
Необязательные
зависимости:

Bash, Binutils, Bison, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Ncurses,
Sed, Texinfo и Xz
Bash, GCC, Gettext, Glibc, Xz и Sed.
Нет
Нет
Нет
322

Линукс с нуля - Версия 12.1

Gzip
Установка зависит от:

Bash, Binutils, Coreutils, GCC, Glibc, Grep, Make, Sed и Texinfo

Требуется во время
выполнения:

Bash и Glibc

Набор тестов зависит
от:

Diffutils и Less

Должен быть
установлен до:

Man-DB

Необязательные
зависимости:

Нет

Iana-Etc
Установка зависит от:

Coreutils

Требуется во время
выполнения:

Нет

Набор тестов зависит
от:

Набор тестов недоступен

Должен быть
установлен до:

Perl

Необязательные
зависимости:

Нет

Inetutils
Установка зависит от:

Bash, Binutils, Coreutils, GCC, Glibc, Grep, Make, Ncurses, Patch, Sed,Texinfo и
Zlib

Требуется во время
выполнения:

GCC, Glibc, Ncurses и Readline

Набор тестов зависит
от:

Нет

Должен быть
установлен до:

Tar

Необязательные
зависимости:

Нет

Intltool
Установка зависит от:

Bash, Gawk, Glibc, Make, Perl, Sed и XML::Parser

Требуется во время
выполнения:

Autoconf, Automake, Bash, Glibc, Grep, Perl и Sed

Набор тестов зависит
от:

Perl

Должен быть
установлен до:

Нет

Необязательные
зависимости:

Нет
323

Линукс с нуля - Версия 12.1

IProute2
Установка зависит от:
Требуется во время
выполнения:
Набор тестов зависит
от:
Должен быть
установлен до:
Необязательные
зависимости:

Bash, Bison, Coreutils, Flex, GCC, Glibc, Make, Libcap, Libelf, Linux API Headers
и Zlib
Bash, Coreutils, Glibc, Libcap, Libelf и Zlib
Набор тестов недоступен
Нет
Berkeley DB, iptables, libbpf, libmnl и libtirpc

Jinja2
Установка зависит от:
Требуется во время
выполнения:
Набор тестов зависит
от:
Должен быть
установлен до:
Необязательные
зависимости:

MarkupSafe, Python, Setuptools и Wheel
MarkupSafe и Python
Набор тестов недоступен
Udev
Нет

Kbd
Установка зависит от:
Требуется во время
выполнения:
Набор тестов зависит
от:
Должен быть
установлен до:
Необязательные
зависимости:

Bash, Binutils, Bison, Check, Coreutils, Flex, GCC, Gettext, Glibc, Gzip, Make, Patch
и Sed
Bash, Coreutils и Glibc
Нет
Нет
Linux-PAM

Kmod
Установка зависит от:
Требуется во время
выполнения:
Набор тестов зависит
от:
Должен быть
установлен до:
Необязательные
зависимости:

Bash, Binutils, Bison, Coreutils, Flex, GCC, Gettext, Glibc, Gzip, Make, OpenSSL,
Pkg-config, Sed, Xz и Zlib
Glibc, Xz и Zlib
Набор тестов недоступен
Udev
Нет
324

Линукс с нуля - Версия 12.1

Less
Установка зависит от:

Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make, Ncurses и Sed

Требуется во время
выполнения:

Glibc и Ncurses

Набор тестов зависит
от:

Набор тестов недоступен

Должен быть
установлен до:

Gzip

Необязательные
зависимости:

PCRE2 или PCRE

Libcap
Установка зависит от:

Attr, Bash, Binutils, Coreutils, GCC, Glibc, Perl, Make и Sed

Требуется во время
выполнения:

Glibc

Набор тестов зависит
от:

Нет

Должен быть
установлен до:

IProute2 и Shadow

Необязательные
зависимости:

Linux-PAM

Libelf
Установка зависит от:

Bash, Binutils, Bzip2, Coreutils, GCC, Glibc, Make, Xz, Zlib и Zstd

Требуется во время
выполнения:

Bzip2, Glibc, Xz, Zlib и Zstd

Набор тестов зависит
от:

Нет

Должен быть
установлен до:

IProute2 и Linux

Необязательные
зависимости:

Нет

Libffi
Установка зависит от:

Bash, Binutils, Coreutils, GCC, Glibc, Make и Sed

Требуется во время
выполнения:

Glibc

Набор тестов зависит
от:

DejaGnu

Должен быть
установлен до:

Python

Необязательные
зависимости:

Нет

325

Линукс с нуля - Версия 12.1

Libpipeline
Установка зависит от:

Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make, Sed и Texinfo

Требуется во время
выполнения:

Glibc

Набор тестов зависит
от:

Check и Pkgconf

Должен быть
установлен до:

Man-DB

Необязательные
зависимости:

Нет

Libtool
Установка зависит от:

Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make, Sed и Texinfo

Требуется во время
выполнения:

Autoconf, Automake, Bash, Binutils, Coreutils, File, GCC, Glibc, Grep, Make и Sed

Набор тестов зависит
от:

Autoconf, Automake и Findutils

Должен быть
установлен до:

Нет

Необязательные
зависимости:

Нет

Libxcrypt
Установка зависит от:

Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make, Perl и Sed

Требуется во время
выполнения:

Glibc

Набор тестов зависит
от:

Нет

Должен быть
установлен до:

GCC, Perl, Python, Shadow и Udev

Необязательные
зависимости:

Нет

Linux
Установка зависит от:

Bash, Bc, Binutils, Coreutils, Diffutils, Findutils, GCC, Glibc, Grep, Gzip, Kmod,
Libelf, Make, Ncurses, OpenSSL, Perl и Sed

Требуется во время
выполнения:

Нет

Набор тестов зависит
от:

Набор тестов недоступен

Должен быть
установлен до:

Нет

Необязательные
зависимости:

cpio и LLVM (с Clang)
326

Линукс с нуля - Версия 12.1

Linux API Headers
Установка зависит от:

Bash, Binutils, Coreutils, Findutils, GCC, Glibc, Grep, Gzip, Make, Perl и Sed

Требуется во время
выполнения:

Нет

Набор тестов зависит
от:

Набор тестов недоступен

Должен быть
установлен до:

Нет

Необязательные
зависимости:

Нет

M4
Установка зависит от:

Bash, Binutils, Coreutils, GCC, Glibc, Grep, Make, Sed и Texinfo

Требуется во время
выполнения:

Bash и Glibc

Набор тестов зависит
от:

Diffutils

Должен быть
установлен до:

Autoconf и Bison

Необязательные
зависимости:

libsigsegv

Make
Установка зависит от:

Bash, Binutils, Coreutils, GCC, Gettext, Glibc, Grep, Make, Sed, и Texinfo

Требуется во время
выполнения:

Glibc

Набор тестов зависит
от:

Perl и Procps-ng

Должен быть
установлен до:

Нет

Необязательные
зависимости:

Guile

Man-DB
Установка зависит от:

Bash, Binutils, Bzip2, Coreutils, Flex, GCC, GDBM, Gettext, Glibc, Grep, Groff,
Gzip, Less, Libpipeline, Make, Pkgconf, Sed, и Xz

Требуется во время
выполнения:

Bash, GDBM, Groff, Glibc, Gzip, Less, Libpipeline и Zlib

Набор тестов зависит
от:

Util-linux

Должен быть
установлен до:

Нет

Необязательные
зависимости:

libseccomp и po4a
327

Линукс с нуля - Версия 12.1

Man-Pages
Установка зависит от:

Bash, Coreutils и Make

Требуется во время
выполнения:

Нет

Набор тестов зависит
от:

Набор тестов недоступен

Должен быть
установлен до:

Нет

Необязательные
зависимости:

Нет

MarkupSafe
Установка зависит от:

Python, Setuptools и Wheel

Требуется во время
выполнения:

Python

Набор тестов зависит
от:

Набор тестов недоступен

Должен быть
установлен до:

Jinja2

Необязательные
зависимости:

Нет

Meson
Установка зависит от:

Ninja, Python, Setuptools и Wheel

Требуется во время
выполнения:

Python

Набор тестов зависит
от:

Набор тестов недоступен

Должен быть
установлен до:

Udev

Необязательные
зависимости:

Нет

MPC
Установка зависит от:

Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, GMP, Make, MPFR,
Sed и Texinfo

Требуется во время
выполнения:

Glibc, GMP и MPFR

Набор тестов зависит
от:

Нет

Должен быть
установлен до:

GCC

Необязательные
зависимости:

Нет
328

Линукс с нуля - Версия 12.1

MPFR
Установка зависит от:

Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, GMP, Make, Sed и
Texinfo

Требуется во время
выполнения:

Glibc и GMP

Набор тестов зависит
от:

Нет

Должен быть
установлен до:

Gawk и GCC

Необязательные
зависимости:

Нет

Ncurses
Установка зависит от:

Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make, Patch и Sed

Требуется во время
выполнения:

Glibc

Набор тестов зависит
от:

Набор тестов недоступен

Должен быть
установлен до:

Bash, GRUB, Inetutils, Less, Procps-ng, Psmisc, Readline, Texinfo, Util-linux и Vim

Необязательные
зависимости:

Нет

Ninja
Установка зависит от:

Binutils, Coreutils, GCC и Python

Требуется во время
выполнения:

GCC и Glibc

Набор тестов зависит
от:

Нет

Должен быть
установлен до:

Meson

Необязательные
зависимости:

Asciidoc, Doxygen, Emacs и re2c

OpenSSL
Установка зависит от:

Binutils, Coreutils, GCC, Make и Perl

Требуется во время
выполнения:

Glibc и Perl

Набор тестов зависит
от:

Нет

Должен быть
установлен до:

Coreutils, Kmod, Linux и Udev

Необязательные
зависимости:

Нет
329

Линукс с нуля - Версия 12.1

Patch
Установка зависит от:

Attr, Bash, Binutils, Coreutils, GCC, Glibc, Grep, Make и Sed

Требуется во время
выполнения:

Attr и Glibc

Набор тестов зависит
от:

Diffutils

Должен быть
установлен до:

Нет

Необязательные
зависимости:

Ed

Perl
Установка зависит от:

Bash, Binutils, Coreutils, Gawk, GCC, GDBM, Glibc, Grep, Libxcrypt, Make, Sed
и Zlib

Требуется во время
выполнения:

GDBM, Glibc и Libxcrypt

Набор тестов зависит
от:

Iana-Etc, Less и Procps-ng

Должен быть
установлен до:

Autoconf

Необязательные
зависимости:

Berkeley DB

Pkgconf
Установка зависит от:

Bash, Binutils, Coreutils, Gawk, GCC, Glibc, Grep, Make, и Sed

Требуется во время
выполнения:

Glibc

Набор тестов зависит
от:

Нет

Должен быть
установлен до:

Binutils, E2fsprogs, IProute2, Kmod, Man-DB, Procps-ng, Python, Udev и Util-linux

Необязательные
зависимости:

Нет

Procps-ng
Установка зависит от:

Bash, Binutils, Coreutils, GCC, Glibc, Make, Ncurses, и Pkgconf

Требуется во время
выполнения:

Glibc

Набор тестов зависит
от:

DejaGNU

Должен быть
установлен до:

Нет

Необязательные
зависимости:

elogind
330

Линукс с нуля - Версия 12.1

Psmisc
Установка зависит от:

Bash, Binutils, Coreutils, GCC, Gettext, Glibc, Grep, Make, Ncurses и Sed

Требуется во время
выполнения:

Glibc и Ncurses

Набор тестов зависит
от:

Набор тестов недоступен

Должен быть
установлен до:

Нет

Необязательные
зависимости:

Нет

Python
Установка зависит от:

Bash, Binutils, Coreutils, Expat, GCC, Gdbm, Gettext, Glibc, Grep, Libffi, Libxcrypt,
Make, Ncurses, OpenSSL, Pkgconf, Sed и Util-linux

Требуется во время
выполнения:

Bzip2, Expat, Gdbm, Glibc, Libffi, Libxcrypt, Ncurses, OpenSSL и Zlib

Набор тестов зависит
от:

GDB и Valgrind

Должен быть
установлен до:

Ninja

Необязательные
зависимости:

Berkeley DB, libnsl, SQLite и Tk

Readline
Установка зависит от:

Bash, Binutils, Coreutils, Gawk, GCC, Glibc, Grep, Make, Ncurses, Patch, Sed и
Texinfo

Требуется во время
выполнения:

Glibc и Ncurses

Набор тестов зависит
от:

Набор тестов недоступен

Должен быть
установлен до:

Bash, Bc и Gawk

Необязательные
зависимости:

Нет

Sed
Установка зависит от:

Bash, Binutils, Coreutils, GCC, Gettext, Glibc, Grep, Make, Sed, и Texinfo

Требуется во время
выполнения:

Acl, Attr и Glibc

Набор тестов зависит
от:

Diffutils и Gawk

Должен быть
установлен до:

E2fsprogs, File, Libtool и Shadow

Необязательные
зависимости:

Нет
331

Линукс с нуля - Версия 12.1

Setuptools
Установка зависит от:

Python и Wheel

Требуется во время
выполнения:

Python

Набор тестов зависит
от:

Набор тестов недоступен

Должен быть
установлен до:

Jinja2, MarkupSafe и Meson

Необязательные
зависимости:

Нет

Shadow
Установка зависит от:

Acl, Attr, Bash, Binutils, Coreutils, Diffutils, Findutils, Gawk, GCC, Gettext, Glibc,
Grep, Libcap, Libxcrypt, Make и Sed

Требуется во время
выполнения:

Glibc и Libxcrypt

Набор тестов зависит
от:

Набор тестов недоступен

Должен быть
установлен до:

Coreutils

Необязательные
зависимости:

CrackLib и Linux-PAM

Sysklogd
Установка зависит от:

Binutils, Coreutils, GCC, Glibc, Make и Patch

Требуется во время
выполнения:

Glibc

Набор тестов зависит
от:

Набор тестов недоступен

Должен быть
установлен до:

Нет

Необязательные
зависимости:

Нет

Sysvinit
Установка зависит от:

Binutils, Coreutils, GCC, Glibc, Make и Sed

Требуется во время
выполнения:

Glibc

Набор тестов зависит
от:

Набор тестов недоступен

Должен быть
установлен до:

Нет

Необязательные
зависимости:

Нет
332

Линукс с нуля - Версия 12.1

Tar
Установка зависит от:

Acl, Attr, Bash, Binutils, Bison, Coreutils, GCC, Gettext, Glibc, Grep, Inetutils, Make,
Sed и Texinfo

Требуется во время
выполнения:

Acl, Attr, Bzip2, Glibc, Gzip и Xz

Набор тестов зависит
от:

Autoconf, Diffutils, Findutils, Gawk и Gzip

Должен быть
установлен до:

Нет

Необязательные
зависимости:

Нет

Tcl
Установка зависит от:

Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make и Sed

Требуется во время
выполнения:

Glibc и Zlib

Набор тестов зависит
от:

Нет

Должен быть
установлен до:

Нет

Необязательные
зависимости:

Нет

Texinfo
Установка зависит от:

Bash, Binutils, Coreutils, GCC, Gettext, Glibc, Grep, Make, Ncurses, Patch и Sed

Требуется во время
выполнения:

Glibc и Ncurses

Набор тестов зависит
от:

Нет

Должен быть
установлен до:

Нет

Необязательные
зависимости:

Нет

Udev
Установка зависит от:

Acl, Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Gperf, Grep, Jinja2,
Libcap, Libxcrypt, Meson, OpenSSL, Pkgconf, Sed, Util-linux и Zstd

Требуется во время
выполнения:

Acl, Glibc, Libcap, OpenSSL и Util-linux

Набор тестов зависит
от:

Нет

Должен быть
установлен до:

Util-linux

Необязательные
зависимости:

Нет
333

Линукс с нуля - Версия 12.1

Util-linux
Установка зависит от:

Bash, Binutils, Coreutils, Diffutils, File, Findutils, Gawk, GCC, Gettext, Glibc, Grep,
Make, Ncurses, Pkgconf, Sed, Udev и Zlib

Требуется во время
выполнения:

Glibc, Ncurses, Readline, Udev и Zlib

Набор тестов зависит
от:

Нет

Должен быть
установлен до:

Нет

Необязательные
зависимости:

Asciidoctor, Libcap-NG, libeconf, libuser, libutempter, Linux-PAM, smartmontools,
po4a и slang

Vim
Установка зависит от:

Acl, Attr, Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make, Ncurses и Sed

Требуется во время
выполнения:

Acl, Attr, Glibc, Python, Ncurses и Tcl

Набор тестов зависит
от:

Нет

Должен быть
установлен до:

Нет

Необязательные
зависимости:

Xorg, GTK+2, LessTif, Ruby и GPM

Wheel
Установка зависит от:

Python и Flit-core

Требуется во время
выполнения:

Python

Набор тестов зависит
от:

Набор тестов недоступен

Должен быть
установлен до:

Jinja2, MarkupSafe, Meson и Setuptools

Необязательные
зависимости:

Нет

XML::Parser
Установка зависит от:

Bash, Binutils, Coreutils, Expat, GCC, Glibc, Make и Perl

Требуется во время
выполнения:

Expat, Glibc и Perl

Набор тестов зависит
от:

Perl

Должен быть
установлен до:

Intltool

Необязательные
зависимости:

Нет
334

Линукс с нуля - Версия 12.1

Xz
Установка зависит от:
Требуется во время
выполнения:
Набор тестов зависит
от:
Должен быть
установлен до:
Необязательные
зависимости:

Bash, Binutils, Coreutils, Diffutils, GCC, Glibc и Make
Glibc
Нет
File, GRUB, Kmod, Libelf, Man-DB и Udev
Нет

Zlib
Установка зависит от:
Требуется во время
выполнения:
Набор тестов зависит
от:
Должен быть
установлен до:
Необязательные
зависимости:

Bash, Binutils, Coreutils, GCC, Glibc, Make и Sed
Glibc
Нет
File, Kmod, Libelf, Perl и Util-linux
Нет

Zstd
Установка зависит от:
Требуется во время
выполнения:
Набор тестов зависит
от:
Должен быть
установлен до:
Необязательные
зависимости:

Binutils, Coreutils, GCC, Glibc, Gzip, Make, Xz и Zlib
Glibc
Нет
Binutils, GCC, Libelf и Udev
LZ4

335

Линукс с нуля - Версия 12.1

Приложение D. Скрипты загрузки и
настройки системы-20230728
Скрипты в приложении перечислены с указанием каталога, в котором они обычно находятся. Порядок
такой: /etc/rc.d/init.d
, /etc/sysconfig , /etc/sysconfig/network-devices
, и /etc/sysconfig/
network-devices/services
. В каждом разделе файлы перечислены в том порядке, в котором они обычно
вызываются.

D.1. /etc/rc.d/init.d/rc
Скрипт rc это первый скрипт, вызываемый системой инициализации init и инициирующий процесс загрузки.
#!/bin/bash
########################################################################
# Begin rc
#
# Description : Main Run Level Control Script
#
# Authors
: Gerard Beekmans - gerard@linuxfromscratch.org
#
: DJ Lucas - dj@linuxfromscratch.org
# Updates
: Bruce Dubbs - bdubbs@linuxfromscratch.org
#
: Pierre Labastie - pierre@linuxfromscratch.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

336

Линукс с нуля - Версия 12.1

}

fi

log_warning_msg "${i} is not executable, skipping."
SCRIPT_STAT="1"

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} " >&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

337

Линукс с нуля - Версия 12.1
# 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"}

fi

echo
echo
echo
echo
read

-e
-e
-e
""
-t

"\n\n"
"\\033[${wcol}G${welcome_message}"
"\\033[${icol}G${i_message}${NORMAL}"
"${itime}" -n 1 interactive 2>&1 > /dev/null

# 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=${?}

fi

if [ "${error_value}" != "0" ]; then print_error_msg; fi
done

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

338

Линукс с нуля - Версия 12.1
# 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

fi

# Remove the temporary file
rm -f $BOOTLOG 2> /dev/null

# End rc

D.2. /lib/lsb/init-functions
#!/bin/sh
########################################################################
#
# Begin /lib/lsb/init-funtions
#
# Description : Run Level Control Functions
#
# Authors
: Gerard Beekmans - gerard@linuxfromscratch.org
#
: DJ Lucas - dj@linuxfromscratch.org
# Update
: Bruce Dubbs - bdubbs@linuxfromscratch.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

339

Линукс с нуля - Версия 12.1
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"
SUCCESS="\\033[1;32m"
WARNING="\\033[1;33m"
FAILURE="\\033[1;31m"
INFO="\\033[1;36m"
BRACKET="\\033[1;34m"

#
#
#
#
#
#

Standard console grey
Success is green
Warnings are yellow
Failures are red
Information is light cyan
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
SET_COL="\\033[${COL}G"
# at the
SET_WCOL="\\033[${WCOL}G"
# at the
CURS_UP="\\033[1A\\033[0G"
# Up one
CURS_ZERO="\\033[0G"

via echo
$COL char
$WCOL char
line, at the 0'th char

################################################################################
# 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.
#

340

Линукс с нуля - Версия 12.1
#
-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)

-n)

-p)

-*)

*)

esac

force="1"
shift 1
;;
nice="${2}"
shift 2
;;
pidfile="${2}"
shift 2
;;
return 2
;;
program="${1}"
break
;;

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

341

Линукс с нуля - Версия 12.1
# Return a value ONLY
# It is the init script's (or distribution's functions) responsibility
# to log messages!
case "${retval}" in
0)

1)

3)

*)

fi

}

esac

# Program is already running correctly, this is a
# successful start.
return 0
;;
# Program is not running, but an invalid pid file exists
# remove the pid file and continue
rm -f "${pidfile}"
;;
# 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
;;

# 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

342

Линукс с нуля - Версия 12.1
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

esac

# Error on additional arguments
if [ -n "${3}" ]; then
return 2
else
break
fi
;;

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)

1)

# Program is running correctly
# Do nothing here, let killproc continue.
;;
# 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"

343

Линукс с нуля - Версия 12.1
fi

rm -f "${pidfile}"

# This is only a success if no signal was passed.
if [ -n "${nosig}" ]; then
return 0
else
return 7
fi
;;
3)

*)

esac

# 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
;;

# 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

fi

# 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

344

Линукс с нуля - Версия 12.1
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
fi

if [ -e "${pidfile}" ]; then rm -f "${pidfile}" 2> /dev/null; 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

345

Линукс с нуля - Версия 12.1

esac

fi
;;

break

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

fi

# If a PID file exists with that name, assume that is it.
if [ -e "/run/${progname}.pid" ]; then
pidfile="/run/${progname}.pid"
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
fi

# Use pidof
pidlist=`pidof "${program}"`

# 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.
#
################################################################################

346

Линукс с нуля - Версия 12.1
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)

*)

esac

pidfile="${2}"
shift 2
;;
if [ -n "${2}" ]; then
echo "Too many arguments"
return 1
else
break
fi
;;

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
#
################################################################################

347

Линукс с нуля - Версия 12.1
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()

348

Линукс с нуля - Версия 12.1
{

/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 "${@}"

349

Линукс с нуля - Версия 12.1
# 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
#

350

Линукс с нуля - Версия 12.1
#
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

D.3. /etc/rc.d/init.d/mountvirtfs
#!/bin/sh
########################################################################
# Begin mountvirtfs
#
# Description : Ensure proc, sysfs, run, and dev are mounted
#
# Authors
: Gerard Beekmans - gerard@linuxfromscratch.org
#
DJ Lucas - dj@linuxfromscratch.org
# Update
: Bruce Dubbs - bdubbs@linuxfromscratch.org
#
Xi Ruoyao - xry111@xry111.site
#
# Version
: LFS 12.0
#

351

Линукс с нуля - Версия 12.1
########################################################################
### BEGIN INIT INFO
# Provides:
# Required-Start:
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start:
# Default-Stop:
# Short-Description:
# Description:
#
#
#
#
# X-LFS-Provided-By:
### END INIT INFO

mountvirtfs
$first

S
Mounts various special fs needed at start
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.
LFS

. /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

352

Линукс с нуля - Версия 12.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
;;
*)

esac

echo "Usage: ${0} {start}"
exit 1
;;

# End mountvirtfs

D.4. /etc/rc.d/init.d/modules
#!/bin/sh
########################################################################
# Begin modules
#
# Description : Module auto-loading script
#
# Authors
: Zack Winkles
#
DJ Lucas - dj@linuxfromscratch.org
# Update
: Bruce Dubbs - bdubbs@linuxfromscratch.org
#
# Version
: LFS 7.0
#
########################################################################
### BEGIN INIT INFO
# Provides:
# Required-Start:
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start:
# Default-Stop:
# Short-Description:
# Description:
# X-LFS-Provided-By:
### END INIT INFO

modules
mountvirtfs

S
Loads required modules.
Loads modules listed in /etc/sysconfig/modules.
LFS

# 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:"

353

Линукс с нуля - Версия 12.1
# 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
;;
*)

esac

echo "Usage: ${0} {start}"
exit 1
;;

exit 0
# End modules

D.5. /etc/rc.d/init.d/udev
#!/bin/sh
########################################################################
# Begin udev
#
# Description : Udev cold-plugging script
#
# Authors
: Zack Winkles, Alexander E. Patrakov
#
DJ Lucas - dj@linuxfromscratch.org
# Update
: Bruce Dubbs - bdubbs@linuxfromscratch.org
#
Xi Ruoyao - xry111@xry111.site
#
# Version
: LFS 12.0
#
########################################################################
### BEGIN INIT INFO
# Provides:
# Required-Start:
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start:

udev $time
localnet
modules
S

354

Линукс с нуля - Версия 12.1
# Default-Stop:
# Short-Description:
# Description:
#
# X-LFS-Provided-By:
### END INIT INFO

Populates /dev with device nodes.
Mounts a tempfs on /dev and starts the udevd daemon.
Device nodes are created as defined by udev.
LFS

. /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
;;
*)

esac

echo "Usage ${0} {start}"
exit 1
;;

exit 0
# End udev

D.6. /etc/rc.d/init.d/swap
#!/bin/sh
########################################################################
# Begin swap
#
# Description : Swap Control Script
#
# Authors
: Gerard Beekmans - gerard@linuxfromscratch.org
#
DJ Lucas - dj@linuxfromscratch.org
# Update
: Bruce Dubbs - bdubbs@linuxfromscratch.org

355

Линукс с нуля - Версия 12.1
#
# Version
: LFS 7.0
#
########################################################################
### BEGIN INIT INFO
# Provides:
# Required-Start:
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start:
# Default-Stop:
# Short-Description:
# Description:
#
# X-LFS-Provided-By:
### END INIT INFO

swap
udev
modules
localnet
$local_fs
S
0 6
Activates and deactivates swap partitions.
Activates and deactivates swap partitions defined in
/etc/fstab.
LFS

. /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
;;
*)

esac

echo "Usage: ${0} {start|stop|restart|status}"
exit 1
;;

exit 0
# End swap

D.7. /etc/rc.d/init.d/setclock
#!/bin/sh
########################################################################
# Begin setclock
#
# Description : Setting Linux Clock
#
# Authors
: Gerard Beekmans - gerard@linuxfromscratch.org
#
DJ Lucas - dj@linuxfromscratch.org
# Update
: Bruce Dubbs - bdubbs@linuxfromscratch.org
#

356

Линукс с нуля - Версия 12.1
# Version
: LFS 7.0
#
########################################################################
### BEGIN INIT INFO
# Provides:
# Required-Start:
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start:
# Default-Stop:
# Short-Description:
# Description:
#
# X-LFS-Provided-By:
### END INIT INFO

modules
$syslog
S
Stores and restores time from the hardware clock
On boot, system time is obtained from hwclock. The
hardware clock can also be set on shutdown.
LFS

. /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

D.8. /etc/rc.d/init.d/checkfs
#!/bin/sh
########################################################################
# Begin checkfs
#
# Description : File System Check
#
# Authors
: Gerard Beekmans - gerard@linuxfromscratch.org
#
A. Luebke - luebke@users.sourceforge.net
#
DJ Lucas - dj@linuxfromscratch.org
# Update
: Bruce Dubbs - bdubbs@linuxfromscratch.org
#

357

Линукс с нуля - Версия 12.1
# 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:
# Required-Start:
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start:
# Default-Stop:
# Short-Description:
# Description:
# X-LFS-Provided-By:
### END INIT INFO

checkfs
udev swap

S
Checks local filesystems before mounting.
Checks local filesystems before mounting.
LFS

. /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

358

Линукс с нуля - Версия 12.1
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"

fi

log_info_msg "Press Enter to continue..."
wait_for_user
reboot -f

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"

fi

log_info_msg "Press Enter to continue..."
wait_for_user
/etc/rc.d/init.d/halt start

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

359

Линукс с нуля - Версия 12.1
esac

;;

# End checkfs

D.9./etc/rc.d/init.d/mountfs
#!/bin/sh
########################################################################
# Begin mountfs
#
# Description : File System Mount Script
#
# Authors
: Gerard Beekmans - gerard@linuxfromscratch.org
#
DJ Lucas - dj@linuxfromscratch.org
# Update
: Bruce Dubbs - bdubbs@linuxfromscratch.org
#
# Version
: LFS 7.0
#
########################################################################
### BEGIN INIT INFO
# Provides:
# Required-Start:
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start:
# Default-Stop:
# Short-Description:
# Description:
#
#
#
# X-LFS-Provided-By:
### END INIT INFO

$local_fs
udev checkfs
modules
localnet
S
0 6
Mounts/unmounts local filesystems defined in /etc/fstab.
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.
LFS

. /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 \

360

Линукс с нуля - Версия 12.1
--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
;;
*)

esac

echo "Usage: ${0} {start|stop}"
exit 1
;;

# End mountfs

D.10. /etc/rc.d/init.d/udev_retry
#!/bin/sh
########################################################################
# Begin udev_retry
#
# Description : Udev cold-plugging script (retry)
#
# Authors
: Alexander E. Patrakov
#
DJ Lucas - dj@linuxfromscratch.org
# Update
: Bruce Dubbs - bdubbs@linuxfromscratch.org
#
Bryan Kadzban #
# Version
: LFS 7.0
#
########################################################################
### BEGIN INIT INFO
# Provides:
# Required-Start:
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start:
# Default-Stop:
# Short-Description:
# Description:
#
#
# X-LFS-Provided-By:
### END INIT INFO

udev_retry
udev
$local_fs cleanfs
S
Replays failed uevents and creates additional devices.
Replays any failed uevents that were skipped due to
slow hardware initialization, and creates those needed
device nodes
LFS

. /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

361

Линукс с нуля - Версия 12.1
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
;;
*)

esac

echo "Usage ${0} {start}"
exit 1
;;

exit 0
# End udev_retry

D.11. /etc/rc.d/init.d/cleanfs
#!/bin/sh
########################################################################
# Begin cleanfs
#
# Description : Clean file system
#
# Authors
: Gerard Beekmans - gerard@linuxfromscratch.org
#
DJ Lucas - dj@linuxfromscratch.org
# Update
: Bruce Dubbs - bdubbs@linuxfromscratch.org
#
# Version
: LFS 7.0
#
########################################################################
### BEGIN INIT INFO
# Provides:
# Required-Start:
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start:
# Default-Stop:
# Short-Description:
# Description:
#
#
# X-LFS-Provided-By:
### END INIT INFO

cleanfs
$local_fs

S
Cleans temporary directories early in the boot process.
Cleans temporary directories /run, /var/lock, and
optionally, /tmp. cleanfs also creates /run/utmp
and any files defined in /etc/sysconfig/createfiles.
LFS

. /lib/lsb/init-functions
# Function to create files/directory on boot.

362

Линукс с нуля - Версия 12.1
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

fi
done

}

# Set up the permissions, too.
chown ${usr}:${grp} "${name}"
chmod ${perm} "${name}"

# 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

363

Линукс с нуля - Версия 12.1
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

*)

esac

exit $failed
;;
echo "Usage: ${0} {start}"
exit 1
;;

# End cleanfs

D.12. /etc/rc.d/init.d/console
#!/bin/sh
########################################################################
# Begin console
#
# Description : Sets keymap and screen font
#
# Authors
: Gerard Beekmans - gerard@linuxfromscratch.org
#
Alexander E. Patrakov
#
DJ Lucas - dj@linuxfromscratch.org
# Update
: Bruce Dubbs - bdubbs@linuxfromscratch.org
#
# Version
: LFS 7.0
#
########################################################################
### BEGIN INIT INFO
# Provides:
# Required-Start:
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start:
# Default-Stop:
# Short-Description:
# Description:
#
# X-LFS-Provided-By:
### END INIT INFO

console
$local_fs
udev_retry
S
Sets up a localised console.
Sets up fonts and language settings for the user's
local as defined by /etc/sysconfig/console.
LFS

. /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}"
] &&

364

Линукс с нуля - Версия 12.1

fi

! is_true "${UNICODE}"; then
exit 0

# 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
;;
*)

esac

echo "Usage:
exit 1
;;

${0} {start}"

# End console

365

Линукс с нуля - Версия 12.1

D.13. /etc/rc.d/init.d/localnet
#!/bin/sh
########################################################################
# Begin localnet
#
# Description : Loopback device
#
# Authors
: Gerard Beekmans - gerard@linuxfromscratch.org
#
DJ Lucas - dj@linuxfromscratch.org
# Update
: Bruce Dubbs - bdubbs@linuxfromscratch.org
#
# Version
: LFS 7.0
#
########################################################################
### BEGIN INIT INFO
# Provides:
# Required-Start:
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start:
# Default-Stop:
# Short-Description:
# Description:
#
# X-LFS-Provided-By:
### END INIT INFO

localnet
mountvirtfs
modules
S
0 6
Starts the local network.
Sets the hostname of the machine and starts the
loopback interface.
LFS

. /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
;;

366

Линукс с нуля - Версия 12.1
esac
exit 0
# End localnet

D.14. /etc/rc.d/init.d/sysctl
#!/bin/sh
########################################################################
# Begin sysctl
#
# Description : File uses /etc/sysctl.conf to set kernel runtime
#
parameters
#
# Authors
: Nathan Coulson (nathan@linuxfromscratch.org)
#
Matthew Burgress (matthew@linuxfromscratch.org)
#
DJ Lucas - dj@linuxfromscratch.org
# Update
: Bruce Dubbs - bdubbs@linuxfromscratch.org
#
# Version
: LFS 7.0
#
########################################################################
### BEGIN INIT INFO
# Provides:
# Required-Start:
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start:
# Default-Stop:
# Short-Description:
# Description:
#
# X-LFS-Provided-By:
### END INIT INFO

sysctl
mountvirtfs
console
S
Makes changes to the proc filesystem
Makes changes to the proc filesystem as defined in
/etc/sysctl.conf. See 'man sysctl(8)'.
LFS

. /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
;;
*)

esac

echo "Usage: ${0} {start|status}"
exit 1
;;

exit 0
# End sysctl

D.15. /etc/rc.d/init.d/sysklogd
#!/bin/sh

367

Линукс с нуля - Версия 12.1
########################################################################
# Begin sysklogd
#
# Description : Sysklogd loader
#
# Authors
: Gerard Beekmans - gerard@linuxfromscratch.org
#
DJ Lucas - dj@linuxfromscratch.org
# Update
: Bruce Dubbs - bdubbs@linuxfromscratch.org
#
# Version
: LFS 7.0
#
########################################################################
### BEGIN INIT INFO
# Provides:
# Required-Start:
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start:
# Default-Stop:
# Short-Description:
# Description:
#
# X-LFS-Provided-By:
### END INIT INFO

$syslog
$first localnet
$local_fs
sendsignals
2 3 4 5
0 1 6
Starts kernel and system log daemons.
Starts kernel and system log daemons.
/etc/fstab.
LFS

. /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

368

Линукс с нуля - Версия 12.1
;;
*)

esac

echo "Usage: ${0} {start|stop|reload|restart|status}"
exit 1
;;

exit 0
# End sysklogd

D.16. /etc/rc.d/init.d/network
#!/bin/sh
########################################################################
# Begin network
#
# Description : Network Control Script
#
# Authors
: Gerard Beekmans - gerard@linuxfromscratch.org
#
Nathan Coulson - nathan@linuxfromscratch.org
#
Kevin P. Fleming - kpfleming@linuxfromscratch.org
#
DJ Lucas - dj@linuxfromscratch.org
# Update
: Bruce Dubbs - bdubbs@linuxfromscratch.org
#
# Version
: LFS 7.0
#
########################################################################
### BEGIN INIT INFO
# Provides:
# Required-Start:
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start:
# Default-Stop:
# Short-Description:
# Description:
# X-LFS-Provided-By:
### END INIT INFO

$network
$local_fs localnet swap
$syslog firewalld iptables nftables
$local_fs localnet swap
$syslog firewalld iptables nftables
2 3 4 5
0 1 6
Starts and configures network interfaces.
Starts and configures network interfaces.
LFS

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

369

Линукс с нуля - Версия 12.1
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
;;
*)

esac

echo "Usage: ${0} {start|stop|restart}"
exit 1
;;

exit 0
# End network

D.17. /etc/rc.d/init.d/sendsignals
#!/bin/sh
########################################################################
# Begin sendsignals
#
# Description : Sendsignals Script
#
# Authors
: Gerard Beekmans - gerard@linuxfromscratch.org
#
DJ Lucas - dj@linuxfromscratch.org
# Update
: Bruce Dubbs - bdubbs@linuxfromscratch.org
#
# Version
: LFS 7.0
#
########################################################################
### BEGIN INIT INFO
# Provides:
# Required-Start:
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start:
# Default-Stop:
# Short-Description:
# Description:
# X-LFS-Provided-By:
### END INIT INFO

sendsignals
$local_fs swap localnet
0 6
Attempts to kill remaining processes.
Attempts to kill remaining processes.
LFS

370

Линукс с нуля - Версия 12.1
. /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

D.18. /etc/rc.d/init.d/reboot
#!/bin/sh
########################################################################
# Begin reboot
#
# Description : Reboot Scripts
#
# Authors
: Gerard Beekmans - gerard@linuxfromscratch.org
#
DJ Lucas - dj@linuxfromscratch.org
# Updates
: Bruce Dubbs - bdubbs@linuxfromscratch.org
#
: Pierre Labastie - pierre@linuxfromscratch.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:
# Required-Start:
# Should-Start:

reboot
$last

371

Линукс с нуля - Версия 12.1
# Required-Stop:
# Should-Stop:
# Default-Start:
# Default-Stop:
# Short-Description:
# Description:
# X-LFS-Provided-By:
### END INIT INFO

6
Reboots the system.
Reboots the System.
LFS

. /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

D.19. /etc/rc.d/init.d/halt
#!/bin/sh
########################################################################
# Begin halt
#
# Description : Halt Script
#
# Authors
: Gerard Beekmans - gerard@linuxfromscratch.org
#
DJ Lucas - dj@linuxfromscratch.org
# Update
: Bruce Dubbs - bdubbs@linuxfromscratch.org
#
: Pierre Labastie - pierre@linuxfromscratch.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:
# Required-Start:
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start:
# Default-Stop:
# Short-Description:
# Description:
# X-LFS-Provided-By:
### END INIT INFO

halt
$last

0
Halts the system.
Halts the System.
LFS

case "${1}" in
start)
halt -d -f -i -p
;;
*)

echo "Usage: {start}"
exit 1

372

Линукс с нуля - Версия 12.1
esac

;;

# End halt

D.20. /etc/rc.d/init.d/template
#!/bin/sh
########################################################################
# Begin scriptname
#
# Description :
#
# Authors
:
#
# Version
: LFS x.x
#
# Notes
:
#
########################################################################
### BEGIN INIT INFO
# Provides:
# Required-Start:
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start:
# Default-Stop:
# Short-Description:
# Description:
# X-LFS-Provided-By:
### END INIT INFO

template

. /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
;;

373

Линукс с нуля - Версия 12.1
*)

esac

echo "Usage: ${0} {start|stop|restart}"
exit 1
;;

exit 0
# End scriptname

D.21. /etc/sysconfig/modules
########################################################################
# Begin /etc/sysconfig/modules
#
# Description : Module auto-loading configuration
#
# Authors
:
#
# Version
: 00.00
#
# Notes
: The syntax of this file is as follows:
#
[ ...]
#
# 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

D.22. /etc/sysconfig/createfiles
########################################################################
# 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"
#

#
if type is equal to "dev"
#

#

#
#
is the name of the file which is to be created
#
is either file, dir, or dev.
#
file creates a new file
#
dir creates a new directory
#
dev creates a new device
#
is either block, char or pipe
#
block creates a block device
#
char creates a character device
#
pipe creates a pipe, this will ignore the and
#
fields
#
and are the major and minor numbers used for
#
the device.
########################################################################
# End /etc/sysconfig/createfiles

374

Линукс с нуля - Версия 12.1

D.23. /etc/sysconfig/udev-retry
########################################################################
# 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

D.24. /sbin/ifup
#!/bin/sh
########################################################################
# Begin /sbin/ifup
#
# Description : Interface Up
#
# Authors
: Nathan Coulson - nathan@linuxfromscratch.org
#
Kevin P. Fleming - kpfleming@linuxfromscratch.org
# Update
: Bruce Dubbs - bdubbs@linuxfromscratch.org
#
DJ Lucas - dj@linuxfromscratch.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"

375

Линукс с нуля - Версия 12.1
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 ;;

*)
esac
done

break ;;

if [ -n "$help" ]; then
echo "${VERSTR}"
echo "${USAGE}"
echo
cat &2
echo "${USAGE}" >& 2
exit 2 ;;

*)
esac
done

break ;;

if [ -n "$help" ]; then
echo "${VERSTR}"
echo "${USAGE}"
echo
cat /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

378

Линукс с нуля - Версия 12.1

fi

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

# End /sbin/ifdown

D.26. /lib/services/ipv4-static
#!/bin/sh
########################################################################
# Begin /lib/services/ipv4-static
#
# Description : IPV4 Static Boot Script
#
# Authors
: Nathan Coulson - nathan@linuxfromscratch.org
#
Kevin P. Fleming - kpfleming@linuxfromscratch.org
# Update
: Bruce Dubbs - bdubbs@linuxfromscratch.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."

379

Линукс с нуля - Версия 12.1
;;

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

;;
*)
;;
esac

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

# End /lib/services/ipv4-static

D.27. /lib/services/ipv4-static-route
#!/bin/sh
########################################################################
# Begin /lib/services/ipv4-static-route
#
# Description : IPV4 Static Route Script
#
# Authors
: Kevin P. Fleming - kpfleming@linuxfromscratch.org
#
DJ Lucas - dj@linuxfromscratch.org
# Update
: Bruce Dubbs - bdubbs@linuxfromscratch.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 "

380

Линукс с нуля - Версия 12.1
;;
(*)
;;
esac

log_failure_msg "Unknown route type (${TYPE}) in ${IFCONFIG}, cannot continue."
exit 1

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

fi

args="${args} ${IP}/${PREFIX}"
desc="${desc}${IP}/${PREFIX}"

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
;;
*)
;;
esac

echo "Usage: ${0} [interface] {up|down}"
exit 1

# End /lib/services/ipv4-static-route

381

Линукс с нуля - Версия 12.1

Приложение E. Правила настройки Udev
Правила в этом приложении перечислены для удобства. Установка обычно выполняются с помощью
инструкций приведенных в Раздел 8.75, «Udev из Systemd-255».

E.1. 55-lfs.rules
# /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"

382

Линукс с нуля - Версия 12.1

Приложение F. Лицензии LFS
Настоящая книга распространяется на условиях лицензии Creative Commons Attribution-NonCommercialShareAlike 2.0 License.
Инструкции, предназначенные для использования на компьютере, могут использоваться отдельно от книги
на условиях лицензии MIT.

F.1. Лицензия Creative Commons
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.
1. Definitions
a. "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.
b. "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.
c. "Licensor" means the individual or entity that offers the Work under the terms of this License.
d. "Original Author" means the individual or entity who created the Work.
e. "Work" means the copyrightable work of authorship offered under the terms of this License.
f. "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.
383

Линукс с нуля - Версия 12.1
g. "License Elements" means the following high-level license attributes as selected by Licensor and indicated
in the title of this License: Attribution, Noncommercial, ShareAlike.
2. 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.
3. 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:
a. 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;
b. to create and reproduce Derivative Works;
c. 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;
d. 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).
4. Restrictions.The license granted in Section 3 above is expressly made subject to and limited by the following
restrictions:
a. 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.
b. 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
384

Линукс с нуля - Версия 12.1
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.
c. 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.
d. 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.
e. For the avoidance of doubt, where the Work is a musical composition:
i. 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.
ii. 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.
f. 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.
5. 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
385

Линукс с нуля - Версия 12.1
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.
6. 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.
7. Termination
a. 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.
b. 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.
8. Miscellaneous
a. 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.
b. 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.
c. 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.
d. 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.
e. 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.

386

Линукс с нуля - Версия 12.1

Важно
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/.

F.2. Лицензия MIT
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.

387

Линукс с нуля - Версия 12.1

Предметный
указатель

Findutils: 221
tools: 86
Findutils: 221
tools: 86
Flex: 141
Flit-core: 206
Gawk: 219
tools: 87
Gawk: 219
tools: 87
GCC: 164
tools, libstdc++ Проход 1: 76
tools, pass 1: 69
tools, pass 2: 96
GCC: 164
tools, libstdc++ Проход 1: 76
tools, pass 1: 69
tools, pass 2: 96
GCC: 164
tools, libstdc++ Проход 1: 76
tools, pass 1: 69
tools, pass 2: 96
GCC: 164
tools, libstdc++ Проход 1: 76
tools, pass 1: 69
tools, pass 2: 96
GDBM: 182
Gettext: 175
tools: 104
Gettext: 175
tools: 104
Glibc: 122
tools: 73
Glibc: 122
tools: 73
GMP: 151
Gperf: 183
Grep: 178
tools: 88
Grep: 178
tools: 88
Groff: 222
GRUB: 225
Gzip: 228
tools: 89
Gzip: 228
tools: 89
Iana-Etc: 121
Inetutils: 185
Intltool: 192

Пакеты
Acl: 156
Attr: 155
Autoconf: 193
Automake: 195
Bash: 179
tools: 82
Bash: 179
tools: 82
Bc: 140
Binutils: 148
tools, pass 1: 67
tools, pass 2: 95
Binutils: 148
tools, pass 1: 67
tools, pass 2: 95
Binutils: 148
tools, pass 1: 67
tools, pass 2: 95
Bison: 177
tools: 105
Bison: 177
tools: 105
Bootscripts: 267
usage: 278
Bootscripts: 267
usage: 278
Bzip2: 131
Check: 217
Coreutils: 211
tools: 83
Coreutils: 211
tools: 83
DejaGNU: 146
Diffutils: 218
tools: 84
Diffutils: 218
tools: 84
E2fsprogs: 258
Expat: 184
Expect: 144
File: 136
tools: 85
File: 136
tools: 85
388

Линукс с нуля - Версия 12.1
IPRoute2: 229
Jinja2: 243
Kbd: 231
Kmod: 198
Less: 187
Libcap: 157
Libelf: 200
libffi: 201
Libpipeline: 233
Libtool: 181
Libxcrypt: 158
Linux: 294
tools, API headers: 72
Linux: 294
tools, API headers: 72
M4: 139
tools: 79
M4: 139
tools: 79
Make: 234
tools: 90
Make: 234
tools: 90
Man-DB: 247
Man-pages: 120
MarkupSafe: 242
Meson: 210
MPC: 154
MPFR: 153
Ncurses: 170
tools: 80
Ncurses: 170
tools: 80
Ninja: 209
OpenSSL: 196
Patch: 235
tools: 91
Patch: 235
tools: 91
Perl: 188
tools: 106
Perl: 188
tools: 106
Pkgconf: 147
Procps-ng: 250
Psmisc: 174
Python: 203
temporary: 107
Python: 203
temporary: 107

rc.site: 285
Readline: 137
Sed: 173
tools: 92
Sed: 173
tools: 92
Setuptools: 208
Shadow: 160
configuring: 161
Shadow: 160
configuring: 161
Sysklogd: 261
configuring: 261
Sysklogd: 261
configuring: 261
Sysvinit: 262
configuring: 279
Sysvinit: 262
configuring: 279
Tar: 236
tools: 93
Tar: 236
tools: 93
Tcl: 142
Texinfo: 237
temporary: 108
Texinfo: 237
temporary: 108
Udev: 244
configuring: 246
usage: 269
Udev: 244
configuring: 246
usage: 269
Udev: 244
configuring: 246
usage: 269
Util-linux: 252
tools: 109
Util-linux: 252
tools: 109
Vim: 239
wheel: 207
XML::Parser: 191
Xz: 133
tools: 94
Xz: 133
tools: 94
Zlib: 130
zstd: 135
389

Линукс с нуля - Версия 12.1

Программы

bzip2recover: 131, 132
bzless: 131, 132
bzmore: 131, 132
c++: 164, 168
c++filt: 148, 149
cal: 252, 253
capsh: 157, 157
captoinfo: 170, 172
cat: 211, 212
catman: 247, 249
cc: 164, 168
cfdisk: 252, 253
chacl: 156, 156
chage: 160, 162
chattr: 258, 259
chcon: 211, 212
chcpu: 252, 253
checkmk: 217, 217
chem: 222, 222
chfn: 160, 162
chgpasswd: 160, 162
chgrp: 211, 212
chmem: 252, 253
chmod: 211, 212
choom: 252, 253
chown: 211, 212
chpasswd: 160, 162
chroot: 211, 212
chrt: 252, 253
chsh: 160, 162
chvt: 231, 232
cksum: 211, 213
clear: 170, 172
cmp: 218, 218
col: 252, 253
colcrt: 252, 253
colrm: 252, 253
column: 252, 253
comm: 211, 213
compile_et: 258, 259
corelist: 188, 189
cp: 211, 213
cpan: 188, 189
cpp: 164, 168
csplit: 211, 213
ctrlaltdel: 252, 253
ctstat: 229, 229
cut: 211, 213
c_rehash: 196, 197
date: 211, 213

[: 211, 212
2to3: 203
accessdb: 247, 248
aclocal: 195, 195
aclocal-1.16: 195, 195
addftinfo: 222, 222
addpart: 252, 253
addr2line: 148, 149
afmtodit: 222, 222
agetty: 252, 253
apropos: 247, 249
ar: 148, 149
as: 148, 149
attr: 155, 155
autoconf: 193, 193
autoheader: 193, 193
autom4te: 193, 193
automake: 195, 195
automake-1.16: 195, 195
autopoint: 175, 175
autoreconf: 193, 193
autoscan: 193, 193
autoupdate: 193, 193
awk: 219, 219
b2sum: 211, 212
badblocks: 258, 259
base64: 211, 212, 211, 212
base64: 211, 212, 211, 212
basename: 211, 212
basenc: 211, 212
bash: 179, 180
bashbug: 179, 180
bc: 140, 140
bison: 177, 177
blkdiscard: 252, 253
blkid: 252, 253
blkzone: 252, 253
blockdev: 252, 253
bomtool: 147, 147
bootlogd: 262, 262
bridge: 229, 229
bunzip2: 131, 132
bzcat: 131, 132
bzcmp: 131, 132
bzdiff: 131, 132
bzegrep: 131, 132
bzfgrep: 131, 132
bzgrep: 131, 132
bzip2: 131, 132
390

Линукс с нуля - Версия 12.1
dc: 140, 140
dd: 211, 213
deallocvt: 231, 232
debugfs: 258, 259
dejagnu: 146, 146
delpart: 252, 254
depmod: 198, 198
df: 211, 213
diff: 218, 218
diff3: 218, 218
dir: 211, 213
dircolors: 211, 213
dirname: 211, 213
dmesg: 252, 254
dnsdomainname: 185, 186
du: 211, 213
dumpe2fs: 258, 259
dumpkeys: 231, 232
e2freefrag: 258, 259
e2fsck: 258, 259
e2image: 258, 259
e2label: 258, 259
e2mmpstatus: 258, 259
e2scrub: 258, 259
e2scrub_all: 258, 259
e2undo: 258, 259
e4crypt: 258, 259
e4defrag: 258, 259
echo: 211, 213
egrep: 178, 178
eject: 252, 254
elfedit: 148, 149
enc2xs: 188, 189
encguess: 188, 189
env: 211, 213
envsubst: 175, 175
eqn: 222, 222
eqn2graph: 222, 222
ex: 239, 241
expand: 211, 213
expect: 144, 145
expiry: 160, 162
expr: 211, 213
factor: 211, 213
faillog: 160, 162
fallocate: 252, 254
false: 211, 213
fdisk: 252, 254
fgconsole: 231, 232
fgrep: 178, 178

file: 136, 136
filefrag: 258, 260
fincore: 252, 254
find: 221, 221
findfs: 252, 254
findmnt: 252, 254
flex: 141, 141
flex++: 141, 141
flock: 252, 254
fmt: 211, 213
fold: 211, 213
free: 250, 250
fsck: 252, 254
fsck.cramfs: 252, 254
fsck.ext2: 258, 260
fsck.ext3: 258, 260
fsck.ext4: 258, 260
fsck.minix: 252, 254
fsfreeze: 252, 254
fstab-decode: 262, 262
fstrim: 252, 254
ftp: 185, 186
fuser: 174, 174
g++: 164, 168
gawk: 219, 220
gawk-5.3.0: 219, 220
gcc: 164, 168
gc-ar: 164, 168
gc-nm: 164, 168
gc-ranlib: 164, 168
gcov: 164, 168
gcov-dump: 164, 168
gcov-tool: 164, 168
gdbmtool: 182, 182
gdbm_dump: 182, 182
gdbm_load: 182, 182
gdiffmk: 222, 222
gencat: 122, 128
genl: 229, 229
getcap: 157, 157
getconf: 122, 128
getent: 122, 128
getfacl: 156, 156
getfattr: 155, 155
getkeycodes: 231, 232
getopt: 252, 254
getpcaps: 157, 157
getsubids: 160, 162
gettext: 175, 175
gettext.sh: 175, 175
391

Линукс с нуля - Версия 12.1
gettextize: 175, 175
glilypond: 222, 222
gpasswd: 160, 162
gperf: 183, 183
gperl: 222, 222
gpinyin: 222, 222
gprof: 148, 149
gprofng: 148, 149
grap2graph: 222, 223
grep: 178, 178
grn: 222, 223
grodvi: 222, 223
groff: 222, 223
groffer: 222, 223
grog: 222, 223
grolbp: 222, 223
grolj4: 222, 223
gropdf: 222, 223
grops: 222, 223
grotty: 222, 223
groupadd: 160, 162
groupdel: 160, 162
groupmems: 160, 162
groupmod: 160, 163
groups: 211, 213
grpck: 160, 163
grpconv: 160, 163
grpunconv: 160, 163
grub-bios-setup: 225, 226
grub-editenv: 225, 226
grub-file: 225, 226
grub-fstest: 225, 226
grub-glue-efi: 225, 226
grub-install: 225, 226
grub-kbdcomp: 225, 226
grub-macbless: 225, 226
grub-menulst2cfg: 225, 226
grub-mkconfig: 225, 226
grub-mkimage: 225, 226
grub-mklayout: 225, 226
grub-mknetdir: 225, 226
grub-mkpasswd-pbkdf2: 225, 226
grub-mkrelpath: 225, 226
grub-mkrescue: 225, 226
grub-mkstandalone: 225, 226
grub-ofpathname: 225, 226
grub-probe: 225, 226
grub-reboot: 225, 226
grub-render-label: 225, 226
grub-script-check: 225, 226

grub-set-default: 225, 226
grub-setup: 225, 226
grub-syslinux2cfg: 225, 227
gunzip: 228, 228
gzexe: 228, 228
gzip: 228, 228
h2ph: 188, 189
h2xs: 188, 189
halt: 262, 262
hardlink: 252, 254
head: 211, 213
hexdump: 252, 254
hostid: 211, 213
hostname: 185, 186
hpftodit: 222, 223
hwclock: 252, 254
i386: 252, 254
iconv: 122, 128
iconvconfig: 122, 128
id: 211, 213
idle3: 203
ifconfig: 185, 186
ifnames: 193, 193
ifstat: 229, 229
indxbib: 222, 223
info: 237, 237
infocmp: 170, 172
infotocap: 170, 172
init: 262, 262
insmod: 198, 198
install: 211, 213
install-info: 237, 238
instmodsh: 188, 189
intltool-extract: 192, 192
intltool-merge: 192, 192
intltool-prepare: 192, 192
intltool-update: 192, 192
intltoolize: 192, 192
ionice: 252, 254
ip: 229, 229
ipcmk: 252, 254
ipcrm: 252, 254
ipcs: 252, 254
irqtop: 252, 254
isosize: 252, 254
join: 211, 213
json_pp: 188, 189
kbdinfo: 231, 232
kbdrate: 231, 232
kbd_mode: 231, 232
392

Линукс с нуля - Версия 12.1
kill: 252, 254
killall: 174, 174
killall5: 262, 262
klogd: 261, 261
kmod: 198, 199
last: 252, 254
lastb: 252, 254
ld: 148, 149
ld.bfd: 148, 149
ld.gold: 148, 149
ldattach: 252, 254
ldconfig: 122, 128
ldd: 122, 128
lddlibc4: 122, 128
less: 187, 187
lessecho: 187, 187
lesskey: 187, 187
lex: 141, 141
lexgrog: 247, 249
lfskernel-6.7.4: 294, 299
libasan: 164, 168
libatomic: 164, 168
libcc1: 164, 168
libnetcfg: 188, 189
libtool: 181, 181
libtoolize: 181, 181
link: 211, 213
linux32: 252, 254
linux64: 252, 254
lkbib: 222, 223
ln: 211, 213
lnstat: 229, 230
loadkeys: 231, 232
loadunimap: 231, 232
locale: 122, 128
localedef: 122, 128
locate: 221, 221
logger: 252, 254
login: 160, 163
logname: 211, 213
logoutd: 160, 163
logsave: 258, 260
look: 252, 255
lookbib: 222, 223
losetup: 252, 255
ls: 211, 214
lsattr: 258, 260
lsblk: 252, 255
lscpu: 252, 255
lsfd: 252, 255

lsipc: 252, 255
lsirq: 252, 255
lslocks: 252, 255
lslogins: 252, 255
lsmem: 252, 255
lsmod: 198, 199
lsns: 252, 255
lto-dump: 164, 168
lzcat: 133, 133
lzcmp: 133, 133
lzdiff: 133, 133
lzegrep: 133, 133
lzfgrep: 133, 133
lzgrep: 133, 133
lzless: 133, 133
lzma: 133, 133
lzmadec: 133, 133
lzmainfo: 133, 134
lzmore: 133, 134
m4: 139, 139
make: 234, 234
makedb: 122, 128
makeinfo: 237, 238
man: 247, 249
man-recode: 247, 249
mandb: 247, 249
manpath: 247, 249
mapscrn: 231, 232
mcookie: 252, 255
md5sum: 211, 214
mesg: 252, 255
meson: 210, 210
mkdir: 211, 214
mke2fs: 258, 260
mkfifo: 211, 214
mkfs: 252, 255
mkfs.bfs: 252, 255
mkfs.cramfs: 252, 255
mkfs.ext2: 258, 260
mkfs.ext3: 258, 260
mkfs.ext4: 258, 260
mkfs.minix: 252, 255
mklost+found: 258, 260
mknod: 211, 214
mkswap: 252, 255
mktemp: 211, 214
mk_cmds: 258, 260
mmroff: 222, 223
modinfo: 198, 199
modprobe: 198, 199
393

Линукс с нуля - Версия 12.1
more: 252, 255
mount: 252, 255
mountpoint: 252, 255
msgattrib: 175, 175
msgcat: 175, 175
msgcmp: 175, 176
msgcomm: 175, 176
msgconv: 175, 176
msgen: 175, 176
msgexec: 175, 176
msgfilter: 175, 176
msgfmt: 175, 176
msggrep: 175, 176
msginit: 175, 176
msgmerge: 175, 176
msgunfmt: 175, 176
msguniq: 175, 176
mtrace: 122, 128
mv: 211, 214
namei: 252, 255
ncursesw6-config: 170, 172
neqn: 222, 223
newgidmap: 160, 163
newgrp: 160, 163
newuidmap: 160, 163
newusers: 160, 163
ngettext: 175, 176
nice: 211, 214
ninja: 209, 209
nl: 211, 214
nm: 148, 149
nohup: 211, 214
nologin: 160, 163
nproc: 211, 214
nroff: 222, 223
nsenter: 252, 255
nstat: 229, 230
numfmt: 211, 214
objcopy: 148, 149
objdump: 148, 149
od: 211, 214
openssl: 196, 197
openvt: 231, 232
partx: 252, 255
passwd: 160, 163
paste: 211, 214
patch: 235, 235
pathchk: 211, 214
pcprofiledump: 122, 128
pdfmom: 222, 223

pdfroff: 222, 223
pdftexi2dvi: 237, 238
peekfd: 174, 174
perl: 188, 189
perl5.38.2: 188, 189
perlbug: 188, 189
perldoc: 188, 189
perlivp: 188, 189
perlthanks: 188, 189
pfbtops: 222, 223
pgrep: 250, 250
pic: 222, 223
pic2graph: 222, 223
piconv: 188, 189
pidof: 250, 250
ping: 185, 186
ping6: 185, 186
pinky: 211, 214
pip3: 203
pivot_root: 252, 255
pkgconf: 147, 147
pkill: 250, 250
pl2pm: 188, 189
pldd: 122, 128
pmap: 250, 250
pod2html: 188, 189
pod2man: 188, 189
pod2texi: 237, 238
pod2text: 188, 189
pod2usage: 188, 189
podchecker: 188, 189
podselect: 188, 189
post-grohtml: 222, 223
poweroff: 262, 262
pr: 211, 214
pre-grohtml: 222, 223
preconv: 222, 223
printenv: 211, 214
printf: 211, 214
prlimit: 252, 255
prove: 188, 189
prtstat: 174, 174
ps: 250, 250
psfaddtable: 231, 232
psfgettable: 231, 232
psfstriptable: 231, 232
psfxtable: 231, 232
pslog: 174, 174
pstree: 174, 174
pstree.x11: 174, 174
394

Линукс с нуля - Версия 12.1
ptar: 188, 189
ptardiff: 188, 190
ptargrep: 188, 190
ptx: 211, 214
pwck: 160, 163
pwconv: 160, 163
pwd: 211, 214
pwdx: 250, 251
pwunconv: 160, 163
pydoc3: 203
python3: 203
ranlib: 148, 149
readelf: 148, 150
readlink: 211, 214
readprofile: 252, 255
realpath: 211, 214
reboot: 262, 262
recode-sr-latin: 175, 176
refer: 222, 224
rename: 252, 255
renice: 252, 255
reset: 170, 172
resize2fs: 258, 260
resizepart: 252, 255
rev: 252, 255
rfkill: 252, 255
rm: 211, 214
rmdir: 211, 214
rmmod: 198, 199
roff2dvi: 222, 224
roff2html: 222, 224
roff2pdf: 222, 224
roff2ps: 222, 224
roff2text: 222, 224
roff2x: 222, 224
routel: 229, 230
rtacct: 229, 230
rtcwake: 252, 256
rtmon: 229, 230
rtpr: 229, 230
rtstat: 229, 230
runcon: 211, 214
runlevel: 262, 262
runtest: 146, 146
rview: 239, 241
rvim: 239, 241
script: 252, 256
scriptlive: 252, 256
scriptreplay: 252, 256
sdiff: 218, 218

sed: 173, 173
seq: 211, 214
setarch: 252, 256
setcap: 157, 157
setfacl: 156, 156
setfattr: 155, 155
setfont: 231, 232
setkeycodes: 231, 232
setleds: 231, 232
setmetamode: 231, 232
setsid: 252, 256
setterm: 252, 256
setvtrgb: 231, 232
sfdisk: 252, 256
sg: 160, 163
sh: 179, 180
sha1sum: 211, 214
sha224sum: 211, 214
sha256sum: 211, 214
sha384sum: 211, 214
sha512sum: 211, 215
shasum: 188, 190
showconsolefont: 231, 232
showkey: 231, 232
shred: 211, 215
shuf: 211, 215
shutdown: 262, 262
size: 148, 150
slabtop: 250, 251
sleep: 211, 215
sln: 122, 128
soelim: 222, 224
sort: 211, 215
sotruss: 122, 128
splain: 188, 190
split: 211, 215
sprof: 122, 128
ss: 229, 230
stat: 211, 215
stdbuf: 211, 215
strings: 148, 150
strip: 148, 150
stty: 211, 215
su: 160, 163
sulogin: 252, 256
sum: 211, 215
swaplabel: 252, 256
swapoff: 252, 256
swapon: 252, 256
switch_root: 252, 256
395

Линукс с нуля - Версия 12.1
sync: 211, 215
sysctl: 250, 251
syslogd: 261, 261
tabs: 170, 172
tac: 211, 215
tail: 211, 215
talk: 185, 186
tar: 236, 236
taskset: 252, 256
tbl: 222, 224
tc: 229, 230
tclsh: 142, 143
tclsh8.6: 142, 143
tee: 211, 215
telinit: 262, 262
telnet: 185, 186
test: 211, 215
texi2dvi: 237, 238
texi2pdf: 237, 238
texi2any: 237, 238
texindex: 237, 238
tfmtodit: 222, 224
tftp: 185, 186
tic: 170, 172
timeout: 211, 215
tload: 250, 251
toe: 170, 172
top: 250, 251
touch: 211, 215
tput: 170, 172
tr: 211, 215
traceroute: 185, 186
troff: 222, 224
true: 211, 215
truncate: 211, 215
tset: 170, 172
tsort: 211, 215
tty: 211, 215
tune2fs: 258, 260
tzselect: 122, 128
uclampset: 252, 256
udev-hwdb: 244, 246
udevadm: 244, 246
udevd: 244, 246
ul: 252, 256
umount: 252, 256
uname: 211, 215
uname26: 252, 256
uncompress: 228, 228
unexpand: 211, 215

unicode_start: 231, 232
unicode_stop: 231, 232
uniq: 211, 215
unlink: 211, 215
unlzma: 133, 134
unshare: 252, 256
unxz: 133, 134
updatedb: 221, 221
uptime: 250, 251
useradd: 160, 163
userdel: 160, 163
usermod: 160, 163
users: 211, 215
utmpdump: 252, 256
uuidd: 252, 256
uuidgen: 252, 256
uuidparse: 252, 256
vdir: 211, 215
vi: 239, 241
view: 239, 241
vigr: 160, 163
vim: 239, 241
vimdiff: 239, 241
vimtutor: 239, 241
vipw: 160, 163
vmstat: 250, 251
w: 250, 251
wall: 252, 256
watch: 250, 251
wc: 211, 215
wdctl: 252, 256
whatis: 247, 249
wheel: 207
whereis: 252, 256
who: 211, 215
whoami: 211, 215
wipefs: 252, 256
x86_64: 252, 256
xargs: 221, 221
xgettext: 175, 176
xmlwf: 184, 184
xsubpp: 188, 190
xtrace: 122, 128
xxd: 239, 241
xz: 133, 134
xzcat: 133, 134
xzcmp: 133, 134
xzdec: 133, 134
xzdiff: 133, 134
xzegrep: 133, 134
396

Линукс с нуля - Версия 12.1
xzfgrep: 133, 134
xzgrep: 133, 134
xzless: 133, 134
xzmore: 133, 134
yacc: 177, 177
yes: 211, 216
zcat: 228, 228
zcmp: 228, 228
zdiff: 228, 228
zdump: 122, 128
zegrep: 228, 228
zfgrep: 228, 228
zforce: 228, 228
zgrep: 228, 228
zic: 122, 128
zipdetails: 188, 190
zless: 228, 228
zmore: 228, 228
znew: 228, 228
zramctl: 252, 256
zstd: 135, 135
zstdgrep: 135, 135
zstdless: 135, 135

libfdisk: 252, 257
libffi: 201
libfl: 141, 141
libformw: 170, 172
libg: 122, 128
libgcc: 164, 168
libgcov: 164, 168
libgdbm: 182, 182
libgdbm_compat: 182, 182
libgettextlib: 175, 176
libgettextpo: 175, 176
libgettextsrc: 175, 176
libgmp: 151, 152
libgmpxx: 151, 152
libgomp: 164, 168
libgprofng: 148, 150
libhistory: 137, 137
libhwasan: 164, 168
libitm: 164, 168
libkmod: 198
liblsan: 164, 168
libltdl: 181, 181
liblto_plugin: 164, 168
liblzma: 133, 134
libm: 122, 129
libmagic: 136, 136
libman: 247, 249
libmandb: 247, 249
libmcheck: 122, 129
libmemusage: 122, 129
libmenuw: 170, 172
libmount: 252, 257
libmpc: 154, 154
libmpfr: 153, 153
libmvec: 122, 129
libncurses++w: 170, 172
libncursesw: 170, 172
libnsl: 122, 129
libnss_*: 122,129
libopcodes: 148, 150
libpanelw: 170, 172
libpcprofile: 122, 129
libpipeline: 233
libpkgconf: 147, 147
libproc-2: 250, 251
libpsx: 157, 157
libpthread: 122, 129
libquadmath: 164, 168
libreadline: 137, 138
libresolv: 122, 129

Библиотеки
Expat: 191, 191
ld-2.39.so: 122, 128
libacl: 156, 156
libanl: 122, 128
libasprintf: 175, 176
libattr: 155, 155
libbfd: 148, 150
libblkid: 252, 257
libBrokenLocale: 122, 128
libbz2: 131, 132
libc: 122, 128
libcap: 157, 157
libcheck: 217, 217
libcom_err: 258, 260
libcrypt: 158, 159
libcrypto.so: 196, 197
libctf: 148, 150
libctf-nobfd: 148, 150
libc_malloc_debug: 122, 128
libdl: 122, 128
libe2p: 258, 260
libelf: 200, 200
libexpat: 184, 184
libexpect-5.45.4: 144, 145
libext2fs: 258, 260
397

Линукс с нуля - Версия 12.1
librt: 122, 129
libsframe: 148, 150
libsmartcols: 252, 257
libss: 258, 260
libssl.so: 196, 197
libssp: 164, 168
libstdbuf: 211, 216
libstdc++: 164, 168
libstdc++exp: 164, 168
libstdc++fs: 164, 168
libsubid: 160, 163
libsupc++: 164, 169
libtcl8.6.so: 142, 143
libtclstub8.6.a: 142, 143
libtextstyle: 175, 176
libthread_db: 122, 129
libtsan: 164, 169
libubsan: 164, 169
libudev: 244, 246
libutil: 122, 129
libuuid: 252, 257
liby: 177, 177
libz: 130, 130
libzstd: 135, 135
preloadable_libintl: 175, 176

/etc/hosts: 277
configuring: 275
network: 267, 267
/etc/hosts: 277
configuring: 275
network: 267, 267
/etc/hosts: 277
configuring: 275
rc: 267, 267
reboot: 267, 268
sendsignals: 267, 268
setclock: 267, 268
configuring: 280
setclock: 267, 268
configuring: 280
swap: 267, 268
sysctl: 267, 268
sysklogd: 267, 268
configuring: 285
sysklogd: 267, 268
configuring: 285
template: 267, 268
udev: 267, 268
udev_retry: 267, 268
dwp: 148, 149

Скрипты

Разное

checkfs: 267, 267
cleanfs: 267, 267
console: 267, 267
configuring: 281
console: 267, 267
configuring: 281
File creation at boot
configuring: 285
functions: 267, 267
halt: 267, 267
hostname
configuring: 277
ifdown: 267, 267
ifup: 267, 267
ipv4-static: 267, 268
localnet: 267, 267
/etc/hosts: 277
localnet: 267, 267
/etc/hosts: 277
modules: 267, 267
mountfs: 267, 267
mountvirtfs: 267, 267
network: 267, 267

/boot/config-6.7.4: 294, 299
/boot/System.map-6.7.4: 294, 299
/dev/*: 98
/etc/fstab: 292
/etc/group: 101
/etc/hosts: 277
/etc/inittab: 279
/etc/inputrc: 289
/etc/ld.so.conf: 127
/etc/lfs-release: 303
/etc/localtime: 126
/etc/lsb-release: 303
/etc/mke2fs.conf: 259
/etc/modprobe.d/usb.conf: 298
/etc/nsswitch.conf: 126
/etc/os-release: 303
/etc/passwd: 101
/etc/profile: 287
/etc/protocols: 121
/etc/resolv.conf: 276
/etc/services: 121
/etc/syslog.conf: 261
/etc/udev: 244, 246
398

Линукс с нуля - Версия 12.1
/etc/udev/hwdb.bin: 246
/etc/vimrc: 240
/run/utmp: 101
/usr/include/asm-generic/*.h: 72, 72
/usr/include/asm/*.h: 72, 72
/usr/include/drm/*.h: 72, 72
/usr/include/linux/*.h: 72, 72
/usr/include/misc/*.h: 72, 72
/usr/include/mtd/*.h: 72, 72
/usr/include/rdma/*.h: 72, 72
/usr/include/scsi/*.h: 72, 72
/usr/include/sound/*.h: 72, 72
/usr/include/video/*.h: 72, 72
/usr/include/xen/*.h: 72, 72
/var/log/btmp: 101
/var/log/lastlog: 101
/var/log/wtmp: 101
/etc/shells: 290
man pages: 120, 120

399