LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: kenving

怎麼我裝lfs的bash時,老是重复阿???

[复制链接]
 楼主| 发表于 2003-6-2 21:59:11 | 显示全部楼层
乱码。。。。。
后面的意思是有问题!!
发表于 2003-6-3 00:13:14 | 显示全部楼层
那个网站有时候上不了,我也不知道怎么回事,呵呵,那你先到lfs的主站上看看faq?
发表于 2003-6-3 00:14:28 | 显示全部楼层
LFS FAQ
Seth W. Klein


<sk@sethwklein.net>

1. 介绍

    1.1. 为什么会有这个 FAQ?
    1.2. 什么是LFS?
    1.3. 致谢

2. How-To

    2.1. 网络礼仪应该怎样?
    2.2. 我该把什么问题寄到哪个邮件列表?
    2.3. 哪里是寻求帮助最好的地方?
    2.4. 为本 FAQ 做贡献.

3. 常被提交的 Bug

    3.1. 书里的"ln -s"命令错了。
    3.2. /bin/foo 是 /bin/bar 的一个拷贝。
    3.3. 我能使用比书中版本更高的软件包么?
    3.4. 有新版本的软件包Foo了.
    3.5. Delete 键不起作用.
    3.6. fsck出错后系统就关闭了!

4. 经常要求的改进

    4.1. 为什么不用 GRUB 来代替 LILO 呢?
    4.2. 为什么不把 LILO 升级到最新的版本?
    4.3. 为什么不把这个 FAQ 包含在书里?
    4.4. 为什么在书中使用vim?
    4.5. 为什么在书中会有ed?
    4.6. 为什么在书里没有软件包管理器?

5. 资源

    5.1. 有没有关于在 Alpha 平台上使用 LFS 的指导?
    5.2. 哪里有 lfs 软件包或 wget 下载脚本?
    5.3. 我到哪去找软件包Foo?
    5.4. 我应该如何编译内核或设置内核模块?
    5.5. 我应该从什么发行版开始安装LFS?
    5.6. which在哪里?
    5.7. portmap在哪里?
    5.8. 在Mandrake中哪里有libncurses.a?
    5.9. 我怎样才能制作一张可以启动的CD?
    5.10. 我怎样才能做一个书中提到的那么小的系统?
    5.11. 应该如何跨平台编译LFS?
    5.12. 我编译某些很老的软件包时出错了。
    5.13. 从哪里能找到 LFS 的 Logo?
    5.14. 你们玩LFS的人还玩Quake?!?

6. 经常寻求的方法

    6.1. 什么是 DOS 格式的文本文件?
    6.2. 如何编译一个软件包?
    6.3. 我在安装好了系统以后还要留着源码么?
    6.4. /dev/eth0在哪里?
    6.5. 我怎样才能使电脑在关机的时候真正的关闭电源?
    6.6. 如何创建一个普通用户?
    6.7. 为什么拷贝内核头文件而不是链接它们?
    6.8. GCC 产生的编译警告很糟糕么?

7. 经常遇到的错误

    7.1. 任何时候遇到的错误

        7.1.1. No such file or directory(没有这样的文件和目录)

    7.2. 编译错误

        7.2.1. 任何软件包的编译错误

            7.2.1.1. undefined reference to `deflate'
            7.2.1.2. bash: ./configure: No such file or directory
            7.2.1.3. ./configure: bad interpreter: Permission denied
            7.2.1.4. configure can't guess my host type.(configure脚本查不出我的主机类型)
            7.2.1.5. checking whether we are using GNU C... no
            7.2.1.6. 为什么 configure 会在"checking for signed size_t type..."时死掉呢??
            7.2.1.7. 我的出错信息是`/dev/null: Permission denied'
            7.2.1.8. signal 11 (internal error: Segmentation fault)
            7.2.1.9. 我在编译一个依赖于GTK+的软件包时出错了,但我已经安装了 GTK+ 2.x.
            7.2.1.10. X11/Xlib.h: No such file or directory
            7.2.1.11. 在编译 GNOME 的某一部份时出错

        7.2.2. 特定软件包的编译错误

            7.2.2.1. conflicting types for `gethostname'
            7.2.2.2. 在编译 modutils 时出现"lex.l:429: `yytext_ptr' undeclared"的错误。
            7.2.2.3. undefined reference to `deflate'(未定义的引用`deflate')
            7.2.2.4. Glibc 出错,信息是". . . . it is normal to compile GNU libc with the `linuxthreads' add-on. . . ."
            7.2.2.5. Perl 出错,信息是: "*** missing separator. Stop."
            7.2.2.6. Error: Unknown pseudo-op: `.hidden'
            7.2.2.7. 优化过的glibc在spinlock.c出错了
            7.2.2.8. Glibc 出错,信息是"cannot determine asm global directive".
            7.2.2.9. Glibc 出错了,并提到了 BEGIN 和 END.
            7.2.2.10. Glibc 出错,信息是: "ld.map: No such file or directory".
            7.2.2.11. 我的静态sh-utils出错了,信息是"undefined reference to `getloadavg'".

        7.2.3. 上面未列出的编译错误

            7.2.3.1. 我使用来自GNU的patch来升级,可以么?
            7.2.3.2. 什么时候使用优化参数(设置CFLAGS)
            7.2.3.3. 我在使用与书中不同的软件包版本,可以么?
            7.2.3.4. 我在上一次安装后没有删除源码,还要删么?

    7.3. 运行错误

        7.3.1. 我的net-pf-? 出错了
        7.3.2. modprobe: Can't locate module char-major-10-135
        7.3.3. modprobe: Can't locate module /dev/rtc
        7.3.4. Kernel panic: VFS: unable to mount root fs
        7.3.5. init: Id "1" respawning too fast: disabled for 5 minutes
        7.3.6. LILO的那些错误消息是什么意思?
        7.3.7. 我的hostname设置成"-f"了!
        7.3.8. 为什么less(以及man)程序会打印出 <AD> 而不是连字符?

1. 介绍

1.1. 为什么会有这个 FAQ?
1.2. 什么是LFS?
1.3. 致谢

1.1.        

为什么会有这个 FAQ?
       

这个 FAQ 试图在问题提出以前就回答它们。这就省得提问了,有时还能避免遇到问题。

这个 FAQ 的确能降低邮件列表的流量,提高信噪比,不过这只是一个副作用。

因为 FAQ 不是找信息的合适位置,所以只有在问题不适合添加到其他文档里时,才会加到 FAQ 中,尽管有时也需要加入一些指向合适文档的链接。
1.2.        

什么是LFS?
       

LFS 表示Linux From Scratch,这是一个以文档来指导使用者如何自己下载、编译和安装软件包,最后装好一个Linux系统。

对于这样做的原因,方法和其他有用的东西,看看LFS的网站: http://www.linuxfromscratch.org/.
1.3.        

致谢
       

没错,这个问题不是 FAQ,但我总要找个地方放才行;-)

本FAQ不是献给美丽的女士,而是我的叔叔John, 他第一个建议我(以最婉转的方式)得到"一个真正的操作系统"。

下面要感谢...

    *

      所有邮件列表上的兄弟(以及为数不多的女士,但愿你们更多一些),你们解答了这么多问题。
    *

      尤其是那些整理了某个问题,现象及答案,然后寄给我的人.你们的名字将在提交日志上存留,持续无穷的时间,嘿,我尽量 :-)
    *

      Tushar Teredesai 和 Jeroen Coumans 你们总是最不知疲倦地向 lfs-support列表里提交FAQ的链接。 rt.
    *

      BLFS 的编辑,你把BLFS过程描述得非常清晰,可以少做不少FAQ。

2. How-To

2.1. 网络礼仪应该怎样?
2.2. 我该把什么问题寄到哪个邮件列表?
2.3. 哪里是寻求帮助最好的地方?
2.4. 为本 FAQ 做贡献.

2.1.        

网络礼仪应该怎样?
       

这里是一些网络礼仪的实用指南,只包括那些不可或缺的内容。如果在我们项目的邮件列表上待过一段时间的人,就会发现前面几个是很明显的。在后面的几个不那么明显,不过也需要注意。

为了简明扼要,下面这些礼仪的原因就不说了。但尽管放心,它们都不是某个人的偏好,而是有原因的。

虽然下面文字里只说了“邮件列表”,但也包括镜像邮件列表的新闻组。

开始吧,下面是几个礼貌方面的,随后是更“技术性”的:

请记住,如果提出的问题是在很常见的文档(比如LFS和BLFS安装指导,本FAQ,LFS Hints,合适的man手册页,列表存档和 Google 搜索)里已经解答了的,你就会显得很粗鲁。只要你能证明自己的确尝试找答案了,并且不觉得仅用一个到某文档的链接来回答你的问题是一种冒犯,任何有理智的人都不会拒绝你的问题的。

大多数令人讨厌的论战都是从某个新手提出的不合适问题开始的,然后是批评(即使是善意的),最后变成公开的对抗。请尽量避免这种情况。 "不说话" 而是给出一个指向合适文档的链接就足够了。如果你觉得必须批评,请私下写信,不要发到邮件列表上。这一点也适用与其他可能变得激烈的问题。

邮件列表是国际性的,所以任何俚语和谚语都可能会被误解。(比如最近对"bootstrapping"的讨论就是例子.) 任何渎神,政治,战争或宗教(即使是在签名里)的言论都可能使世界上某地某人不爽,所以请避免。最后,用英语发信是比较礼貌的,因为列表上的多数人都懂它。

现在说说更“技术性”的问题.

不要用 HTML 来发信. 如果你在用Yahoo, Hotmail, 或 Outlook,并且没有把 HTML选项关掉,那就是用HTML格式来发信。如果你使用其他的邮件客户端,请在寄出前检查一下。如果你不知道怎样把 HTML 关掉,看看http://www.expita.com/nomime.html.

以 72 字符来折行。 如果你不想手动做,可以设置邮件客户端程序在发信时自动折行。

在引文下面回复 Outlook 把事情变得很麻烦。有一个修正Outlook的插件,在 http://home.in.tum.de/~jain/software/outlook-quotefix/, 修正Outlook Express的在 http://home.in.tum.de/~jain/software/oe-quotefix/.

限制签名在四行内.

裁减引文,尤其是引文中的签名. 但不要裁减得不看原文就看不懂你的回复.

不要点回复按钮,除非你真的要回复它. 用new, compose, 或你的邮件客户端使用的其他按钮,来问一个新问题和开始一个新线索。. Reply(回复)会设置主题以外的其他行,所以如果你不是在回复它,邮件的位置就不对了。

下面的不太重要,但了解一下也是有用的。在LFS邮件列表上,人们通常清除 CC 域的内容,而只是把回复发到邮件列表。这可能不太好,但已经存在了,而且由于政治原因,也不太可能改变。
2.2.        

我该把什么问题寄到哪个邮件列表?
       

完整答案在http://www.linuxfromscratch.org/mailinglists/, 下面是摘要:

    *

      把技术支持的问题寄到lfs-support 和 blfs-support. 比如"我怎样..." 和 "我遇到这个错误..." 以及其他寻求帮助的问题都应该只寄到这两个列表,不要寄到其他地方。
    *

      如果你对LFS书本身没有任何意见, 不要 寄到 lfs-support.
    *

      除非你要对 LFS BOOK 本身 提出改进建议,否则不要寄到lfs-dev.
    *

      只有与BLFS Book相关的建议才应该到blfs-dev里.
    *

      blfs-support就不同了,对前面的列表不适用的主题都可以寄到它上面,除了啤酒的价格和GNU与BSD的论战。
    *

      啤酒的价格,GNU与BSD的论战以及Microsoft与Linux的比较都局限于lfs-chat. 目前,硬件的讨论也应该在这里。

特别注意的是,如果你提到了XFree86, KDE, 或 GNOME,你基本上可以肯定这封信的内容不属于lfs-dev或lfs-support.
2.3.        

哪里是寻求帮助最好的地方?
       

如果本FAQ帮不了你,还有几个地方可以去.
       

如果你对书中的东西有疑问,可能重读一下LFS BOOK会发现一些你忽视了的东西。
       

如果没忘掉什么,读一读合适的man页和info页,能提供很有用的信息。如果它们不是你要找的,在问别人问题之前,应该确信自己知道得够多了,不会置自身于困窘的境地.
       

http://www.tldp.org/ 有许多HOW-TO和大量其他文档. 你可能能找到些有用的。
       

linuxfromscratch.org网站上的搜索包含了邮件列表,许多问题在上面都至少讨论过一次。搜索在 http://search.linuxfromscratch.org/.
       

对于技术支持这样的帮助,IRC 是最好的. 它更快,也不会影响邮件列表的流量。关于LFS IRC频道的信息在 http://www.linuxfromscratch.org/misc/irc.shtml.

有两个你可能感兴趣的 IRC 频道,#LFS是社区频道,#lfs-support是技术支持频道。如果你问的是技术支持的问题,在#lfs-support里更容易得到明确和友好的帮助。
       

实在没办法,就到邮件列表吧。如果你寄错了列表,或者同时寄到几个列表,大家可能会失望。邮件列表的信息在 http://www.linuxfromscratch.org/mailinglists/. 说道了该用哪个邮件列表.
2.4.        

为本 FAQ 做贡献.
       

非常欢迎建议.可以直接发email或到合适的邮件列表上联系FAQ维护者。

有用的建议包括添加确实经常问到的问题 -- 最好加上比较好的解答 -- 删除过时的问题.

严肃,正规的贡献者都欢迎. 如果你有兴趣做这个,像抓LFS BOOK那样从CVS里抓出FAQ,并修改DocBook XML源文件。你所做的修改应该用"diff -Naur"做成 patch提交,但如果是添加一个文件,可以直接提交那个文件。

任何想加到 FAQ 里的东西,如果不想被改动太多,就应该经过深思熟虑和实践,并在风格上与现存的内容一致。
3. 常被提交的 Bug

3.1. 书里的"ln -s"命令错了。
3.2. /bin/foo 是 /bin/bar 的一个拷贝。
3.3. 我能使用比书中版本更高的软件包么?
3.4. 有新版本的软件包Foo了.
3.5. Delete 键不起作用.
3.6. fsck出错后系统就关闭了!

3.1.        

书里的"ln -s"命令错了。
       

不,书中的"ln -s"命令是正确的。一个符号链接只是包含指定文件名的特殊文件。所以文件名是相对于链接来说的,而不是相对于创建链接时的工作目录。试试看。
3.2.        

/bin/foo 是 /bin/bar 的一个拷贝。
       

试试"ls -i /bin/foo /bin/bar". 两边出现的inode号一样么? 如果一样,那么它们就不是拷贝,而是硬链接。
3.3.        

我能使用比书中版本更高的软件包么?
       

如果这是你第一次编译LFS,使用不在书中的版本或不按书中的方法并不是一个好主意。 IRC 频道的管理员有一句谚语,"FBBG",就是"Follow Book, Book Good"(照着书做,书很好)。这是他们和邮件列表里的志愿者在帮助了很多新手后得出的结论,这些人往往在第一次编译时就不使用书中的方法。

只要你曾经按照书上的方法编译过一个系统,你就拥有了足够的基础知识,可以用来试验心里的想法(通常会给你带来麻烦)。

为了帮助你试验新想法(有可能是错误的想法),下面这些版本需要特别注意:

    *

      flex-2.5.31: 这个版本很麻烦。#lfs-support上有人说能用它来编译XFree86 4.3.0.1, 最新的 HJL binutils, 以及在编译 modutils 使用"flex -l"(可以用这个补丁: http://evanidus.ath.cx:8080/l14h ... 1-tmp-fix.patch.bz2) 在编译bc, libidl时也会有问题,可能还有其他这样的软件包。如果你尝试 flex-2.5.31,可能没人能帮上你的忙。而版本2.5.27就比较稳定了。
    *

      gcc-3.3: 除非你是开发者,能修正某些错误,否则不要用它。它会使很多软件不能编译。
    *

      glibc-2.3.2: 在你的编译指导里加上:

touch /etc/ld.so.conf &&
ln -s /static/bin/pwd /bin/pwd &&
touch /usr/include/assert.h &&

    *

      bash-2.05b: 要使用ftp://ftp.gnu.org/gnu/bash/bash-2.05b-patches/的补丁,并用 --without-bash-malloc 参数来运行静态(第五章) bash 的 configure 脚本。

3.4.        

有新版本的软件包Foo了.
       

如果这个新版本出了一天以上,可能已经有人试过它并向邮件列表报告了。在问它是不是能工作之前,请搜索存档。

如果你想报告新的发布,遵循下面的步骤可以避免重复报告。

    *

      查一下freshmeat里那个项目的页面,看看是否更新了。如果还没有,就在那里报告新发布。
    *

      如果freshmeat已经更新了,就查一下LFS bugzilla (或 BLFS bugzilla) 看看发布是否在那里更新了。
    *

      如果新发布也不在bugzilla上,就向lfs-book列表(或blfs-book,对BLFS中的软件包)报告。如果你愿意,测试它并报告任何问题或编译指导的变化。

3.5.        

Delete 键不起作用.
       

看这里: http://beyond.linuxfromscratch.org/view/cvs/postlfs/inputrc.html.
3.6.        

fsck出错后系统就关闭了!
       

Unix 在正常启动时fsck出错后,通常运行sulogin以使root能登陆并修复。因为在/etc/passwd损坏后sulogin会接受任何密码,LFS 开发者认为这是一个安全隐患,所以LFS的启动脚本在fsck出错后就关闭系统,必须用"init=/bin/bash"的内核参数来启动,才能得到一个root shell.这样做是否明智超出了本FAQ的讨论范围,你可能想及时的改变启动脚本。
4. 经常要求的改进

4.1. 为什么不用 GRUB 来代替 LILO 呢?
4.2. 为什么不把 LILO 升级到最新的版本?
4.3. 为什么不把这个 FAQ 包含在书里?
4.4. 为什么在书中使用vim?
4.5. 为什么在书中会有ed?
4.6. 为什么在书里没有软件包管理器?

LFS 是一个很基本的系统,与传统的发行版不同。原因是: LFS 并不能按照你想要的那样来创建系统,它只是提供一个基本的环境,你能在它的基础上来建立自己想要的系统。 LFS不是终点,只是一个开始。当你做完了LFS后,才开始编译自己的系统.

如果你是 Unix 系统的新手,想要一个有X的桌面环境和一个网页浏览器,但不知道你需要些什么软件包,那就比较麻烦了。正因为如此,才有了Beyond Linux From Scratch, 或 BLFS. 它在 http://beyond.linuxfromscratch.org/.
4.1.        

为什么不用 GRUB 来代替 LILO 呢?
       

GRUB 很可能在本书中取代 LILO,只要 GRUB 的维护者发布一个稳定版本(stable)。如果你期待这样的变化,可以向 GRUB 的维护者提出要求,因为现在的 GRUB 看上去已经非常稳定了。

如果你在安装中使用了 GRUB,或者你想使用它,只要按照 GRUB 的文档和 LFS 中的"GRUB-Howto"Hint(http://hints.linuxfromscratch.or ... in86,因为只有 LILO 使用它。
4.2.        

为什么不把 LILO 升级到最新的版本?
       

目前,书里的 LILO 停留在 22.2 版,因为在这之后的版本都依赖于 nasm. 尽管装一个 nasm 也没什么麻烦,不过 LFS BOOK 和很多用户都不想只为了 LILO 而再多装一个多余的软件包。很多用户都转而使用 GRUB 了。 (GRUB 很可能在本书中取代 LILO,只要 GRUB 的维护者发布一个稳定版本(stable)。如果你期待这样的变化,可以向 GRUB 的维护者提出要求,因为现在的 GRUB 看上去已经非常稳定了。)

使用 GRUB 的用户可以省掉 bin86, 因为只有 LILO 使用它。
4.3.        

为什么不把这个 FAQ 包含在书里?
       

Marc Heerdink 在 lfs-dev 里说得很清楚了:

    问题在于 FAQ 是一个动态的文档。为了某个版本的书而准备的 FAQ 只能在书发布后才发表,因为 FAQ 要不断更新,以反映当前版本书中的问题。一个链接更好一些,因为你总能得到最新的解答。

4.4.        

为什么在书中使用vim?
       

这个问题在 http://archive.linuxfromscratch. ... html里讨论了。
4.5.        

为什么在书中会有ed?
       

书里包含ed是因为有些补丁需要用ed程序来处理ed脚本。然而,现在这样的补丁比较少了,多数人都使用diff来做补丁。

但是 ed 还有其他的作用:

    *

      对于所有学会如何使用它的人,ed是很好用的应急编辑器。 MS Windows 标准telnet客户端能处理ed但对全屏的编辑器(如 vim)支持不好。并且一个全功能的vim不仅需要ncurses,还需要X11! 这些库中任何一个坏了,就不能用vim,所以ed可以应急。
    *

      仅管这不能算是原因,但是有些人真的喜欢ed。
    *

      了解ed能帮助你了解vi(m),甚至Unix的历史。

4.6.        

为什么在书里没有软件包管理器?
       

软件包管理 - 超出软件包自身和makefile提供的功能 - 也超出了本书的范围。如果其他地方没有说过,这里就介绍一些不同的解决方案。

如下:

    *

      没有哪一个软件包管理方案是不可或缺的。除非你想监视细微的文件替换,任何大到值得删除以节约硬盘空间的软件包都可以装到 /opt 里,这是 FHS 允许的(可能在 /opt/foo-x.x 里,然后链接到 /opt/foo),并且新版软件包通常可以在老软件包基础上直接安装,当然很大的升级或库文件升级通常最好从头开始编译系统。
    *

      RPM, Redhat 软件包管理器,在很多发行版里使用。可以从 http://www.rpm.org/得到,有一篇帮助安装的 RPM Hint,在 http://hints.linuxfromscratch.org/hints/rpm.txt.
    *

      有一个基于 RPM 的 LFS 版本,在 http://www.puxedo.org/lvr/
    *

      还有几个基于符号链接的软件包管理器:
          o

            Epkg 在 http://encap.cso.uiuc.edu/epkg/.
          o

            Graft 在 http://www.gormand.com.au/peters/tools/.
          o

            GNU Stow 在 http://www.gnu.org/software/stow/.
          o

            Depot 在 http://asg.web.cmu.edu/depot/.
          o

            另外在 Graft 的文档里还提到了更多这种类型的软件包管理器,在 http://www.gormand.com.au/peters/tools/graft/graft.html#research.
    *

      NetBSD 的软件包管理器,pkgsrc,可以使用在其他系统里,包括Linux. 从http://www.netbsd.org/zoularis/能得到它。
    *

      install-log基于 LFS 的创始人Gerard Beekmans写的一个小脚本,能在软件包安装后记录下它所安装的文件列表。在 http://install-log.sourceforge.net/.
    *

      Gerard 后来增加了他的脚本,在 http://linuxfromscratch.org/~gerard/log-installhttp://linuxfromscratch.org/~gerard/pkgdel.
    *

      CheckInstall 试图截获"make install"的系统调用。在 http://asic-linux.com.mx/~izto/checkinstall/.
    *

      pkgutils,在发行版 CRUX 中使用,在 http://www.fukt.bth.se/~per/pkgutils/.
    *

      更多关于这些系统和其他有趣系统的信息可以在 http://hints.linuxfromscratch.org/hints.shtml#package找到。

如果你还有要添加到上面列表里的系统,请把它的名字,URL地址和其他信息发给 FAQ 的维护者或合适的 LFS 邮件列表,以使它能加进去。
5. 资源

5.1. 有没有关于在 Alpha 平台上使用 LFS 的指导?
5.2. 哪里有 lfs 软件包或 wget 下载脚本?
5.3. 我到哪去找软件包Foo?
5.4. 我应该如何编译内核或设置内核模块?
5.5. 我应该从什么发行版开始安装LFS?
5.6. which在哪里?
5.7. portmap在哪里?
5.8. 在Mandrake中哪里有libncurses.a?
5.9. 我怎样才能制作一张可以启动的CD?
5.10. 我怎样才能做一个书中提到的那么小的系统?
5.11. 应该如何跨平台编译LFS?
5.12. 我编译某些很老的软件包时出错了。
5.13. 从哪里能找到 LFS 的 Logo?
5.14. 你们玩LFS的人还玩Quake?!?

5.1.        

有没有关于在 Alpha 平台上使用 LFS 的指导?
       

Kelledin 正在维护在 Alpha 平台上编译 LFS 的补丁和修正,在http://skarpsey.dyndns.org/alpha-lfs/alpha.html可以找到。
5.2.        

哪里有 lfs 软件包或 wget 下载脚本?
       

由于带宽原因,目前我们不提供 lfs 软件包下载。以后有条件的话,可能会继续提供。 wget(1) 的 man 手册页说明了如何使用这个脚本。

目前,可以用一个 wget 下载脚本来下载所有的 lfs 软件包。 LFS 4.1: http://linuxfromscratch.org/~highos/packages-ordered.wget, LFS CVS http://archive.linuxfromscratch. ... -cvs-20030516.wget. wget(1) 的 man 手册页说明了如何使用这些脚本。
5.3.        

我到哪去找软件包Foo?
       

多数情况下都很简单,但有些软件包比较难找.

http://freshmeat.net/上搜索

foo

通常能给出一个项目页面,上面有到项目主页的连接,那里可能有比freshmeat上更新的版本。

http://www.google.com/上搜索

+foo +index +lsm

很可能找到一个用LSM (Linux Software Map)列出的目录. LSM文件会给出官方的发布站点,上面可能有更新的版本,至少也会有一个比较新的 LSM 文件,那上面又可能列出新的发布站点。

如果搜索结果都是RPM包或Debian包,试试

+foo +index +lsm -RPM -debian

如果搜索结果太少了,就试着去掉"+lsm" 和 "+index".

http://www.ibiblio.org/上的链 ... 件包,可以:

foo site:ibiblio.org

如果最新的发布也很老了,Debian 或 SRPM 软件包里可能包含了比较有用的补丁,并且可能会有一个新的替代软件包,在freshmeat上通常都能找到。
5.4.        

我应该如何编译内核或设置内核模块?
       

除了内核的文档: /usr/src/linux/Documentation 和在设置内核时的帮助(make menuconfig)以外, 看一看模块-HOWTO: http://www.tldp.org/HOWTO/Module-HOWTO/, 和内核-HOWTO: http://www.tldp.org/HOWTO/Kernel-HOWTO/.
5.5.        

我应该从什么发行版开始安装LFS?
       

任何近期的发行版都可以。如果你遇到了问题,试着安装和/或升级开发软件包。(查找以"gcc", "glibc", 或"libstdc++"开头的软件包或以"-dev"结尾的软件包。)
5.6.        

which在哪里?
       

http://beyond.linuxfromscratch.org/view/cvs/general/which.html
5.7.        

portmap在哪里?
       

有一个NFS Hint,在 http://hints.linuxfromscratch.org/hints/nfs.txt.
       

另外,Marc Heerdink写过:

    我用的tcp_wrappers和portmap版本是使用了debian的补丁和为LFS调整过的Makefile,并且所有的编译错误和警告都修正了。另外,每个软件包里还带了一个lfs-install.sh脚本,提供了一个简单的安装方式。可以在http://www.linuxfromscratch.org/ ... 人能找到它们:)

5.8.        

在Mandrake中哪里有libncurses.a?
       

在第二张光盘的Mandrake/RPMS2/libncurses5-devel-5.2-16mdk.1586.rpm. 对你来说,版本号可能不同。 (如果你缺少的是libcurses.a (没有"n"), 重新读一下书里对于bash的指导。)
5.9.        

我怎样才能制作一张可以启动的CD?
       

在 LFS Hints 的 Booting(启动)部份有几个相关的提示,在 http://hints.linuxfromscratch.org/hints.shtml#booting.

在下面这两个网址你还可以找到 ISO 文件: http://www.stockwith.co.uk/iso/http://pogostick.net/~peram/lfs/.
5.10.        

我怎样才能做一个书中提到的那么小的系统?
       

Gerard 描述了如何制作一个5MB的LFS,在一封email里(http://archive.linuxfromscratch. ... t/2001/10/0072.html),下面这封信里有Cor Lem给出的其他相关资源的链接:http://archive.linuxfromscratch. ... t/2002/06/0225.html 和它的一个回复.
5.11.        

应该如何跨平台编译LFS?
       

在一台机子上为另一台机子编译LFS有时是很有用处的,比如使用快速的1Ghz Athlon为老的486编译. 虽然从技术上来说,这不是跨平台编译,但在 Athlon上编译的二进制文件不能在 486上运行,因为新处理器编译的二进制文件使用了老处理器没有的特性。要使新的系统能为老系统编译程序,看看这篇提示: http://hints.linuxfromscratch.org/hints/crosscompiling-x86.txt.
5.12.        

我编译某些很老的软件包时出错了。
       

下面是一些你不需要知道很多C语言的知识,就能在比较新的系统里编译老源码的方法。

    *

      如果你在使用GCC 3,试着在编译参数里加上-std=gnu89. (例如,加在CFLAGS里或CC里。准确的方法有点超出本FAQ的范围了。)

5.13.        

从哪里能找到 LFS 的 Logo?
       

    * http://linuxfromscratch.org/~gerard/lfslogos/
    * http://files.ichilton.co.uk/oldlfslogos/

5.14.        

你们玩LFS的人还玩Quake?!?
       

Glad you asked ;) UK的Ian Molton向LFS用户提供了一个Quake服务器。详情如下:

    *

      玩家需要最新的 Quake 3 版本。比如2003年2月是1.32b,可以从 ftp://ftp.idsoftware.com/idstuff ... 2b.x86.run下载。
    *

      玩家需要 pak0.pk3 文件,可以从完整的 Quake 3 发行版中拷贝出来。比如在 Quake 3 的 CD 上(哪怕是 MS Windows 版本也可以). 应该把这个文件放在/usr/local/games/quake3/baseq3/,除非你把 Quake 3 安装在其他地方了。
    *

      玩家需要下载服务器上使用的额外地图,下载地址是http://games.mnementh.co.uk/,安装在 ~/.q3a/baseq3/ 或装在 pak0.pk3 文件所在的目录下。一定要自己手动下载地图,因为服务器把自动下载地图的功能禁用了。
    *

      出于与禁用自动下载地图同样的考虑(带宽限制),请不要在游戏进行过程中从上面的地址里下载。
    *

      尽管服务器只在安排了游戏的时候才保证开着,玩家可以随时试着连接一下,看它是不是正在运行。
    *

      每周都有游戏,安排如下:星期二 20:00 UTC(格林尼治时间)星期六 22:00 UTC. 注意上面的时间都是格林尼治时间。
    *

      由于这个服务器只是为 LFS 用户准备的,Ian又懒得设密码,服务器的名称只在 lfs-chat 邮件列表的存档里记录。
    *

      如果你已经在“收藏夹”里添加了服务器的条目,但没有显示出来,请把"Show empty servers"(显示空的服务器)打开。

6. 经常寻求的方法

6.1. 什么是 DOS 格式的文本文件?
6.2. 如何编译一个软件包?
6.3. 我在安装好了系统以后还要留着源码么?
6.4. /dev/eth0在哪里?
6.5. 我怎样才能使电脑在关机的时候真正的关闭电源?
6.6. 如何创建一个普通用户?
6.7. 为什么拷贝内核头文件而不是链接它们?
6.8. GCC 产生的编译警告很糟糕么?

6.1.        

什么是 DOS 格式的文本文件?
       

这和每一行的结束字符有关。

有两个字符:

    *

      Line Feed: (LF) Octal:012 Decimal:10 Hex:0A C Style Escape:'\n' 换行.
    *

      Carriage Return: (CR) Octal:015 Decimal:13 Hex:0D C Style Excape:'\r' 移动到最左边.

Unix, DOS, 和 MacOS 使用这两个字体的不同组合来表示文本文件中的换行:

    *

      Unix: 只用 LF. 正因为这样,当Unix格式的文本文件送到打印机队列时,会打印出


    台
          阶.

    *

      DOS: CRLF 都用. 也是因为这样,当你用"cat -v"来显示DOS文件时,你会看到每行最后都有一个"^M"(control m is carriage return)。因此用 Microsoft Notepad 写的脚本不能正常运行,内核会去找"/bin/sh^M",系统里没有这个文件。
    *

      MacOs: 只用 CR. 打印机会打印出每一行,但都重叠在一起。Unix 工具会认为整个文件只有一行,全是"^M".

把DOS格式转换成Unix格式,使用

cp <filename> <filename>.dos &&
cat <filename>.dos | tr -d '\r' > <filename>

其他的转换可能需要sed或tr的另一种用法,留给读者做家庭作业吧。
6.2.        

如何编译一个软件包?
       

下面是一个比较顺利的例子:

tar xvjf foo-0.0.tar.bz2
cd foo-0.0
./configure --prefix=/usr
make
make install
cd ..
rm -rf foo-0.0

在最后删除源码是很重要的。这个源码只是在重新安装而又不想再编译时才有用,因为"make clean"和朋友都不可靠。下面是"./configure" 或 "make" 时出错的例子.

唯一不删除源码的是 Linux 内核。许多人都保存着内核的源码树,这样在做了一点小改动后不用从头开始编译内核。如果要做的是比较大的改动,比如改变CPU类型,可能还是要删除并重解压内核的源码。

下面是configure时出错的例子:

tar xvjf foo-0.0.tar.bz2
cd foo-0.0
./configure --prefix=/usr
.
.
.
*** configure: error: foo requires libess 4.2 or greater
please install libess and rerun configure.
cd ..
rm -rf foo-0.0
tar xvjf libess-4.2.tar.bz2
cd libess-4.2
./configure --prefix=/usr
make
make install
cd ..
rm -rf libess-4.2
tar xvjf foo-0.0.tar.bz2
cd foo-0.0
./configure --prefix=/usr
make
make install
cd ..
rm -rf foo-0.0

Ed. 注意: 上面的libess属于libiberty (在glibc中, 据我所知) 和 libofat. 问题出在gcc编译时使用的参数-l上。例如,

gcc -o foo foo.c -lm

将把"m" (数学math) 库连接到程序foo上. 所以,对上面的库而言,如下命令:

gcc -o foo foo.c -liberty -lowfat -less

这是虚假的连接点。例子出于 The Hitchhiker's Guide to the Galaxy, 作者 Douglas Adams.
6.3.        

我在安装好了系统以后还要留着源码么?
       

不用,但是看一下 "我该如何编译一个软件包?" 以了解详细情况和一个例外.
6.4.        

/dev/eth0在哪里?
       

这不是一个真正的文件。它存在于内核的名称空间里。(是的,你不是第一个认为网络设备应该和其他东西一样是文件的人。)
6.5.        

我怎样才能使电脑在关机的时候真正的关闭电源?
       

Power Management(电源管理)是内核的一个功能,你需要在内核里打开它。在"make menuconfig"时的"General Setup"部份,找到"ower Management Support" 并阅读帮助.
6.6.        

如何创建一个普通用户?
       

使用 useradd 程序. 它是从shadow软件包里来的,有许多有用的参数,看看useradd的man手册页能得到更多信息。
6.7.        

为什么拷贝内核头文件而不是链接它们?
       

简短的说,我们不用链接而是直接拷贝是为了使内核头文件适合当前系统的libc,而不是当前系统的内核.
       

详细答案在:

    *

      Linus本人的一封邮件: http://www.uwsg.iu.edu/hypermail/linux/kernel/0007.3/0587.html.
    *

      Kernel Traffic #80, 4. 内核中的符号链接; Kernel/Library/etc 接口的争论: http://kt.zork.net/kernel-traffic/kt20000814_80.txt (它包含了上面那封邮件的内容)

6.8.        

GCC 产生的编译警告很糟糕么?
       

简短答案: 不.
       

详细答案: 有可能很糟糕,但只是对于那些软件包的开发者来说。通常情况下,除非make出错,否则什么都没关系.

这里是一个例子:

sk ~/tmp $ cat > Makefile
main:
gcc main.c
sk ~/tmp $ cat > main.c
void main() { exit(0); }
sk ~/tmp $ make
gcc main.c
main.c: In function `main':
main.c:1: warning: return type of `main' is not `int'
sk ~/tmp $ ######## 正常,没关系 ########
sk ~/tmp $
sk ~/tmp $ cat > main.c
int main() { exxit(0) }
sk ~/tmp $ make
gcc main.c
main.c: In function `main':
main.c:1: parse error before `}'
make: *** [main] Error 1
sk ~/tmp $ ######## 出错了 ########
sk ~/tmp $

7. 经常遇到的错误

7.1. 任何时候遇到的错误

    7.1.1. No such file or directory(没有这样的文件和目录)

7.2. 编译错误

    7.2.1. 任何软件包的编译错误

        7.2.1.1. undefined reference to `deflate'
        7.2.1.2. bash: ./configure: No such file or directory
        7.2.1.3. ./configure: bad interpreter: Permission denied
        7.2.1.4. configure can't guess my host type.(configure脚本查不出我的主机类型)
        7.2.1.5. checking whether we are using GNU C... no
        7.2.1.6. 为什么 configure 会在"checking for signed size_t type..."时死掉呢??
        7.2.1.7. 我的出错信息是`/dev/null: Permission denied'
        7.2.1.8. signal 11 (internal error: Segmentation fault)
        7.2.1.9. 我在编译一个依赖于GTK+的软件包时出错了,但我已经安装了 GTK+ 2.x.
        7.2.1.10. X11/Xlib.h: No such file or directory
        7.2.1.11. 在编译 GNOME 的某一部份时出错

    7.2.2. 特定软件包的编译错误

        7.2.2.1. conflicting types for `gethostname'
        7.2.2.2. 在编译 modutils 时出现"lex.l:429: `yytext_ptr' undeclared"的错误。
        7.2.2.3. undefined reference to `deflate'(未定义的引用`deflate')
        7.2.2.4. Glibc 出错,信息是". . . . it is normal to compile GNU libc with the `linuxthreads' add-on. . . ."
        7.2.2.5. Perl 出错,信息是: "*** missing separator. Stop."
        7.2.2.6. Error: Unknown pseudo-op: `.hidden'
        7.2.2.7. 优化过的glibc在spinlock.c出错了
        7.2.2.8. Glibc 出错,信息是"cannot determine asm global directive".
        7.2.2.9. Glibc 出错了,并提到了 BEGIN 和 END.
        7.2.2.10. Glibc 出错,信息是: "ld.map: No such file or directory".
        7.2.2.11. 我的静态sh-utils出错了,信息是"undefined reference to `getloadavg'".

    7.2.3. 上面未列出的编译错误

        7.2.3.1. 我使用来自GNU的patch来升级,可以么?
        7.2.3.2. 什么时候使用优化参数(设置CFLAGS)
        7.2.3.3. 我在使用与书中不同的软件包版本,可以么?
        7.2.3.4. 我在上一次安装后没有删除源码,还要删么?

7.3. 运行错误

    7.3.1. 我的net-pf-? 出错了
    7.3.2. modprobe: Can't locate module char-major-10-135
    7.3.3. modprobe: Can't locate module /dev/rtc
    7.3.4. Kernel panic: VFS: unable to mount root fs
    7.3.5. init: Id "1" respawning too fast: disabled for 5 minutes
    7.3.6. LILO的那些错误消息是什么意思?
    7.3.7. 我的hostname设置成"-f"了!
    7.3.8. 为什么less(以及man)程序会打印出 <AD> 而不是连字符?

7.1. 任何时候遇到的错误

7.1.1. No such file or directory(没有这样的文件和目录)

7.1.1.        

No such file or directory(没有这样的文件和目录)
       

这个错误的例子有:

/usr/bin/env: /static/bin/bash: No such file or directory
gcc: No such file or directory

它们通常发生在第六章里想进入chroot环境(或刚进去不久)时,是因为试图运行一个动态连接的程序而引起的。你可以使用file命令来检查这个程序。例如:

file $LFS/static/bin/bash

如果结果里没有说到"statically linked",那毛病就在这里了。

解决方法是回到第五章,找到那个程序属于的软件包,删除以前用过的源码,然后重新解压,最后再编译这个软件包。这一次就要格外注意,要让它静态连接。
7.2. 编译错误

7.2.1. 任何软件包的编译错误

    7.2.1.1. undefined reference to `deflate'
    7.2.1.2. bash: ./configure: No such file or directory
    7.2.1.3. ./configure: bad interpreter: Permission denied
    7.2.1.4. configure can't guess my host type.(configure脚本查不出我的主机类型)
    7.2.1.5. checking whether we are using GNU C... no
    7.2.1.6. 为什么 configure 会在"checking for signed size_t type..."时死掉呢??
    7.2.1.7. 我的出错信息是`/dev/null: Permission denied'
    7.2.1.8. signal 11 (internal error: Segmentation fault)
    7.2.1.9. 我在编译一个依赖于GTK+的软件包时出错了,但我已经安装了 GTK+ 2.x.
    7.2.1.10. X11/Xlib.h: No such file or directory
    7.2.1.11. 在编译 GNOME 的某一部份时出错

7.2.2. 特定软件包的编译错误

    7.2.2.1. conflicting types for `gethostname'
    7.2.2.2. 在编译 modutils 时出现"lex.l:429: `yytext_ptr' undeclared"的错误。
    7.2.2.3. undefined reference to `deflate'(未定义的引用`deflate')
    7.2.2.4. Glibc 出错,信息是". . . . it is normal to compile GNU libc with the `linuxthreads' add-on. . . ."
    7.2.2.5. Perl 出错,信息是: "*** missing separator. Stop."
    7.2.2.6. Error: Unknown pseudo-op: `.hidden'
    7.2.2.7. 优化过的glibc在spinlock.c出错了
    7.2.2.8. Glibc 出错,信息是"cannot determine asm global directive".
    7.2.2.9. Glibc 出错了,并提到了 BEGIN 和 END.
    7.2.2.10. Glibc 出错,信息是: "ld.map: No such file or directory".
    7.2.2.11. 我的静态sh-utils出错了,信息是"undefined reference to `getloadavg'".

7.2.3. 上面未列出的编译错误

    7.2.3.1. 我使用来自GNU的patch来升级,可以么?
    7.2.3.2. 什么时候使用优化参数(设置CFLAGS)
    7.2.3.3. 我在使用与书中不同的软件包版本,可以么?
    7.2.3.4. 我在上一次安装后没有删除源码,还要删么?

7.2.1. 任何软件包的编译错误

7.2.1.1. undefined reference to `deflate'
7.2.1.2. bash: ./configure: No such file or directory
7.2.1.3. ./configure: bad interpreter: Permission denied
7.2.1.4. configure can't guess my host type.(configure脚本查不出我的主机类型)
7.2.1.5. checking whether we are using GNU C... no
7.2.1.6. 为什么 configure 会在"checking for signed size_t type..."时死掉呢??
7.2.1.7. 我的出错信息是`/dev/null: Permission denied'
7.2.1.8. signal 11 (internal error: Segmentation fault)
7.2.1.9. 我在编译一个依赖于GTK+的软件包时出错了,但我已经安装了 GTK+ 2.x.
7.2.1.10. X11/Xlib.h: No such file or directory
7.2.1.11. 在编译 GNOME 的某一部份时出错

7.2.1.1.        

undefined reference to `deflate'
       

如果在编译XFree86, ghostscript,或任何其他使用libpng的软件包时遇到包含下面这一行信息的错误:

/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2/../../../libpng.so: undefined reference
to `deflate'

那就给libpng打上补丁: http://www.linuxfromscratch.org/~sklein/libpng-1.2.5-lz.patch. 然后再重新编译安装libpng. 确定你在一解压了软件包源码后就使用了补丁。如下:

tar --no-same-owner -xvjf libpng-1.2.5.tar.bz2
cd libpng-1.2.5
cat ../libpng-1.2.5-lz.patch | patch -p0
ln -s scripts/makefile.linux Makefile
make ZLIBLIB=/lib ZLIBINC=/usr/include
make ZLIBLIB=/lib ZLIBINC=/usr/include install
cd ..
rm -r libpng-1.2.5

当然,如果你把zlib放在/usr/local或者有其他不同之处,你就要相应调整上面的命令。
7.2.1.2.        

bash: ./configure: No such file or directory
       

看这里: "如何编译一个软件包?"
7.2.1.3.        

./configure: bad interpreter: Permission denied
       

最有可能是在 LFS BOOK 的第五章编译 bash 时遇到这个问题。毛病可能出在你的 mount(加载)参数。比如在 /etc/fstab 里有这样一行:

/dev/hda10        /mnt/lfs        ext2        user        1  2

'user' 是一个 mount 参数,它就是引起问题的原因。引用 mount 手册页里的一段话:


user  Allow  an  ordinary  user to mount the file system.
      This  option  implies  the options noexec,  nosuid,
      and nodev (unless overridden by subsequent options,
      as in the option line user,exec,dev,suid).
user  允许普通用户来加载这个文件系统。这个参数包含了 noexec,
      nosuid 和 nodev (除非被后面的参数所覆盖,比如在 option
      那里是 user,exec,dev,suid 时).

所以可以把 /etc/fstab 中上面那一行改成:

/dev/hda10        /mnt/lfs        ext2        defaults        1  2

7.2.1.4.        

configure can't guess my host type.(configure脚本查不出我的主机类型)
       

通常症状看上去是这样:

sk ~/tmp-0.0 $ ./configure
creating cache ./config.cache
checking host system type... configure: error: can not guess host type; you must
specify one
sk ~/tmp-0.0 $

这个错误通常是因为脚本不能运行编译器。很可能只是缺少 /usr/bin/cc 符号链接。你可以用这个命令来修正:

cd /usr/bin
ln -s gcc cc

如果这样做没有效果,查看一下 configure 脚本创建的config.log 文件。Error 是在这里发生的,可能会指出问题所在。
7.2.1.5.        

checking whether we are using GNU C... no
       

如果你在configure时得到像下面这样的出错信息:

checking whether we are using GNU C... no
configure: error: GNU libc must be compiled using GNU CC

可能是因为egrep (属于grep包)不能工作.

在安装第六章的grep软件包前,用的是第五章里安装的egrep,测试一下egrep是否工作。在chroot环境外面运行下列命令:

file $LFS/bin/egrep

如果没有说是"statically linked"就不对了,需要重新安装grep软件包。

在第六章安装grep包后,测试egrep是否工作的方法就不一样了,在chroot环境里面运行下列命令:

egrep root /etc/passwd

如果没有打印出/etc/passwd中root那行,也不对。 (如果在重启进入新LFS系统后出了问题,也可以用这个方法来测试.)
7.2.1.6.        

为什么 configure 会在"checking for signed size_t type..."时死掉呢??
       

你对gcc的优化参数设置得太高了。
7.2.1.7.        

我的出错信息是`/dev/null: Permission denied'
       

/dev/null看上去是不是像下面这样?

$ ls -l /dev/null
crw-rw-rw-   1 root     root       1,   3 Aug  3  2000 /dev/null

如果不是,那就会出错了。看看chmod(1), chown(1), 和mknod(1)的man手册页以及/usr/src/linux/Documentation/devices.txt,就能知道怎么修复了。

如果它看上去是对的,问题可能出在你的加载参数上。看看上面"./configure: bad interpreter: Permission denied"的回答。
7.2.1.8.        

signal 11 (internal error: Segmentation fault)
       

完整答案在 http://www.bitwizard.nl/sig11/.

简短答案是:如果每一次重启都会进步一点,那就是硬件有问题了. (如果你在运行make或其他程序时,每次都停在同一个地方,那就不是硬件问题。)

假设你没有超频,最有可能的硬件问题是内存不好,你可以用Memtest86(http://www.memtest86.com/)来检查. 如果不是内存问题,那就看完整答案吧.
7.2.1.9.        

我在编译一个依赖于GTK+的软件包时出错了,但我已经安装了 GTK+ 2.x.
       

GTK+ 2.x 和 1.2.x 不兼容. 你要安装的软件包可能依赖于GTK+ (和GLIB) 1.2.x. 你可以同时安装 GTK+ (和GLIB)的1.2.x版本和2.x版本.
7.2.1.10.        

X11/Xlib.h: No such file or directory
       

一般是像下面这样:

$ echo -en 'x11:\n\tgcc x11.c\n' > Makefile
$ echo -en '#include <X11/Xlib.h>\nmain() { }\n' > x11.c   
$ make
gcc x11.c
x11.c:1: X11/Xlib.h: No such file or directory
make: *** [x11] Error 1
$ rm Makefile x11.c
$

创建一些符号链接能搞定。下面是命令:

cd /usr
ln -s X11R6 X11
cd include
ln -s ../X11/include/X11 X11

7.2.1.11.        

在编译 GNOME 的某一部份时出错
       

使用最新的Gnome软件包并不一定能工作。你应该使用那些已知能一起工作的软件包版本.

要得到这样的软件包列表,看看 http://ftp.gnome.org/pub/GNOME/desktop/, 下载最新的版本 (http://ftp.gnome.org/pub/GNOME/desktop/2.1/2.1.90/sources/ 写本文时), 并使用那里的版本.
7.2.2. 特定软件包的编译错误

7.2.2.1. conflicting types for `gethostname'
7.2.2.2. 在编译 modutils 时出现"lex.l:429: `yytext_ptr' undeclared"的错误。
7.2.2.3. undefined reference to `deflate'(未定义的引用`deflate')
7.2.2.4. Glibc 出错,信息是". . . . it is normal to compile GNU libc with the `linuxthreads' add-on. . . ."
7.2.2.5. Perl 出错,信息是: "*** missing separator. Stop."
7.2.2.6. Error: Unknown pseudo-op: `.hidden'
7.2.2.7. 优化过的glibc在spinlock.c出错了
7.2.2.8. Glibc 出错,信息是"cannot determine asm global directive".
7.2.2.9. Glibc 出错了,并提到了 BEGIN 和 END.
7.2.2.10. Glibc 出错,信息是: "ld.map: No such file or directory".
7.2.2.11. 我的静态sh-utils出错了,信息是"undefined reference to `getloadavg'".

7.2.2.1.        

conflicting types for `gethostname'
       

如果你在第五章编译 bash 时得到的错误信息是"conflicting types for `gethostname'" 你需要安装glibc-static-devel RPM.(在第三张光盘上.)
7.2.2.2.        

在编译 modutils 时出现"lex.l:429: `yytext_ptr' undeclared"的错误。
       

如果在编译modutils时,你得到:

/usr/bin/gcc -O2 -Wall -Wno-uninitialized -I. -I. -I./../include
-D_GNU_SOURCE  -DCONFIG_ROOT_CHECK_OFF=0   -c -o lex.o lex.c
lex.l: In function `yylex':
lex.l:429: `yytext_ptr' undeclared (first use in this function)
lex.l:429: (Each undeclared identifier is reported only once
lex.l:429: for each function it appears in.)
make[1]: *** [lex.o] Error 1

那么看这里 FBBG (提示: flex).
7.2.2.3.        

undefined reference to `deflate'(未定义的引用`deflate')
       

如果在编译 XFree86 时你得到:

make[3]: Entering directory `/usr/src/xc/programs/xcursorgen'
rm -f xcursorgen
gcc -m32 -o xcursorgen -O2 -fno-strength-reduce -fno-strict-aliasing -ansi
-pedantic -Wall -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes
-Wmissing-declarations -Wredundant-decls -Wnested-externs -Wundef
-L../../exports/lib   xcursorgen.o -lXcursor -lXext -lX11 -lpng -lm
-Wl,-rpath-link,../../exports/lib
/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2/../../../libpng.so: undefined reference
to `deflate'
/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2/../../../libpng.so: undefined reference
to `inflate'
/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2/../../../libpng.so: undefined reference
to `inflateInit_'
/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2/../../../libpng.so: undefined reference
to `crc32'
/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2/../../../libpng.so: undefined reference
to `deflateInit2_'
/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2/../../../libpng.so: undefined reference
to `inflateReset'
/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2/../../../libpng.so: undefined reference
to `deflateReset'
/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2/../../../libpng.so: undefined reference
to `inflateEnd'
/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2/../../../libpng.so: undefined reference
to `deflateEnd'
collect2: ld returned 1 exit status
make[3]: *** [xcursorgen] Error 1
make[3]: Leaving directory `/usr/src/xc/programs/xcursorgen'
make[2]: *** [install] Error 2
make[2]: Leaving directory `/usr/src/xc/programs'
make[1]: *** [install] Error 2
make[1]: Leaving directory `/usr/src/xc'
make: *** [install] Error 2

那就参考一下 通用条目,可以找到答案。
7.2.2.4.        

Glibc 出错,信息是". . . . it is normal to compile GNU libc with the `linuxthreads' add-on. . . ."
       

详细的信息像下面这样:

*** On GNU/Linux systems it is normal to compile GNU libc with the
*** `linuxthreads' add-on.  Without that, the library will be
*** incompatible with normal GNU/Linux systems.
*** If you really mean to not use this add-on, run configure again
*** using the extra parameter `--disable-sanity-checks'.

你忘了在glibc-X.X.X 目录里解压glibc-linuxthread.X.X.tar.bz2s-X. 在那里解压它就行了。
7.2.2.5.        

Perl 出错,信息是: "*** missing separator. Stop."
       

这是因为缺少一个设备文件. (据我所知,是/dev/null, 但也可能是/dev/zero.) 不管怎样,要么是你忘了运行MAKEDEV, 要么是MAKEDEV出错了,最后的可能就是你用的是devfs而忘了在$LFS下用mount --bind来加载它。

如果 MAKEDEV 出错,通常所有的设备文件都以"-"结尾. 据我所知,当没有加载$LFS/proc时运行MAKEDEV就会这样。

设备文件应该和下面的一模一样:

sk@bubook:~ $ ls -l /dev/{null,zero}
crw-rw-rw-    1 root     root       1,   3 Dec 31  1969 /dev/null
crw-rw-rw-    1 root     root       1,   5 Dec 31  1969 /dev/zero
sk@bubook:~ $

7.2.2.6.        

Error: Unknown pseudo-op: `.hidden'
       

如果在第五章编译GCC时遇到错误:

Error: Unknown pseudo-op: `.hidden'

试试http://archive.linuxfromscratch. ... t/2002/09/0138.html 给出的解决方法,并回复一下你的结果。
7.2.2.7.        

优化过的glibc在spinlock.c出错了
       

应该说明,glibc (还有gcc和binutils)最好不要使用优化参数。对这几个包来说,用稳定性来交换性能是很不划算的。但是. . . .
       

如果你指定了一个CFLAGS,像"-march=i686 -mcpu=686"这样,得到了下面的错误信息:

spinlock.c: In function `__pthread_lock':
spinlock.c:107: inconsistent operand constraints in an `asm'
make[2]: *** [/usr/src/glibc-build/linuxthreads/spinlock.o] Error 1
make[2]: Leaving directory `/usr/src/glibc-2.2.4/linuxthreads'
make[1]: *** [linuxthreads/others] Error 2
make[1]: Leaving directory `/usr/src/glibc-2.2.4'
make: *** [all] Error 2

这是因为,与其他东西不同的是,spinlock.c需要优化。你可以把CFLAGS设置成"-march=i686 -mcpu=i686 -O2"这样.(注意"-O2".) 但最好在glibc-x.x.x/Makeconfig里面设置优化参数. 下面是Makeconfig中相关部份:

# Default flags to pass the C compiler.
ifndef default_cflags
ifeq ($(release),stable)
default_cflags := -g -O2
else
default_cflags := -g -O
endif
endif

这是一个调整的例子:

# Default flags to pass the C compiler.
ifndef default_cflags
ifeq ($(release),stable)
default_cflags := -g0 -Os -march=i386 -mcpu=i386 -pipe
else
default_cflags := -g -O
endif
endif

7.2.2.8.        

Glibc 出错,信息是"cannot determine asm global directive".
       

"configure: error: cannot determine asm global directive",在配置glibc时出现的这个错误,表示 binutils 装得有问题。很有可能是动态连接的。 (你可以用"file $LFS/static/bin/as"来检查。) 不管如何,试着重装 binutils.
7.2.2.9.        

Glibc 出错了,并提到了 BEGIN 和 END.
       

如果在编译 glibc 时出现像下面这样的错误:

'BEGIN { subdirs = ""; inhibit = "" };                        \
^# { next };                                                \
^[^-] { subdirs = subdirs " " $0 };                        \
^- { inhibit = inhibit " " substr($0, 2) };                \
END { printf "sysdep-subdirs =%s\n", subdirs;                \
      printf "sysdep-inhibit-subdirs =%s\n", inhibit;        \
      print "sysd-dirs-done = t" }'                        \
       /dev/null linuxthreads/sysdeps/pthread/Subdirs
sysdeps/unix/inet/Subdirs sysdeps/unix/Subdirs >
/usr/src/glibc-build/sysd-dirs-tmp
/bin/sh: line 1: BEGIN { subdirs = ""; inhibit = "" };                        
^# { next };                                                
^[^-] { subdirs = subdirs " " $0 };                         ^- { inhibit =
inhibit " " substr($0, 2) };                 END

这说明gawk不能工作。线索是输出信息中的BEGIN和END. 出错的原因是gawk不是静态连接的,回到第五章,重新编译gawk就行了。
7.2.2.10.        

Glibc 出错,信息是: "ld.map: No such file or directory".
       

你没有 /dev/null. 要么是你忘了照glibc的安装指导那样创建它,要么你正在使用devfs并且在进入chroot环境前忘了用 "mount --bind /dev $LFS/dev" 来加载。在修正了上面的错误后,应该删除glibc-N.N.N和glibc-build目录,重新解压。
7.2.2.11.        

我的静态sh-utils出错了,信息是"undefined reference to `getloadavg'".
       

如果你在编译静态sh-utils时出错,信息如下:

gcc  -g -O2  -static -o uptime  uptime.o ../lib/libsu.a -lutil
uptime.o: In function `print_uptime':
/lfs/tmp/sh-utils-2.0/src/uptime.c:125: undefined reference to `getloadavg'
collect2: ld returned 1 exit status
make[2]: *** [uptime] Error 1
make[2]: Leaving directory `/lfs/tmp/sh-utils-2.0/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/lfs/tmp/sh-utils-2.0'
make: *** [all-recursive-am] Error 2

我不能重现这个错误,所以也不能给出一个解决方案,但是其他人给出了两个解决方法。我建议按下面的顺序来试一试:

    *

      http://archive.linuxfromscratch. ... /2001/06/0507.html: 这个方法是试图修正生成时有错误的config.h,如果你能按照信里给出的指导解决问题,这应该就是正确的解决方法。
    *

      如果上面的方法不管用,删除源码,重新解压,再试试: http://archive.linuxfromscratch. ... /2001/06/0495.html. 这个方法是根本不编译uptime,因为在chroot环境时不需要uptime,而那时编译动态的uptime就不会有问题了。

7.2.3. 上面未列出的编译错误

7.2.3.1. 我使用来自GNU的patch来升级,可以么?
7.2.3.2. 什么时候使用优化参数(设置CFLAGS)
7.2.3.3. 我在使用与书中不同的软件包版本,可以么?
7.2.3.4. 我在上一次安装后没有删除源码,还要删么?

7.2.3.1.        

我使用来自GNU的patch来升级,可以么?
       

来自GNU的patch并不总能工作。你可以重新下载软件包再试一次,或者用下面邮件里给出的解决方法: http://archive.linuxfromscratch. ... /2002/06/0386.html.
7.2.3.2.        

什么时候使用优化参数(设置CFLAGS)
       

如果你在设置优化参数后出错了,或者在把优化参数传递给编译器后出错了,可能就不应该设置。

如果你在邮件列表上问了,他们可能不能马上指出原因,而是建议你去掉优化参数试一试。如果你在去掉优化参数之前不问,那你就比他们快一步了

尤其要注意的是,优化binutils, gcc, 或 glibc可能会引起任何软件包不能编译,不能运行或者表现怪异。还有,某人用优化可以,可能你就是不行。以前能正常使用的参数,可能神秘地不能用了。甚至某些细微的硬件区别也会造成差异。

(如果你不知道什么是优化参数,别急,你真的不需要知道.)
7.2.3.3.        

我在使用与书中不同的软件包版本,可以么?
       

如果你在使用与书中不同的软件包版本(老或新)时遇到了问题,试一下书中的版本。有时候书里使用特定的版本是有原因的,如果好奇的话,就搜索邮件列表的存档吧。
7.2.3.4.        

我在上一次安装后没有删除源码,还要删么?
       

是的,但看一看 "如何编译一个软件包?" ,可以了解细节以及一个特例.
7.3. 运行错误

7.3.1. 我的net-pf-? 出错了
7.3.2. modprobe: Can't locate module char-major-10-135
7.3.3. modprobe: Can't locate module /dev/rtc
7.3.4. Kernel panic: VFS: unable to mount root fs
7.3.5. init: Id "1" respawning too fast: disabled for 5 minutes
7.3.6. LILO的那些错误消息是什么意思?
7.3.7. 我的hostname设置成"-f"了!
7.3.8. 为什么less(以及man)程序会打印出 <AD> 而不是连字符?

7.3.1.        

我的net-pf-? 出错了
       

你在编译net-tools时,打开了一些protocol family(协议族)的支持(这就是"pf"的由来),但在内核里没有打开相应的支持。 (你可能应该接受缺省的答案)

完整的协议列表在/usr/include/linux/socket.h,下面列出与这个错误有关的几项:

    *

      net-pf-3: Amateur Radio AX.25 (AF_AX25)
    *

      net-pf-4: Novell IPX (AF_IPX)
    *

      net-pf-5: AppleTalk DDP (AF_APPLETALK)
    *

      net-pf-6: Amateur Radio NET/ROM (AF_NETROM)
    *

      net-pf-9: Reserved for X.25 project (AF_X25)

自然,解决问题的办法是重新编译net-tools,去掉你不需要的支持。 (或者重新编译内核,加上你需要的支持.) 变通办法是在/etc/modules.conf中加上类似于下面这样的行:

alias net-pf-? off

把问号换成相应的数字。在这之后,重新运行depmod.
       

如果你得到一个关于net-pf-7的错误,你可能需要在内核里加上loopback network device支持 (不是块设备block device). 也可以在/etc/modules.conf里加上下面这行再运行depmod.

alias net-pf-7 loop

7.3.2.        

modprobe: Can't locate module char-major-10-135
       

"char-major-10-135" 的意思是 character device(块设备), major(主节点) 10, minor(次节点) 135, 也就是 /dev/rtc. 它提供对 BIOS 时钟(也就是 RTC)的访问权。在 /usr/src/linux/Documentation/rtc.txt 里可以找到更多信息。

这个错误是因为有的程序(很有可能是 hwclock)试图使用 /dev/rtc,但是你在配置内核的时候没有加入相应的支持。解决方法是要么删除 /dev/rtc 以使 hwclock 不试着使用它,要么在内核里加入 RTC 支持。 在 make menuconfig 阶段的 "Character devices" -> "Enhanced Real Time Clock Support"这一项就是 RTC支持。
7.3.3.        

modprobe: Can't locate module /dev/rtc
       

看看问题"modprobe: Can't locate module char-major-10-135".
7.3.4.        

Kernel panic: VFS: unable to mount root fs
       

内核不能加载root文件系统有下面几个原因。

    *

      你在/etc/lilo.conf里指定了正确的分区么?
    *

      你没忘记在修改了/etc/lilo.conf后重新运行lilo吧?
    *

      内核里打开了对硬盘的支持么?对SCSI硬盘来说,要打开确定的SCSI控制器支持.
    *

      对硬盘的支持编译到内核中而不是作为模块吧? (模块保存在文件系统中。如果加载文件系统的模块又保存在文件系统上,啊. . . 你知道了. . . . ;)
    *

      对硬盘的支持编译到内核中而不是作为模块吧(又一次问)?对ext2的支持是缺省就有的,而ext3, reiser, jfs, 和 xfs 并不是这样。

7.3.5.        

init: Id "1" respawning too fast: disabled for 5 minutes
       

如果你在系统日志里看到了这样一行:

init: Id "1" respawning too fast: disabled for 5 minutes

它说明你的/etc/inittab指定ID行有问题(这个例子里是"1").
7.3.6.        

LILO的那些错误消息是什么意思?
       

LILO文档里列出了所有错误消息的意思(如在显示出"LI"后就停住了), 不过一个简明的概诉在 http://sdb.suse.de/sdb/en/html/kgw_lilo_errmsg.html.
7.3.7.        

我的hostname设置成"-f"了!
       

你需要安装net-tools软件包. (看看LFS book里的安装指导.)

你系统里正在使用的hostname命令来自sh-utils,不支持 -f 参数.当用 -f 参数来调用它时,它还以为 hostname应该设置成"-f". net-tools包里的hostname命令没有这个问题。
7.3.8.        

为什么less(以及man)程序会打印出 <AD> 而不是连字符?
       

因为你没有设置环境变量LANG和LC_ALL. 要修正这个问题,在每个用户的~/.bash_profile 和 ~/.bashrc 两个文件里都设置上上面的两个环境变量,或者在/etc/profile里设置,这样能对所有用户起作用。添加类似于下面的语句:

export LANG=en_US
export LC_ALL=POSIX

可以用这个命令把它们加到/etc/profile里面:

echo -e 'export LANG=en_US\nexport LC_ALL=POSIX' >> /etc/profile

如果你使用的不是英语,就把"en_US"改成相应的值,可能还要改很多LC_*值. 运行locale命令会列出很多(所有?) LC_* 值。
发表于 2003-6-3 08:52:23 | 显示全部楼层
ka,这个论坛没有发贴字数上限啊?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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