-
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
0 Comments