LFS(一)

LFS(一)

0.前言

  这里的搭建是参考了网上一位博主的教程进行学习的,附上参考连接:

1
https://blog.csdn.net/u012333520/article/details/50533002

1.概念

  lfs其实本质上就是一个项目,用于引导我们如何构造出属于自己要求或者喜好的Linux系统,这种定制的Liunx系统不仅能满足用户的特定要求,还能提高搭建人员的Linux技能。

  如果说Linux系统是一栋房子的话,我们在提供了房屋的主体承重墙(毛坯房)的基础上,剩下的内饰和装修都靠我们自己完成,除此之外,从源码构建一个完整系统,我们能够审核所有的代码的打入的补丁,这样子能避免花费太多的件等待官方或者比尔编译修复安全漏洞的二进制程序。

2.前期环境准备

  • 下载镜像

  首先是开发下载lfs.iso镜像环境的准备,我这里使用了VM15 pro版本,并且在指定lfs网站中选择了对应的lfs系统版本模型,我这里选择的是/lfslivecd-x86-6.3-r2145版本:

1
http://ftp.osuosl.org/pub/lfs-livecd/lfslivecd-x86-6.3-r2145.iso

  fslivecd-x86-6.3-r2145是一个Linux发行版的Live CD镜像文件。它基于Linux From Scratch(LFS)项目构建,这个Live CD镜像文件是提供了一个可启动的Linux环境,以便我们可以在没有安装Linux的情况下使用它来构建一个LFS系统

  正如前文所比喻的那样子,fslivecd提供了一个基本的、可启动的Linux环境,类似于一个毛坯房,里面没有装修和家具,但是有一些基本的设施和工具,让我们能够开始构建自己的Linux系统。我们需要自己安装和配置所需的软件和应用程序,就像在毛坯房里进行装修和布置一样。(这里可以看到我下载成了64的版本,后续会因为这个遇到一点麻烦,所以这里还是提倡使用32版本的镜像进行学习,当然下面的命名就是hdd而非hda了)

  • 镜像创建

  首先打开虚拟机软件

  点击自定义高级选项,点击下一步,这里的自定义高级选项是为了后面的选择Linux内核做准备

  这里为默认设置即可,点击下一步

  这里选择稍后安装操作系统,点击下一步

  这里的客户机操作系统理所应当的选择Liunx系统,版本选择LLinux2.6.x的内核版本,点击下一步

  我这里设置虚拟机名称为one-LFS以及镜像存放位置为D盘的相关路径,点击下一步

  这里是处理器的配置,我这为了提高速度选择了一个处理器并且单个处理器对应是内核数量是8,完全是够用的了,点击下一步

  这一步是设置内存的大小,这里选择了默认推荐的内存256MB(轻量级嘛),也可以选择最大的推荐内存,但是后面的相关操作需要做出相应修改即可,点击下一步

  网络类型就直接选择网络地址转换即可,也就是nat模式,点击下一步

  I/O的SCSI控制器选择默认的LSI Logic即可,然后点击下一步

  虚拟磁盘类型选用IDE,IDE是一种早期的磁盘接口标准,它使用了一个16位的控制器来管理磁盘。IDE虚拟磁盘通常具有较低的性能和容量限制,但它们易于配置和使用,并且可以与大多数操作系统兼容,SCSI虚拟磁盘和SATA虚拟磁盘可能不适用于所有操作系统,这是为了后面更加顺利的进行,然后点击下一步

  直接选择创建新虚拟机磁盘,继续点击进入下一步

  最大磁盘大小设置为8GB,然后选择虚拟磁盘存储为单个文件,这样子简单易用,只需要管理一个文件即可。同时,由于整个虚拟磁盘都存储在一个文件中,所以在备份和迁移时也比较方便。点击下一步

  默认文件名就行,不理会,继续下一步

  到这里,虚拟机的整体环境配置搭建完成,查看虚拟机信息是否出错,没有的话点击完成按钮即可。接下来使用前面下载的lfs.iso镜像

  设置完后,启动my-LFS虚拟机看到如下界面即可

3.初始化

  进入界面:

  首先选择时间,在中国,Linux一般都是选择Asia/Shanghai,确认ok了就进入下一个配置

  这是配置系统时钟,将系统时钟设置为本地时间还是GMT时间,这里直接设置local time即可,进入下一配置

  这里是语言设置,为了后面不会有中文路径或者其他的影响,含泪选择使用English,USA(UTF-8)

  截止到这里就是LFS系统的初始化完成了

4.磁盘分区

  输入分盘指令:

1
cfdisk /dev/hda

  这里需要注意,也有可能会遇到”fatal error: cannot open disk drive, press any key to exit cfdisk”的情况,这里就需要进入到dev文件中查找磁盘的内容了

1
2
cd /dev
ls | grep hd

  由于系统分配磁盘时不一定用hda作为名称,有可能是hdd或其他名称的,只要把名称找到并修改成相应的代码即可进入下一步,这里问题不大。接下来继续操作,通过方向按键选中New选项

  选择Primary选项,”new”命令中的”primary”选项表示创建一个主分区。主分区是指可以直接用来安装操作系统或存储数据的分区,每个硬盘最多只能有4个主分区

  大小选择512,再选择Beginning,即可创建出hda1分区

  这里可以看到我们已经创建dha1成功,然后按下↓健继续分盘,按照hda1的操作进行重复操作生成hda2盘,单人size直接默认即可,也就是剩下的大小作为根分区

  这里需要提交的是,由于我们前面选择的是IDE样式的磁盘类型,所以这里的分区名字为had,如果说是使用SATA、SCSI等的磁盘类型,那么命名则需要修改为类似sda等名字的类型

  选择Write再选择Quit 退出即可,这样子系统从磁盘分区操作就完成了,接下来是进行磁盘分区格式化。这里有个问题,就是在Write的时候,他不给打出完整的yes,打完ye就换行无法输入了,导致我都不知道他执行了write没有

  我只能说多少有点离谱,但是问题不大,我们有另外的检验办法这里先Quit,进入终端命令行,使用一下命令

1
fdisk –l /dev/hda

  如果成功将分区表写入磁盘,我们就应该能够看到磁盘上已经创建了新的hda1与hda2两种分区

5.分区格式化

1
2
mkswap /dev/hda1
mkfs.xfs /dev/hda2

  这两个命令分别是用来创建交换分区和XFS文件系统的。mkswap /dev/hda1命令将/dev/hda1分区格式化为Linux交换分区,用于存储内存中暂时不需要的数据。而mkfs.xfs /dev/hda2命令则将/dev/hda2分区格式化为XFS文件系统,用于存储文件和数据

  首先查看mkswap /dev/hda1的反馈,其返回了”setting up swapspace version q, size = 511864 kb”这样的输出,那么说明交换分区已经成功创建并启用。该输出表示交换分区的版本和大小信息。可以使用swapon -s命令来查看交换分区的状态,确认是否已经成功启用

  使用swapon -s命令没有查看到交换分区的状态,这里猜测是因为交换分区没有被正确地挂载。尝试使用swapon /dev/hda1命令手动启用交换分区,最后再次查看显示成功

1
2
3
swapon
swapon /dev/hda1
#如果要取消挂载,可以使用swapoff /dev/hda1

  在输出中能够看到/dev/hda1分区,并且其状态为”partition”或”file”,则说明交换分区已经成功创建并启用。

6.建立必要文件

  上文,我们提到了对磁盘分区进行了格式化,目的就是为了创建一个LFS的舞台出来,首先是创建一个LFS的操作基地

1
2
export LFS=/mnt/lfs
mkdir -pv $LFS

  export LFS=/mnt/lfs创建一个名为LFS的环境变量,并将其设置为/mnt/lfs目录,接下来使用了mkdir命令创建/mnt/lfs目录,需要注意的是这里的export命令仅仅是为了后面引用的绝对路径方便而设置的LFS环境变量(少打一些字),创建完这个基地后,我们需要将之前创建的hda2加载到我们的操作基地中

1
mount /dev/hda2 $LFS

  接下里创建必要的目录并设置属性

1
2
3
4
5
mkdir -v $LFS/sources
chmod -v a+wt $LFS/sources
#创建工具链接
mkdir -v $LFS/tools
ln -sv $LFS/tools /

  sources的创建主要是由于其必要性,创建这个文件就是为了记录所有需要下载的软件包的名称和下载链接。这个文件通常位于/mnt/lfs目录下,并包含一个列表,其中每行都包含一个软件包的名称和下载链接。

  而对于tools相关指令的作用是建立了工具链目录,为了在创建工具链和使用工具链创建目标系统的杀手对于工具链的位置都是tools,这样子可以保证工具链的正常使用(我理解的是这个目录是用与存放LFS系统所需的所有工具和编译器),接下来进行创建和登陆用户的设置

7.创建/登录lfs用户

1
2
3
4
5
6
groupadd lfs
useradd -s /bin/bash -g lfs -m -k /dev/null lfs
passwd lfs #回车输入密码,我这里设置的是4399
chown -v lfs $LFS/tools #将tools目录的用户改为lfs
chown -v lfs $LFS/sources #将sources目录的用户改为lfs
su – lfs #登录lfs用户

  以上就是创建并登录好的lfs用户,这里需要提及一下创建用户的命令,这个命令创建了一个名为lfs的用户,并将其添加到lfs组中。该用户的默认shell是/bin/bash,-m选项告诉useradd命令在创建用户时同时创建家目录。-k /dev/null选项告诉useradd命令不要使用任何默认的skel目录或文件来初始化新用户的家目录,这通常用于避免在家目录中包含不必要的文件和目录!

  最终登录成功命令行提示符也从#变为了$

8. 配置lfs用户环境

1
2
3
cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF

  ~/.bash_profile文件是一个bash shell的配置文件,它通常用于设置用户的环境变量和其他一些个性化的设置。exec表示将当前进程替换为新的bash shell进程;env -i表示清除所有的环境变量,只保留指定的变量;HOME=$HOME、TERM=$TERM和PS1=’\u:\w$ ‘分别设置了HOME、TERM和PS1这三个环境变量的值;最后,/bin/bash表示使用/bin/bash作为默认shell。

  这里需要提及一下PS1是用与设置命令提示符的,其中u代表用户名,w代表当前工作目录的路径,$表示工具用户的权限显示$或者#

1
2
3
4
5
6
7
8
cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
PATH=/tools/bin:/bin:/usr/bin
export LFS LC_ALL PATH
EOF

  首先了解~/.bashrc是另一个bash shell的配置文件,它通常包含一些其他的设置,如别名、函数和路径等。当用户打开一个新的bash shell时,bash shell会自动读取该文件,并根据其中的内容来设置相应的别名和函数等

  set +h表示取消了对shell脚本拿到hash检查,umask 022则表示umask为022,也就是之前所提到的权限设置,这里默认文件权限为644,而目录权限为755,LFS=/mnt/lfs表示设置LFS环境变量为/mnt/lfs,LC_ALL=POSIX表示设置所有的locale为POSIX;PATH=/tools/bin:/bin:/usr/bin表示将/tools/bin、/bin和/usr/bin三个路径添加到PATH环境变量中

1
source ~/.bash_profile

  最后就是更新修改的bash_profile文件,这里的bashrc文件为什么不用source呢,这是因为bashrc文件在没差打开新的bash shell时都会被自动的读取和执行,但是bash_profile问你安只有在用户登录的时后才会被读取和执行,因此当我们修改了bashrc文件时,它会立即生效,因为下一次打开bash shell就会自动读取并应用新的设置,bash_profile文件,则需要使用source命令或重新登录才能使新的设置生效

  到这里,我们的配置lfs用户环境就告一段落了,接下来就是进入mnt/lfs文件中编译目录了。

9.编译安装基本相关工具

  首先我们进入到LFS包编译目录当中

1
cd $LFS/sources

  确实直接输入cd /mnt/lfs也是一样的,前文有提到过,进入到源的文件后,接下里就是进行我们自己相关工具的编译安装,这里需要提及一下,在lfslivecd中已经给了相关根据的压缩包,都存放在了lfs-sources的文件中

  • Binutils-2.17 - Pass 1

  首先介绍下Binutils工具,它是一组用于处理二进制文件的工具集,被广泛用于编译和链接程序,除此之外还能够处理多种不同的二进制文件格式,是构建一个基本拿到Linux系统所必须的软件包之一

1
2
3
4
5
6
7
8
9
10
11
cd ../binutils-build
CC="gcc -B/usr/bin/" ../binutils-2.17/configure --prefix=/tools --disable-nls --disable-werror
make
make install
make -C ld clean
make -C ld LIB_PATH=/tools/lib
cp -v ld/ld-new /tools/bin
cd ..
rm -rf binutils-build
rm -rf binutils-2.17

  之前的编译安装也有了很好的基础了,这里就不对所有的指令进行解释了,着重介绍几个;

  第五条命令中的CC=”gcc -B/usr/bin/“是用来设置编译器选项的。其中,CC是一个环境变量,它指定了要使用的C编译器。在这个命令中,我们将CC设置为”gcc -B/usr/bin/“,这意味着我们将使用gcc编译器,并且将其搜索路径设置为/usr/bin/。接下来,../binutils-2.17/configure –prefix=/tools –disable-nls –disable-werror是运行configure脚本的命令。其中,–prefix=/tools选项指定了安装目录,–disable-nls选项禁用国际化支持,–disable-werror选项禁用所有警告错误。其次是make -C ld clean 和make -C ld LIB_PATH=/tools/lib,ld是之前所没遇到过的make指令,前者是用来清除之前编译生成的文件,一遍重新编译,后者则是编译并安装了ld,并指定了安装目录为/tools/lib下,这里的-C是表示进入到指定目录中,这里就是进入到ld的目录文件中

  这里还需要讲解的一个就是,这一步是Binutils安装的第一个步骤,这个步骤是用来构建一个最小的binutils工具集,该工具集只包括一些基本拿到二进制工具,这个最小的binuxtils工具集被用用来编译一些必要的系统工具,而在第二个步骤总,也就是后面会出现的Binutils-2.17 - Pass 2将会利用Pass1构建的最小binutils工具集重新构建新的binutils软件包,新的软件包包括了更多的功能和库文件,以便于编译更加复杂的程序,后文的gcc等安装也是如此的道理

  • GCC-4.1.2 - Pass 1

  gcc工具相比并不陌生,作为一个开源的编译器几核,支持包括C、C++等多种编程程序,被广泛用于编译和链接的程序,具有高度达到可移植性和灵活性,基本也是Linux必装的安装包之一(甚至没有之一,少了gcc,寸步难行)

1
2
3
4
5
6
7
8
9
10
tar xvf /lfs-sources/gcc-4.1.2.tar.bz2
mkdir -v gcc-build
cd gcc-build
CC="gcc -B/usr/bin/" ../gcc-4.1.2/configure --prefix=/tools --with-local-prefix=/tools --disable-nls --enable-shared --enable-languages=c
make bootstrap
make install
ln -vs gcc /tools/bin/cc
cd ..
rm -rf gcc-build
rm -rf gcc-4.1.2

  这是因为32为和64位的问题所导致的,这里只需要重新编译并在–enable-languages=c 后面加上–disable-multilib即可解决

  编译通过,这里出现了一个make【3】显示Nothing to be done for,查阅的资料是显示提示我们已经编译好了,而且没有对代码做任何的改动

  • Linux-2.6.22.1 API Headers

  Linux-2.6.22.1 API Headers是一组头文件,它们包含了Linux内核API的定义。这些头文件提供了访问Linux内核函数和数据结构的接口, 具体来说,这些头文件包括了系统调用、进程管理、文件系统、网络协议等方面的定义,对于Linux应用程序的开发非常重要

1
2
3
4
5
6
7
8
tar xvf /lfs-sources/linux-2.6.22.1.tar.bz2
cd linux-2.6.22.1
make mrproper
make headers_check
make INSTALL_HDR_PATH=dest headers_install
cp -rv dest/include/* /tools/include
cd ..
rm -rf linux-2.6.22.1

  mrproper命令是会清除当前内核源代码目录中的所有生成文件,包括配置文件、对象文件和模块文件等。这个命令通常在重新编译内核时使用,以确保干净的编译环境。

  headers_check命令顾名思义是将会检查当前内核源代码目录中的头文件是否符合标准。这个命令通常在开发新的内核模块时使用,以确保头文件的正确性。

  INSTALL_HDR_PATH=dest headers_install命令则将会编译并安装内核头文件到指定的目录”dest”中。这个命令通常在编译用户空间程序时使用,以便访问内核API。

  • Glibc-2.5.1

  Glibc-2.5.1是GNU C库的一个版本,也称为glibc。它是Linux系统中最重要的库之一,提供了许多基本的系统函数和数据结构,例如内存分配、字符串处理、文件操作等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
tar xvf /lfs-sources/glibc-2.5.1.tar.bz2
cd glibc-2.5.1
mkdir -v ../glibc-build
cd ../glibc-build
../glibc-2.5.1/configure --prefix=/tools \ #指定了安装目录为/tools
--disable-profile \ #禁用了性能分析功能
--enable-add-ons \ #启用了一些额外的功能
--enable-kernel=2.6.0 \ #指定了支持的内核版本为2.6.0
--with-binutils=/tools/bin \ #指定了binutils工具的路径
--without-gd \ #禁用了GD库的支持
--with-headers=/tools/include \ #指定了头文件的路径
--without-selinux #禁用了SELinux支持
make
mkdir -v /tools/etc
touch /tools/etc/ld.so.conf
make install
cd ..
rm -rf glibc-build
rm -rf glibc-2.5.1

LFS(一)
https://one-null-pointer.github.io/2023/06/11/Linux运维——LFS/
Author
liaoyue
Posted on
June 11, 2023
传送口