📄 kernel-howto.txt
字号:
心的注意过了,但还是可能有人会在较旧的版本上遭遇这个问题. 要修正这个问 题的话,查看 config.in.rej 这个档案里留下些什麽讯息. 有修改过的部份正 常来说会在每一行开始的地方标上 `+' 和 `-'. 查看有标记的附近几行,然後 记得它们是设成 `y' 或是 `n'. 现在编辑 config.in 档,然後在适当的地 方 把 `y' 改成 `n' 以及 `n' 改成 `y'.执行 patch -p0 < config.in.rej 如果成功的话(没有错误),那麽你就可以继续配置与编译的工作. 这个 config.in.rej 档还是会留在那里,但是你可以砍掉它. 如果你仍然遭遇其它问题,那麽可能是你安装了一份损坏的修补档. 如果 patch 显示 `previously applied patch detected: Assume -R?', 你可能使用 了一些比你目前的版本编号还低的修补档; 如果你回答 `y',它会尝试将你的程 式码降级,而且几乎一定会失败; 如此,你就需要重新取得一份新的原始程式码 . 要还原到修补前的状态的话,在原先的修补档上执行 `patch -R'. 当修补档真的失败的时候,最好的办法是从一个乾净的原始程式码(例如从 linux-x.x.x.tar.gz 档案其中之一)开始,再重新执行. 5.3 砍掉 .orig 档案 只要做过几次修补以後,那些 .orig 的档案将会开始堆积. 例如,我的一个 1.1.51 版的程式码最後一次做清扫是在 1.1.48 版(我想是吧). 删除这些 .orig 档案会节省许多的磁碟空间. find . -name '*.orig' -exec rm -f {} ';' 将会替你照料这件事.某些版本的 patch 会用 ~ 来代替 .orig. 有其它更好的的办法可砍掉这些 .orig 档,就是利用 GNU 的 xargs: find . -name '*.orig' | xargs rm 或是更安全但有些罗嗦的方法: find . -name '*.orig' -print0 | xargs --null rm --5.4 其它的修补档 有一些并不是由 Linus 发行的其它修补档出现(我将称之为``非标准的''). 如 果你使用了它们,Linus 的修补档可能会而无法正确地执行, 那麽你不是得将它 们还原就是得因此而去修改原始程式码或是修补档.这个工作对初学者通常是很 讨厌, 所以如果你不想去修改原始程式码(结果通常不大好),在使用 Linus 的 修补档之前先还原这些非标准的修补档,或重新安装新的程式码. 然後试试这非 标准的修补档能不能用.如果不能的话,那麽要不你就继续使用旧的核心, 试著 修改修补档使其能用,要不就等待(可能是乞求)新版非标准修补档出现. 非标准的修补档有多普遍? 你有可能曾经听过它们.我使用 Bill Paul 的不闪烁 修补档来修改我的虚拟控制台,因为我讨厌会闪烁的游标(这个修补档经常为新版 核心而更新). 由於大部份较新的设备驱动程式都已经被发展成可载入模组形式 ,因此许多非标准的修补档的重要性已逐渐降低. 6. 附加的套件 你的 Linux 核心有许多在原始程式码本身里面并没有说明的特性; 这些特性一 般是经由外来的软体来利用,在这里列出一部分最普遍的: 6.1 kbd Linux 的控制台有著比你所能吃惊更多的特色.这包括切换字型,重新对映你的 键盘,切换显示模式(较新版的核心)的能力等等. kbd 这套软体里有能够让使用 者做这些动作的支援程式,还加上一大堆的字型以及几乎足以适用任何键盘的一 些键盘对映表. 它可在放置核心原始码的同一站台找到. 6.2 util-linux Rik Faith ( [15]faith@cs.unc.edu) 收集了一大堆 Linux 的工具,叫做 util-linux. 现在是由 Nicolai Langfeldt ( [16]util-linux@math.uio.no) 所维护. 可从 sunsite.unc.edu 的 [17]/pub/Linux/system/misc 取得. 它包 括了像 setterm,rdev 以及 ctrlaltdel 与核心有关的工具. 就像 Rik 所说的 ,不要想都不想就把它装上去! 你不需要安装此套件中的每一个东西,而且如果 你这样做的话可能会引起严重的问题. 6.3 hdparm 像很多软体一样,这曾经是一个核心修补档及其支援程式. 这些修补档被放入商 业核心中,而用来最佳化以及调适你硬碟的支援程式一般是分开发行的. 6.4 gpm gpm 是 general purpose mouse 的简写. 这个程式可以让你使用不同种类的滑 鼠在虚拟控制台之间剪贴,以及做一些其它的事情. 7. 一些陷阱7.1 make clean 如果你的新核心会做一些真的很奇怪的事,有可能是因为在编译核心前你忘了做 清除 make clean. 症状从你的核心不正常地崩溃到奇怪的输出入问题,一直到 可怜的执行效率等等不一而足,可以是任何事. 最好也要确定你有做 make dep . 7.2 巨大或缓慢的核心 如果你的核心占用了大量的记忆体,或者它真的是很大很大,也或者是即使用你 全新的 786DX6/440 来编译却都还像是永远编译不完的话, 那麽有可能是因为你 配置了太多不必要的东西(设备驱动程式,档案系统等等). 如果你不会用到某些 东西,那就不要配置它,因为它真的会占用记忆体. 核心过於臃肿最明显的症状 就是发生记忆体与磁碟之间异常大量的资料交换. 如果你不是用那种声音听起来 好像是喷射机降落的旧型 Fujitsu Eagles 硬碟,检查一下你的核心配置. 你可以找出你机器上全部记忆体的数量,然後减掉 /proc/meminfo 里面的 ``total mem'' 或 `free' 指令所得的记忆体数量来得知核心使用了多少记忆体 . 你也可以执行 `dmesg' (或者也可以查看核心的记录档,它一定在会你的系统 里).看起来就像这一行: Memory: 15124k/16384k available (552k kernel code, 384k reserved, 324k data) 我的 386 (配置很少垃圾)显示如下: Memory: 7000k/8192k available (496k kernel code, 384k reserved, 312k data) 如果你`必须'得到一大型核心但系统却不让你做,你可以试试 `make bzimage'. 你可能必须安装新版的 LILO 来做这件事. 7.3 核心无法编译 如果它没有被编译,那麽可能是有个修补档失败了,或者是你从某个地方拿到的 原始程式码有问题. 也有可能是因为你的 gcc 版本不正确或坏掉了(例如含入档 有错误). 确定 Linus 在 README 里所描述的符号链结都有正确建立. 一般说 来,如果核心没能编译,这表示在某些地方有严重的错误,重新安装某些工具可 能是必须的. 或者可能你用 ELF 编译器 (gcc 2.6.3 或以後的) 来编译 1.2.x 的核心. 如果 编译过程中你得到一大堆的 xxxx undefined 的讯息,这可能是你的问题. 修正 的方法大部份都很简单.将这几行加到 arch/i386/Makefile 的顶端: arch/i386/Makefile:AS=/usr/i486-linuxaout/bin/asLD=/usr/i486-linuxaout/bin/ld -m i386linuxCC=gcc -b i486-linuxaout -D__KERNEL__ -I$(TOPDIR)/include 然後重新执行 make dep 与 zImage. 在少数情况下,gcc 可能会由於硬体问题而当掉.错误讯息会像 ``xxx exited with signal 15'' 之类的,而且会看起来很奇怪. 我本来不想提这点的,不过 在我身上也发生过一次 - 我有一些坏的 cache 记忆体,编译器时常会随机地当 掉. 如果你有此问题的话先试著重新安装 gcc.如果你将外部 cache 关掉,减 少一些 RAM 之後核心就编译成功了,你大概只会觉得可疑. 告诉人们他的硬体有问题常会使人困扰.不过,这不是我发明的. 这是一个 FAQ -- 可以在 [18]http://www.bitwizard.nl/sig11/ 找到. 7.4 新版的核心似乎不能启动 你没有执行 LILO ,或是没有正确的配置它.有一次我曾经碰到的问题是出在配 置档里, 我用了 `boot = /dev/hda1' 而不是 `boot = /dev/hda' (这在刚开始 时真的是很讨厌,但是一旦你有了一个可以用的配置档,应该不需要去再去改变 它). 7.5 你忘了执行 LILO,或系统根本不能启动 噢!现在最好的办法是用磁片启动,并且准备另一张可以启动的磁片(像是`make zdisk'时做的磁片). 你得知道你的根目录(/)所在的分割区以及它的格 式(second extended, minix 等等). 在下面的例子中,你也得知道你的 /usr/src/linux 原始程式码在那个分割区,它的格式,以及它一般会挂在那儿. 在这个例子中, 根目录 / 是 /dev/hda1,而持有 /usr/src/linux 的分割区是 /dev/hda3,一般会挂在 /usr 下. 它们都是 second extended 档案系统.可以 运作的核心映像叫做 zImage ,放在 /usr/src/linux/arch/i386/boot 底下. 这个主意是这样的,假若有一个可以运作的核心映像叫做 zImage,可能可以把它 用在新的磁片上. 另外一个不一定会更好的变通办法(这跟你的系统怎麽组成的 有关)在说明这个例子之後会讨论到. 首先,从 boot/root 磁片或者是急救磁片开机,然後将持有可运作核心的分割区 挂上来: mkdir /mnt mount -t ext2 /dev/hda3 /mnt 如果 mkdir 指令显示该目录已经存在,忽略掉不必理会它. 现在,cd 到持有可 运作核心的地方.注意:/mnt + /usr/src/linux/arch/i386/boot - /usr = /mnt/src/linux/arch/i386/boot 把一张格式化过的磁片放进 ``A:'' 磁碟机(确定不是你的 boot/root 磁片!), 把映像档倾倒到磁片里去,然後配置你的根目录分割区: cd /mnt/src/linux/arch/i386/boot dd if=zImage of=/dev/fd0 rdev /dev/fd0 /dev/hda1 cd 到根目录 / 并且卸下标准 /usr 分割区: cd / umount /mnt 你现在应该可以从这张磁片正常的开机了.在这次开机後不要忘记执行 lilo (或 是其它你曾经做错的什麽事)! 如同前面曾经提过的,还有另外一种很普遍的变通方式. 如果情况是你有一个可 以运作的核心在放在 / (例如 /vmlinuz),你也可以使用它. 假定所有的条件都 跟上面的例子一样,而我的核心映像是 /vmlinuz,只要对上面的例子做这些改 变: 把 /dev/hda3 改成 /dev/hda1 (/ 分割区), 把 /mnt/src/linux 改成 /mnt,并且把 if=zImage 改成 if=vmlinuz. 至於前面有关注意如何推导出 /mnt/src/linux/arch/i386/boot 的那个部分可以忽略. 将 LILO 使用在大的硬碟上(超过 1024 磁柱)可能会有问题. 请参见 LILO mini-HOWTO 或其它文件的说明. 7.6 系统表示 `warning: bdflush not running' 这可以算是一个相当严重的问题.从 1.0 版以後的核心开始(大概是在 1994 年 四月二十日左右), 有个会周期性地更新档案系统缓冲区的程式叫做 `update' 被升级或取代掉了. 取得 `bdflush' 的原始程式码(你应该可以从你取得核心的 地方找到), 然後编译它(你可能会希望在旧版的核心下执行编译及安装). 它会 以 `update' 为名安装它自己并且在重开机以後,新核心应该会运作良好. 7.7 系统说 undefined symbols 而且无法编译 你可能有一 ELF 编译器(gcc 2.6.3 或以後的)而且是 1.2.x (或更早的)核心原 始码. 一般修正的方法是将这几行加到 arch/i386/Makefile 的顶端: AS=/usr/i486-linuxaout/bin/asLD=/usr/i486-linuxaout/bin/ld -m i386linuxCC=gcc -b i486-linuxaout -D__KERNEL__ -I$(TOPDIR)/include 这会以 a.out 程式库来编译 1.2.x 核心. 7.8 无法让我的 IDE/ATAPI CD-ROM 正常工作 很奇怪,一大堆人无法让他们的 ATAPI 光碟机工作,可能是因为有太多事容易出 错. 你的光碟机是在一特别 IDE 界面上的唯一设备,它必须被调整为 ``master'' 或 ``single''. 这可能是最常见的错误. Creative Labs 现在将 IDE 界面放到他们音效卡里. 然而,这将导致一个有趣 的问题,虽然有些人只有一个 IDE 界面,许多人在主机板上有两个内建的 IDE 界面(通常在 IRQ15), 因此一解决的办法是将声霸卡的界面调成第三个 IDE (有 人告诉我是 IRQ11). 这在 1.2.x 的 Linux 核心上会有问题,因为它不支援第三个 IDE 界面(从 1.3.x 系列已开始支援,但它还在发展中,而且不会自动侦测). 要解决此问题 ,你有一些选择. 如果你已经有第二个 IDE 埠,如果你没用它或没有两部设备在上面的话就有机会 . 将 ATAPI 光碟机从音效卡上拿下来并放到第二个界面上.然後你可以关掉音 效卡上的界面,这就可以省下一个 IRQ. 如果你没有第二个 IDE 界面,调整音效卡的界面(不是音效卡的音效部份)到第二 界面用的 IRQ15,这样应该会动. 如果因为某些理由非得使用``第三个''界面不可,或是有其它问题, 取得 1.3.x 的核心(例如 1.3.57 就有),阅读 drivers/block/README.ide 档案. 那 里有更多的资讯说明. 7.9 系统显示关於 obsolete routing requests 的奇怪讯息 取得新版的 route 程式及其它与 route 有关的程式. /usr/include/linux/route.h (这是 /usr/src/linux 下的一个档案)已经做了修 改. 7.10 防火墙功能无法在 1.2.0 上工作 至少升级到 1.2.1 版. 7.11 ``Not a compressed kernel Image file'' (非压缩核心映像档) 不要用在 /usr/src/linux 产生的 vmlinux 做为你的启动核心映像; [..]/arch/i386/boot/zImage 才是正确的. 7.12 升级至 1.3.x 後在控制台终端机上的问题 将控制台设定档 /etc/termcap 中的 dumb 改为 linux. 你可能会必须增加一项 terminfo. 7.13 核心升级後似乎无法编译东西 Linux 的核心原始程式码包含了许多的含入档(就是用 .h 结尾的档案)必须为标 准的 /usr/include 所参考. 它们通常用这种方法被参考(其中 xyzzy.h 是在 /usr/include/linux 下): #include <linux/xyzzy.h> 正常情况下,在 /usr/include 下会有一叫做 linux 的连结到你的核心原始码的 include/linux 目录(一般系统在 /usr/src/linux/include/linux). 如果这个 连结没有了,或指到错误的地方,大部份的东西都将无法编译. 如果你觉得核心 原始码占了太多的空间而砍掉它,这显然会引发问题. 另一个可能的错误是它的 档案权限; 如果你的 root 预设不让其它使用者看到他的档案, 而且你解开核心 原始码时没有加上 p (保留档案模式)选项,其它使用者也会无法使用 C 编译器 . 虽然你可以用 chmod 指令来修正,不过更容易的方法是重新解开含入档. 你 可以一开始你解开整个原始码的同样方法,不过多加了一个参数: blah# tar zxvpf linux.x.y.z.tar.gz linux/include 请注意: 如果 /usr/src/linux 连结不在的话 ``make config'' 会重建之. 7.14 增加上限
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -