"Между жопой и диваном доллар никогда не пролетит." Билл Гейтс

Содержание:

6.79. Повторная очистка от отладочных символов

Этот раздел является необязательным. Если вы не программист и не планируете выполнять отладку установленного программного обеспечения, то общий размер системы можно сократить, удалив отладочные символы из двоичных файлов и библиотек. Такая операция не вызовет проблем, за исключением того, что не получится выполнить отладку установленного программного обеспечения.
Большинство пользователей, которые используют приведенные ниже команды, не испытывают никаких трудностей. Тем не менее, легко сделать опечатку и сделать новую систему непригодной для использования, поэтому перед запуском команд рекомендуется создать резервную копию системы LFS в текущем состоянии.
Расположим отладочные символы для выбранных библиотек в отдельные файлы. Отладочная информация необходима для запуска регрессионных тестов, которые используют valgrind или gdb позднее в книге BLFS.

save_lib="ld-2.28.so libc-2.28.so libpthread-2.28.so libthread_db-1.0.so"
cd /lib
for LIB in $save_lib; do
objcopy --only-keep-debug $LIB $LIB.dbg
strip --strip-unneeded $LIB
objcopy --add-gnu-debuglink=$LIB.dbg $LIB
done
save_usrlib="libquadmath.so.0.0.0 libstdc++.so.6.0.25
libmpx.so.2.0.1 libmpxwrappers.so.2.0.1 libitm.so.1.0.0
libatomic.so.1.2.0" "
cd /usr/lib
for LIB in $save_usrlib; do
objcopy --only-keep-debug $LIB $LIB.dbg
strip --strip-unneeded $LIB
objcopy --add-gnu-debuglink=$LIB.dbg $LIB
done
unset LIB save_lib save_usrlib


Перед выполнением очистки тщательно следим за тем, чтобы ни один из исполняемых файлов, который планируется удалить, не был запущен. Если не уверены, что находимся в правильно настроенной среде chroot как было рассказано ранее, раздел «6.4 Вход в окружение Chroot» выйдем из среды chroot, выполнив команду:

logout

Выполним вход в среду chroot заново, выполнив команду:

chroot $LFS /tools/bin/env -i \
HOME=/root TERM=$TERM \
PS1='(lfs chroot) \u:\w\$ ' \
PATH=/bin:/usr/bin:/sbin:/usr/sbin \
/tools/bin/bash --login


Двоичные файлы и библиотеки можно безопасно очистить:

/tools/bin/find /usr/lib -type f -name \*.a \
-exec /tools/bin/strip --strip-debug {} ';'
/tools/bin/find /lib /usr/lib -type f \( -name \*.so* -a ! -name \*dbg \) \
-exec /tools/bin/strip --strip-unneeded {} ';'
/tools/bin/find /{bin,sbin} /usr/{bin,sbin,libexec} -type f \


На экране будет множество сообщений, не удается распознать формат файлов (format not recognized). Такие предупреждения можно игнорировать. Они указывают, что файлы являются сценариями вместо двоичных файлов.

6.80. Выполнение очистки

Очистим некоторые дополнительные файлы, оставшиеся от запускаемых ранее тестов:

rm -rf /tmp/*

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

chroot "$LFS" /usr/bin/env -i \
HOME=/root TERM="$TERM" \
PS1='(lfs chroot) \u:\w\$ ' \
PATH=/bin:/usr/bin:/sbin:/usr/sbin \
/bin/bash --login


Причиной является то, что программы в каталоге /tools больше не потребуются, и соответствующий каталог /tools, при желании, можно удалить.
При удалении каталога /tools также, будут удалены временные копии программ Tcl, Expect и DejaGNU, которые были установлены для обеспечения запуска тестов устанавливаемых пакетов. Если эти программы вам вновь понадобятся, вы можете установить их позднее. В книге BLFS есть информация по установке и настройке этих пакетов.
Если виртуальные файловые системы не были примонтированы, по причине перезагрузки или ручного отмонтирования,убедитесь что они заново примонтированы, когда вы входите в среду chroot. Этот процесс описан в разделе «6.2. Подготовка виртуальных файловых систем ядра».
Есть статические библиотеки, которые ранее не были удалены, чтобы регрессионные тесты могли правильно выполняться, в нескольких пакетах. Эти библиотеки из binutils, bzip2, e2fsprogs, flex, libtool и zlib, при желании, можно тоже удалить:

rm -f /usr/lib/lib{bfd,opcodes}.a
rm -f /usr/lib/libbz2.a
rm -f /usr/lib/lib{com_err,e2p,ext2fs,ss}.a
rm -f /usr/lib/libltdl.a
rm -f /usr/lib/libfl.a
rm -f /usr/lib/libfl_pic.a
rm -f /usr/lib/libz.a


Есть еще несколько файлов с расширением .la, расположенные каталогах в /usr/lib и /usr/libexec. Это файлы "архивов libtool", и в системе linux они не нужны. На данный момент они не требуется. Чтобы удалить их, выполните команду:

find /usr/lib /usr/libexec -name \*.la -delete

Более подробную информацию можно изучить в книге BLFS, "Информация об архивных файлах (.la)".

7. Конфигурация системы

Загрузка Linux системы включает в себя несколько задач. Процесс должен примонтировать как виртуальные, так и реальные файловые системы, инициализировать устройства, активировать файл подкачки, проверить целостность файловых систем, примонтировать другие разделы или файл подкачки, установить системные часы, создать сети, запустить службы, требуемые системой и выполнить любые другие задачи, необходимые пользователю. Этот процесс должен быть организован для выполнения задач в правильном порядке и в то же время, выполняться как можно быстрее.
System V - представляет классический процесс загрузки, который использовался в Unix и Unix-подобных системах, таких как Linux с 1983 года. Он состоит из небольшой программы init, которая устанавливает базовые программы, такие как login (через getty) и запускает другие сценарии. Этот сценарий, как правило, называется rc, и управляет выполнением дополнительных сценариев, необходимых для инициализации системы.
Программа init управляется файлом /etc/inittab и структурирована на уровни запуска, которые могут выполнятся пользователем:
0 — Halt - остановка
1 — Single user mode - Однопользовательский режим
2 — Multiuser, without networking - Многопользовательский режим, без сети
3 — Full multiuser mode - Полный многопользовательский режим
4 — User definable - Режим, определяемый пользователем
5 — Full multiuser mode with display manager - Полный многопользовательский режим с экранным менеджером
6 — reboot - перезагрузка
Обычно, стандартный уровень запуска - 3 или 5.
Преимущества:
Устоявшаяся, хорошо понятая система.
Легко настроить.
Недостатки:
Медленная загрузка. Средняя скорость загрузки LFS системы составляет 8-12 секунд, если измерить время с начала первого отображения приглашения командной строки ядра. Соединение с сетью как правило устанавливается примерно 2 секунды после приглашения командной строки.
Последовательная обработка задач загрузки. Это связано с предыдущим пунктом. Задержка в работе любого процесса, например проверка файловой системы, задержит соответственно и весь процесс загрузки.
Не поддерживает напрямую дополнительные функции, такие как контроль групп (cgroups) и расписания для каждого пользователя.
Для добавления сценариев требуются ручные, статические последовательные решения.

7.2. LFS-Bootscripts-20180820

Пакет LFS-Bootscripts содержит набор сценариев для запуска/остановки LFS системы. Файлы конфигурации и процедуры необходимы, чтобы настроить процесс загрузки, описанные в следующих разделах.
Установим пакет:

make install

Содержимое пакета LFS-Bootscripts.
Установленные каталоги: /etc/rc.d, /etc/init.d (symbolic link), /etc/sysconfig, /lib/services, /lib/lsb (symbolic link)
Установленные скрипты:
D.1. /etc/rc.d/init.d/rc Основной управляющий сценарий. Он отвечает за запуск других сценариев загрузки один за одним, в той последовательности, которая определенной по имени обрабатываемых символических ссылок.
D.2. /lib/lsb/init-functions Содержит общие функции, такие как error и проверка статуса. Эти функции используются другими сценариями пакета.
D.3. /etc/rc.d/init.d/mountvirtfs Монтирует виртуальные файловые системы, такие как proc
D.4. /etc/rc.d/init.d/modules
D.5. /etc/rc.d/init.d/udev Подготовка каталога /dev и запуск Udev.
D.6. /etc/rc.d/init.d/swap Включает или выключает файл подкачки и связанные с ним разделы файловой системы.
D.7. /etc/rc.d/init.d/setclock Сбрасывает настроенные часы ядра в локальное время в случае, если аппаратное время не настроено в UTC.
D.8. /etc/rc.d/init.d/checkfs Проверяет целостность файловых систем, после того, как они были примонтированы (за исключением журналов и сетевых файловых систем).
D.9. /etc/rc.d/init.d/mountfs Монтирует все файловые системы, кроме тех, которые отмечены как noauto или сетевые файловые системы.
D.10. /etc/rc.d/init.d/udev_retry Повторная попытка запуска неудавшихся событий udev, копирование сгенерированных правил из каталога /run/udev в каталог /etc/udev/rules.d при необходимости.
D.11. /etc/rc.d/init.d/cleanfs Удаляет файлы, которые не должны быть сохранены между циклами включения/выключения системы, такие как в каталоге /var/run/ и /var/lock/; также создается заново /var/run/utmp и удаляют, возможные наличия файлов /etc/nologin, /fastboot, и /forcefsck.
D.12. /etc/rc.d/init.d/console Загружает правильные таблицы раскладки клавиатуры для клавиатуры, и устанавливает шрифт экрана.
D.13. /etc/rc.d/init.d/localnet Выполняет настройку имени хоста и локального loopback устройства.
D.14. /etc/rc.d/init.d/sysctl Загружает параметры системной конфигурации в запущенное ядро из файла /etc/sysctl.conf, в том случае, если файл существует.
D.15. /etc/rc.d/init.d/sysklogd Запускает или останавливает системные службы журналирования и службы ядра.
D.16. /etc/rc.d/init.d/network Выполняет настройку сетевых интерфейсов, таких как сетевые карты, и настаивает сетевой шлюз по-умолчанию (где это применимо).
D.17. /etc/rc.d/init.d/sendsignals Гарантирует то, что каждый процесс будет завершен до того, как система будет остановлена или перезагружена.
D.18. /etc/rc.d/init.d/reboot Перезагружает систему.
D.19. /etc/rc.d/init.d/halt Останавливает систему.
D.20. /etc/rc.d/init.d/template Шаблон, для создания собственных сценариев загрузки для других служб.
D.21. /etc/sysconfig/modules Загружает модули ядра из списка, который находится в файле /etc/sysconfig/modules, используя переданные здесь аргументы.
D.22. /etc/sysconfig/createfiles
D.23. /etc/sysconfig/udev-retry
D.24. /sbin/ifup Инициализирует сетевые устройства.
D.25. /sbin/ifdown Остановка работы сетевых устройств.
D.26. /lib/services/ipv4-static Предоставляет функциональность, позволяющую назначать статический IP адрес сетевому интерфейсу.
D.27. /lib/services/ipv4-static-route

7.3. Обработка устройств и модулей

Системы Linux традиционно используют метод статического создания устройств, посредством чего, большое число узлов устройств (иногда буквально тысячи узлов) создается в каталоге /dev, независимо от того, существуют ли соответствующие аппаратные устройства. Это обычно делается средствами сценария MAKEDEV, который содержит команды вызова программы mknod с соответствующим числом для каждого возможного устройства какое только может существовать.
Используя метод Udev, только те устройства, которые были обнаружены ядром, получают свой узел. Поскольку эти узлы будут создаваться каждый раз, при загрузке системы, они будут располагаться в каталоге виртуальной файловой системы devtmpfs (виртуальная файловая система, которая полностью находится в оперативной памяти). Узлы не занимают много места в памяти, и их общий размер незначителен.
При развитии нестабильной ветки ядра 2.5, позднее, выпущенной как стабильный релиз 2.6, появилась новая виртуальная файловая система sysfs. Задача этой файловой системы заключалась в экспорте представления об аппаратной конфигурации системы в процессах пользовательского окружения. Благодаря этому, разработка замены пользовательского окружения для devfs стала гораздо реалистичнее.
Можно задаться вопросом, как sysfs получает информацию об устройствах в системе, и о том, какие номера устройств должны использоваться для них. Драйверы, скомпилированные в ядро, напрямую регистрируют объекты с помощью sysfs (внутри devtmpfs), так как они обнаруживаются ядром. Для драйверов, которые скомпилированы в виде модулей, регистрация будет происходить при его загрузке. После того, как файловая система sysfs будет примонтирована в каталог /sys, данные, которые регистрируются драйверами, с помощью sysfs, станут доступны для процессов пользовательского окружения и для udevd, для последующей обработки (включая изменения узлов устройств).
Файлы устройств создаются ядром при помощи файловой системы devtmpfs. Любой драйвер, которому необходимо зарегистрировать узел устройства, будет проходить через файловую систему devtmpfs (через системный драйвер ядра). Когда экземпляр devtmpfs монтируется в каталог /dev, узел устройства будет создан с фиксированным наименованием, соответствующими разрешениями и владельцем.
Через некоторое время, ядро отправит uevent в udevd. На основе правил, которые указанны в файлах в каталогах /etc/udev/rules.d, /lib/udev/rules.d, и /run/udev/rules.d, udevd создаст дополнительные символические ссылки на узлы устройств, или сменит разрешения, владельца или группу, или сменит запись (наименование) во внутренней базе данных udevd для этого объекта.
Правила в этих трёх каталогах нумеруются и объединяются вместе. Если udevd не может найти правило для устройства, он оставит права доступа и права собственности на все первоначально используемые devtmpfs.
Драйверы устройств, скомпилированные в виде модулей ядра могут содержать встроенные псевдонимы. Псевдонимы можно увидеть просмотрев вывод программы modinfo. Они, как правило, связаны с идентификаторам шины устройства, поддерживаемым модулем. Например, драйвер snd-fm801 подерживает PCI устройства с идентификатором поставщика 0x1319 и идентификатором устройства 0x0801, и имеет псевдоним «pci:v00001319d00000801sv*sd*bc04sc01i*». Для большинства устройств, драйвер шины экспортирует псевдонимы драйвера, которые будет обрабатывать устройство через sysfs. Например, файл /sys/bus/pci/devices/0000:00:0d.0/modalias может содержать строку «pci:v00001319d00000801sv00001319sd00001319bc04sc01i00». Правила по умолчанию, которые предоставлены Udev, заставят udevd вызвать /sbin/modprobe с содержимым, которое находится в значении переменной окружения MODALIAS uevent (которая должна совпадать с содержимым файла modalias в sysfs), тем самым загружая все модули, чьи псевдонимы совпадают в строке после расширение подстановочных знаков.
К указанному выше примеру, это означает, что в дополнение к snd-fm801 устаревший (и нежелательный) драйвер forte будет загружен, если он будет доступен. Ниже описано, как можно предотвратить загрузку нежелательных драйверов.
Само ядро также может загружать модули для сетевых протоколов, файловых систем и поддержки NLS по требованию.
При подключении устройства, например, MP3-плеер, к универсальной последовательной шине (USB), ядро распознает, что устройство подключено, и сгенерирует событие uevent. Это событие затем обрабатывается udevd, как было описано выше.
Есть несколько возможных проблем, когда дело доходит до автоматического создания узлов устройств.
Модуль ядра не загружается автоматически
Udev будет загружать модуль, только если он имеет указанный псевдоним шины, и драйвер шины правильно экспортирует необходимые псевдонимы в sysfs. В других случаях следует организовать загрузку модуля другими способами. начиная с версии Linux-4.18, в udev, выполняет загрузку правильно написанных драйверов для INPUT, IDE, PCI, USB, SCSI, SERIO, и FireWire устройств.
Чтобы определить, имеет ли требуемый драйвер устройства необходимую поддержку Udev, запустим modinfo с именем модуля в качестве аргумента. Далее, попробуем найти каталог устройства в /sys/bus и проверим, есть ли там файл modalias.
Если файл modalias существует в sysfs, то драйвер, который поддерживает устройство, может общаться с ним напрямую, но не имеет псевдонима, это ошибка в драйвере. Загрузим драйвер без помощи Udev и ожидаем, что проблема будет исправлена позднее.
Если же в каталоге /sys/bus нет файла modalias, это означает, что разработчики ядра еще не добавили поддержку modalias к этому типу шины. В Linux-4.18, это относится к шинам ISA. Ожидайте, что эта проблема будет исправлена в более поздних версиях ядра.
Udev не предназначен для загрузки драйверов «обёрток», таких как snd-pcm-oss и драйверов, не относящихся к оборудованию, например loop
Модуль ядра не загружается автоматически, и Udev не предназначен для его загрузки.
Если модуль «обёртка» только расширяет функциональность, которая может быть предоставлена иным модулем (например модуль snd-pcm-oss расширяет функциональность модуля snd-pcm, давая возможность звуковым картам быть доступными для OSS приложений), настройте modprobe для загрузки оболочки после того, как Udev загрузит обернутый модуль. Для этого добавьте строку «softdep» в файл, который находится в каталоге /etc/modprobe.d/<filename>.conf. Например:

softdep snd-pcm post: snd-pcm-oss

Обращаем внимание, что команда «softdep» разрешает добавлять pre: зависимости, или одновременно pre: и post:. Читаем документацию modprobe.d(5) для изучения синтаксиса и возможностей «softdep».
Если модуль не является обёрткой, и полезен сам по себе, настройте загрузочный сценарий модулей, чтобы он добавлялся при загрузке системы. Для этого добавим имя модуля в файл /etc/sysconfig/modules в отдельной строке. Этот способ сработает и для оберточных модулей, но не является оптимальным.
Udev загружает ненужные модули
Либо не создаём модуль, либо заносим его в черный список в файле /etc/modprobe.d/blacklist.conf. Например:

blacklist forte

Блокированные модули могут быть загружены вручную с явным указанием в команде modprobe.
Udev создает устройство неправильно или создает некорректную символическую ссылку
Это обычно происходит, если правило неожиданно совпадает с устройством. Например, плохо написанное правило может соответствовать как диску SCSI (по желанию), так и соответствующему универсальному устройству SCSI (неправильно) указанному поставщиком. Находим нарушающее правило и уточняем его с помощью команды udevadm info.
Правило Udev работает ненадежно
Это может быть проявлением предыдущей проблемы. В ином случае, если правило использует атрибуты файловой системы sysfs, то это может быть проблемой синхронизации ядра, которая будет исправлена в более поздних версиях ядра. Но вы можете обойти проблему, создав правило, которое ожидает используемый атрибут sysfs и добавляет его к файлу правил (создайте его, если он не существует).
Udev не создаёт устройство
Предполагается, что драйвер статически встроен в ядро или уже загружен как модуль и уже проверили, что Udev не создает устройство с неправильным наименованием.
Udev не обладает информацией, необходимой для создания узла устройства, если драйвер ядра не экспортирует свои данные в sysfs. Как правило, такое происходит с внешними драйверами, которых нет в дереве исходного кода ядра. Создайте статический узел в каталоге /lib/udev/devices с соответствующими первичными и второстепенными номерами (см. файл devices.txt внутри документации ядра или документации, предоставленной сторонним поставщиком драйвера). Статический узел будет скопирован в /dev с помощью udev. Порядок именования устройств изменяется случайным образом после перезагрузки
Это связано с тем, что Udev обрабатывает события и загружает модули параллельно, а значит в непредсказуемом порядке. Это никогда не будет «исправлено». Не следует полагаться на стабильность имен устройств ядра. Вместо этого создайте свои собственные правила, которые делают символические ссылки со стабильными именами на основе некоторых стабильных атрибутов устройства, таких как серийный номер или вывод различных утилит *_id, установленных Udev. В разделах «7.4 Управление устройствами» и «7.5 Конфигурация Сети», есть примеры.
Дополнительная полезная документация:
Реализация devfs в пользовательском окружении
Файловая система sysfs

7.4. Управление устройствами

Cетевое оборудование.
Udev по умолчанию называет сетевые устройства в соответствии с данными прошивки, BIOS или физическими характеристиками, такими как шина, слот или MAC-адрес. Цель такого соглашения о именовании нужна для гарантии того, что сетевые устройства названы последовательно и не на основывались на времени обнаружении усстройства. Например, на компьютере с двумя сетевыми картами производства Intel и Realtek сетевая карта производства Intel может стать eth0, а карта Realtek eth1. В некоторых случаях после перезагрузки, сетевые карты могут быть переименованы в другой последовательности.
В новой схеме именования обычные имена сетевых устройств будут чем-то вроде enp5s0 или wlp3s0. Если это соглашение о именовании не требуется, традиционная схема или своя собственная, может быть использована.
Традиционная схема именования - eth0, eth1 и так далее, могут быть установлены путем добавления net.ifnames=0 в командную строку ядра. Это подойдёт для систем, которые имеют только сетевое устройство одного типа. В ноутбуках часто есть несколько сетевых соединений с именами eth0 и wlan0. Эта схема вполне применима к ним. Командная строка передается в файле конфигурации GRUB
. Именование схемы может быть настроено, созданием собственных правил Udev. Существует файл сценария, который генерирует начальные правила. Чтобы их сгенерировать, выполните команду:

bash /lib/udev/init-net-rules.sh

Проверим файл /etc/udev/rules.d/70-persistent-net.rules, и найдём в нём данные о том, какое название с каким сетевым устройством сопоставлено:

cat /etc/udev/rules.d/70-persistent-net.rules

В некоторых случаях, например, когда MAC-адреса были назначены сетевой карте вручную или в виртуальной среде, такой как Qemu или Xen, возможно, файл сетевых правил не будет создан, поскольку адреса не назначаются последовательно. В этих случаях, этот способ не применим.
Файл начинается с блока комментариев, далее следуют две строки для каждой сетевой карты (NIC). Первая строка, в блоке комментария - это её описание, аппаратные идентификаторы (например, поставщик PCI и идентификаторы устройств, если это PCI-карта), вместе со своим драйвером в скобках, если драйвер удаётся найти. Никакой идентификатор оборудования и драйвер не используются для определения имени интерфейса. Эта информация только для справки. Вторая строка - правило Udev, которое соответствует сетевой карте и фактически присваивает ему имя.
Все правила udev состоят из нескольких ключей, разделенных запятыми и необязательными пробелами. Ключи правила и объяснение каждого из них:
SUBSYSTEM=="net" - сообщает Udev игнорировать устройства, которые не явлвяются сетевыми картами.
ACTION=="add" - сообщает Udev игнорировать это правило для события uevent которое не добавляет (события uevents "удалить" и "добавить" также произойдут, но без необходимости переименования сетевого интерфейса).
DRIVERS=="?*" - Это сделано так, чтобы Udev проигнорировал подинтерфейсы VLAN или моста (потому что эти подинтерфейсы не имеют драйверов). Эти подинтерфейсы пропускаются, поскольку имя, которое было бы назначено, столкнулось бы с их родительскими устройствами.
ATTR{address} - Значение этого ключа - является MAC адресом сетевой карты.
ATTR{type}=="1" - Это гарантирует, что правило только совпадает с основным интерфейсом в случае определенных беспроводных драйверов, которые создают множественные виртуальные интерфейсы. Вторичные интерфейсы пропущены по той же причине, что VLAN и подинтерфейсы моста. В ином случае будет конфликт имен.
NAME - Значение этого ключа - наименование сетевого интерфейса, назначенного Udev.
Значение NAME является важным.
Некоторые программы, которые необходимо установить позднее (например, различные медиа-проигрыватели), ожидают, устройства /dev/cdrom и /dev/dvd и символические ссылки на CD-ROM или DVD-ROM устройства. Кроме того, может быть удобно поместить ссылки на эти символические ссылки в /etc/fstab. Udev поставляется со файлом сценария, который будет генерировать файлы правил для создания этих символических ссылок, в зависимости от возможностей каждого устройства, нужно решить, какой из двух режимов работы необходимо использовать.
Во-первых, скрипт может работать в режиме «by-path» (используется по умолчанию для USB и FireWire устройств), где создаваемые им правила зависят от физического пути к CD или DVD устройству. Во-вторых, он может работать в режиме «by-id» (по умолчанию для устройств IDE и SCSI), где создаваемые им правила зависят от строк идентификации, хранящихся в самом устройстве CD или DVD. Путь определяется сценарием Udev path_id, а идентификационные строки считываются с оборудования программами ata_id или scsi_id, в зависимости от того, какой тип устройства имеется. У каждого подхода есть свои преимущества; правильный подход к использованию будет зависеть от того, какие изменения устройств могут произойти. Если вы ожидаете, что физический путь к устройству (порты и/или слоты, которые он подключает), изменится, например, потому, что вы планируете переместить диск в другой порт IDE или другой разъем USB, то вы должны использовать режим «by-id». С другой стороны, если вы ожидаете, что идентификация устройства изменится, например, потому, что оно может умереть, и вы замените его другим устройством с теми же возможностями и которое подключено к тем же разъемам, тогда вы должны использовать режим «by-path».
Если с устройством возможен любой из вариантов, выбираем тот, который случается наиболее часто.
Внешние устройства (например, компакт-диск, подключенный через USB) не следует использовать методом «by-path», потому что каждый раз, когда устройство подключено в новый внешний порт, изменится его физический путь. Все внешние устройства подвержены этой проблеме при написании правил Udev при распознавании их по их физическому пути. К тому же, эта проблема не ограничивается CD и DVD-дисками.
Если необходимо увидеть значения, которые будут использоваться сценариями Udev, то для соответствующего устройства CD-ROM найдите в каталоге /sys (например, это может быть каталог /sys/block/hdd) и выполните команду, наподобие следующей:

udevadm test /sys/block/hdd

Обращаем внимание на строки, содержащие вывод различных программ *_id. Режим «by-id» будет использовать значение ID_SERIAL если оно существует и не пустое, иначе будет использована комбинация ID_MODEL и ID_REVISION. Режим «by-path» будет использовать значение ID_PATH.
Если режим по умолчанию не подходит, то в файле /etc/udev/rules.d/83-cdrom-symlinks.rules можно сделать изменение следующим образом (где mode один из «by-id» или «by-path»):

sed -i -e 's/"write_cd_rules"/"write_cd_rules mode"/' \
/etc/udev/rules.d/83-cdrom-symlinks.rules


Обращаем внимание, что на данный момент, нет необходимости создавать файлы правил или символические ссылки, так как вы смонтировали каталог /dev хост системы в системе LFS, и предполагаем, что символические ссылки уже существуют. Правила и символические ссылки будут созданы при первой загрузке LFS системы.
Однако, если есть несколько устройств CD-ROM, то символические ссылки, сгенерированные в то время, могут указывать на другие устройства, и иметь различия от хост системы, потому что устройства не будут обнаружены в предсказуемом порядке. Назначения, созданные при первой загрузке системы LFS, будут стабильными, поэтому проблема возникает только в том случае, если символические ссылки в обеих системах указывают на одно и то же устройство. Если потребуется, проверьте (и, возможно, отредактируйте) сгенерированные правила в файле /etc/udev/rules.d/70-persistent-cd.rules после загрузки, чтобы убедиться, что назначенные символические ссылки соответствуют.
Как поясняется в Раздел «7.3 Обработка устройств и модулей», порядок отображения устройства с одинаковой функциональностью в /dev является, как правило, случайным. Например, если у вас есть веб камера и TV тюнер, иногда /dev/video0 ссылается на камеру, а /dev/video1 ссылается на TV тюнер, а иногда, например, после перезагрузки системы, порядок поменяется на противоположный. Для всех классов оборудования, кроме звуковых и сетевых карт, это поправимо, путем создания пользовательских постоянных ссылкок udev. Случай относительно сетевых карт рассказаны отдельно в Раздел «7.5 Конфигурация Сети», и инструкции по конфигурированию звуковых карт можно найти в BLFS.
Для каждого из устройств, которые могут иметь такую проблему (даже если проблема не существует в текущем дистрибутиве Linux), находим соответствующий каталог в /sys/class или /sys/block. Для видео устройств, это могут быть каталоги /sys/class/video4linux/videoX. Выясняем атрибуты, которые идентифицируют устройство однозначно (обычно, это идентификаторы поставщика и продукта и / или серийные номера):

udevadm info -a -p /sys/class/video4linux/video0

Напишим правило, которое создаёт символические ссылки:

cat > /etc/udev/rules.d/83-duplicate_devs.rules << "EOF"
# Persistent symlinks for webcam and tuner
KERNEL=="video*", ATTRS{idProduct}=="1910", ATTRS{idVendor}=="0d81", \
SYMLINK+="webcam" KERNEL=="video*", ATTRS{device}=="0x036f", ATTRS{vendor}=="0x109e", \
SYMLINK+="tvtuner"
EOF


В результате устройства /dev/video0 и /dev/video1 по-прежнему случайным образом ссылаются на TV тюнер и веб-камеру (и следовательно, никогда не должны использоваться напрямую), но есть символические ссылки /dev/tvtuner и /dev/webcam, которые всегда указывают на правильное устройство.

7.5. Конфигурация Сети

Какие интерфейсы вызываются и выключаются сетевым сценарием, обычно зависит от файлов, которые находятся в каталоге /etc/sysconfig/. Этот каталог должен содержать файл для каждого настраиваемого интерфейса, например ifconfig.xyz, где "xyz" должен описывать сетевую карту. Имя интерфейса (например, eth0) обычно является подходящим. Внутри этого файла находятся атрибуты этого интерфейса, такие как IP-адреса, маски подсети и так далее. Необходимо, чтобы название файла начиналось с ifconfig.
Если процедура в предыдущем разделе не использовалась, Udev назначит имена интерфейсов сетевых карт на основе физических характеристик системы, таких как enp2s1. Если не уверены, каково имя интерфейса, всегда можено запустить команду ip link или ls /sys/class/net после загрузки системы.
Следующая команда создает пример конфигурационного файла для устройства eth0 со статическим IP-адресом:

cd /etc/sysconfig/
cat > ifconfig.eth0 << "EOF"
ONBOOT=yes
IFACE=eth0
SERVICE=ipv4-static
IP=192.168.1.2
GATEWAY=192.168.1.1
PREFIX=24
BROADCAST=192.168.1.255
EOF


Значения этих переменных должны быть изменены в каждом файле, для правильной настройки и работы сети.
Если переменной ONBOOT указать значение «yes», сценарий работы сети пакета System V вызовет сетевую карту в процессе загрузки системы. Если задано значение, отличное от «yes», сетевой адаптер будет игнорироваться сценарием и не будет автоматически вызываться. Интерфейс можно запустить или остановить вручную с помощью команд ifup и ifdown.
Переменная IFACE определяет имя сетевого интерфейса, например, eth0. Она необходима для всех файлов конфигураций сетевых устройств.
Переменная SERVICE определяет метод получения IP-адреса. Пакет LFS-Bootscripts имеет модульный формат назначения IP, и создание дополнительных файлов в каталоге /lib/services/ позволит использовать другие методы назначения IP. Как правило, используется для протокола DHCP (Dynamic Host Configuration Protocol), который рассматривается в книге BLFS.
Переменная GATEWAY должна содержать значение по умолчанию IP-адрес шлюза, если таковой имеется. Если нет, то закомментируйте строку.
Переменная PREFIX переменная содержит количество бит, используемых в подсети. Каждый байт в IP адресе - 8 бит. Если маска подсети 255.255.255.0, в таком случае, используется первые три байта (24 бита) для указания сетевого номера. Если маска подсети 255.255.255.240, то будет использовано первые 24 бита. Префиксы длиннее, чем 24 бита используются в основном провайдерами с сDSL и кабельными соединениями. В этом примере (PREFIX=24) маска подсети 255.255.255.0. Настройте переменную PREFIX в соответствии конфигурацией вашей подсети. Если опустить префикс, по умолчанию будет значение 24.
Для более подробной информации, прочитайте руководство ifup.
Системе потребуются некоторые средства для получения имен службы доменных имен (DNS) для преобразования доменных имен сети Интернет в IP-адреса и наоборот. Это достигается путем размещения IP-адреса DNS-сервера, доступного от провайдера или администратора сети, в /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


Запись domain может быть опущена или заменена search записью. Читаем руководство resolv.conf для более подробной информации. Заменим <IP address of the nameserver> адресом наиболее подходящего DNS сервера. DNS серверов, может быть указано более одной записи (необходимо для вторичных серверов для возможности резервного переключения). Если вам нужен только один DNS-сервер, удалите вторую строку nameserver из файла. IP-адрес также может быть маршрутизатором в локальной сети.
Адреса общедоступных DNS серверов Google - 8.8.8.8 и 8.8.4.4.
В процессе загрузки файл /etc/hostname используется для установки имени хоста системы.
Создаём файл /etc/hostname и внесим в имя хоста:

echo "<lfs>" > /etc/hostname

<lfs> заменим на имя компьютера. Не вносите FQDN имя. Эта информация должна располагаться в файле /etc/hosts.
Определяем IP-адрес, полное доменное имя (FQDN) и возможные псевдонимы для использования в файле /etc/hosts. Синтаксис команды:

IP_address myhost.example.org aliases

Если компьютер не должен быть виден в Интернете (т. е. есть зарегистрированный домен и допустимый блок назначенных IP—адресов не имеются), убедимся, что IP-адрес находится в диапазоне IP-адресов частной сети. Допустимые диапазоны:

Private Network Address Range Normal Prefix
10.0.0.1 - 10.255.255.254 8
172.x.0.1 - 172.x.255.254 16
192.168.y.1 - 192.168.y.254 24


x может быть номером в пределах 16-31. y может быть номером в пределах 0-255.
Правильный IP адрес может быть 192.168.1.1. Правильный FQDN для этого IP адреса может быть lfs.example.org.
Даже если сетевая карта не используется, все равно требуется действительное полное доменное имя. Оно необходимо для правильной работы некоторых программ.
Создаём файл /etc/hosts:

cat > /etc/hosts << "EOF"
# Begin /etc/hosts
127.0.0.1 localhost
127.0.1.1 <FQDN> <HOSTNAME>
<192.168.1.1> <FQDN> <HOSTNAME> [alias1] [alias2 ...]
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
# End /etc/hosts
EOF


Значения <192.168.1.1>, <FQDN> и <HOSTNAME> должны быть изменены в соответствии с предпочтениями пользователя и параметров сети (если имеется IP-адрес выданный системным / сетевым администратором и машина подключена к существующей сети.) Необязательные псевдонимы могут быть опущены.

7.6. Настройка и использование System V Bootscript

В Linux используется специальное средство загрузки SysVinit, основанное на концепции уровней выполнения (run-levels). Он может сильно отличаться от одной системы к другой, поэтому нельзя предположить, что, корректная работа в одном дистрибутиве Linux, должны работать одинаково и в LFS. У LFS есть свой собственный способ управления, но она уважает общепринятые стандарты.
SysVinit (который теперь будет называться «init») работает по схеме уровней выполнения. Есть семь (пронумерованных от 0 до 6) уровней выполнения (на самом деле, есть больше уровней выполнения, но они предназначены для особых случаев и обычно не используются. См. init(8) Для получения более подробной информации), и каждый из них соответствует действиям, которые компьютер должен выполнять при запуске. Уровень запуска по умолчанию-3. Ниже приведены описания различных уровней запуска по мере их реализации:
0: остановить компьютер
1: однопользовательский режим
2: многопользовательский режим без сети
3 многопользовательский режим с сетью
4: зарезервированный для настроек, в ином случае аналогичен уровню 3
5: аналогичен уровню 3, 4 обычно используется для GUI авторизации (например xdm или kdm)
6: перезагрузка компьютера
Во время инициализации ядра первая запущенная программа указывается либо в командной строке, либо по умолчанию в init. Эта программа читает файл инициализации /etc/inittab. Создаём этот файл:

cat > /etc/inittab <<"EOF"
# Begin /etc/inittab
id:3:initdefault:
si::sysinit:/etc/rc.d/init.d/rc S
l0:0:wait:/etc/rc.d/init.d/rc 0
l1:S1:wait:/etc/rc.d/init.d/rc 1
l2:2:wait:/etc/rc.d/init.d/rc 2
l3:3:wait:/etc/rc.d/init.d/rc 3
l4:4:wait:/etc/rc.d/init.d/rc 4
l5:5:wait:/etc/rc.d/init.d/rc 5
l6:6:wait:/etc/rc.d/init.d/rc 6
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
su:S016:once:/sbin/sulogin
1:2345:respawn:/sbin/agetty --noclear tty1 9600
2:2345:respawn:/sbin/agetty tty2 9600
3:2345:respawn:/sbin/agetty tty3 9600
4:2345:respawn:/sbin/agetty tty4 9600
5:2345:respawn:/sbin/agetty tty5 9600
6:2345:respawn:/sbin/agetty tty6 9600
# End /etc/inittab
EOF


Объяснение содержимого файла инициализации находится на справочных страницах inittab. Для LFS ключевой командой является rc. В приведенном выше файле инициализации rc будет выполнять все сценарии, начиная с символа S в каталоге /etc/rc.d/rcS.d, за которым следуют все скрипты, начинающиеся с S в /etc/rc.d/rc?.D, каталог, в котором знак вопроса задается значением initdefault.
Для удобства, сценарий rc считывает функции из библиотеки /lib/lsb/init-functions. Библиотека, в свою очередь, считывает опциональные файлы конфигурации из файла /etc/sysconfig/rc.site. Любой из системных конфигурационных файлов описанных в последующих разделах можно, в качестве альтернативы, поместить в этот файл, что позволит объединить все системные параметры в один файл.
Для удобства отладки, функции сценария журналируют весь вывод в файл /run/var/bootlog. Поскольку каталог /run является tmpfs, файла может не быть, в процессе загрузки, однако уго содержимое добавляется к фиксированному файлу /var/log/boot.log при завершении процесса загрузки. Изменить уровень выполнения можно с помощью команды init <runlevel>, где <runlevel> - будет целевым уровнем выполнения. Например, чтобы перезагрузить компьютер, пользователь должен выполнить команду init 6, которая является псевдонимом команды reboot. Аналогично, init 0 является псевдонимом команды halt. В каталоге /etc/rc.d есть ещё несколько каталогов, которые выглядят как rc?.d (где ? номер уровня выполнения) и каталог rcsysinit.d, содержащий некоторый набор символических ссылок. Некоторые начинаются с K, другие начинаются с S, и все они имеют два числа после начальной буквы. K означает остановить (kill) службу, а S означает запустить службу. Числа определяют порядок выполнения сценариев от 00 до 99 - чем меньше число, тем раньше он запустится. Когда init переключается на другой уровень выполнения, соответствующие службы запускаются или останавливаются в зависимости от выбранного уровня запуска.
Реальные сценарии находятся в каталоге /etc/rc.d/init.d. Они выполняют фактическую работу, и символические ссылки указывают на них. Ссылки К и ссылки S указывают на тот же сценарий в /etc/rc.d/init.d. Это связано с тем, что сценарии можно вызывать с различными параметрами, такими как start, stop, restart, reload, и status. Когда встречается ссылка K, соответствующий скрипт запускается с аргументом stop. Когда встречается S-ссылка, соответствующий скрипт запускается с аргументом start.
Есть одно исключение. Ссылки, которые начинаются с S в каталогах rc0.d и rc6.d, не будут запускать что-либо. Они будут вызываться с параметром stop, для того, чтобы остановить какую либо службу. Логика этого заключается в том, что когда пользователь собирается перезагрузить или остановить систему, при этом, ему ничего не нужно запускать. Систему нужно только остановить.
Ниже приведены описания к аргументам для сценариев и их значения:
start Служба запущена.
stop Служба остановлена.
restart Остановка службы и затем повторный её запуск.
reload Конфигурация службы была обновлена. Используется после того, как файлы конфигурации были обновлены, когда службу не нужно перезапускать.
status Сообщает, работает ли служба и какие ей назначены PID.
Не стесняемся изменять способ загрузки процесса. Приведенные здесь файлы являются примером того, как это можно сделать. /etc/rc.d/init.d/udev initscript запускает udevd, запускает любые устройства «coldplug», которые уже были созданы ядром, и ждет каких-либо правил для завершения. Сценарий также отключает обработчик uevent от значения по умолчанию /sbin/hotplug. Это делается потому, что ядру больше не нужно вызывать внешний двоичный файл. Вместо этого udevd будет прослушивать сокет netlink для uevents, который повышает ядро.
/etc/rc.d/init.d/udev_retry initscript заботится о событиях повторного запуска для подсистем, правила которых могут опираться на файловые системы, которые не монтируются до запуска скрипта mountfs (в частности, /usr и /var могут вызывать это). Этот скрипт запускается после скрипта mountfs, поэтому эти правила (если они запускаются повторно) должны преуспеть во второй раз. Он настроен из файла /etc/sysconfig/udev_retry; любые слова в этом файле, кроме комментариев, считаются именами подсистем, которые запускаются при повторном запуске. Чтобы найти подсистему устройства, используйте udevadm info --attribute-walk <device>, где <device> - абсолютный путь в /dev или /sys, такой как /dev/sr0 или /sys/class/rtc.
Настройка системных часов:
Сценарий setclock считывает время с аппаратных часов, также называемое часами BIOS или дополнительным полупроводниковым металлом (CMOS). Если аппаратные часы установлены на UTC, этот скрипт будет преобразовывать время аппаратных часов в локальное время, используя файл /etc/localtime (который сообщает программе hwclock, в которой находится часовой пояс, в котором находится пользователь). Невозможно определить, установлены ли аппаратные часы в UTC, поэтому это нужно настроить вручную. Setclock запускается через udev, когда ядро обнаруживает аппаратную возможность при загрузке. Его также можно запустить вручную с помощью параметра остановки, чтобы сохранить системное время для часов CMOS.
Если вы не можете вспомнить, установлены ли аппаратные часы в 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
# Set this to any options you might need to give to hwclock,
# such as machine hardware clock type for Alphas.
CLOCKPARAMS=
# End /etc/sysconfig/clock
EOF


Подсказку, объясняющую, как настроить время в LFS, можно найти здесь. Там описываются вопросы, как часовые пояса, UTC и переменная окружения TZ.
Параметры CLOCKPARAMS и UTC могут быть альтернативно установлены в файле /etc/sysconfig/rc.site.
Настройка консоли Linux:
В этом разделе обсуждается, как настроить загрузочный скрипт консоли, который устанавливает карту клавиатуры, шрифт консоли и уровень журнала консоли. Если символы, отличные от ASCII (например, знак авторского права, знак британского фунта и символ евро), не будут использоваться, а клавиатура - в США. Большая часть этого раздела может быть пропущена. Без файла конфигурации (или эквивалентных настроек в rc.site) консольный bootscript ничего не сделает.
Скрипт консоли читает файл /etc/sysconfig/console для информации о конфигурации. Определяем, какой шрифт клавиатуры и экран будут использоваться. Различные языковые HOWTO также могут помочь в этом. Если вы все еще сомневаетесь, посмотрите в каталогах /usr/share/keymaps и /usr/share/consolefonts для действительных раскладок и экранных шрифтов. Прочтите страницы загрузочных клавиш (1) и setfont (8) вручную, чтобы определить правильные аргументы для этих программ.
Файл /etc/sysconfig/console должен содержать строки вида: VARIABLE = "value". Признаны следующие переменные:
LOGLEVEL Эта переменная определяет уровень журнала для сообщений ядра, отправленных на консоль, как установлено dmesg. Допустимые уровни от «1» (без сообщений) до «8». Уровень по умолчанию - «7».
KEYMAP Эта переменная указывает аргументы для программы loadkeys, как правило, имя карты клавиатуры для загрузки, например, «it». Если эта переменная не установлена, bootscript не будет запускать программу loadkeys, и будет использоваться ключевая карта ядра по умолчанию. Обратите внимание, что несколько раскладок имеют несколько версий с тем же именем (cz и его варианты в qwerty/ и qwertz/, es в olpc/ и qwerty/, и trf в fgGIod/ и qwerty/). В этих случаях также должен быть указан родительский каталог (например, qwerty/es), чтобы убедиться, что загружена соответствующая карта.
KEYMAP_CORRECTIONS Эта (редко используемая) переменная указывает аргументы для второго вызова программы loadkeys. Это полезно, если справочная карта запаса не является полностью удовлетворительной и требуется небольшая корректировка. Например, чтобы включить знак Euro в ключевую карту, которая обычно не имеет ее, установите для этой переменной значение «euro2».
FONT Эта переменная указывает аргументы для программы setfont. Как правило, это включает в себя имя шрифта, «-m» и имя карты символов приложения для загрузки. Например, чтобы загрузить шрифт «lat1-16» вместе с картой символов приложения «8859-1» (как это уместно в США), установите для этой переменной значение «lat1-16 -m 8859-1». В режиме UTF-8 ядро использует карту символов приложения для преобразования скомпонованных 8-битных кодов клавиш в карту клавиатуры в UTF-8, и поэтому аргумент параметра «-m» должен быть установлен в кодировку составленного коды клавиш в ключевой карте.
UNICODE установим эту переменную в «1», «да» или «истина», чтобы перевести консоль в режим UTF-8. Это полезно в локациях на основе UTF-8 и в противном случае вредно.
LEGACY_CHARSET Для многих раскладок клавиатуры в пакете Kbd отсутствует карта Unicode. Консоль bootscript преобразует доступную раскладку в UTF-8 «на лету», если эта переменная установлена на кодировку доступной раскладки клавиатуры, отличной от UTF-8.
Для настройки, отличной от Unicode, обычно требуются только переменные KEYMAP и FONT. Например, для польской настройки можно использовать:

cat > /etc/sysconfig/console << "EOF"
# Begin /etc/sysconfig/console
KEYMAP="pl2"
FONT="lat2a-16 -m 8859-2"
# End /etc/sysconfig/console
EOF


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

cat > /etc/sysconfig/console << "EOF"
# Begin /etc/sysconfig/console
KEYMAP="de-latin1"
KEYMAP_CORRECTIONS="euro2"
FONT="lat0-16 -m 8859-15"
# End /etc/sysconfig/console
EOF


Ниже приведен пример с поддержкой Unicode для болгарского языка, в котором имеется справочная карта акций UTF-8:

cat > /etc/sysconfig/console << "EOF"
# Begin /etc/sysconfig/console
UNICODE="1"
KEYMAP="bg_bds-utf8"
FONT="LatArCyrHeb-16"
# End /etc/sysconfig/console
EOF


Из-за использования шрифта 512-glyph LatArCyrHeb-16 в предыдущем примере яркие цвета больше не доступны на консоли Linux, если не используется фреймбуфер. Если хотим иметь яркие цвета без фреймбуфера и можете жить без символов, не принадлежащих к его языку, все равно можно использовать шрифт 256-глифового языка, как показано ниже:

cat > /etc/sysconfig/console << "EOF"
# Begin /etc/sysconfig/console
UNICODE="1"
KEYMAP="bg_bds-utf8"
FONT="cyr-sun16"
# End /etc/sysconfig/console
EOF


Следующий пример иллюстрирует автоконверсию keymap из ISO-8859-15 в UTF-8 и включение мертвых ключей в режиме Unicode:

cat > /etc/sysconfig/console << "EOF"
# Begin /etc/sysconfig/console
UNICODE="1"
KEYMAP="de-latin1"
KEYMAP_CORRECTIONS="euro2"
LEGACY_CHARSET="iso-8859-15"
FONT="LatArCyrHeb-16 -m 8859-15"
# End /etc/sysconfig/console
EOF


Некоторые клавиши имеют мертвые ключи (т.е. клавиши, которые сами по себе не создают персонаж, но добавляют акцент на символ, созданный следующим ключом) или определяют правила композиции (например: «нажммём Ctrl +. AE, чтобы получить Æ» в по умолчанию). Linux-4.18 правильно интерпретирует мертвые ключи и правила композиции в карте памяти только тогда, когда исходные символы, которые должны быть составлены вместе, не являются многобайтными. Этот недостаток не влияет на ключевые карты для европейских языков, потому что акценты добавляются к безрезультатным символам ASCII, или два символа ASCII составлены вместе. Однако в режиме UTF-8 это проблема, например, для греческого языка, где иногда приходится указывать акцент на букве «альфа». Решение состоит в том, чтобы избежать использования UTF-8 или установить систему окон X, которая не имеет этого ограничения при обработке ввода.
Для китайского, японского, корейского и некоторых других языков консоль Linux не может быть настроена для отображения необходимых символов. Пользователи, которым нужны такие языки, должны установить X Window System, шрифты, которые охватывают необходимые диапазоны символов, и правильный метод ввода (например, SCIM, он поддерживает широкий спектр языков).
Файл /etc/sysconfig/console управляет только локализацией текстовой консоли Linux. Он не имеет ничего общего с настройкой правильной раскладки клавиатуры и терминальных шрифтов в X Window System, с сеансами ssh или с последовательной консолью. В таких ситуациях ограничения, упомянутые в последних двух перечисленных выше пунктах, не применяются.
Время от времени желательно создавать файлы во время загрузки. Например, может потребоваться каталог /tmp/.ICE-unix. Это можно сделать, создав запись в сценарии конфигурации /etc/sysconfig/createfiles. Формат этого файла встроен в комментарии файла конфигурации по умолчанию.
Сценарий sysklogd вызывает программу syslogd как часть инициализации System V. Параметр -m 0 отключает метку временной метки, которую syslogd записывает в файлы журнала каждые 20 минут по умолчанию. Если вы хотите включить эту метку временной метки, отредактируйте файл /etc/sysconfig/rc.site и определите переменную SYSKLOGD_PARMS на нужное значение. Например, чтобы удалить все параметры, установите для переменной значение null:

SYSKLOGD_PARMS=

См. Man syslogd для получения дополнительных параметров.
Дополнительный файл /etc/sysconfig/rc.site содержит параметры, которые автоматически устанавливаются для каждого скрипта загрузки SystemV. Он может альтернативно устанавливать значения, указанные в имени хоста, консоли и файлах часов в каталоге /etc/sysconfig/. Если связанные переменные присутствуют в обоих этих отдельных файлах и rc.site, значения в файлах, специфичных для скрипта, имеют приоритет.
rc.site также содержит параметры, которые могут настраивать другие аспекты процесса загрузки. Установка переменной IPROMPT позволит выборочно запускать bootscripts. Другие параметры описаны в комментариях к файлам. Версия файла по умолчанию выглядит следующим образом:

# rc.site
# Optional parameters for boot scripts
# Distro Information
# These values, if specified here, override the defaults
#DISTRO="Linux From Scratch" # The distro name
#DISTRO_CONTACT="lfs-dev@linuxfromscratch.org" # Bug report address
#DISTRO_MINI="LFS" # Short name used in filenames for distro config
# Define custom colors used in messages printed to the screen
# Please consult `man console_codes` for more information
# under the "ECMA-48 Set Graphics Rendition" section
# Warning: when switching from a 8bit to a 9bit font,
# the linux console will reinterpret the bold (1;) to
# the top 256 glyphs of the 9bit font. This does
# not affect framebuffer consoles
# These values, if specified here, override the defaults
#BRACKET="\\033[1;34m" # Blue
#FAILURE="\\033[1;31m" # Red
#INFO="\\033[1;36m" # Cyan
#NORMAL="\\033[0;39m" # Grey
#SUCCESS="\\033[1;32m" # Green
#WARNING="\\033[1;33m" # Yellow
# Use a colored prefix
# These values, if specified here, override the defaults
#BMPREFIX=" "
#SUCCESS_PREFIX="${SUCCESS} * ${NORMAL}"
#FAILURE_PREFIX="${FAILURE}*****${NORMAL}"
#WARNING_PREFIX="${WARNING} *** ${NORMAL}"
# Manually seet the right edge of message output (characters)
# Useful when resetting console font during boot to override
# automatic screen width detection
#COLUMNS=120
# Interactive startup
#IPROMPT="yes" # Whether to display the interactive boot prompt
#itime="3" # The amount of time (in seconds) to display the prompt
# The total length of the distro welcome string, without escape codes
#wlen=$(echo "Welcome to ${DISTRO}" | wc -c )
#welcome_message="Welcome to ${INFO}${DISTRO}${NORMAL}"
# The total length of the interactive string, without escape codes
#ilen=$(echo "Press 'I' to enter interactive startup" | wc -c )
#i_message="Press '${FAILURE}I${NORMAL}' to enter interactive startup"
# Set scripts to skip the file system check on reboot
#FASTBOOT=yes
# Skip reading from the console
#HEADLESS=yes
# Write out fsck progress if yes
#VERBOSE_FSCK=no
# Speed up boot without waiting for settle in udev
#OMIT_UDEV_SETTLE=y
# Speed up boot without waiting for settle in udev_retry
#OMIT_UDEV_RETRY_SETTLE=yes
# Skip cleaning /tmp if yes
#SKIPTMPCLEAN=no
# For setclock
#UTC=1
#CLOCKPARAMS=
# For consolelog (Note that the default, 7=debug, is noisy)
#LOGLEVEL=7
# For network
#HOSTNAME=mylfs
# Delay between TERM and KILL signals at shutdown
#KILLDELAY=3
# Optional sysklogd parameters
#SYSKLOGD_PARMS="-m 0"
# Console parameters
#UNICODE=1
#KEYMAP="de-latin1"
#KEYMAP_CORRECTIONS="euro2"
#FONT="lat0-16 -m 8859-15"
#LEGACY_CHARSET=


Сценарии загрузки LFS загружаются и завершают работу системы довольно эффективно, но есть несколько настроек, которые вы можете сделать в файле rc.site, чтобы еще больше повысить скорость и настроить сообщения в соответствии с вашими предпочтениями. Для этого настройте параметры в файле /etc/sysconfig/rc.site выше.
Во время загрузочного скрипта udev есть призыв к udev, который требует некоторого времени для завершения. Это время может потребоваться или не потребоваться в зависимости от устройств, присутствующих в системе. Если у вас есть только простые разделы и одна сетевая карта, процесс загрузки, вероятно, не потребуется ждать этой команды. Чтобы пропустить его, установите переменную OMIT_UDEV_SETTLE = y.
Загрузочный скрипт udev_retry также запускает udev по умолчанию. Эта команда нужна только по умолчанию, если каталог /var отдельно установлен. Это связано с тем, что для часов требуется файл /var/lib/hwclock/adjtime. Другие настройки могут также потребовать, чтобы udev завершился, но на многих установках он не нужен. Пропустите команду, установив переменную OMIT_UDEV_RETRY_SETTLE = y.
По умолчанию проверка файловой системы отключена. Это может показаться задержка во время процесса загрузки. Чтобы включить выход fsck, установите переменную VERBOSE_FSCK = y.
При перезагрузке вы можете полностью пропустить проверку файловой системы, fsck. Для этого создайте файл /fastboot или перезагрузите систему с помощью команды /sbin/shutdown -f -r. С другой стороны, вы можете принудительно проверить все файловые системы, создав /forcefsck или выполнив shutdown с параметром -F вместо -f.
Установка переменной FASTBOOT = y отключит fsck во время процесса загрузки до ее удаления. Это не рекомендуется на постоянной основе.
Как правило, все файлы в каталоге /tmp удаляются во время загрузки. В зависимости от количества присутствующих файлов или каталогов это может вызвать заметную задержку в процессе загрузки. Чтобы пропустить удаление этих файлов, установите переменную SKIPTMPCLEAN = y.
Во время выключения программа init отправляет сигнал TERM для каждой запущенной программы (например, agetty), ждет заданное время (по умолчанию 3 секунды) и отправляет каждому процессу сигнал KILL и снова ждет. Этот процесс повторяется в сценарии sendignals для любых процессов, которые не закрываются их собственными скриптами. Задержка для init может быть установлена путем передачи параметра. Например, чтобы удалить задержку в init, передайте параметр -t0 при выключении или перезагрузке (например, /sbin/shutdown -t0 -r сейчас). Задержку для сценария sendignals можно пропустить, установив параметр KILLDELAY = 0.

7.7. Файлы запуска оболочки Bash

Программа оболочки /bin/bash (далее называемая «оболочкой») использует коллекцию файлов запуска, чтобы помочь создать среду для запуска. Каждый файл имеет конкретное использование и может влиять на логин и интерактивные среды по-разному. Файлы в каталоге /etc предоставляют глобальные настройки. Если в домашнем каталоге существует эквивалентный файл, он может переопределять глобальные настройки.
Интерактивная оболочка входа запускается после успешного входа в систему, используя /bin/login, путем чтения файла /etc/passwd. Интерактивная оболочка без входа запускается в командной строке (например, [приглашение] $ /bin/bash). Неинтерактивная оболочка обычно присутствует при запуске скрипта оболочки. Он неинтерактивен, поскольку обрабатывает скрипт и не ждет ввода пользователем команд.
Файлы /etc/profile и ~/.bash_profile читаются, когда оболочка вызывается как интерактивная оболочка входа.
В /etc/profile ниже приведены некоторые переменные среды, необходимые для поддержки родного языка.
Правильная настройка их результатов.
Вывод программ, переведенных на родной язык.
Правильная классификация символов на буквы, цифры и другие классы. Это необходимо для того, чтобы bash правильно принимал символы, отличные от ASCII, в командных строках в неанглийских локалях.
Правильный алфавитный порядок сортировки для страны.
Соответствующий размер бумаги по умолчанию.
Правильное форматирование значений денежных средств, времени и даты.
Замените <ll> ниже двухбуквенным кодом для желаемого языка (например, «en») и <CC> с двухбуквенным кодом для соответствующей страны (например, «GB»). <charmap> следует заменить каноническим charmap для выбранной вами локали. Могут также присутствовать дополнительные модификаторы, такие как «@euro». Список всех локалей, поддерживаемых Glibc, можно получить, запустив следующую команду:

locale -a

Charmaps может иметь несколько псевдонимов, например, «ISO-8859-1» также упоминается как «iso8859-1» и «iso88591». Некоторые приложения не могут правильно обрабатывать различные синонимы (например, требуют, чтобы «UTF-8» записывался как «UTF-8», а не «utf8»), поэтому в большинстве случаев безопаснее выбирать каноническое имя для определенной локали. Чтобы определить каноническое имя, выполните следующую команду, где <locale name> - это результат, заданный locale -a для предпочтительного языкового стандарта («en_GB.iso88591» в примере).

LC_ALL=<locale name> locale charmap

Для локали «en_GB.iso88591» указанная выше команда будет печатать:

ISO-8859-1

Это приводит к окончательной настройке локали «en_GB.ISO-8859-1». Важно, чтобы локаль, найденная с использованием эвристики выше, была протестирована до ее добавления в файлы запуска Bash:

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


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

locale: Cannot set LC_* to default locale: No such file or directory

Если это произойдет, необходимо либо установить желаемый язык с помощью команды localedef, либо выбрать другой язык. Дальнейшие инструкции предполагают, что таких сообщений об ошибках от Glibc нет.
Некоторые пакеты за пределами LFS также могут не поддерживать выбранную локаль. Одним из примеров является библиотека X (часть X Window System), которая выводит следующее сообщение об ошибке, если локаль не соответствует точно одному из имен символов в своих внутренних файлах:

Warning: locale not supported by Xlib, locale set to C

В некоторых случаях Xlib ожидает, что карта символов будет указана в верхнем регистре с каноническими тире. Например, «ISO-8859-1», а не «iso88591». Также можно найти соответствующую спецификацию, удалив часть charmap спецификации локали. Это можно проверить, выполнив команду 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><@modifiers>
# End /etc/profile
EOF


«C» (по умолчанию) и «en_US» (рекомендуемый для пользователей из Соединенных Штатов Америки) разные. «C» использует 7-битный набор символов US-ASCII и обрабатывает байты с высоким битом, установленным как недопустимые символы. Вот почему, например, команда ls заменяет их вопросительными знаками в этой локали. Кроме того, попытка отправить почту с такими символами из Mutt или Pine приводит к отправке сообщений, не соответствующих RFC-сообщениям (кодировка в исходящей почте обозначается как «неизвестный 8-бит»). Таким образом, вы можете использовать локаль «C», только если вы уверены, что вам никогда не понадобятся 8-битные символы.
Некоторые локации на основе UTF-8 не поддерживаются. Ведется работа по документированию и, если возможно, решению таких проблем.

7.8. Создание файла /etc/inputrc

Файл inputrc -это файл конфигурации библиотеки Readline, который предоставляет возможности редактирования при вводе пользователем строки из терминала. Он перенаправляет ввода с клавиатуры в конкретные действия. Readline используется в Bash и большинством других оболочек, а также многими другими приложениями.
Большинство не нуждаются в настраиваемой вручную функциональности, поэтому команда ниже создает глобальный /etc/inputrc, используемый всеми, кто входит в систему. Если решите, что необходимо переопределить значения по умолчанию для каждого пользователя, можно создать файл .inputrc в домашнем каталоге пользователя с измененными назначениями.
Ниже приведен общий глобальный inputrc вместе с комментариями, чтобы объяснить, что делают различные варианты. Обращаем внимание, что комментарии не могут находиться в одной строке с командами.

cat > /etc/inputrc << "EOF"
# Begin /etc/inputrc
# Modified by Chris Lynn <roryo@roryo.dynup.net>
# Allow the command prompt to wrap to the next line
set horizontal-scroll-mode Off
# Enable 8bit input
set meta-flag On
set input-meta On
# Turns off 8th bit stripping
set convert-meta Off
# Keep the 8th bit for display
set output-meta On
# none, visible or audible
set bell-style none
# All of the following map the escape sequence of the value
# contained in the 1st argument to the readline specific functions
"\eOd": backward-word
"\eOc": forward-word
# for linux console
"\e[1~": beginning-of-line
"\e[4~": end-of-line
"\e[5~": beginning-of-history
"\e[6~": end-of-history
"\e[3~": delete-char
"\e[2~": quoted-insert
# for xterm
"\eOH": beginning-of-line
"\eOF": end-of-line
# for Konsole
"\e[H": beginning-of-line
"\e[F": end-of-line
# End /etc/inputrc
EOF

7.9. Создание файла /etc/shells

Файл shells содержит список оболочек входа в систему. Приложения используют этот файл для определения корректности оболочки. Для каждой оболочки должна присутствовать одна строка, состоящая из пути к файлу оболочки относительно корня структуры каталогов (/).
Например, chsh обращается к этому файлу, чтобы определить, может ли непривилегированный пользователь изменить оболочку входа для своей учетной записи. Если имя команды не указано, пользователю будет отказано в изменении.
Это требование для таких приложений, как GDM, которые не заполняют браузер face, если он не удается найти /etc/shells, или FTP-демоны, которые традиционно запрещают доступ пользователям с оболочками, не включенными в этот файл.

cat > /etc/shells << "EOF"
# Begin /etc/shells
/bin/sh
/bin/bash
# End /etc/shells
EOF

8.2. Создание файла /etc/fstab

Файл /etc/fstab используется некоторыми программами для определения того, где файловые системы должны быть установлены по умолчанию, в каком порядке и которые необходимо проверить (для ошибок целостности) перед установкой:

cat > /etc/fstab << "EOF"
# Begin /etc/fstab
# file system mount-point type options dump fsck order
/dev/<xxx> / <fff> defaults 1 1
/dev/<yyy> swap swap pri=1 0 0
proc /proc proc nosuid,noexec,nodev 0 0
sysfs /sys sysfs nosuid,noexec,nodev 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
tmpfs /run tmpfs defaults 0 0
devtmpfs /dev devtmpfs mode=0755,nosuid 0 0
# End /etc/fstab
EOF


Заменим <xxx>, <yyy> и <fff> значениями, подходящими для системы, например sda2, sda5 и ext4. Подробнее о шести полях в этом файле см. Man 5 fstab. Файловым системам с MS-DOS или Windows-источником (т.е. Vfat, ntfs, smbfs, cifs, iso9660, udf) требуется специальная опция utf8, чтобы символы, отличные от ASCII в именах файлов, были правильно интерпретированы. Для локалей, отличных от UTF-8, значение iocharset должно быть таким же, как и набор символов локали, настроенный таким образом, чтобы ядро ​​его понимало. Это работает, если соответствующее определение набора символов (найденное в Файловых системах -> Поддержка родного языка при настройке ядра) было скомпилировано в ядро ​​или построено как модуль. Однако, если набор символов в локали UTF-8, соответствующий параметр iocharset = utf8 сделает регистр файловой системы чувствительным. Чтобы исправить это, используйте специальный параметр utf8 вместо iocharset = utf8 для локалей UTF-8. Опция «codepage» также необходима для файловых систем vfat и smbfs. Он должен быть установлен на номер кодовой страницы, используемый в MS-DOS в вашей стране. Например, чтобы смонтировать USB-флеш-накопители, пользователю ru_RU.KOI8-R понадобится следующее в части опций своей линии монтирования в /etc/fstab:

noauto,user,quiet,showexec,codepage=866,iocharset=koi8r

Соответствующий фрагмент параметров для пользователей ru_RU.UTF-8:

noauto,user,quiet,showexec,codepage=866,utf8

Обращаем внимание, что использование iocharset является значением по умолчанию для iso8859-1 (которое не учитывает регистр файловой системы), а опция utf8 сообщает ядру преобразовывать имена файлов с использованием UTF-8, чтобы их можно было интерпретировать в локали UTF-8.
Также возможно указать значения кодовой страницы по умолчанию и значения iocharset для некоторых файловых систем во время конфигурации ядра. Соответствующие параметры называются «Опция по умолчанию NLS» (CONFIG_NLS_DEFAULT), «Опция по умолчанию Remote NLS» (CONFIG_SMB_NLS_DEFAULT), «Кодовая страница по умолчанию для FAT» (CONFIG_FAT_DEFAULT_CODEPAGE) и «По умолчанию iocharset для FAT» (CONFIG_FAT_DEFAULT_IOCHARSET). Невозможно указать эти параметры файловой системы ntfs во время компиляции ядра.
Можно сделать файловую систему ext3 надежной для сбоев питания для некоторых типов жестких дисков. Для этого добавьте параметр mount = 1 mount в соответствующую запись в файле /etc/fstab. Чтобы проверить, поддерживает ли этот диск этот параметр, запустите hdparm на соответствующем диске. Например, если:

hdparm -I /dev/sda | grep NCQ

возвращает непустой результат, поддерживается опция.
Разделы на основе логического тома (LVM) не могут использовать параметр барьера.

8.3. Linux-4.18

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

make mrproper

Выполнение этой команды гарантирует, что дерево исходных кодов ядра абсолютно чистое. Разработчики ядра рекомендуют, чтобы эта команда выполнялась перед каждым процессом компиляции. Обращаем внимание что после распаковки пакета с исходным кодом не следует полагаться на его "чистоту".
Настроим ядро с помощью псевдографического интерфейса. Для получения общей информации перейдём по ссылке, в книге BLFS. Дополнительная информация о настройке и сборке ядра расположена по ссылке.
Хорошей отправной точкой для настройки ядра, может стать запуск команды make defconfig. В результате её выполнения будет создана базовая конфигурация с учётом архитектуры машины.
Убедимся в том, что включили/отключили/указали указанные ниже параметры настройки, в ином случае, система может работать не правильно, или вовсе не загрузится:

Device Drivers --->
Generic Driver Options --->
[ ] Support for uevent helper [CONFIG_UEVENT_HELPER]
[*] Maintain a devtmpfs filesystem to mount at /dev [CONFIG_DEVTMPFS]
Kernel hacking --->
Choose kernel unwinder (Frame pointer unwinder) ---> [CONFIG_UNWINDER_FRAME_POINTER]


Также, есть некоторые опции, которые могут понадобиться в зависимости от конфигурации системы. Если на хост системе используется UEFI, то после выполнения команды 'make defconfig' должны автоматически примениться параметры ядра, связанные с EFI.
Для того, чтобы ядро LFS могло загружаться из среды UEFI, необходимо включить соответствующий параметр:

Processor type and features --->
[*] EFI stub support [CONFIG_EFI_STUB]


Более полное описание управления UEFI из LFS доступно по ссылке.
Разъяснение указанных параметров конфигурации:
Support for uevent helper Наличие этого параметра может вызвать конфликт при управление устройствами через Udev / Eudev.
Maintain a devtmpfs При использовании этого параметра, будет осуществлена поддержка узлов устройств, заполняемых самим ядром, даже без запуска Udev. Udev будет работать поверх, управляя разрешениями и добавляя необходимые символические ссылки. Этот элемент конфигурации необходим всем пользователям Udev / Eudev.
make menuconfig Значение необязательных переменных окружения программы make:

LANG=<host_LANG_value> LC_ALL=

Задаёт настройку локали на ту, которая используется в хост системе для корректного отображения menuconfig при использовании интерфейса ncurses при генерации строк на текстовой консоли Linux с кодировкой UTF-8.
Если используете, то убедитесь что заменили переменную <host_LANG_value> на значение переменной окружения $LANG их хост системы. Или можно использовать значение переменной окружения хос системы $LC_ALL или $LC_CTYPE.
Кроме того, команда make oldconfig может быть более уместна в некоторых случаях. Дополнительную информацию см. В файле README.
При желании, можно пропустить этап настройки, скопировав файл конфигурации ядра .config с вашей хост системы (в том случае, если такой файл присутствует) в предварительно распакованный каталог ядра linux-4.18. Не рекомендуется такой подход. Гораздо полезнее изучить все параметры настройки и создать файл конфигурации ядра самостоятельно.
Скомпилируем образ ядра и модули:

make

При использовании модулей, могут потребоваться файлы конфигурации, которые должны находиться в каталоге /etc/modprobe.d. Информация о модулях и конфигурации ядра находится в «7.3. Обработка устройств и модулей», в каталоге с документацией ядра linux-4.18/Documentation. Будет интересным изучение информации modprobe.d(5).
Установим модули, если ядро их использует:

make modules_install

После завершения компиляции, необходимо выполнить еще несколько шагов. Некоторые файлы должны быть скопированы в каталог /boot.
Если хост система содержит отдельный раздел для каталога /boot, файлы скопированные ниже, должны находится в нём. Самый простой способ это сделать - выполнить привязку (bind) каталога /boot хост системы (за пределами выполнения в среде chroot) к каталогу /mnt/lfs/boot перед тем, как продолжить. Из-под пользователя root в хост системе выполним команду:

mount --bind /boot /mnt/lfs/boot

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

cp -iv arch/x86/boot/bzImage /boot/vmlinuz-4.18-lfs-20180813

System.map файл, внутри которого находится символьная таблица адресов функций и процедур, используемых ядром операционной системы Linux. В этой таблице перечислены имена переменных и функций и их адреса в памяти компьютера. Эта таблица весьма полезна при отладке ядра в случае Kernel panic или Linux oops. System.map генерируется при компиляции ядра. Выполните следующщую команду для установки файла System.map:

cp -iv System.map /boot/System.map-4.18

Файл конфигурации ядра .config полученный в результате настройки make menuconfig содержит в себе все опции конфигурации скомпилированного ядра. Хорошей идеей будет оставить этот файл для будующей работы:

cp -iv .config /boot/config-4.18

Установим документацию ядра:

install -d /usr/share/doc/linux-4.18
cp -r Documentation/* /usr/share/doc/linux-4.18


Важно отметить, что файлы в каталоге исходных кодов ядра не принадлежат пользователю root. Всякий раз, когда пакет распаковывается от пользователя root (как это и выполнялось внутри среды chroot), файлы имеют те идентификаторы пользователя и группы, которые были назначены при распаковке. Обычно это не вызывает проблем для других устанавливаемых пакетов, так как каталог с исходными кодами удаляется после установки пакета. Однако исходный код ядра Linux часто сохраняется в течение длительного времени. Из-за этого существует вероятность того, что идентификатор пользователя, используемый при распаковке, будет назначен другому пользователю. В таком случае, этот пользователь будет иметь доступ на запись в этот каталог.
Во многих случаях конфигурация ядра должна быть обновлена для пакетов, которые будут установлены позже в BLFS. В отличие от других пакетов удалять дерево исходного кода ядра не требуется после компиляции и установки.
Если планируется оставить каталог с исходным кодом ядра, выполним команду: chown -R 0:0 для каталога linux-4.18 чтобы указать права для пользователя root.
В документации ядра рекомендуется создать символическую ссылку /usr/src/linux для указания местоположения каталога с исходными кодами ядра. Это рекомендация относится к ядрам до версии 2.6 и не должна выполняться в системе LFS, так как это может вызвать проблемы с пакетами, которые вы, возможно, захотите создать, когда ваша базовая система LFS будет готова.
Заголовочные файлы в системном каталоге include (/usr/include) должны всегда быть те, которые использовались при компиляции Glibc в «6.7. Заголовочные файлы API Linux-4.17.11». Поэтому их никогда не следует заменять на чистые заголовочные файлы ядра или любые другие подготовленные заголовочные файлы. Обычно модули Linux загружаются автоматически, но иногда требуется определенный порядок. Программа, которая загружает модули, modprobe или insmod, использует файл /etc/modprobe.d/usb.conf как раз для этой цели. Этот файл должен быть создан так, что если USB-драйверы (ehci_hcd, ohci_hcd и uhci_hcd) были созданы в виде модулей, то они будут загружены в требуемом порядке; ehci_hcd должен быть загружен до ohci_hcd и uhci_hcd для того, чтобы избежать предупреждений во время загрузки. Создаём новый файл /etc/modprobe.d/usb.conf:

install -v -m755 -d /etc/modprobe.d
cat > /etc/modprobe.d/usb.conf << "EOF"
# Begin /etc/modprobe.d/usb.conf
install ohci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i ohci_hcd ; true
install uhci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i uhci_hcd ; true
# End /etc/modprobe.d/usb.conf
EOF


Содержимое пакета Linux.
Установленные каталоги: /lib/modules, /usr/share/doc/linux-4.18
Краткое описание установленнх файлов:
config-4.18 Файл конфигурации ядра .config содержит в себе все опции конфигурации скомпилированного ядра.
vmlinuz-4.18-lfs-20180813 Ядро системы Linux. При включении компьютера ядро - первая часть операционной системы, которая будет загружена. Она обнаруживает и инициализирует все компоненты оборудования компьютера, делает их доступными в виде дерева каталогов с файлами для доступа к ним программам и превращает один процессор в мультизадачную машину, способную выполнять множество программ как будто одновременно.
System.map-4.18 Файл, внутри которого находится символьная таблица адресов функций и процедур, используемых ядром операционной системы Linux. В этой таблице перечислены имена переменных и функций и их адреса в памяти компьютера. Эта таблица весьма полезна при отладке ядра в случае Kernel panic или Linux oops. System.map генерируется при компиляции ядра.

8.4. Использование GRUB для настройки процесса загрузки

Если GRUB будет настроен не правильно, то возможно, не получится штатно загрузиться в систему, без использования другого загрузочного устройства (например компакт-диска). Можно модифицировать текущий системный загрузчик, например Grub-Legacy, GRUB2, или LILO.
Убедимся, что аварийный загрузочный диск готов «спасти» ваш компьютер, если он перестанет правильно загружаться. Если еще нет загрузочного устройства, можно его создать. Чтобы нижеследующая процедура работала, необходимо перейти в BLFS и установить программу xorriso из пакета libisoburn.

cd /tmp
grub-mkrescue --output=grub-img.iso
xorriso -as cdrecord -v dev=/dev/cdrw blank=as_needed grub-img.iso


Чтобы загрузить LFS в хост-системах с UEFI, ядро должно быть собрано с указанием соответствующего ключа конфигурации CONFIG_EFI_STUB. Однако LFS можно загружать с помощью GRUB2 без такого дополнения. Для этого необходимо отключить функции UEFI Mode и Secure Boot в BIOS хост-системе. Для получения дополнительной информации см. the lfs-uefi.txt подсказку.
GRUB использует собственную структуру именования дисков и разделов в виде (hdn,m), где n - номер диска, а m - номер раздела. Номер диска начинается с нуля, а номер раздела начинается с единицы, для обычных разделов и с пяти для расширенных разделов. Обратите внимание, что именование отличается от предыдущих версий, когда оба номера начинались с нуля. Например, раздел sda1 равен (hd0,1) в GRUB, а sdb3 - (hd1,3). В отличие от Linux, GRUB не считает диски CD-ROM жесткими дисками. Например, если вы используете CD на hdb и второй жесткий диск на hdс, этот второй жесткий диск будет (hd1).
GRUB записывает данные на первый физический сектор жесткого диска. Эта область не является частью какой-либо файловой системы. Программы доступны как модули GRUB в загрузочном разделе в каталоге по умолчанию -/boot/grub/.
Расположение загрузочного раздела - это ваш выбор, его можно настроить. Одна рекомендация состоит в том, чтобы иметь отдельный небольшой (рекомендуемый размер - 100 МБ) раздел только для загрузочной информации. Таким образом, каждая сборка, будь то LFS или какой-либо другой дистрибутив, может обращаться к тем же загрузочным файлам, и доступ может быть сделан из любой загруженной системы. Если вы решите это сделать, вам нужно будет примонтировать отдельный раздел, переместить все файлы из текущего каталога /boot (например, ядро Linux, которое вы только что создали в предыдущем разделе), в новый раздел. Затем вам нужно размонтировать раздел и примонтировать заново в каталог /boot. Если вы это сделаете, обязательно обновите данные в файле /etc/fstab.
Использование текущего раздела lfs будет работать, но настройка для нескольких систем сложнее.
Используя приведенную выше информацию, определяем соответствующие точки монтирования для корневого раздела (или загрузочного раздела, если используется отдельный). В следующем примере предполагается, что корневой (или отдельный загрузочный) раздел является sda2.
Установите файлы GRUB в каталог /boot/grub и настройте загрузочный сектор:
Следующая команда перезапишет текущий загрузчик. Не выполняем эту команду, если это нежелательно, например, если вы используете сторонний менеджер загрузки для управления главной загрузочной записью (MBR).

grub-install /dev/sda

Создаём файл конфигурации /boot/grub/grub.cfg:

cat > /boot/grub/grub.cfg <<"EOF"
# Begin /boot/grub/grub.cfg
set default=0
set timeout=5
insmod ext2
set root=(hd0,2)
menuentry "GNU/Linux, Linux 4.18-lfs-20180813" {
linux /boot/vmlinuz-4.18-lfs-20180813 root=/dev/sda2 ro
}
EOF


С точки зрения GRUB, файлы ядра относительны от используемого раздела. Если вы используете отдельныф /boot раздел, удалите /boot из строки linux. Вам также потребуется изменить строку set root, чтобы указать на загрузочный раздел.
GRUB - чрезвычайно мощная программа, и она обеспечивает огромное количество вариантов загрузки с самых разных устройств, работающих систем и типов разделов. Существует также множество вариантов настройки таких как графические экраны заставок, звуки воспроизведения, ввод мыши и т.д. детали этих вариантов выходят за рамки этого раздела.
Существует команда grub-mkconfig, которая может автоматически записывать файл конфигурации. Она использует набор скриптов в файле /etc/grub.d/ и уничтожит любые сделанные вами настройки. Эти сценарии предназначены в первую очередь для обычных дистрибутивов и не рекомендуются для LFS. Если устанавливаете коммерческий дистрибутив Linux, есть вероятность, что эта программа будет запущена. Обязательно создайте резервную копию файла grub.cfg.

9.3. Перезагрузка системы

Обзор следующих файлов конфигурации подходит на данном этапе.
/etc/bashrc
/etc/dircolors
/etc/fstab
/etc/hosts
/etc/inputrc
/etc/profile
/etc/resolv.conf
/etc/vimrc
/root/.bash_profile
/root/.bashrc
/etc/sysconfig/network
/etc/sysconfig/ifconfig.eth0

Перейдем к загрузке новой установки LFS! Первый выход из среды chroot:

logout

Отключим виртуальные файловые системы:

umount -v $LFS/dev/pts
umount -v $LFS/dev
umount -v $LFS/run
umount -v $LFS/proc
umount -v $LFS/sys


Отключим файловую систему LFS:

umount -v $LFS

Если было создано несколько разделов, отключите остальные разделы перед отключением основного, например:

umount -v $LFS/usr
umount -v $LFS/home
umount -v $LFS


Перезагрузим систему:

shutdown -r now

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

Приложение C. Зависимости

Приложение E. Правила конфигурации Udev

# /etc/udev/rules.d/55-lfs.rules: Rule definitions for LFS.
# Core kernel devices
# This causes the system clock to be set as soon as /dev/rtc becomes available.
SUBSYSTEM=="rtc", ACTION=="add", MODE="0644", RUN+="/etc/rc.d/init.d/setclock start"
KERNEL=="rtc", ACTION=="add", MODE="0644", RUN+="/etc/rc.d/init.d/setclock start"
# Comms devices
KERNEL=="ippp[0-9]*", GROUP="dialout"
KERNEL=="isdn[0-9]*", GROUP="dialout"
KERNEL=="isdnctrl[0-9]*", GROUP="dialout"
KERNEL=="dcbri[0-9]*", GROUP="dialout"

Продаются
книги

Оставить отзыв

Установи и
БУДЕШЬ СЧАСТЛИВ!

Спасибо, Господи, что взял деньгами...

Scrooge
Dollar
Ruble
Ruble
Gold