断断续续折腾了三天,终于在情人节前夜把LFS折腾出来了。有种做JOS的感觉,虽然性质不大相同。

新系统跑起来就是快,开机10秒不到,新安装的发行版也就这个速度吧。啥时候能做一个1秒启动的就好了。

整个过程还是挺有趣的。大体上就是先在host上做一个host-independent/self-contained/self-hosted的toolchai n,然后chroot到LFS目录,再用这个toolchain做出target上的所有东西。tools那个软链接很巧妙,使得chroot内外可以以相同的路径操 作。制作toolchain备份的ld-new也很极品,在第二次调整toolchain时覆盖回来就OK了。在target上的bash使用+h选项禁用了hash ,在PATH环境变量中把target的路径放在tools前面,从而使得新生成的工具可以立刻被使用。

最重要的三个软件包是binutils,gcc和glibc。binutils包含了一系列二进制工具,如as,ld,objdump,用来管理目标文件。gcc用来 编译,并和binutils紧密集成。glibc是GNU的C runtime library。每次build的时候基本是一个glibc->binutils-> gcc的顺序(第一次是个例外,因为我们想确保整个工作都是用自己的工具完成的,所以先编译了binutils和gcc)。每次glibc建造完成后就调整ld的se arch path和gcc的specs,使得接下来建造出的程序可以链接到新的glibc。当然其实一共只有两次,一次是host到temp toolchain,另一次是temp toolchain到target。

整体过程是binutils->gcc->glibc->[adjust toolchain(host->toolchain)]->binutils->gcc->[chroot into target]->glibc->[adjust toolchain(toolchain->target)]->binutils->gcc->all the rest。

遇到的问题么,也有一些。比如像解压缩用tar -jxvf还是tar -zxvf这种(应该写个小脚本的)……还有每个软件包的configure都不相同,还有各 自不同的bug和patch,如果不是LFS的作者罗列出来,估计这就是近乎不可解的问题了。不过最严重的问题是,一旦退出了特定的环境,怎样可以保证返回到相同的环 境下。Chapter 6开始的步骤要好好看,从chroot退出来再进去的时候不要忘了挂载那些需要挂载的东西。我一度白痴到纳闷target的/dev为什么没有设备文件……

最后启动的时候其实也不一定要写MBR,写PBR就够了,然后在host的grub里chainloader +1一下就OK了。

然后就可以reboot了,跳过两个grub过后就是我们可爱的小系统:)

有两个暂时没有解决的问题是:

  1. 在LFS上怎么对付那些没有make uninstall的Makefile
  2. 有没有什么方法在host上直接挂载VirtualBox的.vdi磁盘镜像