Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1108517
  • 博文数量: 32
  • 博客积分: 8054
  • 博客等级: 中将
  • 技术积分: 892
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-19 14:47
个人简介

感谢大家!

文章分类

全部博文(32)

文章存档

2011年(2)

2010年(1)

2009年(3)

2008年(7)

2007年(8)

2006年(11)

分类: LINUX

2006-04-16 21:58:42

[原创]如何提高LFS的成功率以及部分问题的解决方法


2006-04-22:修正排版格式错误一处
2006-04-16:本文发布

前言
  本文按照LFS-6.1手册为参考,但也适合以6.x为基础的相关LFS手册版本,文中只是列举了几个我在LFS过程中发现的容易出现问题的地方和一些解决方法,不可能包括方方面面,只能算问题中的冰山一角,所以不要指望本文能解决所有遇到的问题,但本文提到的问题也是出现频率非常高的,对LFS新手还是有借鉴的作用的。

我是比较主张手工输入命令的,但如果你觉得复制命令更好,你也可以复制,这样可以有效的减少输入的错误,但我觉得手工输入则另有一番感觉。

关于本文的更新:
  由于文中难免出现一些错误或者笔误,也有可能加入新内容,因此难免会进行修正或增删一些内容,如果你发现文章的最后修改时间已经过了比较长的时间,那么有可能本文已经被更新,如果本文被转载可以在的LFS版中或者在本人的Blog中查看最新版本。
  linuxsir:
  我的Blog:http://youbest.cublog.cn
  如须转载请保持文章的完整性、并注明作者为冲天飞豹(youbest)及转载出处。

1、在开始第五章第一遍binutils的时候也就是(5.3. Binutils-2.15.94.0.2.2 - Pass 1)之前必须要确信的事情
  (1)建立起了lfs用户
  (2)设置好了lfs的.bashrc和.bash_profile文件
  检查方法:
    (1)运行whoami命令,要保证输出的是lfs
    (2)运行export命令,要保证输出为:
     declare -x HOME="/home/lfs"
     declare -x LC_ALL="POSIX"
     declare -x LFS="/mnt/lfs"
     declare -x OLDPWD
     declare -x PATH="/tools/bin:/bin:/usr/bin"
     declare -x PS1="\\u:\\w\\\$ "
     declare -x PWD="/home/lfs"
     declare -x SHLVL="1"
     declare -x TERM="linux"
  其中比较特别要检查的是环境变量PATH的设置
  必须是:PATH="/tools/bin:/bin:/usr/bin"
  如果上面两个条件都成立了,那么你可以开始binutils的第一遍编译了。

2、如果你第一遍binutils都无法编译,那么基本上可以确定是你主系统的问题,这里有两个选择:可以使用LFS的LiveCD来做主系统,这样可以尽量避免因主系统造成的问题;也可以换用binutils-2.16.1这个版本来做,这个版本的编译成功率非常高。

3、到了第一遍编译GCC(5.4. GCC-3.4.3 - Pass 1)的时候会第一次出现命令行中带有“\”的命令,这个符号代表命令换行,也就是命令还没有结束,告诉shell下一行输入的字符串和这行的字符串合并成一条命令。如:
../gcc-3.4.3/configure --prefix=/tools \
--libexecdir=/tools/lib --with-local-prefix=/tools \
--disable-nls --enable-shared --enable-languages=c
将被shell翻译成
../gcc-3.4.3/configure --prefix=/tools --libexecdir=/tools/lib --with-local-prefix=/tools --disable-nls --enable-shared --enable-languages=c

这里要注意的是空格问题,比如:
ls\
*
将被翻译为ls*,这样的指令自然是无效的
ls \
*
和ls\
*
都将被翻译成ls *,这样才能够正常运行命令。

4、命令的大小写(这个问题其实不能算问题,因为如果稍微了解Linux都知道Linux下命令是对大小写敏感的),不注意大小写问题可能导致命令的错误而最终演化为失败。

5、如何打补丁,补丁通常是在原代码的目录下进行的,比如glibc-2.3.4-fix_test-1.patch这个补丁的打法是首先应该要进入到glibc-2.3.4这个目录下,而不是进入glibc-build也不是在sources目录下,补丁打成功应该是自动回到bash的提示符上的,而不会出现一个让你输入文件名的提示,如果出现了通常是打补丁的位置错误造成的,检查一下你所在的目录。

6、到了第五章调整工具链(5.7. Adjusting the Toolchain)的地方可以算整个LFS制作过程中最容易出错的地方,也是最容易导致LFS失败的地方,也是初次接触LFS的朋友们最不易察觉的地方,因为即使调整错误也一样能让整个第五章完成,但到了第六章就无法继续了。
  比较明显的错误表现就是到了第六章的chroot部分(6.3. Entering the Chroot Environment),在输入完chroot命令后提示:/tools/bin/env: No such file or directory这样的信息,而如果到/tools/bin/下找env命令,却明明白白的在那里,这通常都是由第五章调整工具链的地方没有正确完成的结果。
检查,输入命令:ldd /tools/bin/env,正确的输出应该是
  linux-gate.so.1 => (0x......)
  libc.so.6 => /tools/lib/libc.so.6 (0x......)
  /tools/lib/ld-linux.so.2 (0x.....)
  这里的(0x.....)可能会不一样,但应该是有一个十六进制的地址,绝不应该有not found。
  如果真的在这个地方出了错误通常都比较棘手,我的建议就是不要浪费时间,直接重头开始LFS。
  如果你不想重头开始最好的方法就是在源头上解决这个问题,也就是在做第五章调节工具链的时候就要确定工具链调整正确,如果发现结果不正确绝对不要继续,否则浪费的是时间。

  需要主要的地方
  SPECFILE=`gcc --print-file specs` &&
  sed 's@ /lib/ld-linux.so.2@ /tools/lib/ld-linux.so.2@g' \
   $SPECFILE > tempspecfile &&
  mv -f tempspecfile $SPECFILE &&
  unset SPECFILE
  这段命令中SPECFILE=`gcc --print-file specs`使用的是“`”,也就是键盘上“1”左边的那个键,千万别打错了!而sed 's@ /lib/ld-linux.so.2@ /tools/lib/ld-linux.so.2@g' $SPECFILE > tempspecfile则是“'”,是单引号
“`”和“'”两者的意思完全不同,千万要注意这里,错误往往发生在这里。
  还有需要注意的是's@ /lib/ld-linux.so.2@ /tools/lib/ld-linux.so.2@g'里面的空格千万不要多了,也不要少了,否则都有可能导致结果的错误。这里面有两处空格,每处一个空格。
  检查,这步非常关键,特别是对LFS的新手
  echo 'main(){}' > dummy.c
  cc dummy.c
  readelf -l a.out | grep ': /tools'
  要保证输出一定有[Requesting program interpreter: /tools/lib/ld-linux.so.2],否则绝对不要继续
  如果没有这个输出,则用
  readelf -l a.out | grep 'ld-linux'来代替readelf -l a.out | grep ': /tools',应该会有输出,如果输出为[Requesting program interpreter: /lib/ld-linux.so.2],则一定是前面的
  SPECFILE=`gcc --print-file specs` &&
  sed 's@ /lib/ld-linux.so.2@ /tools/lib/ld-linux.so.2@g' \
    $SPECFILE > tempspecfile
出了错误,仔细检查是否有命令输入错误,通常都是由输入错误造成的。

如果测试的结果正确,那么恭喜你过了一个重要的一关,可以继续了。


7、安装tcl的时候也经常会有人出错,通常都出在./configure上,但似乎在LFS的LiveCD上不会出问题,在一些发行版做主系统来做LFS的时候容易出现,比如Debian,分析可能是主系统中的命令造成的。
  如果你遇到了可以在./configure之前用命令
  
sed -i "s/relid'/relid/" configure
  来修正后再./configure
  如果你没出现这个问题就不要用这个命令了


8、到了第五章perl(5.32. Perl-5.8.6)之前的包基本上没有太大问题,只要注意命令大小写,只打需要的补丁,基本上都不会有什么问题,只是这个perl倒是经常有人安装出问题,因为是第五章最后安装的,所以出了问题通常要到第六章才能显示出来。
  如果你遇到了第六章在glibc的make过程中出现/bin/sh: no: command not found,那应该是这个问题了。
  如果想解决,可以尝试重新安装Perl的方法,具体步骤如下:
  (1)退出第六章的chroot环境:exit
  (2)进入到lfs用户环境:su - lfs
  (3)删除perl相关文件和目录:rm -rf /tools/bin/{perl,pod2man} /tools/lib/perl5/5.8.6
  (4)按照LFS手册第五章perl的步骤重新安装perl。

9、关于stripping,strip这个命令还有具有一定的“危险”性的,按照手册上的命令通常不会出问题,如果你不清楚strip参数的意思,那么请不要随意修改或去掉这些参数,否则可能有导致整个工具链“全毁”的结果。对于LFS新手而言,可以跳过第五章的strip,因为最后/tools目录是要被删除的,所以不会有什么影响,但如果磁盘空间紧张,或者想要备份工具链,那还是strip一下可以释放出很多占用的空间。


10、进入第六章,要记得在6.2. Mounting Virtual Kernel File Systems之前就要退出lfs用户,进入root用户再继续。
  从6.2. Mounting Virtual Kernel File Systems到6.9. Linux-Libc-Headers-2.6.11.2之间的几节内容也是非常重要的,通常执行过程中不会有什么错误提示,只有在6.8中的mount部分会有can't open /etc/fstab: No such file or directory.提示,手册中也提到了,没有关系,但其它命令如果出现错误,或者mount的时候出现其它错误提示,则不要继续,请确定问题所在再继续,但如果你是这几节中退出计算机后又重新恢复到工作状态的话,则有可能某些目录已经建立而导致命令有错误提示,总之这里出现错误一定要搞清楚问题所在。

11、整个第六章的编译安装是建立在第五章的工具链之上的,所以第五章工具链的问题将直接导致第六章的失败,所以在第六章出现问题可以从第五章上找找原因,当然也可能是刚刚编译的第六章的包造成的,通常来讲,如果第六章的glibc如果编译安装没有问题的话,那么工具链通常都是正确的。

12、第六章的调整工具链(6.12. Re-adjusting the Toolchain)也是最容易出问题的章节之一,问题基本和第五章上的一样,主要是输入方面的问题:
perl -pi -e 's@ /tools/lib/ld-linux.so.2@ /lib/ld-linux.so.2@g;' \ 这行里面是单引号
-e 's@\*startfile_prefix_spec:\n@$_/usr/lib/ @g;' \ 这行里面是单引号
`gcc --print-file specs` 这行里面是“`”
记得调整完以后一定要记得测试:
echo 'main(){}' > dummy.c
cc dummy.c
readelf -l a.out | grep ': /lib'
测试的结果一定要是
[Requesting program interpreter: /lib/ld-linux.so.2]
才行。

  如果你过了这一关,则下面的编译可以放心的继续了,后面的章节都比较容易,只要注意命令不要敲错了就行。

13、到了第六章Shadow这节也要注意一下,这里有三个sed命令,这一节也经常有人出问题,出问题的结果就是导致最终的LFS启动后无法登录。要注意sed命令中的的空格、单引号和“`”、以及大小写。
sed -e's@#MD5_CRYPT_ENAB.no@MD5_CRYPT_ENAB yes@'这行中no前面是一个点,而yes前面是一个空格。
  不要在安装完shadow后忘记执行
  pwconv
  grpconv
  passwd root
  否则root用任何密码都进不去系统哦。
如果已经开始启动新系统发现这个问题,那么只有重新用原系统启动,然后根据《制作LFS过程中各个阶段恢复工作状态的方法》一文中介绍的方法恢复到第六章的状态,然后再设置root密码。

14、第六章sysvinit(6.56. Sysvinit-2.86),也是在启动系统的时候比较重要的,这里比较重要的就是/etc/inittab,先严格按照LFS手册里面的写吧。

15、第六章的Udev(6.58. Udev-056)是个比较“特殊”的包,特殊在如果你不了解这个包最好只用手册上的使用的版本,因为用新的版本可能有不兼容的情况。
如果不小心使用了不兼容的版本,那么用原系统启动,然后根据《制作LFS过程中各个阶段恢复工作状态的方法》一文中介绍的方法恢复到第六章的状态(安装udev之前的状态),然后重新编译安装Udev。

16、第七章的配置Linux Console部分(7.6. Configuring the Linux Console),建议直接跳过去,默认配置通常没有问题。这里如果配置不对的话,反而可能造成在用Linux中键盘失常。
如果已经开始启动新系统发现这个问题,可以用原系统启动,然后根据《制作LFS过程中各个阶段恢复工作状态的方法》一文中介绍的方法恢复到第六章的状态,然后删除/etc/sysconfig/console文件即可。

17、第八章编译内核(8.3. Linux-2.6.11.12)
手册中有命令
loadkeys -m /usr/share/kbd/keymaps/[path to keymap] > \
drivers/char/defkeymap.c
这个是为了配合第七章的配置Linux Console部分(7.6. Configuring the Linux Console)而需要的,既然Linux Console部分前面已经跳过去了,这里也跳过去,不需要这个命令。
如果已经开始启动新系统发现这个问题,那么只有重新用原系统启动,然后根据《制作LFS过程中各个阶段恢复工作状态的方法》一文中介绍的方法恢复到第六章的状态,然后重新编译内核。
编译内核也是很有讲究的,这个有许多文章介绍,这里就不多说了,这里主要提醒一下,如果不想使用initrd的话一定要把目标系统使用的磁盘的驱动编译到内核里,而不要编译成模块,IDE的比较容易,默认就可以,但SCSI和LSI的就需要配置一下了;目标系统/目录的文件系统也要编译到内核里,不要做成模块,目标系统的/boot不要放在LVM上,否则grub无法识别出来。

18、第八章使系统可启动部分(8.4. Making the LFS System Bootable)
这里有人经常出现在grub中无法找到硬盘的情况,这里首先要排除使用了LVM,然后检查是否加载了proc文件系统,以及是否运行了/sbin/udevstart,要保证/dev中有需要的设备文件,这样grub才能正确识别。
grub中对磁盘的表示方法和/dev中的不太相同,/dev/hda2在grub中表示为(hd0,1)而/dev/hdb1表示为(hd1,0),SCSI的表示方法也不一样/dev/sda2也表示为(hd0,1)。


(转载请保持文章的完整性,请注明作者和出处)

  本文的目的是希望更多的人能够顺利的踏入LFS的神秘世界,如果你有什么好的想法和建议也希望能写出来,大家一起分享。


                               作者:冲天飞豹(youbest)
                               Email:youbest@sina.com
                               2006年4月16日
 
更新日志:
2006年4月22日:
修正排版格式错误一处
由linuxsir上的终极幻想报告。
阅读(7614) | 评论(16) | 转发(1) |
给主人留下些什么吧!~~

chinaunix网友2008-02-05 17:59:20

不好意思,还没注册,问老兄一个问题哈,我的export命令输出有一个变量是 LS_ALL 值为空,而且看不到LC_ALL.不过如果我echo $LC_ALL能够得到POSIX的正确输出 .bashrc里按lfs手册6.3的要求做了,反复检查过。在lfs用户下第一次编译binutils2.17的时候make会出现这个错误:execvp:touch:too many levels for symbolic links 我找到了发生错误的地方,在脚本里把那一句touch注释掉了,再make的时候就多执行了两句,又是那个错误,不过touch变了。本来以为是/tools的问题,后来把--prefix选项去掉还是一样的错,即使把所有多余的选项都去掉并且在原目录里./configure然后make也还是一样的错误。不过奇怪的是,在root下编译就没有这个问题,这是为什么呢?会不会和环境变量有关? 在这里先谢谢了!