书史足自悦,安用勤与劬。这篇文章主要讲述Linux From Scratch(LFS11.0)构建 LFS 系统 - Glibc-2.34相关的知识,希望能为你提供帮助。
Glibc 软件包包含主要的 C 语言库。它提供用于分配内存、检索目录、打开和关闭文件、读写文件、字符串处理、模式匹配、算术等用途的基本子程序。
安装 Glibc解压软件包:
cd /sources
tar xf glibc-2.34.tar.xz
cd glibc-2.34
首先,修复上游开发者发现的一项安全问题:
sed -e \'/NOTIFY_REMOVED)/s/)/ \\& \\& data.attr != NULL)/\' \\
-i sysdeps/unix/sysv/linux/mq_notify.c
某些 Glibc 程序使用与 FHS 不兼容的 /var/db 目录存放运行时数据。
应用下列补丁,使得这些程序在 FHS 兼容的位置存储运行时数据:
patch -Np1 -i ../glibc-2.34-fhs-1.patch
Glibc 文档推荐在专用目录中构建它:
mkdir -v build
cd build
确保将 ldconfig 和 sln 工具安装到 /usr/sbin 目录中:
echo "rootsbindir=/usr/sbin" > configparms
编译并检查 Glibc:
time { ../configure --prefix=/usr\\
--disable-werror\\
--enable-kernel=3.2\\
--enable-stack-protector=strong\\
--with-headers=/usr/include\\
libc_cv_slibdir=/usr/lib & & make & & make check; }
文章图片
您可能看到一些失败结果。Glibc 的测试套件和宿主系统之间有某种依赖关系。在 4200 多项测试中,如果只有几项测试失败,一般可以忽略它们。
下面列出在一些版本的 LFS 上发现的,最常见的问题:
- 已知 io/tst-lchmod 在 LFS chroot 环境中会失败。
- 已知 misc/tst-ttyname 在 LFS chroot 环境中会失败。
touch /etc/ld.so.conf
修正生成的 Makefile,跳过一个在 LFS 的不完整环境中会失败的完整性检查:
sed \'/test-installation/s@$(PERL)@echo not running@\' -i ../Makefile
安装该软件包:
make install
改正 ldd 脚本中硬编码的可执行文件加载器路径:
sed \'/RTLDLIST=/s@/usr@@g\' -i /usr/bin/ldd
安装 nscd 的配置文件和运行时目录:
cp -v ../nscd/nscd.conf /etc/nscd.conf
mkdir -pv /var/cache/nscd
安装 nscd 的 systemd 支持文件:
install -v -Dm644 ../nscd/nscd.tmpfiles /usr/lib/tmpfiles.d/nscd.conf
install -v -Dm644 ../nscd/nscd.service /usr/lib/systemd/system/nscd.service
下面,安装一些 locale,它们可以使得系统用不同语言响应用户请求。这些 locale 都不是必须的,但是如果缺少了它们中的某些,在将来运行软件包的测试套件时,可能跳过重要的测试。
可以用 localedef 程序安装单独的 locale。例如,下面的第一个 localedef 命令将 /usr/share/i18n/locales/cs_CZ 中的字符集无关 locale 定义和 /usr/share/i18n/charmaps/UTF-8.gz 中的字符映射定义组合起来,并附加到 /usr/lib/locale/locale-archive 文件。以下命令将会安装能够覆盖测试所需的最小 locale 集合:
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.SIJS 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
另外,安装适合您自己国家、语言和字符集的 locale。
或者,也可以一次安装 glibc-2.34/localedata/SUPPORTED 中列出的所有 locale (包括上面列出的所有 locale,以及其他很多)。执行下面这个需要很长时间的命令:
make localedata/install-locales
如果需要,再使用 localedef 命令创建和安装 glibc-2.34/localedata/SUPPORTED 中没有列出的 locale。例如,本章中后续的一些测试可能需要安装两个 locale:
localedef -i POSIX -f UTF-8 C.UTF-8 2> /dev/null || true
localedef -i ja_JP -f SHIFT_JIS ja_JP.SIJS 2> /dev/null || true
配置 Glibc 创建 nsswitch.conf由于 Glibc 的默认值在网络环境下不能很好地工作,需要创建配置文件 /etc/nsswitch.conf。
执行以下命令创建新的 /etc/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
添加时区数据输入以下命令,安装并设置时区数据:
tar -xf ../../tzdata2021a.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
配置动态加载器默认情况下,动态加载器 (/lib/ld-linux.so.2) 在 /lib 和 /usr/lib 中搜索程序运行时需要的动态库。然而,如果在除了 /lib 和 /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
如果希望的话,动态加载器也可以搜索一个目录,并将其中的文件包含在 ld.so.conf 中。通常包含文件目录中的文件只有一行,指定一个期望的库文件目录。
如果需要这项功能,执行以下命令:
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
【Linux From Scratch(LFS11.0)构建 LFS 系统 - Glibc-2.34】
安装完成后清理工作:
cd ../..
rm -rf glibc-2.34
本次分享到此结束啦~
关注公众号:Lucifer三思而后行
推荐阅读
- LFS 系列从零开始 DIY Linux 系统(构建 LFS 系统 - XML::Parser-2.44)
- Letsencrypt SSL 证书过期问题
- LFS 系列从零开始 DIY Linux 系统(构建 LFS 系统 - Diffutils-3.3)
- yum命令
- Redis-cluster高可用集群部署
- 培训第一天
- 博客迁移
- 使用sersync实现实时数据同步
- 修改后的父主题CSS,如何将这些更改推送到子主题()