(持续更新)LFS笔记之二:临时系统的构建
接上一篇:LFS笔记之一:宿主系统搭建和其他预备工作。
http://topic.csdn.net/u/20110522/01/4a998446-b94f-46e4-9184-a31ad1dee0fd.html
构建比想象中要顺利,在写这篇文章时,我已经走完了临时系统的构建,正式系统构建最关键最耗时的glibc和gcc测试也已经完成,原以为临时系统构建编译两次工具链哪里就很可能出问题,既然这么顺利,那么本篇的范围也就扩大,改为介绍临时系统的构建。
如上篇所说,这个临时系统是为了建立一个与宿主系统隔离的编译环境而构建。
首先贴出LFS文档的地址:
6.8最新稳定版:http://www.linuxfromscratch.org/lfs/downloads/stable/
6.6中文版(作为参考,除了软件版本有些区别外,描述性文字几乎和6.8一样):http://www.ha97.com/book/lfs-book-6.6/index.html
我们拿出已经准备好的Debian 6.0.1a虚拟机,它将是我们构建LFS 6.8的宿主系统。
LFS所需要的软件源码和补丁,请大家进入http:://mirrors.sohu.com/lfs/下载,就下那个6.8版本的tar文件或目录,里面源码包是全的,搜狐镜像比用wget下那个url列表快多了。
LFS文档里说几个重要软件的小版本可以不完全按照文档,比如Linux源码,文档要求2.6.37,通常2.6.37.x都可以。实际上可以更灵活,在LFS系统中,Linux源码版本真不重要,他是几乎最后才编译的,真正关键的是几个工具链软件——binutils/gcc/glibc等,构建LFS失败绝大多数是工具链的问题,他们的版本绝对不要随便换。Linux内核2.6.37还是用最新的2.6.38.6其实问题不大,我考虑到安全第一,打算采用2.6.37.6内核,这都是后话,临时系统构建根本没有内核编译的影子……
搜狐镜像下的tar解开后,加上2.6.37.6的官方内核源码包,换掉原来的2.6.37,再打包成一个iso,方便虚拟机加载。
debian6虚拟机新加一个至少20G的硬盘,虽说LFS系统很精简,不压缩总共也就几百兆,但是编译过程中也是在与宿主隔离的独立分区或硬盘上执行的,整个过程中可能有6G左右的磁盘开销(临时系统构建时也会占用宿主系统的/var和/tmp,特别是/var,宿主系统的磁盘空间也不能太紧张)。
新硬盘分区简单点一个/一个swap就行了,不过我的习惯通常是/boot和/home也分开,/boot只要100~200MB,启动专用,尤其在真机器和Windows多启动时,单独的/boot很有用,这里不赘述。/home存用户文件,如果你的Linux是主系统,可能有大量的文档或电影在/home里,我倒不很多,一般数据放在移动硬盘或者windows分区里。从优化磁盘存取的角度讲,静态数据和动态数据分区存放能大大减少碎片,因此/usr或者/var单独分出来比较好,但我一般不这么办,因为很难估算/usr和/var的开销,特别是/var。如果有多个分区,挂载时要全挂上,LFS文档里会提醒的。
关于linux目录树的一些标准,参见http://refspecs.freestandards.org/。
创建$LFS环境变量(不创建也可以,以后一些遇到他的命令行或脚本你得自己替换相应的值,很麻烦,推荐创建),tools和sources目录,专门的lfs编译用户等等,根据文档来就可以了。LFS文档的最大好处就是手把手,基本上你可以一路复制粘贴,需要自己打的命令恐怕只有cd(换目录)和tar(解包)而已。
说到解包,挂载iso后,进入光盘
ls | grep tar.gz| xargs -i -n1 tar -zxvf {} -C $LFS/sources
ls | grep tar.bz2| xargs -i -n1 tar -jxvf {} -C $LFS/sources
就能全部解开到目标目录,比一个一个来省事多了。这是典型的unix风格的命令行,管道形式的……通常Windows下的命令行程序应该是类似于tar -zxvf *.tar.gz -C $LFS/sources这种风格吧,不过我试了,linux下没用……
要注意,这次解出的源码仅用于构建临时环境,构造真正系统时,建议把源码全部删掉重新解压。不是必须的,但这样最省事,能保证源码干净。许多人LFS构建失败就是源码不干净。
LFS里有个SBU概念,单位是binutils的编译时间,几个SBU就是几倍于binutils编译时间,不一定绝对准确,和机器有很大关系。编译时间最长的是正式系统中的gcc,编译+测试,44SBU,我的core i7跑了差不多2个小时,播过我因为怕错没敢开并行编译,而且虚拟机本身也有性能损失,尤其是磁盘io。官网上有说386机器编译一个glibc编译几天的。
Debian 5/6都符合LFS 6.8文档对宿主系统的要求,如果嫌debian 6慢可以用debian 5(算上桌面的话,KDE4.4、gnome 2.30确实慢,我是在xfce下编译的,你说控制台下速度差不多?但没有X也就没有浏览器,也没有vmware-tools,没法复制粘贴啊……),最后都是自举编译,没什么区别。Debian 6的几项软件版本正好是LFS规定的上限,看来,LFS 6.8发布前用Debian 6测试了,更新的像Ubuntu 10.10、openSUSE 11.4啥的就没测了,选择Debian 6是正确的。
后面就是构建临时系统了,分成两个部分,以glibc编译/调整工具链为分水岭,之前第一遍编译binutils、gcc和抽取Linux头文件是为glibc编译做准备,大家要注意第一次gcc编译时别自作主张选上c++,会失败的。glibc编译完成后,临时环境的基础C库就有了,利用这个C库,调整工具链路径,第二次编译binutils和gcc,然后编译perl、tar、bzip2等编译正式系统是必须的软件,基本上第二次binutils和gcc时没问题,这一块就差不多了,即便有问题也只能到构建正式系统才能发现了。
LFS文档推荐严格按照文档顺序编译,不过,在完成了第二轮gcc编译之后,后面的软件应该没太大问题,我就是两个终端同时操作的。
现在临时系统就构建完成了,之所以需要这个临时系统,是为了和宿主系统完全隔离。现在的状况是,临时系统调用的是宿主机的gcc编译的。还依赖了其他许多宿主机的库,临时系统是无法脱离宿主系统运行的,但是我们通过工具链的调整,已经能够保证临时系统中的gcc编译出来的东西,是能脱离宿主系统的。
临时系统构建完成,本来以为工具链这一块会有问题,有许多可以讨论的地方,但实际很顺利,基本上按照文档走就不会有问题,所以这一篇虽然范围扩大了,但篇幅较计划缩小。
[解决办法]
编译过程多久??
[解决办法]
帮顶!!!!!!!!!!!!!!!!
[解决办法]
[解决办法]
祝你好运
[解决办法]
虚拟机里边还好
[解决办法]
顶一下
[解决办法]
好东西,收藏!
谢谢楼主!!
------解决方案--------------------
路过顶
[解决办法]
我使用的宿主机是Ubuntu 10.04,没使用虚拟机而是在真实环境下进行LFS 6.8构建工作。
但在进行 GCC 第二遍的时候,make 出错了:
make[2]: Leaving directory `/mnt/lfs/sources/gcc-4.5.2-build/libdecnumber'
make[2]: Entering directory `/mnt/lfs/sources/gcc-4.5.2-build/gcc'
make[2]: *** No rule to make target `all'. Stop.
make[2]: Leaving directory `/mnt/lfs/sources/gcc-4.5.2-build/gcc'
make[1]: *** [all-gcc] Error 2
make[1]: Leaving directory `/mnt/lfs/sources/gcc-4.5.2-build'
make: *** [all] Error 2
到现在还没有解决。楼主给分析下,Ubuntu 10.04 作宿主机不行吗?
[解决办法]
强人 仰慕一下
[解决办法]
膜拜中!
[解决办法]
关注+接分
[解决办法]
帮顶。。。。。学习
[解决办法]
这是一种什么样的精神。。。我只想一键安装那种。。。
[解决办法]
恩,lz啥时结贴
[解决办法]
mark
