Детальная информация о пакете находится в Разделе 10.5.2, “Описание Linux-Headers.”
Copyright © 2005–2006 Jim Gifford & Ryan Oliver
Основан на LFS, Copyright © 1999–2006 Gerard Beekmans
Copyright (c) 2005, Jim Gifford & Ryan Oliver
Все права защищены.
Повторное распространение, использование бинарного и исходного кода, с изменениями или без оных, разрешено при условии соблюдения следующих положений:
Повторное распространение в любой форме должно содержать вышестоящее уведомление об авторском праве, данные положения и нижеприведённый отказ от прав
Ни название проекта “Linux From Scratch”, ни имена его участников не могут быть использованы для подписи и рекламирования продуктов, произошедших из данного материала без специального письменного разрешения
Все материалы, произошедшие из Linux From Scratch должны сохранять ссылку на проект “Linux From Scratch”
ЭТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПОСТАВЛЯЕТСЯ ВЛАДЕЛЬЦАМИ АВТОРСКИХ ПРАВ И УЧАСТНИКАМИ “КАК ЕСТЬ” И ЛЮБЫЕ ЯВНЫЕ ИЛИ НЕЯВНЫЕ ГАРАНТИИ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ НЕЯВНЫМИ ГАРАНТИЯМИ, КОММЕРЧЕСКОЙ ЦЕННОСТИ И ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ ОТРИЦАЮТСЯ. НИ В КОЕМ СЛУЧАЕ РЕГЕНТЫ ИЛИ УЧАСТНИКИ НЕ ДОЛЖНЫ БЫТЬ ОТВЕТСТВЕННЫМИ ЗА ЛЮБОЙ ПРЯМОЙ, КОСВЕННЫЙ, СЛУЧАЙНЫЙ, СПЕЦИАЛЬНЫЙ, ОБРАЗЦОВЫЙ ИЛИ ПОСЛЕДУЮЩИЙ УЩЕРБЫ (ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ПОСТАВКОЙ ТОВАРОВ ЗАМЕНЫ ИЛИ УСЛУГ; ПОТЕРЮ ДАННЫХ ИЛИ ИХ НЕПРАВИЛЬНУЮ ПЕРЕДАЧУ ИЛИ ПОТЕРИ; ПРИОСТАНОВЛЕНИЕ БИЗНЕСА), И ТЕМ НЕ МЕНЕЕ ВЫЗВАННЫЕ И В ЛЮБОЙ ТЕОРИИ ОТВЕТСТВЕННОСТИ, НЕЗАВИСИМО ОТ КОНТРАКТНОЙ, СТРОГОЙ ОТВЕТСТВЕННОСТИ, ИЛИ ПРАВОНАРУШЕНИИ (ВКЛЮЧАЯ ХАЛАТНОСТЬ ИЛИ ИНЫМ СПОСОБОМ), ВОЗНИКШЕМ ЛЮБЫМ ПУТЕМ ПРИ ИСПОЛЬЗОВАНИИ ЭТОГО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, ДАЖЕ ЕСЛИ БЫ БЫЛО СООБЩЕНО О ВОЗМОЖНОСТИ ТАКОГО УЩЕРБА.
Проект 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
Существует ряд причин, по которым эта книга может представлять интерес. Главная причина - установка 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 Вы поймёте, что вся сила - в информации и знаниях.
Сборка 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, должен понимать многие темы из перечисленных в этом документе.
Вы должны быть способны собрать 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
Для облегчения понимания книги ознакомьтесь с некоторыми соглашениями, которые будут в ней использованы. Этот раздел содержит примеры печатного форматирования.
./configure --prefix=/usr
Текст такого формата предназначен для набора в командной строке в точности как на экране помимо случаев, когда даны другие указания. Также он используется в пояснительных разделах для пояснения команды, о которой идет речь.
install-info: unknown option '--dir-file=/mnt/clfs/usr/info/dir'
Текст такого формата (моноширинный) показывает вывод на экран, как результат выполнения какой-либо команды. Также он используется для указания имени файла, например /etc/ld.so.conf.
Выделение
Текст такого формата имеет несколько назначений в книге. В основном он используется для подчёркивания наиболее важных моментов и для примеров.
Текст такого формата используется для ссылок как внутри книги, так и на внешние ресурсы - руководства, сайты, места для скачивания.
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] обычно достаточен.
Эта книга разделена на следующие части.
Часть I содержит некоторые важные сведения о процессе инсталляции и некоторую дополнительную информацию о книге.
Часть II описывает приготовления к процессу сборки: создание раздела, скачивание пакетов и компилирование временных инструментов.
Часть III рассказывает, как создать инструменты для кросс-компилирования. Эти инструменты могут быть запущены на Вашей основной системе но позволяют собрать пакеты, которые будут запускаться на целевой системе.
Часть IV рассказывает, как создать инструменты, предназначенные для работы на целевой системе. Это инструменты, которые позволят создать рабочую систему на Вашей целевой системе.
Часть V проводит читателя через сборку CLFS системы — компилирование и установку всех пакетов один за другим, установку загрузочных скриптов и установку ядра. Полученная Linux система является основой, на которой могут быть установлены другие программы для расширения системы по необходимости. В конце книги есть простой в использовании список всех программ, библиотек и важных файлов, которые были установлены.
Приложения содержат информацию, которая обычно не помещается в другие места книги. Приложение A содержит описания сокращений и определений, используемых в книге; Приложение B содержит благодарности людям, которые помогли в работе над проектом CLFS и сайтом; Приложения C и D содержат информацию о зависимостях пакетов и порядке сборки. Некоторые архитектуры могут содержать дополнительные приложения для архитектурно-специфичных задач.
Программы, используемые для создания CLFS системы, постоянно обновляются и расширяются. Предупреждения безопасности и исправления ошибок могут стать доступными после того, как книга CLFS будет выпущена. Некоторые системы также могут иметь проблемы сборки CLFS. Чтобы проверить, требуется ли обновить версии пакетов или инструкции в этом релизе CLFS, устранить уязвимости безопасности, провести другие исправления ошибок или аппаратно-специфичных проблем, пожалуйста обратитесь на http://trac.cross-lfs.org/clfs/errata/1.0.0/ перед продолжением сборки. Вы должны отметить любые показанные изменения и применить их в соответствующих разделах книги для продвижения в сборке CLFS системы.
Редакторы книги хотели бы подлагодарить людей, которые помогли сделать книгу такой, какая она теперь.
Наши лидеры:
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.
Спасибо Вам всем за Вашу поддержку.
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.22, “Что дальше”
Для завершения установки устанавливаются CLFS-Bootscripts и ядро в главе Setting Up System Bootscripts, а загрузчик устанавливается в главе Обеспечение загрузки СLFS системы. Глава Конец содержит информацию по дальнейшему изучению CLFS после этой книги. После выполнения инструкций этой книги компьютер будет готов к перезагрузке в новую CLFS систему.
Это процесс в нескольких словах. Детальная информация по каждому шагу обсуждается в следующих разделах и описаниях пакетов. Пункты, которые могут казаться комплексными, будут разделены и всё будет разложено по местам, так как читатель начинает CLFS приключение.
Для RaQ2 мы рекомендуем следующее:
RaQ2 использует разделы в стиле DOS, поэтому собираем на x86 и помещаем жёсткий диск RaQ2 в эту систему.
Следуйте по направлению использования раздела перезагрузки.
Удалите жёсткий диск, установите его в RaQ2 и продолжайте сборку.
На других MIPS основанных системах Вам понадобится собирать самим, так как большинство других MIPS машин используют SGI стиль разделов.
Это версия 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 Пакеты 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 описание 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
Ниже приведён список изменений, специфичный для этой архитектуры, сделанный после предыдущего релиза книги. Общие изменения смотрите в разделе Основной список изменений,
Содержание изменений:
September 16, 2006
[jim] - Updated Linux 2.6.17.13 patches to -2.
July 22, 2006
[jim] - Added a patch for Colo to fix a relocation error with the use of the newer binutils.
[jim] - Updated GLIBC 2.4 MIPS patch to fix missing symbols and fixes due to the Kernel ABI change in 2.6.12.
July 8, 2006
[jim] - Updated MIPS Patches linux-2.6.17.4-mips-1.patch is the merge of Linux MIPS and Kernel.org GIT trees. Linux 2.6.17.4-mips_fixes-1.patch are updates not approved by Linux MIPS for addition, but are required for a working system.
April 14, 2006
[jim] - Fixed MIPS Glibc Ports patch. Added the mv statement to move glibc-ports-(version) to ports.
[jim] - Added glibc-ports to packages list.
April 10, 2006
[jeremy] - corrected target triple values.
[jeremy] - corrected extra includes in gcc-final.xml
April 6, 2006
[jim] - Remove make config update patch. No longer required.
March 20, 2006
[jim] - Updated Linux patch to 2.6.16.
February 19, 2006
[jim] - Updated to ARCLoad 0.5.
February 2, 2006
[jim] - Updated to Colo 1.21.
January 5, 2006
[jim] - Added patch to fix Glibc. See http://sources.redhat.com/bugzilla/show_bug.cgi?id=1458.
December 26, 2005
[jim] - Added config update patch to Expect.
November 23, 2005
[jim] - Removed uneeded programs from Colo.
[jim] - Colo will now build under 64-Bit. Thanx Joe Ciccone.
November 20, 2005
[jim] - Removed mips procps patch.
[jim] - Added dvhtool 1.01.By Joe Ciccone.
[jim] - Added arcload 0.43.By Joe Ciccone.
November 11, 2005
[manuel] - Added the Module-Init-Tools patch in boot chapter. This fix r6941.
October 31, 2005
[jim] - Now an official project. Resetting all Changelogs.
Если на протяжении сборки CLFS системы Вы получите некоторые ошибки, вызывающие вопросы, или подумаете, что в книге есть опечатки, пожалуйста, начните с консультации в Часто Задаваемых Вопросах (FAQ), которые размещены на http://trac.cross-lfs.org/wiki/faq.
Сервер 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.
Cross-LFS не поддерживает собственный сервер новостей, но мы предоставляем доступ через gmane.org http://gmane.org. Если Вы хотите подписаться на Cross-LFS, используйте gmane.org. Вы можете найти поиск игр для CLFS по следующей ссылке:
Множество членов сообщества СLFS используют IRC сервер сообщества. Перед тем, как использовать этот вид поддержки, проверьте СLFS FAQ и архивы списков рассылки. Возможно, на Ваш вопрос уже есть ответ. Вы сможете найти наш IRC сервер на chat.freenode.net. Канал поддержки для cross-lfs называется #cross-lfs. Если Вам необходимо показать людям вывод Вашей проблемы, используйте http://pastebin.linuxfromscratch.org и ссылку pastebin URL когда задаёте вопросы.
Проект LFS имеет ряд зеркал в сети. Список текущих зеркал можно увидеть на http://trac.cross-lfs.org/wiki/mirrors.
Если проблема или вопрос неожиданно возникает во время работы с книгой, проверьте страницу FAQ на http://trac.cross-lfs.org/wiki/faq#generalfaq. Здесь часто уже есть ответы на возникшие вопросы. Если Вы не нашли здесь ответ на свой вопрос, попробуйте найти источник проблемы. Следующие подсказки дадут Вам некоторое направление для решения проблемы: http://www.linuxfromscratch.org/hints/downloads/files/errors.txt.
У нас также есть отличное сообщество СLFS, которое готово предложить помощь через IRC и списки рассылки (смотри в Разделе 1.6, “Ресурсы” этой книги). Хотя мы каждый день отвечаем на несколько вопросов, на многие из них ответ может быть легко найден в FAQ и поиском по спискам рассылки. Поэтому, чтобы мы предоставили лучшую возможную помощь, Вам самим сначала необходимо сделать некоторые изыскания. Это позволит нам сфокусироваться на более необычных потребностях поддержки. Если Ваши поиски не приведут к результатам, пожалуйста, включайте всю доступную информацию (упомянутую ниже) в задаваемый вопрос.
Помимо краткого сообщения об ошибке, не забудьте привести следующую информацию:
Версия используемой книги (в данном случае 1.0.0)
Основной дистрибутив и его версию, используемый для сборки СLFS
Какие архитектуры у хоста и целевой системы
Значения переменных окружения ${CLFS_HOST}, ${CLFS_TARGET}, ${BUILD32} и ${BUILD64}
Пакет или раздел, с которыми у Вас возникли проблемы
Сообщение об ошибке или симптомы проблемы. Смотрите пример ниже в Разделе 1.7.3, “Проблемы компилирования”
Отклонялись ли Вы от шагов, описаных в книге
Отклонение от этой книги не означает, что мы Вам не поможем. В конце концов, LFS - это только выбор. Существование предупреждений о любых изменениях в установленной процедуре помогает нам оценивать и предупреждать возможные причины Ваших проблем.
Если что-то пошло не так при выполнении скрипта configure, то посмотрите в файле config.log. Этот файл содержит ошибки, которые не были выведены на экран. Включите информацию из этого файла в просьбу о помощи.
Для того, чтобы помочь нам найти причину проблемы важен как вывод на экране, так и содержание некоторых файлов. Вывод на экране скрипта 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. Прочтите эту статью и примите к сведению при задавании вопросов, тогда Ваши шансы получить полный и квалифицированный ответ значительно возрастут.
В этой главе подготавливается раздел, который будет хостом CLFS системы. Мы сами создадим раздел, создадим в нём файловую систему и примонтируем её.
Как и большинство операционных систем, 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.
На Cobalt RaQ2/Cube2 мы используем существующую прошивку в качестве загрузчика, который требует для загрузки ext2 revision 0 раздел. Поэтому здесь приведены рекомендованные разделы для системы Cobalt RaQ2/Cube2:
Первый раздел должен быть 50-100 MБ.
Второй раздел должен быть всем оставшимся местом минус количество RAM в системе.
Третий раздел должен быть Вашим разделом подкачки и иметь размер, равный размеру RAM в системе.
Теперь у нас есть пустой раздел и нам надо создать на нём файловую систему. Наиболее используемой системой в 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 раздела.
Команды ниже специфичны для систем Cobalt MIPS, которые имеют особые требования в наличии ext2 Revision 0 для загрузочного раздела. Чтобы удовлетворить эти требования выполним следующие команды:
mke2fs -r 0 /dev/hda1
mke2fs /dev/hda2
mkswap /dev/hda3
Теперь, когда мы создали в разделе файловую систему, нам надо получить к ней доступ. Для этого нам необходимо выбрать точку монтирования и примонтировать этот раздел в неё. В этой книге подразумевается, что файловая система монтирована в /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 установлены, Вам надо будет перемонтировать раздел снова.
Теперь у нас есть место для работы и мы готовы к закачке пакетов.
Эта глава включает список пакетов, которые Вам надо будет скачать для сборки простейшей 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
Скачайте или получите другим способом следующие пакеты:
Домашняя страница: http://www.gnu.org/software/autoconf/
Адрес для скачивания: http://ftp.gnu.org/gnu/autoconf/autoconf-2.59.tar.bz2
Контрольная сумма: 1ee40f7a676b3cfdc0e3f7cd81551b5f
Домашняя страница: http://www.gnu.org/software/automake/
Адрес для скачивания: http://ftp.gnu.org/gnu/automake/automake-1.9.6.tar.bz2
Контрольная сумма: c11b8100bb311492d8220378fd8bf9e0
Домашняя страница: http://www.gnu.org/software/bash/
Адрес для скачивания: http://ftp.gnu.org/gnu/bash/bash-3.1.tar.gz
Контрольная сумма: ef5304c4b22aaa5088972c792ed45d72
Адрес для скачивания: http://ftp.gnu.org/gnu/bash/bash-doc-3.1.tar.gz
Контрольная сумма: a8c517c6a7b21b8b855190399c5935ae
Домашняя страница: http://sources.redhat.com/binutils/
Адрес для скачивания: http://ftp.gnu.org/gnu/binutils/binutils-2.17.tar.bz2
Контрольная сумма: e26e2e06b6e4bf3acf1dc8688a94c0d1
Домашняя страница: http://www.gnu.org/software/bison/
Адрес для скачивания: http://ftp.gnu.org/gnu/bison/bison-2.3.tar.bz2
Контрольная сумма: c18640c6ec31a169d351e3117ecce3ec
Домашняя страница: http://www.bzip.org/
Адрес для скачивания: http://www.bzip.org/1.0.3/bzip2-1.0.3.tar.gz
Контрольная сумма: 8a716bebecb6e647d2e8a29ea5d8447f
Адрес для скачивания: http://cross-lfs.org/files/packages/1.0.0/bootscripts-cross-lfs-1.0.tar.bz2
Контрольная сумма: 79bff3247411589d7de51fdaea9578bd
Домашняя страница: http://www.gnu.org/software/coreutils/
Адрес для скачивания: http://ftp.gnu.org/gnu/coreutils/coreutils-5.96.tar.bz2
Контрольная сумма: bf55d069d82128fd754a090ce8b5acff
Домашняя страница: http://www.gnu.org/software/dejagnu/
Адрес для скачивания: http://ftp.gnu.org/gnu/dejagnu/dejagnu-1.4.4.tar.gz
Контрольная сумма: 053f18fd5d00873de365413cab17a666
Домашняя страница: http://www.gnu.org/software/diffutils/
Адрес для скачивания: ftp://alpha.gnu.org/gnu/diffutils/diffutils-2.8.7.tar.gz
Контрольная сумма: 18d6587cb915e7aa110a5d463d6ed156
Домашняя страница: http://e2fsprogs.sourceforge.net/
Адрес для скачивания: http://prdownloads.sourceforge.net/e2fsprogs/e2fsprogs-1.39.tar.gz?download
Контрольная сумма: 06f7806782e357797fad1d34b7ced0c6
Домашняя страница: http://expect.nist.gov
Адрес для скачивания: http://expect.nist.gov/src/expect-5.43.0.tar.gz
Контрольная сумма: 43e1dc0e0bc9492cf2e1a6f59f276bc3
Адрес для скачивания: 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/.
Домашняя страница: http://www.gnu.org/software/findutils/
Адрес для скачивания: http://ftp.gnu.org/gnu/findutils/findutils-4.2.27.tar.gz
Контрольная сумма: f1e0ddf09f28f8102ff3b90f3b5bc920
Домашняя страница: http://flex.sourceforge.net
Адрес для скачивания: http://prdownloads.sourceforge.net/flex/flex-2.5.33.tar.bz2?download
Контрольная сумма: 343374a00b38d9e39d1158b71af37150
Домашняя страница: http://www.gnu.org/software/gawk/
Адрес для скачивания: http://ftp.gnu.org/gnu/gawk/gawk-3.1.5.tar.bz2
Контрольная сумма: 5703f72d0eea1d463f735aad8222655f
Домашняя страница: http://gcc.gnu.org/
Адрес для скачивания: http://ftp.gnu.org/gnu/gcc/gcc-4.1.1/gcc-4.1.1.tar.bz2
Контрольная сумма: ad9f97a4d04982ccf4fd67cb464879f3
Домашняя страница: http://www.gnu.org/software/gettext/
Адрес для скачивания: http://ftp.gnu.org/gnu/gettext/gettext-0.14.5.tar.gz
Контрольная сумма: e2f6581626a22a0de66dce1d81d00de3
Домашняя страница: http://www.gnu.org/software/libc/
Адрес для скачивания: http://ftp.gnu.org/gnu/glibc/glibc-2.4.tar.bz2
Контрольная сумма: 7e9a88dcd41fbc53801dbe5bdacaf245
Домашняя страница: http://www.gnu.org/software/grep/
Адрес для скачивания: http://ftp.gnu.org/gnu/grep/grep-2.5.1a.tar.bz2
Контрольная сумма: 52202fe462770fa6be1bb667bd6cf30c
Домашняя страница: http://www.gnu.org/software/groff/
Адрес для скачивания: http://ftp.gnu.org/gnu/groff/groff-1.19.2.tar.gz
Контрольная сумма: f7c9cf2e4b9967d3af167d7c9fadaae4
Домашняя страница: http://www.gzip.org/
Адрес для скачивания: ftp://alpha.gnu.org/gnu/gzip/gzip-1.3.5.tar.gz
Контрольная сумма: 3d6c191dfd2bf307014b421c12dc8469
Домашняя страница: http://www.sethwklein.net/projects/iana-etc/
Адрес для скачивания: http://www.sethwklein.net/projects/iana-etc/downloads/iana-etc-2.10.tar.bz2
Контрольная сумма: 53dea53262b281322143c744ca60ffbb
Домашняя страница: http://www.gnu.org/software/inetutils/
Адрес для скачивания: http://ftp.gnu.org/gnu/inetutils/inetutils-1.4.2.tar.gz
Контрольная сумма: df0909a586ddac2b7a0d62795eea4206
Домашняя страница: http://linux-net.osdl.org/index.php/Iproute2
Адрес для скачивания: http://developer.osdl.org/dev/iproute2/download/iproute2-2.6.16-060323.tar.gz
Контрольная сумма: f31d4516b35bbfeaa72c762f5959e97c
Адрес для скачивания: http://www.kernel.org/pub/linux/utils/kbd/kbd-1.12.tar.bz2
Контрольная сумма: 069d1175b4891343b107a8ac2b4a39f6
Домашняя страница: http://www.greenwoodsoftware.com/less/
Адрес для скачивания: http://www.greenwoodsoftware.com/less/less-394.tar.gz
Контрольная сумма: a9f072ccefa0d315b325f3e9cdbd4b97
Домашняя страница: http://www.gnu.org/software/libtool/
Адрес для скачивания: http://ftp.gnu.org/gnu/libtool/libtool-1.5.22.tar.gz
Контрольная сумма: 8e0ac9797b62ba4dcc8a2fb7936412b0
Домашняя страница: http://www.kernel.org/
Адрес для скачивания: http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.17.13.tar.bz2
Контрольная сумма: 834885b3ad9988b966570bee92459572
Домашняя страница: http://headers.cross-lfs.org/
Адрес для скачивания: http://cross-lfs.org/files/packages/1.0.0/linux-headers-2.6.17.13-09092006.tar.bz2
Контрольная сумма: bfda0e9440dd76e6e35fdce79c9b0bf6
Домашняя страница: http://www.gnu.org/software/m4/
Адрес для скачивания: http://ftp.gnu.org/gnu/m4/m4-1.4.4.tar.bz2
Контрольная сумма: eb93bfbcb12cf00165583302bb31a822
Домашняя страница: http://www.gnu.org/software/make/
Адрес для скачивания: http://ftp.gnu.org/gnu/make/make-3.81.tar.bz2
Контрольная сумма: 354853e0b2da90c527e35aabb8d6f1e6
Домашняя страница: http://primates.ximian.com/~flucifredi/man/
Адрес для скачивания: http://primates.ximian.com/~flucifredi/man/man-1.6d.tar.gz
Контрольная сумма: 36d3f65bcc10f0754a3234e00d92ad6d
Адрес для скачивания: http://www.kernel.org/pub/linux/docs/manpages/man-pages-2.33.tar.bz2
Контрольная сумма: e9f61ec73b5390c582530da173c12b10
Домашняя страница: http://www.mktemp.org/
Адрес для скачивания: ftp://ftp.mktemp.org/pub/mktemp/mktemp-1.5.tar.gz
Контрольная сумма: 9a35c59502a228c6ce2be025fc6e3ff2
Адрес для скачивания: http://www.kerneltools.org/pub/downloads/module-init-tools/module-init-tools-3.2.2.tar.bz2
Контрольная сумма: a1ad0a09d3231673f70d631f3f5040e9
Домашняя страница: http://dickey.his.com/ncurses/
Адрес для скачивания: ftp://invisible-island.net/ncurses/ncurses-5.5.tar.gz
Контрольная сумма: e73c1ac10b4bfc46db43b2ddfd6244ef
Домашняя страница: http://www.gnu.org/software/patch/
Адрес для скачивания: ftp://alpha.gnu.org/gnu/diffutils/patch-2.5.9.tar.gz
Контрольная сумма: dacfb618082f8d3a2194601193cf8716
Домашняя страница: http://www.perl.com/
Адрес для скачивания: http://ftp.funet.fi/pub/CPAN/src/perl-5.8.8.tar.bz2
Контрольная сумма: a377c0c67ab43fd96eeec29ce19e8382
Домашняя страница: http://procps.sourceforge.net/
Адрес для скачивания: http://procps.sourceforge.net/procps-3.2.6.tar.gz
Контрольная сумма: 7ce39ea27d7b3da0e8ad74dd41d06783
Домашняя страница: http://psmisc.sourceforge.net/
Адрес для скачивания: http://prdownloads.sourceforge.net/psmisc/psmisc-22.2.tar.gz?download
Контрольная сумма: 77737c817a40ef2c160a7194b5b64337
Домашняя страница: http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html
Адрес для скачивания: http://ftp.gnu.org/gnu/readline/readline-5.1.tar.gz
Контрольная сумма: 7ee5a692db88b30ca48927a13fd60e46
Домашняя страница: http://www.gnu.org/software/sed/
Адрес для скачивания: http://ftp.gnu.org/gnu/sed/sed-4.1.5.tar.gz
Контрольная сумма: 7a1cbbbb3341287308e140bd4834c3ba
Адрес для скачивания: 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/.
Домашняя страница: http://www.infodrom.org/projects/sysklogd/
Адрес для скачивания: http://www.infodrom.org/projects/sysklogd/download/sysklogd-1.4.1.tar.gz
Контрольная сумма: d214aa40beabf7bdb0c9b3c64432c774
Адрес для скачивания: ftp://ftp.cistron.nl/pub/people/miquels/sysvinit/sysvinit-2.86.tar.gz
Контрольная сумма: 7d5d61c026122ab791ac04c8a84db967
Домашняя страница: http://www.gnu.org/software/tar/
Адрес для скачивания: http://ftp.gnu.org/gnu/tar/tar-1.15.1.tar.bz2
Контрольная сумма: 57da3c38f8e06589699548a34d5a5d07
Домашняя страница: http://tcl.sourceforge.net/
Адрес для скачивания: http://prdownloads.sourceforge.net/tcl/tcl8.4.12-src.tar.gz?download
Контрольная сумма: 7480432d8730263f267952788eb4839b
Домашняя страница: http://www.gnu.org/software/texinfo/
Адрес для скачивания: http://ftp.gnu.org/gnu/texinfo/texinfo-4.8.tar.bz2
Контрольная сумма: 6ba369bbfe4afaa56122e65b3ee3a68c
Адрес для скачивания: ftp://mama.indstate.edu/linux/tree/tree-1.5.0.tgz
Контрольная сумма: e0d090c564e7ea5afa16bac80620c7e0
Домашняя страница: 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
Адрес для скачивания: http://cross-lfs.org/files/packages/1.0.0/udev-cross-lfs-1.0-3.tar.bz2
Контрольная сумма: 0c9b9e24a37b9501bcd4889da71cf313
Адрес для скачивания: http://www.kernel.org/pub/linux/utils/util-linux/util-linux-2.12r.tar.bz2
Контрольная сумма: af9d9e03038481fbf79ea3ac33f116f9
Домашняя страница: http://www.vim.org
Адрес для скачивания: ftp://ftp.vim.org/pub/vim/unix/vim-7.0.tar.bz2
Контрольная сумма: 4ca69757678272f718b1041c810d82d8
Адрес для скачивания: ftp://ftp.vim.org/pub/vim/extra/vim-7.0-lang.tar.gz
Контрольная сумма: 6d43efaff570b5c86e76b833ea0c6a04
Домашняя страница: http://www.zlib.net/
Адрес для скачивания: http://www.zlib.net/zlib-1.2.3.tar.gz
Контрольная сумма: debc62758716a169df9f62e6ab2bc634
Общий объём этих пакетов: около 180 МБ
Домашняя страница: http://www.linux-mips.org/wiki/ARCLoad
Адрес для скачивания: ftp://ftp.linux-mips.org/pub/linux/mips/people/skylark/arcload-0.5.tar.bz2
Контрольная сумма: b00e1c79074a13c2de97748f56f9bd1f
Домашняя страница: http://www.linux-mips.org/wiki/CoLo
Адрес для скачивания: http://www.colonel-panic.org/cobalt-mips/colo/colo-1.21.tar.gz
Контрольная сумма: 9d8a37ad4984ec6660ff159e83f15404
Домашняя страница: http://packages.qa.debian.org/d/dvhtool.html
Адрес для скачивания: http://ftp.debian.org/debian/pool/main/d/dvhtool/dvhtool_1.0.1.orig.tar.gz
Контрольная сумма: 4448c01e6a015685af90a79fbea8da4e
Адрес для скачивания: http://ftp.gnu.org/gnu/glibc/glibc-ports-2.4.tar.bz2
Контрольная сумма: 7bb1b35654e94994925e66676acabd4e
Общий объём этих пакетов: около 883 KБ
Помимо всех пакетов Вам будут нужны некоторые патчи. Они корректируют некоторые ошибки в пакетах, которые были обнаружены, или улучшают функциональность. Патчи также делают небольшие модификации для обеспечения более лёгкой работы с пакетами. Следующие патчи будут нужны для сборки системы СLFS:
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/bash-3.1-fixes-8.patch
Контрольная сумма: bc337045fa4c5839babf0306cc9df6d0
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/binutils-2.17-posix-1.patch
Контрольная сумма: 7e42a8edc0c59246bbc58c428256113c
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/bzip2-1.0.3-install_docs-1.patch
Контрольная сумма: 9e5dfbf4814b71ef986b872c9af84488
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/bzip2-1.0.3-remove_tempfile-1.patch
Контрольная сумма: bcadb0ce282c96af15a86a2ccdac0765
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/bzip2-1.0.3-bzgrep_security-1.patch
Контрольная сумма: 4eae50e4fd690498f23d3057dfad7066
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/coreutils-5.96-suppress_uptime_kill_su-1.patch
Контрольная сумма: 227d41a6d0f13c31375153eae91e913d
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/expect-5.43.0-spawn-2.patch
Контрольная сумма: 7706e1e8238c72eed8dc905d6f3b6aa9
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/gawk-3.1.5-segfault_fix-1.patch
Контрольная сумма: 7679530d88bf3eb56c42eb6aba342ddb
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/gcc-4.1.1-cross_search_paths-1.patch
Контрольная сумма: 541fe39d228ddaa0d8396a35ec3a0ada
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/gcc-4.1.1-PR20425-1.patch
Контрольная сумма: 95535bda8e4d37d30251db0b121b5374
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/gcc-4.1.1-posix-1.patch
Контрольная сумма: 0d88068740a0e00780891f2cb905b808
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/glibc-2.4-iconv_fix-1.patch
Контрольная сумма: 9c8e681226ccf7a1f25c6467674f915e
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/glibc-2.4-libgcc_eh-1.patch
Контрольная сумма: e5122ea7b89a5f22615eaadf8e46b334
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/glibc-2.4-localedef_segfault-1.patch
Контрольная сумма: 42452abc6196789e0a83afa1ca7e6e4e
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/gzip-1.3.5-security_fixes-1.patch
Контрольная сумма: f107844f01fc49446654ae4a8f8a0728
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/inetutils-1.4.2-inet_addr_fix-1.patch
Контрольная сумма: a33267b7a4e0d303a6f8dfeafde7bd8e
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/inetutils-1.4.2-gcc4_fixes-3.patch
Контрольная сумма: 5204fbc503c9fb6a8e353583818db6b9
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/inetutils-1.4.2-no_server_man_pages-1.patch
Контрольная сумма: eb477f532bc6d26e7025fcfc4452511d
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/kbd-1.12-gcc4_fixes-1.patch
Контрольная сумма: 615bc1e381ab646f04d8045751ed1f69
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/linux-2.6.17.13-tulip-1.patch
Контрольная сумма: 0dd7027a8cb8e59c74c24ff0a8f45f3b
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/mktemp-1.5-add_tempfile-3.patch
Контрольная сумма: 65d73faabe3f637ad79853b460d30a19
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/perl-5.8.8-libc-2.patch
Контрольная сумма: 3bf8aef1fb6eb6110405e699e4141f99
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/readline-5.1-fixes-3.patch
Контрольная сумма: e30963cd5c6f6a11a23344af36cfa38c
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/sysklogd-1.4.1-fixes-1.patch
Контрольная сумма: 508104f058d1aef26b3bc8059821935f
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/tar-1.15.1-gcc4_fix_tests-1.patch
Контрольная сумма: 8e286a1394e6bcf2907f13801770a72a
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/tar-1.15.1-security_fixes-1.patch
Контрольная сумма: 19876e726d9cec9ce1508e3af74dc22e
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/tar-1.15.1-sparse_fix-1.patch
Контрольная сумма: 9e3623f7c88d8766878ecb27c980d86a
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/texinfo-4.8-tempfile_fix-2.patch
Контрольная сумма: 559bda136a2ac7777ecb67511227af85
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/util-linux-2.12r-cramfs-1.patch
Контрольная сумма: 1c3f40b30e12738eb7b66a35b7374572
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/util-linux-2.12r-gcc4_fixes-1.patch
Контрольная сумма: 6c030921dc9b92daf688f12a4ee6f6e0
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/util-linux-2.12r-missing_header-1.patch
Контрольная сумма: 33ccc15d2e92caa6189b044f573fdcda
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/vim-7.0-fixes-5.patch
Контрольная сумма: 6e179cfe811d105de4fd9156a0ef6699
Адрес для скачивания: 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/ и получайте другие дополнительные патчи, необходимые для системы.
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/colo-1.21-make_fix-1.patch
Контрольная сумма: b89575a0e385b5366b19a6b5f176d49b
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/dvhtool-1.0.1-fixes-1.patch
Контрольная сумма: a521b380354b6a0c96b2d6308372749d
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/expect-5.43.0-config_update-1.patch
Контрольная сумма: eb8989a8baf11e0f02efbdf7e6843fc1
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/file-4.17-config_update-1.patch
Контрольная сумма: aee7ed8aa5cf781ae8c58d04194ce45a
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/gcc-4.1.1-pure64-1.patch
Контрольная сумма: cea9bf46663392d627de81e2456698e3
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/gcc-4.1.1-pure64_specs-1.patch
Контрольная сумма: 99e0ae890fce0614be210e83f0a5b975
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/glibc-2.4-mips_fixes-3.patch
Контрольная сумма: f3e0ee145d9548e9b0a9ae14d3f2bdee
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/grep-2.5.1a-config_update-1.patch
Контрольная сумма: 085690e21bf2c8c27aca987f73389c90
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/linux-2.6.17.13-mips-2.patch
Контрольная сумма: 124d9cddd277f67d319cdbd8e6a71373
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/linux-2.6.17.13-mips_fixes-2.patch
Контрольная сумма: 56c44a1c03b736ea76b278718a6db393
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/mktemp-1.5-config_update-1.patch
Контрольная сумма: 2eab6432dbf4d4447b85435363c6a557
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/module-init-tools-3.2.2-config_update-1.patch
Контрольная сумма: bdc816dd354e254f8053751286903f1c
Адрес для скачивания: http://patches.cross-lfs.org/1.0.0/util-linux-2.12r-mips64_fix-1.patch
Контрольная сумма: 20fb9ad811661059cf3b11ccdf391f5a
Общий объём этих патчей: около 932.3 KБ
На протяжении этой книги переменная окружения 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 или другого пользователя).
Все программы, компилируемые в главе Создание временной системы будут установлены в ${CLFS}/tools для содержания их отдельно от программ, устанавливаемых в главе Установка основных системных программ. Программы, компилируемые здесь, являются только временными инструментами и не будут частью финальной СLFS системы. Удерживая эти программы в отдельной директории, мы сможем легко их отбросить позднее после их использования. Это также предупреждает эти программы от установки в директории хоста (просто ошибившись в главе Создание временной системы).
Создадим требуемую директорию запуском следующей команды под пользователем root:
install -dv ${CLFS}/tools
Следующий шаг создаёт символическую ссылку /tools в хост системе. Она будет указывать на только что созданную директорию на СLFS разделе. Выполните следующую команду как пользователь root:
ln -sv ${CLFS}/tools /
Предыдущая команда корректна. Команда ln имеет множество различных вариантов синтаксиса и Вы должны изучить man-страницу по ln прежде, чем сообщать о том, что Вы считаете, что обнаружили ошибку.
Созданная ссылка разрешает временным инструментам быть собранными так, что они всегда ссылаются на /tools, означая, что компилятор, ассемблер и компоновщик будут работать. Это предоставит общее место для нашей временной системы.
Кросс-binutils и кросс-компилятор, собираемые в главе Создание инструментов кросс-компилирования, будут установлены в ${CLFS}/cross-tools для содержания их отдельно от хост программ. Программы, компилируемые здесь, являются кросс-инструментами и не будут частью финальной СLFS системы или временной системы. Удерживая эти программы в отдельной директории, мы сможем легко их отбросить позднее после их использования.
Создадим требуемую директорию запуском следующей команды под пользователем root:
install -dv ${CLFS}/cross-tools
Следующий шаг создаёт символическую ссылку /cross-tools в хост системе. Она будет указывать на только что созданную директорию на СLFS разделе. Выполните следующую команду как пользователь root:
ln -sv ${CLFS}/cross-tools /
Символическая ссылка не является технически необходимой (хотя инструкции книги подразумевают её наличие), но это главным образом для постоянства (так как /tools это также ссылка на ${CLFS}/tools) и более простой установки кросс-инструментов.
Если Вы зарегистрировались в ситеме как root, то малейшая ошибка может иметь фатальные последствия для Вашей системы. Поэтому мы рекомендуем собирать пакеты из этой главы под непривилегированным пользователем. Kонечно, Вы можете использовать имя Вашего текущего пользователя, но более простым шагом будет создание нового пользователя clfs и новой группы (также с именем clfs) и использовать его в процессе установки. Под правами root исполните следующие команды для добавления нового пользователя:
groupadd clfs
useradd -s /bin/bash -g clfs -m -k /dev/null clfs
Описание параметров командной строки:
Эта опция делает bash оболчкой по умолчанию для пользователя clfs.
Эта опция добавляет пользователя clfs в группу clfs.
Эта опция создаёт домашнюю директорию для пользователя clfs.
Этот параметр предупреждает возможное копирование файлов из скелетной директории (по умолчанию /etc/skel) изменением входящего расположения на специальное нуль-устройство.
Это актуальное имя для созданных группы и пользователя.
Для регистрации как 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.
Установим хорошее окружение, создав два новых файла для оболочки 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
Многие из пакетов поддерживают тестирование. Запуск его для только что собранного пакета будет хорошей идеей, так как можно будет проверить корректность компилирования. Тестирование содержит несколько тестов для проверки функциональности пакета. Это в какой-то мере может гарантировать полное отсутствие ошибок (багов) в программе.
Невозможно запустить тесты во время кросс-компилирования, поэтому инструкции по установке пакетов не объясняют, как запустить тесты на протяжении главы Установка основных системных программ.
Эта глава показывает Вам как создать кросс-платформенные инструменты.
Если Вам понадобится остановиться и вернуться к процессу позже, то выполните команду su - clfs, которая установит окружение сборки, которое Вы покинули.
Перед выполнением инструкций по сборке пакета этот пакет должен быть распакован пользователем clfs и необходимо перейти в созданную директорию при помощи команды cd. Инструкции по сборке подразумевают, что Вы используете интерпретатор командной строки bash.
Некоторые пакеты перед компилированием необходимо пропатчить, но только когда это необходимо для решения тех или иных проблем. Часто патчи нужно применять в обеих главах (этой и следующей), но некоторые необходимы только в одной из глав. Поэтому не беспокойтесь, если не найдёте инструкций по наложению некоторых скачанных патчей в этой главе. При накладывании патчей могут появляться сообщения с предупреждением offset или fuzz. Это нормально и Вы можете не обращать на них внимания.
Во время сборки многих пакетов будут появляться некоторые предупреждения. Можете их игнорировать. Всё, что они говорят — внимание, есть неточность, но не ошибка в коде C или C++. Это из-за того, что меняются стандарты на язык C, а некоторые пакеты написаны в соответствии со старыми стандартами, но это не представляет проблемы для компилятора.
После установки каждого пакета в этой и следующей главах удаляйте их исходники и директории сборки если нет особых инструкций на этот счёт. Удаление исходников предотвращает неправильную конфигурацию во время переустановки того самого пакета позднее.
CFLAGS и CXXFLAGS не должны быть установлены во время сборки кросс-инструментов.
Для сброса CFLAGS и CXXFLAGS используются следующие команды:
unset CFLAGS
unset CXXFLAGS
Добавим это в ~/.bashrc для избежания проблем если мы остановимся и продолжим сборку позже:
echo unset CFLAGS >> ~/.bashrc
echo unset CXXFLAGS >> ~/.bashrc
На протяжении сборки инструментов кросс-компилирования Вам понадобится установить некоторые переменные, которые будут подчинены Вашим особым потребностям. Первая переменная будет "близнецом" HOST машины. Вам понадобится установить CHOST для соответствия Вашим особым потребностям. Для установки этой информации Вы можете выполнить следующую команду:
export CLFS_HOST="$(echo $MACHTYPE | sed "s/$(echo $MACHTYPE | cut -d- -f2)/cross/")"
Теперь мы установим нашего "близнеца" для целевой архитектуры:
Для машины MIPS Little Endian:
export CLFS_TARGET="mips64el-unknown-linux-gnu"
Для машины MIPS Big Endian:
export CLFS_TARGET="mips64-unknown-linux-gnu"
Добавим это в ~/.bashrc для избежания проблем если мы остановимся и продолжим сборку позже:
echo export CLFS_HOST=\""${CLFS_HOST}\"" >> ~/.bashrc
echo export CLFS_TARGET=\""${CLFS_TARGET}\"" >> ~/.bashrc
Нам необходимо установить флаги для компилятора и компоновщика, специфичные для целевой системы.
export BUILD64="-mabi=64"
Добавим это в ~/.bashrc для избежания проблем если мы остановимся и продолжим сборку позже:
echo export BUILD64=\""${BUILD64}\"" >> ~/.bashrc
Пакет Linux Headers содержит “осмысленные” заголовки ядра.
Установим заголовочные файлы, которые нужны для основы сборки:
install -dv /tools/include
cp -av include/asm-mips /tools/include/asm
cp -av include/{asm-generic,linux} /tools/include/
Детальная информация о пакете находится в Разделе 10.5.2, “Описание Linux-Headers.”
Пакет 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 --enable-64-bit-bfd --disable-multilib
Описание параметров команды configure:
Это скажет скрипту конфигурации, что программы Binutils следует устанавливать в директорию /cross-tools.
При использовании совместно с --target создаётся кросс-архитектурный файл для ${LFS_TARGET} но исполняемый на ${LFS_HOST}.
При использовании совместно с --host создаётся кросс-архитектурный файл для ${LFS_TARGET} но исполняемый на ${LFS_HOST}.
Указывает скрипту configure установить путь поиска библиотек во время сборки Binutils, в результате директория /tools/lib будет помещена в компоновщик. Это запретит компоновщику поиск в директориях библиотек хоста.
Это отключит интернационализацию (сокращенно - i18n) так как это не надо для инструментов кросс-сборки.
Разрешает создание разделяемых библиотек.
Эта опция отключит сборку мультибиблиотечных возможностей binutils.
Добавляет поддержку 64 бит в Вinutils.
Компилируем пакет:
make configure-host
make
Описание параметров команды make:
Проверяет окружение хоста и наличие всех необходимых инструментов для сборки Binutils.
Устанавливаем пакет:
make install
Скопируем файл libiberty.h в директорию /tools/include:
cp -v ../binutils-2.17/include/libiberty.h /tools/include
Детальная информация о пакете находится в Разделе 10.9.2, “Описание Binutils.”
Пакет GCC содержит коллекцию компилятора GNU, включая компиляторы C и C++.
Сделаем пару подходящих установок в файле specs, чтобы GCC использовал наше окружение сборки:
patch -Np1 -i ../gcc-4.1.1-pure64_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-mutlilib \
--with-local-prefix=/tools --disable-nls --disable-shared \
--disable-threads --enable-languages=c --with-abi=64
Описание параметров команды configure:
Этот ключ удаляет /usr/local/include из пути поиска заголовков для gcc. Это не абсолютно необходимо, хотя помагает минимизировать влияние хост системы.
Выключает сборку разделяемых библиотек.
Это предотвратит поиск GCC для мульти-нитевых файлов заголовков, так как пока они не были созданы для этой архитектуры. GCC сможет найти мульти-нитевую информацию после создания заголовков Glibc.
Эта опция позволяет быть увереным, что будет собран только компилятор C.
Компилируем пакет:
make all-gcc
Устанавливаем пакет:
make install-gcc
Детальная информация о пакете находится в Разделе 10.10.2, “Описание GCC.”
Glibc является библиотекой C, которая обеспечивает системные вызовы и основные функции, такие как open, malloc, printf и т.д. Библиотека C используется для всех динамически скомпонованых программ.
Необходимо заметить, что сборка Glibc другим способом, не тем, что описан в этой книге, может привести к рискам нестабильности системы.
MIPS больше не поддерживается в базовом дереве Glibc, поэтому мы должы извлечь пакет glibc-ports-2.4 в нашу директорию glibc-2.4. Затем мы переместим порты в место, ожидаемое нашей сборкой и патчами:
tar -jxvf ../glibc-ports-2.4.tar.bz2
mv -v glibc-ports-2.4 ports
Следующий патч исправляет проблемы компоновки во время сборки Glibc на MIPS:
patch -Np1 -i ../glibc-2.4-mips_fixes-3.patch
Отключим компоновку с 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 ${BUILD64}" \
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:
Предписывает Glibc использовать текущий компилятор Вашей системы. Это используется для создания инструментов Glibc, используемых во время собственной сборки.
Предписывает Glibc собирать, используя наш компилятор GCC для целевой архитектуры с использованием 64-битных флагов.
Предписывает Glibc использовать утилиту ar, созданную для целевой архитектуры.
Предписывает Glibc использовать утилиту ranlib, созданную для целевой архитектуры.
Это собирает библиотеки без профильной информации. Пропустите эту опцию если профильная информация нужна во временной системе.
Говорит Glibc использовать все доступные дополнения.
Говорит Glibc включить поддержку для Thread-Local Storage (TLS). Это необходимо для нормальной работы NPTL.
Эта опция говорит Glibc использовать __thread для сборки libc и libpthread.
Предписывает Glibc использовать утилиту Binutils, специфичную для целевой архитектуры.
Предписывает 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.”
Пакет GCC содержит коллекцию компилятора GNU, включая компиляторы C и C++.
Следующий патч исправляет поиск мультибиблиотечных директорий для файла specs. Патч стандартизирует путь драйверов функций итераци gcc, подтверждая, что мультибиблиотечные директории ищутся в корректном порядке. Это исправляет различные проблемы, большинство из которых отмечены с libtool на мультибиблиотечных системах:
patch -Np1 -i ../gcc-4.1.1-PR20425-1.patch
Сделаем пару подходящих установок в файле specs, чтобы GCC использовал наше окружение сборки:
patch -Np1 -i ../gcc-4.1.1-pure64_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 \
--target=${CLFS_TARGET} --host=${CLFS_HOST} --with-abi=64 \
--with-local-prefix=/tools --disable-nls --enable-shared \
--enable-languages=c,c++ --enable-__cxa_atexit --disable-multilib \
--enable-c99 --enable-long-long --enable-threads=posix
Описание новых параметров команды configure:
This option do ...
Эта опция позволяет убедиться, что будут собраны только компиляторы C и C++.
Эта опция разрешит использование __cxa_atexit, которое предпочтительнее использования atexit, для регистрации деструкторов C++ для локальных и глобальных объектов для обеспечения полного соответствия стандартам ссылок на деструкторы. Он также повлияет на C++ ABI и некоторые другие результаты в библиотеках C++ и программах C++, которые взаимодействуют с другими дистрибутивами Linux.
Разрешает поддержку C99 для программ C.
Разрешает поддержку long long в компиляторе.
Подключит расширение C++ для мульти-нитевого кода.
Компилируем пакет:
make AS_FOR_TARGET="${CLFS_TARGET}-as" \
LD_FOR_TARGET="${CLFS_TARGET}-ld"
Устанавливаем пакет:
make install
Детальная информация о пакете находится в Разделе 10.10.2, “Описание GCC.”
Эта глава показывает, как собрать и установить минимальную 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.
Установим переменные окружения для компилятора и компоновщика:
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
Пакет Binutils содержит компоновщик, ассемблер и другие инструменты для работы с объектными файлами.
Чтобы убедиться, что для некоторых инструментов используется правильный синтаксис, применим следующий патч:
patch -Np1 -i ../binutils-2.17-posix-1.patch
В документации по Binutils рекомендуется собирать Binutils вне директории с исходниками в отдельной директории для сборки:
mkdir -v ../binutils-build
cd ../binutils-build
Подготавливаем Binutils к компиляции:
CC="${CC} ${BUILD64}" \
../binutils-2.17/configure --prefix=/tools \
--build=${CLFS_HOST} --host=${CLFS_TARGET} --target=${CLFS_TARGET} \
--disable-nls --enable-shared --enable-64-bit-bfd \
--disable-multilib
Описание новых параметров команды configure:
Говорит компилятору использовать наши 64-битные флаги сборки.
Компилируем пакет:
make configure-host
make
Устанавливаем пакет:
make install
Детальная информация о пакете находится в Разделе 10.9.2, “Описание Binutils.”
Пакет GCC содержит коллекцию компилятора GNU, включая компиляторы C и C++.
Следующий патч исправляет поиск мультибиблиотечных директорий для файла specs. Патч стандартизирует путь драйверов функций итераци gcc, подтверждая, что мультибиблиотечные директории ищутся в корректном порядке. Это исправляет различные проблемы, большинство из которых отмечены с libtool на мультибиблиотечных системах:
patch -Np1 -i ../gcc-4.1.1-PR20425-1.patch
Сделаем пару подходящих установок в файле specs, чтобы GCC использовал наше окружение сборки:
patch -Np1 -i ../gcc-4.1.1-pure64_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
Для поиска мультибиблиотек направим сборку на использование результата --print-multi-lib из нашего кросс-компилятора, не родного компилятора gcc, собираемого сейчас:
cp -v gcc/Makefile.in{,.orig2}
sed -e "/MULTILIBS/s@\$(GCC_FOR_TARGET)@/cross-tools/bin/${CC}@g" \
gcc/Makefile.in.orig2 > gcc/Makefile.in
В документации по GCC рекомендуется собирать GCC вне директории с исходниками в отдельной директории для сборки:
mkdir -v ../gcc-build
cd ../gcc-build
Перед началом сборки GCC не забудьте сбросить любые переменные окружения, которые изменяют флаги оптимизации по умолчанию.
Подготавливаем GCC к компиляции:
CC="${CC} ${BUILD64}" CXX="${CXX} ${BUILD64}" \
../gcc-4.1.1/configure --prefix=/tools --disable-multilib \
--build=${CLFS_HOST} --host=${CLFS_TARGET} --target=${CLFS_TARGET} \
--with-local-prefix=/tools --enable-long-long --with-abi=64 \
--enable-c99 --enable-shared --enable-threads=posix --enable-__cxa_atexit \
--disable-nls --enable-languages=c,c++ --disable-libstdcxx-pch
Описание новых параметров команды configure:
Заставляет компилятор C++ использовать наши 64-битные флаги.
Не собирать предкомпилированные заголовки (PCH) для libstdc++. Это сохранит некоторое место и мы их не используем.
Компилируем пакет:
make AS_FOR_TARGET="${AS}" \
LD_FOR_TARGET="${LD}"
Устанавливаем пакет:
make install
Теперь мы копируем файлы, которые помещены в /tools/lib64 в /tools/lib и удаляем диреторию /tools/lib64:
cp -va /tools/lib64/* /tools/lib
rm -rvf /tools/lib64
Многие пакеты используют имя cc для вызова компилятора С. Для поддержки таких пакетов создадим ссылку:
ln -sv gcc /tools/bin/cc
Детальная информация о пакете находится в Разделе 10.10.2, “Описание GCC.”
Пакет Ncurses содержит библиотеки для расширения возможностей текстового интерфейса.
Подготавливаем Ncurses к компиляции:
CC="${CC} ${BUILD64}" CXX="${CXX} ${BUILD64}" \
./configure --prefix=/tools --with-shared --build=${CLFS_HOST} \
--host=${CLFS_TARGET} --without-debug --without-ada \
--enable-overwrite --with-build-cc=gcc
Описание параметров команды configure:
Говорит Ncurses создавать разделяемые библиотеки.
Говорит Ncurses собирать без отладочной информации.
Это заставит Ncurses собираться без использованиея Ada, если он установлен в основной системе, так как он не будет доступен во время сборки финальной системы.
Это скажет Ncurses устанавливать свои заголовки в /tools/include вместо /tools/include/ncurses, нам надо убедиться, что другие пакеты смогут эти заголовки найти.
Это называет Ncurses используемый тип компилятора.
Компилируем пакет:
make
Устанавливаем пакет:
make install
Детальная информация о пакете находится в Разделе 10.15.2, “Описание Ncurses.”
Bash - это Bourne-Again SHell.
Удалим тест, который приводит к выпадению сборки:
echo "ac_cv_func_setvbuf_reversed=no" >> config.cache
Когда bash является кросс-компилированным, то он не может протестировать наличие именованных каналов. Мы использовали su чтобы стать непривилегированным пользователем, эта комбинация приведёт к сборке без замены процессов, которая прервёт скрипт тестирования c++ в glibc. Предупредим это установкой следующего определения:
echo "bash_cv_sys_named_pipes=yes" >> config.cache
Подготавливаем Bash к компиляции:
CC="${CC} ${BUILD64}" CXX="${CXX} ${BUILD64}" \
./configure --prefix=/tools \
--build=${CLFS_HOST} --host=${CLFS_TARGET} \
--without-bash-malloc --cache-file=config.cache
Описание параметра команды configure:
Эта опция выключает использование функции Bash-а "memory allocation" (malloc), которая известна своей нестабильной работой. После выключения этой опции Bash будет использовать функцию malloc из Glibc, которая более стабильна.
Компилируем пакет:
make
Устанавливаем пакет:
make install
Создадим ссылку для программ, которые используют в качестве оболочки sh:
ln -sv bash /tools/bin/sh
Детальная информация о пакете находится в Разделе 10.26.2, “Описание Bash.”
Bzip2 является блочным файловым архиватором, который, как правило, сжимает лучше традиционного gzip.
Файл Makefile по умолчанию автоматически запускает тесты. Выключим их, так как они не работают на мультиархитектурной сборке:
cp -v Makefile{,.orig}
sed -e 's@^\(all:.*\) test@\1@g' Makefile.orig > Makefile
Пакет Bzip2 не содержит скрипта configure. Компилируем его при помощи команды:
make CC="${CC} ${BUILD64}" AR="${AR}" RANLIB="${RANLIB}"
Устанавливаем пакет:
make PREFIX=/tools install
Детальная информация о пакете находится в Разделе 10.27.2, “Описание Bzip2.”
Пакет 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 к компиляции:
CC="${CC} ${BUILD64}" \
./configure --prefix=/tools --cache-file=config.cache \
--build=${CLFS_HOST} --host=${CLFS_TARGET}
Компилируем пакет:
make
Устанавливаем пакет:
make install
Детальная информация о пакете находится в Разделе 10.11.2, “Описание Coreutils.”
Программы из этого пакета показывают различия между двумя файлами или директориями.
Подготавливаем Diffutils к компиляции:
CC="${CC} ${BUILD64}" ./configure --prefix=/tools \
--build=${CLFS_HOST} --host=${CLFS_TARGET}
Компилируем пакет:
make
Устанавливаем пакет:
make install
Детальная информация о пакете находится в Разделе 10.28.2, “Описание Diffutils.”
Пакет Findutils содержит программы для поиска файлов, в том числе "на лету" (путём рекурсивного поиска от директории и показывая только файлы, удовлетворяющие параметрам поиска) или поиск через бызу данных.
Findutils имеет проблему при кросс-компилировании, когда не находит getline. Исправим это:
echo "am_cv_func_working_getline=yes" >> config.cache
Подготавливаем Findutils к компиляции:
CC="${CC} ${BUILD64}" ./configure --prefix=/tools \
--build=${CLFS_HOST} --host=${CLFS_TARGET} --cache-file=config.cache
Компилируем пакет:
make
Устанавливаем пакет:
make install
Детальная информация о пакете находится в Разделе 10.31.2, “Описание Findutils.”
Gawk является вариантом awk, который используется для манипуляций с текстовыми файлами.
Подготавливаем Gawk к компиляции:
CC="${CC} ${BUILD64}" \
./configure --prefix=/tools \
--build=${CLFS_HOST} --host=${CLFS_TARGET}
Компилируем пакет:
make
Устанавливаем пакет:
make install
Детальная информация о пакете находится в Разделе 10.32.2, “Описание Gawk.”
Пакет Gettext используется для интернационализации и локализации. Программы могут быть скомпилированы с Поддержкой Родного Языка (Native Language Support - NLS) для получения возможности вывода сообщений на языке пользователя.
Gettext имеет проблемы при кросс-компилировании, когда не находит getline. Исправим это:
cd gettext-tools
echo "am_cv_func_working_getline=yes" >> config.cache
Подготавливаем Gettext к компиляции:
CC="${CC} ${BUILD64}" CXX="${CXX} ${BUILD64}" \
./configure --prefix=/tools \
--build=${CLFS_HOST} --host=${CLFS_TARGET} --disable-shared \
--cache-file=config.cache
Описание параметров команды configure:
Не собирать разделяемые библиотеки.
Только одна программа из пакета Gettext нужна для сборки:
make -C lib
make -C src msgfmt
Установим бинарник msgfmt:
cp -v src/msgfmt /tools/bin
Детальная информация о пакете находится в Разделе 10.33.2, “Описание Gettext.”
Grep является программой для поиска в содержимом файлов.
Этот патч обновляет config.guess и config.sub для MIPS процессоров:
patch -Np1 -i ../grep-2.5.1a-config_update-1.patch
Подготавливаем Grep к компиляции:
CC="${CC} ${BUILD64}" ./configure --prefix=/tools \
--build=${CLFS_HOST} --host=${CLFS_TARGET} \
--disable-perl-regexp
Описание параметров команды configure:
Подтверждает, что программа grep не скомпонована с библиотекой Perl Compatible Regular Expression (PCRE), которая может быть на хост машине, но не будет доступна во время сборки финальной системы.
Компилируем пакет:
make
Устанавливаем пакет:
make install
Детальная информация о пакете находится в Разделе 10.34.2, “Описание Grep.”
Пакет Gzip содержит программы для сжатия и распаковки файлов.
Настроим скрипт configure так, чтобы он мог использовать кросс-компилированные инструменты:
cp -v configure{,.orig}
sed -e "s@nm conftest@${CLFS_TARGET}-&@" configure.orig > configure
Подготавливаем Gzip к компиляции:
CC="${CC} ${BUILD64}" ./configure --prefix=/tools \
--build=${CLFS_HOST} --host=${CLFS_TARGET}
Компилируем пакет:
make
Устанавливаем пакет:
make install
Детальная информация о пакете находится в Разделе 10.36.2, “Описание Gzip.”
Пакет Make содержит программу для компиляции приложений.
Подготавливаем Make к компиляции:
CC="${CC} ${BUILD64}" ./configure --prefix=/tools \
--build=${CLFS_HOST} --host=${CLFS_TARGET}
Компилируем пакет:
make
Устанавливаем пакет:
make install
Детальная информация о пакете находится в Разделе 10.40.2, “Описание Make.”
Пакет Patch содержит программу для модификации или создания файлов применением “patch-файла”, обычно созданного программой diff.
Подготавливаем Patch к компиляции:
CC="${CC} ${BUILD64}" ./configure --prefix=/tools \
--build=${CLFS_HOST} --host=${CLFS_TARGET}
Компилируем пакет:
make
Устанавливаем пакет:
make install
Детальная информация о пакете находится в Разделе 10.44.2, “Описание Patch.”
Sed является потоковым редактором.
Подготавливаем Sed к компиляции:
CC="${CC} ${BUILD64}" ./configure --prefix=/tools \
--build=${CLFS_HOST} --host=${CLFS_TARGET}
Компилируем пакет:
make
Устанавливаем пакет:
make install
Детальная информация о пакете находится в Разделе 10.17.2, “Описание Sed.”
Tar является программой архивирования.
Tar имеет проблему при кросс-компилировании, когда не находит getline. Исправим это:
echo "am_cv_func_working_getline=yes" >> config.cache
Подготавливаем Tar к компиляции:
CC="${CC} ${BUILD64}" ./configure --prefix=/tools \
--build=${CLFS_HOST} --host=${CLFS_TARGET} \
--cache-file=config.cache
Компилируем пакет:
make
Устанавливаем пакет:
make install
Детальная информация о пакете находится в Разделе 10.49.2, “Описание Tar.”
Пакет Texinfo содержит программы, используемые для чтения, записи и конвертирования документов Info, которые содержат системную документацию.
Подготавливаем Texinfo к компиляции:
CC="${CC} ${BUILD64}" ./configure --prefix=/tools \
--build=${CLFS_HOST} --host=${CLFS_TARGET}
Компилируем пакет:
make
Устанавливаем пакет:
make install
Детальная информация о пакете находится в Разделе 10.50.2, “Описание Texinfo.”
Есть два разных пути по которым Вы можете пойти с этого места для сборки финальной системы. Вы можете собрать ядро, загрузчик и некоторые другие утилиты, загрузиться во временную систему и собирать остальное там. Альтернативно Вы можете войти во временную систему в 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.
Эта глава показывает, как полностью собрать временные инструменты для создания минимальной системы, которая будет использована для загрузки целевой машины и для сборки пакетов финальной системы.
Есть несколько дополнительных пакетов, которые необходимо будет установить для возможности загрузки минимальной системы. Некоторые из этих пакетов будут установлены в корень или в /usr на разделе CLFS (${CLFS}/bin, ${CLFS}/usr/lib и т.д.), а не в /tools, используя опцию "DESTDIR" в make. Это потребует наличия у пользователя clfs доступа на запись в остальную часть раздела CLFS, поэтому Вам понадобится временно изменить владельца ${CLFS} на пользователя clfs. Выполните следующую команду как root:
chown -v clfs ${CLFS}
На платфомах, основанных на MIPS, мы имеем 2 различных загрузчика - Colo для Cobalt-основанных MIPS машин и Arcload для SGI машин. С этого момента в сценариях загрузки мы будем собирать только загрузчик Cobalt. На машинах SGI, которые следуют этим методам сборки, мы рекомендуем использовать сетевую загрузку. Информация о сетевой загрузке может быть найдена по ссылке ниже.
Теперь нам надо создать структуру файловой системы 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
Эти внесения необходимы для загрузчика RaQ2. Применяйте их только если Вы используете загрузчик Colo:
cd ${CLFS}/boot
ln -svf . boot
По умолчанию директории создаются с правами доступа 755, но это правильно не для всех из них. Мы сделаем два изменения - одно для домашней директории пользователя root, а другое для директории временных файлов.
Первой командой смены моды мы запрещаем доступ в директорию /root для всех, кроме владельца — то же самое нам надо будет потом сделать для домашних директорий остальных пользователей. Второй командой смены моды мы позволяем всем пользователям записывать и читать файлы в и из директорий /tmp и /var/tmp, но они не смогут удалять оттуда файлы других пользователей. Последнее достигается установкой “бита прикрепления” - старшего бита в битовой маске 1777.
Мы создаём наше дерево каталогов совместимым со стандартом FHS (доступен на http://www.pathname.com/fhs/). Вместе с деревом директорий, созданным выше, этот стандарт обуславливает существование директорий /usr/local/games и /usr/share/games. Мы не рекомендуем их для базовой системы, хотя Вы можете создать систему полностью FHS-совместимой. Поскольку структура поддиректорий /usr/local/share не описана в стандарте FHS, то мы создаём её так, как надо нам.
Некоторые программы имеют встроенные пути к программам, которые пока не установлены. Чтобы обеспечить доступ к этим программам, мы создадим ссылки на них, которые пока заменят нам реальные файлы до их установки.
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
Пакет Zlib содержит библиотеку, которая используется некоторыми программами для своих функций сжатия и распаковки.
Подготавливаем Zlib к компиляции:
CC="${CC} ${BUILD64}" \
./configure --prefix=/tools --shared
Компилируем пакет:
make
Устанавливаем пакет:
make install
Детальная информация о пакете находится в Разделе 10.23.2, “Описание Zlib.”
E2fsprogs содержит ряд системных утилит для поддержки файловой системы ext2. Они также поддерживают журналируемую файловую систему ext3.
Рекомендуется собирать E2fsprogs вне директории с исходниками:
mkdir -v build
cd build
Подготавливаем E2fsprogs к компиляции:
CC="${CC} ${BUILD64}" ../configure --prefix=/tools \
--enable-elf-shlibs --disable-evms \
--host=${CLFS_TARGET}
Описание параметров команды configure:
Создаёт разделяемую библиотеку для использования некоторыми программами из этого пакета.
Отключает сборку плагина Enterprise Volume Management System (EVMS). Этот плагин не обновляется с последними внутренними EVMS интерфейсами и EVMS не инсталируется как часть базовой системы LFS, поэтому плагин не требуется. Смотрите EVMS сайт на http://evms.sourceforge.net/ для большей информации о EVMS.
make CC="${CC} ${BUILD64}"
Устанавливаем бинарники и документацию:
make DESTDIR=${CLFS} install
Описание параметра команды make:
Файл 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.”
Пакет 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} ${BUILD64}"
Устанавливаем пакет:
make -C src install INSTALL="install" ROOT="${CLFS}"
Создадим новый файл ${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
# Удалите этот раздел если в Вашей системе
# есть только порт console
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
# Раскоментируйте этот раздел если в Вашей системе есть порт console
#c0:12345:respawn:/sbin/agetty 115200 ttyS0 vt100
# End /etc/inittab
EOF
Детальная информация о пакете находится в Разделе 10.48.3, “Описание Sysvinit.”
Пакет Module-Init-Tools содержит программы для поддержки модулей ядра в ядрах Linux с версией 2.5.47 или выше.
Этот патч обновляет config.guess и config.sub для MIPS процессоров:
patch -Np1 -i ../module-init-tools-3.2.2-config_update-1.patch
Подготавливаем Module-Init-Tools к компиляции:
./configure --prefix=/ \
--build=${CLFS_HOST} --host=${CLFS_TARGET}
Компилируем пакет:
make
Устанавливаем пакет:
make DESTDIR="${CLFS}" install
Детальная информация о пакете находится в Разделе 10.43.2, “Описание Module-Init-Tools.”
Пакет Util-linux содержит ряд различных утилит. Некоторые из этих утилит используются для монтирования, размонтирования, форматирования, разбиения и обслуживания дисков, открытия портов tty и вызова сообщений ядра.
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 имеет ощибку компилирования при сборке с 64 битами и на MIPS процессоре. Следующий патч устраняет эту проблему:
patch -Np1 -i ../util-linux-2.12r-mips64_fix-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 к компиляции:
CC="${CC} ${BUILD64}" ./configure
Подготавливаем Util-linux к компиляции:
make HAVE_KILL=yes HAVE_SLN=yes \
HAVE_SHADOW=no CPUOPT="" ARCH="" \
CPU=""
Описание параметров команды make:
Это предостережёт программу kill от сборки.
Это предостережёт программу sln (статически скомпонованный ln, уже установленный с Glibc) от повторной сборки.
Это отключает компоновку с shadow.
Это отключает любую оптимизацию компилятора под тип 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.”
Пакет Udev содержит программы для динамического создания нод устройств.
Компилируем пакет:
make CROSS_COMPILE="${CLFS_TARGET}-" CC="${CC} ${BUILD64}" \
LD="${CC} ${BUILD64}"
Устанавливаем пакет:
make DESTDIR=${CLFS} install
Детальная информация о пакете находится в Разделе 10.51.2, “Описание Udev.”
Для возможности регистрации в качестве пользователя root и для распознавания имени “root” нам необходимо создать соответствующие элементы в файлах /etc/passwd и /etc/group.
Создадим файл ${CLFS}/etc/passwd запуском следующей команды:
cat > ${CLFS}/etc/passwd << "EOF"
root::0:0:root:/root:/bin/bash
EOF
Пароль пользователя root (символ “::” заменяет его здесь и позволяет загружаться без пароля) будет определён позднее.
Дополнительные пользователи, которых Вы можете захотеть добавить:
Может быть полезен для совместимости с настоящими приложениями
Он часто рекомендуется для использования с некоторыми непривилегированными ID пользователя/ID групы для запуска демонов, в порядке ограничения их доступа к системе
Использовался программами, использующими административные задачи
Используется программами для печати
Часто используется программами электронной почты
Часто используется для сетевых серверов новостей
Часто используется для копирования файлов между Unix серверами
Часто используется для возможности операторов системы получать доступ к системе
Обычно используется в качестве учётной записи, которая получает всю информацию о проблемах через почтовый сервер
Используется 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
Дополнительные группы, которые Вы можете захотеть добавить:
Всем пользователям в этой группе разрешено выполнять административные задачи
Эта группа имеет прямой доступ к консоли
Эта группа позволяет использовать CDRW накопитель
Используется MTA (Mail Transport Agents)
Используется серверами сетевых новостей
Используется пользователями для копирования между Unix машинами
GID по умолчанию, используемый shadow для новых пользователей
Это группа по умолчанию, используемая некоторыми программами, которые не требуют группу
Используется 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 записывает неправильые регистрации.
Пакет Linux содержит ядро Linux и файлы заголовков.
Здесь будет собрано временное кросс-компилированное ядро. Во время его конфигурации выберите минимальный набор опций, необходимый для загрузки целевой машины и сборки финальной системы. То есть без поддержки звука, принтеров и т.д.
По возможности попытайтесь избежать использования модулей и не используйте полученное ядро для нормальных систем.
Сборка ядра разбита на несколько шагов — конфигурация, компилирование и установка. Если Вам не нравится способ установки, описаный в этой книге, то посмотрите файл README в директории с исходниками ядра на предмет альтернативы.
Следующий патч исправляет проблему инициализации с сетевым драйвером tulip:
patch -Np1 -i ../linux-2.6.17.13-tulip-1.patch
Следующий патч объединяет изменения в Linux-MIPS ядре:
patch -Np1 -i ../linux-2.6.17.13-mips-2.patch
Следующий патч объединяет обновления в Linux-MIPS ядре:
patch -Np1 -i ../linux-2.6.17.13-mips_fixes-2.patch
Чтобы убедиться, что Ваша система загружается и Вы можете правильно запустить и 32-битные и 64-битные бинарники, проверьте, что включена поддержка для ELF и эмуляция для 32-бит ELF в ядре.
Подготовимся к компилированию запуском следующей команды:
make mrproper
Это позволит убедиться, что дерево исходников будет абсолютно чистым. Команда разработки ядра рекомендует запускать эту команду перед каждым компилированием ядра. Вы не можете быть абсолютно уверены в отсутствии лишних файлов даже после распаковки исходников.
Если Ваша клавиатура не US и на Вашей хост системе установлен Kbd, то Вы можете собрать подходящую раскладку для Вашей клавиатуры внутри ядра. Если Вы пожелаете это сделать, то запустите следующую команду (замените [путь к раскладке] на положение клавиатурной раскладки на хосте - обычным местом является /usr/share/kbd):
loadkeys -m [путь к раскладке] > \
drivers/char/defkeymap.c
Например, если используется русская клавиатура, то используйте /usr/share/kbd/keymaps/i386/qwerty/ru1.map.gz (один из вариантов).
Отконфигурируем ядро через меню-подобный интерфейс:
make ARCH=mips CROSS_COMPILE=${CLFS_TARGET}- menuconfig
Скомпилируем образ ядра и модули:
make ARCH=mips 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=mips CROSS_COMPILE=${CLFS_TARGET}- \
INSTALL_MOD_PATH=${CLFS} modules_install
После завершения компилирования ядра требуются дополнительные шаги для завершения установки. Некоторые файлы необходимо скопировать в директорию ${CLFS}/boot directory.
Используйте следующую команду для установки ядра:
cp -v vmlinux ${CLFS}/boot/vmlinux-2.6.17.13
gzip -9 ${CLFS}/boot/vmlinux-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.”
Пакет Colo содержит загрузчик Cobalt.
Этот патч обновляет загрузчик Colo для сборки на 64 битах:
patch -Np1 -i ../colo-1.21-make_fix-1.patch
Следующий патч исправляет ошибку при компоновке с Binutils:
patch -Np1 -i ../colo-1.21-relocation_fix-1.patch
Это загрузчик для MIPS основанных серверов cobalt RaQ, RaQ2, Qube или Qube2.
cd tools/elf2rfx
make CC=gcc
cd ../..
make CC="${CC} ${BUILD64}" CROSS_COMPILE="${CLFS_TARGET}-" binary
Скомпилируем пакет Colo:
cp -v chain/colo-chain.elf ${CLFS}/boot/vmlinux
gzip -9 ${CLFS}/boot/vmlinux
Детальная информация о пакете находится в Разделе 10.54.2, “Описание Colo.”
Новый экземпляр оболочки, которая будет запущена во время загрузки системы, является регистрированной оболочкой, которая будет читать файл .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 все программы, установленные в главе Создание временной системы, будут находиться оболочкой если они ещё не были собраны на целевой системе. Эта конфигурация заставляет использовать бинарники финальной системы, так как они собираются поверх временной системы, минимизируя шанс программ финальной системы быть собранными при помощи временной системы.
Нам необходимо скопировать наши переменные сборки в нашу новую систему:
echo export BUILD64=\""${BUILD64}\"" >> ${CLFS}/root/.bash_profile
Файл /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 в дереве исходников ядра.
Пакет СLFS-Bootscripts содержит набор скриптов для запуска/остановки системы CLFS во время загрузки/выключения.
Устанавливаем пакет:
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.”
Пакет Udev Cross-LFS rules содержит необходимый набор правил для начальной работы системы.
Устанавливаем пакет:
make DESTDIR=${CLFS} install-minimal
Детальная информация о пакете находится в Разделе 11.3.2, “Описание Udev Rules.”
Все последующие команды в книге должны выполняться пользователем 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
На данный момент права на директорию ${CLFS} и все её поддиректории принадлежат пользователю clfs, который существует только на основной системе. В целях безопасности корневая директория ${CLFS} и все её поддиректории должны принадлежать root. Изменим владельца для ${CLFS} и её поддиректорий запуском следующей команды:
chown -Rv root:root ${CLFS}
Это загрузчик для MIPS основанных серверов cobalt RaQ, RaQ2, Qube или Qube2.
Загрузка системы может быть комплексной задачей, поэтому скажем несколько предостережений. Хорошо ознакомьтесь с текущим загрузчиком и другими операционными системами, присутствующими на жёстком диске, которые должны загружаться. Убедитесь, что спасательный загружаемый диск готов к “спасению” компьютера, если компьютер станет неиспользуемым (незагружаемым).
Ранее мы скомпилировали и установили программы загрузчика Cobalt при подготовке этого шага. Теперь мы настроим нашу систему для загрузки используя Colo. Вот простой default.colo для применения.
cat > ${CLFS}/boot/default.colo << "EOF"
#:CoLo:#
#
# load linux
#
lcd 'Booting 2.6.17.13...'
load vmlinux-2.6.17.13.gz
execute root=/dev/hda2 console=ttyS0,115200 ide1=noprobe
EOF
Теперь Вы находитесь в точке создания копии директории ${CLFS} на Вашей целевой машине. Простейшим методом будет использование tar и копирование файла.
tar -jcvf ${CLFS}.tar.bz2 ${CLFS}
Некоторые имеют другие идеи о том, как это сделать. Ниже представлена таблица с методами и ссылками на соответствующую информацию.
Table 7.1. Методы загрузки
Метод загрузки | Для архитектуры | Ссылка |
---|---|---|
nfsroot | MIPS, PPC, Sparc, x86 и x86_64 | http://documents.jg555.com/netboot |
Эта глава показывает, как подготовить chroot окружение для сборки в нём пакетов финальной системы.
Пакет Util-linux содержит ряд различных утилит. Некоторые из этих утилит используются для монтирования, размонтирования, форматирования, разбиения и обслуживания дисков, открытия портов tty и вызова сообщений ядра.
Следующий патч исправляет проблему сборки с 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 к компиляции:
CC="${CC} ${BUILD64}" ./configure
Компилируем некоторые поддерживаемые шаблоны:
make ARCH="" CPU="" -C lib
Описание параметров команды make:
Отключает определение архитектуры.
Отключает определение 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.”
Все последующие команды в книге должны выполняться пользователем 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
Теперь пришло время войти в 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 ещё не создан.
На данный момент права на директории /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.
Теперь нам надо создать структуру файловой системы 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
Это необходимо для загрузчика RaQ2. Используйте это только если Вы применяете загрузчик Colo:
cd /boot
ln -svf . boot
По умолчанию директории создаются с правами доступа 755, но это правильно не для всех из них. Мы сделаем два изменения - одно для домашней директории пользователя root, а другое для директории временных файлов.
Первой командой смены моды мы запрещаем доступ в директорию /root для всех, кроме владельца — то же самое нам надо будет потом сделать для домашних директорий остальных пользователей. Второй командой смены моды мы позволяем всем пользователям записывать и читать файлы в и из директорий /tmp и /var/tmp, но они не смогут удалять оттуда файлы других пользователей. Последнее достигается установкой “бита прикрепления” - старшего бита в битовой маске 1777.
Мы создаём наше дерево каталогов совместимым со стандартом FHS (доступен на http://www.pathname.com/fhs/). Вместе с деревом директорий, созданным выше, этот стандарт обуславливает существование директорий /usr/local/games и /usr/share/games. Мы не рекомендуем их для базовой системы, хотя Вы можете создать систему полностью FHS-совместимой. Поскольку структура поддиректорий /usr/local/share не описана в стандарте FHS, то мы создаём её так, как надо нам.
Некоторые программы имеют встроенные пути к программам, которые пока не установлены. Чтобы обеспечить доступ к этим программам, мы создадим ссылки на них, которые пока заменят нам реальные файлы до их установки.
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
Нам понадобится установить специфичные для целевой системы флаги для компилятора и компоновщика:
export BUILD64="-mabi=64"
Для избежания ошибок в случае покидания сборки и последующего возвращения, мы экспортируем эти переменные для предупреждения любых проблем сборки в будущем:
echo export BUILD64=\""${BUILD64}\"" >> ~/.bash_profile
Для возможности регистрации в качестве пользователя root и для распознавания имени “root” нам необходимо создать соответствующие элементы в файлах /etc/passwd и /etc/group.
Создадим файл /etc/passwd запуском следующей команды:
cat > /etc/passwd << "EOF"
root:x:0:0:root:/root:/bin/bash
EOF
Пароль пользователя root (символ “x” заменяет его здесь) будет определён позднее.
Дополнительные пользователи, которых Вы можете захотеть добавить:
Может быть полезен для совместимости с настоящими приложениями
Он часто рекомендуется для использования с некоторыми непривилегированными ID пользователя/ID групы для запуска демонов, в порядке ограничения их доступа к системе
Использовался программами, использующими административные задачи
Используется программами для печати
Часто используется программами электронной почты
Часто используется для сетевых серверов новостей
Часто используется для копирования файлов между Unix серверами
Часто используется для возможности операторов системы получать доступ к системе
Обычно используется в качестве учётной записи, которая получает всю информацию о проблемах через почтовый сервер
Используется 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
Дополнительные группы, которые Вы можете захотеть добавить:
Всем пользователям в этой группе разрешено выполнять административные задачи
Эта группа имеет прямой доступ к консоли
Эта группа позволяет использовать CDRW накопитель
Используется MTA (Mail Transport Agents)
Используется серверами сетевых новостей
Используется пользователями для копирования между Unix машинами
GID по умолчанию, используемый shadow для новых пользователей
Это группа по умолчанию, используемая некоторыми программами, которые не требуют группу
Используется 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 записывает неправильые регистрации.
Подмонтируем правильные виртуальные файловые системы (ядра) в созданные директории:
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 — пока не был создан, но он пока не нужен для нормального монтирования файловых систем. Раз так, предупреждение может быть проигнорировано.
Эта глава собирает инструменты, необходимые для запуска тестов, содержащихся в пакетах. То eсть make check
Пакет Tcl содержит Tool Command Language (Инструмент Командого Языка).
Этот и следующие два (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
Пакет 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
Этот патч обновляет config.guess и config.sub для MIPS процессоров:
patch -Np1 -i ../expect-5.43.0-config_update-1.patch
Теперь подготавливаем Expect к компиляции:
./configure --prefix=/tools --with-tcl=/tools/lib \
--with-tclinclude=/tools/include
Описание параметров команды configure:
Это скажет скрипту конфигурации искать Tcl в нашей временной директории, а не в основной системе.
Это точно указывает Expect, где искать внутренние заголовки Tcl. Использование этой опции предотвращает состояния, когда configure выпадает, потому что не может автоматически определить положение директории исходников Tcl.
Собираем пакет:
make
Устанавливаем пакет:
make SCRIPTS="" install
Описание параметра команды make:
Этот параметр запускает установку без вспомогательных скриптов, которые не нужны.
File является утилитой для определения типа файла.
Этот патч обновляет config.guess и config.sub для MIPS процессоров:
patch -Np1 -i ../file-4.17-config_update-1.patch
Подготавливаем File к компиляции:
./configure --prefix=/tools
Компилируем пакет:
make
В этом пакете тестов нет.
Устанавливаем пакет:
make install
Теперь мы создадим символическую ссылку, так что тесты GCC смогут использовать file:
ln -sv /tools/bin/file /usr/bin
Детальная информация о пакете находится в Разделе 10.30.2, “Описание File.”
Пакет DejaGnu содержит основы для тестирования других программ.
Подготавливаем DejaGNU к компиляции:
./configure --prefix=/tools
Собираем и инсталируем пакет:
make install
Пакет Tree содержит программу, выводящую структуру директории в графическом формате "дерева". Он используется Udev для сообщений об ошибках в его тестах.
Компилируем пакет:
make
Устанавливаем пакет:
make prefix=/tools install
Описание параметров команды make:
Это заменяет префикс по умолчанию /usr/local в файле Makefile.
В этой главе мы войдём в фазу сборки и начнём серьёзно собирать нашу СLFS систему. Установка программ строго последовательная. Хотя в большинстве случаев инструкции по установке могут быть сделаны короче и более общими, мы их оптимизировали для предоставления полных инструкций для каждого пакета для уменьшения вероятности ошибки. Ключом к пониманию того, что делает рабочая Линукс система есть знание того, для чего нужен каждый пакет и зачем он нужен пользователю или системе. Для каждого установленного пакета приводится информация о том, что входит в пакеты, краткое описание каждой программы и библиотеки.
Если в этой главе Вы решите использовать оптимизацию компилятора,то Вам стоит посмотреть справку по оптимизации на http://www.linuxfromscratch.org/hints/downloads/files/optimization.txt. Оптимизация компилятора может сделать программы быстрее, но могут возникнуть сложности при компилировании и некоторые проблемы при работе этих программ. Если пакет отказывается компилироваться при использовании оптимизации, то попробуйте скомпилировать пакет без неё, возможно проблемы исчезнут. Если пакет компилируется с использованием оптимизации, то есть возможность, что он скомпилируется некорректно, например могут появиться проблемы между интерактивностью в коде и собранными инструментами. В общем, использование оптимизации при сборке является рискованным. Также отметьте, что опции -march и -mtune могут привести к проблемам с пакетами Binutils, GCC и Glibc. Небольшой потенциал от выгоды применения оптимизации компилятора часто перевешивается риском. Новичкам в CLFS рекомендуется собирать её без оптимизации. В Ваших силах сделать систему быстрой и стабильной одновременной.
Порядок установки пакетов в этой главе должен точно соблюдаться чтобы не было программ, случайно имеющих ссылку на путь в /tools, жёстко прописанный в них Для этого же не компилируйте пакеты параллельно. Параллельная сборка может показаться иногда выгодной (в особенности на многопроцессорных системах), но в результате у программ появится зависимость от инструментов из /tools и они не смогут работать, когда мы удалим эту директорию.
Для содержания в порядке установленных пакетов можно применять менеджеры пакетов. Для ознакомления с различными стилями менеджеров пакетов обратитесь к следующей странице.
Управление пакетами является часто запрашиваемым дополнением к книге CLFS. Менеджер пакетов позволяет отслеживать установку файлов, делая легким их удаление, и обновлять пакеты. И перед тем, как Вы начнёте радоваться, НЕТ — этот раздел ни рассказывает о каком-нибудь особенном менеджере пакетов, ни рекомендует. Здесь предоставляется обзор наиболее популярных способов и методов их работы. Наилучший для Вас менеджер пакетов может быть среди этих способов или может быть комбинацией из нескольких. Этот раздел коротко оговаривает проблемы, которые могут появиться при обновлении пакетов.
Некоторые основания, почему менеджеры пакетов не описаны в CLFS или BLFS:
Рассмотрение управления пакетами сфокусировано вокруг целей этой книги - обучению того, как строить Линукс систему.
Существует много решений по управлению пакетами, имеющие собственные преимущества и недостатки.
Существует несколько советов, написанных на тему управления пакетами. Посетите Подпроект советов для поиска подходящего для Вас варианта.
Менеджер пакетов делает обновление пакетов на более новую версию при её появлении. Обычно инструкции, описанные в книгах 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 для установки файлов. Последняя команда обычно безопаснее, если программа или библиотека уже загружена в память.
Следующее является общим в способах управления пакетами. Перед принятием решения о менеджере пакетов проведите поиск различных способов, особенно недостатков отдельных схем.
Да, это техника управления пакетами. Некоторые люди не видят необходимости в управлении пакетами потому, что они лично знают пакеты и знают, какие файлы установлены каждым пакетом. Некоторые пользователи также не нуждаются в любом управлении пакетами потому, что они планируют пересборку целой системы при изменении пакета.
Это простейшее управление пакетами, которое не требует дополнительных пакетов для управления установкой. Каждый пакет устанавливается в отдельную директорию. Например, пакет 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. Для более чем нескольких пакетов такая схема становится неуправляемой.
Это вариация предыдущей техники управления пакетами. Каждый пакет установлен аналогично предыдущей схеме. При этом он установлен, делая ссылку на каждый файл в иерархию /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.
При такой технике перед установкой пакета создаётся файл и отмечается время его создания. После установки пакета простое использование команды find с соответствующими опциями может сгенерировать лог обо всех файлах, установленных после создания файла, отмеченного по времени. Менеджер пакетов, написанный с таким подходом - это install-log.
Хотя такая схема имеет преимущество простоты, она имеет два недостатка. Если во время установки файлы установлены с другой отметкой по времени, не соответствующей текущему времени, то они не будут отслежены менеджером пакетов. Также эта схема может быть использована только тогда, когда за одно время установлен один пакет. Логи не надёжны, если два пакета были установлены на двух различных консолях.
При таком подходе библиотека перед установкой предзагружается. В течении установки эта библиотека отслеживает пакеты, которые были установлены, присоединением себя к различным исполняемым файлам, таким как cp, install, mv и отслеживает системные вызовы, изменяющие файловую систему. Для работы такого метода, все исполняемые файлы должны быть скомпонованы динамически без битов suid или sgid. Предзагрузка библиотеки может означать некоторые нежелательные эффекты во время установки. Чтобы убедиться, что менеджер пакетов ничего не портит и отчитывается о всех соответствующих файлах выполните некоторые тесты.
При такой схеме установка пакета перенаправляется в отдельное дерево, как описано в методе управления пакетами, основанном на ссылках. После установки создаётся архив пакета, использующий установленные файлы. Этот архив затем используется для установки пакета как на текущую машину, так и может быть установлен на другую.
Такой метод используется в большинстве менеджеров пакетов, находящихся в комерческих дистрибутивах. Примеры менеджеров пакетов, соответствующих этому методу, это RPM (который в данном случае требуется Linux Standard Base Specification), pkg-utils, apt Debian-а и система портежей Gentoo. Совет по адаптации такого стиля управления пакетами для LFS систем находится на http://www.linuxfromscratch.org/hints/downloads/files//fakeroot.txt.
Во время сборки финальной системы Вы больше не кросскомпилируете, поэтому возможно запускать тесты пакетов. Некоторые тесты более важные чем другие. Например, тесты для основных пакетов — 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/ для проверки, ожидаются ли эти ошибки. Этот сайт имеет силу для всех тестов из этой книги.
Пакет Perl содержит язык практичной обработки и отчётов (Practical Extraction and Report Language).
Сначала адаптируем некоторые жёстко прописанные пути в библиотеке 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:
Это говорит 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.”
Пакет Linux Headers содержит “осмысленные” заголовки ядра.
В течении многих лет было очень практично использовать “сырые” заголовки ядра (прямо из тарбола ядра) в /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-mips /usr/include/asm
Пакет Man-pages содержит более 1200 man-страниц.
Установим Man-pages запуском:
make install
Glibc является библиотекой C, которая обеспечивает системные вызовы и основные функции, такие как open, malloc, printf и т.д. Библиотека C используется для всех динамически скомпонованых программ.
Некоторые пакеты вне CLFS допускают установку GNU libiconv для преобразования данных из одной кодировки в другую. Домашняя страница проекта (http://www.gnu.org/software/libiconv/) говорит “Эта библиотека предоставляет реализацию iconv() для использования на системах, которые её не имеют, или те реализации не могут преобразовывать из/в Unicode”. Glibc предоставляет реализацию iconv() и может преобразовывать из/в Unicode, хотя libiconv не требуется в системе CLFS.
Система сборки Glibc является весьма самодостаточной и должна установится корректно, даже если Ваши spec файл и компоновщик находятся в /tools. Мы не можем установить spec и компоновщик перед установкой Glibc потому, что тест автоконфинурации Glibc даст фиктивные результаты и от этого зависит чистота сборки.
MIPS больше не поддерживается в базовом дереве Glibc, поэтому мы должы извлечь пакет glibc-ports-2.4 в нашу директорию glibc-2.4. Затем мы переместим порты в место, ожидаемое нашей сборкой и патчами:
tar -jxvf ../glibc-ports-2.4.tar.bz2
mv -v glibc-ports-2.4 ports
Следующий патч исправляет проблемы компоновки во время сборки Glibc на MIPS:
patch -Np1 -i ../glibc-2.4-mips_fixes-3.patch
Следующий патч исправит проблему, приводящую к падению localdef:
patch -Np1 -i ../glibc-2.4-localedef_segfault-1.patch
Следующий патч устраняет проблему с iconv:
patch -Np1 -i ../glibc-2.4-iconv_fix-1.patch
Документация по Glibc рекомендует собирать Glibc вне директории с исходниками, в отдельной директории для сборки:
mkdir -v ../glibc-build
cd ../glibc-build
Скажем Glibc устанавливать свои библиотеки в /lib:
echo "slibdir=/lib" >> configparms
Теперь мы укажем Glibc собираться как 64-бит вместо n32 по умолчанию при помощи следующей команды sed:
sed -i '/default) machine=/s/n32/64/g' \
ports/sysdeps/mips/preconfigure
Подготавливаем Glibc к компиляции:
../glibc-2.4/configure --prefix=/usr \
--disable-profile --enable-add-ons --enable-kernel=2.6.0 \
--libexecdir=/usr/lib/glibc --libdir=/usr/lib
Описание нового параметра команды configure:
Изменяет место установки программы 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. Здесь приведён список большинства известных общих проблем:
Тесты Glibc сильно зависят от некоторых функций хост системы, в особенности ядра. Тест posix/annexc обычно выпадает и Вы должны увидеть в выводе Error 1 (ignored). Кроме этого, ожидается, что тест Glibc проходит. Хотя в некоторых случаях некоторые ошибки неизбежны. Если тест выпадает из-за отсутствия программы (или отсутствия символической ссылки) или выдаёт ошибку сегментации, то Вы увидите код ошибки больше чем 127, а детали будут в логе. Хуже, когда тесты будут выпадать с Error 2 - при этом содержание соответствующего .out файла может быть информативным, т.е. posix/annexc.out. Здесь приведён список большинства известных общих проблем:
Тест math иногда выпадает. Некоторые установки оптимизации являются известным фактором.
Если Ваш CLFS раздел примонтирован с опцией noatime, то тест atime выпадет. Как указано в Разделе 2.4, “Монтирование нового раздела”, не используйте опцию noatime во время сборки CLFS.
При запуске на старом и медленном оборудовании некоторые тесты могут выпадать, так как будут превышены временные параметры тестов.
На этапе установки Glibc может выдать предупреждение об отсутствии /etc/ld.so.conf. Упредим это сообщение:
touch /etc/ld.so.conf
Устанавливаем пакет:
make install
Локали различных языков, на которых могут осуществляться системные сообщения, не устанавливаются предыдущей командой. Установим их следующей командой:
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), которые не работают корректно в них. Некоторые попытки обойти эти ограничения описаны в интернационально-связанных заметках.
Нам нужно создать файл /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).
Объяснение опций команды cp:
Это необходимо для удаления существующей ссылки. Мы используем копию файла вместо ссылки в случае, если /usr находится на другом разделе. Также это нужно, например, когда Вы загружаетесь в однопользовательском режиме.
По умолчанию, динамический загрузчик (/lib/ld-linux.so.2) ищет динамические библиотеки, необходимые для программ, в /lib и /usr/lib. Таким образом, если есть директории с библиотеками, отличные от /lib и /usr/lib, то Вам надо указать их в файле /etc/ld.so.conf в порядке поиска их динамическим загрузчиком. Две наиболее распространённые директории с дополнительными библиотеками находятся в /usr/local/lib и /opt/lib, и мы добавим их в путь поиска динамического загрузчика.
Создадим новый файл /etc/ld.so.conf запуском команды:
cat > /etc/ld.so.conf << "EOF"
# Begin /etc/ld.so.conf
/usr/local/lib
/opt/lib
# End /etc/ld.so.conf
EOF
Сейчас мы изменим файл specs GCC чтобы он указывал на новый динамический компоновщик. Это выполнит команда perl:
gcc -dumpspecs | \
perl -p -e 's@/tools/lib/ld@/lib/ld@g;' \
-e 's@/tools/lib32/ld@/lib32/ld@g;' \
-e 's@/tools/lib64/ld@/lib64/ld@g;' \
-e 's@\*startfile_prefix_spec:\n@$_/usr/lib/ @g;' > \
$(dirname $(gcc --print-libgcc-file-name))/specs
После этого также неплохо было бы визуально проверить spec файлы, чтобы убедиться в сделанных изменениях.
Заметьте, что /lib, /lib32 или /lib64 не являются префиксом нашего динамического компоновщика.
На этом месте необходимо остановиться и убедиться, что основные функции (компиляция и компоновка) новых инструментов работают корректно. Так как мы делаем только 64 битную сборку, то мы протестируем только 64 битное ABI. Для этого есть простой тест:
echo 'main(){}' > dummy.c
cc dummy.c
readelf -l a.out | grep ': /lib'
Если всё в порядке, то не будет ошибок и в выводе Вы увидите:
[Requesting program interpreter: /lib/ld.so.1]
Заметьте, что /lib теперь является префиксом нашего компоновщика.
Если эта надпись вообще не появилась или появилась другая, то что-то сильно не так. Вам надо исследовать и повторить все пройденные шаги, чтобы найти в чём проблема и устранить её. Точки для возврата после этого места уже не будет. Как правило, что-то не так бывает с вышеописанной правкой specs-фала. Любые проблемы необходимо устранить перед продолжением процесса.
Если всё прошло нормально, то можно удалить тестовые файлы:
rm -v dummy.c a.out
Пакет 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 --disable-multilib --enable-64-bit-bfd
Компилируем пакет:
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 (директория, в которой окончательно размещаются бинарники) устанавливается на $(exec_prefix)/$(target_alias). Так как у нас собственная система, то эта директория в /usr не требуется.
Тестирование Binutils на этом этапе является критичным. Не пропускайте его.
Протестируем результаты:
make check
Устанавливаем пакет:
make tooldir=/usr install
Установим заголовки libiberty, которые нужны для некоторых пакетов:
cp -v ../binutils-2.17/include/libiberty.h /usr/include
Пакет GCC содержит коллекцию компилятора GNU, включая компиляторы C и C++.
Следующий патч исправляет поиск мультибиблиотечных директорий для файла specs. Патч стандартизирует путь драйверов функций итераци gcc, подтверждая, что мультибиблиотечные директории ищутся в корректном порядке. Это исправляет различные проблемы, большинство из которых отмечены с libtool на мультибиблиотечных системах:
patch -Np1 -i ../gcc-4.1.1-PR20425-1.patch
Применим следующий патч, чтобы GCC компоновался с /lib64 вместо /lib.
patch -Np1 -i ../gcc-4.1.1-pure64-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 --with-abi=64 \
--enable-clocale=gnu --enable-languages=c,c++ --disable-libstdcxx-pch \
--disable-multilib
Компилируем пакет:
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
Пакет Coreutils содержит некоторые системные утилиты для показа и установки базовых системных характеристик.
Предупредим 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
Iana-Etc содержит данные для сетевых сервисов и протоколов.
Следующая команда преобразует сырые данные, предоставляемые IANA, в корректные форматы для файлов /etc/protocols и /etc/services:
make
В этом пакете тестов нет.
Устанавливаем пакет:
make install
Пакет M4 является макро процессором.
Подготавливаем M4 к компиляции:
./configure --prefix=/usr
Компилируем пакет:
make
Для проверки результата выполним: make check.
Устанавливаем пакет:
make install
Bison является генератором парсеров.
Подготавливаем Bison к компиляции:
./configure --prefix=/usr
При конфигурировании системы bison собирается без поддержки интернационализации сообщений об ошибках если программа bison не находится в переменной $PATH. Следующее дополнение исправит это:
echo '#define YYENABLE_NLS 1' >> config.h
Компилируем пакет:
make
Для проверки результата выполним: make check.
Устанавливаем пакет:
make install
Пакет 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
Пакет Procps содержит программы для мониторинга системных процессов.
Компилируем пакет:
make
В этом пакете тестов нет.
Устанавливаем пакет:
make install
Sed является потоковым редактором.
Подготавливаем Sed к компиляции:
./configure --prefix=/usr --bindir=/bin --enable-html
Описание нового параметра команды configure:
Эта опция говорит Sed собрать и установить его HTML документацию.
Компилируем пакет:
make
Для проверки результата выполним: make check.
Устанавливаем пакет:
make install
GNU libtool является общей библиотекой поддержки скриптов. Libtool скрывает сложность использования системных библиотек, обеспечивая совместимый, портируемый интерфейс.
Подготавливаем Libtool к компиляции:
./configure --prefix=/usr
Компилируем пакет:
make
Для проверки результата выполним: make check.
Устанавливаем пакет:
make install
Пакет 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
Пакет Iproute2 содержит программы для базовой и расширенной IPV4 сети.
Бинарник 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:
Будем устанавливать бинарники Iproute2 в /sbin. Это корректное положение согласно требованиям FHS, потому что некоторые из бинарников Iproute2 используются в загрузочных скриптах.
В этом пакете тестов нет.
Устанавливаем пакет:
make SBINDIR=/sbin install
Пакет Perl содержит язык практичной обработки и отчётов (Practical Extraction and Report Language).
Следующая команда 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:
Корректирует ошибку в коде perldoc, связанную с работой программы less.
Пока Groff не установлен, configure.gnu думает, что мы не хотим устанавливать страницы man для Perl. Применение этих параметров изменит это предположение.
Это говорит Perl использовать нити.
Компилируем пакет:
make
Для проверки результата выполним: make test.
Устанавливаем пакет:
make install
Пакет Readline содержит библиотеку командной строки, поддерживающую редактирование и возможности истории.
Следующий патч содержит обновления от разработчиков. Разработчики Readline выпускают эти патчи для исправления серьёзных проблем.
patch -Np1 -i ../readline-5.1-fixes-3.patch
Подготавливаем Readline к компиляции:
./configure --prefix=/usr --libdir=/lib
Компилируем пакет:
make SHLIB_XLDFLAGS=-lncurses
Описание параметра команды make:
Этот флаг заставляет 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
Пакет 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
Пакет Autoconf создаёт shell скрипты, которые автоматически конфигурируют исходный код.
Подготавливаем Autoconf к компиляции:
./configure --prefix=/usr
Компилируем пакет:
make
Для проверки результата выполним: make check. 2 теста, которые используют Automake, пропускаются. Для охвата всего теста Autoconf может быть протестирован после установки Automake.
Устанавливаем пакет:
make install
Automake генерирует файлы Makefile, предназначенные для использования Autoconf.
Подготавливаем Automake к компиляции:
./configure --prefix=/usr
Компилируем пакет:
make
Для проверки результата выполним: make check.
Устанавливаем пакет:
make install
Bash - это Bourne-Again SHell.
Если Вы скачали тарболл документации 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:
Эта опция говорит Bash испоьзовать библиотеку readline, которая уже установлена в системе и лучше, чем встроенная версия readline.
Компилируем пакет:
make
Для проверки результата выполним: make tests.
Устанавливаем пакет:
make install
Запустим только что установленную программу bash, заменив уже запущенную:
exec /bin/bash --login +h
Использованы параметры для создания процесса bash с интерактивной регистрацией оболочки, так что новые программы обнаруживаются и становятся доступными.
Bzip2 является блочным файловым архиватором, который, как правило, сжимает лучше традиционного gzip.
Применим патч для установки документации для этого пакета:
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
Программы из этого пакета показывают различия между двумя файлами или директориями.
Подготавливаем Diffutils к компиляции:
./configure --prefix=/usr
Компилируем пакет:
make
В этом пакете тестов нет.
Устанавливаем пакет:
make install
E2fsprogs содержит ряд системных утилит для поддержки файловой системы ext2. Они также поддерживают журналируемую файловую систему ext3.
Рекомендуется собирать E2fsprogs вне директории с исходниками:
mkdir -v build
cd build
Подготавливаем E2fsprogs к компиляции:
../configure --prefix=/usr --with-root-prefix="" \
--enable-elf-shlibs --disable-evms
Описание параметров команды configure:
Определённые программы (такие как программа e2fsck) рассматриваются как необходимые программы. Например, когда раздел /usr не примонтирован, эти программы не будут доступны. Они должны находится в таких директориях как /lib и /sbin. Если этот параметр пропущен при конфигурации E2fsprogs, то программы разместятся в директории /usr, что нам не нужно..
Создаёт разделяемую библиотеку для использования некоторыми программами из этого пакета.
Отключает сборку плагина Enterprise Volume Management System (EVMS). Этот плагин не обновляется с последними внутренними EVMS интерфейсами и EVMS не инсталируется как часть базовой системы LFS, поэтому плагин не требуется. Смотрите EVMS сайт на http://evms.sourceforge.net/ для большей информации о EVMS.
Компилируем пакет:
make
Для проверки результата выполним: make check.
Установим бинарники и документацию:
make install
Установим разделяемые библиотеки:
make install-libs
File является утилитой для определения типа файла.
Этот патч обновляет config.guess и config.sub для MIPS процессоров:
patch -Np1 -i ../file-4.17-config_update-1.patch
Подготавливаем File к компиляции:
./configure --prefix=/usr
Компилируем пакет:
make
В этом пакете тестов нет.
Устанавливаем пакет:
make install
Пакет Findutils содержит программы для поиска файлов, в том числе "на лету" (путём рекурсивного поиска от директории и показывая только файлы, удовлетворяющие параметрам поиска) или поиск через бызу данных.
Подготавливаем Findutils к компиляции:
./configure --prefix=/usr --libexecdir=/usr/lib/locate \
--localstatedir=/var/lib/locate
Описание параметров команды configure:
Эта опция изменяет положение базы данных 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
Gawk является вариантом awk, который используется для манипуляций с текстовыми файлами.
Устраним проблему, приводящую к выпадению при запуске на несуществующих файлах:
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
Пакет Gettext используется для интернационализации и локализации. Программы могут быть скомпилированы с Поддержкой Родного Языка (Native Language Support - NLS) для получения возможности вывода сообщений на языке пользователя.
Подготавливаем Gettext к компиляции:
./configure --prefix=/usr
Компилируем пакет:
make
Для проверки результата выполним: make check.
Устанавливаем пакет:
make install
Grep является программой для поиска в содержимом файлов.
Этот патч обновляет config.guess и config.sub для MIPS процессоров:
patch -Np1 -i ../grep-2.5.1a-config_update-1.patch
Подготавливаем Grep к компиляции:
./configure --prefix=/usr --bindir=/bin
Компилируем пакет:
make
Для проверки результата выполним: make check.
Устанавливаем пакет:
make install
Пакет 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
Пакет 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
Пакет 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:
Этот параметр запрещает inetutils установку программы ведения логов, которая использует скрипты для отправки сообщений System Log Daemon. Мы не устанавливаем его потому, что Util-linux установит потом лучшую версию этой программы.
Этот параметр запрещет inetutils установку System Log Daemon, который мы установим с пакетом Sysklogd.
Этот параметр отключает сборку клиента whois, который является сильно устаревшим. Инструкции по установке лучшей версии клиента whois Вы найдете в книге BLFS.
Этот параметр отключит установку ряда сетевых серверов как части пакета Inetutils. Эти серверы не нужны на простой CLFS системе. Некоторые из них являются небезопасными и могут быть запущеными только в доверенной сети. Более полную информацию можно получить на http://www.linuxfromscratch.org/blfs/view/svn/basicnet/inetutils.html. Заметьте, что есть лучшие альтернативы для многих из этих серверов.
Компилируем пакет:
make
В этом пакете тестов нет.
Устанавливаем пакет:
make install
Переместим программу ping в FHS-совместимое место:
mv -v /usr/bin/ping /bin
Пакет Kbd содержит файлы раскладок клавиатуры и утилиты для них.
Следующий патч устраняет проблему сборки с GCC 4.1.1:
patch -Np1 -i ../kbd-1.12-gcc4_fixes-1.patch
Подготавливаем Kbd к компиляции:
./configure --datadir=/lib/kbd
Описание параметров команды configure:
Эта опция размещает данные Kbd и файлы раскладок клавиатуры в /lib/kbd так как они используются некоторыми скриптами из пакета CLFS-Bootscripts и должны находиться на корневом разделе.
Компилируем пакет:
make
В этом пакете тестов нет.
Устанавливаем пакет:
make install
Некоторые программы из Kbd используются скриптами из пакета CLFS-Bootscripts. Так как директория /usr может быть недоступна на ранних этапах загрузки, то эти бинарники должны быть на корневом разделе:
mv -v /usr/bin/{kbd_mode,openvt,setfont} /bin
Less является просмотрщиком текстовых файлов.
Подготавливаем Less к компиляции:
./configure --prefix=/usr --sysconfdir=/etc
Описание параметра команды configure:
Этот параметр укажет, что надо создавать программы с файлами конфигурации в /etc.
Компилируем пакет:
make
В этом пакете тестов нет.
Устанавливаем пакет:
make install
Перемещаем less в /bin:
mv -v /usr/bin/less /bin
Пакет Make содержит программу для компиляции приложений.
Подготавливаем Make к компиляции:
./configure --prefix=/usr
Компилируем пакет:
make
Для проверки результата выполним: make check.
Устанавливаем пакет:
make install
Man является просмотрщиком 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:
Программа 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.
Пакет Mktemp содержит программы создания безопасных временных файлов в шелл-скриптах.
Многие скрипты всё ещё используют программу tempfile, которая функционально похожа на mktemp. Пропатчим Mktemp для включения оболочки tempfile:
patch -Np1 -i ../mktemp-1.5-add_tempfile-3.patch
Файлы configure в этом пакете не признаются всеми машинами, поддерживаемыми CLFS. Этот патч обновляет config.guess и config.sub для других процессоров:
patch -Np1 -i ../mktemp-1.5-config_update-1.patch
Подготавливаем Mktemp к компиляции:
./configure --prefix=/usr --with-libc
Описание параметра команды configure:
Это говорит программе mktemp использовать системные функции библиотеки С mkstemp и mkdtemp.
Компилируем пакет:
make
В этом пакете тестов нет.
Устанавливаем пакет:
make install
make install-tempfile
Пакет Module-Init-Tools содержит программы для поддержки модулей ядра в ядрах Linux с версией 2.5.47 или выше.
Этот патч обновляет config.guess и config.sub для MIPS процессоров:
patch -Np1 -i ../module-init-tools-3.2.2-config_update-1.patch
Выполните следующие команды для выполнения тестов (заметьте, что команда make distclean необходима для очистки дерева исходников):
CC="gcc ${BUILD64}" ./configure &&
make check &&
make distclean
Подготавливаем Module-Init-Tools к компиляции:
CC="gcc ${BUILD64}" ./configure --prefix="/" --enable-zlib
Описание параметров команды configure:
Это позволяет пакету Module-Init-Tools поддерживать сжатые модули ядра.
Компилируем пакет:
make
Устанавливаем пакет:
make INSTALL=install install
Описание параметра команды make:
Обычно команда make install не установит бинарники, если они уже установлены. Эта опция изменит такое поведение вызовом install вместо использования скрипта по умолчанию.
Пакет Patch содержит программу для модификации или создания файлов применением “patch-файла”, обычно созданного программой diff.
Подготавливаем Patch к компиляции:
./configure --prefix=/usr
Компилируем пакет:
make
В этом пакете тестов нет.
Устанавливаем пакет:
make install
Пакет Psmisc содержит программы для отображения информации о процессах.
Подготавливаем Psmisc к компиляции:
./configure --prefix=/usr --exec-prefix=""
Описание параметра команды configure:
Это необходимо для установки бинарников в /bin вместо /usr/bin. Поскольку программы Psmisc часто используются в загрузочных скриптах, то они должны быть доступны даже при недоступной файловой системе.
Компилируем пакет:
make
В этом пакете тестов нет.
Устанавливаем пакет:
make install
Нет смысла для переноса программ pstree и pstree.x11 в /bin. Напротив, перенесём их в /usr/bin:
mv -v /bin/pstree* /usr/bin
По умолчанию программа pidof не устанавливается. Обычно это не является проблемой, поскольку устанавливаемый позже пакет Sysvinit содержит лучший вариант программы pidof. Но если Вы не собираетесь использовать Sysvinit, то Вам стоит завершить установку Psmisc созданием следующей ссылки:
ln -sv killall /bin/pidof
Пакет Shadow содержит программы для усиления безопасности системных паролей.
Если Вы захотите использовать усиленные пароли, то обратитесь к http://www.linuxfromscratch.org/blfs/view/svn/postlfs/cracklib.html для установки Cracklib перед сборкой Shadow. Затем добавьте --with-libcrack в команду configure ниже.
Подготавливаем Shadow к компиляции:
./configure --libdir=/lib --sysconfdir=/etc --enable-shared \
--without-libpam --without-audit --without-selinux
Описание параметров команды configure:
Говорит Shadow устанавливать свои файлы конфигурации в /etc, а не в /usr/etc.
Поддержка для Linux-PAM в Shadow включена по умолчанию, хотя PAM не установлен в базовой CLFS системе, поэтому этот ключ отключает поддержку PAM в Shadow. За инструкциями по установке PAM и компоновке с ним Shadow обратитесь в http://www.linuxfromscratch.org/blfs/view/svn/postlfs/shadow.html.
Поддержка проверок включена по умолчанию но необходимая библиотека не установлена в базовой CLFS системе. Этот ключ отключает поддержку проверок.
Поддержка selinux включена по умолчанию но selinux не собран в базовой CLFS системе и configure без этого ключа будет выпадать.
Отключим установку программы groups и её man страниц, так как Coreutils предоставляет лучшую версию:
sed -i 's/groups$(EXEEXT) //' src/Makefile
sed -i '/groups/d' man/Makefile
Компилируем пакет:
make
В этом пакете тестов нет.
Устанавливаем пакет:
make install
Вместо использования по умолчанию метода crypt, используем более защищённый метод шифрования паролей MD5, который также допускает использование паролей длинной более 8 символов. Также необходимо изменить положение пользовательских почтовых ящиков на /var/spool/mail, которое Shadow устанавливает по умолчанию в /var/mail. Мы сделаем это, проведя следующие изменения конфигурационного файла:
sed -i /etc/login.defs \
-e 's@#MD5_CRYPT_ENAB.no@MD5_CRYPT_ENAB yes@' \
-e 's@/var/spool/mail@/var/mail@'
Если Вы собрали Shadow с поддержкой Cracklib, выполните следующую замену sed для исправления пути к словарю Cracklib:
sed -i 's@DICTPATH.*@DICTPATH\t/lib/cracklib/pw_dict@' /etc/login.defs
Переместим программу passwd в более правильное место:
mv -v /usr/bin/passwd /bin
Переместим динамические библиотеки в более предпочтительное место:
mv -v /lib/libshadow.*a /usr/lib
rm -v /lib/libshadow.so
ln -svf ../../lib/libshadow.so.0 /usr/lib/libshadow.so
Этот пакет содержит утилиты для модификации паролей пользователей, добавления или удаления пользователей и групп и тому подобные. Мы не собираемся объяснять здесь, что такое скрытие паролей (password shadowing). Полное объяснение можно найти в файле doc/HOWTO в распакованной директории с исходниками Shadow. Сдесь мы опишем только то, что Вам понадобится, если Вы захотите использовать поддержку Shadow: программы, которые должны проверять пароли (к примеру: xdm, демоны ftp, демоны pop3) должны будут компилироваться с поддержкой 'shadow-совместимости', что надо для использования работы со скрытыми паролями.
Для использования скрытых паролей запустите следующую команду:
pwconv
А для использования скрытых групп выполните:
grpconv
Для просмотра или изменения установок по умолчанию для учётных записей нового пользователя, которого Вы создали, можете отредактировать /etc/default/useradd. Для большей информации просмотрите man useradd или http://www.linuxfromscratch.org/blfs/view/svn/postlfs/skel.html.
Выберите пароль для пользователя root и установите его командой:
passwd root
Пакет Sysklogd содержит программы для записи системных сообщений в логи, например сообщений ядра.
Следующий патч устраняет различные проблемы, включая проблему сборки Sysklogd с ядрами Linux серии 2.6:
patch -Np1 -i ../sysklogd-1.4.1-fixes-1.patch
Компилируем пакет:
make
В этом пакете тестов нет.
Устанавливаем пакет:
make install
Создадим новый файл /etc/syslog.conf запуском команды:
cat > /etc/syslog.conf << "EOF"
# Begin /etc/syslog.conf
auth,authpriv.* -/var/log/auth.log
*.*;auth,authpriv.none -/var/log/sys.log
daemon.* -/var/log/daemon.log
kern.* -/var/log/kern.log
mail.* -/var/log/mail.log
user.* -/var/log/user.log
*.=info;*.=notice;*.=warn;\
auth,authpriv.none;\
cron,daemon.none;\
mail,news.none -/var/log/messages.log
*.emerg *
# log the bootscript output:
local2.* -/var/log/boot.log
# End /etc/syslog.conf
EOF
Пакет Sysvinit содержит пограммы для контроля загрузки, запуска и выключения всех других программ.
Когда изменяется уровень запуска (например, при выключении системы), init посылает сигналы TERM и KILL тем процессам, которые запустил сам init и которые не должны быть запущены на новом уровне запуска. Пока проходит этот процесс, init выводит сообщение, похожее на “Sending processes the TERM signal”, при этом кажется, что init отсылает эти сигналы всем работающим процессам. Чтобы не попасть в заблуждение, исправим это сообщение на “Sending processes started by init the TERM signal”:
sed -i 's@Sending processes@& started by init@g' \
src/init.c
Компилируем пакет:
make -C src clobber
make -C src
Устанавливаем пакет:
make -C src install
Создадим новый файл /etc/inittab запуском следующего:
cat > /etc/inittab << "EOF"
# Begin /etc/inittab
id:3:initdefault:
si::sysinit:/etc/rc.d/init.d/rc sysinit
l0:0:wait:/etc/rc.d/init.d/rc 0
l1:S1:wait:/etc/rc.d/init.d/rc 1
l2:2:wait:/etc/rc.d/init.d/rc 2
l3:3:wait:/etc/rc.d/init.d/rc 3
l4:4:wait:/etc/rc.d/init.d/rc 4
l5:5:wait:/etc/rc.d/init.d/rc 5
l6:6:wait:/etc/rc.d/init.d/rc 6
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
su:S016:once:/sbin/sulogin
# Remove this section if you System only
# has a console port
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
# Uncomment this section if your system has a console
# port
#c0:12345:respawn:/sbin/agetty 115200 ttyS0 vt100
# End /etc/inittab
EOF
Tar является программой архивирования.
Применим патч для устранения некоторых проблем с тестами при использовании GCC-4.1.1:
patch -Np1 -i ../tar-1.15.1-gcc4_fix_tests-1.patch
Таr имеет проблему при использовании опции -S с файлами более 4 Гб. Следующий патч устраняет эту проблему:
patch -Np1 -i ../tar-1.15.1-sparse_fix-1.patch
Этот патч устраняет проблему безопасности Tar:
patch -Np1 -i ../tar-1.15.1-security_fixes-1.patch
Подготавливаем Tar к компиляции:
./configure --prefix=/usr --bindir=/bin --libexecdir=/usr/sbin
Компилируем пакет:
make
Для проверки результата выполним: make check.
Устанавливаем пакет:
make install
Пакет Texinfo содержит программы, используемые для чтения, записи и конвертирования документов Info, которые содержат системную документацию.
Texinfo позволяет локальным пользователям перезаписывать произвольные файлы через ссылку, подключаемую через временные файлы. Применим следующий патч для устранения этого:
patch -Np1 -i ../texinfo-4.8-tempfile_fix-2.patch
Подготавливаем Texinfo к компиляции:
./configure --prefix=/usr
Компилируем пакет:
make
Для проверки результата выполним: make check.
Устанавливаем пакет:
make install
Система документации Info использует обычный текстовый файл для своего списка меню. Файл расположен в /usr/share/info/dir. Из-за случайных проблем в мэйкфайлах некоторых пакетов это может иногда привести к выходу в систему на этапе установки Info-документации. Если файл /usr/share/info/dir всегда требует обновления, следующие опциональные команды выполнят задачу:
cd /usr/share/info
rm dir
for f in *
do install-info $f dir 2>/dev/null
done
Пакет Udev содержит программы для динамического создания нод устройств.
Компилируем пакет:
make EXTRAS="extras/floppy extras/cdrom_id extras/firmware \
extras/scsi_id extras/volume_id extras/ata_id extras/usb_id \
extras/edd_id extras/dasd_id extras/path_id"
Описание параметра команды make:
Это собирает вспомагательные приложения, используемые с udev. Эти вспомагательные программы помагают в правильной поддержке устройств.
Если Вы хотите запустить тест, то Вам необходимо изменить жёстко прописанные ссылки на программу test:
sed -i 's@/usr/bin/test@/bin/test@' test/udev-test.pl
Для проверки результата выполним: make test.
Устанавливаем пакет:
make DESTDIR=/ \
EXTRAS="extras/floppy extras/cdrom_id extras/firmware \
extras/scsi_id extras/volume_id extras/ata_id extras/usb_id \
extras/edd_id extras/dasd_id extras/path_id" install
Описание параметра команды make:
Это предостережёт процессы сборки Udev от остановки любых процессов udevd, которые могут быть запущены в системе.
Установим необходимые вспомогательные скрипты.
install -v extras/eventrecorder.sh /lib/udev
Установим документацию, которая объясняет создание правил Udev:
install -v -m644 -D docs/writing_udev_rules/index.html \
/usr/share/doc/udev-096/index.html
Создадим директорию для сохранения драйверов, которые могут загружаться udev:
install -dv /lib/firmware
Пакет Util-linux содержит ряд различных утилит. Некоторые из этих утилит используются для монтирования, размонтирования, форматирования, разбиения и обслуживания дисков, открытия портов tty и вызова сообщений ядра.
FHS рекомендует использовать директорию /var/lib/hwclock вместо обычной /etc в качестве места для расположения файла adjtime. Для обеспечения FHS-совместимости программы hwclock, выполним следующее:
sed -i 's@etc/adjtime@var/lib/hwclock/adjtime@g' \
hwclock/hwclock.c
mkdir -pv /var/lib/hwclock
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 имеет ощибку компилирования при сборке с 64 битами и на MIPS процессоре. Следующий патч устраняет эту проблему:
patch -Np1 -i ../util-linux-2.12r-mips64_fix-1.patch
Подготавливаем Util-linux к компиляции:
CC="gcc ${BUILD64}" ./configure
Компилируем пакет:
make HAVE_KILL=yes HAVE_SLN=yes
Описание параметров команды make:
Это предостережёт программу kill (уже установленную с Procps) от повторной сборки.
Это предостережёт программу sln (статически скомпонованный ln, уже установленный с Glibc) от повторной сборки.
В этом пакете тестов нет.
Установим пакет и переместим бинарник logger в /bin, так как это необходимо для пакета CLFS-Bootscripts:
make HAVE_KILL=yes HAVE_SLN=yes install
mv -v /usr/bin/logger /bin
Пакет Vim содержит мощный текстовый редактор.
Если Вы предпочитаете другие редакторы — такие как Emacs, Joe или Nano — загляните на http://www.linuxfromscratch.org/blfs/view/svn/postlfs/editors.html для получения инструкций по установке.
Сначала распакуем оба архива vim-7.0.tar.bz2 и (опционально) vim-7.0-lang.tar.gz в одну и ту же директорию.
Следующий патч содержит обновления от разработчиков. Разработчик Vim выпускает эти патчи только для устранения серьёзных проблем.
patch -Np1 -i ../vim-7.0-fixes-5.patch
Изменим положение по умолчанию для файла конфигурации vimrc на /etc:
echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h
Подготавливаем Vim к компиляции:
./configure --prefix=/usr --enable-multibyte
Описание параметров команды configure:
Этот опциональный, но очень рекомендуемый ключ включает поддержку дополнений для редактирования файлов в мультибайтных кодировках символов. Это необходимо при использовании локалей с мультибайтными кодировками символов. Этот ключ также полезен для возможности редактирования текстовых файлов, изначально созданных в таких дистрибутивах Linux, как Fedora Core, который использует UTF-8 в качестве основной кодировки символов.
Компилируем пакет:
make
Для проверки результата выполним: make test. Этот тест выводит на экран большое количество хаотических символов, которые могут означать проблему с установками текущего терминала. Однако, запуск теста здесь является опциональным.
Устанавливаем пакет:
make install
Многие пользователи используют vi вместо vim. Некоторые программы, например vigr и vipw, также используют vi. Для возможности запуска vim, когда пользователи по привычке вводят vi, создадим ссылку:
ln -sv vim /usr/bin/vi
По умолчанию документация Vim установлена в /usr/share/vim. Следующая ссылка позволяет документации быть доступной через /usr/share/doc/vim-7.0. Сделаем её совместимой с положением документации для других пакетов:
ln -sv ../vim/vim70/doc /usr/share/doc/vim-7.0
Если Вы собираетесь устанавливать систему X Window, то надо будет перекомпилировать Vim после установки X. Vim содержит хорошую GUI версию редактора, который использует X и некоторые другие библиотеки при установке. Для более подробной информации прочитайте документацию по Vim и страницу по установке Vim в книге BLFS на http://www.linuxfromscratch.org/blfs/view/svn/postlfs/editors.html#postlfs-editors-vim.
По умолчанию vim запускается в режиме совместимости с vi. Это может быть новым для пользователей, которые пользовались другими редакторами в прошлом. Установка режима “несовместимости” включена ниже для выделения того факта, что будет использоваться новое поведениие редактора. Также напомним тем, кто захочет переключиться в режим “совместимости”, что это должно быть первой установкой в файле конфигурации. Так нужно, поскольку это изменяет другие установки и отмена должна следовать после этой установки. Создадим основной файл конфигурации vim, выполнив следующую команду:
cat > /etc/vimrc << "EOF"
" Begin /etc/vimrc
set nocompatible
set backspace=2
syntax on
if (&term == "iterm") || (&term == "putty")
set background=dark
endif
" End /etc/vimrc
EOF
Строка set nocompatible делает так, что vim ведёт себя более полезно (по умолчанию), чем в vi-совместимой манере. Удалите “no” для сохранения старого поведения vi. Строка set backspace=2 разрешает забой через конец строки, автоотступ и начало вставки. Строка syntax on включает подсветку синтаксиса vim. Наконец, секция if с set background=dark корректирует догадку vim о цвете заднего плана на некоторых эмуляторах терминала. Это даёт подсветку в лучшей цветовой схеме для использования с черным задним планом этих программ.
Документация о других доступных опциях может быть получена запуском следующей команды:
vim -c ':options'
Пакет Colo содержит загрузчик Cobalt.
Этот патч обновляет загрузчик Colo для сборки на 64 битах:
patch -Np1 -i ../colo-1.21-make_fix-1.patch
Следующий патч исправляет ошибку при компоновке с Binutils:
patch -Np1 -i ../colo-1.21-relocation_fix-1.patch
Это загрузчик для MIPS основанных серверов cobalt RaQ, RaQ2, Qube или Qube2.
Скомпилируем пакет Colo:
make binary
make CC="gcc ${BUILD64}" tooldirs
Устанавливаем пакет:
install -dv /usr/lib/colo/examples
install -v chain/colo-chain.elf /usr/lib/colo
install -v tools/lcdtools/e2fsck-lcd/e2fsck-lcd /sbin
install -v tools/lcdtools/e2fsck-lcd/e2fsck-lcd.8 /usr/man/man8
install -v tools/lcdtools/paneld/paneld /sbin
install -v tools/lcdtools/paneld/paneld.8 /usr/man/man8
install -v tools/lcdtools/putlcd/putlcd /sbin
install -v tools/lcdtools/putlcd/putlcd.8 /usr/man/man8
install -v examples/menu.colo /usr/lib/colo/examples
install -v examples/simple.colo /usr/lib/colo/examples
cp -v chain/colo-chain.elf /boot/vmlinux
gzip -9 /boot/vmlinux
Пакет Dvhtool используется для манипулирования объёмом заголовков устройств, используя метки диска sgi.
Эта программа необходима для загрузчика Arcload, который применяется для рабочих станций и серверов SGI, основанных на MIPS процессорах.
Этот патч устраняет проблемы сборки с Dvhtool и добавляет поддержку для LVM и разделов Linux:
patch -Np1 -i ../dvhtool-1.0.1-fixes-1.patch
Подготавливаем Dvhtool к компиляции:
CC="gcc ${BUILD64}" ./configure --prefix=/usr
Компилируем пакет:
make
Устанавливаем пакет:
make install
Пакет Arcload содержит загрузчик SGI.
Эта программа являестя загрузчиком Arcload, который применяется для рабочих станций и серверов SGI, основанных на MIPS процессорах.
Компилируем пакет:
make MODE=M64 clean
make CC="gcc" LD="ld" MODE=M64
Устанавливаем пакет:
install -dv /usr/lib/arcload
cp -v arcload /usr/lib/arcload/sash64
Большинство программ и библиотек по умолчанию компилируются с символами отладки (с опцией -g для gcc). Это означает, что когда отлаживается программа или библиотека, которая была собрана с включением отладочной информации, то отладчик может передать Вам не только адреса в памяти, но и имена переменных и функций.
Исключение отладочных символов существенно уменьшает размер программы или библиотеки. Чтобы получить представление о том, сколько места занимает отладочная информация, посмотрите следующее:
бинарник bash с отладочными символами: 1200 KБ
бинарник bash без отладочных символов: 480 KБ
файлы Glibc и GCC (/lib и /usr/lib) с отладочными символами: 87 MБ
файлы Glibc и GCC без отладочных символов: 16 MБ
Размер может немного меняться в зависимости от используемых компилятора и библиотеки C. Но размер между программами и библиотеками, собранными с отладочной информацией и без таковой может различаться в 2-5 раз.
Большинство людей никогда не используют отладчик, и при удалении отладочных символов освободится довольно много места на диске. В следующей части будет показано, как удалить все отладочные символы из программ и библиотек. Дополнительная информация по оптимизации системы может быть найдена в http://www.linuxfromscratch.org/hints/downloads/files/optimization.txt.
Если предполагаемый пользователь не програмист и не планирует заниматься отладкой программ, то место, занимаемое системой, может быть уменьшено примерно на 200 MБ удалением отладочной информации из бинарников и библиотек.
Большинство людей, использующих команды, описанные ниже, не испытывают затруднений. Поскольку очень просто сделать опечатку и сделать новую систему непригодной, то перед запуском команды strip рекомендуется сделать резервную копию текущего состояния системы.
Перед выполнением сжатия обратите особое внимание на то, чтобы ни один из бинарников, которые будут сжаты, не были запущены. Если Вы не уверены, входил ли пользователь в chroot с командой, описанной в главе Если Вы решили использовать Chroot, сначала выйдите из chroot:
logout
Затем перезайдите:
chroot ${CLFS} /tools/bin/env -i \
HOME=/root TERM=${TERM} PS1='\u:\w\$ ' \
PATH=/bin:/usr/bin:/sbin:/usr/sbin \
/tools/bin/bash --login
Теперь бинарники и библиотеки могут быть безопасно сжаты:
/tools/bin/find /{,usr/}{bin,lib,sbin} -type f \
-exec /tools/bin/strip --strip-debug '{}' ';'
Большое число файлов будут сообщать о несоответствии их формата файла. Эти сообщения могут быть спокойно проигнорированы. Эти предупреждения показывают, что эти файлы являются скриптами, а не бинарниками.
Если дисковое пространство очень компактно, то опция --strip-all может быть использована на бинарниках в /{,usr/}{bin,sbin} для получения дополнительных свободных мегабайт. Не применяйте эту опцию на библиотеках — они будут разрушены.
Эта глава описывает установку системных загрузочных скриптов и их правильную настройку. Большинство этих скриптов будут работать без изменений, но некоторые требуют дополнительные файлы конфигурации, потому что они работают с аппаратно-зависимой информацией.
Стиль загрузочных скриптов System-V применяется в этой книге, так как он широко используется. Дополнительно есть совет, описывающий BSD-стиль загрузочных скриптов, который доступен на http://www.linuxfromscratch.org/hints/downloads/files/bsd-init.txt. Поиск в списках рассылки LFS для “depinit” также часто даёт дополнительный выбор.
Если Вы используете альтернативный стиль загрузочных скриптов, то пропустите эту главу и переходите к главе Обеспечение загрузки СLFS системы.
Пакет СLFS-Bootscripts содержит набор скриптов для запуска/остановки системы CLFS во время загрузки/выключения.
Устанавливаем пакет:
make install
Пакет Udev Cross-LFS rules содержит необходимый набор правил для начальной работы системы.
Устанавливаем пакет:
make install
Linux использует специальные средства загрузки, называемые SysVinit, которые основаны на концепции уровней запуска. Они могут сильно различаться от одной системы к другой и мы не можем сказать, что скрипты из <подставите сюда имя любого дистрибутива> будут работать на CLFS. У CLFS свой подход к этим скриптам, но они также соответствуют стандартам.
SysVinit (с этого момента мы будем называть его “init” работает, используя схему уровней запуска. Всего есть семь (от 0 до 6) уровней запуска (точнее, есть больше уровней запуска, но они предназначены для специальных целей и обычно не используются. Документация по init содержит более полную информацию по этому вопросу) и каждый из них сообщает компьютеру, что ему делать при запуске соответствующего уровня. Уровень запуска по умолчанию - 3. Вот описание разных уровней загрузки и их назначение:
0: выключение компьютера
1: однопользовательский режим
2: многопользовательский режим без поддержки сети
3: многопользовательский режим с поддержкой сети
4: зарезервирован или используется как 3
5: тоже самое, что и 4, но обычно для графического входа в систему (например xdm из
X-ов или kdm из KDE)
6: перезагрузка компьютера
Для изменения уровня запуска используется команда init [runlevel], где [runlevel] нужный уровень запуска. Например, для перезагрузки компьютера можно использовать команду init 6. Это и делает команда reboot, а команда halt является аналогом init 0.
Есть ряд директорий в /etc/rc.d, которые выглядят как rc?.d (где ? является уровнем запуска) и rcsysinit.d, которые содержат ряд символических ссылок. Часть из них начинается с K, другие начинаются с S, затем идут две цифры уровня инициализации. K означает остановку (kill) сервиса, а S - запуск (start). Цисло от 00 до 99 означает порядок, в котором запускаются скрипты; чем меньше номер, тем раньше вызывается скрипт. Когда init переключается на другой уровень загрузки, то одни сервисы останавливаются, другие запускаются.
Сами скрипты расположены в /etc/rc.d/init.d. Они проделывают всю работу, а ссылки только указывают на них. Ссылки остановки и запуска указывают на один и тот же скрипт в /etc/rc.d/init.d. Это возможно благодаря тому, что скрипты запукаются с различными параметрами, такими как start, stop, restart, reload и status. Когда обрабатывается ссылка К, то соответствующий скрипт вызывается с аргументом stop. Если же обрабатывается ссылка S, то скрипт вызывается с параметром start.
Но есть одно исключение. Ссылки, начинающиеся с S в директориях rc0.d и rc6.d вызываются только с параметром stop для остановки чего-либо. Это понятно, потому что когда Вы собираетесь перезагрузить или отключить систему, то Вам не надо ничего запускать, а только остановить систему.
Вот описание параметров, которые можно передавать скриптам запуска:
Запуск сервиса.
Остановка сервиса.
Сервис останавливается и запускается заново.
Это команда для обновления настроек сервиса. Она обычно вызывается после изменения конфигурационного файла скрипта, но сервису не нужно перезапускаться.
Показывает, запущен ли сервис и какой у него PID.
Вы спокойно можете настраивать и изменять процесс загрузки (после установки Вашей системы CLFS). Файлы, описываемые здесь, являются только примерами и, возможно, Вы сделаете их лучше.
В главе Установка основных системных программ мы установили пакет Udev. Сначала мы детально расмотрим, как это работает и короткую историю предыдущих методов поддержки устройств.
Системы Linux в основном традиционно используют метод создания статических устройств, из-за чего создаётся огромное количество нод устройств в директории /dev (иногда буквально сотни нод), не смотря на наличие соответствующих реальных аппаратных устройств. Это типично для работы скрипта MAKEDEV, который содержит большое количество вызовов к программе mknod с уместными старшими и младшими номерами устройств для каждого возможного устройства, которое может существовать в мире.
Используя метод udev, только те устройства, которые обнаружены ядром, получат ноды устройств, созданные для них. Поскольку эти ноды устройств будут создаваться при каждой загрузке системы, они будут сохраняться в tmpfs (файловой системе, которая размещается непосредственно в памяти и не занимает места на диске). Ноды устройств не требуют много места на диске, поэтому используемая ими память незначительна.
В феврале 2000 года новая файловая система, названная devfs, была добавлена в ядро 2.3.46 и стала доступной в стабильных ядрах серии 2.4. Хотя сама она присутствовала в исходниках ядра, метод динамического создания устройств никогда не получал подавляющую поддержку разработчиков ядра.
Основные проблемы к такому подходу, заимствованные devfs - это способ поддержки определения, создания и именования устройств. Возможно, последняя проблема именования нод устройств была более критичной. Обычно принималось, что имена устройств доступны для конфигурации, затем политика именования устройств должна быть передана системному администратору, не навязана ему любым разработчиком. Файловая система devfs также страдала от обстоятельств, связанных с её разработкой, и не могла быть исправлена без обоснования пересмотра ядра. Для неё также не хватало новых разработчиков.
С разработкой нестабильной ветки ядра 2.5, в конце выпущенной как серия 2.6 стабильных ядер, появилась новая виртуальная файловая система, названная sysfs. Работа sysfs - это экспорт видимой для процессов системной структуры в пространстве пользователя. С таким пространством пользователя замена devfs стала более реальной.
Файловая система sysfs была коротко упомянута выше. Одно может удивлять, как sysfs знала о присутствующих в системе устройствах и какие номера устройств должны быть использованы. Драйвера, которые были вкомпилированы прямо в ядро, регистрировали свои объекты при помощи sysfs, поскольку они определялись ядром. Для драйверов, скомпилированных в виде модулей это произойдёт после загрузки модулей. Как только файловая система sysfs примонтирована (в /sys), данные, встроеные в драйвера и зарегистрированные sysfs, становятся доступными для процессов пространства пользователя и для udev для создания нод устройств.
Стартовый скрипт S10udev заботится о создании этих нод устройств во время загрузки Linux. Скрипт сбрасывает обработчик событий с умолчального значения /sbin/hotplug. Это выполняется так как ядру больше не нужно вызывать внешний бинарник. Вместо этого udevd будет прослушивать сокет netlink насчёт событий, которые подымаются ядром. Затем стартовый скрипт копирует любые статические ноды устройств, которые находятся в /lib/udev/devices, в /dev. Это необходимо, так как некоторые устройства, директории и символические ссылки необходимы перед тем, как станут доступными процессы поддержки динамических устройств на начальных этапах загрузки системы. Создание статических нод устройств в /lib/udev/devices также предоставляет простое окружение для устройств, которые не поддерживаются инфраструктурой поддержки динамических устройств. Затем стартовый скрипт запускает демон Udev, udevd, который будет действовать на любые получаемые события. В конце стартовый скрипт заставляет ядро переигрывать события для любых устройств, которые уже зарегистрированы, а затем ожидает, когда udevd поддержит их.
Для получения правильных младшего и старшего номеров для устройства Udev обращается к информации, предоставляемой sysfs в /sys. Например, /sys/class/tty/vcs/dev содержит строку “7:0”. Эта строка используется udevd для созданиия ноды устройства со старшим номером 7 и младшим 0. Имена и права доступа нод, создаваемых в директории /dev, устанавливаются, используя правила, описанные в файлах в директории /etc/udev/rules.d/. Они пронумерованы в стиле, похожем на стартовые скрипты CLFS. Если udevd не может найти правила для создаваемых устройств, то по умолчанию будут установлены права доступа 660 и владелец root:root. Документация по синтаксису файла конфигурации правил Udev доступна в /usr/share/doc/udev-096/index.html.
Драйверы устройств, скомпилированные как модули, могут содержать псевдонимы, встроенные в них. Псевдонимы видны в выводе программы modinfo и обычно связаны с шинно-специфичными идентификаторами устройств, поддерживаемыми модулем. Например, драйвер snd-fm801 поддерживает PCI устройства с ID производителя 0x1319 и ID устройства 0x0801, и имеет псевдоним “pci:v00001319d00000801sv*sd*bc04sc01i*”. Для большинства устройств драйвер шины экспортирует псевдоним драйвера, который будет поддерживать устройство через sysfs. То есть, файл /sys/bus/pci/devices/0000:00:0d.0/modalias может содержать строку “pci:v00001319d00000801sv00001319sd00001319bc04sc01i00”. Правила, которые устанавливает CLFS, заставят udevd вызвать /sbin/modprobe с содержанием переменной окружения события MODALIAS (которая будет тем же, что и содержание файла modalias в sysfs), поэтому загружаются все модули, чьи псевдонимы соответствуют этой строке после маски расширения.
В этом примере это означает, что в дополнение к snd-fm801, будет загружен устаревший (и нежелательный) драйвер forte, если он доступен. Смотрите ниже описание путей, при которых загрузка нежелательных драйверов будет предотвращена.
Ядро само по требованию способно загрузить модули для сетевых протоколов, файловых систем и поддержки локализаций.
Есть несколько известных проблем при автоматическом создании нод устройств:
Udev будет загружать модуль, только если он имеет шинно-специфичный псевдоним и драйвер шины правильно экспортирует необходимые псевдонимы в sysfs. В других случаях, Udev произведёт загрузку модуля другими способами. С Linux-2.6.17.13, Udev загружает правильно написанные драйверы для устройств INPUT, IDE, PCI, USB, SCSI, SERIO и FireWire.
Чтобы определить, имеет ли требуемый драйвер устройства необходимую поддержку для Udev, запустите modinfo с именем модуля в качестве аргумента. Теперь попробуйте определить директорию устройства в /sys/bus и проверьте наличие в ней файла modalias.
Если файл modalias присутствует в sysfs, то драйвер поддерживает устройство и может общаться с ним напрямую, но не имеет псевдонима, это ошибка в драйвере. Загрузка драйвера из Udev без помощи и ожидание результата должно быть исправлено позже.
Если файла modalias нет в уместной директории в /sys/bus, то это означает, что разработчики ядра ещё не добавили поддержку modalias для этого типа шины. В Linux-2.6.17.13 это случай с шиной ISA. Исправление этой проблемы ожидается в следующих версиях ядра.
Udev вообще не подразумевал загрузку драйверов-“обёрток”, таких как snd-pcm-oss, и не-аппаратных драйверов, как loop.
Если модуль-“обёртка” только расширяет функциональность, предоставляемую некоторым другим модулем (т.е., snd-pcm-oss расширяет функциональность snd-pcm, делая звуковые карты доступными для приложений OSS), то настройте modprobe для загрузки обёртки после того, как Udev загрузит основной модуль. Это делается “установкой” строки в /etc/modprobe.conf. Например:
install snd-pcm /sbin/modprobe -i snd-pcm ; \
/sbin/modprobe snd-pcm-oss ; true
Если интересующий модуль не является обёрткой и полезен сам по себе, то настройте стартовый скрипт S05modules для загрузки этого модуля во время запуска системы. Чтобы это сделать, добавьте имя модуля в файл /etc/sysconfig/modules в отдельную строку. Это также работает с модулями-обёртками, но в этом случае не оптимально.
Одно из двух, или не собирайте модуль, или пометьте его в чёрном списке в файле /etc/modprobe.conf, как это выполнено с модулем forte в примере ниже:
blacklist forte
Такие модули могут быть загружены вручную при помощи команды modprobe.
Обычно это происходит если правило неожиданно подбирает устройство. Например, плохо написанное правило может противопоставить SCSI диск (как требовалось) и соответствующее обобщённое SCSI устройство (неправильно) по производителю. Найдите нарушенное правило и сделайте его более специфичным.
Это может быть другим проявлением предыдущей проблемы. Если это не так и Ваше правило использует атрибуты sysfs, то это может быть проблемой тайминга ядра, которая будет исправлена в следующих ядрах. Сейчас Вы можете обойти это созданием правила, которое ожидает использованного атрибута sysfs и добавляет его в файл /etc/udev/rules.d/10-wait_for_sysfs.rules. Пожалуйста, сообщите разработчикам CLFS если Вы сделали так и это помогло.
Дальнейший текст подразумевает, что драйвер собран статически в ядре или уже загружен как модуль и что Вы уже проверили, что Udev не создаёт неправильно именованные устройства.
Udev не имеет информацию, необходимую для создания ноды устройства если драйвер ядра не экспортирует свои данные в sysfs. Это встречается наиболее часто со сторонними драйверами, не входящими в дерево ядра. Создайте статическую ноду устройства в /lib/udev/devices с подходящими старшим/младшим номерами (смотрите файл devices.txt внутри документации ядра или в документации, предоставляемой производителем стороннего драйвера). Статическая нода устройства будет скопирована в /dev стартовым скриптом S10udev.
Это факт того, что Udev, по замыслу, поддерживает события и загружает модули параллельно и, таким образом, в непродиктованном порядке. Это никогда не будет “исправлено”. Вы не должны полагаться на стабильность имён устройств ядра. Вместо этого создайте свои собственные правила, которые делают символические ссылки со стабильными именами, основанными на некоторых стабильных атрибутах устройств, таких как серийный номер или вывод различных утилит *_id, установленных с Udev. Для примеров смотрите Разделе 11.13, “Создание специальных символических ссылок на устройства” и Разделе 11.14, “Настройка скрипта network”.
Дополнительная полезная документация доступна на следующих сайтах:
Скрипт setclock считывает время с внутренних часов Вашего компьютера, также известных как часы BIOS или CMOS. Если аппаратные часы установлены на UTC, то этот скрипт конвертирует время аппаратных часов в локальное время, используя файл /etc/localtime, (который говорит программе hwclock, в каком часовом поясе находится пользователь). Нет способа автоматического определения того, установленны ли внутренние часы Вашего компьютера в UTC или нет, поэтому нам надо будет это настроить самим.
Если Вы не помните, установлены ли аппаратные часы на время UTC, то определите это запуском команды hwclock --localtime --show. Это скажет, какое текущее время установлено относительно аппаратных часов. Если это время соответствует установленному на Ваших собственных часах, то аппаратные часы установлены на местное время. Если вывод hwclock показывает не местное время, то, скорее всего, это время UTC. Проверьте это добавлением или исключением правильного количесва часов для часового пояса в это время hwclock. Например, если Вы живёте в часовом поясе MST, который известен как GMT -0700, то добавте семь часов к местному времени.
Измените значение переменной UTC ниже на значение 0 (ноль), если аппаратные часы не установлены на время UTC.
Создадим новый файл /etc/sysconfig/clock запуском следующей команды:
cat > /etc/sysconfig/clock << "EOF"
# Begin /etc/sysconfig/clock
UTC=1
# End /etc/sysconfig/clock
EOF
Хорошие советы по настройке времени в системе CLFS находятся на http://www.linuxfromscratch.org/hints/downloads/files/time.txt. Они содержат информацию по временным зонам, UTC и переменной окружения TZ.
Этот раздел описывает настройку стартового скрипта console, который устанавливает раскладку клавиатуры и консольный шрифт. Если не-ASCII символы (британский фунт и символ Евро примеры не-ASCII символов) не будут использованы и используется клавиатура US, то можете пропустить этот раздел. Без файла конфигурации стартовый скрипт console не будет ничего делать.
Скрипт console использует /etc/sysconfig/console в качестве файла конфигурации. Решите, какой шрифт и раскладка клавиатуры будут использованы. Языково-специфичный HOWTO поможет в этом (смотрите http://www.tldp.org/HOWTO/HOWTO-INDEX/other-lang.html. Подготовленный файл /etc/sysconfig/console с известными настройками для некоторых стран был установлен в пакете CLFS-Bootscripts, значит подходящий раздел может быть раскоментирован, если есть поддерживаемая страна. Если всё ещё сомневаетесь, обратитесь в директорию /usr/share/kbd для получения доступных раскладок клавиатуры и экранных шрифтов. Прочтите мануалы для loadkeys(1) и setfont(8) и определите корректные аргументы для этих программ. После определения создайте файл конфигурации следующей командой:
cat >/etc/sysconfig/console <<"EOF"
KEYMAP="[arguments for loadkeys]"
FONT="[arguments for setfont]"
EOF
Например, для испанских пользователей, желающих использовать символ Евро, (доступный нажатием AltGr+E), будут корректными следующие установки:
cat >/etc/sysconfig/console <<"EOF"
KEYMAP="es euro2"
FONT="lat9-16 -u iso01"
EOF
Строка FONT выше корректна только для таблицы символов ISO 8859-15. Если используется ISO 8859-1, то вместо Евро будет символ фунт и корректная строка FONT должна быть такой:
FONT="lat1-16"
Если переменная KEYMAP или FONT не установлена, то скрипт console будет загружать соответствующую программу.
В некоторых раскладках клавиатуры кнопки Backspace и Delete посылают символы, отличные от соответствующих символов в раскладке клавиатуры по умолчанию, встроенной в ядро. Это путает некоторые приложения. Например Emacs при нажатии Backspace отображает свою подсказку (вместо удаления символа перед курсором). Проверим эффективность используемой раскладки клавиатуры (это работает только для i386 раскладок):
zgrep '\W14\W' [/path/to/your/keymap]
Если код 14 является клавишей Backspace вместо Delete, создайте следующий отрезок раскладки клавиатуры для устранения этой проблемы:
mkdir -pv /etc/kbd && cat > /etc/kbd/bs-sends-del <<"EOF"
keycode 14 = Delete Delete Delete Delete
alt keycode 14 = Meta_Delete
altgr alt keycode 14 = Meta_Delete
keycode 111 = Remove
altgr control keycode 111 = Boot
control alt keycode 111 = Boot
altgr control alt keycode 111 = Boot
EOF
Скажем скрипту console загружать этот отрезок после загрузки основной раскладки клавиатуры:
cat >>/etc/sysconfig/console <<"EOF"
KEYMAP_CORRECTIONS="/etc/kbd/bs-sends-del"
EOF
Для вкомпилирования раскладки клавиатуры прямо в ядро вместо установки её каждый раз при загрузке скриптом console, следуйте инструкциям, описанным в Разделе 12.3, “Linux-2.6.17.13.”. Делайте это, если уверены, что клавиатура всегда будет работать так, как ожидается, даже когда загрузитесь в эксплуатационной моде (переход init=/bin/sh в ядро), потому что скрипт console не будет запускать экранный шрифт автоматически. Это не составит много проблем так как ASCII символы будут поддерживаться корректно и маловероятно, что пользователю было бы необходимо полагаться на не-ASCII символы в течении эксплуатационной моды.
Так как раскладку клавиатуры будет устанавливать ядро, то можно убрать переменную KEYMAP в файле /etc/sysconfig/console. Если потребуется, она может быть оставлена на месте без последствий. Её сохранение может быть полезным при возможности загузки нескольких различных ядер, когда трудно узнать, что эта раскладка вкомпилирована во все ядра.
Скрипт sysklogd вызывает программу syslogd с параметром -m 0. Этот параметр отключает периодическую отметку времени, которую syslogd по умолчанию пишет в лог-файл каждые 20 минут. Для включения этой периодической отметки времени отредактируйте скрипт sysklogd, выполнив соответствующие изменения. Для более полной информации смотрите man syslogd.
Файл /etc/inputrc используется в планировании клавиатуры для специфических ситуаций. Этот файл является стартовым файлом, используемым библиотекой Readline, связанной с вводом и используемой Bash и большинством других оболочек.
Большинству людей не нужны специфичные для пользователя переназначения клавиш, поэтому команда ниже создаёт глобальный /etc/inputrc, используемый всеми. Если Вы позднее решите, что Вам нужно заменить установки по умолчанию, то Вы можете создать файл .inputrc в домашней директории пользователя с изменёнными назначениями клавиш.
Для большей информации по редактированию файла inputrc, смотрите info bash в разделе Readline Init File. info readline также хороший источник информации.
Ниже приведён базовый глобальный файл inputrc с коментариями, объясняющими действия некоторых опций. Заметьте, что коментарии не могут быть в той же строке, что и команда. Создадим файл при помощи следующей команды:
cat > /etc/inputrc << "EOF"
# Begin /etc/inputrc
# Modified by Chris Lynn <roryo@roryo.dynup.net>
# Не выводим ничего в первой строке
set horizontal-scroll-mode Off
# Разрешает 8-и битный ввод
set meta-flag On
set input-meta On
# Выключаем конвертацию 8-ого бита
set convert-meta Off
# Оставляем 8-ой бит для экрана
set output-meta On
# ничего, видимый или слышимый
set bell-style none
# Все следующее - карта соответствий escape-последовательностей значений,
# содержащихся внутри первого аргумента, к специфическим функциям
# readline
"\eOd": backward-word
"\eOc": forward-word
# Для консоли linux
"\e[1~": beginning-of-line
"\e[4~": end-of-line
"\e[5~": beginning-of-history
"\e[6~": end-of-history
"\e[3~": delete-char
"\e[2~": quoted-insert
# Для xterm
"\eOH": beginning-of-line
"\eOF": end-of-line
# Для Konsole
"\e[H": beginning-of-line
"\e[F": end-of-line
# End /etc/inputrc
EOF
Программа-оболочка /bin/bash (далее называемая “оболочкой”) при запуске использует набор стартовых файлов для создания окружения. Каждый файл имеет специфичное использование. Файлы в директории /etc предоставляют глобальные установки. Если эквивалентные файлы присутствуют в домашней диретории, то они могут заменить глобальные установки.
Интерактивнвя регистрация оболочки запускается после успешного входа, используя /bin/login, который читает файл /etc/passwd. Интерактивнвя нерегистрированная оболочка запускается из командной строки (т.е. [prompt]$/bin/bash). Неинтерактивная оболочка обычно присутствует при загрузке стартовых скриптов. Она неинтерактивная потому, что она выполняет скрипт и не ожидает ввода от пользователя между выполнением команд.
Для большей информации смотрите info bash, раздел Bash Startup Files and Interactive Shells.
Файлы /etc/profile и ~/.bash_profile читаются, когда оболочка работает в режиме интерактивной регистрации.
Основной файл /etc/profile, описанный ниже, устанавливает некоторые переменные окружения, необходимые для поддержки различных языков. Правильная их установка даст следующий результат:
Вывод программ транслируется на нужном языке
Правильная классификация символов в буквы, цифры и другие классы. Это необходимо bash для правильного применения не-ASCII символов в командной строке при не-английской локали
Правилиный алфавитный порядок сортировки
Предпочтительный размер страницы по умолчанию
Правильное форматирование монетарной величины, времени и даты
Этот скрипт также устанавливает переменную окружения INPUTRC, которая заставляет Bash и Readline использовать ранее созданный файл /etc/inputrc.
Замените [ll] ниже на двух-буквенный код для требуемого языка (т.е. “en”) и [CC] на двух-буквенный код страны (т.е. “GB”). [charmap] необходимо заменить на каноническую кодировку для Вашей выбранной локали.
Список всех локалей, поддерживаемых Glibc, может быть получен запуском следующей команды:
locale -a
Локали могут иметь синонимы, т.е. “ISO-8859-1” также может быть как “iso8859-1” и “iso88591”. Некоторые приложения не могут правильно поддерживать разные синонимы, поэтому безопаснее выбирать каноническое имя выбранной локали. Для определения канонического имени выполните следующую команду, где [locale name] это вывод, выданный locale -a для Вашей предпочтительной локали (в нашем примере “en_GB.iso88591”).
LC_ALL=[locale name] locale charmap
Для локали “en_GB.iso88591” приведенная выше команда выводит:
ISO-8859-1
В результате в конце locale устанавливаеся “en_GB.ISO-8859-1”.
LC_ALL=[locale name] locale country
LC_ALL=[locale name] locale language
LC_ALL=[locale name] locale charmap
LC_ALL=[locale name] locale int_curr_symbol
LC_ALL=[locale name] locale int_prefix
Команды выше должны напечатать имя страны и языка, кодировку символов, используемую в локали, местную валюту и префикс для набора телефонного номера для текущей страны. Если команды выше будут выпадать с сообщением, похожим на одно из показанных ниже, то это означает, что Ваша локаль не была установлена в Главе 10 или не поддерживается установкой Glibc по умолчанию.
locale: Cannot set LC_* to default locale: No such file or directory
Если это произошло, то Вы должны установить выбранную локаль, используя команду localedef, или обдумать выбор другой локали. Дальнейшие инструкции подразумевают, что сообщений об ошибках от Glibc нет.
Некоторые пакеты вне CLFS также могут не достаточно поддерживать Вашу выбранную локаль. Один из примеров это библиотека X (часть системы X Window), которая выводит следующее сообщение об ошибке:
Внимание: locale not supported by Xlib, locale set to C
Иногда это возможно исправить удалением названия кодовой таблицы из описания локали, так как это не меняет кодовую таблицу, которую Glibc ассоциирует с локалью (это можно проверить запуском команды locale charmap в обеих локалях). Например, может понадобиться изменить "de_DE.ISO-8859-15@euro" на "de_DE@euro" для того, чтобы эта локаль была признана Xlib.
Другие пакеты также могут функционировать некорректно (но не обязательно выводя сообщения об ошибках) если имя локали не соответствует их ожиданиям. В таких случаях исследование того, как другие дистрибутивы Linux поддерживают Вашу локаль может предоставить некоторую полезную информацию.
Как только правильные установки локали будут определены, создадим файл /etc/profile:
cat > /etc/profile << "EOF"
# Begin /etc/profile
export LANG=[ll]_[CC].[charmap]
export INPUTRC=/etc/inputrc
# End /etc/profile
EOF
Локали “C” (по умолчанию) и “en_US” (рекомендована для англоязычных пользователей США) отличаются.
Установка раскладки клавиатуры, экранного шрифта и локале-связанных переменных окружения является только шагом интернационализации, нужным для поддержки локалей, использующих обычные однобайтовые кодировки и направление письма слева направо. Более комплексные вещи (включая UTF-8 основанные локали) требуют дополнительных шагов и дополнительных патчей, так как много приложений имеют склонность работать неправильно в таких условиях. Эти шаги и патчи не включены в книгу CLFS и такие локали не поддерживаются CLFS.
Часть скрипта localnet устанавливает имя хоста. Для этого надо настроить файл /etc/sysconfig/network.
Создадим файл /etc/sysconfig/network и укажем имя хоста запуском следующей команды:
echo "HOSTNAME=[clfs]" > /etc/sysconfig/network
[clfs] надо заменить на желаемое имя компьютера для вызова. Вам не надо здесь вводить Fully Qualified Domain Name (FQDN - полное доменное имя). Эту информацию мы позже укажем в файле /etc/hosts.
Если сетевая карта должна быть настроена, то Вам надо определить IP-адреса, FQDN и возможные псевдонимы в файле /etc/hosts. Его синтакс следующий:
<IP address> myhost.example.org aliases
Если компьютер не должен быть подключен к интернет (т.е., есть регистрированный домен и корректный блок назначенных IP адресов — большинство пользователей этого не имеют) убедитесь, что IP-адреса в частной сети соотвестсвуют допустимым. Корректными значениями являются:
Класс Сети
A 10.0.0.0
B 172.16.0.0 through 172.31.0.255
C 192.168.0.0 through 192.168.255.255
Корректным IP адресом может быть 192.168.1.1. Корректным FQDN для этого IP может быть www.linuxfromscratch.org (не рекомендуется, так как это зарегистрированное доменное имя и может означать проблемы с сервером доменных имен).
Даже если Вы не собираетесь использовать сетевую карту, то Вам всё равно надо указать FQDN. Это важно для правильной работы ряда важных программ.
Создадим файл /etc/hosts, выполнив следующую команду:
cat > /etc/hosts << "EOF"
# Begin /etc/hosts (версия с сетевой картой)
127.0.0.1 localhost
[192.168.1.1] [<HOSTNAME>.example.org] [HOSTNAME]
# End /etc/hosts (версия с сетевой картой)
EOF
Значения [192.168.1.1] и [<HOSTNAME>.example.org] должны быть изменены для специфичных пользователей или требований (если IP адреса назначены сетевым/системным администратором и машина будет соединена с другой сетью).
Если сетевая карта не будет настраиваться, создайте файл /etc/hosts, выполнив следующую команду:
cat > /etc/hosts << "EOF"
# Begin /etc/hosts (версия без сетевой карты)
127.0.0.1 [<HOSTNAME>.example.org] [HOSTNAME] localhost
# End /etc/hosts (версия без сетевой карты)
EOF
Некоторые программы, которые Вы можете захотеть установить позже (различные медиа проигрыватели) ожидают наличие символических ссылок /dev/cdrom и /dev/dvd. Также может быть удобным помещение ссылок на эти символические ссылки в /etc/fstab. Для каждого из Ваших CD-ROM накопителей найдите соответствующую директорию в /sys (т.е., это может быть /sys/block/hdd) и запустите команду, похожую на следующую:
udevtest /block/hdd
Смотрите на строки, содержащие вывод различных *_id программ.
Есть два подхода к созданию символических ссылок. Первый подход использует имя модели и серийный номера, а второй основан на положении устройства на шине. Если Вы решили использовать первый подход, то создайте файл, похожий на следующий:
cat >/etc/udev/rules.d/82-cdrom.rules << EOF
# Custom CD-ROM symlinks
SUBSYSTEM=="block", ENV{ID_MODEL}=="SAMSUNG_CD-ROM_SC-148F", \
ENV{ID_REVISION}=="PS05", SYMLINK+="cdrom"
SUBSYSTEM=="block", ENV{ID_MODEL}=="PHILIPS_CDD5301", \
ENV{ID_SERIAL}=="5VO1306DM00190", SYMLINK+="cdrom1 dvd"
EOF
Хотя примеры в этой книге работают правильно, осознавайте, что Udev не признаёт обратный слэш для продолжения строки. При изменении правил Udev при помощи редактора убедитесь, что оставили каждое правило в одной физической строке.
При таком способе символические ссылки останутся корректными даже если Вы переместите накопитель в другое положение на шине IDE, но символическая ссылка /dev/cdrom не будет создана, если Вы замените старый SAMSUNG CD-ROM на новый накопитель.
Ключ SUBSYSTEM=="block" необходим для избежания подбора обобщённых SCSI устройств. Без него, в случае со SCSI CD-ROM, символические ссылки иногда будут указывать на корректные устройства /dev/srX, a иногда на /dev/sgX, что не правильно.
Второй подход:
cat >/etc/udev/rules.d/82-cdrom.rules << EOF
# Custom CD-ROM symlinks
SUBSYSTEM=="block", ENV{ID_TYPE}=="cd", \
ENV{ID_PATH}=="pci-0000:00:07.1-ide-0:1", SYMLINK+="cdrom"
SUBSYSTEM=="block", ENV{ID_TYPE}=="cd", \
ENV{ID_PATH}=="pci-0000:00:07.1-ide-1:1", SYMLINK+="cdrom1 dvd"
EOF
При таком способе символические ссылки останутся корректными даже если Вы замените накопитель на другую модель, но поместите его на старое место. Ключ ENV{ID_TYPE}=="cd" подтвердит, что символическая ссылка исчезает, если Вы поместите что-то другое, чем CD-ROM в это место на шине.
Конечно, возможно совмещать эти подходы.
Как объяснено в Разделе 11.5, “Поддержка устройств и модулей в СLFS системе”, порядок, в котором устройства с одинаковыми функциями появляются в /dev, является достаточно случайным. Т.е., если у Вас есть USB вэб камера и TВ тюнер, то иногда /dev/video0 ссылается на камеру, а /dev/video1 ссылается на тюнер, a иногда после перезагрузки порядок меняется на противоположный. Для всех случаев оборудования, исключая звуковые и сетевые карты, это исправляется созданием правил udev для нестандартных постоянных символических ссылок. Случай сетевых карт описан отдельно в Разделе 11.14, “Настройка скрипта network”, a настройка звуковых карт может быть найдена в BLFS.
Для каждого из Ваших устройств, которое может иметь такую проблему (даже если проблема отсутствует в Вашем текущем дистрибутиве Linux), найдите соответствующую директорию в /sys/class или /sys/block. Для видео устройств это может быть /sys/class/video4linux/videoX. Вычислите атрибуты, которые определяют устройство уникально (обычно работают ID производителя и продукта и/или серийные номера):
udevinfo -a -p /sys/class/video4linux/video0
Затем напишите правила, создающие символические ссылки, т.е.:
cat >/etc/udev/rules.d/83-duplicate_devs.rules << EOF
# Persistent symlinks for webcam and tuner
KERNEL=="video*", SYSFS{idProduct}=="1910", SYSFS{idVendor}=="0d81", \
SYMLINK+="webcam"
KERNEL=="video*", SYSFS{device}=="0x036f", SYSFS{vendor}=="0x109e", \
SYMLINK+="tvtuner"
EOF
В результате устройства /dev/video0 и /dev/video1 по-прежнему ссылаются случайно на тюнер и камеру (и, таким образом, никогда не должны быть использованы напрямую), но есть символические ссылки /dev/tvtuner и /dev/webcam, которые всегда указывают на корректное устройство.
Больше информации по написанию правил Udev может быть найдено в /usr/share/doc/udev-096/index.html.
Этот раздел нужен только в том случае, если Вы собираетесь настраивать сетевую карту.
Если сетевая карта использоваться не будет, то Вам не надо создавать файлы конфигурации сетевой карты. В этом случае Вам надо удалить все ссылки network из всех директорий с уровнями запуска (/etc/rc.d/rc*.d).
Инструкции в этом разделе являются опциональными если у Вас есть только одна сетевая карта.
С Udev и модульными сетевыми драйверами нумерация сетевых интерфейсов по умолчанию между перезагрузками не устойчива, так как драйверы загружаются параллельно, то есть в случайном порядке. Например, на компьютере, имеющем две сетевых карты, произведённые Intel и Realtek, сетевая карта от Intel может стать eth0, а карта Realtek становится eth1. В некоторых случаях после перезагрузки карты нумеруются по другому. Чтобы этого избежать, создайте правила Udev, которые назначают стабильные имена сетевым картам, основываясь на их MAC адресах или положениям на шине.
Если Вы решите использовать MAC адреса для определения Ваших сетевых карт, найдите адреса при помощи следующей команды:
grep -H . /sys/class/net/*/address
Для каждой сетевой карты (но не для интерфейса loopback) придумайте описывающее имя, такое как “realtek”, и создайте правила Udev, похожие на следующие:
cat > /etc/udev/rules.d/26-network.rules << EOF
ACTION=="add", SUBSYSTEM=="net", SYSFS{address}=="00:e0:4c:12:34:56", \
NAME="realtek"
ACTION=="add", SUBSYSTEM=="net", SYSFS{address}=="00:a0:c9:78:9a:bc", \
NAME="intel"
EOF
Хотя примеры в этой книге работают правильно, осознавайте, что Udev не признаёт обратный слэш для продолжения строки. При изменении правил Udev при помощи редактора убедитесь, что оставили каждое правило в одной физической строке.
Если Вы решили в качестве ключа использовать положение на шине, то создайте правила Udev, похожие на следующие:
cat > /etc/udev/rules.d/26-network.rules << EOF
ACTION=="add", SUBSYSTEM=="net", BUS=="pci", ID=="0000:00:0c.0", \
NAME="realtek"
ACTION=="add", SUBSYSTEM=="net", BUS=="pci", ID=="0000:00:0d.0", \
NAME="intel"
EOF
Эти правила всегда будут переименовывать сетевые карты на “realtek” и “intel”, независимо от оригинальной нумерации, предоставляемой ядром (т.е.: оригинальные интерфейсы “eth0” и “eth1” больше не будут присутствовать пока Вы не поместите такие “описывающие” имена в ключ NAME). Используйте описывающее имя из правил Udev вместо “eth0” в файле конфигурации сетевого интерфейса ниже.
Заметьте, что правила выше работают не для всех установок. Например, MAC-основанные правила прерываются при использовании мостов или VLAN, так как мосты и VLAN имеют те же MAC адреса, что и сетевая карта. Первое хочет переименовать только интерфейс сетевой карты, не мост или VLAN интерфейс, но пример правила изменяет оба. Если Вы используете такие виртуальные интерфейсы, то у Вас есть два потенциальных решения. Первое - это добавление ключа DRIVER=="?*" после SUBSYSTEM=="net" в MAC-основанных правилах, который остановит подбор виртуальных интерфейсов. Известно, что это приводит к неудаче с некоторыми старыми Ethernet картами, потому что они не имеют переменной DRIVER в событии и, таким образом, правило не отождествляется с такими картами. Другим решением является переключение на правила, которые используют в качестве ключа положение на шине.
Вторым известным неработающим случаем является работа с беспроводными картами, использующими MadWifi или HostAP драйверы, так как они создают как минимум два интерфейса с одинаковыми MAC адресами и положениями на шине. Например, драйвер Madwifi создаёт оба интерфейса athX и wifiX, где X это цифра. Для различения этих интерфейсов добавьте подходящий параметр KERNEL, такой как KERNEL=="ath*" после SUBSYSTEM=="net".
Здесь могут быть другие случаи, когда правила, описанные выше, не работают. В данный момент ошибки по этой теме всё ещё отсылаются распространителям Linux, а решения, которое покрывает все возможные случаи, нет.
Интерфейсы, которые будут запущены или остановлены скриптом network, описываются в директории /etc/sysconfig/network-devices. Эта директория содержит файлы вида ifconfig.xyz, где “xyz” является именем сетевого интерфейса (например eth0 или eth0:1). Файлы в этой директории описывают атрибуты для этих интерфейсов, например их IP адреса, маски подсети и т.д.
Следующая команда создаст пример ipv4 файла для устройства eth0:
cd /etc/sysconfig/network-devices &&
mkdir -v ifconfig.eth0 &&
cat > ifconfig.eth0/ipv4 << "EOF"
ONBOOT=yes
SERVICE=ipv4-static
IP=192.168.1.1
GATEWAY=192.168.1.2
PREFIX=24
BROADCAST=192.168.1.255
EOF
Значения переменных надо будет изменить на правильные для Вашей системы. Если переменная ONBOOT установлена в “yes”, то скрипт network поднимет этот интерфейс при загрузке системы. Если же будет установлено что-либо другое, то этот интерфейс будет проигнорирован скриптом.
Переменная SERVICE описывает метод получения IP адресов. Скрипты загрузки CLFS имеют модульный формат назначения IP адресов, а созданные дополнительные файлы в директории /etc/sysconfig/network-devices/services позволяют использовать другие методы назначения IP. Это использовано для Dynamic Host Configuration Protocol (DHCP) - протокола динамической конфигурации хоста, который описан в книге BLFS.
Переменная GATEWAY должна содержать IP адрес шлюза по умолчанию, если он есть. Если его нет - закоментируйте эту переменную.
Переменная PREFIX нужна для описания количества бит, использованных в подсети. Каждый октет в IP адресации содержит 8 бит. Если сетевая маска IP подсети равна 255.255.255.0, то она использует первые три октета (24 бита) для описания номера сети. Если сетевая маска равна 255.255.255.240, то она использует первые 28 бит. Префиксы длиннее 24 бит используются DSL и кабельными провайдерами интернет сервисов (ISP). В этом примере (PREFIX=24) сетевая маска равна 255.255.255.0.
Если система подключена к интернет, то ей требуются некоторые обозначения разрешённых имен сервисов доменных имён (Domain Name Service - DNS) для разложения доменных имён интернет на IP адреса и наоборот. Это достигается размещением IP адресов DNS сервера, доступного от ISP или системного администратора, в /etc/resolv.conf. Создадим этот файл, выполнив следующее:
cat > /etc/resolv.conf << "EOF"
# Begin /etc/resolv.conf
domain [Your Domain Name]
nameserver [IP address of your primary nameserver]
nameserver [IP address of your secondary nameserver]
# End /etc/resolv.conf
EOF
Замените [IP address of the nameserver] на наиболее подходящие для установки IP адреса DNS. Здесь часто бывает более чем одно значение (вторичные сервера требуются для увеличения надёжности). Если Вам надо или Вы хотите только один DNS сервер, удалите вторую строку nameserver из файла. IP адрес также может быть маршрутизатором локальной сети.
Пришло время сделать CLFS систему загружаемой. Эта глава обсуждает создание файла fstab, сборку ядра для новой CLFS системы и установку загрузчика, чтобы CLFS система могла быть выбрана для загрузки при старте.
Файл /etc/fstab используется рядом программ для определения того, какие разделы будут монтированы по умолчанию, какие файловые системы должны быть проверены и т.д. Создадим новую таблицу файловых систем так, как показано здесь:
cat > /etc/fstab << "EOF"
# Begin /etc/fstab
# file system mount-point type options dump fsck
# order
/dev/[xxx] / [fff] defaults 1 1
/dev/[yyy] swap swap pri=1 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
devpts /dev/pts devpts gid=4,mode=620 0 0
shm /dev/shm tmpfs defaults 0 0
# End /etc/fstab
EOF
Замените [xxx], [yyy] и [fff] на более подходяшие для системы значения, например hda2, hda5 и ext2. За более полной информацией обратитесь к man 5 fstab.
Точка монтирования /dev/shm для tmpfs добавлена для обеспечения поддержки POSIX-разделяемой памяти. Ваше ядро должно быть собрано со встроенной поддержкой этой системы (более подробно об этом смотрите в следующем разделе). Имейте в виду, что только небольшое количество программного обеспечения использует POSIX-разделяемую память. Поэтому точка монтирования /dev/shm является опциональной. Для более подробной информации смотрите Documentation/filesystems/tmpfs.txt в дереве исходников ядра.
Пакет Linux содержит ядро Linux и файлы заголовков.
Сборка ядра разбита на несколько шагов — конфигурация, компилирование и установка. Если Вам не нравится способ установки, описаный в этой книге, то посмотрите файл README в директории с исходниками ядра на предмет альтернативы.
Следующий патч исправляет проблему инициализации с сетевым драйвером tulip:
patch -Np1 -i ../linux-2.6.17.13-tulip-1.patch
Следующий патч объединяет изменения в Linux-MIPS ядре:
patch -Np1 -i ../linux-2.6.17.13-mips-2.patch
Следующий патч объединяет обновления в Linux-MIPS ядре:
patch -Np1 -i ../linux-2.6.17.13-mips_fixes-2.patch
Подготовимся к компилированию запуском следующей команды:
make mrproper
Это позволит убедиться, что дерево исходников будет абсолютно чистым. Команда разработки ядра рекомендует запускать эту команду перед каждым компилированием ядра. Вы не можете быть абсолютно уверены в отсутствии лишних файлов даже после распаковки исходников.
Если в Разделе 11.7, “Настройка консоли Linux,” было решено компилировать раскладку клавиатуры в ядре, то выполните команду ниже:
loadkeys -m /lib/kbd/keymaps/[path to keymap] > \
drivers/char/defkeymap.c
Например, если используется русская клавиатура, то используйте /usr/share/kbd/keymaps/i386/qwerty/ru1.map.gz (один из вариантов).
Отконфигурируем ядро через меню-подобный интерфейс. Пожалуйста отметьте, что для стартового скрипта udev "rtc" и "tmpfs" должны быть включены и вкомпилированы в ядро, а не в виде модуля. BLFS имеет некоторую информацию относительно особых требований конфигурации ядра для пакетов вне CLFS на http://www.linuxfromscratch.org/blfs/view/svn/longindex.html#kernel-config-index:
make menuconfig
При желании, пропустите конфигурацию ядра копированием файла конфигурации .config из хост системы (подразумевает его доступность) в корневую директорию распакованных исходников ядра. Хотя мы это не рекомендуем. Чаще лучше исследовать всё меню конфигурации и создать новую конфигурацию ядра.
Скомпилируем образ ядра и модули:
make
Если Вы будете использовать модули, то может понадобиться файл /etc/modprobe.conf. Информация по модулям и конфигурации ядра находится в документации ядра в директории Documentation. Также может быть интересна man страница modprobe.conf(5).
Будьте осторожны при чтении другой документации, так как обычно она применима только к ядрам 2.4.x. Как мы давно знаем, проблемы конфигурации ядра, специфичные для Hotplug и Udev, не документированы. Проблема в том, что Udev будет создавать ноды устройств только если Hotplug или созданный пользователем скрипт вставит соответствующий модуль в ядро и не все модули определяются Hotplug. Заметьте, что утверждения, похожие на указанное ниже, в файле /etc/modprobe.conf не работают с Udev:
alias char-major-XXX some-module
Поскольку компилируем с Udev и модулями, мы настоятельно рекомендуем начинать с полностью безмодульной конфигурацией ядра, особенно если это первый запуск с использованием Udev.
Установим модули, если ядро их использует:
make modules_install
После завершения компилирования ядра требуются дополнительные шаги для завершения установки. Некоторые файлы необходимо скопировать в директорию /boot.
Используйте следующую команду для установки ядра:
cp vmlinux /boot/vmlinux-2.6.17.13
gzip -9 /boot/vmlinux-2.6.17.13
System.map это файл карты символов для ядра. Он содержит карту точек входа в каждую функцию API ядра. Используйте следующую команду для установки этого файла:
cp System.map /boot/System.map-2.6.17.13
Файл конфигурации ядра .config, созданный после выполнения команды make menuconfig, содержит все выбранные опции конфигурации для только что откомпилированного ядра. Хорошей идеей будет сохранение этого файла:
cp .config /boot/config-2.6.17.13
Важно отметить, что файлы в директории исходников ядра не принадлежат root. Хотя пакет был распакован пользователем root (так как мы в chroot), файлы имеют ID пользователя и группы, какие они имели на компьютере при упаковывании. Обычно это не является проблемой для остальных пакетов поскольку дерево исходников удаляется после установки ядра, хотя часто оно сохраняются очень долго. В связи с этим имеется вероятность, что пользователь с таким же ID, как у собранного пакета исходников ядра, получит права доступа на запись в директории исходников ядра.
Если дерево исходников ядра планируется сохранить, выполните chown -R 0:0 на директории linux-2.6.17.13 для передачи всех файлов пользователю root.
Некоторая документация ядра рекомендует создание символической ссылки с /usr/src/linux на директорию с исходниками ядра. Это особенность для ядер до серии 2.6 и эта ссылка не должна быть создана в CLFS системе, так как может привести к проблемам для пакетов, которые Вы можете захотеть собрать после завершения сборки CLFS системы.
Также, заголовки в системной директории include должны быть всегда теми же, с какими была скомпилирована Glibc (из пакета Linux-Headers) и никогда не должны быть заменены заголовками ядра.
Этот загрузчик для MIPS основанных рабочих станций и серверов SGI.
Ранее мы скомпилировали и установили программы загрузчика Arcload при подготовке этого шага. Теперь мы настроим нашу систему для загрузки с использованием Arcload. Вот простой arc.cf для применения.
cat > /boot/arc.cf << "EOF"
append "root=/dev/sda3";
append "console=ttyS0,9600";
CLFS {
2.6.17.13 {
описание "2.6.17.13";
image system "/2.6.17.13";
}
debug {
описание "Debug Shell";
append "init=/bin/bash";
}
}
EOF
Теперь мы используем dvhtool, чтобы сделать нашу систему загружаемой:
dvhtool --unix-to-vh /usr/lib/arcload/sash64 sash64
dvhtool --unix-to-vh /boot/arc.cf arc.cf
dvhtool --unix-to-vh /boot/2.6.17.13 2.6.17.13
Это загрузчик для MIPS основанных серверов cobalt RaQ, RaQ2, Qube или Qube2.
Ваша замечательная CLFS система почти готова. Одна из последних вещей, которую нужно сделать, это убедиться в возможности загрузки системы. Инструкции ниже применяются только к серверам Cobalt RaQ1/RaQ2/Cube2. Информация по “загрузке” для других архитектур доступна в обычных ресурсо-специфичных местах для этих архитектур.
Загрузка системы может быть комплексной задачей, поэтому скажем несколько предостережений. Хорошо ознакомьтесь с текущим загрузчиком и другими операционными системами, присутствующими на жёстком диске, которые должны загружаться. Убедитесь, что спасательный загружаемый диск готов к “спасению” компьютера, если компьютер станет неиспользуемым (незагружаемым).
Ранее мы скомпилировали и установили программы загрузчика Cobalt при подготовке этого шага. Теперь мы настроим нашу систему для загрузки используя Colo. Вот простой default.colo для применения.
cat > /boot/default.colo << "EOF"
#:CoLo:#
#
# load linux
#
lcd 'Booting 2.6.17.13...'
load vmlinux-2.6.17.13.gz
execute root=/dev/hda2 console=ttyS0,115200 ide1=noprobe
EOF
В /usr/lib/colo/examples есть больше примеров файла default.colo.
FHS обуславливает, что файл конфигурации загрузчика должен быть слинкован в /etc/{Bootloader Name}. Для удовлетворения этого требования для Colo выполним следующую команду:
mkdir -v /etc/colo &&
ln -sv /boot/colo/default.colo /etc/colo
Сделано! Новая CLFS ситстема установлена! Мы желаем Вам больших успехов с Вашей новой блестящей персонально собранной Linux системой.
Возможно, хорошей идеей будет создание файла /etc/clfs-release. Имея этот файл, Вам будет очень просто (и нам, если Вы попросите о помощи на некотором этапе) определить установленную версию CLFS. Создайте этот файл запуском:
echo 1.0.0 > /etc/clfs-release
Вы хотите зарегистрироваться как пользователь СLFS по окончании прочтения книги? Посетите http://www.linuxfromscratch.org/cgi-bin/lfscounter.cgi и зарегистрируйтесь как пользователь СLFS, введя Ваше имя и первую используемую Вами версию СLFS.
Если Вы собрали финальную систему, используя метод загрузки, то просто запустите shutdown -r now для перезагрузки, используя Ваше новое ядро вместо текущего минимального. Если Вы использовали Chroot, то нужно сделать несколько дополнительных шагов.
Система, которую Вы создали по этой книге, достаточно минимальна и, вероятнее всего, не будет иметь функциональность, необходимую Вам в дальнейшем. Установку некоторых дополнительных пакетов из книги BLFS Вы продолжите самостоятельно после перезагрузки в Вашу новую CLFS систему. Установив текстовый интернет браузер, например Lynx, Вы сможете легко просматривать книгу BLFS в одном виртуальном терминале, а собирать пакет в другом. Также пакет GPM позволит Вам выполнять операции копирования/вставки между виртуальными терминалами. Наконец, если Вы в ситуации, в которой конфигурация со статическим IP не удовлетворяет Вашим сетевым требованиям, то установка пакета Dhcpcd или PPP на этом этапе также может быть полезной.
Теперь, когда мы установили всё необходимое программное обеспечение, настало время перезапустить компьютер. Сначала выйдем из chroot окружения:
logout
Затем размонтируем виртуальные файловые системы:
umount ${CLFS}/dev/pts
umount ${CLFS}/dev/shm
umount ${CLFS}/dev
umount ${CLFS}/proc
umount ${CLFS}/sys
Отмонтируем сам раздел CLFS:
umount ${CLFS}
Если было создано несколько разделов, то Вам надо отмонтировать их все перед отмонтированием основного, как здесь:
umount ${CLFS}/usr
umount ${CLFS}/home
umount ${CLFS}
Теперь перезагрузим систему командой:
shutdown -r now
Подразумевая, что загрузчик был установлен так, как описано ранее, CLFS 1.0.0 будет загружен автоматически.
После перезагрузки система CLFS готова к использованию и Вы можете начать устанавливать дополнительные программы.
Мы благодарим Вас за прочтение книги СLFS и надеемся, что Вы нашли в ней много полезного для себя и провели время с пользой.
Теперь, когда установка системы CLFS закончена, Вы наверное спросите “Что дальше?”. Для ответа на этот вопрос мы составили список ресурсов, который Вам может оказаться полезным.
Поддержка
Ошибки и проблемы безопасности регулярно сообщаются для всех программ. Есть несколько ресурсов, которые отслеживают такие сообщения. Некоторые из них показаны ниже:
Freshmeat.net (http://freshmeat.net/)
Freshmeat может сообщить Вам (по электронной почте) о новых версиях пакетов, установленных в Вашей системе.
CERT (Computer Emergency Response Team)
CERT имеет списки рассылки, которые публикуют предупреждения безопасности относительно разных операционных систем и приложений. Информация для подписавшихся находится на http://www.us-cert.gov/cas/signup.html.
Bugtraq
Bugtraq это полностью раскрытый компьютерный список рассылки по безопасности. Он публикует свеже обнаруженные проблемы безопасности, a иногда и потенциальные исправления для них. Информация для подписавшихся находится на http://www.securityfocus.com/archive.
После Linux From Scratch
Книга После Linux From Scratch описывает процедуру установки большого списка программ, не вошедших в книгу CLFS. Проект BLFS находится по адресу http://www.linuxfromscratch.org/blfs/.
Советы LFS
Советы LFS являются набором небольших разъяснительных документов, составленных волонтёрами из сообщества LFS. Эти советы можно найти на http://www.linuxfromscratch.org/hints/list.html.
Списки рассылки
Есть ряд списков рассылки CLFS в которые Вы можете обратиться за помощью. Смотрите Chapter 1 - Mailing Lists для более полной информации.
Проект документации Linux
Целью проекта документации Linux (TLDP) является сотрудничество с целью создания документации по Linux. LDP содержит большую коллекцию различных HOWTO, руководств и man-страниц; всё это Вы найдёте на http://www.tldp.org/.
ABI |
Application Binary Interface |
ALFS |
Automated Linux From Scratch |
ALSA |
Advanced Linux Sound Architecture |
API |
Application Programming Interface |
ASCII |
American Standard Code for Information Interchange |
ATA |
Advanced Technology Attachment (see IDE) |
BIOS |
Basic Input/Output System |
bless |
manipulate a filesystem so that OF will boot from it |
BLFS |
Beyond Linux From Scratch |
BSD |
Berkeley Software Distribution |
chroot |
change root |
CLFS |
Кросс-компилированный Linux From Scratch |
CMOS |
Complementary Metal Oxide Semiconductor |
COS |
Class Of Service |
CPU |
Central Processing Unit |
CRC |
Cyclic Redundancy Check |
DHCP |
Dynamic Host Configuration Protocol |
DNS |
Domain Name Service |
EGA |
Enhanced Graphics Adapter |
ELF |
Executable and Linkable Format |
EOF |
End of File |
EQN |
equation |
EVMS |
Enterprise Volume Management System |
ext2 |
second extended file system |
FAQ |
Frequently Asked Questions |
FHS |
Filesystem Hierarchy Standard |
FIFO |
First-In, First Out |
FQDN |
Fully Qualified Domain Name |
FTP |
File Transfer Protocol |
GB |
Gibabytes |
GCC |
GNU Compiler Collection |
GID |
Group Identifier |
GMT |
Greenwich Mean Time |
HTML |
Hypertext Markup Language |
IDE |
Integrated Drive Electronics |
IEEE |
Institute of Electrical and Electronic Engineers |
IO |
Input/Output |
IP |
Internet Protocol |
IPC |
Inter-Process Communication |
IRC |
Internet Relay Chat |
ISO |
International Organization for Standardization |
ISP |
Internet Service Provider |
KB |
Kilobytes |
LED |
Light Emitting Diode |
LFS |
Linux From Scratch |
LSB |
Linux Standard Base |
MB |
Megabytes |
MBR |
Master Boot Record |
MD5 |
Message Digest 5 |
NIC |
Network Interface Card |
NLS |
Native Language Support |
NNTP |
Network News Transport Protocol |
NPTL |
Native POSIX Threading Library |
OF |
Open Firmware |
OSS |
Open Sound System |
PCH |
Pre-Compiled Headers |
PCRE |
Perl Compatible Regular Expression |
PID |
Process Identifier |
PTY |
pseudo terminal |
QA |
Quality Assurance |
QOS |
Quality Of Service |
RAM |
Random Access Memory |
RPC |
Remote Procedure Call |
RTC |
Real Time Clock |
SCO |
The Santa Cruz Operation |
SATA |
Serial ATA |
SGR |
Select Graphic Rendition |
SHA1 |
Secure-Hash Algorithm 1 |
SMP |
Symmetric Multi-Processor |
TLDP |
The Linux Documentation Project |
TFTP |
Trivial File Transfer Protocol |
TLS |
Thread-Local Storage |
UID |
User Identifier |
umask |
user file-creation mask |
USB |
Universal Serial Bus |
UTC |
Coordinated Universal Time |
UUID |
Universally Unique Identifier |
VC |
Virtual Console |
VGA |
Video Graphics Array |
VT |
Virtual Terminal |
Мы хотим поблагодарить следующих людей и организации за их вклад в проект Linux From Scratch.
Gerard Beekmans <gerard AT linuxfromscratch D0T org> – инициатор Linux From Scratch, организатор проекта LFS
Matthew Burgess <matthew AT linuxfromscratch D0T org> – лидер проекта LFS, технический редактор LFS, зведующий релиза LFS
Archaic <archaic AT linuxfromscratch D0T org> – технический редактор LFS, лидер проекта HLFS, редактор BLFS, советов и координатор проекта патчей
Nathan Coulson <nathan AT linuxfromscratch D0T org> – координатор LFS-Bootscripts
Bruce Dubbs <bdubbs AT linuxfromscratch D0T org> – лидер проекта BLFS
Manuel Canales Esparcia <manuel AT linuxfromscratch D0T org> – координатор LFS/BLFS/HLFS XML и XSL
Jim Gifford <jim AT linuxfromscratch D0T org> – технический редактор LFS, лидер проекта патчей
Jeremy Huntwork <jhuntwork AT linuxfromscratch D0T org> – технический редактор LFS, координатор LFS LiveCD, лидер проекта ALFS
Anderson Lizardo <lizardo AT linuxfromscratch D0T org> – координатор скриптов Web-сайта
Ryan Oliver <ryan AT linuxfromscratch D0T org> – координатор LFS инструментария
James Robertson <jwrober AT linuxfromscratch D0T org> – координатор Bugzilla
Tushar Teredesai <tushar AT linuxfromscratch D0T org> – редактор BLFS Book, советов и лидер проекта патчей
Остальных людей с других списков рассылки LFS и BLFS, которые помогли сделать эту книгу возможной, давшие свои предложения, тестировавшие книгу и рассмотревшие сообщения об ошибках и инструкции с их опытом в установке различных пакетов.
Manuel Canales Esparcia <macana AT lfs-es D0T com> – испанский проект перевода LFS
Johan Lenglet <johan AT linuxfromscratch D0T org> – французский проект перевода LFS
Anderson Lizardo <lizardo AT linuxfromscratch D0T org> – португальский проект перевода LFS
Thomas Reitelbach <tr AT erdfunkstelle D0T de> – немецкий проек перевода LFS
Scott Kveton <scott AT osuosl D0T org> – lfs.oregonstate.edu
Mikhail Pastukhov <miha AT xuy D0T biz> – lfs.130th.net
William Astle <lost AT l-w D0T net> – ca.linuxfromscratch.org
Jeremy Polen <jpolen AT rackspace D0T com> – us2.linuxfromscratch.org
Tim Jackson <tim AT idge D0T net> – linuxfromscratch.idge.net
Jeremy Utley <jeremy AT linux-phreak D0T net> – lfs.linux-phreak.net
Andres Meggiotto <sysop AT mesi D0T com D0T ar> – lfs.mesi.com.ar
Manuel Canales Esparcia <manuel AT linuxfromscratch D0T org> – lfsmirror.lfs-es.info
Eduardo B. Fonseca <ebf AT aedsolucoes D0T com D0T br> – br.linuxfromscratch.org
Barna Koczka <barna AT siker D0T hu> – hu.linuxfromscratch.org
UK Mirror Service – linuxfromscratch.mirror.ac.uk
Martin Voss <Martin D0T Voss AT ada D0T de> – lfs.linux-matrix.net
Guido Passet <guido AT primerelay D0T net> – nl.linuxfromscratch.org
Bastiaan Jacques <baafie AT planet D0T nl> – lfs.pagefault.net
Roel Neefs <lfs-mirror AT linuxfromscratch D0T rave D0T org> – linuxfromscratch.rave.org
Justin Knierim <justin AT jrknierim D0T de> – www.lfs-matrix.de
Stephan Brendel <stevie AT stevie20 D0T de> – lfs.netservice-neuss.de
Antonin Sprinzl <Antonin D0T Sprinzl AT tuwien D0T ac D0T at> – at.linuxfromscratch.org
Fredrik Danerklint <fredan-lfs AT fredan D0T org> – se.linuxfromscratch.org
Parisian sysadmins <archive AT doc D0T cs D0T univ-paris8 D0T fr> – www2.fr.linuxfromscratch.org
Alexander Velin <velin AT zadnik D0T org> – bg.linuxfromscratch.org
Dirk Webster <dirk AT securewebservices D0T co D0T uk> – lfs.securewebservices.co.uk
Thomas Skyt <thomas AT sofagang D0T dk> – dk.linuxfromscratch.org
Simon Nicoll <sime AT dot-sime D0T com> – uk.linuxfromscratch.org
Pui Yong <pyng AT spam D0T averse D0T net> – sg.linuxfromscratch.org
Stuart Harris <stuart AT althalus D0T me D0T uk> – lfs.mirror.intermedia.com.sg
Jason Andrade <jason AT dstc D0T edu D0T au> – au.linuxfromscratch.org
Christine Barczak <theladyskye AT linuxfromscratch D0T org> – редактор LFS Book
Timothy Bauscher
Robert Briggs
Ian Chilton
Jeroen Coumans <jeroen AT linuxfromscratch D0T org> – разработчик Web-сайта, координатор FAQ
Alex Groenewoud – технический редактор LFS
Marc Heerdink
Mark Hymers
Seth W. Klein – координатор FAQ
Nicholas Leippe <nicholas AT linuxfromscratch D0T org> – координатор Wiki
Simon Perreault
Scot Mc Pherson <scot AT linuxfromscratch D0T org> – координатор LFS NNTP Gateway
Alexander Patrakov <semzx AT newmail D0T ru> – технический редактор LFS
Greg Schafer <gschafer AT zip D0T com D0T au> – технический редактор LFS
Jesse Tie-Ten-Quee – технический редактор LFS
Jeremy Utley <jeremy AT linuxfromscratch D0T org> – технический редактор LFS, координатор Bugzilla, координатор LFS-Bootscripts
Zack Winkles <zwinkles AT gmail D0T com> – технический редактор LFS
Dean Benson <dean AT vipersoft D0T co D0T uk> за некоторую финансовую помощь
Hagen Herrschaft <hrx AT hrxnet D0T de> за пожертвование системы 2.2 ГГц P4, теперь запущенную под именем Lorien
VA Software, кто от имени Linux.com пожертвовал рабочую станцию VA Linux 420 (разновидность StartX SP2)
Mark Stone за пожертвование Belgarath, сервера linuxfromscratch.org
Каждый пакет, собираемый в CLFS, связан с одним или более другими пакетами в порядке сборки и правильной установки. Некоторые пакеты даже участвуют в круговых зависимостях, то есть, первый пакет зависит от второго, а тот зависит от первого. Из за этих зависимостей важна последовательность сборки пакетов для CLFS системы. Целью этой страницы является документирование зависимостей каждого пакета, собираемого в CLFS.
Для каждого собираемого пакета мы имеем список из трёх типов зависимостей. Первый список содержит необходимые пакеты для сборки и установки пакета. Второй список содержит необходимые пакеты для проведения тестов. Последний список показывает необходимость наличия пакетов до сборки и установки текущего пакета в окончательное место. В большинстве случаев, это потому, что эти пакеты имеют встроенные пути к бинарникам внутри их скриптов. Если не собирать в определённом порядке, то это может привести к наличию путей к /tools/bin/[бинарник], помещённых внутри скриптов, установленных в финальной системе. Это абсолютно не желательно.
Эта страница содержит информацию о зависимостях для пакетов, специфичных для Mips.