昨晚终于搞定了自己的LFS系统,当出现login然后输入用户名密码成功进入系统的时刻还是挺有成就感的,
1. 前期准备
虽然在整个构建系统的过程中,有完整的LFS-BOOK可以参考,而且所有必要的命令也都已经罗列好,不过对Linux的一些常用命令还是需要预先熟悉,比如最基础的mv, cp, tar等,在LFS-BOOK中经常需要用到的还有sed, patch这两个命令,特别是sed这个工具,最好事先了解一下它的用法。
另外一个问题就是宿主系统的选择,刚开始的时候我用的是自己笔记本安装的ubuntu 8.10,按照LFS-BOOK的指示下载了一堆需要使用到的软件,花费了很多时间,然后一步步前进,分区、格式化、挂载、设置环境等等都做好开始编译安装第一个包Binutils的时候就出现了问题: 安装完之后发现并没有预期中的ld子目录,网上查资料说好像是宿主系统没有安装texinfo,然后就赶紧把texinfo给装好,重新configure, make, make install之后发现还是不行,相当地郁闷.......差点放弃o(∩_∩)o...
最后,实在是没办法,听说将LFS提供的LiveCD作为宿主系统来构建系统的成功率很高,就一狠心全部重新来过,从官网下载了LFS LiveCD(国内没有找到可以下载的地方,是从美国的网站下载来的,那是相当的需要时间,从中午一直等到晚上十二点才搞定,不过后来证明这还是值得的),另外还安装了VMware,在虚拟机中安装LiveCD来作为宿主系统。
2. 工具链的制作
可以说LFS的精髓就在这里。
如何从宿主系统开始,经过pass1, pass2制作出独立于宿主系统的工具链,创造一个可以被chrooted进的临时环境,又如何再从临时环境开始,最终构建出独立于工具链本身的LFS系统。
关键在于Binutils, GCC, Glibc这三个软件包的安装和调整。
在LFS-BOOK的第五章刚开始就明确说明了技术要点:
(1) The process is similar in principle to cross-compiling, whereby tools installed in the same prefix work in cooperation, and thus utilize a little GNU “magic”
这个过程在原理上与交叉编译类似,通过把工具安装在同一个目录(使用相同的"prefix")中以便协同工作,还利用了一点 GNU 的"魔法"。
(2) Careful manipulation of the standard linker's library search path ensures programs are linked only against chosen libraries
小心处理标准连接器的库文件搜索路径,确保程序仅连接到指定的库上。
(3)Careful manipulation of gcc's specs
file tells the compiler which target dynamic linker will be used
小心处理 gcc 的 specs 文件,告诉编译器要使用哪个动态连接器。
在整个制作过程中,需要给予特别关注的就是两次工具链的调整,第一次是在5.7节,第二次是在6.10节。
前者是在pass1编译安装好Binutils, GCC, Glibc的基础上调整标准连接器与GCC的specs文件,目的是将所有的库连接都指定到/tools/bin,从而独立于宿主系统。
后者是在chroot进入临时环境并且编译安装好Glibc之后,这里需要解释的是Glibc这个包的安装是在工具链的调整之前,因为它本身是自包含的,即使GCC的specs文件与连接器还指定在/tools, Glibc依旧可以顺利地安装。
"The Glibc build system is self-contained and will install perfectly, even though the compiler specs file and linker are still pointing at /tools
."
后者的工具链调整,目的是将所有的库连接都指定到临时环境的{,/usr}/bin,从而独立于工具链。
3. 引导系统启动
这里主要需要注意的是内核的编译与Grub的使用,其中内核的编译主要可以参考<手把手教你如何建立自己的Linux系统>。
我硬盘的分区是这样的:
/dev/sda1 swap
/dev/sda2 ext3 mounted on /
运行grub时输入:
grub
root (hd0, 1) //这里需要注意的是不管是IDE硬盘还是SCSI硬盘,都是用的hd,另外就是root与(hd0,1)之间有空格
setup (hd0) // 将grub安装到硬盘的MBR
quit
创建/boot/grub/menu.lst文件
default 0
timeout 30
title LFS 6.3
root (hd0,1)
kernel /boot/lfskernel-2.6.22.5 root=/dev/sda2