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日