======Часть III. Глава 7. Вход в окружение Chroot и создание дополнительных временных инструментов====== Содержание * [[software:linux_server:lfs:chapter07#7.1. Введение|7.1. Введение]] * [[software:linux_server:lfs:chapter07#7.2. Смена владельца|7.2. Смена владельца]] * [[software:linux_server:lfs:chapter07#7.3. Подготовка виртуальных файловых систем ядра|7.3. Подготовка виртуальных файловых систем ядра]] * [[software:linux_server:lfs:chapter07#7.4. Вход в окружение Chroot|7.4. Вход в окружение Chroot]] * [[software:linux_server:lfs:chapter07#7.5. Создание каталогов|7.5. Создание каталогов]] * [[software:linux_server:lfs:chapter07#7.6. Создание основных файлов и символических ссылок |7.6. Создание основных файлов и символических ссылок ]] * [[software:linux_server:lfs:chapter07#7.7. Gettext-0.22.4|7.7. Gettext-0.22.4]] * [[software:linux_server:lfs:chapter07#7.8. Bison-3.8.2|7.8. Bison-3.8.2]] * [[software:linux_server:lfs:chapter07#7.9. Perl-5.38.2|7.9. Perl-5.38.2]] * [[software:linux_server:lfs:chapter07#7.10. Python-3.12.2|7.10. Python-3.12.2]] * [[software:linux_server:lfs:chapter07#7.11. Texinfo-7.1|7.11. Texinfo-7.1]] * [[software:linux_server:lfs:chapter07#7.12. Util-linux-2.39.3|7.12. Util-linux-2.39.3]] * [[software:linux_server:lfs:chapter07#7.13. Очистка и сохранение временной системы|7.13. Очистка и сохранение временной системы]] =====7.1. Введение===== В этой главе рассказывается, как собрать последние недостающие части временной системы: инструменты, необходимые для сборки различных пакетов. Теперь, когда все циклические зависимости устранены, для сборки можно использовать среду «chroot», полностью изолированную от операционной системы хоста (за исключением работающего ядра). Для правильной работы изолированной среды необходимо установить связь с работающим ядром. Это делается с помощью так называемых виртуальных файловых систем ядра, которые будут смонтированы перед входом в среду chroot. Вы можете проверить, смонтированы ли они, выполнив команду findmnt. До [[software:linux_server:lfs:chapter07#7.4. Вход в окружение Chroot|Раздела 7.4. «Вход в окружение Chroot»]] команды должны выполняться от имени root с установленной переменной LFS. После входа в chroot все команды выполняются от имени root, к счастью, без доступа к операционной системе компьютера, на котором вы собираете LFS. В любом случае будьте осторожны, так как неверными командами легко разрушить всю систему LFS. =====7.2. Смена владельца===== **Примечание** \\ Команды, приведенные в оставшейся части книги, должны выполняться от имени пользователя root, а не lfs. Дважды проверьте, что переменная $LFS установлена в переменных окружения пользователя root. Перейдем к пользователю под именем root exit {{:software:linux_server:lfs-example:lfs_example_204.png?|}} Проверим переменную $LFS echo $LFS {{:software:linux_server:lfs-example:lfs_example_205.png?|}} В настоящее время вся иерархия каталогов в $LFS принадлежит пользователю **lfs**, существующему только на хост-системе. Если права на файлы и каталоги внутри $LFS оставить как есть, то они будут принадлежать ID пользователя без существующей учетной записи. Это опасно, так как созданная позже учетная запись, может получить такой же ID пользователя и стать владельцем всех файлов в $LFS, тем самым делая эти файлы уязвимыми для возможных злонамеренных манипуляций. Для решения проблемы измените владельца каталогов $LFS/* на пользователя **root**, выполнив следующую команду: chown -R root:root $LFS/{usr,lib,var,etc,bin,sbin,tools} case $(uname -m) in x86_64) chown -R root:root $LFS/lib64 ;; esac {{:software:linux_server:lfs-example:lfs_example_206.png?|}} =====7.3. Подготовка виртуальных файловых систем ядра===== Приложения, работающие в пользовательском пространстве, используют различные файловые системы, созданные ядром, для взаимодействия с самим ядром. Эти файловые системы являются виртуальными: для них не используется дисковое пространство. Содержимое файловых систем находится в памяти. Эти файловые системы должны быть смонтированы в дереве каталогов $LFS, чтобы приложения могли найти их в среде **chroot**. Начните с создания каталогов, в которые будут смонтированы эти виртуальные файловые системы: mkdir -pv $LFS/{dev,proc,sys,run} {{:software:linux_server:lfs-example:lfs_example_207.png?|}} ====7.3.1. Монтирование и заполнение /dev==== Во время обычной загрузки ядро автоматически монтирует файловую систему devtmpfs в каталог /dev; ядро создает узлы устройств в этой виртуальной файловой системе в процессе загрузки или при первом обнаружении устройства, или доступе к нему. Демон udev может изменять владельца или разрешения узлов устройств, созданных ядром, или создавать новые узлы устройств или символические ссылки, чтобы облегчить работу разработчиков дистрибутива или системных администраторов. (Подробности смотрите в [[software:linux_server:lfs:chapter09#9.3.2.2. Создание узла устройства|Разделе 9.3.2.2. «Создание узла устройства».]]) Если ядро хоста поддерживает devtmpfs, мы можем просто смонтировать devtmpfs в $LFS/dev и положиться на ядро для его заполнения. Но в некоторых ядрах хоста отсутствует поддержка devtmpfs, эти хост-дистрибутивы используют разные методы для создания содержимого /dev. Таким образом, единственный независимый от хоста способ заполнить каталог $LFS/dev - это привязка к каталогу /dev хост-системы. Связное монтирование - это особый тип монтирования, который делает дерево каталога или файл видимым в каком-либо другом месте. Для этого используйте следующую команду: mount -v --bind /dev $LFS/dev {{:software:linux_server:lfs-example:lfs_example_208.png?|}} ====7.3.2. Монтирование виртуальных файловых систем ядра==== Теперь смонтируйте оставшиеся виртуальные файловые системы: mount -vt devpts devpts -o gid=5,mode=0620 $LFS/dev/pts mount -vt proc proc $LFS/proc mount -vt sysfs sysfs $LFS/sys mount -vt tmpfs tmpfs $LFS/run {{:software:linux_server:lfs-example:lfs_example_209.png?|}} Значение параметров монтирования для devpts: * **gid=5** Этот параметр гарантирует, что все узлы устройств, созданные devpts, принадлежат группе с идентификатором 5. Это идентификатор, который мы будем использовать позже для группы tty. Мы используем идентификатор группы вместо имени, поскольку хост-система может использовать другой идентификатор для своей группы tty. * **mode=0620** Этот параметр гарантирует, что все узлы устройств, созданные devpts, будут иметь права 0620 (доступен для чтения и записи пользователем, доступен для записи группе). Вместе с вышеуказанной опцией это гарантирует, что devpts создаст узлы устройств, соответствующие требованиям grantpt(), а это означает, что вспомогательный файл Glibc pt_chown (который не установлен по умолчанию) не требуется. В некоторых хост-системах /dev/shm является символической ссылкой на каталог /run/shm. /run tmpfs был смонтирован выше, поэтому сейчас необходимо только создать каталог с правильными разрешениями. В других хост-системах /dev/shm является точкой монтирования для tmpfs. В этом случае монтирование /dev приведет только к созданию /dev/shm как каталога в среде chroot. В этой ситуации мы должны явно смонтировать tmpfs: if [ -h $LFS/dev/shm ]; then install -v -d -m 1777 $LFS$(realpath /dev/shm) else mount -vt tmpfs -o nosuid,nodev tmpfs $LFS/dev/shm fi {{:software:linux_server:lfs-example:lfs_example_210.png?|}} =====7.4. Вход в окружение Chroot===== Теперь, когда все пакеты, необходимые для сборки остальных инструментов установлены в системе, пришло время войти в окружение chroot и завершить установку временных инструментов. Эта среда также будет использоваться для установки конечной системы. От имени пользователя root выполните следующую команду для входа в chroot, в которой на данный момент нет ничего, кроме временных инструментов: chroot "$LFS" /usr/bin/env -i \ HOME=/root \ TERM="$TERM" \ PS1='(lfs chroot) \u:\w\$ ' \ PATH=/usr/bin:/usr/sbin \ MAKEFLAGS="-j$(nproc)" \ TESTSUITEFLAGS="-j$(nproc)" \ /bin/bash --login {{:software:linux_server:lfs-example:lfs_example_211.png?|}} Если вы не хотите использовать все доступные логические ядра, замените параметр $(nproc) количеством логических ядер, которые вы хотите использовать для сборки пакетов в этой и последующих главах. На наборы тестов некоторых пакетов (в частности Autoconf, Libtool и Tar) в [[software:linux_server:lfs:chapter08|Главе 8]] не влияет установка переменной MAKEFLAGS, вместо этого они используют переменную среды TESTSUITEFLAGS. Мы также установили её здесь для запуска тестов с поддержкой нескольких ядер. Параметр -i команды env, очистит все переменные в среде chroot. После этого переменные HOME, TERM, PS1 и PATH будут установлены заново. Конструкция TERM=$TERM установит переменную TERM внутри chroot в то же значение, что и вне chroot. Эта переменная необходима для корректной работы таких программ как vim и less. Если понадобятся другие переменные окружения, такие как CFLAGS или CXXFLAGS, то это подходящее место для их установки. С этого момента больше нет необходимости использовать переменную LFS, поскольку вся работа будет ограничена файловой системой LFS; команда chroot запускает оболочку Bash с корневым каталогом (/), установленным в $LFS. Обратите внимание, что каталог **/tools/bin** не указан в переменной окружения PATH. Это означает, что кросс-тулчейн больше не будет использоваться. Также обратите внимание, что в командной строке bash будет указано I have no name!. Это нормально, поскольку файл **/etc/passwd** еще не создан. **Примечание** \\ Важно, чтобы все команды в оставшейся части этой главы и следующих главах выполнялись из среды chroot. Если вы покидаете эту среду по какой-либо причине (например, при перезагрузке), убедитесь, что файловые системы виртуального ядра смонтированы, как описано в [[software:linux_server:lfs:chapter07#7.3.1. Монтирование и заполнение /dev|Разделе 7.3.1. «Монтирование и заполнение /dev»]] и [[software:linux_server:lfs:chapter07#7.3.2. Монтирование виртуальных файловых систем ядра|Разделе 7.3.2. «Монтирование виртуальных файловых систем ядра»]], а затем войдите в среду chroot для продолжения установки. =====7.5. Создание каталогов===== Пришло время создать полную структуру каталогов в файловой системе LFS. **Примечание** \\ Некоторые из каталогов, упомянутых в этом разделе, возможно, уже были созданы ранее с помощью явных инструкций или при установке некоторых пакетов. Они повторяются ниже для полноты картины. Создайте несколько каталогов, которые не входили в ограниченный набор, используемый в предыдущих главах, выполнив следующую команду: mkdir -pv /{boot,home,mnt,opt,srv} {{:software:linux_server:lfs-example:lfs_example_212.png?|}} Создайте необходимые подкаталоги, выполнив следующие команды: mkdir -pv /etc/{opt,sysconfig} mkdir -pv /lib/firmware mkdir -pv /media/{floppy,cdrom} mkdir -pv /usr/{,local/}{include,src} mkdir -pv /usr/local/{bin,lib,sbin} mkdir -pv /usr/{,local/}share/{color,dict,doc,info,locale,man} mkdir -pv /usr/{,local/}share/{misc,terminfo,zoneinfo} mkdir -pv /usr/{,local/}share/man/man{1..8} mkdir -pv /var/{cache,local,log,mail,opt,spool} mkdir -pv /var/lib/{color,misc,locate} ln -sfv /run /var/run ln -sfv /run/lock /var/lock install -dv -m 0750 /root install -dv -m 1777 /tmp /var/tmp {{:software:linux_server:lfs-example:lfs_example_213.png?|}} Вывод результата выполнения команд {{:software:linux_server:lfs-example:lfs_example_214.png?|}} По умолчанию каталоги создаются с правами 755, но это нежелательно делать для всех каталогов. В приведенных выше командах вносятся два изменения — одно в домашний каталог пользователя root, а другое в каталоги для временных файлов. Первое изменение гарантирует, что никто не сможет войти в каталог /root — точно так же, как обычный пользователь сделал бы это со своим собственным домашним каталогом. Второе изменение гарантирует, что любой пользователь может писать в каталоги /tmp и /var/tmp, но не может удалять из них файлы другого пользователя. Последнее запрещено так называемым «sticky bit (липким битом)», старшим битом (1) в битовой маске 1777 ====7.5.1. Примечание о соответствии требованиям FHS==== Это дерево каталогов основано на стандарте иерархии файловой системы (FHS) (доступен по адресу https://refspecs.linuxfoundation.org/fhs.shtml). FHS также указывает, что наличие некоторых каталогов необязательно, например, /usr/local/games и /usr/share/games. В LFS мы создаем только те каталоги, которые действительно необходимы. Однако, не стесняйтесь создавать дополнительные каталоги, если хотите. **Предупреждение** \\ FHS не требует наличия каталога /usr/lib64, и редакторы LFS решили его не использовать. Чтобы инструкции в LFS и BLFS работали корректно, крайне важно, чтобы этот каталог не существовал. Время от времени вам следует проверять, что он не существует, потому что его легко создать непреднамеренно, и это, вероятно, приведет к поломке вашей системы. =====7.6. Создание основных файлов и символических ссылок===== Исторически сложилось, что Linux хранит список примонтированных файловых систем в файле **/etc/mtab**. Современные ядра хранят этот список внутри себя и предоставляют его пользователю через файловую систему **/proc**. Чтобы удовлетворять требованиям утилит, которые ожидают наличия **/etc/mtab**, создайте следующую символическую ссылку: ln -sv /proc/self/mounts /etc/mtab {{:software:linux_server:lfs-example:lfs_example_215.png?|}} Создайте файл **/etc/hosts**, на который будут ссылаться некоторые наборы тестов, а также один из файлов конфигурации Perl: cat > /etc/hosts << EOF 127.0.0.1 localhost $(hostname) ::1 localhost EOF {{:software:linux_server:lfs-example:lfs_example_216.png?|}} Чтобы пользователь **root** мог войти в систему и распознавался системой, в файлах **/etc/passwd** и **/etc/group** должны быть соответствующие записи. Создайте файл **/etc/passwd** выполнив следующую команду: cat > /etc/passwd << "EOF" root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/dev/null:/usr/bin/false daemon:x:6:6:Daemon User:/dev/null:/usr/bin/false messagebus:x:18:18:D-Bus Message Daemon User:/run/dbus:/usr/bin/false systemd-journal-gateway:x:73:73:systemd Journal Gateway:/:/usr/bin/false systemd-journal-remote:x:74:74:systemd Journal Remote:/:/usr/bin/false systemd-journal-upload:x:75:75:systemd Journal Upload:/:/usr/bin/false systemd-network:x:76:76:systemd Network Management:/:/usr/bin/false systemd-resolve:x:77:77:systemd Resolver:/:/usr/bin/false systemd-timesync:x:78:78:systemd Time Synchronization:/:/usr/bin/false systemd-coredump:x:79:79:systemd Core Dumper:/:/usr/bin/false uuidd:x:80:80:UUID Generation Daemon User:/dev/null:/usr/bin/false systemd-oom:x:81:81:systemd Out Of Memory Daemon:/:/usr/bin/false nobody:x:65534:65534:Unprivileged User:/dev/null:/usr/bin/false EOF {{:software:linux_server:lfs-example:lfs_example_217.png?|}} Пароль пользователя **root** будет задан позднее. Создайте файл **/etc/group**, выполнив следующую команду: cat > /etc/group << "EOF" root:x:0: bin:x:1:daemon sys:x:2: kmem:x:3: tape:x:4: tty: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: cdrom:x:15: adm:x:16: messagebus:x:18: systemd-journal:x:23: input:x:24: mail:x:34: kvm:x:61: systemd-journal-gateway:x:73: systemd-journal-remote:x:74: systemd-journal-upload:x:75: systemd-network:x:76: systemd-resolve:x:77: systemd-timesync:x:78: systemd-coredump:x:79: uuidd:x:80: systemd-oom:x:81: wheel:x:97: users:x:999: nogroup:x:65534: EOF {{:software:linux_server:lfs-example:lfs_example_218.png?|}} Созданные группы не являются частью какого-либо стандарта — это группы, определяемые частично требованиями конфигурации Udev в [[software:linux_server:lfs:chapter09|Главе 9]], а частично общими соглашениями, используемыми в ряде существующих дистрибутивов Linux. Кроме того, некоторые наборы тестов зависят от конкретных пользователей или групп. Спецификация LSB (доступна по адресу https://refspecs.linuxfoundation.org/lsb.shtml) рекомендует, чтобы, помимо группы **root** с идентификатор (GID) 0 присутствовала группа bin с GID 1. GID 5 широко используется для группы tty, число 5 также используется в systemd для файловой системы **devpts**. Все остальные имена групп и GID могут свободно выбираться системным администратором, так как хорошо написанные программы не зависят от номеров GID, а чаще используют название группы. Идентификатор 65534 используется ядром для NFS и отдельных пользовательских пространств имен для несопоставленных пользователей и групп (они существуют на сервере NFS или родительском пространстве имен пользователя, но «не существует» на локальном компьютере или в отдельном пространстве имен). Мы присваиваем **nobody** и **nogroup** для того, чтобы избежать несопоставленных идентификаторов. Другие дистрибутивы могут обрабатывать этот идентификатор по-разному, поэтому любая переносимая программа не должна зависеть от этого присвоения. Для некоторых тестов в [[software:linux_server:lfs:chapter08|Главе 8]] требуется обычный пользователь. Добавим такого пользователя здесь и удалим эту учетную запись в конце главы. echo "tester:x:101:101::/home/tester:/bin/bash" >> /etc/passwd echo "tester:x:101:" >> /etc/group install -o tester -d /home/tester {{:software:linux_server:lfs-example:lfs_example_219.png?|}} Чтобы удалить приглашение «I have no name!», запустите новую оболочку. Поскольку файлы **/etc/passwd** и **/etc/group** были созданы, разрешение имен пользователей и групп теперь будет работать: exec /usr/bin/bash --login {{:software:linux_server:lfs-example:lfs_example_220.png?|}} Программы **login, agetty, init (и другие)** используют ряд журналов для записи такой информации, как кто и когда входил в систему. Однако эти программы не будут записывать данные в журналы, если они еще не существуют. Инициализируйте журналы и предоставьте им соответствующие разрешения: touch /var/log/{btmp,lastlog,faillog,wtmp} chgrp -v utmp /var/log/lastlog chmod -v 664 /var/log/lastlog chmod -v 600 /var/log/btmp {{:software:linux_server:lfs-example:lfs_example_221.png?|}} В файл **/var/log/wtmp** записываются все входы и выходы из системы. В файл **/var/log/lastlog** записывается время последнего входа каждого пользователя в систему. В файл **/var/log/faillog** записываются неудачные попытки входа в систему. В файл **/var/log/btmp** также записываются неудачные попытки входа в систему. **Примечание** \\ Файлы wtmp, btmp и lastlog используют для временных меток 32-разрядные целые числа, значения счетчика достигнет максимума (2 147 483 647) 19 января 2038 года ("проблема 2038 года"). Многие пакеты перестали их использовать, другие же, собираются прекратить их использование. Вероятно, лучше считать их устаревшими. =====7.7. Gettext-0.22.4===== |Пакет Gettext содержит утилиты для интернационализации и локализации. Они позволяют компилировать программы с поддержкой NLS (Native Language Support), позволяя им выводить сообщения на родном языке пользователя.|| |Приблизительное время сборки:|1.1 SBU| |Требуемое дисковое пространство:|306 MB| Переходим в папку /sources cd /sources/ {{:software:linux_server:lfs-example:lfs_example_222.png?|}} Распаковываем архив и переходим в каталог с его содержимым tar -xvf gettext-0.22.4.tar.xz cd gettext-0.22.4 {{:software:linux_server:lfs-example:lfs_example_223.png?|}} ====7.7.1. Установка пакета Gettext==== Для временного набора инструментов нам нужно установить только три программы из пакета Gettext. Подготовьте Gettext к компиляции: ./configure --disable-shared {{:software:linux_server:lfs-example:lfs_example_224.png?|}} ===Значение параметров настройки:=== * **--disable-shared** В настоящее время нам не нужно устанавливать какие-либо общие библиотеки Gettext, поэтому нет необходимости их собирать. Скомпилируйте пакет: time make {{:software:linux_server:lfs-example:lfs_example_225.png?|}} Установите программы msgfmt, msgmerge, и xgettext programs: cp -v gettext-tools/src/{msgfmt,msgmerge,xgettext} /usr/bin {{:software:linux_server:lfs-example:lfs_example_226.png?|}} Перейдем в каталог sources и удалим более не нужный разорхивированный каталог cd .. rm -Rf cd gettext-0.22.4 {{:software:linux_server:lfs-example:lfs_example_227.png?|}} Подробная информация об этом пакете находится в [[software:linux_server:lfs:chapter08#8.32.2. Содержимое пакета Gettext|Разделе 8.32.2. «Содержимое пакета Gettext.»]] =====7.8. Bison-3.8.2===== |Пакет Bison содержит генератор синтаксического анализа.|| |Приблизительное время сборки:|0.2 SBU| |Требуемое дисковое пространство:|57 MB| ====7.8.1. Установка пакета Bison==== Подготовьте Bison к компиляции: #!/bin/bash SRC_FILE=bison-3.8.2.tar.xz SRC_FOLDER=bison-3.8.2 tar -xvf $SRC_FILE cd $SRC_FOLDER time { ./configure --prefix=/usr \ --docdir=/usr/share/doc/bison-3.8.2 && time make && make install; } && ln -sv gcc $LFS/usr/bin/cc && cd .. && rm -rf $SRC_FOLDER && echo Del $SRC_FOLDER echo Ok $SRC_FILE {{:software:linux_server:lfs-example:lfs_example_229.png?|}} ===Значение параметров настройки:=== * **--docdir=/usr/share/doc/bison-3.8.2** Этот параметр указывает системе сборки установить документацию к bison в каталог с версией пакета. {{:software:linux_server:lfs-example:lfs_example_230.png?|}} Подробная информация об этом пакете находится в [[software:linux_server:lfs:chapter08#8.33.2. Содержимое пакета Bison|Разделе 8.33.2. «Содержимое пакета Bison.»]] =====7.9. Perl-5.38.2===== |Пакет Perl содержит практический язык для извлечения данных и составления отчётов (Practical Extraction and Report Language).|| |Приблизительное время сборки:|0.6 SBU| |Требуемое дисковое пространство:|280 MB| ====7.9.1. Установка пакета Perl==== #!/bin/bash SRC_FILE=perl-5.38.2.tar.xz SRC_FOLDER=perl-5.38.2 tar -xvf $SRC_FILE cd $SRC_FOLDER time { sh Configure -des \ -Dprefix=/usr \ -Dvendorprefix=/usr \ -Duseshrplib \ -Dprivlib=/usr/lib/perl5/5.38/core_perl \ -Darchlib=/usr/lib/perl5/5.38/core_perl \ -Dsitelib=/usr/lib/perl5/5.38/site_perl \ -Dsitearch=/usr/lib/perl5/5.38/site_perl \ -Dvendorlib=/usr/lib/perl5/5.38/vendor_perl \ -Dvendorarch=/usr/lib/perl5/5.38/vendor_perl && make && make install; } && cd .. && rm -rf $SRC_FOLDER && echo Delete $SRC_FOLDER echo Ok $SRC_FILE {{:software:linux_server:lfs-example:lfs_example_231.png?|}} ===Значение параметров настройки:=== Значение новых опций Configure: * **-des** Это комбинация из трех параметров: -d использует значения по умолчанию для всех элементов; -e обеспечивает выполнение всех задач; -s отключает несущественные выходные данные. * **-Dvendorprefix=/usr** Параметр гарантирует, что perl знает, как указать пакетам, где они должны устанавливать свои модули Perl. * **-Duseshrplib** Собрать библиотеку libperl, необходимую некоторым модулям Perl, как общую библиотеку вместо статической. * **-Dprivlib,-Darchlib,-Dsitelib,...** Эти настройки определяют, где Perl ищет установленные модули. Редакторы LFS решили поместить их в структуру каталогов, основанную на MAJOR.MINOR версии Perl (5.38), что позволяет обновлять Perl до более новых уровней исправлений (уровень исправления - это последняя разделенная точками часть в строке полной версии, например 5.38.2) без необходимости переустанавливать все модули. Подробная информация об этом пакете находится в [[software:linux_server:lfs:chapter08#8.42.2. Содержимое пакета Perl|Разделе 8.42.2. «Содержимое пакета Perl.»]] =====7.10. Python-3.12.2===== |Пакет Python 3 содержит среду разработчика Python. Его можно использовать для объектно-ориентированного программирования, написания скриптов, прототипирования больших программ и разработка целых приложений. Python — это интерпретируемый язык программирования.|| |Приблизительное время сборки:|0.5 SBU| |Требуемое дисковое пространство:|598 MB| ====7.10.1. Установка пакета Python==== **Примечание** \\ Существует два пакета, имена которых начинаются с префикса «python». Сейчас необходимо распаковать файл Python-3.12.2.tar.xz (обратите внимание на заглавную первую букву). Воспользуемся скриптом #!/bin/bash SRC_FILE=Python-3.12.2.tar.xz SRC_FOLDER=Python-3.12.2 tar -xvf $SRC_FILE cd $SRC_FOLDER time { ./configure --prefix=/usr \ --enable-shared \ --without-ensurepip && make && make install; } && cd .. && rm -rf $SRC_FOLDER && echo Delete $SRC_FOLDER echo Ok $SRC_FILE {{:software:linux_server:lfs-example:lfs_example_233.png?|}} ===Значение параметров настройки:=== * **--enable-shared** Этот параметр отключает установку статичных библиотек. * **--without-ensurepip** Этот параметр отключает установщик пакетов Python, который на данном этапе не нужен. **Примечание** \\ Некоторые модули Python 3 не могут быть собраны сейчас, потому что зависимости еще не установлены. Для модуля **ssl** выводится сообщение **Python требует OpenSSL 1.1.1 или новее**. Сообщение следует проигнорировать. Просто убедитесь, что команда make верхнего уровня не завершилась ошибкой. Дополнительные модули сейчас не нужны, и они будут собраны в [[software:linux_server:lfs:chapter08|Главе 8]]. {{:software:linux_server:lfs-example:lfs_example_234.png?|}} Подробная информация об этом пакете находится в [[software:linux_server:lfs:chapter08#8.51.2. Содержимое пакета Python 3|Разделе 8.51.2. «Содержимое пакета Python 3.»]] =====7.11. Texinfo-7.1===== |Пакет Texinfo содержит программы для чтения, записи и преобразования информационных страниц.|| |Приблизительное время сборки:|0.2 SBU| |Требуемое дисковое пространство:|130 MB| ====7.11.1. Установка пакета Texinfo==== #!/bin/bash SRC_FILE=texinfo-7.1.tar.xz SRC_FOLDER=texinfo-7.1 tar -xvf $SRC_FILE cd $SRC_FOLDER time { ./configure --prefix=/usr && make && make install; } && cd .. && rm -rf $SRC_FOLDER && echo Delete $SRC_FOLDER echo Ok $SRC_FILE {{:software:linux_server:lfs-example:lfs_example_235.png?|}} Вывод окончания работы скрипта {{:software:linux_server:lfs-example:lfs_example_236.png?|}} Подробная информация об этом пакете находится в [[software:linux_server:lfs:chapter08#8.71.2. Содержимое пакета Texinfo|Разделе 8.71.2. «Содержимое пакета Texinfo.»]] =====7.12. Util-linux-2.39.3===== |Пакет Util-linux содержит различные служебные программы. Среди них утилиты для работы с файловыми системами, консолями, разделами и сообщениями.|| |Приблизительное время сборки:|0.2 SBU| |Требуемое дисковое пространство:|172 MB| ====7.12.1. Установка пакета Util-linux==== FHS рекомендует использовать каталог **/var/lib/hwclock** вместо каталога **/etc** в качестве местоположения для файла **adjtime**. Создайте этот каталог: mkdir -pv /var/lib/hwclock Подготовьте Util-linux к компиляции: #!/bin/bash SRC_FILE=util-linux-2.39.3.tar.xz SRC_FOLDER=util-linux-2.39.3 tar -xvf $SRC_FILE cd $SRC_FOLDER mkdir -pv /var/lib/hwclock time { ./configure --libdir=/usr/lib \ --runstatedir=/run \ --disable-chfn-chsh \ --disable-login \ --disable-nologin \ --disable-su \ --disable-setpriv \ --disable-runuser \ --disable-pylibmount \ --disable-static \ --without-python \ ADJTIME_PATH=/var/lib/hwclock/adjtime \ --docdir=/usr/share/doc/util-linux-2.39.3 && make && make install; } && cd .. && rm -rf $SRC_FOLDER && echo Delete $SRC_FOLDER echo Ok $SRC_FILE {{:software:linux_server:lfs-example:lfs_example_238.png?|}} ===Значение параметров настройки:=== * **ADJTIME_PATH=/var/lib/hwclock/adjtime** Этот параметр устанавливает расположение файла для записи информации об аппаратных часах в соответствии с FHS. Он не обязателен для временного инструментария, но предотвращает создание файла в другом месте, где файл не будет перезаписан или удален при финальной сборке пакета util-linux. * **--libdir=/usr/lib** Этот параметр гарантирует, что символические ссылки .so, будут указывать на файл общей библиотеки в том же каталоге (/usr/lib). * **--disable-** Этот параметр предотвращают появление предупреждений о сборке компонентов, для которых требуются пакеты, отсутствующие или еще не установленные в LFS. * **--without-python** Этот параметр отключает использование Python. Это позволяет избежать попыток создания ненужных привязок. * **--runstatedir=/run** Этот параметр устанавливает расположение сокета, используемого uuidd и libuuid. {{:software:linux_server:lfs-example:lfs_example_239.png?|}} Подробная информация об этом пакете находится в [[software:linux_server:lfs:chapter08#8.79.2. Содержимое пакета Util-linux|Разделе 8.79.2. «Содержимое пакета Util-linux.»]] =====7.13. Очистка и сохранение временной системы===== ====7.13.1. Очистка==== Во-первых, удалите установленную документацию, чтобы предотвратить ее попадание в конечную систему и сэкономить около 35 МБ места: rm -rf /usr/share/{info,man,doc}/* {{:software:linux_server:lfs-example:lfs_example_240.png?|}} Во-вторых, в современных системах Linux файлы .la библиотеки libtool полезны только для libltdl. Никакие библиотеки в LFS не загружаются с помощью libltdl. Известно, что некоторые файлы .la могут привести к сбою во время сборки пакетов BLFS. Удалите эти файлы сейчас: find /usr/{lib,libexec} -name \*.la -delete {{:software:linux_server:lfs-example:lfs_example_241.png?|}} Сейчас размер системы составляет около 3 ГБ, однако каталог /tools больше не понадобится. Удалите его, чтобы освободить около 1 ГБ дискового пространства: rm -rf /tools {{:software:linux_server:lfs-example:lfs_example_242.png?|}} ====7.13.2. Резервное копирование==== На данный момент основные программы и библиотеки собраны, и ваша система LFS находится в хорошем состоянии. Можно создать резервную копию вашей системы для последующего повторного использования. В случае фатальных сбоев в следующих главах часто оказывается, что удалить все и начать заново (более осторожно) — лучший вариант восстановления. К сожалению, все временные файлы также будут удалены. Чтобы не тратить лишнее время на повторную сборку того, что было успешно собрано, полезно создать резервную копию текущей системы LFS. **Примечание** \\ Все остальные шаги в этом разделе являются необязательными. Тем не менее, как только вы начнете устанавливать пакеты в [[software:linux_server:lfs:chapter08|Главе 8]], временные файлы будут перезаписаны. Поэтому рекомендуется создание резервной копии текущей системы, как описано ниже. Следующие шаги выполняются вне среды chroot. Это означает, что прежде чем продолжить вы должны покинуть среду chroot. Причиной этого является то, что необходимо получить доступ к расположению файловой системы за пределами среды chroot для хранения/чтения архива резервных копий, который не должен размещаться в иерархии $LFS. Если вы решили сделать резервную копию, покиньте среду chroot: exit **Важно** \\ Все следующие инструкции выполняются пользователем root в вашей хост-системе. Будьте особенно внимательны к командам, которые вы собираетесь запускать, поскольку ошибки, допущенные здесь, могут изменить вашу хост-систему. Имейте в виду, что переменная окружения LFS по умолчанию установлена для пользователя lfs, но может не быть установлена для root. Всякий раз, когда команды должны выполняться от root, убедитесь, что вы установили переменную LFS. Это обсуждалось в [[software:linux_server:lfs:chapter02#2.6. Установка переменной $LFS|Разделе 2.6. «Установка переменной $LFS»]]. Перед созданием резервной копии размонтируйте виртуальные файловые системы: mountpoint -q $LFS/dev/shm && umount $LFS/dev/shm umount $LFS/dev/pts umount $LFS/{sys,proc,run,dev} Убедитесь, что у вас есть как минимум 1 ГБ свободного места на диске (исходные tar-архивы будут включены в архив резервных копий) в файловой системе, содержащей каталог, в котором вы создаете архив резервных копий. Обратите внимание, что в приведенных ниже инструкциях указан домашний каталог пользователя root хост-системы, который обычно находится в корневой файловой системе. Замените **$HOME** каталогом на ваш выбор, если вы не хотите, чтобы резервная копия хранилась в домашнем каталоге пользователя **root**. Поскольку архив резервной копии сжимается, процесс занимает довольно много времени (более 10 минут) даже на достаточно быстрой системе. Создайте архив резервной копии, выполнив следующую команду: cd $LFS tar -cJpf $HOME/lfs-temp-tools-12.1-systemd.tar.xz . **Примечание** \\ Если вы переходите к [[software:linux_server:lfs:chapter08|Главе 8]], не забудьте повторно войти в среду chroot, как описано в разделе «Важно» ниже. =====7.13.3. Восстановление===== В случае, если были допущены какие-либо ошибки и вам нужно начать все сначала, вы можете использовать эту резервную копию для восстановления системы и сэкономить время на восстановление. Поскольку исходники находятся в папке **$LFS**, они также включены в архив резервной копии, поэтому их не нужно загружать повторно. Убедившись, что переменная **$LFS** настроена правильно, вы можете восстановить резервную копию, выполнив следующие команды: **Предупреждение** \\ Следующие команды чрезвычайно опасны. Если вы запустите команду **rm -rf ./*** от имени пользователя **root** и не перейдете в каталог **$LFS** или переменная окружения **LFS** не будет установлена для пользователя **root**, это уничтожит всю вашу хост-систему. **ВЫ ПРЕДУПРЕЖДЕНЫ.** cd $LFS rm -rf ./* tar -xpf $HOME/lfs-temp-tools-12.1-systemd.tar.xz Еще раз проверьте, правильно ли настроено окружение, и продолжайте сборку остальной части системы. Важно Если вы покинули среду chroot, чтобы создать резервную копию или перезапустить сборку с помощью восстановления, не забудьте проверить, что виртуальные файловые системы все еще смонтированы (**findmnt | grep $LFS**). Если они не смонтированы, перемонтируйте их сейчас, как описано в [[software:linux_server:lfs:chapter07#7.3. Подготовка виртуальных файловых систем ядра|Разделе 7.3. «Подготовка виртуальных файловых систем ядра»]], и повторно войдите в среду chroot (см. [[software:linux_server:lfs:chapter07#7.4. Вход в окружение Chroot|Раздел 7.4. «Вход в окружение Chroot»]]), прежде чем продолжить. * [[software:linux_server:lfs-example:chapter08|]]