Содержание

Часть III. Глава 7. Вход в окружение Chroot и создание дополнительных временных инструментов

Содержание

7.1. Введение

В этой главе рассказывается, как собрать последние недостающие части временной системы: инструменты, необходимые для сборки различных пакетов. Теперь, когда все циклические зависимости устранены, для сборки можно использовать среду «chroot», полностью изолированную от операционной системы хоста (за исключением работающего ядра).

Для правильной работы изолированной среды необходимо установить связь с работающим ядром. Это делается с помощью так называемых виртуальных файловых систем ядра, которые будут смонтированы перед входом в среду chroot. Вы можете проверить, смонтированы ли они, выполнив команду findmnt.

До Раздела 7.4. «Вход в окружение Chroot» команды должны выполняться от имени root с установленной переменной LFS. После входа в chroot все команды выполняются от имени root, к счастью, без доступа к операционной системе компьютера, на котором вы собираете LFS. В любом случае будьте осторожны, так как неверными командами легко разрушить всю систему LFS.

7.2. Смена владельца

Примечание
Команды, приведенные в оставшейся части книги, должны выполняться от имени пользователя root, а не lfs. Дважды проверьте, что переменная $LFS установлена в переменных окружения пользователя root.

В настоящее время вся иерархия каталогов в $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

7.3. Подготовка виртуальных файловых систем ядра

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

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

mkdir -pv $LFS/{dev,proc,sys,run}

7.3.1. Монтирование и заполнение /dev

Во время обычной загрузки ядро автоматически монтирует файловую систему devtmpfs в каталог /dev; ядро создает узлы устройств в этой виртуальной файловой системе в процессе загрузки или при первом обнаружении устройства, или доступе к нему. Демон udev может изменять владельца или разрешения узлов устройств, созданных ядром, или создавать новые узлы устройств или символические ссылки, чтобы облегчить работу разработчиков дистрибутива или системных администраторов. (Подробности смотрите в Разделе 9.3.2.2. «Создание узла устройства».) Если ядро хоста поддерживает devtmpfs, мы можем просто смонтировать devtmpfs в $LFS/dev и положиться на ядро для его заполнения.

Но в некоторых ядрах хоста отсутствует поддержка devtmpfs, эти хост-дистрибутивы используют разные методы для создания содержимого /dev. Таким образом, единственный независимый от хоста способ заполнить каталог $LFS/dev - это привязка к каталогу /dev хост-системы. Связное монтирование - это особый тип монтирования, который делает дерево каталога или файл видимым в каком-либо другом месте. Для этого используйте следующую команду:

mount -v --bind /dev $LFS/dev

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

Значение параметров монтирования для devpts:

Этот параметр гарантирует, что все узлы устройств, созданные devpts, принадлежат группе с идентификатором 5. Это идентификатор, который мы будем использовать позже для группы tty. Мы используем идентификатор группы вместо имени, поскольку хост-система может использовать другой идентификатор для своей группы tty.

Этот параметр гарантирует, что все узлы устройств, созданные 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

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

Если вы не хотите использовать все доступные логические ядра, замените параметр $(nproc) количеством логических ядер, которые вы хотите использовать для сборки пакетов в этой и последующих главах. На наборы тестов некоторых пакетов (в частности Autoconf, Libtool и Tar) в Главе 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. Если вы покидаете эту среду по какой-либо причине (например, при перезагрузке), убедитесь, что файловые системы виртуального ядра смонтированы, как описано в Разделе 7.3.1. «Монтирование и заполнение /dev» и Разделе 7.3.2. «Монтирование виртуальных файловых систем ядра», а затем войдите в среду chroot для продолжения установки.

7.5. Создание каталогов

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

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

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

mkdir -pv /{boot,home,mnt,opt,srv}

Создайте необходимые подкаталоги, выполнив следующие команды:

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

По умолчанию каталоги создаются с правами 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

Создайте файл /etc/hosts, на который будут ссылаться некоторые наборы тестов, а также один из файлов конфигурации Perl:

cat > /etc/hosts << EOF
127.0.0.1  localhost $(hostname)
::1        localhost
EOF

Чтобы пользователь 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

Пароль пользователя 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

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

Для некоторых тестов в Главе 8 требуется обычный пользователь. Добавим такого пользователя здесь и удалим эту учетную запись в конце главы.

echo "tester:x:101:101::/home/tester:/bin/bash" >> /etc/passwd
echo "tester:x:101:" >> /etc/group
install -o tester -d /home/tester

Чтобы удалить приглашение «I have no name!», запустите новую оболочку. Поскольку файлы /etc/passwd и /etc/group были созданы, разрешение имен пользователей и групп теперь будет работать:

exec /usr/bin/bash --login

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

В файл /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

7.7.1. Установка пакета Gettext

Для временного набора инструментов нам нужно установить только три программы из пакета Gettext.

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

./configure --disable-shared

Значение параметров настройки:

В настоящее время нам не нужно устанавливать какие-либо общие библиотеки Gettext, поэтому нет необходимости их собирать.

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

make

Установите программы msgfmt, msgmerge, и xgettext programs:

cp -v gettext-tools/src/{msgfmt,msgmerge,xgettext} /usr/bin

Подробная информация об этом пакете находится в Разделе 8.32.2. «Содержимое пакета Gettext.»

7.8. Bison-3.8.2

Пакет Bison содержит генератор синтаксического анализа.
Приблизительное время сборки:0.2 SBU
Требуемое дисковое пространство:57 MB

7.8.1. Установка пакета Bison

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

./configure --prefix=/usr \
            --docdir=/usr/share/doc/bison-3.8.2

Значение параметров настройки:

Этот параметр указывает системе сборки установить документацию к bison в каталог с версией пакета.

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

make

Установите пакет:

make install

Подробная информация об этом пакете находится в Разделе 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

Подготовьте Perl к компиляции:

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

Значение параметров настройки:

Значение новых опций Configure:

Это комбинация из трех параметров: -d использует значения по умолчанию для всех элементов; -e обеспечивает выполнение всех задач; -s отключает несущественные выходные данные.

Параметр гарантирует, что perl знает, как указать пакетам, где они должны устанавливать свои модули Perl.

Собрать библиотеку libperl, необходимую некоторым модулям Perl, как общую библиотеку вместо статической.

Эти настройки определяют, где Perl ищет установленные модули. Редакторы LFS решили поместить их в структуру каталогов, основанную на MAJOR.MINOR версии Perl (5.38), что позволяет обновлять Perl до более новых уровней исправлений (уровень исправления - это последняя разделенная точками часть в строке полной версии, например 5.38.2) без необходимости переустанавливать все модули.

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

make

Установите пакет:

make install

Подробная информация об этом пакете находится в Разделе 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 (обратите внимание на заглавную первую букву).

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

./configure --prefix=/usr   \
            --enable-shared \
            --without-ensurepip

Значение параметров настройки:

Этот параметр отключает установку статичных библиотек.

Этот параметр отключает установщик пакетов Python, который на данном этапе не нужен.

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

make

Примечание
Некоторые модули Python 3 не могут быть собраны сейчас, потому что зависимости еще не установлены. Для модуля ssl выводится сообщение Python требует OpenSSL 1.1.1 или новее. Сообщение следует проигнорировать. Просто убедитесь, что команда make верхнего уровня не завершилась ошибкой. Дополнительные модули сейчас не нужны, и они будут собраны в Главе 8.

Установите пакет:

make install

Подробная информация об этом пакете находится в Разделе 8.51.2. «Содержимое пакета Python 3.»

7.11. Texinfo-7.1

Пакет Texinfo содержит программы для чтения, записи и преобразования информационных страниц.
Приблизительное время сборки:0.2 SBU
Требуемое дисковое пространство:130 MB

7.11.1. Установка пакета Texinfo

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

./configure --prefix=/usr

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

make

Установите пакет:

make install

Подробная информация об этом пакете находится в Разделе 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 к компиляции:

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

Значение параметров настройки:

Этот параметр устанавливает расположение файла для записи информации об аппаратных часах в соответствии с FHS. Он не обязателен для временного инструментария, но предотвращает создание файла в другом месте, где файл не будет перезаписан или удален при финальной сборке пакета util-linux.

Этот параметр гарантирует, что символические ссылки .so, будут указывать на файл общей библиотеки в том же каталоге (/usr/lib).

Этот параметр предотвращают появление предупреждений о сборке компонентов, для которых требуются пакеты, отсутствующие или еще не установленные в LFS.

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

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

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

make

Установите пакет:

make install

Подробная информация об этом пакете находится в Разделе 8.79.2. «Содержимое пакета Util-linux.»

7.13. Очистка и сохранение временной системы

7.13.1. Очистка

Во-первых, удалите установленную документацию, чтобы предотвратить ее попадание в конечную систему и сэкономить около 35 МБ места:

rm -rf /usr/share/{info,man,doc}/*

Во-вторых, в современных системах Linux файлы .la библиотеки libtool полезны только для libltdl. Никакие библиотеки в LFS не загружаются с помощью libltdl. Известно, что некоторые файлы .la могут привести к сбою во время сборки пакетов BLFS. Удалите эти файлы сейчас:

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

Сейчас размер системы составляет около 3 ГБ, однако каталог /tools больше не понадобится. Удалите его, чтобы освободить около 1 ГБ дискового пространства:

rm -rf /tools

7.13.2. Резервное копирование

На данный момент основные программы и библиотеки собраны, и ваша система LFS находится в хорошем состоянии. Можно создать резервную копию вашей системы для последующего повторного использования. В случае фатальных сбоев в следующих главах часто оказывается, что удалить все и начать заново (более осторожно) — лучший вариант восстановления. К сожалению, все временные файлы также будут удалены. Чтобы не тратить лишнее время на повторную сборку того, что было успешно собрано, полезно создать резервную копию текущей системы LFS.

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

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

Если вы решили сделать резервную копию, покиньте среду chroot:

exit

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

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

Примечание
Если вы переходите к Главе 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). Если они не смонтированы, перемонтируйте их сейчас, как описано в Разделе 7.3. «Подготовка виртуальных файловых систем ядра», и повторно войдите в среду chroot (см. Раздел 7.4. «Вход в окружение Chroot»), прежде чем продолжить.