Версия для печати

Архив документации на OpenNet.ru / Раздел "Документация для Linux" (Многостраничная версия)

Linux From Scratch

Версия 6.0

Gerard Beekmans


Оглавление


A. Список сокращений

ABI

Application Binary Interface

ALFS

Automated Linux From Scratch

ALSA

Advanced Linux Sound Architecture

API

Application Programming Interface

ASCII

American Standard Code for Information Interchange

BIOS

Basic Input/Output System

BLFS

Beyond Linux From Scratch

BSD

Berkeley Software Distribution

chroot

change root

CMOS

Complementary Metal Oxide Semiconductor

COS

Class Of Service

CPU

Central Processing Unit

CRC

Cyclic Redundancy Check

CVS

Concurrent Versions System

DHCP

Dynamic Host Configuration Protocol

DNS

Domain Name Service

EGA

Enhanced Graphics Adapter

ELF

Executable and Linkable Format

EOF

End of File

EQN

equation

EVMS

Enterprise Volume Management System

ext2

second extended file system

FAQ

Frequently Asked Questions

FHS

Filesystem Hierarchy Standard

FIFO

First-In, First Out

FQDN

Fully Qualified Domain Name

FTP

File Transfer Protocol

GB

Gibabytes

GCC

GNU Compiler Collection

GID

Group Identifier

GMT

Greenwich Mean Time

GPG

GNU Privacy Guard

HTML

Hypertext Markup Language

IDE

Integrated Drive Electronics

IEEE

Institute of Electrical and Electronic Engineers

IO

Input/Output

IP

Internet Protocol

IPC

Inter-Process Communication

IRC

Internet Relay Chat

ISO

International Organization for Standardization

ISP

Internet Service Provider

KB

Kilobytes

LED

Light Emitting Diode

LFS

Linux From Scratch

LSB

Linux Standards Base

MB

Megabytes

MBR

Master Boot Record

MD5

Message Digest 5

NIC

Network Interface Card

NLS

Native Language Support

NNTP

Network News Transport Protocol

NPTL

Native POSIX Threading Library

OSS

Open Sound System

PCH

Pre-Compiled Headers

PCRE

Perl Compatible Regular Expression

PID

Process Identifier

PLFS

Pure Linux From Scratch

PTY

pseudo terminal

QA

Quality Assurance

QOS

Quality Of Service

RAM

Random Access Memory

RPC

Remote Procedure Call

RTC

Real Time Clock

SBU

Static Binutils Unit

SCO

The Santa Cruz Operation

SGR

Select Graphic Rendition

SHA1

Secure-Hash Algorithm 1

SMP

Symmetric Multi-Processor

TLDP

The Linux Documentation Project

TFTP

Trivial File Transfer Protocol

TLS

Thread-Local Storage

UID

User Identifier

umask

user file-creation mask

USB

Universal Serial Bus

UTC

Coordinated Universal Time

UUID

Universally Unique Identifier

VC

Virtual Console

VGA

Video Graphics Array

VT

Virtual Terminal


B. Благодарность

Мы хотим поблагодарить следующих людей и организации за их вклад в проект Linux From Scratch.

Члены команды проекта

Переводчики

Содержатели зеркал

Северо-американские зеркала

Южно-американские зеркала

Европейские зеркала

Азиатские зеркала

Австралийские зеркала

Особая благодарность вам за пожервования для нас


1.2. Список изменений

Это версия 6.0 книги Linux From Scratch, датированная 6 октября 2004 года. Если эта книга более чем на два месяца старше, то возможно уже доступна более новая и лучшая ее версия. Для поиска проверьте одно из зеркал через http://www.linuxfromscratch.org/.

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

Релиз версии 5.1.1 был 6 июня 2004 г.


1.3. Ресурсы

1.3.1. FAQ

Если на протяжении сборки системы LFS вы получите неожиданные ошибки, будете иметь вопрсы или найдете опечатки в книге, пожалуйста начните с консультаций в Часто Задаваемых Вопросах (FAQ) на http://www.linuxfromscratch.org/faq/.

1.3.2. Списки рассылки

Сервер linuxfromscratch.org размещает некоторое количество списков рассылки, используемых разработчиками проекта LFS. Эти списки включают, помимо прочего, список разработчиков и список поддержки.

За информацией о доступных списках рассылки, подписки на них, просмотра их архивов и т.п. загляните на http://www.linuxfromscratch.org/mail.html.

1.3.3. IRC

Множество членов сообщества LFS используют IRC сервер сообщества. Перед тем как использовать этот вид поддержки, проверьте LFS FAQ и архивы списков рассылки. Возможно, на ваш вопрос уже есть ответ. Вы сможете найти наш IRC сервер на irc.linuxfromscratch.org или irc.linux-phreak.net. Канал поддержки называется #LFS-support.

1.3.4. Сервер новостей

Все списки рассылки с linuxfromscratch.org также доступны в виде NNTP сервера. Все сообщения, отправленные в списки рассылки копируются в соответствующую группу новостей.

Сервер новостей доступен по адресу news.linuxfromscratch.org.

1.3.5. Wiki

Для большей информации по пакетам, обновленным версиям и личном опыте, обращайтесь к LFS Wiki на http://wiki.linuxfromscratch.org/. Пользователи могут также добавлять здесь информацию для помощи другим в их будущей LFS-активности.

1.3.6. Ссылки

Для дополнительной информации по пакетам, полезные советы доступны на http://www.linuxfromscratch.org/~matthew/LFS-references.html.

1.3.7. Зеркала сайта

Проект LFS имеет ряд зеркал в сети. Список текущих зеркал можно увидеть на http://www.linuxfromscratch.org/.

1.3.8. Контактная информация

Пожалуйста, направляйте все ваши вопросы и коментарии в списки рассылки LFS (см. выше).


1. Вступление

1.1. Как построить LFS систему

Мы собираемся собрать 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-систему.

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


1.5. О дополнительном CD

Для вашего удобства мы имеем дополнительный CD к этой книге, который содержит пакеты с исходниками, необходимыми для системы Linux From Scratch. CD является загружаемым и предоставляет стабильное рабочее окружение для сборки LFS. Эта книга ссылается на эту систему, как на “основную систему”.

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


1.4. Помощь

Если проблема или вопрос неожиданно возникает во время работы с книгой, проверьте страницу FAQ на http://www.linuxfromscratch.org/faq/#generalfaq. Здесь часто уже есть ответы на возникшие вопросы. Если вы не нашли здесь ответ на свой вопрос, попробуйте найти источник проблемы. Следующие подсказки дадут вам некоторое направление для решения проблемы: http://www.linuxfromscratch.org/hints/downloads/files/errors.txt.

У нас также есть отличное сообщество LFS, которое готово предложить помощь через IRC и списки рассылки (смотри Раздел 1.3, “Ресурсы” этой книги). Для получения помощи в диагностике и решения проблемы, пожалуйста включайте всю доступную информацию в задаваемый вопрос.

1.4.1. Что необходимо указать

Помимо краткого сообщения об ошибке, не забудьте привести следующую информацию:

  • Версия используемой книги (для этой 6.0)

  • Основной дистрибутив и его версию, используемый для сборки LFS

  • Пакет или раздел, с которыми у вас возникли проблемы

  • Сообщение об ошибке или симптомы проблемы

  • Отклонялись ли вы от шагов, описаных в книге.

[Note]

Замечание

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

1.4.2. Проблемы конфигурации

Если что-то пошло не так при выполнении скрипта configure, то посмотрите в файле config.log. Этот файл содержит ошибки, которые не были выведены на экран. Включите информацию из этого файла в просьбу о помощи.

1.4.3. Проблемы компиляции

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

1.4.4. Проблемы тестов

Многие пакеты поддерживают тестирование и мы, в зависимости от его важности, будем советовать вам запускать его. Иногда пакеты выдают ошибки. Если это случилось у вас, то посмотрите страничку LFS Wiki на http://wiki.linuxfromscratch.org/. Возможно, мы уже нашли способ ее решения. Если мы уже знаем о ней, то вам не стоит беспокоится.


2.3. Создание файловой системы на новом разделе

Теперь у нас есть пустой раздел и нам надо создать на нем файловую систему. Наиболее используемой системой в 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 раздела.


2.4. Монтирование новой файловой системы

Теперь, когда мы создали файловую систему, нам надо получить доступ к ее разделу. Для этого нам необходимо выбрать точку монтирования и примонтировать его. В этой книге подразумевается, что файловая система монтирована на /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 установлены, вам надо будет перемонтировать раздел снова.

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


2.2. Создание нового раздела

Для сборки новой Linux системы нам будет нужно некоторое место - пустой раздел диска. Если у вас дефицит свободного места, то вы можете, в принципе, собрать LFS на том же разделе, где установлен ваш нынешний дистрибутив.

[Note]

Замечание

Это не рекомендуется для первой установки 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.


2. Подготовка нового раздела

2.1. Вступление

В этой главе мы подготовим раздел для нашей новой LFS-системы. Мы создадим раздел, установим файловую систему и примонтируем ее.


3.3. Необходимые патчи

Помимо всех пакетов вам будут нужны некоторые патчи. Они корректируют некоторые ошибки в пакетах, которые были обнаружены, или улучшают функциональность. Патчи также делают небольшие модификации для обеспечения более легкой работы с пакетами. Следующие патчи будут нужны для сборки системы LFS:

Bash Display Wrap Patch - 1 KB:

http://www.linuxfromscratch.org/patches/lfs/6.0/bash-3.0-display_wrap-1.patch

Coreutils Suppress Uptime, Kill, Su Patch - 16 KB:

http://www.linuxfromscratch.org/patches/lfs/6.0/coreutils-5.2.1-suppress_uptime_kill_su-1.patch

Coreutils Uname Patch - 1 KB:

http://www.linuxfromscratch.org/patches/lfs/6.0/coreutils-5.2.1-uname-2.patch

Expect Spawn Patch - 6 KB:

http://www.linuxfromscratch.org/patches/lfs/6.0/expect-5.42.1-spawn-1.patch

Flex Brokenness Patch - 8 KB:

http://www.linuxfromscratch.org/patches/lfs/6.0/flex-2.5.31-debian_fixes-2.patch

GCC Linkonce Patch - 12 KB:

http://www.linuxfromscratch.org/patches/lfs/6.0/gcc-3.4.1-linkonce-1.patch

GCC No-Fixincludes Patch - 1 KB:

http://www.linuxfromscratch.org/patches/lfs/6.0/gcc-3.4.1-no_fixincludes-1.patch

GCC Specs Patch - 11 KB:

http://www.linuxfromscratch.org/patches/lfs/6.0/gcc-3.4.1-specs-1.patch

Inetutils Kernel Headers Patch - 1 KB:

http://www.linuxfromscratch.org/patches/lfs/6.0/inetutils-1.4.2-kernel_headers-1.patch

Inetutils No-Server-Man-Pages Patch - 4 KB:

http://www.linuxfromscratch.org/patches/lfs/6.0/inetutils-1.4.2-no_server_man_pages-1.patch

IPRoute2 Disable DB Patch - 1 KB:

http://www.linuxfromscratch.org/patches/lfs/6.0/iproute2-2.6.8_040823-remove_db-1.patch

Man 80-Columns Patch - 1 KB:

http://www.linuxfromscratch.org/patches/lfs/6.0/man-1.5o-80cols-1.patch

Mktemp Tempfile Patch - 3 KB:

http://www.linuxfromscratch.org/patches/lfs/6.0/mktemp-1.5-add_tempfile-1.patch

Perl Libc Patch - 1 KB:

http://www.linuxfromscratch.org/patches/lfs/6.0/perl-5.8.5-libc-1.patch

Readline Display Wrap Patch - 1 KB:

http://www.linuxfromscratch.org/patches/lfs/6.0/readline-5.0-display_wrap-1.patch

Sysklogd Kernel Headers Patch - 3 KB:

http://www.linuxfromscratch.org/patches/lfs/6.0/sysklogd-1.4.1-kernel_headers-1.patch

Sysklogd Signal Handling Patch - 1 KB:

http://www.linuxfromscratch.org/patches/lfs/6.0/sysklogd-1.4.1-signal-1.patch

Sysvinit /proc Title Length Patch - 1 KB:

http://www.linuxfromscratch.org/patches/lfs/6.0/sysvinit-2.85-proclen-1.patch

Texinfo Segfault Patch - 1 KB:

http://www.linuxfromscratch.org/patches/lfs/6.0/texinfo-4.7-segfault-1.patch

Util-Linux Sfdisk Patch - 1 KB:

http://www.linuxfromscratch.org/patches/lfs/6.0/util-linux-2.12b-sfdisk-2.patch

Zlib Security Patch - 1KB:

http://www.linuxfromscratch.org/patches/lfs/6.0/zlib-1.2.1-security-1.patch

В отличие от вышеперечисленных необходимых патчей имеется некоторое количество опциональных патчей, созданных сообществом LFS. Эти опциональные патчи решают меньшие проблемы или добавляют функциональность, которая отсутствует по умолчанию. Свободно пересматривайте базу данных патчей, размещенную на http://www.linuxfromscratch.org/patches/ и получайте другие дополнительные патчи, необходимые для системы.


3.2. Все пакеты

Скачайте или получите другим способом следующие пакеты:

Autoconf (2.59) - 903 kilobytes (KB):

http://freshmeat.net/projects/autoconf/

Automake (1.9.1) - 681 KB:

http://freshmeat.net/projects/automake/

Bash (3.0) - 1,910 KB:

http://freshmeat.net/projects/gnubash/

Binutils (2.15.91.0.2) - 10,666 KB:

http://freshmeat.net/projects/binutils/?branch_id=12688

Bison (1.875a) - 796 KB:

ftp://ftp.linuxfromscratch.org/pub/lfs/lfs-packages/conglomeration/bison/

Bzip2 (1.0.2) - 650 KB:

http://freshmeat.net/projects/bzip2/

Coreutils (5.2.1) - 3,860 KB:

http://freshmeat.net/projects/coreutils/

DejaGNU (1.4.4) - 1,055 KB:

http://freshmeat.net/projects/dejagnu/

Diffutils (2.8.1) - 762 KB:

http://freshmeat.net/projects/diffutils/

E2fsprogs (1.35) - 3,003 KB:

http://freshmeat.net/projects/e2fsprogs/

Expect (5.42.1) - 510 KB:

http://freshmeat.net/projects/expect/

File (4.10) - 356 KB:

http://freshmeat.net/projects/file/

[Note]

Замечание

Пакет File (4.10) может быть недоступен, когда вы это читаете. На главных местах для скачивания удаляют старые версии пакетов. Альтернативные места для скачивания, которые могут иметь корректную версию, доступны на ftp://ftp.linuxfromscratch.org/pub/lfs/.

Findutils (4.1.20) - 760 KB:

http://freshmeat.net/projects/findutils/

Flex (2.5.31) - 372 KB:

http://freshmeat.net/projects/flex/

Gawk (3.1.4) - 1,692 KB:

http://freshmeat.net/projects/gnuawk/

GCC (3.4.1) - 27,000 KB:

http://freshmeat.net/projects/gcc/

Gettext (0.14.1) - 6,397 KB:

http://freshmeat.net/projects/gettext/

Glibc (2.3.4-20040701) - 13,101 KB:

http://freshmeat.net/projects/glibc/

[Note]

Замечание

Официальные пакеты 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.

Grep (2.5.1) - 545 KB:

http://freshmeat.net/projects/grep/

Groff (1.19.1) - 2,360 KB:

http://freshmeat.net/projects/groff/

Grub (0.95) - 902 KB:

ftp://alpha.gnu.org/pub/gnu/grub/

Gzip (1.3.5) - 324 KB:

ftp://alpha.gnu.org/gnu/gzip/

Iana-Etc (1.01) - 161 KB:

http://freshmeat.net/projects/iana-etc/

Inetutils (1.4.2) - 1,019 KB:

http://freshmeat.net/projects/inetutils/

IPRoute2 (2.6.8-040823) - 264 KB:

http://developer.osdl.org/dev/iproute2/download/

Kbd (1.12) - 617 KB:

http://freshmeat.net/projects/kbd/

Less (382) - 259 KB:

http://freshmeat.net/projects/less/

LFS-Bootscripts (2.2.2) - 16 KB:

http://downloads.linuxfromscratch.org/

Libtool (1.5.8) - 2,602 KB:

http://freshmeat.net/projects/libtool/

Linux (2.6.8.1) - 34,793 KB:

http://freshmeat.net/projects/linux/?branch_id=46339

Linux-Libc-Headers (2.6.8.1) - 2,602 KB:

http://ep09.pld-linux.org/~mmazur/linux-libc-headers/

M4 (1.4.2) - 337 KB:

http://freshmeat.net/projects/gnum4/

Make (3.80) - 899 KB:

http://freshmeat.net/projects/gnumake/

Man (1.5o) - 223 KB:

http://freshmeat.net/projects/man/

Man-pages (1.67) - 1,586 KB:

http://freshmeat.net/projects/man-pages/

Mktemp (1.5) - 69 KB:

http://freshmeat.net/projects/mktemp/

Module-Init-Tools (3.0) - 118 KB:

ftp://ftp.kernel.org/pub/linux/utils/kernel/module-init-tools/

Ncurses (5.4) - 2,019 KB:

http://freshmeat.net/projects/ncurses/

Patch (2.5.4) - 182 KB:

http://freshmeat.net/projects/patch/

Perl (5.8.5) - 9,373 KB:

http://freshmeat.net/projects/perl/

Procps (3.2.3) - 265 KB:

http://freshmeat.net/projects/procps/

Psmisc (21.5) - 375 KB:

http://freshmeat.net/projects/psmisc/

Readline (5.0) - 940 KB:

http://freshmeat.net/projects/gnureadline/

Sed (4.1.2) - 749 KB:

http://freshmeat.net/projects/sed/

Shadow (4.0.4.1) - 795 KB:

http://freshmeat.net/projects/shadow/

Sysklogd (1.4.1) - 80 KB:

http://freshmeat.net/projects/sysklogd/

Sysvinit (2.85) - 91 KB:

http://freshmeat.net/projects/sysvinit/

Tar (1.14) - 1,025 KB:

http://freshmeat.net/projects/tar/

Tcl (8.4.7) - 3,363 KB:

http://freshmeat.net/projects/tcltk/

Texinfo (4.7) - 1,385 KB:

http://freshmeat.net/projects/texinfo/

Udev (030) - 374 KB:

ftp://ftp.kernel.org/pub/linux/utils/kernel/hotplug/

Udev Permissions Configuration - 2 KB:

http://downloads.linuxfromscratch.org/udev-config-2.permissions

Udev Rules Configuration - 1 KB:

http://downloads.linuxfromscratch.org/udev-config-1.rules

Util-linux (2.12b) - 1,921 KB:

http://freshmeat.net/projects/util-linux/

Vim (6.3) - 3,612 KB:

http://freshmeat.net/projects/vim/

Vim (6.3) language files (optional) - 1,033 KB:

http://freshmeat.net/projects/vim/

Zlib (1.2.1) - 277 KB:

http://freshmeat.net/projects/zlib/

Полный объем этих пакетов: 135 MB


3. Пакеты и патчи

3.1. Вступление

Дальше будет приведен список пакетов, которые вам надо будет скачать для сборки простейшей 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 

4.5. О SBU

Многие люди хотят заранее знать, сколько займет сборка и установка того или иного пакета. Но "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. Здесь она обеспечивает оценку того, как долго может инсталироваться пакет, но цифры могут меняться в некоторых случаях на десятки минут.


4.6. О тестах

Многие из пакетов поддерживают тестирование. Запуск его для только что собранного пакета будет хорошей идеей, так как можно будет проверить корректность компиляции. Тестирование содержит несколько тестов для проверки функциональности пакета. Это в какой-то мере может гарантировать полное отсутствие ошибок (багов) в программе.

Некоторые тестирования более важны, чем другие. К примеру, тестирование пакетов с основными средствами - GCC, Binutils и Glibc (библиотека C) - которые играют решающую роль для общей функциональности системы. Но учтите, что тестирование GCC и Glibc может занять весьма продолжительное время, особенно на медленном оборудовании.

[Note]

Примечание

При запуске тестов в Главе 5 не избежать того факта, что базовая система всегда оказывает некоторое воздействие на тесты в этой главе, часто означая необъяснимые ошибки. Так как средства, собранные в Главе 5, являются временными и, в конце концов, выброшенными, мы не рекомендуем запускать тесты в Главе 5 для средних читателей. Инструкции для запуска этих тестов предоставлены для пользы тестировщиков и разработчиков, но они являются исключительно опциональными.

Общей проблемой при запуске тестов для Binutils и GCC является запуск вне псевдо терминала (PTY, для краткоcти). Симптомом ее является большое количество неудачных тестов. Это может происходить по многим причинам. Наиболее распространенная - ваша основная система не имеет корректно установленной файловой системы devpts. Эта проблема детально обсуждается в Главе 5.

Иногда тесты пакета будут давать ошибки. Проконсультируйтесь в LFS Wiki на http://wiki.linuxfromscratch.org/, являются ли эти ошибки ожидаемыми.


4.3. Добавление пользователя LFS

Если вы зарегистрировались в ситеме как root, малейшая ошибка может иметь фатальные последствия для вашей системы. Поэтому мы рекомендуем собирать пакеты из этой главы под непривилегированным пользователем. Kонечно, вы можете использовать имя вашего текущего пользователя, но более простым шагом будет созданее нового пользователя lfs и новой группы (так же с именем lfs) и использовать его в процессе установки. Под правами root исполните следующие команды для добавления нового пользователя:

 
groupadd lfs 
useradd -s /bin/bash -g lfs -m -k /dev/null lfs 

Обозначения опций командной строки:

-s /bin/bash

Эта опция делает bash оболчкой по умолчанию для пользователя lfs.

-g lfs

Эта опция добавляет пользователя lfs в группу lfs.

-m

Эта опция создает домашнюю директорию для пользователя lfs.

-k /dev/null

Этот параметр предупреждает возможное копирование файлов из скелетной директории (по умолчанию /etc/skel) изменением входящего расположения на специальное null-устройство.

lfs

Это актуальное имя для созданных группы и пользователя.

Для регистрации как lfs, дадим пользователю lfs пароль:

 
passwd lfs 

Чтобы новый пользователь lfs получил полный доступ к директории $LFS/tools изменим ее владельца:

 
chown lfs $LFS/tools 

Если вы создали отдельную директорию для работы, смените также и ее владельца на lfs:

 
chown lfs $LFS/sources 

Теперь, войдем в систему как пользователь lfs. Это можно сделать через виртуальную консоль, через менеджер экрана или через команду:

 
su - lfs 

Инструкция “-” команды su запустит новый интерпретатор командной строки.


4.2. Создание директории $LFS/tools

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

Создадим требуемую директорию запуском следующей команды под пользователем root:

 
mkdir $LFS/tools 

Теперь нам надо создать ссылку /tools на новую директорию в основной системе. Она будет указывать на только что созданную директорию на LFS разделе. Выполните следующую команду как root:

 
ln -s $LFS/tools / 
[Note]

Замечание

Предыдущая команда корректна. Команда ln имеет множество различных вариантов синтаксиса и вы должны изучить man-страницу по ln прежде, чем сообщать о том, что вы считаете, что обнаружили ошибку.

Созданная ссылка разрешает временным средствам быть собранными так, что они всегда ссылаются на /tools, означая, что компилятор, ассемблер и компоновшик будут работать и в этой главе (когда мы все еще используем некоторые средства из основной системы) и в следующей (когда мы с помощью “chroot” войдем в раздел LFS).


4.4. Установка переменных окружения

Установим хорошее окружение, создав два новых файла для оболочки 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 

4. Окончание подготовки

4.1. О $LFS

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

echo $LFS

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

export LFS=/mnt/lfs

Наличие этой установленной переменной выгодно в таких командах, как mkdir $LFS/tools. Оболочка будет автоматически заменять “$LFS” на “/mnt/lfs” (или на то, что описывает эта переменная) при обработке командной строки.

Не забудте проверить, что $LFS установлена всякий раз как вы покидаете и перзаходите в текущее рабочее окружение (когда выполняете “su” для root или другого пользователя).


5.30. M4-1.4.2

Пакет M4 является макро процессором.

Расчетное время сборки 0.1 SBU

Требуемое место на диске 3.0 MB

M4 - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Perl и Sed

5.30.1. Инсталируем M4

Подготавливаем M4 для компиляции:

./configure --prefix=/tools

Компилируем пакет

make

Для проверки результата вводим: make check.

Устанавливаем пакет

make install

Детальная информация о пакете находится в Разделе 6.24.2, “Contents of M4”.


5.29. Bash-3.0

Bash - это Bourne-Again SHell.

Время сборки: 1.2 SBU

Требует дискового пространства: 27 MB

Установка Bash зависит от: Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make, Ncurses и Sed.

5.29.1. Установка Bash

Подготовка Bash к компиляции:

./configure --prefix=/tools --without-bash-malloc

Значение опций конфигурации:

--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”.


5.4. Binutils-2.15.91.0.2 - Шаг 1

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

Расчетное время сборки 1.0 SBU

Требуемое место на диске 194 MB

Binutils - зависимости установки: Bash, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Perl, Sed и Texinfo

5.4.1. Инсталируем Binutils

Важно чтобы Binutils был первым из пакетов, которые мы установим, потому что Glibc и GCC проводят некоторые тесты на доступные компоновщик и ассемблер для определения доступных опций.

Этот пакет известен своим нестабильным поведением при компиляции с измененными опциями оптимизации (включая опции -march и -mcpu ). Binutils рекомендуется компилировать с настройками по умолчанию. Если вы задали переменные такие как CFLAGS или CXXFLAGS, изменяющие уровень оптимизации по умолчанию, рекомендуется убрать их при сборке пакета binutils. Изменяя оптимизации для binutils, вы действуете на свой страх и риск.

В документации по Binutils рекомендуется собирать Binutils вне директории с исходниками, в отдельной директории для сборки:

 
mkdir ../binutils-build 
cd ../binutils-build 
[Note]

Замечание

Если вы хотите вычислить переменную SBU, которая используется в этой книге, вам надо засечь время, которое понадобится на сборку этого пакета. Это очень просто сделать чем-то похожим на такую команду: time { ./configure ... && ... && ... && make install; }.

Теперь подготовим Binutils к компиляции:

 
../binutils-2.15.91.0.2/configure --prefix=/tools \ 
    --disable-nls 

Описание используемых опций:

--prefix=/tools

Это скажет скрипту конфигурации, что программы Binutils следует устанавливать в директорию /tools

--disable-nls

Это отключит интернационализацию (сокращенно - i18n). Вопервых нам это пока не надо. А вовторых это может вызвать определенные проблемы при статической компиляции.

Вернемся к компиляции пакета:

 
make configure-host 
make LDFLAGS="-all-static" 

Описание параметров сборки:

configure-host

Это правильно настроит все субдиректории. Статичаская сборка без этого будет невозможна. Мы используем эту опцию для обеспечения беспроблемной работы.

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 

Описание параметров сборки:

-C ld clean

Это говорит программе сборки удалить все скомпилированые файлы в субдиректории ld.

-C ld LDFLAGS="-all-static" LIB_PATH=/tools/lib

Этот параметр пересоберет все в субдиректории ld. Указание переменной LIB_PATH файла сборки Makefile в коммандной строке заменит установленное значение по умолчанию на расположение наших временных средств. Содержимое этой переменной указывает путь по умолчанию для поиска библиотек компоновщиком.

[Warning]

Внимание

Не удаляйте сейчас директории для сборки и исходников Binutils. Вам они еще будут нужны в этой главе далее в их теперешнем состоянии.

Детальная информация о пакете находится в Разделе 6.13.2, “Описание Binutils”.


5.14. Binutils-2.15.91.0.2 - Шаг 2

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

Расчетное время сборки 1.5 SBU

Требуемое место на диске 108 MB

Binutils - зависимости установки: Bash, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Perl, Sed и Texinfo

5.14.1. Переинсталируем Binutils

Этот пакет известен своим нестабильным поведением при компиляции с измененными опциями оптимизации (включая опции -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 

Описание новых используемых опций:

--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 
[Warning]

Внимание

Не удаляйте сейчас директории для сборки и исходников Binutils. Эти директории будут нужны в следующей части в их нынешнем состоянии.

Детальная информация о пакете находится в Разделе 6.13.2, “Описание Binutils”.


5.31. Bison-1.875a

Bison является генератором парсеров. Генерирует программу, которая анализирует структуру текстового файла.

Расчетное время сборки 0.6 SBU

Требуемое место на диске 10.6 MB

Bison - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, M4, Make и Sed

5.31.1. Инсталируем Bison

Подготавливаем Bison для компиляции:

./configure --prefix=/tools

Компилируем пакет

make

Для проверки результата вводим: make check.

Устанавливаем пакет

make install

Детальная информация о пакете находится в Разделе 6.25.2, “Описание Bison”.


5.17. Bzip2-1.0.2

Bzip2 является блочным файловым архиватором который, как правило, сжимает лучше традиционного gzip.

Расчетное время сборки 0.1 SBU

Требуемое место на диске 2.5 MB

Bzip2 - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc и Make

5.17.1. Инсталируем Bzip2

Пакет Bzip2 не содержит скрипта configure. Компилируем его командой:

 
make 

Устанавливаем пакет

 
make PREFIX=/tools install 

Детальная информация о пакете находится в Разделе 6.40.2, “Описание Bzip2”.


5. Построение временной системы

5.1. Вступление

В этой главе мы скомпилируем и установим минимальную систему Linux. Эта система будет использоваться для построения конечной LFS системы в следующей Главе 6.

Сборка этой минимальной системы будет проходить в два этапа: сначала мы соберем независящие от основной системы средства (компилятор, ассемблер, компоновщик и библиотеки), а потом используем их для сборки других средств.

Файлы, компилируемые в этой главе, устанавливаются в директорию $LFS/tools для отделения их от файлов, устанавливаемых в следующей главе. Эти пакеты просто временные, мы не будем засорять ими нашу конечную LFS систему.

Перед выполнением инструкций по сборке пакета, пакет должен быть распакован пользователем lfs и необходимо перейти в созданную директорию при помощи команды cd. Инструкции по сборке подразумевают, что вы используете интерпритатор командной строки bash.

Некоторые пакеты необходимо пропатчить перед компиляцией, но только когда это необходимо для решения тех или иных проблем. Часто патчи нужно применять в обеих главах (этой и следующей), но некоторые необходимы только в одной из глав. Поэтому не беспокойтесь, если не найдете инструкций по наложению некоторых скачаных патчей в этой главе. Сообщения с предупреждением offset или fuzz могут появляться при накладывании патчей. Это нормально и вы можете не обращать на них внимания. Все что они говорят  - внимание, есть неточность, но не ошибка, в коде C или C++. Это из-за того, что меняются стандарты на язык C, а некоторые пакеты написаны в соответствии со старыми стандартами, но это не представляет проблемы для компилятора.

Если не сказано обратное, то вы можете спокойно удалить директории с исходниками и файлами сборки пакетов в целях экономии дискового пространства. Только три пакета нуждаются в сохранении директорий с исходниками и директорий для сборки без изменений для использования в дальнейшем. Об этом будут отдельные предупреждения.

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

 
echo $LFS 

Вывод должен указывать на точку монтирования раздела LFS. Мы используем /mnt/lfs в качестве примера.


5.16. Coreutils-5.2.1

Пакет Coreutils содержит некоторые системные утилиты для показа и установки базовых системных характеристик.

Расчетное время сборки 0.9 SBU

Требуемое место на диске 69 MB

Coreutils - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Perl и Sed

5.16.1. Инсталируем Coreutils

Подготавливаем 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”.


5.12. DejaGNU-1.4.4

Пакет DejaGnu содержит основы для тестирования других программ.

Расчетное время сборки 0.1 SBU

Требуемое место на диске 8.6 MB

DejaGNU - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make и Sed

5.12.1. Инсталируем DejaGNU

Подготавливаем DejaGNU для компиляции:

 
./configure --prefix=/tools 

Собираем и инсталируем пакет:

 
make install 

5.12.2. Описание DejaGNU

Проинсталированные программы: runtest

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

runtest

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


5.19. Diffutils-2.8.1

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

Расчетное время сборки 0.1 SBU

Требуемое место на диске 7.5 MB

Diffutils - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make и Sed

5.19.1. Инсталируем Diffutils

Подготавливаем Diffutils для компиляции:

./configure --prefix=/tools

Компилируем пакет

make

В этом пакете отсутствуют тесты.

Устанавливаем пакет

make install

Детальная информация о пакете находится в Разделе 6.41.2, “Описание Diffutils”.


5.11. Expect-5.42.1

Пакет Expect содержит программы, обеспечивающие программируемый диалог с другими интерактивными программами.

Расчетное время сборки 0.1 SBU

Требуемое место на диске 3.9 MB

Expect - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make, Sed и Tcl

5.11.1. Инсталируем Expect

Для начала наложим патч, который устранит неисправность в Expect, выдающем неверный результат при тестировании GCC.

 
patch -Np1 -i ../expect-5.42.1-spawn-1.patch 

Теперь подготавливаем Expect для компиляции:

 
./configure --prefix=/tools --with-tcl=/tools/lib --with-x=no 

Описание опций конфигурации:

--with-tcl=/tools/lib

Это скажет скрипту конфигурации искать Tcl в нашей временной директории, а не в основной системе.

--with-x=no

Это скажет скрипту конфигурации не искать Tk (компонент Tcl GUI) или библиотеки X Window System, поскольку он найдет их на основной системе.

Соберем пакет:

 
make 

Для проверки результата вводим: make test. Тестирование Expect известно своими ошибками из-за влияния основной системы. Таким образом отрицательные результаты тестов не будут здесь сюрпризом и не являются критичными.

Устанавливаем пакет

 
make SCRIPTS="" install 

Описание параметров сборки:

SCRIPTS=""

Этот параметр запускает установку без вспомогательных скриптов, которые не нужны.

Теперь вы можете удалить директории с исходниками Tcl и Expect.

5.11.2. Описание Expect

Проинсталированные программы: expect

Проинсталированные библиотеки: libexpect-5.42.a

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

expect

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

libexpect-5.42.a

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


5.20. Findutils-4.1.20

Пакет Findutils содержит программы для поиска файлов, в том числе "на лету" (путем рекурсивного поиска от директории и показывет только файлы, удовлетворяющие параметрам поиска) или поиск через бызу данных.

Расчетное время сборки 0.2 SBU

Требуемое место на диске 7.6 MB

Findutils - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make и Sed

5.20.1. Инсталируем Findutils

Подготавливаем Findutils для компиляции:

./configure --prefix=/tools

Компилируем пакет

make

Для проверки результата вводим: make check.

Устанавливаем пакет

make install

Детальная информация о пакете находится в Разделе 6.19.2, “Описание Findutils”.


5.32. Flex-2.5.31

Пакет Flex используется для генерации программ, которые могут обрабатывать шаблоны в тексте.

Расчетное время сборки 0.6 SBU

Требуемое место на диске 10.6 MB

Flex - зависимости установки: Bash, Binutils, Bison, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, M4, Make и Sed

5.32.1. Инсталируем Flex

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”.


5.15. Gawk-3.1.4

Gawk является вариантом awk, который используется для манипуляций с текстовыми файлами.

Расчетное время сборки 0.2 SBU

Требуемое место на диске 17 MB

Gawk - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make и Sed

5.15.1. Инсталируем Gawk

Подготавливаем Gawk для компиляции:

 
./configure --prefix=/tools 

Компилируем пакет

 
make 

Для проверки результата (не обязательно), выполняем: make check.

Устанавливаем пакет

 
make install 

Детальная информация о пакете находится в Разделе 6.20.2, “Описание Gawk”.


5.5. GCC-3.4.1 - Шаг 1

Пакет GCC содержит коллекцию компилятора GNU, включая компиляторы C и C++.

Расчетное время сборки 4.4 SBU

Требуемое место на диске 300 MB

GCC - зависимости установки: Bash, Binutils, Coreutils, Diffutils, Findutils, Gawk, Gettext, Glibc, Grep, Make, Perl, Sed и Texinfo

5.5.1. Инсталируем GCC

Распакуйте только тарбол 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 

Описание опций конфигурации:

--with-local-prefix=/tools

Назначение этого переключателя - исключить /usr/local/include из пути поиска включений gcc. Это не очень существенно, но мы собираемся минимизировать зависимомть от основной системы, и мы считаем, что это нужно сделать.

--enable-shared

Этот переключатель может показаться интуитивно понятным поначалу. Но его использование допускает сборку libgcc_s.so.1 и libgcc_eh.a, а также делает libgcc_eh.a доступным для скрипта конфигурации Glibc (следующего компилируемого пакета), выдавая правильный результат. Заметьте, что бинарники компонуются статически, если это задано значением -static для переменной BOOT_LDFLAGS далее.

--enable-languages=c

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

Продолжим компиляцию пакета:

 
make BOOT_LDFLAGS="-static" bootstrap 

Описание параметров сборки:

BOOT_LDFLAGS="-static"

Это скажет GCC компоновать программы статически.

bootstrap

Этот параметр заставляет не просто компилироваться GCC, а компилироваться несколько раз. Программы, скомпилированые сначала используются для компиляции программ еще раз, а те, в свою очередь, используются при компиляции в третий раз. Идентичность второй и третьей компиляции позволяет убедиться в корректности сборки.

Компиляция проведена. На этом этапе обычно выполняется тест, но как было сказано ранее, мы еще не имеем полного набора тестовых утилит на своем месте. Кроме того, смысл запуска теста на этом этапе минимален т.к. программы, собранные на этом шаге скоро будут заменены.

Устанавливаем пакет

 
make install 

Многие программы и скрипты используют cc вместо gcc для обеспечения переносимости программ на все Unix системы. Не у всех установлен именно компилятор GNU C. Запуск cc позволяет администратору выбирать, какой компилятор C устанавливать в систему, и мы создаем ссылку на него:

 
ln -s gcc /tools/bin/cc 

Детальная информация о пакете находится в Разделе 6.14.2, “Contents of GCC”.


5.13. GCC-3.4.1 - Шаг 2

Расчетное время сборки 11.0 SBU

Требуемое место на диске 274 MB

GCC - зависимости установки: Bash, Binutils, Coreutils, Diffutils, Findutils, Gawk, Gettext, Glibc, Grep, Make, Perl, Sed и Texinfo

5.13.1. Переустановка GCC

Этот пакет известен своим нестабильным поведением при компиляции с измененными опциями оптимизации (включая опции -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.

[Important]

Важно

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

Создайте отдельную директорию для сборки и перейдите в нее:

 
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 

Описание новых опций конфигурации:

--enable-clocale=gnu

Эта опция позволяет убедиться в корректном выборе модели локали для библиотек C++ во всех обстоятельствах. Если скрипт конфигурации найдет установленную локаль de_DE, он выберет корректную модель. Тем не менее, если локаль de_DE не установлена, есть риск собрать Application Binary Interface (ABI)-несовместимые библиотеки C++ из-за неверной модели локали в общем случае.

--enable-threads=posix

Подключит расширение C++ для мультилинейного кода.

--enable-__cxa_atexit

Эта опция разрешит использование __cxa_atexit, которое предпочтительнее использования atexit, для регистрации деструкторов C++ для локальных и глобальных объектов для обеспечения полного соответствия стандартам ссылок на деструкторы. Он также повлияет на C++ ABI и некоторые другие результаты в библиотеках C++ и программах C++, которые взаимодействуют с другими дистрибутивами Linux.

--enable-languages=c,c++

Эта опция позволяет убедиться, что будут собраны компиляторы C и C++.

--disable-libstdcxx-pch

Не собирать предкомпилированные заголовки (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 
[Note]

Замечание

В этом месте рекомендуется повторить простой тест, описаный ранее. Вернитесь к Разделу 5.9, “Интеграция Glibc”, и повторите проверку. Если она не удалась, видимо, вы забыли наложить вышеупомянутый патч GCC Specs.

Детальная информация о пакете находится в Разделе 6.14.2, “Описание GCC”.


5.24. Gettext-0.14.1

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

Расчетное время сборки 0.5 SBU

Требуемое место на диске 55 MB

Gettext - зависимости установки: Bash, Binutils, Bison, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make и Sed

5.24.1. Инсталируем Gettext

Подготавливаем Gettext для компиляции:

./configure --prefix=/tools --disable-libasprintf \
    --disable-csharp

Описание опций конфигурации:

--disable-libasprintf

Этот флаг говорит Gettext не собирать библиотеку asprintf. Так как ничто в этой и следующей части не требует эту библиотеку и Gettext будет пересобран позднее, исклюючим эту библиотеку для экономии места и времени.

--disable-csharp

Говорит 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”.


5.8. Glibc-2.3.4-20040701

Glibc является библиотекой C, которая обеспечивает системные вызовы и основные функции, такие как open, malloc, printf и т.д. Библиотека C используется для всех динамически скомпонованых программ.

Расчетное время сборки 11.8 SBU

Требуемое место на диске 800 MB

Glibc - зависимости установки: Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Gettext, Grep, Make, Perl, Sed и Texinfo

5.8.1. Инсталируем Glibc

Этот пакет известен своим нестабильным поведением при компиляции с измененными опциями оптимизации (включая опции -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 

Описание опций конфигурации:

--disable-profile

Отключает сборку библиотек с использованием профильной информации. Опустите эту опцию, если собираетесь испольховать профили.

--enable-add-ons=nptl

Говорит Glibc использовать дополнение NPTL к библиотеке.

--with-tls

Говорит Glibc включить поддержку для Thread-Local Storage (TLS). Это необходимо для нормальной работы NPTL.

--with-__thread

Эта опция говорит Glibc включить поддержку нитей. Это необходимо для правильной сборки TLS.

--enable-kernel=2.6.0

Эта опция говорит Glibc компилировать библиотеку с поддержкой 2.6.x Линукс ядер.

--with-binutils=/tools/bin

Эта опция необязательна, но она позволяют нам удостовериться, что будут использована нужная программа Binutils для сборки Glibc.

--without-gd

Эта опция запрещает сборку программы memusagestat, которая пытается связаться с библиотеками основной системы (libgd, libpng, libz, и т.д.).

--without-cvs

Эта опция запрещает использование файлов Makefile из тестовых CVS версий, когда используется CVS. Пока эта команда не обязательна, она рекомендуется.

--with-headers=/tools/glibc-kernheaders

Эта опция говорит 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).

[Note]

Замечание

Если тест не был запущен в этой части (как в рекомендации), нет необходимости в инсталяции локалей сейчас. Необходимые локали будут установлены в следующей части.

Для установки 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”.


5.22. Grep-2.5.1

Grep является программой для поиска в содержимом файлов.

Расчетное время сборки 0.1 SBU

Требуемое место на диске 5.8 MB

Grep - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Make, Sed и Texinfo

5.22.1. Инсталируем Grep

Подготавливаем Grep для компиляции:

./configure --prefix=/tools \
    --disable-perl-regexp --with-included-regex

Описание параметров конфигурации:

--disable-perl-regexp

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

--with-included-regex

Это позволит убедиться, что Grep использует внутренние регулярные выражения. В противном случае он будет использовать код из Glibc, который может содержать ошибки.

Компилируем пакет

make

Для проверки результата вводим: make check.

Устанавливаем пакет

make install

Детальная информация о пакете находится в Разделе 6.44.2, “Описание Grep”.


5.18. Gzip-1.3.5

Пакет Gzip содержит программы для сжатия и распаковки файлов.

Расчетное время сборки 0.1 SBU

Требуемое место на диске 2.6 MB

Gzip - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make и Sed

5.18.1. Инсталируем Gzip

Подготавливаем Gzip для компиляции:

./configure --prefix=/tools

Компилируем пакет

make

В пакете отсутствует тест сборки.

Устанавливаем пакет

make install

Детальная информация о пакете находится в Разделе 6.46.2, “Описание Gzip”.


5.21. Make-3.80

Пакет Make содержит программу для компиляции больших приложений.

Расчетное время сборки 0.2 SBU

Требуемое место на диске 8.8 MB

Make - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep и Sed

5.21.1. Инсталируем Make

Подготавливаем Make для компиляции:

./configure --prefix=/tools

Компилируем пакет

make

Для проверки результата вводим: make check.

Устанавливаем пакет

make install

Детальная информация о пакете находится в Разделе 6.48.2, “Описание Make”.


5.26. Patch-2.5.4

Программа Patch содержит программу для модификации файлов.

Расчетное время сборки 0.1 SBU

Требуемое место на диске 1.9 MB

Patch - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make и Sed

5.26.1. Инсталируем Patch

Подготавливаем Patch для компиляции:

CPPFLAGS=-D_GNU_SOURCE ./configure --prefix=/tools

Флаг препроцессора -D_GNU_SOURCE нужен только на платформах PowerPC. На других платформах вы можете его пропустить.

Компилируем пакет

make

Устанавливаем пакет

make install

Детальная информация о пакете находится в Разделе 6.50.2, “Описание Patch”.


5.23. Sed-4.1.2

Sed является редактором потоков.

Расчетное время сборки 0.2 SBU

Требуемое место на диске 5.2 MB

Sed - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make и Texinfo

5.23.1. Инсталируем Sed

Подготавливаем Sed для компиляции:

./configure --prefix=/tools

Компилируем пакет

make

Для проверки результата вводим: make check.

Устанавливаем пакет

make install

Детальная информация о пакете находится в Разделе 6.28.2, “Contents of Sed”.


5.27. Tar-1.14

Tar является программой архивирования

Расчетное время сборки 0.2 SBU

Требуемое место на диске 10 MB

Tar - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make и Sed

5.27.1. Инсталируем Tar

Подготавливаем Tar для компиляции:

./configure --prefix=/tools

Компилируем пакет

make

Для проверки результата вводим: make check.

Устанавливаем пакет

make install

Детальная информация о пакете находится в Разделе 6.56.2, “Contents of Tar”.


5.28. Texinfo-4.7

Пакет Texinfo содержит программы, используемые для чтения, записи и конвертирования документов Info, которые содержат системную документацию.

Расчетное время сборки 0.2 SBU

Требуемое место на диске 16 MB

Texinfo - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Ncurses и Sed

5.28.1. Инсталируем Texinfo

Подготавливаем Texinfo для компиляции:

./configure --prefix=/tools

Компилируем пакет

make

Для проверки результата вводим: make check.

Устанавливаем пакет

make install

Детальная информация о пакете находится в Разделе 6.34.2, “Описание Texinfo”.


5.33. Util-linux-2.12b

Пакет Util-linux содержит ряд разнообразных утилит. Некоторые из них используются весьма часто для монтирования, размонтирования, форматирования и управления драйверами дисков, открытия портов tty и вывода сообщений ядра.

Расчетное время сборки 0.2 SBU

Требуемое место на диске 16 MB

Util-linux - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Ncurses, Sed и Zlib

5.33.1. Инсталируем Util-linux

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”.


5.9. "Интеграция" средств

Теперь, когда временные библиотеки C были установлены, мы хотим, чтобы все оставшиеся в этой главе пакеты компоновались с использованием уже установленных библиотек. Чтобы обеспечить это, мы должны настроить specs файл компилятора.

Заменим компоновщик, установленный в конце первого шага сборки Binutils, запуском следующей команды в директории binutils-build:

 
make -C ld install 

С этого момента все пакеты быдут собраны только с использованием библиотек из /tools/lib.

[Note]

Замечание

Если вы пропустили предупреждение о том, что не надо было удалять директории с исходниками и сборкой 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

[Important]

Важно

Если вы работаете на платформе, где имя динамического компоновщика отлично от ld-linux.so.2, замените“ld-linux.so.2” на имя динамического компоновщика вашей платформы в вышеуказанных командах. При необходимости вернитесь к Разделу 5.3.

Есть возможность, что некоторые включаемые файлы из основной системы имеются внутри директорий для включаемых файлов GCC. Это могло произойти по причине того, что процесс “fixincludes” запускается как часть сборки GCC. Позже мы раскажем об этом подробнее в этой главе. А пока запустите следующую команду, чтобы исключить эту возможность:

 
rm -f /tools/lib/gcc/*/*/include/{pthread.h,bits/sigthread.h} 
[Caution]

Внимание

На этом месте необходимо остановиться и убедиться, что основные функции (компиляция и компоновка) новых средств работают корректно. Для этого есть простой тест:

 
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 

5.7. Установка заголовков Linux-2.6.8.1

Пакет ядра Linux содержит исходники ядра и файлы заголовков, используемые Glibc.

Расчетное время сборки 0.1 SBU

Требуемое место на диске 186 MB

Заголовки Linux - зависимости установки: Coreutils и Make

5.7.1. Инсталируем заголовки ядра

Некоторые пакеты нуждаются в ссылках на заголовки ядра, и мы собираемся распаковать архив ядра, собрать и скопировать необходимые файлы туда, где их сможет найти 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”.


5.6. Установка заголовков Linux-Libc-2.6.8.1

Пакет заголовков Linux-Libc содержит “осмысленные” заголовки ядра.

Расчетное время сборки 0.1 SBU

Требуемое место на диске 22 MB

Заголовки Linux-Libc - зависимости установки: Coreutils

5.6.1. Инсталируем заголовки Linux-Libc

В течении многих лет было очень практично использовать “сырые” заголовки ядра (прямо из тарбола ядра) в /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”.


5.25. Ncurses-5.4

Пакет Ncurses содержит библиотеки для расширения возможностей текстового интерфейса, включая панели и меню.

Расчетное время сборки 0.7 SBU

Требуемое место на диске 26 MB

Ncurses - зависимости установки: Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make и Sed

5.25.1. Инсталируем Ncurses

Подготавливаем Ncurses для компиляции:

./configure --prefix=/tools --with-shared \
    --without-debug --without-ada --enable-overwrite

Значение опций конфигурации:

--without-ada

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

--enable-overwrite

Это скажет Ncurses устанавливать свои заголовки в /tools/include, вместо /tools/include/ncurses, нам надо убедиться, что другие пакеты смогут эти заголовки найти.

Компилируем пакет

make

Устанавливаем пакет

make install

Детальная информация о пакете находится в Разделе 6.21.2, “Описание Ncurses”.


5.34. Perl-5.8.5

Пакет Perl содержит perl, язык практичной обработки и отчетов (Practical Extraction and Report Language).

Расчетное время сборки 0.8 SBU

Требуемое место на диске 74 MB

Perl - зависимости установки: Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make и Sed

5.34.1. Инсталируем Perl

Для начала применим патч для библиотеки C:

patch -Np1 -i ../perl-5.8.5-libc-1.patch

Подготавливаем Perl для компиляции (убедимся,что часть команды 'IO Fcntl POSIX' корректна):

./configure.gnu --prefix=/tools -Dstatic_ext='IO Fcntl POSIX'

Описание опций конфигурации:

-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”.


5.10. Tcl-8.4.7

Пакет Tcl содержит Tool Command Language (Средство Командого Языка).

Расчетное время сборки 0.9 SBU

Требуемое место на диске 23 MB

Tcl - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make и Sed

5.10.1. Инсталируем Tcl

Этот и следующие два (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 
[Warning]

Внимание

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

Создадим необходимую символическую ссылку:

 
ln -s tclsh8.4 /tools/bin/tclsh 

5.10.2. Описание Tcl

Проинсталированные программы: tclsh (link to tclsh8.4) and tclsh8.4

Проинсталированные библиотеки: libtcl8.4.so

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

tclsh8.4

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

tclsh

Ссылка на tclsh8.4

libtcl8.4.so

Библиотека Tcl


5.3.

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

Основной целью Главы 5 является подготовка окружения для входа через chroot для создания полноценной системы в Главе 6. По ходу дела мы соберем, используя основную систему, самодостаточные средства. Это будет сделано для обеспечения минимального риска и максимальной независимости одновременно. Другими словами, мы соберем инструменты для сборки системы.

[Important]

Важно

Перед дальнейшей работой вы должны знать название вашей платформы, которое также называется 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 работать:

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 системы.

5.3.1. О статической компоновке

Многие программы выполняют помимо своей основной задачи и многие другие операции. Это включает распределение памяти, поиск директорий, четение и запись файлов, манипуляции со строками, использование шаблонов, арифметические операции и многое другое. Вместо того, чтобы включать все это в программу, GNU система поддерживает простые функции в библиотеках. Самой главной из них для любой Linux системы является Glibc.

Есть два варианта использования библиотечных функций: статически и динамически. Когда программа скомпонована статически, код используемых функций включается в программу и она становится более громоздкой. Когда же программа скомпонована динамически, в программу включаются только ссылка на динамический компоновщик, имя библиотеки и имя функции, в результате мы получаем более маленький исполняемый файл. (Есть еще третий путь - использование программного интерфейса для динамического компоновщика. Смотрите мануал по dlopen для более полной информации.)

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

Если динамическая компоновка настолько лучше, то почему мы ее не используем, а статически компонуем первые два пакета в этой главе? Есть тройственная причина для этого: историческая, образовательная и техническая. Историческая: потому что простейшая версия LFS статически компонует все программы из этой главы. Образовательная: потому что надо знать отличие между статической и динамической компоновкой. Техническая: потому что мы получаем элемент независимости от основной системы - наши программы не должны от нее зависеть, они должны иметь возможность работать самостоятельно. Таким образом, если мы хотим построить LFS систему, нам необходимо отказаться от динамической компоновки первых двух пакетов.


5.2. Требования к системе

Базовая система должна быть запущена на ядре как минимум версии 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.


5.36. Сжатие

Описываемый здесь шаг не является обязательным. Если ваш раздел 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, то вы сможете собрать и установить все остальное.


5.35. Udev-030

Пакет Udev содержит программы для динамического создания нод устройств.

Расчетное время сборки 0.2 SBU

Требуемое место на диске 5.2 MB

Udev - зависимости установки: Coreutils и Make

5.35.1. Инсталируем Udev

Программа 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”.


6.59. Об отладочных символах

Большинство программ и библиотек по умолчанию компилируются с символами отладки (с опцией -g для gcc). Это означает, что когда отлаживается программа или библиотека, которая была собрана с включением отладочной информации, то отладчик может передать вам не только адреса в памяти, но и имена переменных и функций.

Но исключение отладочных символов существенно уменьшает размер программы или библиотеки. Чтобы получить представление о том, сколько места занимает отладочная информация, посмотрите следующее:

Размер может немного варьироваться в зависимости от используемых компилятора и библиотеки C. Но размер между программами и библиотеками, собранными с отладочной информацией и без таковой может различаться в 2-5 раз.

Большинство людей никогда не используют отладчик, и довольно много места на диске освободится при удалении отладочных символов. В следующей части будет показано, как удалить все отладочные символы из программ и библиотек. Дополнительная информация по оптимизации системы может быть найдена в http://www.linuxfromscratch.org/hints/downloads/files/optimization.txt.


6.35. Autoconf-2.59

Пакет Autoconf создает shell скрипты, которые автоматически конфигурируют исходный код.

Расчетное время сборки 0.5 SBU

Требуемое место на диске 7.7 MB

Autoconf - зависимости установки: Bash, Coreutils, Diffutils, Grep, M4, Make, Perl и Sed

6.35.1. Инсталируем Autoconf

Подготавливаем Autoconf для компиляции:

./configure --prefix=/usr

Компилируем пакет

make

Для проверки результата вводим: make check. Проверка занимает около 2 SBU.

Устанавливаем пакет

make install

6.35.2. Описание Autoconf

Проинсталированные программы: autoconf, autoheader, autom4te, autoreconf, autoscan, autoupdate и ifnames

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

autoconf

Предоставляет shell-скрипты, которые автоматически настраивают исходники пакетов для адаптации к большинству Unix-подобных систем. Скрипты конфигурации создаются сомостоятельными -- они работают без программы autoconf.

autoheader

Средство для создания шаблонов файлов с директивами C #define для настройки использования.

autom4te

Это оболочка для макропроцессора M4.

autoreconf

Автоматически запускает autoconf, autoheader, aclocal, automake, gettextize и libtoolize в корректном порядке для сохранения времени, когда сделаны изменения во временных файлах autoconf и automake.

autoscan

Помогает при создании файла configure.in для пакета программ; он проверяет исходники в дереве каталогов, ищет в них возможность возникновения проблем при переносимости и создает файл configure.scan, который служит предварительным файлом configure.in для пакета.

autoupdate

Модифицирует файл configure.in, обновляя имена вызова макросов autoconf.

ifnames

Помогает при написании configure.in для пакета программ. Он печатает идентификаторы, используемые пакетом в условиях препроцессора C. Если пакет уже настроен на определенную переносимость, эта программа может помочь определить, что надо проверять скрипту configure. Он может заполнить некоторые пропуски в файле configure.in, сгенерированом autoscan.


6.36. Automake-1.9.1

Automake генерирует файлы Makefile.in, предназначеные для использования Autoconf.

Расчетное время сборки 0.2 SBU

Требуемое место на диске 6.8 MB

Automake - зависимости установки: Autoconf, Bash, Coreutils, Diffutils, Grep, M4, Make, Perl и Sed

6.36.1. Инсталируем Automake

Подготавливаем Automake для компиляции:

./configure --prefix=/usr

Компилируем пакет

make

Для проверки результата вводим: make check.

Это может занять много времени, около 5 SBU.

Устанавливаем пакет

make install

6.36.2. Описание Automake

Проинсталированные программы: 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

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

acinstall

Скрипт, устанавливающий файлы aclocal-стиля M4.

aclocal

Генерирует файлы aclocal.m4, основанные на содержимом файлов configure.in.

aclocal-1.9.1

Жесткая ссылка на aclocal.

automake

Средство для автоматической генерации файлов Makefile.in из файлов Makefile.am. Для создания всех файлов Makefile.in для пакета, запустите программу в верхней директории пакета. При сканировании файлов configure.in он автоматчески найдет соответствующие файлы Makefile.am и сгенерирует соответствующий файлMakefile.in.

automake-1.9.1

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

compile

Оболочка для компиляторов.

config.guess

Скрипт, который определяет каноническое имя (триплет) системы - сборка, хост и тип архитектуры.

config.sub

Скрипт проверки конфигурации.

depcomp

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

elisp-comp

Байт-компиляция кода Emacs Lisp.

install-sh

Скрипт, который устанавливает программу, скрипт или файл данных.

mdate-sh

Выводит время модификации директории или файла.

missing

Скрипт, заменяющий ряд пропущенных при инсталяции программ GNU.

mkinstalldirs

Создает дерево каталогов.

py-compile

Компилирует Python-программу

symlink-tree

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

ylwrap

Оболочка для lex и yacc.


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.37. Bash-3.0

Bash - это Bourne-Again SHell.

Расчетное время сборки 1.2 SBU

Требуемое место на диске 27 MB

Bash - зависимости установки: Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make, Ncurses и Sed.

6.37.1. Инсталируем Bash

Следующий патч необходим только если пакет 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

Значение опций конфигурации:

--with-installed-readline

Эта опция говорит Bash испоьзовать библиотеку readline, которая уже установлена в системе и лучше, чем встроенная версия readline.

Компилируем пакет

make

Для проверки результата вводим: make tests.

Устанавливаем пакет

make install

Запустим только что установленную прогрпмму bash, заменив уже запущенную:

exec /bin/bash --login +h
[Note]

Замечание

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

6.37.2. Описание Bash

Проинсталированные программы: bash, bashbug и sh (ссылка на bash)

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

bash

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

bashbug

shell-скрипт для помощи пользователю в составлении и отправке сообщения об ошибке, относящейся к bash, в стандартном формате.

sh

Ссылка на программу bash. При вызове как sh, bash запускается в режиме эмуляции исторической версии sh насколько это возможно, для большего соответствия стандартам POSIX.


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.13. Binutils-2.15.91.0.2

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

Расчетное время сборки 1.4 SBU

Требуемое место на диске 167 MB

Binutils - зависимости установки: Bash, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Perl, Sed и Texinfo

6.13.1. Инсталируем Binutils

Этот пакет известен своим нестабильным поведением при компиляции с измененными опциями оптимизации (включая опции -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).

[Important]

Важно

Тестирование Binutils на этом этапе является критичным. Не пропускайте его.

Проверим результаты:

make check

Устанавливаем пакет

make tooldir=/usr install

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

cp ../binutils-2.15.91.0.2/include/libiberty.h /usr/include

6.13.2. Описание Binutils

Проинсталированные программы: addr2line, ar, as, c++filt, gprof, ld, nm, objcopy, objdump, ranlib, readelf, size, strings и strip

Проинсталированные библиотеки: libiberty.a, libbfd.[a,so] и libopcodes.[a,so]

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

addr2line

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

ar

Создает, модифицирует и распаковывает из архива.

as

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

c++filt

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

gprof

Отображает график системных вызовов.

ld

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

nm

Выводит символы, содержащиеся в объектном файле.

objcopy

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

objdump

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

ranlib

Генерирует список содержимого архива и сохраняет его в архиве. Список содержит все символы, определенные частями архива, которые являются объектными файлами.

readelf

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

size

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

strings

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

strip

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

libiberty

Содержит правила, используемые различными программами GNU, включая getopt, obstack, strerror, strtol и strtoul

libbfd

Библиотека двоичого дескриптора файла.

libopcodes

Библиотека для работы с опкодами — “читаемыми” версиями инструкций процессора; используется в сборке утилит вроде objdump.


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.25. Bison-1.875a

Bison является генератором парсеров. Генерирует программу, которая анализирует структуру текстового файла.

Расчетное время сборки 0.6 SBU

Требуемое место на диске 10.6 MB

Bison - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, M4, Make и Sed

6.25.1. Инсталируем Bison

Подготавливаем Bison для компиляции:

./configure --prefix=/usr

Компилируем пакет

make

Для проверки результата вводим: make check.

Устанавливаем пакет

make install

6.25.2. Описание Bison

Проинсталированные программы: bison и yacc

Проинсталированные библиотеки: liby.a

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

bison

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

yacc

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

liby.a

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


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.40. Bzip2-1.0.2

Bzip2 является блочным файловым архиватором, который сжимает, как правило, лучше традиционного gzip.

Расчетное время сборки 0.1 SBU

Требуемое место на диске 3.0 MB

Bzip2 - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc и Make

6.40.1. Инсталируем Bzip2

Подготавливаем 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

6.40.2. Описание Bzip2

Проинсталированные программы: 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

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

bunzip2

Декомпрессия файлов, сжатых bzip

bzcat

Декомпрессия на стандартное устройство вывода

bzcmp

Запускает cmp на файлах, сжатых bzip

bzdiff

Запускает diff на файлах, сжатых bzip

bzgrep

Запускает grep на файлах, сжатых bzip

bzegrep

Запускает egrep на файлах, сжатых bzip

bzfgrep

Запускает fgrep на файлах, сжатых bzip

bzip2

Сжимает файлы, используя алгоритм компрессии Burrows-Wheeler блочной сортировки текста с кодированием Huffman; уровень компрессии лучше, чем у сжатия более распространенными компрессотами, использующими алгоритм “Lempel-Ziv”, например gzip

bzip2recover

Пытается восстановить данные из поврежденных bzip-файлов

bzless

Запускает less на файлах, сжатых bzip

bzmore

Запускает more на файлах, сжатых bzip

libbz2*

Библиотека, включающая блочно-сортирующую компрессию данных, использующую алгоритм Burrows-Wheeler


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.4. Изменение владельца

На данный момент права на директорию /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” до того, как будет создан файл паролей.


Linux From Scratch - Версия 6.0

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

6. Установка основных системных программ

6.1. Вступление

В этой главе мы войдем в фазу сборки и начнем серьезно собирать нашу 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.

[Note]

Замечание

Остаток этой книги выполняется в режиме регистрации под пользователем root, а не пользователем lfs.


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.3. Вход в среду chroot

Теперь пришло время войти в среду 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 еще не создан.


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.15. Coreutils-5.2.1

Пакет Coreutils содержит некоторые системные утилиты для показа и установки базовых системных характеристик.

Расчетное время сборки 0.9 SBU

Требуемое место на диске 69 MB

Coreutils - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Perl и Sed

6.15.1. Инсталируем Coreutils

Нормальное функционирование программы 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

6.15.2. Описание Coreutils

Проинсталированные программы: 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

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

basename

Возвращает имя файла по указаному полному имени с путями и суффиксами.

cat

Суммирует содержимое файлов на стандартный вывод.

chgrp

Изменяет группу-владельца для указанного файла на заданную группу. Группа может быть определена как по имени, так и по числовому ID.

chmod

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

chown

Изменяет пользователя и/или группу, которые являются владельцем файла на указанную пару пользователь:группа.

chroot

Запускает указанную команду с указанной директорией в качестве корня /.

cksum

Печатает контрольную сумму CRC и количество байт в указанном файле.

comm

Сравнивает два файла и выводит в три колонки одинаковые строки и разные.

cp

Копирует файлы.

csplit

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

cut

Печатает часть строк, соответствующих заданным параметрам.

date

Показывает текущее время в указанном формате или устанавливает системное время.

dd

Копирует файл, используя указанные размеры блоков и опциональные преобразования.

df

Показывает сколько места доступно (и используется) для всех примонтированых файловых систем или только для системы, содержащей указанные файлы.

dir

Синоним команды ls.

dircolors

Выдает команду для установки переменной окружения LS_COLOR, используемой для изменения цветовой схемы для ls

dirname

Удаляет суффикс, не являющийся директорией, из имени файла.

du

Возвращает место на диске, занимаемое указанной или текущей директориями со всеми вложеными директориями или файлами.

echo

Показывает заданную строку.

env

Запускает команду в измененном окружении.

expand

Заменяет знаки табуляции пробелами.

expr

Вычисляет выражения.

factor

Выводит разложение на простые множители всех указанных целых чисел.

false

Ничего не делает, но всегда завершается со статусом ошибки.

fmt

Форматирует абзацы в указанных файлах.

fold

Переносит строки в заданных фалах.

groups

Выводит группу, к которой принадлежит пользователь.

head

Печатает первые десять строк файла (или указанное число строк).

hostid

Возвращает числовой идентификатор хоста (в шестнадчатиричном формате).

hostname

Возвращает установленное имя хоста.

id

Возвращает ID пользователя, ID группы и группу к которой принадлежит текущий или заданный пользователь.

install

Копирует файлы, устанавливая им режим доступа и, если возможно, их владельца и группу.

join

Соединяет строки двух файлов в поля.

link

Создает жесткую ссылку на указанное имя или файл.

ln

Создает жесткую или символическую ссылку на файлы.

logname

Возвращает идентификационное имя текущего пользователя.

ls

Выводит содержимое указанной директории. По умолчанию - в алфавитном порядке подкаталоги и файлы.

md5sum

Возвращает контрольную сумму MD5.

mkdir

Создает директорию с указанным именем.

mkfifo

Создает FIFO “именованный канал” UNIX способом с заданным именем.

mknod

Создает элемент устройства с заданным именем. Элемент устройства может быть специальным символьным фалом, блочным файлом или FIFO.

mv

Перемещает или переименовывает указанные файлы или директории.

nice

Запускает программу с измененным приоритетом выполнения.

nl

Возвращает количество строк в указанном файле.

nohup

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

od

Выводит дамп файла в восьмеричном или ином формате.

paste

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

pathchk

Проверяет корректность или портируемость имен файлов.

pinky

Упрощенный вариант finger. Возвращает некоторую информацию об указанных пользователях.

pr

Форматирует файл по страницам и колонкам для вывода на печать.

printenv

Печатает переменные окружения.

printf

Печатает заданные параметры в указанном формате - очень похож на одноименную функцию C.

ptx

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

pwd

Возвращает имя текущей директории.

readlink

Возвращает значение символической ссылки.

rm

Удаляет файлы или директории.

rmdir

Удаляет директорию, если она пустая.

seq

Печатает ряд чисел в заданном диапазоне с заданным шагом.

sha1sum

Возвращает или проверяет контрольную сумму 160-бит SHA1.

shred

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

sleep

Пауза на указанное время (в секундах).

sort

Сортирует строки заданных файлов.

split

Разрезает указанный файл на части заданного размера или по номерам строк.

stat

Показывает статус файла или файловой системы.

stty

Устанавливает или печатает установки терминала.

sum

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

sync

Переключает буфер файловой системы. Он принудительно записывает измененные блоки на диск и обновляет super block.

tac

Выводит содержимое указанных файлов в обратном порядке.

tail

Печатает последние десять строк (или указанное их количество) заданного файла.

tee

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

test

Сравнивает значения и проверяет типы файлов.

touch

Изменяет время изменения файла, устанавливает доступ к файлу. Если файл не существует, то он будет создан с нулевой длиной.

tr

Заменяет, вставляет и удаляет символы со стандартного ввода.

true

Ничего не делает, но всегда возвращает результат успешно завершенной операции.

tsort

Проводит топологическую сортировку. Он выводит полностью отсортированый список с учетом уже произведенной сортировки указанного файла.

tty

Возвращает имя файла терминала, присоединенного к стандартному вводу.

uname

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

unexpand

Заменяет пробелы символами табуляции.

uniq

Удаляет все повторяющиеся строки из отсортированного файла.

unlink

Удаляет указанный файл.

users

Выводит список подключенных к системе пользователей.

vdir

Тоже самое, что ls -l

wc

Выводит количество строк, слов и байт в указанном файле и общее количество строк, если указано более одного файла.

who

Сообщает, кто сейчас подключен.

whoami

Возвращает имя пользователя, соответствующее текущему ID.

yes

Выводит циклически “y” или заданную строку, после чего завершается.


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.6. Создание необходимых ссылок

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

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

Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.5. Создание директорий

Теперь нам надо создать структуру файловой системы 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.

6.5.1. Совместимость с FHS

Мы создаем наше дерево каталогов совместимым со стандартом FHS (доступен на http://www.pathname.com/fhs/). Вместе с деревом директорий, созданном выше, этот стандарт обуславливает существование /usr/local/games и /usr/share/games. Мы не рекомендуем их для базовой системы, хотя вы можете создать систему полностью FHS-совместимой. Поскольку структура субдиректорий /usr/local/share не описана в стандарте FHS, то мы создаем ее так, как надо нам.


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.8. Заполнение /dev

6.8.1. Создание первоначальных файлов устройств

Когда ядро загружает систему, оно требует наличия нескольких файлов устройств, обычно это устройства console и null. Создадим их запуском следующих команд:

mknod -m 600 /dev/console c 5 1
mknod -m 666 /dev/null c 1 3

6.8.2. Монтирование ramfs и заполнение /dev

Идеальный способ для заполнения /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 - пока не был создан, но он пока не нужен для нормального монтирования файловых систем. Раз так, предупреждение может быть проигнорировано.


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.41. Diffutils-2.8.1

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

Расчетное время сборки 0.1 SBU

Требуемое место на диске 7.5 MB

Diffutils - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make и Sed

6.41.1. Инсталируем Diffutils

Подготавливаем Diffutils для компиляции:

./configure --prefix=/usr

Компилируем пакет

make

В этом пакете отсутствуют тесты.

Устанавливаем пакет

make install

6.41.2. Описание Diffutils

Проинсталированные программы: cmp, diff, diff3 и sdiff

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

cmp

Сравнивает два файла и показывает, где и какие байты в них отличаются

diff

Сравнивает два файла или директирии и показывает, какие строки в файлах отличаются

diff3

Сравнивает три файла построчно

sdiff

Объединяет два файла и интерактивно выводит результат


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.43. E2fsprogs-1.35

E2fsprogs содержит ряд системных утилит для поддержки файловой системы ext2. Они также поддерживают журналируемую файловую систему ext3.

Расчетное время сборки 0.6 SBU

Требуемое место на диске 4.9 MB

E2fsprogs - зависимости установки: Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Gettext, Glibc, Grep, Make, Sed и Texinfo

6.43.1. Инсталируем E2fsprogs

Рекомендуется собирать E2fsprogs вне директории с исходниками:

mkdir build
cd build

Подготавливаем E2fsprogs для компиляции:

../configure --prefix=/usr --with-root-prefix="" \
    --enable-elf-shlibs --disable-evms

Описание параметров конфигурации:

--with-root-prefix=""

Определенные программы (такие как программа e2fsck) рассматриваются как необходимые программы. Например, когда раздел /usr не примонтирован, эти программы не будут доступны. Они должны находится в таких директориях как /lib и /sbin. Если этот параметр пропущен при конфигурации E2fsprogs, программы разместятся в директории /usr, что нам не нужно.

--enable-elf-shlibs

Это создаст разделяемую библиотеку для использования некоторыми программами из этого пакета.

--disable-evms

Это отключит сборку плагина Enterprise Volume Management System (EVMS). Этот плагин не обновляется с последними внутренними EVMS интерфейсами и EVMS не инсталируется как часть базовой системы LFS, поэтому плагин не требуется. Смотрите EVMS сайт на http://evms.sourceforge.net/ для большей информации о EVMS.

Компилируем пакет:

make

Для проверки результата вводим:

make check

Инсталируем большинство программ:

make install

Инсталируем разделяемые библиотеки:

make install-libs

6.43.2. Описание E2fsprogs

Проинсталированные программы: 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]

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

badblocks

Ищет на устройстве (обычно разделе диска) плохие блоки.

blkid

Утилита командной строки для определения и печати атрибутов блочных устройств.

chattr

Изменяет атрибуты файла в файловой системе ext2, а также ext3 файловой системы - журналируемой версии ext2 файловой системы.

compile_et

Компилятор таблицы ошибок. Он конвертирует таблицу названий кодов ошибок и сообщений в исходный код на C для использования с библиотекой com_err.

debugfs

Отладчик файловой системы. Он может использоваться для проверки и изменения состояния файловой системы ext2.

dumpe2fs

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

e2fsck

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

e2image

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

e2label

Возвращает или изменяет метку тома на файловой системе ext2 на указанном устройстве.

findfs

Ищет файловую систему по метке тома или UUID.

fsck

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

fsck.ext2

По умолчанию проверяет файловые системы ext2.

fsck.ext3

По умолчанию проверяет файловые системы ext3.

logsave

Сохраняет вывод команды в лог-файл.

lsattr

Выводит список атрибутов файлов на файловой системе ext2.

mk_cmds

Конвертирует таблицу команд и справочных сообщений в исходники на C для использования с библиотекой libss.

mke2fs

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

mkfs.ext2

По умолчанию создает ext2 файловую систему

mkfs.ext3

По умолчанию создает ext3 файловую систему

mklost+found

Используется для создания директории lost+found на файловой системе ext2; Он заранее выделяет блоки для этой директории для нужд e2fsck.

resize2fs

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

tune2fs

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

uuidgen

Создает новый универсальный уникальный идентификатор (universally unique identifier - UUID). Этот новый UUID будет уникальным среди всех созданных UUID на локальной или другой системе в прошлом и будущем.

libblkid

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

libcom_err

Содержит правила вывода стандартных ошибок.

libe2p

Используется dumpe2fs, chattr и lsattr

libext2fs

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

libss

Используется debugfs

libuuid

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


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.38. File-4.10

File является утилитой для определения типа файла.

Расчетное время сборки 0.1 SBU

Требуемое место на диске 6.3 MB

File - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make, Sed и Zlib

6.38.1. Инсталируем File

Подготавливаем File для компиляции:

./configure --prefix=/usr

Компилируем пакет

make

Устанавливаем пакет

make install

6.38.2. Описание File

Проинсталированные программы: file

Проинсталированные библиотеки: libmagic.[a,so]

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

file

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

libmagic

Описывает шаблоны для распознавания чисел, используется программой file


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.19. Findutils-4.1.20

Пакет Findutils содержит программы для поиска файлов, в том числе "на лету" (путем рекурсивного поиска от директории и показывая только файлы удовлетворяющие параметрам поиска) или поиск через бызу данных.

Расчетное время сборки 0.2 SBU

Требуемое место на диске 7.5 MB

Findutils - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make и Sed

6.19.1. Инсталируем Findutils

Подготавливаем Findutils для компиляции:

./configure --prefix=/usr --libexecdir=/usr/lib/locate \
    --localstatedir=/var/lib/locate

Директива localstatedir, указанная выше, меняет положение базы данных locate на /var/lib/locate для FHS-совместимости.

Компилируем пакет

make

Для проверки результата вводим: make check.

Устанавливаем пакет

make install

6.19.2. Описание Findutils

Проинсталированные программы: bigram, code, find, frcode, locate, updatedb и xargs

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

bigram

Ранее использовался для создания баз данных locate

code

Ранее использовался для создания баз данных locate; это предшественник frcode.

find

Поиск файлов, удовлетворяющих особым критериям, по дереву директорий

frcode

Вызывается программой updatedb для сжатия списка файлов; компрессия уменьшает размер базы данных в четыре-пять раз.

locate

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

updatedb

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

xargs

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


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.29. Flex-2.5.31

Пакет Flex используется для генерации программ, которые могут обрабатывать шаблоны в тексте.

Расчетное время сборки 0.1 SBU

Требуемое место на диске 3.4 MB

Flex - зависимости установки: Bash, Binutils, Bison, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, M4, Make и Sed

6.29.1. Инсталируем Flex

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

6.29.2. Описание Flex

Проинсталированные программы: flex, flex++ (ссылка на flex) и lex

Проинсталированные библиотеки: libfl.a

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

flex

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

flex++

Запрашивает версию flex которая используется исключительно для сканеров C++

lex

Скрипт, который запускает flex в режиме эмуляции lex

libfl.a

Библиотека flex


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.20. Gawk-3.1.4

Gawk является вариантом awk, который используется для манипуляций с текстовыми файлами.

Расчетное время сборки 0.2 SBU

Требуемое место на диске 17 MB

Gawk - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make и Sed

6.20.1. Инсталируем Gawk

Подготавливаем Gawk для компиляции:

./configure --prefix=/usr --libexecdir=/usr/lib

Компилируем пакет

make

Для проверки результата вводим: make check.

Устанавливаем пакет

make install

6.20.2. Описание Gawk

Проинсталированные программы: awk (ссылка на gawk), gawk, gawk-3.1.4, grcat, igawk, pgawk, pgawk-3.1.4 и pwcat

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

awk

Ссылка на gawk

gawk

Используется для манипуляций с текстовыми файлами.; это GNU реализация awk

gawk-3.1.4

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

grcat

Распечатывает базу данных групп /etc/group

igawk

Дает gawk способность включать файлы

pgawk

Профилированная версия gawk

pgawk-3.1.4

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

pwcat

Распечатывает базу данных паролей /etc/passwd


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.14. GCC-3.4.1

Пакет GCC содержит коллекцию компилятора GNU, включая компиляторы C и C++.

Расчетное время сборки 11.7 SBU

Требуемое место на диске 294 MB

GCC - зависимости установки: Bash, Binutils, Coreutils, Diffutils, Findutils, Gawk, Gettext, Glibc, Grep, Make, Perl, Sed и Texinfo

6.14.1. Инсталируем GCC

Этот пакет известен своим нестабильным поведением при компиляции с измененными опциями оптимизации (включая опции -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
[Important]

Важно

В этой части тестирование 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
[Note]

Замечание

В этом месте рекомендуется повторить тест из части 6.12, “Переустановка средств”. Если тест не прошел, то, скорее всего, вы применили патч GCC Specs из Главы5.

6.14.2. Описание GCC

Проинсталированные программы: c++, cc (link to gcc), cpp, g++, gcc, gccbug и gcov

Проинсталированные библиотеки: libgcc.a, libgcc_eh.a, libgcc_s.so, libstdc++.[a,so] и libsupc++.a

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

cc

C компилятор

cpp

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

c++

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

g++

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

gcc

C компилятор

gccbug

Скрипт, применяемый для облегчения создания сообщений об ошибках

gcov

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

libgcc

Описывает run-time поддержку для gcc

libstdc++

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

libsupc++

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


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.30. Gettext-0.14.1

Пакет Gettext используется для интернационализации и локализации. Программы могут быть скомпилированы с Поддержкой Родного Языка (Native Language Support - NLS) для получения возможности вывода сообщений на языке пользователя.

Расчетное время сборки 0.5 SBU

Требуемое место на диске 55 MB

Gettext - зависимости установки: Bash, Binutils, Bison, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make и Sed

6.30.1. Инсталируем Gettext

Подготавливаем Gettext для компиляции:

./configure --prefix=/usr

Компилируем пакет

make

Для проверки результата вводим: make check.

Тестирование Gettext занимает много времени, около 7 SBU.

Устанавливаем пакет

make install

6.30.2. Описание Gettext

Проинсталированные программы: 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]

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

autopoint

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

config.charset

Выводит системо-зависимую таблицу кодов символов.

config.rpath

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

envsubst

Заменяет переменные окружения в строки в формате shell.

gettext

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

gettextize

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

hostname

Возвращает сетевое имя хоста в разных форматах.

msgattrib

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

msgcat

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

msgcmp

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

msgcomm

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

msgconv

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

msgen

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

msgexec

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

msgfilter

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

msgfmt

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

msggrep

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

msginit

Создает новый файл .po, инициализирует мета-информацию с переменными из пользовательского окружения.

msgmerge

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

msgunfmt

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

msguniq

Унифицирует дублирующиеся переводы в каталоге переводов.

ngettext

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

xgettext

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

libasprintf

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

libgettextlib

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

libgettextpo

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

libgettextsrc

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


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.11. Glibc-2.3.4-20040701

Glibc является библиотекой C, которая обеспечивает системные вызовы и основные функции, такие как open, malloc, printf и т.д. Библиотека C используется для всех динамически скомпонованых программ.

Расчетное время сборки 12.3 SBU

Требуемое место на диске 784 MB

Glibc - зависимости установки: Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Gettext, Grep, Make, Perl, Sed и Texinfo

6.11.1. Инсталируем Glibc

Этот пакет известен своим нестабильным поведением при компиляции с измененными опциями оптимизации (включая опции -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

Описание новых опций конфигурации:

--libexecdir=/usr/lib/glibc

Изменяем место установки программы pt_chown из места по умолчанию /usr/libexec в директорию /usr/lib/glibc.

Компилируем пакет

make
[Important]

Важно

В этом месте тестирование 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

6.11.2. Конфигурация Glibc

Нам нужно создать файл /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).

Описание параметров:

--remove-destination

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

6.11.3. Настройка динамического загрузчика

По умолчанию, динамический загрузчик (/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

6.11.4. Описание Glibc

Проинсталированные программы: 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]

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

catchsegv

Может быть использована для трассировки стэка, когда программа прервана с ошибкой сегментации

gencat

Генерирует каталоги сообщений

getconf

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

getent

Получает содержимое из административной базы данных

iconv

Осуществляет конвертацию символов

iconvconfig

Создает быстро загружаемый iconv модуль конфигурационных файлов

ldconfig

Конфигурирует динамический компоновщик

ldd

Сообщает, какие разделяемые библиотеки требуются каждой указанной программе или разделяемой библиотеке

lddlibc4

Помагает ldd в работе с объектными файлами

locale

Говорит компилятору разрешить или запретить использование POSIX локалей для встроенных операций

localedef

Компилирует спецификации локалей

mtrace

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

nscd

Демон, который обеспечивает кэш для большинства известных имен запросов сервисов

nscd_nischeck

Проверяет, необходим или нет безопасный режим для NIS+lookup

pcprofiledump

Распечатывает информацию, сгенерированную PC profiling

pt_chown

Программа-помощник к grantpt для установки владельца, группы и прав доступа ведомого псевдо терминала

rpcgen

Генерирует C код для встраивания в протокол вызова удаленной процедуры (Remote Procecure Call - RPC)

rpcinfo

Создает вызов RPC к RPC серверу

sln

Статически слинкованная программаln

sprof

Читает и показывает профильные данные разделяемого объекта

tzselect

Спрашивает пользователя о местоположении системы и выдает соответствующее описание часового пояса

xtrace

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

zdump

Информация о часовом поясе

zic

Компилятор часовых поясов

ld.so

Программа-загрузчик для разделяемых библиотек

libBrokenLocale

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

libSegFault

Библиотека сигналов ошибки сегментации

libanl

Библиотека поиска асинхронных имен

libbsd-compat

Предоставляет совместимость, необходимую для запуска Berkey Software Distribution (BSD) программ под Linux

libc

Базовая библиотека C

libcrypt

Криптографическая библиотека

libdl

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

libg

Библиотека для g++

libieee

Библиотека для работы с числами с плавающей запятой Института "Electrical and Electronic Engineers" (IEEE)

libm

Математическая библиотека

libmcheck

Описывает запуск кода при загрузке

libmemusage

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

libnsl

Библиотека сетевых сервисов

libnss

Библиотека Name Service Switch, описывающая функции для разбора имен хостов, имен пользователей, имен групп, алиасов, сервисов, протоколов и т.д.

libpthread

Библиотека POSIX-нитей

libresolv

Описывает функции для создания, посылки и интерпритации пакетов к серверам имен интернет

librpcsvc

Описывает функции, предоставляющие разнообразные RPC сервисы

librt

Описывает функции, предоставляющие большинство из интерфейсов, специфицированных POSIX.1b Realtime Extension

libthread_db

Описывает функции, полезные для построения отладчиков для multi-threaded программ

libutil

Описывает код для “стандартных” функций, используемых во многих других Юникс утилитах


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.44. Grep-2.5.1

Grep является программой для поиска в содержимом файлов.

Расчетное время сборки 0.1 SBU

Требуемое место на диске 5.8 MB

Grep - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Make, Sed и Texinfo

6.44.1. Инсталируем Grep

Подготавливаем Grep для компиляции:

./configure --prefix=/usr --bindir=/bin --with-included-regex

Компилируем пакет

make

Для проверки результата вводим: make check.

Устанавливаем пакет

make install

6.44.2. Описание Grep

Проинсталированные программы: egrep (ссылка на grep), fgrep (ссылка на grep) и grep

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

egrep

Печатает строки, содержащие искомый расширенный шаблон

fgrep

Печатает строки, содержащие список фиксированных отрывков строк

grep

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


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.27. Groff-1.19.1

Пакет Groff содержит некоторые программы для обработки и форматирования текста.

Расчетное время сборки 0.5 SBU

Требуемое место на диске 43 MB

Groff - зависимости установки: Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make и Sed

6.27.1. Инсталируем Groff

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

6.27.2. Описание Groff

Проинсталированные программы: 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)

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

addftinfo

Читает файл шрифта troff и добавляет некоторую дополнительную фонт-метрическую информацию, которая используется системой groff

afmtodit

Создает файл шрифта для использования с groff и grops

eqn

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

eqn2graph

Конвертирует troff EQN (выравнивание) в точечное изображение

eqn

Ссылка на eqn

grn

groff препроцессор для файлов в формате gremlin

grodvi

Драйвер для groff, который предоставляет формат TeX dvi

groff

Оболочка для системы форматирования документов groff; обычно он запускает программу troff и пост-обработчик присваивается для выбранного устройства

groffer

Показывает файлы groff и документы в формате man на X и tty терминалах

grog

Читает файлы и определяет, какие из опций groff-e, -man, -me, -mm, -ms, -p, -s и -t необходимы для печати файлов и сообщает groff команду, включающую эти опции

grolbp

Это groff драйвер для принтеров Canon CAPSL (лазерные принтеры серий LBP-4 and LBP-8)

grolj4

Драйвер для groff, который обеспечивает вывод в формате PCL5 для принтера, совместимого с HP Laserjet 4

grops

Переводит вывод GNU troff в PostScript

grotty

Переводит вывод GNU troff в форму, подходящую для символьно-печатающих устройств

gtbl

GNU реализация tbl

hpftodit

Создает файл шрифта для использования с groff -Tlj4 из HP-tagged файла метрического шрифта

indxbib

Создает инвертированный индекс для библиографических баз данных с специфицированным файлом для использования с refer, lookbib и lkbib

lkbib

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

lookbib

Печатает приглашение на устройство стандартной ошибки (если устройство стандартного ввода не терминал), читает строку, содержащую установку ключевых слов с устройства стандартного ввода, ищет библиографические базы данных в специфицированном файле для поиска ссылок, содержащих эти ключевые слова, печатает любые найденные ссылки на устройство стандартного вывода и повторяет этот процесс до окончания ввода

mmroff

Простой препроцессор для groff

neqn

Форматирует выравнивание для American Standard Code для Information Interchange (ASCII) вывода

nroff

Скрипт, эмулирующий команду nroff, используя groff

pfbtops

Транслирует PostScript шрифт в формате .pfb в ASCII

pic

Компилирует описания изображений, встроенные во входные файлы troff или TeX в команды, понимаемые TeX или troff

pic2graph

Конвертирует диаграммы PIC в растровые изображения

post-grohtml

Переводит вывод GNU troff в html

pre-grohtml

Переводит вывод GNU troff в html

refer

Копирует содержание файла на устройство стандартного вывода, исключая строки между .[ и .], интерпретированные как цитаты, и строки между .R1 и .R2, интерпретированные как команды, так как цитаты должны быть обработаны

soelim

Читает файлы и заменяет строки в форме .so файла по содержанию запомненного файла

tbl

Компилирует описания таблиц, встроенные во входные файлы troff в команды, понимаемые troff

tfmtodit

Создает файл шрифта для использования с groff -Tdvi

troff

Наиболее совместимый с Unix troff; обычно помагает использованию команды groff, которая будет также запускать препроцессор и постпроцессор в порядке присвоения и в присвоении опций

zsoelim

GNU реализация soelim


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.45. Grub-0.95

Пакет Grub содержит загрузчик.

Расчетное время сборки 0.2 SBU

Требуемое место на диске 10 MB

Grub - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make, Ncurses и Sed

6.45.1. Инсталируем Grub

Этот пакет известен своим нестабильным поведением при компиляции с измененными опциями оптимизации (включая опции -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.

6.45.2. Описание Grub

Проинсталированные программы: grub, grub-install, grub-md5-crypt, grub-terminfo и mbchk

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

grub

Командная оболочка загрузчиеа

grub-install

Инсталирует GRUB на выбранное устройство

grub-md5-crypt

Шифрует пароль в формате MD5

grub-terminfo

Генерирует terminfo команду из имени terminfo; может быть использован если будет задействован неизвестный терминал

mbchk

Проверяет формат мультизагрузочного ядра


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.46. Gzip-1.3.5

Пакет Gzip содержит программы для сжатия и распаковки файлов.

Расчетное время сборки 0.1 SBU

Требуемое место на диске 2.6 MB

Gzip - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make и Sed

6.46.1. Инсталируем Gzip

Подготавливаем 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

6.46.2. Описание Gzip

Проинсталированные программы: gunzip (ссылка на gzip), gzexe, gzip, uncompress (ссылка на gunzip), zcat (ссылка на gzip), zcmp, zdiff, zegrep, zfgrep, zforce, zgrep, zless, zmore и znew

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

gunzip

Распаковывает gzip-файлы

gzexe

Создает самораспаковывающиеся файлы

gzip

Сжимает файлы, используя кодирование Lempel-Ziv (LZ77)

uncompress

Распаковывает сжатые файлы

zcat

Распаковывает gzip-файлы на устройство стандартного вывода

zcmp

Запускает cmp на gzip-файлах

zdiff

Запускает diff на gzip-файлах

zegrep

Запускает egrep на gzip-файлах

zfgrep

Запускает fgrep на gzip-файлах

zforce

Принудительно устанавливает расширение .gzна всех выбранных gzip-файлах, поэтому gzip не будет сжимать их опять; это может быть полезно, когда имя файла было изменено во время передачи файла

zgrep

Запускает grep на gzip-файлах

zless

Запускает less на gzip-файлах

zmore

Запускает more на gzip-файлах

znew

Пересжимает файлы из формата compress в формат gzip - .Z в .gz


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.18. Iana-Etc-1.01

Iana-Etc содержит данные для сетевых сервисов и протоколов

Расчетное время сборки 0.1 SBU

Требуемое место на диске 641 KB

Iana-Etc - зависимости установки: Make

6.18.1. Инсталируем Iana-Etc

Разбираем данные:

make

Устанавливаем пакет

make install

6.18.2. Описание Iana-Etc

Проинсталированные файлы: /etc/protocols и /etc/services

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

/etc/protocols

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

/etc/services

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


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.28. Sed-4.1.2

Sed является редактором потоков.

Расчетное время сборки 0.2 SBU

Требуемое место на диске 5.2 MB

Sed - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make и Texinfo

6.28.1. Инсталируем Sed

Подготавливаем Sed для компиляции:

./configure --prefix=/usr --bindir=/bin

Компилируем пакет

make

Для проверки результата вводим: make check.

Устанавливаем пакет

make install

6.28.2. Описание Sed

Проинсталированные программы: sed

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

sed

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


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.56. Tar-1.14

Tar является программой архивирования

Расчетное время сборки 0.2 SBU

Требуемое место на диске 10 MB

Tar - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make и Sed

6.56.1. Инсталируем Tar

Подготавливаем Tar для компиляции:

./configure --prefix=/usr --bindir=/bin --libexecdir=/usr/sbin

Компилируем пакет

make

Для проверки результата вводим: make check.

Устанавливаем пакет

make install

6.56.2. Описание Tar

Проинсталированные программы: rmt и tar

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

rmt

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

tar

Сохраняет и распаковывает файлы в и из архивов, извесных как файлы tar (тарболы, tarballs)


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.24. M4-1.4.2

Пакет M4 является макро процессором.

Расчетное время сборки 0.1 SBU

Требуемое место на диске 3.0 MB

M4 - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Perl и Sed

6.24.1. Инсталируем M4

Подготавливаем M4 для компиляции:

./configure --prefix=/usr

Компилируем пакет

make

Для проверки результата вводим: make check.

Устанавливаем пакет

make install

6.24.2. Описание M4

Проинсталированные программы: m4

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

m4

Копирует ввод на вывод, используя макросы. Макросы могут быть как встроеными, так и пользовательскими и могут иметь несколько аргументов. Помимо макро-преобразований, m4 имеет встроеные функции для включения именованых файлов, запуска команд Unix, целочисленной арифметики, разносторонними манипуляциями с текстом, рекурсию и др. Программа m4 может использоваться в качестве front-end для компиляторов или как макропроцессор на ваше усмотрение.


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.21. Ncurses-5.4

Пакет Ncurses содержит библиотеки для расширения возможностей текстового интерфейса, включая панели и меню.

Расчетное время сборки 0.6 SBU

Требуемое место на диске 27 MB

Ncurses - зависимости установки: Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make и Sed

6.21.1. Инсталируем Ncurses

Подготавливаем 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

6.21.2. Описание Ncurses

Проинсталированные программы: 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]

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

captoinfo

Конвертирует описание termcap в описание terminfo

clear

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

infocmp

Сравнивает или печатает описания terminfo

infotocap

Конвертирует описание terminfo в описание termcap

reset

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

tack

Проверяет действия terminfo. Он главным образом используется для тестирования корректировок элементов базы данных terminfo

tic

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

toe

Выводит список всех доступных типов терминалов по их имени и описанию

tput

Делает информаию о терминале доступной шеллу. Он также может использоваться для сброса или инициализации терминала или показа его полного имени

tset

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

libcurses

Ссылка на libncurses

libncurses

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

libform

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

libmenu

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

libpanel

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


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.33. Perl-5.8.5

Пакет Perl содержит perl, язык практичной обработки и отчетов (Practical Extraction and Report Language).

Расчетное время сборки 2.9 SBU

Требуемое место на диске 143 MB

Perl - зависимости установки: Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make и Sed

6.33.1. Инсталируем Perl

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

./configure.gnu --prefix=/usr -Dpager="/bin/less -isR"

Описание опций конфигурации:

-Dpager="/bin/less -isR"

Корректирует ошибку в коде perldoc, связанную с работой программы less.

Компилируем пакет

make

Для проведения теста необходимо создать базовый файл /etc/hosts, необходимый для пары тестов, использующих имя localhost:

echo "127.0.0.1 localhost $(hostname)" > /etc/hosts

Теперь, если хотите, запустим тест:

make test

Устанавливаем пакет

make install

6.33.2. Описание Perl

Проинсталированные программы: 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

Проинсталированные библиотеки: слишком много названий для перечисления

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

a2p

Переводит awk в perl

c2ph

Делает дамп структур C, генерируемых cc -g -S

dprofpp

Отображает данные профиля perl

en2cxs

Собирает расширение Perl для модулей Encode из таблиц символов Unicode или файлов кодировки Tcl

find2perl

Транслирует команды find в Perl

h2ph

Конвертирует файлы заголовков .h C в файлы заголовков .ph для Perl

h2xs

Конвертирует файлы заголовков .h C в расширения Perl

libnetcfg

Может использоваться для настройки libnet

perl

Сочетает достоинства C, sed, awk и sh в одном мощном языке

perl5.8.5

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

perlbug

Используется для генерации отчетов об ошибках в Perl или в поставляемых с ним модулях и их отправки по E-mail

perlcc

Генерирует исполняемые файлы из программ Perl

perldoc

Выводит часть документации в формате pod, которая расположена в дереве установки perl или в скриптах perl

perlivp

Процедура верификации инсталяции Perl; может быть использована для проверки корректности установки Perl и его библиотек

piconv

Perl-реализация конвертера кодировок iconv

pl2pm

Средство для конвертирования файлов Perl4 .pl в модули Perl5 .pm

pod2html

Конвертирует файлы из формата pod в формат HTML

pod2latex

Конвертирует файлы из формата pod в формат LaTeX

pod2man

Конвертирует данные pod в форматированый вывод *roff

pod2text

Конвертирует данные pod в форматированый текст ASCII

pod2usage

Печатает сообщения usage из документов pod в файлах

podchecker

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

podselect

Отображает выбранную часть документации pod

psed

Perl-реализация редактора потоков sed

pstruct

Делает дамп C-структур, генерируемых cc -g -S

s2p

Транслирует sed в perl

splain

Используется для пропуска полных диагностических сообщений perl

xsubpp

Конвертирует Perl XS код в код на языке C


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.57. Udev-030

Пакет Udev содержит программы для динамического создания нод устройств.

Расчетное время сборки 0.2 SBU

Требуемое место на диске 5.2 MB

Udev - зависимости установки: Coreutils и Make

6.57.1. Инсталируем Udev

Компилируем пакет

make udevdir=/dev
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

6.57.2. Описание Udev

Проинсталированные программы: udev, udevd, udevsend, udevstart, udevinfo и udevtest

Инсталированная директория: /etc/udev

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

udev

Создает ноды устройств в /dev или переименовавает сетевые интерфейсы (не в LFS), отвечая на запросы hotplug

udevd

Демон, который упорядочивает запросы hotplug перед передачей их udev, таким образом мы избегаем некоторых неопределенных состояний

udevsend

Доставляет запросы hotplug к udevd

udevstart

Создает в директории /dev ноды устройств, отвечающие драйверам, вкомпилированным прямо в ядро; он выполняет задачу симулирования событий hotplug, предположительно сброшенных ядром перед вызовом этой программы (т.е., потому что корневая файловая система не будет подмонтирована) и подчиняет такое синтетическое событие hotplug к udev

udevinfo

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

udevtest

Симулирует запуск udev для выбранного устройства и печатает имя реальной ноды, которая была бы создана udev или (не в LFS) имя переименованного сетевого интерфейса

/etc/udev

Содержит конфигурационные файлы udev , права доступа к устройтсвам, и правила для именования устройств


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.48. Make-3.80

Пакет Make содержит программу для компиляции больших приложений.

Расчетное время сборки 0.2 SBU

Требуемое место на диске 8.8 MB

Make - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep и Sed

6.48.1. Инсталируем Make

Подготавливаем Make для компиляции:

./configure --prefix=/usr

Компилируем пакет

make

Для проверки результата вводим: make check.

Устанавливаем пакет

make install

6.48.2. Описание Make

Проинсталированные программы: make

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

make

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


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.10. Man-pages-1.67

Пакет Man-pages содержит более 1200 man-страниц.

Расчетное время сборки 0.1 SBU

Требуемое место на диске 15 MB

Man-pages - зависимости установки: Bash, Coreutils и Make

6.10.1. Инсталируем Man-pages

Установим Man-pages запуском:

make install

6.10.2. Описание Man-pages

Проинсталированные файлы: различные man-страницы

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

man-страницы

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


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.31. Inetutils-1.4.2

Пакет Inetutils содержит сетевые клиенты и серверы.

Расчетное время сборки 0.2 SBU

Требуемое место на диске 11 MB

Inetutils - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make, Ncurses и Sed

6.31.1. Инсталируем Inetutils

Пакет 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

Описание параметров конфигурации:

--disable-logger

Этот параметр запрещает inetutils установку программы ведения логов, которая использует скрипты для отправки сообщений System Log Daemon. Мы не устанавливаем его потому, что Util-linux установит потом лучшую версию этой программы.

--disable-syslogd

Этот параметр запрещет inetutils установку System Log Daemon, который мы установим с пакетом Sysklogd.

--disable-whois

Этот параметр отключает сборку whois клиента, который является сильно устаревшим. Инструкции по установке лучшей версии клиента whois вы найдете в книге BLFS.

--disable-servers

Этот параметр отключит установку ряда сетевых серверов как части пакета Inetutils. Эти сервера не нужны на простой LFS системе. Некоторые из них являются небезопасными и могут быть запущеными только в доверенной сети. Более полную информацию можно получить на http://www.linuxfromscratch.org/blfs/view/svn/basicnet/inetutils.html. Заметьте, что есть лучшие альтернативы для многих из этих серверов.

Компилируем пакет

make

Устанавливаем пакет

make install

И переместим программу ping на ее место:

mv /usr/bin/ping /bin

6.31.2. Описание Inetutils

Проинсталированные программы: ftp, ping, rcp, rlogin, rsh, talk, telnet и tftp

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

ftp

Программа для передачи данных в сетях ARPANET

ping

Посылает пакеты echo-request и отчитывается о времени прибытия ответа

rcp

Обеспечивает удаленное копирование файлов

rlogin

Обеспечивает удаленный вход в систему

rsh

Запускает удаленный шелл

talk

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

telnet

Интерфейс для протокола TELNET

tftp

Простая программа передачи файлов


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.32. Iproute2-2.6.8-040823

Пакет Iproute2 содержит программы для базовой и расширенной IPV4 сети.

Расчетное время сборки 0.1 SBU

Требуемое место на диске .6 MB

Iproute2 - зависимости установки: GCC, Glibc, Make, Linux-Headers и Sed

6.32.1. Инсталируем Iproute2

Бинарник 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

Описание параметров сборки:

SBINDIR=/sbin

Будем устанавливать бинарники Iproute2 в /sbin. Это корректное положение согласно требованиям FHS потому, что некоторые из бинарников Iproute2 используются в загрузочных скриптах.

Устанавливаем пакет

make SBINDIR=/sbin install

6.32.2. Описание Iproute2

Проинсталированные программы: ifstat, ip, nstat, routef, routel, rtmon, rtstat, ss и tc.

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

ifstat

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

ip

Основная исполнямая программа. Она имеет несколько различных функций:

ip link [устройство] позволяет пользователям наблюдать за состоянием устройств и вносить изменения.

ip addr позволяет пользователям наблюдать за адресами и их свойствами, добавлять новые адреса и удалять старые.

ip neighbor позволяет пользователям наблюдать за соседними связями и их свойствами, добавлять новые соседние связяи и удалять старые.

ip rule позволяет пользователям наблюдать за политикой маршрутизации и менять ее.

ip route позволяет пользователям наблюдать за таблицей маршрутизации и менять правила этой таблицы.

ip tunnel позволяет пользователям наблюдать за IP тунелями, их свойствами и менять их.

ip maddr позволяет пользователям наблюдать за multicast адресами, их свойствами и менять их.

ip mroute позволяет пользователям устанавливать, менять или удалять multicast маршрутизацию.

ip monitor позволяет пользователям продолжительно наблюдать за состоянием устройств, адресами и маршрутами.

nstat

Показывает сетевую статистику.

routef

Компонент ip route. Используется для наполнения таблицы маршрутизации.

routel

Компонент ip route. Используется для листинга таблицы маршрутизации.

rtmon

Утилита мониторинга маршрутов.

rtstat

Утилита статуса маршрутов.

ss

Похожа на команду netstat; показывает активные соединения

tc

Программа для контроля трафика; служит для включений Quality Of Service (QOS) и Class Of Service (COS).

tc qdisc позволяет пользователям устанавливать дисциплину очередей.

tc class позволяет пользователям устанавливать классы, основанные на списочной дисциплине очередей.

tc estimator позволяет пользователям оценивать сетевые потоки в сети.

tc filter позволяет пользователям устанавливать QOS/COS фильтрацию пакетов.

tc policy позволяет пользователям устанавливать QOS/COS политику.


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.42. Kbd-1.12

Kbd содержит файлы раскладки клавиатуры и утилиты для нее.

Расчетное время сборки 0.1 SBU

Требуемое место на диске 12 MB

Kbd - зависимости установки: Bash, Binutils, Bison, Coreutils, Diffutils, Flex, GCC, Gettext, Glibc, Grep, Gzip, M4, Make и Sed

6.42.1. Инсталируем Kbd

Подготавливаем Kbd для компиляции:

./configure

Компилируем пакет

make

Устанавливаем пакет

make install

6.42.2. Описание Kbd

Проинсталированные программы: 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

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

chvt

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

deallocvt

Закрывает неиспользуемые виртуальные терминалы.

dumpkeys

Делает дамп таблицы преобразований клавиатуры.

fgconsole

Печатает номер активного виртуального терминала.

getkeycodes

Печатает таблицу перевода скэнкодов в коды клавиш ядра.

getunimap

Печатает используемую сейчас unimap.

kbd_mode

Возвращает или устанавливает режим клавиатуры.

kbdrate

Устанавливает время повтора и задержки нажатий клавиш.

loadkeys

Загружает таблицу преобразований клавиатуры.

loadunimap

Загружает таблицу перевода unicode-to-font ядра.

mapscrn

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

openvt

Запускает программу на новом виртуальном терминале (VT).

psfaddtable

Ссылка на psfxtable

psfgettable

Ссылка на psfxtable

psfstriptable

Ссылка на psfxtable

psfxtable

Берет Unicode таблицу символов для консольных шрифтов

resizecons

Изменяет установленные ядром размеры консоли.

setfont

Изменяет шрифт EGA/VGA на консоли.

setkeycodes

Загружает таблицу скэнкодов в коды клавиш, используемую если у вас есть неиспользуемые клавиши на клавиатуре.

setleds

Устанавливает флаги клавиатуры и LED (светодиоды).

setlogcons

Отсылает сообщения ядра на консоль.

setmetamode

Определяет метауправление клавиатурой.

setvesablank

Позволяет испльзовать встроеный аппаратный пустой хранитель экрана (без изображений, просто пустой экран).

showconsolefont

Показывает текущий EGA/VGA экранный шрифт консоли.

showkey

Возвращает скэнкоды и коды клавиш, а также ASCII-коды нажтых на клавиатуре клавиш.

unicode_start

Включает на консоли и клавиатуре режим unicode. Никогда не используйте это в LFS, так как приложения не сконфигурированы с поддержкой UNICODE.

unicode_stop

Возвращает консоль и клавиатуру из режима unicode.


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.26. Less-382

Less является просмотрщиком текстовых файлов.

Расчетное время сборки 0.1 SBU

Требуемое место на диске 3.4 MB

Less - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make, Ncurses и Sed

6.26.1. Инсталируем Less

Подготавливаем Less для компиляции:

./configure --prefix=/usr --bindir=/bin --sysconfdir=/etc

Описание опций конфигурации:

--sysconfdir=/etc

Этот параметр укажет, что надо создавать программы с файлами конфигурации в /etc.

Компилируем пакет

make

Устанавливаем пакет

make install

6.26.2. Описание Less

Проинсталированные программы: less, lessecho и lesskey

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

less

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

lessecho

Нужен для расширеных метасимволов, таких как * и ? в именах файлов на системах Unix.

lesskey

Используется для определения управляющих клавиш less.


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.39. Libtool-1.5.8

GNU libtool является общей библиотекой поддержки скриптов. Libtool скрывает сложность использования системных библиотек обеспечивая совместимый, портируемый интерфейс.

Расчетное время сборки 1.5 SBU

Требуемое место на диске 20 MB

Libtool - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make и Sed

6.39.1. Инсталируем Libtool

Подготавливаем Libtool для компиляции:

./configure --prefix=/usr

Компилируем пакет

make

Для проверки результата вводим: make check.

Устанавливаем пакет

make install

6.39.2. Описание Libtool

Проинсталированные программы: libtool и libtoolize

Проинсталированные библиотеки: libltdl.[a,so]

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

libtool

Предоставляет общие сервисы сборки библиотек.

libtoolize

Предоставляет стандартные средства для включения поддержки libtool в пакет.

libltdl

Скрывает различные сложности библиотек dlopen.


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.47. Man-1.5o

Man является просмотрщиком man-страниц.

Расчетное время сборки 0.1 SBU

Требуемое место на диске 1.9MB

Man - зависимости установки: Bash, Binutils, Coreutils, Gawk, GCC, Glibc, Grep, Make и Sed

6.47.1. Инсталируем Man

Мы собираемся сделать три дополнения к исходникам 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

Описание параметров конфигурации:

-confdir=/etc

Программа man будет искать файл конфигурации man.conf в директории /etc.

Компилируем пакет

make

Устанавливаем пакет

make install
[Note]

Замечание

Для отключения 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.

6.47.2. Описание Man

Проинсталированные программы: apropos, makewhatis, man, man2dvi, man2html и whatis

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

apropos

Ищет в базе данных whatis и отображает краткое описание системной команды, которое содержит указанную строку.

makewhatis

Создает базу данных whatis. Он рассматривает все страницы документации man в соответствующих путях и добавляет запись команды и ее краткого описания в базу данных whatis.

man

Форматирует и отображает запрошенную man-страницу.

man2dvi

Конвертирует man-страницу в формат dvi.

man2html

Конвертирует man-страницу в html.

whatis

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


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.17. Mktemp-1.5

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

Расчетное время сборки 0.1 SBU

Требуемое место на диске 317 KB

Mktemp - зависимости установки: Coreutils, Make и Patch

6.17.1. Инсталируем Mktemp

Многие скрипты все еще используют программу tempfile, которая функционально похожа на mktemp. Пропатчим Mktemp для включения оболочки tempfile:

patch -Np1 -i ../mktemp-1.5-add_tempfile-1.patch

Подготавливаем Mktemp для компиляции:

./configure --prefix=/usr --with-libc

Описание опций конфигурации:

--with-libc

Это говорит программе mktemp использовать системные функции библиотеки С mkstemp и mkdtemp.

Компилируем пакет

make

Устанавливаем пакет

make install
make install-tempfile

6.17.2. Описание Mktemp

Проинсталированные программы: mktemp и tempfile

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

mktemp

Создает временные файлы в безопасном режиме; используется в скриптах.

tempfile

Создает временные файлы в менее безопасном режиме, чем mktemp; устанавливается для обратной совместимости.


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.50. Patch-2.5.4

Программа Patch содержит программу для модификации файлов.

Расчетное время сборки 0.1 SBU

Требуемое место на диске 1.9 MB

Patch - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make и Sed

6.50.1. Инсталируем Patch

Подготавливаем Patch к компиляции. Флаг препроцессора -D_GNU_SOURCE нужен только на платформах PowerPC. На других платформах вы можете его пропустить.

CPPFLAGS=-D_GNU_SOURCE ./configure --prefix=/usr

Компилируем пакет

make

Устанавливаем пакет

make install

6.50.2. Описание Patch

Проинсталированные программы: patch

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

patch

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


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.51. Procps-3.2.3

Пакет Procps содержит программы для мониторинга системных процессов.

Расчетное время сборки 0.1 SBU

Требуемое место на диске 6.2 MB

Procps - зависимости установки: Bash, Binutils, Coreutils, GCC, Glibc, Make и Ncurses

6.51.1. Инсталируем Procps

Компилируем пакет

make

Устанавливаем пакет

make install

6.51.2. Описание Procps

Проинсталированные программы: free, kill, pgrep, pkill, pmap, ps, skill, snice, sysctl, tload, top, uptime, vmstat, w и watch

Проинсталированные библиотеки: libproc.so

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

free

Возвращает информацию о свободной и используемой памяти в системе, как физической, так и виртуальной.

kill

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

pgrep

Выводит список процессов, отфильтрованный по именам и другим атрибутам.

pkill

Посылает сигналы процессам по их имени или другим атрибутам.

pmap

Возвращает карту памяти указанного процесса.

ps

Выводит список текущих процессов.

skill

Посылает сигналы процессам, попадающим под критерий.

snice

Изменяет приоритет выполнения процессов, соответствующих критериям.

sysctl

Модифицирует параметры ядра во время его работы.

tload

Отображает график загрузки системы.

top

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

uptime

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

vmstat

Отображает статистику виртуальной памяти, включая информацию о процессах, памяти, страницах, блоках ввода-вывода, прерываниях и активности CPU.

w

Показывает сколько пользователей подключено к системе, где и как они подключились.

watch

Циклически выполняет указанную команду, выводя ее первый полный экран вывода. Это позволяет контролировать вывод все время.

libproc

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


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.52. Psmisc-21.5

Пакет Psmisc содержит программы для отображения информации о процессах.

Расчетное время сборки 0.1 SBU

Требуемое место на диске 2.2 MB

Psmisc - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Ncurses и Sed

6.52.1. Инсталируем Psmisc

Подготавливаем Psmisc для компиляции:

./configure --prefix=/usr --exec-prefix=""

Описание параметров конфигурации:

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

6.52.2. Описание Psmisc

Проинсталированные программы: fuser, killall, pstree и pstree.x11 (ссылка на pstree)

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

fuser

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

killall

Убивает процессы по имени. Он посылает сигнал всем процессам, запущенным одной из указанных команд.

pstree

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

pstree.x11

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


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.53. Shadow-4.0.4.1

Пакет Shadow содержит программы для усиления безопасности системных паролей.

Расчетное время сборки 0.4 SBU

Требуемое место на диске 11 MB

Shadow - зависимости установки: Bash, Binutils, Bison, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make и Sed

6.53.1. Инсталируем Shadow

Подготавливаем 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

6.53.2. Настройка Shadow

Этот пакет содержит утилиты для модификации паролей пользователей, добавления или удаления пользователей и групп и тому подобные. Мы не собираемся объяснять здесь что такое скрытие паролей (password shadowing). Полное объяснение можно найти в файле doc/HOWTO в распакованой директории с исходниками Shadow. Сдесь мы опишем только то, что вам понадобится, если вы захотите использовать поддержку Shadow: программы, которые должны проверять пароли (к примеру: xdm, демоны ftp, демоны pop3) должны будут компилироваться с поддержкой 'shadow-совместимости', что надо для использования работы со скрытыми паролями.

Для использования скрытых паролей, запустите команду:

pwconv

А для использования скрытых групп, выполните:

grpconv

При нормальных обстоятельствах, вам пока нет надобности создавать пароли. Запомните, что если вы решите вернуться к этой главе для включения скрытия паролей, вам надо будет сбросить пароли всех пользователей командой passwd и пароли всех групп командой gpasswd.

6.53.3. Установка пароля root

Выберите пароль для пользователя root и установите его командой:

passwd root

6.53.4. Описание Shadow

Проинсталированные программы: 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]

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

chage

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

chfn

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

chpasswd

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

chsh

Используется для изменения шелла пользователя по умолчанию.

expiry

Проверяет и изменяет правила использования паролей.

faillog

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

gpasswd

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

groupadd

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

groupdel

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

groupmod

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

groups

Возвращает группы, членом которых является указанный пользователь.

grpck

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

grpconv

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

grpunconv

Обновляет /etc/group из /etc/gshadow и затем удаляет последний.

lastlog

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

login

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

logoutd

Демон, контролирующий время регистрации и порты.

mkpasswd

Шифрует указанный пароль указанным алгоритмом.

newgrp

Используется для изменения текущего GID.

newusers

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

passwd

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

pwck

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

pwconv

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

pwunconv

Обновляет /etc/passwd из /etc/shadow и затем удаляет последний.

sg

Выполняет указанную команду с правами группы с указанным GID.

su

Запускает shell с заменой пользователя и ID группы.

useradd

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

userdel

Удаляет указанный пользовательский аккаунт.

usermod

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

vigr

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

vipw

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

libshadow

Содержит функции, используемые большинством программ этого пакета.


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.54. Sysklogd-1.4.1

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

Расчетное время сборки 0.1 SBU

Требуемое место на диске 0.5 MB

Sysklogd - зависимости установки: Binutils, Coreutils, GCC, Glibc и Make

6.54.1. Инсталируем Sysklogd

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

6.54.2. Настройка Sysklogd

Создадим новый файл /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

6.54.3. Описание Sysklogd

Проинсталированные программы: klogd и syslogd

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

klogd

Системный демон для перехвата и протоколирования сообщений ядра.

syslogd

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


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.55. Sysvinit-2.85

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

Расчетное время сборки 0.1 SBU

Требуемое место на диске 0.9 MB

Sysvinit - зависимости установки: Binutils, Coreutils, GCC, Glibc и Make

6.55.1. Инсталируем Sysvinit

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

6.55.2. Настройка Sysvinit

Создадим новый файл /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 экранный шрифт, но это не имеет эффекта для использующих английский.

6.55.3. Описание Sysvinit

Проинсталированные программы: halt, init, killall5, last, lastb (ссылка на last), mesg, pidof (ссылка на killall5), poweroff (ссылка на halt), reboot (ссылка на halt), runlevel, shutdown, sulogin, telinit (ссылка на init), utmpdump и wall

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

halt

Обычно вызывает shutdown с параметром -h, если текущй уровень запуска не 0, затем он отдает команду ядру на отключение системы, но сначала записывает в файл /var/log/wtmp что система отключается.

init

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

killall5

Посылает сигнал всем процессам, за исключением родительских процессов - таким образом он не убьет шелл, вызвавший скрипт.

last

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

lastb

Показывает ошибки входа в систему, отмеченные в /var/log/btmp

mesg

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

pidof

Возвращает PID указанных программ.

poweroff

Передает ядру команду на отключение системы и выключение компьютера (смотри halt).

reboot

Передает ядру команду на перезагрузку системы (смотри halt).

runlevel

Возвращает предыдущий и текущий уровни запуска, последний уровень запуска записан в /var/run/utmp

shutdown

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

sulogin

Позволяет зарегистрироваться root; Обычно используется в скрипте init, когда система загружается в однопользовательском режиме.

telinit

Говорит init о необходимости смены уровня запуска.

utmpdump

Отображает содержимое указанного login-файла в удобочитаемом формате.

wall

Пишет сообщение всем подключеным пользователям.


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.22. Readline-5.0

Пакет Readline содержит библиотеку командной строки Readline.

Расчетное время сборки 0.11 SBU

Требуемое место на диске 3.8 MB

Readline - зависимости установки: Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make, Ncurses и Sed

6.22.1. Инсталируем Readline

Следующий патч устраняет проблему, при которй Readline иногда отображает только 33 символа в строке, а затем переходит на следующую строку.

patch -Np1 -i ../readline-5.0-display_wrap-1.patch

Подготавливаем Readline для компиляции:

./configure --prefix=/usr

Компилируем пакет

make SHLIB_XLDFLAGS=-lncurses

Описание параметров сборки:

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

6.22.2. Описание Readline

Проинсталированные библиотеки: libhistory.[a,so] и libreadline.[a,so]

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

libhistory

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

libreadline

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


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.34. Texinfo-4.7

Пакет Texinfo содержит программы, используемые для чтения, записи и конвертирования документов Info, которые содержат системную документацию.

Расчетное время сборки 0.2 SBU

Требуемое место на диске 17 MB

Texinfo - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Ncurses и Sed

6.34.1. Инсталируем Texinfo

Следующий патч устраняет проблему, когда программа 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=/usr/share/texmf

Переменная 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

6.34.2. Описание Texinfo

Проинсталированные программы: info, infokey, install-info, makeinfo, texi2dvi и texindex

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

info

Используется для чтения документов Info. Документы Info похожи на man-страницы, но содержат больше, чем простое описание опций программы. Сравните для примера man bison и info bison.

infokey

Компилирует файл с исходниками, содержащий персонализацию Info, в двоичный формат.

install-info

Используется для установки файлов Info. Он обновляет записи в файле индекса Info.

makeinfo

Преобразует указанный файл документации исходников Texinfo в различные другие форматы: файлы Info, текст или HTML.

texi2dvi

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

texindex

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


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.58. Util-linux-2.12b

Пакет Util-linux содержит ряд различных утилит. Некоторые из этих утилит используются для монтирования, размонтирования, форматирования, разбиения и обслуживания дисков, открытия портов tty и вызова сообщений ядра.

Расчетное время сборки 0.2 SBU

Требуемое место на диске 16 MB

Util-linux - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Ncurses, Sed и Zlib

6.58.1. Замечания о совместимости с FHS

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

6.58.2. Инсталируем Util-linux

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

Описание параметров компиляции:

HAVE_KILL=yes

Это предостережет программу kill (уже установленной с Procps) от повторной сборки.

HAVE_SLN=yes

Это предостережет программу sln (статически скомпонованый ln, уже установленый с Glibc) от повторной сборки.

Устанавливаем пакет

make HAVE_KILL=yes HAVE_SLN=yes install

6.58.3. Описание Util-linux

Проинсталированные программы: 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

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

agetty

Открывает порт tty, запрашивает имя пользователя и запускает программу login.

arch

Возвращает архитектуру машины.

blockdev

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

cal

Отображает простой календарь.

cfdisk

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

chkdupexe

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

col

Фильтрует перевернутые строки, поступающие с ввода.

colcrt

Используется для фильтрации вывода nroff для терминалов CRT.

colrm

Отфильтровывает указанные колонки.

column

Форматирует указанный файл в несколько колонок.

ctrlaltdel

Устанавливает функцию для комбинации клавиш Ctrl+Alt+Del для аппаратного или программного сброса.

cytune

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

ddate

Выдает Discordian дату или конвертирует указанную дату по Григорианскому календарю в Discordian дату.

dmesg

Выводит загрузочные сообщения ядра.

elvtune

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

fdformat

Низкоуровневое форматирование дискеты.

fdisk

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

fsck.cramfs

Проводит проверку целостности файловой системы Cramfs на указанном устройстве.

fsck.minix

Проводит проверку целостности файловой системы Minix на указанном устройстве.

getopt

Анализирует параметры командной строки.

hexdump

Отображает заданный файл в шестнадцатиричном или другом указанном формате.

hwclock

Используется для чтения или установки аппаратных часов системы (также называемых RTC- или BIOS-часами).

ipcrm

Удаляет указанный ресурс IPC.

ipcs

Отображает статус IPC.

isosize

Возвращает размер файловой системы iso9660.

line

Копирует строку.

logger

Добавляет указанное сообщение в системный лог.

look

Выводит строки, начинающиеся с указанной строки.

losetup

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

mcookie

Генерирует "магические" (128-битные случайные шестнадцатиричные числа) ключи для xauth

mkfs

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

mkfs.bfs

Создает файловую систему SCO bfs.

mkfs.cramfs

Создает файловую систему cramfs.

mkfs.minix

Создает файловую систему Minix.

mkswap

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

more

Фильтр для постраничного вывода текста. Но less намного лучше.

mount

Присоединяет файловую систему на указанном устройстве к указанной директории в дереве системных файлов.

namei

Показывает символические ссылки в указанных путях.

pg

Постранично отображает текстовый файл.

pivot_root

Делает указанную файловую системы корневой для текущих процессов.

ramsize

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

raw

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

rdev

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

readprofile

Считывает профильную информацию ядра.

rename

Переименовывает указанные файлы, заменяет указанную строку на другую.

renice

Измененяет приоритет выполнения работающего процесса.

rev

Переворачивает строки в указанном файле.

rootflags

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

script

Создает скрипт терминальной сессии.

setfdprm

Устанавливает пользовательские параметры дискеты.

setsid

Запускает указанную программу в новой сессии.

setterm

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

sfdisk

Манипулирует таблицами разделов дисков.

swapdev

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

swapoff

Отключает устройства или файлы свопа.

swapon

Подключает устройства или файлы свопа.

tunelp

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

ul

Фильтр для перевода знаков подчеркивания в escape-последовательности подчеркивания для текущего терминала.

umount

Отключает файловую систему от дерева системных файлов.

vidmode

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

whereis

Возвращает местоположение бинарников, исходников или man-страниц для указанной команды.

write

Посылает сообщение указанному пользователю, если пользователь не отключил эту возможность.


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.2. Монтирование виртуальных файловых систем ядра

Некоторые файловые системы, экспортируемые ядром, отсутствуют на жеском накопителе, но используются для связи с ядром.

Начнем с создания директорий, в которые будут монтироваться файловые системы:

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

Глава 6. Установка основных системных программ

6.9. Установка заголовков Linux-Libc-2.6.8.1

Пакет Linux-Libc-Headers содержит “осмысленные” заголовки ядра.

Расчетное время сборки 0.1 SBU

Требуемое место на диске 22 MB

Linux-Libc-Headers - зависимости установки: Coreutils

6.9.1. Инсталируем Linux-Libc-Headers

В течении многих лет было очень практично использовать “сырые” заголовки ядра (прямо из тарбола ядра) в /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 {} \;

6.9.2. Описание Linux-Libc-Headers

Проинсталированные заголовки: /usr/include/{asm,linux}/*.h

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

/usr/include/{asm,linux}/*.h

Заголовки Linux API


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.49. Module-Init-Tools-3.0

Пакет 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

6.49.1. Инсталируем Module-Init-Tools

Подготавливаем Module-Init-Tools для компиляции:

./configure --prefix="" --enable-zlib

Компилируем пакет

make

Для проверки результата вводим: make check.

Устанавливаем пакет

make install

6.49.2. Описание Module-Init-Tools

Проинсталированные программы: depmod, genksyms, insmod, insmod_ksymoops_clean, kallsyms (ссылка на insmod), kernelversion, ksyms (ссылка на insmod), lsmod (ссылка на insmod), modinfo, modprobe (ссылка на insmod) и rmmod (ссылка на insmod)

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

depmod

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

genksyms

Генерирует информацию о версии символов

insmod

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

insmod_ksymoops_clean

Удаляет сохраненные ksyms и модули, не используемые в течении 2 дней.

kallsyms

Извлекает все символы ядра для отладки.

kernelversion

Сообщает версию загруженного ядра.

ksyms

Показывает экспортированные символы ядра

lsmod

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

modinfo

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

modprobe

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

rmmod

Выгружает загружаемый модуль из загруженного ядра


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.7. Создание файлов passwd, group и log

Для возможности регистрации в качестве пользователя 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 записывает неправильые регистрации.


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.12. Переустановка средств

Теперь, когда мы установили новую библиотку C, пришло время переустановить наши средства. Это надо для того, чтобы вновь скомпилированные программы использовали именно новую библиотеку C. То, что мы сейчас сделаем, это реверс того, что мы делали на этапе “интеграции” в начале Главы 5. В Главе 5 была проведена цепь из основных директорий /{,usr/}lib в новую директорию /tools/lib. Теперь цепь будет проведена из этой самой директории /tools/libв директорию LFS /{,usr/}lib.

Первым делом мы отрегулируем компоновщик. Для этого мы вернемся к директориям с исходниками и сборкой из второго шага установки Binutils. Установим отрегулированый компоновщик запуском следующей команды из директориии binutils-build:

make -C ld INSTALL=/tools/bin/install install
[Note]

Замечание

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

[Important]

Важно

Если вы работаете на платформе, на которой имя динамического компоновщика отличается от ld-linux.so.2, замените “ld-linux.so.2” на имя компоновщика для вашей платформы в вышеуказанной команде. Вернитесь к Разделу 5.3, “Технические моменты”, если необходимо.

[Caution]

Предупреждение

На этом месте необходимо остановиться и убедиться, что основные функции (компиляция и компоновка) новых средств работают корректно. Для этого есть простой тест:

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

Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.61. Очистка

Если вы покидали среду 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.

[Note]

Замечание

Удаляя /tools вы также удаляете временные копииf Tcl, Expect и DejaGNU, которые были использованы для запуска тестов. Для использования этих программ позднее, их надо будет перекомпилировать и переустановить. Инструкции по установке такие же, как в Главе 5, исключая изменение префикса с /tools на /usr. В книге BLFS обсуждается несколько отличный подход к установке Tcl (смотри http://www.linuxfromscratch.org/blfs/).

Пакеты и патчи, сохраненные в директории /sources могут быть перемещены в более подходящее место, например /usr/src/packages, или удалены, если они были записаны на CD.


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.60. Очередное сжатие

Если предполагаемый пользователь не програмист и не планирует заниматься отладкой программ, то место, занимаемое системой, может быть уменьшено примерно на 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} для получения дополнительных свободных мегабайт. Не применяйте эту опцию на библиотеках—они будут разрушены.


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.23. Vim-6.3

Пакет Vim содержит мощный текстовый редактор

Расчетное время сборки 0.4 SBU

Требуемое место на диске 34 MB

Vim - зависимости установки: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make, Ncurses и Sed

[Tip]

Альтернативы для Vim

Если вы предпочитаете другие редакторы—такие как Emacs, Joe или Nano—загляните на http://www.linuxfromscratch.org/blfs/view/svn/postlfs/editors.html для получения инструкций по установке.

6.23.1. Инсталируем Vim

Сначала распакуем оба архива 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.

6.23.2. Настройка 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'

6.23.3. Описание Vim

Проинсталированные программы: 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

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

efm_filter.pl

Фильтр для создания файла ошибки, который может быть прочитан vim.

efm_perl.pl

Реформатирует сообщения об ошибках интерпритатора Perl для использования в режиме “quickfix” для vim.

ex

Запускает vim в режиме ex.

less.sh

Скрипт, запускающий vim с less.vim.

mve.awk

Обрабатывает ошибки vim.

pltags.pl

Создает файл тегов кода perl для использования vim

ref

Проверяет написание параметров.

rview

Урезанная версия view; нет поддержки shell-команд и не может быть приостановлен view.

rvim

Урезанная версия vim; нет поддержки shell-команд и не может быть приостановлен and vim

shtags.pl

Генерирует файл тегов для скриптов perl.

tcltags

Генерирует файл тегов для кода TCL.

view

Запускает vim в режиме только для чтения.

vi

Редактор

vim

Редактор

vim132

Запускает vim в режиме 132-колоночного терминала.

vim2html.pl

Конвертирует документацию vim в HTML.

vimdiff

Редактирует две или три версии файла в vim и показывает различия.

vimm

Включает модель ввода DEC locator на удаленном терминале.

vimspell.sh

Просматривает файл и генерирует синтаксические выражения, необходимые для подсветки в vim. Этот скрипт требует старую Unix команду spell, которая не поддерживается ни в LFS, ни в BLFS.

vimtutor

Обучает вас основным командам и горячим клавишам vim

xxd

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


Linux From Scratch - Версия 6.0

Глава 6. Установка основных системных программ

6.16. Zlib-1.2.1

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

Расчетное время сборки 0.1 SBU

Требуемое место на диске 1.5 MB

Zlib - зависимости установки: Binutils, Coreutils, GCC, Glibc, Make и Sed

6.16.1. Инсталируем Zlib

Следующий патч устраняет уязвимость отрицания сервиса в библиотеке сжатия Zlib:

patch -Np1 -i ../zlib-1.2.1-security-1.patch
[Note]

Замечание

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

6.16.2. Описание Zlib

Проинсталированные библиотеки: libz[a,so]

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

libz

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


Linux From Scratch - Версия 6.0

Глава 7. Установка системных скриптов загрузки

7.10. Настройка скрипта localnet

Часть скрипта localnet устанавливает имя системы. Для этого надо настроить файл /etc/sysconfig/network.

Создадим файл /etc/sysconfig/network и укажем имя системы запуском:

echo "HOSTNAME=[lfs]" > /etc/sysconfig/network

[lfs] надо заменить на желаемое имя компьютера для вызова. Вам не надо здесь вводить Fully Qualified Domain Name (FQDN - полное доменное имя). Эту информацию мы позже укажем в файле /etc/hosts.


Linux From Scratch - Версия 6.0

Глава 7. Установка системных скриптов загрузки

7.11. Создание файла /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

Linux From Scratch - Версия 6.0

Глава 7. Установка системных скриптов загрузки

7.12. Настройка скрипта network

Этот раздел нужен только в том случае, если вы собираетесь настраивать сетевую карту.

Если у вас таковая отсутствует, вам не надо создавать файлы конфигурации сетевой карты. В этом случае вам надо удалить все ссылки network изо всех директорий с уровнями запуска (/etc/rc.d/rc*.d).

7.12.1. Создание конфигурационных файлов сетевого интерфейса

Какие из интерфейсов будут запущены или остановлены скриптом 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.

7.12.2. Создание файла /etc/resolv.conf

Если система подключена к интернет, то ей требуются некоторые обозначения разрешенных имен сервисов доменных имен (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 из файла.


Linux From Scratch - Версия 6.0

Глава 7. Установка системных скриптов загрузки

7.5. Настройка скрипта setclock

Скрипт 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.


Linux From Scratch - Версия 6.0

Глава 7. Установка системных скриптов загрузки

7.9. Настройка скрипта sysklogd

Скрипт sysklogd вызывает программу syslogd с параметром -m 0. Этот параметр отключает периодическую отметку времени, которую syslogd по умолчанию пишет в лог-файл каждые 20 минут. Для включения этой периодической отметки времени, отредактируйте скрипт sysklogd, выполнив соответствующие изменения. Для более полной информации смотрите man syslogd.


Linux From Scratch - Версия 6.0

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

7. Настройка системных скриптов загрузки

7.1. Вступление

Эта глава описывает установку системных загрузочных скриптов и их правильную настройку. Большинство этих скриптов будут работать без изменений, но некоторые требуют дополнительные файлы конфигурации потому, что они работают с аппаратно-зависимой информацией.

Стиль System-V загрузочных скриптов применяется в этой книге так как он широко используется. Дополнительно есть совет, описывающий BSD-стиль загрузочных скриптов, который доступен на http://www.linuxfromscratch.org/hints/downloads/files/bsd-init.txt. Поиск в списках рассылки LFS для “depinit” также часто дает дополнительный выбор.

Если вы используете альтернативный стиль загрузочных скриптов, пропустите эту главу и переходите к Главе 8.


Linux From Scratch - Версия 6.0

Глава 7. Установка системных скриптов загрузки

7.7. Создание файла /etc/inputrc

Файл /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

Linux From Scratch - Версия 6.0

Глава 7. Установка системных скриптов загрузки

7.8. Файлы загрузки оболочки Bash

Программа-оболочка /bin/bash (далее называемая “оболочкой”) при запуске использует набор стартовых файлов для создания окружения. Файлы в директории /etc предоставляют глобальные установки. Если эквивалентные файлы присутствуют в домашней диретории, то они могут заменить глобальные установки.

Интерактивнвя регистрация оболочки запускается после успешного входа, используя /bin/login, который читает файл /etc/passwd.

Интерактивнвя нерегистрированная оболочка запускается из командной строки (т.е. [prompt]$/bin/bash).

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

Для большей информации смотрите info bash

Файлы /etc/profile и ~/.bash_profile читаются, когда оболочка работает в режиме интерактивной регистрации.

Основной файл /etc/profile ниже устанавливает некоторые переменные окружения, необходимые для поддержки различных языков. Правильная их установка даст следующий результат:

Этот скрипт также устанавливает переменную окружения 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
[Note]

Замечание

Локали “C” (по умолчанию) и “en_US” (рекомендуется для английских пользователей США) различаются.

Установка раскладки клавиатуры, эранного шрифта и локале-связанных переменных окружения является только шагом интернационализации, нужным для поддержки локалей, использующих обычные однобайтовые кодировки и направление письма слева-направо. Более комплексные вещи (включая UTF-8 основанные локали) требуют дополнительных шагов и дополнительных патчей, так как много приложений имеют склонность работать неправильно в таких условиях. Эти шаги и патчи не включены в книгу LFS и такие локали не поддерживаются LFS.


Linux From Scratch - Версия 6.0

Глава 7. Установка системных скриптов загрузки

7.6. Настройка консоли Linux

Этот раздел описывает настройку стартового скрипта 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
[Note]

Замечание

Строка 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 From Scratch - Версия 6.0

Глава 7. Установка системных скриптов загрузки

7.3. Как эти стартовые скрипты работают?

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

Вот описание параметров, которые можно передавать скриптам запуска:

start

Запуск сервиса.

stop

Остановка сервиса.

restart

Сервис останавливается и запускается заново.

reload

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

status

Показывает, запущен ли сервис и какой у него PID.

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


Linux From Scratch - Версия 6.0

Глава 7. Установка системных скриптов загрузки

7.2. LFS-Bootscripts-2.2.2

Пакет LFS-Bootscripts содержит набор стартовых скриптов.

Расчетное время сборки 0.1 SBU

Требуемое место на диске 0.3 MB

LFS-Bootscripts - зависимости установки: Bash и Coreutils

7.2.1. Установка LFS-Bootscripts

Установка пакета:

make install

7.2.2. Содержание LFS-bootscripts

Установленные скрипты: checkfs, cleanfs, console, functions, halt, ifdown, ifup, localnet, mountfs, mountkernfs, network, rc, reboot, sendsignals, setclock, static, swap, sysklogd, template и udev

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

checkfs

Проверяет файловые системы перед их монтированием (исключая журналируемые и сетевые файловые системы)

cleanfs

Удаляет файлы, которые не должны быть сохранены между перезагрузками, например в /var/run/ и /var/lock/; он пересоздает /var/run/utmp и удаляет возможно присутствующие файлы /etc/nologin, /fastboot и /forcefsck.

console

Загружает раскладку клавиатуры и устанавливает экранный шрифт

functions

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

halt

Выключает систему

ifdown

Помагает скрипту network с сетевыми устройствами

ifup

Помагает скрипту network с сетевыми устройствами

localnet

Устанавливает имя хоста системы и локальное петлевое устройство

mountfs

Монтирует все файловые системы, исключая сетевые или помеченные как noauto

mountkernfs

Используется для монтирования файловых систем ядра, таких как proc

network

Настраивает сетевые интерфейсы, такие как сетевые карты, и устанавливает gateway по умолчанию (там где применяется)

rc

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

reboot

Перезагружает систему

sendsignals

Останавливает все процессы перед перезагрузкой или выключением системы

setclock

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

static

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

swap

Включает и выключает файлы и разделы подкачки

sysklogd

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

template

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

udev

Настраивает udev и создает ноды устройств в /dev


Linux From Scratch - Версия 6.0

Глава 7. Установка системных скриптов загрузки

7.4. Поддержка устройств и модулей в LFS системе

В Главе 6 мы установили пакет Udev. Сначала мы детально расмотрим, как это работает и короткую историю предыдущих методов поддержки устройств.

Системы Linux в основном традиционно используют метод создания статических устройств, из-за чего создается огромное количество нод устройств в директори /dev (иногда буквально сотни нод), не смотря на наличие соответствующих реальных аппаратных устройств. Это типично для работы скрипта MAKEDEV, который содержит большое количество вызовов к программе mknod с уместными старшими и младшими номерами устройств для каждого возможного устройства, которое может существовать в мире. Используя метод udev, только те устройства, которые обнаружены ядром, получат ноды устройств, созданные для них. Поскольку эти ноды устройств будут создаваться при каждой загрузке системы, они будут сохраняться в ramfs (файловой системе, которая размещается непосредственно в памяти и не занимает места на диске). Ноды устройств не требуют много места на диске, поэтому используемая ими память незначительна.

7.4.1. История

В феврале 2000 года новая файловая система, названная devfs, была добавлена в ядро 2.3.46 и стала доступной в стабильных ядрах серии 2.4. Хотя сама она присутствовала в исходниках ядра, метод динамического создания устройств никогда не получал подавляющую поддержку разработчиков ядра.

Основные проблемы к такому подходу, заимствованые devfs - это способ поддержки определения, создания и именования устройств. Возможно, последняя проблема именования нод устройств была более критичной. Обычно принималось, что имена устройств доступны для конфигурации, затем политика именования устройств должна быть передана системному администратору, не навязана ему любым разработчиком. Файловая система devfs также страдала от обстоятельств, связанных с ее разработкой, и не могла быть исправлена без обоснования пересмотра ядра. Для нее также не хватало новых разработчиков.

С разработкой нестабильной ветки ядра 2.5, в конце выпущенной как серия 2.6 стабильных ядер, появилась новая виртуальная файловая система, названная sysfs. Работа sysfs - это экспорт видимой для процессов системной структуры в пространстве пользователя. С таким пространством пользователя замена devfs стала более реальной.

7.4.2. Внедрение Udev

Файловая система 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 определить устройства и создать подходящие ноды устройств.

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

7.4.3. Поддержка динамических устройств и устройств с горячим подключением

Если вы подключаете устройство, такое как Universal Serial Bus (USB) MP3 проигрыватель, ядро определяет, что устройство подключилось и генерирует событие hotplug. Если драйвер уже загружен (потому что он был вкомпилирован в ядро или был загружен как модуль через скрипт S05modules), будет вызван udev для создания уместной ноды устройства согласно данным sysfs, доступным в /sys. Если драйвер для только что подключенного устройства доступен в виде модуля, но в данный момент выгружен, то присоединение устройства к системе только вызовет драйвер шины ядра для генерации события hotplug, которое сообщает пространству пользователя о новом подключении устройства и присоединения к драйверу не будет. В результате ничего не происходит и само устройство еще не готово к использованию.

Если для собираемой системы, имеющей много драйверов, исполнение их в виде модулей лучше, чем прямое встраивание в ядро, использование скрипта S05modules может быть не практичным. Пакет Hotplug (смотрите http://linux-hotplug.sourceforge.net/) может быть более предпочтительным в этом случае. Когда пакет Hotplug установлен, он будет отвечать на вышеупомянутые события hotplug драйвера шины ядра. Пакет Hotplug загрузит подходящий модуль и сделает это устройство доступным созданием для него ноды(нод) устройства.

7.4.4. Проблемы с созданием устройств

Есть несколько известных проблем при автоматическом создании нод устройств:

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.

7.4.5. Полезное чтение

Дополнительная полезная документация доступна на следующих сайтах:


Linux From Scratch - Версия 6.0

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

8. Обеспечение загрузки LFS системы

8.1. Вступление

Пришло время сделать нашу систему LFS загружаемой. Эта часть описывает создание файла fstab, сборку ядра для новой системы LFS и установку загрузчика Grub для обеспечения возможности выбора системы LFS во время загрузки.


Linux From Scratch - Версия 6.0

Глава 8. Обеспечение загрузки LFS системы

8.2. Создание файла /etc/fstab

Файл /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” вкомпилированы прямо в ядро (не как модуль).


Linux From Scratch - Версия 6.0

Глава 8. Обеспечение загрузки LFS системы

8.4. Обеспечение загрузки LFS системы

Вы почти полностью установили новую систему 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)
[Warning]

Внимание

Нижеприведенные команды перезапишут ваш текущий загрузчик. Не запускайте эти команды, если вам этого не надо. К примеру, вы можете использовать загрузку в несколько этапов путем манипуляций вашими 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 From Scratch - Версия 6.0

Глава 8. Обеспечение загрузки LFS системы

8.3. Linux-2.6.8.1

Пакет Linux содержит ядро и файлы заголовков.

Расчетное время сборки 4.20 SBU

Требуемое место на диске 181 MB

Linux - зависимости установки: Bash, Binutils, Coreutils, Findutils, GCC, Glibc, Grep, Gzip, Make, Modutils, Perl и Sed

8.3.1. Установка ядра

Сборка ядра разбита на несколько шагов — конфигурация, компиляция и установка. Если вам не нравится способ установки, описаный в этой книге, то посмотрите файл 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 для большей информации.

[Note]

Замечание

При конфигурации ядра убедитесь, что включили опцию “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).

[Note]

Замечание

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.

8.3.2. Содержимое Linux

Установленные файлы: ядро, заголовки ядра и System.map

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

Ядро

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

Заголовки ядра

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

System.map

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


Linux From Scratch - Версия 6.0

Глава 9. Конец

9.4. Что тепрь?

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

Теперь, когда вы закончили установку вашей системы LFS, вы наверно спросите “Что дальше?” Для ответа на этот вопрос мы составили список ресурсов, который вам может оказаться полезным.


Linux From Scratch - Версия 6.0

Глава 9. Конец

9.3. Перезагрузка системы

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


Linux From Scratch - Версия 6.0

Глава 9. Конец

9.2. Регистрация

Вы хотите зарегистрироваться как пользователь LFS по окончании прочтения книги? Посетите http://www.linuxfromscratch.org/cgi-bin/lfscounter.cgi и зарегистрируйтесь как пользователь LFS, введя ваше имя и первую используемую вами версию LFS.

Теперь перезагрузимся в систему LFS.


Linux From Scratch - Версия 6.0

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

9. Конец

9.1. Конец

Сделано! Новая LFS ситстема установлена! Мы желаем вам больших успехов с вашей новой блестящей персонально собранной Linux системой.

Возможно, хорошая идея создать файл /etc/lfs-release. Имея этот файл, вам будет очень просто (и нам, если вы попросите о помощи на некотором этапе) определить установленную версию LFS. Создайте этот файл запуском:

echo 6.0 > /etc/lfs-release

Linux From Scratch - Версия 6.0

Пролог

5. Структура

Эта книга состоит из следующих частей.

5.1. Часть I - Вступление

Часть I содержит некоторые важные сведения о процессе инсталляции и некоторую дополнительную информацию о книге.

5.2. Часть II - Подготовка к сборке

Часть II описывает приготовления к процессу сборки: создание раздела, скачивание пакетов и компиляцию временных средств.

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

Часть III руководит сборкой системы LFS: компиляцией и установкой всех пакетов по порядку, созданием загрузочных скриптов и установкой ядра. В результате будет создана простая Linux-система в которую вы сможете установить дополнительные программы тем способом и такие, как захотите. В конце этой книги имеется простой в использовании список всех программ, библиотек и важных файлов, которые были установлены.


Copyright (c) 1999–2004, Gerard Beekmans

Все права защищены.

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

ЭТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПОСТАВЛЯЕТСЯ ВЛАДЕЛЬЦАМИ АВТОРСКИХ ПРАВ И УЧАСТНИКАМИ “КАК ЕСТЬ” И ЛЮБЫЕ ЯВНЫЕ ИЛИ НЕЯВНЫЕ ГАРАНТИИ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ НЕЯВНЫМИ ГАРАНТИЯМИ, КОММЕРЧЕСКОЙ ЦЕННОСТИ И ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ ОТРИЦАЮТСЯ. НИ В КОЕМ СЛУЧАЕ РЕГЕНТЫ ИЛИ УЧАСТНИКИ НЕ ДОЛЖНЫ БЫТЬ ОТВЕТСТВЕННЫМИ ЗА ЛЮБОЙ ПРЯМОЙ, КОСВЕННЫЙ, СЛУЧАЙНЫЙ, СПЕЦИАЛЬНЫЙ, ОБРАЗЦОВЫЙ ИЛИ ПОСЛЕДУЮЩИЙ УЩЕРБЫ (ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ПОСТАВКОЙ ТОВАРОВ ЗАМЕНЫ ИЛИ УСЛУГ; ПОТЕРЮ ДАННЫХ ИЛИ ИХ НЕПРАВИЛЬНУЮ ПЕРЕДАЧУ ИЛИ ПОТЕРИ; ПРИОСТАНОВЛЕНИЕ БИЗНЕСА), И ТЕМ НЕ МЕНЕЕ ВЫЗВАННЫЕ И В ЛЮБОЙ ТЕОРИИ ОТВЕТСТВЕННОСТИ, НЕЗАВИСИМО ОТ КОНТРАКТНОЙ, СТРОГОЙ ОТВЕТСТВЕННОСТИ, ИЛИ ПРАВОНАРУШЕНИИ (ВКЛЮЧАЯ ХАЛАТНОСТЬ ИЛИ ИНЫМ СПОСОБОМ), ВОЗНИКШЕМ ЛЮБЫМ ПУТЕМ ПРИ ИСПОЛЬЗОВАНИИ ЭТОГО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, ДАЖЕ ЕСЛИ БЫ БЫЛО СООБЩЕНО О ВОЗМОЖНОСТИ ТАКОГО УЩЕРБА.


Linux From Scratch - Версия 6.0

Предисловие

1. Предисловие

Мои приключения с 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 From Scratch - Версия 6.0

Пролог

2. Аудитория

Существует ряд причин, по которым эта книга может представлять интерес. Главная причина - установка 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 вы поймете, что вся сила - в информации и знаниях.


Linux From Scratch - Версия 6.0

Пролог

4. Типография

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

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

Пролог

3. Предпосылки

Эта книга подразумевает, что у вас есть хорошие познания в области использования и установки программ для Linux. Перед началом построения вашей LFS системы вам следует прочитать следующие HOWTO: