КулЛиб - Классная библиотека! Скачать книги бесплатно 

Linux From Scratch Версия 7.3 (pdf) читать онлайн

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


 [Настройки текста]  [Cбросить фильтры]
Linux From Scratch
Версия 7.3

Автор Gerard Beekmans
Редакторы Matthew Burgess и Bruce Dubbs
Перевод Иван Лабутин

Linux From Scratch: Версия 7.3

by Автор Gerard Beekmans, Редакторы Matthew Burgess и Bruce Dubbs, Перевод Иван Лабутин
Copyright © 1999-2013 Gerard Beekmans
Copyright © 1999-2013, Gerard Beekmans
Все права защищены.
Эта книга выпущена под лицензией Creative Commons License.
Команды для компьютера могут быть извлечены из книги под лицензией MIT License.
Linux® зарегистрированная торговая марка Linus Torvalds.

Linux From Scratch - Версия 7.3

Содержание
Пролог ......................................................................................................................... viii
i. Предисловие ........................................................................................................ viii
ii. Кому адресована эта книга? ............................................................................... ix
iii. Целевые архитектуры LFS .................................................................................. x
iv. LFS и стандарты .................................................................................................. x
v. Пояснения к выбранным пакетам ..................................................................... xii
vi. Необходимые знания ....................................................................................... xvii
vii. Требования к хост-системе ........................................................................... xviii
viii. Соглашения, используемые в книге .............................................................. xxi
ix. Структура .......................................................................................................... xxii
x. Предупреждения об ошибках .......................................................................... xxii
I. Начало ........................................................................................................................ 1
1. Введение ................................................................................................................ 2
1.1. Как собрать LFS-систему ............................................................................. 2
1.2. Нововведения в этом выпуске ..................................................................... 3
1.3. Список изменений ........................................................................................ 4
1.4. Ресурсы .......................................................................................................... 9
1.5. Помощь ........................................................................................................ 10
II. Подготовка к сборке .............................................................................................. 13
2. Подготовка нового раздела ............................................................................... 14
2.1. Вступление .................................................................................................. 14
2.2. Создание нового раздела ........................................................................... 14
2.3. Создание файловой системы на разделе .................................................. 16
2.4. Монтирование нового раздела .................................................................. 17
3. Пакеты и патчи .................................................................................................. 19
3.1. Вступление .................................................................................................. 19
3.2. Все пакеты .................................................................................................. 19
3.3. Необходимые патчи .................................................................................... 25
4. Последние приготовления ................................................................................. 27
4.1. О переменной $LFS .................................................................................... 27
4.2. Создание директории $LFS/tools ............................................................... 27
4.3. Добавление пользователя LFS ................................................................... 28
4.4. Установка рабочего окружения ................................................................ 29
4.5. О SBU .......................................................................................................... 30
4.6. О выполнении тестов ................................................................................. 31
5. Построение временной системы ....................................................................... 33
5.1. Вступление .................................................................................................. 33
5.2. Toolchain Technical Notes ........................................................................... 33
5.3. General Compilation Instructions ................................................................ 35
5.4. Binutils-2.23.1 - Шаг 1 ................................................................................ 37
5.5. GCC-4.7.2 - Шаг 1 ....................................................................................... 39
5.6. Linux-3.8.1 API Headers .............................................................................. 42
5.7. Glibc-2.17 ..................................................................................................... 43
5.8. Binutils-2.23.1 - Шаг 2 ................................................................................ 46
5.9. GCC-4.7.2 - Шаг 2 ....................................................................................... 48
5.10. Tcl-8.6.0 ...................................................................................................... 52
5.11. Expect-5.45 ................................................................................................. 54
5.12. DejaGNU-1.5 ............................................................................................... 56
iii

Linux From Scratch - Версия 7.3
5.13. Check-0.9.9 ................................................................................................. 57
5.14. Ncurses-5.9 ................................................................................................ 58
5.15. Bash-4.2 ...................................................................................................... 59
5.16. Bzip2-1.0.6 .................................................................................................. 60
5.17. Coreutils-8.21 ............................................................................................. 61
5.18. Diffutils-3.2 ................................................................................................. 62
5.19. File-5.13 ...................................................................................................... 63
5.20. Findutils-4.4.2 ............................................................................................. 64
5.21. Gawk-4.0.2 .................................................................................................. 65
5.22. Gettext-0.18.2 ............................................................................................. 66
5.23. Grep-2.14 .................................................................................................... 67
5.24. Gzip-1.5 ...................................................................................................... 68
5.25. M4-1.4.16 ................................................................................................... 69
5.26. Make-3.82 ................................................................................................... 70
5.27. Patch-2.7.1 .................................................................................................. 71
5.28. Perl-5.16.2 .................................................................................................. 72
5.29. Sed-4.2.2 ..................................................................................................... 73
5.30. Tar-1.26 ...................................................................................................... 74
5.31. Texinfo-5.0 .................................................................................................. 75
5.32. Xz-5.0.4 ....................................................................................................... 76
5.33. Очистка ...................................................................................................... 77
5.34. Смена владельща ...................................................................................... 77
III. Сборка системы LFS ............................................................................................. 79
6. Установка базовых системных пакетов ............................................................ 80
6.1. Introduction .................................................................................................. 80
6.2. Preparing Virtual Kernel File Systems ......................................................... 80
6.3. Package Management .................................................................................. 81
6.4. Entering the Chroot Environment ............................................................... 85
6.5. Creating Directories ..................................................................................... 86
6.6. Creating Essential Files and Symlinks ......................................................... 87
6.7. Linux-3.8.1 API Headers .............................................................................. 89
6.8. Man-pages-3.47 ............................................................................................ 91
6.9. Glibc-2.17 ..................................................................................................... 92
6.10. Adjusting the Toolchain ............................................................................ 100
6.11. Zlib-1.2.7 .................................................................................................. 102
6.12. File-5.13 .................................................................................................... 103
6.13. Binutils-2.23.1 .......................................................................................... 104
6.14. GMP-5.1.1 ................................................................................................. 107
6.15. MPFR-3.1.1 ............................................................................................... 109
6.16. MPC-1.0.1 ................................................................................................. 110
6.17. GCC-4.7.2 ................................................................................................. 111
6.18. Sed-4.2.2 ................................................................................................... 116
6.19. Bzip2-1.0.6 ................................................................................................ 117
6.20. Pkg-config-0.28 ......................................................................................... 119
6.21. Ncurses-5.9 .............................................................................................. 120
6.22. Util-linux-2.22.2 ........................................................................................ 123
6.23. Psmisc-22.20 ............................................................................................. 128
6.24. Procps-ng-3.3.6 ......................................................................................... 129
6.25. E2fsprogs-1.42.7 ....................................................................................... 131
6.26. Shadow-4.1.5.1 ......................................................................................... 134
iv

Linux From Scratch - Версия 7.3
6.27. Coreutils-8.21 ...........................................................................................
6.28. Iana-Etc-2.30 ............................................................................................
6.29. M4-1.4.16 .................................................................................................
6.30. Bison-2.7 ...................................................................................................
6.31. Grep-2.14 ..................................................................................................
6.32. Readline-6.2 ..............................................................................................
6.33. Bash-4.2 ....................................................................................................
6.34. Libtool-2.4.2 .............................................................................................
6.35. GDBM-1.10 ...............................................................................................
6.36. Inetutils-1.9.1 ...........................................................................................
6.37. Perl-5.16.2 ................................................................................................
6.38. Autoconf-2.69 ...........................................................................................
6.39. Automake-1.13.1 .......................................................................................
6.40. Diffutils-3.2 ...............................................................................................
6.41. Gawk-4.0.2 ................................................................................................
6.42. Findutils-4.4.2 ...........................................................................................
6.43. Flex-2.5.37 ................................................................................................
6.44. Gettext-0.18.2 ...........................................................................................
6.45. Groff-1.22.2 ...............................................................................................
6.46. Xz-5.0.4 .....................................................................................................
6.47. GRUB-2.00 ................................................................................................
6.48. Less-451 ...................................................................................................
6.49. Gzip-1.5 ....................................................................................................
6.50. IPRoute2-3.8.0 ..........................................................................................
6.51. Kbd-1.15.5 ................................................................................................
6.52. Kmod-12 ...................................................................................................
6.53. Libpipeline-1.2.2 .......................................................................................
6.54. Make-3.82 .................................................................................................
6.55. Man-DB-2.6.3 ............................................................................................
6.56. Patch-2.7.1 ................................................................................................
6.57. Sysklogd-1.5 .............................................................................................
6.58. Sysvinit-2.88dsf ........................................................................................
6.59. Tar-1.26 ....................................................................................................
6.60. Texinfo-5.0 ................................................................................................
6.61. Udev-197 (Extracted from systemd-197) .................................................
6.62. Vim-7.3 .....................................................................................................
6.63. About Debugging Symbols .......................................................................
6.64. Stripping Again ........................................................................................
6.65. Cleaning Up .............................................................................................
7. Установка загрузочных скриптов ...................................................................
7.1. Вступление ................................................................................................
7.2. General Network Configuration .................................................................
7.3. Создание файла /etc/hosts ........................................................................
7.4. Device and Module Handling on an LFS System .......................................
7.5. Создание собственных ссылок на устройства ........................................
7.6. LFS-Bootscripts-20130123 .........................................................................
7.7. How Do These Bootscripts Work? ..............................................................
7.8. Настройка системного имени компьютера .............................................
7.9. Настройка скрипта setclock .....................................................................
7.10. Настройка консоли Linux .......................................................................
v

138
144
145
146
147
148
150
152
153
154
156
159
161
163
164
165
167
169
171
174
176
178
179
181
183
186
188
189
190
193
194
195
197
198
200
202
205
205
206
207
207
207
210
211
215
218
220
222
223
223

Linux From Scratch - Версия 7.3
7.11. Настройка скрипта sysklogd ..................................................................
7.12. Файл rc.site ..............................................................................................
7.13. The Bash Shell Startup Files ...................................................................
7.14. Создание файла /etc/inputrc ...................................................................
8. Делаем LFS-систему загружаемой .................................................................
8.1. Вступление ................................................................................................
8.2. Создание файла /etc/fstab .........................................................................
8.3. Linux-3.8.1 ..................................................................................................
8.4. Настройка загрузчика GRUB ...................................................................
9. Конец .................................................................................................................
9.1. Конец .........................................................................................................
9.2. Регистрация ..............................................................................................
9.3. Перезагрузка системы .............................................................................
9.4. Что дальше? ..............................................................................................
IV. Приложения .........................................................................................................
A. Сокращения и термины ...................................................................................
B. Благодарности ..................................................................................................
C. Зависимости ......................................................................................................
D. Загрузочные и конфигурационные скрипты версии 20130123 .....................
D.1. /etc/rc.d/init.d/rc .........................................................................................
D.2. /lib/lsb/init-functions ...................................................................................
D.3. /etc/rc.d/init.d/functions .............................................................................
D.4. /etc/rc.d/init.d/mountvirtfs ..........................................................................
D.5. /etc/rc.d/init.d/modules ...............................................................................
D.6. /etc/rc.d/init.d/udev ....................................................................................
D.7. /etc/rc.d/init.d/swap ....................................................................................
D.8. /etc/rc.d/init.d/setclock ...............................................................................
D.9. /etc/rc.d/init.d/checkfs ................................................................................
D.10. /etc/rc.d/init.d/mountfs .............................................................................
D.11. /etc/rc.d/init.d/udev_retry .........................................................................
D.12. /etc/rc.d/init.d/cleanfs ...............................................................................
D.13. /etc/rc.d/init.d/console ..............................................................................
D.14. /etc/rc.d/init.d/localnet .............................................................................
D.15. /etc/rc.d/init.d/sysctl .................................................................................
D.16. /etc/rc.d/init.d/sysklogd ............................................................................
D.17. /etc/rc.d/init.d/network .............................................................................
D.18. /etc/rc.d/init.d/sendsignals .......................................................................
D.19. /etc/rc.d/init.d/reboot ................................................................................
D.20. /etc/rc.d/init.d/halt ....................................................................................
D.21. /etc/rc.d/init.d/template ............................................................................
D.22. /etc/sysconfig/modules .............................................................................
D.23. /etc/sysconfig/createfiles ..........................................................................
D.24. /etc/sysconfig/udev-retry ..........................................................................
D.25. /sbin/ifup ...................................................................................................
D.26. /sbin/ifdown ..............................................................................................
D.27. /lib/services/ipv4-static .............................................................................
D.28. /lib/services/ipv4-static-route ...................................................................
E. Правила конфигурации Udev ..........................................................................
E.1. 55-lfs.rules ..................................................................................................
F. Лицензии LFS ...................................................................................................
vi

226
227
229
231
233
233
233
235
239
242
242
242
242
244
246
247
250
253
266
266
270
283
296
297
298
300
301
302
305
306
307
309
311
312
313
315
316
317
318
319
320
320
321
321
323
325
326
329
329
330

Linux From Scratch - Версия 7.3
F.1. Creative Commons License ........................................................................ 330
F.2. The MIT License ......................................................................................... 334
Предметный указатель ............................................................................................. 336

vii

Linux From Scratch - Версия 7.3

Пролог
Предисловие
Мои приключения в изучении Linux начались больше десяти лет назад, в 1998.
Я просто установил свой первый дистрибутив Linux и быстро стал поклонником
концепции и философии Linux.
Всегда существуют несколько путей решения задачи. То же самое можно сказать
о дистрибутивах Linux. Самые серьезные существуют годами. Некоторые все
еще существуют, некоторые превратились во что-то другое, еще одни остались
только в нашей памяти. Они все разные, все отражают потребности целевой
аудитории. Поскольку существует такое огромное количество путей достижения
одного результата, я начал понимать, что я более не обязан ограничиваться какойлибо одной реализацией. До исследования Linux, нам просто приходилось мириться с
проблемами других операционных систем, поскольку у нас не было выбора. Это было
так, нравилось Вам или нет. С Linux концепция выбора дошла до своего апогея. Если
Вам что-то не нравится, Вы абсолютно свободно можете поменять это, настолько
свободно, насколько вообще возможно.
Я попробовал несколько дистрибутивов и не смог остановиться ни на одном.
Они все хороши, каждый по-своему. Более не существует понятий "правильно" и
"неправильно". Теперь всем управляет Ваш личный вкус. При огромной свободе
выбора я осознал, что невозможно подобрать себе одну идеальную во всем систему.
Поэтому я решил создать мою собственную систему Linux, которая полностью бы
соответствовала моим персональным предпчтениям.
Чтобы действительно получить свою собственную систему, я решил собирать
абсолютно все из исходных кодов вместо того, чтобы использовать
прекомпилированные бинарные пакеты. Эта «идеальная» Linux-система должна
иметь сильные стороны всех других систем и исключать их слабости. Поначалу идея
казалась весьма обескураживающей. Не верилось, что такая система может быть
создана.
После долгого преодоления препятствий, таких как взаимные зависимости и
ошибки компиляции, я наконец собрал свою собственную Linux-систему. Она была
полностью готова для использования, как и любой другой дистрибутив Linux. Но это
было мое творение. Это было необыкновенное чувство. Лучше этого было бы только
самостоятельное написание каждого компонента системы.
Как только я поделился своими идеями с другими членами Linux-сообщества, стало
ясно, что существует стойкий интерес к подобным проектам. Сразу стало ясно,
что такие самосборные Linux-системы могут не только служить для удовлетворения
специфических требований пользователя, но и быть идеальным обучающим
материалом для программистов и системных администраторов, на котором они
могли бы оттачивать свое мастерство. Именно из этих идей и родился проект Linux
From Scratch.
Эта книга - ядро проекта Linux From Scratch. Она предоставляет фундамент и
инструкции, необходимые Вам для построения и компиляции собственной системы.
Эта книга дает шаблон, следуя которому Вы получите корректно работающую
систему; Вы свободно можете изменять инструкции, чтобы результат соответствовал
viii

Linux From Scratch - Версия 7.3
Вашим желаниям, и на самом деле именно это и есть важнейшая часть проекта. Вы
контролируете все; мы просто протягиваем руку помощи, чтобы помочь Вам в начале
Вашего собственного приключения.
Я искренне надеюсь, что Вы замечательно проведете время, работая над своей
собственной сборкой Linux From Scratch и наслаждаясь огромным числом
преимуществ Своей Собственной Системы.
-Gerard Beekmans
gerard@linuxfromscratch.org

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

Linux From Scratch - Версия 7.3

Целевые архитектуры LFS
Главными целевыми архитектурами LFS являются 32-разрядные (x86) и 64разрядные (x86_64) процессоры AMD/Intel. Несмотря на это, инструкции в книге,
с небольшими изменениями, работают и с Power PC. Чтобы собрать систему,
использующую один из этих процессоров, необходимо, в дополнение к другим
нижеследующим требованиям, иметь существующую систему Linux, такую как
более ранняя установка LFS, Ubuntu, Red Hat/Fedora, SuSE, которая также бы
поддерживала данную архитектуру процессора. Также, помните, что 32-разрядный
дистрибутив может быть установлен и использован как хост-система на 64разрядных компьютерах AMD/Intel.
Необходимо сказать еще несколько слов о 64-разрядных системах. В сравнении
с 32-разрядными, размер исполняемых файлов немного больше при практически
незаметной разнице в скорости выполнения. Например, при тестовой сборке LFS-6.5
на системе с процессором Core2Duo были получены следующие результаты:
Архитектура
32-разрядная
64-разрядная

Время сборки Размер
198.5 минут 648 MB
190.6 минут 709 MB

Как Вы можете видеть, 64-разрядная сборка только на 4% быстрее и при этом на
9% больше, чем 32-разрядная. Выгода от перехода на 64-разрядную систему крайне
невелика. Конечно, если у Вас более 4GB RAM или Вам необходимо часто работать
с данными, размер которых превышает 4GB, преимущества 64-разрядной системы
очевидны.
По умолчанию, 64-разрядная система, которая получится при сборке LFS, является
так называемой "чистой" 64-разрядной системой. Такая система поддерживает
только 64-разрядные исполняемые файлы. Сборка "мульти-архитектурной" системы
требует двойной компиляции многих приложений, один раз для 32-разрядных
файлов и один раз для 64-разрядных. Это не поддерживается проектом LFS,
поскольку не соотносится с идеей предоставления инструкций, необходимых для
сборки простой Linux-системы. Вас может заинтересовать проект Cross Linux From
Scratch ключевой целью которого и является сборка мультиархитектурной системы.
И напоследок еще одно замечание о 64-разрядных системах. Некоторые пакеты
на данный момент не могут быть собраны для "чистой" 64-разрядной системы
или требуют специальных инструкций по сборке. Как правило, такие приложения
написаны с использованием специфичных для 32-разрядных систем ассемблерных
инструкций, которые не позволяют собрать программу для 64-разрядной системы.
Такими проблемными пакетами являются некоторые драйвера Xorg для устаревших
видеокарт из http://xorg.freedesktop.org/releases/individual/driver/. Большую часть
таких проблем можно обойти, но это требует дополнительных специальных действий
и патчей.

LFS и стандарты
Структура LFS следует стандартам Linux так строго, как только возможно. Главными
стандартами являются:
• POSIX.1-2008.
• Filesystem Hierarchy Standard (FHS)
x

Linux From Scratch - Версия 7.3
• Linux Standard Base (LSB) Specifications
LSB имеет пять отдельных частей: Core, C++, Desktop, Runtime Languages,
и Printing. В дополнение к основным требованиям имеются архитектурноспецифичные. LFS старается следовать вышеприведенным правилам.

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

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

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

LSB C++:

Gcc

LSB Desktop:

Нет

LSB Runtime Languages:

Perl

LSB Printing:

Нет

LSB Multimeda:

Нет

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

At, Batch (часть At), Bc, Cpio, Ed, Fcrontab, Initd-tools,
Lsb_release, PAM, Sendmail (или Postfix, или Exim)

LSB C++:

Нет

LSB Desktop:

ATK, Cairo, Desktop-file-utils, Freetype, Fontconfig, Glib2,
GTK+2, Icon-naming-utils, Libjpeg, Libpng, Libxml2,
MesaLib, Pango, Qt3, Qt4, Xorg

LSB Runtime Languages:

Python

LSB Printing:

CUPS

LSB Multimeda:

Alsa Libraries, NSPR, NSS, OpenSSL, Java, Xdg-utils

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

Нет
xi

Linux From Scratch - Версия 7.3
LSB C++:

Нет

LSB Desktop:

Нет

LSB Runtime Languages:

Нет

LSB Printing:

Нет

LSB Multimeda:

Нет

Пояснения к выбранным пакетам
Как было сказано выше, цель проекта LFS - построение полной и готовой к
использованию системы базового уровня. Она должна включать в себя все пакеты,
необходимые для самовоспроизведения, предоставляя относительно небольшую
основу, от которой пользователь может отталкиваться в построении своей, более
сложной системы. Это не значит, что LFS не может быть сделана еще более
маленькой. Некоторые важные пакеты, несмотря на наши рекомендации, могут быть
более-менее безболезненно исключены из построения. Список, представленный
ниже, поясняет роль каждого пакета в системе и причины, по которым он был
включен в книгу.
• Autoconf
Этот пакет содержит программы, создающие скрипты оболочки, способные
автоматически сконфигурировать исходные коды из шаблона, предоставленного
разработчиком. Он часто необходим для повторной сборки пакета после
изменений в процедуре построения.
• Automake
Пакет содержит программы для генерации Make-файлов из шаблонов. Он
часто необходим для повторной сборки пакета после изменений в процедуре
построения.
• Bash
Этот пакет удовлетворяет требование LSB Core, по которому система должна
предоставлять интерфейс Bourne Shell. Он был выбран из большого числа других
вариантов потому, что является наиболее популярным и одним из самых мощных
по возможностям.
• Binutils
Этот пакет содержит компоновщик, ассемблер и другие утилиты для работы с
объектными файлами. Программы из этого пакета необходимы для компиляции
почти всех пакетов LFS и большинства остальных программ.
• Bison
Пакет содержит GNU-версию yacc (Yet Another Compiler Compiler, Еще Один
Компилятор Компиляторов), необходимого для сборки некоторых других
программ LFS.
• Bzip2
Этот пакет содержит программы для работы со сжатыми данными. Он необходим
для распаковки многих пакетов LFS.
• Check
xii

Linux From Scratch - Версия 7.3
This package contains a test harness for other programs. It is only installed in the
temporary toolchain.
• Coreutils
Пакет включает в себя необходимые программы для просмотра и обработки
файлов и каталогов. Они требуются для управления файлами из командной
строки, а также для установки абсолютно всех пакетов LFS.
• DejaGNU
Содержит компоненты для тестирования других программ. Этот пакет
устанавливается только как временный инструментарий.
• Diffutils
Пакет содержит программы, которые позволяют выявить различия между
файлами или каталогами. С их помощью можно создавать патчи, а также они
необходимы для сборки многих пакетов.
• E2fsprogs
Пакет включает в себя утилиты для оперирования с файловыми системами ext2,
ext3 и ext4. Это самые популярные и тщательно протестированные файловые
системы, поддержимаемые ядром Linux.
• Expect
Этот пакет содержит программу для связывания скриптовых диалогов с другими
интерактивными программами. Он зачастую используется при тестировании
других пакетов. Он устанавливается только как временный инструментарий.
• File
Этот пакет включает в себя утилиту для определения типа переданного ей файла
или нескольких файлов. Некоторые пакеты требуют ее для сборки.
• Findutils
Пакет содержит программы для поиска файлов в файловой системе. Очень
многие пакеты используют эти утилиты при сборке.
• Flex
Этот пакет содержит утилиту для генерации программ, способных распознавать
шаблоны в тексте. Это GNU-версия lex (лексического анализатора),
необходимого для сборки некоторых пакетов LFS.
• Gawk
В этом пакете содержится программа для оперирования содержимым текстовых
файлов. Это GNU-версия awk (Aho-Weinberg-Kernighan), который используется в
скриптах сборки многих пакетов.
• Gcc
Это - Собрание Компиляторов GNU (Gnu Compiler Collection). Данный пакет
содержит компиляторы C и C++, а также многие другие, не устанавливаемые в
процессе сборки LFS.
• GDBM

xiii

Linux From Scratch - Версия 7.3
Пакет предоставляет библиотеку управления базами данных GNU (GNU Database
Manager). Она используется другим пакетом, Man-DB.
• Gettext
В данном пакете находятся утилиты для интернационализации и перевода
интерфейса программ на другие языки. Они необходимы некоторым пакетам.
• Glibc
Этот пакет содержит главную библиотеку языка C. Ни одна программа в Linux не
запустится без нее.
• GMP
This package contains math libraries that provide useful functions for arbitrary
precision arithmetic. It is required to build Gcc.
• Grep
This package contains programs for searching through files. These programs are used
by most packages' build scripts.
• Groff
This package contains programs for processing and formatting text. One important
function of these programs is to format man pages.
• GRUB
This package is the Grand Unified Boot Loader. It is one of several boot loaders
available, but is the most flexible.
• Gzip
This package contains programs for compressing and decompressing files. It is
needed to decompress many packages in LFS and beyond.
• Iana-etc
This package provides data for network services and protocols. It is needed to enable
proper networking capabilities.
• Inetutils
This package contains programs for basic network administration.
• IProute2
This package contains programs for basic and advanced IPv4 and IPv6 networking.
It was chosen over the other common network tools package (net-tools) for its IPv6
capabilities.
• Kbd
This package contains key-table files, keyboard utilities for non-US keyboards, and a
number of console fonts.
• Kmod
This package contains programs needed to administer Linux kernel modules.
• Less

xiv

Linux From Scratch - Версия 7.3
This package contains a very nice text file viewer that allows scrolling up or down
when viewing a file. It is also used by Man-DB for viewing manpages.
• Libpipeline
The Libpipeline package contains a library for manipulating pipelines of subprocesses
in a flexible and convenient way. It is required by the Man-DB package.
• Libtool
This package contains the GNU generic library support script. It wraps the
complexity of using shared libraries in a consistent, portable interface. It is needed by
the test suites in other LFS packages.
• Linux Kernel
This package is the Operating System. It is the Linux in the GNU/Linux environment.
• M4
This package contains a general text macro processor useful as a build tool for other
programs.
• Make
This package contains a program for directing the building of packages. It is required
by almost every package in LFS.
• Man-DB
This package contains programs for finding and viewing man pages. It was chosen
instead of the man package due to superior internationalization capabilities. It
supplies the man program.
• Man-pages
This package contains the actual contents of the basic Linux man pages.
• MPC
This package contains functions for the arithmetic of complex numbers. It is required
by Gcc.
• MPFR
This package contains functions for multiple precision arithmetic. It is required by
Gcc.
• Ncurses
This package contains libraries for terminal-independent handling of character
screens. It is often used to provide cursor control for a menuing system. It is needed
by a number of packages in LFS.
• Patch
This package contains a program for modifying or creating files by applying a patch
file typically created by the diff program. It is needed by the build procedure for
several LFS packages.
• Perl
This package is an interpreter for the runtime language PERL. It is needed for the
installation and test suites of several LFS packages.
xv

Linux From Scratch - Версия 7.3
• Pkg-config
This package provides a program to return meta-data about an installed library or
package.
• Procps-NG
Пакет содержит программы для слежения за работой процессов. Эти программы
полезны для администрирования системы, а также используются загрузочными
скриптами LFS.
• Psmisc
Пакет предоставляет программы, выводящие различную информацию о
запущенных процессах. Они полезны для системного администрирования.
• Readline
Пакет содержит набор библиотек, предоставляющих возможность
редактирования командной строки и хранения истории команд. Он используется
Bash.
• Sed
Этот пакет позволяет редактировать текст без открытия его в текстовом
редакторе. Он также требуется большинством конфигурационных скриптов.
• Shadow
Пакет содержит программы для безопасного управления паролями.
• Sysklogd
Этот пакет содержит программы для журналирования системных сообщений,
подобных тем, что ядро или демоны посылают в случае необычного события.
• Sysvinit
В этом пакете содержится программа init, являющаяся родителем всех
остальных процессов в системе Linux.
• Tar
Этот пакет предоставляет возможность создания архивов и их распаковки.
Необходим для извлечения абсолютно всех пакетов, используемых в LFS.
• Tcl
Пакет содержит Tool Command Language, используемый при выполнении
тестирования во многих пакетах LFS. Он устанавливается только как временный
инструментарий.
• Texinfo
Этот пакет содержит программы для чтения, создания и преобразования infoстраниц. Он используется при установке многих пакетов LFS.
• Udev
Пакет содержит программы для динамической генерации узлов устройств. Udev
является альтернативой созданию нескольких тысяч статических устройств в
директории /dev.
• Util-linux

xvi

Linux From Scratch - Версия 7.3
Пакет включает в себя разнообразные утилиты. Среди них программы для
управления файловыми системами, разделами, консолью и сообщениями.
• Vim
Этот пакет содержит редактор. Он был выбран из-за совместимости с
класическим редактором vi и огромного числа мощных возможностей. Выбор
редактора - очень субъективный момент, поэтому Вы, по желанию, пожете
заменить Vim любым другим текстовым редактором.
• XZ Utils
Данный пакет включает в себя программы для сжатия и распаковки файлов. На
данный момент, они предоставляют наилучшее вообще возможное сжатие, и
необходимы для распаковки пакетов формата XZ или LZMA.
• Zlib
Пакет содержит библиотеку процедур компрессии/декомпрессии, используемую
некоторыми программами.

Необходимые знания
Сборка системы LFS - непростая задача. Она требует некоторого умения
администрировать Unix-системы, чтобы решать возникающие проблемы и правильно
выполнять написанные команды. Как абсолютный минимум, Вы уже должны
уметь использовать командную строку (оболочку): копировать или перемещать
файлы и папки, просматривать содержимое папок и файлов, менять текущую
рабочую директорию. Также Вы должны знать, как устанавливать и использовать
программное обеспечение в Linux.
Поскольку книга LFS предполагает как минимум наличия этих базовых умений,
различные форумы поддержки LFS не предоставят Вам помощь по таким вопросам.
Вы будете расстроены, что Ваши просьбы помочь с основными навыками либо
останутся вообще без ответа, либо ответы будут содержать лишь ссылки на эту
страницу.
Перед сборкой LFS мы рекомендуем прочитать следующие HOWTO:
• Software-Building-HOWTO http://www.tldp.org/HOWTO/Software-Building-HOWTO.
html
Это замечательное руководство по сборке и установке «основных» пакетов
программного обеспечения Unix под Linux. Хотя оно и было написано достаточно
давно, оно до сих пор позволит получить основные навыки, необходимые для
сборки и установки программного обеспечения.
• The Linux Users' Guide http://tldp.org/pub/Linux/docs/ldp-archived/users-guide/
Это руководство рассказывает об использовании различного программного
обеспечения Linux. Оно также очень старое, но своей актуальности не утратило.
• The Essential Pre-Reading Hint http://www.linuxfromscratch.org/hints/downloads/
files/essential_prereading.txt
Это LFS Hint, написанный специально для новичков в Linux. Он включает в себя
список ссылок на великолепные источники информации по большому кругу
различных тем. Любой, кто хочет установить LFS, должен понимать большую
часть из них.
xvii

Linux From Scratch - Версия 7.3

Требования к хост-системе
Данный список содержит имена и минимальные версии пакетов, которые
необходимо установить на Вашей хост-системе. Это не должно быть проблемой для
последних дистрибутивов Linux. Не забывайте, что многие дистрибутивы помещают
заголовочные файлы в отдельные пакеты, часто в виде «-devel» или
«-dev». Вам необходимо установить и их, если Ваш дистрибутив их
предоставляет.
Более старые версии перечисленных пакетов могут работать, но корректность их
работы не проверялась.
• Bash-3.2 (/bin/sh должен быть символической ссылкой на bash)
• Binutils-2.17 (Версии новее, чем 2.23.1 не рекомендуются, поскольку они не
были протестированы)
• Bison-2.3 (/usr/bin/yacc должен быть ссылкой на bison или маленьким скриптом,
запускающим bison)
• Bzip2-1.0.4
• Coreutils-6.9
• Diffutils-2.8.1
• Findutils-4.2.31
• Gawk-3.1.5 (/usr/bin/awk должен быть ссылкой на gawk)
• Gcc-4.1.2 (Версии новее, чем 4.7.2 не рекомендуются, поскольку они не были
протестированы)
• Glibc-2.5.1 (Версии новее, чем 2.17 не рекомендуются, поскольку они не были
протестированы)
• Grep-2.5.1a
• Gzip-1.3.12
• Linux Kernel-2.6.25 (откомпилированное GCC-4.1.2 или более новым)
Причина, по которой необходимо ограничение на версию ядра кроется в том,
что мы указываем эту версию при сборке glibc в Главе 6, как рекомендуется
разработчиками. Также это необходимо для udev.










Если ядро хост-системы не 2.6.25, или если оно было собрано не компилятором
GCC-4.1.2 (или более поздним), Вам необходимо заменить ядро на
соответствующее этим требованиям. Существуют два способа сделать это. Вопервых, проверьте, не предоставляет ли Ваш Linux дистрибутив ядро 2.6.25
или более новое. Если это так, Вам следует установить его. Если же Ваш
дистрибутив не предоставляет приемлемое ядро, или Вы не хотите устанавливать
его, Вы можете собрать ядро самостоятельно. Инструкции по сборке ядра и
конфигирированию загрузчика (предполагая, что хост-система использует
GRUB), расположены здесь: Chapter 8.
M4-1.4.10
Make-3.81
Patch-2.5.4
Perl-5.8.8
Sed-4.1.5
Tar-1.18
Texinfo-4.9
Xz-5.0.0
xviii

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

xix

Linux From Scratch - Версия 7.3
Чтобы проверить, установлено ли на Вашей системе все необходимое и можно ли в
ней компилировать программы, запустите следующий скрипт:
cat > version-check.sh &1 < /dev/null | head -n1 | cut -d" " -f1,6echo -n "Coreutils: "; chown --version | head -n1 | cut -d")" -f2
diff --version | head -n1
find --version | head -n1
gawk --version | head -n1
if [ -e /usr/bin/awk ];
then echo "/usr/bin/awk -> `readlink -f /usr/bin/awk`";
else echo "awk not found"; fi
gcc --version | head -n1
ldd --version | head -n1 | cut -d" " -f2- # glibc version
grep --version | head -n1
gzip --version | head -n1
cat /proc/version
m4 --version | head -n1
make --version | head -n1
patch --version | head -n1
echo Perl `perl -V:version`
sed --version | head -n1
tar --version | head -n1
echo "Texinfo: `makeinfo --version | head -n1`"
xz --version | head -n1
echo 'main(){}' > dummy.c && gcc -o dummy dummy.c
if [ -x dummy ]
then echo "gcc compilation OK";
else echo "gcc compilation failed"; fi
rm -f dummy.c dummy
EOF
bash version-check.sh

xx

Linux From Scratch - Версия 7.3

Соглашения, используемые в книге
Чтобы Вам легче было следовать инструкциям, здесь приводится разъяснение
некоторых обозначений, используемых в книге Linux From Scratch.
./configure --prefix=/usr
Текст такого типа необходимо вводить так, как он напечатан, если явно не сказано
иное. Также он будет использован в секциях объяснения, для подчеркивания
вызываемой команды.
В некоторых случаях одна логическая строка разделена на две или более физические
строки с помощью обратного слеша в конце строки.
CC="gcc -B/usr/bin/" ../binutils-2.18/configure \
--prefix=/tools --disable-nls --disable-werror
Заметьте, что за обратным слешем сразу же идет перевод строки. Другие символы
пробелов или табуляций приведут к неверным результатам.
install-info: unknown option '--dir-file=/mnt/lfs/usr/info/dir'
Текст такого типа (моноширинный текст) показывает вывод с экрана, обычно как
результат выполненной команды. Этот формат также используется для выделения
имен файлов, например /etc/ld.so.conf.
Курсив
Этот тип текста используется в книге для нескольких целей, в основном для
выделения важных моментов и понятий.
http://www.linuxfromscratch.org/
Такой формат используется для гиперссылок, включающих ресурсы сообщества LFS,
HOWTO, зеркала и другие веб-сайты.
cat > $LFS/etc/group &1 | grep succeeded will show all the files successfully
opened during the linking.
The next package installed is GCC. An example of what can be seen during its run of
configure is:
checking what assembler to use... /tools/i686-lfs-linux-gnu/bin/as
checking what linker to use... /tools/i686-lfs-linux-gnu/bin/ld
This is important for the reasons mentioned above. It also demonstrates that GCC's
configure script does not search the PATH directories to find which tools to use. However,
during the actual operation of gcc itself, the same search paths are not necessarily used.
To find out which standard linker gcc will use, run: gcc -print-prog-name=ld.
Detailed information can be obtained from gcc by passing it the -v command line option
while compiling a dummy program. For example, gcc -v dummy.c will show detailed
information about the preprocessor, compilation, and assembly stages, including gcc's
included search paths and their order.
Next installed are sanitized Linux API headers. These allow the standard C library (Glibc)
to interface with features that the Linux kernel will provide.
The next package installed is Glibc. The most important considerations for building Glibc
are the compiler, binary tools, and kernel headers. The compiler is generally not an issue
since Glibc will always use the compiler relating to the --host parameter passed to its
configure script, e.g. in our case, i686-lfs-linux-gnu-gcc. The binary tools and kernel
headers can be a bit more complicated. Therefore, take no risks and use the available
configure switches to enforce the correct selections. After the run of configure, check the
contents of the config.make file in the glibc-build directory for all important details.
34

Linux From Scratch - Версия 7.3
Note the use of CC="i686-lfs-gnu-gcc" to control which binary tools are used and the
use of the -nostdinc and -isystem flags to control the compiler's include search path.
These items highlight an important aspect of the Glibc package—it is very self-sufficient
in terms of its build machinery and generally does not rely on toolchain defaults.
During the second pass of Binutils, we are able to utilize the --with-lib-path configure
switch to control ld's library search path.
For the second pass of GCC, its sources also need to be modified to tell GCC to use the new
dynamic linker. Failure to do so will result in the GCC programs themselves having the
name of the dynamic linker from the host system's /lib directory embedded into them,
which would defeat the goal of getting away from the host. From this point onwards, the
core toolchain is self-contained and self-hosted. The remainder of the Глава 5 packages
all build against the new Glibc in /tools.
Upon entering the chroot environment in Глава 6, the first major package to be installed
is Glibc, due to its self-sufficient nature mentioned above. Once this Glibc is installed into
/usr, we will perform a quick changeover of the toolchain defaults, and then proceed in
building the rest of the target LFS system.

5.3. General Compilation Instructions
When building packages there are several assumptions made within the instructions:
• Several of the packages are patched before compilation, but only when the patch is
needed to circumvent a problem. A patch is often needed in both this and the next
chapter, but sometimes in only one or the other. Therefore, do not be concerned if
instructions for a downloaded patch seem to be missing. Warning messages about
offset or fuzz may also be encountered when applying a patch. Do not worry about
these warnings, as the patch was still successfully applied.
• During the compilation of most packages, there will be several warnings that scroll
by on the screen. These are normal and can safely be ignored. These warnings are as
they appear—warnings about deprecated, but not invalid, use of the C or C++ syntax.
C standards change fairly often, and some packages still use the older standard. This
is not a problem, but does prompt the warning.
• Check one last time that the LFS environment variable is set up properly:
echo $LFS
Make sure the output shows the path to the LFS partition's mount point, which is /
mnt/lfs, using our example.
• Finally, two last important items must be emphasized:

Важно
The build instructions assume that the HostSystem Requirements, including
symbolic links, have been set properly:
• bash is the shell in use.

• sh is a symbolic link to bash.

• /usr/bin/awk is a symbolic link to gawk.

• /usr/bin/yacc is a symbolic link to bison or a small script that executes
bison.
35

Linux From Scratch - Версия 7.3

Важно
To re-emphasize the build process:
1. Place all the sources and patches in a directory that will be accessible from
the chroot environment such as /mnt/lfs/sources/. Do not put sources in
/mnt/lfs/tools/.
2. Change to the sources directory.
3. For each package:
a. Using the tar program, extract the package to be built. In Chapter 5,
ensure you are the lfs user when extracting the package.
b. Change to the directory created when the package was extracted.
c. Follow the book's instructions for building the package.
d. Change back to the sources directory.
e. Delete the extracted source directory and any -build
directories that were created in the build process unless instructed
otherwise.

36

Linux From Scratch - Версия 7.3

5.4. Binutils-2.23.1 - Шаг 1
The Binutils package contains a linker, an assembler, and other tools for handling object
files.
Приблизительное
время сборки:
Требует
свободного места
на диске:

1 SBU
391 MB

5.4.1. Installation of Cross Binutils
Замечание
Go back and re-read the notes in the previous section. Understanding the notes
labeled important will save you a lot of problems later.
It is important that Binutils be the first package compiled because both Glibc and GCC
perform various tests on the available linker and assembler to determine which of their
own features to enable.
The Binutils documentation recommends building Binutils outside of the source directory
in a dedicated build directory:
mkdir -v ../binutils-build
cd ../binutils-build

Замечание
In order for the SBU values listed in the rest of the book to be of any use, measure
the time it takes to build this package from the configuration, up to and including
the first install. To achieve this easily, wrap the commands in a time command
like this: time { ./configure ... && ... && make install; }.

Замечание
The approximate build SBU values and required disk space in Chapter 5 does not
include test suite data.
Now prepare Binutils for compilation:
../binutils-2.23.1/configure
--prefix=/tools
--with-sysroot=$LFS
--with-lib-path=/tools/lib
--target=$LFS_TGT
--disable-nls
--disable-werror

\
\
\
\
\

\

The meaning of the configure options:

--prefix=/tools
This tells the configure script to prepare to install the Binutils programs in the /tools
directory.
37

Linux From Scratch - Версия 7.3
--with-sysroot=$LFS
For cross compilation, this tells the build system to look in $LFS for the target system
libraries as needed.
--with-lib-path=/tools/lib
This specifies which library path the linker should be configured to use.
--target=$LFS_TGT
Because the machine description in the LFS_TGT variable is slightly different than the
value returned by the config.guess script, this switch will tell the configure script
to adjust Binutil's build system for building a cross linker.
--disable-nls
This disables internationalization as i18n is not needed for the temporary tools.
--disable-werror
This prevents the build from stopping in the event that there are warnings from the
host's compiler.
Continue with compiling the package:
make
Compilation is now complete. Ordinarily we would now run the test suite, but at this early
stage the test suite framework (Tcl, Expect, and DejaGNU) is not yet in place. The benefits
of running the tests at this point are minimal since the programs from this first pass will
soon be replaced by those from the second.
If building on x86_64, create a symlink to ensure the sanity of the toolchain:
case $(uname -m) in
x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;;
esac
Install the package:
make install
Подробная информация об этом пакете расположена в Раздел 6.13.2, «Содержимое
Binutils.»

38

Linux From Scratch - Версия 7.3

5.5. GCC-4.7.2 - Шаг 1
The GCC package contains the GNU compiler collection, which includes все же запустить
тестирование C and C++ compilers.
Приблизительное
время сборки:
Требует
свободного места
на диске:

5.5 SBU
1.4 GB

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

Замечание
There are frequent misunderstandings about this chapter. The procedures are the
same as every other chapter as explained earlier (Package build instructions).
First extract the gcc tarball from the sources directory and then change to the
directory created. Only then should you proceed with the instructions below.
tar -Jxf ../mpfr-3.1.1.tar.xz
mv -v mpfr-3.1.1 mpfr
tar -Jxf ../gmp-5.1.1.tar.xz
mv -v gmp-5.1.1 gmp
tar -zxf ../mpc-1.0.1.tar.gz
mv -v mpc-1.0.1 mpc
The following command will change the location of GCC's default dynamic linker to use
the one installed in /tools. It also removes /usr/include from GCC's include search
path. Issue:
for file in \
$(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
do
cp -uv $file{,.orig}
sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
-e 's@/usr@/tools@g' $file.orig > $file
echo '
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
touch $file.orig
done
In case the above seems hard to follow, let's break it down a bit. First we find all the files
under the gcc/config directory that are named either linux.h, linux64.h or sysv4.h.
For each file found, we copy it to a file of the same name but with an added suffix of
39

Linux From Scratch - Версия 7.3
«.orig». Then the first sed expression prepends «/tools» to every instance of «/lib/ld», «/
lib64/ld» or «/lib32/ld», while the second one replaces hard-coded instances of «/usr».
Next, we add our define statements which alter the default startfile prefix to the end
of the file. Note that the trailing «/» in «/tools/lib/» is required. Finally, we use touch
to update the timestamp on the copied files. When used in conjunction with cp -u, this
prevents unexpected changes to the original files in case the commands are inadvertently
run twice.
GCC doesn't detect stack protection correctly, which causes problems for the build of
Glibc-2.17, so fix that by issuing the following command:
sed -i '/k prot/agcc_cv_libc_provides_ssp=yes' gcc/configure
Do not build the .info files. They are not needed here and are broken with the current
version of makeinfo.
sed -i 's/BUILD_INFO=info/BUILD_INFO=/' gcc/configure
The GCC documentation recommends building GCC outside of the source directory in a
dedicated build directory:
mkdir -v ../gcc-build
cd ../gcc-build
Prepare GCC for compilation:
../gcc-4.7.2/configure
\
--target=$LFS_TGT
\
--prefix=/tools
\
--with-sysroot=$LFS
\
--with-newlib
\
--without-headers
\
--with-local-prefix=/tools \
--with-native-system-header-dir=/tools/include \
--disable-nls
\
--disable-shared
\
--disable-multilib
\
--disable-decimal-float
\
--disable-threads
\
--disable-libmudflap
\
--disable-libssp
\
--disable-libgomp
\
--disable-libquadmath
\
--enable-languages=c
\
--with-mpfr-include=$(pwd)/../gcc-4.7.2/mpfr/src \
--with-mpfr-lib=$(pwd)/mpfr/src/.libs
The meaning of the configure options:

--with-newlib
Since a working C library is not yet available, this ensures that the inhibit_libc
constant is defined when building libgcc. This prevents the compiling of any code that
requires libc support.
40

Linux From Scratch - Версия 7.3
--without-headers
When creating a complete cross-compiler, GCC requires standard headers compatible
with the target system. For our purposes these headers will not be needed. This switch
prevents GCC from looking for them.
--with-local-prefix=/tools
The local prefix is the location in the system that GCC will search for locally installed
include files. The default is /usr/local. Setting this to /tools helps keep the host
location of /usr/local out of this GCC's search path.
--with-native-system-header-dir=/tools/include
By default GCC searches /usr/include for system headers. In conjunction with the
sysroot switch, this would translate normally to $LFS/usr/include. However the
headers that will be installed in the next two sections will go to $LFS/tools/include.
This switch ensures that gcc will find them correctly. In the second pass of GCC, this
same switch will ensure that no headers from the host system are found.
--disable-shared
This switch forces GCC to link its internal libraries statically. We do this to avoid
possible issues with the host system.
--disable-decimal-float,
--disable-threads,
--disable-libmudflap,
-disable-libssp, --disable-libgomp, --disable-libquadmath
These switches disable support for the decimal floating point extension, threading,
libmudflap, libssp and libgomp and libquadmath respectively. These features will fail
to compile when building a cross-compiler and are not necessary for the task of crosscompiling the temporary libc.
--disable-multilib
On x86_64, LFS does not yet support a multilib configuration. This switch is harmless
for x86.
--enable-languages=c
This option ensures that only the C compiler is built. This is the only language needed
now.
Compile GCC by running:
make
Compilation is now complete. At this point, the test suite would normally be run, but, as
mentioned before, the test suite framework is not in place yet. The benefits of running
the tests at this point are minimal since the programs from this first pass will soon be
replaced.
Install the package:
make install
Using --disable-shared means that the libgcc_eh.a file isn't created and installed. The
Glibc package depends on this library as it uses -lgcc_eh within its build system. This
dependency can be satisfied by creating a symlink to libgcc.a, since that file will end up
containing the objects normally contained in libgcc_eh.a:
ln -sv libgcc.a `$LFS_TGT-gcc -print-libgcc-file-name | sed 's/libgcc/&_eh/'`
Подробная информация об этом пакете расположена в Раздел 6.17.2, «Содержимое
GCC.»
41

Linux From Scratch - Версия 7.3

5.6. Linux-3.8.1 API Headers
The Linux API Headers (in linux-3.8.1.tar.xz) expose the kernel's API for use by Glibc.
Приблизительное
время сборки:
Требует
свободного места
на диске:

0.1 SBU
511 MB

5.6.1. Installation of Linux API Headers
The Linux kernel needs to expose an Application Programming Interface (API) for the
system's C library (Glibc in LFS) to use. This is done by way of sanitizing various C header
files that are shipped in the Linux kernel source tarball.
Make sure there are no stale files and dependencies lying around from previous activity:
make mrproper
Now test and extract the user-visible kernel headers from the source. They are placed in
an intermediate local directory and copied to the needed location because the extraction
process removes any existing files in the target directory.
make headers_check
make INSTALL_HDR_PATH=dest headers_install
cp -rv dest/include/* /tools/include
Подробная информация об этом пакете расположена в Раздел 6.7.2, «Содержимое
Linux API Headers.»

42

Linux From Scratch - Версия 7.3

5.7. Glibc-2.17
The Glibc package contains the main C library. This library provides все же запустить
тестирование basic routines for allocating memory, searching directories, opening and
closing files, reading and writing files, string handling, pattern matching, arithmetic, and
so on.
Приблизительное
время сборки:
Требует
свободного места
на диске:

5.4 SBU
554 MB

5.7.1. Installation of Glibc
In some cases, particularly LFS 7.1, the rpc headers were not installed properly. Test to
see if they are installed in the host system and install if they are not:
if [ ! -r /usr/include/rpc/types.h ]; then
su -c 'mkdir -p /usr/include/rpc'
su -c 'cp -v sunrpc/rpc/*.h /usr/include/rpc'
fi
The Glibc documentation recommends building Glibc outside of the source directory in
a dedicated build directory:
mkdir -v ../glibc-build
cd ../glibc-build
Next, prepare Glibc for compilation:
../glibc-2.17/configure
\
--prefix=/tools
\
--host=$LFS_TGT
\
--build=$(../glibc-2.17/scripts/config.guess) \
--disable-profile
\
--enable-kernel=2.6.25
\
--with-headers=/tools/include
\
libc_cv_forced_unwind=yes
\
libc_cv_ctors_header=yes
\
libc_cv_c_cleanup=yes
The meaning of the configure options:

--host=$LFS_TGT, --build=$(../glibc-2.17/scripts/config.guess)
The combined effect of these switches is that Glibc's build system configures itself to
cross-compile, using the cross-linker and cross-compiler in /tools.
--disable-profile
This builds the libraries without profiling information. Omit this option if profiling on
the temporary tools is necessary.
--enable-kernel=2.6.25
This tells Glibc to compile the library with support for 2.6.25 and later Linux kernels.
Workarounds for older kernels are not enabled.
43

Linux From Scratch - Версия 7.3
--with-headers=/tools/include
This tells Glibc to compile itself against the headers recently installed to the tools
directory, so that it knows exactly what features the kernel has and can optimize itself
accordingly.
libc_cv_forced_unwind=yes
The linker installed during Раздел 5.4, «Binutils-2.23.1 - Шаг 1» was cross-compiled
and as such cannot be used until Glibc has been installed. This means that the
configure test for force-unwind support will fail, as it relies on a working linker.
The libc_cv_forced_unwind=yes variable is passed in order to inform configure that
force-unwind support is available without it having to run the test.
libc_cv_c_cleanup=yes
Simlarly, we pass libc_cv_c_cleanup=yes through to the configure script so that the
test is skipped and C cleanup handling support is configured.
libc_cv_ctors_header=yes
Simlarly, we pass libc_cv_ctors_header=yes through to the configure script so that
the test is skipped and gcc constructor support is configured.
During this stage the following warning might appear:
configure: WARNING:
*** These auxiliary programs are missing or
*** incompatible versions: msgfmt
*** some features will be disabled.
*** Check the INSTALL file for required versions.
Отсутствующая или несовместимая утилита msgfmt обычно не приводит к
проблемам. Эта программа является частью пакета Gettext, который должен
предоставляться хост-системой.
Cкомпилируем пакет:
make
Этот пакет поставляется с набором тестов, однако, мы не cможем их запустить
сейчас, поскольку еще не установили компилятор C++.

Замечание
Для успешного выполнения тестирования также необходимо установить
данные локалей. Данные локалей предоставляют системе информацию о том,
в каком формате необходимо осуществлять ввод и вывод даты, времени и
валют. Если тестирование (как и рекомендуется) не будет запускаться в
этой главе, нет нужды устанавливать локали сейчас. Необходимые локали
будут установлены в следующей главе. Чтобы все же установить локали Glibc,
следуйте инструкциям из Раздел 6.9, «Glibc-2.17.»
Установим пакет:
make install
44

Linux From Scratch - Версия 7.3

Предостережение
At this point, it is imperative to stop and ensure that the basic functions (compiling
and linking) of the new toolchain are working as expected. To perform a sanity
check, run the following commands:
echo 'main(){}' > dummy.c
$LFS_TGT-gcc dummy.c
readelf -l a.out | grep ': /tools'
If everything is working correctly, there should be no errors, and the output of the
last command will be of the form:
[Requesting program interpreter: /tools/lib/ld-linux.so.2]
Note that /tools/lib, or /tools/lib64 for 64-bit machines appears as the prefix
of the dynamic linker.
If the output is not shown as above or there was no output at all, then something
is wrong. Investigate and retrace the steps to find out where the problem is and
correct it. This issue must be resolved before continuing on.
Once all is well, clean up the test files:
rm -v dummy.c a.out

Замечание
Building Binutils in the next section will serve as an additional check that the
toolchain has been built properly. If Binutils fails to build, it is an indication that
something has gone wrong with the previous Binutils, GCC, or Glibc installations.
Подробная информация об этом пакете расположена в Раздел 6.9.4, «Содержимое
Glibc.»

45

Linux From Scratch - Версия 7.3

5.8. Binutils-2.23.1 - Шаг 2
The Binutils package contains a linker, an assembler, and other tools for handling object
files.
Приблизительное
время сборки:
Требует
свободного места
на диске:

1.1 SBU
407 MB

5.8.1. Installation of Binutils
Create a separate build directory again:
mkdir -v ../binutils-build
cd ../binutils-build
Prepare Binutils for compilation:
CC=$LFS_TGT-gcc
\
AR=$LFS_TGT-ar
\
RANLIB=$LFS_TGT-ranlib
\
../binutils-2.23.1/configure \
--prefix=/tools
\
--disable-nls
\
--with-lib-path=/tools/lib
The meaning of the new configure options:

CC=$LFS_TGT-gcc AR=$LFS_TGT-ar RANLIB=$LFS_TGT-ranlib
Because this is really a native build of Binutils, setting these variables ensures that
the build system uses the cross-compiler and associated tools instead of the ones on
the host system.
--with-lib-path=/tools/lib
This tells the configure script to specify the library search path during the compilation
of Binutils, resulting in /tools/lib being passed to the linker. This prevents the linker
from searching through library directories on the host.
Compile the package:
make
Install the package:
make install
Now prepare the linker for the «Re-adjusting» phase in the next chapter:
make -C ld clean
make -C ld LIB_PATH=/usr/lib:/lib
cp -v ld/ld-new /tools/bin
The meaning of the make parameters:

-C ld clean
This tells the make program to remove all compiled files in the ld subdirectory.
46

Linux From Scratch - Версия 7.3
-C ld LIB_PATH=/usr/lib:/lib
This option rebuilds everything in the ld subdirectory. Specifying the LIB_PATH
Makefile variable on the command line allows us to override the default value of
the temporary tools and point it to the proper final path. The value of this variable
specifies the linker's default library search path. This preparation is used in the next
chapter.
Подробная информация об этом пакете расположена в Раздел 6.13.2, «Содержимое
Binutils.»

47

Linux From Scratch - Версия 7.3

5.9. GCC-4.7.2 - Шаг 2
The GCC package contains the GNU compiler collection, which includes все же запустить
тестирование C and C++ compilers.
Приблизительное
время сборки:
Требует
свободного места
на диске:

7.1 SBU
1.8 GB

5.9.1. Installation of GCC
Our first build of GCC has installed a couple of internal system headers. Normally one of
them, limits.h will in turn include the corresponding system limits.h header, in this
case, /tools/include/limits.h. However, at the time of the first build of gcc /tools/
include/limits.h did not exist, so the internal header that GCC installed is a partial,
self-contained file and does not include the extended features of the system header. This
was adequate for building the temporary libc, but this build of GCC now requires the
full internal header. Create a full version of the internal header using a command that is
identical to what the GCC build system does in normal circumstances:
cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
`dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h
For x86 machines, a bootstrap build of GCC uses the -fomit-frame-pointer compiler
flag. Non-bootstrap builds omit this flag by default, and the goal should be to produce
a compiler that is exactly the same as if it were bootstrapped. Apply the following sed
command to force the build to use the flag:
cp -v gcc/Makefile.in{,.tmp}
sed 's/^T_CFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in.tmp \
> gcc/Makefile.in
Once again, change the location of GCC's default dynamic linker to use the one installed
in /tools.
for file in \
$(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
do
cp -uv $file{,.orig}
sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
-e 's@/usr@/tools@g' $file.orig > $file
echo '
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
touch $file.orig
done

48

Linux From Scratch - Версия 7.3
Как и при первой сборке GCC, необходимы пакеты GMP, MPC и MPFR. Распакуем
архивы исходников и присвоим директориям требуемые имена:
tar -Jxf ../mpfr-3.1.1.tar.xz
mv -v mpfr-3.1.1 mpfr
tar -Jxf ../gmp-5.1.1.tar.xz
mv -v gmp-5.1.1 gmp
tar -zxf ../mpc-1.0.1.tar.gz
mv -v mpc-1.0.1 mpc
Again, do not build the .info files. They are not needed here and are broken with the
current version of makeinfo.
sed -i 's/BUILD_INFO=info/BUILD_INFO=/' gcc/configure
Снова создадим отдельную директорию для сборки:
mkdir -v ../gcc-build
cd ../gcc-build
Перед тем, как приступить к сборке GCC, не забудьте сбросить все переменные
окружения, переопределяющие флаги оптимизации.
Теперь подготовим GCC к компиляции:
CC=$LFS_TGT-gcc \
AR=$LFS_TGT-ar
\
RANLIB=$LFS_TGT-ranlib
\
../gcc-4.7.2/configure
\
--prefix=/tools
\
--with-local-prefix=/tools \
--with-native-system-header-dir=/tools/include \
--enable-clocale=gnu
\
--enable-shared
\
--enable-threads=posix
\
--enable-__cxa_atexit
\
--enable-languages=c,c++
\
--disable-libstdcxx-pch
\
--disable-multilib
\
--disable-bootstrap
\
--disable-libgomp
\
--with-mpfr-include=$(pwd)/../gcc-4.7.2/mpfr/src \
--with-mpfr-lib=$(pwd)/mpfr/src/.libs
The meaning of the new configure options:

--enable-clocale=gnu
This option ensures the correct locale model is selected for the C++ libraries under
all circumstances. If the configure script finds the de_DE locale installed, it will select
the correct gnu locale model. However, if the de_DE locale is not installed, there
is the risk of building Application Binary Interface (ABI)-incompatible C++ libraries
because the incorrect generic locale model may be selected.
--enable-threads=posix
This enables C++ exception handling for multi-threaded code.
49

Linux From Scratch - Версия 7.3
--enable-__cxa_atexit
This option allows use of __cxa_atexit, rather than atexit, to register C++
destructors for local statics and global objects. This option is essential for fully
standards-compliant handling of destructors. It also affects the C++ ABI, and
therefore results in C++ shared libraries and C++ programs that are interoperable
with other Linux distributions.
--enable-languages=c,c++
This option ensures that both the C and C++ compilers are built.
--disable-libstdcxx-pch
Do not build the pre-compiled header (PCH) for libstdc++. It takes up a lot of space,
and we have no use for it.
--disable-bootstrap
For native builds of GCC, the default is to do a "bootstrap" build. This does not just
compile GCC, but compiles it several times. It uses the programs compiled in a first
round to compile itself a second time, and then again a third time. The second and
third iterations are compared to make sure it can reproduce itself flawlessly. This also
implies that it was compiled correctly. However, the LFS build method should provide
a solid compiler without the need to bootstrap each time.
Compile the package:
make
Install the package:
make install
As a finishing touch, create a symlink. Many programs and scripts run cc instead of
gcc, which is used to keep programs generic and therefore usable on all kinds of UNIX
systems where the GNU C compiler is not always installed. Running cc leaves the system
administrator free to decide which C compiler to install:
ln -sv gcc /tools/bin/cc

50

Linux From Scratch - Версия 7.3

Предостережение
At this point, it is imperative to stop and ensure that the basic functions (compiling
and linking) of the new toolchain are working as expected. To perform a sanity
check, run the following commands:
echo 'main(){}' > dummy.c
cc dummy.c
readelf -l a.out | grep ': /tools'
If everything is working correctly, there should be no errors, and the output of the
last command will be of the form:
[Requesting program interpreter: /tools/lib/ld-linux.so.2]
Note that /tools/lib, or /tools/lib64 for 64-bit machines appears as the prefix
of the dynamic linker.
If the output is not shown as above or there was no output at all, then something
is wrong. Investigate and retrace the steps to find out where the problem is and
correct it. This issue must be resolved before continuing on. First, perform the
sanity check again, using gcc instead of cc. If this works, then the /tools/bin/
cc symlink is missing. Install the symlink as per above. Next, ensure that the
PATH is correct. This can be checked by running echo $PATH and verifying that
/tools/bin is at the head of the list. If the PATH is wrong it could mean that you
are not logged in as user lfs or that something went wrong back in Раздел 4.4,
«Установка рабочего окружения.»
Once all is well, clean up the test files:
rm -v dummy.c a.out
Подробная информация об этом пакете расположена в Раздел 6.17.2, «Содержимое
GCC.»

51

Linux From Scratch - Версия 7.3

5.10. Tcl-8.6.0
Пакет Tcl содержит Tool Command Language, управляющий язык инструментов.
Приблизительное
время сборки:
Требует
свободного места
на диске:

0.4 SBU
33 MB

5.10.1. Installation of Tcl
This package and the next three (Expect, DejaGNU, and Check) are installed to support
running the test suites for GCC and Binutils and other packages. Installing four packages
for testing purposes may seem excessive, but it is very reassuring, if not essential, to
know that the most important tools are working properly. Even if the test suites are not
run in this chapter (they are not mandatory), these packages are required to run the test
suites in Глава 6.
Prepare Tcl for compilation:
cd unix
./configure --prefix=/tools
Build the package:
make
Compilation is now complete. As discussed earlier, running the test suite is not mandatory
for the temporary tools here in this chapter. To run the Tcl test suite anyway, issue the
following command:
TZ=UTC make test
The Tcl test suite may experience failures under certain host conditions that are not fully
understood. Therefore, test suite failures here are not surprising, and are not considered
critical. The TZ=UTC parameter sets the time zone to Coordinated Universal Time (UTC),
also known as Greenwich Mean Time (GMT), but only for the duration of the test suite run.
This ensures that the clock tests are exercised correctly. Details on the TZ environment
variable are provided in Глава 7.
Install the package:
make install
Make the installed library writable so debugging symbols can be removed later:
chmod -v u+w /tools/lib/libtcl8.6.so
Install Tcl's headers. The next package, Expect, requires them to build.
make install-private-headers
Now make a necessary symbolic link:
ln -sv tclsh8.6 /tools/bin/tclsh
52

Linux From Scratch - Версия 7.3

5.10.2. Contents of Tcl
Installed
programs:
Installed library:

tclsh (link to tclsh8.6) and tclsh8.6
libtcl8.6.so, libtclstub8.6.a

Short Descriptions
tclsh8.6

The Tcl command shell

tclsh

A link to tclsh8.6

libtcl8.6.so

The Tcl library

libtclstub8.6.a The Tcl Stub library

53

Linux From Scratch - Версия 7.3

5.11. Expect-5.45
Пакет Expect содержит программу для добавления диалогов в интерактивные
программы.
Приблизительное
время сборки:
Требует
свободного места
на диске:

0.1 SBU
4.4 MB

5.11.1. Установка Expect
Сначала заставим скрипт configure использовать /bin/stty вместо /usr/local/bin/
stty, который он может найти на хост-системе. Это гарантирует, что наши утилиты
тестирования будут работать до окончания построения финальной системы:
cp -v configure{,.orig}
sed 's:/usr/local/bin:/bin:' configure.orig > configure
Теперь подготовим Expect к компиляции:
./configure --prefix=/tools --with-tcl=/tools/lib \
--with-tclinclude=/tools/include
Значение опций configure:

--with-tcl=/tools/lib
Это указывает скрипту configure искать Tcl в директории наших временных
инструментов; в противном случае он может подхватить установку Tcl хостсистемы.
--with-tclinclude=/tools/include
Говорит Expect, где следует искать заголовочные файлы Tcl.
Скомпилируем пакет:
make
Компиляция завершена. Как говорилось ранее, необязательно выполнять тесты для
временных инструментов в этой главе. Чтобы все же запустить тестирование Expect,
выполните следующую команду:
make test
Тестирование Expect может закончиться неудачно из-за некоторых условий хостсистемы, которые мы не можем проконтролировать. Поэтому ошибки при проверке
не являются сюрпризом, и не следует считать их критичными.
Установим пакет:
make SCRIPTS="" install
Значение параметров make:

SCRIPTS=""
Это предотвращает установку некоторых скриптов Expect, которые не нужны
нам.
54

Linux From Scratch - Версия 7.3

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

expect
libexpect-5.45.a

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

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

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

55

Linux From Scratch - Версия 7.3

5.12. DejaGNU-1.5
Пакет DejaGNU содержит утилиты для тестирования других программ.
Приблизительное
время сборки:
Требует
свободного места
на диске:

менее 0.1 SBU
4.1 MB

5.12.1. Установка DejaGNU
Подготовим DejaGNU для компиляции:
./configure --prefix=/tools
Соберем и установим пакет:
make install
Чтобы проверить результат, выполните:
make check

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

runtest

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

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

56

Linux From Scratch - Версия 7.3

5.13. Check-0.9.9
Check – система модульного тестирования для C.
Приблизительное
время сборки:
Требует
свободного места
на диске:

0.1 SBU
6.9 MB

5.13.1. Installation of Check
Prepare Check for compilation:
./configure --prefix=/tools
Build the package:
make
Compilation is now complete. As discussed earlier, running the test suite is not mandatory
for the temporary tools here in this chapter. To run the Check test suite anyway, issue
the following command:
make check
Note that the Check test suite may take a relatively long (up to 4 SBU) time.
Install the package:
make install

5.13.2. Contents of Check
Installed program:
Installed library:

checkmk
libcheck.{a,so}

Short Descriptions
checkmk

Awk script for generating C unit tests for use with the Check unit
testing framework

libcheck.
{a,so}

Contains functions that allow Check to be called from a test program

57

Linux From Scratch - Версия 7.3

5.14. Ncurses-5.9
The Ncurses package contains libraries for terminal-independent handling of character
screens.
Приблизительное
время сборки:
Требует
свободного места
на диске:

0.5 SBU
35 MB

5.14.1. Установка Ncurses
Подготовим Ncurses к компиляции:
./configure --prefix=/tools --with-shared \
--without-debug --without-ada --enable-overwrite
Значение ключей configure:

--without-ada
Запрещает Ncurses собирать поддержку для компилятора Ada, который может
присутствовать на хост-системе, но не будет доступен после того, как мы войдем
в окружение chroot.
--enable-overwrite
Это указывает Ncurses установить заголовочные файлы в /tools/include вместо
/tools/include/ncurses, чтобы другие пакеты могли успешно найти их.
Cкомпилируем пакет:
make
Этот пакет имеет набор тестов, но они могут быть запущены только после его
установки. Тесты располагаются в директории test/. Более подробная информация
находится в файле README в этой же директории.
Установим пакет:
make install
Подробная информация об этом пакете расположена в Раздел 6.21.2, «Содержимое
Ncurses.»

58

Linux From Scratch - Версия 7.3

5.15. Bash-4.2
The Bash package contains the Bourne-Again SHell.
Приблизительное
время сборки:
Требует
свободного места
на диске:

0.4 SBU
48 MB

5.15.1. Установка Bash
Сначала применим следующий патч, исправляющий разнообразные ошибки,
выявленные с момента релиза:
patch -Np1 -i ../bash-4.2-fixes-11.patch
Подготовим Bash к компиляции:
./configure --prefix=/tools --without-bash-malloc
Значение опций configure:

--without-bash-malloc
Эта опция отключает использование встроенной функции выделения памяти
Bash (malloc), которая часто вызывает ошибки сегментирования. При
отключении этой опции Bash будет использовать функцию malloc из Glibc,
которая гораздо более надежна.
Cкомпилируем пакет:
make
Компиляция завершена. Как говорилось ранее, необязательно выполнять тесты для
временных инструментов в этой главе. Чтобы все же запустить тестирование Bash,
выполните следующую команду:
make tests
Установим пакет:
make install
Сделаем ссылку для программ, которые используют sh как оболочку:
ln -sv bash /tools/bin/sh
Подробная информация об этом пакете расположена в Раздел 6.33.2, «Содержимое
Bash.»

59

Linux From Scratch - Версия 7.3

5.16. Bzip2-1.0.6
The Bzip2 package contains programs for compressing and decompressing files.
Compressing text files with bzip2 yields a much better compression percentage than with
the traditional gzip.
Приблизительное
время сборки:
Требует
свободного места
на диске:

менее 0.1 SBU
5.7 MB

5.16.1. Установка Bzip2
Пакет Bzip2 не содержит скрипта configure. Скомпилируем его:
make
Установим пакет:
make PREFIX=/tools install
Подробная информация об этом пакете расположена в Раздел 6.19.2, «Содержимое
Bzip2.»

60

Linux From Scratch - Версия 7.3

5.17. Coreutils-8.21
The Coreutils package contains utilities for showing and setting the basic system
characteristics.
Приблизительное
время сборки:
Требует
свободного места
на диске:

0.8 SBU
133 MB

5.17.1. Installation of Coreutils
Prepare Coreutils for compilation:
./configure --prefix=/tools --enable-install-program=hostname
The meaning of the configure options:

--enable-install-program=hostname
This enables the hostname binary to be built and installed – it is disabled by default
but is required by the Perl test suite.
Compile the package:
make
Compilation is now complete. As discussed earlier, running the test suite is not mandatory
for the temporary tools here in this chapter. To run the Coreutils test suite anyway, issue
the following command:
make RUN_EXPENSIVE_TESTS=yes check
The RUN_EXPENSIVE_TESTS=yes parameter tells the test suite to run several additional
tests that are considered relatively expensive (in terms of CPU power and memory usage)
on some platforms, but generally are not a problem on Linux.
Install the package:
make install
Подробная информация об этом пакете расположена в Раздел 6.27.2, «Содержимое
Coreutils.»

61

Linux From Scratch - Версия 7.3

5.18. Diffutils-3.2
The Diffutils package contains programs that show the differences between files or
directories.
Приблизительное
время сборки:
Требует
свободного места
на диске:

0.2 SBU
8.5 MB

5.18.1. Installation of Diffutils
Fix an incompatibility between this package and Glibc-2.17:
sed -i -e '/gets is a/d' lib/stdio.in.h
Prepare Diffutils for compilation:
./configure --prefix=/tools
Compile the package:
make
Compilation is now complete. As discussed earlier, running the test suite is not mandatory
for the temporary tools here in this chapter. To run the Diffutils test suite anyway, issue
the following command:
make check
Install the package:
make install
Подробная информация об этом пакете расположена в Раздел 6.40.2, «Содержимое
Diffutils.»

62

Linux From Scratch - Версия 7.3

5.19. File-5.13
The File package contains a utility for determining the type of a given file or files.
Приблизительное
время сборки:
Требует
свободного места
на диске:

0.1 SBU
12.4 MB

5.19.1. Установка File
Подготовим File к компиляции:
./configure --prefix=/tools
Cкомпилируем пакет:
make
Компиляция завершена. Как говорилось ранее, необязательно выполнять тесты для
временных инструментов в этой главе. Чтобы все же запустить тестирование File,
выполните следующую команду:
make check
Установим пакет:
make install
Подробная информация об этом пакете расположена в Раздел 6.12.2, «Содержимое
File.»

63

Linux From Scratch - Версия 7.3

5.20. Findutils-4.4.2
The Findutils package contains programs to find files. These programs are provided to
recursively search through a directory tree and to create, maintain, and search a database
(often faster than the recursive find, but unreliable if the database has not been recently
updated).
Приблизительное
время сборки:
Требует
свободного места
на диске:

0.2 SBU
27 MB

5.20.1. Установка Findutils
Подготовим Findutils к компиляции:
./configure --prefix=/tools
Компилируем пакет:
make
Компиляция завершена. Как говорилось ранее, необязательно выполнять тесты
для временных инструментов в этой главе. Чтобы все же запустить тестирование
Findutils, выполните следующую команду:
make check
Установим пакет:
make install
Подробная информация об этом пакете расположена в Раздел 6.42.2, «Содержимое
Findutils.»

64

Linux From Scratch - Версия 7.3

5.21. Gawk-4.0.2
The Gawk package contains programs for manipulating text files.
Приблизительное
время сборки:
Требует
свободного места
на диске:

0.2 SBU
30 MB

5.21.1. Установка Gawk
Подготовим Gawk к компиляции:
./configure --prefix=/tools
Скомпилируем пакет:
make
Компиляция завершена. Как говорилось ранее, необязательно выполнять тесты для
временных инструментов в этой главе. Чтобы все же запустить тестирование Gawk,
выполните следующую команду:
make check
Установим пакет:
make install
Подробная информация об этом пакете расположена в Раздел 6.41.2, «Содержимое
Gawk.»

65

Linux From Scratch - Версия 7.3

5.22. Gettext-0.18.2
The Gettext package contains utilities for internationalization and localization. These
allow programs to be compiled with NLS (Native Language Support), enabling them to
output messages in the user's native language.
Приблизительное
время сборки:
Требует
свободного места
на диске:

0.6 SBU
101 MB

5.22.1. Installation of Gettext
For our temporary set of tools, we only need to build and install one binary from Gettext.
Prepare Gettext for compilation:
cd gettext-tools
EMACS="no" ./configure --prefix=/tools --disable-shared
The meaning of the configure option:

EMACS="no"
This prevents the configure script from determining where to install Emacs Lisp files
as the test is known to hang on some hosts.
--disable-shared
We do not need to install any of the shared Gettext libraries at this time, therefore
there is no need to build them.
Compile the package:
make -C gnulib-lib
make -C src msgfmt
As only one binary has been compiled, it is not possible to run the test suite without
compiling additional support libraries from the Gettext package. It is therefore not
recommended to attempt to run the test suite at this stage.
Install the msgfmt binary:
cp -v src/msgfmt /tools/bin
Подробная информация об этом пакете расположена в Раздел 6.44.2, «Содержимое
Gettext.»

66

Linux From Scratch - Версия 7.3

5.23. Grep-2.14
The Grep package contains programs for searching through files.
Приблизительное
время сборки:
Требует
свободного места
на диске:

0.2 SBU
21 MB

5.23.1. Installation of Grep
Prepare Grep for compilation:
./configure --prefix=/tools
Compile the package:
make
Compilation is now complete. As discussed earlier, running the test suite is not mandatory
for the temporary tools here in this chapter. To run the Grep test suite anyway, issue the
following command:
make check
Install the package:
make install
Подробная информация об этом пакете расположена в Раздел 6.31.2, «Contents of
Grep.»

67

Linux From Scratch - Версия 7.3

5.24. Gzip-1.5
The Gzip package contains programs for compressing and decompressing files.
Приблизительное
время сборки:
Требует
свободного места
на диске:

0.2 SBU
10 MB

5.24.1. Установка Gzip
Подготовим Gzip к компиляции:
./configure --prefix=/tools
Cкомпилируем пакет:
make
Компиляция завершена. Как говорилось ранее, необязательно выполнять тесты для
временных инструментов в этой главе. Чтобы все же запустить тестирование Gzip,
выполните следующую команду:
make check
Установим пакет:
make install
Подробная информация об этом пакете расположена в Раздел 6.49.2, «Содержимое
Gzip.»

68

Linux From Scratch - Версия 7.3

5.25. M4-1.4.16
The M4 package contains a macro processor.
Приблизительное
время сборки:
Требует
свободного места
на диске:

0.2 SBU
16.6 MB

5.25.1. Installation of M4
Fix an incompatibility between this package and Glibc-2.17:
sed -i -e '/gets is a/d' lib/stdio.in.h
Prepare M4 for compilation:
./configure --prefix=/tools
Compile the package:
make
Compilation is now complete. As discussed earlier, running the test suite is not mandatory
for the temporary tools here in this chapter. To run the M4 test suite anyway, issue the
following command:
make check
Install the package:
make install
Подробная информация об этом пакете расположена в Раздел 6.29.2, «Содержимое
M4.»

69

Linux From Scratch - Версия 7.3

5.26. Make-3.82
The Make package contains a program for compiling packages.
Приблизительное
время сборки:
Требует
свободного места
на диске:

0.1 SBU
11.2 MB

5.26.1. Установка Make
Подготовим Make к компиляции:
./configure --prefix=/tools
Скомпилируем пакет:
make
Компиляция завершена. Как говорилось ранее, необязательно выполнять тесты для
временных инструментов в этой главе. Чтобы все же запустить тестирование Make,
выполните следующую команду:
make check
Установим пакет:
make install
Подробная информация об этом пакете расположена в Раздел 6.54.2, «Содержимое
Make.»

70

Linux From Scratch - Версия 7.3

5.27. Patch-2.7.1
The Patch package contains a program for modifying or creating files by applying a
«patch» file typically created by the diff program.
Приблизительное
время сборки:
Требует
свободного места
на диске:

0.1 SBU
3.4 MB

5.27.1. Установка Patch
Подготовим Patch к компиляции:
./configure --prefix=/tools
Cкомпилируем пакет:
make
Компиляция завершена. Как говорилось ранее, необязательно выполнять тесты для
временных инструментов в этой главе. Чтобы все же запустить тестирование Patch,
выполните следующую команду:
make check
Установим пакет:
make install
Подробная информация об этом пакете расположена в Раздел 6.56.2, «Contents of
Patch.»

71

Linux From Scratch - Версия 7.3

5.28. Perl-5.16.2
The Perl package contains the Practical Extraction and Report Language.
Приблизительное
время сборки:
Требует
свободного места
на диске:

1.8 SBU
237 MB

5.28.1. Installation of Perl
First apply the following patch to adapt some hard-wired paths to the C library:
patch -Np1 -i ../perl-5.16.2-libc-1.patch
Prepare Perl for compilation:
sh Configure -des -Dprefix=/tools
Build the package:
make
Although Perl comes with a test suite, it would be better to wait until it is installed in
the next chapter.
Only a few of the utilities and libraries, need to be installed at this time:
cp -v perl cpan/podlators/pod2man /tools/bin
mkdir -pv /tools/lib/perl5/5.16.2
cp -Rv lib/* /tools/lib/perl5/5.16.2
Details on this package are located in Раздел 6.37.2, «Содержимое Perl.»

72

Linux From Scratch - Версия 7.3

5.29. Sed-4.2.2
The Sed package contains a stream editor.
Приблизительное
время сборки:
Требует
свободного места
на диске:

0.1 SBU
10.5 MB

5.29.1. Установка Sed
Подготовим Sed к компиляции:
./configure --prefix=/tools
Cкомпилируем пакет:
make
Компиляция завершена. Как говорилось ранее, необязательно выполнять тесты для
временных инструментов в этой главе. Чтобы все же запустить тестирование Sed,
выполните следующую команду:
make check
Установим пакет:
make install
Подробная информация об этом пакете расположена в Раздел 6.18.2, «Содержимое
Sed.»

73

Linux From Scratch - Версия 7.3

5.30. Tar-1.26
The Tar package contains an archiving program.
Приблизительное
время сборки:
Требует
свободного места
на диске:

0.4 SBU
20.6 MB

5.30.1. Installation of Tar
Fix an incompatibility between this package and Glibc-2.17:
sed -i -e '/gets is a/d' gnu/stdio.in.h
Prepare Tar for compilation:
./configure --prefix=/tools
Compile the package:
make
Compilation is now complete. As discussed earlier, running the test suite is not mandatory
for the temporary tools here in this chapter. To run the Tar test suite anyway, issue the
following command:
make check
Install the package:
make install
Подробная информация об этом пакете расположена в Раздел 6.59.2, «Contents of
Tar.»

74

Linux From Scratch - Версия 7.3

5.31. Texinfo-5.0
The Texinfo package contains programs for reading, writing, and converting info pages.
Приблизительное
время сборки:
Требует
свободного места
на диске:

0.3 SBU
94 MB

5.31.1. Установка Texinfo
Подготовим Texinfo к компиляции:
./configure --prefix=/tools
Cкомпилируем пакет:
make
Компиляция завершена. Как говорилось ранее, необязательно выполнять тесты для
временных инструментов в этой главе. Чтобы все же запустить тестирование Texinfo,
выполните следующую команду:
make check
Установим пакет:
make install
Подробная информация об этом пакете расположена в Раздел 6.60.2, «Содержимое
Texinfo.»

75

Linux From Scratch - Версия 7.3

5.32. Xz-5.0.4
The Xz package contains programs for compressing and decompressing files. It provides
capabilities for the lzma and the newer xz compression formats. Compressing text files
with xz yields a better compression percentage than with the traditional gzip or bzip2
commands.
Приблизительное
время сборки:
Требует
свободного места
на диске:

0.2 SBU
16.3 MB

5.32.1. Установка Xz-Utils
Подготовим Xz к компиляции:
./configure --prefix=/tools
Cкомпилируем пакет:
make
Компиляция завершена. Как говорилось ранее, необязательно выполнять тесты для
временных инструментов в этой главе. Чтобы все же запустить тестирование Xz,
выполните следующую команду:
make check
Установим пакет:
make install
Подробная информация об этом пакете расположена в Раздел 6.46.2, «Contents of
Xz.»

76

Linux From Scratch - Версия 7.3

5.33. Очистка
Шаги, предлагаемые в этой секции, не являются обязательными, однако, если раздел
LFS очень мал, неплохо будет узнать, какие ненужные элементы можно удалить.
Собранные исполняемые файлы и библиотеки содержат около 70 MB ненужной на
данном этапе отладочной информации. Удалите ее командами:
strip --strip-debug /tools/lib/*
strip --strip-unneeded /tools/{,s}bin/*
Эти команды пропустят некоторые файлы, сообщая что не могут распознать их
формат. Большинство из них являются скриптами, а не двоичными файлами.
Будьте внимательны и не используйте параметр --strip-unneeded при обработке
библиотек. Статические библиотеки будут полностью испорчены и весь
инструментарий прийдется собирать заново.
Чтобы освободить еще немного, удалите документацию:
rm -rf /tools/{,share}/{info,man,doc}
На данном этапе у Вас должно остаться как минимум 850 MB свободного места
в разделе $LFS. Именно столько потребуется для сборки и установки Glibc в
следующей главе. Если Вы сможете собрать Glibc, Вам хватит места и на все
остальное.

5.34. Смена владельща
Замечание
Все следующие команды в этой книге должны быть выполнены от имени
пользователя root, а не lfs. Поэтому дважды проверьте, что переменная $LFS
объявлена в окружении root.
В данный момент директория $LFS/tools принадлежит пользователю lfs , который
существует только на хост-системе. Если директория $LFS/tools будет сохранена
для последующего использования, файлы будут принадлежать идентификатору
пользователя, которому не соответствует ни одна учетная запись. Это очень опасно,
поскольку позже созданная учетная запись пользователя может получить такой же
идентификатор, и сможет сделать с файлами и папками в директории $LFS/tools
что угодно, возможно, даже полностью разрушить их.
Чтобы предотвратить это, Вы можете добавить пользователя lfs в новую систему
LFS позже, при создании файла /etc/passwd, позаботившись о присвоении ему тех
же идентификаторов пользователя и группы, что и на хост-системе. Но еще лучше
просто сменить владельца директории $LFS/tools на пользователя root выполнив
следующую команду:
chown -R root:root $LFS/tools
Хотя директория $LFS/tools может быть удалена после завершения сборки LFSсистемы, ее можно оставить для сборки последующих LFS-систем той же версии
книги. Как лучше всего сохранить $LFS/tools - Ваше личное дело.
77

Linux From Scratch - Версия 7.3

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

78

Linux From Scratch - Версия 7.3

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

Linux From Scratch - Версия 7.3

Глава 6. Установка базовых системных
пакетов
6.1. Introduction
In this chapter, we enter the building site and start constructing the LFS system in earnest.
That is, we chroot into the temporary mini Linux system, make a few final preparations,
and then begin installing the packages.
The installation of this software is straightforward. Although in many cases the installation
instructions could be made shorter and more generic, we have opted to provide the
full instructions for every package to minimize the possibilities for mistakes. The key to
learning what makes a Linux system work is to know what each package is used for and
why you (or the system) may need it.
We do not recommend using optimizations. They can make a program run slightly faster,
but they may also cause compilation difficulties and problems when running the program.
If a package refuses to compile when using optimization, try to compile it without
optimization and see if that fixes the problem. Even if the package does compile when
using optimization, there is the risk it may have been compiled incorrectly because of the
complex interactions between the code and build tools. Also note that the -march and mtune options using values not specified in the book have not been tested. This may cause
problems with the toolchain packages (Binutils, GCC and Glibc). The small potential gains
achieved in using compiler optimizations are often outweighed by the risks. First-time
builders of LFS are encouraged to build without custom optimizations. The subsequent
system will still run very fast and be stable at the same time.
The order that packages are installed in this chapter needs to be strictly followed to ensure
that no program accidentally acquires a path referring to /tools hard-wired into it. For
the same reason, do not compile separate packages in parallel. Compiling in parallel may
save time (especially on dual-CPU machines), but it could result in a program containing
a hard-wired path to /tools, which will cause the program to stop working when that
directory is removed.
Before the installation instructions, each installation page provides information about the
package, including a concise description of what it contains, approximately how long it
will take to build, and how much disk space is required during this building process.
Following the installation instructions, there is a list of programs and libraries (along with
brief descriptions of these) that the package installs.

Замечание
The SBU values and required disk space includes test suite data for all applicable
packages in Chapter 6.

6.2. Preparing Virtual Kernel File Systems
Various file systems exported by the kernel are used to communicate to and from the
kernel itself. These file systems are virtual in that no disk space is used for them. The
content of the file systems resides in memory.
Begin by creating directories onto which the file systems will be mounted:
mkdir -v $LFS/{dev,proc,sys}
80

Linux From Scratch - Версия 7.3

6.2.1. Creating Initial Device Nodes
When the kernel boots the system, it requires the presence of a few device nodes, in
particular the console and null devices. The device nodes must be created on the hard
disk so that they are available before udevd has been started, and additionally when Linux
is started with init=/bin/bash. Create the devices by running the following commands:
mknod -m 600 $LFS/dev/console c 5 1
mknod -m 666 $LFS/dev/null c 1 3

6.2.2. Mounting and Populating /dev
The recommended method of populating the /dev directory with devices is to mount
a virtual filesystem (such as tmpfs) on the /dev directory, and allow the devices to be
created dynamically on that virtual filesystem as they are detected or accessed. Device
creation is generally done during the boot process by Udev. Since this new system does
not yet have Udev and has not yet been booted, it is necessary to mount and populate /
dev manually. This is accomplished by bind mounting the host system's /dev directory. A
bind mount is a special type of mount that allows you to create a mirror of a directory
or mount point to some other location. Use все же запустить тестирование following
command to achieve this:
mount -v --bind /dev $LFS/dev

6.2.3. Mounting Virtual Kernel File Systems
Now mount the remaining virtual kernel filesystems:
mount -vt devpts devpts $LFS/dev/pts
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
In some host systems, /dev/shm is a symbolic link to /run/shm. Inside a chroot
environment, this temporary file system needs to be mounted separate from the host file
system:
if [ -h $LFS/dev/shm ]; then
link=$(readlink $LFS/dev/shm)
mkdir -p $LFS/$link
mount -vt tmpfs shm $LFS/$link
unset link
else
mount -vt tmpfs shm $LFS/dev/shm
fi

6.3. Package Management
Package Management is an often requested addition to the LFS Book. A Package Manager
allows tracking the installation of files making it easy to remove and upgrade packages.
As well as the binary and library files, a package manager will handle the installation of
configuration files. Before you begin to wonder, NO—this section will not talk about nor
recommend any particular package manager. What it provides is a roundup of the more
81

Linux From Scratch - Версия 7.3
popular techniques and how they work. The perfect package manager for you may be
among these techniques or may be a combination of two or more of these techniques.
This section briefly mentions issues that may arise when upgrading packages.
Some reasons why no package manager is mentioned in LFS or BLFS include:
• Dealing with package management takes the focus away from the goals of these
books—teaching how a Linux system is built.
• There are multiple solutions for package management, each having its strengths and
drawbacks. Including one that satisfies all audiences is difficult.
There are some hints written on the topic of package management. Visit the Hints Project
and see if one of them fits your need.

6.3.1. Upgrade Issues
A Package Manager makes it easy to upgrade to newer versions when they are released.
Generally the instructions in the LFS and BLFS Book can be used to upgrade to the newer
versions. Here are some points that you should be aware of when upgrading packages,
especially on a running system.
• If one of the toolchain packages (Glibc, GCC or Binutils) needs to be upgraded to
a newer minor version, it is safer to rebuild LFS. Though you may be able to get
by rebuilding all все же запустить тестирование packages in their dependency
order, we do not recommend it. For example, if glibc-2.2.x needs to be updated to
glibc-2.3.x, it is safer to rebuild. For micro version updates, a simple reinstallation
usually works, but is not guaranteed. For example, upgrading from glibc-2.3.4 to
glibc-2.3.5 will not usually cause any problems.
• If a package containing a shared library is updated, and if the name of the library
changes, then all the packages dynamically linked to the library need to be
recompiled to link against the newer library. (Note that there is no correlation
between the package version and the name of the library.) For example, consider
a package foo-1.2.3 that installs a shared library with name libfoo.so.1. Say you
upgrade все же запустить тестирование package to a newer version foo-1.2.4 that
installs a shared library with name libfoo.so.2. In this case, all packages that are
dynamically linked to libfoo.so.1 need to be recompiled to link against libfoo.
so.2. Note that you should not remove the previous libraries until the dependent
packages are recompiled.

6.3.2. Package Management Techniques
The following are some common package management techniques. Before making a
decision on a package manager, do some research on the various techniques, particularly
the drawbacks of the particular scheme.

6.3.2.1. It is All in My Head!
Yes, this is a package management technique. Some folks do not find все же запустить
тестирование need for a package manager because they know the packages intimately
and know what files are installed by each package. Some users also do not need any
package management because they plan on rebuilding the entire system when a package
is changed.
82

Linux From Scratch - Версия 7.3

6.3.2.2. Install in Separate Directories
This is a simplistic package management that does not need any extra package to manage
the installations. Each package is installed in a separate directory. For example, package
foo-1.1 is installed in /usr/pkg/foo-1.1 and a symlink is made from /usr/pkg/foo to /
usr/pkg/foo-1.1. When installing a new version foo-1.2, it is installed in /usr/pkg/foo1.2 and the previous symlink is replaced by a symlink to the new version.
Environment variables such as PATH, LD_LIBRARY_PATH, MANPATH, INFOPATH and CPPFLAGS
need to be expanded to include /usr/pkg/foo. For more than a few packages, this scheme
becomes unmanageable.

6.3.2.3. Symlink Style Package Management
This is a variation of the previous package management technique. Each package is
installed similar to the previous scheme. But instead of making the symlink, each file
is symlinked into the /usr hierarchy. This removes the need to expand the environment
variables. Though the symlinks can be created by the user to automate the creation, many
package managers have been written using this approach. A few of the popular ones
include Stow, Epkg, Graft, and Depot.
The installation needs to be faked, so that the package thinks that it is installed in /usr
though in reality it is installed in the /usr/pkg hierarchy. Installing in this manner is not
usually a trivial task. For example, consider that you are installing a package libfoo-1.1.
The following instructions may not install the package properly:
./configure --prefix=/usr/pkg/libfoo/1.1
make
make install
The installation will work, but the dependent packages may not link to libfoo as you
would expect. If you compile a package that links against libfoo, you may notice that it is
linked to /usr/pkg/libfoo/1.1/lib/libfoo.so.1 instead of /usr/lib/libfoo.so.1 as
you would expect. The correct approachis to use the DESTDIR strategy to fake installation
of the package. This approach works as follows:
./configure --prefix=/usr
make
make DESTDIR=/usr/pkg/libfoo/1.1 install
Most packages support this approach, but there are some which do not. For the noncompliant packages, you may either need to manually install the package, or you may find
that it is easier to install some problematic packages into /opt.

6.3.2.4. Timestamp Based
In this technique, a file is timestamped before the installation of все же запустить
тестирование package. After the installation, a simple use of the find command with the
appropriate options can generate a log of all the files installed after the timestamp file
was created. A package manager written with this approach is install-log.
Though this scheme has the advantage of being simple, it has two drawbacks. If, during
installation, the files are installed with any timestamp other than the current time, those
files will not be tracked by все же запустить тестирование package manager. Also, this
scheme can only be used when one package is installed at a time. The logs are not reliable
if two packages are being installed on two different consoles.
83

Linux From Scratch - Версия 7.3

6.3.2.5. Tracing Installation Scripts
In this approach, the commands that the installation scripts perform are recorded. There
are two techniques that one can use:
The LD_PRELOAD environment variable can be set to point to a library to be preloaded
before installation. During installation, this library tracks the packages that are being
installed by attaching itself to various executables such as cp, install, mv and tracking
the system calls that modify the filesystem. For this approach to work, all the executables
need to be dynamically linked without the suid or sgid bit. Preloading the library may
cause some unwanted side-effects during installation. Therefore, it is advised that one
performs some tests to ensure that the package manager does not break anything and
logs all the appropriate files.
The second technique is to use strace, which logs all system calls made during the
execution of the installation scripts.

6.3.2.6. Creating Package Archives
In this scheme, the package installation is faked into a separate tree as described in the
Symlink style package management. After the installation, a package archive is created
using the installed files. This archive is then used to install the package either on the local
machine or can even be used to install the package on other machines.
This approach is used by most of the package managers found in the commercial
distributions. Examples of package managers that follow this approach are RPM
(which, incidentally, is required by the Linux Standard Base Specification), pkg-utils,
Debian's apt, and Gentoo's Portage system. A hint describing how to adopt this style
of package management for LFS systems is located at http://www.linuxfromscratch.org/
hints/downloads/files/fakeroot.txt.
Creation of package files that include dependency information is complex and is beyond
the scope of LFS.
Slackware uses a tar based system for package archives. This system purposely
does not handle package dependencies as more complex package managers do. For
details of Slackware package management, see http://www.slackbook.org/html/packagemanagement.html.

6.3.2.7. User Based Management
This scheme, unique to LFS, was devised by Matthias Benkmann, and is available from
the Hints Project. In this scheme, each package is installed as a separate user into the
standard locations. Files belonging to a package are easily identified by checking the
user ID. The features and shortcomings of this approach are too complex to describe in
this section. For the details please see the hint at http://www.linuxfromscratch.org/hints/
downloads/files/more_control_and_pkg_man.txt.

6.3.3. Deploying LFS on Multiple Systems
One of the advantages of an LFS system is that there are no files that depend on the
position of files on a disk system. Cloning an LFS build to another computer with an
architecture similar to the base system is as simple as using tar on the LFS partition that
contains все же запустить тестирование root directory (about 250MB uncompressed for
84

Linux From Scratch - Версия 7.3
a base LFS build), copying that file via network transfer or CD-ROM to the new system
and expanding it. From that point, a few configuration files will have to be changed.
Configuration files that may need to be updated include: /etc/hosts, /etc/fstab, /etc/
passwd, /etc/group, /etc/shadow, /etc/ld.so.conf, /etc/sysconfig/rc.site, /etc/
sysconfig/network, and /etc/sysconfig/ifconfig.eth0.
A custom kernel may need to be built for the new system depending on differences in
system hardware and the original kernel configuration.
Finally the new system has to be made bootable via Раздел 8.4, «Настройка загрузчика
GRUB».

6.4. Entering the Chroot Environment
It is time to enter the chroot environment to begin building and installing the final LFS
system. As user root, run the following command to enter the realm that is, at the
moment, populated with only the temporary tools:
chroot "$LFS" /tools/bin/env -i \
HOME=/root
\
TERM="$TERM"
\
PS1='\u:\w\$ '
\
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \
/tools/bin/bash --login +h
The -i option given to the env command will clear all variables of the chroot environment.
After that, only the HOME, TERM, PS1, and PATH variables are set again. The TERM=$TERM
construct will set the TERM variable inside chroot to the same value as outside chroot. This
variable is needed for programs like vim and less to operate properly. If other variables
are needed, such as CFLAGS or CXXFLAGS, this is a good place to set them again.
From this point on, there is no need to use the LFS variable anymore, because all work
will be restricted to the LFS file system. This is because the Bash shell is told that $LFS
is now the root (/) directory.
Notice that /tools/bin comes last in the PATH. This means that a temporary tool will
no longer be used once its final version is installed. This occurs when the shell does not
«remember» the locations of executed binaries—for this reason, hashing is switched off
by passing the +h option to bash.
Note that the bash prompt will say I have no name! This is normal because the /etc/
passwd file has not been created yet.

Замечание
It is important that all the commands throughout the remainder of this chapter
and the following chapters are run from within the chroot environment. If you
leave this environment for any reason (rebooting for example), ensure that the
virtual kernel filesystems are mounted as explained in Раздел 6.2.2, «Mounting
and Populating /dev» and Раздел 6.2.3, «Mounting Virtual Kernel File Systems»
and enter chroot again before continuing with the installation.

85

Linux From Scratch - Версия 7.3

6.5. Creating Directories
It is time to create some structure in the LFS file system. Create a standard directory tree
by issuing the following commands:
mkdir -pv /{bin,boot,etc/{opt,sysconfig},home,lib,mnt,opt,run}
mkdir -pv /{media/{floppy,cdrom},sbin,srv,var}
install -dv -m 0750 /root
install -dv -m 1777 /tmp /var/tmp
mkdir -pv /usr/{,local/}{bin,include,lib,sbin,src}
mkdir -pv /usr/{,local/}share/{doc,info,locale,man}
mkdir -v /usr/{,local/}share/{misc,terminfo,zoneinfo}
mkdir -pv /usr/{,local/}share/man/man{1..8}
for dir in /usr /usr/local; do
ln -sv share/{man,doc,info} $dir
done
case $(uname -m) in
x86_64) ln -sv lib /lib64 && ln -sv lib /usr/lib64 ;;
esac
mkdir -v /var/{log,mail,spool}
ln -sv /run /var/run
ln -sv /run/lock /var/lock
mkdir -pv /var/{opt,cache,lib/{misc,locate},local}
Directories are, by default, created with permission mode 755, but this is not desirable for
all directories. In the commands above, two changes are made—one to the home directory
of user root, and another to the directories for temporary files.
The first mode change ensures that not just anybody can enter the /root directory—the
same as a normal user would do with his or her home directory. The second mode change
makes sure that any user can write to the /tmp and /var/tmp directories, but cannot
remove another user's files from them. The latter is prohibited by the so-called «sticky
bit,» the highest bit (1) in the 1777 bit mask.

6.5.1. FHS Compliance Note
The directory tree is based on the Filesystem Hierarchy Standard (FHS) (available at
http://www.pathname.com/fhs/). In addition to все же запустить тестирование FHS,
we create compatibility symlinks for the man, doc, and info directories since many
packages still try to install their documentation into /usr/ or /usr/
local/ as opposed to /usr/share/ or /usr/local/share/
. The FHS also stipulates the existence of /usr/local/games and /usr/
share/games. The FHS is not precise as to все же запустить тестирование structure of
the /usr/local/share subdirectory, so we create only the directories that are needed.
However, feel free to create these directories if you prefer to conform more strictly to
the FHS.

86

Linux From Scratch - Версия 7.3

6.6. Creating Essential Files and Symlinks
Some programs use hard-wired paths to programs which do not exist yet. In order to
satisfy these programs, create a number of symbolic links which will be replaced by real
files throughout the course of this chapter after the software has been installed:
ln -sv /tools/bin/{bash,cat,echo,pwd,stty} /bin
ln -sv /tools/bin/perl /usr/bin
ln -sv /tools/lib/libgcc_s.so{,.1} /usr/lib
ln -sv /tools/lib/libstdc++.so{,.6} /usr/lib
sed 's/tools/usr/' /tools/lib/libstdc++.la > /usr/lib/libstdc++.la
ln -sv bash /bin/sh
A proper Linux system maintains a list of the mounted file systems in the file /etc/mtab.
Normally, this file would be created when we mount a new file system. Since we will not be
mounting any file systems inside our chroot environment, create an empty file for utilities
that expect the presence of /etc/mtab:
touch /etc/mtab
In order for user root to be able to login and for the name «root» to be recognized, there
must be relevant entries in the /etc/passwd and /etc/group files.
Create the /etc/passwd file by running the following command:
cat > /etc/passwd /etc/group /etc/ld.so.conf > /etc/ld.so.conf /etc/hosts
This version of Perl now builds the Compress::Raw::Zlib module. By default Perl will use
an internal copy of the Zlib source for the build. Issue the following command so that Perl
will use the Zlib library installed on the system:
sed -i -e "s|BUILD_ZLIB\s*= True|BUILD_ZLIB = False|"
\
-e "s|INCLUDE\s*= ./zlib-src|INCLUDE
= /usr/include|" \
-e "s|LIB\s*= ./zlib-src|LIB
= /usr/lib|"
\
cpan/Compress-Raw-Zlib/config.in
To have full control over the way Perl is set up, you can remove the «-des» options from
the following command and hand-pick the way this package is built. Alternatively, use the
command exactly as below to use the defaults that Perl auto-detects:
sh Configure -des -Dprefix=/usr
-Dvendorprefix=/usr
-Dman1dir=/usr/share/man/man1
-Dman3dir=/usr/share/man/man3
-Dpager="/usr/bin/less -isR"
-Duseshrplib

\
\
\
\
\

Значение параметров configure:

-Dvendorprefix=/usr
This ensures perl knows how to tell packages where they should install their perl
modules.
-Dpager="/usr/bin/less -isR"
This corrects an error in the way that perldoc invokes the less program.
-Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3
Since Groff is not installed yet, Configure thinks that we do not want man pages for
Perl. Issuing these parameters overrides this decision.
-Duseshrplib
Build a shared libperl needed by some perl modules.
Cкомпилируем пакет:
make
156

Linux From Scratch - Версия 7.3
To test the results (approximately 2.5 SBU), issue:
make -k test
Установим пакет:
make install

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

a2p, c2ph, config_data, corelist, cpan, cpan2dist, cpanp, cpanprun-perl, enc2xs, find2perl, h2ph, h2xs, instmodsh, json_pp,
libnetcfg, perl, perl5.16.2 (link to perl), perlbug, perldoc, perlivp,
perlthanks (link to perlbug), piconv, pl2pm, pod2html, pod2latex,
pod2man, pod2text, pod2usage, podchecker, podselect, prove,
psed (link to s2p), pstruct (link to c2ph), ptar, ptardiff, ptargrep,
s2p, shasum, splain, xsubpp, and zipdetails
Several hundred which cannot all be listed here

Установленные
библиотеки:
Установленный
каталог:

/usr/lib/perl5

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

Translates awk to Perl

c2ph

Dumps C structures as generated from cc -g -S

config_data

Queries or changes configuration of Perl modules

corelist

A commandline frontend to Module::CoreList

cpan

Interact with the Comprehensive Perl Archive Network (CPAN) from
the command line

cpan2dist

The CPANPLUS distribution creator

cpanp

The CPANPLUS launcher

cpanp-runperl

Perl script that is used to enable flushing of the output buffer after each
write in spawned processes

enc2xs

Builds a Perl extension for the Encode module from either Unicode
Character Mappings or Tcl Encoding Files

find2perl

Translates find commands to Perl

h2ph

Converts .h C header files to .ph Perl header files

h2xs

Converts .h C header files to Perl extensions

instmodsh

Shell script for examining installed Perl modules, and can even create
a tarball from an installed module

json_pp

Converts data between certain input and output formats

libnetcfg

Can be used to configure the libnet Perl module

perl

Combines some of the best features of C, sed, awk and sh into a single
swiss-army language

perl5.16.2

A hard link to perl

perlbug

Used to generate bug reports about Perl, or the modules that come
with it, and mail them
157

Linux From Scratch - Версия 7.3
perldoc

Displays a piece of documentation in pod format that is embedded in
the Perl installation tree or in a Perl script

perlivp

The Perl Installation Verification Procedure; it can be used to verify
that Perl and its libraries have been installed correctly

perlthanks

Used to generate thank you messages to mail to the Perl developers

piconv

A Perl version of the character encoding converter iconv

pl2pm

A rough tool for converting Perl4 .pl files to Perl5 .pm modules

pod2html

Converts files from pod format to HTML format

pod2latex

Converts files from pod format to LaTeX format

pod2man

Converts pod data to formatted *roff input

pod2text

Converts pod data to formatted ASCII text

pod2usage

Prints usage messages from embedded pod docs in files

podchecker

Checks the syntax of pod format documentation files

podselect

Displays selected sections of pod documentation

prove

Command line tool for running tests against the Test::Harness module.

psed

A Perl version of the stream editor sed

pstruct

Dumps C structures as generated from cc -g -S stabs

ptar

A tar-like program written in Perl

ptardiff

A Perl program that compares an extracted archive with an
unextracted one

ptargrep

A Perl program that applies pattern matching to the contents of files
in a tar archive

s2p

Translates sed scripts to Perl

shasum

Prints or checks SHA checksums

splain

Is used to force verbose warning diagnostics in Perl

xsubpp

Converts Perl XS code into C code

zipdetails

Displays details about the internal structure of a Zip file

158

Linux From Scratch - Версия 7.3

6.38. Autoconf-2.69
The Autoconf package contains programs for producing shell scripts that can
automatically configure source code.
Приблизительное
время сборки:
Требует
свободного места
на диске:

4.5 SBU
17.1 MB

6.38.1. Установка Autoconf
Подготовим Autoconf к компиляции:
./configure --prefix=/usr
Cкомпилируем пакет:
make
Чтобы запустить тестирование пакета, выполните:
make check
This takes a long time, about 4.7 SBUs. In addition, 6 tests are skipped that use Automake.
For full test coverage, Autoconf can be re-tested after Automake has been installed.
Установим пакет:
make install

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

autoconf,
autoheader,
autoupdate, and ifnames
/usr/share/autoconf

autom4te,

autoreconf,

autoscan,

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

Produces shell scripts that automatically configure software source
code packages to adapt to many kinds of Unix-like systems. The
configuration scripts it produces are independent—running все же
запустить тестированиеm does not require the autoconf program.

autoheader

A tool for creating template files of C #define statements for configure to
use

autom4te

A wrapper for the M4 macro processor

autoreconf

Automatically runs autoconf, autoheader, aclocal, automake,
gettextize, and libtoolize in the correct order to save time when changes
are made to autoconf and automake template files

autoscan

Helps to create a configure.in file for a software package; it examines
the source files in a directory tree, searching them for common portability
issues, and creates a configure.scan file that serves as as a preliminary
configure.in file for the package
159

Linux From Scratch - Версия 7.3
autoupdate

Modifies a configure.in file that still calls autoconf macros by their old
names to use the current macro names

ifnames

Helps when writing configure.in files for a software package; it prints
the identifiers that the package uses in C preprocessor conditionals. If a
package has already been set up to have some portability, this program
can help determine what configure needs to check for. It can also fill in
gaps in a configure.in file generated by autoscan

160

Linux From Scratch - Версия 7.3

6.39. Automake-1.13.1
The Automake package contains programs for generating Makefiles for use with Autoconf.
Приблизительное
время сборки:
Требует
свободного места
на диске:

менее 0.1 SBU (34.1 SBU with tests)
100 MB

6.39.1. Installation of Automake
Prepare Automake for compilation:
./configure --prefix=/usr --docdir=/usr/share/doc/automake-1.13.1
Compile the package:
make

Замечание
The tests take a very long time: over 30 SBUs. Running the tests is not
recommended.
To test the results, issue:
make check
Install the package:
make install

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

acinstall, aclocal, aclocal-1.13, automake, automake-1.13,
compile, config.guess, config.sub, depcomp, elisp-comp, installsh, mdate-sh, missing, mkinstalldirs, py-compile, symlink-tree,
and ylwrap
/usr/share/aclocal-1.13, /usr/share/automake-1.13, /usr/share/
doc/automake-1.13.1

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

A script that installs aclocal-style M4 files

aclocal

Generates aclocal.m4 files based on the contents of configure.in files

aclocal-1.13

A hard link to aclocal

automake

A tool for automatically generating Makefile.in files from Makefile.
am files. To create all the Makefile.in files for a package, run this
program in the top-level directory. By scanning the configure.in file,
it automatically finds each appropriate Makefile.am file and generates
the corresponding Makefile.in file

automake-1.13 A hard link to automake
compile

A wrapper for compilers
161

Linux From Scratch - Версия 7.3
config.guess

A script that attempts to guess the canonical triplet for все же
запустить тестирование given build, host, or target architecture

config.sub

A configuration validation subroutine script

depcomp

A script for compiling a program so that dependency information is
generated in addition to the desired output

elisp-comp

Byte-compiles Emacs Lisp code

install-sh

A script that installs a program, script, or data file

mdate-sh

A script that prints the modification time of a file or directory

missing

A script acting as a common stub for missing GNU programs during an
installation

mkinstalldirs

A script that creates a directory tree

py-compile

Compiles a Python program

symlink-tree

A script to create a symlink tree of a directory tree

ylwrap

A wrapper for lex and yacc

162

Linux From Scratch - Версия 7.3

6.40. Diffutils-3.2
The Diffutils package contains programs that show the differences between files or
directories.
Приблизительное
время сборки:
Требует
свободного места
на диске:

0.5 SBU
25 MB

6.40.1. Installation of Diffutils
Fix an incompatibility between this package and Glibc-2.17
sed -i -e '/gets is a/d' lib/stdio.in.h
Prepare Diffutils for compilation:
./configure --prefix=/usr
Compile the package:
make
To test the results, issue:
make check
Install the package:
make install

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

cmp, diff, diff3, and sdiff

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

Compares two files and reports whether or in which bytes they differ

diff

Compares two files or directories and reports which lines in все же запустить
тестирование files differ

diff3

Compares three files line by line

sdiff

Merges two files and interactively outputs the results

163

Linux From Scratch - Версия 7.3

6.41. Gawk-4.0.2
The Gawk package contains programs for manipulating text files.
Приблизительное
время сборки:
Требует
свободного места
на диске:

0.2 SBU
30 MB

6.41.1. Установка Gawk
Подготовим Gawk к компиляции:
./configure --prefix=/usr --libexecdir=/usr/lib
Cкомпилируем пакет:
make
Чтобы запустить тестирование пакета, выполните:
make check
Установим пакет:
make install
If desired, install the documentation:
mkdir -v /usr/share/doc/gawk-4.0.2
cp
-v doc/{awkforai.txt,*.{eps,pdf,jpg}} /usr/share/doc/gawk-4.0.2

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

awk (link to gawk), dgawk, gawk, gawk-4.0.2, grcat, igawk,
pgawk, pgawk-4.0.2, and pwcat
/usr/lib/awk, /usr/share/awk

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

A link to gawk

dgawk

An awk debugger

gawk

A program for manipulating text files; it is the GNU implementation of awk

gawk-4.0.2

A hard link to gawk

grcat

Dumps the group database /etc/group

igawk

Gives gawk the ability to include files

pgawk

The profiling version of gawk

pgawk-4.0.2 Hard link to pgawk
pwcat

Dumps the password database /etc/passwd

164

Linux From Scratch - Версия 7.3

6.42. Findutils-4.4.2
The Findutils package contains programs to find files. These programs are provided to
recursively search through a directory tree and to create, maintain, and search a database
(often faster than the recursive find, but unreliable if the database has not been recently
updated).
Приблизительное
время сборки:
Требует
свободного места
на диске:

0.4 SBU
29 MB

6.42.1. Installation of Findutils
Prepare Findutils for compilation:
./configure --prefix=/usr
\
--libexecdir=/usr/lib/findutils \
--localstatedir=/var/lib/locate
The meaning of the configure options:

--localstatedir
This option changes the location of the locate database to be in /var/lib/locate,
which is FHS-compliant.
Cкомпилируем пакет:
make
Чтобы запустить тестирование пакета, выполните:
make check
Установим пакет:
make install
Some of the scripts in the LFS-Bootscripts package depend on find. As /usr may not be
available during the early stages of booting, this program needs to be on the root partition.
The updatedb script also needs to be modified to correct an explicit path:
mv -v /usr/bin/find /bin
sed -i 's/find:=${BINDIR}/find:=\/bin/' /usr/bin/updatedb

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

bigram, code, find, frcode, locate, oldfind, updatedb, and xargs
/usr/lib/findutils

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

Was formerly used to produce locate databases

code

Was formerly used to produce locate databases; it is the ancestor of frcode.
165

Linux From Scratch - Версия 7.3
find

Searches given directory trees for files matching the specified criteria

frcode

Is called by updatedb to compress the list of file names; it uses frontcompression, reducing the database size by a factor of four to five.

locate

Searches through a database of file names and reports the names that contain
a given string or match a given pattern

oldfind

Older version of find, using a different algorithm

updatedb Updates the locate database; it scans the entire file system (including other
file systems that are currently mounted, unless told not to) and puts every file
name it finds into все же запустить тестирование database
xargs

Can be used to apply a given command to a list of files

166

Linux From Scratch - Версия 7.3

6.43. Flex-2.5.37
The Flex package contains a utility for generating programs that recognize patterns in
text.
Приблизительное 0.4 SBU
время сборки:
Требует
39 MB
свободного места
на диске:

6.43.1. Installation of Flex
First, fix some regression tests:
patch -Np1 -i ../flex-2.5.37-bison-2.6.1-1.patch
Prepare Flex for compilation:
./configure --prefix=/usr
\
--docdir=/usr/share/doc/flex-2.5.37
Compile the package:
make
To test the results (about 0.5 SBU), issue:
make check
Установим пакет:
make install
There are some packages that expect to find the lex library in /usr/lib. Create a symlink
to account for this:
ln -sv libfl.a /usr/lib/libl.a
A few programs do not know about flex yet and try to run its predecessor, lex. To support
those programs, create a wrapper script named lex that calls flex in lex emulation mode:
cat > /usr/bin/lex /etc/syslog.conf > src/feature.h
Now prepare Vim к компиляции:
./configure --prefix=/usr --enable-multibyte
Значение параметров configure:

--enable-multibyte
This switch enables support for editing files in multibyte character encodings. This
is needed if using a locale with a multibyte character set. This switch is also helpful
to be able to edit text files initially created in Linux distributions like Fedora that use
UTF-8 as a default character set.
Cкомпилируем пакет:
make
Чтобы запустить тестирование пакета, выполните:
make test
However, this test suite outputs a lot of binary data to the screen, which can cause issues
with the settings of the current terminal. This can be resolved by redirecting the output
to a log file. A successful test will result in the words "ALL DONE" at completion.
Установим пакет:
make install
Many users are used to using vi instead of vim. To allow execution of vim when users
habitually enter vi, create a symlink for both the binary and the man page in the provided
languages:
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
202

Linux From Scratch - Версия 7.3
By default, Vim's documentation is installed in /usr/share/vim. The following symlink
allows the documentation to be accessed via /usr/share/doc/vim-7.3, making it
consistent with the location of documentation for other packages:
ln -sv ../vim/vim73/doc /usr/share/doc/vim-7.3
If an X Window System is going to be installed on the LFS system, it may be necessary to
recompile Vim after installing X. Vim comes with a GUI version of the editor that requires
X and some additional libraries to be installed. For more information on this process, refer
to the Vim documentation and the Vim installation page in the BLFS book at http://www.
linuxfromscratch.org/blfs/view/svn/postlfs/editors.html#postlfs-editors-vim.

6.62.2. Configuring Vim
By default, vim runs in vi-incompatible mode. This may be new to users who have used
other editors in the past. The «nocompatible» setting is included below to highlight the
fact that a new behavior is being used. It also reminds those who would change to
«compatible» mode that it should be the first setting in the configuration file. This is
necessary because it changes other settings, and overrides must come after this setting.
Create a default vim configuration file by running the following:
cat > /etc/vimrc ifconfig.eth0 /etc/udev/rules.d/83-duplicate_devs.rules /etc/inittab /etc/sysconfig/network
нужно заменить на имя, которое Вы хотите дать компьютеру. Не вводите здесь
полное доменное имя (Fully Qualified Domain Name, FQDN). Эту информацию мы
поместим в файл /etc/hosts.
222

Linux From Scratch - Версия 7.3

7.9. Настройка скрипта setclock
Скрипт setclock считывает время с аппаратных часов, также известных как
часы BIOS или CMOS (Complementary Metal Oxide Semiconductor). Если на
аппаратных часах установлено UTC (всемирное скоординированное время), этот
скрипт преобразует полученное значение в локальное время, используя файл /
etc/localtime (который сообщает программе hwclock, в какой временной зоне
находится пользователь). Невозможно определить, установлено на аппаратных
часах UTC или же локальное время, поэтому необходимо указать это вручную.
Скрипт setclock запускается системой udev при загрузке, когда ядро определяет
возможности аппаратного обеспечения. Также его можно запустить вручную с
параметром stop, чтобы сохранить системное время в аппаратные часы CMOS.
Если Вы не можете вспомнить, установлено на аппаратных часах UTC или локальное
время, запустите команду hwclock --localtime --show. Она отобразит текущее время
в соответствии с аппаратными часами. Если оно совпадает с тем, что показывают
Ваши настенные/наручные часы, значит на часах CMOS установлено локальное
время. Если вывод hwclock не совпадает с локальным временем, скорее всего,
это UTC. Проверьте это, добавляя или вычитая правильное смещение к времени,
выводимому hwclock. Например, если Вы живете во временной зоне MST, также
известной как GMT -0700, добавьте семь часов к локальному времени.
Измените значение переменной UTC ниже на 0 (ноль), если на аппаратных часах
установлено не UTC.
Создайте новый файл /etc/sysconfig/clock, запустив:
cat > /etc/sysconfig/clock /etc/sysconfig/console /etc/sysconfig/console /etc/sysconfig/console /etc/sysconfig/console /etc/sysconfig/console /etc/profile &2
exit 1
fi
previous=${PREVLEVEL}

267

Linux From Scratch - Версия 7.3
[ "${previous}" == "" ] && previous=N
if [ ! -d /etc/rc.d/rc${runlevel}.d ]; then
log_info_msg "/etc/rc.d/rc${runlevel}.d does not exist.\n"
exit 1
fi
if [ "$runlevel" == "6" -o "$runlevel" == "0" ]; then IPROMPT="no"; fi
# Note: In ${LOGLEVEL:-7}, it is ':' 'dash' '7', not minus 7
if [ "$runlevel" == "S" ]; then
[ -r /etc/sysconfig/console ] && source /etc/sysconfig/console
dmesg -n "${LOGLEVEL:-7}"
fi
if [ "${IPROMPT}" == "yes" -a "${runlevel}" == "S" ]; then
# The total length of the distro welcome string, without escape codes
wlen=${wlen:-$(echo "Welcome to ${DISTRO}" | wc -c )}
welcome_message=${welcome_message:-"Welcome to ${INFO}${DISTRO}${NORMAL}"}
# The total length of the interactive string, without escape codes
ilen=${ilen:-$(echo "Press 'I' to enter interactive startup" | wc -c )}
i_message=${i_message:-"Press '${FAILURE}I${NORMAL}' to enter interactive startup"}
# dcol and icol are spaces before the message to center the message
# on screen. itime is the amount of wait time for the user to press a key
wcol=$(( ( ${COLUMNS} - ${wlen} ) / 2 ))
icol=$(( ( ${COLUMNS} - ${ilen} ) / 2 ))
itime=${itime:-"3"}

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 /var/run/interactive ] && source /var/run/interactive
# Attempt to stop all services started by the previous runlevel,
# and killed in this runlevel
if [ "${previous}" != "N" ]; then
for i in $(ls -v /etc/rc.d/rc${runlevel}.d/K* 2> /dev/null)
do
check_script_status
suffix=${i#/etc/rc.d/rc$runlevel.d/K[0-9][0-9]}
prev_start=/etc/rc.d/rc$previous.d/S[0-9][0-9]$suffix
sysinit_start=/etc/rc.d/rcS.d/S[0-9][0-9]$suffix
if [ "${runlevel}" != "0" -a "${runlevel}" != "6" ]; then
if [ ! -f ${prev_start} -a ! -f ${sysinit_start} ]; then
MSG="WARNING:\n\n${i} can't be "
MSG="${MSG}executed because it was not "
MSG="${MSG}not started in the previous "

268

Linux From Scratch - Версия 7.3

fi

fi

MSG="${MSG}runlevel (${previous})."
log_warning_msg "$MSG"
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 functions in this runlevel
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]}
stop=/etc/rc.d/rc$runlevel.d/K[0-9][0-9]$suffix
prev_start=/etc/rc.d/rc$previous.d/S[0-9][0-9]$suffix
fi

[ -f ${prev_start} -a ! -f ${stop} ] && continue

check_script_status
case ${runlevel} in
0|6)
run ${i} stop
;;
*)
run ${i} start
;;
esac
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\"" > /var/run/interactive
else
rm -f /var/run/interactive 2> /dev/null
fi
# Copy the boot log on initial boot only
if [ "${previous}" == "N" -a "${runlevel}" != "S" ]; then
cat /run/var/bootlog >> /var/log/boot.log
# Mark the end of boot
echo "--------" >> /var/log/boot.log

269

Linux From Scratch - Версия 7.3

fi

# Remove the temporary file
rm -f /run/var/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
umask 022
export PATH="/bin:/usr/bin:/sbin:/usr/sbin"
## 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

## 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,

270

Linux From Scratch - Версия 7.3
# 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}"
SUCCESS_SUFFIX="${BRACKET}[${SUCCESS} OK ${BRACKET}]${NORMAL}"
FAILURE_SUFFIX="${BRACKET}[${FAILURE} FAIL ${BRACKET}]${NORMAL}"
WARNING_SUFFIX="${BRACKET}[${WARNING} WARN ${BRACKET}]${NORMAL}"
BOOTLOG=/run/var/bootlog
KILLDELAY=3
# Set any user specified environment variables e.g. HEADLESS
[ -r /etc/sysconfig/rc.site ] && . /etc/sysconfig/rc.site
################################################################################
# start_daemon()
#
# Usage: start_daemon [-f] [-n nicelevel] [-p pidfile] pathname [args...]
#
#
#
# Purpose: This runs the specified program as a daemon
#
#
#
# Inputs: -f: (force) run the program even if it is already running.
#
#
-n nicelevel: specify a nice level. See 'man nice(1)'.
#
#
-p pidfile: use the specified file to determine PIDs.
#
#
pathname: the complete path to the specified program
#
#
args: additional arguments passed to the program (pathname)
#
#
#
# Return values (as defined by LSB exit codes):
#
#
0 - program is running or service is OK
#
#
1 - generic or unspecified error
#
#
2 - invalid or excessive argument(s)
#
#
5 - program is not installed
#
################################################################################
start_daemon()
{
local force=""
local nice="0"
local pidfile=""
local pidlist=""
local retval=""
# Process arguments
while true
do
case "${1}" in
-f)

force="1"
shift 1

271

Linux From Scratch - Версия 7.3
;;
-n)

-p)

-*)

*)

esac

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
# Return a value ONLY
# It is the init script's (or distribution's functions) responsibilty
# to log messages!
case "${retval}" in
0)

1)

3)

# 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.
;;

272

Linux From Scratch - Версия 7.3
*)

fi

}

esac

# 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
local dtime
# Process arguments
while true; do
case "${1}" in
-p)
pidfile="${2}"
shift 2
;;
*)

program="${1}"
if [ -n "${2}" ]; then
signal="${2}"
fallback=""

273

Linux From Scratch - Версия 7.3
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) responsibilty
# 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.
rm -f "${pidfile}"
# This is only a success if no signal was passed.
if [ -n "${nosig}" ]; then
return 0
else
return 7
fi
;;

3)

# Program is not running and no pidfile exists
# This is only a success if no signal was passed.
if [ -n "${nosig}" ]; then

274

Linux From Scratch - Версия 7.3
return 0

else

return 7

fi
;;
*)

esac

# 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

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

done

# 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}@@"`

275

Linux From Scratch - Версия 7.3
if [ -e "/var/run/${progname}.pid" ]; then
rm -f "/var/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 it's job, and evaluate kills return for value

}

else # check_sig_type - signal is not used to terminate program
for pid in ${pidlist}; do
kill "${signal}" "${pid}"
if [ "${?}" -ne "0" ]; then return 1; fi
done
fi

################################################################################
# pidofproc()
#
# Usage: pidofproc [-p pidfile] pathname
#
#
#
# Purpose: This function returns one or more pid(s) for a particular daemon
#
#
#
# Inputs: -p pidfile, use the specified pidfile instead of pidof
#
#
pathname, path to the specified program
#
#
#
# Return values (as defined by LSB status codes):
#
#
0 - Success (PIDs to stdout)
#
#
1 - Program is dead, PID file still exists (remaining PIDs output)
#
#
3 - Program is not running (no output)
#
################################################################################
pidofproc()
{
local pidfile
local program
local prefix
local progname
local pidlist
local lpids
local exitstatus="0"
# Process arguments
while true; do
case "${1}" in
-p)

*)

pidfile="${2}"
shift 2
;;
program="${1}"
if [ -n "${2}" ]; then
# Too many arguments
# Since this is status, return unknown
return 4
else
break
fi
;;

276

Linux From Scratch - Версия 7.3
esac

done

# If a PID file is not specified, try and find one.
if [ -z "${pidfile}" ]; then
# Get the program's basename
prefix=`echo "${program}" | sed 's/[^/]*$//'`
if [ -z "${prefix}" ]; then
progname="${program}"
else
progname=`echo "${program}" | sed "s@${prefix}@@"`
fi

fi

# If a PID file exists with that name, assume that is it.
if [ -e "/var/run/${progname}.pid" ]; then
pidfile="/var/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:
#

277

Linux From Scratch - Версия 7.3
#
0 - Status printed
#
#
1 - Input error. The daemon to check was not specified.
#
################################################################################
statusproc()
{
local pidfile
local pidlist
if [ "${#}" = "0" ]; then
echo "Usage: statusproc [-p pidfle] {program}"
exit 1
fi
# Process arguments
while true; do
case "${1}" in
-p)

*)

done

esac

pidfile="${2}"
shift 2
;;
if [ -n "${2}" ]; then
echo "Too many arguments"
return 1
else
break
fi
;;

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 "/var/run/${base}.pid" ]; then
/bin/echo -e "${WARNING}${1} is not running but" \
"/var/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

278

Linux From Scratch - Версия 7.3
################################################################################
# timespec()
#
#
#
# Purpose: An internal utility function to format a timestamp
#
#
a boot log file. Sets the STAMP variable.
#
#
#
# Return value: Not used
#
################################################################################
timespec()
{
STAMP="$(echo `date +"%b %d %T %:z"` `hostname`) "
return 0
}
################################################################################
# log_success_msg()
#
# Usage: log_success_msg ["message"]
#
#
#
# Purpose: Print a successful status message to the screen and
#
#
a boot log file.
#
#
#
# Inputs: $@ - Message
#
#
#
# Return values: Not used
#
################################################################################
log_success_msg()
{
/bin/echo -n -e "${BMPREFIX}${@}"
/bin/echo -e "${CURS_ZERO}${SUCCESS_PREFIX}${SET_COL}${SUCCESS_SUFFIX}"
# Strip non-printable characters from log file
logmessage=`echo "${@}" | sed 's/\\\033[^a-zA-Z]*.//g'`
timespec
/bin/echo -e "${STAMP} ${logmessage} OK" >> ${BOOTLOG}
}

return 0

log_success_msg2()
{
/bin/echo -n -e "${BMPREFIX}${@}"
/bin/echo -e "${CURS_ZERO}${SUCCESS_PREFIX}${SET_COL}${SUCCESS_SUFFIX}"
echo " OK" >> ${BOOTLOG}
}

return 0

################################################################################
# log_failure_msg()
#
# Usage: log_failure_msg ["message"]
#
#
#
# Purpose: Print a failure status message to the screen and
#
#
a boot log file.
#
#
#
# Inputs: $@ - Message
#
#
#
# Return values: Not used
#
################################################################################

279

Linux From Scratch - Версия 7.3
log_failure_msg()
{
/bin/echo -n -e "${BMPREFIX}${@}"
/bin/echo -e "${CURS_ZERO}${FAILURE_PREFIX}${SET_COL}${FAILURE_SUFFIX}"
# Strip non-printable characters from log file
timespec
logmessage=`echo "${@}" | sed 's/\\\033[^a-zA-Z]*.//g'`
/bin/echo -e "${STAMP} ${logmessage} FAIL" >> ${BOOTLOG}
}

return 0

log_failure_msg2()
{
/bin/echo -n -e "${BMPREFIX}${@}"
/bin/echo -e "${CURS_ZERO}${FAILURE_PREFIX}${SET_COL}${FAILURE_SUFFIX}"
echo "FAIL" >> ${BOOTLOG}
}

return 0

################################################################################
# log_warning_msg()
#
# Usage: log_warning_msg ["message"]
#
#
#
# Purpose: Print a warning status message to the screen and
#
#
a boot log file.
#
#
#
# Return values: Not used
#
################################################################################
log_warning_msg()
{
/bin/echo -n -e "${BMPREFIX}${@}"
/bin/echo -e "${CURS_ZERO}${WARNING_PREFIX}${SET_COL}${WARNING_SUFFIX}"
# Strip non-printable characters from log file
logmessage=`echo "${@}" | sed 's/\\\033[^a-zA-Z]*.//g'`
timespec
/bin/echo -e "${STAMP} ${logmessage} WARN" >> ${BOOTLOG}
}

return 0

################################################################################
# log_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'`

280

Linux From Scratch - Версия 7.3
timespec
/bin/echo -n -e "${STAMP} ${logmessage}" >> ${BOOTLOG}
}

return 0

log_info_msg2()
{
/bin/echo -n -e "${@}"
# Strip non-printable characters from log file
logmessage=`echo "${@}" | sed 's/\\\033[^a-zA-Z]*.//g'`
/bin/echo -n -e "${logmessage}" >> ${BOOTLOG}
}

return 0

################################################################################
# evaluate_retval()
#
# Usage: Evaluate a return value and print success or failyure 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} | {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 or -{signal} or {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"

281

Linux From Scratch - Версия 7.3
echo "${valsig}" | grep -- " ${1} " > /dev/null

}

if [ "${?}" -eq "0" ]; then
return 0
else
return 1
fi

################################################################################
# check_sig_type()
#
# Usage: check_signal [ -{signal} | {signal} ]
#
#
#
# Purpose: Check if signal is a program termination signal or a control signal #
#
This is not defined by any LSB draft, however, it is required to
#
#
check the signals to determine if they are intended to end a
#
#
program or simply to control it.
#
#
#
# Inputs: Accepts a single string value in the form or -{signal} or {signal}
#
#
#
# Return values:
#
#
0 - Signal is used for program termination
#
#
1 - Signal is used for program control
#
################################################################################
check_sig_type()
{
local valsig
# The list of termination signals (limited to generally used items)
valsig="-ALRM -INT -KILL -TERM -PWR -STOP -ABRT -QUIT -2 -3 -6 -9 -14 -15"
echo "${valsig}" | grep -- " ${1} " > /dev/null

}

if [ "${?}" -eq "0" ]; then
return 0
else
return 1
fi

################################################################################
# wait_for_user()
#
#
#
# Purpose: Wait for the user to respond if not a headless system
#
#
#
################################################################################
wait_for_user()
{
# Wait for the user by default
[ "${HEADLESS=0}" = "0" ] && read ENTER
return 0
}
################################################################################
# is_true()
#
#
#
# Purpose: Utility to test if a variable is true | yes | 1
#
#
#
################################################################################
is_true()
{

282

Linux From Scratch - Версия 7.3

}

[ "$1" = "1" ] || [ "$1" = "yes" ] || [ "$1" = "true" ] ||
[ "$1" = "t" ]

[ "$1" = "y" ] ||

# End /lib/lsb/init-functions

D.3. /etc/rc.d/init.d/functions
#!/bin/sh
########################################################################
# Begin boot functions
#
# Description : Run Level Control Functions
#
# Authors
: Gerard Beekmans - gerard@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
#
#
This file is only present for backward BLFS compatibility
#
########################################################################
## Environmental setup
# Setup default values for environment
umask 022
export PATH="/bin:/usr/bin:/sbin:/usr/sbin"
# Signal sent to running processes to refresh their configuration
RELOADSIG="HUP"
# Number of seconds between STOPSIG and FALLBACK when stopping processes
KILLDELAY="3"
## 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))
## Provide an echo that supports -e and -n
# If formatting is needed, $ECHO should be used
case "`echo -e -n test`" in
-[en]*)
ECHO=/bin/echo
;;
*)

283

Linux From Scratch - Версия 7.3

esac

ECHO=echo
;;

## 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

via $ECHO
$COL char
$WCOL char
line, at the 0'th char

## Set color commands, used via $ECHO
# Please consult `man console_codes for more information
# under the "ECMA-48 Set Graphics Rendition" section
#
# Warning: when switching from a 8bit to a 9bit font,
# the linux console will reinterpret the bold (1;) to
# the top 256 glyphs of the 9bit font. This does
# not affect framebuffer consoles
NORMAL="\\033[0;39m"
# Standard console grey
SUCCESS="\\033[1;32m"
# Success is green
WARNING="\\033[1;33m"
# Warnings are yellow
FAILURE="\\033[1;31m"
# Failures are red
INFO="\\033[1;36m"
# Information is light cyan
BRACKET="\\033[1;34m"
# Brackets are blue
STRING_LENGTH="0"

# the length of the current message

#*******************************************************************************
# Function - boot_mesg()
#
# Purpose:
Sending information from bootup scripts to the console
#
# Inputs:
$1 is the message
#
$2 is the colorcode for the console
#
# Outputs:
Standard Output
#
# Dependencies: - sed for parsing strings.
#
- grep for counting string length.
#
# Todo:
#*******************************************************************************
boot_mesg()
{
local ECHOPARM=""
while true
do
case "${1}" in
-n)
ECHOPARM=" -n "
shift 1
;;
-*)
echo "Unknown Option: ${1}"
return 1
;;
*)
break
;;
esac
done

284

Linux From Scratch - Версия 7.3
## Figure out the length of what is to be printed to be used
## for warning messages.
STRING_LENGTH=$((${#1} + 1))
# Print the message to the screen
${ECHO} ${ECHOPARM} -e "${2}${1}"

}

# Log the message
[ -d /run/var ] || return
${ECHO} ${ECHOPARM} -e "${2}${1}" >> /run/var/bootlog

boot_mesg_flush()
{
# Reset STRING_LENGTH for next message
STRING_LENGTH="0"
}
echo_ok()
{
${ECHO} -n -e "${CURS_UP}${SET_COL}${BRACKET}[${SUCCESS}
${ECHO} -e "${NORMAL}"
boot_mesg_flush

}

OK

${BRACKET}]"

[ -d /run/var ] || return
${ECHO} -e "[ OK ]" >> /run/var/bootlog

echo_failure()
{
${ECHO} -n -e "${CURS_UP}${SET_COL}${BRACKET}[${FAILURE} FAIL ${BRACKET}]"
${ECHO} -e "${NORMAL}"
boot_mesg_flush

}

[ -d /run/var ] || return
${ECHO} -e "[ FAIL]" >> /run/var/bootlog

echo_warning()
{
${ECHO} -n -e "${CURS_UP}${SET_COL}${BRACKET}[${WARNING} WARN ${BRACKET}]"
${ECHO} -e "${NORMAL}"
boot_mesg_flush

}

[ -d /run/var ] || return
${ECHO} -e "[ WARN ]" >> /run/var/bootlog

echo_skipped()
{
${ECHO} -n -e "${CURS_UP}${SET_COL}${BRACKET}[${WARNING} SKIP ${BRACKET}]"
${ECHO} -e "${NORMAL}"
boot_mesg_flush

}

[ -d /run/var ] || return
${ECHO} -e " [ SKIP ]" >> /run/var/bootlog

wait_for_user()
{

285

Linux From Scratch - Версия 7.3

}

# Wait for the user by default
[ "${HEADLESS=0}" = "0" ] && read ENTER

evaluate_retval()
{
error_value="${?}"
if [ ${error_value} = 0 ]; then
echo_ok
else
echo_failure
fi

}

# This prevents the 'An Unexpected Error Has Occurred' from trivial
# errors.
return 0

print_status()
{
if [ "${#}" = "0" ]; then
echo "Usage: ${0} {success|warning|failure}"
return 1
fi
case "${1}" in
success)
echo_ok
;;
warning)
# Leave this extra case in because old scripts
# may call it this way.
case "${2}" in
running)
${ECHO} -e -n "${CURS_UP}"
${ECHO} -e -n "\\033[${STRING_LENGTH}G
"
boot_mesg "Already running." ${WARNING}
echo_warning
;;
not_running)
${ECHO} -e -n "${CURS_UP}"
${ECHO} -e -n "\\033[${STRING_LENGTH}G
"
boot_mesg "Not running." ${WARNING}
echo_warning
;;
not_available)
${ECHO} -e -n "${CURS_UP}"
${ECHO} -e -n "\\033[${STRING_LENGTH}G
"
boot_mesg "Not available." ${WARNING}
echo_warning
;;
*)
# This is how it is supposed to
# be called
echo_warning
;;
esac
;;

286

Linux From Scratch - Версия 7.3
failure)
echo_failure
;;
esac
}
reloadproc()
{
local pidfile=""
local failure=0
while true
do
case "${1}" in
-p)
pidfile="${2}"
shift 2
;;
-*)
log_failure_msg "Unknown Option: ${1}"
return 2
;;
*)
break
;;
esac
done
if [ "${#}" -lt "1" ]; then
log_failure_msg "Usage: reloadproc [-p pidfile] pathname"
return 2
fi
# This will ensure compatibility with previous LFS Bootscripts
if [ -n "${PIDFILE}" ]; then
pidfile="${PIDFILE}"
fi
# Is the process running?
if [ -z "${pidfile}" ]; then
pidofproc -s "${1}"
else
pidofproc -s -p "${pidfile}" "${1}"
fi
# Warn about stale pid file
if [ "$?" = 1 ]; then
boot_mesg -n "Removing stale pid file: ${pidfile}. " ${WARNING}
rm -f "${pidfile}"
fi
if [ -n "${pidlist}" ]; then
for pid in ${pidlist}
do
kill -"${RELOADSIG}" "${pid}" || failure="1"
done
(exit ${failure})

287

Linux From Scratch - Версия 7.3
evaluate_retval

}

else
boot_mesg "Process ${1} not running." ${WARNING}
echo_warning
fi

statusproc()
{
local pidfile=""
local base=""
local ret=""
while true
do
case "${1}" in
-p)
pidfile="${2}"
shift 2
;;
-*)
log_failure_msg "Unknown Option: ${1}"
return 2
;;
*)
break
;;
esac
done
if [ "${#}" != "1" ]; then
shift 1
log_failure_msg "Usage: statusproc [-p pidfile] pathname"
return 2
fi
# Get the process basename
base="${1##*/}"
# This will ensure compatibility with previous LFS Bootscripts
if [ -n "${PIDFILE}" ]; then
pidfile="${PIDFILE}"
fi
# Is the process running?
if [ -z "${pidfile}" ]; then
pidofproc -s "${1}"
else
pidofproc -s -p "${pidfile}" "${1}"
fi
# Store the return status
ret=$?
if [ -n "${pidlist}" ]; then
${ECHO} -e "${INFO}${base} is running with Process"\
"ID(s) ${pidlist}.${NORMAL}"
else
if [ -n "${base}" -a -e "/var/run/${base}.pid" ]; then
${ECHO} -e "${WARNING}${1} is not running but"\

288

Linux From Scratch - Версия 7.3

fi

}

"/var/run/${base}.pid exists.${NORMAL}"
else
if [ -n "${pidfile}" -a -e "${pidfile}" ]; then
${ECHO} -e "${WARNING}${1} is not running"\
"but ${pidfile} exists.${NORMAL}"
else
${ECHO} -e "${INFO}${1} is not running.${NORMAL}"
fi
fi

# Return the status from pidofproc
return $ret

# The below functions aredocumented in the LSB-generic 2.1.0
#*******************************************************************************
# Function - pidofproc [-s] [-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
#
# Outputs: return 0 - Success, pid's in stdout
#
return 1 - Program is dead, pidfile exists
#
return 2 - Invalid or excessive number of arguments,
#
warning in stdout
#
return 3 - Program is not running
#
# Dependencies: pidof, echo, head
#
# Todo: Remove dependency on head
#
This replaces getpids
#
Test changes to pidof
#
#*******************************************************************************
pidofproc()
{
local pidfile=""
local lpids=""
local silent=""
pidlist=""
while true
do
case "${1}" in
-p)
pidfile="${2}"
shift 2
;;
-s)

# Added for legacy opperation of getpids
# eliminates several '> /dev/null'
silent="1"
shift 1
;;

-*)

log_failure_msg "Unknown Option: ${1}"
return 2

289

Linux From Scratch - Версия 7.3
*)
esac
done

;;
break
;;

if [ "${#}" != "1" ]; then
shift 1
log_failure_msg "Usage: pidofproc [-s] [-p pidfile] pathname"
return 2
fi
if [ -n "${pidfile}" ]; then
if [ ! -r "${pidfile}" ]; then
return 3 # Program is not running
fi
lpids=`head -n 1 ${pidfile}`
for pid in ${lpids}
do
if [ "${pid}" -ne "$$" -a "${pid}" -ne "${PPID}" ]; then
kill -0 "${pid}" 2>/dev/null &&
pidlist="${pidlist} ${pid}"
fi
if [ "${silent}" != "1" ]; then
echo "${pidlist}"
fi
test -z "${pidlist}" &&
# Program is dead, pidfile exists
return 1
# else
return 0
done
else
pidlist=`pidof -o $$ -o $PPID -x "$1"`
if [ "${silent}" != "1" ]; then
echo "${pidlist}"
fi
# Get provide correct running status
if [ -n "${pidlist}" ]; then
return 0
else
return 3
fi
fi

}

if [ "$?" != "0" ]; then
return 3 # Program is not running
fi

#*******************************************************************************
# Function - loadproc [-f] [-n nicelevel] [-p pidfile] pathname [args]
#
# Purpose: This runs the specified program as a daemon

290

Linux From Scratch - Версия 7.3
#
# Inputs: -f, run the program even if it is already running
#
-n nicelevel, specifies a nice level. See nice(1).
#
-p pidfile, uses the specified pidfile
#
pathname, pathname to the specified program
#
args, arguments to pass to specified program
#
# Outputs: return 0 - Success
#
return 2 - Invalid of excessive number of arguments,
#
warning in stdout
#
return 4 - Program or service status is unknown
#
# Dependencies: nice, rm
#
# Todo: LSB says this should be called start_daemon
#
LSB does not say that it should call evaluate_retval
#
It checks for PIDFILE, which is deprecated.
#
Will be removed after BLFS 6.0
#
loadproc returns 0 if program is already running, not LSB compliant
#
#*******************************************************************************
loadproc()
{
local pidfile=""
local forcestart=""
local nicelevel="10"
# This will ensure compatibility with previous LFS Bootscripts
if [ -n "${PIDFILE}" ]; then
pidfile="${PIDFILE}"
fi
while true
do
case "${1}" in
-f)
forcestart="1"
shift 1
;;
-n)
nicelevel="${2}"
shift 2
;;
-p)
pidfile="${2}"
shift 2
;;
-*)
log_failure_msg "Unknown Option: ${1}"
return 2 #invalid or excess argument(s)
;;
*)
break
;;
esac
done
if [ "${#}" = "0" ]; then
log_failure_msg "Usage: loadproc [-f] [-n nicelevel] [-p pidfile] pathname [args]"
return 2 #invalid or excess argument(s)
fi

291

Linux From Scratch - Версия 7.3
if [ -z "${forcestart}" ]; then
if [ -z "${pidfile}" ]; then
pidofproc -s "${1}"
else
pidofproc -s -p "${pidfile}" "${1}"
fi

fi

#
}

case "${?}" in
0)
log_warning_msg "Unable to continue: ${1} is running"
return 0 # 4
;;
1)
boot_mesg "Removing stale pid file: ${pidfile}" ${WARNING}
rm -f "${pidfile}"
;;
3)
;;
*)
log_failure_msg "Unknown error code from pidofproc: ${?}"
return 4
;;
esac

nice -n "${nicelevel}" "${@}"
evaluate_retval # This is "Probably" not LSB compliant,
but required to be compatible with older bootscripts
return 0

#*******************************************************************************
# Function - killproc [-p pidfile] pathname [signal]
#
# Purpose:
#
# Inputs: -p pidfile, uses the specified pidfile
#
pathname, pathname to the specified program
#
signal, send this signal to pathname
#
# Outputs: return 0 - Success
#
return 2 - Invalid of excessive number of arguments,
#
warning in stdout
#
return 4 - Unknown Status
#
# Dependencies: kill, rm
#
# Todo: LSB does not say that it should call evaluate_retval
#
It checks for PIDFILE, which is deprecated.
#
Will be removed after BLFS 6.0
#
#*******************************************************************************
killproc()
{
local pidfile=""
local killsig=TERM # default signal is SIGTERM
pidlist=""
# This will ensure compatibility with previous LFS Bootscripts
if [ -n "${PIDFILE}" ]; then

292

Linux From Scratch - Версия 7.3
fi

pidfile="${PIDFILE}"

while true
do
case "${1}" in
-p)
pidfile="${2}"
shift 2
;;
-*)
log_failure_msg "Unknown Option: ${1}"
return 2
;;
*)
break
;;
esac
done
if [ "${#}" = "2" ]; then
killsig="${2}"
elif [ "${#}" != "1" ]; then
shift 2
log_failure_msg "Usage: killproc
return 2
fi

[-p pidfile] pathname [signal]"

# Is the process running?
if [ -z "${pidfile}" ]; then
pidofproc -s "${1}"
else
pidofproc -s -p "${pidfile}" "${1}"
fi
# Remove stale pidfile
if [ "$?" = 1 ]; then
boot_mesg "Removing stale pid file: ${pidfile}." ${WARNING}
rm -f "${pidfile}"
fi
# If running, send the signal
if [ -n "${pidlist}" ]; then
for pid in ${pidlist}
do
kill -${killsig} ${pid} 2>/dev/null
# Wait up to 3 seconds, for ${pid} to terminate
case "${killsig}" in
TERM|SIGTERM|KILL|SIGKILL)
# sleep in 1/10ths of seconds and
# multiply KILLDELAY by 10
local dtime="${KILLDELAY}0"
while [ "${dtime}" != "0" ]
do
kill -0 ${pid} 2>/dev/null || break
sleep 0.1
dtime=$(( ${dtime} - 1))
done
# If ${pid} is still running, kill it
kill -0 ${pid} 2>/dev/null && kill -KILL ${pid} 2>/dev/null

293

Linux From Scratch - Версия 7.3
;;
esac
done
# Check if the process is still running if we tried to stop it
case "${killsig}" in
TERM|SIGTERM|KILL|SIGKILL)
if [ -z "${pidfile}" ]; then
pidofproc -s "${1}"
else
pidofproc -s -p "${pidfile}" "${1}"
fi

*)

}

# Program was terminated
if [ "$?" != "0" ]; then
# Remove the pidfile if necessary
if [ -f "${pidfile}" ]; then
rm -f "${pidfile}"
fi
echo_ok
return 0
else # Program is still running
echo_failure
return 4 # Unknown Status
fi
;;

# Just see if the kill returned successfully
evaluate_retval
;;
esac
else # process not running
print_status warning not_running
fi

#*******************************************************************************
# Function - log_success_msg "message"
#
# Purpose: Print a success message
#
# Inputs: $@ - Message
#
# Outputs: Text output to screen
#
# Dependencies: echo
#
# Todo: logging
#
#*******************************************************************************
log_success_msg()
{
${ECHO} -n -e "${BOOTMESG_PREFIX}${@}"
${ECHO} -e "${SET_COL}""${BRACKET}""[""${SUCCESS}"" OK ""${BRACKET}""]""${NORMAL}"

}

[ -d /run/var ] || return 0
${ECHO} -n -e "${@} [ OK ]"
return 0

>> /run/var/bootlog

294

Linux From Scratch - Версия 7.3
#*******************************************************************************
# Function - log_failure_msg "message"
#
# Purpose: Print a failure message
#
# Inputs: $@ - Message
#
# Outputs: Text output to screen
#
# Dependencies: echo
#
# Todo: logging
#
#*******************************************************************************
log_failure_msg() {
${ECHO} -n -e "${BOOTMESG_PREFIX}${@}"
${ECHO} -e "${SET_COL}""${BRACKET}""[""${FAILURE}"" FAIL ""${BRACKET}""]""${NORMAL}"

}

[ -d /run/var ] || return 0
${ECHO} -e "${@} [ FAIL ]" >> /run/var/bootlog
return 0

#*******************************************************************************
# Function - log_warning_msg "message"
#
# Purpose: print a warning message
#
# Inputs: $@ - Message
#
# Outputs: Text output to screen
#
# Dependencies: echo
#
# Todo: logging
#
#*******************************************************************************
log_warning_msg() {
${ECHO} -n -e "${BOOTMESG_PREFIX}${@}"
${ECHO} -e "${SET_COL}""${BRACKET}""[""${WARNING}"" WARN ""${BRACKET}""]""${NORMAL}"

}

[ -d /run/var ] || return 0
${ECHO} -e "${@} [ WARN ]" >> /run/var/bootlog
return 0

#*******************************************************************************
# Function - log_skipped_msg "message"
#
# Purpose: print a message that the script was skipped
#
# Inputs: $@ - Message
#
# Outputs: Text output to screen
#
# Dependencies: echo
#
# Todo: logging
#
#*******************************************************************************
log_skipped_msg() {

295

Linux From Scratch - Версия 7.3
${ECHO} -n -e "${BOOTMESG_PREFIX}${@}"
${ECHO} -e "${SET_COL}""${BRACKET}""[""${WARNING}"" SKIP ""${BRACKET}""]""${NORMAL}"

}

[ -d /run/var ] || return 0
${ECHO} -e "${@} [ SKIP ]" >> /run/var/bootlog
return 0

# End boot functions

D.4. /etc/rc.d/init.d/mountvirtfs
#!/bin/sh
########################################################################
# Begin mountvirtfs
#
# Description : Mount proc, sysfs, and run
#
# 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

mountvirtfs

S
Mounts
Mounts
Mounts
Mounts
LFS

/sys
/run
/sys
/run

and /proc virtual (kernel) filesystems.
(tmpfs) and /dev (devtmpfs).
and /proc virtual (kernel) filesystems.
(tmpfs) and /dev (devtmpfs).

. /lib/lsb/init-functions
case "${1}" in
start)
# Make sure /run/var is available before logging any messages
if ! mountpoint /run >/dev/null; then
mount -n /run || failed=1
fi
mkdir -p /run/var /run/lock /run/shm
chmod 1777 /run/shm
log_info_msg "Mounting virtual file systems: ${INFO}/run"
if ! mountpoint /proc >/dev/null; then
log_info_msg2 " ${INFO}/proc"
mount -n -o nosuid,noexec,nodev /proc || failed=1
fi

296

Linux From Scratch - Версия 7.3
if ! mountpoint /sys >/dev/null; then
log_info_msg2 " ${INFO}/sys"
mount -n -o nosuid,noexec,nodev /sys || failed=1
fi
if ! mountpoint /dev >/dev/null; then
log_info_msg2 " ${INFO}/dev"
mount -n -o mode=0755,nosuid /dev || failed=1
fi
# Copy devices that Udev >= 155 doesn't handle to /dev
cp -a /lib/udev/devices/* /dev
ln -sfn /run/shm /dev/shm
(exit ${failed})
evaluate_retval
exit $failed
;;
*)

esac

echo "Usage: ${0} {start}"
exit 1
;;

# End mountvirtfs

D.5. /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 sysctl

S
Loads required modules.
Loads modules listed in /etc/sysconfig/modules.
LFS

# Assure that the kernel has module support.
[ -e /proc/ksyms -o -e /proc/modules ] || exit 0

297

Linux From Scratch - Версия 7.3
. /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
egrep -qv '^($|#)' /etc/sysconfig/modules || exit 0
log_info_msg "Loading modules:"
# Only try to load modules if the user has actually given us
# some modules to load.
while read module args; do
# Ignore comments and blank lines.
case "$module" in
""|"#"*) continue ;;
esac
# Attempt to load the module, passing any arguments provided.
modprobe ${module} ${args} >/dev/null
# Print the module name if successful, otherwise take note.
if [ $? -eq 0 ]; then
log_info_msg2 " ${module}"
else
failedmod="${failedmod} ${module}"
fi
done < /etc/sysconfig/modules
# Print a message about successfully loaded modules on the correct line.
log_success_msg2
# Print a failure message with a list of any modules that
# may have failed to load.
if [ -n "${failedmod}" ]; then
log_failure_msg "Failed to load modules:${failedmod}"
exit 1
fi
;;
*)

esac

echo "Usage: ${0} {start}"
exit 1
;;

exit 0
# End modules

D.6. /etc/rc.d/init.d/udev
#!/bin/sh
########################################################################
# Begin udev
#
# Description : Udev cold-plugging script

298

Linux From Scratch - Версия 7.3
#
# Authors
: Zack Winkles, 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

udev $time
modules
S
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 stop
fi
# Udev handles uevents itself, so we don't need to have
# the kernel call out to any binary in response to them
echo > /proc/sys/kernel/hotplug
# Start the udev daemon to continually watch for, and act on,
# uevents
/lib/udev/udevd --daemon
# Now traverse /sys in order to "coldplug" devices that have
# already been discovered
/sbin/udevadm trigger --action=add
--type=subsystems
/sbin/udevadm trigger --action=add
--type=devices
/sbin/udevadm trigger --action=change --type=devices
# Now wait for udevd to process the uevents we triggered
if ! is_true "$OMIT_UDEV_SETTLE"; then
/sbin/udevadm settle
fi
# If any LVM based partitions are on the system, ensure they
# are activated so they can be used.

299

Linux From Scratch - Версия 7.3
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.7. /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
#
# 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
S
0 6
Mounts and unmounts swap partitions.
Mounts and unmounts 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
;;

300

Linux From Scratch - Версия 7.3
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.8. /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
#
# 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 BLFS

. /lib/lsb/init-functions
[ -r /etc/sysconfig/clock ] && . /etc/sysconfig/clock
case "${UTC}" in
yes|true|1)
CLOCKPARAMS="${CLOCKPARAMS} --utc"
;;

301

Linux From Scratch - Версия 7.3
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.9. /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
#
# 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:

checkfs
udev swap $time

302

Linux From Scratch - Версия 7.3
# Required-Stop:
# Should-Stop:
# Default-Start:
# Default-Stop:
# Short-Description:
# Description:
# X-LFS-Provided-By:
### END INIT INFO

S
Checks local filesystems before mounting.
Checks local filesystmes 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 stop
else
log_success_msg2
fi
if [ -f /forcefsck ]; then
msg="\n/forcefsck found, forcing file"
msg="${msg} system checks as requested."
log_success_msg "$msg"
options="-f"
else
options=""
fi
log_info_msg "Checking file systems..."
# Note: -a option used to be -p; but this fails e.g. on fsck.minix
if is_true "$VERBOSE_FSCK"; then
fsck ${options} -a -A -C -T
else
fsck ${options} -a -A -C -T >/dev/null
fi
error_value=${?}
if [ "${error_value}" = 0 ]; then
log_success_msg2
fi

303

Linux From Scratch - Версия 7.3
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 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. This 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 stop

if [ "${error_value}" -ge 16 ]; then
msg="\nFAILURE:\n\nUnexpected Failure "
msg="${msg}running fsck. Exited with error "
msg="${msg} code: ${error_value}."
log_failure_msg $msg
exit ${error_value}
fi

*)

esac

exit 0
;;
echo "Usage: ${0} {start}"
exit 1
;;

# End checkfs

304

Linux From Scratch - Версия 7.3

D.10. /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
swap
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 -n -o remount,rw / >/dev/null
evaluate_retval
# Remove fsck-related file system watermarks.
rm -f /fastboot /forcefsck
log_info_msg "Recording existing mounts in /etc/mtab..."
> /etc/mtab
mount -f /
||
mount -f /proc ||
mount -f /sys ||
mount -f /run ||
mount -f /dev ||
(exit ${failed})
evaluate_retval

failed=1
failed=1
failed=1
failed=1
failed=1

# 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..."
mount -a -O no_netdev >/dev/null
evaluate_retval

305

Linux From Scratch - Версия 7.3
exit $failed
;;
stop)
# Don't unmount tmpfs like /run
log_info_msg "Unmounting all other currently mounted file systems..."
umount -a -d -r -t notmpfs,nosysfs,nodevtmpfs,noproc >/dev/null
evaluate_retval
# 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
;;
*)

esac

echo "Usage: ${0} {start|stop}"
exit 1
;;

# End mountfs

D.11. /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
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..."

306

Linux From Scratch - Версия 7.3
# As of udev-186, the --run option is no longer valid
#rundir=$(/sbin/udevadm info --run)
rundir=/run/udev
# From Debian: "copy the rules generated before / was mounted
# read-write":
for file in ${rundir}/tmp-rules--*; do
dest=${file##*tmp-rules--}
[ "$dest" = '*' ] && break
cat $file >> /etc/udev/rules.d/$dest
rm -f $file
done
# Re-trigger the uevents that may have failed,
# in hope they will succeed now
/bin/sed -e 's/#.*$//' /etc/sysconfig/udev_retry | /bin/grep -v '^$' | \
while read line ; do
for subsystem in $line ; do
/sbin/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
/sbin/udevadm settle
fi
evaluate_retval
;;
*)

esac

echo "Usage ${0} {start}"
exit 1
;;

exit 0
# End udev_retry

D.12. /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:

cleanfs
$local_fs

307

Linux From Scratch - Версия 7.3
# Required-Stop:
# Should-Stop:
# Default-Start:
# Default-Stop:
# Short-Description:
# Description:
#
#
# X-LFS-Provided-By:
### END INIT INFO

S
Cleans temporary directories early in the boot process.
Cleans temporary directories /var/run, /var/lock, and
optionally, /tmp. cleanfs also creates /var/run/utmp
and any files defined in /etc/sysconfig/createfiles.
LFS

. /lib/lsb/init-functions
# Function to create files/directory on boot.
create_files()
{
# Input to file descriptor 9 and output to stdin (redirection)
exec 9>&0 < /etc/sysconfig/createfiles
while read name type perm usr grp dtype maj min junk
do
# Ignore comments and blank lines.
case "${name}" in
""|\#*) continue ;;
esac
# Ignore existing files.
if [ ! -e "${name}" ]; then
# Create stuff based on its type.
case "${type}" in
dir)
mkdir "${name}"
;;
file)
:> "${name}"
;;
dev)
case "${dtype}" in
char)
mknod "${name}" c ${maj} ${min}
;;
block)
mknod "${name}" b ${maj} ${min}
;;
pipe)
mknod "${name}" p
;;
*)
log_warning_msg "\nUnknown device type: ${dtype}"
;;
esac
;;
*)
log_warning_msg "\nUnknown type: ${type}"
continue
;;
esac
# Set up the permissions, too.
chown ${usr}:${grp} "${name}"
chmod ${perm} "${name}"

308

Linux From Scratch - Версия 7.3
fi
done

}

# Close file descriptor 9 (end redirection)
exec 0>&9 9>&return 0

case "${1}" in
start)
log_info_msg "Cleaning file systems:"
if [ "${SKIPTMPCLEAN}" = "" ]; then
log_info_msg2 " /tmp"
cd /tmp &&
find . -xdev -mindepth 1 ! -name lost+found -delete || failed=1
fi
> /var/run/utmp
if grep -q '^utmp:' /etc/group ; then
chmod 664 /var/run/utmp
chgrp utmp /var/run/utmp
fi
(exit ${failed})
evaluate_retval
if egrep -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.13. /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
#
########################################################################

309

Linux From Scratch - Версия 7.3
### 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
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
is_true()
{
[ "$1" = "1" ] || [ "$1" = "yes" ] || [ "$1" = "true" ]
}
failed=0
case "${1}" in
start)
# See if we need to do anything
if [ -z "${KEYMAP}"
] && [ -z "${KEYMAP_CORRECTIONS}" ] &&
[ -z "${FONT}"
] && [ -z "${LEGACY_CHARSET}"
] &&
! is_true "${UNICODE}"; then
exit 0
fi
# There should be no bogus failures below this line!
log_info_msg "Setting up Linux console..."
# Figure out if a framebuffer console is used
[ -d /sys/class/graphics/fb0 ] && use_fb=1 || use_fb=0
# Figure out the command to set the console into the
# desired mode
is_true "${UNICODE}" &&
MODE_COMMAND="echo -en '\033%G' && kbd_mode -u" ||
MODE_COMMAND="echo -en '\033%@\033(K' && kbd_mode -a"
# On framebuffer consoles, font has to be set for each vt in
# UTF-8 mode. This doesn't hurt in non-UTF-8 mode also.
! is_true "${use_fb}" || [ -z "${FONT}" ] ||
MODE_COMMAND="${MODE_COMMAND} && setfont ${FONT}"
#
#
#
#
#

Apply that command to all consoles mentioned in
/etc/inittab. Important: in the UTF-8 mode this should
happen before setfont, otherwise a kernel bug will
show up and the unicode map of the font will not be
used.

for TTY in `grep '^[^#].*respawn:/sbin/agetty' /etc/inittab |

310

Linux From Scratch - Версия 7.3
do

grep -o '\btty[[:digit:]]*\b'`

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

D.14. /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:

localnet
$local_fs

311

Linux From Scratch - Версия 7.3
# Default-Start:
# Default-Stop:
# Short-Description:
# Description:
#
# X-LFS-Provided-By:
### END INIT INFO

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
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
;;
*)

esac

echo "Usage: ${0} {start|stop|restart|status}"
exit 1
;;

exit 0
# End localnet

D.15. /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)

312

Linux From Scratch - Версия 7.3
#
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

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.16. /etc/rc.d/init.d/sysklogd
#!/bin/sh
########################################################################
# 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

313

Linux From Scratch - Версия 7.3
#
########################################################################
### 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
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
;;
*)

echo "Usage: ${0} {start|stop|reload|restart|status}"

314

Linux From Scratch - Версия 7.3

esac

exit 1
;;

exit 0
# End sysklogd

D.17. /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 swap localnet
$syslog
$local_fs swap localnet
$syslog
3 4 5
0 1 2 6
Starts and configures network interfaces.
Starts and configures network interfaces.
LFS

case "${1}" in
start)
# 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)
# Reverse list
net_files=""
for file in /etc/sysconfig/ifconfig.*

315

Linux From Scratch - Версия 7.3
do

net_files="${file} ${net_files}"
done
# Stop all network interfaces
for file in ${net_files}
do
interface=${file##*/ifconfig.}
# Skip if $file is * (because nothing was found)
if [ "${interface}" = "*" ]
then
continue
fi
/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.18. /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:

sendsignals
$local_fs swap localnet
0 6
Attempts to kill remaining processes.

316

Linux From Scratch - Версия 7.3
# Description:
# X-LFS-Provided-By:
### END INIT INFO

Attempts to kill remaining processes.
LFS

. /lib/lsb/init-functions
case "${1}" in
stop)
log_info_msg "Sending all processes the TERM signal..."
killall5 -15
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
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.19. /etc/rc.d/init.d/reboot
#!/bin/sh
########################################################################
# Begin reboot
#
# Description : Reboot Scripts
#
# Authors
: Gerard Beekmans - gerard@linuxfromscratch.org
#
DJ Lucas - dj@linuxfromscratch.org
# Update
: Bruce Dubbs - bdubbs@linuxfromscratch.org
#
# Version
: LFS 7.0
#
########################################################################

317

Linux From Scratch - Версия 7.3
### 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

reboot

6
Reboots the system.
Reboots the System.
LFS

. /lib/lsb/init-functions
case "${1}" in
stop)
log_info_msg "Restarting system..."
reboot -d -f -i
;;
*)

echo "Usage: ${0} {stop}"
exit 1
;;

esac
# End reboot

D.20. /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
#
# 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

halt

0
Halts the system.
Halts the System.
LFS

case "${1}" in

318

Linux From Scratch - Версия 7.3
stop)
halt -d -f -i -p
;;
*)

esac

echo "Usage: {stop}"
exit 1
;;

# End halt

D.21. /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..."
start_daemon fully_qualified_path
;;
stop)
log_info_msg "Stopping..."
killproc fully_qualified_path
;;
restart)
${0} stop
sleep 1
${0} start
;;

319

Linux From Scratch - Версия 7.3
*)

esac

echo "Usage: ${0} {start|stop|restart}"
exit 1
;;

exit 0
# End scriptname

D.22. /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 it's 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.23. /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 deivce
#
pipe creates a pipe, this will ignore the and
#
fields
#
and are the major and minor numbers used for

320

Linux From Scratch - Версия 7.3
#
the device.
########################################################################
# End /etc/sysconfig/createfiles

D.24. /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.25. /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
#
# Version
: LFS 7.2
#
# 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()
{
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 "\nInterface ${IFACE} doesn't exist."

321

Linux From Scratch - Версия 7.3

}

fi

exit 1

RELEASE="7.2"
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

324

Linux From Scratch - Версия 7.3
IFCONFIG=${file} /lib/services/${S} ${IFACE} down
else
MSG="Unable to process ${file}. Either "
MSG="${MSG}the SERVICE variable was not set "
MSG="${MSG}or the specified service cannot be executed."
log_failure_msg "$MSG"
exit 1
fi
else
log_warning_msg "Interface ${1} doesn't exist."
fi
# Leave the interface up if there are additional interfaces in the device
link_status=`ip link show ${IFACE} 2>/dev/null`
if [ -n "${link_status}" ]; then
if [ "$(echo "${link_status}" | grep UP)" != "" ]; then
if [ "$(ip addr show ${IFACE} | grep 'inet ')" == "" ]; then
log_info_msg "Bringing down the ${IFACE} interface..."
ip link set ${IFACE} down
evaluate_retval
fi
fi
fi
# End /sbin/ifdown

D.27. /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

325

Linux From Scratch - Версия 7.3
elif [ -n "${PREFIX}" ]; then
args="${args} ${IP}/${PREFIX}"
elif [ -n "${PEER}" ]; then
args="${args} ${IP} peer ${PEER}"
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
# Cosmetic output not needed for multiple services
if ! $(echo ${SERVICE} | grep -q " "); then
log_info_msg2 "\n" # Terminate the previous message
fi

;;

log_info_msg "Adding IPv4 address ${IP} to the ${1} interface..."
ip addr add ${args} dev ${1}
evaluate_retval
else
log_warning_msg "Cannot add IPv4 address ${IP} to ${1}. Already present."
fi

down)
if [ "$(ip addr show ${1} 2>/dev/null | grep ${IP}/)" != "" ]; then
log_info_msg "Removing IPv4 address ${IP} from the ${1} interface..."
ip addr del ${args} dev ${1}
evaluate_retval
fi

;;
*)
;;
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.28. /lib/services/ipv4-static-route
#!/bin/sh
########################################################################
# Begin /lib/services/ipv4-static-route
#
# Description : IPV4 Static Route Script

326

Linux From Scratch - Версия 7.3
#
# 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 "
;;
(*)
;;
esac

log_failure_msg "Unknown route type (${TYPE}) in ${IFCONFIG}, cannot continue."
exit 1

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 "${GATEWAY}" ]; then
log_failure_msg "GATEWAY variable missing from ${IFCONFIG}, cannot continue."
exit 1
fi
args="${args} via ${GATEWAY}"

327

Linux From Scratch - Версия 7.3
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

328

Linux From Scratch - Версия 7.3

Приложение E. Правила
конфигурации Udev
В этом приложении для справки приведены правила Udev из udev-lfs-197-2.tar.bz2.
Их установка производится по инструкциям из Раздел 6.61, «Udev-197 (Extracted
from systemd-197)».

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"
# Comms devices
KERNEL=="ippp[0-9]*",
KERNEL=="isdn[0-9]*",
KERNEL=="isdnctrl[0-9]*",
KERNEL=="dcbri[0-9]*",

GROUP="dialout"
GROUP="dialout"
GROUP="dialout"
GROUP="dialout"

329

Linux From Scratch - Версия 7.3

Приложение F. Лицензии LFS
Эта кига выпускается под лицензией Creative Commons Attribution-NonCommercialShareAlike 2.0.
Инструкции для компьютера могут быть извлечены из книги под лицензией MIT.

F.1. Creative Commons License
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.
330

Linux From Scratch - Версия 7.3
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.
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
331

Linux From Scratch - Версия 7.3
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 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.

332

Linux From Scratch - Версия 7.3
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 andDisclaimer
UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING,
LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR
WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED,
STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES
OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE,
NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS,
ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT
DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF
IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
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
333

Linux From Scratch - Версия 7.3
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.

Важно
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. The MIT License
Copyright © 1999-2013 Gerard Beekmans
334

Linux From Scratch - Версия 7.3
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.

335

Linux From Scratch - Версия 7.3

Предметный
указатель

IPRoute2: 181
Kbd: 183
Kmod: 186
Less: 178
Libpipeline: 188
Libtool: 152
Linux: 235
API headers: 89
tools, API headers: 42
M4: 145
tools: 69
Make: 189
tools: 70
Man-DB: 190
Man-pages: 91
MPC: 110
MPFR: 109
Ncurses: 120
tools: 58
Patch: 193
tools: 71
Perl: 156
tools: 72
pkgconfig: 119
Procps-ng: 129
Psmisc: 128
rc.site: 227
Readline: 148
Sed: 116
tools: 73
Shadow: 134
configuring: 135
Sysklogd: 194
configuring: 194
Sysvinit: 195
configuring: 221
Tar: 197
tools: 74
Tcl: 52
Texinfo: 198
tools: 75
Udev: 200
usage: 211
Util-linux: 123
Vim: 202
xz: 174
tools: 76
Zlib: 102

Packages
Autoconf: 159
Automake: 161
Bash: 150
tools: 59
Binutils: 104
tools, pass 1: 37
tools, pass 2: 46
Bison: 146
Bootscripts: 218
usage: 220
Bzip2: 117
tools: 60
Check: 57
Coreutils: 138
tools: 61
DejaGNU: 56
Diffutils: 163
tools: 62
E2fsprogs: 131
Expect: 54
File: 103
tools: 63
Findutils: 165
tools: 64
Flex: 167
Gawk: 164
tools: 65
GCC: 111
tools, pass 1: 39
tools, pass 2: 48
GDBM: 153
Gettext: 169
tools: 66
Glibc: 92
tools: 43
GMP: 107
Grep: 147
tools: 67
Groff: 171
GRUB: 176
Gzip: 179
tools: 68
Iana-Etc: 144
Inetutils: 154
336

Linux From Scratch - Версия 7.3

Programs

cal: 123, 124
captoinfo: 120, 122
cat: 138, 140
catchsegv: 92, 97
catman: 190, 192
cc: 111, 115
cdrom_id: 200, 201
cfdisk: 123, 124
chage: 134, 136
chattr: 131, 132
chcon: 138, 140
chcpu: 123, 124
checkmk: 57, 57
chem: 171, 171
chfn: 134, 136
chgpasswd: 134, 136
chgrp: 138, 140
chmod: 138, 140
chown: 138, 140
chpasswd: 134, 136
chroot: 138, 140
chrt: 123, 124
chsh: 134, 136
chvt: 183, 184
cksum: 138, 140
clear: 120, 122
cmp: 163, 163
code: 165, 165
col: 123, 124
colcrt: 123, 124
collect: 200, 201
colrm: 123, 124
column: 123, 124
comm: 138, 140
compile: 161, 161
compile_et: 131, 132
config.charset: 169, 169
config.guess: 161, 162
config.rpath: 169, 169
config.sub: 161, 162
config_data: 156, 157
corelist: 156, 157
cp: 138, 140
cpan: 156, 157
cpan2dist: 156, 157
cpanp: 156, 157
cpanp-run-perl: 156, 157
cpp: 111, 115
csplit: 138, 140
ctrlaltdel: 123, 124

a2p: 156, 157
accessdb: 190, 191
acinstall: 161, 161
aclocal: 161, 161
aclocal-1.13: 161, 161
addftinfo: 171, 171
addpart: 123, 124
addr2line: 104, 105
afmtodit: 171, 171
agetty: 123, 124
apropos: 190, 192
ar: 104, 105
as: 104, 105
ata_id: 200, 201
autoconf: 159, 159
autoheader: 159, 159
autom4te: 159, 159
automake: 161, 161
automake-1.13: 161, 161
autopoint: 169, 169
autoreconf: 159, 159
autoscan: 159, 159
autoupdate: 159, 160
awk: 164, 164
badblocks: 131, 132
base64: 138, 139
basename: 138, 139
bash: 150, 151
bashbug: 150, 151
bigram: 165, 165
bison: 146, 146
blkid: 123, 124
blockdev: 123, 124
bootlogd: 195, 195
bridge: 181, 182
bunzip2: 117, 118
bzcat: 117, 118
bzcmp: 117, 118
bzdiff: 117, 118
bzegrep: 117, 118
bzfgrep: 117, 118
bzgrep: 117, 118
bzip2: 117, 118
bzip2recover: 117, 118
bzless: 117, 118
bzmore: 117, 118
c++: 111, 115
c++filt: 104, 105
c2ph: 156, 157
337

Linux From Scratch - Версия 7.3
ctstat: 181, 182
cut: 138, 140
cytune: 123, 124
date: 138, 140
dd: 138, 140
deallocvt: 183, 184
debugfs: 131, 132
delpart: 123, 124
depcomp: 161, 162
depmod: 186, 187
df: 138, 140
dgawk: 164, 164
diff: 163, 163
diff3: 163, 163
dir: 138, 140
dircolors: 138, 140
dirname: 138, 140
dmesg: 123, 124
du: 138, 140
dumpe2fs: 131, 132
dumpkeys: 183, 184
e2freefrag: 131, 132
e2fsck: 131, 132
e2image: 131, 132
e2initrd_helper: 131, 133
e2label: 131, 133
e2undo: 131, 133
e4defrag: 131, 133
echo: 138, 140
egrep: 147, 147
eject: 123, 124
elfedit: 104, 105
elisp-comp: 161, 162
enc2xs: 156, 157
env: 138, 140
envsubst: 169, 169
eqn: 171, 172
eqn2graph: 171, 172
ex: 202, 204
expand: 138, 140
expect: 54, 55
expiry: 134, 136
expr: 138, 140
factor: 138, 140
faillog: 134, 136
fallocate: 123, 124
false: 138, 140
fdformat: 123, 124
fdisk: 123, 124
fgconsole: 183, 184

fgrep: 147, 147
file: 103, 103
filefrag: 131, 133
find: 165, 166
find2perl: 156, 157
findfs: 123, 124
findmnt: 123, 125
flex: 167, 168
flex++: 167, 168
flock: 123, 125
fmt: 138, 140
fold: 138, 140
frcode: 165, 166
free: 129, 130
fsck: 123, 125
fsck.cramfs: 123, 125
fsck.ext2: 131, 133
fsck.ext3: 131, 133
fsck.ext4: 131, 133
fsck.ext4dev: 131, 133
fsck.minix: 123, 125
fsfreeze: 123, 125
fstab-decode: 195, 195
fstrim: 123, 125
ftp: 154, 155
fuser: 128, 128
g++: 111, 115
gawk: 164, 164
gawk-4.0.2: 164, 164
gcc: 111, 115
gc-ar: 111, 115
gc-nm: 111, 115
gc-ranlib: 111, 115
gccbug: 111, 115
gcov: 111, 115
gdiffmk: 171, 172
gencat: 92, 97
genl: 181, 182
geqn: 171, 172
getconf: 92, 97
getent: 92, 97
getkeycodes: 183, 184
getopt: 123, 125
gettext: 169, 169
gettext.sh: 169, 169
gettextize: 169, 170
gpasswd: 134, 136
gprof: 104, 105
grap2graph: 171, 172
grcat: 164, 164
338

Linux From Scratch - Версия 7.3
grep: 147, 147
grn: 171, 172
grodvi: 171, 172
groff: 171, 172
groffer: 171, 172
grog: 171, 172
grolbp: 171, 172
grolj4: 171, 172
grops: 171, 172
grotty: 171, 172
groupadd: 134, 136
groupdel: 134, 136
groupmems: 134, 136
groupmod: 134, 136
groups: 138, 140
grpck: 134, 136
grpconv: 134, 136
grpunconv: 134, 136
grub-bios-setup: 176, 176
grub-editenv: 176, 176
grub-fstest: 176, 177
grub-install: 176, 177
grub-kbdcomp: 176, 177
grub-menulst2cfg: 176, 177
grub-mkconfig: 176, 177
grub-mkimage: 176, 177
grub-mklayout: 176, 177
grub-mknetdir: 176, 177
grub-mkpasswd-pbkdf2: 176, 177
grub-mkrelpath: 176, 177
grub-mkrescue: 176, 177
grub-mkstandalone: 176, 177
grub-ofpathname: 176, 177
grub-probe: 176, 177
grub-reboot: 176, 177
grub-script-check: 176, 177
grub-set-default: 176, 177
grub-setup: 176, 177
gtbl: 171, 172
gunzip: 179, 179
gzexe: 179, 179
gzip: 179, 179
h2ph: 156, 157
h2xs: 156, 157
halt: 195, 195
head: 138, 140
hexdump: 123, 125
hostid: 138, 141
hostname: 154, 155
hostname: 169, 170

hpftodit: 171, 172
hwclock: 123, 125
i386: 123, 125
iconv: 92, 97
iconvconfig: 92, 97
id: 138, 141
ifcfg: 181, 182
ifnames: 159, 160
ifstat: 181, 182
igawk: 164, 164
indxbib: 171, 172
info: 198, 199
infocmp: 120, 122
infokey: 198, 199
infotocap: 120, 122
init: 195, 196
insmod: 186, 187
install: 138, 141
install-info: 198, 199
install-sh: 161, 162
instmodsh: 156, 157
ionice: 123, 125
ip: 181, 182
ipcmk: 123, 125
ipcrm: 123, 125
ipcs: 123, 125
isosize: 123, 125
join: 138, 141
json_pp: 156, 157
kbdinfo: 183, 184
kbdrate: 183, 184
kbd_mode: 183, 184
kill: 123, 125
killall: 128, 128
killall5: 195, 196
klogd: 194, 194
kmod: 186, 187
last: 195, 196
lastb: 195, 196
lastlog: 134, 136
ld: 104, 106
ld.bfd: 104, 106
ldattach: 123, 125
ldconfig: 92, 97
ldd: 92, 97
lddlibc4: 92, 97
less: 178, 178
lessecho: 178, 178
lesskey: 178, 178
lex: 167, 168
339

Linux From Scratch - Версия 7.3
lexgrog: 190, 192
lfskernel-3.8.1: 235, 238
libnetcfg: 156, 157
libtool: 152, 152
libtoolize: 152, 152
link: 138, 141
linux32: 123, 125
linux64: 123, 125
lkbib: 171, 172
ln: 138, 141
lnstat: 181, 182
loadkeys: 183, 184
loadunimap: 183, 184
locale: 92, 97
localedef: 92, 97
locate: 165, 166
logger: 123, 125
login: 134, 136
logname: 138, 141
logoutd: 134, 136
logsave: 131, 133
look: 123, 125
lookbib: 171, 172
losetup: 123, 125
ls: 138, 141
lsattr: 131, 133
lsblk: 123, 125
lscpu: 123, 125
lslocks: 123, 125
lsmod: 186, 187
lzcat: 174, 174
lzcmp: 174, 174
lzdiff: 174, 174
lzegrep: 174, 174
lzfgrep: 174, 174
lzgrep: 174, 174
lzless: 174, 174
lzma: 174, 174
lzmadec: 174, 175
lzmainfo: 174, 175
lzmore: 174, 175
m4: 145, 145
make: 189, 189
makedb: 92, 97
makeinfo: 198, 199
man: 190, 192
mandb: 190, 192
manpath: 190, 192
mapscrn: 183, 184
mcookie: 123, 125

md5sum: 138, 141
mdate-sh: 161, 162
mesg: 195, 196
missing: 161, 162
mkdir: 138, 141
mke2fs: 131, 133
mkfifo: 138, 141
mkfs: 123, 125
mkfs.bfs: 123, 125
mkfs.cramfs: 123, 125
mkfs.ext2: 131, 133
mkfs.ext3: 131, 133
mkfs.ext4: 131, 133
mkfs.ext4dev: 131, 133
mkfs.minix: 123, 125
mkinstalldirs: 161, 162
mklost+found: 131, 133
mknod: 138, 141
mkswap: 123, 125
mktemp: 138, 141
mk_cmds: 131, 133
mmroff: 171, 172
modinfo: 186, 187
modprobe: 186, 187
more: 123, 125
mount: 123, 125
mountpoint: 123, 126
msgattrib: 169, 170
msgcat: 169, 170
msgcmp: 169, 170
msgcomm: 169, 170
msgconv: 169, 170
msgen: 169, 170
msgexec: 169, 170
msgfilter: 169, 170
msgfmt: 169, 170
msggrep: 169, 170
msginit: 169, 170
msgmerge: 169, 170
msgunfmt: 169, 170
msguniq: 169, 170
mtrace: 92, 97
mv: 138, 141
namei: 123, 126
ncursesw5-config: 120, 122
neqn: 171, 172
newgrp: 134, 136
newusers: 134, 136
ngettext: 169, 170
nice: 138, 141
340

Linux From Scratch - Версия 7.3
nl: 138, 141
nm: 104, 106
nohup: 138, 141
nologin: 134, 136
nproc: 138, 141
nroff: 171, 172
nscd: 92, 97
nstat: 181, 182
objcopy: 104, 106
objdump: 104, 106
od: 138, 141
oldfind: 165, 166
openvt: 183, 184
partx: 123, 126
passwd: 134, 136
paste: 138, 141
patch: 193, 193
pathchk: 138, 141
pcprofiledump: 92, 97
pdfroff: 171, 172
pdftexi2dvi: 198, 199
peekfd: 128, 128
perl: 156, 157
perl5.16.2: 156, 157
perlbug: 156, 157
perldoc: 156, 158
perlivp: 156, 158
perlthanks: 156, 158
pfbtops: 171, 172
pg: 123, 126
pgawk: 164, 164
pgawk-4.0.2: 164, 164
pgrep: 129, 130
pic: 171, 172
pic2graph: 171, 172
piconv: 156, 158
pidof: 195, 196
ping: 154, 155
ping6: 154, 155
pinky: 138, 141
pivot_root: 123, 126
pkg-config: 119, 119
pkill: 129, 130
pl2pm: 156, 158
pldd: 92, 97
pmap: 129, 130
pod2html: 156, 158
pod2latex: 156, 158
pod2man: 156, 158
pod2texi: 198, 199

pod2text: 156, 158
pod2usage: 156, 158
podchecker: 156, 158
podselect: 156, 158
post-grohtml: 171, 173
poweroff: 195, 196
pr: 138, 141
pre-grohtml: 171, 173
preconv: 171, 173
printenv: 138, 141
printf: 138, 141
prlimit: 123, 126
prove: 156, 158
prtstat: 128, 128
ps: 129, 130
psed: 156, 158
psfaddtable: 183, 184
psfgettable: 183, 184
psfstriptable: 183, 184
psfxtable: 183, 185
pstree: 128, 128
pstree.x11: 128, 128
pstruct: 156, 158
ptar: 156, 158
ptardiff: 156, 158
ptargrep: 156, 158
ptx: 138, 141
pt_chown: 92, 98
pwcat: 164, 164
pwck: 134, 136
pwconv: 134, 136
pwd: 138, 141
pwdx: 129, 130
pwunconv: 134, 136
py-compile: 161, 162
ranlib: 104, 106
raw: 123, 126
rcp: 154, 155
readelf: 104, 106
readlink: 138, 141
readprofile: 123, 126
realpath: 138, 141
reboot: 195, 196
recode-sr-latin: 169, 170
refer: 171, 173
rename: 123, 126
renice: 123, 126
reset: 120, 122
resize2fs: 131, 133
resizepart: 123, 126
341

Linux From Scratch - Версия 7.3
rev: 123, 126
rexec: 154, 155
rlogin: 154, 155
rm: 138, 141
rmdir: 138, 141
rmmod: 186, 187
rmt: 197, 197
roff2dvi: 171, 173
roff2html: 171, 173
roff2pdf: 171, 173
roff2ps: 171, 173
roff2text: 171, 173
roff2x: 171, 173
routef: 181, 182
routel: 181, 182
rpcgen: 92, 98
rsh: 154, 155
rtacct: 181, 182
rtcwake: 123, 126
rtmon: 181, 182
rtpr: 181, 182
rtstat: 181, 182
runcon: 138, 141
runlevel: 195, 196
runtest: 56, 56
rview: 202, 204
rvim: 202, 204
s2p: 156, 158
script: 123, 126
scriptreplay: 123, 126
scsi_id: 200, 201
sdiff: 163, 163
sed: 116, 116
seq: 138, 142
setarch: 123, 126
setfont: 183, 185
setkeycodes: 183, 185
setleds: 183, 185
setmetamode: 183, 185
setsid: 123, 126
setterm: 123, 126
sfdisk: 123, 126
sg: 134, 136
sh: 150, 151
sha1sum: 138, 142
sha224sum: 138, 142
sha256sum: 138, 142
sha384sum: 138, 142
sha512sum: 138, 142
shasum: 156, 158

showconsolefont: 183, 185
showkey: 183, 185
shred: 138, 142
shuf: 138, 142
shutdown: 195, 196
size: 104, 106
slabtop: 129, 130
sleep: 138, 142
sln: 92, 98
soelim: 171, 173
sort: 138, 142
sotruss: 92, 98
splain: 156, 158
split: 138, 142
sprof: 92, 98
ss: 181, 182
stat: 138, 142
stdbuf: 138, 142
strings: 104, 106
strip: 104, 106
stty: 138, 142
su: 134, 137
sulogin: 195, 196
sum: 138, 142
swaplabel: 123, 126
swapoff: 123, 126
swapon: 123, 126
switch_root: 123, 126
symlink-tree: 161, 162
sync: 138, 142
sysctl: 129, 130
syslogd: 194, 194
tabs: 120, 122
tac: 138, 142
tail: 138, 142
tailf: 123, 126
talk: 154, 155
tar: 197, 197
taskset: 123, 126
tbl: 171, 173
tc: 181, 182
tclsh: 52, 53
tclsh8.6: 52, 53
tee: 138, 142
telinit: 195, 196
telnet: 154, 155
test: 138, 142
testgdbm: 153, 153
texi2dvi: 198, 199
texi2pdf: 198, 199
342

Linux From Scratch - Версия 7.3
texi2any: 198, 199
texindex: 198, 199
tfmtodit: 171, 173
tftp: 154, 155
tic: 120, 122
timeout: 138, 142
tload: 129, 130
toe: 120, 122
top: 129, 130
touch: 138, 142
tput: 120, 122
tr: 138, 142
traceroute: 154, 155
troff: 171, 173
true: 138, 142
truncate: 138, 142
tset: 120, 122
tsort: 138, 142
tty: 138, 142
tune2fs: 131, 133
tunelp: 123, 126
tzselect: 92, 98
udevadm: 200, 201
udevd: 200, 201
ul: 123, 126
umount: 123, 126
uname: 138, 142
uncompress: 179, 179
unexpand: 138, 142
unicode_start: 183, 185
unicode_stop: 183, 185
uniq: 138, 142
unlink: 138, 142
unlzma: 174, 175
unshare: 123, 126
unxz: 174, 175
updatedb: 165, 166
uptime: 129, 130
useradd: 134, 137
userdel: 134, 137
usermod: 134, 137
users: 138, 143
utmpdump: 123, 126
uuidd: 123, 126
uuidgen: 123, 126
vdir: 138, 143
vi: 202, 204
view: 202, 204
vigr: 134, 137
vim: 202, 204

vimdiff: 202, 204
vimtutor: 202, 204
vipw: 134, 137
vmstat: 129, 130
w: 129, 130
wall: 123, 127
watch: 129, 130
wc: 138, 143
wdctl: 123, 127
whatis: 190, 192
whereis: 123, 127
who: 138, 143
whoami: 138, 143
wipefs: 123, 127
x86_64: 123, 127
xargs: 165, 166
xgettext: 169, 170
xsubpp: 156, 158
xtrace: 92, 98
xxd: 202, 204
xz: 174, 175
xzcat: 174, 175
xzcmp: 174, 175
xzdec: 174, 175
xzdiff: 174, 175
xzegrep: 174, 175
xzfgrep: 174, 175
xzgrep: 174, 175
xzless: 174, 175
xzmore: 174, 175
yacc: 146, 146
yes: 138, 143
ylwrap: 161, 162
zcat: 179, 179
zcmp: 179, 179
zdiff: 179, 179
zdump: 92, 98
zegrep: 179, 179
zfgrep: 179, 179
zforce: 179, 179
zgrep: 179, 179
zic: 92, 98
zipdetails: 156, 158
zless: 179, 180
zmore: 179, 180
znew: 179, 180
zsoelim: 190, 192

Libraries
ld.so: 92, 98
343

Linux From Scratch - Версия 7.3
libanl: 92, 98
libasprintf: 169, 170
libbfd: 104, 106
libblkid: 123, 127
libBrokenLocale: 92, 98
libbsd-compat: 92, 98
libbz2*: 117, 118
libc: 92, 98
libcheck: 57, 57
libcidn: 92, 98
libcom_err: 131, 133
libcrypt: 92, 98
libcurses: 120, 122
libdl: 92, 98
libe2p: 131, 133
libexpect-5.45: 54, 55
libext2fs: 131, 133
libfl.a: 167, 168
libform: 120, 122
libg: 92, 98
libgcc*: 111, 115
libgcov: 111, 115
libgdbm: 153, 153
libgettextlib: 169, 170
libgettextpo: 169, 170
libgettextsrc: 169, 170
libgmp: 107, 108
libgmpxx: 107, 108
libgomp: 111, 115
libhistory: 148, 149
libiberty: 104, 106
libieee: 92, 98
libkmod: 186
libltdl: 152, 152
liblto_plugin*: 111, 115
liblzma*: 174, 175
libm: 92, 98
libmagic: 103, 103
libman: 190, 192
libmandb: 190, 192
libmcheck: 92, 98
libmemusage: 92, 98
libmenu: 120, 122
libmount: 123, 127
libmp: 107, 108
libmpc: 110, 110
libmpfr: 109, 109
libmudflap*: 111, 115
libncurses: 120, 122
libnsl: 92, 98

libnss: 92, 98
libopcodes: 104, 106
libpanel: 120, 122
libpcprofile: 92, 98
libpipeline: 188
libprocps: 129, 130
libpthread: 92, 98
libquadmath*: 111, 115
libquota: 131, 133
libreadline: 148, 149
libresolv: 92, 99
librpcsvc: 92, 99
librt: 92, 99
libSegFault: 92, 98
libss: 131, 133
libssp*: 111, 115
libstdbuf.so: 138, 143
libstdc++: 111, 115
libsupc++: 111, 115
libtcl8.6.so: 52, 53
libtclstub8.6.a: 52, 53
libthread_db: 92, 99
libudev: 200, 201
libutil: 92, 99
libuuid: 123, 127
liby.a: 146, 146
libz: 102, 102
preloadable_libintl: 169, 170

Scripts
checkfs: 218, 218
cleanfs: 218, 218
console: 218, 218
configuring: 223
functions: 218, 218
halt: 218, 218
hostname
configuring: 222
ifdown: 218, 218
ifup: 218, 218
localnet: 218, 218
/etc/hosts: 210
modules: 218, 218
mountfs: 218, 218
mountkernfs: 218, 218
network: 218, 218
/etc/hosts: 210
configuring: 207
rc: 218, 219
reboot: 218, 219
344

Linux From Scratch - Версия 7.3
sendsignals: 218, 219
setclock: 218, 219
configuring: 223
static: 218, 219
swap: 218, 219
sysctl: 218, 219
sysklogd: 218, 219
configuring: 226
template: 218, 219
udev: 218, 219
udev_retry: 218, 219

Others
/boot/config-3.8.1: 235, 238
/boot/System.map-3.8.1: 235, 238
/dev/*: 80
/etc/fstab: 233
/etc/group: 87
/etc/hosts: 210
/etc/inittab: 221
/etc/inputrc: 231
/etc/ld.so.conf: 96
/etc/lfs-release: 242
/etc/localtime: 94
/etc/modprobe.d/usb.conf: 237
/etc/nsswitch.conf: 94
/etc/passwd: 87
/etc/profile: 229
/etc/protocols: 144
/etc/resolv.conf: 210
/etc/services: 144
/etc/syslog.conf: 194
/etc/udev: 200, 201
/etc/vimrc: 203
/usr/include/asm-generic/*.h: 89, 89
/usr/include/asm/*.h: 89, 89
/usr/include/drm/*.h: 89, 89
/usr/include/linux/*.h: 89, 89
/usr/include/mtd/*.h: 89, 89
/usr/include/rdma/*.h: 89, 89
/usr/include/scsi/*.h: 89, 89
/usr/include/sound/*.h: 89, 90
/usr/include/video/*.h: 89, 90
/usr/include/xen/*.h: 89, 90
/var/log/btmp: 87
/var/log/lastlog: 87
/var/log/wtmp: 87
/var/run/utmp: 87
man pages: 91, 91
345