mirror of
https://github.com/Poltern/lfs-ru.git
synced 2024-10-19 12:10:32 +03:00
259 lines
16 KiB
XML
259 lines
16 KiB
XML
<?xml version="1.0" encoding="UTF-8"?>
|
||
<!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
|
||
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
|
||
<!ENTITY % general-entities SYSTEM "../general.ent">
|
||
%general-entities;
|
||
]>
|
||
|
||
<sect1 id="ch-preps-settingenviron">
|
||
<?dbhtml filename="settingenvironment.html"?>
|
||
|
||
<title>Настройка окружения</title>
|
||
|
||
<para>Настроим хорошо работающее окружение, создав два новых файла запуска
|
||
для оболочки <command>bash</command>. Войдя в систему как пользователь
|
||
<systemitem class="username">lfs</systemitem>, введите следующую команду,
|
||
чтобы создать новый <filename>.bash_profile</filename>:</para>
|
||
|
||
<screen><userinput>cat > ~/.bash_profile << "EOF"
|
||
<literal>exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash</literal>
|
||
EOF</userinput></screen>
|
||
|
||
<para>При входе в систему под учетной записью пользователя
|
||
<systemitem class="username">lfs</systemitem> или при переключении на
|
||
&lfs-user;, используя команду <command>su</command> с опцией
|
||
<quote><parameter>-</parameter></quote>, начальная оболочка представляет собой
|
||
оболочку <emphasis>login</emphasis>, которая читает данные из
|
||
<filename>/etc/profile</filename> хоста (который, вероятно, содержит некоторые
|
||
настройки и переменные среды), а затем <filename>.bash_profile</filename>.
|
||
Команда <command>exec env -i.../bin/bash</command> в файле
|
||
<filename>.bash_profile</filename> заменяет запущенную оболочку новой, не
|
||
содержащей переменные среды, за исключением переменных <envar>HOME</envar>,
|
||
<envar>TERM</envar>, и <envar>PS1</envar>. Это гарантирует, что никакие
|
||
нежелательные и потенциально опасные переменные среды из хост-системы не попадут
|
||
в среду сборки.</para>
|
||
|
||
<para>Новый экземпляр оболочки представляет собой <emphasis>non-login</emphasis>
|
||
оболочку, которая не считывает и не выполняет содержимое файлов
|
||
<filename>/etc/profile</filename> и <filename>.bash_profile</filename>,
|
||
а вместо этого выполняет чтение из файла <filename>.bashrc</filename>.
|
||
Создайте файл <filename>.bashrc</filename>:</para>
|
||
|
||
<screen arch="default"><userinput>cat > ~/.bashrc << "EOF"
|
||
<literal>set +h
|
||
umask 022
|
||
LFS=/mnt/lfs
|
||
LC_ALL=POSIX
|
||
LFS_TGT=$(uname -m)-lfs-linux-gnu
|
||
PATH=/usr/bin
|
||
if [ ! -L /bin ]; then PATH=/bin:$PATH; fi
|
||
PATH=$LFS/tools/bin:$PATH
|
||
CONFIG_SITE=$LFS/usr/share/config.site
|
||
export LFS LC_ALL LFS_TGT PATH CONFIG_SITE</literal>
|
||
EOF</userinput></screen>
|
||
<screen arch="ml_32,ml_x32,ml_all"><userinput>cat > ~/.bashrc << "EOF"
|
||
<literal>set +h
|
||
umask 022
|
||
LFS=/mnt/lfs
|
||
LC_ALL=POSIX
|
||
LFS_TGT=x86_64-lfs-linux-gnu
|
||
LFS_TGT32=i686-lfs-linux-gnu
|
||
LFS_TGTX32=x86_64-lfs-linux-gnux32
|
||
PATH=/usr/bin
|
||
if [ ! -L /bin ]; then PATH=/bin:$PATH; fi
|
||
PATH=$LFS/tools/bin:$PATH
|
||
CONFIG_SITE=$LFS/usr/share/config.site
|
||
export LFS LC_ALL LFS_TGT LFS_TGT32 LFS_TGTX32 PATH</literal>
|
||
EOF</userinput></screen>
|
||
|
||
<variablelist>
|
||
<title>Значение настроек в <filename>.bashrc</filename></title>
|
||
|
||
<varlistentry>
|
||
<term><parameter>set +h</parameter></term>
|
||
<listitem>
|
||
<para>Команда <command>set +h</command> отключает хэш-функцию
|
||
<command>bash</command>. Хеширование является полезной функцией
|
||
—<command>bash</command> использует хеш-таблицу для запоминания полного
|
||
пути к исполняемому файлу, чтобы избежать многократного поиска одного и того же
|
||
исполняемого файла в переменной окружения <envar>PATH</envar>. Однако новые
|
||
инструменты требуется использовать сразу же после их установки. Отключение
|
||
хэш-функции, заставляет оболочку искать переменную окружения <envar>PATH</envar>,
|
||
всякий раз, когда программу необходимо запустить. Таким образом, оболочка найдет вновь
|
||
скомпилированные инструменты в <filename class="directory">$LFS/tools/bin</filename>,
|
||
как только они станут доступны, не запоминая предыдущую версию той же программы,
|
||
предоставленную хост-дистрибутивом, в <filename class='directory'>/usr/bin</filename> или
|
||
<filename class='directory'>/bin</filename>.</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
|
||
<varlistentry>
|
||
<term><parameter>umask 022</parameter></term>
|
||
<listitem>
|
||
<para>Установка значения пользовательской маски создания файлов (umask) 022 гарантирует,
|
||
что вновь созданные файлы и каталоги доступны для записи только их владельцу, но
|
||
будут доступны для чтения и выполнения остальным пользователям (при условии, что
|
||
системный вызов <ulink role='man' url='&man;open.2'>open(2)</ulink> использует режимы по
|
||
умолчанию, новые файлы получат разрешения 644, а каталоги 755).</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
|
||
<varlistentry>
|
||
<term><parameter>LFS=/mnt/lfs</parameter></term>
|
||
<listitem>
|
||
<para>Переменная окружения <envar>LFS</envar> должна указывать на выбранную точку монтирования.</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
|
||
<varlistentry>
|
||
<term><parameter>LC_ALL=POSIX</parameter></term>
|
||
<listitem>
|
||
<para>Переменная <envar>LC_ALL</envar> управляет локализацией определенных
|
||
программ, и формирует сообщения в соответствии с локализацией указанной страны.
|
||
Установка в <envar>LC_ALL</envar> значения <quote>POSIX</quote> или <quote>C</quote>
|
||
(они эквивалентны) гарантирует, что все будет работать должным образом в среде
|
||
кросс-компиляции.</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
|
||
<varlistentry>
|
||
<term><parameter>LFS_TGT=$(uname -m)-lfs-linux-gnu</parameter></term>
|
||
<listitem>
|
||
<para>Переменная <envar>LFS_TGT</envar> устанавливает нестандартное, но
|
||
совместимое описание компьютера для использования при создании кросс-компилятора
|
||
и компоновщика, а также при кросс-компиляции временного набора инструментов.
|
||
Дополнительная информация об этом представлена в <xref linkend="ch-tools-toolchaintechnotes" role=""/>.</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
|
||
<varlistentry>
|
||
<term><parameter>PATH=/usr/bin</parameter></term>
|
||
<listitem>
|
||
<para>Многие современные дистрибутивы Linux объединили <filename
|
||
class="directory">/bin</filename> и <filename
|
||
class="directory">/usr/bin</filename>. В этом случае стандартной переменной <envar>PATH</envar>
|
||
необходимо установить значение <filename
|
||
class="directory">/usr/bin/</filename> для окружения из <xref
|
||
linkend="chapter-temporary-tools"/>. Когда это не так, следующая строка добавит
|
||
<filename class="directory">/bin</filename> к пути.</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
|
||
<varlistentry>
|
||
<term><parameter>if [ ! -L /bin ]; then PATH=/bin:$PATH; fi</parameter></term>
|
||
<listitem>
|
||
<para>Если <filename class="directory">/bin</filename> не является символической
|
||
ссылкой, то его необходимо добавить в переменную <envar>PATH</envar>.</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
|
||
<varlistentry>
|
||
<term><parameter>PATH=$LFS/tools/bin:$PATH</parameter></term>
|
||
<listitem>
|
||
<para>Поместив <filename class="directory">$LFS/tools/bin</filename> перед
|
||
стандартным <envar>PATH</envar>, кросс-компилятор, установленный в начале
|
||
<xref linkend="chapter-cross-tools"/>, будет обнаружен оболочкой сразу после
|
||
его установки. Это, в сочетании с отключением хеширования, ограничивает риск
|
||
использования компилятора хоста вместо кросс-компилятора.</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
|
||
<varlistentry>
|
||
<term><parameter>CONFIG_SITE=$LFS/usr/share/config.site</parameter></term>
|
||
<listitem>
|
||
<para>В <xref linkend="chapter-cross-tools"/> и <xref linkend="chapter-temporary-tools"/>,
|
||
если эта переменная не задана, сценарии <command>configure</command> могут попытаться
|
||
загрузить элементы конфигурации, специфичные для некоторых дистрибутивов, из
|
||
<filename>/usr/share/config.site</filename> в хост-системе. Переопределите её,
|
||
чтобы предотвратить потенциальное влияние хоста.</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
|
||
<varlistentry>
|
||
<term><parameter>export ...</parameter></term>
|
||
<listitem>
|
||
<para>Приведенные выше команды установили некоторые переменные, чтобы сделать
|
||
их видимыми в любых вложенных оболочках, мы экспортируем их.</para>
|
||
</listitem>
|
||
</varlistentry>
|
||
|
||
</variablelist>
|
||
|
||
<important>
|
||
|
||
<para>Некоторые коммерческие дистрибутивы добавляют недокументированный экземпляр
|
||
<filename>/etc/bash.bashrc</filename> для инициализации <command>bash</command>.
|
||
Этот файл потенциально может изменить среду пользователя
|
||
<systemitem class="username">lfs</systemitem> таким образом, что это может
|
||
повлиять на сборку важных пакетов LFS. Чтобы убедиться, что пользовательская
|
||
среда <systemitem class="username">lfs</systemitem> чиста, проверьте наличие
|
||
файла <filename>/etc/bash.bashrc</filename> и, если он есть, переименуйте его.
|
||
От имени пользователя <systemitem class="username">root</systemitem>, запустите:</para>
|
||
|
||
<screen role="nodump"><userinput>[ ! -e /etc/bash.bashrc ] || mv -v /etc/bash.bashrc /etc/bash.bashrc.NOUSE</userinput></screen>
|
||
|
||
<para>Когда пользователь <systemitem class="username">lfs</systemitem> больше не
|
||
нужен (в начале <xref linkend="chapter-chroot-temporary-tools"/> ) вы можете безопасно
|
||
восстановить <filename>/etc/bash.bashrc</filename> (по желанию).</para>
|
||
|
||
<para>Обратите внимание, что пакет LFS Bash, который мы создадим в
|
||
<xref linkend="ch-system-bash"/>, не настроен на загрузку или выполнение
|
||
<filename>/etc/bash.bashrc</filename>, поэтому этот файл бесполезен в
|
||
готовой системе LFS.</para>
|
||
</important>
|
||
|
||
<para>
|
||
Для многих современных систем с несколькими процессорами (или ядрами)
|
||
время компиляции пакета можно сократить, выполнив <quote>параллельную сборку</quote>,
|
||
либо установив переменную среды, либо сообщив программе <command>make</command>,
|
||
сколько ядер задействовать для сборки. Например, процессор Intel Core i9-13900K
|
||
имеет 8 ядер P (производительность) и 16 ядер E (энергоэффективность), ядро P может
|
||
одновременно запускать два потока, поэтому каждое ядро P моделируется ядром Linux
|
||
как два логических ядра. В результате получается 32 логических ядра. Очевидный способ
|
||
задействовать все эти логические ядра - разрешить <command>make</command> создавать
|
||
до 32 заданий сборки. Это можно сделать, передав параметр <parameter>-j32</parameter>
|
||
команде <command>make</command>:
|
||
</para>
|
||
|
||
<screen role='nodump'><userinput>make -j32</userinput></screen>
|
||
|
||
<para>
|
||
Или установите переменную окружения <envar>MAKEFLAGS</envar>, и ее содержимое будет
|
||
автоматически использоваться <command>make</command> в качестве параметров командной
|
||
строки:
|
||
</para>
|
||
|
||
<screen role='nodump'><userinput>export MAKEFLAGS=-j32</userinput></screen>
|
||
|
||
<important>
|
||
<para>
|
||
Никогда не передавайте параметр <parameter>-j</parameter> без номера в
|
||
<command>make</command> и не устанавливайте такой параметр в <envar>MAKEFLAGS</envar>.
|
||
Иначе <command>make</command> будет создавать бесконечные задания сборки,
|
||
что вызовет проблемы со стабильностью системы.
|
||
</para>
|
||
</important>
|
||
|
||
<para>
|
||
Чтобы использовать все логические ядра, доступные для сборки пакетов в
|
||
<xref linkend='chapter-cross-tools'/> и
|
||
<xref linkend='chapter-temporary-tools'/>, укажите параметр <envar>MAKEFLAGS</envar>
|
||
в <filename>.bashrc сейчас</filename>:
|
||
</para>
|
||
|
||
<screen><userinput>cat >> ~/.bashrc << "EOF"
|
||
<literal>export MAKEFLAGS=-j<replaceable>$(nproc)</replaceable></literal>
|
||
EOF</userinput></screen>
|
||
|
||
<para>
|
||
Замените <replaceable>$(nproc)</replaceable> количеством логических ядер, которые
|
||
вы хотите использовать, если вы планируете использовать не все логические ядра.
|
||
</para>
|
||
|
||
<para>Наконец, чтобы убедиться, что среда полностью подготовлена для сборки временных
|
||
инструментов, перечитайте только что созданный профиль пользователя:</para>
|
||
|
||
<screen><userinput>source ~/.bash_profile</userinput></screen>
|
||
|
||
</sect1>
|