-
Created by
虚拟的现实, last updated on Jun 18, 2025 19 minute read
1. 简介
LFS是Linux From Scratch的简称,LFS 存在的一个重要原因是可以帮助人们学习 linux 系统内部是如何工作的。构建一个 LFS 系统会帮助演示是什么使 linux 运转,各种组件如何在一起互相依赖的工作。最好的事情之一通过这种学习可以获得完全根据自己的需求定制 linux 系统的能力。
LFS 的一个关键的好处是它让用户对于系统有更多的控制,而不是依赖于他人的 linux 实现。在 LFS 的世界里,你自己坐在司机的位置,掌控系统的每一个细节,比如目录布局和启动脚本配置等等。你也能掌控在哪里、为何、以及怎样安装每一个程序。有关LFS相关的资料可以去这个链接中查找:http://www.linuxfromscratch.org
1.1. 环境配置
| 项目 | 软件 | CPU | 内存 | 硬盘 | 网络 | 备注 |
|---|---|---|---|---|---|---|
| 虚拟机软件 | VirtualBox7.1.6 | 2 | 4 | 50+20 | NAT | 映射端口访问 |
| 宿主机 | Windows11 | i3-9100 | 16 | 1T |
|
|
| 虚拟机系统 | Debian12 |
|
|
|
|
最小化安装 |
- 虚拟机 50G 硬盘为 Debian12 的硬盘,20G硬盘为 LFS 的目标硬盘


- 参照 https://wiki.waringid.me/x/PgAS 完成 Debian 系统安装和镜像源配置
- 将新建用户 lf 加入 sudo 组。usermod -aG sudo lf
- 安装基础的开发组件
- 检查相关组件是否符合 LFS 项目的要求
sudo apt install -y build-essential vim sudo apt install -y autoconf automake gdb libffi-dev zlib1g-dev libssl-dev git wget
cat > version-check.sh << "EOF"
#!/bin/bash
# A script to list version numbers of critical development tools
# If you have tools installed in other directories, adjust PATH here AND
# in ~lfs/.bashrc (section 4.4) as well.
LC_ALL=C
PATH=/usr/bin:/bin
bail() { echo "FATAL: $1"; exit 1; }
grep --version > /dev/null 2> /dev/null || bail "grep does not work"
sed '' /dev/null || bail "sed does not work"
sort /dev/null || bail "sort does not work"
ver_check()
{
if ! type -p $2 &>/dev/null
then
echo "ERROR: Cannot find $2 ($1)"; return 1;
fi
v=$($2 --version 2>&1 | grep -E -o '[0-9]+\.[0-9\.]+[a-z]*' | head -n1)
if printf '%s\n' $3 $v | sort --version-sort --check &>/dev/null
then
printf "OK: %-9s %-6s >= $3\n" "$1" "$v"; return 0;
else
printf "ERROR: %-9s is TOO OLD ($3 or later required)\n" "$1";
return 1;
fi
}
ver_kernel()
{
kver=$(uname -r | grep -E -o '^[0-9\.]+')
if printf '%s\n' $1 $kver | sort --version-sort --check &>/dev/null
then
printf "OK: Linux Kernel $kver >= $1\n"; return 0;
else
printf "ERROR: Linux Kernel ($kver) is TOO OLD ($1 or later required)\n" "$kver";
return 1;
fi
}
# Coreutils first because --version-sort needs Coreutils >= 7.0
ver_check Coreutils sort 8.1 || bail "Coreutils too old, stop"
ver_check Bash bash 3.2
ver_check Binutils ld 2.13.1
ver_check Bison bison 2.7
ver_check Diffutils diff 2.8.1
ver_check Findutils find 4.2.31
ver_check Gawk gawk 4.0.1
ver_check GCC gcc 5.2
ver_check "GCC (C++)" g++ 5.2
ver_check Grep grep 2.5.1a
ver_check Gzip gzip 1.3.12
ver_check M4 m4 1.4.10
ver_check Make make 4.0
ver_check Patch patch 2.5.4
ver_check Perl perl 5.8.8
ver_check Python python3 3.4
ver_check Sed sed 4.1.5
ver_check Tar tar 1.22
ver_check Texinfo texi2any 5.0
ver_check Xz xz 5.0.0
ver_kernel 5.4
if mount | grep -q 'devpts on /dev/pts' && [ -e /dev/ptmx ]
then echo "OK: Linux Kernel supports UNIX 98 PTY";
else echo "ERROR: Linux Kernel does NOT support UNIX 98 PTY"; fi
alias_check() {
if $1 --version 2>&1 | grep -qi $2
then printf "OK: %-4s is $2\n" "$1";
else printf "ERROR: %-4s is NOT $2\n" "$1"; fi
}
echo "Aliases:"
alias_check awk GNU
alias_check yacc Bison
alias_check sh Bash
echo "Compiler check:"
if printf "int main(){}" | g++ -x c++ -
then echo "OK: g++ works";
else echo "ERROR: g++ does NOT work"; fi
rm -f a.out
if [ "$(nproc)" = "" ]; then
echo "ERROR: nproc is not available or it produces empty output"
else
echo "OK: nproc reports $(nproc) logical cores are available"
fi
EOF
sudo bash version-check.sh
![]()
针对上述检查结果补齐没有安装的组件
sudo apt install bison gawk texinfo
1.2. 磁盘分区及格式
20G 为 LFS 的目标磁盘,共分3个区
- sdb1 规划 300M ,目标格式 ext2 用于挂载启动分区 /boot
- sdb2 规划 1G,用作交换分区
- sdb3 规划剩余的空间,分区格式:ext4,挂载根分区

sudo mkfs -v -t ext2 /dev/sdb1 sudo mkswap /dev/sdb2 sudo mkfs -v -t ext4 /dev/sdb3
1.3. 下载软件包
- 创建软件包的存储目录
- 下载对应的软件包
- 软件包的下载地址文件 https://www.linuxfromscratch.org/lfs/view/stable/wget-list-sysv
- 软件包的 md5 校验文件 https://www.linuxfromscratch.org/lfs/view/stable/md5sums
- 如果存在无法下载的软件包可以参考国内镜像网站 https://mirrors.ustc.edu.cn/lfs/lfs-packages/12.3/
- 验证软件包的 md5 值,确保软件包数量一致
export LFS=/mnt/lfs echo $LFS sudo mkdir -pv $LFS sudo mount -v -t ext4 /dev/sdb3 $LFS sudo chown root:root $LFS sudo chmod 755 $LFS wget https://www.linuxfromscratch.org/lfs/view/stable/wget-list-sysv wget https://www.linuxfromscratch.org/lfs/view/stable/md5sums sudo mv md5sums $LFS/sources/ vim wget-list-sysv sudo mkdir -pv $LFS/sources sudo chmod -v a+wt $LFS/sources/ sudo wget --input-file=wget-list-sysv --continue --directory-prefix=$LFS/sources/ pushd $LFS/sources/ sudo md5sum -c md5sums popd
![]()
1.4. 创建文件目录布局
以下操作通过 root 用户操作
mkdir -pv $LFS/{etc,var} $LFS/usr/{bin,lib,sbin}
for i in bin lib sbin; do
ln -sv usr/$i $LFS/$i
done
case $(uname -m) in
x86_64) mkdir -pv $LFS/lib64 ;;
esac
mkdir -pv $LFS/tools
1.5. 添加 LFS 用户并配置用户环境
groupadd lfs
useradd -s /bin/bash -g lfs -m -k /dev/null lfs
passwd lfs
chown -v lfs $LFS/{usr{,/*},var,etc,tools}
case $(uname -m) in
x86_64) chown -v lfs $LFS/lib64 ;;
esac
su - lfs
cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF
cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/usr/bin
if [ ! -L /bin ]; then PATH=/bin:$PATH; fi
PATH=$LFS/tools/bin:$PATH
CONFIG_SITE=$LFS/usr/share/config.site
export LFS LC_ALL LFS_TGT PATH CONFIG_SITE
EOF
source ~/.bash_profile

- LFS_TGT=$(uname -m)-lfs-linux-gnu。LFS_TGT变量设定了一个非默认,但与宿主系统兼容的机器描述符。该描述符被用于构建交叉编译器和交叉编译临时工具链。
- set +h。set +h 命令关闭 bash 的散列功能。一般情况下,散列是很有用的 —— bash 使用一个散列表维护各个可执行文件的完整路径,这样就不用每次都在 PATH 指定的目录中搜索可执行文件。然而,在构建 LFS 时,我们希望总是使用最新安装的工具。关闭散列功能强制 shell 在运行程序时总是搜索 PATH。这样,一旦$LFS/tools/bin 中有新的工具可用,shell 就能够找到它们,而不是使用之前记忆在散列表中,由宿主发行版提供的 /usr/bin 或 /bin 中的工具。
- 将 umask 设定为 022,保证只有文件所有者可以写新创建的文件和目录,但任何人都可读取或搜索 (仅针对目录) 它们
2. 编译交叉工具链
构建临时编译环境前需要确认 LFS 环境变量是否配置正确,并确保使用 lfs 用户登入且已经进入 sources 目录
su - lfs export LFS=/mnt/lfs echo $LFS cd $LFS/sources/ mkdir -v build
2.1. Binutils-2.44 第一遍
tar Jxvf binutils-2.44.tar.xz
cd $LFS/sources/build
..//binutils-2.44/configure --prefix=$LFS/tools \
--with-sysroot=$LFS \
--target=$LFS_TGT \
--disable-nls \
--enable-gprofng=no \
--disable-werror \
--enable-new-dtags \
--enable-default-hash-style=gnu
make
make install
2.2. GCC-14.2.0 第一遍
tar Jxvf gcc-14.2.0.tar.xz
cd gcc-14.2.0
tar -xf ../mpfr-4.2.1.tar.xz
mv -v mpfr-4.2.1 mpfr
tar -xf ../gmp-6.3.0.tar.xz
mv -v gmp-6.3.0 gmp
tar -xf ../mpc-1.3.1.tar.gz
mv -v mpc-1.3.1 mpc
case $(uname -m) in
x86_64)
sed -e '/m64=/s/lib64/lib/' \
-i.orig gcc/config/i386/t-linux64
;;
esac
mkdir -v build
cd build
../configure \
--target=$LFS_TGT \
--prefix=$LFS/tools \
--with-glibc-version=2.41 \
--with-sysroot=$LFS \
--with-newlib \
--without-headers \
--enable-default-pie \
--enable-default-ssp \
--disable-nls \
--disable-shared \
--disable-multilib \
--disable-threads \
--disable-libatomic \
--disable-libgomp \
--disable-libquadmath \
--disable-libssp \
--disable-libvtv \
--disable-libstdcxx \
--enable-languages=c,c++
make
make install
cd ..
cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
`dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include/limits.h
2.3. Linux-6.13.4 API 头文件
tar xf linux-6.13.4.tar.xz cd linux-6.13.4 make mrproper make headers find usr/include -type f ! -name '*.h' -delete cp -rv usr/include $LFS/usr
2.4. Glibc-2.41
tar xf glibc-2.41.tar.xz
cd glibc-2.41
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
patch -Np1 -i ../glibc-2.41-fhs-1.patch
mkdir -v build
cd build
echo "rootsbindir=/usr/sbin" > configparms
../configure \
--prefix=/usr \
--host=$LFS_TGT \
--build=$(../scripts/config.guess) \
--enable-kernel=5.4 \
--with-headers=$LFS/usr/include \
--disable-nscd \
libc_cv_slibdir=/usr/lib
make
make DESTDIR=$LFS install
sed '/RTLDLIST=/s@/usr@@g' -i $LFS/usr/bin/ldd
echo 'int main(){}' | $LFS_TGT-gcc -xc -
readelf -l a.out | grep ld-linux
rm -v a.out
如果一切正常,那么应该没有错误消息,而且最后一行命令应该输出下列格式的内容:
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

2.5. GCC-14.2.0 中的 Libstdc++
Libstdc++ 是 C++ 标准库。我们需要它才能编译 C++ 代码 (GCC 的一部分用 C++ 编写)。但在构建第一遍的 GCC时我们不得不暂缓安装它,因为 Libstdc++ 依赖于当时还没有安装到目标目录的 Glibc。
cd gcc-14.2.0
cd build
../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++/14.2.0
make
make DESTDIR=$LFS install
rm -v $LFS/usr/lib/lib{stdc++{,exp,fs},supc++}.la
3. 交叉编译临时工具
使用刚刚构建的交叉工具链对基本工具进行交叉编译。这些工具会被安装到它们的最终位置,但现在还无法使用。基本操作仍然依赖宿主系统的工具。尽管如此,在链接时会使用刚刚安装的库。
3.1. M4-1.4.19
tar xvf m4-1.4.19.tar.xz
cd m4-1.4.19
./configure --prefix=/usr \
--host=$LFS_TGT \
--build=$(build-aux/config.guess)
make
make DESTDIR=$LFS install
3.2. Ncurses-6.5
tar xf ncurses-6.5.tar.gz
cd ncurses-6.5
mkdir build
pushd build
../configure AWK=gawk
make -C include
make -C progs tic
popd
./configure --prefix=/usr \
--host=$LFS_TGT \
--build=$(./config.guess) \
--mandir=/usr/share/man \
--with-manpage-format=normal \
--with-shared \
--without-normal \
--with-cxx-shared \
--without-debug \
--without-ada \
--disable-stripping \
AWK=gawk
make
make DESTDIR=$LFS TIC_PATH=$(pwd)/build/progs/tic install
ln -sv libncursesw.so $LFS/usr/lib/libncurses.so
sed -e 's/^#if.*XOPEN.*$/#if 1/' \
-i $LFS/usr/include/curses.h
3.3. Bash-5.2.37
tar xvf bash-5.2.37.tar.gz
cd bash-5.2.37
./configure --prefix=/usr \
--build=$(sh support/config.guess) \
--host=$LFS_TGT \
--without-bash-malloc
make
make DESTDIR=$LFS install
ln -sv bash $LFS/bin/sh
3.4. Coreutils-9.6
tar xvf coreutils-9.6.tar.xz
cd coreutils-9.6
./configure --prefix=/usr \
--host=$LFS_TGT \
--build=$(build-aux/config.guess) \
--enable-install-program=hostname \
--enable-no-install-program=kill,uptime
make
make DESTDIR=$LFS install
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
3.5. Diffutils-3.11
tar xvf diffutils-3.11.tar.xz
cd diffutils-3.11
./configure --prefix=/usr \
--host=$LFS_TGT \
--build=$(./build-aux/config.guess)
make
make DESTDIR=$LFS install
3.6. File-5.46
tar xvf file-5.46.tar.gz
cd file-5.46
mkdir build
pushd build
../configure --disable-bzlib \
--disable-libseccomp \
--disable-xzlib \
--disable-zlib
make
popd
./configure --prefix=/usr --host=$LFS_TGT --build=$(./config.guess)
make FILE_COMPILE=$(pwd)/build/src/file
make DESTDIR=$LFS install
rm -v $LFS/usr/lib/libmagic.la
3.7. Findutils-4.10.0
tar xvf findutils-4.10.0.tar.xz
cd findutils-4.10.0
./configure --prefix=/usr \
--localstatedir=/var/lib/locate \
--host=$LFS_TGT \
--build=$(build-aux/config.guess)
make
make DESTDIR=$LFS install
3.8. Gawk-5.3.1
tar xvf gawk-5.3.1.tar.xz
cd gawk-5.3.1
sed -i 's/extras//' Makefile.in
./configure --prefix=/usr \
--host=$LFS_TGT \
--build=$(build-aux/config.guess)
make
make DESTDIR=$LFS install
3.9. Grep-3.11
tar xvf grep-3.11.tar.xz
cd grep-3.11
./configure --prefix=/usr \
--host=$LFS_TGT \
--build=$(./build-aux/config.guess)
make
make DESTDIR=$LFS install
3.10. Gzip-1.13
tar xvf gzip-1.13.tar.xz cd gzip-1.13 ./configure --prefix=/usr --host=$LFS_TGT make make DESTDIR=$LFS install
3.11. Make-4.4.1
tar xvf make-4.4.1.tar.gz
cd make-4.4.1
./configure --prefix=/usr \
--without-guile \
--host=$LFS_TGT \
--build=$(build-aux/config.guess)
make
make DESTDIR=$LFS install
3.12. Patch-2.7.6
tar xvf patch-2.7.6.tar.xz
cd patch-2.7.6
./configure --prefix=/usr \
--host=$LFS_TGT \
--build=$(build-aux/config.guess)
make
make DESTDIR=$LFS install
3.13. Sed-4.9
tar xvf sed-4.9.tar.xz
cd sed-4.9
./configure --prefix=/usr \
--host=$LFS_TGT \
--build=$(./build-aux/config.guess)
make
make DESTDIR=$LFS install
3.14. Tar-1.35
tar xvf tar-1.35.tar.xz
cd tar-1.35
./configure --prefix=/usr \
--host=$LFS_TGT \
--build=$(build-aux/config.guess)
make
make DESTDIR=$LFS install
3.15. Xz-5.6.4
tar xvf xz-5.6.4.tar.xz
cd xz-5.6.4
./configure --prefix=/usr \
--host=$LFS_TGT \
--build=$(build-aux/config.guess) \
--disable-static \
--docdir=/usr/share/doc/xz-5.6.4
make
make DESTDIR=$LFS install
rm -v $LFS/usr/lib/liblzma.la
3.16. Binutils-2.44 - 第二遍
tar Jxvf binutils-2.44.tar.xz
cd binutils-2.44
sed '6031s/$add_dir//' -i ltmain.sh
mkdir -v build
cd build
../configure \
--prefix=/usr \
--build=$(../config.guess) \
--host=$LFS_TGT \
--disable-nls \
--enable-shared \
--enable-gprofng=no \
--disable-werror \
--enable-64-bit-bfd \
--enable-new-dtags \
--enable-default-hash-style=gnu
make
make DESTDIR=$LFS install
rm -v $LFS/usr/lib/lib{bfd,ctf,ctf-nobfd,opcodes,sframe}.{a,la}
3.17. GCC-14.2.0 - 第二遍
tar xvf gcc-14.2.0.tar.xz
cd gcc-14.2.0
tar -xf ../mpfr-4.2.1.tar.xz
mv -v mpfr-4.2.1 mpfr
tar -xf ../gmp-6.3.0.tar.xz
mv -v gmp-6.3.0 gmp
tar -xf ../mpc-1.3.1.tar.gz
mv -v mpc-1.3.1 mpc
case $(uname -m) in
x86_64)
sed -e '/m64=/s/lib64/lib/' \
-i.orig gcc/config/i386/t-linux64
;;
esac
sed '/thread_header =/s/@.*@/gthr-posix.h/' \
-i libgcc/Makefile.in libstdc++-v3/include/Makefile.in
mkdir -v build
cd build
../configure \
--build=$(../config.guess) \
--host=$LFS_TGT \
--target=$LFS_TGT \
LDFLAGS_FOR_TARGET=-L$PWD/$LFS_TGT/libgcc \
--prefix=/usr \
--with-build-sysroot=$LFS \
--enable-default-pie \
--enable-default-ssp \
--disable-nls \
--disable-multilib \
--disable-libatomic \
--disable-libgomp \
--disable-libquadmath \
--disable-libsanitizer \
--disable-libssp \
--disable-libvtv \
--enable-languages=c,c++
make
make DESTDIR=$LFS install
ln -sv gcc $LFS/usr/bin/cc
4. 进入 Chroot 并构建其他临时工具
由于已经解决了所有循环依赖问题,现在即可使用“chroot”环境进行构建,它与宿主系统 (除正在运行的内核外) 完全隔离。所有命令必须以 root 用户身份执行,且 LFS 变量必须正确设定。在进入 chroot 之后,仍然以 root 身份执行所有命令。
4.1. 改变所有者
目前,$LFS 中整个目录树的所有者都是 lfs,这个用户只在宿主系统存在。如果不改变 $LFS 中文件和目录的所有权,它们会被一个没有对应账户的用户 ID 所有。这是危险的,因为后续创建的新用户可能获得这个用户 ID,并成为 $LFS 中全部文件的所有者,从而产生恶意操作这些文件的可能。
export LFS=/mnt/lfs
echo $LFS
chown --from lfs -R root:root $LFS/{usr,lib,var,etc,bin,sbin,tools}
case $(uname -m) in
x86_64) chown --from lfs -R root:root $LFS/lib64 ;;
esac
4.2. 准备虚拟内核文件系统
mkdir -pv $LFS/{dev,proc,sys,run}
mount -v --bind /dev $LFS/dev
mount -vt devpts devpts -o gid=5,mode=0620 $LFS/dev/pts
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
mount -vt tmpfs tmpfs $LFS/run
if [ -h $LFS/dev/shm ]; then
install -v -d -m 1777 $LFS$(realpath /dev/shm)
else
mount -vt tmpfs -o nosuid,nodev tmpfs $LFS/dev/shm
fi
4.3. 进入 chroot 环境
chroot "$LFS" /usr/bin/env -i \
HOME=/root \
TERM="$TERM" \
PS1='(lfs chroot) \u:\w\$ ' \
PATH=/usr/bin:/usr/sbin \
MAKEFLAGS="-j$(nproc)" \
TESTSUITEFLAGS="-j$(nproc)" \
/bin/bash --login
4.4. 创建目录和相关文件
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/lib/locale
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
ln -sv /proc/self/mounts /etc/mtab
cat > /etc/hosts << EOF
127.0.0.1 localhost $(hostname)
::1 localhost
EOF
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
uuidd:x:80:80:UUID Generation Daemon User:/dev/null:/usr/bin/false
nobody:x:65534:65534:Unprivileged User:/dev/null:/usr/bin/false
EOF
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:
cdrom:x:15:
adm:x:16:
messagebus:x:18:
input:x:24:
mail:x:34:
kvm:x:61:
uuidd:x:80:
wheel:x:97:
users:x:999:
nogroup:x:65534:
EOF
echo "tester:x:101:101::/home/tester:/bin/bash" >> /etc/passwd
echo "tester:x:101:" >> /etc/group
install -o tester -d /home/tester
exec /usr/bin/bash --login
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
4.5. Gettext-0.24
cd sources
tar xvf gettext-0.24.tar.xz
cd gettext-0.24
./configure --disable-shared
make
cp -v gettext-tools/src/{msgfmt,msgmerge,xgettext} /usr/bin
4.6. Bison-3.8.2
tar xvf bison-3.8.2.tar.xz
cd bison-3.8.2
./configure --prefix=/usr \
--docdir=/usr/share/doc/bison-3.8.2
make
make install
4.7. Perl-5.40.1
tar xvf perl-5.40.1.tar.xz
cd perl-5.40.1
sh Configure -des \
-D prefix=/usr \
-D vendorprefix=/usr \
-D useshrplib \
-D privlib=/usr/lib/perl5/5.40/core_perl \
-D archlib=/usr/lib/perl5/5.40/core_perl \
-D sitelib=/usr/lib/perl5/5.40/site_perl \
-D sitearch=/usr/lib/perl5/5.40/site_perl \
-D vendorlib=/usr/lib/perl5/5.40/vendor_perl \
-D vendorarch=/usr/lib/perl5/5.40/vendor_perl
make
make install
4.8. Python-3.13.2
tar xvf Python-3.13.2.tar.xz
cd Python-3.13.2
./configure --prefix=/usr \
--enable-shared \
--without-ensurepip
make
make install
4.9. Texinfo-7.2
tar xvf texinfo-7.2.tar.xz cd texinfo-7.2 ./configure --prefix=/usr make make install
4.10. Util-linux-2.40.4
tar xvf util-linux-2.40.4.tar.xz
cd util-linux-2.40.4
mkdir -pv /var/lib/hwclock
./configure --libdir=/usr/lib \
--runstatedir=/run \
--disable-chfn-chsh \
--disable-login \
--disable-nologin \
--disable-su \
--disable-setpriv \
--disable-runuser \
--disable-pylibmount \
--disable-static \
--disable-liblastlog2 \
--without-python \
ADJTIME_PATH=/var/lib/hwclock/adjtime \
--docdir=/usr/share/doc/util-linux-2.40.4
make
make install
4.11. 清理和备份临时系统
清理
rm -rf /usr/share/{info,man,doc}/*
find /usr/{lib,libexec} -name \*.la -delete
rm -rf /tools
备份
备份操作需要离开 chroot 环境
exit
mountpoint -q $LFS/dev/shm && umount $LFS/dev/shm
umount $LFS/dev/pts
umount $LFS/{sys,proc,run,dev}
cd $LFS
tar -cJpf $HOME/lfs-temp-tools-12.3.tar.xz .
恢复备份
cd $LFS rm -rf ./* tar -xpf $HOME/lfs-temp-tools-12.3.tar.xz
如果在进行备份或从备份进行恢复时退出了 chroot 环境,记得检查内核虚拟文件系统是否仍然处于挂载状态 (可以使用 findmnt | grep $LFS 进行检查)。如果它们尚未挂载,需要按照 “4.2准备虚拟内核文件系统”的描述重新挂载内核虚拟文件系统,并重新进入 chroot 环境 ,再继续进行构建。

5. 构建 LFS 系统
5.1. Man-pages-6.12
tar xvf man-pages-6.12.tar.xz cd man-pages-6.12 rm -v man3/crypt* make -R GIT=false prefix=/usr install
5.2. Iana-Etc-20250123
tar xvf iana-etc-20250123.tar.gz cd iana-etc-20250123 cp services protocols /etc
5.3. Glibc-2.41
tar xvf glibc-2.41.tar.xz
cd glibc-2.41
patch -Np1 -i ../glibc-2.41-fhs-1.patch
mkdir -v build
cd build
echo "rootsbindir=/usr/sbin" > configparms
../configure --prefix=/usr \
--disable-werror \
--enable-kernel=5.4 \
--enable-stack-protector=strong \
--disable-nscd \
libc_cv_slibdir=/usr/lib
make
make check
sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile
make install
sed '/RTLDLIST=/s@/usr@@g' -i /usr/bin/ldd
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
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 ../../tzdata2025a.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 Asia/Shanghai
unset ZONEINFO tz
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
5.4. Zlib-1.3.1
tar xvf zlib-1.3.1.tar.gz cd zlib-1.3.1 ./configure --prefix=/usr make make check make install rm -fv /usr/lib/libz.a
5.5. Bzip2-1.0.8
tar xvf bzip2-1.0.8.tar.gz
cd bzip2-1.0.8
patch -Np1 -i ../bzip2-1.0.8-install_docs-1.patch
sed -i 's@\(ln -s -f \)$(PREFIX)/bin/@\1@' Makefile
sed -i "s@(PREFIX)/man@(PREFIX)/share/man@g" Makefile
make -f Makefile-libbz2_so
make clean
make
make PREFIX=/usr install
cp -av libbz2.so.* /usr/lib
ln -sv libbz2.so.1.0.8 /usr/lib/libbz2.so
cp -v bzip2-shared /usr/bin/bzip2
for i in /usr/bin/{bzcat,bunzip2}; do
ln -sfv bzip2 $i
done
rm -fv /usr/lib/libbz2.a
5.6. Xz-5.6.4
tar xvf xz-5.6.4.tar.xz
cd xz-5.6.4
./configure --prefix=/usr \
--disable-static \
--docdir=/usr/share/doc/xz-5.6.4
make
make install
5.7. Lz4-1.10.0
tar xvf lz4-1.10.0.tar.gz cd lz4-1.10.0 make BUILD_STATIC=no PREFIX=/usr make BUILD_STATIC=no PREFIX=/usr install
5.8. Zstd-1.5.7
tar xvf zstd-1.5.7.tar.gz cd zstd-1.5.7 make prefix=/usr make prefix=/usr install rm -v /usr/lib/libzstd.a
5.9. File-5.46
tar xvf file-5.46.tar.gz cd file-5.46 ./configure --prefix=/usr make make install
5.10. Readline-8.2.13
tar xvf readline-8.2.13.tar.gz
cd readline-8.2.13
sed -i '/MV.*old/d' Makefile.in
sed -i '/{OLDSUFF}/c:' support/shlib-install
sed -i 's/-Wl,-rpath,[^ ]*//' support/shobj-conf
./configure --prefix=/usr \
--disable-static \
--with-curses \
--docdir=/usr/share/doc/readline-8.2.13
make SHLIB_LIBS="-lncursesw"
make install
install -v -m644 doc/*.{ps,pdf,html,dvi} /usr/share/doc/readline-8.2.13
5.11. M4-1.4.19
tar xvf m4-1.4.19.tar.xz cd m4-1.4.19 ./configure --prefix=/usr make make install
5.12. Bc-7.0.3
tar xvf bc-7.0.3.tar.xz cd bc-7.0.3 CC=gcc ./configure --prefix=/usr -G -O3 -r make make install
5.13. Flex-2.6.4
tar xvf flex-2.6.4.tar.gz
cd flex-2.6.4
./configure --prefix=/usr \
--docdir=/usr/share/doc/flex-2.6.4 \
--disable-static
make
make install
ln -sv flex /usr/bin/lex
ln -sv flex.1 /usr/share/man/man1/lex.1
5.14. Tcl-8.6.16
tar xvf tcl8.6.16-src.tar.gz
cd tcl8.6.16
SRCDIR=$(pwd)
cd unix
./configure --prefix=/usr \
--mandir=/usr/share/man \
--disable-rpath
make
sed -e "s|$SRCDIR/unix|/usr/lib|" \
-e "s|$SRCDIR|/usr/include|" \
-i tclConfig.sh
sed -e "s|$SRCDIR/unix/pkgs/tdbc1.1.10|/usr/lib/tdbc1.1.10|" \
-e "s|$SRCDIR/pkgs/tdbc1.1.10/generic|/usr/include|" \
-e "s|$SRCDIR/pkgs/tdbc1.1.10/library|/usr/lib/tcl8.6|" \
-e "s|$SRCDIR/pkgs/tdbc1.1.10|/usr/include|" \
-i pkgs/tdbc1.1.10/tdbcConfig.sh
sed -e "s|$SRCDIR/unix/pkgs/itcl4.3.2|/usr/lib/itcl4.3.2|" \
-e "s|$SRCDIR/pkgs/itcl4.3.2/generic|/usr/include|" \
-e "s|$SRCDIR/pkgs/itcl4.3.2|/usr/include|" \
-i pkgs/itcl4.3.2/itclConfig.sh
unset SRCDIR
make install
chmod -v u+w /usr/lib/libtcl8.6.so
make install-private-headers
ln -sfv tclsh8.6 /usr/bin/tclsh
mv /usr/share/man/man3/{Thread,Tcl_Thread}.3
5.15. Expect-5.45.4
tar xvf expect5.45.4.tar.gz
cd expect5.45.4
python3 -c 'from pty import spawn; spawn(["echo", "ok"])'
patch -Np1 -i ../expect-5.45.4-gcc14-1.patch
./configure --prefix=/usr \
--with-tcl=/usr/lib \
--enable-shared \
--disable-rpath \
--mandir=/usr/share/man \
--with-tclinclude=/usr/include
make
make install
ln -svf expect5.45.4/libexpect5.45.4.so /usr/lib
5.16. DejaGNU-1.6.3
tar xvf dejagnu-1.6.3.tar.gz
cd dejagnu-1.6.3
mkdir -v build
cd build
../configure --prefix=/usr
makeinfo --html --no-split -o doc/dejagnu.html ../doc/dejagnu.texi
makeinfo --plaintext -o doc/dejagnu.txt ../doc/dejagnu.texi
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
5.17. Pkgconf-2.3.0
tar xvf pkgconf-2.3.0.tar.xz
cd pkgconf-2.3.0
./configure --prefix=/usr \
--disable-static \
--docdir=/usr/share/doc/pkgconf-2.3.0
make
make install
ln -sv pkgconf /usr/bin/pkg-config
ln -sv pkgconf.1 /usr/share/man/man1/pkg-config.1
5.18. Binutils-2.44
tar xvf binutils-2.44.tar.xz
cd binutils-2.44
mkdir -v build
cd build
../configure --prefix=/usr \
--sysconfdir=/etc \
--enable-ld=default \
--enable-plugins \
--enable-shared \
--disable-werror \
--enable-64-bit-bfd \
--enable-new-dtags \
--with-system-zlib \
--enable-default-hash-style=gnu
make tooldir=/usr
make tooldir=/usr install
rm -rfv /usr/lib/lib{bfd,ctf,ctf-nobfd,gprofng,opcodes,sframe}.a \
/usr/share/doc/gprofng/
5.19. GMP-6.3.0
tar xvf gmp-6.3.0.tar.xz
cd gmp-6.3.0
./configure --prefix=/usr \
--enable-cxx \
--disable-static \
--docdir=/usr/share/doc/gmp-6.3.0
make
make html
make install
make install-html
5.20. MPFR-4.2.1
tar xvf mpfr-4.2.1.tar.xz
cd mpfr-4.2.1
./configure --prefix=/usr \
--disable-static \
--enable-thread-safe \
--docdir=/usr/share/doc/mpfr-4.2.1
make
make html
make install
make install-html
5.21. MPC-1.3.1
tar xvf mpc-1.3.1.tar.gz
cd mpc-1.3.1
./configure --prefix=/usr \
--disable-static \
--docdir=/usr/share/doc/mpc-1.3.1
make
make html
make install
make install-html
5.22. Attr-2.5.2
tar xvf attr-2.5.2.tar.gz
cd attr-2.5.2
./configure --prefix=/usr \
--disable-static \
--sysconfdir=/etc \
--docdir=/usr/share/doc/attr-2.5.2
make
make install
5.23. Acl-2.3.2
tar xvf acl-2.3.2.tar.xz
cd acl-2.3.2
./configure --prefix=/usr \
--disable-static \
--docdir=/usr/share/doc/acl-2.3.2
make
make install
5.24. Libcap-2.73
tar xvf libcap-2.73.tar.xz cd libcap-2.73 sed -i '/install -m.*STA/d' libcap/Makefile make prefix=/usr lib=lib make prefix=/usr lib=lib install
5.25. Libxcrypt-4.4.38
tar xvf libxcrypt-4.4.38.tar.xz
cd libxcrypt-4.4.38
./configure --prefix=/usr \
--enable-hashes=strong,glibc \
--enable-obsolete-api=no \
--disable-static \
--disable-failure-tokens
make
make install
5.26. Shadow-4.17.3
tar xvf shadow-4.17.3.tar.xz
cd shadow-4.17.3
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 / /' {} \;
sed -e 's:#ENCRYPT_METHOD DES:ENCRYPT_METHOD YESCRYPT:' \
-e 's:/var/spool/mail:/var/mail:' \
-e '/PATH=/{s@/sbin:@@;s@/bin:@@}' \
-i etc/login.defs
touch /usr/bin/passwd
./configure --sysconfdir=/etc \
--disable-static \
--with-{b,yes}crypt \
--without-libbsd \
--with-group-name-max-length=32
make
make exec_prefix=/usr install
make -C man install-man
pwconv
grpconv
mkdir -p /etc/default
useradd -D --gid 999
passwd root
5.27. GCC-14.2.0
tar xvf gcc-14.2.0.tar.xz
cd gcc-14.2.0
case $(uname -m) in
x86_64)
sed -e '/m64=/s/lib64/lib/' \
-i.orig gcc/config/i386/t-linux64
;;
esac
mkdir -v build
cd build
../configure --prefix=/usr \
LD=ld \
--enable-languages=c,c++ \
--enable-default-pie \
--enable-default-ssp \
--enable-host-pie \
--disable-multilib \
--disable-bootstrap \
--disable-fixincludes \
--with-system-zlib
make
make install
ln -svr /usr/bin/cpp /usr/lib
ln -sv gcc.1 /usr/share/man/man1/cc.1
ln -sfv ../../libexec/gcc/$(gcc -dumpmachine)/14.2.0/liblto_plugin.so \
/usr/lib/bfd-plugins/
echo 'int main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log
readelf -l a.out | grep ': /lib'
grep -B4 '^ /usr/include' dummy.log
grep -E -o '/usr/lib.*/S?crt[1in].*succeeded' dummy.log
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
grep "/lib.*/libc.so.6 " dummy.log
grep found dummy.log
rm -v dummy.c a.out dummy.log
mkdir -pv /usr/share/gdb/auto-load/usr/lib
mv -v /usr/lib/*gdb.py /usr/share/gdb/auto-load/usr/lib

5.28. Ncurses-6.5
tar xvf ncurses-6.5.tar.gz
cd ncurses-6.5
./configure --prefix=/usr \
--mandir=/usr/share/man \
--with-shared \
--without-debug \
--without-normal \
--with-cxx-shared \
--enable-pc-files \
--with-pkg-config-libdir=/usr/lib/pkgconfig
make
make DESTDIR=$PWD/dest install
install -vm755 dest/usr/lib/libncursesw.so.6.5 /usr/lib
rm -v dest/usr/lib/libncursesw.so.6.5
sed -e 's/^#if.*XOPEN.*$/#if 1/' \
-i dest/usr/include/curses.h
cp -av dest/* /
for lib in ncurses form panel menu ; do
ln -sfv lib${lib}w.so /usr/lib/lib${lib}.so
ln -sfv ${lib}w.pc /usr/lib/pkgconfig/${lib}.pc
done
ln -sfv libncursesw.so /usr/lib/libcurses.so
5.29. Sed-4.9
tar xvf sed-4.9.tar.xz cd sed-4.9 ./configure --prefix=/usr make make html make install install -d -m755 /usr/share/doc/sed-4.9 install -m644 doc/sed.html /usr/share/doc/sed-4.9
5.30. Psmisc-23.7
tar xvf psmisc-23.7.tar.xz cd psmisc-23.7 ./configure --prefix=/usr make make install
5.31. Gettext-0.24
tar xvf gettext-0.24.tar.xz
cd gettext-0.24
./configure --prefix=/usr \
--disable-static \
--docdir=/usr/share/doc/gettext-0.24
make
make install
chmod -v 0755 /usr/lib/preloadable_libintl.so
5.32. Bison-3.8.2
tar xvf bison-3.8.2.tar.xz cd bison-3.8.2 ./configure --prefix=/usr --docdir=/usr/share/doc/bison-3.8.2 make make install
5.33. Grep-3.11
tar xvf grep-3.11.tar.xz cd grep-3.11 sed -i "s/echo/#echo/" src/egrep.sh ./configure --prefix=/usr make make install
5.34. Bash-5.2.37
tar xvf bash-5.2.37.tar.gz
cd bash-5.2.37
./configure --prefix=/usr \
--without-bash-malloc \
--with-installed-readline \
--docdir=/usr/share/doc/bash-5.2.37
make
make install
exec /usr/bin/bash --login
5.35. Libtool-2.5.4
tar xvf libtool-2.5.4.tar.xz cd libtool-2.5.4 ./configure --prefix=/usr make make install rm -fv /usr/lib/libltdl.a
5.36. GDBM-1.24
tar xvf gdbm-1.24.tar.gz
cd gdbm-1.24
./configure --prefix=/usr \
--disable-static \
--enable-libgdbm-compat
make
make install
5.37. Gperf-3.1
tar xvf gperf-3.1.tar.gz cd gperf-3.1 ./configure --prefix=/usr --docdir=/usr/share/doc/gperf-3.1 make make install
5.38. Expat-2.6.4
tar xvf expat-2.6.4.tar.xz
cd expat-2.6.4
./configure --prefix=/usr \
--disable-static \
--docdir=/usr/share/doc/expat-2.6.4
make
make install
install -v -m644 doc/*.{html,css} /usr/share/doc/expat-2.6.4
5.39. Inetutils-2.6
tar xvf inetutils-2.6.tar.xz
cd inetutils-2.6
sed -i 's/def HAVE_TERMCAP_TGETENT/ 1/' telnet/telnet.c
./configure --prefix=/usr \
--bindir=/usr/bin \
--localstatedir=/var \
--disable-logger \
--disable-whois \
--disable-rcp \
--disable-rexec \
--disable-rlogin \
--disable-rsh \
--disable-servers
make
make install
mv -v /usr/{,s}bin/ifconfig
5.40. Less-668
tar xvf less-668.tar.gz cd less-668 ./configure --prefix=/usr --sysconfdir=/etc make make install
5.41. Perl-5.40.1
tar xvf perl-5.40.1.tar.xz
cd perl-5.40.1
export BUILD_ZLIB=False
export BUILD_BZIP2=0
sh Configure -des \
-D prefix=/usr \
-D vendorprefix=/usr \
-D privlib=/usr/lib/perl5/5.40/core_perl \
-D archlib=/usr/lib/perl5/5.40/core_perl \
-D sitelib=/usr/lib/perl5/5.40/site_perl \
-D sitearch=/usr/lib/perl5/5.40/site_perl \
-D vendorlib=/usr/lib/perl5/5.40/vendor_perl \
-D vendorarch=/usr/lib/perl5/5.40/vendor_perl \
-D man1dir=/usr/share/man/man1 \
-D man3dir=/usr/share/man/man3 \
-D pager="/usr/bin/less -isR" \
-D useshrplib \
-D usethreads
make
make install
unset BUILD_ZLIB BUILD_BZIP2
5.42. XML::Parser-2.47
tar xvf XML-Parser-2.47.tar.gz cd XML-Parser-2.47 perl Makefile.PL make make install
5.43. Intltool-0.51.0
tar xvf intltool-0.51.0.tar.gz
cd intltool-0.51.0
sed -i 's:\\\${:\\\$\\{:' intltool-update.in
./configure --prefix=/usr
make
make install
install -v -Dm644 doc/I18N-HOWTO /usr/share/doc/intltool-0.51.0/I18N-HOWTO
5.44. Autoconf-2.72
tar xvf autoconf-2.72.tar.xz cd autoconf-2.72 ./configure --prefix=/usr make make install
5.45. Automake-1.17
tar xvf automake-1.17.tar.xz cd automake-1.17 ./configure --prefix=/usr --docdir=/usr/share/doc/automake-1.17 make make install
5.46. OpenSSL-3.4.1
tar xvf openssl-3.4.1.tar.gz
cd openssl-3.4.1
./config --prefix=/usr \
--openssldir=/etc/ssl \
--libdir=lib \
shared \
zlib-dynamic
make
sed -i '/INSTALL_LIBS/s/libcrypto.a libssl.a//' Makefile
make MANSUFFIX=ssl install
mv -v /usr/share/doc/openssl /usr/share/doc/openssl-3.4.1
5.47. Elfutils-0.192 中的 Libelf
Libelf 是 elfutils-0.192 软件包的一部分。请使用 elfutils-0.192.tar.bz2 作为源代码包。
tar jxvf elfutils-0.192.tar.bz2
cd elfutils-0.192
./configure --prefix=/usr \
--disable-debuginfod \
--enable-libdebuginfod=dummy
make
make -C libelf install
install -vm644 config/libelf.pc /usr/lib/pkgconfig
rm /usr/lib/libelf.a
5.48. Libffi-3.4.7
tar xvf libffi-3.4.7.tar.gz
cd libffi-3.4.7
./configure --prefix=/usr \
--disable-static \
--with-gcc-arch=native
make
make install
5.49. Python-3.13.2
tar xvf Python-3.13.2.tar.xz
cd Python-3.13.2
./configure --prefix=/usr \
--enable-shared \
--with-system-expat \
--enable-optimizations
make
make install
cat > /etc/pip.conf << EOF
[global]
root-user-action = ignore
disable-pip-version-check = true
EOF
5.50. Flit-Core-3.11.0
tar xvf flit_core-3.11.0.tar.gz cd flit_core-3.11.0 pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD pip3 install --no-index --find-links dist flit_core
5.51. Wheel-0.45.1
tar xvf wheel-0.45.1.tar.gz cd wheel-0.45.1 pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD pip3 install --no-index --find-links dist wheel
5.52. Setuptools-75.8.1
tar xvf setuptools-75.8.1.tar.gz cd setuptools-75.8.1 pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD pip3 install --no-index --find-links dist setuptools
5.53. Ninja-1.12.1
tar xvf ninja-1.12.1.tar.gz cd ninja-1.12.1 export NINJAJOBS=4 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 python3 configure.py --bootstrap --verbose 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
Meson-1.7.0
tar xvf meson-1.7.0.tar.gz cd meson-1.7.0 pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD pip3 install --no-index --find-links dist meson 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
5.54. Kmod-34
tar xvf kmod-34.tar.xz
cd kmod-34
mkdir -p build
cd build
meson setup --prefix=/usr .. \
--sbindir=/usr/sbin \
--buildtype=release \
-D manpages=false
ninja
ninja install
5.55. Coreutils-9.6
tar xvf coreutils-9.6.tar.xz
cd coreutils-9.6
patch -Np1 -i ../coreutils-9.6-i18n-1.patch
autoreconf -fv
automake -af
FORCE_UNSAFE_CONFIGURE=1 ./configure \
--prefix=/usr \
--enable-no-install-program=kill,uptime
make
make install
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
5.56. Check-0.15.2
tar xvf check-0.15.2.tar.gz cd check-0.15.2 ./configure --prefix=/usr --disable-static make make docdir=/usr/share/doc/check-0.15.2 install
5.57. Diffutils-3.11
tar xvf diffutils-3.11.tar.xz cd diffutils-3.11 ./configure --prefix=/usr make make install
5.58. Gawk-5.3.1
tar xvf gawk-5.3.1.tar.xz cd gawk-5.3.1 sed -i 's/extras//' Makefile.in ./configure --prefix=/usr make rm -f /usr/bin/gawk-5.3.1 make install
5.59. Findutils-4.10.0
tar xvf findutils-4.10.0.tar.xz cd findutils-4.10.0 ./configure --prefix=/usr --localstatedir=/var/lib/locate make make install
5.60. Groff-1.23.0
tar xvf groff-1.23.0.tar.gz cd groff-1.23.0 PAGE=A4 ./configure --prefix=/usr make make install
5.61. GRUB-2.12
tar xvf grub-2.12.tar.xz
cd grub-2.12
echo depends bli part_gpt > grub-core/extra_deps.lst
./configure --prefix=/usr \
--sysconfdir=/etc \
--disable-efiemu \
--disable-werror
make
make install
mv -v /etc/bash_completion.d/grub /usr/share/bash-completion/completions
5.62. Gzip-1.13
tar xvf gzip-1.13.tar.xz cd gzip-1.13 ./configure --prefix=/usr make make install
5.63. IPRoute2-6.13.0
tar xvf iproute2-6.13.0.tar.xz cd iproute2-6.13.0 sed -i /ARPD/d Makefile rm -fv man/man8/arpd.8 make NETNS_RUN_DIR=/run/netns make SBINDIR=/usr/sbin install
5.64. Kbd-2.7.1
tar xvf kbd-2.7.1.tar.xz cd kbd-2.7.1 patch -Np1 -i ../kbd-2.7.1-backspace-1.patch sed -i '/RESIZECONS_PROGS=/s/yes/no/' configure sed -i 's/resizecons.8 //' docs/man/man8/Makefile.in ./configure --prefix=/usr --disable-vlock make make install
5.65. Libpipeline-1.5.8
tar xvf libpipeline-1.5.8.tar.gz cd libpipeline-1.5.8 ./configure --prefix=/usr make make install
5.66. Make-4.4.1
tar xvf make-4.4.1.tar.gz cd make-4.4.1 ./configure --prefix=/usr make make install
5.67. Patch-2.7.6
tar xvf patch-2.7.6.tar.xz cd patch-2.7.6 ./configure --prefix=/usr make make install
5.68. Tar-1.35
tar xvf tar-1.35.tar.xz cd tar-1.35 FORCE_UNSAFE_CONFIGURE=1 \ ./configure --prefix=/usr make make install make -C doc install-html docdir=/usr/share/doc/tar-1.35
5.69. Texinfo-7.2
tar xvf texinfo-7.2.tar.xz
cd texinfo-7.2
./configure --prefix=/usr
make
make install
make TEXMF=/usr/share/texmf install-tex
pushd /usr/share/info
rm -v dir
for f in *
do install-info $f dir 2>/dev/null
done
popd
5.70. Vim-9.1.1166
tar xvf vim-9.1.1166.tar.gz
cd vim-9.1.1166
echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h
./configure --prefix=/usr
make
make install
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
ln -sv ../vim/vim91/doc /usr/share/doc/vim-9.1.1166
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
5.71. MarkupSafe-3.0.2
tar xvf markupsafe-3.0.2.tar.gz cd markupsafe-3.0.2 pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD pip3 install --no-index --find-links dist Markupsafe
5.72. Jinja2-3.1.5
tar xvf jinja2-3.1.5.tar.gz cd jinja2-3.1.5 pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD pip3 install --no-index --find-links dist Jinja2
5.73. Systemd-257.3 中的 Udev
Udev 是 systemd-257.3 软件包的一部分。请使用 systemd-257.3.tar.xz 作为源代码包。
tar xvf systemd-257.3.tar.gz
cd systemd-257.3
sed -e 's/GROUP="render"/GROUP="video"/' \
-e 's/GROUP="sgx", //' \
-i rules.d/50-udev-default.rules.in
sed -i '/systemd-sysctl/s/^/#/' rules.d/99-systemd.rules.in
sed -e '/NETWORK_DIRS/s/systemd/udev/' \
-i src/libsystemd/sd-network/network-util.h
mkdir -p build
cd build
meson setup .. \
--prefix=/usr \
--buildtype=release \
-D mode=release \
-D dev-kvm-mode=0660 \
-D link-udev-shared=false \
-D logind=false \
-D vconsole=false
export udev_helpers=$(grep "'name' :" ../src/udev/meson.build | \
awk '{print $3}' | tr -d ",'" | grep -v 'udevadm')
ninja udevadm systemd-hwdb \
$(ninja -n | grep -Eo '(src/(lib)?udev|rules.d|hwdb.d)/[^ ]*') \
$(realpath libudev.so --relative-to .) \
$udev_helpers
install -vm755 -d {/usr/lib,/etc}/udev/{hwdb.d,rules.d,network}
install -vm755 -d /usr/{lib,share}/pkgconfig
install -vm755 udevadm /usr/bin/
install -vm755 systemd-hwdb /usr/bin/udev-hwdb
ln -svfn ../bin/udevadm /usr/sbin/udevd
cp -av libudev.so{,*[0-9]} /usr/lib/
install -vm644 ../src/libudev/libudev.h /usr/include/
install -vm644 src/libudev/*.pc /usr/lib/pkgconfig/
install -vm644 src/udev/*.pc /usr/share/pkgconfig/
install -vm644 ../src/udev/udev.conf /etc/udev/
install -vm644 rules.d/* ../rules.d/README /usr/lib/udev/rules.d/
install -vm644 $(find ../rules.d/*.rules \
-not -name '*power-switch*') /usr/lib/udev/rules.d/
install -vm644 hwdb.d/* ../hwdb.d/{*.hwdb,README} /usr/lib/udev/hwdb.d/
install -vm755 $udev_helpers /usr/lib/udev
install -vm644 ../network/99-default.link /usr/lib/udev/network
tar -xvf ../../udev-lfs-20230818.tar.xz
make -f udev-lfs-20230818/Makefile.lfs install
unset udev_helpers
udev-hwdb update
5.74. Man-DB-2.13.0
tar xvf man-db-2.13.0.tar.xz
cd man-db-2.13.0
./configure --prefix=/usr \
--docdir=/usr/share/doc/man-db-2.13.0 \
--sysconfdir=/etc \
--disable-setuid \
--enable-cache-owner=bin \
--with-browser=/usr/bin/lynx \
--with-vgrind=/usr/bin/vgrind \
--with-grap=/usr/bin/grap \
--with-systemdtmpfilesdir= \
--with-systemdsystemunitdir=
make
make install
5.75. Procps-ng-4.0.5
tar xvf procps-ng-4.0.5.tar.xz
cd procps-ng-4.0.5
./configure --prefix=/usr \
--docdir=/usr/share/doc/procps-ng-4.0.5 \
--disable-static \
--disable-kill \
--enable-watch8bit
make
make install
5.76. Util-linux-2.40.4
tar xvf util-linux-2.40.4.tar.xz
cd util-linux-2.40.4
./configure --bindir=/usr/bin \
--libdir=/usr/lib \
--runstatedir=/run \
--sbindir=/usr/sbin \
--disable-chfn-chsh \
--disable-login \
--disable-nologin \
--disable-su \
--disable-setpriv \
--disable-runuser \
--disable-pylibmount \
--disable-liblastlog2 \
--disable-static \
--without-python \
--without-systemd \
--without-systemdsystemunitdir \
ADJTIME_PATH=/var/lib/hwclock/adjtime \
--docdir=/usr/share/doc/util-linux-2.40.4
make
make install
5.77. E2fsprogs-1.47.2
tar xvf e2fsprogs-1.47.2.tar.gz
cd e2fsprogs-1.47.2
mkdir -v build
cd build
../configure --prefix=/usr \
--sysconfdir=/etc \
--enable-elf-shlibs \
--disable-libblkid \
--disable-libuuid \
--disable-uuidd \
--disable-fsck
make
make install
rm -fv /usr/lib/{libcom_err,libe2p,libext2fs,libss}.a
gunzip -v /usr/share/info/libext2fs.info.gz
install-info --dir-file=/usr/share/info/dir /usr/share/info/libext2fs.info
sed 's/metadata_csum_seed,//' -i /etc/mke2fs.conf
5.78. Sysklogd-2.7.0
tar xvf sysklogd-2.7.0.tar.gz
cd sysklogd-2.7.0
./configure --prefix=/usr \
--sysconfdir=/etc \
--runstatedir=/run \
--without-logger \
--disable-static \
--docdir=/usr/share/doc/sysklogd-2.7.0
make
make install
cat > /etc/syslog.conf << "EOF"
# Begin /etc/syslog.conf
auth,authpriv.* -/var/log/auth.log
*.*;auth,authpriv.none -/var/log/sys.log
daemon.* -/var/log/daemon.log
kern.* -/var/log/kern.log
mail.* -/var/log/mail.log
user.* -/var/log/user.log
*.emerg *
# Do not open any internet ports.
secure_mode 2
# End /etc/syslog.conf
EOF
5.79. SysVinit-3.14
tar xvf sysvinit-3.14.tar.xz cd sysvinit-3.14 make make install
5.80. 移除调试符号(可选)
如果系统不是为程序员设计的,也没有调试系统软件的计划,可以通过从二进制程序和库移除调试符号和不必要的符号表项,将系统的体积减小约 2 GB。对于一般的 Linux 用户,这不会造成任何不便。
save_usrlib="$(cd /usr/lib; ls ld-linux*[^g])
libc.so.6
libthread_db.so.1
libquadmath.so.0.0.0
libstdc++.so.6.0.33
libitm.so.1.0.0
libatomic.so.1.2.0"
cd /usr/lib
for LIB in $save_usrlib; do
objcopy --only-keep-debug --compress-debug-sections=zlib $LIB $LIB.dbg
cp $LIB /tmp/$LIB
strip --strip-unneeded /tmp/$LIB
objcopy --add-gnu-debuglink=$LIB.dbg /tmp/$LIB
install -vm755 /tmp/$LIB /usr/lib
rm /tmp/$LIB
done
online_usrbin="bash find strip"
online_usrlib="libbfd-2.44.so
libsframe.so.1.0.0
libhistory.so.8.2
libncursesw.so.6.5
libm.so.6
libreadline.so.8.2
libz.so.1.3.1
libzstd.so.1.5.7
$(cd /usr/lib; find libnss*.so* -type f)"
for BIN in $online_usrbin; do
cp /usr/bin/$BIN /tmp/$BIN
strip --strip-unneeded /tmp/$BIN
install -vm755 /tmp/$BIN /usr/bin
rm /tmp/$BIN
done
for LIB in $online_usrlib; do
cp /usr/lib/$LIB /tmp/$LIB
strip --strip-unneeded /tmp/$LIB
install -vm755 /tmp/$LIB /usr/lib
rm /tmp/$LIB
done
for i in $(find /usr/lib -type f -name \*.so* ! -name \*dbg) \
$(find /usr/lib -type f -name \*.a) \
$(find /usr/{bin,sbin,libexec} -type f); do
case "$online_usrbin $online_usrlib $save_usrlib" in
*$(basename $i)* )
;;
* ) strip --strip-unneeded $i
;;
esac
done
unset BIN LIB save_usrlib online_usrbin online_usrlib
rm -rf /tmp/{*,.*}
find /usr/lib /usr/libexec -name \*.la -delete
find /usr -depth -name $(uname -m)-lfs-linux-gnu\* | xargs rm -rf
- No labels
Add Comment