?? 072.htm
字號(hào):
<HTML><HEAD><meta http-equiv="Content-Type" content="text/html; charset=GB2312"><TITLE>-->Linux HowTo 中譯版-->Kernel HOWTO 中譯版 : 一些陷阱</TITLE>
<META NAME="keywords" CONTENT=" Linux HowTo 中譯版 Kernel HOWTO 中譯版 : 一些陷阱">
<META NAME="description" CONTENT=" - Linux HowTo 中譯版 - Kernel HOWTO 中譯版 : 一些陷阱">
<style>
<!--
#page {position:absolute; z-index:0; left:0px; top:0px}
.tt3 {font: 9pt/12pt "宋體"}
.tt2 {font: 12pt/15pt "宋體"}
a {text-decoration:none}
a:hover {color: blue;text-decoration:underline}
-->
</style>
</HEAD>
<body text="#000000" aLink=#9900ff link=#006699 vLink=#006699 bgcolor="#FFFFFF" leftmargin="3" topmargin="3" marginheight="3" marginwidth="3">
<TABLE WIDTH="100%" CELLPADDING=10 CELLSPACING=0 BORDER=0>
<TR>
<TD CLASS="tt3" VALIGN="top" width="8%" bgcolor="#e0e0e0"><strong><A HREF="073.htm">后一頁</A><BR>
<A HREF="071.htm">前一頁</A><BR>
<A HREF="index.html">回目錄</A><BR>
<A HREF="../../../../index.htm">回首頁</A><BR>
</strong>
</TD>
<TD class="tt2" bgcolor="#F5F8F8" width="84%"><center><B><FONT style="FONT-SIZE: 16.5pt" COLOR="#FF6666" FACE="楷體_GB2312">Kernel HOWTO 中譯版 : 一些陷阱</FONT></B></center>
<hr color="#EE9B73" size="1" width="94%">
姓名:Brian Ward<br>
Email:bri@blah.math.tu-graz.ac.at<br>
地址 :<br>
轉(zhuǎn)摘 :http://member.netease.com/</p>
<BR>
<BR>
<hr SIZE="0">
<BR>
<p>7. 一些陷阱 <br>
7.1. make clean <br>
如果你的新核心會(huì)做一些真的很奇怪的事,有可能是因?yàn)樵诰幾g核心前你忘了做清除
make clean.
癥狀從你的核心不正常地崩潰到奇怪的輸出入問題,一直到可憐的執(zhí)行效率等等不一而足,可以是任何事.
最好也要確定你有做 make dep. <br>
<br>
7.2. 巨大或緩慢的核心 <br>
如果你的核心占用了大量的記憶體,或者它真的是很大很大,也或者是即使用你全新的
786DX6/440 來編譯卻都還像是永遠(yuǎn)編譯不完的話,
那麼有可能是因?yàn)槟闩渲昧颂嗖槐匾臇|西(設(shè)備驅(qū)動(dòng)程式,檔案系統(tǒng)等等).
如果你不會(huì)用到某些東西,那就不要配置它,因?yàn)樗娴臅?huì)占用記憶體.
核心過於臃腫最明顯的癥狀就是發(fā)生記憶體與磁碟之間異常大量的資料交換.
如果你不是用那種聲音聽起來好像是噴射機(jī)降落的舊型 Fujitsu Eagles
硬碟,檢查一下你的核心配置. <br>
<br>
你可以找出你機(jī)器上全部記憶體的數(shù)量,然後減掉 /proc/meminfo 里面的
``total mem'' 或 `free'
指令所得的記憶體數(shù)量來得知核心使用了多少記憶體.
你也可以執(zhí)行 `dmesg' (或者也可以查看核心的記錄檔,它一定在會(huì)你的系統(tǒng)里).看起來就像這一行:
<br>
<br>
Memory: 15124k/16384k available (552k kernel code, 384k reserved, 324k data) <br>
<br>
我的 386 (配置很少垃圾)顯示如下: <br>
<br>
Memory: 7000k/8192k available (496k kernel code, 384k reserved, 312k data) <br>
<br>
如果你`必須'得到一大型核心但系統(tǒng)卻不讓你做,你可以試試 `make
bzimage'. 你可能必須安裝新版的 LILO 來做這件事. <br>
<br>
7.3. 核心無法編譯 <br>
如果它沒有被編譯,那麼可能是有個(gè)修補(bǔ)檔失敗了,或者是你從某個(gè)地方拿到的原始程式碼有問題.
也有可能是因?yàn)槟愕?gcc 版本不正確或壞掉了(例如含入檔有錯(cuò)誤).
確定 Linus 在 README 里所描述的符號(hào)鏈結(jié)都有正確建立.
一般說來,如果核心沒能編譯,這表示在某些地方有嚴(yán)重的錯(cuò)誤,重新安裝某些工具可能是必須的.
<br>
<br>
或者可能你用 ELF 編譯器 (gcc 2.6.3 或以後的) 來編譯 1.2.x 的核心.
如果編譯過程中你得到一大堆的 xxxx undefined
的訊息,這可能是你的問題.
修正的方法大部份都很簡(jiǎn)單.將這幾行加到 arch/i386/Makefile 的頂端:
arch/i386/Makefile: <br>
<br>
<br>
AS=/usr/i486-linuxaout/bin/as <br>
<br>
LD=/usr/i486-linuxaout/bin/ld -m i386linux <br>
<br>
CC=gcc -b i486-linuxaout -D__KERNEL__ -I$(TOPDIR)/include <br>
<br>
然後重新執(zhí)行 make dep 與 zImage. <br>
<br>
在少數(shù)情況下,gcc 可能會(huì)由於硬體問題而當(dāng)?shù)簦e(cuò)誤訊息會(huì)像 ``xxx
exited with signal 15'' 之類的,而且會(huì)看起來很奇怪.
我本來不想提這點(diǎn)的,不過在我身上也發(fā)生過一次 - 我有一些壞的
cache 記憶體,編譯器時(shí)常會(huì)隨機(jī)地當(dāng)?shù)簦?如果你有此問題的話先試著重新安裝 gcc.如果你將外部 cache
關(guān)掉,減少一些 RAM 之後核心就編譯成功了,你大概只會(huì)覺得可疑. <br>
<br>
告訴人們他的硬體有問題常會(huì)使人困擾.不過,這不是我發(fā)明的.
這是一個(gè) FAQ -- 可以在 http://www.bitwizard.nl/sig11/ 找到. <br>
<br>
7.4. 新版的核心似乎不能啟動(dòng) <br>
你沒有執(zhí)行 LILO
,或是沒有正確的配置它.有一次我曾經(jīng)碰到的問題是出在配置檔里,
我用了 `boot = /dev/hda1' 而不是 `boot = /dev/hda' (這在剛開始時(shí)真的是很討厭,但是一旦你有了一個(gè)可以用的配置檔,應(yīng)該不需要去再去改變它).
<br>
<br>
7.5. 你忘了執(zhí)行 LILO,或系統(tǒng)根本不能啟動(dòng) <br>
噢!現(xiàn)在最好的辦法是用磁片啟動(dòng),并且準(zhǔn)備另一張可以啟動(dòng)的磁片(像是`make
zdisk'時(shí)做的磁片). 你得知道你的根目錄(/)所在的分割區(qū)以及它的格式(second
extended, minix 等等). 在下面的例子中,你也得知道你的 /usr/src/linux
原始程式碼在那個(gè)分割區(qū),它的格式,以及它一般會(huì)掛在那兒. <br>
<br>
在這個(gè)例子中, 根目錄 / 是 /dev/hda1,而持有 /usr/src/linux 的分割區(qū)是
/dev/hda3,一般會(huì)掛在 /usr 下. 它們都是 second extended
檔案系統(tǒng).可以運(yùn)作的核心映像叫做 zImage ,放在
/usr/src/linux/arch/i386/boot 底下. <br>
<br>
這個(gè)主意是這樣的,假若有一個(gè)可以運(yùn)作的核心映像叫做 zImage,可能可以把它用在新的磁片上.
另外一個(gè)不一定會(huì)更好的變通辦法(這跟你的系統(tǒng)怎麼組成的有關(guān))在說明這個(gè)例子之後會(huì)討論到.
<br>
<br>
首先,從 boot/root
磁片或者是急救磁片開機(jī),然後將持有可運(yùn)作核心的分割區(qū)掛上來:
<br>
<br>
<br>
<br>
mkdir /mnt <br>
<br>
mount -t ext2 /dev/hda3 /mnt <br>
<br>
<br>
如果 mkdir 指令顯示該目錄已經(jīng)存在,忽略掉不必理會(huì)它. 現(xiàn)在,cd
到持有可運(yùn)作核心的地方.注意: <br>
<br>
<br>
/mnt + /usr/src/linux/arch/i386/boot - /usr = /mnt/src/linux/arch/i386/boot <br>
<br>
把一張格式化過的磁片放進(jìn) ``A:'' 磁碟機(jī)(確定不是你的 boot/root 磁片!),
把映像檔傾倒到磁片里去,然後配置你的根目錄分割區(qū): <br>
<br>
<br>
<br>
cd /mnt/src/linux/arch/i386/boot <br>
<br>
dd if=zImage of=/dev/fd0 <br>
<br>
rdev /dev/fd0 /dev/hda1 <br>
<br>
<br>
cd 到根目錄 / 并且卸下標(biāo)準(zhǔn) /usr 分割區(qū): <br>
<br>
<br>
<br>
cd / <br>
<br>
umount /mnt <br>
<br>
<br>
你現(xiàn)在應(yīng)該可以從這張磁片正常的開機(jī)了.在這次開機(jī)後不要忘記執(zhí)行
lilo (或是其它你曾經(jīng)做錯(cuò)的什麼事)! <br>
<br>
如同前面曾經(jīng)提過的,還有另外一種很普遍的變通方式.
如果情況是你有一個(gè)可以運(yùn)作的核心在放在 / (例如 /vmlinuz),你也可以使用它.
假定所有的條件都跟上面的例子一樣,而我的核心映像是 /vmlinuz,只要對(duì)上面的例子做這些改變:
把 /dev/hda3 改成 /dev/hda1 (/ 分割區(qū)), 把 /mnt/src/linux 改成 /mnt,并且把
if=zImage 改成 if=vmlinuz. 至於前面有關(guān)注意如何推導(dǎo)出
/mnt/src/linux/arch/i386/boot 的那個(gè)部分可以忽略. <br>
<br>
將 LILO 使用在大的硬碟上(超過 1024 磁柱)可能會(huì)有問題. 請(qǐng)參見 LILO
mini-HOWTO 或其它文件的說明. <br>
<br>
7.6. 系統(tǒng)表示 `warning: bdflush not running' <br>
這可以算是一個(gè)相當(dāng)嚴(yán)重的問題.從 1.0 版以後的核心開始(大概是在
1994 年四月二十日左右),
有個(gè)會(huì)周期性地更新檔案系統(tǒng)緩沖區(qū)的程式叫做 `update'
被升級(jí)或取代掉了. 取得 `bdflush' 的原始程式碼(你應(yīng)該可以從你取得核心的地方找到),
然後編譯它(你可能會(huì)希望在舊版的核心下執(zhí)行編譯及安裝). 它會(huì)以
`update' 為名安裝它自己并且在重開機(jī)以後,新核心應(yīng)該會(huì)運(yùn)作良好.
<br>
<br>
7.7. 系統(tǒng)說 undefined symbols 而且無法編譯 <br>
你可能有一 ELF 編譯器(gcc 2.6.3 或以後的)而且是 1.2.x (或更早的)核心原始碼.
一般修正的方法是將這幾行加到 arch/i386/Makefile 的頂端: <br>
<br>
<br>
<br>
AS=/usr/i486-linuxaout/bin/as <br>
<br>
LD=/usr/i486-linuxaout/bin/ld -m i386linux <br>
<br>
CC=gcc -b i486-linuxaout -D__KERNEL__ -I$(TOPDIR)/include <br>
<br>
<br>
這會(huì)以 a.out 程式庫來編譯 1.2.x 核心. <br>
<br>
7.8. 無法讓我的 IDE/ATAPI CD-ROM 正常工作 <br>
很奇怪,一大堆人無法讓他們的 ATAPI
光碟機(jī)工作,可能是因?yàn)橛刑嗍氯菀壮鲥e(cuò). <br>
<br>
你的光碟機(jī)是在一特別 IDE 界面上的唯一設(shè)備,它必須被調(diào)整為
``master'' 或 ``single''. 這可能是最常見的錯(cuò)誤. <br>
<br>
Creative Labs 現(xiàn)在將 IDE 界面放到他們音效卡里.
然而,這將導(dǎo)致一個(gè)有趣的問題,雖然有些人只有一個(gè) IDE
界面,許多人在主機(jī)板上有兩個(gè)內(nèi)建的 IDE 界面(通常在 IRQ15),
因此一解決的辦法是將聲霸卡的界面調(diào)成第三個(gè) IDE (有人告訴我是
IRQ11). <br>
<br>
這在 1.2.x 的 Linux 核心上會(huì)有問題,因?yàn)樗恢г谌齻€(gè) IDE 界面(從
1.3.x 系列已開始支援,但它還在發(fā)展中,而且不會(huì)自動(dòng)偵測(cè)).
要解決此問題,你有一些選擇. <br>
<br>
如果你已經(jīng)有第二個(gè) IDE
埠,如果你沒用它或沒有兩部設(shè)備在上面的話就有機(jī)會(huì). 將 ATAPI
光碟機(jī)從音效卡上拿下來并放到第二個(gè)界面上.然後你可以關(guān)掉音效卡上的界面,這就可以省下一個(gè)
IRQ. <br>
<br>
如果你沒有第二個(gè) IDE 界面,調(diào)整音效卡的界面(不是音效卡的音效部份)到第二界面用的
IRQ15,這樣應(yīng)該會(huì)動(dòng). <br>
<br>
如果因?yàn)槟承├碛煞堑檬褂胉`第三個(gè)''界面不可,或是有其它問題,
取得 1.3.x 的核心(例如 1.3.57 就有),閱讀 drivers/block/README.ide 檔案.
那里有更多的資訊說明. <br>
<br>
7.9. 系統(tǒng)顯示關(guān)於 obsolete routing requests 的奇怪訊息 <br>
取得新版的 route 程式及其它與 route 有關(guān)的程式.
/usr/include/linux/route.h (這是 /usr/src/linux 下的一個(gè)檔案)已經(jīng)做了修改.
<br>
<br>
7.10. 防火墻功能無法在 1.2.0 上工作 <br>
至少升級(jí)到 1.2.1 版. <br>
<br>
7.11. ``Not a compressed kernel Image file'' (非壓縮核心映像檔) <br>
不要用在 /usr/src/linux 產(chǎn)生的 vmlinux 做為你的啟動(dòng)核心映像;
[..]/arch/i386/boot/zImage 才是正確的. <br>
<br>
7.12. 升級(jí)至 1.3.x 後在控制臺(tái)終端機(jī)上的問題 <br>
將控制臺(tái)設(shè)定檔 /etc/termcap 中的 dumb 改為 linux.
你可能會(huì)必須增加一項(xiàng) terminfo. <br>
<br>
7.13. 核心升級(jí)後似乎無法編譯東西 <br>
Linux 的核心原始程式碼包含了許多的含入檔(就是用 .h 結(jié)尾的檔案)必須為標(biāo)準(zhǔn)的
/usr/include 所參考. 它們通常用這種方法被參考(其中 xyzzy.h 是在
/usr/include/linux 下): <br>
<br>
<br>
#include <linux/xyzzy.h> <br>
<br>
正常情況下,在 /usr/include 下會(huì)有一叫做 linux
的連結(jié)到你的核心原始碼的 include/linux 目錄(一般系統(tǒng)在
/usr/src/linux/include/linux).
如果這個(gè)連結(jié)沒有了,或指到錯(cuò)誤的地方,大部份的東西都將無法編譯.
如果你覺得核心原始碼占了太多的空間而砍掉它,這顯然會(huì)引發(fā)問題.
另一個(gè)可能的錯(cuò)誤是它的檔案權(quán)限; 如果你的 root
預(yù)設(shè)不讓其它使用者看到他的檔案,
而且你解開核心原始碼時(shí)沒有加上 p (保留檔案模式)選項(xiàng),其它使用者也會(huì)無法使用
C 編譯器. 雖然你可以用 chmod
指令來修正,不過更容易的方法是重新解開含入檔.
你可以一開始你解開整個(gè)原始碼的同樣方法,不過多加了一個(gè)參數(shù): <br>
<br>
blah# tar zxvpf linux.x.y.z.tar.gz linux/include <br>
<br>
請(qǐng)注意: 如果 /usr/src/linux 連結(jié)不在的話 ``make config'' 會(huì)重建之. <br>
<br>
7.14. 增加上限 <br>
下面一些□例指令告訴你如何增加核心提供的上限: <br>
<br>
<br>
echo 4096 > /proc/sys/kernel/file-max <br>
<br>
echo 12288 > /proc/sys/kernel/inode-max <br>
<br>
echo 300 400 500 > /proc/sys/vm/freepages <br>
<br>
</p>
<BR>
<hr color="#EE9B73" size="1" width="94%">
</TD>
<TD CLASS="tt3" VALIGN="bottom" width="8%" bgcolor="#e0e0e0"><strong><A HREF="073.htm">后一頁</A><BR>
<A HREF="071.htm">前一頁</A><BR>
<A HREF="index.html">回目錄</A><BR>
<A HREF="../../../../index.htm">回首頁</A><BR>
</strong>
</TD>
</TR>
</table>
</BODY></HTML>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -