[原创]如何提高LFS的成功率以及部分问题的解决方法
时间:2006-04-17
来源:互联网
2006-04-16:本文发布
前言
本文按照LFS-6.1手册为参考,但也适合以6.x为基础的相关LFS手册版本,文中只是列举了几个我在LFS过程中发现的容易出现问题的地方和一些解决方法,不可能包括方方面面,只能算问题中的冰山一角,所以不要指望本文能解决所有遇到的问题,但本文提到的问题也是出现频率非常高的,对LFS新手还是有借鉴的作用的。
我是比较主张手工输入命令的,但如果你觉得复制命令更好,你也可以复制,这样可以有效的减少输入的错误,但我觉得手工输入则另有一番感觉。
关于本文的更新:
由于文中难免出现一些错误或者笔误,也有可能加入新内容,因此难免会进行修正或增删一些内容,如果你发现文章的最后修改时间已经过了比较长的时间,那么有可能本文已经被更新,如果本文被转载可以在www.linuxsir.org的LFS版中或者在本人的Blog中查看最新版本。
linuxsir:http://www.linuxsir.org/bbs/showthread.php?t=252928
我的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
如果你没出现这个问题就不要用这个命令了。
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:[email protected]
2006年4月16日
更新日志:
2006年4月22日:
修正排版格式错误一处
由linuxsir上的终极幻想报告。
作者: youbest 发布时间: 2006-04-17
总结的真详细。 。
7、安装tcl的时候也经常会有人出错,通常都出在./configure上,但似乎在LFS的LiveCD上不会出问题,在一些发行版做主系统来做LFS的时候容易出现,比如Debian,分析可能是主系统中的命令造成的。 |
作者: 晨想 发布时间: 2006-04-17
作者: 终极幻想
晕死,正好把我回复的那个给删除了。嘿嘿。。。。
|
你的回复我没看着。
作者: 终极幻想
这个是 echo 的时候的引号输出错误,少了一个,所以不配对。
|
作者: youbest 发布时间: 2006-04-17
这个问题,我记得是debian的系统才有这个问题,具体原因我没去研究,有解决方法就可以了。
作者: 晨想 发布时间: 2006-04-17
作者: wangyb 发布时间: 2006-04-17
作者: andijo 发布时间: 2006-04-17
如果非要用 kernel.org 的, 要确定系统中有 flex 和 bison . 也就是 pass1 , 主系统中要有 flex 和 bison , pass2, 先在 /tools 里装上 flex 和bison.
作者: dyhml 发布时间: 2006-04-22
这段命令中SPECFILE=`gcc --print-file specs`使用的是“`”,也就是键盘上“1”左边的那个键,千万别打错了!而sed 's@ /lib/ld-linux.so.2@ /tools/lib/ld-linux.so.2@g' $SPECFILE > tempspecfile则[highlight]是“'”,这个是单引号[/highlight]。 |
作者: 晨想 发布时间: 2006-04-22
作者: youbest 发布时间: 2006-04-22
作者: webyuhang 发布时间: 2006-04-23
作者: 6hzzz 发布时间: 2006-05-06
1.
"`"号使用的是shell命令替换,也就是说shell会执行`号包含的命令,然后把输出替换到`所在的位置,所以SPECFILE=`gcc --print-file specs`的执行结果是设置变量SPECFILE得指为specs文件的绝对路径。
2.
's@ /lib/ld-linux.so.2@ /tools/lib/ld-linux.so.2@g'做的是全局替换,之所以使用@是为了作为分隔符,因为替换的内容中有/,使用转义符号太麻烦了。所以这里的空格都去掉也是可以的,可能会出现问题的情况是第一个有空格而第二个没有,这样的话,替换的结果可能会导致替换的内容和前面的内容连成一起(因为原有的空格被替换掉了),这样就会出错。
3。关于sed -i "s/relid'/relid/" configure
这里之所以liveCD不需要替换,而某些host系统需要是因为bash的版本。
liveCD(目前)的bash版本是3.00
而bash3.1就会报错,因为configure脚本中的相应语句中多了一个'
作者: dindin 发布时间: 2006-07-21
作者: xqingliu 发布时间: 2007-02-08
作者: xqingliu 发布时间: 2007-02-08
作者: xqingliu 发布时间: 2007-02-08
我用自创的方法代替了,不知道会不会出错
就是$(dirname $(gcc ........))/specs
作者: mech 发布时间: 2007-02-08
作者: jasonhonda 发布时间: 2007-05-01
作者: sprhawk 发布时间: 2008-01-16
作者: i18n 发布时间: 2008-06-28
“`”和“'”。
今天卡了好久,翻了几个小时的帖子,才知道是自己输错了。。
顶起,希望新手朋友们注意~
作者: byh1900 发布时间: 2009-02-02
作者: ayk1985 发布时间: 2009-06-24
作者: btiger2000 发布时间: 2009-07-20
作者: actioin 发布时间: 2009-11-24
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28