吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 825|回复: 7
收起左侧

[学习记录] LFS12.1构建 | linux | 制作linux操作系统(一)

[复制链接]
my16110 发表于 2024-10-1 22:14
本帖最后由 my16110 于 2024-10-2 18:21 编辑

LFS12.1构建 | linux| 制作属于自己的linux发行版

前言
LFS──Linux from Scratch,就是一种从网上直接下载源码,从头编译LINUX的安装方式。它不是发行版,只是一个菜谱,告诉你到哪里去买菜(下载源码),怎么把这些生东西( raw code) 作成符合自己口味的菜肴──个性化的linux,不单单是个性的桌面。——百度百科

    不知道大家有没有想过linux发行版如何做出来的?lfs可以教你从头构建一个linux系统,而不是直接下载并且安装一个现成的。学习lfs制作过程,可以了解到linux是如何运行的,并且可以制作一个属于自己的、完全自己掌握的发行版操作系统,同时加深了对linux的了解。lfs相较于其他制作根文件系统的方式(如busybox、gentoo),更为复杂,而不仅仅是运行几条命令就可以自动化配置,需要对linux有足够的了解。而lfs的深度可以让你更清楚linux的工作原理,了解到在用户层面是如何与内核进行交互的,所以我更推荐根据lfs官方手册来构建一个根文件系统和编译一个内核。手册中有很多重要的地方,建议大家了解手册上的内容
LFS系统制作流程
   1)准备宿主系统环境,创建格式化新分区,挂载分区,创建lfs相关目录等
   2)宿主系统添加lfs用户及其配置来隔离编译环境
   3)切换到lfs用户,为系统的制作安装交叉编译工具链
   4)使用刚刚创建的交叉编译工具链来编译出临时的工具,方便后续源码编译各种软件包
   5)lfs的虚拟内核文件系统挂载到内核上,然后通过chroot真正进入lfs系统
   6)创建必要的文件夹,进行相关的配置,然后开始源码编译各种基本的软件包
   7)所有软件包安装之后,为lfs做一些相关配置
   8)编译linux内核
   9)grub设置引导的linux内核和lfs系统
配置环境
   虚拟机:Workstation 17.5.x
   宿主操作系统:Ubuntu-22.04.5-desktop-amd64
   lfs内核版本:linux6.7.4
   硬盘类型:SCSI(可自定义,这里使用虚拟机默认,后续部分操作与硬盘类型有关)
相关链接
   Ubuntu桌面版官网下载:https://cn.ubuntu.com/download/desktop,建议使用镜像网站下载原版iso文件
         lfs官网:https://www.linuxfromscratch.org/lfs/
   软件包下载:https://mirror.koddos.net/lfs/lfs-packages/12.1/
本文不足之处
    1、因为是第一次写文章,对markdown等语法不熟悉,可能会出现排版很乱,希望大家谅解。>>>比如文章开头不能缩进,又不会markdown语法,所以用来空格缩进
    2、文章可能写的比较哆嗦,因为写这篇文章不只是自己做笔记学习,也想让大家一起学习参考,尽可能详细说明,再加上个人表达能力不够好,有些内容显得重复冗余
    3、我是医学专业的而不是计算机专业的,所以知识储备量不足,对于lfs手册中的一些理解可能不到位,如有错误感谢大家批评指正
    4、初次编写文章排版可能较乱,且因个人原因不能及时修改(实在没有太多空闲时间),仍感谢大家反馈
    5、最后,希望这边文章能帮到大家,学会制作lfs系统。如有不明白的地方可以在评论区留言,有时间我会尽量帮大家解答

第一部分    准备好宿主机环境
1.1 准备好宿主系统编译环境
    新安装的系统可能需要修改root初始密码
[Shell] 纯文本查看 复制代码
1
sudo passwd root

    安装可能缺少的以下依赖

[Shell] 纯文本查看 复制代码
1
2
3
4
sudo apt-get install build-essential
sudo apt-get install texinfo
sudo apt-get install gawk
sudo apt-get install bison

1.2 创建硬盘分区
    首先在虚拟机中新建一块硬盘
新建硬盘.png
    使用lsblk查看硬盘信息,如下sda为宿主机硬盘,sdb是新创建的硬盘
lsblk查看硬盘.png
            然后格式化硬盘,root按顺序执行以下命令
[Shell] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
[font=宋体][size=3]fdisk /dev/sdb  #硬盘初始化[/size][/font][/align][font=宋体][size=3]           m  #帮助
#创建新分区
#分区类型为primary分区
#默认分区编号为sdb1
2048  #可使用默认起始位置
回车  #根据大小选择结束分区
p
#写入[/size][/font]

  如下,fdisk初始化完成
fdsik完成.png
[Shell] 纯文本查看 复制代码
1
mkfs -v -t ext4 /dev/<xxx>  #格式化<xxx>分区为ext4,本文分区为sdb1

[Shell] 纯文本查看 复制代码
1
#如有需要,可创建以下分区mkswap /dev/<yyy>  #<yyy> 应该替换成 swap 分区的名称

   注:可以根据自己需要创建出root、swap、home等目录分区
1.3 设置$LFS环境变量
    设置$LFS变量为最终创建lfs文件系统的路径,以便通过环境变量直接访问。这里按照手册选择了mnt来存放lfs根文件系统
[Shell] 纯文本查看 复制代码
1
2
export LFS=/mnt/lfs
echo $LFS

1.4 挂载新分区
    将$LFS挂载到刚才创建的新分区上,可直接通过该环境变量访问新分区,后续所有操作都在该分区上
[Shell] 纯文本查看 复制代码
1
2
3
mkdir -pv $LFS
mount -v -t ext4 /dev/sdb1 $LFS  #此处sdb1可以替换为自己新建的分区,本文仅以创建了sdb1为例,意思是将$LFS的目录挂载到sdb1上
df -h  #查看是否正确挂载

挂载sdb1分区.png
    注:如有其他分区需要单独挂载,可参考手册。本文只单独创建了根分区/,并挂载到sdb1,访问路径映射为$LFS
   

第二部分    准备构建LFS所需的软件包和补丁

2.1 下载软件包
[Shell] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
mkdir -v $LFS/sources  #该目录存放下载的软件包
chmod -v a+wt $LFS/sources#为该目录添加写入权限和 sticky 标志。“Sticky” 标志使得即使有多个&#12132;户对该目录有写入权限,也只有文件所有者能够删除其中的文件
wget --input-file=https://mirror.koddos.net/lfs/lfs-packages/12.1/ --continue --directory-prefix=$LFS/sources  #该命令将input-file指定的网站文件下载到irectory-prefix目录下。input-file可以设置为自己找的镜像网站
#如需md5校验,执行以下命令
pushd $LFS/sources
md5sum -c md5sums
popd
chown root:root $LFS/sources/#将该目录所属用户变更为root目录

第三部分 最后的准备工作

3.1 创建其他目录

  这些目录的作用同其他发行版linux。而tool目录存放交叉编译的工具,因为将要创建的lfs系统中存在循环依赖的问题,缺少各种包和依赖,无法独立运行并完整编译安装所需的软件。这些交叉编译工具用于跟宿主系统相同的的工具进行分离,避免一些不必要的问题,以及避免对宿主系统工具和配置进行修改导致宿主系统无法正常使用(此处我有点解释不清楚)
[Shell] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
9
#以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  #该目录为交叉编译所需的工具

3.2 创建LFS用户
  在构建lfs过程中,为了避免对宿主系统造成损害导致宿主系统无法使用(若以root执行一些命令可能导致宿主系统出现问题,初次构建时出了问题我的系统无法开机),以及避免将一些不必要的配置带入到lfs系统中,需要创建一个lfs用户来隔离用户环境
[Shell] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
9
groupadd lfs  #创建一个lfs用户组
useradd -s /bin/bash -g lfs -m -k /dev/null lfs  #-s设置默认shell,-g添加到指定用户组,-m创建主目录,-k设置空模板目录
passwd lfs  #更改密码
#将 lfs 设为 $LFS 中所有&#12140;录的所有者,使 lfs 对它们拥有完全访问权
chown -v lfs $LFS/{usr{,/*},lib,var,etc,bin,sbin,tools}
case $(uname -m) in
x86_64) chown -v lfs $LFS/lib64 ;;
esac
su - lfs  #切换到lfs用户

创建lfs用户.png   
3.3 配置lfs用户的环境
   以lfs用户身份执行以下命令,为lfs用户启动设置初始化脚本。其中~/.bash_profile用于登录shell,而 ~/.bashrc用于非登录shell。
[Asm] 纯文本查看 复制代码
1
2
cat > ~/.bash_profile << "EOF"exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF

[Shell] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
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

  相关参数解释如下,具体参考lfs手册
   lfs的shell初始化说明.png
[Shell] 纯文本查看 复制代码
1
2
3
4
export MAKEFLAGS=-j8  #设置make所需的cpu核心数,按自己需求cat >> ~/.bashrc << "EOF"
export MAKEFLAGS=-j$(nproc)
EOF  #写入到配置文件中,$(nproc) 替换为希望使用的核心数
source ~/.bash_profile  #强制读取该配置文件

   cpu核心.png

第四部分 编译交叉工具链

  这里构建交叉工具链的原因如文章第三部分开头处。LFS手册原文“本章中编译的程序会被安装在$LFS/tools目录中,以将它们和后续章节中安装的文件分开。但是,本章中编译的库会被安装到它们的最终位置,因为这些库在我们最终要构建的系统中也存在”。这里按照个人理解来解释一下,在构建lfs系统中,宿主机存在一套工具链,发行版默认自带的,用来源码编译安装等用途的工具链(第一套工具链)。然后我们使用这些自带的工具链(第一套工具链),创建出能在宿主系统中编译安装lfs软件包的交叉编译工具链(第二套工具链),但是这套工具链是临时的,构建完之后可以删除,主要目的是与宿主系统的工具链(第一套工具链)进行隔离,防止构建lfs时使用了宿主系统的工具链以及其配置导致最终的lfs系统遭到损害,或者对宿主系统环境配置进行更改或者一些其他的操作导致宿主系统无法使用。然后用交叉编译工具链(第二套工具链)来制作真正的lfs根文件系统,同时也为真正的根文件系统安装一套新的编译工具链(第三套工具链),可以在后续脱离了宿主机也可以正常运行、编译、安装各种软件。(!!!不知道这样解释是否正确!!!)

[Shell] 纯文本查看 复制代码
1
echo $LFS  #这里再次确认LFS的路径
   如果上面的操作都与本文一致,或与lfs手册一致,特别是环境变量和用户配置一样的话可以直接复制粘贴了。下面所有操作均按照lfs手册进行,相关脚本解释可以查看手册。再次说明一下source目录为源码包存放的路径,tool为编译安装交叉工具链的位置。这部分开始构造交叉编译所需的工具链,比较建议这里执行命令前虚拟机打快照,以lfs身份执行以下命令

4.1 Binutils-2.42 - 第一遍

[Shell] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
cd $LFS/sources[/font][/align][/font][/align]tar -xJvf binutils-2.42.tar.xz
cd binutils-2.42
mkdir -v build
cd build
../configure --prefix=$LFS/tools \
 --with-sysroot=$LFS \
 --target=$LFS_TGT \
 --disable-nls \
 --enable-gprofng=no \
 --disable-werror \
 --enable-default-hash-style=gnu
 make
 make install

4.2 GCC-13.2.0 - 第一遍
[Shell] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
cd $LFS/sourcestar -xJvf gcc-13.2.0.tar.xz
cd gcc-13.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.39 \
 --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

gcc一遍.jpg
4.3 Linux-6.7.4 API 头文件
[Shell] 纯文本查看 复制代码
1
2
3
4
5
6
cd $LFS/sourcestar -xJvf linux-6.7.4.tar.xz
cd linux-6.7.4
make mrproper
make headers
find usr/include -type f ! -name '*.h' -delete
cp -rv usr/include $LFS/usr

linuxapi.jpg
4.4 Glibc-2.39
[Asm] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
cd $LFS/sources
tar -xJvf glibc-2.39.tar.xz
cd glibc-2.39
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.39-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=4.19 \
 --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
clear
echo 'int main(){}' | $LFS_TGT-gcc -xc -
readelf -l a.out | grep ld-linux
rm -v a.out

4.5 GCC-13.2.0 中的 Libstdc++
[Shell] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
cd $LFS/sourcescd gcc-13.2.0
rm -rf build
mkdir -v build
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++/13.2.0
 make
 make DESTDIR=$LFS install
 rm -v $LFS/usr/lib/lib{stdc++{,exp,fs},supc++}.la

libstd安装完成.jpg

第五部分 交叉编译临时工具
   这里使用上一部分安装的交叉编译工具链,来真正构建LFS根文件系统所需的工具,根据LFS手册,本部分首先只安装LFS的部分工具,来解决循环依赖的问题。这样在下一章中,可以直接chroot到真正的LFS文件系统根目录中,使得脱离宿主机也可以正常运行LFS。本章脚本运行前建议创建虚拟机快照,以lfs身份运行下列命令,切勿使用(root身份)
5.1 M4-1.4.19
M4 软件包包含一个宏处理器
[Shell] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
cd $LFS/sources
tar -xJvf 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

5.2 Ncurses-6.4-20230520
Ncurses 软件包包含使用时不需考虑终端特性的字符屏幕处理函数库
[Shell] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
cd $LFS/sources
tar -xJvf ncurses-6.4-20230520.tar.xz
cd ncurses-6.4-20230520
sed -i s/mawk// configure
mkdir build
pushd build
 ../configure
 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 \
 --enable-widec
 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

5.3 Bash-5.2.21
Bash 软件包包含 Bourne-Again Shell
[Shell] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
cd $LFS/sources
tar -zxvf bash-5.2.21.tar.gz
cd bash-5.2.21
./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

5.4 Coreutils-9.4
Coreutils 软件包包含各种操作系统都需要提供的基本工具程序
[Shell] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
cd $LFS/sources
tar -xJvf coreutils-9.4.tar.xz
cd coreutils-9.4
./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

5.5  Diffutils-3.10
Diffutils 软件包包含显示文件或目录之间差异的程序  
[Shell] 纯文本查看 复制代码
1
2
3
4
5
6
7
cd $LFS/sourcestar -xJvf diffutils-3.10.tar.xz
cd diffutils-3.10
./configure --prefix=/usr \
 --host=$LFS_TGT \
 --build=$(./build-aux/config.guess)
 make
 make DESTDIR=$LFS install

5.6 File-5.45
File 软件包包含用于确定给定文件类型的工具
[Shell] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
cd $LFS/sourcestar -zxvf file-5.45.tar.gz
cd file-5.45
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

5.7 Findutils-4.9.0
Findutils 软件包包含用于查找文件的程序。这些程序能直接搜索目录录树中的所有文件,也可以创建、维护和搜索文件数据库 (一般比递归搜索快,但在数据库最近没有更新时不可靠)。Findutils 还提供了xargs 程序,它能够对一次搜索列出的素有文件执行给定的命令
[Shell] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
cd $LFS/sourcestar -xJvf findutils-4.9.0.tar.xz
cd findutils-4.9.0
./configure --prefix=/usr \
 --localstatedir=/var/lib/locate \
 --host=$LFS_TGT \
 --build=$(build-aux/config.guess)
make
make DESTDIR=$LFS install

5.8 Gawk-5.3.0
Gawk 软件包包含操作文本文件的程序
[Shell] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
cd $LFS/sourcestar -xJvf gawk-5.3.0.tar.xz
cd gawk-5.3.0
sed -i 's/extras//' Makefile.in
./configure --prefix=/usr \
 --host=$LFS_TGT \
 --build=$(build-aux/config.guess)
 make
 make DESTDIR=$LFS install

5.9 Grep-3.11
Grep 软件包包含在文件内容中进行搜索的程序
[Shell] 纯文本查看 复制代码
1
2
3
4
5
6
7
cd $LFS/sourcestar -xJvf 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

5.10 Gzip-1.13
Gzip 软件包包含压缩和解压缩文件的程序
[Shell] 纯文本查看 复制代码
1
2
3
4
5
cd $LFS/sourcestar -xJvf gzip-1.13.tar.xz
cd gzip-1.13
./configure --prefix=/usr --host=$LFS_TGT
make
make DESTDIR=$LFS install

5.11 Make-4.4.1
Make 软件包包含一个程序,用于控制从软件包源代码生成可执行文件和其他非源代码文件的过程
[Shell] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
cd $LFS/sourcestar -zxvf 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

5.12 Patch-2.7.6
Patch 软件包包含通过应用 “补丁” 文件,修改或创建文件的程序,补丁文件通常是 diff 程序创建的
[Shell] 纯文本查看 复制代码
1
2
3
4
5
6
7
cd $LFS/sourcestar -xJvf 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

5.13 Sed-4.9
Sed 软件包包含一个流编辑器
[Shell] 纯文本查看 复制代码
1
2
3
4
5
6
7
cd $LFS/sourcestar -xJvf 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

5.14 Tar-1.35
Tar 软件包提供创建 tar 归档文件,以及对归档文件进行其他操作的功能。Tar 可以对已经创建的归档文件进&#12175;提取文件,存储新文件,更新文件,或者列出文件等操作
[Shell] 纯文本查看 复制代码
1
2
3
4
5
6
7
cd $LFS/sourcestar -xJvf 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

5.15 Xz-5.4.6
Xz 软件包包含文件压缩和解压缩工具,它能够处理 lzma 和新的 xz 压缩文件格式。使用 xz 压缩文本文件,可以得到比传统的 gzip 或 bzip2 更好的压缩比
[Shell] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
cd $LFS/sourcestar -xJvf xz-5.4.6.tar.xz
cd xz-5.4.6
./configure --prefix=/usr \
 --host=$LFS_TGT \
 --build=$(build-aux/config.guess) \
 --disable-static \
 --docdir=/usr/share/doc/xz-5.4.6
 make
 make DESTDIR=$LFS install
 rm -v $LFS/usr/lib/liblzma.la

5.16 Binutils-2.42 - 第二遍
Binutils 包含汇编器、链接器以及其他用于处理目标文件的工具
[Shell] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
cd $LFS/sourcescd binutils-2.42
rm -rf build
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-default-hash-style=gnu
make
make DESTDIR=$LFS install
rm -v $LFS/usr/lib/lib{bfd,ctf,ctf-nobfd,opcodes,sframe}.{a,la}

5.17 GCC-13.2.0 - 第二遍
GCC 软件包包含 GNU 编译器集合,其中有 C 和 C++ 编译器
[Shell] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
cd $LFS/sourcesrm -rf gcc-13.2.0
tar -xJvf gcc-13.2.0.tar.xz
cd gcc-13.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

第六部分 进入 Chroot 并构建其他临时工具

    上一部分解决了循环依赖的问题,这样就可以直接使用lfs文件系统中的各种软件包和编译器来安装各种软件了,在此之前先安装好最基本的工具方便后续安装其他软件。chroot进入到lfs根文件系统中,与宿主的根文件系统进行隔离。相当于新建了一个shell和新用户空间,所有操作都不会影响到宿主的根文件系统,相当于从宿主的根目录/切换到lfs的根目录/。在运行下列命令之前,非常建议做虚拟机快照,从这里开始后续章节使用root身份运行
6.1 改变所有者
  目前,$LFS 中整个目录树的所有者都是 lfs,这个用户只在宿主系统存在。如果不改变 $LFS 中文件和目录的所有权,它们会被一个没有对应用户ID 所有。
   !!!重要!!!如果操作不当,可能导致宿主系统也无法使用。非常建议在运行以下命令前虚拟机打快照
[Shell] 纯文本查看 复制代码
1
2
exit  #回到root用户
echo $LFS  #再次确认$LFS是否配置错误
退出lfs回到root.png
  为了避免文件没有用户ID的问题,以root身份运行下列命令
[Shell] 纯文本查看 复制代码
1
2
3
4
5
6
7
#以下命令将 $LFS/* &#12140;录的所有者改变为 root
chown -R root:root $LFS/{usr,lib,var,etc,bin,sbin,tools}
case $(uname -m) in
x86_64) chown -R root:root $LFS/lib64 ;;
esac
#此命令将为LFS系统创建虚拟文件系统挂载点,使用户进程通过该虚拟文件系统与内核进行交流,必须位于$LFS目录中
mkdir -pv $LFS/{dev,proc,sys,run}

[Shell] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
#根据实际需求来挂载lfs相应的虚拟文件系统,本文运行以下命令挂载到内核中
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

内核目录挂载.jpg
6.2 进入Chroot环境
  此处开始通过chroot命令,真正进入LFS根文件系统中,之后所有操作都位于LFS根目录中,与宿主环境隔离。从现在开始,就不再需要使用 LFS 环境变量,因为所有工作都被局限在 LFS 文件系统内。这是由于chroot 命令启动 Bash 时,已经将根目录 (/) 设置为 $LFS。注意 /tools/bin 不在 PATH 中。这意味着不再使用交叉工具链。即使用lfs中的软件包来构建,而不是宿主系统的软件
[Shell] 纯文本查看 复制代码
1
2
3
4
5
6
7
chroot "$LFS" /usr/bin/env -i \[/font][/align][/font][/align] HOME=/root \
 TERM="$TERM" \
 PS1='(lfs chroot) \u:\w\$ ' \
 PATH=/usr/bin:/usr/sbin \
 MAKEFLAGS="-j$(nproc)" \
 TESTSUITEFLAGS="-j$(nproc)" \
 /bin/bash --login

chroot到lfs.jpg
6.3 创建需要的目录
[Shell] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
mkdir -pv /{boot,home,mnt,opt,srv}mkdir -pv /etc/{opt,sysconfig}
mkdir -pv /lib/firmware
mkdir -pv /media/{floppy,cdrom}
mkdir -pv /usr/{,local/}{include,src}
mkdir -pv /usr/local/{bin,lib,sbin}
mkdir -pv /usr/{,local/}share/{color,dict,doc,info,locale,man}
mkdir -pv /usr/{,local/}share/{misc,terminfo,zoneinfo}
mkdir -pv /usr/{,local/}share/man/man{1..8}
mkdir -pv /var/{cache,local,log,mail,opt,spool}
mkdir -pv /var/lib/{color,misc,locate}
ln -sfv /run /var/run
ln -sfv /run/lock /var/lock
install -dv -m 0750 /root
install -dv -m 1777 /tmp /var/tmp

创建lfs的相关目录.jpg
6.4 创建必要的文件和符号链接
[Shell] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
ln -sv /proc/self/mounts /etc/mtab  #维护已经挂载的&#12098;件系统的列表cat > /etc/hosts << EOF
127.0.0.1 localhost $(hostname)
::1 localhost
EOF
#/etc/passwd 和 /etc/
groups,创建root用户以及其他必要的用户和用户组
cat > /etc/passwd << "EOF"
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/dev/null:/usr/bin/false
daemon:x:6:6:Daemon User:/dev/null:/usr/bin/false
messagebus:x:18:18:D-Bus Message Daemon User:/run/dbus:/usr/bin/false
systemd-journal-gateway:x:73:73:systemd Journal Gateway:/:/usr/bin/false
systemd-journal-remote:x:74:74:systemd Journal Remote:/:/usr/bin/false
systemd-journal-upload:x:75:75:systemd Journal Upload:/:/usr/bin/false
systemd-network:x:76:76:systemd Network Management:/:/usr/bin/false
systemd-resolve:x:77:77:systemd Resolver:/:/usr/bin/false
systemd-timesync:x:78:78:systemd Time Synchronization:/:/usr/bin/false
systemd-coredump:x:79:79:systemd Core Dumper:/:/usr/bin/false
uuidd:x:80:80:UUID Generation Daemon User:/dev/null:/usr/bin/false
systemd-oom:x:81:81:systemd Out Of Memory Daemon:/:/usr/bin/false
nobody:x: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:
systemd-journal:x:23:
input:x:24:
mail:x:34:
kvm:x:61:
systemd-journal-gateway:x:73:
systemd-journal-remote:x:74:
systemd-journal-upload:x:75:
systemd-network:x:76:
systemd-resolve:x:77:
systemd-timesync:x:78:
systemd-coredump:x:79:
uuidd:x:80:
systemd-oom:x:81:
wheel:x:97:
users:x:999:
nogroup:x:65534:
EOF

创建root用户.jpg
[Shell] 纯文本查看 复制代码
1
2
3
4
5
exec /usr/bin/bash --login  #重新读取shell相关配置#初始化&#12103;志&#12098;件,并为它们设置合适的访问权限
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

重新读取shell.png
6.5 安装软件
    上面一些对于lfs系统的基本配置已经完成,下列命令以root身份运行,准备编译安装lfs所需的软件(注意并非是宿主机的root用户),如前面操作同本文一样,可以直接复制粘贴
6.5.1 Gettext-0.22.4
Gettext 软件包包含国际化和本地化&#12079;具,它们允许程序在编译时加入 NLS (本地语言支持) 功能,使它们能够以用户的本地语言输出消息
[Shell] 纯文本查看 复制代码
1
2
3
4
5
6
cd /sources
tar -xJvf gettext-0.22.4.tar.xz
cd gettext-0.22.4
./configure --disable-shared
make
cp -v gettext-tools/src/{msgfmt,msgmerge,xgettext} /usr/bin

6.5.2 Bison-3.8.2
Bison 软件包包含语法分析器生成器
[Shell] 纯文本查看 复制代码
1
2
3
4
5
6
7
cd /sources
tar -xJvf 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

6.5.3 Perl-5.38.2
Perl 软件包包含实用报表提取语言
[Shell] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
cd /sources
tar -xJvf perl-5.38.2.tar.xz
cd perl-5.38.2
sh Configure -des \
-Dprefix=/usr \
-Dvendorprefix=/usr \
-Duseshrplib \
-Dprivlib=/usr/lib/perl5/5.38/core_perl \
-Darchlib=/usr/lib/perl5/5.38/core_perl \
-Dsitelib=/usr/lib/perl5/5.38/site_perl \
-Dsitearch=/usr/lib/perl5/5.38/site_perl \
-Dvendorlib=/usr/lib/perl5/5.38/vendor_perl \
-Dvendorarch=/usr/lib/perl5/5.38/vendor_perl
make
make install

6.5.4 Python-3.12.2
Python 3 软件包包含 Python 开发环境。它被用于面向对象编程,编写脚本,为大型程序建立原型,或者开发完整的应用。Python 是一种解释性的计算机语言
[Shell] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
cd /sources
 tar -xJvf Python-3.12.2.tar.xz
 cd Python-3.12.2
 ./configure --prefix=/usr \
 --enable-shared \
 --without-ensurepip
 make
 make install

6.5.5 Texinfo-7.1
Texinfo 软件包包含阅读、编写和转换 info 页面的程序
[Shell] 纯文本查看 复制代码
1
2
3
4
5
6
cd /sources
 tar -xJvf texinfo-7.1.tar.xz
 cd texinfo-7.1
 ./configure --prefix=/usr
make
make install

6.5.6 Util-linux-2.39.3
Util-linux 软件包包含一些工具程序
[Shell] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
cd /sources
 tar -xJvf util-linux-2.39.3.tar.xz
 cd util-linux-2.39.3
 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 \
 --without-python \
 ADJTIME_PATH=/var/lib/hwclock/adjtime \
 --docdir=/usr/share/doc/util-linux-2.39.3
 make
 make install

6.6 清理文件
[Shell] 纯文本查看 复制代码
1
2
3
rm -rf /usr/share/{info,man,doc}/*  #删除已经安装的临时工具文档文件,以防止它们进入最终构建的系统
find /usr/{lib,libexec} -name \*.la -delete  #在现代 Linux 系统中,libtool 的 .la 文件仅用于 libltdl。LFS 中没有库通过 libltdl 加载,而且已知一些 .la 文件会导致 BLFS 软件包出现异常
rm -rf /tools  #rm -rf /tools

    手册中会说明如何进行系统备份和还原,以免构建lfs过程中出现问题而导致系统瘫痪。本文中使用了虚拟机快照,故不再说明如何备份还原系统。具体可以参考手册第七章。

第七部分 安装基本系统软件
7.1 概述
    上一章节中,安装了制作根文件系统所需要的基本软件。这一部分开始,安装剩下的软件。同样以lfs的root用户运行脚本,如果所有操作按照上文进行,可直接复制粘贴。本部分跳过了软件测试
7.2 Man-pages-6.06
Man-pages 软件包包含 2,400 多个手册页
[Shell] 纯文本查看 复制代码
1
2
3
4
5
cd /sources
tar -xJvf man-pages-6.06.tar.xz
cd man-pages-6.06
rm -v man3/crypt*
make prefix=/usr install

7.3 Iana-Etc-20240125
Iana-Etc 软件包包含&#12153;络服务和协议的数据
[Shell] 纯文本查看 复制代码
1
2
3
4
cd /sources
tar -zxvf iana-etc-20240125.tar.gz
cd iana-etc-20240125
cp services protocols /etc

7.4 Glibc-2.39
Glibc 软件包包含主要的 C 语言库。它提供用于分配内存、检索目录、打开和关闭文件、读写文件、字符串处理、模式匹配、算术等用途的基本子程序。这个软件包编译时间较长,且需要配置一些文件,具体可参考手册
[Shell] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
cd /sources
rm -rf glibc-2.39
tar -xJvf glibc-2.39.tar.xz
cd glibc-2.39
rm -rf build
patch -Np1 -i ../glibc-2.39-fhs-1.patch
mkdir -v build
cd build
echo "rootsbindir=/usr/sbin" > configparms
../configure --prefix=/usr \
 --disable-werror \
 --enable-kernel=4.19 \
 --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
mkdir -pv /usr/lib/locale
localedef -i C -f UTF-8 C.UTF-8
localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8
localedef -i de_DE -f ISO-8859-1 de_DE
localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro
localedef -i de_DE -f UTF-8 de_DE.UTF-8
localedef -i el_GR -f ISO-8859-7 el_GR
localedef -i en_GB -f ISO-8859-1 en_GB
localedef -i en_GB -f UTF-8 en_GB.UTF-8
localedef -i en_HK -f ISO-8859-1 en_HK
localedef -i en_PH -f ISO-8859-1 en_PH
localedef -i en_US -f ISO-8859-1 en_US
localedef -i en_US -f UTF-8 en_US.UTF-8
localedef -i es_ES -f ISO-8859-15 es_ES@euro
localedef -i es_MX -f ISO-8859-1 es_MX
localedef -i fa_IR -f UTF-8 fa_IR
localedef -i fr_FR -f ISO-8859-1 fr_FR
localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro
localedef -i fr_FR -f UTF-8 fr_FR.UTF-8
localedef -i is_IS -f ISO-8859-1 is_IS
localedef -i is_IS -f UTF-8 is_IS.UTF-8
localedef -i it_IT -f ISO-8859-1 it_IT
localedef -i it_IT -f ISO-8859-15 it_IT@euro
localedef -i it_IT -f UTF-8 it_IT.UTF-8
localedef -i ja_JP -f EUC-JP ja_JP
localedef -i ja_JP -f SHIFT_JIS ja_JP.SJIS 2> /dev/null || true
localedef -i ja_JP -f UTF-8 ja_JP.UTF-8
localedef -i nl_NL@euro -f ISO-8859-15 nl_NL@euro
localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R
localedef -i ru_RU -f UTF-8 ru_RU.UTF-8
localedef -i se_NO -f UTF-8 se_NO.UTF-8
localedef -i ta_IN -f UTF-8 ta_IN.UTF-8
localedef -i tr_TR -f UTF-8 tr_TR.UTF-8
localedef -i zh_CN -f GB18030 zh_CN.GB18030
localedef -i zh_HK -f BIG5-HKSCS zh_HK.BIG5-HKSCS
localedef -i zh_TW -f UTF-8 zh_TW.UTF-8
localedef -i C -f UTF-8 C.UTF-8
localedef -i ja_JP -f SHIFT_JIS ja_JP.SJIS 2> /dev/null || true
cat > /etc/nsswitch.conf << "EOF"
# Begin /etc/nsswitch.conf
passwd: files systemd
group: files systemd
shadow: files systemd
hosts: mymachines resolve [!UNAVAIL=return] files myhostname dns
networks: files
protocols: files
services: files
ethers: files
rpc: files
# End /etc/nsswitch.conf
EOF
tar -xf ../../tzdata2024a.tar.gz
ZONEINFO=/usr/share/zoneinfo
mkdir -pv $ZONEINFO/{posix,right}
for tz in etcetera southamerica northamerica europe africa antarctica \
 asia australasia backward; do
 zic -L /dev/null -d $ZONEINFO ${tz}
 zic -L /dev/null -d $ZONEINFO/posix ${tz}
 zic -L leapseconds -d $ZONEINFO/right ${tz}
done
cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO
zic -d $ZONEINFO -p America/New_York
unset ZONEINFO
tzselect
ln -sfv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
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

7.5 Zlib-1.3.1
Zlib 软件包包含一些程序使&#12132;的压缩和解压缩子程序
[Shell] 纯文本查看 复制代码
1
2
3
4
5
6
7
cd /sources
tar -zxvf zlib-1.3.1.tar.gz
cd zlib-1.3.1
./configure --prefix=/usr
make
make install
rm -fv /usr/lib/libz.a

7.6 Bzip2-1.0.8
Bzip2 软件包包含用于压缩和解压缩文件的程序。使用 bzip2 压缩文本文件可以获得比传统的 gzip 优秀许多的压缩比

[Shell] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
cd /sources
tar -zxvf 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

7.7 Xz-5.4.6
Xz 软件包包含文件压缩和解压缩工具,它能够处理 lzma 和新的 xz 压缩文件格式。使用 xz 压缩文本文件,可以得到比传统的 gzip 或 bzip2 更好的压缩比

[Shell] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
cd /sources
tar -xJvf xz-5.4.6.tar.xz
cd xz-5.4.6
./configure --prefix=/usr \
 --disable-static \
 --docdir=/usr/share/doc/xz-5.4.6
 make
 make install

7.8 Zstd-1.5.5
Zstandard 是一种实时压缩算法,提供了较高的压缩比。它具有很宽的压缩比/速度权衡范围,同时支持具有非常快速的解压缩

[Shell] 纯文本查看 复制代码
1
2
3
4
5
6
cd /sources
tar -zxvf zstd-1.5.5.tar.gz
cd zstd-1.5.5
make prefix=/usr
make prefix=/usr install
rm -v /usr/lib/libzstd.a

7.9 File-5.45
File 软件包包含用于确定给定文件类型的工具
[Shell] 纯文本查看 复制代码
1
2
3
4
5
6
cd /sources
tar -zxvf file-5.45.tar.gz
cd file-5.45
./configure --prefix=/usr
make
make install

7.10 Readline-8.2
Readline 软件包包含一些提供命令行编辑和历史记录功能的库
[Shell] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
cd /sources
tar -zxvf readline-8.2.tar.gz
cd readline-8.2
sed -i '/MV.*old/d' Makefile.in
sed -i '/{OLDSUFF}/c:' support/shlib-install
patch -Np1 -i ../readline-8.2-upstream_fixes-3.patch
./configure --prefix=/usr \
 --disable-static \
 --with-curses \
 --docdir=/usr/share/doc/readline-8.2
make SHLIB_LIBS="-lncursesw"
make SHLIB_LIBS="-lncursesw" install
install -v -m644 doc/*.{ps,pdf,html,dvi} /usr/share/doc/readline-8.2

7.11 M4-1.4.19
M4 软件包包含一个宏处理器

[Shell] 纯文本查看 复制代码
1
2
3
4
5
6
cd /sources
tar -xJvf m4-1.4.19.tar.xz
cd m4-1.4.19
./configure --prefix=/usr
make
make install

7.12 Bc-6.7.5
Bc 软件包包含&#12032;个任意精度数值处理语&#12180;
   
[Shell] 纯文本查看 复制代码
1
2
3
4
5
6
cd /sources
tar -xJvf bc-6.7.5.tar.xz
cd bc-6.7.5
CC=gcc ./configure --prefix=/usr -G -O3 -r
make
make install

7.13 Flex-2.6.4
Flex 软件包包含一个工具,用于生成在文本中识别模式的程序

[Shell] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
cd /sources
tar -zxvf 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

7.14 Tcl-8.6.13
Tcl 软件包包含工具命令语言,它是一个可靠的通用脚本语言。Except 软件包是用 Tcl (读作“tickle”)编写的

[Shell] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
cd /sources
tar -zxvf tcl8.6.13-src.tar.gz
cd tcl8.6.13
SRCDIR=$(pwd)
cd unix
./configure --prefix=/usr \
 --mandir=/usr/share/man
make
sed -e "s|$SRCDIR/unix|/usr/lib|" \
 -e "s|$SRCDIR|/usr/include|" \
 -i tclConfig.sh
sed -e "s|$SRCDIR/unix/pkgs/tdbc1.1.5|/usr/lib/tdbc1.1.5|" \
 -e "s|$SRCDIR/pkgs/tdbc1.1.5/generic|/usr/include|" \
 -e "s|$SRCDIR/pkgs/tdbc1.1.5/library|/usr/lib/tcl8.6|" \
 -e "s|$SRCDIR/pkgs/tdbc1.1.5|/usr/include|" \
 -i pkgs/tdbc1.1.5/tdbcConfig.sh
sed -e "s|$SRCDIR/unix/pkgs/itcl4.2.3|/usr/lib/itcl4.2.3|" \
 -e "s|$SRCDIR/pkgs/itcl4.2.3/generic|/usr/include|" \
 -e "s|$SRCDIR/pkgs/itcl4.2.3|/usr/include|" \
 -i pkgs/itcl4.2.3/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
cd ..
tar -xf ../tcl8.6.13-html.tar.gz --strip-components=1
mkdir -v -p /usr/share/doc/tcl-8.6.13
cp -v -r ./html/* /usr/share/doc/tcl-8.6.13

7.15 Expect-5.45.4
Expect 软件包包含通过脚本控制的对话,自动化 telnet,ftp,passwd,fsck,rlogin,以及tip 等交互应用的工具。Expect 对于测试这类程序也很有用,它简化了这类通过其他方式很难完成的工作。DejaGnu 框架是使用 Expect 编写的

[Shell] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
cd /sources
tar -zxvf expect5.45.4.tar.gz
cd expect5.45.4
python3 -c 'from pty import spawn; spawn(["echo", "ok"])'
./configure --prefix=/usr \
 --with-tcl=/usr/lib \
 --enable-shared \
 --mandir=/usr/share/man \
 --with-tclinclude=/usr/include
 make
 make install
 ln -svf expect5.45.4/libexpect5.45.4.so /usr/lib

注:后续的软件包作用不写上去了,具体可以参考lfs手册
7.16 DejaGNU-1.6.3
[Shell] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
cd /sources
tar -zxvf 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

7.17 Pkgconf-2.1.1
[Shell] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
9
cd /sourcestar -xJvf pkgconf-2.1.1.tar.xz
cd pkgconf-2.1.1
./configure --prefix=/usr \
 --disable-static \
 --docdir=/usr/share/doc/pkgconf-2.1.1
 make
 make install
 ln -sv pkgconf /usr/bin/pkg-config
ln -sv pkgconf.1 /usr/share/man/man1/pkg-config.1

7.18 Binutils-2.42
[Shell] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
cd /sources
rm -rf binutils-2.42
tar -xJvf binutils-2.42.tar.xz
cd binutils-2.42
mkdir -v build
cd build
../configure --prefix=/usr \
 --sysconfdir=/etc \
 --enable-gold \
 --enable-ld=default \
 --enable-plugins \
 --enable-shared \
 --disable-werror \
 --enable-64-bit-bfd \
 --with-system-zlib \
 --enable-default-hash-style=gnu
make tooldir=/usr
make tooldir=/usr install
rm -fv /usr/lib/lib{bfd,ctf,ctf-nobfd,gprofng,opcodes,sframe}.a

7.19 GMP-6.3.0
[Shell] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
cd /sources
tar -xJvf gmp-6.3.0.tar.xz
cd gmp-6.3.0
ABI=32 ./configure ...
./configure --prefix=/usr \
 --enable-cxx \
 --disable-static \
 --docdir=/usr/share/doc/gmp-6.3.0
make
make html
make check 2>&1 | tee gmp-check-log
awk '/# PASS:/{total+=$3} ; END{print total}' gmp-check-log
make install
make install-html

7.20-7.80 其他软件安装
    因为软件数量太多,所以剩下的软件安装命令及其配置都写在脚本上。脚本建议不要直接运行,因为没有使用语句来进行排错,仅是对手册中的命令复制粘贴,避免出现错误而未能及时发现,可以每个软件的那一段命令直接复制粘贴分次执行。目前所有安装和配置命令可以执行成功
  安装脚本
第七部分软件安装.zip (7.41 KB, 下载次数: 0)
7.81 移除调试符
这里直接运行下面的命令,具体解释需要参考手册(这里我不太明白)
[Shell] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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.32
 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.42.so
 libsframe.so.1.0.0
 libhistory.so.8.2
 libncursesw.so.6.4-20230520
 libm.so.6
 libreadline.so.8.2
 libz.so.1.3.1
 libzstd.so.1.5.5
 $(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

7.82 清理系统
[Shell] 纯文本查看 复制代码
1
2
3
4
rm -rf /tmp/#清理在执&#12175;测试的过程中遗留的&#12032;些&#12098;件
find /usr/lib /usr/libexec -name \*.la -delete  #删除 .la文件,原因参考手册
find /usr -depth -name $(uname -m)-lfs-linux-gnu\* | xargs rm -rf  #删除前面安装的临时编译器
userdel -r tester  #如果前面创建该用户进行软件测试,可以删除

重新读取shell.png

免费评分

参与人数 3吾爱币 +3 热心值 +3 收起 理由
WhyNotCallMeSky + 1 + 1 谢谢@Thanks!
xiao73 + 1 + 1 谢谢@Thanks!
ehu4ever + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

ehu4ever 发表于 2024-10-2 07:31
现在已经12版本了么 ,,  想当年。。。。   
 楼主| my16110 发表于 2024-10-2 08:31
ehu4ever 发表于 2024-10-2 07:31
现在已经12版本了么 ,,  想当年。。。。

我第一次看到的是8版本,但完全不知道是用来干什么的
barryade 发表于 2024-10-2 10:24
我的水平是不能制作出一个成品了。 不过也学到了很多 感谢分享
Michal007 发表于 2024-10-2 15:03
大工程的起点。多谢指导。
 楼主| my16110 发表于 2024-10-2 15:19
barryade 发表于 2024-10-2 10:24
我的水平是不能制作出一个成品了。 不过也学到了很多 感谢分享

可以试试做一下,做lfs给我的感觉是繁琐而不是难理解,愿意花时间就可以了
 楼主| my16110 发表于 2024-10-2 15:21
Michal007 发表于 2024-10-2 15:03
大工程的起点。多谢指导。

是的这个对于知道发行版怎么来的很有用,而且对于理解Linux用户层是如何与内核交互的很重要
 楼主| my16110 发表于 2024-10-2 15:43
官方还有blfs,clfs什么的,教你安装更多的软件来制作一个更好的lfs系统,甚至官方教你安装图形化界面,但都是以lfs为基础,lfs学会了再搞其他的也没有什么大问题了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-3-5 14:44

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表