lfs-ru/chapter04/settingenviron.xml

245 lines
15 KiB
XML
Raw Normal View History

<?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 &gt; ~/.bash_profile &lt;&lt; "EOF"
<literal>exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash</literal>
EOF</userinput></screen>
<para>При входе в систему под учетной записью пользователя
2023-06-26 21:32:36 +03:00
<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>. Это гарантирует, что никакие
нежелательные и потенциально опасные переменные среды из хост-системы не попадут
2023-06-26 21:32:36 +03:00
в среду сборки.</para>
<para>Новый экземпляр оболочки представляет собой <emphasis>non-login</emphasis>
оболочку, которая не считывает и не выполняет содержимое файлов
<filename>/etc/profile</filename> и <filename>.bash_profile</filename>,
а вместо этого выполняет чтение из файла <filename>.bashrc</filename>.
Создайте файл <filename>.bashrc</filename>:</para>
<screen><userinput>cat &gt; ~/.bashrc &lt;&lt; "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>
<variablelist>
<title>Значение настроек в <filename>.bashrc</filename></title>
<varlistentry>
<term><parameter>set +h</parameter></term>
<listitem>
<para>Команда <command>set +h</command> отключает хэш-функцию
<command>bash</command>. Хеширование является полезной функцией
&mdash;<command>bash</command> использует хеш-таблицу для запоминания полного
пути к исполняемому файлу, чтобы избежать многократного поиска одного и того же
исполняемого файла в переменной окружения <envar>PATH</envar>. Однако новые
2023-06-26 21:32:36 +03:00
инструменты требуется использовать сразу же после их установки. Отключение
хэш-функции, заставляет оболочку искать переменную окружения <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>
2023-06-26 21:32:36 +03:00
<para>Переменная окружения <envar>LFS</envar> должна указывать на выбранную точку монтирования.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>LC_ALL=POSIX</parameter></term>
<listitem>
<para>Переменная <envar>LC_ALL</envar> управляет локализацией определенных
2023-08-02 23:14:31 +03:00
программ, и формирует сообщения в соответствии с локализацией указанной страны.
Установка в <envar>LC_ALL</envar> значения <quote>POSIX</quote> или <quote>C</quote>
2023-06-26 21:32:36 +03:00
(они эквивалентны) гарантирует, что все будет работать должным образом в среде
кросс-компиляции.</para>
</listitem>
</varlistentry>
<varlistentry>
2023-08-12 18:50:06 +03:00
<term><parameter>LFS_TGT=$(uname -m)-lfs-linux-gnu</parameter></term>
<listitem>
<para>Переменная <envar>LFS_TGT</envar> устанавливает нестандартное, но
совместимое описание компьютера для использования при создании кросс-компилятора
и компоновщика, а также при кросс-компиляции временного набора инструментов.
2023-06-26 21:32:36 +03:00
Дополнительная информация об этом представлена в <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
2023-06-26 21:32:36 +03:00
class="directory">/usr/bin</filename>. В этом случае стандартной переменной <envar>PATH</envar>
необходимо установить значение <filename
class="directory">/usr/bin/</filename> для окружения из <xref
linkend="chapter-temporary-tools"/>. Когда это не так, следующая строка добавит
2022-05-21 23:04:03 +03:00
<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> не является символической
2023-06-26 21:32:36 +03:00
ссылкой, то его необходимо добавить в переменную <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"/>, будет обнаружен оболочкой сразу после
его установки. Это, в сочетании с отключением хеширования, ограничивает риск
2023-06-26 21:32:36 +03:00
использования компилятора хоста вместо кросс-компилятора.</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> в хост-системе. Переопределите её,
2023-06-14 21:49:47 +03:00
чтобы предотвратить потенциальное влияние хоста.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>export ...</parameter></term>
<listitem>
<para>Приведенные выше команды установили некоторые переменные, чтобы сделать
их видимыми в любых вложенных оболочках, мы экспортируем их.</para>
</listitem>
</varlistentry>
</variablelist>
<important>
2023-06-26 21:32:36 +03:00
<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>
2023-06-26 21:32:36 +03:00
<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>
2024-02-07 11:10:52 +03:00
команде <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 &gt;&gt; ~/.bashrc &lt;&lt; "EOF"
<literal>export MAKEFLAGS=-j<replaceable>$(nproc)</replaceable></literal>
EOF</userinput></screen>
<para>
Замените <replaceable>$(nproc)</replaceable> количеством логических ядер, которые
вы хотите использовать, если вы планируете использовать не все логические ядра.
</para>
2023-06-26 21:32:36 +03:00
<para>Наконец, чтобы убедиться, что среда полностью подготовлена для сборки временных
инструментов, перечитайте только что созданный профиль пользователя:</para>
<screen><userinput>source ~/.bash_profile</userinput></screen>
</sect1>