LFS介绍:
LFS──Linux from Scratch,就是一种从网上直接下载源码,从头编译LINUX的安装方式。它不是发行版,是一个告诉你到哪里下载源码,怎么把这些生东西( raw code) 作成符合自己的个性化的linux,不单单是个性的桌面。Linux From Scratch项目简称LFS,它提供具体的步骤、特定的补丁、必须的脚本,从而提供一个简便的创建Linux发行版的途径。
LFS的意义不在于机械地编译,事实上,按照文档描述,简单地点击键盘即可生成一个简略的发行版,这并不是存在时间达13年的LFS的目的。LFS的意义在于让使用者理解编译参数的作用,理解补丁的作用,理解LFS附带的脚本的工作过程,从而达到脱离LFS、独立制作并完善发行版的目的。
实验环境:
采用VMWareWorkstation5.X的环境下制作。
实验过程:
1、准备工作
下载LiveCD的ISO文件,刻录ISO文件到光盘上并进入镜像安装向导。
镜像安装向导:
选择File->New->Virtual Machine...启动向导,选择Custom,并选择New-Workstation 5.x

图1 选择虚拟机硬件兼容性
在选择Guest operating system里选择Linux,在Version里选择Other Linux 2.6.x kernel存放目录、处理器数量和内存大小根据实际情况,建议内存不得小于128M,最好256M以上。

图2 选择客户机操作系统

图3 选择虚拟机内存
Network connection里选择Use network address translation(NAT),SCSI Adpters选择默认的LSI Logic就可以。

图4 选择网络类型

图5 选择I/O控制器类型
如果选择了IDE,则内核的默认设置就可以支持,但如果选择了SCSI,就必须在内核中加入对SCSI Adpters的支持,因为前面选择了LSI Logic,所以内核中就必须加入对LSI Logic的支持,否则将无法启动,相关部分在最后的内核编译部分有说明。不过这里我建议选择使用IDE,一方面方便驱动,另外似乎LFS-6.3-r2145尚不能支持LSI Logic的SCSI磁盘,用该LiveCD启动后可能无法识别出硬盘来。

图6 选择磁盘类型

图7 选择磁盘
磁盘选择Create a new virtual disk
对于磁盘大小,使用4G足够编译LFS了,但如果你打算编译更多的BLFS,这里可以考虑适当的增加一些大小,如果磁盘空间比较富裕就用默认的8G。

图8 指定磁盘容量

图9 指定磁盘文件
完成向导,打开该系统。

图10 打开系统

图11 系统显示界面
Enter,由于虚拟盘上没有任何信息,因此将自动从LiveCD中启动,在启动过程中会出现选择时区等信息,你可以按照实际情况选择,也可以按照默认选择,简单点就是等待一会系统会自动进行选择。这里我选择时区为Asia/Shanghai,选择本地语言。其它的都按默认选择了。

图12 选择时区

图13 选择本地语言

图14 选择完成界面
启动完成LiveCD后就开始建造自己的LFS的历程。

图15 开始敲击命令
磁盘分区:
输入命令:
代码:
cfdisk /dev/hda

图16 磁盘分区命令
将出现分区界面

图17 分区界面
点击new添加

图18 磁盘分区添加
添加完成后write,Quit。这里可以按照你自己的需要的分区,这里我按照设置一个根分区和一个交换分区为例,交换分区占用512M,其余的全部分给根分区。
磁盘分区作用
/dev/hda1 swap
/dev/hda2 作为目标系统根目录
保存退出后进行磁盘分区的格式化

图19 磁盘分区的格式化
创建LFS的“创作基地”
设置环境变量

图20 设置环境变量
export LFS=/mnt/lfs这条命令的作用是为了后面引用“创作基地”的绝对路径方便而设置LFS这样的环境变量。
加载/dev/hda2到“创作基地”

图21 加载

图22 创建源代码编译用目录

图23 创建工具链目录
上面这两句就建立了神奇的工具链目录(是工具链目录不是工具链),这样的创建方式是为了在创建工具链和使用工具链创建目标系统的时候对于工具链的位置都是/tools,这样可保证工具链的正常使用。
创建LFS用户

图24 创建用户
设置lfs密码,设置为空就行了,也就是输入密码的时候直接回车就成。

图25 设置LFS密码
将tools和sources目录的用户改为lfs,以便后面使用lfs来操作这两个目录

图26 更改目录用户

图27 登陆到lfs用户
这时候命令行提示符已经由#改为了$
建立LFS用户的环境

图28 建立LFS用户环境
这里利用了bash的环境变量的设置文件将lfs的环境设置为符合编译工具链要求的最少的环境参数。
开始工具链的制作
进入LFS包编译目录
cd $LFS/sources
tar xvf /lfs-sources/binutils-2.17.tar.bz2后

图29 进入LFS包编译目录
接着我们需要建立一个目录,因为binutils建议使用一个空目录来编译。
mkdir -v ../binutils-build
cd ../binutils-build
CC="gcc -B/usr/bin/" ../binutils-2.17/configure --prefix=/tools --disable-nls --disable-werror
Make

图30 Make后界面
建立一个目录,因为binutils建议使用一个空目录来编译。


图31 建立一个目录


图32 Linux-2.6.22.5 API Headers


图33 Glibc-2.5.1
这里的参数--enable-kernel=2.6.0,只是为了说明kernel的大版本,所以不需要根据实际的kernel版本来改,即使是用linux-2.6.15也一样只写2.6.0就可以了。
调整工具链
工具链的调整方法有好几种,而且不同版本GCC的specs可能会有不同,但实际上都是把specs文件中的/lib/ld-linux.so.2替换成了/tools/lib/ld-linux.so.2,所以即使有些文章在调整工具链上的命令和LFS手册上的不一样也不用太奇怪,当然也可以直接用gcc-dumpspecs导出后手工直接编辑specs文件。

图34 调整工具链
测试工具安装,这部分将安装3个用于各种源码包编译后的测试的工具。


图35 测试工具安装
GCC-4.1.2 - Pass 2


图36 GCC-4.1.2 - Pass 2
再次测试工具链的调整,以确保刚刚编译的gcc正确工作。

图37 测试工具链的调整
如果输出大致如下
[Requesting program interpreter: /tools/lib/ld-linux.so.2]
则表示调整成功,因为所有的库已经连接到了/tools/lib下。


图38 Binutils-2.17 - Pass 2

图39 Glibc-2.5.1

图40 Ncurses-5.6

图41 Bash-3.2

图42 Gawk-3.1.5

图43 Util-linux-2.12r
到目前为止,工具链已经制作完成了,接着就要开始制作真正的目标系统了。
制作目标系统
从现在开始不再需要lfs用户来制作系统了

图44 重新设置目录权限

图45 创建三个重要目录

图46 创建两个目标系统所必须的设备文件

图47 利用主系统加载几个重要的文件系统
将lfs-sources里面所有源码包复制到$LFS/sources目录中

图48 Chroot到目标系统的目录下


图49 建立目标系统的目录结构
创建几个必要的链接,因为在目标系统的编译过程中,部分编译程序会用绝对路径来寻找命令或文件。

图50 创建链接
创建root及nobody用户和必要的组

图51 创建组
重新加载bash,以使root用户起效,这样前面的提示符就不会是“I have no name!”创建和设置几个临时文件和日志文件。到目前为止,创建目标系统的准备工作以基本完成。

图52 创建和设置几个临时文件和日志文件
本次实验是在虚拟机上完成的,通过磁盘分区、创建LFS的“创作基地”、创建lfs用户、建立lfs用户的环境、开始工具链的制作、调整工具链、制作目标系统等操作步骤对LFS进行了环境的配置已经制作。中间出现了不少问题,例如创建工具链目录不成功、LFS包编译目录无法进入等问题,但最终都通过排错的方法实现了基本功能。
参考文献
[1]孙海勇, 手把手教你如何建立自己的Linux.科学出版社,2008,(2).
[2] http://www.linuxfromscratch.org/

