LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1078|回复: 0

LFS 6.7,第5.9. Binutils-2.20.1 - Pass 2 失败,内核版本太旧,血的教训

[复制链接]
发表于 2010-11-18 18:28:08 | 显示全部楼层 |阅读模式
在论坛搜索了一下,没有我下面提到的那个内核太旧错误的帖子,希望没有重复发贴,有的话麻烦管理员处理一下,先谢谢了,呵呵。;)
本人菜鸟亲身惨痛经历:Crying::Crying:,以自己为教训说点刚开始LFS要注意的好小的细节问题,如内核版本选择等!深刻教训!

首先声明,小弟是真正绝对的菜鸟,现在用的是VMware workstation 7.1.2 build-301548虚拟机开NAT网络来做的LFS,并且每一次成功的步骤都做了快照,这也是值

得庆幸的事,这样我下面的错误也可以反复回顾,方便查错。

小弟我是新手,才第二次尝试LFS,我第一次时也是到了这里就失败了,怎么弄都不懂是什么错误。细述如下:
我在LFS 6.7 English Version 5.9. Binutils-2.20.1 - Pass 2 Page 44中运行Binutils-2.20.1 - Pass 2 Prepare Binutils for compilation时

,输入了以下内容:
  1. CC="$LFS_TGT-gcc -B/tools/lib/" \
  2. AR=$LFS_TGT-ar RANLIB=$LFS_TGT-ranlib \
  3. ../binutils-2.20.1/configure --prefix=/tools \
  4. --disable-nls --with-lib-path=/tools/lib
复制代码

出现了以下错误:


……
checking for a sed that does not truncate output... /bin/sed
checking for gawk... gawk
checking for gcc... i686-lfs-linux-gnu-gcc -B/tools/lib/
checking for C compiler default output file name... a.out
checking whether the C compiler works... configure: error: in `/mnt/lfs/sources/binutils-build':
configure: error: cannot run C compiled programs.
If you meant to cross compile, use `--host'.
See `config.log' for more details.


注意最后面那4行,说找不到C的compiler,设置错误,不能运行compiled程式,让我查看config.log来找错误,以下是我的config.log中间的小部分

非常重要内容:

## ----------- ##
## confdefs.h. ##
## ----------- ##

/* confdefs.h */
#define PACKAGE_NAME ""
#define PACKAGE_TARNAME ""
……
configure: exit 1
lfs: /mnt/lfs/sources/binutils-build$ less config.log
FATAL: kernel too old
configure:4152: $? = 1
configure:4159: error: in `/mnt/lfs/sources/binutils-build':
configure:4163: error: cannot run C compiled programs.
If you meant to cross compile, use `--host'.
See `config.log' for more details.

以上看了半天(本人英文不是很好),最初以为错误信息中If you meant to cross compile, use `--host'这一句是关键问题,但是看了半天才发

现最关键就是日志里那个FATAL(重大,严重地)错误!就是“FATAL: kernel too old”这一句!

居然是内核太旧!!!汗牛满面了……

赶紧用unname -r 看了一下
  1. lfs: /mnt/lfs/sources/binutils-build$ uname -r
  2. 2.6.18-194.el5
复制代码

天啊,我用的虽然是CentOS的最新版本5.5,由于大意居然没注意内核是2.6.18的,其实也是我这种菜鸟常常犯的错误!

其实,早在前面LFS6.7的最前面的page 第 XVI页,就是PDF的那第16页那里的System Requirements那里,就已经提到,要用“Linux Kernel-

2.6.22.5 (having been compiled with GCC-4.1.2 or greater)”了
!但是由于是新手,就和许多弟兄们装软件其实是一样的错误,就是常常知道有

System Requirement这个东东,却从来不认真看,我今天终于认识到这个错误了。

另外,开始时我其实也看到,只是没引起重视,要命的是LFS的第XVii页,就是PDF的第17页,有提供一个测试shell脚本,内容大概如下:
To see whether your host system has all the appropriate versions, and the ability to compile programs, run the
following:
  1. cat > version-check.sh << "EOF"
  2. #!/bin/bash
  3. export LC_ALL=C
  4. # Simple script to list version numbers of critical development tools
  5. bash --version | head -n1 | cut -d" " -f2-4
  6. echo "/bin/sh -> `readlink -f /bin/sh`"
  7. echo -n "Binutils: "; ld --version | head -n1 | cut -d" " -f3-
  8. bison --version | head -n1
  9. if [ -e /usr/bin/yacc ];
  10. then echo "/usr/bin/yacc -> `readlink -f /usr/bin/yacc`";
  11. else echo "yacc not found"; fi
  12. ……中间省略N行
  13. patch --version | head -n1
  14. echo Perl `perl -V:version`
  15. sed --version | head -n1
  16. tar --version | head -n1
  17. echo "Texinfo: `makeinfo --version | head -n1`"
  18. echo 'main(){}' > dummy.c && gcc -o dummy dummy.c
  19. if [ -x dummy ]; then echo "Compilation OK";
  20. else echo "Compilation failed"; fi
  21. rm -f dummy.c dummy
  22. EOF
  23. bash version-check.sh
复制代码

我最初以为这个脚运行通过后就OK了,实际上确实是通过了,但注意,这个脚本并没有测试Kernel的版本是否符合LFS的要求!

所以,一个小失误,最后两次失败在同一个地方,数小时的辛苦,死在同一地方,血的教训啊!所以,在此之前,所有安装和测试一切正常,无任何

错误,可是,第二轮的Pass 2一开始,就完了……

这个问题的解决方法,按LFS上面的解释,就是
If the host kernel is either earlier than 2.6.22.5, or it was not compiled using a GCC-4.1.2 (or later) compiler,
you will need to replace the kernel with one adhering to the specifications. There are two ways you can go about
this. First, see if your Linux vendor provides a 2.6.22.5 or later kernel package. If so, you may wish to install it.
If your vendor doesn't offer an acceptable kernel package, or you would prefer not to install it, you can compile
a kernel yourself. Instructions for compiling the kernel and configuring the boot loader (assuming the host uses
GRUB) are located in Chapter 8.

意思是让我们去官方看看有没有新的内核可用,没有的话就自己去编译一个新的内核……

于是用yum上网update一下,换成root运行如下:
  1. root: /mnt/lfs/sources/binutils-build# yum update kernel
复制代码
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* addons: mirror01.idc.hinet.net
……
--> Running transaction check
---> Package kernel.i686 0:2.6.18-194.26.1.el5 set to be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
Package        Arch         Version                      Repository       Size
================================================================================
Installing:
kernel         i686         2.6.18-194.26.1.el5          updates          17 M

Transaction Summary
================================================================================
Install       1 Package(s)
Upgrade       0 Package(s)

Total download size: 17 M
Is this ok [y/N]:
看到上面提示还是2.6.18的,说明不用想了,服务器版的CentOS是Redhat的克隆版,怎么可能自己给个很新的内核你用的……

自己编译的话,由于本人太菜,还不会编译内核,就不说了。可以查看论坛里的各位大大们的各种文章。

具体这个问题解决方法要不就是换内核,要不就是选择正确的发行版和正确的LFS版,不要像我一样贪6.7最新版……

以上问题本人也问了google和baidu好几个小时,仅有一个外国的网站上有一个相似的小贴子,好像还给出了换内核的方法,网址一时找不到了……

@_@

教训总结:

1.安装软件(不管是系统管理员还是一般用户),请注意系统需求System Requirement。

2.读书要认真,如上面,有脚本给你测试也要看清这个东东实现了什么功能。

3.不要盲目追求新版本,尤其是生产环境绝对不允许……

4.出问题要善于查看相关日志。

5.要培养严谨的学术态度,做人和做事和玩电脑都一样。

6.从错误中认真总结和学习。

另外,新手报到,请大家以后多多批评指正,小弟谢过大家!另由于不太会排版,写得有点错位,大家将就一下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表