终于装完LFS-SVN-20080423,昨晚已经成功启动进入系统。回顾整个过程,中间也出过不少问题,最后都解决了,也挺有收获的。
首先下软件包,软件包下的都是新的,比书中新的软件为:(前面是书里的版本)
coreutils-6.10-> coreutils-6.11.tar.gz
file-4.23->file-4.24.tar.gz
findutils-4.2.33->findutils-4.4.0.tar.gz
gcc(4.2.3)->gcc-4.3.0.tar.bz2
libtool-1.5.26-> libtool-2.2.4.tar.bz2
linux-2.6.24.4-> linux-2.6.25.3.tar.bz2
m4(1.4.10)->m4-1.4.11.tar.bz2
perl(5.8.8)->perl-5.10.0.tar.gz
tar(1.19)->tar-1.20.tar.bz2
texinfo(4.11)->texinfo-4.12.tar.gz
udev(113)->udev-122.tar.bz2
另外为了装gcc4.3还需要额外的两个软件:
gmp-4.2.2.tar.bz2
mpfr-2.3.1-patches
mpfr-2.3.1.tar.bz2
宿主机为ubuntu8.04,检查发现没有gawk,bison,texinfo,于是先装了这三个包,然后就开始编译临时工具链。
Binutils第一遍顺利通过,开始gcc4.3,configure时就出错了,需要gmp和mpfr,于是又先在宿主机中装gmp和mpfr。
gmp4.2.2:
./configure --prefix=/usr --enable-cxx --enable-mpbsd
make
make check
make install
然后是mpfr2.3.1:
先patch -N -p1 < ../mpfr-2.3.1-patches
./configure --prefix=/usr
make
make check
make install
再装gcc,按书上gcc4.2.3的参数,gcc4.3的文档里也有,都一样,现在就一切正常了。接下来继续跟书,到glibc又不行了,configure时找不到头文件limits.h。
百度里找了找,已经有牛人解决了,原来gcc4.3将一部分头文件放到另一个文件夹中,原来全都在文件夹include里,现在limits.h和其他几个头文件被放到了include-fixed里,glibc就找不到了,要将glibc的configure文件改一下:
sed -i -e "/ccheaders=/s@\`\(\$CC.*include\)\`@\"& -isystem \`\1-fixed\`\"@" configure
之后glibc顺利通过,然后调整工具链什么的,按书来,到gcc第二遍时,为了使最终gcc不用依赖宿主机,又先把gmp和mpfr装进工具链里。
gmp4.2.2:
./configure --prefix=/tools --enable-cxx --enable-mpbsd
make && make check
make install
mpfr2.3.1:
./configure --prefix=/tools
make && make check
make install
再进行第二遍的gcc和binutils都按书上的顺利通过。工具链的测试也没什么问题,后面工具链的编译就和书上一样了,有的软件包需要补丁,软件包版本还和书上不一样,看了看patch文件内容,再查看源文件,发现都还可以打上去,像perl5.10,发现patch文件里甚至都不是5.8版本的,还是更早的,5.10的源文件也没补丁,而且patch会自动发现若打过补丁会识别出来的,所以都顺利打上~~
工具链编到一半时,我甚至把工具链和放软件包的两个文件夹移到另一个分区上了,把分区挂到/mnt/lfs/tmptools,再做了两个软链接sources->tmptools/sources,tools->tmptools/tools,依然正常,让我感叹软链接的强大啊!
进入第六章真正安装LFS系统,装glibc时仍要给configure文件打补丁,和前面一样。不过测试时出了几个错,math和crypt测试Error,Google似乎有人说可以忽略,管他呢,ignore....
Binutils的test也没通过。。。[check/am][check/ld]Error...无语ing,搞了半天还是ignore了。。。
装到gcc时,又报告没有gmp和mpfr,居然犯傻用--with-gmp=/tools和--with-mpfr=/tools进行安装,make到一半时我突然想到似乎不对,以后系统的gcc都要依赖/tools里的gmp、mpfr?于是马上停下,装gmp和mpfr先。。。配置gmp时发现需要m4,而工具链里没有装m4。。。
@#^@$@#&%.....
问题来了,是直接先将M4装到系统里,还是先装M4到工具链?想到LFS书中说顺序很important,怕以后m4又跟/tools扯上什么关系,还是先装到工具链里吧。
./configure --prefix=/tools
make && make check && make install
不过现在gcc是工具链的,glibc是系统里的,编出来的M4是工具链的。。。我都有点混乱了。。。
不管了,继续gmp,mpfr和前面编译工具链差不多,就是改下参数--prefix=/usr
装完gcc测试OK,go on......
没想到到coreutils时test又有错了。。。。无法解决,痛苦的ignore.....已经有点不爽了,test耗费无数的时间,尤其大点的程序如gcc....出了错也不知道怎么搞。。。最后还是ignore...于是以后不再test.....一路到底。
装完后重启系统,进不去。。。。
VFS: Cannot open root device "sda5" or unknown-block(0,0)
Please append a correct "root=" boot option
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
百度之
发现造成这个问题的原因十有八九是没有把root文件系统所在的硬盘控制器的驱动程序编译到内核中。解决的也很直接:找到硬盘控制器的型号,然后把相应的驱动程序编译到内核中。
1、在构建LFS的host系统上,运行lspci命令,列出机器的硬件信息。
2、在硬件信息中,查找 IDE interface 或 SATA Controller 或 SAS Controller 等关键字,得到到硬盘控制器的型号
3、在内核配置中,把对应的驱动程序编译到内核(不能编译成模块)。对 IDE硬盘,驱动程序在Device Drivers-->ATA/ATAPI/MFM/RLL配置项下找;对于 SATA硬盘,驱动程序在Device Driver-->SCSI device support-->SCSI low-level drivers配置项下找。
4、重启机器,在LFS的新内核下,问题解决。
但我是将驱动编译进了内核啊。。。痛苦ing,在菜单里找了半天,最后发现居然忘了打开SCSI disk support。。。
重新编译了内核,结果在挂载文件系统时又出错:
fsck.ext3: No such file or directory while trying to open /dev/sda5
/dev/sda5:
The superblock could not be read or does not describe a correct ext2 filesystem. If the device is valid and it really contains an ext2 filesystem (and not swap or ufs or something else), then the superblock is corrupt, and you might try running e2fsck with an alternate superblock:
e2fsck -b 8193
* filesystem could not be fixed.
真是很郁闷,网上搜了半天,有人说编译内核时不能用devfs,还要把ext3文件系统编译进内核,不能是模块,检查内核编译菜单,没有找到devfs,似乎新版本内核已经没有devfs了,用udev来管理设备结点,去看启动脚本又看不懂。。。。
最后真是不知道怎么就在内核配置里找到一项:
Create deprecated sysfs files
This option creates deprecated symlinks such as the "device"-link, the :-link, and the"bus"-link. It may also add deprecated key in the uevent environment.
None of these features or values should be used today, as they export driver core implementation details to userspace or export properties which can't be kept stable across kernel releases.
If enabled, this option will also move any device structures that belong to a class, back into the /sys/class hierarchy, in order to support older versions of udev and some userspace programs.
If you are using a distro with the most recent userspace packages, it should be safe to say N here.
估计这就跟那个devfs差不多了,去掉这一项再编译内核,重启~~
终于成功进入系统,看来就是它跟udev有冲突导致/dev下的设备文件没有正确建立。
阅读(1308) | 评论(0) | 转发(0) |