歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux內核 >> linux內核的編譯

linux內核的編譯

日期:2017/2/27 9:23:14   编辑:Linux內核
1. 要怎麽進行核心的配置? 1.1. 取得原始程序碼 你可以經由 FTP 從 ftp.funet.fi 或是 mirror in /pub/OS/Linux/PEOPLE/Linus 取 得原始程序碼。也可以到這個節點的 mirror 或其他節點去拿。檔案名稱一般是以標記 成 linux-x.x.x.tar.gz 為代表,其中的 x.x.x 是版本編號。較新的(更好的?)版 本以及修補檔一般是放在類似”v1.1 ”以及”v1.2”這樣的子目錄下。 強烈建議你去找 mirror 的 ftp 節點,而不要直接到 ftp.funet.fi 去!底下是一些 mirrors 以及其他節點的簡要列表 ( ftp.funet.fi 的 mirror 節點:) Germany: ftp.Germany.EU.net UK: doc.ic.ac.uk Australia: kirk.bu.oz.au ( 其它有擺放核心檔案的節點:) USA: tsx-11.mit.edu USA: sunsite.unc.edu Germany: ftp.dfv.rwth-aachen.de 如果你沒有辦法上 ftp ,有個存放 linux 的 BBS 系統列表會定期刊登在 comp.os.linux.announce 上,試著到那邊去找點幫助。 1.2. 解開原始程序碼的包裝 確定你是以″ root ″的身份簽入,然後 cd 到 /usr/src 。如果你的 linux 是從其 它任何可能的地方取得的,在這個目錄底下應該已經存在一個叫做” linux ”的子目 錄。這是舊版的 linux 原始程序碼。如果你還有磁碟空間而且想要玩得安全一點,那 麽你會想要保留這個子目錄的。有個好主意是根據你目前使用的核心版本來修改這個子 目錄的名稱。″ uname -r ″這個指令將會告訴你新的版本。 所以,如果″ uname -r ″顯示″ 1.1.47,″你就可以把″ linux ″改名為 ″ Linux-1.1.47 。″如果你是個魯莽型的人,那就直接把這個子目錄清除掉。無論是 哪一種情況,反正只要確定在解開全部的原始程序碼之前, /usr/src 目錄下沒有 ”linux ”這個子目錄就對了。 在 /usr/src 目錄下,用″zcat linux.x.x.tar.gz tar xvf- ″來解開原始程序碼 的包裝(你也可以用更簡單的″ tar zxvf linux.x.x.x.tar.gz″;如果你拿到的是 ..tar 的檔案(後面沒有加上 gz ),那就用” tar xvf linux.x.x.x.tar ”)。你 將會看到原始程序的內容飛逝而過。當它完成以後,將會出現一個新的″ linux ”子 目錄。 ″ cd ″到 linux 目錄下然後查看 README 檔,裡面應該會有一段標題為 ″INSTALLING the kernel″ 或類似的文字。如果適當的話,先執行說明裡的指示 — 建立該有的符號鏈結,移除過時的 .o 檔案等等等諸如此類的工作。 1.3. 配置核心 注意:這部份內容有些是重覆 Linus 的 README 檔案中的相應章節或加以修訂。 在 /usr/src/linux 下執行″ make config ″ 這個命令將會啟始一個指令稿,而這個 指令稿會問你各種問題。它需要 bash ,所以要確定 bash 是 /bin/bash,/bin/sh 或 $BASH 。 你現在該准備好回答這些問題,通常用″ y ″或″ n ″就可以了。有一些很明顯或是 不重要的選項將不會在此加以說明。 1.3.1. Kernel math emulation (核心的浮點運算模擬) 如果你沒有數學輔助運算處理機(ie,你只有一台單純的 386 或 486SX ),那麽你在 這裡要回答″ y ″。如果你已經有數學輔助運算處理機卻還回答″ y ″,那也不必太 擔心 — linux 還是會去使用它而忽略掉核心的模擬程序。唯一的影響是編譯出來的核 心變大了。 1.3.2. Normal harddisk support (標准硬碟支援) 你在這裡差不多都得回答″ y ″。它代表的意思是核心將會支援標准的 PC 磁碟,例 如大多數人使用的 IDE 界面硬碟。這不包括 SCSI 設備的支援。 1.3.3. Networking support (網絡支援) 如果你有連接網絡,譬如說,你與 internet 有連線,或是你將使用 SLIP,PPP,term 或其它方式撥接到 internet 上的話,回答″ y 。″ 1.3.4. Limit memory to low 16MB (限制記憶體在 16 MB) 如果你的記憶體不到 16 MB,幾乎一定要回答″ y ″;那麽當你使用這個核心的時候 將會節省一點記憶體。但是,當然羅,如果你有 16 MB 以上的記憶體而不回答″ n ″ 的話,這個新的核心將只使用其中的 16 MB ,即使你有 34 billion megs 也一樣。 也可能會有一些不良的 386 DMA controllers(或是一些與硬件有關的東西)無法正確 地定址到 16 megs 以上的記憶體位址;你的機器剛好有這種情況時(罕見),那麽你 也就只好回答″ y ″了。 1.3.5. Use -m486 flag for 486-specific optimizations (使用 -m486 旗標指定對 486 做最佳化) 這將會為核心做 486 最佳化處理。新的核心將會變得稍微大一些,如果你擔心的話的 話,其實它還是可以在 386 上執行。只是會比較慢,不過你感覺不出來的。 1.3.6. SCSI support (SCSI 的支援) 如果你有 SCSI 設備,那麽就回答” y 。”接著會有提示要求更進一步的資訊,像是 你是否要支援光碟機,磁碟機,還有你使用的是那一種 SCSI 介面卡。這部份請參閱 SCSI-HOWTO ,有更詳細的說明。 1.3.7. Network device support (網絡設備支援) 如果你有以太網絡卡,或者你想要使用 SLIP,PPP,或是並列埠界面卡,那就回答 ″ y ″,接著會有提示問你使用的是那一種網絡卡,或要使用那一種串列通訊協定。 1.3.8. Filesystems (文件系統) 這將會有提示要你回答所要支援的文件系統種類,計有: Standard( minix )— 新的套件不再建立 minix 文件系統,而且很多人不使用它, 但是把它配置在核心裡仍然是個好主意。某些″ rescue-disk ″ 程序會用到它,而且 仍然有許多磁片可能用 minix 文件系統,因為 minix 文件系統對於處理磁片方面是最 好的。 Extended fs — 這是擴充文件系統的第一版,現在已經不再使用。使用的時機是,如 果你有需要,你就會知道的。 Second extented — 這是現在新發行的套件所廣泛采用的文件系統,你可能會有其中 一種。 xiafs filesystem — 這個文件系統曾經一度很普遍,但是在寫這份文件時,我已經不 知道有任何人在使用它了。 msdos — 嗯,你猜對了;如果你想要在 linux 下使用你硬碟中的 MS-DOS 分割區,或 是想將用 MS-DOS 格式化的磁片掛進來的話,回答″ y ″。 ums-dos — 這是一個相當 slick 的文件系統,它能使 MS-DOS 文件系統擁有更多的特 性,像是長檔名等等。這對那些不使用 MS-DOS 的人(像我)並不是很有用。 /proc — 這是最 slick 的文件系統之一(我猜這個概念是無恥地從貝爾實驗室裡偷過 來的)。它不是你硬碟分割區裡的任何東西,而是核心與程序之間的文件系統介面。許 多程序工具(像″ ps ″)都會用到它。 如果你已經將它安裝好了,有空不妨試試看″ cat /proc/meminfo ″或者是 ″ cat /proc/devices ″。有些 shells ,像是 rc ,會用 /proc/self/fd(在其它 系統上為 /dev/fd )來處理輸出入。幾乎可以確定你在這裡得要回答″ y ″,有許多 重要的 Linux 標准工具是靠它來運作的。 NFS — 如果你在網絡環境下而且想要分享檔案,回答″ y 。″ ISO9660 — 絕大部分的光碟都使用這個文件系統。 OS/2 HPFS — 在編寫這份文件的時候,這個文件系統還只支援到 OS/2 HPFS 的讀取。 System V and Coherent — 這是為 System V 以及 Coherent 的分割區而設的。 1.3.8.1. 但是我不知道我需要那些文件系統! 好吧,鍵入″ mount 。″它看起來會像這樣: blah% mount /dev/hda1 on / type ext2 (defaults) /dev/hda3 on /usr type ext2 (defaults) none on /proc type proc (defaults) /dev/fd0 on /mnt type msdos (defaults) 仔細看看每一行;在” type ”後面的那個字就是文件系統的格式。在這個例子中,我 的 / 和 /usr 分割區是 second extended 格式,我有使用 /proc ,而且掛有一張以 msdos (bleah) 為文件系統格式的磁片。 如果你有使用 /proc ,可以試試″ cat /proc/filesystems ″。它會給你一份目前使 用的核心所支援的文件系統列表。 1.3.9. Character devices (字元設備) 在這裡,你將會發現許多設備名稱,用來設定你的印表機,匯流排滑鼠,PS/2 滑鼠( 大部分筆記型電腦使用內建的 PS/2 滑鼠),以及一些磁帶機驅動程序,selection 。 當有合適的選項時,回答” y ”。 注意:” Selection ”讓你能夠執行一個程序,這個程序使你可以在 X-windows 之外 使用滑鼠在各個虛擬控制台間做剪貼的動作。如果你有串列滑鼠的話,這真的很棒,因 為它與 X-windows 之間的溝通良好,然而在編寫這份文件的時候,它跟 PS/2 滑鼠還 是處不來(它會鎖住滑鼠所使用的埠,使得你在殺掉這個 selection 程序之前都不可 能執行 X-windows 。)。 1.3.10. Sound card (聲卡) 如果你對於讓隔壁的人保持清醒有興趣的話,回答″ y ,″然後等一下會有一個配置 程序編譯並詳細詢問你所有關於你的聲卡的問題。 1.3.11. kernel hacking >這是從 Linus 的 README 裡摘錄的: ″ kernel hacking ″配置的細節通常會產生一個更大或是更慢的核心(或者是又大又 慢),而且可能因為將一些常式配置成很活躍地去嘗試中斷一些不良的程序碼以便找出 核心裡的問題( kmalloc() ),而使得核心變得比較不穩定。所以要產生一個核心″ 產品 ″的話,你在這裡應該回答″ n ″。 1.4. 現在呢?( The Makefile ) 現在應該會有一個訊息告訴你核心已經配置好了,以及要你去″ check the top-level Makefile for additional configuration,”等等。 所以查看一下 Makefile。你應該不必改變它,但是看看無妨。一旦新核心完成, 你也可以用″ rdev ″指令來改變其中的選項。 2. 編譯核心 2.1. 清除與確認 當用來進行配置的指令稿執行完成時,它會告訴你去做″ dep ″跟″ clean 。”所以 要執行″ make dep 。″除非你的電腦真的很慢,否則它不會花太久時間的。Making depend 確定你已經具備所有必需的要件,像是含入檔以及諸如此類的東西。當它完成 後(你也可以在″ make dep ″之前執行它),執行″ make clean 。″這會清除核心 編譯的所有目的檔以及其它東西。不要忘記這個步驟。 2.2. 編譯時期 在執行清除與確認工作之後,你現在可以執行″ make ″或是″ make zdisk 。″ ″ make ″將會編譯核心,並且留給你一個叫做″ zImage ″的檔案(這一類的東西) 。這就是新的核心。″ make zdisk ″做的事也一樣,但是它會把核心放到你所希望的 磁片去,只要把這張磁片放在 a:。” zdisk ”對於測試新核心很方便;如果它完全 不行,只要把磁片拿掉再用舊的核心啟動即可。 如果你意外地刪除了核心或是什麽的,它也是個方便的啟動辦法。當你把一台磁碟的內 容傾倒到另外一台去時,你也可以用它來安裝新的系統(除了這些之外還有更多用途! NOW how mUCh would you pay ?)。 所有近來的核心都是壓縮過的,所以有個” z ″在名字前面。核心是壓縮過的,當它 執行的時候會自動將自己解壓縮(一個節省磁碟空間的好方法)。 2.3. 其他可以″ make ″的東西 ″ make mrproper ″將會做更廣泛的″清除″。這個動作有時候是必須的,所以你可 能會希望在每次修補的時候執行它。″ make zlilo ″將會安裝核心,然後對它執行 LILO ,使你完成所有開機的准備,但是這只有在 lilo 已經以下列這種方式配置好的 時候才可以:核心為 /vmlinuz , lilo 在 /sbin 下,而且與你的 lilo 配置一致。 2.4. 安裝核心 在你已經獲得一個看起來能夠照你希望運作的新核心之後,現在是安裝它的時候了。大 大部份的人使用 LILO( Linux Loader )來做這件事。這是一個相當容易安裝的軟體 ,然而,它會因為配置檔而困擾人們。如果你沒有最新的版本,查看配置檔(不是舊版 的 /etc/lilo/config 就是新版的 /etc/lilo.conf ),看看裡面有些什麽,它會告訴 你像這樣子的東西: image = /vmlinux label = Linux root = /dev/hda1 ... 首先,″ image = ″是設定為已經安裝的核心。大部份的人似乎都用 /vmlinuz ,但 是我用 /vmlinux 。″ lable ″ 則是由 lilo 用來告訴你現在要啟動的是那個核心或 作業系統,而″ root ″則是這個特別的作業系統的根目錄 / 。備份一份舊的核心( 無論什麽檔名),然後將你做的 zImage 拷貝進去,(例如,如果你用” /vmlinuz ″ 的話,就像這樣″ cp zImage /vmlinuz ”)。 接著重新執行 lilo — 在較新的系統上,你可以只執行″ lilo ,″但是在較舊的系 統上,你可能必須執行 /etc/lilo/install 或甚至是 /ect/lilo/lilo -C /etc/lilo/config 。 如果你想知道更多有關於 lilo 的配置,或是你並沒有 lilo 但是你想要安裝的話,從 你喜歡的 ftp 節點拿最新的版本然後依說明行事。 要能夠從硬碟啟動你的舊核心其中之一的話(這是另一個在新核心出狀況的情況下保護 你自己的方法),把 lilo 配置檔中所有的(包括一行)″ image = xxx ″ 拷貝到檔 案的最底端,然後把″ image = xxx ″改成″ image = yyy ,″其中的″ yyy ″是 你備份舊核心所存檔的名字。接著,把″ lable = xXx ″改成像是” lable = linux- backup。”然後重新執行 lilo 。 你可能得要加上一行″ delay = x ,″其中的 x 是以十分之一秒為單位的時間,這是 用來使 lilo 在啟動前先等一下,所以你可以中斷它的執行(例如用 shift 鍵)。然 後鍵入所備份的啟動映像之 lable (在發生了某些令人不愉快的事情的情況下)。 3. 修補核心 3.1. 使用修補檔 核心的小幅更新是以修補檔的方式發行。例如,如果你的版本是 1.1.45 ,而且你注意 到出現了一個″ patch46.gz ″可以用來升級它,這代表你可以藉由使用這個修補檔將 版本升級到 1.1.46 。你也許會想要先備份 source tree(″make clean ″然後″ cd /usr/src; tar cvf linux gzip -c > old-tree.tar.gz″將會為你造出一份 tar 壓 縮檔,裡面就是整個原始程序碼與其檔案架構。)。 現在接著繼續上面的例子,假設你已經取得了″ patch46.gz ″並放在 /usr/src 下。 cd 到 /usr/src 然後執行″ zcat patch46.gz patch -p0 ″(如果並不是壓縮過的 修補檔,那麽就執行″ patch -p0 < patch46″)你將會看到許多東西飛逝而過(也許 它們會慢慢跳過,如果你的電腦真的很慢的話)告訴你它正試著應用 hunks ,以及是 否成功。 通常,這個過程快得無法仔細看清楚它的動作,所以你會無法確定它到底有沒有成功地 執行。那麽就得找找看一些可能不是那麽順利的事。cd 到 /usr/src/linux 並找尋檔 名有 .reg 的檔案。某些版本的修補檔(比較舊的版本,它們可能是在比較早期的檔案 系統上編譯的)會把這些沒有成功的操作記錄在檔名有 # 的檔案裡。你可以用 ″ find ″來替你找;″ find . -name '*.reg' -print ″會處理這個工作。 如果一切正確無誤的話,執行第二節跟第三節所討論的″ make clean ,″″ config ,″以及″ dep ″。 關於 patch 指令另外還有一些選項。patch -s 將會抑制除了錯誤以外的所有其他訊息 。如果你把核心原始程序碼放在 /usr/src/linux 以外的地方,在該目錄下用 patch -p1 也可以乾淨俐落的執行修補任務。其它的 patch 選項在 manual pages 裡 都有很詳細的描述。 3.2. 如果有錯誤發生 通常最常發生的問題是當 patch 修改一個叫做″ config.in ″ 的檔案時,這個檔案 看起來不怎麽對勁,因為你修改了一些選項來配合你的機器。這個問題已經小心的注意 過了,但還是可能有人會在較舊的版本上遭遇這個問題。 要修正這個問題的話,查看 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? ,″你可能使用了一些比你目 前的版本編號還低的修補檔(並不建議這樣做)。 要還原一個修補檔的話,在原先的修補檔上執行″ patch -R ″。 當修補檔真的失敗的時候,最好的辦法是從一個乾淨的,out-of-the-box source tree (例如從 linux-x.x.x.tar.gz 檔案其中之一)開始,再重新執行。 3.3. 砍掉 .orig 檔案 只要做過幾次修補以後,那些 .orig 的檔案將會開始堆積。例如,我的一個 1.1.51 版的 tree 最後一次做清掃是在 1.1.48 版(我想是吧)。刪除這些 .orig 檔案會節 省許多的磁碟空間。″ find . -name '*.orig' -exec rm -f {} ';' ″將會替你照料 這件事。某些版本的修補檔會用 tilde 來代替 .orig 。 有其它(更好的?)的辦法可砍掉這些 .orig 檔。用的最多的是以″ xargs ″來代替 ″ -exec: ″″find . -name '*.orig xargs rm ″或是″ find . -name '*.orig' -print0 xargs --null rm -- ″(後面這個比較安全。)。 3.4. 其它的修補檔 總是會有一些並不是由 Linus 發行的其它修補檔出現(我將稱之為″非標准的″ )。 如果你使用了它們, Linus 的修補檔可能會而無法正確地執行,那麽你不是得將它們 還原就是得因此而去修改原始程序碼或是修補檔。這個工作對初學者通常是很討厭,所 以,如果你對原始程序碼沒什麽研究,在使用 Linus 的修補檔之前先還原這些非標准 的修補檔。 然後你可以看看這些非標准的修補檔是否仍然可以執行。如果不行的話,那麽你要不就 繼續用舊的核心來修補以執行它們,要不就等別人發表能在你修補後的新核心上用的新 版非標准修補檔。 非標准的修補檔有多普遍?你有可能曾經聽過它們。我使用 Bill Paul 的不閃爍修補 檔來 make 我虛擬控制台上的游標,因為我討厭會閃爍的游標。就我所知,到目前為止 這個特別的修補檔的最新版本是給 1.0 版的核心使用的,但是我仍然在 1.1.51 版下 使用它 — 我已經修改了它好幾次,因為它通常會搞亂 Linus 修補檔的 driver/char/ console.c 。 4. 附加的套件 你的 Linux 核心有許多在核心的原始程序碼本身裡面並沒有說明的特性;這些特性一 般是經由外來的軟體來利用,在這裡列出一部分最普遍的: 4.1. kbd Linux 的控制台有著比你所能吃驚更多的特色。這包括切換字型,重新對映你的鍵盤, 切換顯示模式(比較新的核心)的能力等等。kbd 這套軟體裡有能夠讓使用者做這些動 作的支援程序,還加上一大堆的字型以及幾乎足以適用任何鍵盤的一些鍵盤對映表。 4.2. hdparm 像很多軟體一樣,這曾經是一個核心修補檔及其支援程序。這些修補檔被公認為核心的 一部分,而用來最佳化以及調適你硬碟的支援程序一般是分開發行的。 5. 一些陷阱 5.1. 清除 如果你的新核心會做一些真的很奇怪的事(這曾經發生在我身上),有可能是因為你忘 了做清除( make clean )。症狀從你的核心不正常地崩潰到奇怪的輸出入問題,一直 到可憐的執行效率等等不一而足,可以是任何事。最好也要確定你有做確認( make dep )。 5.2. 巨大或緩慢的核心 如果你的核心占用了大量的記憶體,或者它真的是很大很大,也或者是即使用你全新的 486DX6/440 來編譯卻都還像是永遠編譯不完的話,那麽有可能是因為你配置了太多不 必要的東西(設備驅動程序,文件系統等等)。如果你不會用到某些東西,那就不要配 置它,因為它真的會占用記憶體。 如果你的記憶體少於 16 Megs ,確定你在″ limit memory to low then 16MB ″這個 問題上回答的是″ y ″。這會造成很大的不同(尤其是只有在 4 MB 的系統上)最明 顯的症狀是記憶體與磁碟之間異常大量的資料交換。如果你的磁碟發出很多噪音,檢查 一下你的核心配置。 你可以找出你機器上全部記憶體的數量,然後減掉 /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) 5.3. 核心沒有編譯 如果它沒有被編譯,那麽可能是有個修補檔失敗了,或者是你從某個地方拿到的原始程 式碼有問題。也有可能是因為你的 gcc 版本不正確或壞掉了。確定 Linus 在 README 裡所描述的符號鏈結都有正確建立。一般說來,如果核心沒能編譯,這表示在某些地方 有嚴重的錯誤。 5.4. 新版的核心似乎不能啟動 沒有執行 LILO ,或是沒有正確的配置它。有一次我曾經碰到的問題是出在配置檔裡, 我用了″ root = /dev/hda ″而不是″ root = /dev/hda1″(這在剛開始時真的是 很討厭,但是一旦你有了一個可以用的配置檔,應該不需要去再去改變它) 5.5. 你忘了執行 lilo ,或系統根本不能啟動 噢!現在最好的辦法是用磁片啟動,並且准備另一張可以啟動的磁片(像是” make zdisk ”時做的磁片)。你得知道你的根目錄( / )所在的分割區以及它的格式( second extended, minix 等等)在下面的例子中,你也得知道你的 /usr/src/linux source tree 在那個分割區,它的格式,以及它一般會掛在那兒。 在這個例子中, 根目錄 / 是 /dev/hda1 ,而持有 /usr/src/linux 的分割區是 /dev/hda3 , 一般會掛在 /usr 下。它們都是 second extended 文件系統。可以運作 的核心映像叫做 zImage ,放在 /usr/src/linux 底下。 這個主意是這樣的,假若有一個可以運作的核心映像叫做 zImage 在 /usr/src/linux 下,可能可以把它用在新的磁片上。另外一個不一定會更好的變通辦法(這跟你的系統 怎麽組成的有關)在說明這個例子之後會討論到。 首先,從 boot/root 磁片或者是 rescue 磁片開機,然後將持有可運作核心的分割區 掛上來: mkdir /mnt mount -t ext2 /dev/hda3 /mnt 如果 mkdir 指令顯示該目錄已經存在,忽略掉不必理會它。現在,cd 到持有可運作核 心的地方(注意: /mnt + /usr/src/linux - /usr = /mnt/src/inux )。把一張格式 化過的磁片放進 a: 磁碟機,(確定不是你的 boot/root 磁片!),把映像檔傾倒到 磁片裡去,然後配置你的根目錄分割區。 cd /mnt/src/linux 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/linx 的那 個部分可以忽略。 5.6. 系統表示” Warning: bdflush not running” 這可以算是一個相當嚴重的問題。從 1.0 版以後的核心開始(我記不清楚確實的版本 了,但大概是在 1994 年 4 月, 20 日左右),有個會周期性地更新文件系統緩沖區的 程序叫做″ update ”被升級或取代掉了。 取得″ bdflush ″的原始程序碼(你應該可以從你取得核心的地方找到),然後編譯 它(你可能會希望在舊版的核心下執行編譯及安裝)。它會以″ update ″為名安裝它 自己,而在此之後你的新核心應該會運作良好。 5.7. 系統顯示關於 obsolete routing requests 的奇怪訊息 取得新版的 route 程序,並且重新編譯舊的要件。 /usr/src/linux/route.h (這是 /usr/src/linux 下的一個檔案)已經做了修改。 6. □訣和技巧 6.1. 重導 make 或是 patch 指令的輸出 如果你想要記錄這些″ make ″或是″ patch ″ 指令到底做了些什麽,你可以把螢幕 的輸出重導到一個檔案去。首先,要知道你用的是是那一種 shell:″ grep root /etc/passwd″ 然後尋找看起來像″ /bin/csh ″一類的東西。 如果你使用的是 sh 或是 bash ,″ (command) 2>&1 tee (output file) 。″將會 把一份 make 的輸出放到″ (output file) ″這個檔案去。 如果是 csh 或 bash,你應該使用″ (command) & tee (output file) ″這個語法。 如果是 rc(注意:你應該不會是用 rc ),語法是″ (command) >[2=1] tee (output file) 。" 7. Misc 7.1. Author The original revision was -0.1 on 3 October 1994 by Brian Ward ([email protected]). Please send me any comments, additions, corrections, or computers. Corrections are, in particular, the most important to me! Even though I try to be attentive as possible with mail, please remember that I get a lot of mail per day, so it may take a little time to get back to you. Especially when emailing me with a question, please try extra hard to be clear and detailed in your message. I'd like to thank everyone who's given me feedback. 7.2. History and other forms of this document I originally wrote this in ASCII, then I put some TeX around it, and then horrified the TeX so that I could convert the TeX into SGML with a perl script. Because of the original in TeX, the first version of this document that appeared on sunsite had two section numbers with each section (It wouldn't have looked that bad if they weren't different.). I also realize that it's kind of nonstandard to make revision numbers negative, but oh well. And if any of the above sounds kind of stupid, I don't blame you. 7.3. To do The ``Tricks and tips'' section is a little small. I hope to eXPand on it with suggestions from others. So is ``Additional packages.'' More debugging/crash recovery info needed. 7.4. Contributions A small part of Linus' README (Re: kernel hacking options) is inclusive. (Thanks, Linus!) [email protected] (Ulrich Callmeier): patch -s and xargs. [email protected] (Daniel Quinlan): corrections and additions in many sections. [email protected] (Nat MAKAREVITCH): mrproper The people who have sent me mail with questions and problems have been helpful, too! 7.5. Copyright notice and copying Copyright (c) Brian Ward, 1994, 1995. This document may be distributed in any medium as long as it and this notice remain unaltered. Permission is granted for translation into any language, so long as the translator's name is added to the document. There is no warranty on this document and its contents; no one may be held liable for any unfortunate outcome of its content. Commercial redistribution is allowed and encouraged; however, it is strongly recommended that the redistributor contact the author before the redistribution, in the interest of keeping things up-to-date. The same is true for translations. --------------------------------------------------------------------------- Linux 2.0 Kernel Changes --------------------------------------------------------------------------- [ 簡介 ] [ 目前版本 ] [ 升級須知 ] [ 如何得知目前程序的版本 ] [ 該到哪裡去抓這些更新檔案 ] [ 其他 ] [ 後記 ] --------------------------------------------------------------------------- 簡介 ****** 這份文件包括一些 Linux 下重要 package 的最新版的資訊,希望能幫助初次 接觸、升級為 kernel 1.3.xx 的使用者能成功無誤的使用新的 kernel。希望 (雖 然我知道一定會希望落空的...) 以後不會再看到有人問:『為什麽我的 make 不 能用了?』『怎麽 ps aux 每次都出錯?』..... 這份文件理論上應該是 Linux kernel Documentation/Changes 的翻譯,不過能力有限,如果你發現有看不懂的 地方,建議還是翻翻原文吧.... :) ---------------------------------------------------------------------- 目前版本 ********** - Kernel modules 穩定版: 1.3.57, 測試版: 1.3.69k - PPP daemon 穩定版: 2.2.0f - Dynamic linker (ld.so)1.7.14 - GNU CC 2.7.2 - Binutils 2.6.0.14 - Linux C Library 穩定版: 5.2.18, Beta 測試版: 5.3.12 - Linux C++ Library 2.7.1.4 - Termcap 2.0.8 - Procps 0.99a - Gpm 1.09 - SysVinit 2.62 - Util-linux 2.5 ---------------------------------------------------------------------- 升級須知 ********** Network errors ================ 許多網絡的 script 的初始設定會在啟動的時候加個 route 到 localhost (127.0.0.1),但是他們的方法錯誤。要解決這個問題,從你的網絡設定檔裡面 找出 "route add -net 127.0.0.1" 並改成 "route add -net 127.0.0.0" 即 可。 這個問題出現在 Red Hat 以及從其延伸出去的系統 (Ex: Caldera)。如果 你正是使用這些系統,修改你的 /etc/sysconfig/network-scripts/ifup-lo, 將 "route add-net $(IPADDR)" 這一行改成 "route add -net 127.0.0.0" 即 可。 Booting Changes ================= kernel 1.3.xx 的 boot 程序做了些改善,現在你可以載入較大的 kernel (bzImage),另外也可以直接由 loader 來啟動 ramdisk (initrd)。有關 initrd 的部份請參閱 Documentation/initrd.txt。如果想編譯較大的 kernel,請使用 下列的 make 參數:bzImage, bzlilo, bzdisk (各相當於 zImage, zlilo 和 zdisk)。如果你想使用這項新功能,你必須升級你的 bootloader。LILO 請升級 為 0.19 (lilo.19.tar.gz),loadlin 請升級到 1.6 (lodlin16.tgz)。如果你使 用的是罕見的 SysLinux 或是 etherboot,最新版本分別為 1.3 和 2.0。 C Library =========== Linux 最新的穩定版 C library 是 5.2.18,如果你從 5.0.9 之前版本升級 為這個版本,請一定務必必須閱讀 release.libc-5.2.18,因為 make 及一些重 要工具可能因升級而無法正常工作。 目前正在 beta 的版本則是 5.3.12。這版本有些重大改變,一些有□的程序 可能會遭遇麻煩 (以前的版本用 free() 來處理不是由 malloc() 傳回的指標沒有 問題,但是新版的 library 就有麻煩了),因此請先仔細閱讀 release.libc-5.3.9! 新版的 library 更正了 dirent 的 bug -- 如果有 define USE_GNU 的話,將會錯將 d->reclen 定義為 d->namlen,但是有些 GNU package 卻是以錯為正,例如 GNU make 3.xx。要更正這項錯誤你必須 path 後重新 compile。(release.libc-5.3.9 中有 make 的 patch 以及何處可取得編譯好的 binary) 另外,libc-5.3.x 有保全的漏洞,而 libc-5.3.12 已經補好這個洞。因此如果 你要使用測試版的 library,請記得使用 5.3.12 版。 如果你遇到以下的錯誤訊息: `fcntl_setlk() called by process 123 with broken flock() emulation' 你也必須升級到 5.2.18 版。1.3.x 版 kernel 增加了 BSD 形式的 flock 系 統呼叫,如果你使用舊版的 library 就會有這個錯誤訊息。不過這訊息一點影響 也沒有,因此你可以忽略不管。如果你覺得這個訊息很煩,那就升級你的 library 吧。如果你又煩又懶,那直接把 kernel fs/locks.c 裡面的 printk(KERN_WARNING "fcntl_setlk() called by process %d with broken flock() emulation\n", current->pid); 去掉然後重新 compile。如果你是使用 aout 格式,你可以升級成 libc-4.7.6 來解決這個問題。 Termcap Library ================= 目前 Termcap 的版本是 2.0.8。如果你升級成這個版本,請閱讀 README, 取得有關 tegtent 函式更改的重要訊息。 Procps Utility ================ kernel 1.3.x 的 /proc 結構已經改了,因此你必須將 proc 升級為 0.99a 版 而在最新的 kernel 中,檔案結構又再次更改,但是 procps 還沒有個正式升級版 反應這個改變,所以還是使用 0.99a 吧。你也可以找找流傳在外解決讓 0.99a 可以 和 kernel 1.3.94 相容的 patch。 Kernel Modules ================ kernel 1.3.x 版幾乎已經全部模組化了,也加入了 kerneld。想使用個功能, 你必須更新到最新版的 modules。目前最新的穩定版 modules 是 1.3.57 (注), beta 版則到了 1.3.69k。這些都可以在你抓 kernel 的同一地點取得,或是到 它的 Homepage:http://www.pi.se/blox/modules/index.Html。注意:如果你載入 modules 會出現以下的訊息: gcc2_compiled, undefined Failed to load module! The symbols fromkernel 1.3.foo don't match 1.3.foo 那就是該換到 1.3.69 的時候了。會出現這個錯誤是因為你使用最新版的 binutil,因此大部份的人還是停留在 1.3.57 即可。 另外一點要注意的,你不能同時把 a.out 和 ELF 支援編譯成 modules,否則 當你為了能夠使用 insmod 而用 insmod 來載入 a.out/ELF modules 時會有 Catch/22 狀況發生 (這是啥啊?)如果你的系統主要是 ELF 而你偶爾會需要用到 a.out,你可以把 a.out 支援編譯為 modules,否則你最好把它直接放入 kernel 之中。如果你還沒進入 ELF 的世紀 (不會吧..),在 compiler kernel 時可以 直接把 ELF 支援去掉。另外的另外,在開機就會 mount 上來的 partition 的 FS 、device driver 記得要 compiler 進 kernel,不能把它弄成 modules。請不要 誇張到為了完全模組化而忘了把 ext2fs 和 IDE dirver compiler 進 kernel 裡... *注:在 kernel 目錄下已經可以看到 2.0.0 版的 modules 了 PPP driver ============ 你的 pppd 必須是 2.2.0 版或更新。最新的穩定版本是 2.2.0f 可以在 ftp://sunsite.unc.edu/pub/Linux/system/Network/serial/ppp/ppp-2.2.0f.tar.gz 取得。 Named pipes (SysVinit) ======================== Linux 處理 named pipes 的方式改變了 (從 SunOS 方式變成 "正確" 的方式) ,這使得某些程序因此而失效了,最值得注意的就是 SysVinit。如果你的 SysVinit 是 2.59 或更早的版本,在 shutdown 時雖然可以正常工作,但是你會看到這樣 的錯誤訊息:INIT: error reading initrequest 或是這些字不停的在卷動... 如果你使用 NCSA 的 httpd,你必須把 daemon 的 pre-spawn 設為 0,不過我 建議你直接換成 Apache 的 httpd。 新的 named pipes 方式也讓 Hylafax 發生問題,如果你有 Hylafax daemon, 它會不斷用掉 CPU time 直到系統沒有 idle time 為止。要修正這個錯誤,修改 Hylafax 的 port.h,把 CONFIG_OPENFIFO="O_RDONLY" 改成 CONFIG_OPENFIFO="O_RDWR" 類似的處理方式 (把 named pipe 開啟方式從 read only 改成 read/write) 可以解決因這個改變引起的問題。 File Locking (Sendmail) ========================= 從 pre2.0.6 (1.99.6) 以後,file locking 方式不能夠混用,例如:你不能 同時使用 flock 和 fcntl 來鎖住檔案。請參閱 Documentation/lock.txt 取得更 詳細資料。這個對較舊版的 sendmail 造成影響 (注)。如果你發現 sendmail 抱怨 無法 lock aliases.dir (或其他檔案),你必須更新 sendmail 到 8.7.x 版。最 新版的 sendmail 可以在 ftp://ftp.cs.berkeley.edu/ucb/src/sendmail/sendmail.8.7.5.tar.gz 取得。 *注:這個問題在 elm 2.4 pl 25 之中也會發生。 Uugetty ========= 舊版的 uugettys 在新 kernel 裡會有問題,請更新之。 ftp://sunsite.unc.edu/pub/Linux/system/Serial/getty_ps-2.0.7h.tar.gz Kbd ===== 使用非 ASCII 的字元/字型的人,應該升級成: ftp.funet.fi:/pub/OS/Linux/PEOPLE/Linus/kbd-0.91.tar.gz *注:這個我也不太了解,不過我沒升級好像也沒事.... Console ========= Linux 的 console type (雖然知道是什麽東西可是不會翻) 改變了。如果 你的版本太舊了,使用上發生問題 (像說 joe 不能用啦...),該是升級 termcap 的時候了。要修正這個問題,把 linux 加入 /etc/termcap 之中,或是到 http://www.ccil.org/~esr/ncurses.html 逛逛。另外你也需要更新 terminfo。以 root 來做下面的動作: ln -s /usr/lib/terminfo/l/linux /usr/lib/terminfo/c/console 當然,最好的解決辦法,就是去抓最新的 termcap 回來安裝: ftp://sunsite.unc.edu/pub/Linux/GCC/termcap-2.0.8.tar.gz Also, the console driver is now responsible for keeping track of correspondence between character codes and glyph bitmaps. If you encounter problems, try `loadunimap def' to get back the default correspondence. (不太會翻,大概是說如果你的螢幕本來應該顯示文字的確 變成一堆亂碼的話,可以用 loadunimap def 來解決) Hdparm ======== Hdparm 為了利用到新版 kernel 的新功能而作了更新,最新版可以在: ftp://sunsite.unc.edu/pub/Linux/kernel/patches/diskdrives/hdparm-2.7.tar.gz 抓到。(目前已經有看到 2.9 版了) IP Accounting ============= All IP packets coming in or going out via one of the network interfaces are now passing the accounting chain. So, packets being forwarded are passing this chain twice. Since pre2.0.7 (aka 1.99.7), accounting rules can be defined so that they will only match in one direction (either incoming or outgoing). There also exists a possibility to match on device names and/or device addresses, so that only packets coming in/going out via that device (network interface) match with a rule. You'll need to get ipfwadm from ftp://ftp.xos.nl/pub/linux/ipfwadm/ipfwadm-2.1.tar.gz to use this. IP Firewalls ============ The IP firewall code has been changed drastically during 1.3.x. There are now 3 categories of firewall rules: one for incoming packets, one for outgoing packets, and one for packets being forwarded. There also exists a possibility to match on device names and/or device addresses, so that only packets coming in/going out via that device (network interface) match with a rule. This is especially useful to prevent spoofing. You'll need to get ftp://ftp.xos.nl/pub/linux/ipfwadm/ipfwadm-2.1.tar.gz to use this. IP Masquerading =============== IP masquerading is now part of the standard kernel. However, you always need to load separate modules (ip_masq_ftp.o and/or ip_masq_irc.o) if you are going to use FTP or IRC in combination with masquerading. You'll need to get ftp://ftp.xos.nl/pub/linux/ipfwadm/ipfwadm-2.1.tar.gz to use this. (不清楚、不了解、不會用,還是不要亂翻... 不過看起來都跟 ipfwadm-2.1.tar.gz 有關...) ISDN support ============== 新版的 kernel 支援 ISDN,要使用 ISDN 你必須有: ftp://ftp.franken.de/pub/isdn4linux/isdn4k-utils-1.3.97.tar.gz Term is broken ================ Term (一個功能類似 slirp 的東西) 在 kernel 1.3.60 以後就無法使用 了,偏偏作者現在正在渡假中,因此沒有解決的方法。我建議你學著改用 slirp。 Networking ============ /proc/net 裡有些欄位在新 kernel 裡改變了,你必須升級你的 net-tools。 目前最新的穩定版是 net-tools-1.2.0.tar.gz,而最新的 beta 則是 net-tools-1.32-alpha.tar.gz。如果你要升級,或許升級為最新的 beta 版會比 較好。 Xntpd ======= 舊版的 Xntpd 和新版的 kernel 合不來,請升級為 xntp3.5f.tar.Z Sound driver ============== 1.3.x 版 kernel 裡的 sound driver 會讓 vplay 無法使用。要解決這個 問題請抓新版的 sndkit: ftp://ftp.best.com/pub/front/tasd/snd-util-3.5.tar.gz 有些使用者回報說許多音效工具程序 (Ex: cdd2wav-sbpcd) 必須重新 compile 才能在新版的 kernel 下使用。 Tcsh ====== 如果你的 tcsh 在新的 kernel 下舉止怪異,請從 ftp://anise.ee.cornell.edu/pub/tcsh 抓新版的 tsch source,並修改 config_f.h 加入一行:#define SYSMALLOC 你可以在 ftp://sunsite.unc.edu/pub/Linux/system/Shells/ 抓到新版的 binary,這應該會更正這個問題。 Make ====== 如果更新之後 make 卻罷工了,請仔細閱讀你更新的 libc 的 release note。 這並不是 kernel 的錯,不過很多卻誤以為是。當你更新 libc 到 5.3.9 時你 也要更新 make 它才會正常工作。升級 libc 也可能讓 xterm 罷工,如果這不幸 是個事實,請重新 compile xterm。 Loop device ============= 1.3.x 的 kernel 有個 loop device,讓你可以把一個檔案 mount 成一個 file system,然後你可以作些有趣的事情,像是加密的文件系統(encrypted file systems)... 如果你想使用這個功能,你必須更新你的 mount: ftp://ftp.win.tue.nl/pub/linux/util/mount-2.5X.tar.gz 加密的文件系統可以抓: ftp.funet.fi:/pub/OS/Linux/BETA/loop/des.1.tar.gz Multiple device ================= 新的 kernel 有支援 Multiple device (讓你可以把好幾個 partition 結合成 一個 logic device)。要使用這個功能請抓: ftp://sweet-smoke.ufr-info-p7.ibp.fr/pub/Linux/md034.tar.gz Arp ===== Arp daemon 也加入新的 kernel 之中,請到: http://www.loran.com/~layes/arpd/index.html 取得更多資訊以及 arpd。 Quota ======= 新的 kernel 之中也支援 quota。請抓: ftp://ftp.funet.fi/pub/Linux/PEOPLE/Linus/subsystems/quota/all.tar.gz 然後把裡面的 mntent.h 蓋過 /usr/include/mntent.h,如此就可以快樂的 compile 出 quota 來啦。 Process Accounting ==================== Process accounting 的功能也包含在新版的 kernel 之中。要使用這個 功能請抓: ftp://iguana.hut.fi/pub/linux/Kernel/process_accounting/acct_1.3.73.tar.gz Bdflush ========= bdflush 功能已經加入新 kernel 之中,你不需要再去 patch 就可以 直接擁有這個功能。 AMP ===== 新的 kernel 之中直接支援 AMP (Advanced Power Management)。AMP 主要 使用在膝上型電腦,讓你監視目前電池的使用狀況,也可以幫你節省電池的電力 。要發揮這項功能請抓: ftp://tsx-11.mit.edu/pub/linux/packages/laptops/apm/apmd-2.4.tar.gz iBCS and DOSEMU ================= 要支援 1.3.x 的 iBCS,請抓: ftp://tsx-11.mit.edu/pub/linux/BETA/ibcs2/ibcs-1.3-960404-ALPHA.tar.gz 至於可在新 kernel 中使用的 DOSEMU,請抓: ftp://tsx-11.mit.edu/pub/linux/ALPHA/dosemu/Development/dosemu-0.63.1.19.tgz 記得照 README.newkernel 裡面所說的更新你的 /usr/include/sys/vm86.h, 否則將無法 compile。 Mtools and Fdutils ==================== 在 1.3.x kernel 之中,軟碟的控制程序已經改變,但是為了向前相容,在 2.0 之前的 kernel 舊的程序還是可用,不過會顯示警告訊息,但是到 2.1.x 時 舊程序將完全消失。 為了避免問題 (或說是免除那惱人的訊息),你必須重新編譯所有會用到軟碟 控制的程序,像是 mtool 及 fdutil。請抓: ftp://sunsite.unc.edu/pub/Linux/utils/disk-management/mtools-3.0.src.tar.gz ftp://sunsite.unc.edu/pub/Linux/system/Misc/fdutils-4.3.src.tar.gz 在將來,fdformat 將會完全消失,所以請僅早學會 superformat 的使用方法。 ---------------------------------------------------------------------- 如何得知目前程序的版本 ************************ GNU CC: gcc -v and gcc --version PPP: pppd -h (wrong but it show the version) Libc: ls -l /lib/libc.so.5 Libc++: ls -l /usr/lib/libg++.so Binutils:ld -v ldd: ldd -v and ldd -V termcap: ls -l /lib/liBTermcap.so.* modules: insmod -V procps: ps --version ---------------------------------------------------------------------- 該到哪裡去抓這些更新檔案 ************************** 請愛用 CCCA ftp 及 ARCHIE..... ---------------------------------------------------------------------- 其他 ******




Copyright © Linux教程網 All Rights Reserved