The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги | ]

Каталог документации / Раздел "Документация для Linux" / Оглавление документа

Кросс-компилированный Linux From Scratch

Версия 1.0.0-x86

Jim Gifford

Ryan Oliver

Перевод: Сергей Каминский http://lfs.linux.kiev.ua

Copyright (c) 2005, Jim Gifford & Ryan Oliver

Все права защищены.

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

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

  • Ни название проекта “Linux From Scratch”, ни имена его участников не могут быть использованы для подписи и рекламирования продуктов, произошедших из данного материала без специального письменного разрешения

  • Все материалы, произошедшие из Linux From Scratch должны сохранять ссылку на проект “Linux From Scratch

ЭТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПОСТАВЛЯЕТСЯ ВЛАДЕЛЬЦАМИ АВТОРСКИХ ПРАВ И УЧАСТНИКАМИ “КАК ЕСТЬ” И ЛЮБЫЕ ЯВНЫЕ ИЛИ НЕЯВНЫЕ ГАРАНТИИ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ НЕЯВНЫМИ ГАРАНТИЯМИ, КОММЕРЧЕСКОЙ ЦЕННОСТИ И ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ ОТРИЦАЮТСЯ. НИ В КОЕМ СЛУЧАЕ РЕГЕНТЫ ИЛИ УЧАСТНИКИ НЕ ДОЛЖНЫ БЫТЬ ОТВЕТСТВЕННЫМИ ЗА ЛЮБОЙ ПРЯМОЙ, КОСВЕННЫЙ, СЛУЧАЙНЫЙ, СПЕЦИАЛЬНЫЙ, ОБРАЗЦОВЫЙ ИЛИ ПОСЛЕДУЮЩИЙ УЩЕРБЫ (ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ПОСТАВКОЙ ТОВАРОВ ЗАМЕНЫ ИЛИ УСЛУГ; ПОТЕРЮ ДАННЫХ ИЛИ ИХ НЕПРАВИЛЬНУЮ ПЕРЕДАЧУ ИЛИ ПОТЕРИ; ПРИОСТАНОВЛЕНИЕ БИЗНЕСА), И ТЕМ НЕ МЕНЕЕ ВЫЗВАННЫЕ И В ЛЮБОЙ ТЕОРИИ ОТВЕТСТВЕННОСТИ, НЕЗАВИСИМО ОТ КОНТРАКТНОЙ, СТРОГОЙ ОТВЕТСТВЕННОСТИ, ИЛИ ПРАВОНАРУШЕНИИ (ВКЛЮЧАЯ ХАЛАТНОСТЬ ИЛИ ИНЫМ СПОСОБОМ), ВОЗНИКШЕМ ЛЮБЫМ ПУТЕМ ПРИ ИСПОЛЬЗОВАНИИ ЭТОГО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, ДАЖЕ ЕСЛИ БЫ БЫЛО СООБЩЕНО О ВОЗМОЖНОСТИ ТАКОГО УЩЕРБА.


Оглавление

Пролог

i. Предисловие

Проект Linux From Scratch увидел много изменений за несколько лет своего существования. Лично я вовлёкся в проект в 1999 году во время релизов 2.x. В то время процессами сборки были создание статических бинарников при помощи хост системы, затем chroot и сборка финальных бинарников поверх статических.

Затем началось использование директории /static для содержания статической сборки отдельно от финальной системы, затем Ryan Oliver и Greg Schafer разработали процессы чистой LFS, вводящие новые процессы сборки инструментария, который отделяет нашу начальную сборку от хоста. Наконец, LFS 6 принесла Linux ядро 2.6, структуру динамических устройств udev, осмысленные заголовки ядра и другие улучшения в системе Linux From Scratch.

Единственным "недостатком" LFS являлось то, что он всегда был основан на процессорах класса x86. С приходом процессоров Athlon 64 и Intel EM64T только x86 LFS больше не является идеальным. На протяжении этого времени Ryan Oliver разработал и задокументировал процессы, при помощи которых Вы можете собрать Linux из любой системы и для любой системы использованием техники кросс-компилирования. Таким образом начался проект Кросс-компилированного LFS (CLFS).

CLFS следует тем же принципам, что и проект LFS, то есть знание Вашей системы изнутри и увеличение сил в сборке системы самостоятельно. Дополнительно, во время сборки CLFS Вы изучите расширенные техники, например кросс-компилированные инструменты, поддержка мультибиблиотечности (одновременно 32 и 64-битные библиотеки), альтернативные архитектуры - Sparc, MIPS и Alpha и многое другое.

Мы надеемся, что Вы насладитесь сборкой Вашей собственной CLFS системы и выгодами, которые появляются от системы, собранной для Ваших потребностей.

--
Jeremy Utley, менеджер релиза CLFS 1.x (Автор страницы)
Jim Gifford, лидер проекта CLFS
Ryan Oliver, лидер проекта CLFS
Joe Ciccone, Justin Knierin, Chris Staub, Matt Darcy, Ken Moffat,
Manuel Canales Esparcia и Nathan Coulson - разработчики CLFS

ii. Аудитория

Существует ряд причин, по которым эта книга может представлять интерес. Главная причина - установка Linux системы из исходников. Многие люди спросят: “Зачем мучиться, вручную собирая Linux систему с нуля, когда можно скачать и установить готовую?” Это хороший вопрос и мы постараемся ответить на него в этой части книги.

Важная причина существования СLFS - помочь людям понять, как работает Linux система. Построение СLFS-системы помогает показать, что заставляет Linux работать, как работают её компоненты и как они друг от друга зависят. И, наконец, оно учит как настроить Linux под себя, в соответствии со своими вкусами и потребностями.

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

Другим преимуществом СLFS является возможность создать наиболее компактную систему. При установке обычного дистрибутива, вместе с ним, как правило, устанавливается большое количество программ, которые Вы никогда не будете использовать. Они просто будут занимать место на диске (или, возможно, время центрального процессора). В то же время не составит труда установить систему СLFS на 100 MБ диска. Вам кажется, это много? Некоторые пользователи смогли создать весьма компактную СLFS систему. Они собрали систему, позволяющую запускать веб-сервер Apache, которая занимала всего 8 Mb на диске. Дальнейшее урезание её позволит сократить используемое место до 5 Mb. Попробуйте сделать это, используя обычный дистрибутив.

Мы можем сравнить дистрибутив Linux с гамбургером из закусочной — Вы не знаете точно, что едите. СLFS же даёт Вам не гамбургер, а рецепт его приготовления. Внимательно изучив его, можно убрать ненужные ингредиенты и добавить свои по вкусу. Как только Вы довольны рецептом, можете смело приступать к приготовлению Гамбурга. Вы можете также выбрать способ приготовления: поджарить, сварить, запечь или съесть сырым.

Также СLFS можно сравнить с домом. CLFS предоставляет только его план, а строить его Вам. Разумеется, можно изменять план по ходу дела.

Немаловажным преимуществом построения своей 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 Вы поймёте, что вся сила - в информации и знаниях.

iii. Предпосылки

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

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

Перед сборкой CLFS системы мы рекомендуем прочитать следующее:

  • Software-Building-HOWTO http://www.tldp.org/HOWTO/Software-Building-HOWTO.html

    Это исчерпывающее руководство по сборке и установке “общих” UNIX-ориентированных программ в Linux.

  • Руководство пользователей Linux http://www.linuxhq.com/guides/LUG/guide.html

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

  • Важные советы для первоначального прочтения http://www.linuxfromscratch.org/hints/downloads/files/essential_prereading.txt

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

iv. Требования хост системы

Вы должны быть способны собрать CLFS систему из любой Unix-подобной операционной системы. Ваша хост система должна иметь следующие программы с минимальными указанными версиями. Также заметьте, что многие дистрибутивы размещают заголовки программ в отдельных пакетах, часто в виде “[package-name]-devel” или “[package-name]-dev”. Убедитесь, что установили их если они предоставляются Вашим дистрибутивом.

  • Bash-2.05a

  • Binutils-2.12 (Версии больше, чем 2.17, не рекомендуются так как они не были протестированы)

  • Bzip2-1.0.2

  • Coreutils-5.0 (или Sh-Utils-2.0, Textutils-2.0 и Fileutils-4.1)

  • Diffutils-2.8

  • Findutils-4.1.20

  • Gawk-3.0

  • Gcc-2.95.3 (Versions greater than 4.1.1 are not recommended as they have not been tested)

  • Glibc-2.2.5 (Версии больше, чем 2.4, не рекомендуются так как они не были протестированы)

  • Grep-2.5

  • Gzip-1.2.4

  • Make-3.79.1

  • Patch-2.5.4

  • Sed-3.0.2

  • Tar-1.14

Чтобы увидеть, имеет ли Ваша хост система все подходящие версии, выполните следующее:

cat > version-check.sh << "EOF"
#!/bin/bash

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

bash --version | head -n1 | cut -d" " -f2-4
echo -n "Binutils: "; ld --version | head -n1 | cut -d" " -f3-4
bzip2 --version 2>&1 < /dev/null | head -n1 | cut -d" " -f1,6-
echo -n "Coreutils: "; chown --version | head -n1 | cut -d")" -f2
diff --version | head -n1
find --version | head -n1
gawk --version | head -n1
gcc --version | head -n1
/lib/libc.so.6 | head -n1 | cut -d" " -f1-7
grep --version | head -n1
gzip --version | head -n1
make --version | head -n1
patch --version | head -n1
sed --version | head -n1
tar --version | head -n1

EOF

bash version-check.sh

v. Оформление

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

./configure --prefix=/usr

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

install-info: unknown option '--dir-file=/mnt/clfs/usr/info/dir'

Текст такого формата (моноширинный) показывает вывод на экран, как результат выполнения какой-либо команды. Также он используется для указания имени файла, например /etc/ld.so.conf.

Выделение

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

http://cross-lfs.org/

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

cat > ${CLFS}/etc/group << "EOF"
root:x:0:
bin:x:1:
......
EOF

Такой раздел используется для создания файлов конфигурации. Первая команда говорит системе создать файл ${CLFS}/etc/group, наполняя его строчками до EOF. В командной строке эта секция печатается в точности как на экране.

[REPLACED TEXT]

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

passwd(5)

Этот формат используется для ссылок на особые man-страницы. Номер внутри скобок указывает на особый раздел внутри man. Например, passwd имеет две страницы man. По инструкциям установки CLFS, эти две страницы будут помещены в /usr/share/man/man1/passwd.1 и /usr/share/man/man5/passwd.5. Эти страницы имеют разную информацию. Когда в книге используется passwd(5), то это указание на /usr/share/man/man5/passwd.5. man passwd будет выводить первую найденную man страницу, которая означает “passwd”, которая будет /usr/share/man/man1/passwd.1. В этом примере Вам понадобится запустить man 5 passwd для прочтения указанной страницы. Надо отметить, что большинство man страниц не содержат дублированных имён страниц в разных разделах. Поэтому вызов man [program name] обычно достаточен.

vi. Структура

Эта книга разделена на следующие части.

vi.1. Часть I - Вступление

Часть I содержит некоторые важные сведения о процессе инсталляции и некоторую дополнительную информацию о книге.

vi.2. Часть II - Подготовка к сборке

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

vi.3. Часть III - Получение инструментов кросс-компилирования

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

vi.4. Часть IV - Сборка основных инструментов

Часть IV рассказывает, как создать инструменты, предназначенные для работы на целевой системе. Это инструменты, которые позволят создать рабочую систему на Вашей целевой системе.

vi.5. Часть V - Сборка CLFS системы

Часть V проводит читателя через сборку CLFS системы — компилирование и установку всех пакетов один за другим, установку загрузочных скриптов и установку ядра. Полученная Linux система является основой, на которой могут быть установлены другие программы для расширения системы по необходимости. В конце книги есть простой в использовании список всех программ, библиотек и важных файлов, которые были установлены.

vi.6. Приложения

Приложения содержат информацию, которая обычно не помещается в другие места книги. Приложение A содержит описания сокращений и определений, используемых в книге; Приложение B содержит благодарности людям, которые помогли в работе над проектом CLFS и сайтом; Приложения C и D содержат информацию о зависимостях пакетов и порядке сборки. Некоторые архитектуры могут содержать дополнительные приложения для архитектурно-специфичных задач.

vii. Опечатки

Программы, используемые для создания CLFS системы, постоянно обновляются и расширяются. Предупреждения безопасности и исправления ошибок могут стать доступными после того, как книга CLFS будет выпущена. Некоторые системы также могут иметь проблемы сборки CLFS. Чтобы проверить, требуется ли обновить версии пакетов или инструкции в этом релизе CLFS, устранить уязвимости безопасности, провести другие исправления ошибок или аппаратно-специфичных проблем, пожалуйста обратитесь на http://trac.cross-lfs.org/clfs/errata/1.0.0/ перед продолжением сборки. Вы должны отметить любые показанные изменения и применить их в соответствующих разделах книги для продвижения в сборке CLFS системы.

Часть I. Вступление

Глава 1. Вступление

1.1. Благодарности Cross-LFS

Редакторы книги хотели бы подлагодарить людей, которые помогли сделать книгу такой, какая она теперь.

Наши лидеры:

  • Ryan Oliver - Разработчик процессов сборки.

  • Jim Gifford - Ведущий разработчик.

  • Jeremy Utley - Диспетчер серии 1.x.

Наша команда CLFS:

  • Joe Ciccone - Сборки Alpha, MIPS, Sparc.

  • Nathan Coulson - Bootscripts.

  • Matt Darcy - Сборки x86, X86_64 и Sparc.

  • Manuel Canales Esparcia - XML книга.

  • Karen McGuiness - Корректор.

  • Jeremy Huntwork - Сборки PowerPC, x86, Sparc.

  • Justin Knierim - Разработчик сайта.

  • Ken Moffat - Сборки PowerPC и X86_64. Разработчие совета Pure 64.

  • Alexander E. Patrakov - Интеграция Udev/Hotplug

  • Chris Staub - Сборки x86. Лидер контроля качества.

Команда внешних разработчиков

  • JЭrg Billeter - Проверка и помощь в разработке пакета Linux Headers

  • Richard Downing - Тестирование, набор и исправления содержания.

  • Peter Ennis - Набор и исправления содержания.

  • Tony Morgan - Набор и исправления содержания.

Редакторы книги также хотели бы подлагодарить за содействие людей с clfs-dev@lists.cross-lfs.org и действующих совместно списков рассылки, которые предоставляли ценные технические и редакторские правки во время проверки книги Cross-LFS.

  • G. Moko - Обновление текста и набор

  • Maxim Osipov - Тестирование MIPS.

  • Doug Ronne - Различные исправления x86_64.

  • William Zhou - Обновление текста и набор.

  • Theo Schneider - Тестирование пакета Linux Headers.

Спасибо Вам всем за Вашу поддержку.

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

CLFS система будет построена при использовании первоначально установленной системы Unix или дистрибутива Linux (например Debian, Mandrake, Red Hat или SuSE). Эта существующая система (хост) будет использована в качестве отправной точки, предоставляющей основные программы, включая компилятор, компоновщик и оболочку для сборки новой системы. Выберите опцию “Разработка” во время установки дистрибутива для установки этих инструментов.

В качестве альтернативы установки некоторого отдельного дистрибутива на Вашу машину Вы можете захотеть использовать Linux From Scratch LiveCD. CD работает хорошо в качестве хост системы, предоставляя все необходимые инструменты для того, чтобы успешно проследовать по инструкциям книги. Дополнительно он содержит все пакеты с исходниками и патчами для книги LFS и копию этой книги, но не необходимые пакеты или книгу для CLFS. Вы можете использовать CD для сборки CLFS, но Вам понадобится скачать пакеты, патчи и книгу отдельно. Также Вы можете обратиться к http://www.linuxfromscratch.org/hints/downloads/files/lfscd-remastering-howto.txt за информацией по сборке своего собственного CD, заменив пакеты LFS и книгу на соответствующие для CLFS. Поэтому если у Вас есть CD, то Вам не нужно сетевое подключение или дополнительные скачивания. За большей информацией о LFS LiveCD или для скачивания его копии посетите http://www.linuxfromscratch.org/livecd/.

Глава Подготовка нового раздела описывает как создать новый Linux native раздел и файловую систему, место, где новая CLFS система будет скомпилирована и установлена. Глава Пакеты и патчи объясняет, какие пакеты и патчи необходимо скачать для сборки CLFS системы и как сохранить их в новой файловой системе. Глава Окончательные приготовления обсуждает настройки для получения подходящего рабочего окружения. Пожалуйста, прочтите главу Окончательные приготовления внимательно, так как здесь разъясняются важные моменты, которые разработчик должен осознавать перед началом работы над главой Создание инструментов кросс-компилирования и в дальнейшем.

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

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

После сборки наших “Кросс-инструментов” мы начнём сборку очень минимальной рабочей системы в /tools. Эта минимальная система будет собрана, используя кросс-инструментарий в /cross-tools.

В главе Установка основных системных программ будет собрана полная CLFS система. В зависимости от системы, для которой Вы проводите кросс-сборку, Вы также загрузите минимальную временную систему на целевой машине или войдёте в неё в chroot окружении.

Программа chroot (изменение root) используется для входа в виртуальное окружение и запуска новой оболочки, для которой корневая директория будет установлена на раздел CLFS. Это очень похоже на перезагрузку и указание ядру монтировать раздел CLFS в качестве корневого раздела. Главное преимущество в том, что “вход в chroot” позволяет продолжать сборку, используя для сборки CLFS основную систему. Во время ожидания завершения сборки пакета пользователь может работать с другой виртуальной консолью или X и продолжать использовать компьютер как обычно.

Некоторые системы не могут быть собраны при помощи chroot, вместо этого они должны быть загружены. Обычно, если Вы собираете для архитектуры, отличной от хост системы, Вы должны перезагрузиться так как ядро не поддерживает целевую машину. Загрузка влечёт за собой установку нескольких дополнительных пакетов, которые нужны для загрузки, установку загрузочных скриптов и сборку минимального ядра. Мы также опишем некоторые альтернативные методы загрузки в Разделе 7.20, “Что дальше”

Для завершения установки устанавливаются CLFS-Bootscripts и ядро в главе Установка системных скриптов загрузки, а загрузчик устанавливается в главе Обеспечение загрузки СLFS системы. Глава Конец содержит информацию по дальнейшему изучению CLFS после этой книги. После выполнения инструкций этой книги компьютер будет готов к перезагрузке в новую CLFS систему.

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

1.3. Основной список изменений

Это версия 1.0.0 книги Кросс-платформенный Linux From Scratch, датированная September 21, 2006. Если эта книга более чем на шесть месяцев старше, то, возможно, уже доступна более новая и лучшая её версия. Для поиска проверьте одно из зеркал через http://trac.cross-lfs.org/.

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

Содержание изменений:

  • September 18, 2006

    • [Chris] - Removed TeX installation commands from Texinfo instructions.

  • September 16, 2006

    • [jim] - Updated Udev-Cross-LFS rules to 1.0-3. Fixes bootup with /lib64/udev.

  • September 10, 2006

    • [jim] - Added a patch to fix Inetutils. Telnet on 64 bit systems will fail, it will attempt to connect to 255.255.255.255 instead of the ip address entered. This was due to a change in glibc's handling of inet_addr, was long now is u_int32_t. Bug found by Vladimir Vainer.

    • [jim] - Add patch to fix gzexe. Used Matts change from LFS, that utilizes Robert's fix. More details at http://wiki.linuxfromscratch.org/lfs/ticket/1876.

    • [Chris] - Added Host System Requiremets page, and added more info to the "To Boot or Chroot?" page about needing a 2.6.x Linux kernel to chroot.

  • September 9, 2006

    • [jim] - Updated Linux to 2.6.17.13 and Linux Headers to 2.6.17.13-09092006.

  • September 8, 2006

    • [jim] - Fixed Perl Testsuite Network tests.

  • September 7, 2006

    • [jim] - Updated Multilib Tree to follow build standards set in the book.

    • [jim] - Updated copy commands in Linux Headers, simpler and cleaner.

  • September 6, 2006

    • [jim] - UDEV Rules - On multilib builds, change /lib/udev to /lib64/udev, to keep consistency through the system.

    • [jim] - Removed sed from tcl, not required.

    • [jim] - Replace Perl FPIC patch with a sed, to make sure fpic is set correctly.

  • September 5, 2006

    • [jim] - UDEV - On multilib builds, change /lib/udev to /lib64/udev, to keep consistency through the system.

    • [jim] - IPRoute2 - On multilib builds, change /usr/lib/tc to /usr/lib64/tc, to keep consistency through the system.

  • August 28, 2006

    • [jim] - Renamed Cross-LFS Bootscripts 0.4 to 1.0, for the release. No changes made to the scripts.

    • [jim] - Renamed Cross-LFS Udev Rules 0.1-07062006 to 1.0, for the release. No changes made to the rules.

  • August 27, 2006

    • [jim] - Updated to Cross-LFS Bootscripts 0.4.

  • August 23, 2006

    • [jim] - Updated Linux to 2.6.17.11 and Linux Headers to 2.6.17.11-08232006.

    • [jim] - Updated Linux to 2.6.17.10 and Linux Headers to 2.6.17.10-08232006.

  • August 21, 2006

    • [jciccone] - Added a multilib perl setup that has a multilib wrapper. The multilib wrapper checks for the value of PERL_ARCH and executes the cooresponding perl binary.

    • [ken] - Remove include/net from instructions for headers.

  • August 20, 2006

    • [jciccone] - Added the Perl fPIC patch which makes perl build a shared DynaLoader.a.

    • [Chris] - Removed mention of package users hint from "Package Management" page.

    • [jim] - Updated Linux to 2.6.17.9 and Linux Headers to 2.6.17.9-08202006.

    • [jim] - Added Linux Tulip Patch to all Linux 2.6.17.9 builds. Fixes an initialization error.

  • August 8, 2006

    • [jim] - Moved man-pages to the beginning of the build. (fixes ticket #82).

    • [jim] - Updated the wording of Bzip2, changes were made to MIPS but not the other multilib architectures. Updated for all architectures now (fixes ticket #79).

  • August 7, 2006

    • [Chris] - Updated udev explanatory text in the book and added "Custom Symlinks" page, taken from LFS. Thanks to Alexander Patrakov for the updated text (fixes ticket #75).

  • August 3, 2006

    • [ken] - Fixed the temporary bash to correct a failure in the Glibc testsuite, (fixes ticket #78). Thanks to Go Moko.

  • July 27, 2006

    • [jim] - Fixed symlink issue in bootscripts. New Package CLFS-bootscripts 0.3.

  • July 25, 2006

    • [jim] - Symlinks /tools/bin/file to /usr/bin/file for the GCC testsuite.

  • July 24, 2006

    • [Chris] - Updated commands for building the keymap into the kernel - changed the bootable/kernel page to account for the new keymap files location, and changed the instructions in the "boot" section to reflect that fact that we don't know where the keymap files may be on the host (fixes ticket #56).

  • July 20, 2006

    • [jim] - Updated to linux-2.6.17.6 and linux-headers-2.6.17.6-07202006.

    • [jim] - Updated to Udev 096.

  • July 17, 2006

    • [jeremy] - Minor foreword fixups courtesy of Karen.

  • July 16, 2006

    • [Chris] - Removed unneeded chown and chmod commands from final-system linux-headers installation.

    • [Chris] - Added a sed command to fix updatedb due to the new location for the find program.

  • July 14, 2006

    • [jeremy] - Updated to new foreword

  • July 11, 2006

    • [jim] - Updated to linux-headers-2.6.17.4-07112006.

  • July 9, 2006

    • [jim] - Updated to linux-headers-2.6.17.4-07092006.

  • July 8, 2006

    • [jim] - Updated to linux-2.6.17.4 and linux-headers-2.6.17.4-07072006.

    • [Chris] - Removed many "${CLFS}" references from explanatory text in boot section.

  • July 7, 2006

    • [Chris] - Modified the "creating directories" sections - changed multilib instructions to be consistent with the new format now used for every other arch, and changed mips instructions to use xincludes.

  • July 6, 2006

    • [jim] - Updated Udev rules to 07062006, Fixed cdrom, permissions and groups.

  • July 5, 2006

    • [jim] - Fixes a possible issue with bootscripts if the the /usr partition is not mounted during startup. Moved find to /bin and moved some kbd utilities to /bin.

  • July 4, 2006

    • [jim] - Updated the Grub patch to fix various issues, see text of patch for more details.

  • July 2, 2006

    • [Chris] - Updated passwd and group file creation to only create minimal users and groups and include information on other users/groups.

    • [jim] - Added file to Testsuite tools, required for gcc tests.

  • July 1, 2006

    • [jim] - Updated the build to use CLFS in variables instead of LFS. Also change /mnt/lfs to /mnt/clfs.

  • June 29, 2006

    • [jim] - Updated Temp-System and Boot builds to be more consistant. Added --build=${LFS_HOST}, where possible.

    • [jim] - Updated to Cross-LFS Bootscripts. Added check for for /etc/sysconfig/createfiles.

  • June 27, 2006

    • [jim] - Updated to linux-headers-2.6.17.1-06272006.

  • June 25, 2006

    • [jciccone] - Updated to linux-headers-2.6.17.1-06252006.

  • June 24, 2006

    • [jeremy] - Release of 1.0.0-rc1

  • June 23, 2006

    • [jim] - Updated Binutils 2.17.

    • [jim] - Updated Cross-LFS Specific Packages and Patches links for Release.

  • June 22, 2006

    • [jim] - Added mktemp to Linux dependency list. New dependency as of 2.6.17.

    • [jim] - Updated Vim 7.0 patch.

  • June 21, 2006

    • [Chris] - Text updates to the book, including replacing "LFS" with "CLFS".

    • [jim] - Updated to linux-headers-2.6.17.1-06212006-1.

    • [jim] - Updated Vim 7.0 patch.

  • June 20, 2006

    • [jeremy] - Corrected e2fsprogs installation in the boot section, to take into account the new mke2fs.conf file.

    • [jciccone] - Updated to linux-2.6.17.1 and linux-headers-2.6.17.1-06202006.

    • [jim] - Updated to linux-headers-2.6.17.1-06202006-1.

  • June 19, 2006

    • [jciccone] - Updated to man-1.6d.

    • [jciccone] - Added an iconv_fix patch to glibc which fixes an issue that has shown up primarily in samba.

    • [jciccone] - Updated to linux-2.6.17 and linux-headers-2.6.17-06192006.

  • June 15, 2006

    • [jim] - Let Perl use thread support.

  • June 14, 2006

    • [jim] - Updated to Binutils 2.16.94.

  • June 10, 2006

    • [Chris] - Updates to lists of installed programs for several packages.

    • [Ken] - Fixed the module-init-tools install in the presence of existing files. Thanks to Manuel for pointing me to the fix in LFS, and to Dan Nicholson for the fix.

  • June 9, 2006

    • [jim] - Updates to Shadow 4.0.16 build instructions.

    • [jim] - Updated to Linux Headers 2.6.16.20 to 06092006.

  • June 7, 2006

    • [jim] - Updated to Shadow 4.0.16.

  • June 6, 2006

    • [Chris] - Added many more -v switches for verbosity.

  • June 5, 2006

    • [jim] - Updated to linux-2.6.16.20, and linux-headers-2.6.16.20.

    • [jim] - Updated to Bison 2.3.

  • June 4, 2006

    • [Chris] - Removed obsolete paragraph about "resetting" passwords when using pwconv from Shadow instructions.

    • [jim] - Updated to Linux Headers 2.6.16.19 to 06042006.

  • June 1, 2006

    • [Chris] - Updated list of installed programs for several packages.

  • May 31, 2006

    • [ken] - Removed redundant chown of /usr/share/libtool/libltdl.

    • [jim] - Updated to linux-2.6.16.19, and linux-headers-2.6.16.19.

  • May 30, 2006

    • [jim] - Added a patch to fix a missing declaration of R_OK in util-linux.

    • [Chris] - Removed the long-gone swapdev program from the list of programs installed by util-linux, and several programs not installed by default from the kbd program list.

    • [jim] - Updated to E2fsprogs 1.39.

    • [jim] - Updated to Man-Pages 2.33.

  • May 29, 2006

    • [jim] - Updated to Binutils 2.16.93.

    • [jim] - Updated to UDEV 093.

    • [jim] - Updated Udev Rules to 0.1-05292006.

    • [jim] - Updated Linux Headers 2.6.16.18 to 05292006.

  • May 28, 2006

    • [jim] - Added a patch to Grub to prevent. Error 24: Attempt to access block outside partition.

  • May 25, 2006

    • [jim] - Updated to GCC 4.1.1.

    • [jim] - Add Vim 7.0 Upstream Patches.

  • May 22, 2006

    • [jim] - Updated to Coreutils 5.96.

    • [jim] - Updated linux-2.6.16.18, and linux-headers-2.6.16.18.

  • May 21, 2006

    • [jciccone] - Updated to Bison-2.2, linux-2.6.16.17, and linux-headers-2.6.16.17.

  • May 17, 2006

    • [Chris] - Made a number of text updates and grammar fixes and added more dependency info (bootscripts, udev-rules, tree) to Appendix C.

  • May 16, 2006

    • [Chris] - Changed the temp-system and final-system package build order and a few package build instructions to account for the changed order (the rest of ticket #26).

    • [ken] - Change name of coreutils patch to match the patch.

  • May 15, 2006

    • [jim] - Updated to Man-Pages 2.32.

  • May 14, 2006

    • [jim] - Updated Udev Rules to 0.1-05142006.

    • [jim] - Updated Linux Headers 2.6.16.16 to 05142006.

  • May 13, 2006

    • [jim] - Updated to Coreutils 5.95.

  • May 12, 2006

    • [jim] - Add Vim 7.0 Upstream Patches.

  • May 11, 2006

    • [jim] - Updated Linux and Linux Headers to 2.6.16.16.

    • [jim] - Add Vim 7.0 Upstream Patches.

  • May 10,2006

    • [Chris] - Added more detailed dependency info and moved it to Appendices C and D. Fixes half of ticket #26.

  • May 9, 2006

    • [jim] - Updated to Binutils 2.16.92.

    • [jim] - Updated to Vim 7.0.

    • [jciccone] - Updated to Linux 2.6.16.15.

  • May 7, 2006

    • [jim] - Updated Linux Headers 2.6.16.14 to 05072006.

  • May 6, 2006

    • [jciccone] - Updated Linux Headers 2.6.16.14 to 05062006.

  • May 4, 2006

    • [jim] - Updated to Linux-2.6.16.14.

    • [jim] - Updated Linux Headers 2.6.16.13 to 05042006.

  • May 3, 2006

    • [Chris] - Updated to Man-Pages 2.31.

    • [jim] - Updated to Linux-2.6.16.13.

    • [jim] - Updated to Iana-Etc 2.10.

  • May 2, 2006

    • [jim] - Updated Linux Headers 2.6.16.12 to 05022006.

    • [jim] - Reverted change to bash. Needed on some architectures.

    • [jim] - Fixed a coreutils cross-compile issues on some architectures.

  • May 1, 2006

    • [Chris] - Updated to Man-Pages 2.30.

    • [jim] - Updated Linux Headers 2.6.16.11 to 05012006.

    • [Chris] - Updated to Linux-2.6.16.12.

  • April 30, 2006

    • [jim] - Updated Linux Headers 2.6.16.11 to 04302006.

  • April 29, 2006

    • [ken] - Add asm-generic to headers which are chowned in non-multilib books.

  • April 28, 2006

    • [jim] - Updated Linux Headers 2.6.16.11 to 04282006.

    • [jim] - Updated Udev Rules to 0.1-04282006.

  • April 27, 2006

    • [jim] - Updated to Linux Headers 2.6.16.11 to 04272006.

  • April 25, 2006

    • [jim] - Updated to Udev 091.

    • [jim] - Updated to Linux Headers 2.6.16.11 to 04262006.

  • April 24, 2006

    • [ken] - Updated to iproute2-2.6.16-060323.

    • [jim] - Updated to Linux and Linux Headers 2.6.16.11.

  • April 22, 2006

    • [ken] - Add example commands to test if chroot is possible, thanks to William Zhou.

  • April 21, 2006

    • [jim] - Updated Linux-Headers to fix x86_64-biarch problem.

  • April 20, 2006

    • [jim] - Added missing asm-generic copy to Linux-Headers.

    • [jim] - Updated Linux-Headers to include nvram.h.

  • April 19, 2006

    • [jim] - Updated to Bash Patch -8.

    • [jim] - Removed Linux-Libc-Headers and replace it with our Linux-Headers package.

    • [jim] - Updated to Linux 2.6.16.9.

    • [jim] - Updated to Linux 2.6.16.8.

  • April 18, 2006

    • [jim] - Renamed gcc fold_const patch to the PR #.

    • [jim] - Added GCC 4.1.0 patch PR20425. This allows searching of multilib dirs for the specs file.

  • April 17, 2006

    • [Chris] - Removed sed command from temp-system bash - no longer needed for Bash 3.1.

    • [jim] - Updated to Udev 090.

    • [jim] - Updated to udev-rules 0.1-04172006.

    • [jciccone] - Added a gcc patch that fixes an optimaztion error which can result in incorrect code.

    • [jciccone] - Removed the util-linux and kernel patch that fixes the checksum calculation for sun disklabels.

  • April 14, 2006

    • [jciccone] - Added a security patch to tar.

    • [jciccone] - Added a util-linux and kernel patch to fix a checksum calculation issue for sun disklabels.

  • April 13, 2006

    • [jim] - Updated to GCC 4.1.0.

    • [jim] - Fixed make install-minimal in udev-rules.

    • [jim] - Updated to Linux 2.6.16.5.

  • April 12, 2006

    • [jim] - Updated to Glibc 2.4.

    • [jim] - Updated to latest bash patch -7.

  • April 10, 2006

    • [jim] - Changed numbering of udev-rules to use 0.1-SVNDATE.

  • April 6, 2006

    • [jim] - Added install-minimal to udev rules.

    • [jim] - Updated to Udev 089.

  • April 1, 2006

    • [jim] - Updated to Make 3.81.

    • [jim] - Updated to Man-Pages 2.28.

  • March 28, 2006

    • [jim] - Updated to Linux 2.6.16.1.

    • [jim] - Updated to Man-Pages 2.27.

  • March 27, 2006

    • [jciccone] - Updated coreutils suppress_uptime_kill_su patch to -2.

    • [jciccone] - Updated readline fixes patch to -3.patch.

    • [jciccone] - Updated bash fixes patch to -6.

  • March 22, 2006

    • [jim] - Updated Udev to build floppy helper.

  • March 21, 2006

    • [jim] - Updated to Udev 088.

    • [jim] - Updated to Man-Pages 2.26.

    • [jim] - Updated to IPRoute2 2.6.15-060110.

  • March 20, 2006

    • [jim] - Fixed build issue with Texinfo in temp-system. Added --build.

    • [jim] - Updated to Linux 2.6.16.

    • [jim] - Updated to Shadow 4.0.15.

    • [Chris] - Removed note about GCC 2.95.3 from kernel section, as documentation has been updated in linux-2.6.16 and it now recommends GCC >= 3.2.

  • March 15, 2006

    • [jim] - Changed bootscripts to CLFS-bootscripts 0.1.

    • [jim] - Updated to Psmisc 22.2.

    • [jim] - Updated to Flex 2.5.33.

  • March 14, 2006

    • [jim] - Updated to Linux 2.6.16-rc6.

    • [jim] - Removal of Hotplug.

    • [jim] - Updated to Udev 087.

    • [jim] - Removal of old udev rules.

    • [jim] - Added Udev-Cross-LFS 0.1.

    • [jim] - Updated to GCC 4.0.3.

    • [jim] - Updated to File 4.17.

  • March 13, 2006

    • [jciccone] - Removed pure64 bootloader warning from the top page.

  • March 9, 2006

    • [Chris] - Simplified IPRoute2 instruction by removing redundant "configure" command.

  • March 2, 2006

    • [Chris] - Updated to Man-Pages 2.25.

    • [Chris] - Reverted to Expect 5.43.0. 5.44.1 depends on Tk.

  • February 27, 2006

    • [jim] - Updated Bash fixes patch to -5.

  • February 26, 2006

    • [jim] - Updated to Expect 5.44.1.

  • February 23, 2006

    • [Chris] - Simplified the "Changing Ownership" page for the boot section, and rewrote some of the text in the final "Reboot" page.

  • February 21, 2006

    • [jim] - Removed Dependency of Tempfile from Bzip2.

    • [jim] - Updated Bash fixes patch to -4.

    • [jciccone] - Updated to Man-Pages 2.24

  • February 14, 2006

    • [jim] - Updated to Coreutils 5.94.

  • February 11, 2006

    • [Chris] - Added -v switches to commands that accept it.

  • February 9, 2006

    • [jim] - Updated to Man-Pages 2.23.

  • February 8, 2006

    • [jim] - Changed x86_64 to use unknown in the target triplet.

  • February 7, 2006

    • [Chris] - Removed inetutils from boot section - it will be covered in the "netboot" hint.

    • [Chris] - Added section on Package Management - moved out of BLFS.

  • February 6, 2006

    • [Chris] - Moved the text explaining why binutils should be the first package compiled to a more appopriate location at the first installation of binutils, and changed the wording in temp-system gettext.

    • [jim] - Updated Readline and Bash patches from Upstream.

  • February 5, 2006

    • [jim] - Updated Procps 32bit build in Multilib builds to use lib64=lib. Fixed via Trac Ticket #2.

    • [jim] - Updated to Man-Pages 2.22.

  • February 3, 2006

    • [jim] - Updated to Sed 4.1.5.

  • February 2, 2006

    • [jim] - Updated to Perl 5.8.8.

    • [jhuntwork] - Minor textual fix to GCC.

  • February 1, 2006

    • [Chris] - Added a sed substitution to man instructions to fix an error in the makewhatis script.

  • January 31, 2006

    • [Chris] - Added -v to commands that accept them, for consistency with LFS.

  • January 30, 2006

    • [jim] - Change final-system GCC, to use make bootstrap. Update provided by Ryan Oliver.

  • January 29, 2006

    • [jim] - Updated Toolchain adjustment in final-system. Thank you Dan Nicholson.

  • January 24, 2006

    • [jim] - Updated to Man 1.6c.

  • January 23, 2006

    • [Chris] - Removed unnecessary --with-ncurses switches from temp-system bash and inetutils.

    • [Chris] - Moved zlib from temp-system to boot as it's not needed if you chroot.

  • January 19, 2006

    • [Chris] - Removed patch from shadow instructions.

    • [Chris] - Added perl sprintf vulnerability patch.

    • [jim] - Updated to Man-Pages 2.21.

  • January 13, 2006

    • [ken] - Moved grep ahead of libtool to avoid /tools being hardcoded into the libtool script for EGREP.

    • [ken] - Alter bison to build repeatably, from LFS.

    • [ken] - Alter gccbug to use mktemp, from LFS.

    • [ken] - Move creation of /etc/hosts within Perl instructions, for repeatability, from LFS.

    • [Chris] - Moved bootloader setup to right after "Changing Ownership" in Chapter 7, and changed several package installation instructions in that chapter.

  • January 12, 2006

    • [Chris] - Moved directory and symlink creation pages to the beginning of Chapter 7.

    • [jim] - Updated to Psmisc 22.1.

    • [jim] - Updated to Man-Pages 2.20.

    • [jim] - Updated Coreutils build instructions to copy more files to /bin. These are changes for bootscripts and the new udev rules.

    • [jim] - Updated to Linux 2.6.14.6.

    • [jim] - Numerous complaints about temp-system Perl failing to build. So I moved temp perl to first package in final-system build. The failures we noted on Pure 64 builds.

  • January 11, 2006

    • [jim] - Rewrote wrote zlib final instructions to include a patch the will allow build of static and shared libraries at the same time. Thanx for the recommendation Tushar Teredesai.

  • January 8, 2006

    • [Chris] - Rewrote much of the description of the build process and test suite information.

  • January 3, 2006

    • [jim] - Updated to Shadow 4.0.14.

  • December 30, 2005

    • [Chris] - Updated package dependencies, removed explanation of "target alias" and "cross-compiling" from final-system binutils, and removed note about GRUB's testsuite failure.

    • [ken] - Fix where tree gets installed.

  • December 29, 2005

    • [jim] - Added CC="gcc" to temp-system perl build.

  • December 28, 2005

    • [ken] - Remove --with-x=no from expect - either we booted, or we are in chroot.

    • [ken] - Fix a failure to build glibc-headers.

    • [jim] - Updated to Linux 2.6.14.5.

  • December 23, 2005

    • [jim] - Updated Shadow patch to fix linking to outside libraries.

  • December 22, 2005

    • [jim] - Bash Maintainer Released Bash-001 patch. This patch fixes the following issue: There are parsing problems with compound assignments in several contexts, including as arguments to builtins like `local', `eval', and `let', and as multiple assignments in a single command.

    • [jim] - Readline Maintainer Released Readline-001 patch. This patch fixes the following issue: A problem with the readline callback interface can result in segmentation faults when using the delete-char function via a multiple-key sequence. Two consecutive calls to delete-char will crash the application calling readline.

    • [jim] - Removed halt, sync, and shutdown users. These users work, but offer a potential security threat. Thus the reason for removal.

    • [jim] - Fixed Vim symlink. Thank you LFS and Jeremy Huntwork.

  • December 20, 2005

    • [jim] - Updated to M4 1.4.4.

  • December 19, 2005

    • [ken] - Fix for accessing vim's documentation, from LFS.

    • [jim] - Fixed the Gettext testsuite from failing, by fixing an issue in Gawk. Thank you Greg Schaefer.

  • December 18, 2005

    • [jim] - Re-arranged temp-tools. Renamed it to testsuite-tools. Moved perl and texinfo to temp-system. Moved flags from testsuite-tools to chroot and boot sections.

    • [jim] - Removed 32bit and N32 builds from temp-system, upon testing it was found that these were not needed for building the final system on a multilib capable build.

    • [jim] - Updated to Libtool 1.5.22.

    • [jim] - Updated to Man-Pages 2.18.

  • December 17, 2005

    • [jim] - Updated to psmisc 21.9.

  • December 16, 2005

    • [jim] - Moved Tree to temp-tools, since it's not needed for the final-system.

    • [jim] - Moved Procps before perl in the final-system build. Fixes test suite issue in perl.

  • December 15, 2005

    • [ken] - Minor fix for rendering in temp-tools/texinfo.

    • [jim] - Added not to temp-system about the WARNING message.

  • December 14, 2005

    • [jim] - Change the CLFS_HOST and CLFS_TARGET pages to prevent further build issues.

    • [jim] - Updated to Man-Pages 2.17.

    • [jim] - Added Tree 1.5.0. Added for the udev testsuite.

  • December 13, 2005

    • [jim] - Removed setvbuf test from Temp-System Bash compile. Thanks to David Fix.

  • December 12, 2005

    • [jim] - Removed testsuites from Temp-Tools section.

  • December 11, 2005

    • [ken] - Fix Tcl configure, thanks to Greg Schafer.

  • December 9, 2005

    • [jim] - Upgraded to Module Init Tools 3.2.2.

    • [ken] - Bzip2 - clarify what is being tested.

    • [jim] - Removed installation of sound sanitized headers. They will be removed in the next release of linux-libc-headers.

  • December 8, 2005

    • [jim] - Upgraded to Less 394.

    • [jim] - Upgraded to Bash 3.1.

    • [jim] - Upgraded to Readline 5.1.

  • December 7, 2005

    • [jim] - Upgraded to TCL 8.4.12.

    • [jim] - Upgraded to IPRoute2 2.6.14-051107.

    • [jim] - Upgraded to Readline 5.0.5.

    • [jim] - Upgraded to Bash 3.0.16.

  • December 6, 2005

    • [jim] - Upgraded to Glibc 20051107.

    • [jim] - Sparcv8 now uses the same Glibc as the other architectures.

    • [jim] - Ported Gettext update from Temp-system LFS to Cross-LFS.

    • [ken] - Tidying in Gettext to reflect our differences from LFS, and correct the date in changelog.

    • [jim] - Moved Cross-tools from $HOME to LFS. This provide a easy way for livecd builders to not loose valueable build time, if something goes wrong.

    • [jim] - Upgraded to Findutils 4.2.27.

  • December 5, 2005

    • [Matt Darcy] - Updated the resources page to include reference and base instructions on using the LFS pastebin

    • [Matt Darcy] - Updated some of the missing text poritions of the book

    • [Matt Darcy] - Updated creation of $CLFSHOME parameter to a less user error system. This change will will need to be validated by by other devs

    • [ken] - Moved Mktemp ahead of Module-init-tools so that the latter's testsuite doesn't bail out when testing generate-modprobe.conf.

  • December 3, 2005

    • [ken] - Reference a home directory for dummy user when testing coreutils, and correct sed 'man page' to 'HTML documentation', both from LFS.

  • December 2, 2005

    • [jim] - Updated to Man-Pages 2.16.

  • December 1, 2005

    • [jim] - Updated to Linux 2.6.14.3.

    • [jim] - Updated to Man-Pages 2.15.

    • [jim] - Updated to Udev 076.

    • [jim] - Added support for Sparc v8 and below.

  • November 30, 2005

    • [jim] - Text updates to final-system.

    • [jim] - Text updates to temp-tools.

  • November 29, 2005

    • [jim] - Text updates to chroot.

    • [jim] - Text updates to boot.

  • November 28, 2005

    • [jim] - Text updates to glibc in all sections.

    • [jim] - Text updates to temp-system.

    • [jim] - Fixed duplicated gcc configure line in gcc. Thank you Dennis Perkins.

  • November 27, 2005

    • [jim] - Text updates to gcc in all sections.

    • [jim] - Updates to Ncurses, added curses file and link. Thank you G. Moko.

  • November 25, 2005

    • [jim] - Text updates to binutils in all sections.

  • November 24, 2005

    • [Matt Darcy] - Text updates to resources page

    • [Matt Darcy] - Updated reference to LFS news server to reflect that it no longer exists

  • November 23, 2005

    • [jim] - For inetutils to utilize the Ncurses headers in /tools/include.

  • November 21, 2005

    • [jim] - Updated to Udev 075.

    • [jim] - Updated to Module Init Tools 3.2.1.

  • November 20, 2005

    • [jim] - Updated to Findutils 4.2.26.

  • November 18, 2005

    • [manuel] - Fixed the unpack of the module-init-tools-testsuite package.

  • November 17, 2005

    • [jim] - Update to Man-Pages 2.14.

    • [jim] - Update to Linux 2.6.14.2. This includes changes for the MIPS Architecture. New Patch added.

    • [jim] - Added change to move /usr/bin/less to /bin/less.

  • November 13, 2005

    • [manuel] - Improve the heuristic for determining a locale that is supported by both Glibc and packages outside LFS. Ported from LFS-SVN.

    • [manuel] - Omit running Bzip2's testsuite as a separate step, as make runs it automatically. Ported from LFS-SVN.

    • [jim] - Updated TCL build to install headers. Thank you Greg Schafer.

    • [jim] - Updated Expect to use the newly relocated TCL Headers. Thank you Greg Schafer.

  • November 10, 2005

    • [ken] - Added Data/Dumper to temp perl modules, for coreutils testsuite. Ported from LFS-SVN.

    • [ken] - Removed POSIX VERSION information from coreutils page Thank you G Moko.

    • [jim] - Added text for multilib kernel build requirements.

  • November 9, 2005

    • [manuel] - Stop Udev from killing udevd processes on the system and removed udevdir=/dev. Ported from LFS-SVN.

    • [manuel] - Install the binaries from Less to /usr/bin instead of /bin. Ported from LFS-SVN.

    • [manuel] - Removed SBUs and disk usage information.

    • [jim] - Added missing utmp group. Thank you William Zhou.

  • November 8, 2005

    • [jim] - Removed make headers -C bfd from Binutils. Thank you Robert Day.

  • November 7, 2005

    • [manuel] - Remove the optimization related warnings from the toolchain packages. Ported from LFS-SVN.

    • [manuel] - Install Vim's documentation to /usr/share/doc/vim-7.0 instead of /usr/share/vim/vim64/doc. Ported from LFS-SVN.

    • [manuel] - Correct the instructions for running the Module-Init-Tools' testsuite. Ported from LFS-SVN.

    • [jim] - Removed unnecessary linking libc sed in gcc-final in cross-tools. Recommendation from Erik-Jan, via cross-lfs list.

  • November 6, 2005

    • [jim] - Updated to Coreutils 5.93.

    • [jim] - Updated to Procps 3.2.6.

    • [jim] - Updated to Man-Pages 2.13.

  • November 5, 2005

    • [jim] - Updated to psmisc 21.8.

  • November 3, 2005

    • [jim] - Fixes added to coreutils. Coreutils was install locales to /locale. Added fixes for dircolors and md5sum also.

  • October 31, 2005

    • [jim] - Now an official project. Resetting all Changelogs.

Ветка синхронизирована с релизом LFS 6.0 23 февраля 2005

1.4. Список изменений для x86

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

Содержание изменений:

  • 10 сентября 2006

    • [Chris] - Изменена команда для копирования файлов в инструкциях GRUB из "/usr/lib/grub/i386-pc/" в "/usr/lib/grub/*/". Решение билета #93.

  • May 5,2006

    • [ken] - Исправление опечатки в find для заголовков финальной системы.

  • October 31, 2005

    • [jim] - Теперь официальный проект. Сброс всех списков изменений.

1.5. Ресурсы

1.5.1. FAQ

Если на протяжении сборки CLFS системы Вы получите некоторые ошибки, вызывающие вопросы, или подумаете, что в книге есть опечатки, пожалуйста, начните с консультации в Часто Задаваемых Вопросах (FAQ), которые размещены на http://trac.cross-lfs.org/wiki/faq.

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

Сервер cross-lfs.org размещает некоторое количество списков рассылки, используемые разработчиками проекта LFS. Эти списки включают, помимо прочего, список разработчиков и список поддержки. Если FAQ не решит Вашу проблему, то следующим шагом будет поиск в списках рассылки на http://www.mail-archive.com. Вы можете найти списки рассылки по следующей ссылке:

http://www.mail-archive.com/index.php?hunt=clfs

Для поиска информации о доступных списках рассылки, подписки на них, просмотра их архивов и т.п. загляните на http://trac.cross-lfs.org/wiki/lists.

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

Cross-LFS не поддерживает собственный сервер новостей, но мы предоставляем доступ через gmane.org http://gmane.org. Если Вы хотите подписаться на Cross-LFS, используйте gmane.org. Вы можете найти поиск игр для CLFS по следующей ссылке:

http://dir.gmane.org/search.php?match=clfs

1.5.4. IRC

Множество членов сообщества СLFS используют IRC сервер сообщества. Перед тем, как использовать этот вид поддержки, проверьте СLFS FAQ и архивы списков рассылки. Возможно, на Ваш вопрос уже есть ответ. Вы сможете найти наш IRC сервер на chat.freenode.net. Канал поддержки для cross-lfs называется #cross-lfs. Если Вам необходимо показать людям вывод Вашей проблемы, используйте http://pastebin.linuxfromscratch.org и ссылку pastebin URL когда задаёте вопросы.

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

Проект LFS имеет ряд зеркал в сети. Список текущих зеркал можно увидеть на http://trac.cross-lfs.org/wiki/mirrors.

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

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

1.6. Помощь

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

У нас также есть отличное сообщество СLFS, которое готово предложить помощь через IRC и списки рассылки (смотри в Разделе 1.5, “Ресурсы” этой книги). Хотя мы каждый день отвечаем на несколько вопросов, на многие из них ответ может быть легко найден в FAQ и поиском по спискам рассылки. Поэтому, чтобы мы предоставили лучшую возможную помощь, Вам самим сначала необходимо сделать некоторые изыскания. Это позволит нам сфокусироваться на более необычных потребностях поддержки. Если Ваши поиски не приведут к результатам, пожалуйста, включайте всю доступную информацию (упомянутую ниже) в задаваемый вопрос.

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

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

  • Версия используемой книги (в данном случае 1.0.0)

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

  • Какие архитектуры у хоста и целевой системы

  • Значения переменных окружения ${CLFS_HOST}, ${CLFS_TARGET}, ${BUILD32} и ${BUILD64}

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

  • Сообщение об ошибке или симптомы проблемы. Смотрите пример ниже Разделе 1.6.3, “Проблемы компилирования”

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

Замечание

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

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

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

1.6.3. Проблемы компилирования

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

gcc -DALIASPATH=\"/mnt/clfs/usr/share/locale:.\"
-DLOCALEDIR=\"/mnt/clfs/usr/share/locale\"
-DLIBDIR=\"/mnt/clfs/usr/lib\"
-DINCLUDEDIR=\"/mnt/clfs/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':
/clfs/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 `/clfs/tmp/make-3.79.1'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/clfs/tmp/make-3.79.1'
make: *** [all-recursive-am] Error 2

В этом случае большинство людей включают в сообщение строчку:

make [2]: *** [make] Error 1

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

В Интернете есть отличная статья о том, как надо правильно задавать вопросы, расположенная на http://catb.org/~esr/faqs/smart-questions.html. Прочтите эту статью и примите к сведению при задавании вопросов, тогда Ваши шансы получить полный и квалифицированный ответ значительно возрастут.

Часть II. Подготовка к сборке

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

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

В этой главе подготавливается раздел, который будет хостом CLFS системы. Мы сами создадим раздел, создадим в нём файловую систему и примонтируем её.

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

Как и большинство операционных систем, CLFS обычно устанавливается на выделенный раздел. Рекомендованный подход для сборки CLFS системы это использование доступного пустого раздела или, если у Вас есть достаточно неиспользуемого под разделы места, создать его. Хотя, если Вы собираете для другой архитектуры, то Вы можете просто собрать всё в “/mnt/clfs” и переместить это на Вашу целевую машину.

Для минимальной системы нам понадобится раздел около 1.2 ГБ. Это позволит сохранить все исходники и архивы и собрать все пакеты. Но если Вы хотите установить СLFS в качестве основной Linux системы, то Вам, видимо, понадобятся дополнительные программы и надо будет больше места, возможно около 2 или 3 ГБ. Система СLFS сама не занимает так много места. Большая часть этих требований к дисковому пространству предоставляет достаточную свободу для временного пространства. Сборка пакетов может требовать много дискового пространства, которое будет освобождено после установки пакетов.

Для того, чтобы Вам всегда хватало оперативной памяти, неплохо было бы использовать небольшой раздел диска для подкачки (swap space) - это место будет использоваться ядром для сохранения редко используемых данных из памяти для увеличения объема доступной памяти за счет этого раздела. Раздел подкачки может быть одним для всех Ваших систем: СLFS и основной, так что Вам не надо создавать второй такой раздел, если у Вас уже есть один.

Программы для оперирования разделами, такие как cfdisk или fdisk, запускаются с именем диска, на котором будет производится изменение - например /dev/hda для главного IDE диска. Создайте Linux native раздел и раздел подкачки в случае надобности. Пожалуйста, изучите мануалы по cfdisk(8) или fdisk(8) если Вы не знаете, как использовать эти программы.

Запомните расположение Вашего нового раздела - что-то наподобие hda5. Эта книга ссылается на этот раздел, как на раздел СLFS. Если у Вас есть раздел подкачки, то запомните и его расположение. Оно нам понадобится для файла /etc/fstab.

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

Теперь у нас есть пустой раздел и нам надо создать на нём файловую систему. Наиболее используемой системой в Linux является second extended (ext2), но современные высококачественные жёсткие диски делают более популярными журналируемые файловые системы. Здесь мы создадим файловую систему ext2, а инструкции по установке других файловых систем можно найти на http://www.linuxfromscratch.org/blfs/view/svn/postlfs/filesystems.html.

Для создания файловой системы ext2 в разделе СLFS необходимо выполнить:

mke2fs /dev/[xxx]

Замените [xxx] на имя Вашего раздела СLFS (что-то типа hda5).

Замечание

Некоторые дистрибутивы используют собственные функции в их инструментах создания файловых систем (E2fsprogs). Это может привести к проблемам во время загрузки в Вашу новую CLFS систему так как эти функции не будут поддержаны E2fsprogs, установленными в CLFS; Вы получите ошибку, похожую на unsupported filesystem features, upgrade your e2fsprogs. Для проверки, поддерживает ли Ваша хост система собственные расширения, выполните следующую команду:

debugfs -R feature /dev/[xxx]

Если вывод содержит расширения, отличные от: dir_index; filetype; large_file; resize_inode или sparse_super, то Ваша хост система может иметь собственные расширения. В таком случае для избежания последующих проблем Вы должны скомпилировать главный пакет E2fsprogs и использовать результирующие бинарники для пересоздания файловой системы на Вашем CLFS разделе:

cd /tmp
tar xjf /path/to/sources/e2fsprogs-1.39.tar.bz2
cd e2fsprogs-1.39
mkdir build
cd build
../configure
make #note that we intentionally don't 'make install' here!
./misc/mke2fs /dev/[xxx]
cd /tmp
rm -rf e2fsprogs-1.39

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

mkswap /dev/[yyy]

Замените [yyy] на имя swap раздела.

2.4. Монтирование нового раздела

Теперь, когда мы создали в разделе файловую систему, нам надо получить к ней доступ. Для этого нам необходимо выбрать точку монтирования и примонтировать этот раздел в неё. В этой книге подразумевается, что файловая система монтирована в /mnt/clfs, но это не обязательно, поступите так, как Вам больше нравится.

Выберем точку монтирования и свяжим её с переменной окружения CLFS, для этого запустим:

export CLFS=/mnt/clfs

Теперь создадим точку монтирования и примонтируем файловую систему СLFS запуском следующей команды:

mkdir -pv ${CLFS}
mount -v /dev/[xxx] ${CLFS}

Замените [xxx] на имя Вашего раздела CLFS.

Если Вы решили использовать несколько разделов для CLFS (например одну для /, а другую для /usr), примонтируйте их следующим образом:

mkdir -pv ${CLFS}
mount -v /dev/[xxx] ${CLFS}
mkdir -v ${CLFS}/usr
mount -v /dev/[yyy] ${CLFS}/usr

Замените [xxx] и [yyy] на соответствующие имена разделов.

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

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

Глава 3. Пакеты и патчи

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

Эта глава включает список пакетов, которые Вам надо будет скачать для сборки простейшей Linux системы. Указанные версии являются версиями, о которых точно известно, что они работают, и эта книга базируется на них. Если Вы не являетесь опытным установщиком LFS, мы строго рекомендуем не испытывать новые версии, так как команды сборки для них могут отличаться. Также не рекомендуется использовать последние версии пакетов из-за того, что ещё неизвесно, какие проблемы может вызвать их установка и как они будут работать.

Места для скачивания могут быть не всегда доступны. Если место для скачивания было изменено за время публикации этой книги, Google (http://www.google.com/) предлагает полезную поисковую службу для большинства пакетов. Если этот поиск будет безуспешным, попробуйте один из альтернативных способов, обсуждаемых на http://cross-lfs.org/files/packages/1.0.0/.

Вам надо сохранить скачанные пакеты и патчи так, чтобы они были доступны из точки сборки. Вам также будет нужна директория для распаковки исходников и их сборки. В книге мы используем директорию ${CLFS}/sources как место для записи тарболов и патчей и как рабочую директорию. Это позволяет сделать их доступными из раздела СLFS на всём протяжении процесса сборки системы.

Для создания директории, как пользователь root, выполните следующую команду перед началом сессии скачивания пакетов:

mkdir -v ${CLFS}/sources

Сделайте эту директорию доступной для записи и прикреплённой. Когда директория помечена, как “прикреплённая”, то это означает, что даже если различные пользователи имеют права записи в директорию, только владелец файла может удалить файл из прикреплённой директории. Следующая команда включит режим записи и прикреплённости:

chmod -v a+wt ${CLFS}/sources

3.2. Все пакеты

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

Autoconf (2.59) - 904 KБ:

Домашняя страница: http://www.gnu.org/software/autoconf/

Адрес для скачивания: http://ftp.gnu.org/gnu/autoconf/autoconf-2.59.tar.bz2

Контрольная сумма: 1ee40f7a676b3cfdc0e3f7cd81551b5f

Automake (1.9.6) - 748 KБ:

Домашняя страница: http://www.gnu.org/software/automake/

Адрес для скачивания: http://ftp.gnu.org/gnu/automake/automake-1.9.6.tar.bz2

Контрольная сумма: c11b8100bb311492d8220378fd8bf9e0

Bash (3.1) - 2,475 KБ:

Домашняя страница: http://www.gnu.org/software/bash/

Адрес для скачивания: http://ftp.gnu.org/gnu/bash/bash-3.1.tar.gz

Контрольная сумма: ef5304c4b22aaa5088972c792ed45d72

Bash Documentation (3.1) - 2,013 KБ:

Адрес для скачивания: http://ftp.gnu.org/gnu/bash/bash-doc-3.1.tar.gz

Контрольная сумма: a8c517c6a7b21b8b855190399c5935ae

Binutils (2.17) - 13,496 KБ:

Домашняя страница: http://sources.redhat.com/binutils/

Адрес для скачивания: http://ftp.gnu.org/gnu/binutils/binutils-2.17.tar.bz2

Контрольная сумма: e26e2e06b6e4bf3acf1dc8688a94c0d1

Bison (2.3) - 1,060 KБ:

Домашняя страница: http://www.gnu.org/software/bison/

Адрес для скачивания: http://ftp.gnu.org/gnu/bison/bison-2.3.tar.bz2

Контрольная сумма: c18640c6ec31a169d351e3117ecce3ec

Bzip2 (1.0.3) - 654 KБ:

Домашняя страница: http://www.bzip.org/

Адрес для скачивания: http://www.bzip.org/1.0.3/bzip2-1.0.3.tar.gz

Контрольная сумма: 8a716bebecb6e647d2e8a29ea5d8447f

CLFS-Bootscripts (1.0) - 28 KБ:

Адрес для скачивания: http://cross-lfs.org/files/packages/1.0.0/bootscripts-cross-lfs-1.0.tar.bz2

Контрольная сумма: 79bff3247411589d7de51fdaea9578bd

Coreutils (5.96) - 4,960 KБ:

Домашняя страница: http://www.gnu.org/software/coreutils/

Адрес для скачивания: http://ftp.gnu.org/gnu/coreutils/coreutils-5.96.tar.bz2

Контрольная сумма: bf55d069d82128fd754a090ce8b5acff

DejaGNU (1.4.4) - 1,056 KБ:

Домашняя страница: http://www.gnu.org/software/dejagnu/

Адрес для скачивания: http://ftp.gnu.org/gnu/dejagnu/dejagnu-1.4.4.tar.gz

Контрольная сумма: 053f18fd5d00873de365413cab17a666

Diffutils (2.8.7) - 1,034 KБ:

Домашняя страница: http://www.gnu.org/software/diffutils/

Адрес для скачивания: ftp://alpha.gnu.org/gnu/diffutils/diffutils-2.8.7.tar.gz

Контрольная сумма: 18d6587cb915e7aa110a5d463d6ed156

E2fsprogs (1.39) - 3,612 KБ:

Домашняя страница: http://e2fsprogs.sourceforge.net/

Адрес для скачивания: http://prdownloads.sourceforge.net/e2fsprogs/e2fsprogs-1.39.tar.gz?download

Контрольная сумма: 06f7806782e357797fad1d34b7ced0c6

Expect (5.43.0) - 514 KБ:

Домашняя страница: http://expect.nist.gov

Адрес для скачивания: http://expect.nist.gov/src/expect-5.43.0.tar.gz

Контрольная сумма: 43e1dc0e0bc9492cf2e1a6f59f276bc3

File (4.17) - 544 KБ:

Адрес для скачивания: ftp://ftp.gw.com/mirrors/pub/unix/file/file-4.17.tar.gz

Контрольная сумма: 50919c65e0181423d66bb25d7fe7b0fd

Замечание

Пакет File (4.17) может быть недоступен, когда Вы это читаете. На главных местах для скачивания удаляют старые версии пакетов. Альтернативные места для скачивания, которые могут иметь корректную версию, доступны на http://cross-lfs.org/files/packages/1.0.0/.

Findutils (4.2.27) - 1,097 KБ:

Домашняя страница: http://www.gnu.org/software/findutils/

Адрес для скачивания: http://ftp.gnu.org/gnu/findutils/findutils-4.2.27.tar.gz

Контрольная сумма: f1e0ddf09f28f8102ff3b90f3b5bc920

Flex (2.5.33) - 680 KБ:

Домашняя страница: http://flex.sourceforge.net

Адрес для скачивания: http://prdownloads.sourceforge.net/flex/flex-2.5.33.tar.bz2?download

Контрольная сумма: 343374a00b38d9e39d1158b71af37150

Gawk (3.1.5) - 1,716 KБ:

Домашняя страница: http://www.gnu.org/software/gawk/

Адрес для скачивания: http://ftp.gnu.org/gnu/gawk/gawk-3.1.5.tar.bz2

Контрольная сумма: 5703f72d0eea1d463f735aad8222655f

GCC (4.1.1) - 38,300 KБ:

Домашняя страница: http://gcc.gnu.org/

Адрес для скачивания: http://ftp.gnu.org/gnu/gcc/gcc-4.1.1/gcc-4.1.1.tar.bz2

Контрольная сумма: ad9f97a4d04982ccf4fd67cb464879f3

Gettext (0.14.5) - 6,940 KБ:

Домашняя страница: http://www.gnu.org/software/gettext/

Адрес для скачивания: http://ftp.gnu.org/gnu/gettext/gettext-0.14.5.tar.gz

Контрольная сумма: e2f6581626a22a0de66dce1d81d00de3

Glibc (2.4) - 14,847 KБ:

Домашняя страница: http://www.gnu.org/software/libc/

Адрес для скачивания: http://ftp.gnu.org/gnu/glibc/glibc-2.4.tar.bz2

Контрольная сумма: 7e9a88dcd41fbc53801dbe5bdacaf245

Grep (2.5.1a) - 516 KБ:

Домашняя страница: http://www.gnu.org/software/grep/

Адрес для скачивания: http://ftp.gnu.org/gnu/grep/grep-2.5.1a.tar.bz2

Контрольная сумма: 52202fe462770fa6be1bb667bd6cf30c

Groff (1.19.2) - 2,836 KБ:

Домашняя страница: http://www.gnu.org/software/groff/

Адрес для скачивания: http://ftp.gnu.org/gnu/groff/groff-1.19.2.tar.gz

Контрольная сумма: f7c9cf2e4b9967d3af167d7c9fadaae4

Gzip (1.3.5) - 324 KБ:

Домашняя страница: http://www.gzip.org/

Адрес для скачивания: ftp://alpha.gnu.org/gnu/gzip/gzip-1.3.5.tar.gz

Контрольная сумма: 3d6c191dfd2bf307014b421c12dc8469

Iana-Etc (2.10) - 184 KБ:

Домашняя страница: http://www.sethwklein.net/projects/iana-etc/

Адрес для скачивания: http://www.sethwklein.net/projects/iana-etc/downloads/iana-etc-2.10.tar.bz2

Контрольная сумма: 53dea53262b281322143c744ca60ffbb

Inetutils (1.4.2) - 1019 KБ:

Домашняя страница: http://www.gnu.org/software/inetutils/

Адрес для скачивания: http://ftp.gnu.org/gnu/inetutils/inetutils-1.4.2.tar.gz

Контрольная сумма: df0909a586ddac2b7a0d62795eea4206

IPRoute2 (2.6.16-060323) - 378 KБ:

Домашняя страница: http://linux-net.osdl.org/index.php/Iproute2

Адрес для скачивания: http://developer.osdl.org/dev/iproute2/download/iproute2-2.6.16-060323.tar.gz

Контрольная сумма: f31d4516b35bbfeaa72c762f5959e97c

Kbd (1.12) - 618 KБ:

Адрес для скачивания: http://www.kernel.org/pub/linux/utils/kbd/kbd-1.12.tar.bz2

Контрольная сумма: 069d1175b4891343b107a8ac2b4a39f6

Less (394) - 286 KБ:

Домашняя страница: http://www.greenwoodsoftware.com/less/

Адрес для скачивания: http://www.greenwoodsoftware.com/less/less-394.tar.gz

Контрольная сумма: a9f072ccefa0d315b325f3e9cdbd4b97

Libtool (1.5.22) - 2,854 KБ:

Домашняя страница: http://www.gnu.org/software/libtool/

Адрес для скачивания: http://ftp.gnu.org/gnu/libtool/libtool-1.5.22.tar.gz

Контрольная сумма: 8e0ac9797b62ba4dcc8a2fb7936412b0

Linux (2.6.17.13) - 40,320 KБ:

Домашняя страница: http://www.kernel.org/

Адрес для скачивания: http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.17.13.tar.bz2

Контрольная сумма: 834885b3ad9988b966570bee92459572

Linux-Headers (2.6.17.13-09092006) - 1,576 KБ:

Домашняя страница: http://headers.cross-lfs.org/

Адрес для скачивания: http://cross-lfs.org/files/packages/1.0.0/linux-headers-2.6.17.13-09092006.tar.bz2

Контрольная сумма: bfda0e9440dd76e6e35fdce79c9b0bf6

M4 (1.4.4) - 300 KБ:

Домашняя страница: http://www.gnu.org/software/m4/

Адрес для скачивания: http://ftp.gnu.org/gnu/m4/m4-1.4.4.tar.bz2

Контрольная сумма: eb93bfbcb12cf00165583302bb31a822

Make (3.81) - 1,125 KБ:

Домашняя страница: http://www.gnu.org/software/make/

Адрес для скачивания: http://ftp.gnu.org/gnu/make/make-3.81.tar.bz2

Контрольная сумма: 354853e0b2da90c527e35aabb8d6f1e6

Man (1.6d) - 268 KБ:

Домашняя страница: http://primates.ximian.com/~flucifredi/man/

Адрес для скачивания: http://primates.ximian.com/~flucifredi/man/man-1.6d.tar.gz

Контрольная сумма: 36d3f65bcc10f0754a3234e00d92ad6d

Man-pages (2.33) - 1,752 KБ:

Адрес для скачивания: http://www.kernel.org/pub/linux/docs/manpages/man-pages-2.33.tar.bz2

Контрольная сумма: e9f61ec73b5390c582530da173c12b10

Mktemp (1.5) - 69 KБ:

Домашняя страница: http://www.mktemp.org/

Адрес для скачивания: ftp://ftp.mktemp.org/pub/mktemp/mktemp-1.5.tar.gz

Контрольная сумма: 9a35c59502a228c6ce2be025fc6e3ff2

Module-Init-Tools (3.2.2) - 166 KБ:

Адрес для скачивания: http://www.kerneltools.org/pub/downloads/module-init-tools/module-init-tools-3.2.2.tar.bz2

Контрольная сумма: a1ad0a09d3231673f70d631f3f5040e9

Ncurses (5.5) - 2,260 KБ:

Домашняя страница: http://dickey.his.com/ncurses/

Адрес для скачивания: ftp://invisible-island.net/ncurses/ncurses-5.5.tar.gz

Контрольная сумма: e73c1ac10b4bfc46db43b2ddfd6244ef

Patch (2.5.9) - 198 KБ:

Домашняя страница: http://www.gnu.org/software/patch/

Адрес для скачивания: ftp://alpha.gnu.org/gnu/diffutils/patch-2.5.9.tar.gz

Контрольная сумма: dacfb618082f8d3a2194601193cf8716

Perl (5.8.8) - 9,887 KБ:

Домашняя страница: http://www.perl.com/

Адрес для скачивания: http://ftp.funet.fi/pub/CPAN/src/perl-5.8.8.tar.bz2

Контрольная сумма: a377c0c67ab43fd96eeec29ce19e8382

Procps (3.2.6) - 273 KБ:

Домашняя страница: http://procps.sourceforge.net/

Адрес для скачивания: http://procps.sourceforge.net/procps-3.2.6.tar.gz

Контрольная сумма: 7ce39ea27d7b3da0e8ad74dd41d06783

Psmisc (22.2) - 239 KБ:

Домашняя страница: http://psmisc.sourceforge.net/

Адрес для скачивания: http://prdownloads.sourceforge.net/psmisc/psmisc-22.2.tar.gz?download

Контрольная сумма: 77737c817a40ef2c160a7194b5b64337

Readline (5.1) - 1,983 KБ:

Домашняя страница: http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html

Адрес для скачивания: http://ftp.gnu.org/gnu/readline/readline-5.1.tar.gz

Контрольная сумма: 7ee5a692db88b30ca48927a13fd60e46

Sed (4.1.5) - 781 KБ:

Домашняя страница: http://www.gnu.org/software/sed/

Адрес для скачивания: http://ftp.gnu.org/gnu/sed/sed-4.1.5.tar.gz

Контрольная сумма: 7a1cbbbb3341287308e140bd4834c3ba

Shadow (4.0.16) - 1,412 KБ:

Адрес для скачивания: ftp://ftp.pld.org.pl/software/shadow/shadow-4.0.16.tar.bz2

Контрольная сумма: 1d91f7479143d1d705b94180c0d4874b

Замечание

Пакет Shadow (4.0.16) может быть недоступен, когда Вы это читаете. На главных местах для скачивания удаляют старые версии пакетов. Альтернативные места для скачивания, которые могут иметь корректную версию, доступны на http://cross-lfs.org/files/packages/1.0.0/.

Sysklogd (1.4.1) - 80 KБ:

Домашняя страница: http://www.infodrom.org/projects/sysklogd/

Адрес для скачивания: http://www.infodrom.org/projects/sysklogd/download/sysklogd-1.4.1.tar.gz

Контрольная сумма: d214aa40beabf7bdb0c9b3c64432c774

Sysvinit (2.86) - 97 KБ:

Адрес для скачивания: ftp://ftp.cistron.nl/pub/people/miquels/sysvinit/sysvinit-2.86.tar.gz

Контрольная сумма: 7d5d61c026122ab791ac04c8a84db967

Tar (1.15.1) - 1,574 KБ:

Домашняя страница: http://www.gnu.org/software/tar/

Адрес для скачивания: http://ftp.gnu.org/gnu/tar/tar-1.15.1.tar.bz2

Контрольная сумма: 57da3c38f8e06589699548a34d5a5d07

Tcl (8.4.12) - 3,419 KБ:

Домашняя страница: http://tcl.sourceforge.net/

Адрес для скачивания: http://prdownloads.sourceforge.net/tcl/tcl8.4.12-src.tar.gz?download

Контрольная сумма: 7480432d8730263f267952788eb4839b

Texinfo (4.8) - 1,487 KБ:

Домашняя страница: http://www.gnu.org/software/texinfo/

Адрес для скачивания: http://ftp.gnu.org/gnu/texinfo/texinfo-4.8.tar.bz2

Контрольная сумма: 6ba369bbfe4afaa56122e65b3ee3a68c

Tree (1.5.0) - 26 KБ:

Адрес для скачивания: ftp://mama.indstate.edu/linux/tree/tree-1.5.0.tgz

Контрольная сумма: e0d090c564e7ea5afa16bac80620c7e0

Udev (096) - 192 KБ:

Домашняя страница: http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html

Адрес для скачивания: http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev-096.tar.bz2

Контрольная сумма: f4effef7807ce1dc91ab581686ef197b

Udev Cross-LFS Rules (1.0-3) - 12 KБ:

Адрес для скачивания: http://cross-lfs.org/files/packages/1.0.0/udev-cross-lfs-1.0-3.tar.bz2

Контрольная сумма: 0c9b9e24a37b9501bcd4889da71cf313

Util-linux (2.12r) - 1,339 KБ:

Адрес для скачивания: http://www.kernel.org/pub/linux/utils/util-linux/util-linux-2.12r.tar.bz2

Контрольная сумма: af9d9e03038481fbf79ea3ac33f116f9

Vim (7.0) - 6,422 KБ:

Домашняя страница: http://www.vim.org

Адрес для скачивания: ftp://ftp.vim.org/pub/vim/unix/vim-7.0.tar.bz2

Контрольная сумма: 4ca69757678272f718b1041c810d82d8

Vim (7.0) language files (optional) - 1,153 KБ:

Адрес для скачивания: ftp://ftp.vim.org/pub/vim/extra/vim-7.0-lang.tar.gz

Контрольная сумма: 6d43efaff570b5c86e76b833ea0c6a04

Zlib (1.2.3) - 485 KБ:

Домашняя страница: http://www.zlib.net/

Адрес для скачивания: http://www.zlib.net/zlib-1.2.3.tar.gz

Контрольная сумма: debc62758716a169df9f62e6ab2bc634

Общий объём этих пакетов: около 180 МБ

3.3. Дополнительные пакеты для x86

GRUB (0.97) - 950 KБ:

Домашняя страница: http://www.gnu.org/software/grub/

Адрес для скачивания: ftp://alpha.gnu.org/gnu/grub/grub-0.97.tar.gz

Контрольная сумма: cd3f3eb54446be6003156158d51f4884

Общий объём этих пакетов: около 950 KБ

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

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

Bash Fixes Patch - 23 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/bash-3.1-fixes-8.patch

Контрольная сумма: bc337045fa4c5839babf0306cc9df6d0

Binutils Posix Patch - 4.9 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/binutils-2.17-posix-1.patch

Контрольная сумма: 7e42a8edc0c59246bbc58c428256113c

Bzip2 Documentation Patch - 1.7 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/bzip2-1.0.3-install_docs-1.patch

Контрольная сумма: 9e5dfbf4814b71ef986b872c9af84488

Bzip2 Bzdiff Remove Tempfile - 1.8 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/bzip2-1.0.3-remove_tempfile-1.patch

Контрольная сумма: bcadb0ce282c96af15a86a2ccdac0765

Bzip2 Bzgrep Security Fixes Patch - 1.3 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/bzip2-1.0.3-bzgrep_security-1.patch

Контрольная сумма: 4eae50e4fd690498f23d3057dfad7066

Coreutils Suppress Uptime, Kill, Su Patch - 13 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/coreutils-5.96-suppress_uptime_kill_su-1.patch

Контрольная сумма: 227d41a6d0f13c31375153eae91e913d

Expect Spawn Patch - 6.9 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/expect-5.43.0-spawn-2.patch

Контрольная сумма: 7706e1e8238c72eed8dc905d6f3b6aa9

Gawk Segfault Patch - 1.3 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/gawk-3.1.5-segfault_fix-1.patch

Контрольная сумма: 7679530d88bf3eb56c42eb6aba342ddb

GCC Cross Search Paths Patch - 2 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/gcc-4.1.1-cross_search_paths-1.patch

Контрольная сумма: 541fe39d228ddaa0d8396a35ec3a0ada

GCC PR20425 Patch - 36 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/gcc-4.1.1-PR20425-1.patch

Контрольная сумма: 95535bda8e4d37d30251db0b121b5374

GCC Posix Patch - 9 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/gcc-4.1.1-posix-1.patch

Контрольная сумма: 0d88068740a0e00780891f2cb905b808

Glibc iconv Fix - 4 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/glibc-2.4-iconv_fix-1.patch

Контрольная сумма: 9c8e681226ccf7a1f25c6467674f915e

Glibc Disable linking with libgcc_eh.a - 1 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/glibc-2.4-libgcc_eh-1.patch

Контрольная сумма: e5122ea7b89a5f22615eaadf8e46b334

Glibc Localedef Segfault - 1.9 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/glibc-2.4-localedef_segfault-1.patch

Контрольная сумма: 42452abc6196789e0a83afa1ca7e6e4e

Gzip Security Fix Patch - 2 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/gzip-1.3.5-security_fixes-1.patch

Контрольная сумма: f107844f01fc49446654ae4a8f8a0728

Inetutils inet_addr Patch - 4 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/inetutils-1.4.2-inet_addr_fix-1.patch

Контрольная сумма: a33267b7a4e0d303a6f8dfeafde7bd8e

Inetutils GCC 4.x Fixes Patch - 4.1 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/inetutils-1.4.2-gcc4_fixes-3.patch

Контрольная сумма: 5204fbc503c9fb6a8e353583818db6b9

Inetutils No-Server-Man-Pages Patch - 1.3 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/inetutils-1.4.2-no_server_man_pages-1.patch

Контрольная сумма: eb477f532bc6d26e7025fcfc4452511d

KBD GCC 4.x Fixes Patch - 1.5 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/kbd-1.12-gcc4_fixes-1.patch

Контрольная сумма: 615bc1e381ab646f04d8045751ed1f69

Linux Tulip Update Patch - 8 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/linux-2.6.17.13-tulip-1.patch

Контрольная сумма: 0dd7027a8cb8e59c74c24ff0a8f45f3b

Mktemp Tempfile Patch - 3.6 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/mktemp-1.5-add_tempfile-3.patch

Контрольная сумма: 65d73faabe3f637ad79853b460d30a19

Perl Libc Patch - 4 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/perl-5.8.8-libc-2.patch

Контрольная сумма: 3bf8aef1fb6eb6110405e699e4141f99

Readline Fixes Patch - 2.1 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/readline-5.1-fixes-3.patch

Контрольная сумма: e30963cd5c6f6a11a23344af36cfa38c

Sysklogd Fixes Patch - 28 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/sysklogd-1.4.1-fixes-1.patch

Контрольная сумма: 508104f058d1aef26b3bc8059821935f

Tar GCC-4.x Fix Patch - 1.2 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/tar-1.15.1-gcc4_fix_tests-1.patch

Контрольная сумма: 8e286a1394e6bcf2907f13801770a72a

Tar Security Fix Patch - 3.9 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/tar-1.15.1-security_fixes-1.patch

Контрольная сумма: 19876e726d9cec9ce1508e3af74dc22e

Tar Sparse Fix Patch - 1 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/tar-1.15.1-sparse_fix-1.patch

Контрольная сумма: 9e3623f7c88d8766878ecb27c980d86a

Texinfo Tempfile Fix Patch - 2.2 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/texinfo-4.8-tempfile_fix-2.patch

Контрольная сумма: 559bda136a2ac7777ecb67511227af85

Util-linux Cramfs Patch - 2.8 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/util-linux-2.12r-cramfs-1.patch

Контрольная сумма: 1c3f40b30e12738eb7b66a35b7374572

Util-linux GCC 4.x Patch - 1 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/util-linux-2.12r-gcc4_fixes-1.patch

Контрольная сумма: 6c030921dc9b92daf688f12a4ee6f6e0

Util-linux Missing Header Patch - 1 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/util-linux-2.12r-missing_header-1.patch

Контрольная сумма: 33ccc15d2e92caa6189b044f573fdcda

Vim Fixes Patch - 32 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/vim-7.0-fixes-5.patch

Контрольная сумма: 6e179cfe811d105de4fd9156a0ef6699

Zlib fPIC Patch - 3.2 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/zlib-1.2.3-fPIC-1.patch

Контрольная сумма: 545d60b20bfde6f53023de44438cef59

Общий объём этих патчей: около 214.7 KБ

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

3.5. Дополнительные патчи для x86

Coreutils Uname Patch - 4.5 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/coreutils-5.96-uname-1.patch

Контрольная сумма: c05b735710fbd62239588c07084852a0

GCC Specs Patch - 15 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/gcc-4.1.1-specs-1.patch

Контрольная сумма: a17be8ccfb978e73f382be5093dd8abd

Grub Various Fixes - 136 KБ:

Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/grub-0.97-fixes-1.patch

Контрольная сумма: 6f095b98bde1db8d5b1a7ceef96ca351

Общий объём этих патчей: около 155.5 KБ

Глава 4. Окончательные приготовления

4.1. О ${CLFS}

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

echo ${CLFS}

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

export CLFS=/mnt/clfs

Наличие этой установленной переменной выгодно в таких командах, как install -dv ${CLFS}/tools. Оболочка будет автоматически заменять “${CLFS}” на “/mnt/clfs” (или на то, что описывает эта переменная) при обработке командной строки.

Если Вы ещё не создали директорию ${CLFS}, то сделайте это сейчас выполнением следующей команды:

install -dv ${CLFS}

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

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

Все программы, компилируемые в главе Создание временной системы будут установлены в ${CLFS}/tools для содержания их отдельно от программ, устанавливаемых в главе Установка основных системных программ. Программы, компилируемые здесь, являются только временными инструментами и не будут частью финальной СLFS системы. Удерживая эти программы в отдельной директории, мы сможем легко их отбросить позднее после их использования. Это также предупреждает эти программы от установки в директории хоста (просто ошибившись в главе Создание временной системы).

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

install -dv ${CLFS}/tools

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

ln -sv ${CLFS}/tools /

Замечание

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

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

4.3. Создание директории ${CLFS}/cross-tools

Кросс-binutils и кросс-компилятор, собираемые в главе Создание инструментов кросс-компилирования, будут установлены в ${CLFS}/cross-tools для содержания их отдельно от хост программ. Программы, компилируемые здесь, являются кросс-инструментами и не будут частью финальной СLFS системы или временной системы. Удерживая эти программы в отдельной директории, мы сможем легко их отбросить позднее после их использования.

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

install -dv ${CLFS}/cross-tools

Следующий шаг создаёт символическую ссылку /cross-tools в хост системе. Она будет указывать на только что созданную директорию на СLFS разделе. Выполните следующую команду как пользователь root:

ln -sv ${CLFS}/cross-tools /

Символическая ссылка не является технически необходимой (хотя инструкции книги подразумевают её наличие), но это главным образом для постоянства (так как /tools это также ссылка на ${CLFS}/tools) и более простой установки кросс-инструментов.

4.4. Добавление пользователя CLFS

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

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

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

-s /bin/bash

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

-g clfs

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

-m

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

-k /dev/null

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

clfs

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

Для регистрации как clfs (в противоположность переключению на пользователя clfs после регистрации как root, которая не требует у пользователя clfs наличия пароля), дадим пользователю clfs пароль:

passwd clfs

Дадим clfs полный доступ в ${CLFS}/cross-tools и ${CLFS}/tools, сделав clfs владельцем этих директорий:

chown -v clfs ${CLFS}/tools
chown -v clfs ${CLFS}/cross-tools

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

chown -v clfs ${CLFS}/sources

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

su - clfs

Инструкция “-” команды su запустит новую регистрированную оболочку в противоположность нерегистрированной оболочке. Отличия между двумя этими типами оболочек в деталях могут быть найдены в bash(1) и info bash.

4.5. Установка окружения

Установим хорошее окружение, создав два новых файла для оболочки bash. Когда Вы зарегистрируетесь под пользователем clfs, выполните следующую команду для создания нового файла .bash_profile:

cat > ~/.bash_profile << "EOF"
exec env -i HOME=${HOME} TERM=${TERM} PS1='\u:\w\$ ' /bin/bash
EOF

Когда Вы регистрируетесь как пользователь clfs, то первоначальной оболочкой обычно является 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
CLFS=/mnt/clfs
LC_ALL=POSIX
PATH=/cross-tools/bin:/bin:/usr/bin
export CLFS LC_ALL PATH
EOF

Команда set +h отключает функцию запоминания bash. Запоминание обычно является полезным расширением. Bash использует hash-таблицу для запоминания полного пути к исполняемым файлам для сокращения времени поиска и отсутствия необходимости запоминания путей этих файлов. Хотя новые инструменты должны быть использованы так скоро, как только они будут установлены. Отключив функцию запоминания, оболочка после её запуска всегда будет искать программу по пути PATH. Таким образом, оболочка будет находить новые установленные инструменты в /cross-tools, как только они станут доступны без запоминания предыдущей версии этих программ из другого места.

Установка маски для создания файлов пользователем (umask) в 022 позволит убедиться, что вновь созданные файлы и директории будут доступны для записи только владельцу, а для чтения и выполнения любому (по умолчанию, используя системный вызов open(2), новые файлы будут создаваться с правами доступа 644 и директории с правами доступа 755).

Переменная CLFS указывает на точку монтирования, которую Вы выбрали для раздела CLFS.

Переменная LC_ALL контролирует локализацию некоторых программ, делает вывод их сообщений зависимым от страны. Если Ваша система основана на Glibc старее версии 2.2.4, установка LC_ALL в что-то отличное от “POSIX” или “С” (на протяжении этой главы) может создать проблемы при выходе-входе из/в chroot окружения. Установив LC_ALL в “POSIX” или “С” (что аналогично) мы страхуемся от ошибок при использовании chroot.

Поместив /cross-tools/bin в начале переменной PATH, кросс-компилятор, собираемый в главе Создание инструментов кросс-компилирования, будет собран процессом сборки для пакетов временной системы перед чем-либо, что может быть установлено в хост. Это, в комбинации с выключением хеширования, помогает убедиться, что Вы будете использовать инструменты кросс-сборки для сборки временной системы в /tools.

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

source ~/.bash_profile

4.6. О тестах

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

Невозможно запустить тесты во время кросс-компилирования, поэтому инструкции по установке пакетов не объясняют, как запустить тесты на протяжении главы Установка основных системных программ.

Часть III. Получение инструментов кросс-компилирования

Глава 5. Создание инструментов кросс-компилирования

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

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

Если Вам понадобится остановиться и вернуться к процессу позже, то выполните команду su - clfs, которая установит окружение сборки, которое Вы покинули.

5.1.1. Общие замечания

Важно

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

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

Во время сборки многих пакетов будут появляться некоторые предупреждения. Можете их игнорировать. Всё, что они говорят — внимание, есть неточность, но не ошибка в коде C или C++. Это из-за того, что меняются стандарты на язык C, а некоторые пакеты написаны в соответствии со старыми стандартами, но это не представляет проблемы для компилятора.

Важно

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

5.2. Флаги сборки CFLAGS

CFLAGS и CXXFLAGS не должны быть установлены во время сборки кросс-инструментов.

Для сброса CFLAGS и CXXFLAGS используются следующие команды:

unset CFLAGS
unset CXXFLAGS

Добавим это в ~/.bashrc для избежания проблем если мы остановимся и продолжим сборку позже:

echo unset CFLAGS >> ~/.bashrc
echo unset CXXFLAGS >> ~/.bashrc

5.3. Переменные сборки

Установка хоста и целевой системы

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

export CLFS_HOST="$(echo $MACHTYPE | sed "s/$(echo $MACHTYPE | cut -d- -f2)/cross/")"

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

export CLFS_TARGET="{target triplet}"

Копирование переменных в окружение

Добавим это в ~/.bashrc для избежания проблем если мы остановимся и продолжим сборку позже:

echo export CLFS_HOST=\""${CLFS_HOST}\"" >> ~/.bashrc
echo export CLFS_TARGET=\""${CLFS_TARGET}\"" >> ~/.bashrc

Table 5.1. Тип процессора и целевые "близнецы"

Процессор Целевой "близнец"
486 совместимый i486-pc-linux-gnu
Pentium, K6, 586 совместимый i586-pc-linux-gnu
Pentium II, Pentium III, Pentium 4 i686-pc-linux-gnu
Athlon, Duron i686-pc-linux-gnu

5.4. Linux-Headers-2.6.17.13-09092006

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

5.4.1. Установка заголовков Linux

Установим заголовочные файлы, которые нужны для основы сборки:

install -dv /tools/include
cp -av include/asm-i386 /tools/include/asm
cp -av include/{asm-generic,linux} /tools/include/

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

5.5. Кросс Binutils-2.17

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

5.5.1. Установка Cross Binutils

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

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

patch -Np1 -i ../binutils-2.17-posix-1.patch

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

mkdir -v ../binutils-build
cd ../binutils-build

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

../binutils-2.17/configure --prefix=/cross-tools \
    --host=${CLFS_HOST} --target=${CLFS_TARGET} --with-lib-path=/tools/lib \
    --disable-nls --enable-shared --disable-multilib

Описание параметров команды configure:

--prefix=/cross-tools

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

--host=${CLFS_HOST}

При использовании совместно с --target создаётся кросс-архитектурный файл для ${LFS_TARGET} но исполняемый на ${LFS_HOST}.

--target=${CLFS_TARGET}

При использовании совместно с --host создаётся кросс-архитектурный файл для ${LFS_TARGET} но исполняемый на ${LFS_HOST}.

--with-lib-path=/tools/lib

Указывает скрипту configure установить путь поиска библиотек во время сборки Binutils, в результате директория /tools/lib будет помещена в компоновщик. Это запретит компоновщику поиск в директориях библиотек хоста.

--disable-nls

Это отключит интернационализацию (сокращенно - i18n) так как это не надо для инструментов кросс-сборки.

--enable-shared

Разрешает создание разделяемых библиотек.

--disable-multilib

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

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

make configure-host
make

Описание параметров команды make:

configure-host

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

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

make install

Скопируем файл libiberty.h в директорию /tools/include:

cp -v ../binutils-2.17/include/libiberty.h /tools/include

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

5.6. Кросс GCC-4.1.1 - статически

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

5.6.1. Установка кросс-компилятора GCC со статической libgcc и без нитей

Сделаем пару подходящих установок в файле specs, чтобы GCC использовал наше окружение сборки:

patch -Np1 -i ../gcc-4.1.1-specs-1.patch

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

patch -Np1 -i ../gcc-4.1.1-posix-1.patch

Следующий патч подтвердит, что gcc не ищет libgcc_s.so в директории /usr во время кросс-компилирования:

patch -Np1 -i ../gcc-4.1.1-cross_search_paths-1.patch

Изменим StartFile Spec, указав правильное расположение библиотеки:

echo "
#undef STARTFILE_PREFIX_SPEC
#define STARTFILE_PREFIX_SPEC \"/tools/lib/\"" >> gcc/config/linux.h

Теперь изменим путь поиска заголовков по умолчанию предпроцессора gcc на использование только директории /tools:

cp -v gcc/Makefile.in{,.orig}
sed -e "s@\(^CROSS_SYSTEM_HEADER_DIR =\).*@\1 /tools/include@g" \
    gcc/Makefile.in.orig > gcc/Makefile.in

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

mkdir -v ../gcc-build
cd ../gcc-build

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

../gcc-4.1.1/configure --prefix=/cross-tools \
    --host=${CLFS_HOST} --target=${CLFS_TARGET} --disable-multilib \
    --with-local-prefix=/tools --disable-nls --disable-shared \
    --disable-threads --enable-languages=c

Описание параметров команды configure:

--with-local-prefix=/tools

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

--disable-shared

Выключает сборку разделяемых библиотек.

--disable-threads

Это предотвратит поиск GCC для мульти-нитевых файлов заголовков, так как пока они не были созданы для этой архитектуры. GCC сможет найти мульти-нитевую информацию после создания заголовков Glibc.

--enable-languages=c

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

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

make all-gcc

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

make install-gcc

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

5.7. Glibc-2.4

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

5.7.1. Установка Glibc

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

Отключим компоновку с libgcc_eh:

patch -Np1 -i ../glibc-2.4-libgcc_eh-1.patch

Следующий патч исправит проблему, приводящую к падению localdef:

patch -Np1 -i ../glibc-2.4-localedef_segfault-1.patch

Следующая команда sed устраняет проблему сборки Glibc. Она предостережёт nscd от попытки компоновки с отсутствующими библиотеками:

cp -v nscd/Makefile{,.orig}
sed -e "/nscd_stat.o: sysincludes = # nothing/d" nscd/Makefile.orig > \
    nscd/Makefile

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

mkdir -v ../glibc-build
cd ../glibc-build

Следующие строки необходимо добавить в файл config.cache для поддержки NPTL в Glibc:

echo "libc_cv_forced_unwind=yes" > config.cache
echo "libc_cv_c_cleanup=yes" >> config.cache

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

BUILD_CC="gcc" CC="${CLFS_TARGET}-gcc" \
    AR="${CLFS_TARGET}-ar" RANLIB="${CLFS_TARGET}-ranlib" \
    ../glibc-2.4/configure --prefix=/tools \
    --host=${CLFS_TARGET} --build=${CLFS_HOST} \
    --disable-profile --enable-add-ons \
    --with-tls --enable-kernel=2.6.0 --with-__thread \
    --with-binutils=/cross-tools/bin --with-headers=/tools/include \
    --cache-file=config.cache

Описание новых параметров команды configure:

BUILD_CC="gcc"

Предписывает Glibc использовать текущий компилятор Вашей системы. Это используется для создания инструментов Glibc, используемых во время собственной сборки.

CC="${CLFS_TARGET}-gcc"

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

AR="${CLFS_TARGET}-ar"

Предписывает Glibc использовать утилиту ar, созданную для целевой архитектуры.

RANLIB="${CLFS_TARGET}-ranlib"

Предписывает Glibc использовать утилиту ranlib, созданную для целевой архитектуры.

--disable-profile

Это собирает библиотеки без профильной информации. Пропустите эту опцию если профильная информация нужна во временной системе.

--enable-add-ons

Говорит Glibc использовать все доступные дополнения.

--with-tls

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

--with-__thread

Эта опция говорит Glibc использовать __thread для сборки libc и libpthread.

--with-binutils=/cross-tools/bin

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

--cache-file=config.cache

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

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

make

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

make install

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

5.8. GCC-4.1.1 - окончательный кросс-компилятор

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

5.8.1. Установка кросс-компилятора GCC

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

patch -Np1 -i ../gcc-4.1.1-PR20425-1.patch

Сделаем пару подходящих установок в файле specs, чтобы GCC использовал наше окружение сборки:

patch -Np1 -i ../gcc-4.1.1-specs-1.patch

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

patch -Np1 -i ../gcc-4.1.1-posix-1.patch

Следующий патч подтвердит, что gcc не ищет libgcc_s.so в директории /usr во время кросс-компилирования:

patch -Np1 -i ../gcc-4.1.1-cross_search_paths-1.patch

Изменим StartFile Spec, указав правильное расположение библиотеки:

echo "
#undef STARTFILE_PREFIX_SPEC
#define STARTFILE_PREFIX_SPEC \"/tools/lib/\"" >> gcc/config/linux.h

Теперь изменим путь поиска заголовков по умолчанию предпроцессора gcc на использование только директории /tools:

cp -v gcc/Makefile.in{,.orig}
sed -e "s@\(^CROSS_SYSTEM_HEADER_DIR =\).*@\1 /tools/include@g" \
    gcc/Makefile.in.orig > gcc/Makefile.in

В конце отключим -B в configure, чтобы он не использовал заголовки из хост системы:

cp -v configure{,.orig}
sed -e  '/FLAGS_FOR_TARGET.*\/lib\//s@-B[^ ]*/lib/@@g' configure.orig >configure

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

mkdir -v ../gcc-build
cd ../gcc-build

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

../gcc-4.1.1/configure --prefix=/cross-tools \
    --target=${CLFS_TARGET} --host=${CLFS_HOST} --disable-multilib \
    --with-local-prefix=/tools --disable-nls --enable-shared \
    --enable-languages=c,c++ --enable-__cxa_atexit \
    --enable-c99 --enable-long-long --enable-threads=posix

Описание новых параметров команды configure:

--enable-languages=c,c++

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

--enable-__cxa_atexit

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

--enable-c99

Разрешает поддержку C99 для программ C.

--enable-long-long

Разрешает поддержку long long в компиляторе.

--enable-threads=posix

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

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

make AS_FOR_TARGET="${CLFS_TARGET}-as" \
    LD_FOR_TARGET="${CLFS_TARGET}-ld"

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

make install

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

Часть IV. Сборка основных инструментов

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

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

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

Инструменты в этой главе являются кросс-компилированными при помощи инструментов из /cross-tools и будут установлены в директорию ${CLFS}/tools для содержания их отдельно от файлов, устанавливаемых в главе Установка основных системных программ и файлов хоста. Так как пакеты, собираемые здесь, временные, то мы не хотим загрязнять ими будущую CLFS систему.

Последний раз проверяем правильность установки переменной окружения CLFS:

echo ${CLFS}

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

Во время сборки этой части Вы можете увидеть некоторые ПРЕДУПРЕЖДАЮЩИЕ сообщения, похожие на приведённое ниже. Такие сообщения можно безопасно игнорировать.

configure: WARNING: If you wanted to set the --build type, don't use --host.
    If a cross compiler is detected then cross compile mode will be used.

6.2. Переменные сборки

Установим переменные окружения для компилятора и компоновщика:

export CC="${CLFS_TARGET}-gcc"
export CXX="${CLFS_TARGET}-g++"
export AR="${CLFS_TARGET}-ar"
export AS="${CLFS_TARGET}-as"
export RANLIB="${CLFS_TARGET}-ranlib"
export LD="${CLFS_TARGET}-ld"
export STRIP="${CLFS_TARGET}-strip"

Затем добавим эти переменные в ~/.bashrc для предотвращения проблем если Вы остановитесь и продолжите позже:

echo export CC=\""${CC}\"" >> ~/.bashrc
echo export CXX=\""${CXX}\"" >> ~/.bashrc
echo export AR=\""${AR}\"" >> ~/.bashrc
echo export AS=\""${AS}\"" >> ~/.bashrc
echo export RANLIB=\""${RANLIB}\"" >> ~/.bashrc
echo export LD=\""${LD}\"" >> ~/.bashrc
echo export STRIP=\""${STRIP}\"" >> ~/.bashrc

6.3. Binutils-2.17

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

6.3.1. Установка Binutils

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

patch -Np1 -i ../binutils-2.17-posix-1.patch

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

mkdir -v ../binutils-build
cd ../binutils-build

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

../binutils-2.17/configure --prefix=/tools \
    --build=${CLFS_HOST} --host=${CLFS_TARGET} --target=${CLFS_TARGET} \
    --disable-nls --enable-shared --disable-multilib

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

make configure-host
make

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

make install

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

6.4. GCC-4.1.1

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

6.4.1. Установка GCC

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

patch -Np1 -i ../gcc-4.1.1-PR20425-1.patch

Сделаем пару подходящих установок в файле specs, чтобы GCC использовал наше окружение сборки:

patch -Np1 -i ../gcc-4.1.1-specs-1.patch

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

patch -Np1 -i ../gcc-4.1.1-posix-1.patch

Следующий патч подтвердит, что gcc не ищет libgcc_s.so в директории /usr во время кросс-компилирования:

patch -Np1 -i ../gcc-4.1.1-cross_search_paths-1.patch

Теперь мы изменим путь поиска cpp чтобы он не искал в /usr/include:

cp -v gcc/cppdefault.c{,.orig}
sed -e '/#define STANDARD_INCLUDE_DIR/s@"/usr/include"@0@g' \
    gcc/cppdefault.c.orig > gcc/cppdefault.c

Также нам необходимо установить директорию, которая ищется процессами fixincludes для поиска системных заголовков, поэтому она не должна указывать на директорию заголовков хост системы:

cp -v gcc/Makefile.in{,.orig}
sed -e 's@\(^NATIVE_SYSTEM_HEADER_DIR =\).*@\1 /tools/include@g' \
    gcc/Makefile.in.orig > gcc/Makefile.in

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

mkdir -v ../gcc-build
cd ../gcc-build

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

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

../gcc-4.1.1/configure --prefix=/tools \
    --build=${CLFS_HOST} --host=${CLFS_TARGET} --target=${CLFS_TARGET} \
    --with-local-prefix=/tools --enable-long-long --enable-c99 \
    --enable-shared --enable-threads=posix --enable-__cxa_atexit \
    --disable-nls --enable-languages=c,c++ --disable-libstdcxx-pch

Описание новых параметров команды configure:

--disable-libstdcxx-pch

Не собирать предкомпилированные заголовки (PCH) для libstdc++. Это сохранит некоторое место и мы их не используем.

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

make AS_FOR_TARGET="${AS}" \
    LD_FOR_TARGET="${LD}"

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

make install

Многие пакеты используют имя cc для вызова компилятора С. Для поддержки таких пакетов создадим ссылку:

ln -sv gcc /tools/bin/cc

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

6.5. Ncurses-5.5

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

6.5.1. Установка Ncurses

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

./configure --prefix=/tools --with-shared \
    --build=${CLFS_HOST} --host=${CLFS_TARGET} \
    --without-debug --without-ada \
    --enable-overwrite --with-build-cc=gcc

Описание параметров команды configure:

--with-shared

Говорит Ncurses создавать разделяемые библиотеки.

--without-debug

Говорит Ncurses собирать без отладочной информации.

--without-ada

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

--enable-overwrite

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

--with-build-cc=gcc

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

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

make

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

make install

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

6.6. Bash-3.1

Bash - это Bourne-Again SHell.

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

Удалим тест, который приводит к выпадению сборки:

echo "ac_cv_func_setvbuf_reversed=no" >> config.cache

Когда bash является кросс-компилированным, то он не может протестировать наличие именованных каналов. Мы использовали su чтобы стать непривилегированным пользователем, эта комбинация приведёт к сборке без замены процессов, которая прервёт скрипт тестирования c++ в glibc. Предупредим это установкой следующего определения:

echo "bash_cv_sys_named_pipes=yes" >> config.cache

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

./configure --prefix=/tools \
    --build=${CLFS_HOST} --host=${CLFS_TARGET} \
    --without-bash-malloc --cache-file=config.cache

Описание параметра команды configure:

--without-bash-malloc

Эта опция выключает использование функции Bash-а "memory allocation" (malloc), которая известна своей нестабильной работой. После выключения этой опции Bash будет использовать функцию malloc из Glibc, которая более стабильна.

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

make

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

make install

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

ln -sv bash /tools/bin/sh

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

6.7. Bzip2-1.0.3

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

6.7.1. Установка Bzip2

Файл Makefile по умолчанию автоматически запускает тесты. Выключим их, так как они не работают на мультиархитектурной сборке:

cp -v Makefile{,.orig}
sed -e 's@^\(all:.*\) test@\1@g' Makefile.orig > Makefile

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

make CC="${CC}" AR="${AR}" RANLIB="${RANLIB}"

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

make PREFIX=/tools install

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

6.8. Coreutils-5.96

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

6.8.1. Установка Coreutils

Пакет Coreutils имеет проблемы при кросс-компилировании. Поэтому мы опишем необходимые для кросс-компилирования пункты:

echo "ac_cv_sys_restartable_syscalls=yes" > config.cache
echo "ac_cv_func_setvbuf_reversed=yes" >> config.cache
echo "utils_cv_sys_open_max=1024" >> config.cache

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

./configure --prefix=/tools --cache-file=config.cache \
    --build=${CLFS_HOST} --host=${CLFS_TARGET}

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

make

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

make install

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

6.9. Diffutils-2.8.7

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

6.9.1. Установка Diffutils

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

./configure --prefix=/tools \
     --build=${CLFS_HOST} --host=${CLFS_TARGET}

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

make

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

make install

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

6.10. Findutils-4.2.27

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

6.10.1. Установка Findutils

Findutils имеет проблему при кросс-компилировании, когда не находит getline. Исправим это:

echo "am_cv_func_working_getline=yes" >> config.cache

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

./configure --prefix=/tools \
     --build=${CLFS_HOST} --host=${CLFS_TARGET} \
     --cache-file=config.cache

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

make

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

make install

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

6.11. Gawk-3.1.5

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

6.11.1. Установка Gawk

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

./configure --prefix=/tools \
    --build=${CLFS_HOST} --host=${CLFS_TARGET}

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

make

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

make install

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

6.12. Gettext-0.14.5

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

6.12.1. Установка Gettext

Gettext имеет проблемы при кросс-компилировании, когда не находит getline. Исправим это:

cd gettext-tools
echo "am_cv_func_working_getline=yes" >> config.cache

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

./configure --prefix=/tools \
     --build=${CLFS_HOST} --host=${CLFS_TARGET} \
     --disable-shared --cache-file=config.cache

Описание параметров команды configure:

--disable-shared

Не собирать разделяемые библиотеки.

Только одна программа из пакета Gettext нужна для сборки:

make -C lib
make -C src msgfmt

Установим бинарник msgfmt:

cp -v src/msgfmt /tools/bin

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

6.13. Grep-2.5.1a

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

6.13.1. Установка Grep

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

./configure --prefix=/tools \
     --build=${CLFS_HOST} --host=${CLFS_TARGET} \
     --disable-perl-regexp

Описание параметров команды configure:

--disable-perl-regexp

Подтверждает, что программа grep не скомпонована с библиотекой Perl Compatible Regular Expression (PCRE), которая может быть на хост машине, но не будет доступна во время сборки финальной системы.

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

make

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

make install

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

6.14. Gzip-1.3.5

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

6.14.1. Установка Gzip

Настроим скрипт configure так, чтобы он мог использовать кросс-компилированные инструменты:

cp -v configure{,.orig}
sed -e "s@nm conftest@${CLFS_TARGET}-&@" configure.orig > configure

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

./configure --prefix=/tools \
     --build=${CLFS_HOST} --host=${CLFS_TARGET}

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

make

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

make install

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

6.15. Make-3.81

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

6.15.1. Установка Make

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

./configure --prefix=/tools \
     --build=${CLFS_HOST} --host=${CLFS_TARGET}

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

make

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

make install

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

6.16. Patch-2.5.9

Пакет Patch содержит программу для модификации или создания файлов применением “patch-файла”, обычно созданного программой diff.

6.16.1. Установка Patch

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

./configure --prefix=/tools \
    --build=${CLFS_HOST} --host=${CLFS_TARGET}

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

make

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

make install

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

6.17. Sed-4.1.5

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

6.17.1. Установка Sed

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

./configure --prefix=/tools \
     --build=${CLFS_HOST} --host=${CLFS_TARGET}

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

make

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

make install

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

6.18. Tar-1.15.1

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

6.18.1. Установка Tar

Tar имеет проблему при кросс-компилировании, когда не находит getline. Исправим это:

echo "am_cv_func_working_getline=yes" >> config.cache

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

./configure --prefix=/tools \
     --build=${CLFS_HOST} --host=${CLFS_TARGET} \
     --cache-file=config.cache

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

make

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

make install

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

6.19. Texinfo-4.8

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

6.19.1. Установка Texinfo

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

./configure --prefix=/tools \
    --build=${CLFS_HOST} --host=${CLFS_TARGET}

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

make

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

make install

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

6.20. Загружаться или Chroot?

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

Метод загрузки необходим, когда Вы собираете на другой архитектуре. Например, если Вы собираете систему PowerPC на какой-нибудь x86, то Вы не можете войти в chroot. Метод chroot используется, когда Вы собираете на той же архитектуре. Если Вы собираете на и для системы х86, то Вы можете просто войти в chroot. Главным правилом здесь является то, что если архитектуры соответствуют и Вы загружаете ядро одной серии, то Вы можете войти в chroot. Если у Вас ядра разных серий или хотите запустить другой ABI, то Вам понадобиться использовать метод загрузки.

Если Вы сомневаетесь, то можете попробовать следующую команду для проверки возможности входа в chroot:

/tools/lib/libc.so.6
/tools/bin/gcc -v

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

Для chroot Вам также понадобится Linux Kernel-2.6.x (скомпилированный с GCC-3.0 или больше). Смысл в требовании к версии ядра в том, что без этого поддержка thread-local storage в Binutils не будет собрана и тесты Native POSIX Threading Library (NPTL) приведут к ошибке сегментации.

Для проверки версии Вашего ядра запустите cat /proc/version - если это не скажет, что Вы запустили 2.6.2 или следующее ядро Linux, скомпилированное с GCC 3.0 или позднее, то Вы не можете использовать chroot.

Для метода загрузки следуйте в главу Если Вы решили загружаться.

Для метода chroot следуйте в главу Если Вы решили использовать Chroot.

Глава 7. Если Вы решили загружаться

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

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

Есть несколько дополнительных пакетов, которые необходимо будет установить для возможности загрузки минимальной системы. Некоторые из этих пакетов будут установлены в корень или в /usr на разделе CLFS (${CLFS}/bin, ${CLFS}/usr/lib и т.д.), а не в /tools, используя опцию "DESTDIR" в make. Это потребует наличия у пользователя clfs доступа на запись в остальную часть раздела CLFS, поэтому Вам понадобится временно изменить владельца ${CLFS} на пользователя clfs. Выполните следующую команду как root:

chown -v clfs ${CLFS}

7.2. Создание директорий

Теперь нам надо создать структуру файловой системы CLFS. Создадим стандартное дерево директорий, используя следующие команды:

mkdir -pv ${CLFS}/{bin,boot,dev,{etc/,}opt,home,lib,mnt}
mkdir -pv ${CLFS}/{proc,media/{floppy,cdrom},sbin,srv,sys}
mkdir -pv ${CLFS}/var/{lock,log,mail,run,spool}
mkdir -pv ${CLFS}/var/{opt,cache,lib/{misc,locate},local}
install -dv -m 0750 ${CLFS}/root
install -dv -m 1777 ${CLFS}{/var,}/tmp
mkdir -pv ${CLFS}/usr/{,local/}{bin,include,lib,sbin,src}
mkdir -pv ${CLFS}/usr/{,local/}share/{doc,info,locale,man}
mkdir -pv ${CLFS}/usr/{,local/}share/{misc,terminfo,zoneinfo}
mkdir -pv ${CLFS}/usr/{,local/}share/man/man{1,2,3,4,5,6,7,8}
for dir in ${CLFS}/usr{,/local}; do
  ln -sv share/{man,doc,info} $dir
done

По умолчанию директории создаются с правами доступа 755, но это правильно не для всех из них. Мы сделаем два изменения - одно для домашней директории пользователя root, а другое для директории временных файлов.

Первой командой смены моды мы запрещаем доступ в директорию /root для всех, кроме владельца — то же самое нам надо будет потом сделать для домашних директорий остальных пользователей. Второй командой смены моды мы позволяем всем пользователям записывать и читать файлы в и из директорий /tmp и /var/tmp, но они не смогут удалять оттуда файлы других пользователей. Последнее достигается установкой “бита прикрепления” - старшего бита в битовой маске 1777.

7.2.1. Совместимость с FHS

Мы создаём наше дерево каталогов совместимым со стандартом FHS (доступен на http://www.pathname.com/fhs/). Вместе с деревом директорий, созданным выше, этот стандарт обуславливает существование директорий /usr/local/games и /usr/share/games. Мы не рекомендуем их для базовой системы, хотя Вы можете создать систему полностью FHS-совместимой. Поскольку структура поддиректорий /usr/local/share не описана в стандарте FHS, то мы создаём её так, как надо нам.

7.3. Создание необходимых ссылок

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

ln -sv /tools/bin/{bash,cat,grep,pwd,stty} ${CLFS}/bin
ln -sv /tools/lib/libgcc_s.so{,.1} ${CLFS}/usr/lib
ln -sv /tools/lib/libstd* ${CLFS}/usr/lib
ln -sv bash ${CLFS}/bin/sh

7.4. Zlib-1.2.3

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

7.4.1. Установка Zlib

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

./configure --prefix=/tools --shared

Описание параметров команды configure:

--shared

Говорит Zlib собирать разделяемую библиотеку.

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

make

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

make install

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

7.5. E2fsprogs-1.39

E2fsprogs содержит ряд системных утилит для поддержки файловой системы ext2. Они также поддерживают журналируемую файловую систему ext3.

7.5.1. Установка E2fsprogs

Рекомендуется собирать E2fsprogs вне директории с исходниками:

mkdir -v build
cd build

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

../configure --prefix=/tools \
    --enable-elf-shlibs --disable-evms \
    --build=${CLFS_HOST} --host=${CLFS_TARGET}

Описание параметров команды configure:

--enable-elf-shlibs

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

--disable-evms

Отключает сборку плагина Enterprise Volume Management System (EVMS). Этот плагин не обновляется с последними внутренними EVMS интерфейсами и EVMS не инсталируется как часть базовой системы LFS, поэтому плагин не требуется. Смотрите EVMS сайт на http://evms.sourceforge.net/ для большей информации о EVMS.

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

make

Устанавливаем бинарники и документацию:

make DESTDIR=${CLFS} install

Описание параметра команды make:

DESTDIR=${CLFS}

Файл Makefile для e2fsprogs жёстко прописывает путь к файлу mke2fs.conf, пытаясь установить его в ${DESTDIR}/etc, приводя установку к выпадению, так как она пытается записывать в /etc. Параметр DESTDIR предотвратит это.

Установим разделяемые библиотеки:

make install-libs

Создадим необходимые ссылки для загружаемой системы:

ln -sv /tools/sbin/{fsck.ext2,fsck.ext3,e2fsck} ${CLFS}/sbin

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

7.6. Sysvinit-2.86

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

7.6.1. Установка Sysvinit

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

cp -v src/Makefile src/Makefile.orig
sed -e 's@root@0@g' \
    -e "s@/dev/initctl@${CLFS}&@g" \
    -e 's@\(mknod \)-m \([0-9]* \)\(.* \)p@\1\3p; chmod \2\3@g' \
    -e "s@/usr/lib@/tools/lib@" \
    src/Makefile.orig > src/Makefile

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

make -C src clobber
make -C src CC="${CC}"

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

make -C src install INSTALL="install" ROOT="${CLFS}"

7.6.2. Конфигурация Sysvinit

Создадим новый файл ${CLFS}/etc/inittab запуском следующей команды:

cat > ${CLFS}/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

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

7.7. Module-Init-Tools-3.2.2

Пакет Module-Init-Tools содержит программы для поддержки модулей ядра в ядрах Linux с версией 2.5.47 или выше.

7.7.1. Установка Module-Init-Tools

Подготавливаем Module-Init-Tools к компиляции:

./configure --prefix=/ \
    --build=${CLFS_HOST} --host=${CLFS_TARGET}

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

make

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

make DESTDIR="${CLFS}" install

Детальная информация о пакете находится в Разделе 10.43.2, “Описание Module-Init-Tools.”

7.8. Util-linux-2.12r

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

7.8.1. Установка Util-linux

Util-linux выпадает при компилировании с новыми версиями заголовков ядра Linux. Следующий патч исправляет эту проблему:

patch -Np1 -i ../util-linux-2.12r-cramfs-1.patch

Следующий патч исправляет проблему сборки с GCC 4.1.1:

patch -Np1 -i ../util-linux-2.12r-gcc4_fixes-1.patch

Следующий патч исправляет swapon.c, который пытается найти переменную R_OK но заголовка, включающего R_OK, нет:

patch -Np1 -i ../util-linux-2.12r-missing_header-1.patch

Util-linux по умолчанию не использует только что установленные заголовки и библиотеки из директории /tools. Это исправляется изменением скрипта configure:

cp -v configure{,.orig}
sed -e 's@/usr/include@/tools/include@g' configure.orig > configure

Установка Util-linux использует -o root. Следующая команда sed удаляет это, так как мы ещё не имеем установленных пользователей:

cp -v MCONFIG{,.orig}
sed -e 's|-o root||' MCONFIG.orig > MCONFIG

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

./configure

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

make HAVE_KILL=yes HAVE_SLN=yes \
    HAVE_SHADOW=no CPUOPT="" ARCH="" \
    CPU=""

Описание параметров команды make:

HAVE_KILL=yes

Это предостережёт программу kill от сборки.

HAVE_SLN=yes

Это предостережёт программу sln (статически скомпонованный ln, уже установленный с Glibc) от повторной сборки.

HAVE_SHADOW=no

Это отключает компоновку с shadow.

CPUOPT=""

Это отключает любую оптимизацию компилятора под тип CPU.

ARCH=""

Это отключает определение архитектуры.

CPU=""

Это отключает определение процессора.

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

make HAVE_KILL=yes HAVE_SLN=yes HAVE_SHADOW=no \
    USE_TTY_GROUP=no CPUOPT="" ARCH="" \
    CPU="" DESTDIR=${CLFS} install

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

7.9. Udev-096

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

7.9.1. Установка Udev

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

make CROSS_COMPILE="${CLFS_TARGET}-" CC="${CC}" LD="${CC}"

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

make DESTDIR=${CLFS} install

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

7.10. Создание файлов passwd, group и log

Для возможности регистрации в качестве пользователя root и для распознавания имени “root” нам необходимо создать соответствующие элементы в файлах /etc/passwd и /etc/group.

Создадим файл ${CLFS}/etc/passwd запуском следующей команды:

cat > ${CLFS}/etc/passwd << "EOF"
root::0:0:root:/root:/bin/bash
EOF

Пароль пользователя root (символ “::” заменяет его здесь и позволяет загружаться без пароля) будет определён позднее.

Дополнительные пользователи, которых Вы можете захотеть добавить:

bin:x:1:1:bin:/bin:/bin/false

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

daemon:x:2:6:daemon:/sbin:/bin/false

Он часто рекомендуется для использования с некоторыми непривилегированными ID пользователя/ID групы для запуска демонов, в порядке ограничения их доступа к системе

adm:x:3:16:adm:/var/adm:/bin/false

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

lp:x:10:9:lp:/var/spool/lp:/bin/false

Используется программами для печати

mail:x:30:30:mail:/var/mail:/bin/false

Часто используется программами электронной почты

news:x:31:31:news:/var/spool/news:/bin/false

Часто используется для сетевых серверов новостей

uucp:x:32:32:uucp:/var/spool/uucp:/bin/false

Часто используется для копирования файлов между Unix серверами

operator:x:50:0:operator:/root:/bin/bash

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

postmaster:x:51:30:postmaster:/var/spool/mail:/bin/false

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

nobody:x:65534:65534:nobody:/:/bin/false

Используется NFS

Создадим файл ${CLFS}/etc/group запуском следующей команды:

cat > ${CLFS}/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:
cdrom:x:15:
EOF

Дополнительные группы, которые Вы можете захотеть добавить:

adm:x:16:root,adm,daemon

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

console:x:17:

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

cdrw:x:18:

Эта группа позволяет использовать CDRW накопитель

mail:x:30:mail

Используется MTA (Mail Transport Agents)

news:x:31:news

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

uucp:x:32:uucp

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

users:x:1000:

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

nogroup:x:65533:

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

nobody:x:65534:

Используется NFS

Созданные группы не являются частью какого-то стандарта — эти группы будут использоваться при конфигурации Udev в финальной системе. База стандарта Linux (LSB, доступна на http://www.linuxbase.org) рекомендует, чтобы после группы “root” с ID группы (GID) 0 находилась группа “bin” с GID, равным 1. Все другие имена групп и их GID могут свободно выбираться пользователем, но некоторые пакеты зависят от имени группы, хоть и не зависят от номера GID.

Программы login, agetty и init (и другие) используют некоторые лог-файлы для записи информации, например кто был зарегистрирован в системе и когда. Хотя эти программы не будут записывать в отсутствующие лог-файлы. Проинициализируем лог-файлы и дадим им правильные права:

touch ${CLFS}/var/run/utmp ${CLFS}/var/log/{btmp,lastlog,wtmp}
chmod -v 664 ${CLFS}/var/run/utmp ${CLFS}/var/log/lastlog
chmod -v 600 ${CLFS}/var/log/btmp

Файл /var/run/utmp записывает пользователей, которые уже зарегистрировались. Файл /var/log/wtmp записывает все входы в систему и выходы из системы. Файл /var/log/lastlog записывает, когда каждый пользователь последний раз регистрировался в системе. Файл /var/log/btmp записывает неправильые регистрации.

7.11. Linux-2.6.17.13

Пакет Linux содержит ядро Linux и файлы заголовков.

7.11.1. Установка ядра

Внимание

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

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

Сборка ядра разбита на несколько шагов — конфигурация, компилирование и установка. Если Вам не нравится способ установки, описаный в этой книге, то посмотрите файл README в директории с исходниками ядра на предмет альтернативы.

Следующий патч исправляет проблему инициализации с сетевым драйвером tulip:

patch -Np1 -i ../linux-2.6.17.13-tulip-1.patch

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

make mrproper

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

Если Ваша клавиатура не US и на Вашей хост системе установлен Kbd, то Вы можете собрать подходящую раскладку для Вашей клавиатуры внутри ядра. Если Вы пожелаете это сделать, то запустите следующую команду (замените [путь к раскладке] на положение клавиатурной раскладки на хосте - обычным местом является /usr/share/kbd):

loadkeys -m [путь к раскладке] > \
    drivers/char/defkeymap.c

Например, если используется русская клавиатура, то используйте /usr/share/kbd/keymaps/i386/qwerty/ru1.map.gz (один из вариантов).

Отконфигурируем ядро через меню-подобный интерфейс:

make ARCH=i386 CROSS_COMPILE=${CLFS_TARGET}- menuconfig

Скомпилируем образ ядра и модули:

make ARCH=i386 CROSS_COMPILE=${CLFS_TARGET}-

Если Вы будете использовать модули, то может понадобиться файл /etc/modprobe.conf. Информация по модулям и конфигурации ядра находится в документации ядра в директории Documentation. Также может быть интересна man страница modprobe.conf.

Будьте осторожны при чтении другой документации, так как обычно она применима только к ядрам 2.4.x. Как мы давно знаем, проблемы конфигурации ядра, специфичные для Hotplug и Udev, не документированы. Проблема в том, что Udev будет создавать ноды устройств только если Hotplug или созданный пользователем скрипт вставит соответствующий модуль в ядро и не все модули определяются Hotplug. Заметьте, что утверждения, похожие на указанное ниже, в файле /etc/modprobe.conf не работают с Udev:

alias char-major-XXX some-module

Установим модули, если ядро их использует:

make ARCH=i386 CROSS_COMPILE=${CLFS_TARGET}- \
    INSTALL_MOD_PATH=${CLFS} modules_install

После завершения компилирования ядра требуются дополнительные шаги для завершения установки. Некоторые файлы необходимо скопировать в директорию ${CLFS}/boot directory.

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

cp -v arch/i386/boot/bzImage ${CLFS}/boot/clfskernel-2.6.17.13

System.map это файл карты символов для ядра. Он содержит карту точек входа в каждую функцию API ядра. Используйте следующую команду для установки этого файла:

cp -v System.map ${CLFS}/boot/System.map-2.6.17.13

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

cp -v .config ${CLFS}/boot/config-2.6.17.13

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

7.12. GRUB-0.97

Пакет GRUB содержит загрузчик GRand Unified Bootloader.

7.12.1. Установка GRUB

GRUB имеет проблемы, когда он иногда корректно не определяет геометрию диска при использовании Linux 2.6. Это отображается в сообщении об ошибке Error 24: Attempt to access block outside partition. Следующий патч содержит исправление этой проблемы и различные исправления для raid контроллеров и добавляет поддержку новых Intel Mac:

patch -Np1 -i ../grub-0.97-fixes-1.patch

Известно, что этот пакет имеет проблемы при изменении флагов оптимизации по умолчанию (включая опции -march и -mcpu. Если любые переменные окружения, которые изменяют оптимизацию по умолчанию, были указаны, например CFLAGS и CXXFLAGS, сбросьте их при сборке GRUB.

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

./configure --prefix=/usr \
   --build=${CLFS_HOST} --host=${CLFS_TARGET}

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

make

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

make DESTDIR=${CLFS} install
mkdir -v ${CLFS}/boot/grub
cp -v ${CLFS}/usr/lib/grub/*/stage{1,2} ${CLFS}/boot/grub

Директория в ${CLFS}/usr/lib/grub (её имя зависит от Вашей архитектуры) содержит файлы *stage1_5, различные для разных файловых систем. Пересмотрите доступные файлы и скопируйте подходящие в директорию ${CLFS}/boot/grub. Большинство пользователей скопируют файлы e2fs_stage1_5 и/или reiserfs_stage1_5.

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

7.13. Установка окружения

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

cat > ${CLFS}/root/.bash_profile << "EOF"
set +h
PS1='\u:\w\$ '
LC_ALL=POSIX
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin:/tools/sbin
export LC_ALL PATH PS1
EOF

Переменная LC_ALL контолирует локализацию некоторых программ, делая вывод их сообщений зависимым от страны. Установка LC_ALL в “POSIX” или “C” (обе эквивалентны) подтверждает, что в Вашей временной систме всё будет работать как ожидается.

Добавлением /tools/bin в конце стандартной переменной PATH все программы, установленные в главе Создание временной системы, будут находиться оболочкой если они ещё не были собраны на целевой системе. Эта конфигурация заставляет использовать бинарники финальной системы, так как они собираются поверх временной системы, минимизируя шанс программ финальной системы быть собранными при помощи временной системы.

7.14. Создание файла /etc/fstab

Файл /etc/fstab используется рядом программ для определения того, какие разделы будут монтированы по умолчанию, какие файловые системы должны быть проверены и т.д. Создадим новую таблицу файловых систем так, как показано здесь:

cat > ${CLFS}/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.

Точка монтирования /dev/shm для tmpfs добавлена для обеспечения поддержки POSIX-разделяемой памяти. Ваше ядро должно быть собрано со встроенной поддержкой этой системы (более подробно об этом смотрите в следующем разделе). Имейте в виду, что только небольшое количество программного обеспечения использует POSIX-разделяемую память. Поэтому точка монтирования /dev/shm является опциональной. Для более подробной информации смотрите Documentation/filesystems/tmpfs.txt в дереве исходников ядра.

7.15. CLFS-Bootscripts-1.0

Пакет СLFS-Bootscripts содержит набор скриптов для запуска/остановки системы CLFS во время загрузки/выключения.

7.15.1. Установка CLFS-Bootscripts

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

make ETCDIR=${CLFS}/etc minimal

Скрипт setclock считывает время с внутренних часов Вашего компьютера, также известных как часы BIOS или CMOS. Если аппаратные часы установлены на UTC, то этот скрипт конвертирует время аппаратных часов в локальное время, используя файл /etc/localtime, (который говорит программе hwclock, в каком часовом поясе находится пользователь). Нет способа автоматического определения того, установленны ли внутренние часы Вашего компьютера в UTC или нет, поэтому нам надо будет это настроить самим.

Если Вы не знаете, установлены ли аппаратные часы на время UTC, то определите это запуском команды hwclock --localtime --show и, если необходимо, отредактируйте скрипт /etc/sysconfig/clock. Худшее, что может произойти при неправильной установке здесь, это неправильное отображение времени.

Измените значение переменной UTC ниже на значение 0 (ноль), если аппаратные часы не установлены на время UTC.

cat > ${CLFS}/etc/sysconfig/clock << "EOF"
# Begin /etc/sysconfig/clock

UTC=1

# End /etc/sysconfig/clock
EOF

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

7.16. Udev Rules-1.0-3

Пакет Udev Cross-LFS rules содержит необходимый набор правил для начальной работы системы.

7.16.1. Установка Udev-Rules

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

make DESTDIR=${CLFS} install-minimal

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

7.17. Заполнение /dev

7.17.1. Создание начальных нод устройств

Замечание

Все последующие команды в книге должны выполняться пользователем root. Также дважды убедитесь, что ${CLFS} установлена как root.

Когда ядро загружает систему, оно требует наличия нескольких файлов устройств, обычно это устройства console и null. Файлы устройств будут созданы на жёстком диске, поэтому они будут доступны до запуска udev и в дополнение при загрузке Linux в однопользовательском режиме (отсюда ограниченные права доступа на console). Создадим их запуском следующих команд:

mknod -m 600 ${CLFS}/dev/console c 5 1
mknod -m 666 ${CLFS}/dev/null c 1 3

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

На данный момент права на директорию ${CLFS} и все её поддиректории принадлежат пользователю clfs, который существует только на основной системе. В целях безопасности корневая директория ${CLFS} и все её поддиректории должны принадлежать root. Изменим владельца для ${CLFS} и её поддиректорий запуском следующей команды:

chown -Rv root:root ${CLFS}

7.19. Обеспечение загрузки временной системы

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

Ранее мы скомпилировали и установили программы загрузчика GRUB при подготовке этого шага. Процедура влечёт за собой запись некоторых специальных файлов GRUB в особое место на жёстком диске. Мы очень рекомендуем создать загрузочную дискету GRUB в качестве резерва. Вставьте чистую дискету и выполите следующие команды:

dd if=${CLFS}/boot/grub/stage1 of=/dev/fd0 bs=512 count=1
dd if=${CLFS}/boot/grub/stage2 of=/dev/fd0 bs=512 seek=1

Выймите дискету и сохрание её в надёжном месте. Теперь запустим оболочку grub:

grub

GRUB использует собственное именование структуры для дисков и разделов в формате (hdn,m), где n это номер жёсткого диска, a m это номер раздела, оба начинаются с нуля. Например, раздел hda1 это (hd0,0) для GRUB, a hdb3 это (hd1,2). Для контраста с Linux, GRUB не считает CD-ROM накопители жёсткими дисками. Например, если используется CD на hdb и второй жёсткий диск на hdc, то второй жёсткий диск останется (hd1).

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

Скажем GRUB, где искать файлы stage{1,2}. Клавиша Tab может использоваться для отображения альтернатив GRUB:

root (hd0,3)

Внимание

Следующая команда перепишет текущий загрузчик. Не выполняйте команду, если это не желательно, например, при использовании сторонних менеджеров загрузки для управления Master Boot Record (MBR). При таком сценарии предпочтительнее устанавливать GRUB в “загрузочный сектор” раздела CLFS. В этом случае следующая команда должна быть setup (hd0,3).

Скажем GRUB установить себя в MBR hda:

setup (hd0)

Если всё прошло хорошо, то GRUB сообщит о нахождении своих файлов в /boot/grub. Это всё. Покидаем оболочку grub:

quit

Создадим файл “menu list”, описывающий стартовое меню GRUB:

cat > ${CLFS}/boot/grub/menu.lst << "EOF"
# Begin /boot/grub/menu.lst

# По умолчанию загружаем первый пункт меню.
default 0

# Оставляем 30 секунд до загрузки пункта по умолчанию.
timeout 30

# Используем желаемые цвета.
color green/black light-green/black

# Первый пункт для CLFS.
title CLFS 1.0.0
root (hd0,3)
kernel /boot/clfskernel-2.6.17.13 root=/dev/hda4
EOF

Добавим пункт меню для хост дистрибутива, если хотите. Это может выглядеть примерно так:

cat >> ${CLFS}/boot/grub/menu.lst << "EOF"
title Red Hat
root (hd0,2)
kernel /boot/kernel-2.6.5 root=/dev/hda3
initrd /boot/initrd-2.6.5
EOF

7.20. Что дальше

Теперь Вы находитесь в точке создания копии директории ${CLFS} на Вашей целевой машине. Простейшим методом будет использование tar и копирование файла.

tar -jcvf ${CLFS}.tar.bz2 ${CLFS}

Некоторые имеют другие идеи о том, как это сделать. Ниже представлена таблица с методами и ссылками на соответствующую информацию.

Table 7.1. Методы загрузки

Метод загрузки Для архитектуры Ссылка
nfsroot MIPS, PPC, Sparc, x86 и x86_64 http://documents.jg555.com/netboot

Глава 8. Если Вы решили использовать Chroot

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

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

8.2. Util-linux-2.12r

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

8.2.1. Установка Util-linux

Следующий патч исправляет проблему сборки с GCC 4.1.1:

patch -Np1 -i ../util-linux-2.12r-gcc4_fixes-1.patch

Util-linux по умолчанию не использует только что установленные заголовки и библиотеки из директории /tools. Это исправляется изменением скрипта configure:

cp -v configure{,.orig}
sed -e 's@/usr/include@/tools/include@g' configure.orig > configure

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

./configure

Компилируем некоторые поддерживаемые шаблоны:

make ARCH="" CPU="" -C lib

Описание параметров команды make:

ARCH=""

Отключает определение архитектуры.

CPU=""

Отключает определение CPU.

Только некоторые из утилит должны быть собраны:

make ARCH="" CPU="" -C mount mount umount
make ARCH="" CPU="" -C text-utils more

Копируем эти программы во временную систему непосредственно:

cp -v mount/{,u}mount text-utils/more /tools/bin

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

8.3. Монтирование виртуальных файловых систем ядра

Замечание

Все последующие команды в книге должны выполняться пользователем root. Также дважды убедитесь, что ${CLFS} установлена как root.

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

Начнём с создания директорий, в которые будут монтироваться файловые системы:

mkdir -pv ${CLFS}/{dev,proc,sys}

Теперь подмонтируем файловые системы:

mount -vt proc proc ${CLFS}/proc
mount -vt sysfs sysfs ${CLFS}/sys

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

Две ноды устройств, /dev/console и /dev/null, должны присутствовать в файловой системе. Они нужны ядру даже до запуска Udev в процессе загрузки, поэтому создадим их:

mknod -m 600 ${CLFS}/dev/console c 5 1
mknod -m 666 ${CLFS}/dev/null c 1 3

После завершения системы и загрузки остальные ноды устройств будут созданы пакетом Udev. Пока этот пакет нам не доступен, мы должны сделать другие шаги для предоставления нод устройств для CLFS системы. Мы используем опцию “bind” в команде mount чтобы сделать структуру директории /dev хост системы доступной в файловой системе CLFS:

mount -v -o bind /dev ${CLFS}/dev

Дополнительные файловые системы скоро будут примонтированы в пределах chroot окружения. Для оставления возможности обновления хост системы выполним “фальшивое монтирование” для каждой из них:

mount -f -vt tmpfs tmpfs ${CLFS}/dev/shm
mount -f -vt devpts -o gid=4,mode=620 devpts ${CLFS}/dev/pts

8.4. Вход в Chroot окружение

Теперь пришло время войти в chroot окружение для начала сборки и установки финальной CLFS системы. Перед тем, как войти в chroot окружение, Вам необходимо войти в систему как root. Для входа в chroot окружение выполним следующую команду:

chroot "${CLFS}" /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, то это хорошее место задать их.

С этого места нам уже не надо использовать переменную CLFS, потому что вся работа будет ограничена файловой системой CLFS. Это потому что оболочка Bash говорит, что ${CLFS} теперь является корневой (/) директорией.

Заметьте, что /tools/bin последняя в списке путей PATH. Благодаря этому пакеты из этой директории не будут использованы, если мы уже установили окончательную версию соответствующего пакета. Это действует в том случае, когда оболочка “не запоминает” расположение исполняемых файлов, поэтому отключим эту функцию при помощи опции +h, переданной bash.

Запомните, что все команды до конца этой главы и во всех последующих выполняются из chroot окружения. Если Вы покинули это окружение по любой причине (например после перезагрузки), то Вы должны снова зайти в chrrot окружение и примонтировать файловые системы proc и devpts (описываются позже) перед продолжением установки.

Заметьте, что приглашение bash выводит сообщение I have no name!. Это нормально, поскольку файл /etc/passwd ещё не создан.

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

На данный момент права на директории /tools и /cross-tools принадлежат пользователю clfs, который существует только на основной системе. Хотя директории /tools и /cross-tools могут быть удалены сразу после установки CLFS системы, они могут быть оставлены для сборки других CLFS систем. Если директории /tools и /cross-tools оставляются как есть, то файлы принадлежат ID пользователя без соответствующего аккаунта. Это опасно, так как пользователь, созданный позднее, может иметь тот же ID и может получить доступ к директории /tools и всем файлам в ней.

Чтобы избежать этого, добавим пользователя clfs в новую СLFS позже при создании файла /etc/passwd и подправим его таким образом, чтобы ID этого пользователя и группы были идентичны им же на основной системе. Помимо этого, Вы можете связать содержимое директорий /tools и /cross-tools с пользователем root запуском команды:

chown -Rv 0:0 /tools
chown -Rv 0:0 /cross-tools

Команда использует 0:0 вместо root:root, потому что chown не может использовать имя “root” до того, как будет создан файл паролей passwd.

8.6. Создание директорий

Теперь нам надо создать структуру файловой системы CLFS. Создадим стандартное дерево директорий, используя следующие команды:

mkdir -pv /{bin,boot,dev,{etc/,}opt,home,lib,mnt}
mkdir -pv /{proc,media/{floppy,cdrom},sbin,srv,sys}
mkdir -pv /var/{lock,log,mail,run,spool}
mkdir -pv /var/{opt,cache,lib/{misc,locate},local}
install -dv -m 0750 /root
install -dv -m 1777 {/var,}/tmp
mkdir -pv /usr/{,local/}{bin,include,lib,sbin,src}
mkdir -pv /usr/{,local/}share/{doc,info,locale,man}
mkdir -pv /usr/{,local/}share/{misc,terminfo,zoneinfo}
mkdir -pv /usr/{,local/}share/man/man{1..8}
for dir in /usr{,/local}; do
  ln -sv share/{man,doc,info} $dir
done

По умолчанию директории создаются с правами доступа 755, но это правильно не для всех из них. Мы сделаем два изменения - одно для домашней директории пользователя root, а другое для директории временных файлов.

Первой командой смены моды мы запрещаем доступ в директорию /root для всех, кроме владельца — то же самое нам надо будет потом сделать для домашних директорий остальных пользователей. Второй командой смены моды мы позволяем всем пользователям записывать и читать файлы в и из директорий /tmp и /var/tmp, но они не смогут удалять оттуда файлы других пользователей. Последнее достигается установкой “бита прикрепления” - старшего бита в битовой маске 1777.

8.6.1. Совместимость с FHS

Мы создаём наше дерево каталогов совместимым со стандартом FHS (доступен на http://www.pathname.com/fhs/). Вместе с деревом директорий, созданным выше, этот стандарт обуславливает существование директорий /usr/local/games и /usr/share/games. Мы не рекомендуем их для базовой системы, хотя Вы можете создать систему полностью FHS-совместимой. Поскольку структура поддиректорий /usr/local/share не описана в стандарте FHS, то мы создаём её так, как надо нам.

8.7. Создание необходимых ссылок

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

ln -sv /tools/bin/{bash,cat,grep,pwd,stty} /bin
ln -sv /tools/lib/libgcc_s.so{,.1} /usr/lib
ln -sv /tools/lib/libstd* /usr/lib
ln -sv bash /bin/sh

8.8. Создание файлов 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” заменяет его здесь) будет определён позднее.

Дополнительные пользователи, которых Вы можете захотеть добавить:

bin:x:1:1:bin:/bin:/bin/false

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

daemon:x:2:6:daemon:/sbin:/bin/false

Он часто рекомендуется для использования с некоторыми непривилегированными ID пользователя/ID групы для запуска демонов, в порядке ограничения их доступа к системе

adm:x:3:16:adm:/var/adm:/bin/false

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

lp:x:10:9:lp:/var/spool/lp:/bin/false

Используется программами для печати

mail:x:30:30:mail:/var/mail:/bin/false

Часто используется программами электронной почты

news:x:31:31:news:/var/spool/news:/bin/false

Часто используется для сетевых серверов новостей

uucp:x:32:32:uucp:/var/spool/uucp:/bin/false

Часто используется для копирования файлов между Unix серверами

operator:x:50:0:operator:/root:/bin/bash

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

postmaster:x:51:30:postmaster:/var/spool/mail:/bin/false

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

nobody:x:65534:65534:nobody:/:/bin/false

Используется NFS

Создадим файл /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:
cdrom:x:15:
EOF

Дополнительные группы, которые Вы можете захотеть добавить:

adm:x:16:root,adm,daemon

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

console:x:17:

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

cdrw:x:18:

Эта группа позволяет использовать CDRW накопитель

mail:x:30:mail

Используется MTA (Mail Transport Agents)

news:x:31:news

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

uucp:x:32:uucp

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

users:x:1000:

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

nogroup:x:65533:

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

nobody:x:65534:

Используется NFS

Созданные группы не являются частью какого-то стандарта — эти группы будут использоваться при конфигурации Udev в финальной системе. База стандарта Linux (LSB, доступна на http://www.linuxbase.org) рекомендует, чтобы после группы “root” с ID группы (GID) 0 находилась группа “bin” с GID, равным 1. Все другие имена групп и их GID могут свободно выбираться пользователем, но некоторые пакеты зависят от имени группы, хоть и не зависят от номера GID.

Программы login, agetty и init (и другие) используют некоторые лог-файлы для записи информации, например кто был зарегистрирован в системе и когда. Хотя эти программы не будут записывать в отсутствующие лог-файлы. Проинициализируем лог-файлы и дадим им правильные права:

Для удаления сообщения “I have no name!” запустим новую оболочку. Так как полная Glibc была установлена в главе Создание инструментов кросс-компилирования, а файлы /etc/passwd и /etc/group были созданы сейчас, имена пользователя и группы будут работать.

exec /tools/bin/bash --login +h

Замечание по использованию параметра +h. Это скажет bash не использовать внутренний кеш путей. Без этого bash будет запоминать пути к исполненным бинарникам. Поскольку мы собираемся использовать вновь скомпилированные пакеты по мере их установки, то мы должны отключить эту функцию в этой главе.

Созданные группы не являются частью какого-то стандарта — эти группы будут использоваться при конфигурации Udev в финальной системе. База стандарта Linux (LSB, доступна на http://www.linuxbase.org) рекомендует, чтобы после группы “root” с ID группы (GID) 0 находилась группа “bin” с GID, равным 1. Все другие имена групп и их GID могут свободно выбираться пользователем, но некоторые пакеты зависят от имени группы, хоть и не зависят от номера GID.

touch /var/run/utmp /var/log/{btmp,lastlog,wtmp}
chgrp -v utmp /var/run/utmp /var/log/lastlog
chmod -v 664 /var/run/utmp /var/log/lastlog
chmod -v 600 /var/log/btmp

Файл /var/run/utmp записывает пользователей, которые уже зарегистрировались. Файл /var/log/wtmp записывает все входы в систему и выходы из системы. Файл /var/log/lastlog записывает, когда каждый пользователь последний раз регистрировался в системе. Файл /var/log/btmp записывает неправильые регистрации.

8.9. Монтирование файловых систем ядра

8.9.1. Монтирование дополнительных файловых систем ядра

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

mount -vt devpts -o gid=4,mode=620 none /dev/pts
mount -vt tmpfs none /dev/shm

Команды mount, указанные выше, могут выдать следующее предупреждающее сообщение:

can't open /etc/fstab: No such file or directory.

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

Часть V. Сборка CLFS системы

Оглавление

Глава 9. Создание инструментов тестирования

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

Эта глава собирает инструменты, необходимые для запуска тестов, содержащихся в пакетах. То eсть make check

9.2. Tcl-8.4.12

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

9.2.1. Установка Tcl

Этот и следующие два (Expect и DejaGNU) устанавливаемых пакета нужны для работы тестирования GCC и Binutils. Установка этих трех пакетов нужна только для этого, и если Вы не хотите тестировать устанавливаемые инструменты, то можно пропустить эти установки, но мы рекомендуем проверять работоспособность собираемых инструментов.

Сначала исправим ошибку синтаксиса скрипта configure:

cd unix
sed -i "s/relid'/relid/" configure

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

./configure --prefix=/tools

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

make

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

make install

Собственные файлы заголовков Tcl необходимы для следующего пакета Expect. Установим их в /tools:

make install-private-headers

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

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

9.2.2. Описание Tcl

Установленные программы: tclsh (ссылка на tclsh8.4) и tclsh8.4
Установленная библиотека: libtcl8.4.so

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

tclsh8.4

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

tclsh

Ссылка на tclsh8.4

libtcl8.4.so

Библиотека Tcl

9.3. Expect-5.43.0

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

9.3.1. Установка Expect

Следующая команда sed говорит скрипту configure искать библиотеки в ${libdir}, а не только в /tools/lib:

sed -i '/EXP_LIB_SPEC=/s@${exec_prefix}/lib@${libdir}@' configure

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

patch -Np1 -i ../expect-5.43.0-spawn-2.patch

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

./configure --prefix=/tools --with-tcl=/tools/lib \
    --with-tclinclude=/tools/include

Описание параметров команды configure:

--with-tcl=/tools/lib

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

--with-tclinclude=/tools/include

Это точно указывает Expect, где искать внутренние заголовки Tcl. Использование этой опции предотвращает состояния, когда configure выпадает, потому что не может автоматически определить положение директории исходников Tcl.

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

make

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

make SCRIPTS="" install

Описание параметра команды make:

SCRIPTS=""

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

9.3.2. Описание Expect

Установленная программа: expect
Установленная библиотека: libexpect-5.43.a

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

expect

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

libexpect-5.43.a

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

9.4. File-4.17

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

9.4.1. Установка File

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

./configure --prefix=/tools

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

make

В этом пакете тестов нет.

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

make install

Теперь мы создадим символическую ссылку, так что тесты GCC смогут использовать file:

ln -sv /tools/bin/file /usr/bin

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

9.5. DejaGNU-1.4.4

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

9.5.1. Установка DejaGNU

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

./configure --prefix=/tools

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

make install

9.5.2. Описание DejaGNU

Установленная программа: runtest

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

runtest

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

9.6. Tree-1.5.0

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

9.6.1. Установка Tree

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

make

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

make prefix=/tools install

Описание параметров команды make:

prefix=/tools

Это заменяет префикс по умолчанию /usr/local в файле Makefile.

9.6.2. Описание Tree

Установленная программа: tree

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

tree

Tree выводит структуру директории в древовидном формате

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

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

В этой главе мы войдём в фазу сборки и начнём серьёзно собирать нашу СLFS систему. Установка программ строго последовательная. Хотя в большинстве случаев инструкции по установке могут быть сделаны короче и более общими, мы их оптимизировали для предоставления полных инструкций для каждого пакета для уменьшения вероятности ошибки. Ключом к пониманию того, что делает рабочая Линукс система есть знание того, для чего нужен каждый пакет и зачем он нужен пользователю или системе. Для каждого установленного пакета приводится информация о том, что входит в пакеты, краткое описание каждой программы и библиотеки.

Если в этой главе Вы решите использовать оптимизацию компилятора,то Вам стоит посмотреть справку по оптимизации на http://www.linuxfromscratch.org/hints/downloads/files/optimization.txt. Оптимизация компилятора может сделать программы быстрее, но могут возникнуть сложности при компилировании и некоторые проблемы при работе этих программ. Если пакет отказывается компилироваться при использовании оптимизации, то попробуйте скомпилировать пакет без неё, возможно проблемы исчезнут. Если пакет компилируется с использованием оптимизации, то есть возможность, что он скомпилируется некорректно, например могут появиться проблемы между интерактивностью в коде и собранными инструментами. В общем, использование оптимизации при сборке является рискованным. Также отметьте, что опции -march и -mtune могут привести к проблемам с пакетами Binutils, GCC и Glibc. Небольшой потенциал от выгоды применения оптимизации компилятора часто перевешивается риском. Новичкам в CLFS рекомендуется собирать её без оптимизации. В Ваших силах сделать систему быстрой и стабильной одновременной.

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

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

10.2. Управление пакетами

Управление пакетами является часто запрашиваемым дополнением к книге CLFS. Менеджер пакетов позволяет отслеживать установку файлов, делая легким их удаление, и обновлять пакеты. И перед тем, как Вы начнёте радоваться, НЕТ — этот раздел ни рассказывает о каком-нибудь особенном менеджере пакетов, ни рекомендует. Здесь предоставляется обзор наиболее популярных способов и методов их работы. Наилучший для Вас менеджер пакетов может быть среди этих способов или может быть комбинацией из нескольких. Этот раздел коротко оговаривает проблемы, которые могут появиться при обновлении пакетов.

Некоторые основания, почему менеджеры пакетов не описаны в CLFS или BLFS:

  • Рассмотрение управления пакетами сфокусировано вокруг целей этой книги - обучению того, как строить Линукс систему.

  • Существует много решений по управлению пакетами, имеющие собственные преимущества и недостатки.

Существует несколько советов, написанных на тему управления пакетами. Посетите Подпроект советов для поиска подходящего для Вас варианта.

10.2.1. Задачи обновления

Менеджер пакетов делает обновление пакетов на более новую версию при её появлении. Обычно инструкции, описанные в книгах CLFS и BLFS, могут быть использованы для обновления на новые версии. Есть несколько моментов, которые Вы должны знать при обновлении пакетов, особенно на работающей системе.

  • Если один из основных пакетов (glibc, gcc, binutils) надо обновить на новую младшую версию, то безопаснее пересобрать CLFS. Вы можете сделать это пересборкой всех пакетов в порядке их зависимостей. Мы это не рекомендуем. Например, если glibc-2.2.x необходимо обновить до glibc-2.3.x, то безопаснее пересобрать. Для незначительного обновления версий обычно работает простая переустановка, но это не гарантировано. Например, обновление от glibc-2.3.4 до glibc-2.3.5 обычно не будет означать каких-либо проблем.

  • Если обновлён пакет, содержащий разделяемые библиотеки и если имена библиотек изменились, то все пакеты, динамически скомпонованные с этими библиотеками, должны быть перекомпилированы для связи с новыми библиотеками. Заметьте, что это не корреляция между версией пакета и именем библиотеки. Например, рассмотрим пакет foo-1.2.3, который устанавливает разделяемую библиотеку с именем libfoo.so.1. Скажем, Вы обновляете пакет на новую версию foo-1.2.4, которая устанавливает разделяемую библиотеку с именем libfoo.so.2. В этом случае все пакеты, которые динамически скомпонованы с libfoo.so.1, необходимо перекомпилировать для компоновки с libfoo.so.2. Заметьте, что Вы не должны удалять предыдущие библиотеки, пока зависимые пакеты перекомпилируются.

  • Если Вы обновляете запущенную систему, будьте внимательны с пакетами, которые используют cp вместо install для установки файлов. Последняя команда обычно безопаснее, если программа или библиотека уже загружена в память.

10.2.2. Способы управления пакетами

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

10.2.2.1. Это всё в моей голове!

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

10.2.2.2. Установка в отдельные директории

Это простейшее управление пакетами, которое не требует дополнительных пакетов для управления установкой. Каждый пакет устанавливается в отдельную директорию. Например, пакет foo-1.1 установлен в /usr/pkg/foo-1.1 и сделана ссылка из /usr/pkg/foo на /usr/pkg/foo-1.1. Когда устанавливается новая версия foo-1.2, она устанавливается в /usr/pkg/foo-1.2, а предыдущая ссылка заменяется ссылкой на новую версию.

Такие переменные окружения, как PATH, LD_LIBRARY_PATH, MANPATH, INFOPATH и CPPFLAGS необходимо расширить для включения /usr/pkg/foo. Для более чем нескольких пакетов такая схема становится неуправляемой.

10.2.2.3. Управление пакетами, основанное на ссылках

Это вариация предыдущей техники управления пакетами. Каждый пакет установлен аналогично предыдущей схеме. При этом он установлен, делая ссылку на каждый файл в иерархию /usr. Это исключает необходимость расширять переменные окружения. Хотя ссылки могут быть созданы пользователем, для автоматизации их создания было написано много менеджеров пакетов. Некоторые из таких популярных менеджеров - Stow, Epkg, Graft и Depot.

Установка должна быть обманута так, чтобы пакет думал, что он установлен в /usr, хотя в действительности он установлен в иерархию /usr/pkg. Установка таким способом обычно не тривиальная задача. Например, предположим, что Вы устанавливаете пакет libfoo-1.1. Следующие инструкции могут не установить пакет корректно:

./configure --prefix=/usr/pkg/libfoo/1.1
make
make install

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

./configure --prefix=/usr
make
make DESTDIR=/usr/pkg/libfoo/1.1 install

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

10.2.2.4. Управление, основанное на отметке по времени

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

Хотя такая схема имеет преимущество простоты, она имеет два недостатка. Если во время установки файлы установлены с другой отметкой по времени, не соответствующей текущему времени, то они не будут отслежены менеджером пакетов. Также эта схема может быть использована только тогда, когда за одно время установлен один пакет. Логи не надёжны, если два пакета были установлены на двух различных консолях.

10.2.2.5. Управление, основанное на LD_PRELOAD

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

10.2.2.6. Создание архива пакетов

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

Такой метод используется в большинстве менеджеров пакетов, находящихся в комерческих дистрибутивах. Примеры менеджеров пакетов, соответствующих этому методу, это RPM (который в данном случае требуется Linux Standard Base Specification), pkg-utils, apt Debian-а и система портежей Gentoo. Совет по адаптации такого стиля управления пакетами для LFS систем находится на http://www.linuxfromscratch.org/hints/downloads/files//fakeroot.txt.

10.3. Опять о тестах

Во время сборки финальной системы Вы больше не кросскомпилируете, поэтому возможно запускать тесты пакетов. Некоторые тесты более важные чем другие. Например, тесты для основных пакетов — GCC, Binutils и Glibc — являются крайне важными так как они играют центральную роль в правильной работе системы. Тесты для GCC и Glibc могут занять очень много времени, особенно на медленной машине, но они очень рекомендуются.

Известной проблемой запуска тестов для Binutils и GCC является запуск вне псевдотерминалов (PTY). Это может привести к большому числу непройденных тестов. Это может произойти в некоторых случаях, но в большинстве вероятных случаях (если Вы в chroot) это из-за того, что хост система не имеет правильно установленную файловую систему devpts. Эта проблема обсуждается в деталях на http://trac.cross-lfs.org/wiki/faq#no-ptys.

Иногда тесты пакетов будут выпадать но по причинам, которые разработчики осознают и считают не критичными. Проконсультируйтесь в логах, размещённых на http://trac.cross-lfs.org/clfs/build-logs/1.0.0/ для проверки, ожидаются ли эти ошибки. Этот сайт имеет силу для всех тестов из этой книги.

10.4. Временный Perl-5.8.8

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

10.4.1. Установка Perl

Сначала адаптируем некоторые жёстко прописанные пути в библиотеке C применением следующего патча:

patch -Np1 -i ../perl-5.8.8-libc-2.patch

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

./configure.gnu --prefix=/tools \
   -Dstatic_ext='Data/Dumper IO Fcntl POSIX' -Dcc="gcc"

Описание параметра команды configure:

-Dstatic_ext='Data/Dumper IO Fcntl POSIX'

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

Теперь мы готовы к сборке утилит perl:

make perl utilities

Хотя Perl содержит тесты, не рекомендуется запускать их сейчас. Только часть Perl была создана и запуск make test сейчас будет означать, что остальная часть Perl будет собрана нормально, что излишне на этом этапе. Тест может быть запущен позднее в этой главе при необходимости.

Установим эти инструменты и их библиотеки:

cp -v perl pod/pod2man /tools/bin
install -dv /tools/lib/perl5/5.8.8
cp -Rv lib/* /tools/lib/perl5/5.8.8

В конце создадим необходимую ссылку:

ln -sv /tools/bin/perl /usr/bin

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

10.5. Linux-Headers-2.6.17.13-09092006

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

10.5.1. Установка заголовков Linux

В течении многих лет было очень практично использовать “сырые” заголовки ядра (прямо из тарбола ядра) в /usr/include, но в последние несколько лет разработчики ядра приняли жёсткое решение, что так не должно быть. Это привело к появлению проекта Linux-Libc-Headers, который был разработан для поддержки Application Programming Interface (API) стабильной версии заголовков Linux. С некоторых пор этот проект прекратил обновляться, поэтому команда Cross-LFS начала разработку своего собственного проекта.

Установим файлы заголовков, общие для всех архитектур:

install -dv /usr/include
cp -av include/{asm-generic,linux,mtd,scsi,sound} /usr/include/

Установим файлы заголовков для этой архитектуры:

cp -av include/asm-i386 /usr/include/asm

10.5.2. Описание Linux-Headers

Установленные заголовки: /usr/include/{asm,asm-generic,linux,mtd,scsi,sound}/*.h

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

/usr/include/{asm,asm-generic,linux,mtd,scsi,sound}/*.h

Заголовки Linux API

10.6. Man-pages-2.33

Пакет Man-pages содержит более 1200 man-страниц.

10.6.1. Установка Man-pages

Установим Man-pages запуском:

make install

10.6.2. Описание Man-pages

Установленные файлы: различные man страницы

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

man pages

Этот пакет содержит страницы man, которые описывают следующее: звголовки POSIX (раздел 0p), утилиты POSIX (раздел 1p), функции POSIX (раздел 3p), команды пользователя (раздел 1), системные вызовы (раздел 2), вызовы libc (раздел 3), информацию об устройствах (раздел 4), форматы файлов (раздел 5), игры (раздел 6), соглашения и макро пакеты (раздел 7), системное администрирование (раздел 8) и ядро (раздел 9).

10.7. Glibc-2.4

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

10.7.1. Установка Glibc

Замечание

Некоторые пакеты вне CLFS допускают установку GNU libiconv для преобразования данных из одной кодировки в другую. Домашняя страница проекта (http://www.gnu.org/software/libiconv/) говорит “Эта библиотека предоставляет реализацию iconv() для использования на системах, которые её не имеют, или те реализации не могут преобразовывать из/в Unicode”. Glibc предоставляет реализацию iconv() и может преобразовывать из/в Unicode, хотя libiconv не требуется в системе CLFS.

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

Следующий патч исправит проблему, приводящую к падению localdef:

patch -Np1 -i ../glibc-2.4-localedef_segfault-1.patch

Следующий патч устраняет проблему с iconv:

patch -Np1 -i ../glibc-2.4-iconv_fix-1.patch

Следующая команда sed устраняет проблему сборки Glibc. Она предостережёт nscd от попытки компоновки с отсутствующими библиотеками:

cp -v nscd/Makefile{,.orig}
sed -e "/nscd_stat.o: sysincludes = # nothing/d" nscd/Makefile.orig > \
    nscd/Makefile

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

mkdir -v ../glibc-build
cd ../glibc-build

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

../glibc-2.4/configure --prefix=/usr \
    --disable-profile --enable-add-ons --enable-kernel=2.6.0 \
    --libexecdir=/usr/lib/glibc

Описание нового параметра команды configure:

--libexecdir=/usr/lib/glibc

Изменяет место установки программы pt_chown из места по умолчанию /usr/libexec на /usr/lib/glibc.

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

make

Важно

Проведение тестирования Glibc очень критично. Не пропускайте его.

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

make -k check >glibc-check-log 2>&1 ; grep Error glibc-check-log

Тесты Glibc сильно зависят от некоторых функций хост системы, в особенности ядра. Тест posix/annexc обычно выпадает и Вы должны увидеть в выводе Error 1 (ignored). Кроме этого, ожидается, что тест Glibc проходит. Хотя в некоторых случаях некоторые ошибки неизбежны. Если тест выпадает из-за отсутствия программы (или отсутствия символической ссылки) или выдаёт ошибку сегментации, то Вы увидите код ошибки больше чем 127, а детали будут в логе. Хуже, когда тесты будут выпадать с Error 2 - при этом содержание соответствующего .out файла может быть информативным, т.е. posix/annexc.out. Здесь приведён список большинства известных общих проблем:

  • Математические тесты, как минимум на i686, выпадают в тестах test-double и test-idouble с gcc-4.1.1. Эти две ошибки в математических тестах являются безвредными. Математические тесты также могут выпадать на системах, где процессор не соответствует новому истинному Intel или AMD. Некоторые параметры оптимизации также являются здесь известным фактором.

  • Если Ваш CLFS раздел примонтирован с опцией noatime, то тест atime выпадет. Как указано в Разделе 2.4, “Монтирование нового раздела”, не используйте опцию noatime во время сборки CLFS.

  • При запуске на старой или медленной машине некоторые тесты могут выпадать из-за превышения времени ожидания теста.

На этапе установки Glibc может выдать предупреждение об отсутствии /etc/ld.so.conf. Упредим это сообщение:

touch /etc/ld.so.conf

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

make install

10.7.2. Интернационализация

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

make localedata/install-locales

Альтернативой запуску предыдущей команды для экономии времени является установка только определённых локалей, тех которые Вам нужны. Это может быть достигнуто использованием команды localedef. Информацию об использовании этой команды можно получить из файла INSTALL в исходниках Glibc. Тем не менее, список локалей может быть существенным для некоторых тестов, в частности теста libstdc++ из GCC. Следующие команды, используемые вместо вышеописанной install-locales, установят минимальный набор локалей для успешного завершения тестирований:

mkdir -pv /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, не полностью поддерживаются некоторыми приложениями, описанными в книгах CLFS и BLFS. Поскольку такие проблемы существуют и приводят к сбоям на некотрых локалях, CLFS не может быть использована с локалями, использующими мультибайтные таблицы символов (включая UTF-8) или пишущиеся в порядке справа налево. Необходимы многочисленные неофициальные и нестабильные патчи для устранения этих проблем, поэтому разработчиками CLFS было решено не поддерживать такие комплексные локали. Это применено также к локалям ja_JP и fa_IR - они были установлены только для прохождения тестов GCC и Gettext и программы watch (части пакета Procps), которые не работают корректно в них. Некоторые попытки обойти эти ограничения описаны в интернационально-связанных заметках.

10.7.3. Конфигурация 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 -v --remove-destination /usr/share/zoneinfo/[xxx] \
    /etc/localtime

Замените [xxx] именем часового пояса, который выдаст tzselect (например, Europe/Kiev).

10.7.4. Настройка динамического загрузчика

По умолчанию, динамический загрузчик (/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

10.7.5. Описание Glibc

Установленные программы: catchsegv, gencat, getconf, getent, iconv, iconvconfig, ldconfig, ldd, lddlibc4, locale, localedef, mtrace, nscd, 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

Демон, который обеспечивает кэш для большинства известных имен запросов сервисов

pcprofiledump

Распечатывает информацию, сгенерированную PC profiling

pt_chown

Программа-помощник к grantpt для установки владельца, группы и прав доступа ведомого псевдо терминала

rpcgen

Генерирует C код для встраивания в протокол вызова удалённой процедуры (Remote Procecure Call - RPC)

rpcinfo

Создаёт вызов RPC к RPC серверу

sln

Статически слинкованная программа, создающая символические ссылки

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

libnsl

Библиотека сетевых сервисов

libnss

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

libpcprofile

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

libpthread

Библиотека POSIX-нитей

libresolv

Описывает функции для создания, посылки и интерпритации пакетов к серверам имён интернет

librpcsvc

Описывает функции, предоставляющие разнообразные RPC сервисы

librt

Описывает функции, предоставляющие большинство из интерфейсов, специфицированных POSIX.1b Realtime Extension

libthread_db

Описывает функции, полезные для построения отладчиков для multi-threaded программ

libutil

Содержит код для “стандартных” функций, используемых во многих других Юникс утилитах

10.8. Настройка инструментария

Сейчас мы изменим файл specs GCC чтобы он указывал на новый динамический компоновщик. Это выполнит команда perl:

gcc -dumpspecs | \
perl -p -e 's@/tools/lib/ld@/lib/ld@g;' \
     -e 's@\*startfile_prefix_spec:\n@$_/usr/lib/ @g;' > \
     $(dirname $(gcc --print-libgcc-file-name))/specs

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

Заметьте, что /lib теперь является префиксом нашего компоновщика.

Предупреждение

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

echo 'main(){}' > dummy.c
cc dummy.c
readelf -l a.out | grep ': /lib'

Если всё в порядке, то не будет ошибок и в выводе Вы увидите:

[Requesting program interpreter: /lib/ld-linux.so.2]

Заметьте, что /lib теперь является префиксом нашего компоновщика.

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

Если всё прошло нормально, то можно удалить тестовые файлы:

rm -v dummy.c a.out

10.9. Binutils-2.17

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

10.9.1. Установка Binutils

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

expect -c "spawn ls"

Если Вы получили следующее сообщение, то Ваше окружение не может оперировать с PTY:

The system has no more ptys.
Ask your system administrator to create more.

В этом случае Вам не стоит запускать тестирование для Binutils и GCC до того, как Вы устраниете проблему.

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

mkdir -v ../binutils-build
cd ../binutils-build

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

../binutils-2.17/configure --prefix=/usr \
    --enable-shared

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

make configure-host

Важно

Во время выполнения команды make configure-host Вы можете получить следующее сообщение об ошибке. Можете безопасно его пропустить.

WARNING: `flex' is missing on your system. You should only
need it if you modified a `.l' file. You may need the `Flex'
package in order for those modifications to take effect. You
can get `Flex' from any GNU archive site.
make tooldir=/usr

Описание параметра команды make:

tooldir=/usr

Обычно tooldir (директория, в которой окончательно размещаются бинарники) устанавливается на $(exec_prefix)/$(target_alias). Так как у нас собственная система, то эта директория в /usr не требуется.

Важно

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

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

make check

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

make tooldir=/usr install

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

cp -v ../binutils-2.17/include/libiberty.h /usr/include

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

10.10. GCC-4.1.1

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

10.10.1. Установка GCC

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

patch -Np1 -i ../gcc-4.1.1-PR20425-1.patch

Примененим замену sed, которая запретит установку libiberty.a. Вместо этого будет использована libiberty.a из Binutils:

sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in

GCC предоставляет скрипт gccbug, определяет во время сборки наличие mktemp и жёстко прописывает результат в тест. Если mktemp не найден, скрипт вернётся к использованию менее случайных имён для временных файлов. Мы установим mktemp позднее, поэтому следующая команда sed будет симулировать его наличие:

sed -i 's/@have_mktemp_command@/yes/' gcc/gccbug.in

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

mkdir -v ../gcc-build
cd ../gcc-build

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

../gcc-4.1.1/configure --prefix=/usr \
    --libexecdir=/usr/lib --enable-shared --enable-threads=posix \
    --enable-__cxa_atexit --enable-c99 --enable-long-long \
    --enable-clocale=gnu --enable-languages=c,c++ \
    --disable-multilib --disable-libstdcxx-pch

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

make bootstrap

Важно

В этой части тестирование GCC является обязательным. Не пропускайте его.

Тестируем результат, но не останавливаемся при возникновении ошибок:

make -k check

Флаг -k используется, чтобы тест прошёл до конца и не останавливался при ошибках. Тесты GCC достаточно исчерпывающие и практически гарантируют некоторые ошибки. Для получения общего результата тестов выполните:

../gcc-4.1.1/contrib/test_summary

Для получения результата перенаправьте вывод через grep -A7 Summ.

Некоторые неожиданные ошибки не могут быть полностью исключены. Разработчики GCC обычно знают об этих проблемах, но пока их не решили.

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

make install

Некоторые пакеты ожидают наличие препроцессора C в директории /lib. Для поддержки таких пакетов создадим символическую ссылку:

ln -sv ../usr/bin/cpp /lib

Многие пакеты используют имя cc для вызова компилятора С. Для поддержки таких пакетов создадим ссылку:

ln -sv gcc /usr/bin/cc

10.10.2. Описание GCC

Установленные программы: c++, cc (ссылка на gcc), cpp, g++, gcc, gccbug и gcov
Установленные библиотеки: libgcc.a, libgcc_eh.a, libgcc_s.so, libmudflap.[a,so], libmudflapth.[a,so], libstdc++.[a,so] и libsupc++.a

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

cc

C компилятор

cpp

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

c++

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

g++

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

gcc

C компилятор

gccbug

Скрипт, применяемый для облегчения создания сообщений об ошибках

gcov

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

libgcc

Описывает run-time поддержку для gcc

libmudflap

Библиотека libmudflap используется GCC как инструментальный указатель и для выстраивания действий

libstdc++

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

libsupc++

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

10.11. Coreutils-5.96

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

10.11.1. Установка Coreutils

В программе uname из этого пакета есть проблема, когда ключ -p всегда возвращает unknown. Следующий патч исправляет такое поведение для архитектур Intel:

patch -Np1 -i ../coreutils-5.96-uname-1.patch

Предупредим Coreutils от инсталяции бинарников, которые будут инсталированы позднее в других пакетах:

patch -Np1 -i ../coreutils-5.96-suppress_uptime_kill_su-1.patch

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

./configure --prefix=/usr

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

make

Тест Coreutils делает некоторые предположения о наличии системных пользователей и групп, которых нет в минимальном текущем окружении. Поэтому перед запуском теста необходимо выполнить некоторые действия. Перейдите дальше к “Установке пакета” если не хотите выполнять тест.

Создадим две группы dummy и пользователя dummy:

echo "dummy1:x:1000:" >> /etc/group
echo "dummy2:x:1001:dummy" >> /etc/group
echo "dummy:x:1000:1000::/root:/bin/bash" >> /etc/passwd

Теперь тест полностью подготовлен к запуску. Следующий тест проверит запуск от имени пользователя root:

make NON_ROOT_USERNAME=dummy check-root

Остальные тесты запустим как пользователь dummy:

src/su dummy -c "make RUN_EXPENSIVE_TESTS=yes check"

После окончания теста удалим группы и пользователя dummy:

sed -i '/dummy/d' /etc/passwd /etc/group

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

make install

Переместим некоторые программы в места, указанные в FHS:

mv -v /usr/bin/{cat,chgrp,chmod,chown,cp,date} /bin
mv -v /usr/bin/{dd,df,echo,false,hostname,ln,ls,mkdir,mknod} /bin
mv -v /usr/bin/{mv,pwd,rm,rmdir,stty,true,uname} /bin
mv -v /usr/bin/chroot /usr/sbin

Некоторые из скриптов в пакете CLFS-Bootscripts зависят от программ в директории /usr. Так как эта директория может быть недоступна на ранних этапах загрузки, то эти программы должны быть на корневом разделе:

mv -v /usr/bin/{[,basename,head,install,nice} /bin
mv -v /usr/bin/{readlink,sleep,sync,test,touch} /bin
ln -svf ../../bin/install /usr/bin

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

Изменяет группу-владельца для указанного файла на заданную группу.

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” или заданную строку, после чего завершается.

10.12. Iana-Etc-2.10

Iana-Etc содержит данные для сетевых сервисов и протоколов.

10.12.1. Установка Iana-Etc

Следующая команда преобразует сырые данные, предоставляемые IANA, в корректные форматы для файлов /etc/protocols и /etc/services:

make

В этом пакете тестов нет.

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

make install

10.12.2. Описание Iana-Etc

Установленные файлы: /etc/protocols и /etc/services

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

/etc/protocols

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

/etc/services

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

10.13. M4-1.4.4

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

10.13.1. Установка M4

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

./configure --prefix=/usr

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

make

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

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

make install

10.13.2. Описание M4

Установленная программа: m4

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

m4

Копирует ввод на вывод, используя макросы. Макросы могут быть как встроенными, так и пользовательскими и могут иметь несколько аргументов. Помимо макро-преобразований, m4 имеет встроенные функции для включения именованных файлов, запуска команд Unix, целочисленной арифметики, разносторонними манипуляциями с текстом, рекурсию и др. Программа m4 может использоваться в качестве front-end для компиляторов или как макропроцессор на Ваше усмотрение

10.14. Bison-2.3

Bison является генератором парсеров.

10.14.1. Установка Bison

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

./configure --prefix=/usr

При конфигурировании системы bison собирается без поддержки интернационализации сообщений об ошибках если программа bison не находится в переменной $PATH. Следующее дополнение исправит это:

echo '#define YYENABLE_NLS 1' >> config.h

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

make

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

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

make install

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

10.15. Ncurses-5.5

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

10.15.1. Установка Ncurses

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

./configure --prefix=/usr --libdir=/lib \
    --with-shared --without-debug

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

make

В этом пакете тестов нет.

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

make install

Переместим статические библиотеки Ncurses в правильное место:

mv -v /lib/lib{panel,menu,form,ncurses,ncurses++,curses}.a /usr/lib

Создадим символические ссылки в /usr/lib:

rm -v /lib/lib{ncurses,menu,panel,form,curses}.so
ln -svf ../../lib/libncurses.so.5 /usr/lib/libcurses.so
ln -svf ../../lib/libncurses.so.5 /usr/lib/libncurses.so
ln -svf ../../lib/libmenu.so.5 /usr/lib/libmenu.so
ln -svf ../../lib/libpanel.so.5 /usr/lib/libpanel.so
ln -svf ../../lib/libform.so.5 /usr/lib/libform.so

Установим права доступа на запись для динамических библиотек Ncurses:

chmod -v 755 /lib/lib{panel,menu,form,ncurses}.so.5.5

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

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

10.16. Procps-3.2.6

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

10.16.1. Установка Procps

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

make

В этом пакете тестов нет.

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

make install

10.16.2. Описание Procps

Установленные программы: free, kill, pgrep, pkill, pmap, ps, pwdx, skill, slabtop, snice, sysctl, tload, top, uptime, vmstat, w и watch
Установленная библиотека: libproc.so

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

free

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

kill

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

pgrep

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

pkill

Посылает сигналы процессам по их имени или другим атрибутам

pmap

Возвращает карту памяти указанного процесса

ps

Выводит список текущих процессов

pwdx

Сообщает текущую рабочую директорию процесса

skill

Посылает сигналы процессам, попадающим под критерий

slabtop

Отображает детальную информацию о кеше ядра в реальном времени

snice

Изменяет приоритет выполнения процессов, соответствующих критериям

sysctl

Модифицирует параметры ядра во время его работы

tload

Отображает график загрузки системы

top

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

uptime

Возвращает время работы системы, количество вошедших в неё пользователей и загрузку системы

vmstat

Отображает статистику виртуальной памяти, включая информацию о процессах, памяти, страницах, блоках ввода-вывода, прерываниях и активности CPU

w

Показывает сколько пользователей подключено к системе, где и как они подключились

watch

Циклически выполняет указанную команду, выводя её первый полный экран вывода. Это позволяет контролировать вывод всё время

libproc

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

10.17. Sed-4.1.5

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

10.17.1. Установка Sed

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

./configure --prefix=/usr --bindir=/bin --enable-html

Описание нового параметра команды configure:

--enable-html

Эта опция говорит Sed собрать и установить его HTML документацию.

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

make

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

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

make install

10.17.2. Описание Sed

Установленная программа: sed

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

sed

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

10.18. Libtool-1.5.22

GNU libtool является общей библиотекой поддержки скриптов. Libtool скрывает сложность использования системных библиотек, обеспечивая совместимый, портируемый интерфейс.

10.18.1. Установка Libtool

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

./configure --prefix=/usr

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

make

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

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

make install

10.18.2. Описание Libtool

Установленные программы: libtool и libtoolize
Установленные библиотеки: libltdl.[a,so]

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

libtool

Предоставляет общие сервисы сборки библиотек

libtoolize

Предоставляет стандартные инструменты для включения поддержки libtool в пакет

libltdl

Скрывает различные сложности библиотек dlopen

10.19. Flex-2.5.33

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

10.19.1. Установка Flex

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

./configure --prefix=/usr

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

make

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

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

make install

Некоторые пакеты ищут библиотеку lex в /usr/lib. Создадим необходимую ссылку:

ln -sv 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 -v 755 /usr/bin/lex

10.19.2. Описание Flex

Установленные программы: flex и lex
Установленная библиотека: libfl.a

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

flex

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

lex

Скрипт, который запускает flex в режиме эмуляции lex

libfl.a

Библиотека flex

10.20. IPRoute2-2.6.16-060323

Пакет Iproute2 содержит программы для базовой и расширенной IPV4 сети.

10.20.1. Установка IPRoute2

Бинарник arpd, входящий в этот пакет, зависит от базы данных Berkeley. Так как arpd не очень сильно необходим в базовой Linux системе, то удалим зависимость с базой данных Berkeley DB, применив патч в следующей команде. Если бинарник arpd необходим, то инструкция по компиляции базы данных Berkeley может быть найдена в книге BLFS в http://www.linuxfromscratch.org/blfs/view/svn/server/databases.html#db.

sed -i '/^TARGETS/s@arpd@@g' misc/Makefile

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

make SBINDIR=/sbin

Описание параметра команды make:

SBINDIR=/sbin

Будем устанавливать бинарники Iproute2 в /sbin. Это корректное положение согласно требованиям FHS, потому что некоторые из бинарников Iproute2 используются в загрузочных скриптах.

В этом пакете тестов нет.

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

make SBINDIR=/sbin install

10.20.2. Описание IPRoute2

Установленные программы: ctstat (ссылка на lnstat), ifcfg, ifstat, ip, lnstat, nstat, routef, routel, rtacct, rtmon, rtpr, rtstat (ссылка на lnstat), ss и tc

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

ctstat

Утилита статуса соединения

ifcfg

Скрипт-обёртка для команды ip

ifstat

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

ip

Основная исполняемая программа. Она имеет несколько различных функций:

ip link [устройство] позволяет пользователям наблюдать за состоянием устройств и вносить изменения.

ip addr позволяет пользователям наблюдать за адресами и их свойствами, добавлять новые адреса и удалять старые.

ip neighbor позволяет пользователям наблюдать за соседними связями и их свойствами, добавлять новые соседние связяи и удалять старые.

ip rule позволяет пользователям наблюдать за политикой маршрутизации и менять её.

ip route позволяет пользователям наблюдать за таблицей маршрутизации и менять правила этой таблицы.

ip tunnel позволяет пользователям наблюдать за IP тунелями, их свойствами и менять их.

ip maddr позволяет пользователям наблюдать за multicast адресами, их свойствами и менять их.

ip mroute позволяет пользователям устанавливать, менять или удалять multicast маршрутизацию.

ip monitor позволяет пользователям продолжительно наблюдать за состоянием устройств, адресами и маршрутами.

lnstat

Предоставляет статистику Linux сети. Это обобщённая и более совершенная замена для старой программы rtstat

nstat

Показывает сетевую статистику

routef

Компонент ip route. Используется для наполнения таблицы маршрутизации

routel

Компонент ip route. Используется для листинга таблицы маршрутизации

rtacct

Отображает содержание /proc/net/rt_acct

rtmon

Утилита мониторинга маршрутов

rtpr

Преобразует вывод ip -o в читаемый вид

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 политику

10.21. Perl-5.8.8

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

10.21.1. Установка Perl

Следующая команда sed подтвердит, что DynaLoader.a будет собран с -fPIC, поэтому позднее он может быть скомпонован в разделяемую библиотеку:

sed -i -e "s@pldlflags=''@pldlflags=\"\$cccdlflags\"@g" \
    -e "s@static_target='static'@static_target='static_pic'@g" Makefile.SH

Замечание

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

ip link set lo up
hostname clfs

Перед началом конфигурации создадим базовый файл /etc/hosts на который будет ссылка в одном из файлов конфигурации Perl. Также он используется во время тестов.

echo "127.0.0.1 localhost $(hostname)" > /etc/hosts

Если Вы хотите контролировать процесс настроек опций сборки Perl, то Вы можете запустить интерактивный скрипт Configure и указывать опции сборки Perl. Если вместо этого Вы предпочитаете использовать настройки, которые Perl определяет по умолчанию автоматически, то просто запустите команду:

./configure.gnu --prefix=/usr \
   -Dman1dir=/usr/share/man/man1 \
   -Dman3dir=/usr/share/man/man3 \
   -Dpager="/bin/less -isR" \
   -Dusethreads

Описание параметра команды configure:

-Dpager="/bin/less -isR"

Корректирует ошибку в коде perldoc, связанную с работой программы less.

-Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3

Пока Groff не установлен, configure.gnu думает, что мы не хотим устанавливать страницы man для Perl. Применение этих параметров изменит это предположение.

-Dusethreads

Это говорит Perl использовать нити.

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

make

Для проверки результата выполним: make test.

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

make install

10.21.2. Описание Perl

Установленные программы: a2p, c2ph, cpan, dprofpp, enc2xs, find2perl, h2ph, h2xs, instmodsh, libnetcfg, perl, perl5.8.8 (ссылка на perl), perlbug, perlcc, perldoc, perlivp, piconv, pl2pm, pod2html, pod2latex, pod2man, pod2text, pod2usage, podchecker, podselect, prove, psed (ссылка на s2p), pstruct (link to c2ph), s2p, splain и xsubpp
Установленные библиотеки: Несколько сотен, которые не могут быть перечислены здесь все

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

a2p

Переводит awk в perl

c2ph

Делает дамп структур C, генерируемых cc -g -S

cpan

Скрипт оболочки, предоставляющий командный интерфейс с CPAN.pm

dprofpp

Отображает данные профиля perl

enc2xs

Собирает расширение Perl для модулей Encode из таблиц символов Unicode или файлов кодировки Tcl

find2perl

Транслирует команды find в Perl

h2ph

Конвертирует файлы заголовков .h C в файлы заголовков .ph для Perl

h2xs

Конвертирует файлы заголовков .h C в расширения Perl

libnetcfg

Используется для настройки libnet

instmodsh

Скрипт для проверки установленных модулей Perl и даже может создавать тарбол из любого установленного модуля

perl

Сочетает достоинства C, sed, awk и sh в одном мощном языке

perl5.8.8

Жёсткая ссылка на 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

prove

Инструмент командной строки для запуска тестов с Test::Harness

psed

Perl-реализация потокового редактора sed

pstruct

Делает дамп C-структур, генерируемых cc -g -S

s2p

Транслирует sed в Perl

splain

Используется для пропуска полных диагностических сообщений Perl

xsubpp

Конвертирует код Perl XS в код на языке C

10.22. Readline-5.1

Пакет Readline содержит библиотеку командной строки, поддерживающую редактирование и возможности истории.

10.22.1. Установка Readline

Следующий патч содержит обновления от разработчиков. Разработчики Readline выпускают эти патчи для исправления серьёзных проблем.

patch -Np1 -i ../readline-5.1-fixes-3.patch

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

./configure --prefix=/usr --libdir=/lib

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

make SHLIB_XLDFLAGS=-lncurses

Описание параметра команды make:

SHLIB_XLDFLAGS=-lncurses

Этот флаг заставляет Readline компоноваться с библиотекой libncurses.

В этом пакете тестов нет.

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

make install

Дадим динамическим библиотекам Readline более подходящие права доступа:

chmod -v 755 /lib/lib{readline,history}.so*

Переместим статические библиотеки в более подходящее место:

mv -v /lib/lib{readline,history}.a /usr/lib

Затем удалим файлы .so в /lib и создадим на них ссылки в /usr/lib.

rm -v /lib/lib{readline,history}.so
ln -svf ../../lib/libreadline.so.5 /usr/lib/libreadline.so
ln -svf ../../lib/libhistory.so.5 /usr/lib/libhistory.so

10.22.2. Описание Readline

Установленные библиотеки: libhistory.[a,so] и libreadline.[a,so]

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

libhistory

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

libreadline

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

10.23. Zlib-1.2.3

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

10.23.1. Установка Zlib

Этот патч добавляет -fPIC в нашу сборку и позволяет нам собирать статическую и разделяемую библиотеки одновременно:

patch -Np1 -i ../zlib-1.2.3-fPIC-1.patch

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

./configure --prefix=/usr --shared

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

make

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

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

make install

Предыдущая команда установила файл .so в /usr/lib. Мы переместим его в /lib, а затем слинкуем его в /usr/lib:

mv -v /usr/lib/libz.so.* /lib
ln -svf ../../lib/libz.so.1 /usr/lib/libz.so

Исправим права доступа у статической библиотеки:

chmod -v 644 /usr/lib/libz.a

10.23.2. Описание Zlib

Установленные библиотеки: libz.[a,so]

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

libz

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

10.24. Autoconf-2.59

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

10.24.1. Установка Autoconf

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

./configure --prefix=/usr

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

make

Для проверки результата выполним: make check. 2 теста, которые используют Automake, пропускаются. Для охвата всего теста Autoconf может быть протестирован после установки Automake.

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

make install

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

10.25. Automake-1.9.6

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

10.25.1. Установка Automake

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

./configure --prefix=/usr

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

make

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

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

make install

10.25.2. Описание Automake

Установленные программы: acinstall, aclocal, aclocal-1.9, automake, automake-1.9, 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

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

automake

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

automake-1.9

Жёсткая ссылка на 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

10.26. Bash-3.1

Bash - это Bourne-Again SHell.

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

Если Вы скачали тарболл документации Bash и хотите установить HTML документацию, то выполните следующие команды:

tar -xvf ../bash-doc-3.1.tar.gz &&
sed -i "s|htmldir = @htmldir@|htmldir = /usr/share/doc/bash-3.1|" \
    Makefile.in

Следующий патч содержит обновления от разработчиков. Разработчик Bash выпускает эти патчи только для устранения серьёзных проблем.

patch -Np1 -i ../bash-3.1-fixes-8.patch

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

./configure --prefix=/usr --bindir=/bin \
    --without-bash-malloc --with-installed-readline

Описание параметра команды configure:

--with-installed-readline

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

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

make

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

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

make install

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

exec /bin/bash --login +h

Замечание

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

10.26.2. Описание Bash

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

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

bash

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

bashbug

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

sh

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

10.27. Bzip2-1.0.3

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

10.27.1. Установка Bzip2

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

patch -Np1 -i ../bzip2-1.0.3-install_docs-1.patch

Команда bzgrep не обрабатывает '|' и '&' в именах файлов, размещённых в ней. Это позволяет произвольным командам быть запущенными с привилегиями пользователя, запустившего bzgrep. Применим следующий патч для устранения этого:

patch -Np1 -i ../bzip2-1.0.3-bzgrep_security-1.patch

Скрипт bzdiff зависит от tempfile. Удалим эту зависимость при помощи следующего патча:

patch -Np1 -i ../bzip2-1.0.3-remove_tempfile-1.patch

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

make -f Makefile-libbz2_so
make clean

Флаг -f означает, что Bzip2 будет собран, используя другой файл Makefile, в данном случае файл Makefile-libbz2_so, который создаёт динамическую библиотеку libbz2.so и связывает Bzip2 с ней.

Перекомпилируем пакет, используя неразделяемую библиотеку, и протестируем его.

make

Замечание

При переустановке Bzip2 сначала выполните rm -vf /usr/bin/bz*, иначе следующая команда make install выпадет.

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

make install

Установим разделяемый bzip2 бинарник в директорию /bin и сделаем некоторые символические ссылки:

cp -v bzip2-shared /bin/bzip2
cp -av libbz2.so* /lib
ln -sv ../../lib/libbz2.so.1.0 /usr/lib/libbz2.so
rm -v /usr/bin/{bunzip2,bzcat,bzip2}
ln -sv bzip2 /bin/bunzip2
ln -sv bzip2 /bin/bzcat

10.27.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.3) и libbz2.so.1.0.3

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

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

10.28. Diffutils-2.8.7

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

10.28.1. Установка Diffutils

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

./configure --prefix=/usr

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

make

В этом пакете тестов нет.

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

make install

10.28.2. Описание Diffutils

Установленные программы: cmp, diff, diff3 и sdiff

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

cmp

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

diff

Сравнивает два файла или директирии и показывает, какие строки в файлах отличаются

diff3

Сравнивает три файла построчно

sdiff

Объединяет два файла и интерактивно выводит результат

10.29. E2fsprogs-1.39

E2fsprogs содержит ряд системных утилит для поддержки файловой системы ext2. Они также поддерживают журналируемую файловую систему ext3.

10.29.1. Установка E2fsprogs

Рекомендуется собирать E2fsprogs вне директории с исходниками:

mkdir -v build
cd build

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

../configure --prefix=/usr --with-root-prefix="" \
    --enable-elf-shlibs --disable-evms

Описание параметров команды configure:

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

10.29.2. Описание E2fsprogs

Установленные программы: badblocks, blkid, chattr, compile_et, debugfs, dumpe2fs, e2fsck, e2image, e2label, filefrag, 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

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

e2fsck

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

e2image

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

e2label

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

filefrag

Сообщает о возможности плохого фрагментирования файла.

findfs

Ищет файловую систему по метке тома или UUID.

fsck

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

fsck.ext2

По умолчанию проверяет файловые системы ext2.

fsck.ext3

По умолчанию проверяет файловые системы ext3.

logsave

Сохраняет вывод команды в лог-файл.

lsattr

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

mk_cmds

Конвертирует таблицу команд и справочных сообщений в исходники на C для использования с библиотекой libss subsystem library

mke2fs

Используется для создания файловой системы ext2 или ext3 на указанном устройстве.

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

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

10.30. File-4.17

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

10.30.1. Установка File

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

./configure --prefix=/usr

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

make

В этом пакете тестов нет.

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

make install

10.30.2. Описание File

Установленные программы: file
Установленная библиотека: libmagic.[a,so]

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

file

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

libmagic

Описывает шаблоны для распознавания чисел, используется программой file

10.31. Findutils-4.2.27

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

10.31.1. Установка Findutils

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

./configure --prefix=/usr --libexecdir=/usr/lib/locate \
    --localstatedir=/var/lib/locate

Описание параметров команды configure:

--localstatedir

Эта опция изменяет положение базы данных locate на /var/lib/locate, которая совместима с FHS.

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

make

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

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

make install

Программа find используется некоторыми скриптами из пакета CLFS-Bootscripts. Так как /usr может не быть доступной на ранних этапах загрузки, бинарник find должен быть на корневом разделе:

mv -v /usr/bin/find /bin

Скрипт updatedb необходимо изменить для указания на новое положение find:

sed -i 's@find:=${BINDIR}@find:=/bin@' /usr/bin/updatedb

10.31.2. Описание Findutils

Установленные программы: bigram, code, find, frcode, locate, updatedb и xargs

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

bigram

Ранее использовался для создания баз данных

code

Ранее использовался для создания баз данных locate; это предок frcode

find

Поиск файлов, удовлетворяющих особым критериям, по дереву директорий

frcode

Вызывается программой updatedb для сжатия списка файлов; компрессия уменьшает размер базы данных в четыре-пять раз

locate

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

updatedb

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

xargs

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

10.32. Gawk-3.1.5

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

10.32.1. Установка Gawk

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

patch -Np1 -i ../gawk-3.1.5-segfault_fix-1.patch

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

./configure --prefix=/usr --libexecdir=/usr/lib

Теперь устраним проблему, приводящую к ошибкам тестов Gettext:

echo '#define HAVE_LC_MESSAGES 1' >> config.h

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

make

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

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

make install

10.32.2. Описание Gawk

Установленные программы: awk (ссылка на gawk), gawk, gawk-3.1.5, grcat, igawk, pgawk, pgawk-3.1.5 и pwcat

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

awk

Ссылка на gawk

gawk

Используется для манипуляций с текстовыми файлами; это GNU реализация awk

gawk-3.1.5

Жёсткая ссылка на gawk

grcat

Распечатывает базу данных групп /etc/group

igawk

Даёт gawk способность включать файлы

pgawk

Профилированная версия gawk

pgawk-3.1.5

Жёсткая ссылка на pgawk

pwcat

Распечатывает базу данных паролей /etc/passwd

10.33. Gettext-0.14.5

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

10.33.1. Установка Gettext

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

./configure --prefix=/usr

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

make

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

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

make install

10.33.2. Описание Gettext

Установленные программы: autopoint, config.charset, config.rpath, envsubst, gettext, gettext.sh, gettextize, hostname, msgattrib, msgcat, msgcmp, msgcomm, msgconv, msgen, msgexec, msgfilter, msgfmt, msggrep, msginit, msgmerge, msgunfmt, msguniq, ngettext и xgettext
Установленные библиотеки: libasprintf.[a,so], libgettextlib.so, libgettextpo.[a,so] и libgettextsrc.so

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

autopoint

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

config.charset

Выводит системо-зависимую таблицу кодов символов.

config.rpath

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

envsubst

Заменяет переменные окружения в строки в формате shell.

gettext

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

gettext.sh

Изначально служит в качестве библиотеки функций оболочки для gettext.

gettextize

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

hostname

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

msgattrib

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

msgcat

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

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. Она не предназначена для общего использования.

10.34. Grep-2.5.1a

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

10.34.1. Установка Grep

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

./configure --prefix=/usr --bindir=/bin

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

make

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

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

make install

10.34.2. Описание Grep

Установленные программы: egrep (ссылка на grep), fgrep (ссылка на grep) и grep

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

egrep

Печатает строки, содержащие искомый расширенный шаблон

fgrep

Печатает строки, содержащие список фиксированных отрывков строк

grep

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

10.35. Groff-1.19.2

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

10.35.1. Установка Groff

Groff использует переменную окружения PAGE для определения размеров бумаги по умолчанию. При использовании в США команда PAGE=letter корректна. Если Вы живёте в другом месте, PAGE=A4 может быть предпочтительнее.

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

PAGE=[paper_size] ./configure --prefix=/usr

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

make

В этом пакете тестов нет.

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

make install

Некоторые программы документации, например xman, не будут работать правильно без следующих ссылок:

ln -sv soelim /usr/bin/zsoelim
ln -sv eqn /usr/bin/geqn
ln -sv tbl /usr/bin/gtbl

10.35.2. Описание Groff

Установленные программы: addftinfo, afmtodit, eqn, eqn2graph, gdiffmk, geqn (ссылка на eqn), grap2graph, grn, grodvi, groff, groffer, grog, grolbp, grolj4, grops, grotty, gtbl (ссылка на tbl), hpftodit, indxbib, lkbib, lookbib, mmroff, neqn, nroff, pdfroff, 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 (выравнивание) в точечное изображение

gdiffmk

Помечает отличия между файлами groff/nroff/troff

geqn

Ссылка на eqn

grap2graph

Преобразует диаграмму grap в растровое изображение

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 и LBP-8)

grolj4

Драйвер для groff который обеспечивает вывод в формате PCL5 для принтера, совместимого с HP Laserjet 4

grops

Переводит вывод GNU troff в PostScript

grotty

Переводит вывод GNU troff в форму, подходящую для символьно-печатающих устройств

gtbl

Ссылка на tbl

hpftodit

Создаёт файл шрифта для использования с groff -Tlj4 из HP-tagged файла метрического шрифта

indxbib

Создаёт инвертированный индекс для библиографических баз данных с специфицированным файлом для использования с refer, lookbib и lkbib

lkbib

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

lookbib

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

mmroff

Простой препроцессор для groff

neqn

Форматирует выравнивание для American Standard Code для Information Interchange (ASCII) вывода

nroff

Скрипт, эмулирующий команду nroff, используя groff

pdfroff

Создаёт pdf документы используя 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

Ссылка на soelim

10.36. Gzip-1.3.5

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

10.36.1. Установка Gzip

Следующий патч устраняет две уязвимости безопасности Gzip.

patch -Np1 -i ../gzip-1.3.5-security_fixes-1.patch

Команда gzexe вызывает tail с опциями, которые не соответствуют новым версиям стандарта POSIX, а поэтому не приняты текущими версиями Coreutils. Исправим эту проблему выполнением следующей команды:

sed -i 's/tail +/tail -n +/' gzexe.in

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

./configure --prefix=/usr

Скрипт gzexe имеет встроенный путь к бинарнику gzip. Поскольку мы позднее изменим положение этого файла, следующая команда позволит встроить новый путь в бинарник:

sed -i 's@"BINDIR"@/bin@g' gzexe.in

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

make

В этом пакете тестов нет.

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

make install

Переместим программу gzip в директорию /bin и создадим некоторые ссылки на них:

mv -v /usr/bin/gzip /bin
rm -v /usr/bin/{gunzip,zcat}
ln -sv gzip /bin/gunzip
ln -sv gzip /bin/zcat
ln -sv gzip /bin/compress
ln -sv gunzip /bin/uncompress

10.36.2. Описание Gzip

Установленные программы: compress (ссылка на gzip), gunzip (ссылка на gzip), gzexe, gzip, uncompress (ссылка на gunzip), zcat (ссылка на gzip), zcmp, zdiff, zegrep, zfgrep, zforce, zgrep, zless, zmore и znew

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

compress

Сжимает и разжимает файлы

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

10.37. Inetutils-1.4.2

Пакет Inetutils содержит сетевые клиенты и серверы.

10.37.1. Установка Inetutils

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

patch -Np1 -i ../inetutils-1.4.2-no_server_man_pages-1.patch

Этот патч исправит проблему сборки с GCC 4.1.1:

patch -Np1 -i ../inetutils-1.4.2-gcc4_fixes-3.patch

Этот патч устраняет проблему, при которой telnet на некоторых машинах будет посылать только на 255.255.255.255. Это привело к изменениям в способе поддержки inet_addr в glibc. Применим следующий патч для исправления этой проблемы:

patch -Np1 -i ../inetutils-1.4.2-inet_addr_fix-1.patch

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

./configure --prefix=/usr --libexecdir=/usr/sbin \
    --sysconfdir=/etc --localstatedir=/var \
    --disable-logger --disable-syslogd \
    --disable-whois --disable-servers

Описание параметров команды configure:

--disable-logger

Этот параметр запрещает inetutils установку программы ведения логов, которая использует скрипты для отправки сообщений System Log Daemon. Мы не устанавливаем его потому, что Util-linux установит потом лучшую версию этой программы.

--disable-syslogd

Этот параметр запрещет inetutils установку System Log Daemon, который мы установим с пакетом Sysklogd.

--disable-whois

Этот параметр отключает сборку клиента whois, который является сильно устаревшим. Инструкции по установке лучшей версии клиента whois Вы найдете в книге BLFS.

--disable-servers

Этот параметр отключит установку ряда сетевых серверов как части пакета Inetutils. Эти серверы не нужны на простой CLFS системе. Некоторые из них являются небезопасными и могут быть запущеными только в доверенной сети. Более полную информацию можно получить на http://www.linuxfromscratch.org/blfs/view/svn/basicnet/inetutils.html. Заметьте, что есть лучшие альтернативы для многих из этих серверов.

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

make

В этом пакете тестов нет.

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

make install

Переместим программу ping в FHS-совместимое место:

mv -v /usr/bin/ping /bin

10.37.2. Описание Inetutils

Установленные программы: ftp, ping, rcp, rlogin, rsh, talk, telnet и tftp

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

ftp

Программа для передачи данных через сеть

ping

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

rcp

Обеспечивает удалённое копирование файлов

rlogin

Обеспечивает удалённый вход в систему

rsh

Запускает удалённый шелл

talk

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

telnet

Интерфейс для протокола TELNET

tftp

Простая программа передачи файлов

10.38. Kbd-1.12

Пакет Kbd содержит файлы раскладок клавиатуры и утилиты для них.

10.38.1. Установка Kbd

Следующий патч устраняет проблему сборки с GCC 4.1.1:

patch -Np1 -i ../kbd-1.12-gcc4_fixes-1.patch

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

./configure --datadir=/lib/kbd

Описание параметров команды configure:

--datadir

Эта опция размещает данные Kbd и файлы раскладок клавиатуры в /lib/kbd так как они используются некоторыми скриптами из пакета CLFS-Bootscripts и должны находиться на корневом разделе.

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

make

В этом пакете тестов нет.

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

make install

Некоторые программы из Kbd используются скриптами из пакета CLFS-Bootscripts. Так как директория /usr может быть недоступна на ранних этапах загрузки, то эти бинарники должны быть на корневом разделе:

mv -v /usr/bin/{kbd_mode,openvt,setfont} /bin

10.38.2. Описание Kbd

Установленные программы: chvt, deallocvt, dumpkeys, fgconsole, getkeycodes, kbd_mode, kbdrate, loadkeys, loadunimap, mapscrn, openvt, psfaddtable (ссылка на psfxtable), psfgettable (ссылка на psfxtable), psfstriptable (ссылка на psfxtable), psfxtable, resizecons, setfont, setkeycodes, setleds, setmetamode, showconsolefont, showkey, unicode_start и unicode_stop

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

chvt

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

deallocvt

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

dumpkeys

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

fgconsole

Печатает номер активного виртуального терминала

getkeycodes

Печатает таблицу перевода скэнкодов в коды клавиш ядра

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 (светодиоды)

setmetamode

Определяет режим клавиши meta

showconsolefont

Отображает текущий EGA/VGA экранный шрифт консоли

showkey

Возвращает скэнкоды и коды клавиш, а также ASCII-коды нажатых на клавиатуре клавиш

unicode_start

Включает на консоли и клавиатуре режим unicode. Никогда не используйте это в CLFS, так как приложения не сконфигурированы с поддержкой UNICODE

unicode_stop

Возвращает консоль и клавиатуру из режима unicode

10.39. Less-394

Less является просмотрщиком текстовых файлов.

10.39.1. Установка Less

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

./configure --prefix=/usr --sysconfdir=/etc

Описание параметра команды configure:

--sysconfdir=/etc

Этот параметр укажет, что надо создавать программы с файлами конфигурации в /etc.

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

make

В этом пакете тестов нет.

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

make install

Перемещаем less в /bin:

mv -v /usr/bin/less /bin

10.39.2. Описание Less

Установленные программы: less, lessecho и lesskey

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

less

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

lessecho

Нужен для расширенных метасимволов, таких как * и ? в именах файлов на системах Unix

lesskey

Используется для определения управляющих клавиш less

10.40. Make-3.81

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

10.40.1. Установка Make

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

./configure --prefix=/usr

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

make

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

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

make install

10.40.2. Описание Make

Установленная программа: make

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

make

Автоматически определяет, какие части программы нуждаются в перекомпилировании и отдаёт команду на их компиляцию

10.41. Man-1.6d

Man является просмотрщиком man-страниц.

10.41.1. Установка Man

Необходимо сделать некоторые дополнения к исходникам Man.

Первая sed замена необходима для добавления ключа -R в переменную PAGER для правильной поддержки esc-последовательностей в Less:

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

Описание параметров команды configure:

-confdir=/etc

Программа man будет искать файл конфигурации man.conf в директории /etc.

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

make

В этом пакете тестов нет.

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

make install

Замечание

Если Вы будете работать на терминале, который не поддерживает атрибуты текста, например цвет или выделение, то Вы можете отключить Select Graphic Rendition (SGR) escape-последовательности, отредактировав файл man.conf и добавив параметр -c к переменной NROFF. Если Вы используете разные типы терминалов на одном компьютере, то лучше будет выборочно добавлять переменную окружения GROFF_NO_SGR для терминалов, которые не поддерживают SGR.

Если используется 8-битная кодировка символов, то ищите строку, которая начинается с “NROFF” в /etc/man.conf, и проверьте, что она выглядит как следующая строка:

NROFF /usr/bin/nroff -Tlatin1 -mandoc

Заметьте, что “latin1” необходимо использовать даже если это не используется в кодировке установленной локали. Смысл в том, что согласно спецификации groff не имеет обозначений типа символов, установленных вне Интернациональной Организации по Стандартам (ISO) 8859-1, без некоторых неизвестных escape-кодов. Когда ман-страница форматирована, то groff думает, что она в кодировке ISO 8859-1 и этот ключ - -Tlatin1 - говорит groff использовать для вывода ту же самую кодировку. Посе этого groff не перекодирует входные символы и форматированный результат на выходе будет в той же кодировке, что и на входе, и это также можно использовать как вход для пейджера.

Это не решает проблему с неработающей программой man2dvi для локализованных man-страниц в не-ISO 8859-1 локалях. Также это не работает с мультибайтными символами. Первая проблема пока не имеет решеня. Вторая проблема не интересна, так как инсталяция СLFS не поддерживает мультибайтные символы.

Дополнительная информация с описанием сжатия страниц man и info может быть найдена в книге BLFS в http://www.linuxfromscratch.org/blfs/view/svn/postlfs/compressdoc.html.

10.41.2. Описание Man

Установленные программы: apropos, makewhatis, man, man2dvi, man2html и whatis

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

apropos

Ищет в базе данных whatis и отображает краткое описание системной команды, которое содержит указанную строку

makewhatis

Создаёт базу данных whatis. Он рассматривает все страницы документации man в соответствующих путях и добавляет запись команды и её краткого описания в базу данных whatis

man

Форматирует и отображает запрошенную man-страницу

man2dvi

Конвертирует man-страницу в формат dvi

man2html

Конвертирует man-страницу в HTML

whatis

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

10.42. Mktemp-1.5

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

10.42.1. Установка Mktemp

Многие скрипты всё ещё используют программу tempfile, которая функционально похожа на mktemp. Пропатчим Mktemp для включения оболочки tempfile:

patch -Np1 -i ../mktemp-1.5-add_tempfile-3.patch

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

./configure --prefix=/usr --with-libc

Описание параметра команды configure:

--with-libc

Это говорит программе mktemp использовать системные функции библиотеки С mkstemp и mkdtemp.

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

make

В этом пакете тестов нет.

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

make install
make install-tempfile

10.42.2. Описание Mktemp

Установленные программы: mktemp и tempfile

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

mktemp

Создаёт временные файлы в безопасном режиме; используется в скриптах

tempfile

Создаёт временные файлы в менее безопасном режиме, чем mktemp; устанавливается для обратной совместимости

10.43. Module-Init-Tools-3.2.2

Пакет Module-Init-Tools содержит программы для поддержки модулей ядра в ядрах Linux с версией 2.5.47 или выше.

10.43.1. Установка Module-Init-Tools

Выполните следующие команды для выполнения тестов (заметьте, что команда make distclean необходима для очистки дерева исходников):

./configure &&
make check &&
make distclean

Подготавливаем Module-Init-Tools к компиляции:

./configure --prefix=/ --enable-zlib

Описание параметров команды configure:

--enable-zlib

Это позволяет пакету Module-Init-Tools поддерживать сжатые модули ядра.

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

make

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

make INSTALL=install install

Описание параметра команды make:

INSTALL=install

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

10.43.2. Описание Module-Init-Tools

Установленные программы: depmod, generate-modprobe.conf, insmod, insmod.static, lsmod (ссылка на insmod), modinfo, modprobe (ссылка на insmod) и rmmod (ссылка на insmod)

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

depmod

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

generate-modprobe.conf

Создаёт файл modprobe.conf из существующих настроек модулей 2.2 или 2.4

insmod

Устанавливает загружаемый модуль в загружаемое ядро

insmod.static

Статически скомпилированная версия insmod

lsmod

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

modinfo

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

modprobe

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

rmmod

Выгружает загружаемый модуль из загруженного ядра

10.44. Patch-2.5.9

Пакет Patch содержит программу для модификации или создания файлов применением “patch-файла”, обычно созданного программой diff.

10.44.1. Установка Patch

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

./configure --prefix=/usr

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

make

В этом пакете тестов нет.

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

make install

10.44.2. Описание Patch

Установленная программа: patch

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

patch

Модифицирует файл в соответствии с файлом патча. Патч обычно является списком, созданным программой diff. Применив эти отличия к оригинальным файлам, patch создаёт обновлённые версии программ.

10.45. Psmisc-22.2

Пакет Psmisc содержит программы для отображения информации о процессах.

10.45.1. Установка Psmisc

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

./configure --prefix=/usr --exec-prefix=""

Описание параметра команды configure:

--exec-prefix=""

Это необходимо для установки бинарников в /bin</