8.5.1. Установка пакета Glibc
Некоторые программы Glibc используют не совместимый с FHS каталог
/var/db
для хранения своих данных во
время выполнения. Примените следующий патч, чтобы эти программы
хранили свои данные в каталогах, совместимых с FHS:
patch -Np1 -i ../glibc-2.39-fhs-1.patch
Документация Glibc рекомендует выполнять компиляцию в отдельном
каталоге:
mkdir -v build
cd build
Убедитесь, что утилиты ldconfig и sln будут установлены в
/usr/sbin
:
echo "rootsbindir=/usr/sbin" > configparms
Подготовьте Glibc к компиляции:
../configure --prefix=/usr \
--disable-werror \
--enable-kernel=4.19 \
--enable-stack-protector=strong \
--disable-nscd \
libc_cv_slibdir=/usr/lib
Значение параметров настройки:
-
--disable-werror
-
Отключает параметр -Werror, передаваемый GCC. Это необходимо
для запуска набора тестов.
-
--enable-kernel=4.19
-
Этот параметр сообщает системе сборки, что Glibc может
использоваться с ядрами старше 4.19. Это значение
используется для создание обходных путей на случай, если
системный вызов, представленный в более поздней версии,
нельзя будет использовать.
-
--enable-stack-protector=strong
-
Этот параметр повышает безопасность системы за счет
добавления дополнительного кода для проверки переполнения
буфера. Обратите внимание, что Glibc всегда явно
переопределяет параметры GCC по умолчанию, поэтому необходимо
всегда указывать эту опцию, несмотря на то, что мы уже
указали --enable-default-ssp
для
GCC.
-
--disable-nscd
-
Параметр отключает сборку демона кэша службы имен, который
больше не используется.
-
libc_cv_slibdir=/usr/lib
-
Эта переменная устанавливает правильную библиотеку для всей
системы. Мы не хотим, чтобы использовалась lib64
Скомпилируйте пакет:
make
Важно
В этом разделе набор тестов для Glibc считается критически
важным. Ни в коем случае не пропускайте его.
Как правило, несколько тестов не проходят. Ошибки тестирования,
перечисленные ниже, можно игнорировать.
make check
Вы можете увидеть, что ряд тестов завершились неудачей. Набор
тестов Glibc в некоторой степени зависит от хост-системы. Несколько
ошибок из более чем 5000 тестов можно игнорировать. Список наиболее
распространенных проблем последних версий LFS:
-
Известно, что io/tst-lchmod не работает в среде
chroot LFS.
-
Известно, что некоторые тесты, например nss/tst-nss-files-hosts-multi и
nptl/tst-thread-affinity*
завершаются неудачей из-за тайм-аута (особенно когда система
работает относительно медленно и/или набор тестов запущен в
несколько потоков). Эти тесты могут быть идентифицированы с
помощью следующей команды:
grep "Timed out" -l $(find -name \*.out)
Можно повторно запустить отдельный тест, увеличив таймаут с
помощью команды TIMEOUTFACTOR=<factor>
make test
t=<test
name>
. Например, TIMEOUTFACTOR=10 make test
t=nss/tst-nss-files-hosts-multi перезапустит
nss/tst-nss-files-hosts-multi,
увеличив начальный таймаут в 10 раз.
-
Кроме того, некоторые тесты могут завершиться неудачно при
использовании относительно старой модели процессора
(например, elf/tst-cpu-features-cpuinfo) или
версии ядра хоста (например, stdlib/tst-arc4random-thread).
На этапе установки Glibc будет жаловаться на отсутствие файла
/etc/ld.so.conf
, хотя это безобидное
сообщение, предотвратить его появление можно с помощью команды:
touch /etc/ld.so.conf
Исправьте Makefile, чтобы пропустить устаревшую проверку
работоспособности, которая завершается неудачей в современной
конфигурации Glibc:
sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile
Важно
При обновлении Glibc до новой минорной версии (например, с
Glibc-2.36 до Glibc-2.39) в работающей системе LFS вам необходимо
принять некоторые дополнительные меры предосторожности, чтобы
избежать поломки системы:
-
Обновление Glibc в системе LFS до версии 11.0 не
поддерживается. Пересоберите LFS, если вы используете такую
старую систему, но вам нужна более новая Glibc.
-
При обновлении системы LFS до версии 12.0 установите
Libxcrypt следуя
инструкции Раздел 8.26,
«Libxcrypt-4.4.36.». В дополнение к обычной установке
Libxcrypt, вы ДОЛЖНЫ следовать примечанию со страницы
Libxcrypt, чтобы установить libcrypt.so.1*
(заменив libcrypt.so.1
из предыдущей установки
Glibc).
-
При обновлении системы LFS до версии 12.1 удалите программу
nscd:
rm -f /usr/sbin/nscd
Если система (до LFS 12.1) основана на Systemd, необходимо
также отключить и остановить службу nscd прямо сейчас:
systemctl disable --now nscd
-
Обновите ядро и перезагрузитесь, если оно старше 4.19
(проверьте текущую версию с помощью uname -r) или, если вы
хотите обновить имеющееся ядро, выполните действия из
Раздел 10.3, «Linux-6.7.4.»
-
Обновите заголовочные файлы API ядра, если они старше 4.19
(проверьте текущую версию с помощью cat
/usr/include/linux/version.h) или, если вы
просто хотите обновить их, следуйте Раздел 5.4,
«Заголовочные файлы Linux-6.7.4 API» (но удалив
$LFS
из команды cp).
-
Выполните установку DESTDIR
и
обновите общие библиотеки Glibc в системе с помощью одной
команды install:
make DESTDIR=$PWD/dest install
install -vm755 dest/usr/lib/*.so.* /usr/lib
Крайне важно строго следовать описанным выше шагам, если вы не
совсем понимаете, что делаете. Любое
неожиданное отклонение может сделать систему полностью
непригодной для использования. ВЫ ПРЕДУПРЕЖДЕНЫ.
Затем продолжайте выполнять команды make install, sed для /usr/bin/ldd
и команды для установки локалей.
Как только они будут выполнены, перезагрузите систему.
Установите пакет:
make install
Исправьте жестко заданный путь к исполняемому загрузчику в скрипте
ldd:
sed '/RTLDLIST=/s@/usr@@g' -i /usr/bin/ldd
Затем установите локали, которые дадут возможность системе отвечать
на разных языках. Ни одна из локалей не требуется системе, но если
некоторые из них отсутствуют, то наборы тестов ряда пакетов будут
пропускать важные тестовые сценарии.
Отдельные локали можно установить с помощью программы localedef. Например, вторая
команда localedef
приведенная ниже, объединяет определение независимой от набора
символов локали /usr/share/i18n/locales/cs_CZ
с набором символов
/usr/share/i18n/charmaps/UTF-8.gz
и
добавляет результат в файл /usr/lib/locale/locale-archive
. Следующие
инструкции установят минимальный набор локалей, необходимый для
оптимального охвата тестов
mkdir -pv /usr/lib/locale
localedef -i C -f UTF-8 C.UTF-8
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
Кроме того, установите локаль для вашей страны, языка и набора
символов.
В качестве альтернативы, установите сразу все локали перечисленные
в файле glibc-2.39/localedata/SUPPORTED
(он включает все
локали из списка выше и многие другие), выполнив команду:
make localedata/install-locales
Затем используйте команду localedef для создания и
установки локалей, не перечисленных в файле glibc-2.39/localedata/SUPPORTED
, когда они вам
понадобятся. Например, для некоторых тестов в этой главе
потребуются следующие две локали:
localedef -i C -f UTF-8 C.UTF-8
localedef -i ja_JP -f SHIFT_JIS ja_JP.SJIS 2> /dev/null || true
Примечание
Glibc теперь использует libidn2 для разрешения
интернационализированных доменных имен. Если такая функция
необходима, то инструкцию по установке libidn2 можно найти на
странице
BLFS libidn2.
8.5.2. Настройка Glibc
8.5.2.1. Добавление nsswitch.conf
Необходимо создать файл /etc/nsswitch.conf
, потому что настроенный по
умолчанию Glibc плохо работает в сетевой среде.
Создайте новый фай /etc/nsswitch.conf
, выполнив следующие
действия:
cat > /etc/nsswitch.conf << "EOF"
# Begin /etc/nsswitch.conf
passwd: files systemd
group: files systemd
shadow: files systemd
hosts: mymachines resolve [!UNAVAIL=return] files myhostname dns
networks: files
protocols: files
services: files
ethers: files
rpc: files
# End /etc/nsswitch.conf
EOF
8.5.2.2. Добавление данных о часовом поясе
Установите и настройте часовой пояс следующим образом:
tar -xf ../../tzdata2024a.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 MB не используя каталог
posix
, однако некоторые
приложения или наборы тестов могут вызывать сбои.
-
zic -L
leapseconds ...
-
Создаёт правильные часовые пояса с секундами координации.
На встраиваемых системах с небольшим диском, где часовые
пояса никогда не будут обновляться, а правильность времени
неважна, можно выиграть примерно 1.9 MB, исключив каталог
right
.
-
zic ... -p
...
-
Создаёт файл posixrules
.
Используется New York, потому что POSIX требует, чтобы
правила перехода на летнее время соответствовали правилам
США.
Один из способов определить местный часовой пояс — запустить
следующий скрипт:
tzselect
После нескольких вопросов о местоположении скрипт выдаст
наименование часового пояса (например America/Edmonton). В файле
/usr/share/zoneinfo
перечислены и
другие возможные часовые пояса, такие как Canada/Eastern или EST5EDT, которые не распознаются
скриптом, но могут быть использованы.
Создайте файл /etc/localtime
выполнив:
ln -sfv /usr/share/zoneinfo/<xxx>
/etc/localtime
Замените <xxx>
на
имя выбранного часового пояса (например, Europe/Moscow).
8.5.2.3. Настройка
динамического загрузчика
По умолчанию, динамический загрузчик (/lib/ld-linux.so.2
) ищет в каталоге
/usr/lib
, нужные для работы
программ библиотеки. Однако, если библиотеки находятся в другом
каталоге, то его необходимо указать в файле /etc/ld.so.conf
, чтобы динамический загрузчик
мог их найти. Два каталога - /usr/local/lib
и /opt/lib
часто используются для дополнительных
библиотек, поэтому добавьте их в пути поиска для динамического
загрузчика.
Создайте новый файл /etc/ld.so.conf
выполнив:
cat > /etc/ld.so.conf << "EOF"
# Begin /etc/ld.so.conf
/usr/local/lib
/opt/lib
EOF
Динамический загрузчик может выполнить поиск в каталоге и
включить содержимое найденных там файлов. Обычно такие файлы
состоят из одной строки и содержат путь к библиотеке. Чтобы
добавить эту возможность, выполните следующие команды:
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