Детальная информация о пакете находится в Разделе 6.24.2, “Contents of M4”.
Copyright © 1999–2004 Gerard Beekmans
Перевод: Сергей Каминский
При переводе был также использован текст перевода Linux From Scratch
v5.0 Виталия Катраева.
Application Binary Interface
Automated Linux From Scratch
Advanced Linux Sound Architecture
Application Programming Interface
American Standard Code for Information Interchange
Basic Input/Output System
Beyond Linux From Scratch
Berkeley Software Distribution
change root
Complementary Metal Oxide Semiconductor
Class Of Service
Central Processing Unit
Cyclic Redundancy Check
Concurrent Versions System
Dynamic Host Configuration Protocol
Domain Name Service
Enhanced Graphics Adapter
Executable and Linkable Format
End of File
equation
Enterprise Volume Management System
second extended file system
Frequently Asked Questions
Filesystem Hierarchy Standard
First-In, First Out
Fully Qualified Domain Name
File Transfer Protocol
Gibabytes
GNU Compiler Collection
Group Identifier
Greenwich Mean Time
GNU Privacy Guard
Hypertext Markup Language
Integrated Drive Electronics
Institute of Electrical and Electronic Engineers
Input/Output
Internet Protocol
Inter-Process Communication
Internet Relay Chat
International Organization for Standardization
Internet Service Provider
Kilobytes
Light Emitting Diode
Linux From Scratch
Linux Standards Base
Megabytes
Master Boot Record
Message Digest 5
Network Interface Card
Native Language Support
Network News Transport Protocol
Native POSIX Threading Library
Open Sound System
Pre-Compiled Headers
Perl Compatible Regular Expression
Process Identifier
Pure Linux From Scratch
pseudo terminal
Quality Assurance
Quality Of Service
Random Access Memory
Remote Procedure Call
Real Time Clock
Static Binutils Unit
The Santa Cruz Operation
Select Graphic Rendition
Secure-Hash Algorithm 1
Symmetric Multi-Processor
The Linux Documentation Project
Trivial File Transfer Protocol
Thread-Local Storage
User Identifier
user file-creation mask
Universal Serial Bus
Coordinated Universal Time
Universally Unique Identifier
Virtual Console
Video Graphics Array
Virtual Terminal
Мы хотим поблагодарить следующих людей и организации за их вклад в проект Linux From Scratch.
Gerard Beekmans <gerard@linuxfromscratch.org> – инициатор Linux From Scratch , организатор проекта LFS
Christine Barczak <theladyskye@linuxfromscratch.org> – редактор книги LFS
Matthew Burgess <matthew@linuxfromscratch.org> – Содержатель основного пакета LFS, технический редактор LFS.
Craig Colton <meerkats@bellsouth.net> – создатель LFS, Automated Linux From Scratch (ALFS), BLFS и проекта подсказок
Nathan Coulson <nathan@linuxfromscratch.org> – Содержатель стартовых скриптов LFS
Jeroen Coumans <jeroen@linuxfromscratch.org> – Разработчик WEB-сайта, содержатель FAQ
Bruce Dubbs <bdubbs@linuxfromscratch.org> – лидер команды LFS Quality Assurance (QA), редактор книги BLFS
Manuel Canales Esparcia <manuel@linuxfromscratch.org> – Содержатель LFS XML/XSL
Jim Gifford <jim@linuxfromscratch.org> – Технический редактор LFS, содержатель патчей
Nicholas Leippe <nicholas@linuxfromscratch.org> – Содержатель Wiki
Anderson Lizardo <lizardo@linuxfromscratch.org> – Содержатель скриптов Web-сайта
Scot Mc Pherson <scot@linuxfromscratch.org> – Содержатель LFS NNTP.
Ryan Oliver <ryan@linuxfromscratch.org> – Лидер команды тестирования, содержатель технических средств, соавтор Pure LFS (PLFS)
Alexander Patrakov <semzx@newmail.ru> – Технический редактор LFS
James Robertson <jwrober@linuxfromscratch.org> – Содержатель Bugzilla, разработчик Wiki, технический редактор LFS
Tushar Teredesai <tushar@linuxfromscratch.org> – Редактор книги BLFS, подсказок и содержатель проекта патчей
Jeremy Utley <jeremy@linuxfromscratch.org> – Технический редактор LFS, содержатель Bugzilla, содержатель LFS bootscripts, администратор сервера LFS
Zack Winkles <zwinkles@gmail.com> – Технический редактор LFS
Остальные люди с других списков рассылки LFS и BLFS, которые помогли сделать эту книгу возможной, давшие свои предложения, тестировавшие книгу и рассмотревшие сообщения об ошибках и инструкции с их опытом в установке различных пакетов.
Manuel Canales Esparcia <macana@lfs-es.org> – Испанский проект перевода LFS
Johan Lenglet <johan@linuxfromscratch.org> – Французский проект перевода LFS
Anderson Lizardo <lizardo@linuxfromscratch.org> – Португальский проект перевода LFS
Thomas Reitelbach <tr@erdfunkstelle.de> – Немецкий проект перевода LFS
Scott Kveton <scott@osuosl.org> – lfs.oregonstate.edu
Mikhail Pastukhov <miha@xuy.biz> – lfs.130th.net
William Astle <lost@l-w.net> – ca.linuxfromscratch.org
Jeremy Polen <jpolen@rackspace.com> – us2.linuxfromscratch.org
Tim Jackson <tim@idge.net> – linuxfromscratch.idge.net
Jeremy Utley <jeremy@linux-phreak.net> – lfs.linux-phreak.net
Manuel Canales Esparcia <manuel@linuxfromscratch.org> – lfsmirror.lfs-es.org
Andres Meggiotto <sysop@mesi.com.ar> – lfs.mesi.com.ar
Eduardo B. Fonseca <ebf@aedsolucoes.com.br> – br.linuxfromscratch.org
Barna Koczka <barna@siker.hu> – hu.linuxfromscratch.org
UK Mirror Service – linuxfromscratch.mirror.ac.uk
Martin Voss <Martin.Voss@ada.de> – lfs.linux-matrix.net
Guido Passet <guido@primerelay.net> – nl.linuxfromscratch.org
Bastiaan Jacques <baafie@planet.nl> – lfs.pagefault.net
Roel Neefs <lfs-mirror@linuxfromscratch.rave.org> – linuxfromscratch.rave.org
Justin Knierim <justin@jrknierim.de> – www.lfs-matrix.de
Stephan Brendel <stevie@stevie20.de> – lfs.netservice-neuss.de
Antonin Sprinzl <Antonin.Sprinzl@tuwien.ac.at> – at.linuxfromscratch.org
Fredrik Danerklint <fredan-lfs@fredan.org> – se.linuxfromscratch.org
Parisian sysadmins <archive@doc.cs.univ-paris8.fr> – www2.fr.linuxfromscratch.org
Alexander Velin <velin@zadnik.org> – bg.linuxfromscratch.org
Dirk Webster <dirk@securewebservices.co.uk> – lfs.securewebservices.co.uk
Thomas Skyt <thomas@sofagang.dk> – dk.linuxfromscratch.org
Simon Nicoll <sime@dot-sime.com> – uk.linuxfromscratch.org
Pui Yong <pyng@spam.averse.net> – sg.linuxfromscratch.org
Stuart Harris <stuart@althalus.me.uk> – lfs.mirror.intermedia.com.sg
Jason Andrade <jason@dstc.edu.au> – au.linuxfromscratch.org зеркало
Dean Benson <dean@vipersoft.co.uk> за некоторую финансовую помощь
Hagen Herrschaft <hrx@hrxnet.de> за пожертвование системы 2.2 ГГц P4, теперь запущенную под именем Lorien
VA Software кто от имени Linux.com пожертвовал рабочую станцию VA Linux 420 (разновидность StartX SP2)
Mark Stone за пожертвование Belgarath, сервера linuxfromscratch.org
Это версия 6.0 книги Linux From Scratch, датированная 6 октября 2004 года. Если эта книга более чем на два месяца старше, то возможно уже доступна более новая и лучшая ее версия. Для поиска проверьте одно из зеркал через http://www.linuxfromscratch.org/.
Ниже приведен перечень общих изменений, внесенных после выхода предыдущей версии книги.
Обновления до:
automake-1.9.1
bash-3.0
binutils-2.15.91.0.2
bison-1.875a
expect-5.42.1
file-4.10
flex-2.5.31
gawk-3.1.4
gcc-3.4.1
glibc-2.3.4-20040701
groff-1.19.1
lfs-bootscripts-2.2.2
libtool-1.5.8
linux-2.6.8.1
m4-1.4.2
man-1.5o
man-pages-1.67
perl-5.8.5
procps-3.2.3
psmisc-21.5
sed-4.1.2
tar-1.14
tcl-8.4.7
util-linux-2.12b
vim-6.3
Добавлены:
bash-3.0-display_wrap-1.patch
coreutils-5.2.1-suppress_hostname_uptime_kill_su-1.patch
flex-2.5.31-debian_fixes-2.patch
gcc-3.4.1-linkonce-1.patch
inetutils-1.4.2-kernel_headers-1.patch
iproute2-2.6.8-040823
iproute2-2.6.8_040823-remove_db-1.patch
linux-libc-headers-2.6.8.1
module-init-tools-3.0
readline-5.0
readline-5.0-display_wrap-1.patch
sysklogd-1.4.1-kernel_headers-1.patch
sysklogd-1.4.1-signal-1.patch
sysvinit-2.85-proclen-1.patch
texinfo-4.7-segfault-1.patch
udev-030
udev-config-1.permissions
udev-config-1.rules
util-linux-2.12b-sfdisk-2.patch
vim-6.3 language files
zlib-1.2.1-security-1.patch
Удалены:
bison-1.875-attribute.patch
coreutils-5.2.1-hostname-1.patch
ed-0.2
gcc-2.95.3
kbd-1.12-more-programs-1.patch
modutils-2.4.25
net-tools-1.60
net-tools-1.60-miitool-gcc33-1.patch
procinfo-18
Релиз версии 5.1.1 был 6 июня 2004 г.
Если на протяжении сборки системы LFS вы получите неожиданные ошибки, будете иметь вопрсы или найдете опечатки в книге, пожалуйста начните с консультаций в Часто Задаваемых Вопросах (FAQ) на http://www.linuxfromscratch.org/faq/.
Сервер linuxfromscratch.org размещает некоторое количество списков рассылки, используемых разработчиками проекта LFS. Эти списки включают, помимо прочего, список разработчиков и список поддержки.
За информацией о доступных списках рассылки, подписки на них, просмотра их архивов и т.п. загляните на http://www.linuxfromscratch.org/mail.html.
Множество членов сообщества LFS используют IRC сервер сообщества. Перед тем как использовать этот вид поддержки, проверьте LFS FAQ и архивы списков рассылки. Возможно, на ваш вопрос уже есть ответ. Вы сможете найти наш IRC сервер на irc.linuxfromscratch.org или irc.linux-phreak.net. Канал поддержки называется #LFS-support.
Все списки рассылки с linuxfromscratch.org также доступны в виде NNTP сервера. Все сообщения, отправленные в списки рассылки копируются в соответствующую группу новостей.
Сервер новостей доступен по адресу news.linuxfromscratch.org.
Для большей информации по пакетам, обновленным версиям и личном опыте, обращайтесь к LFS Wiki на http://wiki.linuxfromscratch.org/. Пользователи могут также добавлять здесь информацию для помощи другим в их будущей LFS-активности.
Для дополнительной информации по пакетам, полезные советы доступны на http://www.linuxfromscratch.org/~matthew/LFS-references.html.
Проект LFS имеет ряд зеркал в сети. Список текущих зеркал можно увидеть на http://www.linuxfromscratch.org/.
Мы собираемся собрать LFS-систему, используя ранее установленный дистрибутив Linux ( такой как Debian, Mandrake, Red Hat или SuSE). Эта существующая Linux система (основа) будет использована, как отправная точка, потому что вам будут необходимы некоторые программы, такие как компилятор, компоновщик (линкер) и командный интерпритатор (шелл) для сборки системы. Обычно все перечисленные средства доступны, если при установке дистрибутива вы отметили пункт "разработка"
Глава 2 этой книги описывает процесс создания нового раздела Linux native и файловой системы - места, где будет компилироваться и устанавливаться LFS система. Глава 3 описывает, какие пакеты и патчи должны быть скачаны для сборки LFS системы и как сохранить их на новой файловой системе. Глава 4 обсуждает установки для предпочтительного рабочего окружения. Пожалуйста, прочтите Главу 4 внимательно, так как она объясняет некоторые полезные вещи, которые разработчик должен знать перед началом работы с Главой 5 и последующими.
Глава 5 описывает установку ряда пакетов, которые составят среду разработки (или инструментальные средства), с помощию которой мы соберем систему в Главе 6. Некоторые из этих пакетов являются рекурсивно зависимыми - к примеру, компилятору для компиляции нужен компилятор.
Глава 5 также показывает пользователю, как собрать первый шаг инструментальных средств: Binutils и GCC. Программы из этих пакетов будут скомпонованы статически для того, чтобы обеспечить независимость при их использовании от основной системы. После этого мы соберем Glibc, библиотеку C. Glibc будет скомпилирована с использованием средств, собраных ранее. Затем мы соберем средства снова. На этот раз наши средства будут динамически скомпонованы с использованием только что собранной Glibc. Все остальные пакеты из Главы 5 будут собраны с использованием новых средств и динамически скомпонованы с использованием новой независимой от основной системы Glibc. Когда мы все сделаем, дальнейший процесс установки LFS не будет более зависеть от основного дистрибутива и запущеного ядра.
В течении этого процесса вы можете подумать, что это большая работа и почему нам надо обязательно не зависеть от основного дистрибутива? Техническое описание ответа на этот вопрос содержится в самом начале Главы 5, включая описание разницы между статически и динамически скомпоноваными программами.
В Главе 6 ваша система LFS будет собрана. С помощью программы chroot (change root) мы войдем в виртуальную среду и запустим интерпритатор shell с использованием в качестве корневой директории раздела LFS. Это намного проще перезагрузки и указаний для ядра использовать раздел LFS в качестве корневого. Помимо этого, чтобы перезагрузится, а не использовать chroot, надо создать полностью способную к загрузке систему, что мы еще не сделали к этому времени. Но главная причина использования “chroot” - это возможность использовать основную систему во время сборки LFS. Пока идет компиляция, вы можете просто переключится на другую виртуальную консоль или на X-ы (графическую среду) и продолжить нормальное использование компьютера.
В заключение установки мы установим загрузочные скрипты в Главе 7, а ядро и загрузчик мы установим в Главе 8. Глава 9 содержит некоторые моменты, которые могут вам помочь по окончании прочтения книги. В конце концов вы будете готовы перезагрузить компьютер в вашу новую LFS-систему.
Это общее описание процесса. Более детальная информация содержится в соответствующих главах и описаниях пакетов. Пункты, которые могут казаться сложными, будут разъяснены и все станет на свои места.
Для вашего удобства мы имеем дополнительный CD к этой книге, который содержит пакеты с исходниками, необходимыми для системы Linux From Scratch. CD является загружаемым и предоставляет стабильное рабочее окружение для сборки LFS. Эта книга ссылается на эту систему, как на “основную систему”.
В дополнение к средствам, необходимым для сборки LFS, основная система на CD содержит некоторые другие установленные полезные средства:
HTML версия этой книги
Окружение системы X Window
Средства для работы с интернет:
Wget (выкачивалка файлов для командной строки)
Lynx (текстовый интернет броузер)
Irssi (консольный IRC клиент)
Firefox (графический интернет броузер)
Xchat (X-ориентированный IRC клиент)
Текстовые редакторы:
Vim
Nano
Средства для работы с сетью
SSH сервер и клиент
NFS сервер и клиент
Smbmount (mount.cifs) для расшаренных Windows ресурсов
Subversion
Dhcpcd (DHCP клиент)
Программы для работы с файловыми системами
Reiserfsprogs
Xfsprogs
nALFS - средства для автоматической сборки LFS
Если проблема или вопрос неожиданно возникает во время работы с книгой, проверьте страницу FAQ на http://www.linuxfromscratch.org/faq/#generalfaq. Здесь часто уже есть ответы на возникшие вопросы. Если вы не нашли здесь ответ на свой вопрос, попробуйте найти источник проблемы. Следующие подсказки дадут вам некоторое направление для решения проблемы: http://www.linuxfromscratch.org/hints/downloads/files/errors.txt.
У нас также есть отличное сообщество LFS, которое готово предложить помощь через IRC и списки рассылки (смотри Раздел 1.3, “Ресурсы” этой книги). Для получения помощи в диагностике и решения проблемы, пожалуйста включайте всю доступную информацию в задаваемый вопрос.
Помимо краткого сообщения об ошибке, не забудьте привести следующую информацию:
Версия используемой книги (для этой 6.0)
Основной дистрибутив и его версию, используемый для сборки LFS
Пакет или раздел, с которыми у вас возникли проблемы
Сообщение об ошибке или симптомы проблемы
Отклонялись ли вы от шагов, описаных в книге.
Отклонение от этой книги не означает, что мы вам не поможем. В конце концов, LFS - это только выбор. Существование предупреждений о любых изменениях в установленной процедуре помогает нам оценивать и предупреждать возможные причины ваших проблем.
Если что-то пошло не так при выполнении скрипта configure, то посмотрите в файле config.log. Этот файл содержит ошибки, которые не были выведены на экран. Включите информацию из этого файла в просьбу о помощи.
Для того чтобы помочь нам найти причину проблемы важен как вывод на экране, так и содержание некоторых файлов. Вывод на экране скрипта ./configure и команды make содержат много полезной информации. Не стоит слепо включать в свое сообщение весь вывод, но и не следует включать слишком мало информации. Ниже приведен вывод на экран команды make:
gcc -DALIASPATH=\"/mnt/lfs/usr/share/locale:.\" -DLOCALEDIR=\"/mnt/lfs/usr/share/locale\" -DLIBDIR=\"/mnt/lfs/usr/lib\" -DINCLUDEDIR=\"/mnt/lfs/usr/include\" -DHAVE_CONFIG_H -I. -I. -g -O2 -c getopt1.c gcc -g -O2 -static -o make ar.o arscan.o commands.o dir.o expand.o file.o function.o getopt.o implicit.o job.o main.o misc.o read.o remake.o rule.o signame.o variable.o vpath.o default.o remote-stub.o version.o opt1.o -lutil job.o: In function `load_too_high': /lfs/tmp/make-3.79.1/job.c:1565: undefined reference to `getloadavg' collect2: ld returned 1 exit status make[2]: *** [make] Error 1 make[2]: Leaving directory `/lfs/tmp/make-3.79.1' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/lfs/tmp/make-3.79.1' make: *** [all-recursive-am] Error 2
В этом случае большинство людей включают в сообщение строку:
make [2]: *** [make] Error 1
Но этого недостаточно для решения проблемы потому, что это только скажет что что-то не так. В сообщение с просьбой помочь необходимо включить всю секцию вывода, т.к. она содержит выполнение команды и ее сообщения об ошибках.
В Интернете есть отличная статья о том, как надо правильно задавать вопросы, расположенная на http://catb.org/~esr/faqs/smart-questions.html. Прочтите эту статью и примите к сведению при задавании вопросов, тогда ваши шансы получить полный и квалифицированный ответ значительно возрастут.
Многие пакеты поддерживают тестирование и мы, в зависимости от его важности, будем советовать вам запускать его. Иногда пакеты выдают ошибки. Если это случилось у вас, то посмотрите страничку LFS Wiki на http://wiki.linuxfromscratch.org/. Возможно, мы уже нашли способ ее решения. Если мы уже знаем о ней, то вам не стоит беспокоится.
Теперь у нас есть пустой раздел и нам надо создать на нем файловую систему. Наиболее используемой системой в Linux является second extended file system (ext2), но современные высококачественные жесткие диски делают более популярными журналируемые файловые системы. Здесь мы создадим файловую систему ext2, но инструкции по установке других файловых систем можно найти на http://www.linuxfromscratch.org/blfs/view/svn/postlfs/filesystems.html.
Для создания файловой системы ext2 в разделе LFS необходимо выполнить:
mke2fs /dev/[xxx]
Замените [xxx] на имя вашего раздела LFS (что-то типа hda5).
Если вы создали новый своп-раздел, то вам необходимо инициализировать и его (отформатировать, как описано выше с mke2fs) запуском следующей команды. Если вы используете существующий своп-раздел, то нет необходимости его форматировать.
mkswap /dev/[yyy]
Замените [yyy] именем swap раздела.
Теперь, когда мы создали файловую систему, нам надо получить доступ к ее разделу. Для этого нам необходимо выбрать точку монтирования и примонтировать его. В этой книге подразумевается, что файловая система монтирована на /mnt/lfs, но это не обязательно, поступите как вам больше нравится.
Выберите точку монтирования и свяжите ее с переменной окружения LFS, для этого запустите:
export LFS=/mnt/lfs
Теперь нам надо создать точку монтирования для файловой системы LFS запуском:
mkdir -p $LFS mount /dev/[xxx] $LFS
Замените [xxx] на имя вашего раздела LFS.
Если вы решили использовать несколько разделов для LFS (например одну для /, другую для /usr), примонтируйте их следующим образом:
mkdir -p $LFS mount /dev/[xxx] $LFS mkdir $LFS/usr mount /dev/[yyy] $LFS/usr
Замените [xxx] и [yyy] на соответствующие имена разделов.
Вам также надо убедится, что новый раздел не примонтировался с ограничениями доступа (такие опции как nosuid, nodev или noatime). Запустите команду mount без параметров для того, чтобы увидеть с какими опциями примонтировался наш раздел. Если nosuid, nodev и/или noatime установлены, вам надо будет перемонтировать раздел снова.
Теперь у нас есть место для работы и мы готовы к закачке пакетов.
Для сборки новой Linux системы нам будет нужно некоторое место - пустой раздел диска. Если у вас дефицит свободного места, то вы можете, в принципе, собрать LFS на том же разделе, где установлен ваш нынешний дистрибутив.
Это не рекомендуется для первой установки LFS, но если у вас мало свободного места на диске - следующий документ может быть полезен: http://www.linuxfromscratch.org/hints/downloads/files/lfs_next_to_existing_systems.txt.
Для минимальной системы нам понадобится раздел около 1.2 GB. Это позволит сохранить все исходники и архивы и собрать все пакеты. Но если вы хотите установить LFS в качестве основной Linux системы, то вам, видимо, понадобятся дополнительные программы и надо будет больше места, возможно около 2 или 3 GB. Система LFS сама не занимает так много места. Большая часть этих требований к дисковому пространству предоставляет достаточную свободу для временного пространства. Сборка пакетов может требовать много дискового пространства, которое будет освобождено после установки пакетов.
Для того, чтобы вам всегда хватало памяти RAM, неплохо было бы использовать небольшой раздел диска для свопа (swap space) - это место будет использоваться ядром для сохранения редко используемых данных из памяти для увеличения объема доступной памяти за счет этого раздела. Своп может быть одним для всех ваших систем: LFS и основной, так что вам не надо создавать второй своп-раздел, если у вас уже есть один.
Программы для оперирования разделами, такие как cfdisk или fdisk запускаются с именем диска, на котором будет производится изменение - например /dev/hda для главного IDE диска. Создайте Linux native и своп разделы в случае надобности. Пожалуйста, изучите мануалы по cfdisk или fdisk если вы не знаете, как использовать эти программы.
Запомните расположение вашего нового раздела - что-то наподобие hda5. Эта книга ссылается на этот раздел как на раздел LFS. Если у вас есть своп-раздел, то запомните и его расположение. Оно нам понадобится для файла /etc/fstab file.
Помимо всех пакетов вам будут нужны некоторые патчи. Они корректируют некоторые ошибки в пакетах, которые были обнаружены, или улучшают функциональность. Патчи также делают небольшие модификации для обеспечения более легкой работы с пакетами. Следующие патчи будут нужны для сборки системы LFS:
http://www.linuxfromscratch.org/patches/lfs/6.0/bash-3.0-display_wrap-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.0/coreutils-5.2.1-suppress_uptime_kill_su-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.0/coreutils-5.2.1-uname-2.patch
http://www.linuxfromscratch.org/patches/lfs/6.0/expect-5.42.1-spawn-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.0/flex-2.5.31-debian_fixes-2.patch
http://www.linuxfromscratch.org/patches/lfs/6.0/gcc-3.4.1-linkonce-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.0/gcc-3.4.1-no_fixincludes-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.0/gcc-3.4.1-specs-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.0/inetutils-1.4.2-kernel_headers-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.0/inetutils-1.4.2-no_server_man_pages-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.0/iproute2-2.6.8_040823-remove_db-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.0/man-1.5o-80cols-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.0/mktemp-1.5-add_tempfile-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.0/perl-5.8.5-libc-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.0/readline-5.0-display_wrap-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.0/sysklogd-1.4.1-kernel_headers-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.0/sysklogd-1.4.1-signal-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.0/sysvinit-2.85-proclen-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.0/texinfo-4.7-segfault-1.patch
http://www.linuxfromscratch.org/patches/lfs/6.0/util-linux-2.12b-sfdisk-2.patch
http://www.linuxfromscratch.org/patches/lfs/6.0/zlib-1.2.1-security-1.patch
В отличие от вышеперечисленных необходимых патчей имеется некоторое количество опциональных патчей, созданных сообществом LFS. Эти опциональные патчи решают меньшие проблемы или добавляют функциональность, которая отсутствует по умолчанию. Свободно пересматривайте базу данных патчей, размещенную на http://www.linuxfromscratch.org/patches/ и получайте другие дополнительные патчи, необходимые для системы.
Скачайте или получите другим способом следующие пакеты:
ftp://ftp.linuxfromscratch.org/pub/lfs/lfs-packages/conglomeration/bison/
http://freshmeat.net/projects/file/
Пакет File (4.10) может быть недоступен, когда вы это читаете. На главных местах для скачивания удаляют старые версии пакетов. Альтернативные места для скачивания, которые могут иметь корректную версию, доступны на ftp://ftp.linuxfromscratch.org/pub/lfs/.
http://freshmeat.net/projects/glibc/
Официальные пакеты Glibc не достаточно новые для нашей задачи, поэтому создайте тарбол из подходящего Concurrent Versions System (CVS) среза следующими командами:
cvs -z 3 -d \ :pserver:anoncvs@sources.redhat.com:/cvs/glibc \ export -d glibc-2.3.4-20040701 \ -D "2004-07-01 17:30 UTC" libc sed -i -e "s/stable/2004-07-01/" \ -e "s/2\.3\.3/2.3.4/" \ glibc-2.3.4-20040701/version.h tar jcvf glibc-2.3.4-20040701.tar.bz2 \ glibc-2.3.4-20040701
Альтернативно, команда LFS собрала тарбол, который может быть скачан с любого из File Transfer Protocol (FTP) зеркал, перечисленных на сайте LFS на http://www.linuxfromscratch.org/lfs/packages.html#http. Он размещается в директории /pub/lfs/packages/conglomeration/glibc.
ftp://ftp.kernel.org/pub/linux/utils/kernel/module-init-tools/
http://downloads.linuxfromscratch.org/udev-config-2.permissions
Полный объем этих пакетов: 135 MB
Дальше будет приведен список пакетов, которые вам надо будет скачать для сборки простейшей Linux системы. Указанные версии являются версиями, о которых точно известно, что они работают, и эта книга базируется на них. Если вы не являетесь опытным установщиком LFS, мы строго рекомендуем не испытывать новые версии, так как команды сборки для них могут отличаться. Также не рекомендуется использовать последние версии пакетов из-за того, что еще неизвесно, какие проблемы может вызвать их установка и как они будут работать.
Все ссылки, по возможности, ссылаются на страницу проекта на http://www.freshmeat.net/. Страницы с Freshmeat дают простой доступ к официальным сайтам для скачивания (сайтам проектов), спискам рассылки, FAQ, спискам изменений и др.
Места для скачивания могут быть не всегда доступны. Если место для скачивания было изменено за время публикации этой книги, Google (http://www.google.com) предлагает полезную поисковую службу для большинства пакетов. Если этот поиск будет безуспешным, попробуйте один из альтернативных способов, обсуждаемых на http://www.linuxfromscratch.org/lfs/packages.html.
Вам надо сохранить скачанные пакеты и патчи так, чтобы они были доступны из точки сборки. Вам также будет нужна директория для распаковки исходников и их сборки. В книге мы используем директорию $LFS/sources как место для записи тарболов и патчей и как рабочую директорию. Это позволяет сделать их доступными из раздела LFS на всем протяжении процесса сборки системы.
Для создания директории, как пользователь root, выполните следующую команду перед началом сессии скачивания пакетов:
mkdir $LFS/sources
Сделайте эту директорию доступной для записи и приклеенной. “Приклеенность” означает, что даже если различные пользователи имеют права записи в директорию, только владелец файла может удалить файл из приклеенной директории. Следующая команда включит режим записи и приклеенности:
chmod a+wt $LFS/sources
Многие люди хотят заранее знать, сколько займет сборка и установка того или иного пакета. Но "Linux from Scratch" собирается на разных системах и невозможно точно указать этот отрезок времени: самый большой пакет (Glibc) может собраться менее чем за 20 минут на быстрой системе, но он может собираться и больше трех дней на медленной. В связи с этим мы решили использовать для указания времени сборки и установки пакета SBU (Static Binutils Unit) - время статической сборки и установки пакета Binutils.
Это используется следующим образом: первым пакетом, который нам надо будет собрать в этой книге, является статически скомпонованый Binutils в Главе 5, и время его компиляции берется за "Static Binutils Unit" или "SBU". Время компиляции всех других пакетов выражается через эту единицу.
К примеру, сборка статически скомпонованой версии GCC на первом шаге занимает 4.4 SBU. Это значит, что если вашей системе понадобилось 10 минут на сборку статической версии Binutils, то сборка GCC займет приблизительно 45 минут. Как вы увидите, время сборки большинства пакетов меньше чем у Binutils.
Примите к сведению, что если системный компилятор вашей основной системы базируется на GCC-2.x, то указанный SBU будет неверным. Это происходит по причине того, что SBU основан на самом первом из скомпилированых пакетов, который собран с помощью старого GCC, а при сборке остальной части системы будет использоваться GCC-3.4.1, который работает на 30% медленнее. Также SBU нельзя будет использовать на многопроцессорных машинах.
Для просмотра реальных времен сборки для некоторых специфичных машин мы рекомендуем http://www.linuxfromscratch.org/~bdubbs/.
Обычно SBU не является очень точной потому, что она зависит от многих факторов, не только от GCC. Здесь она обеспечивает оценку того, как долго может инсталироваться пакет, но цифры могут меняться в некоторых случаях на десятки минут.
Многие из пакетов поддерживают тестирование. Запуск его для только что собранного пакета будет хорошей идеей, так как можно будет проверить корректность компиляции. Тестирование содержит несколько тестов для проверки функциональности пакета. Это в какой-то мере может гарантировать полное отсутствие ошибок (багов) в программе.
Некоторые тестирования более важны, чем другие. К примеру, тестирование пакетов с основными средствами - GCC, Binutils и Glibc (библиотека C) - которые играют решающую роль для общей функциональности системы. Но учтите, что тестирование GCC и Glibc может занять весьма продолжительное время, особенно на медленном оборудовании.
При запуске тестов в Главе 5 не избежать того факта, что базовая система всегда оказывает некоторое воздействие на тесты в этой главе, часто означая необъяснимые ошибки. Так как средства, собранные в Главе 5, являются временными и, в конце концов, выброшенными, мы не рекомендуем запускать тесты в Главе 5 для средних читателей. Инструкции для запуска этих тестов предоставлены для пользы тестировщиков и разработчиков, но они являются исключительно опциональными.
Общей проблемой при запуске тестов для Binutils и GCC является запуск вне псевдо терминала (PTY, для краткоcти). Симптомом ее является большое количество неудачных тестов. Это может происходить по многим причинам. Наиболее распространенная - ваша основная система не имеет корректно установленной файловой системы devpts. Эта проблема детально обсуждается в Главе 5.
Иногда тесты пакета будут давать ошибки. Проконсультируйтесь в LFS Wiki на http://wiki.linuxfromscratch.org/, являются ли эти ошибки ожидаемыми.
Если вы зарегистрировались в ситеме как root, малейшая ошибка может иметь фатальные последствия для вашей системы. Поэтому мы рекомендуем собирать пакеты из этой главы под непривилегированным пользователем. Kонечно, вы можете использовать имя вашего текущего пользователя, но более простым шагом будет созданее нового пользователя lfs и новой группы (так же с именем lfs) и использовать его в процессе установки. Под правами root исполните следующие команды для добавления нового пользователя:
groupadd lfs useradd -s /bin/bash -g lfs -m -k /dev/null lfs
Обозначения опций командной строки:
Эта опция делает bash оболчкой по умолчанию для пользователя lfs.
Эта опция добавляет пользователя lfs в группу lfs.
Эта опция создает домашнюю директорию для пользователя lfs.
Этот параметр предупреждает возможное копирование файлов из скелетной директории (по умолчанию /etc/skel) изменением входящего расположения на специальное null-устройство.
Это актуальное имя для созданных группы и пользователя.
Для регистрации как lfs, дадим пользователю lfs пароль:
passwd lfs
Чтобы новый пользователь lfs получил полный доступ к директории $LFS/tools изменим ее владельца:
chown lfs $LFS/tools
Если вы создали отдельную директорию для работы, смените также и ее владельца на lfs:
chown lfs $LFS/sources
Теперь, войдем в систему как пользователь lfs. Это можно сделать через виртуальную консоль, через менеджер экрана или через команду:
su - lfs
Инструкция “-” команды su запустит новый интерпретатор командной строки.
Все программы, компилируемые в Главе 5, устанавливаются в директорию $LFS/tools для обеспечения отсутствия проблем с программами, собираемыми в Главе 6. Программы, компилируемые здесь, являются только временными средствами и не будут частью финальной LFS системы. Удерживая эти программы в отдельной директории, мы сможем легко их отбросить позднее после их использования.
Создадим требуемую директорию запуском следующей команды под пользователем root:
mkdir $LFS/tools
Теперь нам надо создать ссылку /tools на новую директорию в основной системе. Она будет указывать на только что созданную директорию на LFS разделе. Выполните следующую команду как root:
ln -s $LFS/tools /
Предыдущая команда корректна. Команда ln имеет множество различных вариантов синтаксиса и вы должны изучить man-страницу по ln прежде, чем сообщать о том, что вы считаете, что обнаружили ошибку.
Созданная ссылка разрешает временным средствам быть собранными так, что они всегда ссылаются на /tools, означая, что компилятор, ассемблер и компоновшик будут работать и в этой главе (когда мы все еще используем некоторые средства из основной системы) и в следующей (когда мы с помощью “chroot” войдем в раздел LFS).
Установим хорошее окружение, создав два новых файла для оболочки bash. Когда вы зарегистрируетесь под пользователем lfs, выполните следующую команду для создания нового файла .bash_profile:
cat > ~/.bash_profile << "EOF" exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash EOF
Когда вы регистрируетесь как пользователь lfs, первоначальной оболочкой обычно является login, которая читает файл /etc/profile основной системы (возможно содержащий некоторые установки и переменные окружения) и затем .bash_profile. Команда exec env -i.../bin/bash в файле .bash_profile заменяет запущенную оболочку на новую с полностью очищенными переменными окружения, исключая переменные HOME, TERM и PS1. Это подтверждает, что нежелательные и потенциально опасные переменные окружения из основной системы не попадут в окружение сборки. Техника, примененная здесь, преследует цель подтверждения очистки переменных окружения.
Новый образец оболочки является нерегистрированной оболочкой, которая не читает файлы /etc/profile или .bash_profile, но вместо этого читает файл .bashrc. Создадим файл .bashrc:
cat > ~/.bashrc << "EOF" set +h umask 022 LFS=/mnt/lfs LC_ALL=POSIX PATH=/tools/bin:/bin:/usr/bin export LFS LC_ALL PATH EOF
Команда set +h отключает функцию запоминания bash. Запоминание обычно является полезным расширением. Вash использует hash-таблицу для запоминания полного пути к исполняемым файлам для сокращения времени поиска и отсутствия необходимости запоминания путей этих файлов. Хотя новые средства должны быть использованы так скоро, как только они будут установлены. Отключив функцию запоминания, оболочка всегда будет искать программу по пути PATH после ее запуска. Таким образом, оболочка будет находить новые установленные средства в $LFS/tools, как только они станут доступны без запоминания предыдущей версии этих программ из другого места.
Установка маски для создания файлов пользователем (umask) в 022 позволит убедиться, что вновь созданые файлы и директории будут доступны для записи только владельцу, а для чтения и выполнения любому (по умолчанию, используя системный вызов open(2), новые файлы будут создаваться с правами доступа 644 и директории с правами доступа 755).
Переменная LFS указывает на точку монтирования, которую вы выбрали для раздела LFS.
Переменная LC_ALL контролирует локализацию некоторых программ, делает вывод их сообщений зависимым от страны. Если ваша система основана на Glibc старее версии 2.2.4, установка LC_ALL в что-то отличное от “POSIX” или “C” (на протяжении этой главы) может создать проблемы при выходе-входе в среду chroot. Установив LC_ALL в “POSIX” или “C” (что аналогично) мы страхуемся от ошибок при использовании chroot.
Мы добавляем /tools/bin в начале стандартной переменной PATH, поэтому все программы, установленные в Главе 5 будут находиться оболочкой сразу после их установки. Это в комбинации с отключением запоминания ограничит риск использования старых программ из основной системы.
В конце, для получения переменных окружения, полностью подготовленных для сборки временных средств, подключим только что созданный профиль пользователя:
source ~/.bash_profile
На протяжении этой книги, переменная окружения LFS будет использоваться несколько раз. Эта переменная всегда определена. Она должна указывать на директорию примонтированого раздела для будущей системы LFS. Проверьте, что преременная LFS установлена корректно командой:
echo $LFS
Убедимся, что вывод, показывающий путь к точке монтирования LFS раздела, соответствует /mnt/lfs, если следовать предложенному примеру. Если вывод некорректный переменная может быть установлена так:
export LFS=/mnt/lfs
Наличие этой установленной переменной выгодно в таких командах, как mkdir $LFS/tools. Оболочка будет автоматически заменять “$LFS” на “/mnt/lfs” (или на то, что описывает эта переменная) при обработке командной строки.
Не забудте проверить, что $LFS установлена всякий раз как вы покидаете и перзаходите в текущее рабочее окружение (когда выполняете “su” для root или другого пользователя).
Пакет M4 является макро процессором.
Расчетное время сборки 0.1 SBU
Требуемое место на диске 3.0 MB
M4 - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Perl и Sed
Подготавливаем M4 для компиляции:
./configure --prefix=/tools
Компилируем пакет
make
Для проверки результата вводим: make check.
Устанавливаем пакет
make install
Детальная информация о пакете находится в Разделе 6.24.2, “Contents of M4”.
Bash - это Bourne-Again SHell.
Время сборки: 1.2 SBU
Требует дискового пространства: 27 MB
Установка Bash зависит от: Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make, Ncurses и Sed.
Подготовка Bash к компиляции:
./configure --prefix=/tools --without-bash-malloc
Значение опций конфигурации:
Эта опция выключает использование функции Bash-а "memory allocation" (malloc), которая известна своей нестабильной работой. После выключения этой опции Bash будет использовать функцию malloc из Glibc, которая более стабильна.
Скомпилируем программу:
make
Для проверки результата вводим: make tests.
Установим пакет:
make install
Создадим ссылку для программ, которые используют sh в качестве шелла:
ln -s bash /tools/bin/sh
Детальная информация о пакете находится в Разделе 6.37.2, “Описание Bash”.
Binutils является колекцией средств разработки программ, содержащих компоновщик, ассемблер и другие средства для работы с объектными файлами.
Расчетное время сборки 1.0 SBU
Требуемое место на диске 194 MB
Binutils - зависимости установки: Bash, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Perl, Sed и Texinfo
Важно чтобы Binutils был первым из пакетов, которые мы установим, потому что Glibc и GCC проводят некоторые тесты на доступные компоновщик и ассемблер для определения доступных опций.
Этот пакет известен своим нестабильным поведением при компиляции с измененными опциями оптимизации (включая опции -march и -mcpu ). Binutils рекомендуется компилировать с настройками по умолчанию. Если вы задали переменные такие как CFLAGS или CXXFLAGS, изменяющие уровень оптимизации по умолчанию, рекомендуется убрать их при сборке пакета binutils. Изменяя оптимизации для binutils, вы действуете на свой страх и риск.
В документации по Binutils рекомендуется собирать Binutils вне директории с исходниками, в отдельной директории для сборки:
mkdir ../binutils-build cd ../binutils-build
Если вы хотите вычислить переменную SBU, которая используется в этой книге, вам надо засечь время, которое понадобится на сборку этого пакета. Это очень просто сделать чем-то похожим на такую команду: time { ./configure ... && ... && ... && make install; }.
Теперь подготовим Binutils к компиляции:
../binutils-2.15.91.0.2/configure --prefix=/tools \ --disable-nls
Описание используемых опций:
Это скажет скрипту конфигурации, что программы Binutils следует устанавливать в директорию /tools
Это отключит интернационализацию (сокращенно - i18n). Вопервых нам это пока не надо. А вовторых это может вызвать определенные проблемы при статической компиляции.
Вернемся к компиляции пакета:
make configure-host make LDFLAGS="-all-static"
Описание параметров сборки:
Это правильно настроит все субдиректории. Статичаская сборка без этого будет невозможна. Мы используем эту опцию для обеспечения беспроблемной работы.
Это скажет компоновщику, что все программы Binutils будут скомпонованы статически. Точнее, строго говоря, "-all-static" отсылается программе libtool , которая отсылает "-static" компоновщику.
Компиляция проведена. Обычно мы запускаем тест, но на этой ранней стадии требуемые для выполнения теста программы (Tcl, Expect и DejaGNU) еще отсутствуют на своем месте. Кроме того, запускать тест на этом этапе сборки нет смысла, т.к. мы скоро заменим binutils на втором шаге.
Устанавливаем пакет
make install
Теперь подготовим компоновщик к последующему "встраиванию" в Glibc на следующей фазе сборки:
make -C ld clean make -C ld LDFLAGS="-all-static" LIB_PATH=/tools/lib
Описание параметров сборки:
Это говорит программе сборки удалить все скомпилированые файлы в субдиректории ld.
Этот параметр пересоберет все в субдиректории ld. Указание переменной LIB_PATH файла сборки Makefile в коммандной строке заменит установленное значение по умолчанию на расположение наших временных средств. Содержимое этой переменной указывает путь по умолчанию для поиска библиотек компоновщиком.
Не удаляйте сейчас директории для сборки и исходников Binutils. Вам они еще будут нужны в этой главе далее в их теперешнем состоянии.
Детальная информация о пакете находится в Разделе 6.13.2, “Описание Binutils”.
Binutils является колекцией средств разработки программ, содержащих компоновщик, ассемблер и другие средства для работы с объектными файлами.
Расчетное время сборки 1.5 SBU
Требуемое место на диске 108 MB
Binutils - зависимости установки: Bash, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Perl, Sed и Texinfo
Этот пакет известен своим нестабильным поведением при компиляции с измененными опциями оптимизации (включая опции -march и -mcpu ) . Binutils рекомендуется компилировать с настройками по умолчанию. Если вы задали переменные такие как CFLAGS или CXXFLAGS, изменяющие уровень оптимизации по умолчанию, рекомендуется убрать их при сборке пакета binutils. Изменяя оптимизации для binutils, вы действуете на свой страх и риск.
Опять создаем отдельную директорию для сборки:
mkdir ../binutils-build cd ../binutils-build
Подготавливаем Binutils для компиляции:
../binutils-2.15.91.0.2/configure --prefix=/tools \ --enable-shared --with-lib-path=/tools/lib
Описание новых используемых опций:
Этот параметр передает скрипту конфигурации путь по умолчанию для поиска библиотек. Мы не хотим, чтобы в пути поиска оказались библиотеки из нашей основной системы.
Компилируем пакет
make
Компиляция завершена. Как было оговорено ранее, запуск теста Binutils не обязательно проводить при сборке временной системы. В любом случае для запуска теста Binutils используйте следующую команду:
make check
Устанавливаем пакет
make install
Теперь подготовим Binutils к “переопределению” средств на следующей фазе в следующей главе:
make -C ld clean make -C ld LIB_PATH=/usr/lib:/lib
Не удаляйте сейчас директории для сборки и исходников Binutils. Эти директории будут нужны в следующей части в их нынешнем состоянии.
Детальная информация о пакете находится в Разделе 6.13.2, “Описание Binutils”.
Bison является генератором парсеров. Генерирует программу, которая анализирует структуру текстового файла.
Расчетное время сборки 0.6 SBU
Требуемое место на диске 10.6 MB
Bison - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, M4, Make и Sed
Подготавливаем Bison для компиляции:
./configure --prefix=/tools
Компилируем пакет
make
Для проверки результата вводим: make check.
Устанавливаем пакет
make install
Детальная информация о пакете находится в Разделе 6.25.2, “Описание Bison”.
Bzip2 является блочным файловым архиватором который, как правило, сжимает лучше традиционного gzip.
Расчетное время сборки 0.1 SBU
Требуемое место на диске 2.5 MB
Bzip2 - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc и Make
Пакет Bzip2 не содержит скрипта configure. Компилируем его командой:
make
Устанавливаем пакет
make PREFIX=/tools install
Детальная информация о пакете находится в Разделе 6.40.2, “Описание Bzip2”.
В этой главе мы скомпилируем и установим минимальную систему Linux. Эта система будет использоваться для построения конечной LFS системы в следующей Главе 6.
Сборка этой минимальной системы будет проходить в два этапа: сначала мы соберем независящие от основной системы средства (компилятор, ассемблер, компоновщик и библиотеки), а потом используем их для сборки других средств.
Файлы, компилируемые в этой главе, устанавливаются в директорию $LFS/tools для отделения их от файлов, устанавливаемых в следующей главе. Эти пакеты просто временные, мы не будем засорять ими нашу конечную LFS систему.
Перед выполнением инструкций по сборке пакета, пакет должен быть распакован пользователем lfs и необходимо перейти в созданную директорию при помощи команды cd. Инструкции по сборке подразумевают, что вы используете интерпритатор командной строки bash.
Некоторые пакеты необходимо пропатчить перед компиляцией, но только когда это необходимо для решения тех или иных проблем. Часто патчи нужно применять в обеих главах (этой и следующей), но некоторые необходимы только в одной из глав. Поэтому не беспокойтесь, если не найдете инструкций по наложению некоторых скачаных патчей в этой главе. Сообщения с предупреждением offset или fuzz могут появляться при накладывании патчей. Это нормально и вы можете не обращать на них внимания. Все что они говорят - внимание, есть неточность, но не ошибка, в коде C или C++. Это из-за того, что меняются стандарты на язык C, а некоторые пакеты написаны в соответствии со старыми стандартами, но это не представляет проблемы для компилятора.
Если не сказано обратное, то вы можете спокойно удалить директории с исходниками и файлами сборки пакетов в целях экономии дискового пространства. Только три пакета нуждаются в сохранении директорий с исходниками и директорий для сборки без изменений для использования в дальнейшем. Об этом будут отдельные предупреждения.
Перед тем как продолжить, убедитесь, что переменная окружения LFS задана корректно выполнением команды:
echo $LFS
Вывод должен указывать на точку монтирования раздела LFS. Мы используем /mnt/lfs в качестве примера.
Пакет Coreutils содержит некоторые системные утилиты для показа и установки базовых системных характеристик.
Расчетное время сборки 0.9 SBU
Требуемое место на диске 69 MB
Coreutils - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Perl и Sed
Подготавливаем Coreutils для компиляции:
DEFAULT_POSIX2_VERSION=199209 ./configure --prefix=/tools
Успешная компиляция этого пакета будет с версией Glibc старше 2.3.2. Переменная окружения DEFAULT_POSIX2_VERSION, равная “199209”, обеспечивает обратную совместимость с предыдущими версиями Coreutils.
Компилируем пакет
make
Для проверки результата вводим: make RUN_EXPENSIVE_TESTS=yes check.
RUN_EXPENSIVE_TESTS=yes заставит запустить некоторые дополнительные тесты, которые требуют достаточно много времени на некоторых платформах. Тем не менее, это не проблема для Linux.
Устанавливаем пакет
make install
Детальная информация о пакете находится в Разделе 6.15.2, “Описание Coreutils”.
Пакет DejaGnu содержит основы для тестирования других программ.
Расчетное время сборки 0.1 SBU
Требуемое место на диске 8.6 MB
DejaGNU - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make и Sed
Подготавливаем DejaGNU для компиляции:
./configure --prefix=/tools
Собираем и инсталируем пакет:
make install
Программы из этиого пакета показывают различия между двумя файлами или директориями. Они обычно используются для создания различных патчей.
Расчетное время сборки 0.1 SBU
Требуемое место на диске 7.5 MB
Diffutils - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make и Sed
Подготавливаем Diffutils для компиляции:
./configure --prefix=/tools
Компилируем пакет
make
В этом пакете отсутствуют тесты.
Устанавливаем пакет
make install
Детальная информация о пакете находится в Разделе 6.41.2, “Описание Diffutils”.
Пакет Expect содержит программы, обеспечивающие программируемый диалог с другими интерактивными программами.
Расчетное время сборки 0.1 SBU
Требуемое место на диске 3.9 MB
Expect - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make, Sed и Tcl
Для начала наложим патч, который устранит неисправность в Expect, выдающем неверный результат при тестировании GCC.
patch -Np1 -i ../expect-5.42.1-spawn-1.patch
Теперь подготавливаем Expect для компиляции:
./configure --prefix=/tools --with-tcl=/tools/lib --with-x=no
Описание опций конфигурации:
Это скажет скрипту конфигурации искать Tcl в нашей временной директории, а не в основной системе.
Это скажет скрипту конфигурации не искать Tk (компонент Tcl GUI) или библиотеки X Window System, поскольку он найдет их на основной системе.
Соберем пакет:
make
Для проверки результата вводим: make test. Тестирование Expect известно своими ошибками из-за влияния основной системы. Таким образом отрицательные результаты тестов не будут здесь сюрпризом и не являются критичными.
Устанавливаем пакет
make SCRIPTS="" install
Описание параметров сборки:
Этот параметр запускает установку без вспомогательных скриптов, которые не нужны.
Теперь вы можете удалить директории с исходниками Tcl и Expect.
Проинсталированные программы: expect
Проинсталированные библиотеки: libexpect-5.42.a
Пакет Findutils содержит программы для поиска файлов, в том числе "на лету" (путем рекурсивного поиска от директории и показывет только файлы, удовлетворяющие параметрам поиска) или поиск через бызу данных.
Расчетное время сборки 0.2 SBU
Требуемое место на диске 7.6 MB
Findutils - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make и Sed
Подготавливаем Findutils для компиляции:
./configure --prefix=/tools
Компилируем пакет
make
Для проверки результата вводим: make check.
Устанавливаем пакет
make install
Детальная информация о пакете находится в Разделе 6.19.2, “Описание Findutils”.
Пакет Flex используется для генерации программ, которые могут обрабатывать шаблоны в тексте.
Расчетное время сборки 0.6 SBU
Требуемое место на диске 10.6 MB
Flex - зависимости установки: Bash, Binutils, Bison, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, M4, Make и Sed
Flex имеет несколько известных проблем, которые могут быть исправлены следующим патчем:
patch -Np1 -i ../flex-2.5.31-debian_fixes-2.patch
GNU autotools определит, что исходный код Flex был изменен предыдущим патчем и, соответственно, попытается обновить страницы документации. Это не работает на многих системах и основная страница остается неизменной, поэтому подтверждаем, что она не была изменена:
touch doc/flex.1
Теперь подготавливаем Flex для компиляции:
./configure --prefix=/tools
Компилируем пакет
make
Для проверки результата вводим: make check.
Устанавливаем пакет
make install
Детальная информация о пакете находится в Разделе 6.29.2, “Описание Flex”.
Gawk является вариантом awk, который используется для манипуляций с текстовыми файлами.
Расчетное время сборки 0.2 SBU
Требуемое место на диске 17 MB
Gawk - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make и Sed
Подготавливаем Gawk для компиляции:
./configure --prefix=/tools
Компилируем пакет
make
Для проверки результата (не обязательно), выполняем: make check.
Устанавливаем пакет
make install
Детальная информация о пакете находится в Разделе 6.20.2, “Описание Gawk”.
Пакет GCC содержит коллекцию компилятора GNU, включая компиляторы C и C++.
Расчетное время сборки 4.4 SBU
Требуемое место на диске 300 MB
GCC - зависимости установки: Bash, Binutils, Coreutils, Diffutils, Findutils, Gawk, Gettext, Glibc, Grep, Make, Perl, Sed и Texinfo
Распакуйте только тарбол GCC-core, нам пока не нужен компилятор C++.
Этот пакет известен своим нестабильным поведением при компиляции с измененными опциями оптимизации (включая опции -march и -mcpu). GCC рекомендуется компилировать с настройками по умолчанию. Если вы задали переменные такие как CFLAGS и CXXFLAGS, рекомендуется убрать их при сборке пакета GCC.
В документации по GCC рекомендуется собирать GCC вне директории с исходниками в отдельной директории для сборки:
mkdir ../gcc-build cd ../gcc-build
Подготавливаем GCC для компиляции:
../gcc-3.4.1/configure --prefix=/tools \ --libexecdir=/tools/lib --with-local-prefix=/tools \ --disable-nls --enable-shared --enable-languages=c
Описание опций конфигурации:
Назначение этого переключателя - исключить /usr/local/include из пути поиска включений gcc. Это не очень существенно, но мы собираемся минимизировать зависимомть от основной системы, и мы считаем, что это нужно сделать.
Этот переключатель может показаться интуитивно понятным поначалу. Но его использование допускает сборку libgcc_s.so.1 и libgcc_eh.a, а также делает libgcc_eh.a доступным для скрипта конфигурации Glibc (следующего компилируемого пакета), выдавая правильный результат. Заметьте, что бинарники компонуются статически, если это задано значением -static для переменной BOOT_LDFLAGS далее.
Эта опция позволяет быть увереным, что будет собран только компилятор C. Она нужна только в том случае, если вы скачали и распаковали полный тарбол.
Продолжим компиляцию пакета:
make BOOT_LDFLAGS="-static" bootstrap
Описание параметров сборки:
Это скажет GCC компоновать программы статически.
Этот параметр заставляет не просто компилироваться GCC, а компилироваться несколько раз. Программы, скомпилированые сначала используются для компиляции программ еще раз, а те, в свою очередь, используются при компиляции в третий раз. Идентичность второй и третьей компиляции позволяет убедиться в корректности сборки.
Компиляция проведена. На этом этапе обычно выполняется тест, но как было сказано ранее, мы еще не имеем полного набора тестовых утилит на своем месте. Кроме того, смысл запуска теста на этом этапе минимален т.к. программы, собранные на этом шаге скоро будут заменены.
Устанавливаем пакет
make install
Многие программы и скрипты используют cc вместо gcc для обеспечения переносимости программ на все Unix системы. Не у всех установлен именно компилятор GNU C. Запуск cc позволяет администратору выбирать, какой компилятор C устанавливать в систему, и мы создаем ссылку на него:
ln -s gcc /tools/bin/cc
Детальная информация о пакете находится в Разделе 6.14.2, “Contents of GCC”.
Расчетное время сборки 11.0 SBU
Требуемое место на диске 274 MB
GCC - зависимости установки: Bash, Binutils, Coreutils, Diffutils, Findutils, Gawk, Gettext, Glibc, Grep, Make, Perl, Sed и Texinfo
Этот пакет известен своим нестабильным поведением при компиляции с измененными опциями оптимизации (включая опции -march и -mcpu). GCC рекомендуется компилировать с настройками по умолчанию. Если вы задали переменные такие как CFLAGS и CXXFLAGS, рекомендуется убрать их при сборке пакета GCC.
Средства, необходимые для тестирования GCC и Binutils, теперь установлены (Tcl, Expect и DejaGnu). Мы можем вернуться к пересборке GCC и Binutils, соединить их с новым Glibc и правильно их протестировать. Но есть одно замечание: тестирование сильно зависит от правильного функционирования псевдо терминалов (PTY) из основной системы. На данный момент PTY осуществляется с помощью файловой системы devpts. Вы можете быстро проверить правильность установки системы командой:
expect -c "spawn ls"
Если вы получили ответ:
The system has no more ptys. Ask your system administrator to create more.
Ваш основной дистрибутив не поддерживает операции PTY. В этом случае здесь не место запуску тестирования для GCC и Binutils и вы можете пропустить его. Вы можете проконсультироваться в LFS Wiki на http://wiki.linuxfromscratch.org/ для более подробной информации о работе с PTY.
Распакуйте все три тарбола GCC (-core, -g++ и -testsuite) в одной рабочей директории. Они распакуются в одну общую поддиректорию gcc-3.4.1/
Для начала исправим одну проблему и создадим необходимую сборку:
patch -Np1 -i ../gcc-3.4.1-no_fixincludes-1.patch patch -Np1 -i ../gcc-3.4.1-specs-1.patch
Первый патч отключит скрипт GCC fixincludes. Мы расскажем об этом вкратце, не вдаваясь в подробности. При нормальных обстоятельствах скрипт GCC fixincludes сканирует вашу систему на файлы заголовков Glibc, нуждающиеся в исправлении, исправляет их и переносит их в директорию включений для GCC. В Главе 6, после установки нового Glibc, эта директория будет найдена, в результате чего GCC найдет заголовки основной системы и мы не сможем корректно использовать Glibc в системе LFS.
Второй патч изменяет расположение по умолчанию для динамического компоновщика GCC (обычно ld-linux.so.2). Он также удаляет /usr/include из пути для поиска GCC. Пропатчивание spec-файла сейчас позволит убедиться, что собираемый GCC будет использовать наш новый динамический компоновщик. То есть, наши окончательные (и временные) бинарники будут скомпонованы с новым Glibc.
Эти патчи критичны для правильной сборки. Не забудьте применить их.
Создайте отдельную директорию для сборки и перейдите в нее:
mkdir ../gcc-build cd ../gcc-build
Перед началом сборки GCC не забудьте дезактивировать все переменные окружения, в которых были изменены флаги оптимизации.
Теперь подготавливаем GCC для компиляции:
../gcc-3.4.1/configure --prefix=/tools \ --libexecdir=/tools/lib --with-local-prefix=/tools \ --enable-clocale=gnu --enable-shared \ --enable-threads=posix --enable-__cxa_atexit \ --enable-languages=c,c++ --disable-libstdcxx-pch
Описание новых опций конфигурации:
Эта опция позволяет убедиться в корректном выборе модели локали для библиотек C++ во всех обстоятельствах. Если скрипт конфигурации найдет установленную локаль de_DE, он выберет корректную модель. Тем не менее, если локаль de_DE не установлена, есть риск собрать Application Binary Interface (ABI)-несовместимые библиотеки C++ из-за неверной модели локали в общем случае.
Подключит расширение C++ для мультилинейного кода.
Эта опция разрешит использование __cxa_atexit, которое предпочтительнее использования atexit, для регистрации деструкторов C++ для локальных и глобальных объектов для обеспечения полного соответствия стандартам ссылок на деструкторы. Он также повлияет на C++ ABI и некоторые другие результаты в библиотеках C++ и программах C++, которые взаимодействуют с другими дистрибутивами Linux.
Эта опция позволяет убедиться, что будут собраны компиляторы C и C++.
Не собирать предкомпилированные заголовки (PCH) для libstdc++. Они занимают некоторое место и мы не хотим их использовать.
Компилируем пакет
make
Здесь нет необходимости использовать bootstrap, так как мы компилируем этот GCC с помощью той же самой версии GCC, но установленой ранее.
Компиляция проведена. Как было сказано ранее, запуск теста для временной сборки в этой части проводить не обязательно. В любом случае, для запуска теста GCC используйте следующую команду:
make -k check
Флаг -k используется для того, чтобы тестирование не прекратилось после первого отрицательного результата, а проводило дальнейшие тесты. Тестирование GCC довольно исчерпывающее, и поэтому мы практически гарантировано получим пару отрицательных результатов тестов. Для просмотра результатов тестирования выполните команду:
../gcc-3.4.1/contrib/test_summary | more
Вы можете сравнить ваши результаты с результатами из списка рассылки для того, чтобы найти аналогичные вашим. К примеру, посмотреть результаты тестирования GCC-3.3.1 на i686-pc-linux-gnu можно на http://gcc.gnu.org/ml/gcc-testresults/2004-07/msg00179.html.
Неожиданные отрицательные результаты также не могут быть проигнорированы. Разработчики GCC обычно знают о них, но пока не могут исправить. В общем, проверьте результаты, как было описано выше. Если все в порядке, то можно продолжать.
Устанавливаем пакет
make install
В этом месте рекомендуется повторить простой тест, описаный ранее. Вернитесь к Разделу 5.9, “Интеграция Glibc”, и повторите проверку. Если она не удалась, видимо, вы забыли наложить вышеупомянутый патч GCC Specs.
Детальная информация о пакете находится в Разделе 6.14.2, “Описание GCC”.
Пакет Gettext используется для интернационализации и локализации. Программы могут быть скомпилированы с поддержкой родного языка (Native Language Support - NLS) для получения возможности вывода сообщений на языке пользователя.
Расчетное время сборки 0.5 SBU
Требуемое место на диске 55 MB
Gettext - зависимости установки: Bash, Binutils, Bison, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make и Sed
Подготавливаем Gettext для компиляции:
./configure --prefix=/tools --disable-libasprintf \ --disable-csharp
Описание опций конфигурации:
Этот флаг говорит Gettext не собирать библиотеку asprintf. Так как ничто в этой и следующей части не требует эту библиотеку и Gettext будет пересобран позднее, исклюючим эту библиотеку для экономии места и времени.
Говорит Gettext не использовать компилятор C#, даже если компилятор C# проинсталирован в системе. Это необходимо выполнить, так как однажды мы войдем в chroot-окружение и C# не будет более доступным
Компилируем пакет
make
Для проверки результата вводим: make check.
Тестирование Gettext занимает много времени, около 7 SBU. Тестирование Gettext в этой главе может не пройти успешно из-за зависимостей от основной системы - к примеру, если будет найден компилятор Java. Экспериментальный патч, исключающий Java, доступен в проэкте LFS Patches на http://www.linuxfromscratch.org/patches/.
Устанавливаем пакет
make install
Детальная информация о пакете находится в Разделе 6.30.2, “Описание Gettext”.
Glibc является библиотекой C, которая обеспечивает системные вызовы и основные функции, такие как open, malloc, printf и т.д. Библиотека C используется для всех динамически скомпонованых программ.
Расчетное время сборки 11.8 SBU
Требуемое место на диске 800 MB
Glibc - зависимости установки: Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Gettext, Grep, Make, Perl, Sed и Texinfo
Этот пакет известен своим нестабильным поведением при компиляции с измененными опциями оптимизации (включая опции -march и -mcpu). Если вы задали переменные окружения, такие как CFLAGS и CXXFLAGS, рекомендуется убрать их при сборке Glibc.
Изменяя флаги оптимизации для glibc, вы действуете на свой страх и риск.
Документация по Glibc рекомендует собирать Glibc вне директории с исходниками, в отдельной директории для сборки:
mkdir ../glibc-build cd ../glibc-build
Далее, подготовим Glibc к компиляции:
../glibc-2.3.4-20040701/configure --prefix=/tools \ --disable-profile --enable-add-ons=nptl --with-tls \ --with-__thread --enable-kernel=2.6.0 \ --with-binutils=/tools/bin --without-gd --without-cvs \ --with-headers=/tools/glibc-kernheaders
Описание опций конфигурации:
Отключает сборку библиотек с использованием профильной информации. Опустите эту опцию, если собираетесь испольховать профили.
Говорит Glibc использовать дополнение NPTL к библиотеке.
Говорит Glibc включить поддержку для Thread-Local Storage (TLS). Это необходимо для нормальной работы NPTL.
Эта опция говорит Glibc включить поддержку нитей. Это необходимо для правильной сборки TLS.
Эта опция говорит Glibc компилировать библиотеку с поддержкой 2.6.x Линукс ядер.
Эта опция необязательна, но она позволяют нам удостовериться, что будут использована нужная программа Binutils для сборки Glibc.
Эта опция запрещает сборку программы memusagestat, которая пытается связаться с библиотеками основной системы (libgd, libpng, libz, и т.д.).
Эта опция запрещает использование файлов Makefile из тестовых CVS версий, когда используется CVS. Пока эта команда не обязательна, она рекомендуется.
Эта опция говорит Glibc компилироваться с использованием “сырых” заголовков ядра, так что точно известно, какие функции имеет ядро и, таким образом, может себя оптимизировать.
На этом шаге вы можете увидеть следующее предупреждение:
configure: WARNING: *** These auxiliary programs are missing or *** incompatible versions: msgfmt *** some features will be disabled. *** Check the INSTALL file for required versions.
Отсутствующая или несовместимая программа msgfmt безвредна, но может привести к определенным проблемам при тестировании. Эта программа msgfmt является частью пакета Gettext, который используется из дистрибутива основной системы. Если msgfmt имеется, но считается несовместимой, обновите пакет Gettext из основной системы или продолжайте без него.
Компилируем пакет
make
Компиляция проведена. Как было сказано ранее, запуск теста для временной сборки в этой части проводить не обязательно. В любом случае, для запуска теста Glibc используйте следующую команду:
make check
Для обсуждения особо выжных ошибок тестирования, смотрите Раздел 6.11, “Glibc-2.3.4-20040701.”
В этой части некоторые тесты могут быть неспособны дать положительный результат при использовании имеющихся приложений или переменных окружения базовой системы. Ошибки тестов Glibc в этой части, обычно, не должны беспокоить. Glibc, проинсталированные в Главе 6, будут полностью готовы к использованию. Но имейте в виду, что при прохождении тестов (даже в Главе 6), некоторые ошибки все еще могут появляться, например в тесте math.
Когда вы получите сообщение о непрохождении теста, запомните его, а затем продолжите тестирование дальше, опять выполнив команду make check. Скрипт тестирования запоминает пройденые тесты для возможности его продолжения после выхода из-за ошибки. Вы можете использовать эту возможность "запуска-остановки" автоматически с помощью команды make -k check. Если вы так сделаете, проверьте логи тестирования и посмотрите общее количество и причины проваленных тестов.
Этап инсталляции Glibc будет иметь предупреждение в конце об отсутствии /tools/etc/ld.so.conf. Упредим это сообщение:
mkdir /tools/etc touch /tools/etc/ld.so.conf
Устанавливаем пакет
make install
Разные страны и культуры имеют различные соглашения для коммуникаций. Эти соглашения состоят как из очень простых, таких как форматы даты и времени, так и из более сложных, таких как разговорный язык. “Интернационализация” программ GNU работает с помощью локалей (locales).
Если тест не был запущен в этой части (как в рекомендации), нет необходимости в инсталяции локалей сейчас. Необходимые локали будут установлены в следующей части.
Для установки Glibc локалей в любом случае,используйте следующую команду:
make localedata/install-locales
Альтернативой запуску предыдущей команды для экономии времени является установка только определенных локалей, тех которые вам нужны. Это может быть достигнуто использованием команды localedef command. Информацию об использовании этой команды можно получить из файла INSTALL в исходниках Glibc. Тем не менее, список локалей может быть существенным для некоторых тестов, в частности, теста libstdc++ из GCC. Следующие команды, используемые вместо вышеописаной install-locales установят минимальный набор локалей для успешного завершения тестирований:
mkdir -p /tools/lib/locale localedef -i de_DE -f ISO-8859-1 de_DE localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro localedef -i en_HK -f ISO-8859-1 en_HK localedef -i en_PH -f ISO-8859-1 en_PH localedef -i en_US -f ISO-8859-1 en_US localedef -i es_MX -f ISO-8859-1 es_MX localedef -i fa_IR -f UTF-8 fa_IR localedef -i fr_FR -f ISO-8859-1 fr_FR localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro localedef -i it_IT -f ISO-8859-1 it_IT localedef -i ja_JP -f EUC-JP ja_JP
Детальная информация о пакете находится в Разделе 6.11.4, “Описание Glibc”.
Grep является программой для поиска в содержимом файлов.
Расчетное время сборки 0.1 SBU
Требуемое место на диске 5.8 MB
Grep - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Make, Sed и Texinfo
Подготавливаем Grep для компиляции:
./configure --prefix=/tools \ --disable-perl-regexp --with-included-regex
Описание параметров конфигурации:
Это позволит убедиться, что grep не будет скомпонован с использованием библиотеки PCRE, которая может присутствовать в основной системе, но не будет доступна из среды chroot.
Это позволит убедиться, что Grep использует внутренние регулярные выражения. В противном случае он будет использовать код из Glibc, который может содержать ошибки.
Компилируем пакет
make
Для проверки результата вводим: make check.
Устанавливаем пакет
make install
Детальная информация о пакете находится в Разделе 6.44.2, “Описание Grep”.
Пакет Gzip содержит программы для сжатия и распаковки файлов.
Расчетное время сборки 0.1 SBU
Требуемое место на диске 2.6 MB
Gzip - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make и Sed
Подготавливаем Gzip для компиляции:
./configure --prefix=/tools
Компилируем пакет
make
В пакете отсутствует тест сборки.
Устанавливаем пакет
make install
Детальная информация о пакете находится в Разделе 6.46.2, “Описание Gzip”.
Пакет Make содержит программу для компиляции больших приложений.
Расчетное время сборки 0.2 SBU
Требуемое место на диске 8.8 MB
Make - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep и Sed
Подготавливаем Make для компиляции:
./configure --prefix=/tools
Компилируем пакет
make
Для проверки результата вводим: make check.
Устанавливаем пакет
make install
Детальная информация о пакете находится в Разделе 6.48.2, “Описание Make”.
Программа Patch содержит программу для модификации файлов.
Расчетное время сборки 0.1 SBU
Требуемое место на диске 1.9 MB
Patch - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make и Sed
Подготавливаем Patch для компиляции:
CPPFLAGS=-D_GNU_SOURCE ./configure --prefix=/tools
Флаг препроцессора -D_GNU_SOURCE нужен только на платформах PowerPC. На других платформах вы можете его пропустить.
Компилируем пакет
make
Устанавливаем пакет
make install
Детальная информация о пакете находится в Разделе 6.50.2, “Описание Patch”.
Sed является редактором потоков.
Расчетное время сборки 0.2 SBU
Требуемое место на диске 5.2 MB
Sed - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make и Texinfo
Подготавливаем Sed для компиляции:
./configure --prefix=/tools
Компилируем пакет
make
Для проверки результата вводим: make check.
Устанавливаем пакет
make install
Детальная информация о пакете находится в Разделе 6.28.2, “Contents of Sed”.
Tar является программой архивирования
Расчетное время сборки 0.2 SBU
Требуемое место на диске 10 MB
Tar - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make и Sed
Подготавливаем Tar для компиляции:
./configure --prefix=/tools
Компилируем пакет
make
Для проверки результата вводим: make check.
Устанавливаем пакет
make install
Детальная информация о пакете находится в Разделе 6.56.2, “Contents of Tar”.
Пакет Texinfo содержит программы, используемые для чтения, записи и конвертирования документов Info, которые содержат системную документацию.
Расчетное время сборки 0.2 SBU
Требуемое место на диске 16 MB
Texinfo - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Ncurses и Sed
Подготавливаем Texinfo для компиляции:
./configure --prefix=/tools
Компилируем пакет
make
Для проверки результата вводим: make check.
Устанавливаем пакет
make install
Детальная информация о пакете находится в Разделе 6.34.2, “Описание Texinfo”.
Пакет Util-linux содержит ряд разнообразных утилит. Некоторые из них используются весьма часто для монтирования, размонтирования, форматирования и управления драйверами дисков, открытия портов tty и вывода сообщений ядра.
Расчетное время сборки 0.2 SBU
Требуемое место на диске 16 MB
Util-linux - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Ncurses, Sed и Zlib
Util-linux не может использовать заголовки и библиотеки из директории /tools. Это исправляется с помощью исправления скрипта конфигурации:
sed -i 's@/usr/include@/tools/include@g' configure
Подготавливаем Util-linux для компиляции:
./configure
Скомпилируем поддержку некоторых шаблонов:
make -C lib
И поскольку нам нужны только некоторые из утилит этого пакета, соберем только их:
make -C mount mount umount make -C text-utils more
Теперь скопируем эти файлы в директорию временных средств:
cp mount/{,u}mount text-utils/more /tools/bin
Детальная информация о пакете находится в Разделе 6.58.3, “Описание Util-linux”.
Теперь, когда временные библиотеки C были установлены, мы хотим, чтобы все оставшиеся в этой главе пакеты компоновались с использованием уже установленных библиотек. Чтобы обеспечить это, мы должны настроить specs файл компилятора.
Заменим компоновщик, установленный в конце первого шага сборки Binutils, запуском следующей команды в директории binutils-build:
make -C ld install
С этого момента все пакеты быдут собраны только с использованием библиотек из /tools/lib.
Если вы пропустили предупреждение о том, что не надо было удалять директории с исходниками и сборкой Binutils из первого шага или у вас нет доступа к ним, не беспокойтесь, не все потеряно. Просто проигнорируйте вышеприведенную команду. В результате появится небольшой шанс, что программы будут скомпонованы с использованием библиотек основной системы. Это не очень хорошо, но тем не менее не является такой уж большой проблемой. Ситуация будет исправлена позже на втором шаге установки Binutils.
Теперь, когда установлен откорректированый компоновщик, вы можете удалить директории с исходниками и сборкой Binutils.
Следующим нашим действием будет исправление specs-файла GCC для задания расположения нашего компоновщика. Просто выполните следующую команду:
SPECFILE=`gcc --print-file specs` && sed 's@ /lib/ld-linux.so.2@ /tools/lib/ld-linux.so.2@g' \ $SPECFILE > tempspecfile && mv -f tempspecfile $SPECFILE && unset SPECFILE
Мы рекомендуем просто скопировать и вставить вышеуказанное вместо того, чтобы просто вводить. Или, при желании, вы можете просто отредактировать specs-файл вручную, заменив встречающиеся строки “/lib/ld-linux.so.2” на “/tools/lib/ld-linux.so.2”
Если вы работаете на платформе, где имя динамического компоновщика отлично от ld-linux.so.2, замените“ld-linux.so.2” на имя динамического компоновщика вашей платформы в вышеуказанных командах. При необходимости вернитесь к Разделу 5.3.
Есть возможность, что некоторые включаемые файлы из основной системы имеются внутри директорий для включаемых файлов GCC. Это могло произойти по причине того, что процесс “fixincludes” запускается как часть сборки GCC. Позже мы раскажем об этом подробнее в этой главе. А пока запустите следующую команду, чтобы исключить эту возможность:
rm -f /tools/lib/gcc/*/*/include/{pthread.h,bits/sigthread.h}
На этом месте необходимо остановиться и убедиться, что основные функции (компиляция и компоновка) новых средств работают корректно. Для этого есть простой тест:
echo 'main(){}' > dummy.c cc dummy.c readelf -l a.out | grep ': /tools'
Если все в порядке, то не будет ошибок и вы увидите следующее:
[Requesting program interpreter: /tools/lib/ld-linux.so.2]
Заметим, что /tools/lib становится префиксом динамического компоновщика.
Если эта надпись вообще не появилась или появилась другая, то что-то сильно не так. Вам надо исследовать и повторить все пройденые шаги, чтобы найти в чем проблема и устранить ее. Точки для возврата после этого места уже не будет. Сначала опять проведите предыдущий тест, используя gcc вместо cc. Если это работает, тогда отсутствует ссылка /tools/bin/cc. Обратитесь к Разделу 5.5, “GCC-3.4.1 - Шаг 1” и установите ссылку. Следующее, убедитесь в корректности PATH. Это можно проверить запуском команды echo $PATH и проверить, что /tools/bin является первым в списке. Если PATH ошибочен, это может означать, что вы зарегистрировались не как пользователь lfs или что что-то прошло не правильно в Разделе 4.4, “Установка переменных окружения”. С другими опцииями что-нибудь может пойти не так при исправлении в specs-файле выше. В этом случае, подправьте исправление в specs-файле, будьте осторожны при копировании и вставке команд.
Если все прошло нормально, удалим тестовые файлы:
rm dummy.c a.out
Пакет ядра Linux содержит исходники ядра и файлы заголовков, используемые Glibc.
Расчетное время сборки 0.1 SBU
Требуемое место на диске 186 MB
Заголовки Linux - зависимости установки: Coreutils и Make
Некоторые пакеты нуждаются в ссылках на заголовки ядра, и мы собираемся распаковать архив ядра, собрать и скопировать необходимые файлы туда, где их сможет найти gcc.
Подготовимся к установке заголовков:
make mrproper
Это гарантирует нам, что дерево с исходниками ядра будет абсолютно "чистым". Команда разработчиков ядра рекомендует выполнять эту команду перед каждой компиляцией ядра. Вы не можете быть абсолютно уверены в чистоте дерева исходников ядра даже после распаковки.
Создадим файл include/linux/version.h:
make include/linux/version.h
Создадим платформо-зависимую ссылку include/asm:
make include/asm
Установим платформо-зависимые файлы заголовков:
mkdir /tools/glibc-kernheaders cp -HR include/asm /tools/glibc-kernheaders cp -R include/asm-generic /tools/glibc-kernheaders
Установим кросс-платформенные файлы заголовков:
cp -R include/linux /tools/glibc-kernheaders
Детальная информация о пакете находится в Разделе 8.3.2, “Описание Linux”.
Пакет заголовков Linux-Libc содержит “осмысленные” заголовки ядра.
Расчетное время сборки 0.1 SBU
Требуемое место на диске 22 MB
Заголовки Linux-Libc - зависимости установки: Coreutils
В течении многих лет было очень практично использовать “сырые” заголовки ядра (прямо из тарбола ядра) в /usr/include. Проэкт Linux-Libc-Headers был разработан для поддержки Application Programming Interface (API) стабильной версии заголовков Linux.
Установим файлы заголовков:
cp -R include/asm-i386 /tools/include/asm cp -R include/linux /tools/include
Если ваша архитектура не i386-совместима, применяйте первую команду аккуратно.
Детальная информация о пакете находится в Разделе 6.9.2, “Описание заголовков Linux-Libc”.
Пакет Ncurses содержит библиотеки для расширения возможностей текстового интерфейса, включая панели и меню.
Расчетное время сборки 0.7 SBU
Требуемое место на диске 26 MB
Ncurses - зависимости установки: Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make и Sed
Подготавливаем Ncurses для компиляции:
./configure --prefix=/tools --with-shared \ --without-debug --without-ada --enable-overwrite
Значение опций конфигурации:
Это заставит Ncurses не собираться с использованием Ada, если он установлен в основной системе. Это нам нужно потому, что при работе в среде chroot, Ada не будет доступен.
Это скажет Ncurses устанавливать свои заголовки в /tools/include, вместо /tools/include/ncurses, нам надо убедиться, что другие пакеты смогут эти заголовки найти.
Компилируем пакет
make
Устанавливаем пакет
make install
Детальная информация о пакете находится в Разделе 6.21.2, “Описание Ncurses”.
Пакет Perl содержит perl, язык практичной обработки и отчетов (Practical Extraction and Report Language).
Расчетное время сборки 0.8 SBU
Требуемое место на диске 74 MB
Perl - зависимости установки: Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make и Sed
Для начала применим патч для библиотеки C:
patch -Np1 -i ../perl-5.8.5-libc-1.patch
Подготавливаем Perl для компиляции (убедимся,что часть команды 'IO Fcntl POSIX' корректна):
./configure.gnu --prefix=/tools -Dstatic_ext='IO Fcntl POSIX'
Описание опций конфигурации:
Это говорит Perl собирать минимальный набор статических расширений, необходимых для установки и тестирования пакета Coreutils в следующей главе.
Скомпилируем только необходимые средства:
make perl utilities
Хотя Perl идет со встроенным тестом, не рекомендуется выполнять его на этом этапе. Только часть Perl была собрана и запуск make test сейчас будет означать, что должен быть собран остаток Perl, но он необязателен на этом этапе. Тест будет запущен в следующей главе.
Теперь скопируем эти средства и их библиотеки:
cp perl pod/pod2man /tools/bin mkdir -p /tools/lib/perl5/5.8.5 cp -R lib/* /tools/lib/perl5/5.8.5
Детальная информация о пакете находится в Разделе 6.33.2, “Описание Perl”.
Пакет Tcl содержит Tool Command Language (Средство Командого Языка).
Расчетное время сборки 0.9 SBU
Требуемое место на диске 23 MB
Tcl - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make и Sed
Этот и следующие два (Expect и DejaGNU) устанавливаемых пакета нужны для работы тестирования GCC и Binutils. Установка этих трех пакетов нужна только для этого, и если вы не хотите тестировать устанавливаемые средства, то можно пропустить эти установки, но мы рекомендуем проверять работоспособность собираемых средств. Даже если тесты не будут выполняться в этой главе, эти пакеты необходимы для запуска тестов в Главе 6.
Подготавливаем Tcl для компиляции:
cd unix ./configure --prefix=/tools
Соберем пакет:
make
Для проверки результата вводим: TZ=UTC make test. Тестирование Tcl может не завершиться успешно из-за зависимостей от основной системы, которые полностью не понятны. Таким образом, неудачное завершение тестирования здесь не будет сюрпризом и не является критичным. Параметр TZ=UTC установит временную зону в Coordinated Universal Time (UTC), также известную как время по Гринвичу - Greenwich Mean Time (GMT), но только на время работы тестирования. Детальная информация о переменной окружения TZ находится в Главе 7.
Устанавливаем пакет
make install
Не удаляйте директорию с исходниками tcl8.4.7 пока, так как следующие пакеты будут нуждаться во внутренних заголовках из этой директории.
Создадим необходимую символическую ссылку:
ln -s tclsh8.4 /tools/bin/tclsh
Этот раздел предназначен для объяснения некоторых логических и технических моментов рационального метода сборки. Ничего страшного, если вы не поймете все, что написано здесь. Большая часть из них имеет значение при выполнении сборки конкретных пакетов. Вы можете вернуться сюда в любое время.
Основной целью Главы 5 является подготовка окружения для входа через chroot для создания полноценной системы в Главе 6. По ходу дела мы соберем, используя основную систему, самодостаточные средства. Это будет сделано для обеспечения минимального риска и максимальной независимости одновременно. Другими словами, мы соберем инструменты для сборки системы.
Перед дальнейшей работой вы должны знать название вашей платформы, которое также называется target triplet. В некоторых случаях target triplet может быть, к примеру: i686-pc-linux-gnu. Простейшим способом определения вашего target triplet является запуск скрипта config.guess который содержится во многих пакетах. Распакуйте тарбол с исходниками Binutils, запустите скрипт: ./config.guess и запомните вывод.
Вам также необходимо знать имя динамичаского компоновщика для вашей платформы, его также называют динимическим загрузчиком (не спутайте его со стандартным компоновщиком ld который является частью Binutils). Динамический компоновщик является частью Glibc и служит для поиска и загрузки библиотек, в которых нуждается программа, подготовки программы к запуску и ее запуска. Как правило, динамический компоновщик называется ld-linux.so.2. На некоторых не очень распространенных платформах он называется ld.so.1, а на некоторых 64-битных платформах - по другому. Вы можете определить имя динамического компоновщика для вашей платформы, заглянув в директорию /lib вашей основной системы. Безошибочным способом проверки случайной библиотеки на вашей основной системе является запуск: readelf -l <name of binary> | grep interpreter и просмотр вывода. Ссылка, описывающая все платвормы, находится в файле shlib-versions в корне дерева исходников Glibc.
Некоторые технические моменты, которые позволяют методам сборки из Главы 5 работать:
Принципиальное сходство перекрестной компиляции, посредством чего установленные средства работают с одним префиксом и, таким образом, используют маленькое “волшебство” GNU.
Осторожная манипуляция путями поиска библиотек стандартным компоновщиком для того, чтобы убедиться, что программы были скомпонованы с использованием выбранных нами библиотек.
Осторожная манипуляция specs-файлом gcc для передачи компилятору информации об используемом динамическом компоновщике.
Binutils устанавливаются первыми потому, что GCC и Glibc выполняют тестирование ассемблера и компоновщика во время запуска ./configure для определения того, какие настройки программного обеспечения выбраны или отключены. Это очень важно при первой реализации. Неверно сконфигурированые GCC и Glibc могут испортить всю сборку средств и дистрибутив будет с ошибками. Благодаря тестированию мы можем опрделить это своевременно.
Binutils устанавливают ассемблер и компоновщик в два места: /tools/bin и /tools/$TARGET_TRIPLET/bin. Точнее, средства в одной из директорий являются жесткими ссылками на другие. Очень важным для компоновщика является порядок поиска библиотек. Точную информацию о нем можно получить от ld указав параметр --verbose. Например: ld --verbose | grep SEARCH покажет текущие пути поиска и их порядок. Вы можете увидеть, какие файлы скомпонованы с помощью ld при компиляции программы-пустышки и используя переключатель --verbose. Например: gcc dummy.c -Wl,--verbose 2>&1 | grep succeeded покажет все файлы, удачно открытые в процессе компоновки.
Следующим пакетом мы установим GCC и в процессе работы ./configure вы увидите, например:
checking what assembler to use... /tools/i686-pc-linux-gnu/bin/as checking what linker to use... /tools/i686-pc-linux-gnu/bin/ld
Это важно по причинам, описаным выше. И это также показывает, что скрипт конфигурации GCC не ищет в директориях $PATH какие средства использовать. Тем не менее, текущий процесс gcc не использует эти пути поиска. Вы можете определить, какой стандартный комполновщик gcc используется, запустив: gcc -print-prog-name=ld.
Детальная информация получается от gcc добавлением параметра -v при компиляции. Например: gcc -v dummy.c покажет полную информацию о препроцессоре, компиляторе и ассемблере, включая пути поиска gcc и другую информацию.
Следующим устанавливаемым пакетом будет Glibc. Наиболее важными зависимостями сборки Glibc являются компилятор, средства для бинарных файлов и заголовки ядра. Компилятор не представляет проблемы, Glibc всегда использует gcc из директории $PATH. Бинарные средства и заголовки ядра могут привести к некоторым проблемам. Поэтому мы не рискуем и используем переключатели конфигурации для правильного выбора. После запуска ./configure вы можете проверить содержимое файла config.make в директории glibc-build для получения информации. Вы будете использовать некотоые интересные параметры, такие как CC="gcc -B/tools/bin/", которые определяют используемые средства, а также флаги -nostdinc и -isystem для контроля за путем поиска для компилятора. Эти параметры показывают важный аспект пакета Glibc: он не обязательно полагается на средства по умолчанию.
После установки Glibc мы создадим некоторые установки для того, чтобы убедиться, что пути для поиска содержат только в директории /tools. Мы установим откорректированный ld, в котором будет жестко указан путь поиска в /tools/lib. Задем мы исправим specs-файл gcc для указания на наш новый динамический компоновщик в /tools/lib. Этот последний шаг жизненно важен для нашего процесса. Как указано выше, путь к динамическому компоновщику будет жестко вшит в каждый исполняемый файл ELF. Вы можете убедиться в этом, запустив 'readelf -l <name of binary> | grep interpreter' . Благодаря исправлению specs-файла gcc , мы убедимся, что все программы из оставшейся части Главы 5 будут использовать новый динамический комполовщик из /tools/lib.
Необходимость использования нового динамического компоновщика также является причиной, по которой мы применяем Specs патч на втором этапе сборки GCC. Опускание этого патча приведет к тому, что программы GCC будут использовать системный динамический компоновщик из директории /lib основной системы, а это будет означать зависимость от основной системы.
В ходе второго шага сборки Binutils мы будем использовать переключатель --with-lib-path для контроля пути поиска библиотек для ld. С этого момента все наши средства будут самодостаточными. Остальные пакеты из Главы 5 будут собраны с новым Glibc из /tools.
После входа в окружение chroot в Главе 6, мы первым делом установим Glibc по вышеописаным причинам. Теперь Glibc будет установлен в /usr и мы будем использовать средства по умолчанию для сборки остальных пакетов для LFS системы.
Многие программы выполняют помимо своей основной задачи и многие другие операции. Это включает распределение памяти, поиск директорий, четение и запись файлов, манипуляции со строками, использование шаблонов, арифметические операции и многое другое. Вместо того, чтобы включать все это в программу, GNU система поддерживает простые функции в библиотеках. Самой главной из них для любой Linux системы является Glibc.
Есть два варианта использования библиотечных функций: статически и динамически. Когда программа скомпонована статически, код используемых функций включается в программу и она становится более громоздкой. Когда же программа скомпонована динамически, в программу включаются только ссылка на динамический компоновщик, имя библиотеки и имя функции, в результате мы получаем более маленький исполняемый файл. (Есть еще третий путь - использование программного интерфейса для динамического компоновщика. Смотрите мануал по dlopen для более полной информации.)
Динамическая компоновка является компоновкой по умолчанию в Linux и имеет три главных преимущества перед статической компоновкой. Первое: вам достаточно иметь только одну копию исполняемого кода библиотеки на жестком диске в отличие от нескольких копий в каждом исполняемом файле в противном случае - вы экономите место на диске. Второе: когда несколько программ используют одну и ту же библиотечную фунцию одновременно, только одна копия этой функции находится в памяти - вы экономите оперативную память. Третье: если вы обнаружили ошибку в функции, достаточно перекомпилировать одну библиотеку в отличие от необходимости перекомпилировать все программы, использующие эту функцию, в противном случае.
Если динамическая компоновка настолько лучше, то почему мы ее не используем, а статически компонуем первые два пакета в этой главе? Есть тройственная причина для этого: историческая, образовательная и техническая. Историческая: потому что простейшая версия LFS статически компонует все программы из этой главы. Образовательная: потому что надо знать отличие между статической и динамической компоновкой. Техническая: потому что мы получаем элемент независимости от основной системы - наши программы не должны от нее зависеть, они должны иметь возможность работать самостоятельно. Таким образом, если мы хотим построить LFS систему, нам необходимо отказаться от динамической компоновки первых двух пакетов.
Базовая система должна быть запущена на ядре как минимум версии 2.6.2, скомпилированном с GCC-3.0 или выше. Есть два повода для этих высоких требований. Вопервых, тест для Native POSIX Threading Library (NPTL) будет выпадать, если ядро базовой системы не будет скомпилировано с GCC-3.0 или более поздней версии. Вовторых, 2.6.2 или более поздняя версия ядра необходима для использования Udev. Udev создает устройства динамически, читая из файловой системы sysfs. Хотя поддержка для этой файловой системы только недавно была встроена в большинство драйверов ядра, мы должны быть уверены, что все критические устройства системы создаются правильно.
Для определения, где базовое ядро встречает требования, описанные выше, запустите следующую команду:
cat /proc/version
В результате будет вывод, похожий на:
Linux version 2.6.2 (user@host) (gcc version 3.4.0) #1 Tue Apr 20 21:22:18 GMT 2004
Если результат предыдущей команды покажет, что ядро основной системы не было откомпилировано с использованием компилятора GCC-3.0 (или позднее), оно будет нуждаться в перекомпиляции. Система потребует перезагрузки для использования нового ядра. Инструкции по компилированию ядра и конфигурации загрузчика (подразумевая, что в базовой системе используется GRUB) находятся в Главе 8.
Описываемый здесь шаг не является обязательным. Если ваш раздел LFS очень мал, вы хотите просто попробовать или у вас есть другие причины, то вы можете выполнить инструкции этого раздела. Исполняемые файлы и библиотеки собираются с использованием ненужных символов отладки - это около 130 MB. Вы можете удалить эти символы командами:
strip --strip-debug /tools/lib/* strip --strip-unneeded /tools/{,s}bin/*
Последняя команда пропустит около двадцати файлов, сообщив что они неподдерживаемого формата. Большая часть из них скрипты, я не бинарники.
Ни в коем случае не используйте --strip-unneeded на библиотеках. Статические библиотеки будут испорчены и вам придеться собирать их все заново вместе с Glibc.
Для освобождения еще 30 мегабайт, вы можете убрать всю документацию:
rm -rf /tools/{doc,info,man}
Вам понадобится около 850 MB свободного места на вашей системе LFS для для сборки и установки Glibc на следующем шаге. Если вы сможете собрать и установить Glibc, то вы сможете собрать и установить все остальное.
Пакет Udev содержит программы для динамического создания нод устройств.
Расчетное время сборки 0.2 SBU
Требуемое место на диске 5.2 MB
Udev - зависимости установки: Coreutils и Make
Программа udevstart содержит путь к программе udev, жестко прописанный внутри себя, что может повлечь за собой проблемы с udev, установленным в нестандартное место. Исправим это запуском следующей команды:
sed -i 's@/sbin/udev@/tools/sbin/udev@g' udevstart.c
Также убедимся, что udev узнает корректное положение своих конфигурационных файлов:
sed -i 's@/etc@/tools/etc@g' etc/udev/udev.conf.in
Компилируем Udev:
make prefix=/tools etcdir=/tools/etc
Устанавливаем пакет
make DESTDIR=/tools udevdir=/dev install
Конфигурация Udev по умолчанию далека от идеала, поэтому проинсталируем здесь LFS-специфичные конфигурационные файлы:
cp ../udev-config-2.permissions \ /tools/etc/udev/permissions.d/00-lfs.permissions cp ../udev-config-1.rules /tools/etc/udev/rules.d/00-lfs.rules
Детальная информация о пакете находится в Разделе 6.57.2, “Описание Udev”.
Большинство программ и библиотек по умолчанию компилируются с символами отладки (с опцией -g для gcc). Это означает, что когда отлаживается программа или библиотека, которая была собрана с включением отладочной информации, то отладчик может передать вам не только адреса в памяти, но и имена переменных и функций.
Но исключение отладочных символов существенно уменьшает размер программы или библиотеки. Чтобы получить представление о том, сколько места занимает отладочная информация, посмотрите следующее:
бинарник bash с отладочными символами: 1200 KB
бинарник bash без отладочных символов: 480 KB
файлы Glibc и GCC (/lib и /usr/lib) с отладочными символами: 87 MB
файлы Glibc и GCC без отладочных символов: 16 MB
Размер может немного варьироваться в зависимости от используемых компилятора и библиотеки C. Но размер между программами и библиотеками, собранными с отладочной информацией и без таковой может различаться в 2-5 раз.
Большинство людей никогда не используют отладчик, и довольно много места на диске освободится при удалении отладочных символов. В следующей части будет показано, как удалить все отладочные символы из программ и библиотек. Дополнительная информация по оптимизации системы может быть найдена в http://www.linuxfromscratch.org/hints/downloads/files/optimization.txt.
Пакет Autoconf создает shell скрипты, которые автоматически конфигурируют исходный код.
Расчетное время сборки 0.5 SBU
Требуемое место на диске 7.7 MB
Autoconf - зависимости установки: Bash, Coreutils, Diffutils, Grep, M4, Make, Perl и Sed
Подготавливаем Autoconf для компиляции:
./configure --prefix=/usr
Компилируем пакет
make
Для проверки результата вводим: make check. Проверка занимает около 2 SBU.
Устанавливаем пакет
make install
Проинсталированные программы: autoconf, autoheader, autom4te, autoreconf, autoscan, autoupdate и ifnames
Предоставляет shell-скрипты, которые автоматически настраивают исходники пакетов для адаптации к большинству Unix-подобных систем. Скрипты конфигурации создаются сомостоятельными -- они работают без программы autoconf.
Средство для создания шаблонов файлов с директивами C #define для настройки использования.
Это оболочка для макропроцессора M4.
Автоматически запускает autoconf, autoheader, aclocal, automake, gettextize и libtoolize в корректном порядке для сохранения времени, когда сделаны изменения во временных файлах autoconf и automake.
Помогает при создании файла configure.in для пакета программ; он проверяет исходники в дереве каталогов, ищет в них возможность возникновения проблем при переносимости и создает файл configure.scan, который служит предварительным файлом configure.in для пакета.
Модифицирует файл configure.in, обновляя имена вызова макросов autoconf.
Помогает при написании configure.in для пакета программ. Он печатает идентификаторы, используемые пакетом в условиях препроцессора C. Если пакет уже настроен на определенную переносимость, эта программа может помочь определить, что надо проверять скрипту configure. Он может заполнить некоторые пропуски в файле configure.in, сгенерированом autoscan.
Automake генерирует файлы Makefile.in, предназначеные для использования Autoconf.
Расчетное время сборки 0.2 SBU
Требуемое место на диске 6.8 MB
Automake - зависимости установки: Autoconf, Bash, Coreutils, Diffutils, Grep, M4, Make, Perl и Sed
Подготавливаем Automake для компиляции:
./configure --prefix=/usr
Компилируем пакет
make
Для проверки результата вводим: make check.
Это может занять много времени, около 5 SBU.
Устанавливаем пакет
make install
Проинсталированные программы: acinstall, aclocal, aclocal-1.9.1, automake, automake-1.9.1, compile, config.guess, config.sub, depcomp, elisp-comp, install-sh, mdate-sh, missing, mkinstalldirs, py-compile, symlink-tree и ylwrap
Скрипт, устанавливающий файлы aclocal-стиля M4.
Генерирует файлы aclocal.m4, основанные на содержимом файлов configure.in.
Жесткая ссылка на aclocal.
Средство для автоматической генерации файлов Makefile.in из файлов Makefile.am. Для создания всех файлов Makefile.in для пакета, запустите программу в верхней директории пакета. При сканировании файлов configure.in он автоматчески найдет соответствующие файлы Makefile.am и сгенерирует соответствующий файлMakefile.in.
Жесткая ссылка на automake
Оболочка для компиляторов.
Скрипт, который определяет каноническое имя (триплет) системы - сборка, хост и тип архитектуры.
Скрипт проверки конфигурации.
Скрипт для компиляции програмы как таковой, генерирующий на выходе не только требования, но и информацию о зависимостях.
Байт-компиляция кода Emacs Lisp.
Скрипт, который устанавливает программу, скрипт или файл данных.
Выводит время модификации директории или файла.
Скрипт, заменяющий ряд пропущенных при инсталяции программ GNU.
Создает дерево каталогов.
Компилирует Python-программу
Скрипт для создания дерева ссылок на дерево директорий и файлов.
Оболочка для lex и yacc.
Bash - это Bourne-Again SHell.
Расчетное время сборки 1.2 SBU
Требуемое место на диске 27 MB
Bash - зависимости установки: Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make, Ncurses и Sed.
Следующий патч необходим только если пакет Readline не был установлен, как было предложено. Этот патч устраняет проблему, когда Bash иногда ограничивает количество символов в строке до 33 перед переходом на следующую строку. Если пакет Readline был установлен согласно инструкции, этот патч не нужен так как он уже применен к Readline для решения этой проблемы.
patch -Np1 -i ../bash-3.0-display_wrap-1.patch
Подготавливаем Bash для компиляции:
./configure --prefix=/usr --bindir=/bin \ --without-bash-malloc --with-installed-readline
Значение опций конфигурации:
Эта опция говорит Bash испоьзовать библиотеку readline, которая уже установлена в системе и лучше, чем встроенная версия readline.
Компилируем пакет
make
Для проверки результата вводим: make tests.
Устанавливаем пакет
make install
Запустим только что установленную прогрпмму bash, заменив уже запущенную:
exec /bin/bash --login +h
Использованы параметры для создания процесса bash с интерактивной регистрацией оболочки, так что новые программы обнаруживаются и становятся доступными.
Проинсталированные программы: bash, bashbug и sh (ссылка на bash)
Часто используемый интерпритатор команд. Он поддерживает различные расширения и подстановки в получаемой командной строке, что делает его весьма мощным средством.
shell-скрипт для помощи пользователю в составлении и отправке сообщения об ошибке, относящейся к bash, в стандартном формате.
Ссылка на программу bash. При вызове как sh, bash запускается в режиме эмуляции исторической версии sh насколько это возможно, для большего соответствия стандартам POSIX.
Binutils является колекцией средств разработки программ, содержащих компоновщик, ассемблер и другие средства для работы с объектными файлами.
Расчетное время сборки 1.4 SBU
Требуемое место на диске 167 MB
Binutils - зависимости установки: Bash, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Perl, Sed и Texinfo
Этот пакет известен своим нестабильным поведением при компиляции с измененными опциями оптимизации (включая опции -march и -mcpu ) . Binutils рекомендуется компилировать с настройками по умолчанию. Если вы задали переменные такие как CFLAGS или CXXFLAGS, изменяющие уровень оптимизации по умолчанию, рекомендуется убрать их при сборке пакета binutils.
Проверьте, что псевдо терминалы (PTY) работают корректно внутри среды chroot, выполнив. простой тест:
expect -c "spawn ls"
Если вы получили сообщение вида:
The system has no more ptys. Ask your system administrator to create more.
то ваша среда chroot не может оперировать PTY. В этом случае вам не стоит запускать тестирование для Binutils и GCC до того, как вы это исправите.
В документации по Binutils рекомендуется собирать Binutils вне директории с исходниками, а в отдельной директории для сборки:
mkdir ../binutils-build cd ../binutils-build
Подготавливаем Binutils для компиляции:
../binutils-2.15.91.0.2/configure --prefix=/usr \ --enable-shared
Компилируем пакет
make tooldir=/usr
Обычно, директория со средствами (директория, где располагаются исполняемые файлы) устанавливается в $(exec_prefix)/$(target_alias), где они и располагаются, например, /usr/i686-pc-linux-gnu. Когда мы собираем средства только для своей системы, нам достаточно установить все просто в директорию /usr. Такая установка нужна только в случае использования cross-компиляции (к примеру, компилируем пакет на машине Intel, но нам нужен код для работы на платформе PowerPC).
Тестирование Binutils на этом этапе является критичным. Не пропускайте его.
Проверим результаты:
make check
Устанавливаем пакет
make tooldir=/usr install
Установим заголовки libiberty, которые нужны для некоторых пакетов:
cp ../binutils-2.15.91.0.2/include/libiberty.h /usr/include
Проинсталированные программы: addr2line, ar, as, c++filt, gprof, ld, nm, objcopy, objdump, ranlib, readelf, size, strings и strip
Проинсталированные библиотеки: libiberty.a, libbfd.[a,so] и libopcodes.[a,so]
транслирует адрес программы в имя файла и номер строки. Адрес и имя исполняемого файла используются с отладочной информацией бинарника для определения исходника и номера строки, ассоциированого с адресом.
Создает, модифицирует и распаковывает из архива.
Ассемблер. Ассемблирует вывод gcc в объектные файлы.
Используется компоновщиком для сортировки символов C++ и Java, для пропуска перезагрузки функций при конфликтах.
Отображает график системных вызовов.
Компоновщик. Он соединяет несколько объектных и архивных файлов в один, переопределяет их данные и устанавливает символические ссылки.
Выводит символы, содержащиеся в объектном файле.
Используется для преобразования из одного типа объектного файла в другой.
Выводит информацию об объектном файле в соответствии с параметрами, определяющими, какую информацию выводить. Выводимая информация, как правило, используется програмистами, работающими со средствами компиляции.
Генерирует список содержимого архива и сохраняет его в архиве. Список содержит все символы, определенные частями архива, которые являются объектными файлами.
Выводит информацию о типе бинарника.
Выводит список размеров частей и общий размер для каждого объектного файла.
Выводит для каждого файла список печатных символов больше указанной длины (по умолчанию - 4). Для объектных файлов печатаются только строки из инициализационного и загружаемого разделов. Для других типов файлов выводятся все строки.
Удаляет символы из объектных файлов.
Содержит правила, используемые различными программами GNU, включая getopt, obstack, strerror, strtol и strtoul
Библиотека двоичого дескриптора файла.
Библиотека для работы с опкодами — “читаемыми” версиями инструкций процессора; используется в сборке утилит вроде objdump.
Bison является генератором парсеров. Генерирует программу, которая анализирует структуру текстового файла.
Расчетное время сборки 0.6 SBU
Требуемое место на диске 10.6 MB
Bison - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, M4, Make и Sed
Подготавливаем Bison для компиляции:
./configure --prefix=/usr
Компилируем пакет
make
Для проверки результата вводим: make check.
Устанавливаем пакет
make install
Проинсталированные программы: bison и yacc
Проинсталированные библиотеки: liby.a
Генерирует, согласно ряду правил, программу для анализа структуры текстовых файлов; Bison заменяет Yacc (Yet Another Compiler Compiler)
Оболочка для bison, специально для программ, использующих yacc вместо bison; вызывает bison с опцией -y.
Библиотека Yacc, содержащая Yacc-совместимые функции yyerror и main; эта библиотека практически не используется, но она упоминается в стандарте POSIX.
Bzip2 является блочным файловым архиватором, который сжимает, как правило, лучше традиционного gzip.
Расчетное время сборки 0.1 SBU
Требуемое место на диске 3.0 MB
Bzip2 - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc и Make
Подготавливаем Bzip2 для компиляции:
make -f Makefile-libbz2_so make clean
Флаг -f означает, что Bzip2 будет собран, используя другой файл Makefile, в данном случае файл Makefile-libbz2_so, который создает динамическую библиотеку libbz2.so и связывает Bzip2 с ней.
Компилируем пакет
make
Если потребуется переинсталировать Bzip2, сначала выполните rm -f /usr/bin/bz*, в противном случае последующая команда make install будет с ошибкой.
Проинсталируем программы:
make install
Установим библиотеку bzip2 в директорию /bin, затем создадим необходимые ссылки и удалим старые:
cp bzip2-shared /bin/bzip2 cp -a libbz2.so* /lib ln -s ../../lib/libbz2.so.1.0 /usr/lib/libbz2.so rm /usr/bin/{bunzip2,bzcat,bzip2} ln -s bzip2 /bin/bunzip2 ln -s bzip2 /bin/bzcat
Проинсталированные программы: bunzip2 (ссылка на bzip2), bzcat (ссылка на bzip2), bzcmp, bzdiff, bzegrep, bzfgrep, bzgrep, bzip2, bzip2recover, bzless и bzmore
Проинсталированные библиотеки: libbz2.a, libbz2.so (ссылка на libbz2.so.1.0), libbz2.so.1.0 (ссылка на libbz2.so.1.0.2) и libbz2.so.1.0.2
Декомпрессия файлов, сжатых bzip
Декомпрессия на стандартное устройство вывода
Запускает cmp на файлах, сжатых bzip
Запускает diff на файлах, сжатых bzip
Запускает grep на файлах, сжатых bzip
Запускает egrep на файлах, сжатых bzip
Запускает fgrep на файлах, сжатых bzip
Сжимает файлы, используя алгоритм компрессии Burrows-Wheeler блочной сортировки текста с кодированием Huffman; уровень компрессии лучше, чем у сжатия более распространенными компрессотами, использующими алгоритм “Lempel-Ziv”, например gzip
Пытается восстановить данные из поврежденных bzip-файлов
Запускает less на файлах, сжатых bzip
Запускает more на файлах, сжатых bzip
Библиотека, включающая блочно-сортирующую компрессию данных, использующую алгоритм Burrows-Wheeler
На данный момент права на директорию /tools принадлежат пользователю lfs, который существует только на основной системе. Хотя мы собираемся удалить директорию /tools когда наша система будет собрана, вы можете захотеть не делать этого, Например, для построения другой системы LFS. Если вы хотите оставить директорию /tools, то у нее будет владелец с определенным ID но без аккаунта. Это опасно потому, что впоследствии созданый пользовательский аккаунт может получить такой же ID и станет владельцем директории /tools и всех файлов внутри нее и использовать это в своих целях.
Чтобы избежать этого, вы можете добавить пользователя lfs в вашу новую LFS при создании файла /etc/passwd, и подправить его таким образом, чтобы ID этого пользователя и группы были идентичны им же на основной системе. Помимо этого, вы можете связать содержимое директории /tools с пользователем root запуском команды:
chown -R 0:0 /tools
Команда использует 0:0 вместо root:root потому, что chown не может использовать имя “root” до того, как будет создан файл паролей.
В этой главе мы войдем в фазу сборки и начнем серьезно собирать нашу LFS систему. Для этого мы войдем в среду chroot внутри нашей мини Linux системы, проделаем некоторые дополнительные работы и начнем устанавливать пакеты один за одним.
Установка всех этих пакетов весьма проста и вы можете подумать, что достаточно было бы указать общее описание установки для всех пакетов, а конкретезировать только если установка их отличается от стандартной. Несмотря на то, что мы согласны с этим, мы решили дать полные инструкции по установке каждого из пакетов просто для того, чтобы минимизировать возможность возникновения ошибок.
Если вы решите использовать оптимизацию компилятора в этой главе, то вам стоит посмотреть справку по оптимизации на http://www.linuxfromscratch.org/hints/downloads/files/optimization.txt. Оптимизация компилятора может сделать программы быстрее, но могут возникнуть сложности при компиляции и некоторые проблемы при работе этих программ. Если пакет отказывается компилироваться при использовании оптимизации, то попробуйте скомпилировать пакет без нее, возможно проблемы исчезнут. Если пакет компилируется с использованием оптимизации, то есть возможность, что он скомпилируется некорректно, например, могут появиться проблемы между интерактивностью в коде и собраными средствами. В общем, использование оптимизауии при сборке является рискованым. Новичкам в LFS рекомендуется собирать ее без оптимизации. В ваших силах сделать систему быстрой и стабильной одновременной.
Список пакетов, которые надо собирать, является строго последовательным, нам надо убедиться, что в них не будет прописан путь к /tools. По некоторым причинам, не стоит компилировать пакеты параллельно. Параллельная сборка может показаться выгодной иногда (в особенности на многопроцессорных системах), но в результате у программ появится зависимость от средств из /tools и они не смогут работать, когда мы удалим эту директорию.
Перед инструкциями по установке на каждой странице находится информация о пакете, включая краткое описание того, что входит в пакет, примерное время сборки, требуемое для сборки дисковое пространство и какие другие пакеты нужны для нормальной сборки. Далее следуют инструкции по сборке, список программ и библиотек (включая короткие описания для них), которые устанавливает пакет.
Для содержания в порядке установленных пакетов можно применять менеджеры пакетов. Для ознакомления с различными менеджерами пакетов обращайтесь к http://www.linuxfromscratch.org/blfs/view/svn/introduction/important.html. Для метода управления пакетами, специально приспособленного к LFS, мы рекомендуем http://www.linuxfromscratch.org/hints/downloads/files/more_control_and_pkg_man.txt.
Остаток этой книги выполняется в режиме регистрации под пользователем root, а не пользователем lfs.
Теперь пришло время войти в среду chroot для установки необходимых пакетов. Перед тем, как войти в среду chroot, вам необходимо войти в систему как root. Для входа в среду chroot выполнить следующую команду:
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
Параметр -i, передаваемый команде env, очистит все переменные окружения среды chroot. После этого мы устанавливаем только переменные HOME, TERM, PS1 и PATH. Конструкция TERM=$TERM установит переменную TERM внутри среды chroot в то же значение, что и вне среды chroot. Эта переменная нужна таким программам как vim и less для правильной работы. Если вам нужны другие переменные, такие как CFLAGS или CXXFLAGS, то это хорошее место задать их.
С этого места нам уже не надо использовать переменную LFS, потому что директория, указанная в ней стала корневой при входе в среду chroot.
Мы указали /tools/bin последней в списке путей PATH. Благодаря этому пакеты из этой директории не будут использованы, если мы уже установили окончательную версию соответствующего пакета. Это действует в том случае, когда shell “не запоминает” расположение исполняемых файлов, именно поэтому мы отключили эту функцию в предыдущей главе при помощи опции +h, переданной bash.
Запомните, что все команды до конца этой главы и во всех последующих выполняются из среды chroot. Если вы покинули эту среду по любой причине (например, после перезагрузки), то вы должны снова зайти в среду chrrot и примонтировать файловые системы proc и devpts (описываются позже) перед продолжением установки.
Заметьте, что bash выводит “I have no name!”. Это нормально, поскольку файл /etc/passwd еще не создан.
Пакет Coreutils содержит некоторые системные утилиты для показа и установки базовых системных характеристик.
Расчетное время сборки 0.9 SBU
Требуемое место на диске 69 MB
Coreutils - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Perl и Sed
Нормальное функционирование программы uname из этого пакета иногда нарушается, тогда параметр -p всегда возвращает unknown. Следующий патч исправляет это для архитектуры Intel:
patch -Np1 -i ../coreutils-5.2.1-uname-2.patch
Предупредим Coreutils от инсталяции бинарников, которые будут инсталированы позднее в других пакетах:
patch -Np1 -i ../coreutils-5.2.1-suppress_uptime_kill_su-1.patch
Теперь подготавливаем Coreutils для компиляции:
DEFAULT_POSIX2_VERSION=199209 ./configure --prefix=/usr
Компилируем пакет
make
Этот пакет поддерживает тестирование для определения корректности сборки. Тем не менее, этот специфический тест использует непревилегированных пользователей и группы, которые пока не определены в нашей простой системе. Поэтому мы создадим фиктивного пользователя и две фиктивные группы для корректной работы тестов. Если вы не хотите запускать тестирование, то переходите к “установке пакета”.
Создадим фиктивных пользователя и группы:
echo "dummy1:x:1000:" >> /etc/group echo "dummy2:x:1001:dummy" >> /etc/group echo "dummy:x:1000:1000:::/bin/bash" >> /etc/passwd
Теперь тест полностью подготовлен к запуску. Следующий тест проверит запуск от имени пользователя root:
make NON_ROOT_USERNAME=dummy check-root
Следующий тест проверит запуск от имени фиктивного пользователя dummy:
src/su dummy -c "make RUN_EXPENSIVE_TESTS=yes check"
После окончания теста удалим фиктивные группы и пользователя:
sed -i '/dummy/d' /etc/passwd /etc/group
Устанавливаем пакет
make install
И переместим некоторые программы в их правильное место:
mv /usr/bin/{[,basename,cat,chgrp,chmod,chown,cp,dd,df} /bin mv /usr/bin/{date,echo,false,head,hostname,install,ln} /bin mv /usr/bin/{ls,mkdir,mknod,mv,pwd,rm,rmdir,sync} /bin mv /usr/bin/{sleep,stty,test,touch,true,uname} /bin mv /usr/bin/chroot /usr/sbin
И, наконец, создадим необходимые ссылки для FHS-совместимости:
ln -s ../../bin/install /usr/bin
Проинсталированные программы: basename, cat, chgrp, chmod, chown, chroot, cksum, comm, cp, csplit, cut, date, dd, df, dir, dircolors, dirname, du, echo, env, expand, expr, factor, false, fmt, fold, groups, head, hostid, hostname, id, install, join, link, ln, logname, ls, md5sum, mkdir, mkfifo, mknod, mv, nice, nl, nohup, od, paste, pathchk, pinky, pr, printenv, printf, ptx, pwd, readlink, rm, rmdir, seq, sha1sum, shred, sleep, sort, split, stat, stty, sum, sync, tac, tail, tee, test, touch, tr, true, tsort, tty, uname, unexpand, uniq, unlink, users, vdir, wc, who, whoami и yes
Возвращает имя файла по указаному полному имени с путями и суффиксами.
Суммирует содержимое файлов на стандартный вывод.
Изменяет группу-владельца для указанного файла на заданную группу. Группа может быть определена как по имени, так и по числовому ID.
Изменяет режим доступа к файлу на указанный. Режим может быть указан в качестве последовательности символов для изменения режима доступа или как восьмеричное число для определения нового режима.
Изменяет пользователя и/или группу, которые являются владельцем файла на указанную пару пользователь:группа.
Запускает указанную команду с указанной директорией в качестве корня /.
Печатает контрольную сумму CRC и количество байт в указанном файле.
Сравнивает два файла и выводит в три колонки одинаковые строки и разные.
Копирует файлы.
Разделяет указанный файл на несколько других файлов, разделяя их по указанному шаблону либо по номерам строк и выводит количество байт для каждого нового файла.
Печатает часть строк, соответствующих заданным параметрам.
Показывает текущее время в указанном формате или устанавливает системное время.
Копирует файл, используя указанные размеры блоков и опциональные преобразования.
Показывает сколько места доступно (и используется) для всех примонтированых файловых систем или только для системы, содержащей указанные файлы.
Синоним команды ls.
Выдает команду для установки переменной окружения LS_COLOR, используемой для изменения цветовой схемы для ls
Удаляет суффикс, не являющийся директорией, из имени файла.
Возвращает место на диске, занимаемое указанной или текущей директориями со всеми вложеными директориями или файлами.
Показывает заданную строку.
Запускает команду в измененном окружении.
Заменяет знаки табуляции пробелами.
Вычисляет выражения.
Выводит разложение на простые множители всех указанных целых чисел.
Ничего не делает, но всегда завершается со статусом ошибки.
Форматирует абзацы в указанных файлах.
Переносит строки в заданных фалах.
Выводит группу, к которой принадлежит пользователь.
Печатает первые десять строк файла (или указанное число строк).
Возвращает числовой идентификатор хоста (в шестнадчатиричном формате).
Возвращает установленное имя хоста.
Возвращает ID пользователя, ID группы и группу к которой принадлежит текущий или заданный пользователь.
Копирует файлы, устанавливая им режим доступа и, если возможно, их владельца и группу.
Соединяет строки двух файлов в поля.
Создает жесткую ссылку на указанное имя или файл.
Создает жесткую или символическую ссылку на файлы.
Возвращает идентификационное имя текущего пользователя.
Выводит содержимое указанной директории. По умолчанию - в алфавитном порядке подкаталоги и файлы.
Возвращает контрольную сумму MD5.
Создает директорию с указанным именем.
Создает FIFO “именованный канал” UNIX способом с заданным именем.
Создает элемент устройства с заданным именем. Элемент устройства может быть специальным символьным фалом, блочным файлом или FIFO.
Перемещает или переименовывает указанные файлы или директории.
Запускает программу с измененным приоритетом выполнения.
Возвращает количество строк в указанном файле.
Выполняет команду, защищенную от зависаний, с выводом в файл журнала.
Выводит дамп файла в восьмеричном или ином формате.
Выводит строки, соответствующие заданным образцам из указанных файлов и разделенные символами табуляции.
Проверяет корректность или портируемость имен файлов.
Упрощенный вариант finger. Возвращает некоторую информацию об указанных пользователях.
Форматирует файл по страницам и колонкам для вывода на печать.
Печатает переменные окружения.
Печатает заданные параметры в указанном формате - очень похож на одноименную функцию C.
Печатает оглавление файла, определяя его по указанным ключевым словам.
Возвращает имя текущей директории.
Возвращает значение символической ссылки.
Удаляет файлы или директории.
Удаляет директорию, если она пустая.
Печатает ряд чисел в заданном диапазоне с заданным шагом.
Возвращает или проверяет контрольную сумму 160-бит SHA1.
Удаляет указанные файлы, перезаписывая занимаемые ими блоки указанным шаблоном, что очень сильно затрудняет их последующее восстановление.
Пауза на указанное время (в секундах).
Сортирует строки заданных файлов.
Разрезает указанный файл на части заданного размера или по номерам строк.
Показывает статус файла или файловой системы.
Устанавливает или печатает установки терминала.
Печатает контрольную сумму и количество блоков для указанного файла.
Переключает буфер файловой системы. Он принудительно записывает измененные блоки на диск и обновляет super block.
Выводит содержимое указанных файлов в обратном порядке.
Печатает последние десять строк (или указанное их количество) заданного файла.
Считывает данные со стандартного ввода и записывает их в файл, дублируя на устройстве стандартного вывода.
Сравнивает значения и проверяет типы файлов.
Изменяет время изменения файла, устанавливает доступ к файлу. Если файл не существует, то он будет создан с нулевой длиной.
Заменяет, вставляет и удаляет символы со стандартного ввода.
Ничего не делает, но всегда возвращает результат успешно завершенной операции.
Проводит топологическую сортировку. Он выводит полностью отсортированый список с учетом уже произведенной сортировки указанного файла.
Возвращает имя файла терминала, присоединенного к стандартному вводу.
Выводит информацию о системе.
Заменяет пробелы символами табуляции.
Удаляет все повторяющиеся строки из отсортированного файла.
Удаляет указанный файл.
Выводит список подключенных к системе пользователей.
Тоже самое, что ls -l
Выводит количество строк, слов и байт в указанном файле и общее количество строк, если указано более одного файла.
Сообщает, кто сейчас подключен.
Возвращает имя пользователя, соответствующее текущему ID.
Выводит циклически “y” или заданную строку, после чего завершается.
Некоторые программы имеют встроеные пути к программам, которые пока не установлены. Чтобы обеспечить доступ к этим программам, мы создадим ссылки на них, которые пока заменят нам реальные файлы до их установки.
ln -s /tools/bin/{bash,cat,pwd,stty} /bin ln -s /tools/bin/perl /usr/bin ln -s /tools/lib/libgcc_s.so.1 /usr/lib ln -s bash /bin/sh
Теперь нам надо создать структуру файловой системы LFS. Создадим дерево директорий, используя следующие команды:
install -d /{bin,boot,dev,etc/opt,home,lib,mnt} install -d /{sbin,srv,usr/local,var,opt} install -d /root -m 0750 install -d /tmp /var/tmp -m 1777 install -d /media/{floppy,cdrom} install -d /usr/{bin,include,lib,sbin,share,src} ln -s share/{man,doc,info} /usr install -d /usr/share/{doc,info,locale,man} install -d /usr/share/{misc,terminfo,zoneinfo} install -d /usr/share/man/man{1,2,3,4,5,6,7,8} install -d /usr/local/{bin,etc,include,lib,sbin,share,src} ln -s share/{man,doc,info} /usr/local install -d /usr/local/share/{doc,info,locale,man} install -d /usr/local/share/{misc,terminfo,zoneinfo} install -d /usr/local/share/man/man{1,2,3,4,5,6,7,8} install -d /var/{lock,log,mail,run,spool} install -d /var/{opt,cache,lib/{misc,locate},local} install -d /opt/{bin,doc,include,info} install -d /opt/{lib,man/man{1,2,3,4,5,6,7,8}}
По умолчанию директории создаются с правами доступа 755, но это правильно не для всех из них. Мы сделаем два изменения: одно для домашней директории пользователя root, а другое для директории для временных файлов.
Первой командой смены моды мы запрещаем доступ в директорию /root для всех, кроме владельца -- тоже самое нам надо будет потом сделать для домашних директорий остальных пользователей. Второй командой смены моды мы позволяем всем пользователям записывать и читать файлы в и из директорий /tmp и /var/tmp, но они не смогут удалять оттуда файлы других пользователей. Последнее достигается установкой “sticky bit” - старшего бита в битовой маске 1777.
Мы создаем наше дерево каталогов совместимым со стандартом FHS (доступен на http://www.pathname.com/fhs/). Вместе с деревом директорий, созданном выше, этот стандарт обуславливает существование /usr/local/games и /usr/share/games. Мы не рекомендуем их для базовой системы, хотя вы можете создать систему полностью FHS-совместимой. Поскольку структура субдиректорий /usr/local/share не описана в стандарте FHS, то мы создаем ее так, как надо нам.
Создание файлов passwd, group, и log
Установка заголовков Linux-Libc-2.6.8.1
Когда ядро загружает систему, оно требует наличия нескольких файлов устройств, обычно это устройства console и null. Создадим их запуском следующих команд:
mknod -m 600 /dev/console c 5 1 mknod -m 666 /dev/null c 1 3
Идеальный способ для заполнения /dev - это монтирование ramfs в /dev, как tmpfs и создавать там устройства при каждой загрузке. Поскольку система не была загружена, это необходимо сделать, чтобы в противном случае загрузочные скрипты могли выполниться и заполнить /dev. Начнем с монтирования /dev:
mount -n -t ramfs none /dev
Запустим установленную программу udevstart для создания первоначальных устройств, основанных на всей информации в директории /sys:
/tools/sbin/udevstart
Есть несколько ссылок и директорий, необходимых для LFS, которые не создаются Udev, поэтому создадим их здесь:
ln -s /proc/self/fd /dev/fd ln -s /proc/self/fd/0 /dev/stdin ln -s /proc/self/fd/1 /dev/stdout ln -s /proc/self/fd/2 /dev/stderr ln -s /proc/kcore /dev/core mkdir /dev/pts mkdir /dev/shm
В конце подмонтируем собственные виртуальные файловые системы (ядра) в только что созданные директории:
mount -t devpts -o gid=4,mode=620 none /dev/pts mount -t tmpfs none /dev/shm
Команды mount, запущенные выше, могут выдать следующее предупреждение:
can't open /etc/fstab: No such file or directory.
Этот файл - /etc/fstab - пока не был создан, но он пока не нужен для нормального монтирования файловых систем. Раз так, предупреждение может быть проигнорировано.
Программы из этиого пакета показывают различия между двумя файлами или директориями. Они обычно используются для создания различных патчей.
Расчетное время сборки 0.1 SBU
Требуемое место на диске 7.5 MB
Diffutils - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make и Sed
Подготавливаем Diffutils для компиляции:
./configure --prefix=/usr
Компилируем пакет
make
В этом пакете отсутствуют тесты.
Устанавливаем пакет
make install
Проинсталированные программы: cmp, diff, diff3 и sdiff
E2fsprogs содержит ряд системных утилит для поддержки файловой системы ext2. Они также поддерживают журналируемую файловую систему ext3.
Расчетное время сборки 0.6 SBU
Требуемое место на диске 4.9 MB
E2fsprogs - зависимости установки: Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Gettext, Glibc, Grep, Make, Sed и Texinfo
Рекомендуется собирать E2fsprogs вне директории с исходниками:
mkdir build cd build
Подготавливаем E2fsprogs для компиляции:
../configure --prefix=/usr --with-root-prefix="" \ --enable-elf-shlibs --disable-evms
Описание параметров конфигурации:
Определенные программы (такие как программа e2fsck) рассматриваются как необходимые программы. Например, когда раздел /usr не примонтирован, эти программы не будут доступны. Они должны находится в таких директориях как /lib и /sbin. Если этот параметр пропущен при конфигурации E2fsprogs, программы разместятся в директории /usr, что нам не нужно.
Это создаст разделяемую библиотеку для использования некоторыми программами из этого пакета.
Это отключит сборку плагина Enterprise Volume Management System (EVMS). Этот плагин не обновляется с последними внутренними EVMS интерфейсами и EVMS не инсталируется как часть базовой системы LFS, поэтому плагин не требуется. Смотрите EVMS сайт на http://evms.sourceforge.net/ для большей информации о EVMS.
Компилируем пакет:
make
Для проверки результата вводим:
make check
Инсталируем большинство программ:
make install
Инсталируем разделяемые библиотеки:
make install-libs
Проинсталированные программы: badblocks, blkid, chattr, compile_et, debugfs, dumpe2fs, e2fsck, e2image, e2label, findfs, fsck, fsck.ext2, fsck.ext3, logsave, lsattr, mk_cmds, mke2fs, mkfs.ext2, mkfs.ext3, mklost+found, resize2fs, tune2fs и uuidgen.
Проинсталированные библиотеки: libblkid.[a,so], libcom_err.[a,so], libe2p.[a,so], libext2fs.[a,so], libss.[a,so] и libuuid.[a,so]
Ищет на устройстве (обычно разделе диска) плохие блоки.
Утилита командной строки для определения и печати атрибутов блочных устройств.
Изменяет атрибуты файла в файловой системе ext2, а также ext3 файловой системы - журналируемой версии ext2 файловой системы.
Компилятор таблицы ошибок. Он конвертирует таблицу названий кодов ошибок и сообщений в исходный код на C для использования с библиотекой com_err.
Отладчик файловой системы. Он может использоваться для проверки и изменения состояния файловой системы ext2.
Печатает информацию о super блоке и группе блоков для файловых систем на указанном устройстве.
Используется для проверки и исправления ошибок файловых систем ext2 и ext3.
Используется для сохранения критически важных данных файловой системы ext2 в файл.
Возвращает или изменяет метку тома на файловой системе ext2 на указанном устройстве.
Ищет файловую систему по метке тома или UUID.
Используется для проверки и исправления ошибок файловых систем.
По умолчанию проверяет файловые системы ext2.
По умолчанию проверяет файловые системы ext3.
Сохраняет вывод команды в лог-файл.
Выводит список атрибутов файлов на файловой системе ext2.
Конвертирует таблицу команд и справочных сообщений в исходники на C для использования с библиотекой libss.
Используется для создания файловой системы ext2 на указанном устройстве.
По умолчанию создает ext2 файловую систему
По умолчанию создает ext3 файловую систему
Используется для создания директории lost+found на файловой системе ext2; Он заранее выделяет блоки для этой директории для нужд e2fsck.
Используется для изменения размеров файловой системы ext2.
Используется для изменения настраиваемых параметров файловой системы ext2.
Создает новый универсальный уникальный идентификатор (universally unique identifier - UUID). Этот новый UUID будет уникальным среди всех созданных UUID на локальной или другой системе в прошлом и будущем.
Содержит правила идентификации устройств и получения содержимого.
Содержит правила вывода стандартных ошибок.
Используется dumpe2fs, chattr и lsattr
Содержит правила для работы программ уровня пользователя для манипулирования файловой системы ext2.
Используется debugfs
Содержит правила для генерации уникальных идентификаторов объектов, которые позволяют получать к ним доступ на локальной системе.
File является утилитой для определения типа файла.
Расчетное время сборки 0.1 SBU
Требуемое место на диске 6.3 MB
File - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make, Sed и Zlib
Подготавливаем File для компиляции:
./configure --prefix=/usr
Компилируем пакет
make
Устанавливаем пакет
make install
Проинсталированные программы: file
Проинсталированные библиотеки: libmagic.[a,so]
Пакет Findutils содержит программы для поиска файлов, в том числе "на лету" (путем рекурсивного поиска от директории и показывая только файлы удовлетворяющие параметрам поиска) или поиск через бызу данных.
Расчетное время сборки 0.2 SBU
Требуемое место на диске 7.5 MB
Findutils - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make и Sed
Подготавливаем Findutils для компиляции:
./configure --prefix=/usr --libexecdir=/usr/lib/locate \ --localstatedir=/var/lib/locate
Директива localstatedir, указанная выше, меняет положение базы данных locate на /var/lib/locate для FHS-совместимости.
Компилируем пакет
make
Для проверки результата вводим: make check.
Устанавливаем пакет
make install
Проинсталированные программы: bigram, code, find, frcode, locate, updatedb и xargs
Ранее использовался для создания баз данных locate
Ранее использовался для создания баз данных locate; это предшественник frcode.
Поиск файлов, удовлетворяющих особым критериям, по дереву директорий
Вызывается программой updatedb для сжатия списка файлов; компрессия уменьшает размер базы данных в четыре-пять раз.
Осуществляет поиск в базе данных имен файлов и сообщает имена, которые содержат искомую строку или искомый образец
Обновляет базу данных locate; сканирует содержимое файловой системы (включая другие файловоые системы, которые подмонтированы в данный момент, если не оговорено обратное) и заносит каждое имя файла, которое находит, в базу данных
Может применяться в команде поиска по списку файлов
Пакет Flex используется для генерации программ, которые могут обрабатывать шаблоны в тексте.
Расчетное время сборки 0.1 SBU
Требуемое место на диске 3.4 MB
Flex - зависимости установки: Bash, Binutils, Bison, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, M4, Make и Sed
Flex содержит несколько известных проблем. Исправим их с помощью следующего патча:
patch -Np1 -i ../flex-2.5.31-debian_fixes-2.patch
GNU autotools определит, что исходный код Flex был изменен предыдущим патчем и, соответственно, попытается обновить страницы документации. Это не работает на многих системах и основная страница остается неизменной, поэтому подтверждаем, что она не была изменена:
touch doc/flex.1
Подготавливаем Flex для компиляции:
./configure --prefix=/usr
Компилируем пакет
make
Для проверки результата вводим: make check.
Устанавливаем пакет
make install
Некоторые пакеты ищут библиотеку lex в /usr/lib. Создадим необходимую ссылку:
ln -s libfl.a /usr/lib/libl.a
Некоторые программы не знают о flex и используют его предыдущий вариант, lex. Для поддержки таких программ создадим shell-скрипт lex который будет вызывать flex в режиме эмуляции lex:
cat > /usr/bin/lex << "EOF" #!/bin/sh # Begin /usr/bin/lex exec /usr/bin/flex -l "$@" # End /usr/bin/lex EOF chmod 755 /usr/bin/lex
Проинсталированные программы: flex, flex++ (ссылка на flex) и lex
Проинсталированные библиотеки: libfl.a
Инструмент для генерации программ, которые могут обрабатывать шаблоны в тексте; он допускает для разнообразных программ указывать правила для поиска по образцу, делая ненужной разработку специальных программы
Запрашивает версию flex которая используется исключительно для сканеров C++
Скрипт, который запускает flex в режиме эмуляции lex
Библиотека flex
Gawk является вариантом awk, который используется для манипуляций с текстовыми файлами.
Расчетное время сборки 0.2 SBU
Требуемое место на диске 17 MB
Gawk - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make и Sed
Подготавливаем Gawk для компиляции:
./configure --prefix=/usr --libexecdir=/usr/lib
Компилируем пакет
make
Для проверки результата вводим: make check.
Устанавливаем пакет
make install
Проинсталированные программы: awk (ссылка на gawk), gawk, gawk-3.1.4, grcat, igawk, pgawk, pgawk-3.1.4 и pwcat
Ссылка на gawk
Используется для манипуляций с текстовыми файлами.; это GNU реализация awk
Жесткая ссылка на gawk
Распечатывает базу данных групп /etc/group
Дает gawk способность включать файлы
Профилированная версия gawk
Жесткая ссылка на pgawk
Распечатывает базу данных паролей /etc/passwd
Пакет GCC содержит коллекцию компилятора GNU, включая компиляторы C и C++.
Расчетное время сборки 11.7 SBU
Требуемое место на диске 294 MB
GCC - зависимости установки: Bash, Binutils, Coreutils, Diffutils, Findutils, Gawk, Gettext, Glibc, Grep, Make, Perl, Sed и Texinfo
Этот пакет известен своим нестабильным поведением при компиляции с измененными опциями оптимизации (включая опции -march и -mcpu). GCC рекомендуется компилировать с настройками по умолчанию. Если вы задали переменные такие как CFLAGS и CXXFLAGS, рекомендуется убрать их при сборке пакета GCC.
Сейчас мы собираемся установить компиляторы языков C и C++, таким образом вам надо распаковать архивы GCC-core и GCC-g++ - они распакуются в одну и ту же директорию. Вы можете также распаковать пакет GCC-testsuite. Полный пакет GCC содержит намного больше компиляторов. Инструкции по их установке вы можете найти на http://www.linuxfromscratch.org/blfs/view/svn/general/gcc.html.
Примените только No-Fixincludes патч (не Specs патч), также использованный в предыдущей части:
patch -Np1 -i ../gcc-3.4.1-no_fixincludes-1.patch
GCC выпадает с ошибкой при компиляции некоторых пакетов, не входящих в базовую систему Linux From Scratch (такие как Mozilla и kdegraphics) когда применяется совместно с неправильной версией Binutils. Применим следующий патч для коррекции этой проблемы:
patch -Np1 -i ../gcc-3.4.1-linkonce-1.patch
Применим sed-замещение, которое запретит инсталяцию libiberty.a. Версия libiberty.a будет использоваться от Binutils:
sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in
В документации по GCC рекомендуется собирать GCC вне директории с исходниками в отдельной директории для сборки:
mkdir ../gcc-build cd ../gcc-build
Подготавливаем GCC для компиляции:
../gcc-3.4.1/configure --prefix=/usr \ --libexecdir=/usr/lib --enable-shared \ --enable-threads=posix --enable-__cxa_atexit \ --enable-clocale=gnu --enable-languages=c,c++
Компилируем пакет
make
В этой части тестирование GCC является обязательным. Не пропускайте его.
Тестируем результат, но не останавливаемся при возникновении ошибок:
make -k check
Некоторые из известных ошибок были описаны в предыдущей части. Тест из Раздела 5.13, “GCC-3.4.1 - Шаг 2” все еще актуален здесь. Можете повторить его при необходимости.
Устанавливаем пакет
make install
Некоторые пакеты рассчитывают, что препроцессор C будет установлен в директории /lib. Для поддержки этих пакетов, создадим ссылку:
ln -s ../usr/bin/cpp /lib
Многие пакеты используют имя cc для вызова компилятора С. Для поддержки таких пакетов создадим ссылку:
ln -s gcc /usr/bin/cc
В этом месте рекомендуется повторить тест из части 6.12, “Переустановка средств”. Если тест не прошел, то, скорее всего, вы применили патч GCC Specs из Главы5.
Проинсталированные программы: c++, cc (link to gcc), cpp, g++, gcc, gccbug и gcov
Проинсталированные библиотеки: libgcc.a, libgcc_eh.a, libgcc_s.so, libstdc++.[a,so] и libsupc++.a
C компилятор
C препроцессор; используется компилятором для извлечения #include, #define и похожих определений в исходных файлах
C++ компилятор
C++ компилятор
C компилятор
Скрипт, применяемый для облегчения создания сообщений об ошибках
Содержит в себе несколько тестов; используется для анализа программ и определения, где оптимизация будет иметь наибольший эффект
Описывает run-time поддержку для gcc
Стандартная C++ библиотека
Предоставляет поддержку шаблонов для языка програмирования C++
Пакет Gettext используется для интернационализации и локализации. Программы могут быть скомпилированы с Поддержкой Родного Языка (Native Language Support - NLS) для получения возможности вывода сообщений на языке пользователя.
Расчетное время сборки 0.5 SBU
Требуемое место на диске 55 MB
Gettext - зависимости установки: Bash, Binutils, Bison, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make и Sed
Подготавливаем Gettext для компиляции:
./configure --prefix=/usr
Компилируем пакет
make
Для проверки результата вводим: make check.
Тестирование Gettext занимает много времени, около 7 SBU.
Устанавливаем пакет
make install
Проинсталированные программы: autopoint, config.charset, config.rpath, envsubst, gettext, gettextize, hostname, msgattrib, msgcat, msgcmp, msgcomm, msgconv, msgen, msgexec, msgfilter, msgfmt, msggrep, msginit, msgmerge, msgunfmt, msguniq, ngettext и xgettext
Проинсталированные библиотеки: libasprintf[a,so], libgettextlib[a,so], libgettextpo[a,so] и libgettextsrc[a,so]
Копирует файлы стандартной инфраструктуры gettext в пакет исходников.
Выводит системо-зависимую таблицу кодов символов.
Выводит системо-зависимый набор переменных, описывающий как установить путь для поиска библиотек и программ.
Заменяет переменные окружения в строки в формате shell.
Переводит сообщение на исходном языке в сообщение на языке пользователя, находя перевод в каталоге сообщений.
Копирует стандартные файлы Gettext в указанную корневую директорию пакета для возможности его интернационализации.
Возвращает сетевое имя хоста в разных форматах.
Фильтрует сообщения каталога переводов по их атрибутам и управляет атрибутами.
Объединяет указанные файлы .po.
Сравнивает два файла .po, определяя наличие строк с одинаковым msgid.
Ищет одинаковые сообщения, содержащиеся в указанных файлах .po.
Преобразует каталог перевода в другую кодировку.
Создает каталог перевода на английский.
Применяет команду ко всем переводам в каталоге переводов.
Применяет фильтр ко всем переводам в каталоге переводов.
Генерирует двоичный каталог сообщений из каталога переводов.
Извлекает все сообщения из каталога перевода, которые содержат указанный шаблон или принадлежащие заданным исходным файлам.
Создает новый файл .po, инициализирует мета-информацию с переменными из пользовательского окружения.
Объединяет два перевода в один файл.
Декомпилирует каталог двоичных сообщений в текст перевода.
Унифицирует дублирующиеся переводы в каталоге переводов.
Выводит перевод сообщения, чья форма зависит от числа, на родной язык.
Извлекает переводы строк сообщений из указанных исходников для создания шаблона перевода.
Определяет класс autosprintf, который создает правила для форматирования вывода C в программах на C++ для использования в строках <string> и потоках <iostream>.
Частная библиотека, содержащая основные правила, используемые различными программами gettext. Она не предназначена для общего использования.
Используется для написания специализарованных программ, создающих файлы .po. Эта библиотека используется когда стандартных приложений, входящих в пакет gettext, не достаточно (таких как msgcomm, msgcmp, msgattrib и msgen).
Частная библиотека, содержащая основные правила, используемые различными программами gettext. Она не предназначена для общего использования.
Glibc является библиотекой C, которая обеспечивает системные вызовы и основные функции, такие как open, malloc, printf и т.д. Библиотека C используется для всех динамически скомпонованых программ.
Расчетное время сборки 12.3 SBU
Требуемое место на диске 784 MB
Glibc - зависимости установки: Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Gettext, Grep, Make, Perl, Sed и Texinfo
Этот пакет известен своим нестабильным поведением при компиляции с измененными опциями оптимизации (включая опции -march и -mcpu). Если вы задали переменные окружения, такие как CFLAGS и CXXFLAGS, рекомендуется убрать их при сборке Glibc.
Система сборки Glibc является весьма самодостаточной и должна установится корректно, даже если ваши spec файл и компоновщик находятся в /tools. Мы не можем установить spec и компоновщик перед установкой Glibc потому, что тест автоконфинурации Glibc даст фиктивные результаты и от этого зависит чистота сборки.
Документация по Glibc рекомендует собирать Glibc вне директории с исходниками, в отдельной директории для сборки:
mkdir ../glibc-build cd ../glibc-build
Подготавливаем Glibc для компиляции:
../glibc-2.3.4-20040701/configure --prefix=/usr \ --disable-profile --enable-add-ons=nptl --with-tls \ --with-__thread --enable-kernel=2.6.0 --without-cvs \ --libexecdir=/usr/lib/glibc \ --with-headers=/tools/glibc-kernheaders
Описание новых опций конфигурации:
Изменяем место установки программы pt_chown из места по умолчанию /usr/libexec в директорию /usr/lib/glibc.
Компилируем пакет
make
В этом месте тестирование Glibc будет очень уместно. Не пропускайте его.
Протестируем результаты:
make check
Тестирование Glibc сильно зависит от некоторых функций вашей основной системы, в частности ядра. Также, некоторые тесты в этой главе могут взаимодействовать с окружением вашей системы. В общем, тестирование Glibc должно пройти удачно. Тем не менее, по причинам, перечисленным ниже, тестирование может закончиться неудачно. Вот список наиболее вероятных причин этого:
Тест math иногда не проходит при его запуске на системе с процессорами, отличными от новых Intel-совместимых или оригинальных AMD. Также это может произойти при некоторых установках оптимизации.
Тест gettext иногда не проходит из-за зависимостей от основной системы. Точная причина пока не ясна.
Тест atime иногда не проходит, когда раздел LFS монтирован с опцией noatime.
Тест shm может не пройти, если в вашей системе запущена файловая система devfs, но нет файловой системы tmpfs, монтированой на /dev/shm. Это происходит, если отключена поддержка tmpfs в ядре.
При запуске на старом и медленном оборудовании некоторые тесты могут не пройти по тайм-ауту.
На этапе инсталляции Glibc может выдать предупреждение в конце об отсутствии /etc/ld.so.conf. Упредим это сообщение:
touch /etc/ld.so.conf
Устанавливаем пакет
make install
Локали различных языков, на которых могут осуществляться системные сообщения, не устанавливаются предыдущей командой. Они устанавливаются командой:
make localedata/install-locales
Альтернативой запуску предыдущей команды для экономии времени является установка только определенных локалей, тех которые вам нужны. Это может быть достигнуто использованием команды localedef. Информацию об использовании этой команды можно получить из файла INSTALL в исходниках Glibc. Тем не менее, список локалей может быть существенным для некоторых тестов, в частности, теста libstdc++ из GCC. Следующие команды, используемые вместо вышеописаной install-locales, установят минимальный набор локалей для успешного завершения тестирований:
mkdir -p /usr/lib/locale localedef -i de_DE -f ISO-8859-1 de_DE localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro localedef -i en_HK -f ISO-8859-1 en_HK localedef -i en_PH -f ISO-8859-1 en_PH localedef -i en_US -f ISO-8859-1 en_US localedef -i es_MX -f ISO-8859-1 es_MX localedef -i fa_IR -f UTF-8 fa_IR localedef -i fr_FR -f ISO-8859-1 fr_FR localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro localedef -i it_IT -f ISO-8859-1 it_IT localedef -i ja_JP -f EUC-JP ja_JP
Некоторые локали, установленные командой make localedata/install-locales, не полностью поддерживаются некоторыми приложениями, описанными в LFS и BLFS книгах. Поскольку такие проблемы существуют и приводят к сбоям на некотрых локалях, LFS не может быть использована с локалями, использующими мультибайтные таблицы символов (включая UTF-8) или пишущиеся в порядке справа налево. Необходимы многочисленные неофициальные и нестабильные патчи для устранения этих проблем, поэтому LFS-разработчиками было решено не поддерживать таких комплексных локалей. Это применено также к локалям ja_JP и fa_IR - они были установлены только для прохождения тестов GCC и Gettext и программы watch (части пакета Procps), которые не работают корректно в них. Некоторые попытки обойти эти ограничения описаны в интернационально-связанных заметках.
Соберем документацию по linuxthreads, которая является большим описанием по threading API (применимой и к NPTL):
make -C ../glibc-2.3.4-20040701/linuxthreads/man
Проинсталируем эту документацию:
make -C ../glibc-2.3.4-20040701/linuxthreads/man install
Нам нужно создать файл /etc/nsswitch.conf потому, что по умолчанию Glibc не создает этот файл и без него не работает с сетью. Так же необходимо установить часовой пояс.
Создадим новый файл /etc/nsswitch.conf, запустив следующую команду:
cat > /etc/nsswitch.conf << "EOF" # Begin /etc/nsswitch.conf passwd: files group: files shadow: files hosts: files dns networks: files protocols: files services: files ethers: files rpc: files # End /etc/nsswitch.conf EOF
Для определения вашего часового пояса, запустите скрипт:
tzselect
Когда вы ответите на некоторые вопросы о вашим местонахождении, скрипт выдаст имя вашего часового пояса. Что-то наподобие Europe/Kiev. Затем создадим файл /etc/localtime запуском:
cp --remove-destination /usr/share/zoneinfo/[xxx] \ /etc/localtime
Замените [xxx] именем часового пояса, который выдаст tzselect (например, Europe/Kiev).
Описание параметров:
Это необходимо для удаления существующей ссылки. Мы используем копию файла вместо ссылки в случае, если /usr находится на другом разделе. Также это нужно, например, когда вы загружаетесь в однопользовательском режиме.
По умолчанию, динамический загрузчик (/lib/ld-linux.so.2) ищет динамические библиотеки, необходимые для программ, в/lib и /usr/lib. Таким образом, если есть директории с библиотеками, отличные от /lib и /usr/lib, вам надо указать их в файле /etc/ld.so.conf в порядке поиска их динамическим загрузчиком. Две наиболее распространенные директории с дополнительными библиотеками находятся в /usr/local/lib и /opt/lib, и мы добавим их в путь поиска динамического загрузчика.
Создадим новый файл /etc/ld.so.conf запуском команды:
cat > /etc/ld.so.conf << "EOF" # Begin /etc/ld.so.conf /usr/local/lib /opt/lib # End /etc/ld.so.conf EOF
Проинсталированные программы: catchsegv, gencat, getconf, getent, iconv, iconvconfig, ldconfig, ldd, lddlibc4, locale, localedef, mtrace, nscd, nscd_nischeck, pcprofiledump, pt_chown, rpcgen, rpcinfo, sln, sprof, tzselect, xtrace, zdump и zic
Проинсталированные библиотеки: ld.so, libBrokenLocale.[a,so], libSegFault.so, libanl.[a,so], libbsd-compat.a, libc.[a,so], libcrypt.[a,so], libdl.[a,so], libg.a, libieee.a, libm.[a,so], libmcheck.a, libmemusage.so, libnsl.a, libnss_compat.so, libnss_dns.so, libnss_files.so, libnss_hesiod.so, libnss_nis.so, libnss_nisplus.so, libpcprofile.so, libpthread.[a,so], libresolv.[a,so], librpcsvc.a, librt.[a,so], libthread_db.so и libutil.[a,so]
Может быть использована для трассировки стэка, когда программа прервана с ошибкой сегментации
Генерирует каталоги сообщений
Показывает значения системных конфигураций для специфичных переменных файловой системы
Получает содержимое из административной базы данных
Осуществляет конвертацию символов
Создает быстро загружаемый iconv модуль конфигурационных файлов
Конфигурирует динамический компоновщик
Сообщает, какие разделяемые библиотеки требуются каждой указанной программе или разделяемой библиотеке
Помагает ldd в работе с объектными файлами
Говорит компилятору разрешить или запретить использование POSIX локалей для встроенных операций
Компилирует спецификации локалей
Читает и интерпритирует файл трассировки памяти и выводит результат в формате, удобном для восприятия человеком
Демон, который обеспечивает кэш для большинства известных имен запросов сервисов
Проверяет, необходим или нет безопасный режим для NIS+lookup
Распечатывает информацию, сгенерированную PC profiling
Программа-помощник к grantpt для установки владельца, группы и прав доступа ведомого псевдо терминала
Генерирует C код для встраивания в протокол вызова удаленной процедуры (Remote Procecure Call - RPC)
Создает вызов RPC к RPC серверу
Статически слинкованная программаln
Читает и показывает профильные данные разделяемого объекта
Спрашивает пользователя о местоположении системы и выдает соответствующее описание часового пояса
Отслеживает запуск программы, печатая текущую запущенную функцию
Информация о часовом поясе
Компилятор часовых поясов
Программа-загрузчик для разделяемых библиотек
Используется программами, такими как Mozilla, для решения проблем с поврежденными локалями
Библиотека сигналов ошибки сегментации
Библиотека поиска асинхронных имен
Предоставляет совместимость, необходимую для запуска Berkey Software Distribution (BSD) программ под Linux
Базовая библиотека C
Криптографическая библиотека
Библиотека интерфейса динамического связывания
Библиотека для g++
Библиотека для работы с числами с плавающей запятой Института "Electrical and Electronic Engineers" (IEEE)
Математическая библиотека
Описывает запуск кода при загрузке
Используется программой memusage для сбора информации об использовании памяти программами
Библиотека сетевых сервисов
Библиотека Name Service Switch, описывающая функции для разбора имен хостов, имен пользователей, имен групп, алиасов, сервисов, протоколов и т.д.
Библиотека POSIX-нитей
Описывает функции для создания, посылки и интерпритации пакетов к серверам имен интернет
Описывает функции, предоставляющие разнообразные RPC сервисы
Описывает функции, предоставляющие большинство из интерфейсов, специфицированных POSIX.1b Realtime Extension
Описывает функции, полезные для построения отладчиков для multi-threaded программ
Описывает код для “стандартных” функций, используемых во многих других Юникс утилитах
Grep является программой для поиска в содержимом файлов.
Расчетное время сборки 0.1 SBU
Требуемое место на диске 5.8 MB
Grep - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Make, Sed и Texinfo
Подготавливаем Grep для компиляции:
./configure --prefix=/usr --bindir=/bin --with-included-regex
Компилируем пакет
make
Для проверки результата вводим: make check.
Устанавливаем пакет
make install
Проинсталированные программы: egrep (ссылка на grep), fgrep (ссылка на grep) и grep
Пакет Groff содержит некоторые программы для обработки и форматирования текста.
Расчетное время сборки 0.5 SBU
Требуемое место на диске 43 MB
Groff - зависимости установки: Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make и Sed
Groff использует переменную окружения PAGE для определения размеров бумаги по умолчанию. При использовании в США, команда PAGE=letter корректна. Если вы живете в другом месте, PAGE=A4 может быть предпочтительнее.
Подготавливаем Groff для компиляции:
PAGE=[paper_size] ./configure --prefix=/usr
Компилируем пакет
make
Устанавливаем пакет
make install
Некоторые программы документации, например xman, не будут работать правильно без следующих ссылок:
ln -s soelim /usr/bin/zsoelim ln -s eqn /usr/bin/geqn ln -s tbl /usr/bin/gtbl
Проинсталированные программы: addftinfo, afmtodit, eqn, eqn2graph, geqn (ссылка на eqn), grn, grodvi, groff, groffer, grog, grolbp, grolj4, grops, grotty, gtbl (ссылка на tbl), hpftodit, indxbib, lkbib, lookbib, mmroff, neqn, nroff, pfbtops, pic, pic2graph, post-grohtml, pre-grohtml, refer, soelim, tbl, tfmtodit, troff и zsoelim (ссылка на soelim)
Читает файл шрифта troff и добавляет некоторую дополнительную фонт-метрическую информацию, которая используется системой groff
Создает файл шрифта для использования с groff и grops
Компилирует описания, встроенные во фходных файлах troff в команды, понимаемые troff
Конвертирует troff EQN (выравнивание) в точечное изображение
Ссылка на eqn
groff препроцессор для файлов в формате gremlin
Драйвер для groff, который предоставляет формат TeX dvi
Оболочка для системы форматирования документов groff; обычно он запускает программу troff и пост-обработчик присваивается для выбранного устройства
Показывает файлы groff и документы в формате man на X и tty терминалах
Читает файлы и определяет, какие из опций groff-e, -man, -me, -mm, -ms, -p, -s и -t необходимы для печати файлов и сообщает groff команду, включающую эти опции
Это groff драйвер для принтеров Canon CAPSL (лазерные принтеры серий LBP-4 and LBP-8)
Драйвер для groff, который обеспечивает вывод в формате PCL5 для принтера, совместимого с HP Laserjet 4
Переводит вывод GNU troff в PostScript
Переводит вывод GNU troff в форму, подходящую для символьно-печатающих устройств
GNU реализация tbl
Создает файл шрифта для использования с groff -Tlj4 из HP-tagged файла метрического шрифта
Создает инвертированный индекс для библиографических баз данных с специфицированным файлом для использования с refer, lookbib и lkbib
Осуществляет поиск ссылок, содержащих специфичные ключи, по библиографическим базам данных и сообщает о наличии любых ссылок
Печатает приглашение на устройство стандартной ошибки (если устройство стандартного ввода не терминал), читает строку, содержащую установку ключевых слов с устройства стандартного ввода, ищет библиографические базы данных в специфицированном файле для поиска ссылок, содержащих эти ключевые слова, печатает любые найденные ссылки на устройство стандартного вывода и повторяет этот процесс до окончания ввода
Простой препроцессор для groff
Форматирует выравнивание для American Standard Code для Information Interchange (ASCII) вывода
Скрипт, эмулирующий команду nroff, используя groff
Транслирует PostScript шрифт в формате .pfb в ASCII
Компилирует описания изображений, встроенные во входные файлы troff или TeX в команды, понимаемые TeX или troff
Конвертирует диаграммы PIC в растровые изображения
Переводит вывод GNU troff в html
Переводит вывод GNU troff в html
Копирует содержание файла на устройство стандартного вывода, исключая строки между .[ и .], интерпретированные как цитаты, и строки между .R1 и .R2, интерпретированные как команды, так как цитаты должны быть обработаны
Читает файлы и заменяет строки в форме .so файла по содержанию запомненного файла
Компилирует описания таблиц, встроенные во входные файлы troff в команды, понимаемые troff
Создает файл шрифта для использования с groff -Tdvi
Наиболее совместимый с Unix troff; обычно помагает использованию команды groff, которая будет также запускать препроцессор и постпроцессор в порядке присвоения и в присвоении опций
GNU реализация soelim
Пакет Grub содержит загрузчик.
Расчетное время сборки 0.2 SBU
Требуемое место на диске 10 MB
Grub - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make, Ncurses и Sed
Этот пакет известен своим нестабильным поведением при компиляции с измененными опциями оптимизации (включая опции -march и -mcpu). Если вы задали переменные окружения, такие как CFLAGS и CXXFLAGS, рекомендуется убрать их при сборке Grub.
Подготавливаем Grub для компиляции:
./configure --prefix=/usr
Компилируем пакет
make
Для проверки результата вводим: make check.
Заметьте, что в результатах теста всегда будет сообщение об ошибке “ufs2_stage1_5 is too big”. Это соответствует результату компилирования, но может быть проигнорировано пока вы только планируете загружаться из UFS раздела. Такой раздел обычно используется в рабочих станциях Sun.
Устанавливаем пакет
make install mkdir /boot/grub cp /usr/share/grub/i386-pc/stage{1,2} /boot/grub
Заменим i386-pc на директорию, соответствующую вашему железу.
Директория i386-pc содержит также ряд файлов *stage1_5, для разных файловых систем. Посмотрите какие из них доступны и скопируйте их в директорию /boot/grub. Обычно следует скопировать файлы e2fs_stage1_5 и/или reiserfs_stage1_5.
Проинсталированные программы: grub, grub-install, grub-md5-crypt, grub-terminfo и mbchk
Командная оболочка загрузчиеа
Инсталирует GRUB на выбранное устройство
Шифрует пароль в формате MD5
Генерирует terminfo команду из имени terminfo; может быть использован если будет задействован неизвестный терминал
Проверяет формат мультизагрузочного ядра
Пакет Gzip содержит программы для сжатия и распаковки файлов.
Расчетное время сборки 0.1 SBU
Требуемое место на диске 2.6 MB
Gzip - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make и Sed
Подготавливаем Gzip для компиляции:
./configure --prefix=/usr
Скрипт gzexe имеет встроенный путь к бинарнику gzip. Поскольку мы позднее изменим положение этого файла, следующая команда позволит встроить новый путь в бинарник:
sed -i 's@"BINDIR"@/bin@g' gzexe.in
Компилируем пакет
make
Устанавливаем пакет
make install
Переместим программы в директорию /bin:
mv /usr/bin/gzip /bin rm /usr/bin/{gunzip,zcat} ln -s gzip /bin/gunzip ln -s gzip /bin/zcat ln -s gunzip /bin/uncompress
Проинсталированные программы: gunzip (ссылка на gzip), gzexe, gzip, uncompress (ссылка на gunzip), zcat (ссылка на gzip), zcmp, zdiff, zegrep, zfgrep, zforce, zgrep, zless, zmore и znew
Распаковывает gzip-файлы
Создает самораспаковывающиеся файлы
Сжимает файлы, используя кодирование Lempel-Ziv (LZ77)
Распаковывает сжатые файлы
Распаковывает gzip-файлы на устройство стандартного вывода
Запускает cmp на gzip-файлах
Запускает diff на gzip-файлах
Запускает egrep на gzip-файлах
Запускает fgrep на gzip-файлах
Принудительно устанавливает расширение .gzна всех выбранных gzip-файлах, поэтому gzip не будет сжимать их опять; это может быть полезно, когда имя файла было изменено во время передачи файла
Запускает grep на gzip-файлах
Запускает less на gzip-файлах
Запускает more на gzip-файлах
Пересжимает файлы из формата compress в формат gzip - .Z в .gz
Iana-Etc содержит данные для сетевых сервисов и протоколов
Расчетное время сборки 0.1 SBU
Требуемое место на диске 641 KB
Iana-Etc - зависимости установки: Make
Разбираем данные:
make
Устанавливаем пакет
make install
Проинсталированные файлы: /etc/protocols и /etc/services
Sed является редактором потоков.
Расчетное время сборки 0.2 SBU
Требуемое место на диске 5.2 MB
Sed - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make и Texinfo
Подготавливаем Sed для компиляции:
./configure --prefix=/usr --bindir=/bin
Компилируем пакет
make
Для проверки результата вводим: make check.
Устанавливаем пакет
make install
Tar является программой архивирования
Расчетное время сборки 0.2 SBU
Требуемое место на диске 10 MB
Tar - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make и Sed
Подготавливаем Tar для компиляции:
./configure --prefix=/usr --bindir=/bin --libexecdir=/usr/sbin
Компилируем пакет
make
Для проверки результата вводим: make check.
Устанавливаем пакет
make install
Пакет M4 является макро процессором.
Расчетное время сборки 0.1 SBU
Требуемое место на диске 3.0 MB
M4 - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Perl и Sed
Подготавливаем M4 для компиляции:
./configure --prefix=/usr
Компилируем пакет
make
Для проверки результата вводим: make check.
Устанавливаем пакет
make install
Проинсталированные программы: m4
Копирует ввод на вывод, используя макросы. Макросы могут быть как встроеными, так и пользовательскими и могут иметь несколько аргументов. Помимо макро-преобразований, m4 имеет встроеные функции для включения именованых файлов, запуска команд Unix, целочисленной арифметики, разносторонними манипуляциями с текстом, рекурсию и др. Программа m4 может использоваться в качестве front-end для компиляторов или как макропроцессор на ваше усмотрение.
Пакет Ncurses содержит библиотеки для расширения возможностей текстового интерфейса, включая панели и меню.
Расчетное время сборки 0.6 SBU
Требуемое место на диске 27 MB
Ncurses - зависимости установки: Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make и Sed
Подготавливаем Ncurses для компиляции:
./configure --prefix=/usr --with-shared --without-debug
Компилируем пакет
make
Устанавливаем пакет
make install
Установим права доступа для библиотек Ncurses:
chmod 755 /usr/lib/*.5.4
Установим права доступа для библиотеки, которая не должна быть исполняемой:
chmod 644 /usr/lib/libncurses++.a
Переместим библиотеки в директорию /lib, где они должны быть:
mv /usr/lib/libncurses.so.5* /lib
Поскольку библиотеки были перемещены, некоторые ссылки указывают на несуществующие файлы. Исправим их:
ln -sf ../../lib/libncurses.so.5 /usr/lib/libncurses.so ln -sf libncurses.so /usr/lib/libcurses.so
Проинсталированные программы: captoinfo (ссылка на tic), clear, infocmp, infotocap (ссылка на tic), reset (ссылка на tset), tack, tic, toe, tput и tset
Проинсталированные библиотеки: libcurses.[a,so] (ссылка на libncurses.[a,so]), libform.[a,so], libmenu.[a,so], libncurses++.a, libncurses.[a,so] и libpanel.[a,so]
Конвертирует описание termcap в описание terminfo
Очищает экран, если это возможно
Сравнивает или печатает описания terminfo
Конвертирует описание terminfo в описание termcap
Реинициализирует терминал со значениями по умолчанию
Проверяет действия terminfo. Он главным образом используется для тестирования корректировок элементов базы данных terminfo
Компилятор описаний записей terminfo. Он преобразует файл terminfo из исходного формата в двоичный, необходимый для работы библиотеки ncurses. Файл terminfo содержит информацию о возможностях соответствующего терминала
Выводит список всех доступных типов терминалов по их имени и описанию
Делает информаию о терминале доступной шеллу. Он также может использоваться для сброса или инициализации терминала или показа его полного имени
Может использоваться для инициализации терминала
Ссылка на libncurses
Содержит функции для отображения текста разными способами на экране терминала. Хорошим примером использования этих функций является меню, отображаемое при настройке параметров ядра командой make menuconfig
Содержит функции работы с формами
Содержит функции работы с меню
Содержит функции работы с панелями
Пакет Perl содержит perl, язык практичной обработки и отчетов (Practical Extraction and Report Language).
Расчетное время сборки 2.9 SBU
Требуемое место на диске 143 MB
Perl - зависимости установки: Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make и Sed
Если вы хотите контролировать процесс настроек опций сборки Perl, вы можете запустить интерактивный скрипт Configure и указывать опции сборки Perl. Если вы хотите оставить настройки Perl, которые определяются автоматически по умолчанию, то просто запустите команду:
./configure.gnu --prefix=/usr -Dpager="/bin/less -isR"
Описание опций конфигурации:
Корректирует ошибку в коде perldoc, связанную с работой программы less.
Компилируем пакет
make
Для проведения теста необходимо создать базовый файл /etc/hosts, необходимый для пары тестов, использующих имя localhost:
echo "127.0.0.1 localhost $(hostname)" > /etc/hosts
Теперь, если хотите, запустим тест:
make test
Устанавливаем пакет
make install
Проинсталированные программы: a2p, c2ph, dprofpp, enc2xs, find2perl, h2ph, h2xs, libnetcfg, perl, perl5.8.5 (ссылка на perl), perlbug, perlcc, perldoc, perlivp, piconv, pl2pm, pod2html, pod2latex, pod2man, pod2text, pod2usage, podchecker, podselect, psed (ссылка на s2p), pstruct (ссылка на c2ph), s2p, splain и xsubpp
Проинсталированные библиотеки: слишком много названий для перечисления
Переводит awk в perl
Делает дамп структур C, генерируемых cc -g -S
Отображает данные профиля perl
Собирает расширение Perl для модулей Encode из таблиц символов Unicode или файлов кодировки Tcl
Транслирует команды find в Perl
Конвертирует файлы заголовков .h C в файлы заголовков .ph для Perl
Конвертирует файлы заголовков .h C в расширения Perl
Может использоваться для настройки libnet
Сочетает достоинства C, sed, awk и sh в одном мощном языке
Жесткая ссылка на perl
Используется для генерации отчетов об ошибках в Perl или в поставляемых с ним модулях и их отправки по E-mail
Генерирует исполняемые файлы из программ Perl
Выводит часть документации в формате pod, которая расположена в дереве установки perl или в скриптах perl
Процедура верификации инсталяции Perl; может быть использована для проверки корректности установки Perl и его библиотек
Perl-реализация конвертера кодировок iconv
Средство для конвертирования файлов Perl4 .pl в модули Perl5 .pm
Конвертирует файлы из формата pod в формат HTML
Конвертирует файлы из формата pod в формат LaTeX
Конвертирует данные pod в форматированый вывод *roff
Конвертирует данные pod в форматированый текст ASCII
Печатает сообщения usage из документов pod в файлах
Проверяет синтаксис файлов документов в pod формате
Отображает выбранную часть документации pod
Perl-реализация редактора потоков sed
Делает дамп C-структур, генерируемых cc -g -S
Транслирует sed в perl
Используется для пропуска полных диагностических сообщений perl
Конвертирует Perl XS код в код на языке C
Пакет Udev содержит программы для динамического создания нод устройств.
Расчетное время сборки 0.2 SBU
Требуемое место на диске 5.2 MB
Udev - зависимости установки: Coreutils и Make
Компилируем пакет
make udevdir=/dev
Это говорит udev, в какой директории будут создаваться ноды устройств.
Устанавливаем пакет
make udevdir=/dev install
Конфигурация Udev по умолчанию далека от идеала, поэтому проинсталируем здесь LFS-специфичные конфигурационные файлы:
cp ../udev-config-2.permissions \ /etc/udev/permissions.d/25-lfs.permissions cp ../udev-config-1.rules /etc/udev/rules.d/25-lfs.rules
Проинсталированные программы: udev, udevd, udevsend, udevstart, udevinfo и udevtest
Инсталированная директория: /etc/udev
Создает ноды устройств в /dev или переименовавает сетевые интерфейсы (не в LFS), отвечая на запросы hotplug
Демон, который упорядочивает запросы hotplug перед передачей их udev, таким образом мы избегаем некоторых неопределенных состояний
Доставляет запросы hotplug к udevd
Создает в директории /dev ноды устройств, отвечающие драйверам, вкомпилированным прямо в ядро; он выполняет задачу симулирования событий hotplug, предположительно сброшенных ядром перед вызовом этой программы (т.е., потому что корневая файловая система не будет подмонтирована) и подчиняет такое синтетическое событие hotplug к udev
Позволяет пользователям запрашивать базу данных udev для получения информации о любом устройстве, находящимся в системе; также предоставляет путь для запрса любого устройства в дереве sysfs для помощи в создании правил udev.
Симулирует запуск udev для выбранного устройства и печатает имя реальной ноды, которая была бы создана udev или (не в LFS) имя переименованного сетевого интерфейса
Содержит конфигурационные файлы udev , права доступа к устройтсвам, и правила для именования устройств
Пакет Make содержит программу для компиляции больших приложений.
Расчетное время сборки 0.2 SBU
Требуемое место на диске 8.8 MB
Make - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep и Sed
Подготавливаем Make для компиляции:
./configure --prefix=/usr
Компилируем пакет
make
Для проверки результата вводим: make check.
Устанавливаем пакет
make install
Пакет Man-pages содержит более 1200 man-страниц.
Расчетное время сборки 0.1 SBU
Требуемое место на диске 15 MB
Man-pages - зависимости установки: Bash, Coreutils и Make
Установим Man-pages запуском:
make install
Пакет Inetutils содержит сетевые клиенты и серверы.
Расчетное время сборки 0.2 SBU
Требуемое место на диске 11 MB
Inetutils - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make, Ncurses и Sed
Пакет Inetutils имеет проблемы с ядрами Linux серии 2.6. Устраним эти проблемы накладыванием следующего патча:
patch -Np1 -i ../inetutils-1.4.2-kernel_headers-1.patch
Не все ман-страницы, входящие в Inetutils, будут проинсталированы. Хотя система сборки Inetutils будет настаивать на установке всех ман-страниц в любом случае. Следующий патч исправит эту ситуацию:
patch -Np1 -i ../inetutils-1.4.2-no_server_man_pages-1.patch
Подготавливаем Inetutils для компиляции:
./configure --prefix=/usr --libexecdir=/usr/sbin \ --sysconfdir=/etc --localstatedir=/var \ --disable-logger --disable-syslogd \ --disable-whois --disable-servers
Описание параметров конфигурации:
Этот параметр запрещает inetutils установку программы ведения логов, которая использует скрипты для отправки сообщений System Log Daemon. Мы не устанавливаем его потому, что Util-linux установит потом лучшую версию этой программы.
Этот параметр запрещет inetutils установку System Log Daemon, который мы установим с пакетом Sysklogd.
Этот параметр отключает сборку whois клиента, который является сильно устаревшим. Инструкции по установке лучшей версии клиента whois вы найдете в книге BLFS.
Этот параметр отключит установку ряда сетевых серверов как части пакета Inetutils. Эти сервера не нужны на простой LFS системе. Некоторые из них являются небезопасными и могут быть запущеными только в доверенной сети. Более полную информацию можно получить на http://www.linuxfromscratch.org/blfs/view/svn/basicnet/inetutils.html. Заметьте, что есть лучшие альтернативы для многих из этих серверов.
Компилируем пакет
make
Устанавливаем пакет
make install
И переместим программу ping на ее место:
mv /usr/bin/ping /bin
Проинсталированные программы: ftp, ping, rcp, rlogin, rsh, talk, telnet и tftp
Программа для передачи данных в сетях ARPANET
Посылает пакеты echo-request и отчитывается о времени прибытия ответа
Обеспечивает удаленное копирование файлов
Обеспечивает удаленный вход в систему
Запускает удаленный шелл
Используется для чата с другим пользователем
Интерфейс для протокола TELNET
Простая программа передачи файлов
Пакет Iproute2 содержит программы для базовой и расширенной IPV4 сети.
Расчетное время сборки 0.1 SBU
Требуемое место на диске .6 MB
Iproute2 - зависимости установки: GCC, Glibc, Make, Linux-Headers и Sed
Бинарник arpd, входящий в этот пакет, зависит от базы данных Berkeley. Так как arpd не очень сильно необходим в базовой Linux системе, удалим зависимость с базой данных Berkeley DB, применив патч в следующей команде. Если бинарник arpd необходим, инструкция по компиляции базы данных Berkeley может быть найдена в книге BLFS в http://www.linuxfromscratch.org/blfs/view/svn/content/databases.html#db.
patch -Np1 -i ../iproute2-2.6.8_040823-remove_db-1.patch
Подготавливаем Iproute2 для компиляции:
./configure
Компилируем пакет
make SBINDIR=/sbin
Описание параметров сборки:
Будем устанавливать бинарники Iproute2 в /sbin. Это корректное положение согласно требованиям FHS потому, что некоторые из бинарников Iproute2 используются в загрузочных скриптах.
Устанавливаем пакет
make SBINDIR=/sbin install
Проинсталированные программы: ifstat, ip, nstat, routef, routel, rtmon, rtstat, ss и tc.
Показывает статистику интерфейсов, включая информацию о переданых и принятых пакетах через интерфейс.
Основная исполнямая программа. Она имеет несколько различных функций:
ip link [устройство] позволяет пользователям наблюдать за состоянием устройств и вносить изменения.
ip addr позволяет пользователям наблюдать за адресами и их свойствами, добавлять новые адреса и удалять старые.
ip neighbor позволяет пользователям наблюдать за соседними связями и их свойствами, добавлять новые соседние связяи и удалять старые.
ip rule позволяет пользователям наблюдать за политикой маршрутизации и менять ее.
ip route позволяет пользователям наблюдать за таблицей маршрутизации и менять правила этой таблицы.
ip tunnel позволяет пользователям наблюдать за IP тунелями, их свойствами и менять их.
ip maddr позволяет пользователям наблюдать за multicast адресами, их свойствами и менять их.
ip mroute позволяет пользователям устанавливать, менять или удалять multicast маршрутизацию.
ip monitor позволяет пользователям продолжительно наблюдать за состоянием устройств, адресами и маршрутами.
Показывает сетевую статистику.
Компонент ip route. Используется для наполнения таблицы маршрутизации.
Компонент ip route. Используется для листинга таблицы маршрутизации.
Утилита мониторинга маршрутов.
Утилита статуса маршрутов.
Похожа на команду netstat; показывает активные соединения
Программа для контроля трафика; служит для включений Quality Of Service (QOS) и Class Of Service (COS).
tc qdisc позволяет пользователям устанавливать дисциплину очередей.
tc class позволяет пользователям устанавливать классы, основанные на списочной дисциплине очередей.
tc estimator позволяет пользователям оценивать сетевые потоки в сети.
tc filter позволяет пользователям устанавливать QOS/COS фильтрацию пакетов.
tc policy позволяет пользователям устанавливать QOS/COS политику.
Kbd содержит файлы раскладки клавиатуры и утилиты для нее.
Расчетное время сборки 0.1 SBU
Требуемое место на диске 12 MB
Kbd - зависимости установки: Bash, Binutils, Bison, Coreutils, Diffutils, Flex, GCC, Gettext, Glibc, Grep, Gzip, M4, Make и Sed
Подготавливаем Kbd для компиляции:
./configure
Компилируем пакет
make
Устанавливаем пакет
make install
Проинсталированные программы: chvt, deallocvt, dumpkeys, fgconsole, getkeycodes, getunimap, kbd_mode, kbdrate, loadkeys, loadunimap, mapscrn, openvt, psfaddtable (ссылка на psfxtable), psfgettable (ссылка на psfxtable), psfstriptable (ссылка на psfxtable), psfxtable, resizecons, setfont, setkeycodes, setleds, setlogcons, setmetamode, setvesablank, showconsolefont, showkey, unicode_start и unicode_stop
Изменяет используемый виртуальный терминал.
Закрывает неиспользуемые виртуальные терминалы.
Делает дамп таблицы преобразований клавиатуры.
Печатает номер активного виртуального терминала.
Печатает таблицу перевода скэнкодов в коды клавиш ядра.
Печатает используемую сейчас unimap.
Возвращает или устанавливает режим клавиатуры.
Устанавливает время повтора и задержки нажатий клавиш.
Загружает таблицу преобразований клавиатуры.
Загружает таблицу перевода unicode-to-font ядра.
Устаревшая программа, которая используется для загрузки заданной пользователем таблицы преобразований вывода в драйвер консоли. Теперь это делается через setfont
Запускает программу на новом виртуальном терминале (VT).
Ссылка на psfxtable
Ссылка на psfxtable
Ссылка на psfxtable
Берет Unicode таблицу символов для консольных шрифтов
Изменяет установленные ядром размеры консоли.
Изменяет шрифт EGA/VGA на консоли.
Загружает таблицу скэнкодов в коды клавиш, используемую если у вас есть неиспользуемые клавиши на клавиатуре.
Устанавливает флаги клавиатуры и LED (светодиоды).
Отсылает сообщения ядра на консоль.
Определяет метауправление клавиатурой.
Позволяет испльзовать встроеный аппаратный пустой хранитель экрана (без изображений, просто пустой экран).
Показывает текущий EGA/VGA экранный шрифт консоли.
Возвращает скэнкоды и коды клавиш, а также ASCII-коды нажтых на клавиатуре клавиш.
Включает на консоли и клавиатуре режим unicode. Никогда не используйте это в LFS, так как приложения не сконфигурированы с поддержкой UNICODE.
Возвращает консоль и клавиатуру из режима unicode.
Less является просмотрщиком текстовых файлов.
Расчетное время сборки 0.1 SBU
Требуемое место на диске 3.4 MB
Less - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make, Ncurses и Sed
Подготавливаем Less для компиляции:
./configure --prefix=/usr --bindir=/bin --sysconfdir=/etc
Описание опций конфигурации:
Этот параметр укажет, что надо создавать программы с файлами конфигурации в /etc.
Компилируем пакет
make
Устанавливаем пакет
make install
Проинсталированные программы: less, lessecho и lesskey
Является просмотрщиком файлов. Он отображает содержимое указанного файла, позволяет его прокручивать для просмотра, находить строки и переходить к отметкам.
Нужен для расширеных метасимволов, таких как * и ? в именах файлов на системах Unix.
Используется для определения управляющих клавиш less.
GNU libtool является общей библиотекой поддержки скриптов. Libtool скрывает сложность использования системных библиотек обеспечивая совместимый, портируемый интерфейс.
Расчетное время сборки 1.5 SBU
Требуемое место на диске 20 MB
Libtool - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make и Sed
Подготавливаем Libtool для компиляции:
./configure --prefix=/usr
Компилируем пакет
make
Для проверки результата вводим: make check.
Устанавливаем пакет
make install
Проинсталированные программы: libtool и libtoolize
Проинсталированные библиотеки: libltdl.[a,so]
Man является просмотрщиком man-страниц.
Расчетное время сборки 0.1 SBU
Требуемое место на диске 1.9MB
Man - зависимости установки: Bash, Binutils, Coreutils, Gawk, GCC, Glibc, Grep, Make и Sed
Мы собираемся сделать три дополнения к исходникам Man.
Первый патч решит проблему с фоматированием man страниц, содержащих более 80 символов в сторке в связке с существующими релизами Groff. Теперь man-страницы будут отображаться, используя полную ширину терминала вместо бывшего ограничения в 80 символов:
patch -Np1 -i ../man-1.5o-80cols-1.patch
Второй патч добавит параметр -R в переменную PAGER для правильного использования escape-последовательностей:
sed -i 's@-is@&R@g' configure
Третий патч (sed-последовательность) закоментирует строку “MANPATH /usr/man” в файле man.conf для предупреждения излишней многословности результатов при использовании таких программ как whatis:
sed -i 's@MANPATH./usr/man@#&@g' src/man.conf.in
Подготавливаем Man для компиляции:
./configure -confdir=/etc
Описание параметров конфигурации:
Программа man будет искать файл конфигурации man.conf в директории /etc.
Компилируем пакет
make
Устанавливаем пакет
make install
Для отключения Select Graphic Rendition (SGR) escape-последовательности, можно отредактировать файл man.conf и добавить параметр -c к переменной NROFF.
Если вы используете 8-битную кодировку символов, ищите строку, которая начинается с “NROFF” в /etc/man.conf, и проверьте, что она выглядит как следующая строка:
NROFF /usr/bin/nroff -Tlatin1 -mandoc
Заметьте, что “latin1” должно быть использовано даже если это не используется в кодировке установденной локали. Смысл в том, что согласно спецификации, groff не имеет обозначений типа символов, установленного вне Интернациональной Организации по Стандартам (ISO) 8859-1, без некоторых неизвестных escape-кодов. Когда ман-страница форматирована, groff думает, что она в кодировке ISO 8859-1 и этот ключ -Tlatin1 говорит groff использовать для вывода ту же самую кодировку. Посе этого groff не перекодирует входные символы, форматированный результат на выходе будет в той же кодировке, как и на входе, и это также можно использовать как вход для pager-а.
Это не решает проблему с неработающей программой man2dvi для локализованных man-страниц в не-ISO 8859-1 локалях. Также это не работает с мультибайтными символами. Первая проблема пока не имеет решеня. Вторая проблема не интересна потому, что инсталяция LFS не поддерживает мультибайтные символы.
Дополнительная информация с описанием сжатия страниц man и info может быть найдена в книге BLFS в http://www.linuxfromscratch.org/blfs/view/cvs/postlfs/compressdoc.html.
Проинсталированные программы: apropos, makewhatis, man, man2dvi, man2html и whatis
Ищет в базе данных whatis и отображает краткое описание системной команды, которое содержит указанную строку.
Создает базу данных whatis. Он рассматривает все страницы документации man в соответствующих путях и добавляет запись команды и ее краткого описания в базу данных whatis.
Форматирует и отображает запрошенную man-страницу.
Конвертирует man-страницу в формат dvi.
Конвертирует man-страницу в html.
Ищет в базе данных whatis и отображает краткое описание системной команды, содержащей указанное ключевое слово или несколько слов.
Пакет Mktemp содержит программы создания безопасных временных файлов в шелл-скриптах.
Расчетное время сборки 0.1 SBU
Требуемое место на диске 317 KB
Mktemp - зависимости установки: Coreutils, Make и Patch
Многие скрипты все еще используют программу tempfile, которая функционально похожа на mktemp. Пропатчим Mktemp для включения оболочки tempfile:
patch -Np1 -i ../mktemp-1.5-add_tempfile-1.patch
Подготавливаем Mktemp для компиляции:
./configure --prefix=/usr --with-libc
Описание опций конфигурации:
Это говорит программе mktemp использовать системные функции библиотеки С mkstemp и mkdtemp.
Компилируем пакет
make
Устанавливаем пакет
make install make install-tempfile
Программа Patch содержит программу для модификации файлов.
Расчетное время сборки 0.1 SBU
Требуемое место на диске 1.9 MB
Patch - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make и Sed
Подготавливаем Patch к компиляции. Флаг препроцессора -D_GNU_SOURCE нужен только на платформах PowerPC. На других платформах вы можете его пропустить.
CPPFLAGS=-D_GNU_SOURCE ./configure --prefix=/usr
Компилируем пакет
make
Устанавливаем пакет
make install
Пакет Procps содержит программы для мониторинга системных процессов.
Расчетное время сборки 0.1 SBU
Требуемое место на диске 6.2 MB
Procps - зависимости установки: Bash, Binutils, Coreutils, GCC, Glibc, Make и Ncurses
Компилируем пакет
make
Устанавливаем пакет
make install
Проинсталированные программы: free, kill, pgrep, pkill, pmap, ps, skill, snice, sysctl, tload, top, uptime, vmstat, w и watch
Проинсталированные библиотеки: libproc.so
Возвращает информацию о свободной и используемой памяти в системе, как физической, так и виртуальной.
Используется для посылки сигналов процессам.
Выводит список процессов, отфильтрованный по именам и другим атрибутам.
Посылает сигналы процессам по их имени или другим атрибутам.
Возвращает карту памяти указанного процесса.
Выводит список текущих процессов.
Посылает сигналы процессам, попадающим под критерий.
Изменяет приоритет выполнения процессов, соответствующих критериям.
Модифицирует параметры ядра во время его работы.
Отображает график загрузки системы.
Отображает загрузку процессора. Используется для слежения за активностью процессора в реальном времени.
Возвращает время работы системы, количество вошедших в нее пользователей и загрузку системы.
Отображает статистику виртуальной памяти, включая информацию о процессах, памяти, страницах, блоках ввода-вывода, прерываниях и активности CPU.
Показывает сколько пользователей подключено к системе, где и как они подключились.
Циклически выполняет указанную команду, выводя ее первый полный экран вывода. Это позволяет контролировать вывод все время.
Содержит функции, используемые большей частью программ этого пакета.
Пакет Psmisc содержит программы для отображения информации о процессах.
Расчетное время сборки 0.1 SBU
Требуемое место на диске 2.2 MB
Psmisc - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Ncurses и Sed
Подготавливаем Psmisc для компиляции:
./configure --prefix=/usr --exec-prefix=""
Описание параметров конфигурации:
Это необходимо для установки бинарников в /bin вместо /usr/bin. Поскольку программы Psmisc часто используются в загрузочных скриптах, они должны быть доступны даже при недоступной файловой системе.
Компилируем пакет
make
Устанавливаем пакет
make install
Нет смысла для переноса программ pstree и pstree.x11 в /bin. Напротив, перенесем их в /usr/bin. Также нет необходимости для нахождения pstree.x11 в качестве отдельной программы. Вместо этого сделаем символическую ссылку на pstree:
mv /bin/pstree* /usr/bin ln -sf pstree /usr/bin/pstree.x11
По умолчанию программа pidof не устанавливается. Обычно, это не является проблемой, поскольку устанавливаемый позже пакет Sysvinit содержит лучший вариант программы pidof. Но если вы не собираетесь использовать Sysvinit, то вам стоит завершить установку Psmisc созданием следующей ссылки:
ln -s killall /bin/pidof
Проинсталированные программы: fuser, killall, pstree и pstree.x11 (ссылка на pstree)
Возвращает PID процессов, которые используют указанные файлы или фаловые системы.
Убивает процессы по имени. Он посылает сигнал всем процессам, запущенным одной из указанных команд.
Отображает дерево запущенных процессов.
То же самое, что pstree, исключая, что она ожидает подтверждения перед исполнением
Пакет Shadow содержит программы для усиления безопасности системных паролей.
Расчетное время сборки 0.4 SBU
Требуемое место на диске 11 MB
Shadow - зависимости установки: Bash, Binutils, Bison, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make и Sed
Подготавливаем Shadow для компиляции:
./configure --libdir=/usr/lib --enable-shared
Поработаем над проблемой, которая препятствует интернационализации Shadow, выполнив:
echo '#define HAVE_SETLOCALE 1' >> config.h
Shadow некорректно декларирует функцию malloc(), означающую ошибку компиляции. Устраним это:
sed -i '/extern char/d' libmisc/xmalloc.c
Компилируем пакет
make
Устанавливаем пакет
make install
Shadow использует два файла для настройки параметров аутентификации в системе. Установим эти файлы:
cp etc/{limits,login.access} /etc
Вместо использования по умолчанию метода crypt, используем более защищенный метод шифрования паролей MD5, который также допускает использование паролей длинной более 8 символов. Также необходимо изменить положение пользовательских почтовых ящиков на /var/spool/mail, которое Shadow устанавливает по умолчанию в /var/mail. Мы сделаем это, проведя следующие изменения конфигурационного файла:
cp etc/login.defs.linux /etc/login.defs sed -i -e 's@#MD5_CRYPT_ENAB.no@MD5_CRYPT_ENAB yes@' \ -e 's@/var/spool/mail@/var/mail@' /etc/login.defs
Переместим некоторые ссылки/программы в более предпочтительное место:
mv /bin/sg /usr/bin mv /bin/vigr /usr/sbin mv /usr/bin/passwd /bin
Переместим динамические библиотеки в более предпочтительное место:
mv /usr/lib/lib{shadow,misc}.so.0* /lib
Поскольку некоторые пакеты нуждаются в расположении только что перемещенных библиотек в /usr/lib,создадим следующие ссылки:
ln -sf ../../lib/libshadow.so.0 /usr/lib/libshadow.so ln -sf ../../lib/libmisc.so.0 /usr/lib/libmisc.so
Опция -D программы useradd требует директорию /etc/default для корректной работы:
mkdir /etc/default
Coreutils уже имеет лучшую установленную программу groups в /usr/bin. Удалим аналогичную программу из Shadow:
rm /bin/groups
Этот пакет содержит утилиты для модификации паролей пользователей, добавления или удаления пользователей и групп и тому подобные. Мы не собираемся объяснять здесь что такое скрытие паролей (password shadowing). Полное объяснение можно найти в файле doc/HOWTO в распакованой директории с исходниками Shadow. Сдесь мы опишем только то, что вам понадобится, если вы захотите использовать поддержку Shadow: программы, которые должны проверять пароли (к примеру: xdm, демоны ftp, демоны pop3) должны будут компилироваться с поддержкой 'shadow-совместимости', что надо для использования работы со скрытыми паролями.
Для использования скрытых паролей, запустите команду:
pwconv
А для использования скрытых групп, выполните:
grpconv
При нормальных обстоятельствах, вам пока нет надобности создавать пароли. Запомните, что если вы решите вернуться к этой главе для включения скрытия паролей, вам надо будет сбросить пароли всех пользователей командой passwd и пароли всех групп командой gpasswd.
Выберите пароль для пользователя root и установите его командой:
passwd root
Проинсталированные программы: chage, chfn, chpasswd, chsh, expiry, faillog, gpasswd, groupadd, groupdel, groupmod, groups, grpck, grpconv, grpunconv, lastlog, login, logoutd, mkpasswd, newgrp, newusers, passwd, pwck, pwconv, pwunconv, sg (ссылка на newgrp), useradd, userdel, usermod, vigr (ссылка на vipw) и vipw
Проинсталированные библиотеки: libshadow[.a,so]
Используется для изменения максимального количества дней до обязательной смены пароя.
Изменяет полное имя пользователя и некоторую другую информацию.
Используется для обновления паролей пользовательских аккаунтов.
Используется для изменения шелла пользователя по умолчанию.
Проверяет и изменяет правила использования паролей.
Используется для обработки логов ошибочных входов в систему, для установки лимита на ошибки входа до блокирования аккаунта или для сброса счетчика этих ошибок.
Используется для добавления или удаления членов и администраторов групп.
Создает группу с указанным именем.
Удаляет группу с указанным именем.
Используется для изменения имени указанной группы или ее GID.
Возвращает группы, членом которых является указанный пользователь.
Проверяет целосность файлов групп /etc/group и /etc/gshadow
Создает или обновляет теневой файл групп, используя обычный файл групп.
Обновляет /etc/group из /etc/gshadow и затем удаляет последний.
Отчитывается о входах пользователей или указанного пользователя в систему.
Используется в начале новой сессии работы с системой.
Демон, контролирующий время регистрации и порты.
Шифрует указанный пароль указанным алгоритмом.
Используется для изменения текущего GID.
Используется для создания или обновления пользовательских аккаунтов.
Используется для изменения пароля пользователя или группы.
Проверяет целостность файлов паролей /etc/passwd и /etc/shadow
Создает или обновляет теневой файл паролей, используя обычный файл паролей.
Обновляет /etc/passwd из /etc/shadow и затем удаляет последний.
Выполняет указанную команду с правами группы с указанным GID.
Запускает shell с заменой пользователя и ID группы.
Создает нового пользователя с указанным именем или обновляет информацию по умолчанию для новых пользователей.
Удаляет указанный пользовательский аккаунт.
Используется для модификации указанноко имени пользователя, UID, шелла, группы, домашней директории и т.п.
Редактирует файл /etc/group или /etc/gshadow.
Редактирует файл /etc/passwd или /etc/shadow.
Содержит функции, используемые большинством программ этого пакета.
Пакет Sysklogd содержит программы для записи системных сообщений в логи, например, сообщений ядра.
Расчетное время сборки 0.1 SBU
Требуемое место на диске 0.5 MB
Sysklogd - зависимости установки: Binutils, Coreutils, GCC, Glibc и Make
Sysklogd имеет проблемы с ядрами Linux 2.6 серии. Исправим их, применив следующий патч:
patch -Np1 -i ../sysklogd-1.4.1-kernel_headers-1.patch
Есть также условие в логике работы с сигналами, которое иногда приводит в беспорядок стартовый скрипт sysklogd. Исправим это, применив другой патч:
patch -Np1 -i ../sysklogd-1.4.1-signal-1.patch
Компилируем пакет
make
Устанавливаем пакет
make install
Создадим новый файл /etc/syslog.conf запуском команды:
cat > /etc/syslog.conf << "EOF" # Begin /etc/syslog.conf auth,authpriv.* -/var/log/auth.log *.*;auth,authpriv.none -/var/log/sys.log daemon.* -/var/log/daemon.log kern.* -/var/log/kern.log mail.* -/var/log/mail.log user.* -/var/log/user.log *.emerg * # End /etc/syslog.conf EOF
Проинсталированные программы: klogd и syslogd
Пакет Sysvinit содержит пограммы для контроля загрузки, запуска и выключения всех других программ.
Расчетное время сборки 0.1 SBU
Требуемое место на диске 0.9 MB
Sysvinit - зависимости установки: Binutils, Coreutils, GCC, Glibc и Make
Sysvinit-2.85 содержит ошибку “переполнения буфера”. В некоторых случаях это может привести к изменению значений переменных окружения. Исправим это:
patch -Np1 -i ../sysvinit-2.85-proclen-1.patch
Когда изменяется уровень запуска (например, при выключении системы), init посылает сигналы TERM и KILL тем процессам которые запустил сам init и которые не должны быть запущены на новом уровне запуска. Пока проходит этот процесс, init выводит сообщение, похожее на “Sending processes the TERM signal”, при этом кажется, что init отсылает эти сигналы всем работающим процессам. Чтобы не входить в заблуждение, исправим это сообщение на “Sending processes started by init the TERM signal”.
sed -i 's@Sending processes@& started by init@g' \ src/init.c
Компилируем пакет
make -C src
Устанавливаем пакет
make -C src install
Создадим новый файл /etc/inittab запуском следующих команд:
cat > /etc/inittab << "EOF" # Begin /etc/inittab id:3:initdefault: si::sysinit:/etc/rc.d/init.d/rc sysinit l0:0:wait:/etc/rc.d/init.d/rc 0 l1:S1:wait:/etc/rc.d/init.d/rc 1 l2:2:wait:/etc/rc.d/init.d/rc 2 l3:3:wait:/etc/rc.d/init.d/rc 3 l4:4:wait:/etc/rc.d/init.d/rc 4 l5:5:wait:/etc/rc.d/init.d/rc 5 l6:6:wait:/etc/rc.d/init.d/rc 6 ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now su:S016:once:/sbin/sulogin 1:2345:respawn:/sbin/agetty -I '\033(K' tty1 9600 2:2345:respawn:/sbin/agetty -I '\033(K' tty2 9600 3:2345:respawn:/sbin/agetty -I '\033(K' tty3 9600 4:2345:respawn:/sbin/agetty -I '\033(K' tty4 9600 5:2345:respawn:/sbin/agetty -I '\033(K' tty5 9600 6:2345:respawn:/sbin/agetty -I '\033(K' tty6 9600 # End /etc/inittab EOF
Опция -I '\033(K' говорит agetty послать эту еscape-последовательность на терминал перед остальными действиями. Эта еscape-последовательность переключает консольный набор символов на пользовательский, который может быть изменен запуском программы setfont. Стартовый скрипт console из пакета LFS-Bootscripts вызывает программу setfont во время загрузки системы. Посылка этой еscape-последовательности необходима для людей, которые используют не-ISO 8859-1 экранный шрифт, но это не имеет эффекта для использующих английский.
Проинсталированные программы: halt, init, killall5, last, lastb (ссылка на last), mesg, pidof (ссылка на killall5), poweroff (ссылка на halt), reboot (ссылка на halt), runlevel, shutdown, sulogin, telinit (ссылка на init), utmpdump и wall
Обычно вызывает shutdown с параметром -h, если текущй уровень запуска не 0, затем он отдает команду ядру на отключение системы, но сначала записывает в файл /var/log/wtmp что система отключается.
Первый процесс, который стартует после инициализации аппаратуры ядром и запускает все процессы для текущего уровня запуска
Посылает сигнал всем процессам, за исключением родительских процессов - таким образом он не убьет шелл, вызвавший скрипт.
Показывает, какие пользователи подключены (и отключены) в системе, просматривая файл /var/log/wtmp; он также отображает процесс загрузки и отключения системы и изменения уровней запуска.
Показывает ошибки входа в систему, отмеченные в /var/log/btmp
Контролирует возможность отправки другими пользователями сообщений на текущий терминал пользователя.
Возвращает PID указанных программ.
Передает ядру команду на отключение системы и выключение компьютера (смотри halt).
Передает ядру команду на перезагрузку системы (смотри halt).
Возвращает предыдущий и текущий уровни запуска, последний уровень запуска записан в /var/run/utmp
Безопасно отключает систему, отсылает сигнал всем процессам и уведомляет всех подключеных пользователей.
Позволяет зарегистрироваться root; Обычно используется в скрипте init, когда система загружается в однопользовательском режиме.
Говорит init о необходимости смены уровня запуска.
Отображает содержимое указанного login-файла в удобочитаемом формате.
Пишет сообщение всем подключеным пользователям.
Пакет Readline содержит библиотеку командной строки Readline.
Расчетное время сборки 0.11 SBU
Требуемое место на диске 3.8 MB
Readline - зависимости установки: Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make, Ncurses и Sed
Следующий патч устраняет проблему, при которй Readline иногда отображает только 33 символа в строке, а затем переходит на следующую строку.
patch -Np1 -i ../readline-5.0-display_wrap-1.patch
Подготавливаем Readline для компиляции:
./configure --prefix=/usr
Компилируем пакет
make SHLIB_XLDFLAGS=-lncurses
Описание параметров сборки:
Этот флаг заставляет Readline использовать библиотеку libncurses.
Устанавливаем пакет
make install
Дадим динамическим библиотекам Readline более подходящие права доступа:
chmod 755 /usr/lib/*.5.0
Переместим динамические библиотеки в более подходящее место:
mv /usr/lib/lib{readline,history}.so.5* /lib
Так как библиотеки были перемещены, некоторые ссылки указывают на несуществующие файлы. Обновим эти ссылки:
ln -sf ../../lib/libhistory.so.5 /usr/lib/libhistory.so ln -sf ../../lib/libreadline.so.5 /usr/lib/libreadline.so
Проинсталированные библиотеки: libhistory.[a,so] и libreadline.[a,so]
Пакет Texinfo содержит программы, используемые для чтения, записи и конвертирования документов Info, которые содержат системную документацию.
Расчетное время сборки 0.2 SBU
Требуемое место на диске 17 MB
Texinfo - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Ncurses и Sed
Следующий патч устраняет проблему, когда программа info иногда выпадает при нажатии клавиши Delete на клавиатуре:
patch -Np1 -i ../texinfo-4.7-segfault-1.patch
Подготавливаем Texinfo для компиляции:
./configure --prefix=/usr
Компилируем пакет
make
Для проверки результата вводим: make check.
Устанавливаем пакет
make install
И дополнительно установим компоненты входящие в установку TeX:
make TEXMF=/usr/share/texmf install-tex
Описание параметров сборки:
Переменная TEXMF файла makefile сохраняет расположения корня дерева TeX, например, если вы собираетесь потом устанавливать пакет TeX.
Система документации Info использует обычный текстовый файл для своего списка меню. Файл расположен в /usr/share/info/dir. Из-за случайных проблем в мэйкфайлах некоторых пакетов это может иногда привести к выходу в систему на этапе установки Info-документации. Если файл /usr/share/info/dir всегда требует обновления, следующие опциональные команды выполнят задачу:
cd /usr/share/info rm dir for f in * do install-info $f dir 2>/dev/null done
Проинсталированные программы: info, infokey, install-info, makeinfo, texi2dvi и texindex
Используется для чтения документов Info. Документы Info похожи на man-страницы, но содержат больше, чем простое описание опций программы. Сравните для примера man bison и info bison.
Компилирует файл с исходниками, содержащий персонализацию Info, в двоичный формат.
Используется для установки файлов Info. Он обновляет записи в файле индекса Info.
Преобразует указанный файл документации исходников Texinfo в различные другие форматы: файлы Info, текст или HTML.
Используется для форматирования указанного документа Texinfo в аппаратно-независимый файл, который может быть распечатан.
Используется для сортировки файла индекса Texinfo.
Пакет Util-linux содержит ряд различных утилит. Некоторые из этих утилит используются для монтирования, размонтирования, форматирования, разбиения и обслуживания дисков, открытия портов tty и вызова сообщений ядра.
Расчетное время сборки 0.2 SBU
Требуемое место на диске 16 MB
Util-linux - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Ncurses, Sed и Zlib
FHS рекомендует использовать директорию /var/lib/hwclock вместо обычной /etc в качестве места для расположения файла adjtime. Для обеспечения FHS-совместимости программы hwclock, выполним следующее:
sed -i 's@etc/adjtime@var/lib/hwclock/adjtime@g' \ hwclock/hwclock.c mkdir -p /var/lib/hwclock
GCC-3.4.1 некорректно компилирует sfdisk если используется уровень оптимизации по умолчанию. Следующий патч исправит эту проблему:
patch -Np1 -i ../util-linux-2.12b-sfdisk-2.patch
Подготавливаем Util-linux для компиляции:
./configure
Компилируем пакет
make HAVE_KILL=yes HAVE_SLN=yes
Описание параметров компиляции:
Это предостережет программу kill (уже установленной с Procps) от повторной сборки.
Это предостережет программу sln (статически скомпонованый ln, уже установленый с Glibc) от повторной сборки.
Устанавливаем пакет
make HAVE_KILL=yes HAVE_SLN=yes install
Проинсталированные программы: agetty, arch, blockdev, cal, cfdisk, chkdupexe, col, colcrt, colrm, column, ctrlaltdel, cytune, ddate, dmesg, elvtune, fdformat, fdisk, fsck.cramfs, fsck.minix, getopt, hexdump, hwclock, ipcrm, ipcs, isosize, line, logger, look, losetup, mcookie, mkfs, mkfs.bfs, mkfs.cramfs, mkfs.minix, mkswap, more, mount, namei, pg, pivot_root, ramsize (ссылка на rdev), raw, rdev, readprofile, rename, renice, rev, rootflags (ссылка на rdev), script, setfdprm, setsid, setterm, sfdisk, swapdev, swapoff (ссылка на swapon), swapon, tunelp, ul, umount, vidmode (ссылка на rdev), whereis и write
Открывает порт tty, запрашивает имя пользователя и запускает программу login.
Возвращает архитектуру машины.
Позволяет вызвать ioctls блочного устройства из командной строки.
Отображает простой календарь.
Используется для манипуляций с таблицей разделов указанного устройства.
Ищет дубликаты исполняемых файлов.
Фильтрует перевернутые строки, поступающие с ввода.
Используется для фильтрации вывода nroff для терминалов CRT.
Отфильтровывает указанные колонки.
Форматирует указанный файл в несколько колонок.
Устанавливает функцию для комбинации клавиш Ctrl+Alt+Del для аппаратного или программного сброса.
Используется для настройки параметров драйверов последовательного порта для карт Cyclades.
Выдает Discordian дату или конвертирует указанную дату по Григорианскому календарю в Discordian дату.
Выводит загрузочные сообщения ядра.
Может использоваться для настройки работы и взаимодействия блочных устройств.
Низкоуровневое форматирование дискеты.
Используется для манипуляций с таблицами разделов указанного устройства.
Проводит проверку целостности файловой системы Cramfs на указанном устройстве.
Проводит проверку целостности файловой системы Minix на указанном устройстве.
Анализирует параметры командной строки.
Отображает заданный файл в шестнадцатиричном или другом указанном формате.
Используется для чтения или установки аппаратных часов системы (также называемых RTC- или BIOS-часами).
Удаляет указанный ресурс IPC.
Отображает статус IPC.
Возвращает размер файловой системы iso9660.
Копирует строку.
Добавляет указанное сообщение в системный лог.
Выводит строки, начинающиеся с указанной строки.
Используется для установки и управления loop устройств.
Генерирует "магические" (128-битные случайные шестнадцатиричные числа) ключи для xauth
Используется для создания файловой системы на устройстве (обычно разделе жесткого диска).
Создает файловую систему SCO bfs.
Создает файловую систему cramfs.
Создает файловую систему Minix.
Инициализирует указанное устройство или файл для использования в качестве свопа.
Фильтр для постраничного вывода текста. Но less намного лучше.
Присоединяет файловую систему на указанном устройстве к указанной директории в дереве системных файлов.
Показывает символические ссылки в указанных путях.
Постранично отображает текстовый файл.
Делает указанную файловую системы корневой для текущих процессов.
Используется для установки размера RAM-диска в загрузочной карте.
Используется для создания сырого символьного устройства Linux на блочном устройстве.
Используется для запроса и установки корневого устройства и других параметров карты загрузки.
Считывает профильную информацию ядра.
Переименовывает указанные файлы, заменяет указанную строку на другую.
Измененяет приоритет выполнения работающего процесса.
Переворачивает строки в указанном файле.
Используеться для установки или снятия параметров корневой файловой системы в карте загрузки.
Создает скрипт терминальной сессии.
Устанавливает пользовательские параметры дискеты.
Запускает указанную программу в новой сессии.
Используется для установки атрибутов терминала.
Манипулирует таблицами разделов дисков.
Используеться для установки свопа в карте загрузки.
Отключает устройства или файлы свопа.
Подключает устройства или файлы свопа.
Используется для настройки параметров LP устройств.
Фильтр для перевода знаков подчеркивания в escape-последовательности подчеркивания для текущего терминала.
Отключает файловую систему от дерева системных файлов.
Используется для установки видеорежима в карте загрузки.
Возвращает местоположение бинарников, исходников или man-страниц для указанной команды.
Посылает сообщение указанному пользователю, если пользователь не отключил эту возможность.
Некоторые файловые системы, экспортируемые ядром, отсутствуют на жеском накопителе, но используются для связи с ядром.
Начнем с создания директорий, в которые будут монтироваться файловые системы:
mkdir -p $LFS/{proc,sys}
Теперь подмонтируем файловые системы:
mount -t proc proc $LFS/proc mount -t sysfs sysfs $LFS/sys
Запомните, если по любой причине вы прекратили работу с LFS и решили возобновить ее позже, важно убедиться, что эти системы будут смонтированы внутри среды chroot, иначе могут возникнуть определенные проблемы.
Остальные файловые системы будут скоро подмонтированы из среды chroot. Для поддержания работоспособности системы, выполним “mount” для каждой из них:
mount -f -t ramfs ramfs $LFS/dev mount -f -t tmpfs tmpfs $LFS/dev/shm mount -f -t devpts -o gid=4,mode=620 devpts $LFS/dev/pts
Пакет Linux-Libc-Headers содержит “осмысленные” заголовки ядра.
Расчетное время сборки 0.1 SBU
Требуемое место на диске 22 MB
Linux-Libc-Headers - зависимости установки: Coreutils
В течении многих лет было очень практично использовать “сырые” заголовки ядра (прямо из тарбола ядра) в /usr/include. Проэкт Linux-Libc-Headers был разработан для поддержки Application Programming Interface (API) стабильной версии заголовков Linux.
Установим файлы заголовков:
cp -R include/asm-i386 /usr/include/asm cp -R include/linux /usr/include
Убедимся, что все заголовки принадлежат пользователю root:
chown -R root:root /usr/include/{asm,linux}
Убедимся, что обычные пользователи могут читать эти заголовки:
find /usr/include/{asm,linux} -type d -exec chmod 755 {} \; find /usr/include/{asm,linux} -type f -exec chmod 644 {} \;
Пакет Module-Init-Tools содержит программы для поддержки модулей ядра в ядрах Linux с версией 2.5.47 или выше.
Расчетное время сборки 0.1 SBU
Требуемое место на диске 650 KB
Module-Init-Tools - зависимости установки: Bash, Binutils, Bison, Coreutils, Diffutils, Flex, GCC, Glibc, Grep, M4, Make и Sed
Подготавливаем Module-Init-Tools для компиляции:
./configure --prefix="" --enable-zlib
Компилируем пакет
make
Для проверки результата вводим: make check.
Устанавливаем пакет
make install
Проинсталированные программы: depmod, genksyms, insmod, insmod_ksymoops_clean, kallsyms (ссылка на insmod), kernelversion, ksyms (ссылка на insmod), lsmod (ссылка на insmod), modinfo, modprobe (ссылка на insmod) и rmmod (ссылка на insmod)
Создает файл зависимостей, основанный на символах, которые он находит в существующих установках модулей; этот файл зависимостей используется modprobe для автоматической загрузки требуемых модулей.
Генерирует информацию о версии символов
Устанавливает загружаемый модуль в загружаемое ядро.
Удаляет сохраненные ksyms и модули, не используемые в течении 2 дней.
Извлекает все символы ядра для отладки.
Сообщает версию загруженного ядра.
Показывает экспортированные символы ядра
Выводит список загруженных модулей.
Проверяет объектный файл, связанный с модулем ядра и отображает другую информацию, которую он может собрать.
Использует файл зависимости, созданный depmod, для автоматической загрузки модулей.
Выгружает загружаемый модуль из загруженного ядра
Для возможности регистрации в качестве пользователя root и для распознавания имени “root” нам необходимо создать соответствующие элементы в файлах /etc/passwd и /etc/group.
Создадим файл /etc/passwd запуском команды:
cat > /etc/passwd << "EOF" root:x:0:0:root:/root:/bin/bash EOF
Пароль пользователя root (символ “x” заменяет его здесь) будет определен позднее.
Создадим файл /etc/group запуском следующей команды:
cat > /etc/group << "EOF" root:x:0: bin:x:1: sys:x:2: kmem:x:3: tty:x:4: tape:x:5: daemon:x:6: floppy:x:7: disk:x:8: lp:x:9: dialout:x:10: audio:x:11: video:x:12: utmp:x:13: usb:x:14: EOF
Созданные группы не являются частью какого-то стандарта— эти группы будут использоваться при конфигурации Udev в следующей главе. База стандарта Linux (LSB, доступна на http://www.linuxbase.org) рекомендует, чтобы после группы “root” с ID группы (GID) 0 находилась группа “bin” с GID, равным 1. Все другие имена групп и их GID могут свободно выбираться пользователем, но некоторые пакеты зависят от имени группы, хоть и не зависят от номера GID.
Для удаления приглашеня с текстом “I have no name!” запустим новый shell. После того, как полная Glibc была установлена в Главе 5 и файлы /etc/passwd и /etc/group были созданы, имя пользователя и имя группы теперь будут работать.
exec /tools/bin/bash --login +h
Замечание по использованию параметра +h. Это скажет bash не использовать внутренний кеш путей. Без этого bash будет запоминать пути к исполненым бинарникам. Поскольку мы собираемся использовать вновь скомпилированые пакеты по мере их установки, мы должны отключить эту функцию в этой главе.
Программы login, agetty и init (и другие) используют некоторые лог-файлы для записи информации, например кто был зарегистрирован в системе и когда. Хотя эти программы не будут записывать в лог-файлы если они пока отсутствуют. Проинициализируем лог-файлы и дадим им правильные права:
touch /var/run/utmp /var/log/{btmp,lastlog,wtmp} chgrp utmp /var/run/utmp /var/log/lastlog chmod 664 /var/run/utmp /var/log/lastlog
Файл /var/run/utmp записывает пользователей, которые уже зарегистрировались.
Файл /var/log/wtmp записывает все входы в систему и выходы из системы.
Файл /var/log/lastlog записывает, когда каждый пользователь последний раз регистрировался в системе.
Файл /var/log/btmp записывает неправильые регистрации.
Теперь, когда мы установили новую библиотку C, пришло время переустановить наши средства. Это надо для того, чтобы вновь скомпилированные программы использовали именно новую библиотеку C. То, что мы сейчас сделаем, это реверс того, что мы делали на этапе “интеграции” в начале Главы 5. В Главе 5 была проведена цепь из основных директорий /{,usr/}lib в новую директорию /tools/lib. Теперь цепь будет проведена из этой самой директории /tools/libв директорию LFS /{,usr/}lib.
Первым делом мы отрегулируем компоновщик. Для этого мы вернемся к директориям с исходниками и сборкой из второго шага установки Binutils. Установим отрегулированый компоновщик запуском следующей команды из директориии binutils-build:
make -C ld INSTALL=/tools/bin/install install
Если вы пропустили предупреждение о нежелательности удаления директорий с исходниками и сборкой Binutils на втором шаге их установки в Главе 5 или по другим причинам удалили их или у вас нет доступа к ним, не беспокойтесь, не все потеряно. Просто проигнорируйте вышеприведенную команду. В результате следующий пакет Binutils будет скомпонован с использованием библиотек Glibc из /tools вместо /{,usr/}lib. Это не идеально, но наше тестирование показывает что в обоих случаях бинарники Binutils будут идентичными.
С этого момента все компилируемые программы будут собираться только с использованием библиотек из /usr/lib и /lib. Параметр INSTALL=/tools/bin/install необходим потому, что файл Makefile, созданый на втором шаге, содержит ссылки на /usr/bin/install, который пока не установлен. Некоторые дистрибутивы содержат ссылку ginstall которая имеет первенство в файле Makefile и это может создать здесь проблему. Вышеуказанная команда также решает и эту проблему.
Теперь вы можете удалить обе директории Binutils.
Теперь нам необходимо исправить точки в spec файлах GCC, которые указывают на динамический компоновщик так, чтобы они указывали на новый компоновщик. Выполним следующее:
sed -i 's@ /tools/lib/ld-linux.so.2@ /lib/ld-linux.so.2@g' \ `gcc --print-file specs`
После этого также неплохо было бы проверить spec файлы, чтобы убедиться в сделаных изменениях.
Если вы работаете на платформе, на которой имя динамического компоновщика отличается от ld-linux.so.2, замените “ld-linux.so.2” на имя компоновщика для вашей платформы в вышеуказанной команде. Вернитесь к Разделу 5.3, “Технические моменты”, если необходимо.
На этом месте необходимо остановиться и убедиться, что основные функции (компиляция и компоновка) новых средств работают корректно. Для этого есть простой тест:
echo 'main(){}' > dummy.c cc dummy.c readelf -l a.out | grep ': /lib'
Если все в порядке, то не будет ошибок и на выводе вы увидите:
[Requesting program interpreter: /lib/ld-linux.so.2]
Заметьте, что /lib теперь является префиксом нашего компоновщика.
Если эта надпись вообще не появилась или появилась другая, то что-то сильно не так. Вам надо исследовать и повторить все пройденые шаги, чтобы найти в чем проблема и устранить ее. Точки для возврата после этого места уже не будет. Как правило, что-то не так бывает с вышеописаной правкой specs-фала. Любые проблемы необходимо устранить перед продолжением процесса.
Если все прошло нормально, удалим тестовые файлы:
rm dummy.c a.out
Если вы покидали среду chroot, снова войти в нее можно следующим вариантом команды chroot:
chroot "$LFS" /usr/bin/env -i \ HOME=/root TERM="$TERM" PS1='\u:\w\$ ' \ PATH=/bin:/usr/bin:/sbin:/usr/sbin \ /bin/bash --login
Причиной этого является то, что нам уже не надо использовать программы из директории /tools и эта директория может быть удалена для экономии места. Непосредственно перед удалением этой директории выйдите из chroot и войдите опять, используя коману, указанную выше. Также перед удалением /tools, заархивируйте ее при помощи tar и сохраните в безопасном месте в случае, если будете собирать другую систему LFS.
Удаляя /tools вы также удаляете временные копииf Tcl, Expect и DejaGNU, которые были использованы для запуска тестов. Для использования этих программ позднее, их надо будет перекомпилировать и переустановить. Инструкции по установке такие же, как в Главе 5, исключая изменение префикса с /tools на /usr. В книге BLFS обсуждается несколько отличный подход к установке Tcl (смотри http://www.linuxfromscratch.org/blfs/).
Пакеты и патчи, сохраненные в директории /sources могут быть перемещены в более подходящее место, например /usr/src/packages, или удалены, если они были записаны на CD.
Если предполагаемый пользователь не програмист и не планирует заниматься отладкой программ, то место, занимаемое системой, может быть уменьшено примерно на 200 MБ удалением отладочной информации из бинарников и библиотек.
Большинство людей, использующих команды, описанные ниже, не используют затруднений. Поскольку очень просто сделать опечатку и сделать новую систему непригодной, то перед запуском команды strip рекомендуется сделать резервную копию текущего состояния системы.
Перед выполнением сжатия обратите особое внимание на то, чтобы ни один из бинарников, которые будут сжаты, не были запущены. Если вы не уверены, входил ли пользователь в chroot с командой, описанной в Разделе 6.3, “Вход в среду Chroot”, сначала выйдите из chroot:
logout
Затем перезайдите:
chroot $LFS /tools/bin/env -i \ HOME=/root TERM=$TERM PS1='\u:\w\$ ' \ PATH=/bin:/usr/bin:/sbin:/usr/sbin \ /tools/bin/bash --login
Теперь бинарники и библиотеки могут быть безопасно сжаты:
/tools/bin/find /{,usr/}{bin,lib,sbin} -type f \ -exec /tools/bin/strip --strip-debug '{}' ';'
Большое число файлов будут сообщать об несоответствии их формата файла. Эти сообщения могут быть спокойно проигнорированы. Эти предупреждения показывают, что эти файлы являются скриптами, а не бинарниками.
Если дисковое пространство очень компактно, то опция --strip-all может быть использована на бинарниках в /{,usr/}{bin,sbin} для получения дополнительных свободных мегабайт. Не применяйте эту опцию на библиотеках—они будут разрушены.
Пакет Vim содержит мощный текстовый редактор
Расчетное время сборки 0.4 SBU
Требуемое место на диске 34 MB
Vim - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make, Ncurses и Sed
Если вы предпочитаете другие редакторы—такие как Emacs, Joe или Nano—загляните на http://www.linuxfromscratch.org/blfs/view/svn/postlfs/editors.html для получения инструкций по установке.
Сначала распакуем оба архива vim-6.3.tar.bz2 и (опционально) vim-6.3-lang.tar.gz в одну и ту же директорию. Затем изменим раположение по умолчанию файлов конфигурации vimrc и gvimrc на /etc:
echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h echo '#define SYS_GVIMRC_FILE "/etc/gvimrc"' >> src/feature.h
Подготавливаем Vim для компиляции:
./configure --prefix=/usr --enable-multibyte
Опционально, но очень рекомендуется ключ --enable-multibyte поддержки дополнений для редактирования файлов в мультибайтных кодировках символов в vim. Это необходимо при использовании локалей с мультибайтными кодировками символов. Этот ключ также полезен для возможности редактирования текстовых файлов, изначально созданных в таких дистрибутивах Linux, как Fedora Core, который использует UTF-8 в качестве основной кодировки символов.
Компилируем пакет
make
Для проверки результата вводим: make test. Этот тест выводит на экран большое количество хаотических символов, которые могут означать проблему с установками текущего терминала. Однако, запуск теста здесь является опциональным.
Устанавливаем пакет
make install
Многие пользователи используют vi вместо vim. Для возможности запуска vim, когда пользователи по ривычке вводят vi, создадим ссылку:
ln -s vim /usr/bin/vi
Если вы собираетесь устанавливать систему X Window на вашей системе LFS, вам надо будет перекомпилировать Vim после установки X. Vim содержит хорошую GUI версию редактора, который использует X и некоторые другие библиотеки при установке. Для более подробной информации прочитайте документацию по Vim и страницу по установке Vim в книге BLFS на http://www.linuxfromscratch.org/blfs/view/svn/postlfs/editors.html#postlfs-editors-vim.
По умолчанию vim запускается в режиме совместимости с vi. Это может быть новым для пользователей, которые пользовались другими редакторами в прошлом. Установка режима “несовместимости” включена ниже для выделения того факта, что будет использоваться новое поведениие редактора. Создадим основной файл конфигурации vim, выполнив следующее:
cat > /etc/vimrc << "EOF" " Begin /etc/vimrc set nocompatible set backspace=2 syntax on if (&term == "iterm") || (&term == "putty") set background=dark endif " End /etc/vimrc EOF
Строка set nocompatible делает так, что vim ведет себя более полезно (по умолчанию), чем в vi-совместимой манере. Удалите “no” для сохранения старого поведения vi. Строка set backspace=2 разрешает забой через конец строки, автоотступ и начало вставки. Сторока syntax on включает подсветку синтаксиса vim. Наконец, секция if с set background=dark корректирует догадку vim о цвете заднего плана на некоторых эмуляторах терминала. Это дает подсветку в лучшей цветовой схеме для использования с черным задним планом этих программ.
Документация о других доступных опциях может быть получена запуском следующей команды:
vim -c ':options'
Проинсталированные программы: efm_filter.pl, efm_perl.pl, ex (ссылка на vim), less.sh, mve.awk, pltags.pl, ref, rview (ссылка на vim), rvim (ссылка на vim), shtags.pl, tcltags, vi (ссылка на), view (ссылка на vim), vim, vim132, vim2html.pl, vimdiff (ссылка на vim), vimm, vimspell.sh, vimtutor и xxd
Фильтр для создания файла ошибки, который может быть прочитан vim.
Реформатирует сообщения об ошибках интерпритатора Perl для использования в режиме “quickfix” для vim.
Запускает vim в режиме ex.
Скрипт, запускающий vim с less.vim.
Обрабатывает ошибки vim.
Создает файл тегов кода perl для использования vim
Проверяет написание параметров.
Урезанная версия view; нет поддержки shell-команд и не может быть приостановлен view.
Урезанная версия vim; нет поддержки shell-команд и не может быть приостановлен and vim
Генерирует файл тегов для скриптов perl.
Генерирует файл тегов для кода TCL.
Запускает vim в режиме только для чтения.
Редактор
Редактор
Запускает vim в режиме 132-колоночного терминала.
Конвертирует документацию vim в HTML.
Редактирует две или три версии файла в vim и показывает различия.
Включает модель ввода DEC locator на удаленном терминале.
Просматривает файл и генерирует синтаксические выражения, необходимые для подсветки в vim. Этот скрипт требует старую Unix команду spell, которая не поддерживается ни в LFS, ни в BLFS.
Обучает вас основным командам и горячим клавишам vim
Отображает бинарник в шестнадцатиричном фрмате. Он также может работать в обратном направлении, что позволяет использовать его для патча бинарников.
Пакет Zlib содержит библиотеку, которая используется некоторыми программами для своих функций сжатия и распаковки.
Расчетное время сборки 0.1 SBU
Требуемое место на диске 1.5 MB
Zlib - зависимости установки: Binutils, Coreutils, GCC, Glibc, Make и Sed
Следующий патч устраняет уязвимость отрицания сервиса в библиотеке сжатия Zlib:
patch -Np1 -i ../zlib-1.2.1-security-1.patch
Zlib известна некорректной сборкой shared-библиотеки при указанной переменной окружения CFLAGS. Если вы используете эту переменную, добавите диррективу -fPIC в переменную CFLAGS на этом этапе, и удалите ее по окнчании.
Подготавливаем Zlib для компиляции:
./configure --prefix=/usr --shared
Компилируем пакет
make
Для проверки результата вводим: make check.
Установим разделяемую библиотеку:
make install
Соберем статическую библиотеку:
make clean ./configure --prefix=/usr make
Для тестирования результата опять выполним: make check.
Установим статическую библиотеку:
make install
Исправим права доступа у статической библиотеки:
chmod 644 /usr/lib/libz.a
Очень практично размещать важные библиотеки в директории /lib. Это особенно важно в случаях, когда /usr находится на отдельном разделе диска. Важно, чтобы загружаемые компоненты любых библиотек, которые используются программами в /bin или /sbin размещались в /lib так, что они находятся на разделе root и доступны в случае недоступности /usr.
Для обеспечения вышеуказанного, переместим загружаемые компоненты разделяемых Zlib в /lib:
mv /usr/lib/libz.so.* /lib
Исправим ссылку /usr/lib/libz.so:
ln -sf ../../lib/libz.so.1 /usr/lib/libz.so
Часть скрипта localnet устанавливает имя системы. Для этого надо настроить файл /etc/sysconfig/network.
Создадим файл /etc/sysconfig/network и укажем имя системы запуском:
echo "HOSTNAME=[lfs]" > /etc/sysconfig/network
[lfs] надо заменить на желаемое имя компьютера для вызова. Вам не надо здесь вводить Fully Qualified Domain Name (FQDN - полное доменное имя). Эту информацию мы позже укажем в файле /etc/hosts.
Если вы хотите настроить сетевую карту, вам надо определить IP-адреса, FQDN и возможные псевдонимы в файле /etc/hosts. Его синтакс следующий:
<IP address> myhost.example.org aliases
Если компьютер не должен быть подключен к интернет (т.е., есть регистрированный домен и корректный блок назначенных IP адресов—большинство пользователей этого не имеют) убедитесь, что IP-адреса в частной сети соотвестсвуют допустимым. Корректными значениями являются:
Классы сетей A 10.0.0.0 B от 172.16.0.0 до 172.31.0.0 C от 192.168.0.0 до 192.168.255.0
Корректным IP адресом может быть 192.168.1.1. Корректным FQDN для этого IP может быть www.linuxfromscratch.org (не рекомендуется, так как это зарегистрированное доменное имя и может означать проблемы с сервером доменных имен).
Если вы не собираетесь использовать сетевую карту, вам все равно надо указать FQDN. Это важно для правильной работы ряда важных программ.
Создадим файл /etc/hosts, запустив:
cat > /etc/hosts << "EOF" # Begin /etc/hosts (network card version) 127.0.0.1 localhost [192.168.1.1] [<HOSTNAME>.example.org] [HOSTNAME] # End /etc/hosts (network card version) EOF
Значения [192.168.1.1] и [<HOSTNAME>.example.org] должны быть изменены для специфичных пользователей или требований (если IP адреса назначены сетевым/системным администратором и машина будет соединена с другой сетью).
Если сетевая карта не будет настраиваться, создайте файл /etc/hosts запуском:
cat > /etc/hosts << "EOF" # Begin /etc/hosts (no network card version) 127.0.0.1 [<HOSTNAME>.example.org] [HOSTNAME] localhost # End /etc/hosts (no network card version) EOF
Этот раздел нужен только в том случае, если вы собираетесь настраивать сетевую карту.
Если у вас таковая отсутствует, вам не надо создавать файлы конфигурации сетевой карты. В этом случае вам надо удалить все ссылки network изо всех директорий с уровнями запуска (/etc/rc.d/rc*.d).
Какие из интерфейсов будут запущены или остановлены скриптом network описывается в директории /etc/sysconfig/network-devices. Эта директория содержит файлы вида ifconfig.xyz, где “xyz” является именем сетевого интерфейса (например eth0 или eth0:1).
Если вы решите переименовать или переместить директорию /etc/sysconfig/network-devices, вам надо будет отредактировать соответствующим образом файл /etc/sysconfig/rc и обновить “network_devices” в соответствии с новыми путями.
Теперь нам надо создать файлы в этой директории. Следующая команда создаст пример ipv4 файла для устройства eth0:
cd /etc/sysconfig/network-devices && mkdir ifconfig.eth0 && cat > ifconfig.eth0/ipv4 << "EOF" ONBOOT=yes SERVICE=ipv4-static IP=192.168.1.1 GATEWAY=192.168.1.2 PREFIX=24 BROADCAST=192.168.1.255 EOF
Значения переменных надо будет изменить на правильные для вашей системы. Если переменная ONBOOT установлена в “yes” скрипт network поднимет этот интерфейс при загрузке системы. Если же будет установлено что-либо другое, то этот интерфейс будет проигнорирован скриптом.
Переменная SERVICE описывает метод получения IP адресов. Скрипты загрузки LFS имеют модульный формат назначения IP адресов, а созданые дополнительные файлы в директории /etc/sysconfig/network-devices/services позволяют использовать другие методы назначения IP. Это использовано для Dynamic Host Configuration Protocol (DHCP), который описан в книге BLFS.
Переменная GATEWAY должна содержать IP адрес шлюза по умолчанию, если он есть. Если нет - закоментируйте эту переменную.
Переменная PREFIX нужна для описания количества бит, использованных в подсети. Каждый октет в IP адресации содержит 8 бит. Если сетевая маска IP подсети равна 255.255.255.0, то она использует первые три октета (24 бита) для описания номера сети. Если сетевая маска равна 255.255.255.240, то она использует первые 28 бит. Префиксы длиннее 24 бит используются DSL и кабельными провайдерами интернет сервисов (ISP). В этом примере (PREFIX=24) сетевая маска равна 255.255.255.0.
Если система подключена к интернет, то ей требуются некоторые обозначения разрешенных имен сервисов доменных имен (Domain Name Service - DNS) для разложения доменных имен интернет на IP адреса и наоборот. Это достигается размещением IP адресов DNS сервера, доступного от ISP или системного администратора, в /etc/resolv.conf. Создадим файл, выполнив следующее:
cat > /etc/resolv.conf << "EOF" # Begin /etc/resolv.conf domain {[Your Domain Name]} nameserver [IP address of your primary nameserver] nameserver [IP address of your secondary nameserver] # End /etc/resolv.conf EOF
Замените [IP address of the nameserver] на наиболее подходящие для установки IP адреса DNS. Здесь часто бывает более чем одно значение (вторичные сервера требуются для увеличения надежности). Если вам надо или вы хотите только один DNS сервер, удалите вторую строку nameserver из файла.
Скрипт setclock считывает время с внутренних часов вашего компьютера, также известных как часы BIOS или CMOS. Если аппаратные часы установлены на UTC, этот скрипт конвертирует время аппаратных часов в локальное время, используя файл /etc/localtime, (который говорит программе hwclock, в каком часовом поясе находится пользователь). Нет способа автоматического определения того, установленны ли внутренние часы вашего компьютера в GMT или нет, поэтому нам надо будет это настроить самим.
Если вы не помните, установлены ли аппаратные часы на время UTC, определите это запуском команды hwclock --localtime --show. Это скажет, какое текущее время установлено относительно аппаратных часов. Если это время соответствует установленному на ваших собственных часах, то аппаратные часы установлены на местное время. Если вывод hwclock показывает не местное время, то скорее всего это время UTC. Проверьте это добавлением или исключением правильного количесва часов для часового пояса в это время hwclock. Например, если вы живете в часовом поясе MST, который известен как GMT -0700, добавте семь часов к местному времени. Затем, посчитайте для Daylight Savings Time, которое требует исключения часа (или добавления только шести в первом случае) в летнее время.
Измените значение переменной UTC ниже на значение 0 (ноль), если аппаратные часы не установлены на время UTC.
Создадим новый файл /etc/sysconfig/clock запуском следующего:
cat > /etc/sysconfig/clock << "EOF" # Begin /etc/sysconfig/clock UTC=1 # End /etc/sysconfig/clock EOF
Хорошие советы по настройке времени в системе LFS находятся на http://www.linuxfromscratch.org/hints/downloads/files/time.txt. Они содержат информацию по временным зонам, UTC и переменной окружения TZ.
Скрипт sysklogd вызывает программу syslogd с параметром -m 0. Этот параметр отключает периодическую отметку времени, которую syslogd по умолчанию пишет в лог-файл каждые 20 минут. Для включения этой периодической отметки времени, отредактируйте скрипт sysklogd, выполнив соответствующие изменения. Для более полной информации смотрите man syslogd.
Эта глава описывает установку системных загрузочных скриптов и их правильную настройку. Большинство этих скриптов будут работать без изменений, но некоторые требуют дополнительные файлы конфигурации потому, что они работают с аппаратно-зависимой информацией.
Стиль System-V загрузочных скриптов применяется в этой книге так как он широко используется. Дополнительно есть совет, описывающий BSD-стиль загрузочных скриптов, который доступен на http://www.linuxfromscratch.org/hints/downloads/files/bsd-init.txt. Поиск в списках рассылки LFS для “depinit” также часто дает дополнительный выбор.
Если вы используете альтернативный стиль загрузочных скриптов, пропустите эту главу и переходите к Главе 8.
Файл /etc/inputrc используется в планировании клавиатуры для специфических ситуаций. Этот файл является стартовым файлом, используемым библиотекой Readline, связанной с вводом и используемой Bash и большинством других оболочек.
Для большей информации смотрите info-страницу bash, раздел Readline Init File. Info-страница readline также хороший источник информации.
Глобальные значения устанавливаюются в /etc/inputrc, а личные значения пользователей - в ~/.inputrc. Файл ~/.inputrc будет заменять глобальный файл установок. Последняя страница настроит Bash для работы с /etc/inputrc если для пользователя нет файла .inputrc во время чтения /etc/profile (обычно при регистрации). Чтобы сделать систему, использующую оба файла, или отрицать глобальную поддерржку клавиатуры, хорошая идея разместить файл .inputrc в директории /etc/skel для использованя новыми пользователями.
Ниже приведен базовый файл /etc/inputrc с коментариями, объясняющими действия некоторых опций. Заметьте, что коментарии не могут быть в той же строке, что и команда.
Для создания .inputrc в /etc/skel, используя команду ниже, измените вывод команды в /etc/skel/.inputrc и после проверьте/установите права доступа. Скопируйте этот файл в /etc/inputrc и домашние директории всех имеющихся в системе пользователей, включая root, которому нужна собственная версия файла. Удостоверьтесь в использовании параметра -p команды cp для поддержки прав доступа и убедитесь в изменении владельца и присвоении группы.
cat > /etc/inputrc << "EOF" # Begin /etc/inputrc # Modified by Chris Lynn <roryo@roryo.dynup.net> # Не выводим ничего в первой строке set horizontal-scroll-mode Off # Разрешает 8-и битный ввод set meta-flag On set input-meta On # Выключаем конвертацию 8-ого бита set convert-meta Off # Оставляем 8-ой бит для экрана set output-meta On # ничего, видимый или слышимый set bell-style none # Все следующее - карта соответствий escape-последовательностей значений, # содержащихся внутри первого аргумента, к специфическим функциям # readline "\eOd": backward-word "\eOc": forward-word # for linux console "\e[1~": beginning-of-line "\e[4~": end-of-line "\e[5~": beginning-of-history "\e[6~": end-of-history "\e[3~": delete-char "\e[2~": quoted-insert # for xterm "\eOH": beginning-of-line "\eOF": end-of-line # for Konsole "\e[H": beginning-of-line "\e[F": end-of-line # End /etc/inputrc EOF
Программа-оболочка /bin/bash (далее называемая “оболочкой”) при запуске использует набор стартовых файлов для создания окружения. Файлы в директории /etc предоставляют глобальные установки. Если эквивалентные файлы присутствуют в домашней диретории, то они могут заменить глобальные установки.
Интерактивнвя регистрация оболочки запускается после успешного входа, используя /bin/login, который читает файл /etc/passwd.
Интерактивнвя нерегистрированная оболочка запускается из командной строки (т.е. [prompt]$/bin/bash).
Неинтерактивная оболочка обычно присутствует при загрузке стартовых скриптов. Она неинтерактивная потому, что она выполняет скрипт и не ожидает ввода от пользователя между выполнением команд.
Для большей информации смотрите info bash
Файлы /etc/profile и ~/.bash_profile читаются, когда оболочка работает в режиме интерактивной регистрации.
Основной файл /etc/profile ниже устанавливает некоторые переменные окружения, необходимые для поддержки различных языков. Правильная их установка даст следующий результат:
Вывод программ транслируется на нужном языке
Правильная классификация символов в буквы, цифры и другие классы. Это необходимо Bash для правильного применения не-ASCII символов в командной строке при не-английской локали
Правилиный алфавитный порядок сортировки
Предпочтительный размер страницы по умолчанию
Правильное форматирование денежной величины, времени и даты
Этот скрипт также устанавливает переменную окружения INPUTRC, которая заставляет Bash и Readline использовать ранее созданный файл /etc/inputrc.
Замените [ll] ниже на двух-буквенный код для требуемого языка (т.е., “ru”) и [CC] на на двух-буквенный код страны (т.е., “RU”). Также может быть необходимо указание (и это актуальная и предпочтительная форма) кодировки символов (т.е. “koi8-r”) после точки (так, что в результате будет “ru_RU.koi8-r”). Используйте следующую команду для большей информации:
man 3 setlocale
Список всех локалей, поддерживаемых Glibc, может быть получен запуском следующей команды:
locale -a
Как только подходящие параметры локали будут определены, создайте файл /etc/profile:
cat > /etc/profile << "EOF" # Begin /etc/profile export LC_ALL=[ll]_[CC] export LANG=[ll]_[CC] export INPUTRC=/etc/inputrc # End /etc/profile EOF
Локали “C” (по умолчанию) и “en_US” (рекомендуется для английских пользователей США) различаются.
Установка раскладки клавиатуры, эранного шрифта и локале-связанных переменных окружения является только шагом интернационализации, нужным для поддержки локалей, использующих обычные однобайтовые кодировки и направление письма слева-направо. Более комплексные вещи (включая UTF-8 основанные локали) требуют дополнительных шагов и дополнительных патчей, так как много приложений имеют склонность работать неправильно в таких условиях. Эти шаги и патчи не включены в книгу LFS и такие локали не поддерживаются LFS.
Этот раздел описывает настройку стартового скрипта console, который устанавливает раскладку клавиатуры и консольный шрифт. Если не-ASCII символы (британский фунт и символ Евро примеры не-ASCII символов) не будут использованы и используется клавиатура U.S, можете пропустить этот раздел. Без файла конфигурации стартовый скрипт console не будет ничего делать.
Скрипт console использует /etc/sysconfig/console в качестве файла конфигурации. Решите, какой шрифт и раскладка клавиатуры будут использованы. Языково-специфичный FAQ поможет в этом. Подготовленный файл /etc/sysconfig/console с известными настройками для некоторых стран был установлен в пакете LFS-Bootscripts, значит подходящий раздел может быть раскоментирован, если есть поддерживаемая страна. Если все еще сомневаетесь, обратитесь в директорию /usr/share/kbd для получения доступных раскладок клавиатуры и эранных шрифтов. Прочтите мануалы для loadkeys и setfont и определите корректные аргументы для этих программ. После определения создайте файл конфигурации следующей командой:
cat >/etc/sysconfig/console <<"EOF" KEYMAP="[arguments for loadkeys]" FONT="[arguments for setfont]" EOF
Например, для испанских пользователей, желающих использовать символ Евро, (доступный нажатием AltGr+E), будут корректными следующие установки:
cat >/etc/sysconfig/console <<"EOF" KEYMAP="es euro2" FONT="lat9-16 -u iso01" EOF
Строка FONT выше корректна только для ISO 8859-15 таблицы символов. Если используется ISO 8859-1, то символ фунт будет вместо Евро, и корректная строка FONT должна быть такой:
FONT="lat1-16"
Если переменная KEYMAP или FONT не установлена, скрипт console не будет загружать соответствующую программу.
В некоторых раскладках клавиатуры кнопки Backspace и Delete посылают символы, отличные от соответствующих символов в раскладке клавиатуры по умолчанию, встроенной в ядро. Это путает некоторые приложения. Например, Emacs отображает свою подсказку (вместо удаления символа перед курсором) при нажатии Backspace. Проверим эффективность используемой раскладки клавиатуры (это работает только для i386 раскладок):
zgrep '\W14\W' [/path/to/your/keymap]
Если код 14 является клавишей Backspace вместо Delete, создайте следующий отрезок раскладки клавиатуры для устранения этой проблемы:
mkdir -p /etc/kbd && cat > /etc/kbd/bs-sends-del <<"EOF" keycode 14 = Delete Delete Delete Delete alt keycode 14 = Meta_Delete altgr alt keycode 14 = Meta_Delete keycode 111 = Remove altgr control keycode 111 = Boot control alt keycode 111 = Boot altgr control alt keycode 111 = Boot EOF
Скажите скрипту console загружать этот отрезок после загрузки основной раскладки клавиатуры:
cat >>/etc/sysconfig/console <<"EOF" KEYMAP_CORRECTION="/etc/kbd/bs-sends-del" EOF
Для вкомпилирования раскладки клавиатуры прямо в ядро вместо установки ее каждый раз при загрузке скриптом console, следуйте инструкциям, описанным в Разделе 8.3, “Linux-2.6.8.1”. Делайте это, если уверены, что клавиатура всегда будет работать, как ожидается, даже когда загрузитесь в эксплуатационной моде (переход init=/bin/sh в ядро), потому что скрипт console не будет запускать экранный шрифт автоматически. Это не составит много проблем так как ASCII символы будут поддерживаться корректно неправдоподобно, что пользователю было бы необходимо полагаться на не-ASCII символы в течении эксплуатационной моды.
Так как раскладку клавиатуры будет устанавливать ядро, то можно убрать переменную KEYMAP в файле /etc/sysconfig/console. Если потребуется, она также может быть оставлена на месте без последствий. Ее сохранение может быть полезным при возможности загузки нескольких различных ядер, когда трудно узнать, что эта раскладка вкомпилирована во все ядра.
Linux использует специальные средства загрузки, называемые SysVinit, которые основаны на концепции уровней запуска. Они могут сильно различаться от одной системы к другой, и мы не можем сказать, что скрипты из <подставите сюда имя любого дистрибутива> будут работать на LFS. У LFS свой подход к этим скриптам, но они также соответствуют стандартам.
SysVinit (с этого момента мы будем называть его “init”) работает, используя схему уровней запуска. Всего есть семь (от 0 до 6) уровней запуска (точнее, есть больше уровней запуска, но они предназначены для специальных целей и обычно не используются. Документация по init содержит более полную информацию по этому вопросу) и каждый из них сообщает компьютеру, что ему делать при запуске соответствующего уровня. Уровень запуска по умолчанию - 3. Вот описание разных уровней загрузки и их назначение:
0:выключение компьютера
1:однопользовательский режим
2:многопользовательский режим без поддержки сети
3:многопользовательский режим с поддержкой сети
4:зарезервирован или используется как 3
5:тоже самое, что и 4, он обычно используется для графического входа
в систему (например xdm из
X-ов или kdm из KDE)
6:перезагрузка компьютера
Для изменения уровня запуска используется команда init [runlevel], где [runlevel] нужный уровень запуска. Например, для перезагрузки компьютера можно использовать команду init 6. Это и делает команда reboot, а команда halt является аналогом init 0.
Есть ряд директорий в /etc/rc.d, которые выглядят как rc?.d (где ? является уровнем запуска) и rcsysinit.d, которые содержат ряд символических ссылок. Часть из них начинается с K, другие начинаются с S, затем идут две цифры уровня инициализации. K означает остановку (kill) сервиса, а S - запуск (start). Цисло означает порядок, в котором запускаются скрипты, от 00 до 99; чем меньше номер, тем раньше вызывается скрипт. Когда init переключается на другой уровень загрузки, одни сервисы останавливаются, другие запускаются.
Сами скрипты расположены в /etc/rc.d/init.d. Они проделывают всю работу, а ссылки только указывают на них. Ссылки остановки и запуска указывают на один и тот же скрипт в /etc/rc.d/init.d. Это возможно благодаря тому, что скрипты запукаются с различными параметрами, такими как start, stop, restart, reload и status. Когда обрабатывается ссылка К, то соответствующий скрипт вызывается с аргументом stop. Если же обрабатывается ссылка S, то скрипт вызывается с параметром start.
Но есть одно исключение. Ссылки, начинающиеся с S в директориях rc0.d и rc6.d вызываются только с параметром stop для остановки чего-либо. Это понятно, потому что когда вы собираетесь перезагрузить или отключить систему, вам не надо ничего запускать, а только остановить систему.
Вот описание параметров, которые можно передавать скриптам запуска:
Запуск сервиса.
Остановка сервиса.
Сервис останавливается и запускается заново.
Это команда для обновления настроек сервиса. Она обычно вызывается после изменения конфигурационного файла скрипта, но сервису не нужно перезапускаться.
Показывает, запущен ли сервис и какой у него PID.
Вы спокойно можете настраивать и изменять процесс загрузки (после установки вашей системы LFS). Файлы, описываемые здесь, являются только примерами и, возможно, вы сделаете их лучше.
Установка системных скриптов загрузки
Как эти стартовые скрипты работают?
Пакет LFS-Bootscripts содержит набор стартовых скриптов.
Расчетное время сборки 0.1 SBU
Требуемое место на диске 0.3 MB
LFS-Bootscripts - зависимости установки: Bash и Coreutils
Установка пакета:
make install
Установленные скрипты: checkfs, cleanfs, console, functions, halt, ifdown, ifup, localnet, mountfs, mountkernfs, network, rc, reboot, sendsignals, setclock, static, swap, sysklogd, template и udev
Проверяет файловые системы перед их монтированием (исключая журналируемые и сетевые файловые системы)
Удаляет файлы, которые не должны быть сохранены между перезагрузками, например в /var/run/ и /var/lock/; он пересоздает /var/run/utmp и удаляет возможно присутствующие файлы /etc/nologin, /fastboot и /forcefsck.
Загружает раскладку клавиатуры и устанавливает экранный шрифт
Содержит функции, разделяемые различными сскриптами, такие как ошибка и статус проверки
Выключает систему
Помагает скрипту network с сетевыми устройствами
Помагает скрипту network с сетевыми устройствами
Устанавливает имя хоста системы и локальное петлевое устройство
Монтирует все файловые системы, исключая сетевые или помеченные как noauto
Используется для монтирования файловых систем ядра, таких как proc
Настраивает сетевые интерфейсы, такие как сетевые карты, и устанавливает gateway по умолчанию (там где применяется)
Ведущий скрипт; он отвечает за запуск всех остальных скриптов по одному в последовательности, определенной именами ссылок
Перезагружает систему
Останавливает все процессы перед перезагрузкой или выключением системы
Переустанавливает часы ядра на локальное время, если аппаратные часы не установлены на время UTC
Предоставляет необходимую функциональность для назначения статических IP адресов сетевым интерфейсам
Включает и выключает файлы и разделы подкачки
Запускает и останавливает демоны ведения логов ядра и системы
Заготовка для создания собственных скриптов для других демонов
Настраивает udev и создает ноды устройств в /dev
В Главе 6 мы установили пакет Udev. Сначала мы детально расмотрим, как это работает и короткую историю предыдущих методов поддержки устройств.
Системы Linux в основном традиционно используют метод создания статических устройств, из-за чего создается огромное количество нод устройств в директори /dev (иногда буквально сотни нод), не смотря на наличие соответствующих реальных аппаратных устройств. Это типично для работы скрипта MAKEDEV, который содержит большое количество вызовов к программе mknod с уместными старшими и младшими номерами устройств для каждого возможного устройства, которое может существовать в мире. Используя метод udev, только те устройства, которые обнаружены ядром, получат ноды устройств, созданные для них. Поскольку эти ноды устройств будут создаваться при каждой загрузке системы, они будут сохраняться в ramfs (файловой системе, которая размещается непосредственно в памяти и не занимает места на диске). Ноды устройств не требуют много места на диске, поэтому используемая ими память незначительна.
В феврале 2000 года новая файловая система, названная devfs, была добавлена в ядро 2.3.46 и стала доступной в стабильных ядрах серии 2.4. Хотя сама она присутствовала в исходниках ядра, метод динамического создания устройств никогда не получал подавляющую поддержку разработчиков ядра.
Основные проблемы к такому подходу, заимствованые devfs - это способ поддержки определения, создания и именования устройств. Возможно, последняя проблема именования нод устройств была более критичной. Обычно принималось, что имена устройств доступны для конфигурации, затем политика именования устройств должна быть передана системному администратору, не навязана ему любым разработчиком. Файловая система devfs также страдала от обстоятельств, связанных с ее разработкой, и не могла быть исправлена без обоснования пересмотра ядра. Для нее также не хватало новых разработчиков.
С разработкой нестабильной ветки ядра 2.5, в конце выпущенной как серия 2.6 стабильных ядер, появилась новая виртуальная файловая система, названная sysfs. Работа sysfs - это экспорт видимой для процессов системной структуры в пространстве пользователя. С таким пространством пользователя замена devfs стала более реальной.
Файловая система sysfs была коротко упомянута выше. Одно может удивлять, как sysfs знала о присутствующих в системе устройствах и какие номера устройств должны быть использованы. Драйвера, которые были вкомпилированы прямо в ядро, регистрировали свои объекты при помощи sysfs, поскольку они определялись ядром. Для драйверов, скомпилированных в виде модулей это произойдет после загрузки модулей. Как только файловая система sysfs примонтирована (в /sys), данные, встроеные в драйвера и зарегистрированные sysfs, становятся доступными для процессов пространства пользователя и для udev для создания нод устройств.
Стартовый скрипт S10udev заботится о создании этих нод устройств во время загрузки Linux. Этот скрипт запускается с регистрацией /sbin/udev в качестве руководителя событий hotplug (горячих подключений). События hotplug (обсуждаемые ниже) не должны быть генерированы на этом этапе, но udev регистрируется только в случае, если они происходят. Затем программа udevstart проходит по файловой системе /sys и создает устройства в директории /dev, которые соответствуют описаниям. Например, /sys/class/tty/vcs/dev содержит строку “7:0”. Эта строка используется udevstart для созданиия /dev/vcs со старшим номером 7 и младшим 0. Права доступа каждого из устройств, создаваемых udevstart, устанавливаются, используя файлы в директории /etc/udev.d/permissions.d/. Они пронуменованы в стиле, похожем на стартовые скрипты LFS. Если udev не может найти файл с правами доступа для создаваемых устройств, то по умолчанию будут установлены права доступа 600 и владелец root:root. Имена созданных в директории /dev нод устройств сконфигурированы соответственно правилам, описанным в файлах в директории /etc/udev/rules.d/.
Как только выше описанный этап выполниться, все присутствующие устройства и имеющие вкомпиливованные в ядро драйвера будут доступны для использования. А что с устройствами, имеющими модульные драйвера?
Ранее мы описали концепцию “поддержки событий hotplug”. Когда подключение нового устройства обнаружено ядром, ядро сренерирует событие hotplug и обратится к файлу /proc/sys/kernel/hotplug для поиска программы, поддерживающей подключение устройств. Стартовый скрипт udev зарегистрирован udev в качестве такой программы. Когда эти события hotplug сгенерированы, ядро скажет udev проверить файловую систему /sys для поиска информации, принадлежащей этому новому устройству, и создать для него объект в /dev.
Это подводит нас к проблеме, которая присутствует с udev, а также перед ней с devfs. Для нас это похоже на проблему “курицы и яйца”. Большинство Linux дистрибутивов поддерживают загрузку модулей через содержимое файла /etc/modules.conf. Доступ к нодам устройств вызывает загрузку подходящего модуля ядра. С udev этот метод не будет работать, так как нода устройства отсутствует во время загрузки модуля. Для решения этой задачи в пакет lfs-bootscripts был добавлен загрузочный скрипт S05modules вместе с файлом /etc/sysconfig/modules. Добавив имена модулей в файл modules, эти модули будут загружены при старте компьютера. Это позволяет udev определить устройства и создать подходящие ноды устройств.
Зметьте, что на медленных машинах или для драйверов, создающих много нод устройств, процессы создания устройств могут занять несколько секунд. Это означает, что некоторые ноды устройств могут не быть доступны немедленно.
Если вы подключаете устройство, такое как Universal Serial Bus (USB) MP3 проигрыватель, ядро определяет, что устройство подключилось и генерирует событие hotplug. Если драйвер уже загружен (потому что он был вкомпилирован в ядро или был загружен как модуль через скрипт S05modules), будет вызван udev для создания уместной ноды устройства согласно данным sysfs, доступным в /sys. Если драйвер для только что подключенного устройства доступен в виде модуля, но в данный момент выгружен, то присоединение устройства к системе только вызовет драйвер шины ядра для генерации события hotplug, которое сообщает пространству пользователя о новом подключении устройства и присоединения к драйверу не будет. В результате ничего не происходит и само устройство еще не готово к использованию.
Если для собираемой системы, имеющей много драйверов, исполнение их в виде модулей лучше, чем прямое встраивание в ядро, использование скрипта S05modules может быть не практичным. Пакет Hotplug (смотрите http://linux-hotplug.sourceforge.net/) может быть более предпочтительным в этом случае. Когда пакет Hotplug установлен, он будет отвечать на вышеупомянутые события hotplug драйвера шины ядра. Пакет Hotplug загрузит подходящий модуль и сделает это устройство доступным созданием для него ноды(нод) устройства.
Есть несколько известных проблем при автоматическом создании нод устройств:
1) Драйвер ядра может не экспортировать свои данные для sysfs.
Это часто встречается с драйверами, не входящими в дерево ядра. Используйте файл конфигурации /etc/sysconfig/createfiles для ручного создания устройств. Проконсультируйтесь в файле devices.txt в документации ядра или в документации для этого драйвера для поиска правильных старших/младших номеров.
2) Требуется не аппаратное устройство.
Это часто встречается с модулем совместимости Open Sound System (OSS) проекта Advanced Linux Sound Architecture (ALSA). Такой тип устройств может поддерживаться двумя способами:
Добавлением имен модулей в /etc/sysconfig/modules
Используя строку “install” в /etc/modprobe.conf. Это говорит команде modprobe “когда загружаеш тот модуль, также одновременно загрузи и этот другой модуль”. Например:
install snd-pcm modprobe -i snd-pcm ; modprobe \ snd-pcm-oss ; true
Это заставит систему загружать оба модуля snd-pcm и snd-pcm-oss когда сделан запрос для загрузки драйвера snd-pcm.
Дополнительная полезная документация доступна на следующих сайтах:
Файл /etc/fstab используется рядом программ для определения того, какие разделы будут монтированы по умолчанию, какие файловые системы должны быть проверены и т.д. Создадим новую таблицу файловых системм как здесь:
cat > /etc/fstab << "EOF" # Begin /etc/fstab # file system mount-point type options dump fsck # order /dev/[xxx] / [fff] defaults 1 1 /dev/[yyy] swap swap pri=1 0 0 proc /proc proc defaults 0 0 sysfs /sys sysfs defaults 0 0 devpts /dev/pts devpts gid=4,mode=620 0 0 shm /dev/shm tmpfs defaults 0 0 # End /etc/fstab EOF
Замените [xxx], [yyy] и [fff] на более подходяшие для системы значения, например, hda2, hda5 и ext2. За более полной информацией обратитесь к man 5 fstab.
При использовании журналируемых файловых систем 1 1 в конце строки должны быть заменены на 0 0, так как такие разделы не требуют проверки.
Точка монтирования /dev/shm для tmpfs добавлена для обеспечения поддержки POSIX-разделяемой памяти. Ваше ядро должно быть собрано со встроенной поддержкой этой системы (более подробно об этом смотрите в следующем разделе). Имейте в виду, что только небольшое количество програмного обеспечения использует POSIX-разделяемую память. Поэтому точка монтирования /dev/shm является опциональной. Для более подробной информации смотрите Documentation/filesystems/tmpfs.txt в дереве исходников ядра.
Также вы можете добавлять другие строки в файл /etc/fstab. Напимер строку для поддержки устройств USB:
usbfs /proc/bus/usb usbfs devgid=14,devmode=0660 0 0
Это будет работать только если “Support for Host-side USB” и “USB device filesystem” вкомпилированы прямо в ядро (не как модуль).
Вы почти полностью установили новую систему LFS. Теперь нам надо обеспечить возможность ее загрузки. Следующие инструкции применимы только для компьютеров с архитектурой IA-32, т. е. к большинству PC. Информация о “загрузке системы” на других архитектурах может отличаться и использовать другие ресурсы.
Загрузка может быть комплексной задачей. Для начала несколько предостережений. Вы очень сильно зависите от вашего текущего загрузчика и любая операционая система на вашем жестком диске (дисках) может перестать загружаться. Убедитесь в том, что у вас есть резервная загрузочная “спасательная” дискета или диск, иначе вы рискуете получить нерабочий компьютер (точнее, незагружающийся).
Мы скомпилировали и установили загрузчик Grub именно для этого шага. Процедура включает запись определенных файлов Grub в специальное место на вашем жестком диске. Перед тем как вы сделаете это, мы крайне рекомендуем зоздать загрузочную дискету с Grub. Вставьте пустую дискету и запустите следующие команды:
dd if=/boot/grub/stage1 of=/dev/fd0 bs=512 count=1 dd if=/boot/grub/stage2 of=/dev/fd0 bs=512 seek=1
Выньте дискету и сохраните ее где нибуть в надежном месте. Теперь мы запустим оболочку grub:
grub
Grub использует свою структуру имен для дисков и разделов в форме (hdn,m), где n является номером жесткого диска, а m - номером раздела, которые начинаются с нуля. Например, раздел hda1 будет (hd0,0) для Grub, а hdb3 - (hd1,2). В отличие от Linux, Grub не считает CD-ROM приводы за жесткие диски, так что если у вас есть CD на hdb, а второй жесткий диск на hdc, то ваш второй жесткий диск будет (hd1).
Используя приведенную информацию, определите правильное название для вашего корневого раздела. В нижеприведенных примерах мы будем считать, что он находится на hda4.
Скажем Grub, где ему искать свои файлы stage{1,2}. Клавиша Tab может быть использована для показа Grub-ом альтернативных вариантов при загрузке:
root (hd0,3)
Нижеприведенные команды перезапишут ваш текущий загрузчик. Не запускайте эти команды, если вам этого не надо. К примеру, вы можете использовать загрузку в несколько этапов путем манипуляций вашими MBR (Master Boot Record). В этом случае стоит установить Grub в “загрузочный сектор” раздела LFS. В таком случае это делается командой setup (hd0,3).
Теперь дадим команду на установку загрузчика в MBR hda:
setup (hd0)
Если все в порядке, то Grub сообщит о том, что нашел свои файлы в /boot/grub. Это все. Выходим из оболочки grub:
quit
Создадаим файл “menu.lst”, описывающий меню загрузки Grub:
cat > /boot/grub/menu.lst << "EOF" # Begin /boot/grub/menu.lst # По умолчанию загружаем первый пункт меню. default 0 # Ждем 30 секунд перед автозагрузкой. timeout 30 # Используем желаемые цвета. color green/black light-green/black # Первый пункт меню для LFS. title LFS 6.0 root (hd0,3) kernel /boot/lfskernel-2.6.8.1 root=/dev/hda4 EOF
Вы можете захотеть добавить пункт для вашей основной системы. Это делается примерно так:
cat >> /boot/grub/menu.lst << "EOF" title Red Hat root (hd0,2) kernel /boot/kernel-2.4.20 root=/dev/hda3 initrd /boot/initrd-2.4.20 EOF
Если у вас есть Windows, следующая команда добавит пункт для его загрузки:
cat >> /boot/grub/menu.lst << "EOF" title Windows rootnoverify (hd0,0) chainloader +1 EOF
Если info grub не даст вам исчерпывающей информации, то вам стоит посетить страничку Grub по адресу: http://www.gnu.org/software/grub/.
Пакет Linux содержит ядро и файлы заголовков.
Расчетное время сборки 4.20 SBU
Требуемое место на диске 181 MB
Linux - зависимости установки: Bash, Binutils, Coreutils, Findutils, GCC, Glibc, Grep, Gzip, Make, Modutils, Perl и Sed
Сборка ядра разбита на несколько шагов — конфигурация, компиляция и установка. Если вам не нравится способ установки, описаный в этой книге, то посмотрите файл README в директории с исходниками ядра на предмет альтернативы.
Подготовимся к компиляции запуском следующей команды:
make mrproper
Это позволит убедиться, что дерево исходников будет абсолютно чистым. Команда разработки ядра рекомендует запускать эту команду перед каждой компиляцией ядра. Вы не можете быть абсолютно уверены в отсутствии лишних файлов даже после распаковки исходников.
Так же убедимся, что ядро не пропускает события горячих подключений устройств в пространстве пользователя пока пространство пользователя показывает, что оно готово:
sed -i 's@/sbin/hotplug@/bin/true@' kernel/kmod.c
Если в Разделе 7.6, “Настройка консоли Linux”, было решено вкомпилировать раскладку клавиатуры в ядро, используйте следующую команду:
loadkeys -m /usr/share/kbd/keymaps/[path to keymap] > \ drivers/char/defkeymap.c
Например для использования русской клавиатуры (один из вариантов), используйте /usr/share/kbd/keymaps/i386/qwerty/ru1.map.gz.
Отконфигурируем ядро через меню-подобный интерфейс:
make menuconfig
Альтернативно, make oldconfig может быть более подходящим в некоторых ситуациях. Смотрите файл README для большей информации.
При конфигурации ядра убедитесь, что включили опцию “Support for hot-pluggable devices” в меню “General Setup”. Это разрешит события горячеих подключений, которые используются udev для заполнения директории /dev нодами устройств.
Если хотите, можете пропустить конфигурацию ядра копированием файла конфигурации .config из основной системы (если он доступен) в распакованную директорию linux-2.6.8.1, хотя мы это не рекомендуем. Часто лучше пройтись по всему меню конфигурации для создания файла конфигурации ядра.
Для поддержки POSIX-разделяемой памяти убедитесь, что опция “Virtual memory file system support” включена. Она расположена в меню “File systems” и обычно включена по умолчанию.
Скрипты загрузки LFS также предполагают, что обе опции “Support for Host-side USB” и “USB device filesystem” были вкомпилированы непосредственно в ядро или они не были компилированы вообще. Скрипты загрузки не будут работаль правильно, если эта поддержка выполнена в виде модуля (usbcore.ko).
NPTL требует, чтобы ядро было скомпилировано с GCC 3.x, в данном случае 3.4.1. Компиляция с GCC 2.95.x известна некоторыми ошибками при тесте glibc, поэтому не рекомендуется компилировать ядро с gcc 2.95.x.
Скомпилируем образ ядра и модули:
make
Если вы будете использовать модули, то может понадобиться файл /etc/modprobe.conf. Информация по модулям и конфигурации ядра находится в документации ядра в директории linux-2.6.8.1/Documentation. Также может быть интересна man страница modprobe.conf.
Будьте осторожны при чтении другой документации, так как обычно она применима только к ядрам 2.4.x. Как мы давно знаем, проблемы конфигурации ядра, специфичные для Hotplug и Udev, не документированы. Проблема в том, что Udev будет создавать ноды устройств только если Hotplug или созданный пользователем скрипт вставит соответствующий модуль в ядро и не все модули определяются Hotplug. Заметьте, что утверждения, похожие на указанное ниже, в файле /etc/modprobe.conf не работают с Udev:
alias char-major-XXX some-module
Поскольку планируется компиляция с поддержкой Hotplug, Udev и модулей, мы рекомендуем начинать с полностью монолитной конфигурацией ядра, особенно при первом использовании Udev.
Установим модули, если ядро их использует:
make modules_install
Если имеется много модулей и очень мало свободного места на диске, подумайте о компрессии модулей. Для большинства пользователей такая компрессия не стоит затрат времени, но если система сжимается для экономии места, смотрите http://www.linux-mips.org/archives/linux-mips/2002-04/msg00031.html.
После завершения компиляции ядра требуются дополнительные шаги для завершения установки. Некоторые файлы необходимо скопировать в директорию /boot.
Путь к образу ядра может отличаться для различных платформ. Используйте следующую команду для установки ядра:
cp arch/i386/boot/bzImage /boot/lfskernel-2.6.8.1
System.map это файл карты символов для ядра. Он содержит карту точек входа в каждую функцию API ядра. Используйте следующую команду для установки этого файла:
cp System.map /boot/System.map-2.6.8.1
Файл конфигурации ядра .config, созданный после выполнения команды make menuconfig, содержит все выбранные опции конфигурации для только что откомпилированного ядра. Хорошей идеей будет сохранение этого файла:
cp .config /boot/config-2.6.8.1
Важно отметить, что файлы в директории исходников ядра не принадлежат пользователю root. Хотя пакет был распакован пользователем root (так как мы находимся в среде chroot), файлы имеют ID пользователя и группы, соответствующие компьютеру, на которм проводилась упаковка. Обычно это не является проблемой для остальных пакетов поскольку дерево исходников удаляется после установки ядра, хотя часто оно сохраняются очень долго. В связи с этим имеется вероятность, что пользователь с таким же ID, как у собранного пакета исходников ядра, получит права доступа на запись в директории исходников ядра.
Если дерево исходников ядра планируется сохранить, выполните chown -R 0:0 на директории linux-2.6.8.1 для передачи всех файлов пользователю root.
Установленные файлы: ядро, заголовки ядра и System.map
Это двигатель системы Linux. При включении компьютера ядро является первой частью операционной системы, которая будет загружена. Оно определяет и инициализирует все аппаратные компоненты компьютера, после чего делает эти компоненты доступными для программ в виде дерева файлов и включает одиночный процессор в многопроцессорной системе.
Описывают интерфейс к предоставляемым ядром сервисам. Заголовки в системной директории include должны всегда быть теми же, что использовались для компиляции Glibc и поэтому не должны быть заменены при обновлении ядра.
Список адресов и символов; карта точек входа и адреса каждой функции API ядра и структур данных ядра.
Мы благодарим вас за прочтение книги LFS и надеемся, что вы нашли в ней много полезного для себя и провели время с пользой.
Теперь, когда вы закончили установку вашей системы LFS, вы наверно спросите “Что дальше?” Для ответа на этот вопрос мы составили список ресурсов, который вам может оказаться полезным.
После Linux From Scratch
Книга После Linux From Scratch описывает процедуру установки большого списка программ не вошедших в книгу LFS. Проект BLFS находится по адресу http://www.linuxfromscratch.org/blfs/.
Советы LFS
Советы LFS являются набором небольших разьяснительных документов, составленых волонтерами из сообщества LFS. Эти советы можно найти на http://www.linuxfromscratch.org/hints/list.html.
Списки рассылки
Есть ряд списков рассылки LFS в которые вы можете обратиться за помощью. Смотрите Главу 1 - Списки рассылки для более полной информации.
Проект документации Linux
Целью проекта документации Linux (TLDP) является сотрудничество с целью создания документации по Linux. LDP содержит большую коллекцию различных HOWTO, руководств и man-страниц; все это вы найдете на http://www.tldp.org/.
Теперь, когда мы установили все необходимое программное обеспечение, настало время перезапустить компьютер. Сначала выйдем из среды chroot:
logout
Размонтируем виртуальные файловые системы:
umount $LFS/dev/pts umount $LFS/dev/shm umount $LFS/dev umount $LFS/proc umount $LFS/sys
Отмонтируем сам раздел LFS:
umount $LFS
Если вы создавали несколько разделов, вам надо отмонтировать их все перед запуском unmount $LFS, как здесь:
umount $LFS/usr umount $LFS/home umount $LFS
Теперь перезагрузим систему командой:
shutdown -r now
Загрузчик Grub возьмет управление на себя и, если он был установлен как описано ранее, меню установится на загрузку LFS 6.0 автоматически.
После перезагрузки ваша система LFS готова к использованию и вы можете начать устанавливать дополнительные программы.
Вы хотите зарегистрироваться как пользователь LFS по окончании прочтения книги? Посетите http://www.linuxfromscratch.org/cgi-bin/lfscounter.cgi и зарегистрируйтесь как пользователь LFS, введя ваше имя и первую используемую вами версию LFS.
Теперь перезагрузимся в систему LFS.
Сделано! Новая LFS ситстема установлена! Мы желаем вам больших успехов с вашей новой блестящей персонально собранной Linux системой.
Возможно, хорошая идея создать файл /etc/lfs-release. Имея этот файл, вам будет очень просто (и нам, если вы попросите о помощи на некотором этапе) определить установленную версию LFS. Создайте этот файл запуском:
echo 6.0 > /etc/lfs-release
Эта книга состоит из следующих частей.
Часть I содержит некоторые важные сведения о процессе инсталляции и некоторую дополнительную информацию о книге.
Часть II описывает приготовления к процессу сборки: создание раздела, скачивание пакетов и компиляцию временных средств.
Часть III руководит сборкой системы LFS: компиляцией и установкой всех пакетов по порядку, созданием загрузочных скриптов и установкой ядра. В результате будет создана простая Linux-система в которую вы сможете установить дополнительные программы тем способом и такие, как захотите. В конце этой книги имеется простой в использовании список всех программ, библиотек и важных файлов, которые были установлены.
Copyright (c) 1999–2004, Gerard Beekmans
Все права защищены.
Повторное распространение, использование бинарного и исходного кода, с изменениями или без оных, разрешено при условии соблюдения следующих положений:
Повторное распространение в любой форме должно содержать вышестоящее уведомление об авторском праве, данные положения и нижеприведенный отказ от прав.
Ни название проекта “Linux From Scratch”, ни имена его участников не могут быть использованы для подписи и рекламирования продуктов, произошедших из данного материала без специального письменного разрешения.
Все материалы, произошедшие из Linux From Scratch должны сохранять ссылку на проект “Linux From Scratch”.
ЭТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПОСТАВЛЯЕТСЯ ВЛАДЕЛЬЦАМИ АВТОРСКИХ ПРАВ И УЧАСТНИКАМИ “КАК ЕСТЬ” И ЛЮБЫЕ ЯВНЫЕ ИЛИ НЕЯВНЫЕ ГАРАНТИИ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ НЕЯВНЫМИ ГАРАНТИЯМИ, КОММЕРЧЕСКОЙ ЦЕННОСТИ И ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ ОТРИЦАЮТСЯ. НИ В КОЕМ СЛУЧАЕ РЕГЕНТЫ ИЛИ УЧАСТНИКИ НЕ ДОЛЖНЫ БЫТЬ ОТВЕТСТВЕННЫМИ ЗА ЛЮБОЙ ПРЯМОЙ, КОСВЕННЫЙ, СЛУЧАЙНЫЙ, СПЕЦИАЛЬНЫЙ, ОБРАЗЦОВЫЙ ИЛИ ПОСЛЕДУЮЩИЙ УЩЕРБЫ (ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ПОСТАВКОЙ ТОВАРОВ ЗАМЕНЫ ИЛИ УСЛУГ; ПОТЕРЮ ДАННЫХ ИЛИ ИХ НЕПРАВИЛЬНУЮ ПЕРЕДАЧУ ИЛИ ПОТЕРИ; ПРИОСТАНОВЛЕНИЕ БИЗНЕСА), И ТЕМ НЕ МЕНЕЕ ВЫЗВАННЫЕ И В ЛЮБОЙ ТЕОРИИ ОТВЕТСТВЕННОСТИ, НЕЗАВИСИМО ОТ КОНТРАКТНОЙ, СТРОГОЙ ОТВЕТСТВЕННОСТИ, ИЛИ ПРАВОНАРУШЕНИИ (ВКЛЮЧАЯ ХАЛАТНОСТЬ ИЛИ ИНЫМ СПОСОБОМ), ВОЗНИКШЕМ ЛЮБЫМ ПУТЕМ ПРИ ИСПОЛЬЗОВАНИИ ЭТОГО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, ДАЖЕ ЕСЛИ БЫ БЫЛО СООБЩЕНО О ВОЗМОЖНОСТИ ТАКОГО УЩЕРБА.
Мои приключения с Linux начались шесть лет назад, когда я скачал и установил мой первый дистрибутив. После непродолжительной работы с ним я открыл вещи, которые я определенно пожелал бы видеть улучшенными. Например, мне не нравилось расположение загрузочных скриптов или как некоторые программы были сконфигурированы по умолчанию. Я перепробовал несколько различных дистрибутивов Linux. Наконец я понял, что только построив собственную систему из исходников, я буду доволен.
Что это значит? Я решил не использовать ни прекомпилированные пакты, ни CD-ROM или загрузочные диски, которые бы установили базовые утилиты. Я буду использовать мою текущую систему Linux для сборки моей новой системы. Эта “замечательная” система Linux затем получит мощь различных систем без их соответствующих слабостей. В начале, идея была скорее пугающей, но я продолжал верить, что система может быть построена так, что будет приспособлена к моим требованиям и желаниям скорее чем к стандартам, которые не подходят к тому, что я искал.
После решения ряда проблем, таких как зависимости или ошибки на этапе компиляции, я создал самосборную систему Linuxm, которая была полностью работоспособная и соответствовала индивидуальным потребностям. Эти процессы также позволили мне создать компактную и прямолинейную систему Linux, которая быстрее и занимает меньше места, чем традиционные операционные системы. Я назвал эту систему Linux From Scratch или, для краткости, LFS.
Так как я разделил мои цели и опыты с другими членами сообщества Linux, то стало очевидно, что надо было поддерживать интерес к идее дальнейшей установки в моих Linux приключениях. Такая самосборная система LFS не только удовлетворяет спецификации и требованию пользователя, но также служит как идеальная возможность обучения программистов и системных администраторов для расширения их Linux квалификации. В таких широких интересах был рожден проэкт Linux From Scratch.
Эта книга Linux From Scratch предоставляет читателям инструкции по разработке и сборке собственной системы Linux. Эта книга высвечивает проэкт Linux from Scratch и выгоду от использования этой системы. Пользователи могут диктовать все аспекты их системы, включая структуру директорий, настройку скриптов и безопасности. Результирующая система будет компилироваться прямо из исходных текстов и пользователь будет в состоянии описать где, почему и как установлены программы. Эта книга позволяет читателям полностью настроить систему Linux для их собственных потребностей и дает пользователям больший контроль над их собственной системой.
Я надеюсь, что вы не зря проведете время, работая над своей собственной системой LFS и насладитесь многочисленными выгодами от наличия системы, которую собрали вы сами.
--
Gerard Beekmans
gerard@linuxfromscratch.org
Существует ряд причин, по которым эта книга может представлять интерес. Главная причина - установка Linux системы из исходников. Многие люди спросят: “Зачем мучиться, вручную собирая Linux систему с нуля, когда можно скачать и установить готовую?” Это хороший вопрос и мы постараемся ответить на него в этой части книги.
Важная причина существования LFS - помочь людям узнать работу ситемы Linux изнутри. Построение LFS-системы помогает показать, что заставляет Linux работать, как работают ее компоненты и как они друг от друга зависят. И наконец, оно учит как настроить Linux под себя, в соответствии со своими вкусами и потребностями.
Основное преимущество LFS состоит в том, что вы получаете больше контроля над системой, не полагаясь на чью-либо разработку. С LFS вы определяете структуру системы и диктуете ей свои условия, в частности структуру каталогов и загрузочные скрипты. Вы также указываете как, куда и зачем устанавливаются программы.
Другим преимуществом LFS является возможность создать наиболее компактную систему. При установке обычного дистрибутива, вместе с ним, как правило, устанавливается большое количество программ, котрорые вы никогда не будете использовать. Они просто будут занимать место на диске (или, возможно, время центрального процессора). В то же время не составит труда установить систему LFS на 100 Mb диска. Вам кажется, это много? Некоторые пользователи смогли создать весьма компактную LFS систему. Они собрали систему, позволяющую запускать веб-сервер Apache, которая занимала всего 8 Mb на диске. Дальнейшее урезание ее позволит сократить используемое место до 5 Mb. Попробуйте сделать это, используя обычный дистрибутив.
Мы можем сравнить дистрибутив Linux с гамбургером из закусочной - вы не знаете точно, что едите. LFS же даеет вам не гамбургер, а рецепт его приготовления. Внимательно изучив его, можно убрать ненужные ингридиенты и добавить свои по вкусу. Как только вы довольны рецептом, можете смело приступать к приготовлению гамбургера. Вы можете также выбрать способ приготовления: поджарить, сварить, запечь или съесть сырым.
Также LFS можно сравнить с домом. Мы даем вам только его план, а строить его вам. Разумеется, можно изменять план по ходу дела.
Немаловажным преимуществом построения своей Linux-системы является также безопасность. При компиляции из исходников вы получаете возможность проверять все компоненты системы и, в случае надобности, ставить патчи. Вам больше не придется ждать, пока кто-то выпустит бинарный пакет, устраняющий дырку в безопасности. Нет гарантии, что новый пакет адекватно собран и устраняет проблему, если вы самостоятельно не изучили и не собрали патч.
Цель Linux From Scratch - собрать полную и удобную систему. Читатели, котрые не желают собирать их собственную систему Linux из исходников могут не использовать информацию из этой книги. Если вы только хотите знать, что происходит при загрузке компьютера, мы рекомендуем HOWTO “От включения питания до приглашения Bash”, размещенном на http://axiom.anu.edu.au/~okeefe/p2b/ или на сайте Linux Documentation Project (TLDP) http://www.tldp.org/HOWTO/From-PowerUp-To-Bash-Prompt-HOWTO.html. Это руководство описывает процесс построения голой системы, которая похожа на описанную в этой книге, но способной только к загрузке до приглашения BASH. Считайтесь со своей объективностью. Если вы желаете построить систему Linux, изучая ее по ходу дела, тогда эта книга выш лучший выбор.
Есть еще много причин, по которым лучше собрать LFS, настолько много, что их все здесь просто не привести. Эта часть только верхушка айсберга. При установке LFS вы поймете, что вся сила - в информации и знаниях.
Для облегчения понимания книги, ознакомьтесь с некоторыми соглашениями, которые будут в ней использованы. Этот раздел содержит примеры типографического форматирования.
./configure --prefix=/usr
Текст такого формата предназначен для набора в командной строке в точности как на экране, помимо случаев, когда даны другие указания. Также он используется в пояснительных разделах для пояснения команды, о которой идет речь.
install-info: unknown option '--dir-file=/mnt/lfs/usr/info/dir'
Текст такого формата (моноширный) показывает вывод на экран, как результат выполнения какой-либо команды. Также он используется для указания имени файла, например /etc/ld.so.conf.
Выделение
Текст такого формата имеет несколько назначений в книге. В основном он используется для подчеркивания наиболее важных моментов и для примеров.
http://www.linuxfromscratch.org/
Текст такого формата используется для ссылок как внутри книги, так и на внешние ресурсы - руководства, сайты, места для скачивания.
cat > $LFS/etc/group << "EOF" root:x:0: bin:x:1: ...... EOF
Такой раздел используется для создания файлов конфигурации. Первая команда говорит системе создать файл $LFS/etc/group, наполняя его строчками до EOF. В командной строке эта секция печатается в точности как на экране.
[ЗАМЕНЕННЫЙ ТЕКСТ]
Этот формат используется для замены текста, который не должен быть набран так, как изображен или должен быть скопирован и вставлен.
Эта книга подразумевает, что у вас есть хорошие познания в области использования и установки программ для Linux. Перед началом построения вашей LFS системы вам следует прочитать следующие HOWTO:
Software-Building-HOWTO http://www.tldp.org/HOWTO/Software-Building-HOWTO.html
Это исчерпывающее руководство по сборке и установке “общих” UNIX-ориентированых программ в Linux.
The Linux Users Guide http://espc22.murdoch.edu.au/~stewart/guide/guide.html
Это руководство описывает использование различных Linux-программ.
The Essential Pre-Reading Hint http://www.linuxfromscratch.org/hints/downloads/files/essential_prereading.txt
Это Советы по LFS, написаные специально для новичков в мире Linux. В основном содержит ссылки на внешние источники информации на различные темы. Любой человек, собравшийся установить LFS, должен понимать многие темы из перечисленных в этом документе.