Рубрики
lfs

ALFS

https://www.linuxfromscratch.org/alfs/
https://wiki.linuxfromscratch.org/alfs/wiki/SupportedBooks
https://www.linuxfromscratch.org/hints/downloads/files/more_control_and_pkg_man.txt
https://www.linuxfromscratch.org/blfs/downloads/
https://www.linuxfromscratch.org/faq/
https://github.com/mattwind/alfs
https://github.com/ivandavidov/minimal
https://www.php.net/manual/en/timezones.php Europe/Moscow

WTF

!!! https://www.linuxfromscratch.org/alfs/
Зачем мне использовать ALFS?
Прочитав книги LFS и BLFS более 2-3 раз, вы быстро оцените возможность автоматизировать задачу компиляции программного обеспечения, которое вы хотите для своих систем.

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

Скрипт проверки готовности системы на которой мы готовим LFS

cat > version-check.sh << "EOF"
#!/bin/bash
# Simple script to list version numbers of critical development tools
export LC_ALL=C
bash --version | head -n1 | cut -d" " -f2-4
MYSH=$(readlink -f /bin/sh)
echo "/bin/sh -> $MYSH"
echo $MYSH | grep -q bash || echo "ERROR: /bin/sh does not point to bash"
unset MYSH
 
echo -n "Binutils: "; ld --version | head -n1 | cut -d" " -f3-
bison --version | head -n1
 
if [ -h /usr/bin/yacc ]; then
  echo "/usr/bin/yacc -> `readlink -f /usr/bin/yacc`";
elif [ -x /usr/bin/yacc ]; then
  echo yacc is `/usr/bin/yacc --version | head -n1`
else
  echo "yacc not found"
fi
 
echo -n "Coreutils: "; chown --version | head -n1 | cut -d")" -f2
diff --version | head -n1
find --version | head -n1
gawk --version | head -n1
 
if [ -h /usr/bin/awk ]; then
  echo "/usr/bin/awk -> `readlink -f /usr/bin/awk`";
elif [ -x /usr/bin/awk ]; then
  echo awk is `/usr/bin/awk --version | head -n1`
else
  echo "awk not found"
fi
 
gcc --version | head -n1
g++ --version | head -n1
grep --version | head -n1
gzip --version | head -n1
cat /proc/version
m4 --version | head -n1
make --version | head -n1
patch --version | head -n1
echo Perl `perl -V:version`
python3 --version
sed --version | head -n1
tar --version | head -n1
makeinfo --version | head -n1  # texinfo version
xz --version | head -n1
 
echo 'int main(){}' > dummy.c && g++ -o dummy dummy.c
if [ -x dummy ]
  then echo "g++ compilation OK";
  else echo "g++ compilation failed"; fi
rm -f dummy.c dummy
EOF
 
bash version-check.sh

Первым делом готовим систему где будем собирать ALFS

0. Устанавливаем рекомендованные пакеты для debian:
apt install build-essential bison gawk git htop texinfo wget make gcc bc bison flex xorriso libelf-dev libssl-dev vim

1. Экспортируем переменные
export LFS=/mnt/lfs
export ALFS=/mnt/lfs/alfs

2. Готовим диск
(vdb - диск на котором будем собирать lfs)
fdisk /dev/vdb
!!! Создаем новую ext4 parition /dev/vdb1 (option n) и делаем его загрузочным (option a)
mkfs.ext4 /dev/vda1 

3. Монтируем диск
mkdir $LFS
mount -t ext4 /dev/vdb1 $LFS

4. Создаем директории и выдаем права
mkdir -pv $LFS/{etc,var,sources,tools,usr} $LFS/usr/{bin,lib,sbin}
chmod -v a+wt $LFS/sources

5. Загружаем файлы lfs
Список скачиваемых пакетов wget-list и список контрольных сумм пакетов md5sums:
wget https://www.linuxfromscratch.org/lfs/downloads/stable-systemd/wget-list --directory-prefix=$LFS/sources
wget https://www.linuxfromscratch.org/lfs/downloads/stable-systemd/md5sums --directory-prefix=$LFS/sources

После этого приступаем к закачке исходников всего и вся:
wget --input-file=$LFS/sources/wget-list --continue --directory-prefix=$LFS/sources

6. Проверяем скаченное:
!!! Команды pushd/popd, делают следующие, 
!!! Команда pushd временно переводит вас в указанный в качестве параметра каталог. 
!!! Возврат назад происходит командой popd
!!! Если чего-то не окажется, нужно пойти и скачать ручками
!!! Если все ок можем продолжать
pushd $LFS/sources
md5sum -c md5sums
popd

7. Создаем пользователя lfs и настраиваем для него окружение
ln -sv $LFS/tools /
groupadd lfs
useradd -s /bin/bash -g lfs -m -k /dev/null lfs
passwd lfs
chown -v lfs $LFS

8. Переключимся в пользователя lfs
su - lfs

9. profile
cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:w\$ ' /bin/bash
EOF

10. bashrc
cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/tools/bin:/bin:/usr/bin
export LFS LC_ALL LFS_TGT PATH
EOF

11. Переключаемся на чистое окружение
exec env -i HOME=$HOME TERM=$TERM PS1='\u:W\$ ' /bin/bash 

12. Обновим пользовательское окружение командой
source ~/.bash_profile

Сборка с помощью jhalfs (официальный)

su - lfs
cd $LFS
git clone git://git.linuxfromscratch.org/jhalfs.git jhalfs
cd jhalfs
make
Рубрики
lfs

Linux From Scratch (LFS 11.1-systemd ) / бумажный дистрибутив / часть 1

Ссылки:

https://www.linuxfromscratch.org/lfs/downloads/stable/
https://www.linuxfromscratch.org/lfs/downloads/stable-systemd/LFS-BOOK-11.1-NOCHUNKS.html
https://www.linuxfromscratch.org/lfs/downloads/stable/LFS-BOOK-11.2-NOCHUNKS.html
https://www.linuxfromscratch.org/lfs/download.html
https://www.linuxfromscratch.org/faq/
https://habr.com/ru/post/257663/
https://www.linuxfromscratch.org/livecd/download.html
https://github.com/automate-lfs/jhalfs

Скрипт проверки готовности системы для сборки lfs:

cat > version-check.sh << "EOF"
#!/bin/bash
# Simple script to list version numbers of critical development tools
export LC_ALL=C
bash --version | head -n1 | cut -d" " -f2-4
MYSH=$(readlink -f /bin/sh)
echo "/bin/sh -> $MYSH"
echo $MYSH | grep -q bash || echo "ERROR: /bin/sh does not point to bash"
unset MYSH

echo -n "Binutils: "; ld --version | head -n1 | cut -d" " -f3-
bison --version | head -n1

if [ -h /usr/bin/yacc ]; then
  echo "/usr/bin/yacc -> `readlink -f /usr/bin/yacc`";
elif [ -x /usr/bin/yacc ]; then
  echo yacc is `/usr/bin/yacc --version | head -n1`
else
  echo "yacc not found"
fi

echo -n "Coreutils: "; chown --version | head -n1 | cut -d")" -f2
diff --version | head -n1
find --version | head -n1
gawk --version | head -n1

if [ -h /usr/bin/awk ]; then
  echo "/usr/bin/awk -> `readlink -f /usr/bin/awk`";
elif [ -x /usr/bin/awk ]; then
  echo awk is `/usr/bin/awk --version | head -n1`
else
  echo "awk not found"
fi

gcc --version | head -n1
g++ --version | head -n1
grep --version | head -n1
gzip --version | head -n1
cat /proc/version
m4 --version | head -n1
make --version | head -n1
patch --version | head -n1
echo Perl `perl -V:version`
python3 --version
sed --version | head -n1
tar --version | head -n1
makeinfo --version | head -n1  # texinfo version
xz --version | head -n1

echo 'int main(){}' > dummy.c && g++ -o dummy dummy.c
if [ -x dummy ]
  then echo "g++ compilation OK";
  else echo "g++ compilation failed"; fi
rm -f dummy.c dummy
EOF

bash version-check.sh

0. Подготовим linux для установкам LFS:

!!! https://github.com/archlinux/archinstall
0. Накатил на виртуалку archlinux без графики использовал команду archinstall
1. после установки подключил еще одни диск /dev/vdb отформатировал его (fstab /dev/vdb)
   создал файловую систему с помощью ext4(mkfs.ext4 /dev/vdb1)
   добавил этот диск в (/etc/fstab) что бы пока не беспокоится о его подключении после перезагрузки системы
   проверил с помощью команды (mount -a) 
   mkdir /mnt/lfs

2. установил софт на  archlinux
pacman -Sy core/openssh vim git wget python gcc

3. временно создал переменную LFS
!!! В книге LFS предполагается что вы все делаете за одни раз
!!! Поэтому, в случае отключения питания ПК, потребуется некоторые команды выполнять заново.
export LFS=/mnt/lfs

4. Создал директории
 mkdir -v $LFS
 mkdir -v $LFS/sources
 mkdir -v $LFS/tools
 mkdir -v $LFS/usr

5. Создаем еще директории:
mkdir -pv $LFS/{etc,var} $LFS/usr/{bin,lib,sbin}

6. Создаем символьные ссылки для библиотеки:
for i in bin lib sbin; do
  ln -sv usr/$i $LFS/$i
done

7. Создаем символьные ссылки для библиотеки x64:
case $(uname -m) in
  x86_64) mkdir -pv $LFS/lib64 ;;
esac

8. Права
chmod -v a+wt $LFS/sources

9. Загружаем файлы lfs
Список скачиваемых пакетов wget-list и список контрольных сумм пакетов md5sums:
wget https://www.linuxfromscratch.org/lfs/downloads/stable-systemd/wget-list --directory-prefix=$LFS/sources
wget https://www.linuxfromscratch.org/lfs/downloads/stable-systemd/md5sums --directory-prefix=$LFS/sources

После этого приступаем к закачке исходников всего и вся:
wget --input-file=$LFS/sources/wget-list --continue --directory-prefix=$LFS/sources

10. Проверяем скаченное:
!!! команды pushd/popd, делают следующие, 
!!! Команда pushd временно переводит вас в указанный в качестве параметра каталог. 
!!! Возврат назад происходит командой popd
pushd $LFS/sources
md5sum -c md5sums
popd
!!! Если чего-то не окажется, нужно пойти и скачать ручками
!!! если все ок можем продолжать

1.1 Книга:

cd /mnt/lfs/book
git clone git://git.linuxfromscratch.org/jhalfs.git jhalfs

2. подготовим окружение пользователя lfs для сборки:

!!! если вышли или закрыли консоль не забываем выполнить  (export LFS=/mnt/lfs и проверить с помощью echo $LFS)
0. Настройка рабочего окружения
!!! Создаем символьную ссыдку
!!! Мы обеспечиваем возможность обращения к данному каталогу по пути /tools вне зависимости от текущего расположения корня системы
!!!  В противном случае сразу после перехода во временную систему нас ждет сбой при первой же компиляции.
ln -sv $LFS/tools /

1. Создаем группу lfs
groupadd lfs

2. Создаем пользователя lfs
useradd -s /bin/bash -g lfs -m -k /dev/null lfs
-s /bin/bash — используемая в сеансе пользователя командная оболочка
-g lfs — группа, в которую входит пользователь
-m — указывает, что необходимо создать домашний каталог пользователя /home/lfs
-k /dev/null — пустой каталог шаблонов(создать пустую директорию /home/lfs). По-умолчанию при создании домашнего каталога в него помещаются файлы и папки, размещенные в /etc/skel. 
            
3. Устанавливаем пароль пользователю lfs
passwd lfs

4. Сделаем lfs его владельцем каталогов $LFS/sources и $LFS/tools
chown -v lfs $LFS/sources
chown -v lfs $LFS/tools
chown -v lfs $LFS/book
chown -v lfs $LFS/usr




3. Продолжаем работу над рабочим окружением пользователя:

0. Подключаемся от имени lfs:
su - lfs

1. Создаем в домашней директории пользователя файл ~/.bash_profile:
!!! Файл ~/.bash_profile определяет индивидуальную пользовательские настройку переменных среды.
------------------------------
cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:w\$ ' /bin/bash
EOF
------------------------------

2. Создаем в домашней директории пользователя файл ~/.bashrc:
!!! Файл ~/.bashrc определяет какие настройки должны быть выполнены при логине в сессию данного пользователя
-----------------------------------
cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/tools/bin:/bin:/usr/bin
export LFS LC_ALL LFS_TGT PATH
EOF
------------------------------------
set +h — отключает хеширование в bash. 
         Командная оболочка запоминает пути к исполняемым файлам, запущенным ранее, что безусловно ускоряет работу системы. 
         Однако мы будем вызывать разные версии одних и тех программ расположенных по разным путям, поэтому хеширование будет только вредить нам.

umask 022 — устанавливает права доступа к новым файлам и каталогам, задаваемые по умолчанию. 
            Значение 022 означает, что файлы будут создаваться с правами 644 (rw- r-- r--) а каталоги — с правами 755 (rwx r-x r-x). 
            Каждый взведенный бит umask означает сброс соответсвующего бита в атрибутах прав
LFS=/mnt/lfs — корень собираемой системы
LC_ALL=POSIX — определяет локализацию запускаемых программ. POSIX задает стандарт отображения независимый от способа кодировки символов.
LFS_TGT — задает описание целевой машины, используемое при построении временных иструментов сборки системы
PATH — пути поиска исполняемых файлов
export — присваивает указанным переменным заданные выше значения



3. Переключаемся на чистое окружение
exec env -i HOME=$HOME TERM=$TERM PS1='\u:W\$ ' /bin/bash 
создает «чистое» пользовательское окружение (ключ -i указывает игнорировать предыдущие настройки), присваивая значения переменным среды
HOME — домашний каталог, присваиваем текущее значение переменной, равное /home/lfs
TERM — используемый тип терминала, так же оставляем текущий
PS1 — формат приглашения командной строки. 
В данном случает задается формат вида имя пользователя: текущий рабочий каталог$, где спецсимвол \u — имя пользователя, \W — текущий рабочий каталог.
/bin/bash — команда, запускающая новый экземпляр командной оболочки

4. Обновим пользовательское окружение командой
source ~/.bash_profile

5. Убеждаемся, что необходимые переменные окружения установлены
set


4. Сборка временного набора инструментов (Temporary System)

!!! Начиная собирать систему, мы сталкиваемся с классической проблемой «курицы и яйца». 
!!! Для сборки системы нам необходимы компилятор, линковщик и библиотеки. 
!!! Но у нас нет ничего из перечисленного, только их исходники. У нас есть компилятор в хост-системе, и собирать необходимое ПО мы начнем именно им. 
!!! Однако если просто собрать тот же gcc с настройками по-умолчанию он не будет работать в LFS-системе 
!!! на начальном этапе её построения — он использует динамическую компоновку необходимых для работы библиотек.
!!! Весь необходимый для работы код надо будет скомпоновать статически, то есть явным образом включить в исполняемый файл.
!!! Таким образом первым делом мы выполним кросс-компиляцию некоторых частей будущей системы, чтобы иметь возможность воспользоваться ими при сборке окончательного её варианта.
Переходим в каталог $LFS/sources:
cd $LFS/sources


!!! Для всех собираемых пакетов порядок сборки содержит следующую последовательность действий (если не оговорено иного!):
!!! Распаковываем архив с пакетом
!!! tar -pxf 
!!! Переходим в распакованный каталог
!!! cd 
!!! Выполняем инструкции по сборке (у каждого пакета имеются ньюансы, подробно описанные в документации)
!!! Переходим на каталог выше, назад в $LFS/source, и удаляем все созданные при распаковке и сборке директории


!!! Время сборки пакетов различно — от практически мгновенной, до двух с половиной часов
!!! Так как быстродействие компьютеров различается, в качестве единицы измерения времени сборки выбрана относительная единица, именуемая Standard Build Unit (SBU)
!!! Один SBU равен времени сборки пакета binutils, который компилируется самым первым.

!!! Рекомендация: не собирайте систему в несколько потоков. 
!!! Если у вас многоядерный процессор, то ключик -j ускорит работу, но позже это может обернуться непрохождением некоторых важных тестов и нестабильной работой собранного ПО. 
!!! Сборка в один поток не так уж и продолжительна — гораздо большее время будет затрачено на разгребание нажитых многопоточной сборкой проблем.

5. Сборка Binutils — первый проход. Измерение SBU

!!! Binutils — пакет, содержащий вспомогательные утилиты для сборки ПО. В их число входят ассемблер (as) и компоновщик (ld). 
!!! Они необходимы glibc и gcc для прохождения некоторых тестов, поэтому данный пакет собирается в первую очередь.
0. распаковали и перешли в каталог
tar -pxf binutils-2.38.tar.xz
cd binutils-2.38

1. Для сборки этого пакета рекомендуется создать отдельный каталог, создаем его и переходим туда
mkdir -v ../binutils-build
cd ../binutils-build

2. Теперь надо выполнить конфигурирование пакета, чтобы сгенерировать правильный Makefile.
../binutils-2.38/configure --prefix=/tools --with-sysroot=$LFS --with-lib-path=/tools/lib --target=$LFS_TGT --disable-nls --disable-werror  

!!! --prefix=/tools — указывает на то, что собранные пакеты будут устанавливаться в директорию /tools, где будет размещаться временная система
!!! --with-sysroot=$LFS — корневой каталог системы, относительно которого будет производится поиск библиотек и прочих ресурсов, необходимых для работы программ во временной системе
!!! --with-lib-path=/tools/lib — путь поиска библиотек, указываемый для компоновщика ld
!!! --target=$LFS_TGT — задаем описание целевой машины
!!! --disable-nls — отключает интернационализацию собираемых пакетов. В данный момент она без надобности, а её наличие может вызвать ряд сбоев
!!! --disable-werror — отключает остановку компиляции при получении предупреждений от компилятора хост-системы

3. После того как отработает конфигуратор, на выходе мы получим Makefile, предназначенный для сборки и установки пакета. 
Собираем пакет и измеряем SBU:
time { make; }

4. Получили вывод:
real    2m17.202s
user    1m58.972s
sys     0m15.231s

5. Из этого следует:
Для моей системы — виртуальная машина на 2 - ядрах (Intel(R) Core(TM) i5-1035G1 CPU @ 1.00GHz), 2Gb RAM,
SBU составил 2m17.202s при сборке в один поток.

6. Зачем это SBU?
Например запустить финальную сборку gcc вместе с тестами и уйти делать другие дела, ибо занимает это 63 SBU(2+ часа реального  времени для машины в тесте) — нет смысла с надеждой пялится в экран.

7. После того как сборка окончена, создаем символические ссылки на каталоги библиотек. 
!!! Данная операция необходима, если ваша система 64-разрядная, так что нижеприведенная команда сначала проверяет разрядность системы, а уж потом при необходимости создает симлинки.
case $(uname -m) in
x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;;
esac

8. Устанавливаем собранное
make install

9. Выходим из каталога binutils-build и удаляем больше не нужные каталоги
cd ..
rm -r binutils-2.38
rm -r binutils-build

Примечание

!!! https://www.linuxfromscratch.org/lfs/view/stable/partintro/generalinstructions.html#buildinstr
В этой главе часто возникают недоразумения. 
Процедуры такие же, как и в любой другой главе, как объяснялось ранее ( Инструкции по сборке пакетов ). 
Сначала извлеките tar-архив gcc из исходного каталога, а затем перейдите в созданный каталог. 
Только после этого следует приступить к приведенным ниже инструкциям.

10. Сборка GCC - первый проход

!!! https://www.linuxfromscratch.org/lfs/view/stable/chapter05/gcc-pass1.html
!!! В процессе сборки системы компилятор придется собирать много раз.
!!! Первые два прохода необходимы для получения компилятора, способного работать независимо от хост-системы.
0. распакуем и перейдем в каталог  gcc
tar -xpf gcc-11.2.0.tar.xz 
cd gcc-11.2.0

1. Для успешной компиляции нам потребуются исходники ещё трех пакетов: GMP, MPFR и MPC. 
Распакуем их в каталог исходников компилятора и переименуем каталоги так, как на них ссылаются в исходниках gcc
tar -pxf ../gmp-6.2.1.tar.xz 
tar -xpf ../mpfr-4.1.0.tar.xz 
tar -xpf ../mpc-1.2.1.tar.gz 
mv -v gmp-6.2.1 gmp
mv -v mpfr-4.1.0 mpfr
mv -v mpc-1.2.1
mv -v mpc-1.2.1 mpc

2. На хостах x86_64 установите имя каталога по умолчанию для 64-битных библиотек на « lib » :
case $(uname -m) in
  x86_64)
    sed -e '/m64=/s/lib64/lib/' \
        -i.orig gcc/config/i386/t-linux64
 ;;
esac

3. Документация GCC рекомендует собирать GCC в выделенном каталоге сборки:
mkdir -v build
cd       build


4. Готовим gcc к компиляции
../configure                  \
    --target=$LFS_TGT         \
    --prefix=$LFS/tools       \
    --with-glibc-version=2.35 \
    --with-sysroot=$LFS       \
    --with-newlib             \
    --without-headers         \
    --enable-initfini-array   \
    --disable-nls             \
    --disable-shared          \
    --disable-multilib        \
    --disable-decimal-float   \
    --disable-threads         \
    --disable-libatomic       \
    --disable-libgomp         \
    --disable-libquadmath     \
    --disable-libssp          \
    --disable-libvtv          \
    --disable-libstdcxx       \
    --enable-languages=c,c++

Значение параметров настройки:
--with-glibc-version=2.35 - Эта опция указывает версию glibc, которая будет использоваться на цели. 
Это не относится к libc хост-дистрибутива, потому что все, скомпилированное с помощью pass1 gcc, будет работать в среде chroot, которая изолирована от libc хост-дистрибутива.

--with-newlib - Поскольку работающая библиотека C еще недоступна, это гарантирует, что константаinhibit_libc будет определена при сборке libgcc.
 Это предотвращает компиляцию любого кода, требующего поддержки libc.

--without-headers - При создании полного кросс-компилятора GCC требует стандартных заголовков, совместимых с целевой системой. 
Для наших целей эти заголовки не понадобятся. Этот переключатель предотвращает их поиск GCC.

--enable-initfini-array - Этот переключатель заставляет использовать некоторые внутренние структуры данных, которые необходимы, но не могут быть обнаружены при построении кросс-компилятора.

--disable-shared - Этот переключатель заставляет GCC статически связывать свои внутренние библиотеки. 
Нам это нужно, потому что общие библиотеки требуют glibc, который еще не установлен в целевой системе.

--disable-multilib - В x86_64 LFS не поддерживает конфигурацию с несколькими библиотеками. Этот переключатель безвреден для x86.

--disable-decimal-float, --disable-threads, --disable-libatomic, --disable-libgomp, --disable-libquadmath, --disable-libssp, --disable-libvtv, --disable-libstdcxx
Эти переключатели отключают поддержку расширения десятичных чисел с плавающей запятой, многопоточности, libatomic, libgomp, libquadmath, libssp, libvtv и стандартной библиотеки C++ соответственно. Эти функции не будут компилироваться при сборке кросс-компилятора и не нужны для задачи кросс-компиляции временной libc.

--enable-languages=c,c++ - Этот параметр обеспечивает сборку только компиляторов C и C++. Это единственные языки, которые нужны сейчас.


Скомпилируйте GCC, выполнив:
make

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

Эта сборка GCC установила пару внутренних системных заголовков. 
Обычно один из них, limits.h, в свою очередь, включает соответствующий системный limits.hзаголовок, в данном случае $LFS/usr/include/limits.h. 
Однако на момент создания этой сборки GCC $LFS/usr/include/limits.hне существует, поэтому только что установленный внутренний заголовок представляет собой частичный автономный файл
и не включает расширенные функции системного заголовка. 
Этого достаточно для сборки glibc, но полный внутренний заголовок понадобится позже. 
Создайте полную версию внутреннего заголовка с помощью команды, идентичной тому, что система сборки GCC делает в обычных обстоятельствах:
cd ..
cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
  `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/install-tools/include/limits.h



Now that our cross-toolchain is complete, finalize the installation of the limits.h header. For doing so, run a utility provided by the GCC developers:
$LFS/tools/libexec/gcc/$LFS_TGT/11.2.0/install-tools/mkheaders

После успешной сборки можно удалить
cd /mnt/lfs/sources
rm -rf gcc-11.2.0

11. Заголовки API Linux-5.16.9

0. Выполняем уже для нас стандартные действия (переходим каталог с исходниками, распаковываем нужный пакет, и переходим в папку)
cd /mnt/lfs/sources
tar -pxf linux-5.16.9.tar.xz 
cd linux-5.16.9

1. Убедитесь, что в пакете нет устаревших файлов:
make mrproper



2. Теперь извлеките видимые пользователю заголовки ядра из исходного кода. 
!!! Рекомендуемую цель make « headers_install » использовать нельзя, так как для этого требуется rsync , который может быть недоступен. 
!!! Заголовки сначала помещаются в ./usr, а затем копируются в нужное место.
!!! Команды выполняем последовательно
make headers
find usr/include -name '.*' -delete
rm usr/include/Makefile
cp -rv usr/include $LFS/usr

Установка Glibc-2.35

0. Переходим в каталог sources и выполняем стандартные действия
cd /mnt/lfs/sources
tar -pxf glibc-2.35.tar.xz 
cd glibc-2.35


1. С помощью крипта создайте символическую ссылку для соответствия LSB. 
Кроме того, для x86_64 создайте символическую ссылку совместимости, необходимую для правильной работы загрузчика динамической библиотеки:
!!! Приведенная выше команда верна. 
!!! У команды ln есть несколько синтаксических версий, поэтому обязательно проверьте информацию coreutils ln и ln(1)прежде чем сообщать о том, что вы можете принять за ошибку.
case $(uname -m) in
    i?86)   ln -sfv ld-linux.so.2 $LFS/lib/ld-lsb.so.3
    ;;
    x86_64) ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64
            ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64/ld-lsb-x86-64.so.3
    ;;
esac

2. Некоторые программы Glibc используют /var/dbкаталог, не совместимый с FHS, для хранения своих данных времени выполнения. 
Примените следующий патч, чтобы такие программы хранили свои данные времени выполнения в местах, совместимых с FHS:
patch -Np1 -i ../glibc-2.35-fhs-1.patch

3. Документация Glibc рекомендует собирать Glibc в выделенном каталоге сборки:
mkdir -v build
cd       build

4. Убедитесь, что утилиты ldconfig и sln установлены в /usr/sbin:
echo "rootsbindir=/usr/sbin" > configparms

5. Затем подготовьте Glibc к компиляции:
../configure                             \
      --prefix=/usr                      \
      --host=$LFS_TGT                    \
      --build=$(../scripts/config.guess) \
      --enable-kernel=3.2                \
      --with-headers=$LFS/usr/include    \
      libc_cv_slibdir=/usr/lib

Значение параметров настройки:
--host=$LFS_TGT, --build=$(../scripts/config.guess)
Комбинированный эффект этих переключателей заключается в том, что система сборки Glibc настраивается для кросс-компиляции с использованием кросс-линкера и кросс-компилятора в $LFS/tools.

--enable-kernel=3.2
Это говорит Glibc скомпилировать библиотеку с поддержкой ядра Linux 3.2 и более поздних версий. Обходные пути для старых ядер не включены.

--with-headers=$LFS/usr/include
Это говорит Glibc скомпилировать себя с использованием заголовков, недавно установленных в каталог $LFS/usr/include, чтобы он точно знал, 
какие функции имеет ядро, и мог соответствующим образом оптимизировать себя.

libc_cv_slibdir=/usr/lib
Это гарантирует, что библиотека будет установлена ​​в /usr/lib вместо стандартного /lib64 на 64-битных машинах.

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

7. Установите пакет:
!!! Если LFSон не установлен должным образом, и, несмотря на рекомендации, вы собираете как root, следующая команда установит только что собранный glibc в вашу хост-систему, 
!!! что, скорее всего, сделает его непригодным для использования. Поэтому дважды проверьте, правильно ли настроена среда, прежде чем запускать следующую команду.
make DESTDIR=$LFS install

8. Исправьте жестко заданный путь к исполняемому загрузчику в скрипте ldd :
sed '/RTLDLIST=/s@/usr@@g' -i $LFS/usr/bin/ldd

9. Осторожно. Важный момент. Нужно проверить работу сборщика.
a)На этом этапе необходимо остановиться и убедиться, что основные функции (компиляция и компоновка) новой цепочки инструментов работают должным образом. 
Чтобы выполнить проверку работоспособности, выполните следующие команды:
echo 'int main(){}' > dummy.c
$LFS_TGT-gcc dummy.c
readelf -l a.out | grep '/ld-linux'
б)Если все работает правильно, ошибок быть не должно, а вывод последней команды будет иметь вид:
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
с)Если все работает, очистите тестовые файлы:
rm -v dummy.c a.out

10. Теперь, когда наша кросс-инструментальная цепочка завершена, завершите установку заголовка limit.h. Для этого запустите утилиту, предоставленную разработчиками GCC:
$LFS/tools/libexec/gcc/$LFS_TGT/11.2.0/install-tools/mkheaders

12. Установка Libstdc++ from GCC-11.2.0, Pass 1

!!! Libstdc++ — это стандартная библиотека C++. Он нужен для компиляции кода C++ (часть GCC написана на C++), 
!!! но нам пришлось отложить его установку, когда мы собирали gcc-pass1, потому что он зависит от glibc, которого еще не было в целевом каталоге.
!!! Примечание
!!! Libstdc++ является частью исходников GCC.
!!! Сначала вы должны распаковать архив GCC и перейти в gcc-11.2.0 каталог.

0. Выполняем стандартное:
tar -pxf gcc-11.2.0.tar.xz 
cd gcc-11.2.0
mkdir -v build
cd build

1. Подготовьте libstdc++ к компиляции:
../libstdc++-v3/configure           \
    --host=$LFS_TGT                 \
    --build=$(../config.guess)      \
    --prefix=/usr                   \
    --disable-multilib              \
    --disable-nls                   \
    --disable-libstdcxx-pch         \
    --with-gxx-include-dir=/tools/$LFS_TGT/include/c++/11.2.0

Значение параметров настройки:
--host=...
Указывает, что вместо компилятора в /usr/bin.

--disable-libstdcxx-pch
Этот переключатель предотвращает установку предварительно скомпилированных включаемых файлов, которые на данном этапе не нужны.

--with-gxx-include-dir=/tools/$LFS_TGT/include/c++/11.2.0
Указывает каталог установки для включаемых файлов. 
Поскольку libstdc++ является стандартной библиотекой C++ для LFS, этот каталог должен соответствовать местоположению, 
в котором компилятор C++ ( $LFS_TGT-g++ ) будет искать стандартные включаемые файлы C++. 
В обычной сборке эта информация автоматически передается параметрам конфигурации libstdc++ из каталога верхнего уровня. 
В нашем случае эта информация должна быть указана явно. 
Компилятор C++ добавит путь sysroot $LFS(указанный сборкой GCC pass 1) к пути поиска включаемого файла, поэтому он фактически будет искать в $LFS/tools/$LFS_TGT/include/c++/11.2.0. 
Комбинация DESTDIRпеременной (в приведенной ниже команде make install ) и этого переключателя обеспечивает установку заголовков.

2. Скомпилируйте libstdc++, запустив:
make

3. Установите библиотеку:
make DESTDIR=$LFS install

13. Установка М4

0. Выполняем стандартные действия:
cd /mnt/lfs/sources/
tar -pxf m4-1.4.19.tar.xz 
cd m4-1.4.19

1. Подготовьте M4 к компиляции:
./configure --prefix=/usr   \
            --host=$LFS_TGT \
            --build=$(build-aux/config.guess)

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

3. Установите пакет:
make DESTDIR=$LFS install

14. Установка Ncurses-6.3

!!! https://www.linuxfromscratch.org/lfs/view/stable/chapter06/ncurses.html

0. Выполняем стандартные действия
cd /mnt/lfs/sources/
tar -pxf ncurses-6.3.tar.gz 
cd ncurses-6.3

1. Во- первых, убедитесь, что во время настройки сначала найден gawk(выполнение не должно вернуть ошибку):
sed -i s/mawk// configure

2. Затем выполните следующие команды, чтобы собрать программу « tic » на хосте сборки:
mkdir build
pushd build
  ../configure
  make -C include
  make -C progs tic
popd

3. Подготовьте Ncurses к компиляции:
./configure --prefix=/usr                \
            --host=$LFS_TGT              \
            --build=$(./config.guess)    \
            --mandir=/usr/share/man      \
            --with-manpage-format=normal \
            --with-shared                \
            --without-debug              \
            --without-ada                \
            --without-normal             \
            --disable-stripping          \
            --enable-widec

Значение новых опций конфигурации:
--with-manpage-format=normal
Это предотвращает установку Ncurses сжатых справочных страниц, что может произойти, если сам дистрибутив хоста имеет сжатые справочные страницы.

--without-ada
Это гарантирует, что Ncurses не создаст поддержку компилятора Ada, который может присутствовать на хосте, но будет недоступен, как только мы войдем в среду chroot .

--disable-stripping
Этот переключатель не позволяет системе здания удалять программы с помощью программы удаления с хоста. Использование инструментов хоста в кросс-компилируемой программе может привести к сбою.

--enable-widec
Этот переключатель вызывает создание библиотек расширенных символов (например, libncursesw.so.6.3) вместо обычных (например, libncurses.so.6.3). 
Эти широкосимвольные библиотеки можно использовать как в многобайтовых, так и в традиционных 8-битных локалях, 
в то время как обычные библиотеки правильно работают только в 8-битных локалях. 
Библиотеки расширенных символов и обычные библиотеки совместимы с исходным кодом, но не совместимы с двоичным кодом.

--without-normal
Этот переключатель отключает сборку и установку большинства статических библиотек.

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

5. Установите пакет:
make DESTDIR=$LFS TIC_PATH=$(pwd)/build/progs/tic install
echo "INPUT(-lncursesw)" > $LFS/usr/lib/libncurses.so

Значение параметров установки:
TIC_PATH=$(pwd)/build/progs/tic
Нам нужно передать путь только что построенного тика , способного работать на сборочной машине, чтобы база данных терминала могла быть создана без ошибок.
echo "ВВОД(-lncursesw)" > $LFS/usr/lib/libncurses.so
Библиотека libncurses.soнужна для нескольких пакетов, которые мы скоро создадим.

15. Установка Bash-5.1.16

0. Выполняем стандартные действия
cd /mnt/lfs/sources/
tar -pxf bash-5.1.16.tar.gz 
cd bash-5.1.16

1. Подготовьте Bash к компиляции:
./configure --prefix=/usr                   \
            --build=$(support/config.guess) \
            --host=$LFS_TGT                 \
            --without-bash-malloc

--without-bash-malloc
Этот параметр отключает использование функции распределения памяти ( malloc) Bash, которая, как известно, вызывает ошибки сегментации. 
Если отключить эту опцию, Bash будет использовать malloc более стабильные функции из Glibc.

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

3. Установите пакет:
make DESTDIR=$LFS install

4. Сделайте ссылку на программы, которые используют sh для оболочки:
mkdir $LFS/bin
ln -sv bash $LFS/bin/sh


16. Установка Coreutils-9.0

0. Выполняем стандартные действия
cd /mnt/lfs/sources/
tar -pxf coreutils-9.0.tar.xz 
cd coreutils-9.0

1. Готовим
./configure --prefix=/usr                     \
            --host=$LFS_TGT                   \
            --build=$(build-aux/config.guess) \
            --enable-install-program=hostname \
            --enable-no-install-program=kill,uptime
Значение параметров настройки:
--enable-install-program=hostname
Это позволяет создать и установить двоичный файл имени хоста — по умолчанию он отключен, но требуется для набора тестов Perl.


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

3. Установите пакет:
make DESTDIR=$LFS install

4. Переместите программы в их окончательные ожидаемые местоположения. 
Хотя в этой временной среде в этом нет необходимости, мы должны это сделать, потому что некоторые программы жестко кодируют исполняемые местоположения:
mv -v $LFS/usr/bin/chroot              $LFS/usr/sbin
mkdir -pv $LFS/usr/share/man/man8
mv -v $LFS/usr/share/man/man1/chroot.1 $LFS/usr/share/man/man8/chroot.8
sed -i 's/"1"/"8"/'                    $LFS/usr/share/man/man8/chroot.8

17. Установка Diffutils-3.8

0.  Выполняем стандартные действия
cd /mnt/lfs/sources/
tar  -pxf diffutils-3.8.tar.xz 
cd diffutils-3.8

1. Готовим Diffutils для компиляции:
./configure --prefix=/usr --host=$LFS_TGT

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

3. Установите пакет:
make DESTDIR=$LFS install

18. Установка File-5.41

0.  Выполняем стандартные действия
cd /mnt/lfs/sources/
tar -pxf file-5.41.tar.gz 
cd file-5.41

1. Приступаем к конфигурированию:
!!! Команда file на хосте сборки должна быть той же версии, что и та, которую мы собираем, чтобы создать файл подписи. 
!!! Запустите следующие команды, чтобы построить его:

mkdir build
pushd build
  ../configure --disable-bzlib      \
               --disable-libseccomp \
               --disable-xzlib      \
               --disable-zlib
  make
popd

Значение новой опции конфигурации:
--disable-*
Сценарий конфигурации пытается использовать некоторые пакеты из основного дистрибутива, если существуют соответствующие файлы библиотеки. 
Это может привести к сбою компиляции, если файл библиотеки существует, но отсутствуют соответствующие заголовочные файлы. 
Эти параметры предотвращают использование этих ненужных возможностей хоста.

2. Подготовьте файл для компиляции:
./configure --prefix=/usr --host=$LFS_TGT --build=$(./config.guess)

3. Скомпилируйте пакет:
make FILE_COMPILE=$(pwd)/build/src/file

4. Установите пакет:
make DESTDIR=$LFS install

19. Установка Findutils-4.9.0

!!! Пакет Findutils содержит программы для поиска файлов. Эти программы предназначены для рекурсивного поиска в дереве каталогов, а также для создания, 
!!! обслуживания и поиска в базе данных (часто быстрее, чем рекурсивный поиск, но ненадежно, если база данных недавно не обновлялась).


0.  Выполняем стандартные действия
cd /mnt/lfs/sources/
tar -pxf findutils-4.9.0.tar.xz 
cd findutils-4.9.0

1. Подготовьте Findutils к компиляции:
./configure --prefix=/usr                   \
            --localstatedir=/var/lib/locate \
            --host=$LFS_TGT                 \
            --build=$(build-aux/config.guess)

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

3. Установите пакет:
make DESTDIR=$LFS install

20. Установка Gawk-5.1.1

!!! Пакет Gawk содержит программы для работы с текстовыми файлами.
0.  Выполняем стандартные действия
cd /mnt/lfs/sources/
tar -pxf gawk-5.1.1.tar.xz 
cd gawk-5.1.1

1. Во-первых, убедитесь, что некоторые ненужные файлы не установлены:
sed -i 's/extras//' Makefile.in

2. Подготовьте Gawk к компиляции:
./configure --prefix=/usr   \
            --host=$LFS_TGT \
            --build=$(build-aux/config.guess)

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

4. Установите пакет:
make DESTDIR=$LFS install

21. Установка Grep-3.7

!!! Пакет Grep содержит программы для поиска по содержимому файлов. 

0.  Выполняем стандартные действия
cd /mnt/lfs/sources/
tar -pxf grep-3.7.tar.xz 
cd grep-3.7

1. Подготовьте Grep к компиляции:
./configure --prefix=/usr   \
            --host=$LFS_TGT

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

3. Установите пакет:
make DESTDIR=$LFS install

22. Установка Gzip-1.11

!!! Пакет Gzip содержит программы для сжатия и распаковки файлов.
0.  Выполняем стандартные действия
cd /mnt/lfs/sources/
tar -pxf gzip-1.11.tar.xz 
cd gzip-1.11

1. Подготовим Gzip к компиляции:
./configure --prefix=/usr --host=$LFS_TGT

2. Скомпилируем пакет:
make

3. Устанавливаем пакет:
make DESTDIR=$LFS install

23. Установка Make-4.3

!!! Пакет Make содержит программу для управления генерацией исполняемых файлов и других не исходных файлов пакета из исходных файлов. 
0.  Выполняем стандартные действия
cd /mnt/lfs/sources/
tar -pxf make-4.3.tar.gz 
cd make-4.3

1. Подготовим Make к компиляции:
./configure --prefix=/usr   \
            --without-guile \
            --host=$LFS_TGT \
            --build=$(build-aux/config.guess)
Значение новой опции конфигурации:
--without-guile
Несмотря на то, что мы выполняем кросс-компиляцию, configure пытается использовать хитрость с хоста сборки, если находит его. 
Это приводит к сбою компиляции, поэтому этот переключатель предотвращает его использование.

2. Скомпилируем пакет:
make

3. Установим пакет:
make DESTDIR=$LFS install

24. Установка Patch-2.7.6

!!! Пакет Patch содержит программу для изменения или создания файлов путем применения файла « заплаты » , обычно создаваемого программой diff .
0.  Выполняем стандартные действия
cd /mnt/lfs/sources/
tar -pxf patch-2.7.6.tar.xz 
cd patch-2.7.6

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

./configure --prefix=/usr   \
            --host=$LFS_TGT \
            --build=$(build-aux/config.guess)
2. Компилируем  пакет:
make

3. Устанавливаем пакет:
make DESTDIR=$LFS install

25. Установка Sed-4.8

!!! https://www.linuxfromscratch.org/lfs/view/stable/chapter06/sed.html

0.  Выполняем стандартные действия
cd /mnt/lfs/sources/
tar -pxf sed-4.8.tar.xz 
cd sed-4.8

1. Подготовьте Sed для компиляции:
./configure --prefix=/usr   \
            --host=$LFS_TGT

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

3. Установите пакет:
make DESTDIR=$LFS install

26. Установка Tar-1.34

!!! Пакет Tar предоставляет возможность создавать tar-архивы, а также выполнять различные другие операции с архивами. 
!!! Tar можно использовать в ранее созданных архивах для извлечения файлов, для хранения дополнительных файлов или для обновления или списка файлов, которые уже были сохранены.

0.  Выполняем стандартные действия
cd /mnt/lfs/sources/
tar -pxf tar-1.34.tar.xz 
cd tar-1.34

1. Подготовьте Tar для компиляции:
./configure --prefix=/usr                     \
            --host=$LFS_TGT                   \
            --build=$(build-aux/config.guess)

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

3. Установите пакет:
make DESTDIR=$LFS install

27. Установка Xz-5.2.5

!!! Пакет Xz содержит программы для сжатия и распаковки файлов. Он предоставляет возможности для lzma и более новых форматов сжатия xz. 
!!! Сжатие текстовых файлов с помощью xz дает лучший процент сжатия, чем с традиционными командами gzip или bzip2 .
0.  Выполняем стандартные действия
cd /mnt/lfs/sources/
tar -pxf xz-5.2.5.tar.xz 
cd xz-5.2.5


1. Подготовьте Xz к компиляции:
./configure --prefix=/usr                     \
            --host=$LFS_TGT                   \
            --build=$(build-aux/config.guess) \
            --disable-static                  \
            --docdir=/usr/share/doc/xz-5.2.5

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

3. Установите пакет:
make DESTDIR=$LFS install

28. Установка Binutils-2.38 - Прохождение 2

!!! Пакет Binutils содержит компоновщик, ассемблер и другие инструменты для работы с объектными файлами.

0.  Выполняем стандартные действия
cd /mnt/lfs/sources/
tar -pxf binutils-2.38.tar.xz 
cd binutils-2.38

1.  Binutils поставляет устаревшую копию libtool в архиве. В нем отсутствует поддержка sysroot, 
поэтому созданные двоичные файлы будут ошибочно связаны с библиотеками из основного дистрибутива. 
Решение этой проблемы:
sed '6009s/$add_dir//' -i ltmain.sh

2. Снова создайте отдельный каталог сборки:
mkdir -v build
cd       build


3. Подготовьте Binutils к компиляции:
../configure                   \
    --prefix=/usr              \
    --build=$(../config.guess) \
    --host=$LFS_TGT            \
    --disable-nls              \
    --enable-shared            \
    --disable-werror           \
    --enable-64-bit-bfd

Значение новых опций конфигурации:
--enable-shared
Создается libbfdкак общая библиотека.
--enable-64-bit-bfd
Включает 64-битную поддержку (на хостах с более узкими размерами слов). Может и не понадобится на 64-битных системах, но не навредит.



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

5. Установите пакет:
make DESTDIR=$LFS install

29. Установка GCC-11.2.0 - Pass 2

!!! Пакет GCC содержит коллекцию компиляторов GNU, в которую входят компиляторы C и C++.
0.  Выполняем стандартные действия
cd /mnt/lfs/sources/
tar -pxf gcc-11.2.0.tar.xz 
cd gcc-11.2.0

1. Как и в первой сборке GCC, требуются пакеты GMP, MPFR и MPC. 
Распакуйте архивы и переместите их в каталоги с нужными именами:
tar -xf ../mpfr-4.1.0.tar.xz
mv -v mpfr-4.1.0 mpfr
tar -xf ../gmp-6.2.1.tar.xz
mv -v gmp-6.2.1 gmp
tar -xf ../mpc-1.2.1.tar.gz
mv -v mpc-1.2.1 mpc

2. При сборке на x86_64 измените имя каталога по умолчанию для 64-битных библиотек на « lib » :
case $(uname -m) in
  x86_64)
    sed -e '/m64=/s/lib64/lib/' -i.orig gcc/config/i386/t-linux64
  ;;
esac

3. Снова создайте отдельный каталог сборки:
mkdir -v build
cd       build

4. Создайте символическую ссылку, позволяющую собирать libgcc с поддержкой потоков posix:
mkdir -pv $LFS_TGT/libgcc
ln -s ../../../libgcc/gthr-posix.h $LFS_TGT/libgcc/gthr-default.h


5. Теперь подготовьте GCC к компиляции:
../configure                                       \
    --build=$(../config.guess)                     \
    --host=$LFS_TGT                                \
    --prefix=/usr                                  \
    CC_FOR_TARGET=$LFS_TGT-gcc                     \
    --with-build-sysroot=$LFS                      \
    --enable-initfini-array                        \
    --disable-nls                                  \
    --disable-multilib                             \
    --disable-decimal-float                        \
    --disable-libatomic                            \
    --disable-libgomp                              \
    --disable-libquadmath                          \
    --disable-libssp                               \
    --disable-libvtv                               \
    --disable-libstdcxx                            \
    --enable-languages=c,c++

Значение новых опций конфигурации:
-with-build-sysroot=$LFS
Обычно использование --hostгарантирует, что для сборки GCC используется кросс-компилятор, и этот компилятор знает, что он должен искать заголовки и библиотеки в файлах $LFS. 
Но система сборки GCC использует другие инструменты, которые не знают об этом местоположении. 
Этот переключатель нужен для того, чтобы они находили нужные файлы в $LFS, а не на хосте.

--enable-initfini-array
Этот параметр автоматически включается при сборке собственного компилятора с помощью собственного компилятора на платформе x86. 
Но здесь мы собираем с помощью кросс-компилятора, поэтому нам нужно явно установить эту опцию.

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

7. Установите пакет:
make DESTDIR=$LFS install

8. В качестве последнего штриха создайте символическую ссылку на утилиту. 
Многие программы и сценарии запускают cc вместо gcc , который используется для того, чтобы программы оставались универсальными и, 
следовательно, могли использоваться во всех типах систем UNIX, где компилятор GNU C не всегда установлен. 
Запуск cc оставляет системному администратору свободу решать, какой компилятор C установить:
ln -sv gcc $LFS/usr/bin/cc

30. Смена владельца на каталоги

!!! https://www.linuxfromscratch.org/lfs/view/stable/chapter07/changingowner.html 

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


31. Подготовка к chroot

!!!На некоторые действия потребуется права root
!!! https://www.linuxfromscratch.org/lfs/view/stable/chapter07/kernfs.html

0. Экспортируем переменную:
export LFS=/mnt/lfs 

1. Создаем  каталоги в которые будут смонтированы файловые системы:
mkdir -pv $LFS/{dev,proc,sys,run}

2. Создание начальных узлов устройств
!!! Когда ядро ​​загружает систему, ему требуется наличие нескольких узлов устройств, в частности устройств consoleи null. 
!!! Узлы устройств должны быть созданы на жестком диске, чтобы они были доступны до того, как заполнится ядро /dev), и, кроме того, когда Linux запускается с init=/bin/bash. 
mknod -m 600 $LFS/dev/console c 5 1
mknod -m 666 $LFS/dev/null c 1 3

3.  Установка и заполнение /dev
!!! Рекомендуемый метод заполнения /dev каталога устройствами — смонтировать виртуальную файловую систему (такую ​​как tmpfs)
!!! в /dev каталоге и разрешить динамическое создание устройств в этой виртуальной файловой системе по мере их обнаружения или доступа к ним. 
!!! Создание устройства обычно выполняется Udev в процессе загрузки. 
!!! Поскольку эта новая система еще не имеет Udev и еще не загружена, ее необходимо смонтировать и заполнить /dev вручную. 
!!! Это достигается путем привязки монтирования хост-системы./devкаталог. 
!!! Связное монтирование — это особый тип монтирования, который позволяет создать зеркало каталога или точки монтирования в другом месте.
mount -v --bind /dev $LFS/dev

4. Монтирование файловых систем виртуального ядра
mount -v --bind /dev/pts $LFS/dev/pts
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
mount -vt tmpfs tmpfs $LFS/run

!!! В некоторых хост-системах /dev/shm это символическая ссылка на /run/shm.
!!! /run tmpfs был смонтирован выше, поэтому в этом случае нужно создать только каталог.

if [ -h $LFS/dev/shm ]; then
  mkdir -pv $LFS/$(readlink $LFS/dev/shm)
fi

32. chroot




!!! Теперь, когда все пакеты, необходимые для сборки остальных необходимых инструментов, находятся в системе, пришло время войти в среду chroot, 
!!! чтобы завершить установку оставшихся временных инструментов. 
!!! Эта среда будет использоваться также для установки конечной системы. 
!!! От имени пользователя root выполните следующую команду, чтобы войти в среду:

su - root
export LFS=/mnt/lfs
chown -R root:root $LFS/tools

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


!!! Опции:
!!! -i, заданная команде env , очистит все переменные среды chroot. После этого снова задаются только переменные HOME, TERM, PS1 и .PATH
!!! Конструкция TERM=$TERM установит для TERM переменной внутри chroot то же значение, что и вне chroot. 
!!! Эта переменная необходима для правильной работы таких программ, как vim и меньше. 
!!! Если желательны другие переменные, такие как CFLAGS или CXXFLAGS, это хорошее место, чтобы установить их снова.
!!! С этого момента больше нет необходимости использовать эту LFS переменную, поскольку вся работа будет ограничена файловой системой LFS. 
!!! Это связано с тем, что оболочке Bash сообщается, что $LFS теперь это корневой ( /) каталог.
!!! Обратите внимание, что /tools/binэто не в PATH. Это означает, что кросс-тулчейн больше не будет использоваться в среде chroot.
!!! Обратите внимание, что в командной строке bash "I have no name!" будет указано, Это нормально, поскольку /etc/passwd файл еще не создан.

34. Создание каталогов для LFS

!!! после удачного приглашения в систему
!!! Пришло время создать полную структуру в файловой системе 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, но не может удалять из них файлы другого пользователя. 
!!! Последнее запрещено так называемым « липким битом » , старшим битом (1) в битовой маске 1777.
!!! Подробнее про структуру каталогов https://refspecs.linuxfoundation.org/fhs.shtml

35. Создание основных файлов и символических ссылок:

0. Исторически сложилось так, что Linux поддерживает список смонтированных файловых систем в файле /etc/mtab. 
Современные ядра поддерживают этот список внутри себя и предоставляют его пользователю через /proc файловую систему. 
Чтобы удовлетворить утилиты, которые ожидают наличия /etc/mtab, создайте следующую символическую ссылку:
ln -sv /proc/self/mounts /etc/mtab

1. Создайте базовый /etc/host sфайл, на который будут ссылаться некоторые наборы тестов, а также один из файлов конфигурации Perl:
cat > /etc/hosts << EOF
127.0.0.1  localhost $(hostname)
::1        localhost
EOF

2. Чтобы пользователь rootмог войти в систему и чтобы имя « root » было распознано, в файлах /etc/passwdи должны быть соответствующие записи./etc/group
!!! Фактический пароль для root будет установлен позже.

2.1 Создайте /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:99:99:Unprivileged User:/dev/null:/usr/bin/false
EOF

2.2 Создайте /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:
usb:x:14:
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:
nogroup:x:99:
users:x:999:
EOF

3. Для некоторых тестов нам потребуется обычный пользователь, добавляем этого пользователяы.
echo "tester:x:101:101::/home/tester:/bin/bash" >> /etc/passwd
echo "tester:x:101:" >> /etc/group
install -o tester -d /home/tester

4. Чтобы удалить « У меня нет имени! » , запустите новую оболочку. 
Поскольку файлы /etc/passwdи /etc/groupбыли созданы, разрешение имен пользователей и групп теперь будет работать:
exec /usr/bin/bash --login

5. Программы 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 записывает неудачные попытки входа в систему.
!!! В файле /run/utmp  записываются пользователи, которые в данный момент вошли в систему. 
!!! Этот файл создается динамически в сценариях загрузки.

36. LibstdС++ из GCC-11.2.0, проход 2

!!! Libstdc++ является частью исходников GCC. Сначала вы должны распаковать архив GCC и перейти в gcc-11.2.0 каталог.

0. Создайте ссылку, которая существует при сборке libstdc++ в дереве gcc:
ln -s gthr-posix.h libgcc/gthr-default.h

1. Создайте отдельный каталог сборки для libstdc++ и введите его:
mkdir -v build
cd       build

2. Подготовьте libstdc++ к компиляции:
../libstdc++-v3/configure            \
    CXXFLAGS="-g -O2 -D_GNU_SOURCE"  \
    --prefix=/usr                    \
    --disable-multilib               \
    --disable-nls                    \
    --host=$(uname -m)-lfs-linux-gnu \
    --disable-libstdcxx-pch

Значение параметров настройки:
CXXFLAGS="-g -O2 -D_GNU_SOURCE"

Эти флаги передаются Makefile верхнего уровня при полной сборке GCC.
--host=$(uname -m)-lfs-linux-gnu

Мы должны имитировать то, что произошло бы, если бы этот пакет был собран как часть полной сборки компилятора. 
Этот переключатель будет передан для настройки механизмом сборки GCC.
--disable-libstdcxx-pch

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

3. Скомпилируйте libstdc++, запустив:
make

4. Установите библиотеку:
make install



37. Установка Gettext-0.21

!!! Пакет Gettext содержит утилиты для интернационализации и локализации. 
!!! Это позволяет компилировать программы с помощью NLS (поддержка родного языка), что позволяет им выводить сообщения на родном языке пользователя.
0. Подготовьте Gettext для компиляции:
./configure --disable-shared

Значение опции конфигурации:
--disable-shared
В настоящее время нам не нужно устанавливать какую-либо из общих библиотек Gettext, поэтому нет необходимости их создавать.

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

2. Установим программы msgfmt, msgmerge и xgettext:
cp -v gettext-tools/src/{msgfmt,msgmerge,xgettext} /usr/bin

38. Установка Bison-3.8.2

!!! Пакет Bison содержит генератор парсеров.

0. Подготовьте Bison для компиляции:
./configure --prefix=/usr \
            --docdir=/usr/share/doc/bison-3.8.2

Значение новой опции конфигурации:
--docdir=/usr/share/doc/bison-3.8.2
Это говорит системе сборки установить документацию bison в версионный каталог.

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

2. Установите пакет:
make install

39. Установка Perl-5.34.0

!!! https://www.linuxfromscratch.org/lfs/downloads/stable-systemd/LFS-BOOK-11.1-NOCHUNKS.html#ch-tools-binutils-pass1
0. Подготовьте Perl к компиляции:
sh Configure -des                                        \
             -Dprefix=/usr                               \
             -Dvendorprefix=/usr                         \
             -Dprivlib=/usr/lib/perl5/5.34/core_perl     \
             -Darchlib=/usr/lib/perl5/5.34/core_perl     \
             -Dsitelib=/usr/lib/perl5/5.34/site_perl     \
             -Dsitearch=/usr/lib/perl5/5.34/site_perl    \
             -Dvendorlib=/usr/lib/perl5/5.34/vendor_perl \
             -Dvendorarch=/usr/lib/perl5/5.34/vendor_perl

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

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


2. Установите пакет:
make install

40. Установка Python-3.10.2

!!! Пакет Python 3 содержит среду разработки Python. 
!!! Он полезен для объектно-ориентированного программирования, написания сценариев, прототипирования больших программ или разработки целых приложений.
!!! Есть два файла пакета, имя которых начинается с « python » . Тот, из которого нужно извлечь Python-3.10.2.tar.xz (обратите внимание на первую букву в верхнем регистре).

0. Подготовьте Python к компиляции:
./configure --prefix=/usr   \
            --enable-shared \
            --without-ensurepip

Значение опции конфигурации:
--enable-shared
Этот переключатель предотвращает установку статических библиотек.
--without-ensurepip
Этот переключатель отключает установщик пакета Python, который на данном этапе не нужен.

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

!!! Некоторые модули Python 3 сейчас не могут быть собраны, потому что зависимости еще не установлены. 
!!! Однако система сборки по-прежнему пытается их собрать, поэтому компиляция некоторых файлов завершится ошибкой, и может показаться, что сообщение компилятора указывает на «фатальную ошибку». 
!!! Сообщение следует игнорировать. 
!!! Просто убедитесь, что команда make верхнего уровня не завершилась ошибкой.

2. Установите пакет:
make install

41. Установка Texinfo-6.8

0. Во-первых, устраните проблему со сборкой пакета с помощью Glibc-2.34 или более поздней версии:
sed -e 's/__attribute_nonnull__/__nonnull/' \
    -i gnulib/lib/malloc/dynarray-skeleton.c

1. Подготовьте Texinfo к компиляции:
./configure --prefix=/usr

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

3. Установите пакет:
make install

42. Установка Util-linux-2.37.4:

!!! Пакет Util-linux содержит различные утилиты.
0. FHS рекомендует использовать /var/lib/hwclock каталог вместо обычного /etc каталога в качестве места для adjti meфайла. 
Создайте этот каталог с помощью:
mkdir -pv /var/lib/hwclock

Подготовьте Util-linux к компиляции:
./configure ADJTIME_PATH=/var/lib/hwclock/adjtime    \
            --libdir=/usr/lib    \
            --docdir=/usr/share/doc/util-linux-2.37.4 \
            --disable-chfn-chsh  \
            --disable-login      \
            --disable-nologin    \
            --disable-su         \
            --disable-setpriv    \
            --disable-runuser    \
            --disable-pylibmount \
            --disable-static     \
            --without-python     \
            runstatedir=/run


Значение параметров настройки:
ADJTIME_PATH=/var/lib/hwclock/adjtime
Это устанавливает расположение файла записи информации об аппаратных часах в соответствии с FHS. 
Это не обязательно для этого временного инструмента, но предотвращает создание файла в другом месте, который не будет перезаписан или удален при сборке окончательного пакета util-linux.
--libdir=/usr/lib
Этот переключатель гарантирует, что .soсимволические ссылки будут напрямую указывать на файл общей библиотеки в том же каталоге ( /usr/lib).
--disable-*
Эти переключатели предотвращают появление предупреждений о сборке компонентов, для которых требуются пакеты, отсутствующие в LFS или еще не установленные.
--without-python
Этот переключатель отключает использование Python . Это позволяет избежать попыток создания ненужных привязок.
runstatedir=/run
Этот переключатель правильно устанавливает местоположение сокета, используемого uuiddlibuuid.

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

2. Установите пакет:
make install


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

0. Во-первых, удалите текущую установленную документацию, чтобы предотвратить их попадание в окончательную систему и сэкономить около 35 МБ:
rm -rf /usr/share/{info,man,doc}/*

1. Во-вторых, файлы libtool .la полезны только при компоновке статических библиотек. 
Они не нужны и потенциально опасны при использовании динамических разделяемых библиотек, особенно при использовании систем сборки, отличных от autotools. 
Пока еще в chroot, удалите эти файлы сейчас:
find /usr/{lib,libexec} -name \*.la -delete

2. Текущий размер системы составляет около 3 ГБ, однако каталог /tools больше не нужен. 
Он использует около 1 ГБ дискового пространства. 
Удалите его сейчас:
rm -rf /tools

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

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

0. Мы решили сделать резервную копию, покинем среду chroot:
exit

1. Перед созданием резервной копии размонтируйте виртуальные файловые системы:
umount $LFS/dev/pts
umount $LFS/{sys,proc,run,dev}

2. Убедитесь, что у вас есть как минимум 1 ГБ свободного места на диске (исходные tar-архивы будут включены в архив резервной копии) в файловой системе, 
содержащей каталог, в котором вы создаете архив резервной копии.
df -h 

3. Выполняем резервирование:
export LFS=/mnt/lfs
cd $LFS
tar -cJpf $HOME/lfs-temp-tools-11.1-systemd.tar.xz .

4. В каталоге /root должен появится архив

43. Пример восстановления из резервной копии:

!!! Предупреждение
!!! Следующие команды чрезвычайно опасны. 
!!! Если вы запустите rm -rf ./* от имени пользователя root и не перейдете в каталог $LFS или LFS не установите переменную среды для пользователя root, это разрушит всю вашу хост-систему. 
!!! ВЫ ПРЕДУПРЕЖДЕНЫ.
cd $LFS
rm -rf ./*
tar -xpf $HOME/lfs-temp-tools-11.1-systemd.tar.xz


44. Для продолжения работы с LFS нам снова требуется выполнить chroot:

!!! это шаги 31 и 32
0.  Установка и заполнение /dev
!!! Рекомендуемый метод заполнения /dev каталога устройствами — смонтировать виртуальную файловую систему (такую ​​как tmpfs)
!!! в /dev каталоге и разрешить динамическое создание устройств в этой виртуальной файловой системе по мере их обнаружения или доступа к ним. 
!!! Создание устройства обычно выполняется Udev в процессе загрузки. 
!!! Поскольку эта новая система еще не имеет Udev и еще не загружена, ее необходимо смонтировать и заполнить /dev вручную. 
!!! Это достигается путем привязки монтирования хост-системы./devкаталог. 
!!! Связное монтирование — это особый тип монтирования, который позволяет создать зеркало каталога или точки монтирования в другом месте.
mount -v --bind /dev $LFS/dev
 
1. Монтирование файловых систем виртуального ядра
mount -v --bind /dev/pts $LFS/dev/pts
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
mount -vt tmpfs tmpfs $LFS/run
 
!!! В некоторых хост-системах /dev/shm это символическая ссылка на /run/shm.
!!! /run tmpfs был смонтирован выше, поэтому в этом случае нужно создать только каталог.
 
if [ -h $LFS/dev/shm ]; then
  mkdir -pv $LFS/$(readlink $LFS/dev/shm)
fi


2. Выполняем chroot
chroot "$LFS" /usr/bin/env -i   \
    HOME=/root                  \
    TERM="$TERM"                \
    PS1='(lfs chroot) \u:\w\$ ' \
    PATH=/usr/bin:/usr/sbin     \
    /bin/bash --login
 

45. Установим Man-pages-5.13:

!!! Пакет Man-pages содержит более 2200 справочных страниц.
make prefix=/usr install

46. Установка Iana-etc-20220207:

!!! Пакет Iana-Etc предоставляет данные для сетевых служб и протоколов.
cp services protocols /etc

Краткие описания:
/etc/protocols
Описывает различные интернет-протоколы DARPA, доступные из подсистемы TCP/IP.
/etc/services
Обеспечивает сопоставление между понятными текстовыми именами для интернет-сервисов и их базовыми назначенными номерами портов и типами протоколов.

47. Установка Glibc-2.35

!!! Некоторые программы Glibc используют /var/dbкаталог, не совместимый с FHS, для хранения своих данных времени выполнения. 
0. Примените следующий патч, чтобы такие программы хранили свои данные времени выполнения в местах, совместимых с FHS:
patch -Np1 -i ../glibc-2.35-fhs-1.patch

1. Документация Glibc рекомендует собирать Glibc в выделенном каталоге сборки:
mkdir -v build
cd       build

2. Убедитесь, что утилиты ldconfig и sln будут установлены в /usr/sbin:
echo "rootsbindir=/usr/sbin" > configparms

3. Подготовьте Glibc к компиляции:
../configure --prefix=/usr                            \
             --disable-werror                         \
             --enable-kernel=3.2                      \
             --enable-stack-protector=strong          \
             --with-headers=/usr/include              \
             libc_cv_slibdir=/usr/lib

Значение параметров настройки:
--disable-werror
Этот параметр отключает параметр -Werror, передаваемый в GCC. Это необходимо для запуска набора тестов.
--enable-kernel=3.2
Эта опция сообщает системе сборки, что этот glibc может использоваться с ядрами версии 3.2. Это означает создание обходных путей на случай, если системный вызов, представленный в более поздней версии, нельзя будет использовать.
--enable-stack-protector=strong
Этот параметр повышает безопасность системы за счет добавления дополнительного кода для проверки переполнения буфера, например атак, разрушающих стек.
--with-headers=/usr/include
Эта опция сообщает системе сборки, где найти заголовки API ядра.
libc_cv_slibdir=/usr/lib
Эта переменная устанавливает правильную библиотеку для всех систем. Мы не хотим, чтобы использовалась lib64.

4. Скомпилируйте пакет:
!!! Важный
!!! В этом разделе набор тестов для Glibc считается критически важным. Ни в коем случае не пропускайте его.
make

5. Вообще несколько тестов не проходят. Ошибки тестирования, перечисленные ниже, обычно можно безопасно игнорировать.
make check

Вы можете увидеть некоторые неудачные тесты. Набор тестов Glibc в некоторой степени зависит от хост-системы. 
Несколько отказов из более чем 4200 тестов вообще можно игнорировать. 
Это список наиболее распространенных проблем последних версий LFS:
Известно, что io/tst-lchmod не работает в среде chroot LFS.
Известно, что misc/tst-ttyname не работает в среде chroot LFS.
Известно , что тест nss/tst-nss-files-hosts-multi завершается неудачно, если в системе нет IP-адресов без замыкания на себя.

6. Хотя это безобидное сообщение, на этапе установки Glibc будет жаловаться на отсутствие /etc/ld.so.conf. 
Предотвратите это предупреждение с помощью:
touch /etc/ld.so.conf

7. Исправьте Makefile, чтобы пропустить ненужную проверку работоспособности, которая не работает в частичной среде LFS:
sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile

8. Установите пакет:
make install

9. Исправьте жестко заданный путь к исполняемому загрузчику в скрипте ldd:
sed '/RTLDLIST=/s@/usr@@g' -i /usr/bin/ldd

10. Установите файл конфигурации и каталог времени выполнения для nscd:
cp -v ../nscd/nscd.conf /etc/nscd.conf
mkdir -pv /var/cache/nscd

11. Установите файлы поддержки systemd для nscd:
install -v -Dm644 ../nscd/nscd.tmpfiles /usr/lib/tmpfiles.d/nscd.conf
install -v -Dm644 ../nscd/nscd.service /usr/lib/systemd/system/nscd.service

12. Затем установите локали, которые могут заставить систему отвечать на другом языке. 
mkdir -pv /usr/lib/locale
localedef -i POSIX -f UTF-8 C.UTF-8 2> /dev/null || true
localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8
localedef -i de_DE -f ISO-8859-1 de_DE
localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro
localedef -i de_DE -f UTF-8 de_DE.UTF-8
localedef -i el_GR -f ISO-8859-7 el_GR
localedef -i en_GB -f ISO-8859-1 en_GB
localedef -i en_GB -f UTF-8 en_GB.UTF-8
localedef -i en_HK -f ISO-8859-1 en_HK
localedef -i en_PH -f ISO-8859-1 en_PH
localedef -i en_US -f ISO-8859-1 en_US
localedef -i en_US -f UTF-8 en_US.UTF-8
localedef -i es_ES -f ISO-8859-15 es_ES@euro
localedef -i es_MX -f ISO-8859-1 es_MX
localedef -i fa_IR -f UTF-8 fa_IR
localedef -i fr_FR -f ISO-8859-1 fr_FR
localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro
localedef -i fr_FR -f UTF-8 fr_FR.UTF-8
localedef -i is_IS -f ISO-8859-1 is_IS
localedef -i is_IS -f UTF-8 is_IS.UTF-8
localedef -i it_IT -f ISO-8859-1 it_IT
localedef -i it_IT -f ISO-8859-15 it_IT@euro
localedef -i it_IT -f UTF-8 it_IT.UTF-8
localedef -i ja_JP -f EUC-JP ja_JP
localedef -i ja_JP -f SHIFT_JIS ja_JP.SJIS 2> /dev/null || true
localedef -i ja_JP -f UTF-8 ja_JP.UTF-8
localedef -i nl_NL@euro -f ISO-8859-15 nl_NL@euro
localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R
localedef -i ru_RU -f UTF-8 ru_RU.UTF-8
localedef -i se_NO -f UTF-8 se_NO.UTF-8
localedef -i ta_IN -f UTF-8 ta_IN.UTF-8
localedef -i tr_TR -f UTF-8 tr_TR.UTF-8
localedef -i zh_CN -f GB18030 zh_CN.GB18030
localedef -i zh_HK -f BIG5-HKSCS zh_HK.BIG5-HKSCS
localedef -i zh_TW -f UTF-8 zh_TW.UTF-8

13. В качестве альтернативы можно установить glibc-2.35/localedata/SUPPORTEDсразу все локали, 
перечисленные в файле (включая все перечисленные выше локали и многие другие), с помощью следующей трудоемкой команды:
make localedata/install-locales

14. Затем используйте команду localedef для создания и установки локалей, не перечисленных в glibc-2.35/localedata/SUPPORTEDфайле, когда они вам понадобятся. 
Например, для некоторых тестов далее в этой главе потребуются следующие две локали:
localedef -i POSIX -f UTF-8 C.UTF-8 2> /dev/null || true
localedef -i ja_JP -f SHIFT_JIS ja_JP.SJIS 2> /dev/null || true

48. Configuring Glibc adding nsswitch.conf:

cat > /etc/nsswitch.conf << "EOF"
# Begin /etc/nsswitch.conf

passwd: files
group: files
shadow: files

hosts: files dns
networks: files

protocols: files
services: files
ethers: files
rpc: files

# End /etc/nsswitch.conf
EOF

49. Configuring Glibc adding time zone data:

0. Установите и настройте данные часового пояса со следующим:
tar -xf ../../tzdata2021e.tar.gz

ZONEINFO=/usr/share/zoneinfo
mkdir -pv $ZONEINFO/{posix,right}

for tz in etcetera southamerica northamerica europe africa antarctica  \
          asia australasia backward; do
    zic -L /dev/null   -d $ZONEINFO       ${tz}
    zic -L /dev/null   -d $ZONEINFO/posix ${tz}
    zic -L leapseconds -d $ZONEINFO/right ${tz}
done

cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO
zic -d $ZONEINFO -p America/New_York
unset ZONEINFO

Значение команд zic:
zic -L /dev/null ...
Это создает часовые пояса posix без дополнительных секунд. 
Обычно их помещают в оба zoneinfoи zoneinfo/posix. Необходимо поставить часовые пояса POSIX в zoneinfo, иначе различные тестовые наборы будут сообщать об ошибках. 
Во встроенной системе, где места мало и вы не собираетесь когда-либо обновлять часовые пояса, вы можете сэкономить 1,9 МБ, не используя posix каталог, 
но некоторые приложения или наборы тестов могут привести к некоторым сбоям.
zic -L leapseconds ...
Это создает правильные часовые пояса, включая дополнительные секунды. 
Во встроенной системе, где места мало и вы не собираетесь когда-либо обновлять часовые пояса или заботиться о правильном времени, вы можете сэкономить 1,9 МБ, исключив right каталог.
zic ... -p ...
Это создает posixrulesфайл. 
Мы используем Нью-Йорк, потому что POSIX требует, чтобы правила перехода на летнее время соответствовали правилам США.

1. Один из способов определить местный часовой пояс — запустить следующий скрипт:
tzselect

2. Затем создайте /etc/localtimeфайл, запустив:
ln -sfv /usr/share/zoneinfo/ /etc/localtime

50. Настройка динамического загрузчика

!!! По умолчанию динамический загрузчик ( ) выполняет /lib/ld-linux.so.2 поиск динамических библиотек, которые необходимы программам по мере их запуска. 
!!! Однако, если есть библиотеки в каталогах, отличных от и , их необходимо добавить в файл, чтобы динамический загрузчик мог их найти. 
!!! Два каталога, которые, как известно, содержат дополнительные библиотеки, это и , поэтому добавьте эти каталоги в путь поиска динамического загрузчика.
!!! /lib/usr/lib/lib/usr/lib/etc/ld.so.conf/usr/local/lib/opt/lib

0. Создайте новый файл /etc/ld.so.conf, выполнив следующее:
cat > /etc/ld.so.conf << "EOF"
# Begin /etc/ld.so.conf
/usr/local/lib
/opt/lib

EOF

1. При желании динамический загрузчик также может искать каталог и включать содержимое найденных там файлов. 
Обычно файлы в этом каталоге include представляют собой одну строку, указывающую путь к нужной библиотеке. Чтобы добавить эту возможность, выполните следующие команды:
cat >> /etc/ld.so.conf << "EOF"
# Add an include directory
include /etc/ld.so.conf.d/*.conf

EOF
mkdir -pv /etc/ld.so.conf.d

Промежуточный этап про сеть

wget http://roy.marples.name/downloads/dhcpcd/dhcpcd-9.4.1.tar.xz --directory-prefix=$LFS/sources
wget https://www.linuxfromscratch.org/blfs/downloads/11.1/blfs-bootscripts-20210826.tar.xz --directory-prefix=$LFS/sources/

51. Содержимое Glibc

Installed programs:
gencat, getconf, getent, iconv, iconvconfig, ldconfig, ldd, lddlibc4, ld.so (symlink to ld-linux-x86-64.so.2 or ld-linux.so.2), 
locale, localedef, makedb, mtrace, nscd, pcprofiledump, pldd, sln, sotruss, sprof, tzselect, xtrace, zdump, and zic

Installed libraries:
ld-linux-x86-64.so.2, ld-linux.so.2, libBrokenLocale.{a,so}, libanl.{a,so}, libc.{a,so}, libc_nonshared.a, libc_malloc_debug.so, 
libcrypt.{a,so}, libdl.{a,so.2}, libg.a, libm.{a,so}, libmcheck.a, libmemusage.so, libmvec.{a,so}, libnsl.so.1, libnss_compat.so, 
libnss_dns.so, libnss_files.so, libnss_hesiod.so, libpcprofile.so, libpthread.{a,so.0}, libresolv.{a,so}, librt.{a,so.1}, 
libthread_db.so, and libutil.{a,so.1}

Installed directories:
/usr/include/arpa, /usr/include/bits, /usr/include/gnu, /usr/include/net, /usr/include/netash, /usr/include/netatalk, /usr/include/netax25, 
/usr/include/neteconet, /usr/include/netinet, /usr/include/netipx, /usr/include/netiucv, /usr/include/netpacket, /usr/include/netrom, 
/usr/include/netrose, /usr/include/nfs, /usr/include/protocols, /usr/include/rpc, /usr/include/sys, /usr/lib/audit, /usr/lib/gconv, 
/usr/lib/locale, /usr/libexec/getconf, /usr/share/i18n, /usr/share/zoneinfo, /var/cache/nscd, and /var/lib/nss_db

gencat              Генерирует каталоги сообщений.
getconf             Отображает значения конфигурации системы для конкретных переменных файловой системы.
getent              Получает записи из административной базы данных.
iconv               Выполняет преобразование набора символов.
iconvconfig         Создает быстро загружаемые файлы конфигурации модуля iconv.
ldconfig            Настраивает привязки среды выполнения динамического компоновщика.
ldd                 Отчеты о том, какие общие библиотеки требуются каждой данной программе или общей библиотеке.
lddlibc4            Помогает ldd с объектными файлами. Его нет в более новых архитектурах, таких как x86_64.
locale              Выводит различную информацию о текущей локали.
localedef           Компилирует спецификации локали.
makedb              Создает простую базу данных из текстового ввода.
mtrace              Читает и интерпретирует файл трассировки памяти и отображает сводку в удобочитаемом формате.
nscd                Демон, обеспечивающий кеширование наиболее распространенных запросов службы имен.
pcprofiledump       Дамп информации, сгенерированный профилированием ПК.
pldd                Перечисляет динамические общие объекты, используемые запущенными процессами.
sln                 Статически скомпонованная программа ln.
sotruss             Отслеживает вызовы процедур общей библиотеки указанной команды.
sprof               Читает и отображает данные профилирования общих объектов.
tzselect            Спрашивает пользователя о местоположении системы и сообщает соответствующее описание часового пояса.
xtrace              Отслеживает выполнение программы, печатая текущую выполняемую функцию.
zdump               Дампер часовых поясов.
zic                 Компилятор часового пояса.
ld-*.so             Вспомогательная программа для исполняемых файлов общей библиотеки.
libBrokenLocale     Используется внутри Glibc как грубый взлом для запуска сломанных программ (например, некоторых приложений Motif).
libanl              Библиотека асинхронного поиска имен.
libc                Основная библиотека C.
libc_malloc_debug   Включает проверку выделения памяти при предварительной загрузке.
libcrypt            Библиотека криптографии.
libdl               Пустая библиотека, не содержащая функций. Ранее была библиотека интерфейса динамической компоновки, функции которой теперь находятся в libc.
libg                Пустая библиотека, не содержащая функций. Раньше была библиотека времени выполнения для g++
libm                Математическая библиотека
libmvec             Библиотека векторных математических вычислений, подключаемая по мере необходимости при libm использовании.
libmcheck           Включает проверку выделения памяти при подключении к
libmemusage         Используется memusage для сбора информации об использовании памяти программой.
libnsl              Библиотека сетевых сервисов устарела.
libnss_*            Модули Name Service Switch, содержащие функции для разрешения имен хостов, имен пользователей, имен групп, псевдонимов, служб, протоколов и т. д. 
                    Загружаются в libc соответствии с конфигурацией в /etc/nsswitch.conf
libpcprofile        Может быть предварительно загружен в профиль ПК в виде исполняемого файла.
libpthread          Пустая библиотека, не содержащая функций. Раньше он содержал функции, обеспечивающие большинство интерфейсов, указанных в расширении реального времени POSIX.1b, теперь в libc.
libresolv           Содержит функции для создания, отправки и интерпретации пакетов на серверы доменных имен в Интернете.
librt               Содержит функции, предоставляющие большинство интерфейсов, указанных в расширении реального времени POSIX.1b.
libthread_db        Содержит функции, полезные для создания отладчиков многопоточных программ.
libutil             Пустая библиотека, не содержащая функций. Ранее содержал код для « стандартных » функций, используемых во многих различных утилитах Unix. Эти функции теперь в libc.

52. Установка Zlib-1.2.11:

!!! Установленные библиотеки: libz.so
!!! libz - Содержит функции сжатия и распаковки, используемые некоторыми программами.



0. Подготовьте Zlib к компиляции:
./configure --prefix=/usr

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

2. Чтобы проверить результаты, введите:
make check

3. Установите пакет:
make install

4. Удалите бесполезную статическую библиотеку:
rm -fv /usr/lib/libz.a

53. Установка Bzip2-1.0.8:

0. Примените патч, который установит документацию для этого пакета:
patch -Np1 -i ../bzip2-1.0.8-install_docs-1.patch

1. Следующая команда обеспечивает относительную установку символических ссылок:
sed -i 's@\(ln -s -f \)$(PREFIX)/bin/@\1@' Makefile

2. Убедитесь, что справочные страницы установлены в правильном месте:
sed -i "s@(PREFIX)/man@(PREFIX)/share/man@g" Makefile

3. Подготовьте Bzip2 к компиляции с помощью:
make -f Makefile-libbz2_so
make clean
Значение параметра make:
-f Makefile-libbz2_so
Это приведет к сборке Bzip2 с использованием другого Makefile файла, в данном случае Makefile-libbz2_soфайла, который создает динамическую libbz2.so библиотеку и связывает с ней утилиты Bzip2.

4. Скомпилируйте и протестируйте пакет:
make

5. Скомпилируйте и протестируйте пакет:
make PREFIX=/usr install

6. Установите общую библиотеку:
cp -av libbz2.so.* /usr/lib
ln -sv libbz2.so.1.0.8 /usr/lib/libbz2.so

7. Установите общий двоичный файл bzip2/usr/bin в каталог и замените две копии bzip2 символическими ссылками:
cp -v bzip2-shared /usr/bin/bzip2
for i in /usr/bin/{bzcat,bunzip2}; do
  ln -sfv bzip2 $i
done

8. Удалите бесполезную статическую библиотеку:
rm -fv /usr/lib/libbz2.a

9. Содержимое bzip
bunzip2 Распаковывает bzip-файлы
bzcat   Распаковывает в стандартный вывод
bzcmp   Запускает cmp для bzip-файлов
bzdiff  Запускает diff для bzip-файлов
bzegrep Запускает egrep для bzip-файлов
bzfgrep Запускает fgrep для bzip-файлов
bzgrep  Запускает grep для bzip-файлов
bzip2   Сжимает файлы, используя алгоритм сжатия текста с блочной сортировкой Берроуза-Уилера с кодированием Хаффмана; степень сжатия лучше, чем у более традиционных компрессоров, использующих алгоритмы Lempel-Ziv, такие как gzip
bzip2recover    Пытается восстановить данные из поврежденных bzip-файлов.
bzless  Меньше работает с bzip -файлами
bzmore  Работает больше на bzip-файлах
libbz2  Библиотека, реализующая сжатие данных без потерь с блочной сортировкой с использованием алгоритма Барроуза-Уилера.

54. Установка Xz-5.2.5:

0. Подготовьте Xz к компиляции с помощью:
./configure --prefix=/usr    \
            --disable-static \
            --docdir=/usr/share/doc/xz-5.2.5
1. Скомпилируйте пакет:
make

2. Чтобы проверить результаты, введите:
make check

3. Установите пакет:
make install

4. Содержит:
lzcat   Распаковывает в стандартный вывод
lzcmp   Запускает cmp на сжатых файлах LZMA
lzdiff  Запускает diff для сжатых файлов LZMA
lzegrep Запускает egrep для сжатых файлов LZMA
lzfgrep Запускает fgrep на сжатых LZMA файлах
lzgrep  Запускает grep для сжатых файлов LZMA
lzless  Меньше работает со сжатыми файлами LZMA
lzma    Сжимает или распаковывает файлы в формате LZMA.
lzmadec Небольшой и быстрый декодер для сжатых файлов LZMA.
lzmainfo        Показывает информацию, хранящуюся в сжатом заголовке файла LZMA.
lzmore  Больше работает со сжатыми файлами LZMA
unlzma  Распаковывает файлы в формате LZMA.
unxz    Распаковывает файлы, используя формат XZ
xz      Сжимает или распаковывает файлы в формате XZ.
xzcat   Распаковывает в стандартный вывод
xzcmp   Запускает cmp на сжатых XZ файлах
xzdec   Небольшой и быстрый декодер для сжатых файлов XZ.
xzdiff  Запускает diff на сжатых XZ файлах
xzegrep Запускает egrep на сжатых XZ файлах
xzfgrep Запускает fgrep на сжатых XZ файлах
xzgrep  Запускает grep на сжатых XZ файлах
xzless  Меньше работает со сжатыми файлами XZ
xzmore  Больше работает со сжатыми файлами XZ
liblzma Библиотека, реализующая сжатие данных без потерь с блочной сортировкой с использованием цепного алгоритма Лемпеля-Зива-Маркова.

55. Установка Zstd-1.5.2:

!!! Zstandard — это алгоритм сжатия в реальном времени, обеспечивающий высокую степень сжатия.
!!! Он предлагает очень широкий диапазон компромиссов между сжатием и скоростью при поддержке очень быстрого декодера.

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

1. make check

2. Установите пакет:
make prefix=/usr install

3. Удалите статическую библиотеку:
rm -v /usr/lib/libzstd.a

4. Содержимое пакета
zstd            Сжимает или распаковывает файлы в формате ZSTD.
zstdgrep        Запускает grep для сжатых файлов ZSTD
zstdless        Меньше работает со сжатыми файлами ZSTD
libzstd         Библиотека, реализующая сжатие данных без потерь, с использованием алгоритма ZSTD.

56. File-5.41

!!! Пакет File содержит утилиту для определения типа данного файла или файлов.
0. Подготовьте файл для компиляции:
./configure --prefix=/usr

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

2. Чтобы проверить результаты, введите:
make check

3. Установите пакет:
make install

4. Содержимое:
file - Пытается классифицировать каждый заданный файл; он делает это, выполняя несколько тестов — тесты файловой системы, тесты магических чисел и языковые тесты.
libmagic - Содержит подпрограммы для распознавания магических чисел, используемые файловой программой.

57. Readline-8.1.2

0. Переустановка Readline приведет к перемещению старых библиотек в .old. 
Хотя обычно это не проблема, в некоторых случаях это может вызвать ошибку связывания в ldconfig. 
Этого можно избежать, выпустив следующие два sed:
sed -i '/MV.*old/d' Makefile.in
sed -i '/{OLDSUFF}/c:' support/shlib-install

1. Подготовьте Readline к компиляции:
./configure --prefix=/usr    \
            --disable-static \
            --with-curses    \
            --docdir=/usr/share/doc/readline-8.1.2

Значение опции конфигурации:
--with-curses
Этот параметр сообщает Readline, что он может найти функции библиотеки termcap в библиотеке curses, а не в отдельной библиотеке termcap. 
Это позволяет создать правильный readline.pc файл.

2. Скомпилируйте пакет:
make SHLIB_LIBS="-lncursesw"

Значение опции make:
SHLIB_LIBS="-lncursesw"
Эта опция заставляет Readline связываться с libncursesw библиотекой.

3. Этот пакет не поставляется с набором тестов.
Установите пакет:
make SHLIB_LIBS="-lncursesw" install

4. При желании установите документацию:
install -v -m644 doc/*.{ps,pdf,html,dvi} /usr/share/doc/readline-8.1.2

5. Содержимое пакета: 
libhistory Обеспечивает согласованный пользовательский интерфейс для вызова строк истории
libreadline Предоставляет набор команд для управления текстом, введенным в интерактивном сеансе программы.

58. M4-1.4.19

0. Подготовьте M4 к компиляции:
./configure --prefix=/usr

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

2. Чтобы проверить результаты, введите:
make check

3. Установите пакет:
make install

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

59. Bc-5.2.2

0. Подготовьте Bc к компиляции:
CC=gcc ./configure --prefix=/usr -G -O3

1. Значение параметров настройки:
CC=gcc Этот параметр указывает используемый компилятор.
-O3    Укажите используемую оптимизацию.
-G     Опустите части набора тестов, которые не будут работать без наличия GNU bc.

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

3. Чтобы проверить bc, запустите:
make test

4. Установите пакет:
make install

5. Содержимое пакета:
bc Калькулятор командной строки
dc Калькулятор командной строки с обратной шлифовкой

60. Flex-2.6.4

0. Подготовьте Flex к компиляции:
./configure --prefix=/usr \
            --docdir=/usr/share/doc/flex-2.6.4 \
            --disable-static
1. Скомпилируйте пакет:
make

2. Для проверки результатов (около 0,5 SBU) выполните:
make check

3. Установите пакет:
make install

4. Несколько программ еще не знают о flex и пытаются запустить его предшественника, lex. 
Для поддержки этих программ создайте символическую ссылку с именем lex, которая работает flexв режиме эмуляции lex:
ln -sv flex /usr/bin/lex

5. Содержимое Flex
flex  Инструмент для создания программ, распознающих шаблоны в тексте; это позволяет гибко указывать правила поиска закономерностей, устраняя необходимость разработки специализированной программы.
flex++   Расширение flex используется для генерации кода и классов C++. Это символическая ссылка на flex
lex      Символическая ссылка, которая запускает flex в режиме эмуляции lex .
libfl    flex Библиотека _

61. Tcl-8.6.12

!!! Пакет Tcl содержит язык команд инструментов, надежный язык сценариев общего назначения. Пакет Expect написан на языке Tcl.
0. Сначала распакуйте документацию, введя следующую команду:
tar -xf ../tcl8.6.12-html.tar.gz --strip-components=1

1. Подготовьте Tcl к компиляции:
SRCDIR=$(pwd)
cd unix
./configure --prefix=/usr           \
            --mandir=/usr/share/man \
            $([ "$(uname -m)" = x86_64 ] && echo --enable-64bit)

Значение параметров настройки:
$([ "$(uname -m)" = x86_64 ] && echo --enable-64bit) 
Конструкция $()заменяется выводом команды оболочки. 
Здесь этот вывод пуст, если работает на 32-битной машине, и пуст, --enable-64bitесли работает на 64-битной машине.

2. Соберите пакет:

make

sed -e "s|$SRCDIR/unix|/usr/lib|" \
    -e "s|$SRCDIR|/usr/include|"  \
    -i tclConfig.sh

sed -e "s|$SRCDIR/unix/pkgs/tdbc1.1.3|/usr/lib/tdbc1.1.3|" \
    -e "s|$SRCDIR/pkgs/tdbc1.1.3/generic|/usr/include|"    \
    -e "s|$SRCDIR/pkgs/tdbc1.1.3/library|/usr/lib/tcl8.6|" \
    -e "s|$SRCDIR/pkgs/tdbc1.1.3|/usr/include|"            \
    -i pkgs/tdbc1.1.3/tdbcConfig.sh

sed -e "s|$SRCDIR/unix/pkgs/itcl4.2.2|/usr/lib/itcl4.2.2|" \
    -e "s|$SRCDIR/pkgs/itcl4.2.2/generic|/usr/include|"    \
    -e "s|$SRCDIR/pkgs/itcl4.2.2|/usr/include|"            \
    -i pkgs/itcl4.2.2/itclConfig.sh

unset SRCDIR

!!! Различные инструкции « sed » после команды « make » удаляют ссылки на каталог сборки из файлов конфигурации и заменяют их каталогом установки. 
!!! Это не является обязательным для остальной части LFS, но может понадобиться в случае, если пакет, созданный позже, использует Tcl.

3. Чтобы проверить результаты, введите:
make test

4. Установите пакет:
make install

5. Сделайте установленную библиотеку доступной для записи, чтобы символы отладки можно было удалить позже:
chmod -v u+w /usr/lib/libtcl8.6.so

6. Установите заголовки Tcl. Следующий пакет, Expect, требует их.
make install-private-headers

7. Теперь сделайте необходимую символическую ссылку:
ln -sfv tclsh8.6 /usr/bin/tclsh

8. Переименуйте справочную страницу, которая конфликтует с справочной страницей Perl:
mv /usr/share/man/man3/{Thread,Tcl_Thread}.3


9. Если вы загрузили дополнительную документацию, установите ее, выполнив следующие команды:
mkdir -v -p /usr/share/doc/tcl-8.6.12
cp -v -r  ../html/* /usr/share/doc/tcl-8.6.12

10. Содержимое:
tclsh8.6  Командная оболочка Tcl
tclsh  Ссылка на tclsh8.6
libtcl8.6.so Tcl-библиотека
libtclstub8.6.a  Библиотека Tcl Stub

62. Expect-5.45.4

0. Подготовьте ожидание к компиляции:
./configure --prefix=/usr           \
            --with-tcl=/usr/lib     \
            --enable-shared         \
            --mandir=/usr/share/man \
            --with-tclinclude=/usr/include

Значение параметров настройки:
--with-tcl=/usr/lib Этот параметр необходим для указания конфигурации, где находится скрипт tclConfig.sh .
--with-tclinclude=/usr/include Это явно указывает Expect, где найти внутренние заголовки Tcl.

1. Соберите пакет:
make

2. Чтобы проверить результаты, введите:
make test

3. Установите пакет:
make install
ln -svf expect5.45.4/libexpect5.45.4.so /usr/lib

4. Краткие описания
expect  Общается с другими интерактивными программами по сценарию
libexpect-5.45.4.so Содержит функции, которые позволяют использовать Expect как расширение Tcl или использовать его непосредственно из C или C++ (без Tcl).


63. DejaGNU-1.6.3

0. Разработчики рекомендуют собирать DejaGNU в специальном каталоге сборки:
mkdir -v build
cd       build

1. Подготовьте DejaGNU к компиляции:
../configure --prefix=/usr
makeinfo --html --no-split -o doc/dejagnu.html ../doc/dejagnu.texi
makeinfo --plaintext       -o doc/dejagnu.txt  ../doc/dejagnu.texi

2. Соберите и установите пакет:
make install
install -v -dm755  /usr/share/doc/dejagnu-1.6.3
install -v -m644   doc/dejagnu.{html,txt} /usr/share/doc/dejagnu-1.6.3

3. Чтобы проверить результаты, введите:
make check

4. пакеты:
dejagnu  Вспомогательная программа запуска команд DejaGNU
runtest Сценарий-оболочка, который находит нужную оболочку ожидания , а затем запускает DejaGNU.


64. Binutils-2.38

!!! Пакет Binutils содержит компоновщик, ассемблер и другие инструменты для работы с объектными файлами.
!!! Набор тестов для Binutils в этом разделе считается критически важным. Ни в коем случае не пропускайте его.

0. Убедитесь, что PTY правильно работают в среде chroot, выполнив простой тест:
expect -c "spawn ls"

!!! Эта команда должна вывести следующее:
!!! spawn ls
!!! Если вместо этого выходные данные содержат приведенное ниже сообщение, значит, среда не настроена для правильной работы PTY. 
!!! Эту проблему необходимо решить перед запуском тестовых наборов для Binutils и GCC:
!!! The system has no more ptys.
!!! Ask your system administrator to create more.

1. Компания Upstream выпустила исправление для устранения проблемы при использовании binutils для сборки некоторых пакетов BLFS с включенной оптимизацией времени соединения (LTO).
patch -Np1 -i ../binutils-2.38-lto_fix-1.patch

2. Теперь внесите исправление, указанное в восходящем потоке, которое влияет на сборку некоторых пакетов:
sed -e '/R_386_TLS_LE /i \   || (TYPE) == R_386_TLS_IE \\' \
    -i ./bfd/elfxx-x86.h

3. Документация Binutils рекомендует собирать Binutils в выделенном каталоге сборки:
mkdir -v build
cd       build

4. Подготовьте Binutils к компиляции:
../configure --prefix=/usr       \
             --enable-gold       \
             --enable-ld=default \
             --enable-plugins    \
             --enable-shared     \
             --disable-werror    \
             --enable-64-bit-bfd \
             --with-system-zlib

Значение параметров конфигурации:
--enable-gold Создайте золотой компоновщик и установите его как ld.gold (наряду с компоновщиком по умолчанию).
--enable-ld=default  Соберите оригинальный компоновщик bfd и установите его как ld (компоновщик по умолчанию) и как ld.bfd.
--enable-plugins Включает поддержку плагинов для компоновщика.
--enable-64-bit-bfd Включает 64-битную поддержку (на хостах с более узкими размерами слов). Может и не понадобится на 64-битных системах, но не навредит.
--with-system-zlib Используйте установленную библиотеку zlib вместо сборки включенной версии.

5. Скомпилируйте пакет:
make tooldir=/usr

Значение параметра make:
tooldir=/usr Обычно для tooldir (каталога, в котором в конечном итоге будут расположены исполняемые файлы) установлено значение $(exec_prefix)/$(target_alias). 
Например, машины x86_64 расширят это до /usr/x86_64-pc-linux-gnu. 
Поскольку это пользовательская система, этот целевой каталог /usrне требуется. 
$(exec_prefix)/$(target_alias)будет использоваться, если система используется для кросс-компиляции (например, при компиляции пакета на машине Intel, 
который генерирует код, который может быть выполнен на машинах PowerPC).

6. Проверьте результаты:
make -k check

7. Установите пакет:
make tooldir=/usr install

8. Удалите бесполезные статические библиотеки:
rm -fv /usr/lib/lib{bfd,ctf,ctf-nobfd,opcodes}.a

9. Пакет содержит:
addr2line       Преобразует адреса программ в имена файлов и номера строк; учитывая адрес и имя исполняемого файла, он использует отладочную информацию в исполняемом файле, 
                чтобы определить, какой исходный файл и номер строки связаны с адресом.
ar      Создает, изменяет и извлекает из архивов
as      Ассемблер, который собирает вывод gcc в объектные файлы .
c++filt Используется компоновщиком для исправления символов C++ и Java и предотвращения конфликтов перегруженных функций.
dwp     Утилита упаковки DWARF
elfedit Обновляет заголовок ELF файлов ELF.
gprof   Отображает данные профиля графика вызовов
ld      Компоновщик, который объединяет несколько файлов объектов и архивов в один файл, перемещая их данные и связывая ссылки на символы.
ld.gold Урезанная версия ld, которая поддерживает только формат объектных файлов elf.
ld.bfd  Жесткая ссылка на ld
nm      Перечисляет символы, встречающиеся в данном объектном файле.
objcopy Преобразует один тип объектного файла в другой
objdump Отображает информацию о данном объектном файле с параметрами, управляющими отображением конкретной информации; 
        показанная информация полезна для программистов, которые работают над инструментами компиляции
ranlib  Генерирует индекс содержимого архива и сохраняет его в архиве; индекс перечисляет все символы, определенные элементами архива, которые являются перемещаемыми объектными файлами.
readelf Отображает информацию о двоичных файлах типа ELF
size    Перечисляет размеры разделов и общий размер для заданных объектных файлов.
strings Выводит для каждого заданного файла последовательности печатных символов, которые имеют по крайней мере указанную длину (по умолчанию четыре); 
        для объектных файлов по умолчанию печатаются только строки из разделов инициализации и загрузки, а для других типов файлов сканируется весь файл
strip   Отбрасывает символы из объектных файлов
libbfd  Библиотека дескрипторов двоичных файлов
libctf  Библиотека поддержки отладки Compat ANSI-C Type Format
libctf-nobfd    Вариант libctf, который не использует функциональность libbfd.
libopcodes      Библиотека для работы с кодами операций — « удобочитаемыми текстовыми » версиями инструкций для процессора; он используется для создания утилит, таких как objdump

65. GMP-6.2.1

!!! Пакет GMP содержит математические библиотеки. У них есть полезные функции для арифметики произвольной точности.
0. Подготовить GMP к компиляции:
./configure --prefix=/usr    \
            --enable-cxx     \
            --disable-static \
            --docdir=/usr/share/doc/gmp-6.2.1

Значение новых опций конфигурации:
--enable-cxx Этот параметр включает поддержку C++.
--docdir=/usr/share/doc/gmp-6.2.1 Эта переменная указывает правильное место для документации.


1. Скомпилируйте пакет и сгенерируйте HTML-документацию:
make
make html

2. Проверьте результаты:
make check 2>&1 | tee gmp-check-log

3. Убедитесь, что все 197 тестов в наборе тестов пройдены. 
Проверьте результаты, введя следующую команду:

awk '/# PASS:/{total+=$3} ; END{print total}' gmp-check-log

4. Установите пакет и его документацию:
make install
make install-html

5. Содержимое пакета
libgmp Содержит точные математические функции
libgmpxx Содержит точные математические функции C++

66. MPFR-4.1.0

!!! Пакет MPFR содержит функции для вычислений с множественной точностью.
0. Подготовьте MPFR к компиляции:
./configure --prefix=/usr        \
            --disable-static     \
            --enable-thread-safe \
            --docdir=/usr/share/doc/mpfr-4.1.0

1. Скомпилируйте пакет и сгенерируйте HTML-документацию:
make
make html

2. Проверьте результаты и убедитесь, что все тесты пройдены:
make check

3. Установите пакет и его документацию:
make install
make install-html

4. Содержание  libmpfr
Содержит математические функции с множественной точностью


67. MPC-1.2.1

!!! Пакет MPC содержит библиотеку для арифметики комплексных чисел с произвольно высокой точностью и правильным округлением результата.
!!! libmpc - Содержит сложные математические функции

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

./configure --prefix=/usr    \
            --disable-static \
            --docdir=/usr/share/doc/mpc-1.2.1

1. Скомпилируйте пакет и сгенерируйте HTML-документацию:
make
make html

2. Чтобы проверить результаты, введите:
make check

3. Установите пакет и его документацию:
make install
make install-html


68. Attr-2.5.1

!!! Пакет attr содержит утилиты для управления расширенными атрибутами объектов файловой системы.
!!! attr Расширяет атрибуты объектов файловой системы
!!! getfattr Получает расширенные атрибуты объектов файловой системы
!!! setfattr Устанавливает расширенные атрибуты объектов файловой системы
!!! libattr Содержит библиотечные функции для управления расширенными атрибутами.

0. Подготовьте Attr к компиляции:
./configure --prefix=/usr     \
            --disable-static  \
            --sysconfdir=/etc \
            --docdir=/usr/share/doc/attr-2.5.1

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

2. Тесты необходимо запускать в файловой системе, которая поддерживает расширенные атрибуты, такие как файловые системы ext2, ext3 или ext4. Чтобы проверить результаты, введите:
make check

3. Установите пакет:
make install


69. Acl-2.3.1

!!! Пакет Acl содержит утилиты для администрирования списков контроля доступа, которые используются для определения более детальных дискреционных прав доступа к файлам и каталогам.
!!! chacl Изменяет список контроля доступа к файлу или каталогу
!!! getfacl Получает списки контроля доступа к файлам
!!! setfacl Устанавливает списки контроля доступа к файлам
!!! libacl Содержит библиотечные функции для управления списками контроля доступа.

0. Подготовьте Acl к компиляции:
./configure --prefix=/usr         \
            --disable-static      \
            --docdir=/usr/share/doc/acl-2.3.1

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

!!! Тесты Acl необходимо запускать в файловой системе, поддерживающей управление доступом, после сборки Coreutils с библиотеками Acl. 
!!! При желании вернитесь к этому пакету и запустите make check после того , как Coreutils будет собран позже в этой главе.

2. Установите пакет:
make install

70. Libcap-2.63

!!! Пакет Libcap реализует интерфейсы пользовательского пространства для возможностей POSIX 1003.1e, доступных в ядрах Linux. 
!!! Эти возможности представляют собой разделение всех мощных привилегий root на набор отдельных привилегий.
!!! capsh Оболочка-оболочка для изучения и ограничения поддержки возможностей
!!! getcap Изучает возможности файла
!!! getpcaps Отображает возможности запрошенного процесса(ов)
!!! setcap Устанавливает возможности файла
!!! libcap Содержит библиотечные функции для управления возможностями POSIX 1003.1e.
!!! libpsx Содержит функции для поддержки семантики POSIX для системных вызовов, связанных с библиотекой pthread.

0. Запретить установку статических библиотек:
sed -i '/install -m.*STA/d' libcap/Makefile

1. Скомпилируйте пакет:
make prefix=/usr lib=lib

Значение опции make:
lib=lib этот параметр задает каталог библиотеки /usr/libвместо /usr/lib64x86_64. На x86 это никак не влияет.

2. Чтобы проверить результаты, введите:
make test

3. Установите пакет:
make prefix=/usr lib=lib install

71. Shadow-4.11.1

!!! Пакет Shadow содержит программы для безопасной обработки паролей.
!!! Если вы хотите принудительно использовать надежные пароли, обратитесь к https://www.linuxfromscratch.org/blfs/view/stable-systemd/postlfs/cracklib.html 
!!! для установки CrackLib перед сборкой Shadow. Затем добавьте --with-libcrackв команду configure ниже.

0. Отключите установку программы groups и ее справочных страниц, так как Coreutils предоставляет лучшую версию. Кроме того, запретите установку справочных страниц.
sed -i 's/groups$(EXEEXT) //' src/Makefile.in
find man -name Makefile.in -exec sed -i 's/groups\.1 / /'   {} \;
find man -name Makefile.in -exec sed -i 's/getspnam\.3 / /' {} \;
find man -name Makefile.in -exec sed -i 's/passwd\.5 / /'   {} \;

!!! Вместо использования метода шифрования по умолчанию используйте более безопасный метод шифрования паролей SHA-512 , который также позволяет использовать пароли длиннее 8 символов. 
!!! Также необходимо изменить устаревшее /var/spool/mail расположение почтовых ящиков пользователей, которое Shadow использует по умолчанию, 
!!! на /var/mailтекущее местоположение. И избавьтесь от /bin и /sbinот PATH, поскольку они являются просто символическими ссылками на их аналог в /usr.
!!! Если /binи/или по какой-то причине /sbin предпочтительнее оставить PATH, измените PATH после .bashrc сборки LFS.

sed -e 's:#ENCRYPT_METHOD DES:ENCRYPT_METHOD SHA512:' \
    -e 's:/var/spool/mail:/var/mail:'                 \
    -e '/PATH=/{s@/sbin:@@;s@/bin:@@}'                \
    -i etc/login.defs

!!! Примечание \ Если вы выбрали сборку Shadow с поддержкой Cracklib, выполните следующее:
!!! # sed -i 's:DICTPATH.*:DICTPATH\t/lib/cracklib/pw_dict:' etc/login.defs

1. Подготовьте Shadow к компиляции:
touch /usr/bin/passwd
./configure --sysconfdir=/etc \
            --disable-static  \
            --with-group-name-max-length=32

Значение опции конфигурации:
touch /usr/bin/passwd 
Файл /usr/bin/passwd должен существовать, потому что его расположение жестко запрограммировано в некоторых программах, и если он не существует, то расположение по умолчанию неверно.
--with-group-name-max-length=32
Максимальное имя пользователя составляет 32 символа. Сделайте максимальное имя группы одинаковым.

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

3. Установите пакет:
make exec_prefix=/usr install
make -C man install-man


72. Настройка Shadow

!!! Этот пакет содержит утилиты для добавления, изменения и удаления пользователей и групп; устанавливать и менять свои пароли; и выполнять другие административные задачи. 
!!! Полное объяснение того, что означает теневое копирование паролейdoc/HOWTO , см. в файле в распакованном дереве исходного кода. 
!!! Если вы используете поддержку Shadow, имейте в виду, что программы, которые должны проверять пароли (диспетчеры отображения, FTP-программы, демоны pop3 и т. д.), 
!!! должны быть совместимы с Shadow. 
!!! То есть им нужно уметь работать с теневыми паролями.

0. Чтобы включить теневые пароли, выполните следующую команду:
pwconv

1. Чтобы включить теневые групповые пароли, запустите:
grpconv

!!! Конфигурация Shadow по умолчанию для утилиты useradd имеет несколько предостережений, требующих пояснений. 
!!! Во-первых, по умолчанию утилита useradd создает пользователя и группу с тем же именем, что и у пользователя. 
!!! По умолчанию номера идентификатора пользователя (UID) и идентификатора группы (GID) начинаются с 1000. 
!!! Это означает, что если вы не передадите параметры в useradd , каждый пользователь будет членом уникальной группы в системе. 
!!! Если такое поведение нежелательно, вам нужно будет передать один из параметров -gили в useradd или изменить настройку в-NUSERGROUPS_ENAB/etc/login.defs. 
!!! См. useradd(8)дополнительную информацию.

2. Во-вторых, чтобы изменить параметры по умолчанию, файл /etc/default/useraddнеобходимо создать и настроить в соответствии с вашими конкретными потребностями.
mkdir -p /etc/default
useradd -D --gid 999

!!! /etc/default/useradd Пояснения к параметрам
!!! GROUP=999
!!! Этот параметр задает начало номеров групп, используемых в /etc/group файле. 
!!! Конкретное значение 999 исходит из указанного --gid выше параметра. 
!!! Вы можете изменить его на все, что пожелаете. Обратите внимание, что useradd никогда не будет повторно использовать UID или GID. 
!!! Если используется номер, указанный в этом параметре, будет использоваться следующий доступный номер. 
!!! Также обратите внимание, что если в вашей системе нет группы с идентификатором, равным этому номеру, 
!!! при первом использовании useradd без -gпараметра, вы получите сообщение, отображаемое на терминале, 
!!! которое гласит: useradd: unknown GID 999, хотя учетная запись создана правильно.
!!! CREATE_MAIL_SPOOL=yes
!!! Этот параметр заставляет useradd создать файл почтового ящика для вновь созданного пользователя. 
!!! useradd сделает групповое владение этим файлом mailгруппе с разрешениями 0660. 
!!! Если вы предпочитаете, чтобы эти файлы почтовых ящиков не создавались пользователем , введите следующую команду:
!!! sed -i '/MAIL/s/yes/no/' /etc/default/useradd

Краткие описания:
chage   Используется для изменения максимального количества дней между обязательной сменой пароля.
chfn    Используется для изменения полного имени пользователя и другой информации
chgpasswd       Используется для обновления групповых паролей в пакетном режиме.
chpasswd        Используется для обновления паролей пользователей в пакетном режиме.
chsh    Используется для изменения оболочки входа пользователя по умолчанию.
expiry  Проверяет и обеспечивает соблюдение текущей политики истечения срока действия пароля
faillog Используется для проверки журнала неудачных попыток входа в систему, для установки максимального количества неудачных попыток до блокировки учетной записи или для сброса счетчика неудачных попыток.
getsubids       Используется для перечисления подчиненных диапазонов идентификаторов для пользователя.
gpasswd Используется для добавления и удаления участников и администраторов в группы.
groupadd        Создает группу с заданным именем
groupdel        Удаляет группу с указанным именем
groupmems       Позволяет пользователю управлять своим собственным списком членства в группе, не требуя привилегий суперпользователя.
groupmod        Используется для изменения имени данной группы или GID
grpck   Проверяет целостность групповых файлов /etc/groupи /etc/gshadow
grpconv Создает или обновляет файл теневой группы из обычного файла группы.
grpunconv       Обновляет /etc/group , /etc/gshadowа затем удаляет последний
lastlog Сообщает о самом последнем входе в систему всех пользователей или данного пользователя
login   Используется системой, чтобы позволить пользователям войти в систему
logoutd Используется ли демон для принудительного применения ограничений на время входа в систему и порты
newgidmap       Используется для установки сопоставления gid пространства имен пользователя.
newgrp  Используется для изменения текущего GID во время сеанса входа в систему.
newuidmap       Используется для установки сопоставления uid пространства имен пользователя.
newusers        Используется для создания или обновления целой серии учетных записей пользователей.
nologin Выводит сообщение о том, что учетная запись недоступна; он предназначен для использования в качестве оболочки по умолчанию для отключенных учетных записей.
passwd  Используется для изменения пароля для учетной записи пользователя или группы.
pwck    Проверяет целостность файлов паролей /etc/passwdи /etc/shadow
pwconv  Создает или обновляет теневой файл паролей из обычного файла паролей.
pwunconv        Обновляет /etc/passwd , /etc/shadowа затем удаляет последний
sg      Выполняет заданную команду, в то время как GID пользователя установлен на GID данной группы
su      Запускает оболочку с замещающими идентификаторами пользователей и групп.
useradd Создает нового пользователя с заданным именем или обновляет информацию о новом пользователе по умолчанию.
userdel Удаляет указанную учетную запись пользователя
usermod Используется для изменения имени пользователя, идентификатора пользователя (UID), оболочки, исходной группы, домашнего каталога и т. д.
vigr    Редактирует /etc/group или /etc/gshadowфайлы
vipw    Редактирует /etc/passwd или /etc/shadowфайлы
libsubid        библиотека для диапазонов идентификаторов подчиненных процессов для пользователей

73. Установка GCC-11.2.0

0. Сначала устраните проблему, препятствующую libasan.aсборке этого пакета с помощью Glibc-2.34 или более поздней версии:
sed -e '/static.*SIGSTKSZ/d' \
    -e 's/return kAltStackSize/return SIGSTKSZ * 4/' \
    -i libsanitizer/sanitizer_common/sanitizer_posix_libcdep.cpp

1. При сборке на x86_64 измените имя каталога по умолчанию для 64-битных библиотек на « lib »:
case $(uname -m) in
  x86_64)
    sed -e '/m64=/s/lib64/lib/' \
        -i.orig gcc/config/i386/t-linux64
  ;;
esac

2. Документация GCC рекомендует собирать GCC в выделенном каталоге сборки:
mkdir -v build
cd       build


3. Подготовьте GCC к компиляции:
../configure --prefix=/usr            \
             LD=ld                    \
             --enable-languages=c,c++ \
             --disable-multilib       \
             --disable-bootstrap      \
             --with-system-zlib

Значение новых параметров конфигурации:
LD=ld
Этот параметр заставляет скрипт configure использовать ld, установленный программой binutils, созданной ранее в этой главе, а не перекрестную версию, которая в противном случае использовалась бы.
--with-system-zlib
Этот переключатель сообщает GCC о необходимости ссылки на установленную в системе копию библиотеки zlib, а не на собственную внутреннюю копию.

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

5. Известно, что один набор тестов в наборе тестов GCC исчерпывает стек по умолчанию, поэтому увеличьте размер стека перед запуском тестов:
ulimit -s 32768

6. Протестируйте результаты как непривилегированный пользователь, но не останавливайтесь на ошибках:
chown -Rv tester .
su tester -c "PATH=$PATH make -k check"

7. Чтобы получить сводку результатов набора тестов, запустите:
../contrib/test_summary

8. Установите пакет и удалите ненужный каталог:
make install
rm -rf /usr/lib/gcc/$(gcc -dumpmachine)/11.2.0/include-fixed/bits/

9. Каталог сборки GCC уже принадлежит, testerи владение установленным каталогом заголовков (и его содержимым) будет неправильным. 
Измените владельца на rootпользователя и группу:
chown -v -R root:root \
    /usr/lib/gcc/*linux-gnu/11.2.0/include{,-fixed}

10. Создайте символическую ссылку, требуемую FHS по «историческим» причинам.
ln -svr /usr/bin/cpp /usr/lib

11. Добавьте символическую ссылку совместимости, чтобы включить сборку программ с оптимизацией времени компоновки (LTO):
ln -sfv ../../libexec/gcc/$(gcc -dumpmachine)/11.2.0/liblto_plugin.so \
        /usr/lib/bfd-plugins/


12. Теперь, когда наша окончательная цепочка инструментов готова, важно еще раз убедиться, что компиляция и компоновка будут работать должным образом. 
Мы делаем это, выполняя некоторые проверки работоспособности:
echo 'int main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log
readelf -l a.out | grep ': /lib'

!!! Ошибок быть не должно, и вывод последней команды будет (с учетом платформо-зависимых различий в имени динамического компоновщика):
!!! [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]


13. Теперь убедитесь, что мы настроили использование правильных стартовых файлов:
grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log

14. Вывод последней команды должен быть:
/usr/lib/gcc/x86_64-pc-linux-gnu/11.2.0/../../../../lib/crt1.o succeeded
/usr/lib/gcc/x86_64-pc-linux-gnu/11.2.0/../../../../lib/crti.o succeeded
/usr/lib/gcc/x86_64-pc-linux-gnu/11.2.0/../../../../lib/crtn.o succeeded

!!! В зависимости от архитектуры вашего компьютера приведенное выше может немного отличаться. 
!!! Разница будет заключаться в имени каталога после /usr/lib/gcc. 
!!! Здесь важно обратить внимание на то, что gcc нашел все три crt*.o файла в /usr/lib каталоге.

15. Убедитесь, что компилятор ищет правильные файлы заголовков:
grep -B4 '^ /usr/include' dummy.log

16. Эта команда должна вернуть следующий вывод:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-pc-linux-gnu/11.2.0/include
 /usr/local/include
 /usr/lib/gcc/x86_64-pc-linux-gnu/11.2.0/include-fixed
 /usr/include

17. Затем убедитесь, что новый компоновщик используется с правильными путями поиска:
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'

18. Ссылки на пути, содержащие компоненты с «-linux-gnu», следует игнорировать, но в противном случае вывод последней команды должен быть таким:
SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib64")
SEARCH_DIR("/usr/local/lib64")
SEARCH_DIR("/lib64")
SEARCH_DIR("/usr/lib64")
SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib");

19. Затем убедитесь, что мы используем правильную libc:
grep "/lib.*/libc.so.6 " dummy.log
!!! Вывод последней команды должен быть:
!11 attempt to open /usr/lib/libc.so.6 succeeded

20. Убедитесь, что GCC использует правильный динамический компоновщик:
grep found dummy.log
!!! Вывод последней команды должен быть (с учетом различий в имени динамического компоновщика, зависящих от платформы):
!!! found ld-linux-x86-64.so.2 at /usr/lib/ld-linux-x86-64.so.2

21. Как только все заработает правильно, очистите тестовые файлы:
rm -v dummy.c a.out dummy.log

22. Наконец, переместите неуместный файл:
mkdir -pv /usr/share/gdb/auto-load/usr/lib
mv -v /usr/lib/*gdb.py /usr/share/gdb/auto-load/usr/lib

23. Содержимое пакета:
c++     Компилятор С++
cc      Компилятор C
cpp     Препроцессор Си; он используется компилятором для расширения операторов #include, #define и подобных в исходных файлах.
g++     Компилятор С++
gcc     Компилятор C
gcc-ar  Обертка вокруг ar , добавляющая плагин в командную строку. Эта программа используется только для добавления «оптимизации времени компоновки» и бесполезна с параметрами сборки по умолчанию.
gcc-nm  Оболочка над nm , добавляющая плагин в командную строку. Эта программа используется только для добавления «оптимизации времени компоновки» и бесполезна с параметрами сборки по умолчанию.
gcc-ranlib      Обертка вокруг ranlib , добавляющая плагин в командную строку. Эта программа используется только для добавления «оптимизации времени компоновки» и бесполезна с параметрами сборки по умолчанию.
gcov    Инструмент тестирования покрытия; он используется для анализа программ, чтобы определить, где оптимизация будет иметь наибольший эффект.
gcov-dump       Автономный инструмент для дампа профилей gcda и gcno
gcov-tool       Автономный инструмент обработки профиля gcda
lto-dump        Инструмент для создания дампа объектных файлов, созданных GCC с включенным LTO.
libasan Библиотека времени выполнения Address Sanitizer
libatomic       Встроенная библиотека времени выполнения GCC atomic
libcc1  Библиотека предварительной обработки C
libgcc  Содержит поддержку времени выполнения для gcc
libgcov Эта библиотека связана с программой, когда GCC получает указание включить профилирование.
libgomp Реализация GNU OpenMP API для многоплатформенного параллельного программирования с общей памятью на C/C++ и Fortran
libitm  Библиотека транзакционной памяти GNU
liblsan Библиотека времени выполнения Leak Sanitizer
liblto_plugin   Плагин GCC LTO позволяет binutils обрабатывать объектные файлы, созданные GCC с включенным LTO.
libquadmath     API математической библиотеки GCC Quad Precision
libssp  Содержит подпрограммы, поддерживающие функциональность защиты стека GCC.
libstdc++       Стандартная библиотека С++
libstdc++fs     Библиотека файловой системы ISO/IEC TS 18822:2015
libsupc++       Предоставляет вспомогательные процедуры для языка программирования C++.
libtsan Библиотека времени выполнения Thread Sanitizer
libubsan        Библиотека времени выполнения Undefined Behavior Sanitizer

74. Pkg-config-0.29.2

0. Подготовьте Pkg-config к компиляции:
./configure --prefix=/usr              \
            --with-internal-glib       \
            --disable-host-tool        \
            --docdir=/usr/share/doc/pkg-config-0.29.2

Значение новых опций конфигурации:
--with-internal-glib
Это позволит pkg-config использовать свою внутреннюю версию Glib, поскольку внешняя версия недоступна в LFS.
--disable-host-tool
Эта опция отключает создание нежелательной жесткой ссылки на программу pkg-config.

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

2. Чтобы проверить результаты, введите:
make check

3. Установите пакет:
make install

4. Краткие описания
pkg-config Возвращает метаинформацию для указанной библиотеки или пакета

75. Ncurses-6.3

0. Подготовьте Ncurses к компиляции:
./configure --prefix=/usr           \
            --mandir=/usr/share/man \
            --with-shared           \
            --without-debug         \
            --without-normal        \
            --enable-pc-files       \
            --enable-widec          \
            --with-pkg-config-libdir=/usr/lib/pkgconfig

Значение новых опций конфигурации:
--enable-widec
Этот переключатель вызывает создание библиотек расширенных символов (например, libncursesw.so.6.3) вместо обычных (например, libncurses.so.6.3). 
Эти широкосимвольные библиотеки можно использовать как в многобайтовых, так и в традиционных 8-битных локалях, 
в то время как обычные библиотеки правильно работают только в 8-битных локалях. 
Библиотеки расширенных символов и обычные библиотеки совместимы с исходным кодом, но не совместимы с двоичным кодом.
--enable-pc-files
Этот переключатель создает и устанавливает файлы .pc для pkg-config.
--without-normal
Этот переключатель отключает сборку и установку большинства статических библиотек.

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

2. Установка и удаление бесполезного мусора
make DESTDIR=$PWD/dest install
install -vm755 dest/usr/lib/libncursesw.so.6.3 /usr/lib
rm -v  dest/usr/lib/{libncursesw.so.6.3,libncurses++w.a}
cp -av dest/* /


3. Многие приложения по-прежнему ожидают, что компоновщик сможет найти библиотеки Ncurses, не поддерживающие широкие символы. 
Заставьте такие приложения связываться с широкосимвольными библиотеками с помощью символических ссылок и скриптов компоновщика:
for lib in ncurses form panel menu ; do
    rm -vf                    /usr/lib/lib${lib}.so
    echo "INPUT(-l${lib}w)" > /usr/lib/lib${lib}.so
    ln -sfv ${lib}w.pc        /usr/lib/pkgconfig/${lib}.pc
done

4. Наконец, убедитесь, что старые приложения, которые ищут -lcurses во время сборки, по-прежнему доступны для сборки:
rm -vf                     /usr/lib/libcursesw.so
echo "INPUT(-lncursesw)" > /usr/lib/libcursesw.so
ln -sfv libncurses.so      /usr/lib/libcurses.so

5. Установите документацию Ncurses:
mkdir -pv      /usr/share/doc/ncurses-6.3
cp -v -R doc/* /usr/share/doc/ncurses-6.3

!!! 6. Приведенные выше инструкции не создают библиотеки Ncurses с неширокими символами, поскольку ни один пакет, установленный путем компиляции из исходного кода, 
не будет связан с ними во время выполнения. Тем не менее, единственные известные приложения только для двоичных файлов, которые связываются с библиотеками Ncurses, 
не поддерживающими широкие символы, требуют версии 5. Если вам нужны такие библиотеки из-за какого-либо приложения, 
предназначенного только для двоичных файлов, или для совместимости с LSB, снова соберите пакет со следующим команды:
make distclean
./configure --prefix=/usr    \
            --with-shared    \
            --without-normal \
            --without-debug  \
            --without-cxx-binding \
            --with-abi-version=5
make sources libs
cp -av lib/lib*.so.5* /usr/lib

7. Краткие описания
captoinfo  Преобразует описание termcap в описание terminfo
clear Очищает экран, если это возможно
infocmp Сравнивает или распечатывает описания терминов
infotocap Преобразует описание terminfo в описание termcap
ncursesw6-config Предоставляет информацию о конфигурации для ncurses
reset Повторно инициализирует терминал с его значениями по умолчанию.
tabs Очищает и устанавливает позиции табуляции на терминале
tic Компилятор описания записей terminfo, который переводит файл terminfo из исходного формата в двоичный формат, 
    необходимый для подпрограмм библиотеки ncurses [Файл terminfo содержит информацию о возможностях определенного терминала.]
toe Перечисляет все доступные типы терминалов, давая основное имя и описание для каждого.
tput Делает значения возможностей, зависящих от терминала, доступными для оболочки; его также можно использовать для сброса или инициализации терминала или сообщения его длинного имени.
tset Может использоваться для инициализации терминалов
libcursesw Ссылка на libncursesw
libncursesw Содержит функции для отображения текста многими сложными способами на экране терминала; 
            хорошим примером использования этих функций является меню, отображаемое во время make menuconfig ядра.
libformw  Содержит функции для реализации форм
libmenuw Содержит функции для реализации меню
libpanelw Содержит функции для реализации панелей

76. Sed-4.8

!!! Фильтрует и преобразует текстовые файлы за один проход
0. Подготовьте Sed для компиляции:
./configure --prefix=/usr

1. Скомпилируйте пакет и сгенерируйте HTML-документацию:
make
make html

2. Чтобы проверить результаты, введите:
chown -Rv tester .
su tester -c "PATH=$PATH make check"

3. Установите пакет и его документацию:
make install
install -d -m755           /usr/share/doc/sed-4.8
install -m644 doc/sed.html /usr/share/doc/sed-4.8

77. Psmisc-23.4

0. Подготовьте Psmisc к компиляции:
./configure --prefix=/usr

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

2. тесты
!!! Этот пакет не поставляется с набором тестов.

3. Установите пакет:
make install

4. Краткие описания
fuser Сообщает идентификаторы процессов (PID) процессов, которые используют данные файлы или файловые системы.
killall Убивает процессы по имени; он отправляет сигнал всем процессам, выполняющим любую из заданных команд
peekfd Просмотр файловых дескрипторов запущенного процесса с учетом его PID
prtstat Выводит информацию о процессе
pslog Сообщает текущий путь журналов процесса
pstree Отображает запущенные процессы в виде дерева
pstree.x11 То же , что и pstree , за исключением того, что он ожидает подтверждения перед выходом


78. Gettext-0.21

!!! Пакет Gettext содержит утилиты для интернационализации и локализации. 
!!! Это позволяет компилировать программы с помощью NLS (поддержка родного языка), что позволяет им выводить сообщения на родном языке пользователя.
0. Подготовьте Gettext для компиляции:
./configure --prefix=/usr    \
            --disable-static \
            --docdir=/usr/share/doc/gettext-0.21

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

2. Чтобы проверить результаты (это занимает много времени, около 3 SBU), введите:
make check

3. Установите пакет:
make install
chmod -v 0755 /usr/lib/preloadable_libintl.so

4. Содержимое Gettext
autopoint Копирует стандартные файлы инфраструктуры Gettext в исходный пакет.
envsubst  Заменяет переменные среды в строках формата оболочки
gettext   Переводит сообщение на естественном языке на язык пользователя, ища перевод в каталоге сообщений.
gettext.sh В основном служит библиотекой функций оболочки для gettext.
msgattrib  Копирует все стандартные файлы Gettext в указанный каталог верхнего уровня пакета, чтобы начать его интернационализацию.
msgcat Фильтрует сообщения каталога переводов в соответствии с их атрибутами и манипулирует атрибутами.
msgcat Объединяет и объединяет данные .poфайлы
msgcmp Сравнивает два .po файла, чтобы убедиться, что оба содержат одинаковый набор строк msgid.
msgcomm Находит сообщения, которые являются общими для заданных .poфайлов
msgconv Преобразует каталог переводов в другую кодировку символов
msgen Создает каталог переводов на английский язык
msgexec Применяет команду ко всем переводам каталога переводов
msgfilter Применяет фильтр ко всем переводам каталога переводов
msgfmt Генерирует двоичный каталог сообщений из каталога переводов.
msggrep Извлекает все сообщения из каталога переводов, которые соответствуют заданному шаблону или принадлежат некоторым заданным исходным файлам.
msgfmt  Создает новый .po файл, инициализируя метаинформацию значениями из среды пользователя.
msgmerge Объединяет два необработанных перевода в один файл
msgunfmt Декомпилирует двоичный каталог сообщений в необработанный текст перевода
msguniq Объединяет дубликаты переводов в каталоге переводов
ngettext Отображает перевод текстового сообщения на родной язык, грамматическая форма которого зависит от числа.
recode-sr-latin Перекодирует сербский текст с кириллицы на латиницу.
xgettext Извлекает переводимые строки сообщений из заданных исходных файлов для создания первого шаблона перевода.
libasprintf определяет класс autosprintf , который делает подпрограммы вывода в формате C пригодными 
            для использования в программах на C++ для использования со строками  и потоками 
libgettextlib частная библиотека, содержащая общие процедуры, используемые различными программами Gettext; они не предназначены для общего использования
libgettextpo Используется для написания специализированных программ, обрабатывающих .poфайлы; 
             эта библиотека используется, когда стандартных приложений, поставляемых с Gettext (таких как msgcomm , msgcmp , msgattrib и msgen ), недостаточно .
libgettextsrc Частная библиотека, содержащая общие процедуры, используемые различными программами Gettext; они не предназначены для общего использования
libtextstyle Библиотека стилей текста
preloadable_libintl Библиотека, предназначенная для использования LD_PRELOAD, которая помогает libintlрегистрировать непереведенные сообщения .

79. Bison-3.8.2

!!! Пакет Bison содержит генератор парсеров.
0. Подготовьте Bison для компиляции:
./configure --prefix=/usr --docdir=/usr/share/doc/bison-3.8.2

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

2. Для проверки результатов (около 5,5 SBU) выдайте:
make check

3. Установите пакет:
make install

4. Краткие описания
bison Генерирует из набора правил программу для анализа структуры текстовых файлов; Bison является заменой Yacc (Yet Another Compiler Compiler)
yacc Оболочка для bison , предназначенная для программ, которые до сих пор вызывают yacc вместо bison ; он вызывает bison с -y опцией
liby Библиотека Yacc, содержащая реализации Yacc-совместимых yyerror и main функций; эта библиотека обычно не очень полезна, но POSIX требует ее

79. Grep-3.7

!!!  8.33.
!!! https://www.linuxfromscratch.org/lfs/downloads/stable-systemd/LFS-BOOK-11.1-NOCHUNKS.html#ch-tools-binutils-pass1
!!! Пакет Grep содержит программы для поиска по содержимому файлов.
!!! egrep Выводит строки, соответствующие расширенному регулярному выражению
!!! fgrep Выводит строки, соответствующие списку фиксированных строк
!!! grep Выводит строки, соответствующие основному регулярному выражению


0. Подготовьте Grep к компиляции:
./configure --prefix=/usr

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

2. Чтобы проверить результаты, введите:
make check

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

80. (8.34.) Bash-5.1.16

!!! Пакет Bash содержит Bourne-Again SHell.
!!! bash Широко используемый интерпретатор команд; он выполняет множество типов расширений 
          и замен в заданной командной строке перед ее выполнением, что делает этот интерпретатор мощным инструментом.
!!! bashbug Сценарий оболочки, помогающий пользователю составлять и отправлять отчеты об ошибках в стандартном формате, касающиеся bash .
!!! sh Cимлинк на программу bash ; при вызове как sh bash пытается максимально точно имитировать поведение при запуске исторических версий sh , при этом также соответствуя стандарту POSIX.

0. Подготовьте Bash к компиляции:
./configure --prefix=/usr                      \
            --docdir=/usr/share/doc/bash-5.1.16 \
            --without-bash-malloc              \
            --with-installed-readline

Значение новой опции конфигурации:
--with-installed-readline
Этот параметр указывает Bash использовать readlineбиблиотеку, которая уже установлена ​​в системе, а не использовать собственную версию для чтения.

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

2. Тесты:
Перейдите к "3. Установить пакет" , если не запускаете набор тестов.
Чтобы подготовить тесты, убедитесь, что tester пользователь может писать в дерево исходников:
chown -Rv tester .
Набор тестов пакета предназначен для запуска пользователем без полномочий root, которому принадлежит терминал, подключенный к стандартному вводу. 
Чтобы выполнить требование, создайте новый псевдотерминал с помощью Expect и запустите тесты от имени tester пользователя:
su -s /usr/bin/expect tester << EOF
set timeout -1
spawn make tests
expect eof
lassign [wait] _ _ _ value
exit $value
EOF

3. Установите пакет:
make install

4. Запустите только что скомпилированную программу bash (заменив ту, которая выполняется в данный момент):
exec /usr/bin/bash --login

81. (8.35.) Libtool-2.4.6

!!! libtool Предоставляет общие услуги по поддержке создания библиотек.
!!! libtoolize Предоставляет стандартный способ добавления поддержки libtool в пакет.
!!! libltdl Скрывает различные трудности с раскрытием библиотек

0. Подготовьте Libtool к компиляции:
./configure --prefix=/usr

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

2. Чтобы проверить результаты, введите:
make check

!!! Примечание
!!! Время тестирования libtool может быть значительно сокращено в системе с несколькими ядрами. Для этого добавьте TESTSUITEFLAGS=-j к строке выше. 
!!! Например, использование -j4 может сократить время тестирования более чем на 60 процентов.
!!! Известно, что пять тестов в среде сборки LFS завершаются неудачно из-за круговой зависимости, но все тесты проходят успешно, если они повторно проверяются после установки automake.

3. Установите пакет:
make install

4. Удалите бесполезную статическую библиотеку:
rm -fv /usr/lib/libltdl.a


82. (8.36.1.) GDBM-1.23

!!! Пакет GDBM содержит менеджер баз данных GNU. 
!!! Это библиотека функций базы данных, использующая расширяемое хеширование и работающая аналогично стандартной базе данных UNIX. 
!!! Библиотека предоставляет примитивы для хранения пар ключ/данные, поиска и извлечения данных по его ключу и удаления ключа вместе с его данными.
!!! gdbm_dump Сбрасывает базу данных GDBM в файл
!!! gdbm_load Восстанавливает базу данных GDBM из файла дампа.
!!! gdbmtool Тестирует и модифицирует базу данных GDBM
!!! libgdbm Содержит функции для управления хешированной базой данных.
!!! libgdbm_compat Библиотека совместимости, содержащая старые функции DBM.

0. Подготовьте GDBM к компиляции:
./configure --prefix=/usr    \
            --disable-static \
            --enable-libgdbm-compat

Значение опции конфигурации:
--enable-libgdbm-compat
Этот переключатель включает сборку библиотеки совместимости libgdbm. 
Некоторым пакетам за пределами LFS могут потребоваться более старые подпрограммы DBM, которые он предоставляет.

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

2. Чтобы проверить результаты, введите:
make check

3. Установите пакет:
make install

83. (8.37.) Gperf-3.1

!!! gperf Генерирует идеальный хэш из набора ключей

0. Подготовьте Gperf к компиляции:
./configure --prefix=/usr --docdir=/usr/share/doc/gperf-3.1

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

2. Известно, что тесты завершаются сбоем при выполнении нескольких одновременных тестов (параметр -j больше 1). 
Чтобы проверить результаты, введите:
make -j1 check

3. Установите пакет:
make install

84. (8.38.) Expat-2.4.6

!!! xmlwf Является непроверяющей утилитой для проверки правильности формата XML-документов.
!!! libexpat Содержит функции API для разбора XML

0. Подготовьте Expat для компиляции:
./configure --prefix=/usr    \
            --disable-static \
            --docdir=/usr/share/doc/expat-2.4.6

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

2. Чтобы проверить результаты, введите:
make check

3. Установите пакет:
make install

4. При желании установите документацию:
install -v -m644 doc/*.{html,css} /usr/share/doc/expat-2.4.6

85. (8.39.1) Inetutils-2.2

!!! Пакет Inetutils содержит программы для базовой работы в сети.
!!! dnsdomainname Показать доменное имя DNS системы
!!! ftp Является ли программа протокола передачи файлов
!!! hostname Сообщает или устанавливает имя хоста
!!! ifconfig Управляет сетевыми интерфейсами
!!! ping Отправляет пакеты эхо-запросов и сообщает, сколько времени занимают ответы
!!! ping6 Версия ping для сетей IPv6
!!! talk Используется для общения с другим пользователем
!!! telnet Интерфейс к протоколу TELNET
!!! tftp Тривиальная программа для передачи файлов
!!! traceroute Отслеживает маршрут, по которому проходят ваши пакеты от узла, над которым вы работаете, к другому узлу в сети, показывая все промежуточные переходы (шлюзы) на этом пути.


0. Подготовьте Inetutils к компиляции:
./configure --prefix=/usr        \
            --bindir=/usr/bin    \
            --localstatedir=/var \
            --disable-logger     \
            --disable-whois      \
            --disable-rcp        \
            --disable-rexec      \
            --disable-rlogin     \
            --disable-rsh        \
            --disable-servers


1. Значение параметров настройки:
--disable-logger
Этот параметр запрещает Inetutils устанавливать программу регистрации , которая используется сценариями для передачи сообщений демону системного журнала. 
Не устанавливайте его, потому что Util-linux устанавливает более новую версию.
--disable-whois
Этот параметр отключает сборку whois - клиента Inetutils, который устарел. Инструкции для лучшего клиента whois находятся в книге BLFS.
--disable-r*
Эти параметры отключают создание устаревших программ, которые не следует использовать из-за проблем с безопасностью. 
Функции, предоставляемые этими программами, могут быть предоставлены пакетом openssh в книге BLFS.
--disable-servers
Это отключает установку различных сетевых серверов, входящих в состав пакета Inetutils. 
Эти серверы считаются неподходящими для базовой системы LFS. 
Некоторые из них небезопасны по своей природе и считаются безопасными только в доверенных сетях. 
Обратите внимание, что для многих из этих серверов доступны лучшие замены.

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

3. Чтобы проверить результаты, введите:
make check

4. Установите пакет:
make install

5. Переместите программу в нужное место:
mv -v /usr/{,s}bin/ifconfig


86. (8.40.) Less-590

!!! Пакет Less содержит средство просмотра текстовых файлов.
!!! less просмотрщик файлов или пейджер; он отображает содержимое данного файла, позволяя пользователю прокручивать, находить строки и переходить к меткам
!!! lessecho Необходимо расширить метасимволы, такие как * и ? , в именах файлов в системах Unix
!!! Используется для указания привязки клавиш для less
0. Подготовить Less к компиляции:
./configure --prefix=/usr --sysconfdir=/etc

Значение параметров настройки:
--sysconfdir=/etc
Эта опция указывает программам, созданным пакетом, искать в /etc файлы конфигурации.

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

2. Этот пакет не поставляется с набором тестов.

3. Установите пакет:
make install

87. (8.41.) Perl-5.34.0

0. Во-первых, примените патч, устраняющий проблему, обнаруженную в последних версиях gdbm:
patch -Np1 -i ../perl-5.34.0-upstream_fixes-1.patch

1. Эта версия Perl теперь создает модули Compress::Raw::Zlib и Compress::Raw::BZip2. 
По умолчанию Perl будет использовать внутреннюю копию исходников для сборки. 
Введите следующую команду, чтобы Perl использовал библиотеки, установленные в системе:
export BUILD_ZLIB=False
export BUILD_BZIP2=0

2. Чтобы иметь полный контроль над тем, как настроен Perl, вы можете удалить опции « -des » из следующей команды и вручную выбрать способ сборки этого пакета. 
В качестве альтернативы используйте команду точно так же, как показано ниже, чтобы использовать значения по умолчанию, которые Perl автоматически определяет:
sh Configure -des                                         \
             -Dprefix=/usr                                \
             -Dvendorprefix=/usr                          \
             -Dprivlib=/usr/lib/perl5/5.34/core_perl      \
             -Darchlib=/usr/lib/perl5/5.34/core_perl      \
             -Dsitelib=/usr/lib/perl5/5.34/site_perl      \
             -Dsitearch=/usr/lib/perl5/5.34/site_perl     \
             -Dvendorlib=/usr/lib/perl5/5.34/vendor_perl  \
             -Dvendorarch=/usr/lib/perl5/5.34/vendor_perl \
             -Dman1dir=/usr/share/man/man1                \
             -Dman3dir=/usr/share/man/man3                \
             -Dpager="/usr/bin/less -isR"                 \
             -Duseshrplib                                 \
             -Dusethreads

Значение параметров настройки:
-Dvendorprefix=/usr
Это гарантирует , что Perl знает, как сообщить пакетам, где они должны устанавливать свои модули Perl.
-Dpager="/usr/bin/less -isR"
Это гарантирует, что lessвместо more.
-Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3
Поскольку Groff еще не установлен, Configure считает, что man-страницы для Perl нам не нужны. Выдача этих параметров отменяет это решение.
-Duseshrplib
Создайте общую библиотеку libperl, необходимую для некоторых модулей Perl.
-Dusethreads
Создайте Perl с поддержкой потоков.
-Dprivlib,-Darchlib,-Dsitelib,...
Эти настройки определяют, где Perl ищет установленные модули. Редакторы LFS решили поместить их в структуру каталогов, основанную на версии Perl Major.Minor (5.34), 
что позволяет обновлять Perl до более новых уровней исправлений (5.34.0) без необходимости повторной переустановки всех модулей.

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

4. Для проверки результатов (примерно 11 SBU) выдайте:
make test

5. Установите пакет и очистите:
make install
unset BUILD_ZLIB BUILD_BZIP2

6. В пакет входит:
corelist Интерфейс командной строки для Module::CoreList
cpan Взаимодействие с комплексной сетью архивов Perl (CPAN) из командной строки
enc2xs Создает расширение Perl для модуля Encode либо из сопоставлений символов Unicode, либо из файлов кодирования Tcl.
encguess Угадайте тип кодировки одного или нескольких файлов
h2ph Преобразует .hзаголовочные файлы C в заголовочные файлы .phPerl
h2xs Преобразует .hзаголовочные файлы C в расширения Perl
instmodsh Сценарий оболочки для проверки установленных модулей Perl и создания архива из установленного модуля.
json_pp Преобразует данные между определенными входными и выходными форматами
libnetcfg Может использоваться для настройки libnetмодуля Perl
perl Объединяет некоторые из лучших функций C, sed , awk и sh в единый язык швейцарской армии.
perl5.34.0 Жесткая ссылка на perl
perlbug Используется для создания отчетов об ошибках Perl или модулей, которые поставляются с ним, и отправки их по почте.
perldoc Отображает часть документации в формате pod, которая встроена в дерево установки Perl или в сценарий Perl.
perlivp Процедура проверки установки Perl; его можно использовать для проверки правильности установки Perl и его библиотек.
perlthanks Используется для создания благодарственных сообщений для отправки по почте разработчикам Perl.
piconv Perl-версия конвертера кодировки символов iconv
pl2pm Грубый инструмент для преобразования файлов Perl4 в модули .plPerl5 ..pm
pod2html Преобразует файлы из формата pod в формат HTML.
pod2man Преобразует данные модуля в форматированный ввод *roff.
pod2html Преобразует данные модуля в форматированный текст ASCII.
pod2usage Печатает сообщения об использовании из встроенных документов pod в файлы
podchecker Проверяет синтаксис файлов документации формата pod.
podselect Отображает выбранные разделы документации модуля
prove Инструмент командной строки для запуска тестов с модулем Test::Harness.
ptar - tar - подобная программа, написанная на Perl
ptardiff Программа Perl, сравнивающая извлеченный архив с нераспакованным.
ptargrep Программа Perl, которая применяет сопоставление с образцом к содержимому файлов в tar-архиве.
shasum Печатает или проверяет контрольные суммы SHA
splain Используется для принудительной диагностики подробного предупреждения в Perl.
xsubpp Преобразует код Perl XS в код C
zipdetails  Отображает сведения о внутренней структуре Zip-файла.

88. (8.42.) XML::Parser-2.46

!!! Expat предоставляет интерфейс Perl Expat
!!! Модуль XML::Parser представляет собой Perl-интерфейс к XML-парсеру Джеймса Кларка Expat. 
0. Подготовьте XML::Parser к компиляции:
perl Makefile.PL

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

2. Чтобы проверить результаты, введите:
make test

3.  Установите пакет:
make install


89. (8.43.) Intltool-0.51.0

!!! ntltool — это инструмент интернационализации, используемый для извлечения переводимых строк из исходных файлов. 
!!! intltoolize  Подготавливает пакет для использования intltool
!!! intltool-extract Генерирует файлы заголовков, которые могут быть прочитаны gettext
!!! intltool-merge Объединяет переведенные строки в различные типы файлов
!!! intltool-prepare Обновляет файлы pot и объединяет их с файлами перевода
!!! intltool-update Обновляет файлы шаблонов po и объединяет их с переводами

0. Сначала исправьте предупреждение, вызванное perl-5.22 и более поздними версиями:
sed -i 's:\\\${:\\\$\\{:' intltool-update.in

!!! Примечание
!!! Приведенное выше регулярное выражение выглядит необычно из-за всех обратных косых черт. Что он делает, 
!!! так это добавляет обратную косую черту перед правой фигурной скобкой в ​​последовательности '\${', что приводит к '\$\{'.

1. Подготовьте Intltool к компиляции:
./configure --prefix=/usr

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

3. Чтобы проверить результаты, введите:
make check

4. Установите пакет:
make install
install -v -Dm644 doc/I18N-HOWTO /usr/share/doc/intltool-0.51.0/I18N-HOWTO

90. (8.44.) Autoconf-2.71

!!! Пакет Autoconf содержит программы для создания сценариев оболочки, которые могут автоматически конфигурировать исходный код.
0. Подготовьте Autoconf к компиляции:
./configure --prefix=/usr

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

2. Чтобы проверить результаты, введите:
make check

!!! Примечание
!!! Время тестирования autoconf может быть значительно сокращено в системе с несколькими ядрами. 
!!! Для этого добавьте TESTSUITEFLAGS=-j к строке выше. Например, использование -j4 может сократить время тестирования более чем на 60 процентов.

3. Установите пакет:
make install

4. Пакет содержит:
autoconf Создает сценарии оболочки, которые автоматически настраивают пакеты исходного кода программного обеспечения для адаптации ко многим видам Unix-подобных систем; 
         создаваемые им сценарии конфигурации независимы — для их запуска не требуется программа autoconf
autoheader Инструмент для создания файлов шаблонов операторов C #define для использования в configure
autom4te  обертка для макропроцессора M4
autoreconf Автоматически запускает autoconf , autoheader , aclocal , automake , gettextize и libtoolize в правильном порядке, 
           чтобы сэкономить время при внесении изменений в файлы шаблонов autoconf и automake .
autoscan Помогает создать configure.inфайл для программного пакета; он проверяет исходные файлы в дереве каталогов, 
         ищет в них распространенные проблемы с переносимостью и создает configure.scanфайл, который служит предварительным configure.inфайлом для пакета.
autoupdate Изменяет configure.in файл, который по-прежнему вызывает макросы autoconf по их старым именам, чтобы использовать текущие имена макросов.
ifnames Помогает при записи configure.inфайлов для программного пакета; она выводит идентификаторы, которые пакет использует в условных выражениях препроцессора C. 
        [Если пакет уже настроен для некоторой переносимости, эта программа может помочь определить, что нужно проверить configure. 
        Он также может заполнять пробелы в configure.in файле, сгенерированном autoscan.]

91. (8.45.) Automake-1.16.5

!!! Пакет Automake содержит программы для создания файлов Makefile для использования с Autoconf.
!!! aclocal Генерирует aclocal.m4 файлы на основе содержимого configure.inфайлов
!!! aclocal-1.16 Жесткая ссылка на aclocal
!!! automake Инструмент для автоматического создания Makefile.inфайлов из Makefile.amфайлов [Чтобы создать все Makefile.in
             файлы для пакета, запустите эту программу в каталоге верхнего уровня. Сканируя configure.inфайл, он автоматически находит 
             каждый подходящий Makefile.amфайл и создает соответствующий Makefile.inфайл.]
!!! automake-1.16 Жесткая ссылка на automake

0. Подготовьте Automake к компиляции:
./configure --prefix=/usr --docdir=/usr/share/doc/automake-1.16.5

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

2. Тесты. Использование параметра make -j4 ускоряет тесты даже на системах с одним процессором из-за внутренних задержек в отдельных тестах. 
Чтобы проверить результаты, введите:
make -j4 check

Известно, что тест t/subobj.sh не прошел.

3. Установите пакет:
make install


92. (8.46.) OpenSSL-3.0.1

!!! Пакет OpenSSL содержит инструменты управления и библиотеки, относящиеся к криптографии.
!!! Они полезны для предоставления криптографических функций другим пакетам, таким как OpenSSH, приложениям электронной почты и веб-браузерам (для доступа к сайтам HTTPS).
0. Подготовьте OpenSSL к компиляции:
./config --prefix=/usr         \
         --openssldir=/etc/ssl \
         --libdir=lib          \
         shared                \
         zlib-dynamic

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

2 Тесты. Чтобы проверить результаты, введите:
make test

!!! Известно, что один тест, 30-test_afalg.t, дает сбой в некоторых конфигурациях ядра (в зависимости от несовместимых значений параметров CONFIG_CRYPTO_USER_API*). 
!!! Если он не пройден, его можно смело игнорировать.

3. Установите пакет:
sed -i '/INSTALL_LIBS/s/libcrypto.a libssl.a//' Makefile
make MANSUFFIX=ssl install

4. Добавьте версию к имени каталога документации, чтобы она соответствовала другим пакетам:
mv -v /usr/share/doc/openssl /usr/share/doc/openssl-3.0.1

5. При желании установите дополнительную документацию:
mkdir -p /usr/share/doc/openssl-3.0.1
cp -vfr doc/* /usr/share/doc/openssl-3.0.1

!!! Примечание
!!! Вы должны обновлять OpenSSL, когда объявляется новая версия, исправляющая уязвимости. 
!!! Релизы выпускаются последовательно, с буквой для каждого выпуска после первоначального выпуска (например, 1.1.1, 1.1.1a, 1.1.1b и т. д.). 
!!! Поскольку LFS устанавливает только общие библиотеки, нет необходимости перекомпилировать пакеты, которые ссылаются на libcrypto.soили libssl.so при обновлении той же серии.
!!! Однако любые запущенные программы, связанные с этими библиотеками, необходимо остановить и перезапустить. 

!!! c_rehash это Perl - скрипт, который сканирует все файлы в каталоге и добавляет символические ссылки к их хеш-значениям.
!!! openssl — это инструмент командной строки для использования различных криптографических функций криптографической библиотеки OpenSSL из оболочки. 
    Его можно использовать для различных функций, которые задокументированы в man 1 openssl.
!!! libcrypto.so реализует широкий спектр криптографических алгоритмов, используемых в различных интернет-стандартах. 
     Услуги, предоставляемые этой библиотекой, используются реализациями OpenSSL SSL, TLS и S/MIME, а также они использовались для реализации OpenSSH , 
     OpenPGP и других криптографических стандартов.
!!!  libssl.so реализует протокол безопасности транспортного уровня (TLS v1). 
     Он предоставляет богатый API, документацию по которому можно найти, запустив man 3 ssl .


93. (8.47.) Kmod-29

!!! Пакет Kmod содержит библиотеки и утилиты для загрузки модулей ядра.
!!! depmod Создает файл зависимостей на основе символов, которые он находит в существующем наборе модулей; 
    этот файл зависимостей используется modprobe для автоматической загрузки необходимых модулей
!!! insmod Устанавливает загружаемый модуль в работающее ядро
!!! kmod Загружает и выгружает модули ядра
!!! lsmod Список загруженных модулей
!!! modinfo Исследует объектный файл, связанный с модулем ядра, и отображает всю информацию, которую он может собрать.
!!! modprobe Использует файл зависимостей, созданный depmod , для автоматической загрузки соответствующих модулей.
!!! rmmod Выгружает модули из работающего ядра
!!! libkmod Эта библиотека используется другими программами для загрузки и выгрузки модулей ядра.

0. Подготовьте Kmod для компиляции:
./configure --prefix=/usr          \
            --sysconfdir=/etc      \
            --with-openssl         \
            --with-xz              \
            --with-zstd            \
            --with-zlib

Значение параметров настройки:
--with-openssl
Эта опция позволяет Kmod обрабатывать подписи PKCS7 для модулей ядра.
--with-xz, --with-zlib, и--with-zstd
Эти параметры позволяют Kmod обрабатывать сжатые модули ядра.

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

2. Тесты:
Для набора тестов этого пакета требуются необработанные заголовки ядра (а не « продезинфицированные » заголовки ядра, установленные ранее), которые выходят за рамки LFS.

3. Установите пакет и создайте символические ссылки для совместимости с Module-Init-Tools (пакет, который ранее обрабатывал модули ядра Linux):
make install
for target in depmod insmod modinfo modprobe rmmod; do
  ln -sfv ../bin/kmod /usr/sbin/$target
done
ln -sfv kmod /usr/bin/lsmod

94. (8.48.1) Libelf from Elfutils-0.186

!!! Libelf — это библиотека для обработки файлов ELF (Executable and Linkable Format).
!!! libelf Содержит функции API для обработки объектных файлов ELF.

0. Подготовьте Libelf к компиляции:
./configure --prefix=/usr                \
            --disable-debuginfod         \
            --enable-libdebuginfod=dummy

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

2. Тесты:
Чтобы проверить результаты, введите:
make check

3. Установить только Libelf:
make -C libelf install
install -vm644 config/libelf.pc /usr/lib/pkgconfig
rm /usr/lib/libelf.a


95. (8.49.) Libffi-3.4.2

!!! libffi содержит API-функции внешнего интерфейса функций
!!! Примечание
!!! Подобно GMP, libffi строится с оптимизацией, специфичной для используемого процессора. 
!!! При сборке для другой системы экспортируйте CFLAGS и CXXFLAGS, чтобы указать общую сборку для вашей архитектуры. 
!!! Если этого не сделать, все приложения, ссылающиеся на libffi, будут вызывать ошибки недопустимых операций.

0. Подготовьте libffi к компиляции:
./configure --prefix=/usr          \
            --disable-static       \
            --with-gcc-arch=native \
            --disable-exec-static-tramp

Значение опции конфигурации:
--with-gcc-arch=native
Убедитесь, что GCC оптимизируется для текущей системы. Если это не указано, система угадывается, и сгенерированный код может быть неправильным для некоторых систем. 
Если сгенерированный код будет скопирован из собственной системы в систему с меньшими возможностями, используйте менее эффективную систему в качестве параметра. 
Подробнее об альтернативных типах систем см. опции x86 в руководстве по GCC .
--disable-exec-static-tramp
Отключите статическую поддержку батута. 
Это новая функция безопасности в libffi, но некоторые пакеты BLFS (особенно GJS и gobject-introspection ) не адаптированы для нее.

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

2. Тест. Чтобы проверить результаты, введите:
make check

3. Установите пакет:
make install


96. (8.50.) Python-3.10.2

!!! 2to3 это программа Python , которая читает исходный код Python 2.x и применяет ряд исправлений для преобразования его в действительный код Python 3.x.
!!! idle3 — это скрипт-оболочка, который открывает редактор графического интерфейса с поддержкой Python. 
            Для запуска этого скрипта вы должны установить Tk перед Python, чтобы модуль Tkinter Python был собран.
!!! pip3 Установщик пакетов для Python. 
         Вы можете использовать pip для установки пакетов из индекса пакетов Python и других индексов.
!!! pydoc3 это инструмент документации Python
!!! python3 интерпретируемый, интерактивный, объектно-ориентированный язык программирования

0. Подготовьте Python к компиляции:
./configure --prefix=/usr        \
            --enable-shared      \
            --with-system-expat  \
            --with-system-ffi    \
            --with-ensurepip=yes \
            --enable-optimizations

Значение параметров настройки:
--with-system-expat
Этот переключатель включает привязку к системной версии Expat .
--with-system-ffi
Этот переключатель включает линковку с системной версией libffi .
--with-ensurepip=yes
Этот переключатель позволяет создавать программы упаковки pip и setuptools .
--enable-optimizations
Этот переключатель обеспечивает стабильную, но дорогостоящую оптимизацию.

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

2. Запускать тесты на этом этапе не рекомендуется. Известно, что тесты зависают на неопределенный срок в частичной среде LFS. 
При желании тесты можно запустить повторно в конце этой главы или при переустановке Python 3 в BLFS. 
Чтобы запустить тесты в любом случае, введите команду make test .

3. Установите пакет:
make install

4. При желании установите предварительно отформатированную документацию:
install -v -dm755 /usr/share/doc/python-3.10.2/html
tar --strip-components=1  \
    --no-same-owner       \
    --no-same-permissions \
    -C /usr/share/doc/python-3.10.2/html \
    -xvf ../python-3.10.2-docs-html.tar.bz2

Значение команд установки документации:
--no-same-ownerа также--no-same-permissions
Убедитесь, что установленные файлы имеют правильную собственность и разрешения. 
Без этих опций использование tar установит файлы пакета со значениями вышестоящего создателя.

97. (8.51.) Ninja-1.10.2

!!! Ninja — это небольшая система сборки с упором на скорость.
0. Использование приведенной ниже дополнительной процедуры позволяет пользователю ограничить количество параллельных процессов с помощью переменной среды NINJAJOBS.
export NINJAJOBS=4

1. При желании добавьте возможность использовать переменную среды NINJAJOBS, запустив:
sed -i '/int Guess/a \
  int   j = 0;\
  char* jobs = getenv( "NINJAJOBS" );\
  if ( jobs != NULL ) j = atoi( jobs );\
  if ( j > 0 ) return j;\
' src/ninja.cc

2. Создайте ниндзя с помощью:
python3 configure.py --bootstrap

Смысл варианта сборки:
--bootstrap
Этот параметр заставляет ниндзя перестраиваться под текущую систему.

3. Чтобы проверить результаты, введите:
./ninja ninja_test
./ninja_test --gtest_filter=-SubprocessTest.SetWithLots

4. Установите пакет:
install -vm755 ninja /usr/bin/
install -vDm644 misc/bash-completion /usr/share/bash-completion/completions/ninja
install -vDm644 misc/zsh-completion  /usr/share/zsh/site-functions/_ninja

98. (8.52.) Meson-0.61.1

!!! Meson — это система сборки с открытым исходным кодом, которая должна быть чрезвычайно быстрой и максимально удобной для пользователя.

0. Скомпилируйте Meson с помощью следующей команды:
python3 setup.py build

1. Тесты.
Этот пакет не поставляется с набором тестов.

2. Установите пакет:
python3 setup.py install --root=dest
cp -rv dest/* /
install -vDm644 data/shell-completions/bash/meson /usr/share/bash-completion/completions/meson
install -vDm644 data/shell-completions/zsh/_meson /usr/share/zsh/site-functions/_meson

Значение параметров установки:
--root=dest
По умолчанию python3 setup.py install устанавливает различные файлы (например, справочные страницы) в яйца Python. 
С указанным корневым расположением setup.py устанавливает эти файлы в стандартную иерархию. Затем иерархию можно просто скопировать в стандартное расположение.


99. (8.53.) Coreutils-9.0

!!! Пакет Coreutils содержит утилиты для отображения и настройки основных характеристик системы.

0. POSIX требует, чтобы программы из Coreutils правильно распознавали границы символов даже в многобайтовых локалях. 
   Следующий патч исправляет это несоответствие и другие ошибки, связанные с интернационализацией.
patch -Np1 -i ../coreutils-9.0-i18n-1.patch

!!! Примечание
!!! В прошлом в этом патче было обнаружено много ошибок. 
!!! Сообщая о новых ошибках сопровождающим Coreutils, сначала проверьте, воспроизводятся ли они без этого исправления.

1. Теперь исправьте проблему с возвращаемыми значениями chmod:
patch -Np1 -i ../coreutils-9.0-chmod_fix-1.patch

2. Теперь подготовьте Coreutils к компиляции:
autoreconf -fiv
FORCE_UNSAFE_CONFIGURE=1 ./configure \
            --prefix=/usr            \
            --enable-no-install-program=kill,uptime

Значение параметров настройки:
autoreconf Патч для интернационализации изменил систему сборки пакета, поэтому файлы конфигурации необходимо сгенерировать заново.
FORCE_UNSAFE_CONFIGURE=1
Эта переменная среды позволяет создавать пакет от имени rootпользователя.
--enable-no-install-program=kill,uptime
Цель этого переключателя — запретить Coreutils устанавливать двоичные файлы, которые позже будут установлены другими пакетами.

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

4. Тесты. Перейдите к «Установить пакет» , если не запускаете набор тестов.
Теперь набор тестов готов к запуску. Сначала запустите тесты, предназначенные для запуска пользователем root:
make NON_ROOT_USERNAME=tester check-root
Мы собираемся запустить оставшуюся часть тестов от имени testerпользователя. 
Некоторые тесты требуют, чтобы пользователь был членом более чем одной группы. 
Чтобы эти тесты не пропустить, добавим временную группу и сделаем пользователя testerее частью:
echo "dummy:x:102:tester" >> /etc/group

Исправьте некоторые разрешения, чтобы пользователь без полномочий root мог компилировать и запускать тесты:
chown -Rv tester . 

Теперь запустите тесты:
su tester -c "PATH=$PATH make RUN_EXPENSIVE_TESTS=yes check"
Известно, что тест test-getlogin не работает в среде chroot LFS.

Удалить временную группу:
sed -i '/dummy/d' /etc/group
Установите пакет:

5. Установка пакета 
make install
Переместите программы в места, указанные FHS:
mv -v /usr/bin/chroot /usr/sbin
mv -v /usr/share/man/man1/chroot.1 /usr/share/man/man8/chroot.8
sed -i 's/"1"/"8"/' /usr/share/man/man8/chroot.8


6. Что входит в пакет:
[ Реальная команда /usr/bin/[, которая является синонимом тестовой команды .
base32 Кодирует и декодирует данные в соответствии со спецификацией base32 (RFC 4648).
base64 Кодирует и декодирует данные в соответствии со спецификацией base64 (RFC 4648).
b2sum Печатает или проверяет контрольные суммы BLAKE2 (512 бит)
basename Удаляет любой путь и данный суффикс из имени файла
basenc Кодирует или декодирует данные с использованием различных алгоритмов
cat Объединяет файлы в стандартный вывод
chcon Изменяет контекст безопасности для файлов и каталогов
chgrp Изменяет групповое владение файлами и каталогами
chmod Изменяет разрешения каждого файла на заданный режим; режим может быть либо символическим представлением вносимых изменений, либо восьмеричным числом, представляющим новые разрешения.
chown Изменяет права пользователя и/или группы на файлы и каталоги.
chroot Запускает команду с указанным каталогом в качестве /каталога
cksum Выводит контрольную сумму Cyclic Redundancy Check (CRC) и количество байтов для каждого указанного файла.
comm Сравнивает два отсортированных файла, выводя в три столбца уникальные и общие строки.
ср Копирует файлы
csplit Разбивает заданный файл на несколько новых файлов, разделяя их в соответствии с заданными шаблонами или номерами строк и выводя количество байтов для каждого нового файла.
cut Печатает участки строк, выбирая части в соответствии с заданными полями или позициями
date Отображает текущее время в заданном формате или устанавливает системную дату
dd Копирует файл, используя заданный размер блока и количество, при необходимости выполняя преобразования на нем.
df Сообщает объем доступного (и используемого) дискового пространства во всех смонтированных файловых системах или только в файловых системах, содержащих выбранные файлы.
dir Выводит содержимое каждого заданного каталога (так же, как команда ls )
dircolors Выводит команды для установки LS_COLOR переменной среды для изменения цветовой схемы, используемой ls
dirname Удаляет суффикс, не относящийся к каталогу, из имени файла.
du Сообщает объем дискового пространства, используемого текущим каталогом, каждым из заданных каталогов (включая все подкаталоги) или каждым из заданных файлов.
echo Отображает заданные строки
env Запускает команду в измененной среде
expand Преобразует вкладки в пробелы
expr Оценивает выражения
factor Выводит простые множители всех указанных целых чисел
false Ничего не делает, безуспешно; он всегда завершается с кодом состояния, указывающим на сбой
fmt Переформатирует абзацы в указанных файлах
fold Переносит строки в заданных файлах
groups Сообщает о членстве пользователя в группе
head Печатает первые десять строк (или заданное количество строк) каждого заданного файла.
hostid Сообщает числовой идентификатор (в шестнадцатеричном формате) хоста
id Сообщает эффективный идентификатор пользователя, идентификатор группы и членство в группах текущего пользователя или указанного пользователя.
install Копирует файлы, задавая их режимы разрешений и, если возможно, их владельца и группу
join Соединяет строки с одинаковыми полями соединения из двух отдельных файлов.
link Создает жесткую ссылку с заданным именем на файл
ln Делает жесткие ссылки или мягкие (символические) ссылки между файлами
logname Сообщает имя входа текущего пользователя
ls Перечисляет содержимое каждого заданного каталога
md5sum Сообщает или проверяет контрольные суммы Message Digest 5 (MD5)
mkdir Создает каталоги с заданными именами
mkfifo Создает «первым пришел — первым ушел» (FIFO), «именованный канал» на языке UNIX с заданными именами.
mknod Создает узлы устройств с заданными именами; узел устройства представляет собой специальный символьный файл, специальный файл блока или FIFO.
mktemp Безопасно создает временные файлы; он используется в сценариях
mv Перемещает или переименовывает файлы или каталоги
nice Запускает программу с измененным приоритетом планирования
nl Нумерует строки из заданных файлов
nohup Выполняет команду, защищенную от зависаний, с перенаправлением ее вывода в файл журнала.
nproc Выводит количество процессорных единиц, доступных для процесса.
numfmt Преобразует числа в или из удобочитаемых строк
od Создает дамп файлов в восьмеричном и других форматах
paste Объединяет данные файлы, последовательно соединяя соответствующие строки рядом друг с другом, разделенные символами табуляции.
pathchk Проверяет, являются ли имена файлов допустимыми или переносимыми
pinky Легкий клиент для пальцев; он сообщает некоторую информацию о данных пользователях
pr Разбивает файлы на страницы и столбцы для печати
printenv Печатает среду
printf Выводит заданные аргументы в соответствии с заданным форматом, подобно функции C printf.
ptx Создает переставленный индекс из содержимого заданных файлов с каждым ключевым словом в своем контексте.
pwd Сообщает имя текущего рабочего каталога
readlink Сообщает значение данной символической ссылки
realpath Печатает разрешенный путь
rm Удаляет файлы или каталоги
rmdir Удаляет каталоги, если они пусты
runcon Запускает команду с указанным контекстом безопасности
seq Выводит последовательность чисел в заданном диапазоне и с заданным приращением
sha1sum Печатает или проверяет контрольные суммы 160-битного алгоритма безопасного хеширования 1 (SHA1)
sha224sum Печатает или проверяет контрольные суммы 224-битного алгоритма безопасного хеширования.
sha256sum Печатает или проверяет контрольные суммы 256-битного алгоритма безопасного хеширования.
sha384sum Печатает или проверяет контрольные суммы 384-битного алгоритма безопасного хеширования
sha512sum Печатает или проверяет контрольные суммы 512-битного алгоритма безопасного хеширования
shred Многократно перезаписывает заданные файлы сложными шаблонами, что затрудняет восстановление данных.
shuf Перемешивает строки текста
sleep Паузы на заданное время
sort Сортирует строки из заданных файлов
split Разбивает данный файл на части, по размеру или по количеству строк
stat Отображает статус файла или файловой системы
stdbuf Запускает команды с измененными операциями буферизации для своих стандартных потоков.
stty Устанавливает или сообщает настройки линии терминала
sum Выводит контрольную сумму и количество блоков для каждого заданного файла
sync Сбрасывает буферы файловой системы; он принудительно записывает измененные блоки на диск и обновляет суперблок
tac Объединяет данные файлы в обратном порядке
tail Печатает последние десять строк (или заданное количество строк) каждого заданного файла.
tee Читает со стандартного ввода при записи как на стандартный вывод, так и в заданные файлы
test Сравнивает значения и проверяет типы файлов
timeout Запускает команду с ограничением по времени
touch Изменяет временные метки файлов, устанавливая время доступа и модификации данных файлов на текущее время; несуществующие файлы создаются с нулевой длиной
tr Переводит, сжимает и удаляет заданные символы из стандартного ввода
true Ничего не делает, успешно; он всегда завершается с кодом состояния, указывающим на успех
truncate Сжимает или расширяет файл до указанного размера
tsort Выполняет топологическую сортировку; он записывает полностью упорядоченный список в соответствии с частичным порядком в данном файле
tty Сообщает имя файла терминала, подключенного к стандартному вводу.
uname Сообщает системную информацию
unexpand Преобразует пробелы в табуляции
uniq Отбрасывает все, кроме одной из последовательных идентичных строк
unlink Удаляет указанный файл
users Сообщает имена пользователей, которые в данный момент вошли в систему
vdir То же, что ls -l
wc Сообщает количество строк, слов и байтов для каждого заданного файла, а также общую строку, если задано более одного файла.
who Сообщает, кто вошел в систему
whoami Сообщает имя пользователя, связанное с текущим эффективным идентификатором пользователя.
yes Повторно выводит « y » или заданную строку, пока не будет уничтожен
libstdbuf Библиотека, используемая stdbuf

100. (8.54.) Check-0.15.2

!!! Check — это фреймворк модульного тестирования для C. 
!!! checkmk Сценарий Awk для создания модульных тестов C для использования с платформой модульного тестирования Check.
!!! libcheck.{a,so} Содержит функции, позволяющие вызывать Check из тестовой программы.

0. Подготовить чек к компиляции:
./configure --prefix=/usr --disable-static

1. Соберите пакет:
make

2. Компиляция завершена. Чтобы запустить набор тестов Check, введите следующую команду:
make check

3. Установите пакет:
make docdir=/usr/share/doc/check-0.15.2 install


101. (8.55.) Diffutils-3.8

cmp Сравнивает два файла и сообщает, различаются ли они и в каких байтах
diff Сравнивает два файла или каталога и сообщает, какие строки в файлах отличаются
diff3 Сравнивает три файла построчно
sdiff Объединяет два файла и интерактивно выводит результаты
!!! Пакет Diffutils содержит программы, которые показывают различия между файлами или каталогами.

0. Подготовьте Diffutils для компиляции:
./configure --prefix=/usr

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

2. Чтобы проверить результаты, введите:
make check

3. Установите пакет:
make install

102. (8.56.) Gawk-5.1.1

awk ссылка на гавк
gawk Программа для работы с текстовыми файлами; это реализация GNU awk
gawk-5.1.1 Жесткая ссылка на gawk
!!! Пакет Gawk содержит программы для работы с текстовыми файлами.

0. Во-первых, убедитесь, что некоторые ненужные файлы не установлены:
sed -i 's/extras//' Makefile.in

1. Подготовьте Gawk к компиляции:
./configure --prefix=/usr

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

3. Чтобы проверить результаты, введите:
make check

4. Установите пакет:
make install

5. При желании установите документацию:
mkdir -pv                                   /usr/share/doc/gawk-5.1.1
cp    -v doc/{awkforai.txt,*.{eps,pdf,jpg}} /usr/share/doc/gawk-5.1.1

103. (8.57.) Findutils-4.9.0

!!! Пакет Findutils содержит программы для поиска файлов. 
!!! Эти программы предназначены для рекурсивного поиска в дереве каталогов, а также для создания, 
!!! обслуживания и поиска в базе данных (часто быстрее, чем рекурсивный поиск, но ненадежно, если база данных недавно не обновлялась).
!!! find Ищет в заданных деревьях каталогов файлы, соответствующие указанным критериям.
!!! locate Выполняет поиск в базе данных имен файлов и сообщает об именах, которые содержат заданную строку или соответствуют заданному шаблону.
!!! updatedb Обновляет базу данных местонахождения ; он сканирует всю файловую систему (включая другие файловые системы, 
             которые в настоящее время смонтированы, если не указано иное) и помещает каждое найденное имя файла в базу данных.
!!! xargs Может использоваться для применения данной команды к списку файлов

0. Подготовьте Findutils к компиляции:
case $(uname -m) in
    i?86)   TIME_T_32_BIT_OK=yes ./configure --prefix=/usr --localstatedir=/var/lib/locate ;;
    x86_64) ./configure --prefix=/usr --localstatedir=/var/lib/locate ;;
esac

Значение параметров настройки:
TIME_32_BIT_OK=yes
Этот параметр необходим для сборки на 32-битной системе.
--localstatedir
Этот параметр изменяет расположение базы данных локации на /var/lib/locate, что соответствует требованиям FHS.

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

2. Чтобы проверить результаты, введите:
chown -Rv tester .
su tester -c "PATH=$PATH make check"

3. Установите пакет:
make install

104. (8.58.) Groff-1.22.4

!!! Пакет Groff содержит программы для обработки и форматирования текста.
addftinfo Читает файл шрифта troff и добавляет некоторую дополнительную информацию о метрике шрифта, используемую системой groff .
afmtodit Создает файл шрифта для использования с groff и grops.
chem Препроцессор Groff для создания диаграмм химической структуры
eqn Компилирует описания уравнений, встроенные во входные файлы troff, в команды, понятные troff .
eqn2graph Преобразует troff EQN (уравнение) в обрезанное изображение.
gdiffmk Отмечает различия между файлами groff/nroff/troff.
glilypond Преобразовывает ноты, написанные на языке lilypond, в язык groff.
gperl Препроцессор для groff, позволяющий добавлять код Perl в файлы groff.
gpinyin Препроцессор для groff, позволяющий добавлять китайско-европейский язык пиньинь в файлы groff.
grap2graph Преобразует графическую диаграмму в обрезанное растровое изображение.
grn Препроцессор groff для файлов Gremlin
grodvi Драйвер для groff , создающий формат TeX dvi .
groff Внешний интерфейс к системе форматирования документов groff; обычно он запускает программу troff и постпроцессор, соответствующий выбранному устройству.
groffer Отображает файлы groff и справочные страницы на терминалах X и tty.
grog Читает файлы и угадывает, какие из параметров groff ,-e , -man, -me, -mm, -ms, -pи -sнеобходимы -tдля печати файлов, и сообщает команде groff , включая эти параметры .
grolbp Является драйвером groff для принтеров Canon CAPSL (лазерные принтеры серии LBP-4 и LBP-8).
grolj4 Драйвер для groff , который производит вывод в формате PCL5, подходящем для принтера HP LaserJet 4.
gropdf Переводит вывод GNU troff в PDF
grops Переводит вывод GNU troff в PostScript .
grotty Переводит вывод GNU troff в форму, подходящую для устройств, подобных пишущим машинкам.
hpftodit Создает файл шрифта для использования с groff -Tlj4 из файла метрики шрифта с тегом HP.
indxbib Создает инвертированный индекс для библиографических баз данных с указанным файлом для использования с refer , lookbib и lkbib
lkbib Выполняет поиск в библиографических базах данных ссылок, содержащих указанные ключи, и сообщает о любых найденных ссылках.
lookbib Печатает подсказку при стандартной ошибке (если стандартный ввод не является терминалом), читает строку, содержащую набор ключевых слов из стандартного ввода, 
        ищет в библиографических базах данных в указанном файле ссылки, содержащие эти ключевые слова, печатает все ссылки, 
        найденные на стандартный вывод и повторяет этот процесс до конца ввода
mmroff Простой препроцессор для groff
neqn Уравнения форматов для выходных данных американского стандартного кода для обмена информацией (ASCII)
nroff Скрипт, эмулирующий команду nroff с помощью groff
pdfmom Является оболочкой groff, которая упрощает создание PDF-документов из файлов, отформатированных с помощью макросов mom.
pdfoff Создает PDF-документы с помощью groff
pfbtops Преобразует шрифт PostScript в .pfb формате ASCII.
pic Компилирует описания изображений, встроенных во входные файлы troff или TeX, в команды, понятные TeX или troff .
pic2graph Преобразует диаграмму PIC в обрезанное изображение.
post-grohtml Переводит вывод GNU troff в HTML
preconv Преобразует кодировку входных файлов в то, что понимает GNU troff .
pre-grohtml Переводит вывод GNU troff в HTML
refer Копирует содержимое файла в стандартный вывод, за исключением того, что строки между .[ и .] интерпретируются как цитаты, а строки между .R1 и .R2 интерпретируются как команды для обработки цитат.
roff2dvi Преобразует файлы roff в формат DVI.
roff2html Преобразует файлы roff в формат HTML.
roff2pdf Преобразует roff-файлы в PDF-файлы
roff2ps Преобразует файлы roff в файлы ps.
roff2text Преобразует файлы roff в текстовые файлы.
roff2x Преобразует файлы roff в другие форматы.
soelim Читает файлы и заменяет строки вида .so файл содержимым указанного файла
tbl Компилирует описания таблиц, встроенных во входные файлы troff, в команды, понятные troff .
tfmtodit Создает файл шрифта для использования с groff -Tdvi
troff Хорошо совместим с Unix troff ; обычно его следует вызывать с помощью команды groff , которая также запускает препроцессоры и постпроцессоры в соответствующем порядке и с соответствующими


!!! Грофф ожидает, что переменная среды PAGEбудет содержать размер бумаги по умолчанию. 
!!! Подходит для пользователей в США PAGE=letter. 
!!! В другом месте PAGE=A4 может быть более подходящим. 
!!! Хотя размер бумаги по умолчанию настраивается во время компиляции, его можно переопределить позже, указав в файле либо « A4 » , либо « letter » ./etc/papersize


0. Подготовьте Groff к компиляции:
#PAGE= ./configure --prefix=/usr
PAGE=A4 ./configure --prefix=/usr

1. Этот пакет не поддерживает параллельную сборку. Скомпилируйте пакет:
make -j1

2. Этот пакет не поставляется с набором тестов.

3. Установите пакет:
make install

105. (8.59.) GRUB-2.06

!!! Пакет GRUB содержит унифицированный загрузчик GRand.
!!! Примечание
!!! Если ваша система поддерживает UEFI и вы хотите загрузить LFS с UEFI, вы можете пропустить этот пакет в LFS и установить GRUB с поддержкой UEFI (и его зависимости), 
!!! https://www.linuxfromscratch.org/blfs/view/stable-systemd/postlfs/grub-efi.html

0. Подготовьте GRUB к компиляции:
./configure --prefix=/usr          \
            --sysconfdir=/etc      \
            --disable-efiemu       \
            --disable-werror

Значение новых опций конфигурации:
--disable-werror
Это позволяет завершить сборку с предупреждениями, появившимися в более поздних версиях Flex.
--disable-efiemu
Этот параметр сводит к минимуму то, что создается за счет отключения функции и тестирования программ, не нужных для LFS.

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

2. Тесты:
Набор тестов для этих пакетов не рекомендуется. Большинство тестов зависят от пакетов, недоступных в ограниченной среде LFS. 
Чтобы все равно запустить тесты, запустите 
make check

3. Установите пакет:
make install
mv -v /etc/bash_completion.d/grub /usr/share/bash-completion/completions

4. Содержимое пакета:
grub-bios-setup Вспомогательная программа для grub-install
grub-editenv Инструмент для редактирования блока окружения
grub-file Проверяет, относится ли FILE к указанному типу.
grub-fstest Инструмент для отладки драйвера файловой системы
grub-glue-efi Обрабатывает образы EFI ia32 и amd64 и склеивает их в соответствии с форматом Apple
grub-install  Установите GRUB на свой диск
grub-kbdcomp Скрипт, который преобразует макет xkb в макет, распознаваемый GRUB
grub-macbless Благословение в стиле Mac для файлов HFS или HFS+
grub-menulst2cfg Преобразует GRUB Legacy menu.lstв grub.cfgдля использования с GRUB 2 
grub-mkconfig Создайте файл конфигурации grub
grub-mkimage Сделать загрузочный образ GRUB
grub-mklayout Создает файл раскладки клавиатуры GRUB.
grub-mknetdir Подготавливает сетевой загрузочный каталог GRUB
grub-mkpasswd-pbkdf2 Генерирует зашифрованный пароль PBKDF2 для использования в меню загрузки.
grub-mkrelpath Делает системный путь относительно его корня
grub-mkrescue Создайте загрузочный образ GRUB, подходящий для дискеты или CDROM/DVD.
grub-mkstandalone Создает отдельное изображение
grub-ofpathname Вспомогательная программа, которая печатает путь к устройству GRUB.
grub-probe Информация об устройстве зонда для заданного пути или устройства
grub-reboot Устанавливает загрузочную запись по умолчанию для GRUB только для следующей загрузки
grub-render-label Рендеринг Apple .disk_label для компьютеров Apple Mac
grub-script-check Проверяет скрипт конфигурации GRUB на наличие синтаксических ошибок
grub-set-default Устанавливает загрузочную запись по умолчанию для GRUB
grub-sparc64-setup Вспомогательная программа для grub-setup
grub-syslinux2cfg Преобразование файла конфигурации syslinux в формат grub.cfg

106. (8.60.) Gzip-1.11

!!! Пакет Gzip содержит программы для сжатия и распаковки файлов.

0. Подготовьте Gzip к компиляции:
./configure --prefix=/usr

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

2. Чтобы проверить результаты, введите:
make check

3. Установите пакет:
make install

4. Содержимое пакета:
gunzip Распаковывает gzip-файлы
gzexe Создает самораспаковывающиеся исполняемые файлы
gzip Сжимает данные файлы, используя кодировку Lempel-Ziv (LZ77)
uncompress Распаковывает сжатые файлы
zcat Распаковывает заданные gzip-файлы в стандартный вывод
zcmp Запускает cmp для gzip-файлов
zdiff Запускает diff для файлов, сжатых gzip
zegrep Запускает egrep для gzip-файлов
zfgrep Запускает fgrep для gzip-файлов
zforce Принудительно устанавливает .gz расширение для всех заданных файлов, которые являются файлами, сжатыми gzip, чтобы gzip не сжимал их снова; 
       это может быть полезно, когда имена файлов были усечены во время передачи файла
zgrep Запускает grep для gzip-файлов
zless Меньше работает с файлами, сжатыми gzip
zmore Больше работает с файлами, сжатыми gzip
znew Повторно сжимает файлы из формата Compress в формат gzip — .Z чтобы .gz

107. (8.61.) IPRoute2-5.16.0

!!! Пакет IPRoute2 содержит программы для базовых и расширенных сетей на основе IPV4.

0.  Программа arpd , включенная в этот пакет, не будет собрана, так как она зависит от базы данных Berkeley DB, которая не установлена ​​в LFS. 
!!! Однако каталог для arpd и справочная страница все равно будут установлены. Предотвратите это, выполнив приведенные ниже команды. 
!!! Если необходим двоичный файл arpd , инструкции по компиляции Berkeley DB можно найти в книге BLFS по адресу https://www.linuxfromscratch.org/blfs/view/stable-systemd/server/db.html .
sed -i /ARPD/d Makefile
rm -fv man/man8/arpd.8

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

2. Этот пакет не имеет рабочего набора тестов.

3. Установите пакет:
make SBINDIR=/usr/sbin install

4. При желании установите документацию:
mkdir -pv             /usr/share/doc/iproute2-5.16.0
cp -v COPYING README* /usr/share/doc/iproute2-5.16.0


5. Содержимое
bridge Настраивает сетевые мосты
ctstat Утилита состояния подключения
genl  Общий интерфейс утилиты netlink
ifcfg Оболочка сценария оболочки для команды ip [Обратите внимание, что для этого требуются программы arping и rdisk из пакета iputils, 
      который можно найти по адресу http://www.skbuff.net/iputils/ .]
ifstat Показывает статистику интерфейса, включая количество переданных и полученных пакетов по интерфейсам.
ip Основной исполняемый файл. Он имеет несколько различных функций:
ip link позволяет пользователям просматривать состояние устройств и вносить изменения
ip addr позволяет пользователям просматривать адреса и их свойства, добавлять новые адреса и удалять старые.
ip neighbor позволяет пользователям просматривать привязки соседей и их свойства, добавлять новые записи соседей и удалять старые.
ip rule позволяет пользователям просматривать политики маршрутизации и изменять их
ip route позволяет пользователям просматривать таблицу маршрутизации и изменять правила таблицы маршрутизации.
ip rule позволяет пользователям просматривать IP-туннели и их свойства, а также изменять их.
ip maddr позволяет пользователям просматривать многоадресные адреса и их свойства и изменять их.
ip mroute позволяет пользователям устанавливать, изменять или удалять многоадресную маршрутизацию.
ip monitor позволяет пользователям постоянно отслеживать состояние устройств, адресов и маршрутов
lnstat Предоставляет сетевую статистику Linux; это обобщенная и более полнофункциональная замена старой программы rtstat
nstat Показывает статистику сети
routef Компонент ip route . Это для сброса таблиц маршрутизации
routel Компонент ip route . Это для перечисления таблиц маршрутизации
rtacct Отображает содержимое/proc/net/rt_acct
rtmon Утилита мониторинга маршрута
rtpr Преобразует вывод ip -o обратно в удобочитаемую форму.
rtstat Утилита статуса маршрута
ss Аналогично команде netstat ; показывает активные соединения
tc Исполняемый файл управления трафиком; это для реализаций качества обслуживания (QOS) и класса обслуживания (COS).
tc qdisc позволяет пользователям настроить дисциплину очередей
tc class позволяет пользователям настраивать классы на основе планирования дисциплины очереди.
tc Estimator позволяет пользователям оценить сетевой поток в сеть.
tc filter позволяет пользователям настроить фильтрацию пакетов QOS/COS.
tc policy позволяет пользователям настраивать политики QOS/COS.

107. (8.62.) Kbd-2.4.0

!!! Пакет Kbd содержит файлы таблиц ключей, консольные шрифты и клавиатурные утилиты.

0. Поведение клавиш возврата и удаления неодинаково для всех раскладок в пакете Kbd. 
Следующий патч устраняет эту проблему для раскладок i386:
После исправления клавиша возврата генерирует символ с кодом 127, а клавиша удаления генерирует известную escape-последовательность.
patch -Np1 -i ../kbd-2.4.0-backspace-1.patch

1. Удалите избыточную программу resizecons (она требует несуществующей svgalib для предоставления файлов видеорежима 
— для нормального использования setfont соответствующим образом изменяет размеры консоли) вместе с ее справочной страницей.
sed -i '/RESIZECONS_PROGS=/s/yes/no/' configure
sed -i 's/resizecons.8 //' docs/man/man8/Makefile.in

2. Подготовьте Kbd для компиляции:
./configure --prefix=/usr --disable-vlock
Значение опции конфигурации:
--disable-vlock
Этот параметр предотвращает сборку утилиты vlock, поскольку для нее требуется библиотека PAM, которая недоступна в среде chroot.

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

4. Чтобы проверить результаты, введите:
make check

5. Установите пакет:
make install

!!! Примечание
!!! Для некоторых языков (например, белорусского) пакет Kbd не предоставляет полезную раскладку, где стандартная раскладка « by » предполагает кодировку ISO-8859-5, 
!!! а обычно используется раскладка CP1251. Пользователи таких языков должны загружать рабочие раскладки отдельно.


6. При желании установите документацию:
mkdir -pv           /usr/share/doc/kbd-2.4.0
cp -R -v docs/doc/* /usr/share/doc/kbd-2.4.0

7. Содержание:
chvt Изменяет виртуальный терминал переднего плана
deallocvt Освобождает неиспользуемые виртуальные терминалы
dumpkeys Сбрасывает таблицы перевода клавиатуры
fgconsole Выводит номер активного виртуального терминала
getkeycodes Распечатывает таблицу сопоставления сканкода ядра с кодом клавиши
kbdinfo Получает информацию о состоянии консоли
kbd_mode Сообщает или устанавливает режим клавиатуры
kbdrate Устанавливает частоту повторения и задержки клавиатуры
loadkeys Загружает таблицы перевода клавиатуры
loadunimap Загружает таблицу сопоставления юникода и шрифта ядра.
mapscrn Устаревшая программа, которая использовалась для загрузки определяемой пользователем таблицы преобразования символов вывода в драйвер консоли; теперь это делает setfont
openvt Запускает программу на новом виртуальном терминале (VT)
psfaddtable Добавляет таблицу символов Unicode в консольный шрифт.
psfgettable Извлекает встроенную таблицу символов Unicode из консольного шрифта.
psfstriptable Удаляет встроенную таблицу символов Unicode из консольного шрифта.
psfxtable Обрабатывает таблицы символов Unicode для консольных шрифтов.
setfont Изменяет шрифты расширенного графического адаптера (EGA) и видеографического массива (VGA) на консоли.
setkeycodes Загружает записи таблицы сопоставления кода сканирования ядра с кодом клавиши; это полезно, если на клавиатуре есть необычные клавиши
setleds Устанавливает флаги клавиатуры и светодиоды.
setmetamode Определяет обработку мета-клавиш клавиатуры
setvtrgb Устанавливает цветовую карту консоли во всех виртуальных терминалах
showconsolefont Показывает текущий шрифт экрана консоли EGA/VGA.
showkey Сообщает скан-коды, коды клавиш и коды ASCII клавиш, нажатых на клавиатуре.
unicode_start Переводит клавиатуру и консоль в режим UNICODE [Не используйте эту программу, если ваш файл раскладки не находится в кодировке ISO-8859-1. 
              Для других кодировок эта утилита выдает неправильные результаты.]
unicode_stop Возвращает клавиатуру и консоль из режима UNICODE.

108. (8.63.) Libpipeline-1.5.5

!!! Пакет Libpipeline содержит библиотеку для гибкого и удобного управления конвейерами подпроцессов.
!!! libpipeline Эта библиотека используется для безопасного построения конвейеров между подпроцессами.

0. Подготовьте Libpipeline к компиляции:
./configure --prefix=/usr

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

2. Чтобы проверить результаты, введите:
make check

3. Установите пакет:
make install

109. (8.64.) Make-4.3

!!! Пакет Make содержит программу для управления генерацией исполняемых файлов и других не исходных файлов пакета из исходных файлов.
!!! make Автоматически определяет, какие части пакета необходимо (повторно) скомпилировать, а затем выдает соответствующие команды.

0. Подготовьте Make к компиляции:
./configure --prefix=/usr

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

2. Чтобы проверить результаты, введите:
make check

3. Установите пакет:
make install

110. (8.65.) Patch-2.7.6

!!! Пакет Patch содержит программу для изменения или создания файлов путем применения файла « заплаты » , обычно создаваемого программой diff.
!!! Изменяет файлы в соответствии с файлом исправления (файл исправления обычно представляет собой список различий, созданный с помощью программы diff. 
!!! Применяя эти различия к исходным файлам, patch создает исправленные версии.)

0. Подготовьте патч к компиляции:
./configure --prefix=/usr

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

2. Чтобы проверить результаты, введите:
make check

3. Установите пакет:
make install

110. (8.66.) Tar-1.34

!!! Пакет Tar предоставляет возможность создавать tar-архивы, а также выполнять различные другие операции с архивами. 
!!! Tar можно использовать в ранее созданных архивах для извлечения файлов, для хранения дополнительных файлов или для обновления или списка файлов, которые уже были сохранены.
!!! tar Создает, извлекает файлы и составляет список содержимого архивов, также известных как tarballs.

0. Подготовьте Tar для компиляции:
FORCE_UNSAFE_CONFIGURE=1  \
./configure --prefix=/usr

Значение опции конфигурации:
FORCE_UNSAFE_CONFIGURE=1
Это заставляет тест для mknod запускаться как root. 
Обычно считается опасным запускать этот тест от имени rootпользователя, но, поскольку он выполняется в системе, которая была собрана лишь частично, переопределение допустимо.

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


2. Тесты:
Чтобы проверить результаты, введите:
make check

Известно, что один тест с возможностями: бинарное сохранение/восстановление завершается неудачей (в LFS отсутствует selinux), 
но будет пропущен, если ядро ​​хоста не поддерживает расширенные атрибуты в файловой системе, используемой для сборки LFS.

3. Установите пакет:
make install
make -C doc install-html docdir=/usr/share/doc/tar-1.34

111. (8.67.) Texinfo-6.8

!!! Пакет Texinfo содержит программы для чтения, записи и преобразования информационных страниц.
info Используется для чтения информационных страниц, которые похожи на справочные страницы, но часто гораздо глубже, 
     чем просто объяснение всех доступных параметров командной строки [Например, сравните man bison и info bison .]
install-info Используется для установки информационных страниц; он обновляет записи в файле информационного индекса
makeinfo Переводит заданные исходные документы Texinfo в информационные страницы, обычный текст или HTML.
pdftexi2dvi Используется для форматирования данного документа Texinfo в файл Portable Document Format (PDF).
pod2texi Преобразует Pod в формат Texinfo
texi2any Переводите исходную документацию Texinfo в различные другие форматы.
texi2dvi Используется для форматирования данного документа Texinfo в независимый от устройства файл, который можно распечатать.
texi2pdf Используется для форматирования данного документа Texinfo в файл Portable Document Format (PDF).
texindex Используется для сортировки индексных файлов Texinfo.

0. Подготовьте Texinfo к компиляции:
./configure --prefix=/usr

1. Опять же, исправьте проблему со сборкой пакета с помощью Glibc-2.34 или более поздней версии:
sed -e 's/__attribute_nonnull__/__nonnull/' \
    -i gnulib/lib/malloc/dynarray-skeleton.c

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

3. Чтобы проверить результаты, введите:
make check

4. Установите пакет:
make install

5. При желании установите компоненты, входящие в установку TeX:
make TEXMF=/usr/share/texmf install-tex

Значение параметра make:
TEXMF=/usr/share/texmf
Переменная TEXMFmakefile содержит расположение корня дерева TeX, если, например, пакет TeX будет установлен позже.

6. Система документации Info использует простой текстовый файл для хранения списка пунктов меню. 
Файл находится по адресу /usr/share/info/dir. 
К сожалению, из-за случайных проблем в файлах Makefile различных пакетов он иногда может не синхронизироваться с информационными страницами, 
установленными в системе. 
Если /usr/share/info/dirфайл когда-либо потребуется воссоздать, следующие необязательные команды выполнят эту задачу:

pushd /usr/share/info
  rm -v dir
  for f in *
    do install-info $f dir 2>/dev/null
  done
popd

112. (8.68.) Vim-8.2.4383

!!! Пакет Vim содержит мощный текстовый редактор. 
!!! Если вы предпочитаете другой редактор, такой как Emacs, Joe или Nano, обратитесь к https://www.linuxfromscratch.org/blfs/view/stable-systemd/postlfs/editors.html за рекомендациями по установке.

0. Во-первых, измените расположение vimrcфайла конфигурации по умолчанию на /etc:
echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h

1/ Подготовьте vim к компиляции:
./configure --prefix=/usr

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

3. Чтобы подготовить тесты, убедитесь, что пользователь testerможет писать в исходное дерево:
chown -Rv tester .

4. Теперь запустите тесты от имени пользователя tester:
su tester -c "LANG=en_US.UTF-8 make -j1 test" &> vim-test.log

Набор тестов выводит на экран много двоичных данных. 
Это может вызвать проблемы с настройками текущего терминала. 
Этой проблемы можно избежать, перенаправив вывод в файл журнала, как показано выше. Успешный тест приведет к появлению слов «ВСЕ СДЕЛАНО» в файле журнала по завершении.

5. Установите пакет:
make install

6. Многие пользователи привыкли использовать vi вместо vim . 
Чтобы разрешить выполнение vim , когда пользователи обычно вводят vi , создайте символическую ссылку как для двоичного файла, так и для справочной страницы на предоставленных языках:
ln -sv vim /usr/bin/vi
for L in  /usr/share/man/{,*/}man1/vim.1; do
    ln -sv vim.1 $(dirname $L)/vi.1
done

7. По умолчанию документация vim устанавливается в формате /usr/share/vim. 
Следующая символическая ссылка позволяет получить доступ к документации через /usr/share/doc/vim-8.2.4383, что делает ее согласованной с расположением документации для других пакетов:
ln -sv ../vim/vim82/doc /usr/share/doc/vim-8.2.4383

8. Содержимое пакета vim:
ex Запускает vim в ex-режиме
rview Является ограниченной версией представления ; никакие команды оболочки не могут быть запущены, и просмотр не может быть приостановлен
rvim Является ограниченной версией vim ; никакие команды оболочки не могут быть запущены, и vim не может быть приостановлен
vi Ссылка на vim
view Запускает vim в режиме только для чтения
vim Является редактором
vimdiff Редактирует две или три версии файла с помощью vim и показывает различия
vimtutor Обучает основным клавишам и командам vim
xxd Создает шестнадцатеричный дамп данного файла; он также может делать обратное, поэтому его можно использовать для двоичного исправления

9.  Configuring Vim
cat > /etc/vimrc << "EOF"
" Begin /etc/vimrc

" Ensure defaults are set before customizing settings, not after
source $VIMRUNTIME/defaults.vim
let skip_defaults_vim=1

set nocompatible
set backspace=2
set mouse=
syntax on
if (&term == "xterm") || (&term == "putty")
  set background=dark
endif

" End /etc/vimrc
EOF

10. опции
vim -c ':options'

11.Авто исправление текста:
set spelllang=en,ru
set spell


114. (8.69.) MarkupSafe-2.0.1

!!! MarkupSafe — это модуль Python, реализующий безопасную строку разметки XML/HTML/XHTML.
0. Скомпилируйте MarkupSafe с помощью следующей команды:
python3 setup.py build

1. Этот пакет не поставляется с набором тестов.

2. Установите пакет:
python3 setup.py install --optimize=1

115. (8.70.) Jinja2-3.0.3

!!! Jinja2 — это модуль Python, реализующий простой язык шаблонов Python.

0. Установите пакет:
python3 setup.py install --optimize=1

116. (8.71.) Systemd-250

!!! Пакет systemd содержит программы для управления запуском, работой и завершением работы системы.

0. Во-первых, примените патч, чтобы исправить уязвимость безопасности и регрессии с именами хостов и бездействующими единицами:
patch -Np1 -i ../systemd-250-upstream_fixes-1.patch

1. Удалите две ненужные группы renderи sgxиз правил udev по умолчанию:
sed -i -e 's/GROUP="render"/GROUP="video"/' \
       -e 's/GROUP="sgx", //' rules.d/50-udev-default.rules.in

2. Подготовьте systemd к компиляции:
mkdir -p build
cd       build

meson --prefix=/usr                 \
      --sysconfdir=/etc             \
      --localstatedir=/var          \
      --buildtype=release           \
      -Dblkid=true                  \
      -Ddefault-dnssec=no           \
      -Dfirstboot=false             \
      -Dinstall-tests=false         \
      -Dldconfig=false              \
      -Dsysusers=false              \
      -Db_lto=false                 \
      -Drpmmacrosdir=no             \
      -Dhomed=false                 \
      -Duserdb=false                \
      -Dman=false                   \
      -Dmode=release                \
      -Ddocdir=/usr/share/doc/systemd-250 \
      ..

Значение опций мезона:
--buildtype=release
Этот переключатель переопределяет тип сборки по умолчанию ( « отладка » ), который будет создавать неоптимизированные двоичные файлы.
-Ddefault-dnssec=no
Этот переключатель отключает экспериментальную поддержку DNSSEC.
-Dfirstboot=false
Этот переключатель предотвращает установку служб systemd, отвечающих за настройку системы в первый раз. Они бесполезны для LFS, потому что все делается вручную.
-Dinstall-tests=false
Этот переключатель предотвращает установку скомпилированных тестов.
-Dldconfig=false
Этот переключатель предотвращает установку модуля systemd, который запускает ldconfig при загрузке, что бесполезно для дистрибутивов с исходным кодом, таких как LFS, и увеличивает время загрузки. Удалите его, если описанная функция желательна.
-Dsysusers=false
Этот переключатель предотвращает установку служб systemd, отвечающих за настройку файлов /etc/groupи . /etc/passwdОба файла были созданы в предыдущей главе. Этот демон бесполезен в системе LFS, поскольку учетные записи пользователей создаются вручную.
-Drpmmacrosdir=no
Этот переключатель отключает установку макросов RPM для использования с systemd, поскольку LFS не поддерживает RPM.
-D{userdb,homed}=false
Удалите два демона, у которых есть зависимости, не соответствующие области действия LFS.
-Dman=false
Предотвратите создание справочных страниц, чтобы избежать дополнительных зависимостей. Позже мы установим предварительно созданные справочные страницы для systemd из архива.
-Dmode=release
Отключите некоторые функции, которые авторы восходящей ветки считают экспериментальными.

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

4. Установите пакет:
ninja install

5. Установите справочные страницы:
tar -xf ../../systemd-man-pages-250.tar.xz --strip-components=1 -C /usr/share/man

6. Удалить бесполезный каталог:
rm -rf /usr/lib/pam.d

7. Создайте /etc/machine-idфайл, необходимый для systemd-journald :
systemd-machine-id-setup

8. Настройте базовую целевую структуру:
systemctl preset-all

9. Содержимое systemd:
busctl Используется для самоанализа и мониторинга шины D-Bus.
coredumpctl Используется для извлечения дампов памяти из журнала systemd.
halt Обычно вызывает завершение работы с -h параметром, за исключением случаев, когда уровень запуска уже равен 0, тогда он сообщает ядру остановить систему; он отмечает в файле /var/log/wtmp,
hostnamectl Используется для запроса и изменения имени хоста системы и связанных с ним настроек.
init Это первый процесс, который должен быть запущен, когда ядро ​​​​инициализировало оборудование, которое берет на себя процесс загрузки 
     и запускает все процессы в соответствии с его файлами конфигурации. В этом случае он запускает systemd
journalctl Используется для запроса содержимого журнала systemd
kernel-install Используется для добавления и удаления образов ядра и initramfs в /boot. В LFS это делается вручную
localectl Используется для запроса и изменения языкового стандарта системы и настроек раскладки клавиатуры.
loginctl Используется для самоанализа и контроля состояния systemd Login Manager.
machinectl Используется для самоанализа и контроля состояния виртуальной машины systemd и диспетчера регистрации контейнеров.
networkctl Используется для самоанализа и настройки состояния сетевых ссылок, настроенных systemd-networkd.
oomctl Управляет демоном systemd Out Of Memory
portablectl Используется для подключения или отключения портативных сервисов от локальной системы.
poweroff Указывает ядру остановить систему и выключить компьютер (см. halt )
reboot Указывает ядру перезагрузить систему (см. halt )
resolvconf Регистрирует DNS-сервер и конфигурацию домена с помощью systemd-resolved.
resolvectl Отправляет управляющие команды диспетчеру разрешения сетевых имен или разрешает доменные имена, адреса IPv4 и IPv6, записи DNS и службы.
runlevel Выводит предыдущий и текущий уровень выполнения, как отмечено в последней записи уровня выполнения в /run/utmp
shutdown Выводит систему из строя безопасным и надежным способом, сигнализируя обо всех процессах и уведомляя всех вошедших в систему пользователей.
systemctl Используется для самоанализа и контроля состояния системы systemd и диспетчера служб.
systemd-analyze Используется для определения производительности запуска системы при текущей загрузке, а также для выявления проблемных модулей systemd.
systemd-ask-password Используется для запроса системного пароля или парольной фразы от пользователя с помощью вопросительного сообщения, указанного в командной строке.
systemd-cat Используется для соединения выходных данных STDOUT и STDERR процесса с журналом systemd.
systemd-cgls Рекурсивно показывает содержимое выбранной иерархии группы управления Linux в виде дерева
systemd-cgtop Отображает верхние группы управления в локальной иерархии групп управления Linux, упорядоченные по загрузке процессора, памяти и дискового ввода-вывода.
systemd-creds Отображает и обрабатывает учетные данные
systemd-delta Используется для идентификации и сравнения файлов конфигурации, /etcкоторые переопределяют аналоги по умолчанию в/usr
systemd-detect-virt Определяет, работает ли система в виртуальной среде, и соответствующим образом настраивает udev.
systemd-dissect Используется для проверки образов дисков ОС
systemd-escape Используется для экранирования строк для включения в имена модулей systemd.
systemd-hwdb Используется для управления аппаратной базой данных (hwdb)
systemd-id128 Генерирует и печатает строки id128
systemd-inhibit Используется для выполнения программы с включенной блокировкой отключения, перехода в спящий режим или бездействия, 
                что предотвращает выполнение таких действий, как отключение системы, до завершения процесса.
systemd-machine-id-setup Используется инструментами системного установщика для инициализации идентификатора машины, 
                         сохраненного во /etc/machine-id время установки, со случайно сгенерированным идентификатором.
systemd-mount Используется для временного монтирования или автоматического монтирования дисков.
systemd-notify Используется сценариями демона для уведомления системы инициализации об изменении состояния.
systemd-nspawn Используется для запуска команды или ОС в облегченном контейнере пространства имен.
systemd-path Используется для запроса системных и пользовательских путей
systemd-repart Используется для увеличения и добавления разделов в таблицу разделов, когда systemd используется в образе ОС (например, в контейнере).
systemd-resolve Используется для разрешения доменных имен, адресов IPV4 и IPv6, записей ресурсов DNS и служб.
systemd-run Используется для создания и запуска временного модуля .service или .scope и запуска в нем указанной команды. Это полезно для проверки модулей systemd.
systemd-socket-activate Используется для прослушивания сокет-устройств и запуска процесса при успешном подключении к сокету.
systemd-sysext Активирует образы расширения системы
systemd-tmpfiles Создает, удаляет и очищает нестабильные и временные файлы и каталоги на основе формата файла конфигурации и местоположения, указанных в tmpfiles.d каталогах .
systemd-umount Размонтирует точки монтирования
systemd-tty-ask-password-agent Используется для отображения и/или обработки ожидающих запросов пароля systemd.
telinit Сообщает init , на какой уровень запуска перейти
timedatectl Используется для запроса и изменения системных часов и их настроек.
udevadm Является общим инструментом администрирования udev, который управляет демоном udevd, предоставляет информацию из базы данных оборудования Udev, 
        отслеживает ueevents, ожидает завершения ueevents, тестирует конфигурацию udev и запускает uevents для данного устройства.
libsystemd Является основной служебной библиотекой systemd.
libudev Является библиотекой для доступа к информации об устройстве Udev.

117. (8.72.) D-Bus-1.12.20

!!! D-Bus — это система шины сообщений, простой способ взаимодействия приложений друг с другом. 
!!! D-Bus предоставляет как системного демона (для таких событий, как «добавление нового аппаратного устройства» или «изменение очереди печати»), 
!!! так и демона сеанса входа в систему для каждого пользователя (для общих потребностей IPC среди пользовательских приложений). 
!!! Кроме того, шина сообщений построена на основе общей схемы передачи сообщений один к одному, 
!!! которая может использоваться любыми двумя приложениями для прямого взаимодействия (без использования демона шины сообщений).

0. Подготовьте D-Bus к компиляции:
./configure --prefix=/usr                        \
            --sysconfdir=/etc                    \
            --localstatedir=/var                 \
            --disable-static                     \
            --disable-doxygen-docs               \
            --disable-xml-docs                   \
            --docdir=/usr/share/doc/dbus-1.12.20 \
            --with-console-auth-dir=/run/console \
            --with-system-pid-file=/run/dbus/pid \
            --with-system-socket=/run/dbus/system_bus_socket

Значение параметров настройки:
--with-console-auth-dir=/run/console
Это указывает расположение каталога авторизации ConsoleKit.
--with-system-pid-file=/run/dbus/pid а также--with-system-socket=/run/dbus/system_bus_socket
Они задают расположение файла PID и сокета системной шины в /run, а не в устаревшем /var/run.

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

2. Установите пакет:
make install

3. Создайте символическую ссылку, чтобы D-Bus и systemd могли использовать один и тот же machine-id файл:
ln -sfv /etc/machine-id /var/lib/dbus


4. Содержимое:
dbus-cleanup-sockets используется для удаления оставшихся сокетов в каталоге
dbus-daemon  Демон шины сообщений D-Bus
dbus-launch Запускает dbus-daemon из сценария оболочки
dbus-monitor Отслеживает сообщения, проходящие через шину сообщений D-Bus.
dbus-run-session Запускает экземпляр сеансовой шины dbus-daemon из сценария оболочки и запускает указанную программу в этом сеансе.
dbus-send Отправляет сообщение на шину сообщений D-Bus
dbus-test-tool Инструмент, помогающий пакетам тестировать D-Bus
dbus-update-activation-environment Обновляет переменные среды, которые будут установлены для сеансовых служб D-Bus .
dbus-uuidgen Генерирует универсальный уникальный идентификатор
libdbus-1 Содержит функции API, используемые для связи с шиной сообщений D-Bus.

118. (8.73.) Man-DB-2.10.1

!!! https://www.linuxfromscratch.org/lfs/downloads/stable-systemd/LFS-BOOK-11.1-NOCHUNKS.html#ch-tools-binutils-pass1

0. Подготовьте Man-DB к компиляции:
./configure --prefix=/usr                         \
            --docdir=/usr/share/doc/man-db-2.10.1 \
            --sysconfdir=/etc                     \
            --disable-setuid                      \
            --enable-cache-owner=bin              \
            --with-browser=/usr/bin/lynx          \
            --with-vgrind=/usr/bin/vgrind         \
            --with-grap=/usr/bin/grap

Значение параметров настройки:
--disable-setuid
Это отключает создание программы man с идентификатором user man.
--enable-cache-owner=bin
Это делает общесистемные файлы кэша принадлежащими пользователю bin.
--with-...
Эти три параметра используются для установки некоторых программ по умолчанию. lynx — это текстовый веб-браузер (инструкции по установке см. в BLFS), 
vgrind преобразует исходные тексты программ во входные данные Groff, а grap полезен для набора графиков в документах Groff. vgrind 
и grap _ программы обычно не нужны для просмотра справочных страниц. 
Они не являются частью LFS или BLFS, но вы сможете установить их самостоятельно после завершения работы с LFS, если захотите.

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

2. Чтобы проверить результаты, введите:
make check

3. Установите пакет:
make install

4. Пакет содержит:
accessdb Создает дамп содержимого базы данных whatis в удобочитаемой форме .
apropos  Выполняет поиск в базе данных whatis и отображает краткие описания системных команд, содержащих заданную строку.
catman Создает или обновляет предварительно отформатированные страницы руководства
lexgrog Отображает сводную информацию в одну строку о данной странице руководства
man Форматирует и отображает запрошенную страницу руководства
man-recode Преобразует справочные страницы в другую кодировку
mandb Создает или обновляет базу данных whatis
manpath Отображает содержимое $MANPATH или (если $MANPATH не задан) подходящий путь поиска на основе настроек в man.conf и среды пользователя.
whatis Ищет в базе данных whatis и отображает краткие описания системных команд, которые содержат заданное ключевое слово в виде отдельного слова.
libman Содержит поддержку во время выполнения для человека
libmandb Содержит поддержку во время выполнения для человека

119. (8.74.) Procps-ng-3.3.17

!!! Пакет Procps-ng содержит программы для мониторинга процессов.

0. Подготовьте procps-ng для компиляции:
./configure --prefix=/usr                            \
            --docdir=/usr/share/doc/procps-ng-3.3.17 \
            --disable-static                         \
            --disable-kill                           \
            --with-systemd

Значение опции конфигурации:
--disable-kill
Этот переключатель отключает сборку команды kill , которая будет установлена ​​пакетом Util-linux.

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

2. Чтобы запустить набор тестов, запустите:
make check
Известно, что пять тестов, связанных с pkill, не прошли из-за проблемы с тестами, которые не были обновлены.

3. Установите пакет:
make install

4. Пакет содержит:
free Сообщает объем свободной и используемой памяти (как физической, так и памяти подкачки) в системе.
pgrep Ищет процессы на основе их имени и других атрибутов
pidof Сообщает PID заданных программ
pkill Сигналы обрабатываются на основе их имени и других атрибутов
pmap Сообщает карту памяти данного процесса
ps Список текущих запущенных процессов
pwait Ожидает завершения процесса перед выполнением.
pwdx Сообщает текущий рабочий каталог процесса
slabtop Отображает подробную информацию о кэш-памяти ядра в режиме реального времени.
sysctl Изменяет параметры ядра во время выполнения
tload Выводит график текущей средней загрузки системы
top Отображает список процессов, наиболее интенсивно использующих ЦП; он обеспечивает постоянный просмотр активности процессора в режиме реального времени
uptime Сообщает, как долго работает система, сколько пользователей вошли в систему и средние значения загрузки системы.
vmstat Сообщает статистику виртуальной памяти, предоставляя информацию о процессах, памяти, подкачке, блочном вводе/выводе (IO), прерываниях и активности ЦП.
w Показывает, какие пользователи в настоящее время вошли в систему, где и с какого момента
watch Повторно запускает данную команду, отображая первый экран, полный ее вывода; это позволяет пользователю наблюдать за изменением вывода с течением времени
libprocps Содержит функции, используемые большинством программ в этом пакете.

120. (8.75.) Util-linux-2.37.4

!!! Пакет Util-linux содержит различные утилиты. Среди них утилиты для работы с файловыми системами, консолями, разделами и сообщениями.

0. Подготовьте Util-linux к компиляции:
./configure ADJTIME_PATH=/var/lib/hwclock/adjtime   \
            --bindir=/usr/bin    \
            --libdir=/usr/lib    \
            --sbindir=/usr/sbin  \
            --docdir=/usr/share/doc/util-linux-2.37.4 \
            --disable-chfn-chsh  \
            --disable-login      \
            --disable-nologin    \
            --disable-su         \
            --disable-setpriv    \
            --disable-runuser    \
            --disable-pylibmount \
            --disable-static     \
            --without-python

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

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

2. Установите пакет:
make install


3. Пакет содержит:
addpart Сообщает ядру Linux о новых разделах
agetty Открывает порт tty, запрашивает имя для входа, а затем вызывает программу входа в систему.
blkdiscard Отбрасывает сектора на устройстве
blkid Утилита командной строки для поиска и печати атрибутов блочного устройства.
blkzone Запускает команду зоны на заданном блочном устройстве
blockdev Позволяет пользователям вызывать ioctl блочного устройства из командной строки.
cal Отображает простой календарь
cfdisk Манипулирует таблицей разделов данного устройства
chcpu Изменяет состояние процессоров
chmem Настраивает память
choom Отображает и настраивает счет OOM-killer
chrt Манипулирует атрибутами процесса в реальном времени
col Отфильтровывает обратные переводы строки
colcrt Фильтрует вывод nroff для терминалов, у которых отсутствуют некоторые возможности, такие как зачеркивание и полустрочки.
colrm Отфильтровывает заданные столбцы
column Форматирует данный файл в несколько столбцов
ctrlaltdel Устанавливает функцию комбинации клавиш Ctrl+Alt+Del на аппаратный или программный сброс.
delpart Запрашивает ядро ​​Linux удалить раздел
dmesg Сбрасывает загрузочные сообщения ядра
eject Извлекает съемный носитель
fallocate Предварительно выделяет место для файла
fdisk Манипулирует таблицей разделов данного устройства
fincore Подсчитывает страницы содержимого файла в ядре
findfs Находит файловую систему по метке или универсальному уникальному идентификатору (UUID).
findmnt Является интерфейсом командной строки к библиотеке libmount для работы с файлами mountinfo, fstab и mtab.
flock Получает блокировку файла, а затем выполняет команду с удерживаемой блокировкой
fsck Используется для проверки и, при необходимости, восстановления файловых систем.
fsck.cramfs Выполняет проверку целостности файловой системы Cramfs на данном устройстве.
fsck.minix Выполняет проверку целостности файловой системы Minix на данном устройстве.
fsfreeze Является очень простой оболочкой для операций драйвера ядра FIFREEZE/FITHAW ioctl.
fstrim Отбрасывает неиспользуемые блоки в смонтированной файловой системе.
getopt Разбирает параметры в заданной командной строке
hexdump Создает дамп данного файла в шестнадцатеричном или другом заданном формате.
hwclock Считывает или устанавливает аппаратные часы системы, также называемые часами реального времени (RTC) или часами базовой системы ввода-вывода (BIOS).
i386 Символическая ссылка на setarch
ionice Получает или задает класс планирования ввода-вывода и приоритет для программы.
ipcmk Создает различные ресурсы IPC
ipcrm Удаляет указанный ресурс межпроцессного взаимодействия (IPC).
ipcs Предоставляет информацию о состоянии IPC
irqtop Отображает информацию счетчика прерываний ядра в top(1)представлении стилей.
isosize Сообщает размер файловой системы iso9660
kill Посылает сигналы процессам
last Показывает, какие пользователи в последний раз входили (и выходили), выполняя поиск в /var/log/wtmpфайле; он также показывает загрузку системы, завершение работы и изменения уровня выполнения.
lastb Показывает неудачные попытки входа в систему /var/log/btmp
ldattach Прикрепляет линейную дисциплину к последовательной линии
linux32 Символическая ссылка на setarch
linux64 Символическая ссылка на setarch
logger Заносит данное сообщение в системный журнал
look Отображает строки, начинающиеся с заданной строки
losetup Настраивает и управляет петлевыми устройствами
lsblk Выводит информацию обо всех или выбранных блочных устройствах в древовидном формате.
lscpu Выводит информацию об архитектуре ЦП
lsipc Выводит информацию о средствах IPC, которые в настоящее время используются в системе.
lsirq Отображает информацию счетчика прерываний ядра
lslocks Список локальных блокировок системы
lslogins Выводит информацию о пользователях, группах и системных учетных записях.
lsmem Перечисляет диапазоны доступной памяти с их онлайн-статусом
lsns Списки пространств имен
mcookie Генерирует волшебные куки (128-битные случайные шестнадцатеричные числа) для xauth
mesg Определяет, могут ли другие пользователи отправлять сообщения на терминал текущего пользователя.
mkfs Создает файловую систему на устройстве (обычно это раздел жесткого диска).
mkfs.bfs Создает файловую систему bfs Santa Cruz Operations (SCO).
mkfs.cramfs Создает файловую систему cramfs
mkfs.minix Создает файловую систему Minix
mkswap Инициализирует данное устройство или файл для использования в качестве области подкачки.
more Фильтр для листания текста по одному экрану за раз
mount Прикрепляет файловую систему на данном устройстве к указанному каталогу в дереве файловой системы.
mountpoint Проверяет, является ли каталог точкой монтирования
namei Показывает символические ссылки в заданных путях
nsenter Запускает программу с пространствами имен других процессов
partx Сообщает ядру о наличии и нумерации разделов на диске
pivot_root Делает данную файловую систему новой корневой файловой системой текущего процесса
prlimit Получить и установить лимиты ресурсов процесса
readprofile Читает информацию о профилировании ядра
rename Переименовывает данные файлы, заменяя данную строку другой
renice Изменяет приоритет запущенных процессов
resizepart Запрашивает ядро ​​Linux изменить размер раздела
rev Переворачивает строки данного файла
rkfill Инструмент для включения и отключения беспроводных устройств
rtcwake Используется для перехода системы в спящий режим до указанного времени пробуждения.
script Делает машинопись сеанса терминала
scriptlive Повторно запустите машинописные тексты сеанса, используя информацию о времени
scriptreplay Воспроизведение машинописных текстов с использованием информации о времени
setarch Изменяет сообщаемую архитектуру в новой программной среде и устанавливает личные флаги
setsid Запускает данную программу в новом сеансе
setterm Устанавливает атрибуты терминала
sfdisk Манипулятор таблицы разделов диска
sulogin Позволяет root авторизоваться; обычно он вызывается init , когда система переходит в однопользовательский режим .
swaplabel Позволяет изменить UUID и метку области подкачки
swapoff Отключает устройства и файлы для подкачки
swapon Включает устройства и файлы для пейджинга и обмена и перечисляет устройства и файлы, используемые в настоящее время.
switch_root Переключается на другую файловую систему в качестве корня дерева монтирования
taskset Получает или устанавливает привязку процессора к процессу.
uclampset Управление атрибутами ограничения использования системы или процесса
ul Фильтр для перевода символов подчеркивания в escape-последовательности, указывающие подчеркивание для используемого терминала.
umount Отключает файловую систему от дерева файлов системы.
uname26 Символическая ссылка на setarch
unshare Запускает программу с некоторыми пространствами имен, не разделенными с родительским
utmpdump Отображает содержимое данного файла входа в систему в более удобном для пользователя формате.
uuidd Демон, используемый библиотекой UUID для создания UUID на основе времени безопасным и гарантированно уникальным способом.
uuidgen Создает новые UUID. Каждый новый UUID можно разумно считать уникальным среди всех UUID, созданных в локальной системе и в других системах в прошлом и будущем.
uuidparse Утилита для разбора уникальных идентификаторов
wall Отображает содержимое файла или, по умолчанию, его стандартный ввод на терминалах всех вошедших в систему пользователей.
wdctl Показывает статус аппаратного сторожевого таймера
whereis Сообщает расположение двоичного файла, исходного кода и справочной страницы для данной команды.
wipefs Стирает подпись файловой системы с устройства
x86_64 Символическая ссылка на setarch
zramctl Программа для настройки и управления устройствами zram (сжатый RAM-диск).
libblkid Содержит подпрограммы для идентификации устройства и извлечения токена.
libfdisk Содержит подпрограммы для управления таблицами разделов.
libmount Содержит подпрограммы для монтирования и размонтирования блочных устройств.
libsmartcols Содержит подпрограммы для облегчения вывода на экран в табличной форме.
libuuid Содержит подпрограммы для генерации уникальных идентификаторов для объектов, которые могут быть доступны за пределами локальной системы.

120. (8.76.) E2fsprogs-1.46.5

!!! Пакет e2fsprogs содержит утилиты для работы с ext2 файловой системой. 
!!! Он также поддерживает файловые системы c  журналированием ext3 и ext4

0. Документация e2fsprogs рекомендует собирать пакет в подкаталоге исходного дерева:
mkdir -v build
cd       build

1. Подготовьте e2fsprogs к компиляции:
../configure --prefix=/usr           \
             --sysconfdir=/etc       \
             --enable-elf-shlibs     \
             --disable-libblkid      \
             --disable-libuuid       \
             --disable-uuidd         \
             --disable-fsck

Значение параметров настройки:
--enable-elf-shlibs
Это создает общие библиотеки, которые используют некоторые программы в этом пакете.
--disable-*
Это предотвращает сборку и установку e2fsprogs libuuidи libblkidбиблиотек, uuiddдемона и оболочки fsck , поскольку util-linux устанавливает более свежие версии.

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

3. Для запуска тестов введите:
make check
Известно, что один тест, u_direct_io, не работает на некоторых системах.

3. Установите пакет:
make install

4. Удалите бесполезные статические библиотеки:
rm -fv /usr/lib/{libcom_err,libe2p,libext2fs,libss}.a

5. Этот пакет устанавливает сжатый .info файл, но не обновляет общесистемный dir файл. 
Разархивируйте этот файл, а затем обновите системный dirфайл, используя следующие команды:

gunzip -v /usr/share/info/libext2fs.info.gz
install-info --dir-file=/usr/share/info/dir /usr/share/info/libext2fs.info

6. При желании создайте и установите дополнительную документацию, выполнив следующие команды:
makeinfo -o      doc/com_err.info ../lib/et/com_err.texinfo
install -v -m644 doc/com_err.info /usr/share/info
install-info --dir-file=/usr/share/info/dir /usr/share/info/com_err.info

7. Пакет содержит:
badblocks Ищет устройство (обычно раздел диска) на наличие поврежденных блоков.
chattr Изменяет атрибуты файлов в ext2файловой системе; он также изменяет ext3файловые системы, журналируемую версию ext2файловых систем
compile_et Компилятор таблицы ошибок; он преобразует таблицу имен кодов ошибок и сообщений в исходный файл C, подходящий для использования с com_errбиблиотекой .
debugfs Отладчик файловой системы; его можно использовать для проверки и изменения состояния ext2файловой системы .
dumpe2fs Выводит информацию о суперблоке и группе блоков для файловой системы, присутствующей на данном устройстве.
e2freefrag Сообщает информацию о фрагментации свободного пространства
e2fsck Используется для проверки и, при необходимости, восстановления ext2файловых систем и ext3файловых систем.
e2image Используется для сохранения важных ext2данных файловой системы в файл
e2label Отображает или изменяет метку файловой системы в ext2файловой системе, присутствующей на данном устройстве.
e2mmpstatus Проверяет состояние MMP файловой системы ext4
e2scrub Проверяет содержимое смонтированной файловой системы ext[234]
e2scrub_all Проверяет все смонтированные файловые системы ext[234] на наличие ошибок
e2undo Воспроизводит журнал отмены undo_log для файловой системы ext2/ext3/ext4, найденной на устройстве [Это можно использовать для отмены неудачной операции программой e2fsprogs.]
e4crypt Утилита шифрования файловой системы Ext4
e4defrag Онлайн-дефрагментатор для файловых систем ext4
filefrag Отчеты о том, насколько сильно может быть фрагментирован конкретный файл
fsck.ext2 По умолчанию проверяет ext2файловые системы и является жесткой ссылкой на e2fsck.
fsck.ext3 По умолчанию проверяет ext3файловые системы и является жесткой ссылкой на e2fsck.
fsck.ext4 По умолчанию проверяет ext4файловые системы и является жесткой ссылкой на e2fsck.
logsave Сохраняет вывод команды в файл журнала
lsattr Перечисляет атрибуты файлов во второй расширенной файловой системе.
mk_cmds Преобразует таблицу имен команд и справочных сообщений в исходный файл C, подходящий для использования с libssбиблиотекой подсистемы .
mke2fs Создает ext2или ext3 файловую систему на данном устройстве
mkfs.ext2 По умолчанию создает ext2 файловые системы и является жесткой ссылкой на mke2fs.
mkfs.ext3 По умолчанию создает ext3 файловые системы и является жесткой ссылкой на mke2fs.
mkfs.ext4 По умолчанию создает ext 4файловые системы и является жесткой ссылкой на mke2fs.
mklost+found Используется для создания lost+foundкаталога в ext2 файловой системе; он предварительно выделяет дисковые блоки в этот каталог, чтобы облегчить задачу e2fsck
resize2fs Может использоваться для увеличения или уменьшения ext2файловой системы .
tune2fs Настраивает настраиваемые параметры файловой системы в ext2файловой системе .
libcom_err Стандартная процедура отображения ошибок
libe2p Используется dumpe2fs , chattr и lsattr
libext2fs Содержит подпрограммы, позволяющие программам пользовательского уровня управлять ext2 файловой системой .
libss Используется отладчиками
Рубрики
lfs

Linux From Scratch (LFS 11.1-systemd ) / бумажный дистрибутив / Конфигурация системы / часть 2

Ссылки:

!!! https://www.linuxfromscratch.org/lfs/downloads/stable-systemd/LFS-BOOK-11.1-NOCHUNKS.html#ch-tools-binutils-pass1

121. (9.2.) Общая конфигурация сети

0. Общая инфа:
systemd-networkd - демон конфигурации сети, который можно использовать для базовой настройки сети.
systemd-resolved - разрешение DNS-имен  
/etc/resolv.conf - статический файл разрешение DNS-имен 
Файлы конфигурации для systemd-networkd (и systemd-resolved ) можно поместить в /usr/lib/systemd/networkили /etc/systemd/network.
Файлы в /etc/systemd/network имеют более высокий приоритет, чем файлы в /usr/lib/systemd/network.
Существует три типа файлов конфигурации: .link, .netdev и .network файлы.
Подробные описания и примеры содержимого этих файлов конфигурации см на страницах руководства systemd-link(5)и systemd-netdev(5). systemd-network(5).

1. Именование сетевых устройств:
!!! Примечание
!!! Имена интерфейсов зависят от реализации и конфигурации демона udev, работающего в системе.
!!! Для большинства систем существует только один сетевой интерфейс для каждого типа подключения. 
!!! Например, классическое имя интерфейса для проводного соединения — eth0. 
!!! Беспроводное соединение обычно имеет имя wifi0 или wlan0.


Если вы предпочитаете использовать классические или настраиваемые имена сетевых интерфейсов, есть три альтернативных способа сделать это:
1.1 Замаскируйте файл .link udev для политики по умолчанию:
ln -s /dev/null /etc/systemd/network/99-default.link

1.2 Создайте схему именования вручную, например, назовите интерфейсы как-то вроде «internet0», «dmz0» или «lan0». Для этого создайте файлы .link в /etc/systemd/network/, 
которые выбирают явное имя или лучшую схему именования для ваших сетевых интерфейсов. 
См. справочную страницу systemd.link(5) для получения дополнительной информации.
Например:
cat > /etc/systemd/network/10-ether0.link << "EOF"
[Match]
# Change the MAC address as appropriate for your network device
MACAddress=12:34:45:78:90:AB

[Link]
Name=ether0
EOF

1.3 В /boot/grub/grub.cfg укажите параметр net.ifnames=0 в командной строке ядра.

122. (9.2.1.2.) Статическая IP-конфигурация

Приведенная ниже команда создает базовый файл конфигурации для настройки статического IP-адреса (используя как systemd-networkd, так и systemd-resolved):
cat > /etc/systemd/network/10-eth-static.network << "EOF"
[Match]
Name=

[Network]
Address=192.168.0.2/24
Gateway=192.168.0.1
DNS=192.168.0.1
Domains=
EOF

123. (9.2.1.3.) DHCP-конфигурация

cat > /etc/systemd/network/10-eth-dhcp.network << "EOF"
[Match]
Name=

[Network]
DHCP=ipv4

[DHCP]
UseDomains=true
EOF


124. (9.2.2.2) Статическая конфигурация resolv.conf

Если система будет подключена к Интернету, ей потребуются некоторые средства разрешения имен службы доменных имен (DNS) для преобразования имен доменов Интернета в IP-адреса и наоборот. 
Этого лучше всего добиться, поместив IP-адрес DNS-сервера, доступный у интернет-провайдера или сетевого администратора, в файл /etc/resolv.conf.

!!! Примечание
!!! При использовании методов, несовместимых с systemd-resolved, для настройки ваших сетевых интерфейсов (например, ppp и т. д.), или при использовании любого типа локального 
!!! преобразователя (например, bind, dnsmasq, unbound и т. д.) или любого другого программного обеспечения, которое создает /etc/resolv.conf (пример: программа resolvconf , 
!!! отличная от предоставленной systemd), файл systemd-resolved использовать не следует.
!!! Чтобы отключить systemd-resolved, введите следующую команду:
!!! systemctl disable systemd-resolved

0. Создаем /etc/resolv.conf :
cat > /etc/resolv.conf << "EOF"
# Begin /etc/resolv.conf

domain 
nameserver 
nameserver 

# End /etc/resolv.conf
EOF

125. (9.2.3.) Настройка имени хоста системы

Создайте /etc/hostname файл и введите имя хоста, запустив:
echo "" > /etc/hostname

необходимо заменить на имя, данное компьютеру. 
Не вводите здесь полное доменное имя (FQDN). 
Эта информация помещается в /etc/hosts файл.

126. (9.2.4.) Настройка файла /etc/hosts

Выберите полное доменное имя (FQDN) и возможные псевдонимы для использования в /etc/hosts файле. 
При использовании статических IP-адресов вам также необходимо выбрать IP-адрес. 
!!! Даже если сетевая карта не используется, все равно требуется действительное полное доменное имя. Это необходимо для правильной работы некоторых программ, таких как MTA.
Синтаксис записи в файле hosts следующий:
IP_address myhost.example.org aliases

cat > /etc/hosts << "EOF"
# Begin /etc/hosts

127.0.0.1 localhost.localdomain localhost
127.0.1.1  
<192.168.0.2>   [alias1] [alias2] ...
::1       localhost ip6-localhost ip6-loopback
ff02::1   ip6-allnodes
ff02::2   ip6-allrouters

# End /etc/hosts
EOF

!!! Значения <192.168.0.2>, и  необходимо изменить для конкретных целей или требований (если IP-адрес назначен сетевым/системным администратором и машина будет подключена 
!!! к существующей сети). Необязательные псевдонимы могут быть опущены, а <192.168.0.2> строка может быть опущена, если вы используете соединение, 
!!! настроенное с помощью DHCP или автоматической настройки IPv6.
!!! Запись ::1 является IPv6-аналогом 127.0.0.1 и представляет петлевой интерфейс IPv6. 
!!! 127.0.1.1 — это запись обратной связи, зарезервированная специально для полного доменного имени.

127. (9.3.) Обзор работы с устройствами и модулями

Системы Linux в целом традиционно использовали метод создания статических устройств, при котором создавалось очень много узлов устройств /dev(иногда буквально тысячи узлов), 
независимо от того, существовали ли на самом деле соответствующие аппаратные устройства. 
Обычно это делалось с помощью сценария MAKEDEV , который содержит несколько вызовов mknod . 
с соответствующими старшими и второстепенными номерами устройств для каждого возможного устройства, которое может существовать в мире.
Используя метод udev, только те устройства, которые обнаружены ядром, получают созданные для них узлы устройств. 
Поскольку эти узлы устройств будут создаваться каждый раз при загрузке системы, 
они будут храниться в devtmpfs файловой системе (виртуальной файловой системе, которая полностью находится в системной памяти). 
Узлы устройств не требуют много места, поэтому используемая память незначительна.

sysfs
Можно задаться вопросом, как узнать sysfs об устройствах, присутствующих в системе, и какие номера устройств следует использовать для них. 
Драйверы, которые были скомпилированы в ядро, напрямую регистрируют свои объекты с помощью sysfs(devtmpfs внутри), поскольку они обнаруживаются ядром. 
Для драйверов, скомпилированных как модули, эта регистрация произойдет при загрузке модуля. 
После sysfs монтирования файловой системы (в /sys) данные, с которыми регистрируются драйверы, 
sysfs доступны процессам пользовательского пространства и udevd для обработки (включая модификации узлов устройств).

Создание узла устройства
Файлы устройств создаются ядром devtmpfs файловой системой. 
Любой драйвер, который хочет зарегистрировать узел устройства, пройдет через devtmpfs(через ядро ​​​​драйвера), чтобы сделать это. 
Когда devtmpfs экземпляр монтируется на /dev, узел устройства изначально создается с фиксированным именем, разрешениями и владельцем.
Через некоторое время ядро ​​отправит uevent в udevd. 
На основе правил, указанных в файлах в каталогах , , и, /etc/udev/rules.dudevd /usr/lib/udev/rules.d 
создаст дополнительные символические ссылки на узел устройства, или изменит его разрешения, владельца или группу, или изменит запись (имя) внутренней базы данных udevd для этого объекта. 
/run/udev/rules.d
Правила в этих трех каталогах пронумерованы, и все три каталога объединены. 
Если 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 , как описано выше.

128. (9.3.3.) Проблемы с загрузкой модулей и созданием устройств

0. Модуль ядра не загружается автоматически:
Udev загрузит модуль только в том случае, если у него есть псевдоним, специфичный для шины, и драйвер шины правильно экспортирует необходимые псевдонимы в sysfs. 
В остальных случаях следует организовать загрузку модулей другими способами. 
Известно, что в Linux-5.16.9 udev загружает правильно написанные драйверы для устройств INPUT, IDE, PCI, USB, SCSI, SERIO и FireWire.
Чтобы определить, имеет ли требуемый драйвер устройства необходимую поддержку udev, запустите modinfo с именем модуля в качестве аргумента. 
Теперь попробуйте найти каталог устройства /sys/bus и проверьте, есть ли там modalias файл.
Если modalias файл существует в sysfs, драйвер поддерживает устройство и может обращаться к нему напрямую, но не имеет псевдонима, это ошибка в драйвере. 
Загрузите драйвер без помощи udev и ожидайте, что проблема будет исправлена ​​позже.
modalias 
Если в соответствующем каталоге под , нет файла /sys/bus, это означает, что разработчики ядра еще не добавили поддержку модалий для этого типа шины. 
В Linux-5.16.9 это относится к шинам ISA. 
Ожидайте, что эта проблема будет исправлена ​​в более поздних версиях ядра.
Udev вообще не предназначен для загрузки драйверов - оболочек , таких как snd-pcm-oss, и неаппаратных драйверов, таких как loop.

1. Модуль ядра не загружается автоматически, и udev не предназначен для его загрузки.
Если модуль « wrapper » только расширяет функциональные возможности, предоставляемые другим модулем (например, snd-pcm-oss расширяет функциональные возможности snd-pcm , 
делая звуковые карты доступными для приложений OSS), настройте modprobe для загрузки оболочки после загрузки udev. обернутый модуль. 
Для этого добавьте в соответствующий файл строку « softdep ». 

Например: /etc/modprobe.d/.conf
softdep snd-pcm post: snd-pcm-oss

Обратите внимание, что команда « softdep » также допускает pre:зависимости или их сочетание . 
См. справочную страницу для получения дополнительной информации о синтаксисе и возможностях « softdep » .pre:post:modprobe.d(5)

2. Udev неправильно создает устройство или делает неверную симлинк
Обычно это происходит, если правило неожиданно соответствует устройству. 
Например, плохо написанное правило может соответствовать как диску SCSI (по желанию), так и соответствующему универсальному устройству SCSI (неверно) по поставщику. 
Найдите неправильное правило и сделайте его более конкретным с помощью команды "udevadm info".
udevadm info

3. Порядок именования устройств изменяется случайным образом после перезагрузки
Это связано с тем, что udev по своей природе обрабатывает uevents и загружает модули параллельно и, следовательно, в непредсказуемом порядке. 
Это никогда не будет « исправлено » . Вы не должны полагаться на стабильность имен устройств ядра. 
Вместо этого создайте свои собственные правила, которые создают символические ссылки со стабильными именами на основе некоторых стабильных атрибутов устройства, 
таких как серийный номер или вывод различных утилит *_id, установленных udev.

4. Полезное почитать
http://www.kroah.com/linux/talks/ols_2003_udev_paper/Reprint-Kroah-Hartman-OLS2003.pdf
https://mirrors.edge.kernel.org/pub/linux/kernel/people/mochel/doc/papers/ols-2005/mochel.pdf

129. (9.3.3.3.) Udev загружает какой-то нежелательный модуль \ отключить драйвер \ пример с forte

Либо не создавайте модуль, либо занесите его в черный список в /etc/modprobe.d/blacklist.conf файле, как это сделано с модулем forte в примере ниже:
vim /etc/modprobe.d/blacklist.conf
----------------------------------
blacklist forte
----------------------------------

130. (9.4.) Управление устройствами

Порядок, в котором появляются устройства с одинаковыми функциями, по /dev сути, случайный. 
Например, если у вас есть USB-веб-камера и ТВ-тюнер, иногда /dev/video0 ссылается на камеру и /dev/video1 ссылается на тюнер, 
а иногда после перезагрузки порядок меняется. 
Для всех классов оборудования, кроме звуковых карт и сетевых карт, это можно исправить, создав правила udev для пользовательских постоянных символических ссылок. 
Случай с сетевыми картами рассматривается отдельно в Разделе 9.2.

Для каждого из ваших устройств, которые могут иметь эту проблему (даже если проблема не существует в вашем текущем дистрибутиве Linux), 
найдите соответствующий каталог в папке /sys/class или /sys/block.
Выясните атрибуты, которые однозначно идентифицируют устройство (обычно работают идентификаторы производителя и продукта и/или серийные номера): /sys/class/video4linux/videoX

Затем напишите правила, создающие символические ссылки, например:
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по-прежнему случайным образом ссылаются на тюнер и веб-камеру (и, следовательно, никогда не должны использоваться напрямую), 
но есть символические ссылки /dev/tvtuner, /dev/webcam которые всегда указывают на правильное устройство.

131. (9.5.) Настройка системных часов

В этом разделе обсуждается, как настроить системную службу systemd-timedated , которая настраивает системные часы и часовой пояс.
systemd-timedated читает/etc/adjtime и, в зависимости от содержимого файла, устанавливает часы либо на UTC, либо на местное время.
Если /etc/adjtimeон отсутствует при первой загрузке, systemd-timedated предположит, что аппаратные часы установлены на UTC, и настроит файл в соответствии с этим.

Создайте /etc/adjtimeфайл со следующим содержимым, если ваши аппаратные часы настроены на местное время:
cat > /etc/adjtime << "EOF"
0.0 0 0.0
0
LOCAL
EOF

!!! Обратите внимание, что команда timedatectl не работает в среде chroot. Его можно использовать только после загрузки системы LFS с помощью systemd.
Вы также можете использовать утилиту timedatectl , чтобы сообщить systemd-timedated , установлены ли ваши аппаратные часы на UTC или местное время:
timedatectl set-local-rtc 1

timedatectl также можно использовать для изменения системного времени и часового пояса.

Чтобы изменить текущее системное время, зону:
timedatectl set-time YYYY-MM-DD HH:MM:SS
timedatectl set-timezone TIMEZONE

Вы можете получить список доступных часовых поясов, запустив:
timedatectl list-timezones

132. (9.5.1.) Синхронизация сетевого времени

Начиная с версии 213, systemd поставляет демон под названием systemd-timesyncd , который можно использовать для синхронизации системного времени с удаленными серверами NTP.
Демон не предназначен для замены хорошо зарекомендовавшего себя демона NTP, а только как клиентская реализация протокола SNTP, 
которую можно использовать для менее сложных задач и в системах с ограниченными ресурсами.

Начиная с systemd версии 216 демон systemd-timesyncd включен по умолчанию. 
Если вы хотите отключить его, введите следующую команду:
systemctl disable systemd-timesyncd

Этот /etc/systemd/timesyncd.conf файл можно использовать для изменения серверов NTP, с которыми синхронизируется systemd-timesyncd .

Обратите внимание, что если системные часы установлены на местное время, systemd-timesyncd не будет обновлять аппаратные часы.

133. (9.6.) Настройка консоли Linux (Configuring the Linux Console)

В этом разделе обсуждается, как настроить системную службу systemd-vconsole-setup , которая настраивает шрифт виртуальной консоли и раскладку клавиатуры.
Служба systemd-vconsole-setup считывает /etc/vconsole.confфайл для получения информации о конфигурации. 
Решите, какая раскладка клавиатуры и экранный шрифт будут использоваться. 

В этом также могут помочь различные HOWTO для конкретных языков:
http://www.tldp.org/HOWTO/HOWTO-INDEX/other-lang.html

Изучите "localectl list-keymaps", чтобы найти список допустимых раскладок консоли. 
Найдите в /usr/share/consolefont sкаталоге допустимые экранные шрифты.
localectl list-keymaps

Файл /etc/vconsole.conf должен содержать строки вида: ПЕРЕМЕННАЯ="значение". 

Распознаются следующие переменные:
KEYMAP Эта переменная определяет таблицу сопоставления клавиш для клавиатуры. Если не установлено, по умолчанию используется us.
KEYMAP_TOGGLE Эту переменную можно использовать для настройки второй раскладки клавиш переключения, и по умолчанию она не установлена.
FONT Эта переменная определяет шрифт, используемый виртуальной консолью.
FONT_MAP Эта переменная указывает используемую карту консоли.
FONT_UNIMAP Эта переменная определяет карту шрифтов Unicode.

Создадим файл vconsole.conf:
cat > /etc/vconsole.conf << "EOF"
KEYMAP=en
FONT=Lat2-Terminus16
EOF

Вы можете изменить значение KEYMAP во время выполнения с помощью утилиты localectl:
!!! Обратите внимание, что команда localectl не работает в среде chroot. Его можно использовать только после загрузки системы LFS с помощью systemd.
localectl set-keymap MAP

list-x11-keymap-models - Показывает известные модели раскладки клавиатуры X11.
list-x11-keymap-layouts - Показывает известные раскладки клавиатуры X11.
list-x11-keymap-variants - Показывает известные варианты раскладки клавиатуры X11.
list-x11-keymap-options - Показывает известные параметры раскладки клавиатуры X11.


134. (9.7.) Настройка языкового стандарта системы (Configuring the System Locale)

В /etc/locale.confприведенном ниже файле задаются некоторые переменные среды, необходимые для поддержки родного языка. Правильная их установка приводит к:
Вывод программ, которые переводятся на ваш родной язык
Правильная классификация символов на буквы, цифры и другие классы. Это необходимо для того , чтобы bash правильно принимал символы, отличные от ASCII, в командных строках в неанглийских локалях.
Правильный алфавитный порядок сортировки для страны
Подходящий размер бумаги по умолчанию
Правильное форматирование денежных значений, времени и дат

Замените  приведенный ниже двухбуквенный код нужного языка (например, « en » )
и двухбуквенный код соответствующей страны (например, « GB » ). 
 следует заменить каноническим шармапом для выбранной вами локали. 
Также могут присутствовать необязательные модификаторы, такие как « @euro » .

Список всех локалей, поддерживаемых Glibc, можно получить, выполнив следующую команду:
locale -a

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

LC_ALL=en_US locale charmap
"ISO-8859-1"

Важно, чтобы локаль, найденная с помощью приведенной выше эвристики, была проверена до ее добавления в файлы запуска Bash:
LC_ALL= locale language
LC_ALL= locale charmap
LC_ALL= locale int_curr_symbol
LC_ALL= locale int_prefix

Приведенные выше команды должны вывести название языка, кодировку символов, используемую в локали, местную валюту и префикс,
который необходимо набрать перед телефонным номером, чтобы попасть в страну. 
Если какая-либо из приведенных выше команд завершается с ошибкой с сообщением, подобным показанному ниже, это означает, 
что ваша локаль либо не была установлена ​​в главе 8, либо не поддерживается установкой Glibc по умолчанию.
Пример ошибки: "locale: Cannot set LC_* to default locale: No such file or directory"

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

После определения правильных настроек локали создайте /etc/locale.conf файл:
cat > /etc/locale.conf << "EOF"
LANG=en_US.ISO-8859-1
EOF

localectl set-locale LANG="en_US.UTF-8" LC_CTYPE="en_US"

Обратите внимание, что вы можете изменить /etc/locale.confс помощью утилиты systemd localectl. 
Чтобы использовать localectl для приведенного выше примера, запустите:
#!!! Примечание: Обратите внимание, что команда localectl не работает в среде chroot.
#localectl set-locale LANG="_.<@modifiers>"
localectl set-locale LANG="en_US.UTF-8" LC_CTYPE="en_US"

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

135. (9.8.) Создание файла /etc/inputrc

Этот inputrc файл представляет собой файл конфигурации для библиотеки readline, который предоставляет возможности редактирования, 
когда пользователь вводит строку с терминала. 
Он работает, переводя ввод с клавиатуры в определенные действия. 
Readline используется bash и большинством других оболочек, а также многими другими приложениями.

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

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

cat > /etc/inputrc << "EOF"
# Begin /etc/inputrc
# Modified by Chris Lynn 

# 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

136. (9.9.) Создание файла /etc/shells

Файл shells содержит список оболочек входа в систему. 
Приложения используют этот файл, чтобы определить, действительна ли оболочка. 
Для каждой оболочки должна присутствовать одна строка, состоящая из пути оболочки относительно корня структуры каталогов (/).

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

Это требование для таких приложений, как GDM , который не заполняет браузер лиц, если не может найти /etc/shells, или демоны FTP,
 которые традиционно запрещают доступ пользователям с оболочками, не включенными в этот файл.

cat > /etc/shells << "EOF"
# Begin /etc/shells

/bin/sh
/bin/bash

# End /etc/shells
EOF

137. (9.10.) Использование и конфигурация Systemd


0. Отключение очистки экрана во время загрузки
!!! Нормальным поведением systemd является очистка экрана в конце последовательности загрузки.
mkdir -pv /etc/systemd/system/getty@tty1.service.d
cat > /etc/systemd/system/getty@tty1.service.d/noclear.conf << EOF
[Service]
TTYVTDisallocate=no
EOF

1. Отключение tmpfs для /tmp
По умолчанию /tmpсоздается как tmpfs, это можно переопределить: 
ln -sfv /dev/null /etc/systemd/system/tmp.mount


2. Настройка автоматического создания и удаления файлов
Существует несколько сервисов, которые создают или удаляют файлы или каталоги:
systemd-tmpfiles-clean.service
systemd-tmpfiles-setup-dev.service
systemd-tmpfiles-setup.service
Системное расположение файлов конфигурации — /usr/lib/tmpfiles.d/*.conf.
Локальные файлы конфигурации находятся в формате /etc/tmpfiles.d. 
Файлы в /etc/tmpfiles.d переопределяют файлы с тем же именем в /usr/lib/tmpfiles.d.
Обратите внимание, что синтаксис /usr/lib/tmpfiles.d/*.conf файлов может сбивать с толку. 
Например, удаление файлов по умолчанию в каталоге /tmp находится в /usr/lib/tmpfiles.d/tmp.conf строке:
q /tmp 1777 root root 10d
Поле типа q обсуждает создание подтома с квотами, которые на самом деле применимы только к файловым системам btrfs. 
Он ссылается на тип v, который, в свою очередь, ссылается на тип d (каталог). 
Затем создается указанный каталог, если он отсутствует, и настраиваются разрешения и права собственности, как указано. 
Содержимое каталога будет подвергаться очистке на основе времени, если указан аргумент age.
Если параметры по умолчанию не нужны, то файл следует скопировать /etc/tmpfiles.d и отредактировать по желанию. 
Например:
mkdir -p /etc/tmpfiles.d
cp /usr/lib/tmpfiles.d/tmp.conf /etc/tmpfiles.d


3. Переопределение поведения служб по умолчанию:
Параметры устройства можно переопределить, создав каталог и файл конфигурации в формате /etc/systemd/system. 
Например:
mkdir -pv /etc/systemd/system/foobar.service.d

cat > /etc/systemd/system/foobar.service.d/foobar.conf << EOF
[Service]
Restart=always
RestartSec=30
EOF

После создания файла конфигурации запустите "systemctl daemon-reload" и "systemctl restart foobar" активируйте изменения в службе.

4. Отладка последовательности загрузки
Вместо простых сценариев оболочки, используемых в системах инициализации в стиле SysVinit или BSD, systemd использует унифицированный формат для различных типов файлов запуска (или модулей). 
Команда systemctl используется для включения, выключения, управления состоянием и получения состояния юнит-файлов. 
Вот несколько примеров часто используемых команд:
systemctl list-units -t  [--all] : список загруженных файлов модулей типа service.
systemctl list-units -t  [--all] : список загруженных файлов модулей типа target.
systemctl show -p Wants  : показывает все юниты, зависящие от многопользовательской цели. Цели — это специальные юнит-файлы, несовместимые с уровнями запуска в SysVinit.
systemctl status  : показывает статус службы servicename. Расширение .service можно опустить, если нет других юнит-файлов с таким же именем, например файлов .socket 

5.  Работа с журналом Systemd
Вход в систему, загруженную с помощью systemd, обрабатывается с помощью systemd-journald (по умолчанию), а не с помощью типичного демона системного журнала Unix. 
Вы также можете добавить обычный демон системного журнала и, если хотите, оба будут работать параллельно. 
Программа systemd-journald хранит записи журнала в двоичном формате, а не в текстовом файле журнала. 
Для облегчения разбора файла предусмотрена команда journalctl . 
Вот несколько примеров часто используемых команд:
journalctl -r : показывает все содержимое журнала в обратном хронологическом порядке.
journalctl -uUNIT : показывает записи журнала, связанные с указанным файлом UNIT.
journalctl -b[=ID] -r : показывает записи журнала с момента последней успешной загрузки (или для идентификатора загрузки) в обратном хронологическом порядке.
journalctl -f : обеспечивает функциональность, аналогичную tail -f (follow).

6. Работа с дампом ядра
Дампы ядра полезны для отладки аварийных программ, особенно когда аварийно завершается процесс демона. 
В системах, загружаемых с помощью systemd, дамп ядра обрабатывается systemd-coredump . 
Он зарегистрирует дамп ядра в журнале и сохранит сам дамп ядра в формате /var/lib/systemd/coredump . 
Для извлечения и обработки дампов ядра предоставляется инструмент coredumpctl . 
Вот несколько примеров часто используемых команд:
!!! https://www.linuxfromscratch.org/blfs/view/stable-systemd/general/gdb.html
coredumpctl -r : перечисляет все дампы ядра в обратном хронологическом порядке.
coredumpctl -1 info : показывает информацию из последнего дампа ядра.
coredumpctl -1 debug : загружает последний дамп ядра в GDB .
Дампы ядра могут занимать много места на диске. 
Максимальное дисковое пространство, используемое дампом ядра, можно ограничить, создав файл конфигурации в формате /etc/systemd/coredump.conf.d. 
Например:
mkdir -pv /etc/systemd/coredump.conf.d
cat > /etc/systemd/coredump.conf.d/maxuse.conf << EOF
[Coredump]
MaxUse=5G
EOF

Дополнительную информацию см на страницах руководства systemd-coredump(8), coredumpctl(1), и .coredump.conf.d(5)

7. Длительные процессы
Начиная с systemd-230, все пользовательские процессы уничтожаются при завершении сеанса пользователя, даже если используется nohup или процесс использует функции daemon()или setsid(). 
Это преднамеренный переход от исторически разрешительной среды к более ограничительной. Новое поведение может вызвать проблемы, 
если вы зависите от долго работающих программ (например, screen или tmux ), чтобы они оставались активными после завершения сеанса пользователя.
 Есть три способа разрешить зависшим процессам оставаться после завершения сеанса пользователя.

Включить задержку процесса только для выбранных пользователей : обычные пользователи имеют разрешение включить задержку процесса с помощью команды "loginctl enable-linger" для своего пользователя. Системные администраторы могут использовать ту же команду с userаргументом для включения пользователя. 
Затем этот пользователь может использовать команду systemd-run для запуска длительных процессов. 
Например: systemd-run --scope --user /usr/bin/screen. 
Если вы включите задержку для своего пользователя, user@.service останется даже после закрытия всех сеансов входа и автоматически запустится при загрузке системы. 
Это имеет то преимущество, что явно разрешает и запрещает запуск процессов после завершения сеанса пользователя, 
но нарушает обратную совместимость с такими инструментами, как nohup и утилитами, использующими файлы daemon().

Включить задержку KillUserProcesses=no процесса вы можете в /etc/systemd/logind.conf, включить задержку процесса глобально для всех пользователей. 
Преимущество этого заключается в том, что старый метод остается доступным для всех пользователей за счет явного контроля.

Отключить во время сборки : вы можете отключить задержку по умолчанию при сборке systemd, добавив переключатель -Ddefault-kill-user-processes=false в команду meson для systemd. 
Это полностью отключает способность systemd убивать пользовательские процессы в конце сеанса.

138. (10.1.) Создание загрузочной системы LFS

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

Создайте новую таблицу файловых систем следующим образом
cat > /etc/fstab << "EOF"
# Begin /etc/fstab

# file system  mount-point  type     options             dump  fsck
#                                                              order

/dev/     /                defaults            1     1
/dev/     swap         swap     pri=1               0     0
# End /etc/fstab
EOF

Замените , , и  значениями, соответствующими системе, например, sda2, sda5, и ext4. 
Подробнее о шести полях этого файла см. man 5 fstab .

## yyy строку я удалю и сделаю swap в виде файла

Создаём файл для swap:
fallocate -l 1G /.swap
chmod 600 /.swap
mkswap /.swap
echo '/.swap none swap pri=1 0 0' >> /etc/fstab

мой fstab:
cat /etc/fstab 
--------------
# Begin /etc/fstab

# file system  mount-point  type     options             dump  fsck
#                                                              order

UUID="0d11142b-6b3d-4fc0-bf11-706f2764de84"    /            ext4    defaults            1     1
/.swap     swap         swap     pri=1               0     0

# End
--------------

139. (10.3. Linux-5.16.9) Сборка ядра linux

Сборка ядра включает в себя несколько шагов — настройку, компиляцию и установку.
0. Распакуем ядро
cd /source
tar -xpf linux-5.16.9.tar.xz
cd  linux-5.16.9

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

2. Хорошей отправной точкой для настройки конфигурации ядра является запуск "make defconfig" . 
Это установит базовую конфигурацию в хорошее состояние, учитывающее вашу текущую системную архитектуру.
make defconfig

3. После использование make defconfig можно до настроить ядро используя "make menuconfig"
Обязательно включите/отключите/настройте следующие функции, иначе система может работать некорректно или вообще не загружаться:
General setup -->
   [ ] Auditing Support [CONFIG_AUDIT]
   < > Enable kernel headers through /sys/kernel/kheaders.tar.xz [CONFIG_IKHEADERS]
   [*] Control Group support [CONFIG_CGROUPS]   --->
      [*] Memory controller [CONFIG_MEMCG]
   [ ] Enable deprecated sysfs features to support old userspace tools [CONFIG_SYSFS_DEPRECATED]
   [*] Configure standard kernel features (expert users) [CONFIG_EXPERT] --->
      [*] open by fhandle syscalls [CONFIG_FHANDLE]
   CPU/Task time and stats accounting --->
      [*] Pressure stall information tracking [CONFIG_PSI]
General architecture-dependent options  --->
   [*] Enable seccomp to safely compute untrusted bytecode [CONFIG_SECCOMP]
Networking support  --->
  Networking options  --->
   <*> The IPv6 protocol [CONFIG_IPV6]
Device Drivers  --->
  Firmware Drivers   --->
   [*] Export DMI identification via sysfs to userspace [CONFIG_DMIID]
  Graphics support --->
   Frame buffer Devices --->
      [*] Support for frame buffer devices ----
  Generic Driver Options  --->
   [ ] Support for uevent helper [CONFIG_UEVENT_HELPER]
   [*] Maintain a devtmpfs filesystem to mount at /dev [CONFIG_DEVTMPFS]
   Firmware Loader --->
      [ ] Enable the firmware sysfs fallback mechanism [CONFIG_FW_LOADER_USER_HELPER]
File systems  --->
   [*] Inotify support for userspace [CONFIG_INOTIFY_USER]
  Pseudo filesystems  --->
   [*] Tmpfs POSIX Access Control Lists [CONFIG_TMPFS_POSIX_ACL]

4. Значение необязательных переменных среды make:
LANG= LC_ALL=
Это устанавливает настройку локали на ту, которая используется на хосте. 
Это может понадобиться для правильной отрисовки линии интерфейса menuconfig ncurses на текстовой консоли Linux UTF-8.
Если используется, обязательно замените  значение $LANG переменной с вашего хоста.
Вместо этого вы можете использовать значение хоста $LC_ALLили $LC_CTYPE.
make help

5. Сборка
make

6. Установка и сборка модулей
make modules_install

7. копирование файлов ядра
Путь к образу ядра может различаться в зависимости от используемой платформы. 
Приведенное ниже имя файла можно изменить по своему вкусу, но основа имени файла должна быть vmlinuz , 
чтобы быть совместимым с автоматической настройкой процесса загрузки, описанной в следующем разделе.
cp -iv arch/x86/boot/bzImage /boot/vmlinuz-5.16.9-lfs-11.1-systemd

System.map это файл символов для ядра. 
Он отображает точки входа каждой функции в API ядра, а также адреса структур данных ядра для работающего ядра. 
Он используется в качестве ресурса при исследовании проблем с ядром. 
Введите следующую команду, чтобы установить файл карты:
cp -iv System.map /boot/System.map-5.16.9

Файл конфигурации ядра, .config созданный на шаге make menuconfig выше, содержит все параметры конфигурации для только что скомпилированного ядра. 
Рекомендуется сохранить этот файл для дальнейшего использования:
cp -iv .config /boot/config-5.16.9

Установите документацию для ядра Linux:
install -d /usr/share/doc/linux-5.16.9
cp -r Documentation/* /usr/share/doc/linux-5.16.9

Важно отметить, что файлы в исходном каталоге ядра не принадлежат пользователю root. 
Всякий раз, когда пакет распаковывается как пользователь root (как мы делали внутри chroot), файлы имеют идентификаторы пользователя и группы, какие бы они ни были на компьютере упаковщика. 
Обычно это не проблема для установки любого другого пакета, потому что исходное дерево удаляется после установки. 
Однако исходное дерево Linux часто сохраняется в течение длительного времени. 
Из-за этого есть шанс, что любой идентификатор пользователя, который использовал упаковщик, будет назначен кому-то на машине. 
Тогда этот человек будет иметь доступ для записи к исходному коду ядра.
Если исходное дерево ядра будет сохранено, запустите "chown -R 0:0" в linux-5.16.9 каталоге, чтобы убедиться, что все файлы принадлежат пользователю root.

!!! Предупреждение
Некоторая документация по ядру рекомендует создавать символическую ссылку, /usr/src/linuxуказывающую на исходный каталог ядра. 
Это характерно для ядер до серии 2.6 и не должно создаваться в системе LFS, поскольку это может вызвать проблемы для пакетов, которые вы, возможно, 
захотите собрать после того, как ваша базовая система LFS будет завершена.

!!! Предупреждение
Заголовки в системном includecкаталоге ( /usr/include) всегда должны быть теми, с которыми был скомпилирован Glibc, 
то есть очищенными заголовками, установленными в разделе 5.4, «Заголовки API Linux-5.16.9». 
Следовательно, их никогда не следует заменять необработанными заголовками ядра или любыми другими очищенными заголовками ядра.



initramfs может понадобится если у вас в fstab используются UIID'ы:
https://www.linuxfromscratch.org/blfs/view/svn/postlfs/initramfs.html
нужно создать скрипт mkinitramfs
сгенерировать и скопировать и т.д. см документацию
mkinitramfs
cp initrd.img-no-kmods /boot/

140. (10.3.2.) Настройка порядка загрузки модулей Linux

В большинстве случаев модули 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

141. (10.3.3.) Содержимое Linux

10.3.3. Содержимое Linux
Установленные файлы:
config-5.16.9, vmlinuz-5.16.9-lfs-11.1-systemd и System.map-5.16.9

Установленные каталоги:
/lib/modules, /usr/share/doc/linux-5.16.9

config-5.16.9 : Содержит все параметры конфигурации ядра.

vmlinuz-5.16.9-lfs-11.1-systemd : Движок системы Linux. 
При включении компьютера ядро ​​является первой загружаемой частью операционной системы. 
Он обнаруживает и инициализирует все компоненты аппаратного обеспечения компьютера, затем делает эти компоненты доступными для программного обеспечения в виде дерева файлов 
и превращает один ЦП в многозадачную машину, способную запускать множество программ, казалось бы, одновременно.

System.map-5.16.9 : Список адресов и символов; он отображает точки входа и адреса всех функций и структур данных в ядре

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

0. Об именах GRUB:
GRUB использует собственную структуру именования дисков и разделов в виде (hdn,m) , где n — номер жесткого диска, а m — номер раздела. 
Номер жесткого диска начинается с нуля, а номер раздела начинается с единицы для обычных разделов и с пяти для расширенных разделов. 
Обратите внимание, что это отличается от более ранних версий, где оба числа начинались с нуля. Например, раздел sda1( hd0,1) для GRUB и sdb3( hd1,3). 
В отличие от Linux, GRUB не считает приводы CD-ROM жесткими дисками. 
Например, при использовании компакт-диска hdb и второго жесткого диска в hdc, этот второй жесткий диск все равно будет (hd1).

Настройка конфигурации:
GRUB работает, записывая данные на первую физическую дорожку жесткого диска. 
Эта область не является частью какой-либо файловой системы. 
Программы там получают доступ к модулям GRUB в загрузочном разделе. Расположение по умолчанию — /boot/grub/.

Расположение загрузочного раздела — выбор пользователя, влияющий на конфигурацию. 
Одна из рекомендаций состоит в том, чтобы иметь отдельный небольшой (рекомендуемый размер 200 МБ) раздел только для загрузочной информации.
Таким образом, каждая сборка, будь то LFS или какой-либо коммерческий дистрибутив, может получить доступ к одним и тем же загрузочным файлам, и доступ может осуществляться из любой загруженной системы.
Если вы решите сделать это, вам нужно будет смонтировать отдельный раздел, переместить все файлы в текущем /boot каталоге (например, ядро ​​Linux, которое вы только что собрали в предыдущем разделе) 
в новый раздел. Затем вам нужно будет размонтировать раздел и перемонтировать его как/boot. 
Если вы это сделаете, обязательно обновите /etc/fstab.
Использование текущего раздела lfs также будет работать, но конфигурация для нескольких систем более сложна.
Используя приведенную выше информацию, определите соответствующее обозначение для корневого раздела (или загрузочного раздела, если используется отдельный раздел). 
В следующем примере предполагается, что корневым (или отдельным загрузочным) разделом является sda2.
Установите файлы GRUB /boot/grubи настройте загрузочную дорожку:

!!! Предупреждение
2. Следующая команда перезапишет текущий загрузчик. Не запускайте команду, если это нежелательно, например, 
при использовании стороннего диспетчера загрузки для управления основной загрузочной записью (MBR).
#grub-install /dev/sda
grub-install /dev/vdb

!!! Примечание
Если система была загружена с использованием UEFI, grub-install попытается установить файлы для цели x86_64-efi ,
но эти файлы не были установлены в главе 8 . Если это так, добавьте --target i386-pc к команде выше.

3.  Создание файла конфигурации GRUB
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 5.16.9-lfs-11.1-systemd" {
        linux   /boot/vmlinuz-5.16.9-lfs-11.1-systemd root=/dev/sda2 ro
}
EOF

!!! Примечание
С точки зрения GRUB файлы ядра относятся к используемому разделу. Если вы использовали отдельный раздел /boot, удалите /boot из приведенной выше строки linux. 
Вам также нужно будет изменить установленную корневую строку, чтобы она указывала на загрузочный раздел.

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



143. (11.1.) Конец

0. Отличная работа! Установлена ​​новая система LFS! 
Мы желаем вам больших успехов с вашей новой блестящей системой Linux, созданной по индивидуальному заказу.
Может быть хорошей идеей создать /etc/lfs-release файл. 
Имея этот файл, вам (и нам, если в какой-то момент понадобится обратиться за помощью) очень легко узнать, какая версия LFS установлена ​​в системе. 
Создайте этот файл, запустив:
echo 11.1-systemd > /etc/lfs-release

1. !!! Обязательно настройте поля «DISTRIB_CODENAME» и «VERSION_CODENAME», чтобы сделать систему уникальной.

Два файла, описывающие установленную систему, могут использоваться пакетами, которые могут быть установлены в системе позже, либо в двоичной форме, либо путем их сборки.
Первый показывает статус вашей новой системы по отношению к базе стандартов Linux (LSB). 
Чтобы создать этот файл, запустите:
cat > /etc/lsb-release << "EOF"
DISTRIB_ID="Linux From Scratch"
DISTRIB_RELEASE="11.1-systemd"
DISTRIB_CODENAME=""
DISTRIB_DESCRIPTION="Linux From Scratch"
EOF

Второй содержит примерно ту же информацию и используется systemd и некоторыми графическими средами рабочего стола. 
Чтобы создать этот файл, запустите:
cat > /etc/os-release << "EOF"
NAME="Linux From Scratch"
VERSION="11.1-systemd"
ID=lfs
PRETTY_NAME="Linux From Scratch 11.1-systemd"
VERSION_CODENAME=""
EOF


2. Теперь, когда все программное обеспечение установлено, пришло время перезагрузить компьютер.
logout

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

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

umount -v $LFS

#shutdown -r now
#poweroff

Чем заняться после установки LFS:

0. Браузер в текстовом режиме, такой как Lynx 
https://www.linuxfromscratch.org/blfs/view/stable-systemd/basicnet/lynx.html
1. Сертификаты:
https://www.linuxfromscratch.org/blfs/view/stable-systemd/postlfs/make-ca.html
2. Копирование и вставка
https://www.linuxfromscratch.org/blfs/view/stable-systemd/general/gpm.html
3. sudo - повышение привилегий
https://www.linuxfromscratch.org/blfs/view/stable-systemd/postlfs/sudo.html
4. openssh
https://www.linuxfromscratch.org/blfs/view/stable-systemd/postlfs/openssh.html
5. wget 
https://www.linuxfromscratch.org/blfs/view/stable-systemd/basicnet/wget.html
6. wi-fi
https://www.linuxfromscratch.org/blfs/view/stable-systemd/basicnet/wpa_supplicant.html
7. изучите конфиги
/etc/bashrc
/etc/dircolors
/etc/fstab
/etc/hosts
/etc/inputrc
/etc/profile
/etc/resolv.conf
/etc/vimrc
/root/.bash_profile
/root/.bashrc

8. Ставить пакеты из BFLS