460 likes | 598 Views
Linux 安裝入門與基本管理 課程目標: 學習 Linux 平台下的安裝設定 與 建置一個基本的 Linux 伺服器 國家高速電腦中心 -- 林尚毅 http://www.lsi.idv.tw/~lsi/ lsigiga@giga.net.tw. Lession 6 Kernel 的更新 與編譯.
E N D
Linux 安裝入門與基本管理 課程目標: 學習Linux平台下的安裝設定 與 建置一個基本的Linux伺服器 國家高速電腦中心 -- 林尚毅 http://www.lsi.idv.tw/~lsi/ lsigiga@giga.net.tw
Lession 6 Kernel 的更新 與編譯
<<摘要>>Linux ﹐其靈魂所在﹐就是它穩定而強大的核心。而事實上﹐Linux 的定義﹐也只是這個核心﹐只是大家目前使用的系統﹐是經過包裝的﹐在核心之外﹐還有各種各樣的套件( 包括不同的 shell )整合一起。如果您有時間﹐而且願意上網路去抓﹐那些套件都可以自己找得到。有些人﹐幫您把核心編好﹐套件也設定好並加以整合﹐同時將安裝程式寫好﹐還提供套件管理工具﹐以及將環境設定妥當﹐然後燒成 CD﹐那就是我們常見的 Linux 套裝系統了。我們稱這些 Linux 套裝系統的發行版本為 Distribution ﹐例如大家聞名的 RedHat﹐Slackware﹐OpenLinux﹐TurboLinux﹐SuSE﹐Debian﹐等等﹐都是 distributions 。不管它們如何包裝﹐但骨子裡頭的東西﹐也就是使用的核心﹐都一樣﹕都是 Linux ﹗
那核心究竟如何定義呢﹖說簡單些﹐就是作業系統(Operating System)﹐它負責處理所有系統的東西﹐包括硬碟的控制﹑記憶體管理﹑行程管理﹑檔案系統﹑網路功能﹑等等。我們可以將核心看成是一個架於程式和硬體之間的界面操作系統﹐離開來核心﹐什麼東西都用不了。而核心的編譯好壞﹐也會影響到系統的效能﹐甚至﹐一些系統功能(如 tcp/ip)﹐就必須要編進核心才行。
簡介 Linux本身便附有核心程式的原始碼,這使得使用者可以很方便的"制造"出一個 核心程式出來,尤其是自行更改或是向外取得某部份原始程式後、或是想要更改對一 些設備的支援時,便是重編核心的時機,"重編核心"好像是一件多麼不同的事,其實 真正的動作也只是再去編譯、連結出一個程式,而且所編連出的核心,不管是由lilo 或是loadlin.exe所啟動,在編譯的過程中原來的核心程式並未先刪除,唯有各部份 的程式都編好後才去組成核心程式,所以重編核心這件事是Linux愛好者所不可放棄 的一件事,因為每台PC的設備並不相同,核心依實際的情況去蕪存菁後,才能發揮最 大的功用。
選擇版本不管您的核心是從網路上抓的﹐還是從 CDROM 裡面 copy 出來的﹐首先要確定的事情是﹕這個版本是否適合您﹖ 事實上﹐Linux 核心的版本號碼上面﹐就隱含著一些重要的資訊。先讓我們看看您目前使用的核心版本吧﹕ # uname -r 2.4.2-2 不知道您對這這些數字有何認識呢﹖不知道不要緊﹐讓我告訴您吧﹕ <主版本>.<次版本>.<修訂版本>-<副版本>
事實上﹐在眾多的核心版本中﹐我們需要特別留意的是第二個數字﹐也就是次版本的號碼﹕ (1) 如果它是一個奇數﹐那這個版本是實驗性的版本﹐或許有些新的設備和功能能夠在這個種版本找到﹐但因為尚處於開發期﹐不能保證其穩定性和安全性。無論如何﹐不建議在真正用來工作的系統上面安裝實驗性的核心版本。例如﹕2.1.1﹑2.3.2﹑2.3.3﹑2.5.0 .... (2) 如果它是一個偶數﹐基本上﹐該版本已經獲得一定程度的測試和肯定﹐已趨於穩定和可靠的狀態。如果您的系統是真正用來工作的﹐只建議安裝穩定的核心版本。例如﹕2.2.1﹑2.2.17﹑2.4.2﹑2.4.9 ....
無論如何﹐當新核心推出之後﹐都不建議立即在真正工作的系統上面應用﹐尤其是在商業機構中﹐不要拿營運中的系統來做白老鼠。就算您獲得一個被認為是穩定的版本﹐也應該經過反復的測試﹐以及隨時留意核心團體所公佈的最新資訊。只有經過一段時期和廣泛的應用與回報﹐再加上自己的嚴格測試之後﹐才能決定是否要應用在工作的環境中。 事實上﹐更新核心不是為了幹時髦﹐您必須很清楚您的需要是什麼﹐假如當前核心已經能應付您的需要﹐那就繼續保留它就是了。
另外﹐還有一個地方要留意的﹕就是您目前使用的應用程式和新版核心之間的兼容性如何﹖其中最頭痛的地方莫過於 Library 的更新。因為 Library 是核心和程式之間的主要溝通界面﹐實在有太多的程式需要使用到 Library 提供的函式庫。如果單純為了升級某一個套件﹐而需要更新 Library 版本的話﹐在很大程度上也會牽涉到核心版本的升級﹔但其它應用程式是否能使用新版的 Library 卻是個非常棘手的難題。調過來說﹐如果您單純為了某一核心功能而升級核心﹐而導致所有 Library 和應用程式都必須更新﹐您必須有足夠的 study 和風險評估﹐否則當您發現牽一髮動全身的時候﹐再臨急抱佛腳﹐恐為時已晚了。況且﹐許多隱藏性的問題﹐可能要等到積壓了某一時期之後才能浮現出來﹐這個恐怕更是讓人吃不了兜著走。 無論如何﹐如果您覺得要升級核心的話﹐三思而後行﹗
取得 source(1)想要獲得最新的核心版本資訊﹐不妨到 http://www.kernel.org/ 走走﹐說不定會滿載(指頻寬)而歸呢﹗上面有 http 和 ftp 的下載選擇﹐如果您是用網頁瀏覽器的話﹐建議用 http 模式﹔如果您習慣了 ftp 界面﹐那就用 ftp 好了。 (2)如果您不是到網路上抓最新的核心﹐但當初安裝的時候又不是選擇 everything﹐而且也沒選擇 Development Tools (kernel source) ﹐那您也可以使用安裝光碟帶來的核心版本 (RH7.2 是在 Disk2 上面)。當您將光碟 mount 好之後﹐然後轉到這個目錄去﹕cd /mnt/cdrom/RedHat/RMPS然後將 kernel-source 的 rpm 裝上。執行rpm -Uvh kernel-source-2.4.7-10.i386.rpm(如果您看到錯誤信息顯示您還需要其他程式﹐一一裝好它們的 rpm 後再來安裝 kernel-source 的rpm。) 完成之後﹐您應該會在 /usr/src/ 目錄裡面看到一個 linux-2.4.7 的子目錄。
如果您的核心是從 Internet 上面下載回來的﹐通常會是‘.tar.gz’或‘.tar.bz2’這樣的壓縮檔。目前﹐我在 http://www.kernel.org/pub/linux/kernel/v2.4/ 所找到的最新版本是 2.4.18 ﹐請先將 linux-2.4.18.tar.bz2 這個檔案抄進 /usr/src 再進行解壓﹕tar -jxvf linux-2.4.18.tar.bz2(因為這是 bz2 的壓縮﹐所以用 j 參數﹐如果您抓的是 gz 格式﹐就用 z 參數吧。) 這樣您就會產生一個‘linux’的目錄﹗注意哦﹕這個和您用 rpm 從 RH7.2 Disk2 的 CD 裝的目錄不一樣哦﹐如果您是用 CD 來裝的話﹐建議您建立一個 link﹕ln -sf linux-2.4.7 linux無論您是用光碟的 rmp﹐還是下載回來的核心﹐最終我們都應該有一個‘/usr/src/linux’的目錄﹕如果原來已經有這樣一個目錄存在﹐而不是 link 的話﹐那就先用 mv 將它改一個名字吧。 當我們的目錄準備好之後﹐就是我們進行編譯的步驟了﹕
進行編譯不過﹐編譯核心一點都不輕鬆﹐而且是相當費神費時的事情。幸好現在的機器越來越快﹐而且核心的編譯程式也好用多了。 1. 首先確定您在安裝 Linux 時候準備的開機片可以工作﹐用它boot 一下就知道了﹐要確定您的 BIOS 裡面的開機順序是以“A”(即軟碟)為先。如您當初忘記了製作開機片﹐或磁片壞掉了﹐先在這裡自行做一張﹕ mkbootdisk --device /dev/fd0 `uname -r` (用 uname -r 命令是找出您當前的核心版本﹐如果您確定是 2.4.2-2 ﹐ 那可以直接用版本號碼來代替。) 2. 重新啟動機器﹐確定是用 bookdisk 開機的。然後用 root 身份進行登錄﹐並取出開機磁碟﹐貼好標籤﹐然後換一張新的磁碟進去。 3. 然後﹐讓我們轉換到 /us/src/linux/Documentation/ 目錄裡面﹐看看裡面您認為需要了解的資訊﹐例如 Changes ﹑ modules.txt﹑Configure.help 和其它 .txt 檔。4. 當您閱讀完新 kernel 的重要資訊之後﹐然後回到 /usr/src/linux 目錄﹐並輸入﹕ make menuconfig
如果在Xwindows裡面﹐可以輸入﹕make xconfig。不過﹐我們這裡使用 menuconfig 就好。在這個界面裡面﹐不如先學習一下如何操作鍵盤吧﹕ (a) 界面是以層級形式顯示選項﹐您首先進入的頂層選單。然後您可以用‘向上’和‘向下’方向鍵來選擇選項。 (b) 如果您發現所選擇的選項的最右邊有一個向右的箭頭﹐那就表示其下還有更進一層的子選單。 (c) 在選單的底部﹐分別有﹕Select﹑Exit﹑和 Help 的按鈕﹐只要按‘tab’鍵就可以循環選擇。 (d) 當您用上下方向鍵選擇好有子選單的選項﹐以及確定底部按鈕為 Select 之後﹐敲‘Enter’就可以進入下一層選單。 (e) 如果按 tab 鍵選擇 Exit 的話﹐就會退回上一級選單 (也可以按‘Esc’﹐但要非常小心﹐因為不留神多按兩下的話可能會退出程式﹐然後您又不確定是保存還是放棄好﹗所以不鼓勵用‘Esc’)。
(f) 當您選擇到最底部的選項的時候﹐也就是選項的右邊沒有箭頭了﹐那麼在選項的左邊應該是一個 [ ] 或 < > 的符號。分別是﹕前者只能選擇為內建或不選擇﹔後者則可以讓您選擇為內建﹑或模組﹑或不選擇。您可以按空白鍵來循環您的選擇﹕[ * ] 和 < * > 為內建﹑[ ] 和 < > 是不選擇﹑ < M > 則為模組。(我的建議是﹕能夠編成模組的就儘量編成模組﹐除非某些特別的效能考慮或沒有模組選擇的﹐才編成內建。) (g) 當您退回頂級目錄的時候﹐如果按 Exit 或 Esc 就會退出所有選單﹐同時系統會問您是否保存設定。您只有 ‘Yes’ 或 ‘No’的選擇﹐如果不確定﹐請用 no ﹐然後重新進行選擇。不過﹐您在任何時候﹐在頂級目錄那裡可以選擇﹕Save Configuration to an Alternate File ﹐將當前設定保存在 /usr/src/linux 目錄下﹐檔案名稱您自定則可﹔您也可以選擇﹕Load an Alternate Configuration File ﹐從設定檔載入以前的設定。我強烈建議您在進行任何改動之前﹐先為目前的設定保存起來﹐請選擇 Save Configuration 那個選項﹐然後輸入 origin﹐那您就可以隨時用 Load Configuration 還原核心的原始設定了。(如果對核心的選項夠了解﹐可以複製一份設定檔﹐然後直接修改裡面的設定﹐是最快的方法﹗)
5. 接下來﹐應該是最傷神的時候了﹐這裡﹐我們要面對一大堆的選擇。如果您不確定哪些需要﹐可以接受預設值﹐或是一股腦做成模組。當您不知道某應該項目是什麼意思﹐可以按‘help’看看您是否需要﹐如沒需要的話可以不要編進核心裡面﹐否則核心編得太大﹐會影響系統效能。(a) 選項說明檔 : readme.htm(b) 選項設定檔 : linux-2.4.9.conf如果您使用的核心版本和我這裡的不一樣﹐那麼上面的選項和擺放位址或許都不一樣﹐請您自己多加留意。 這裡﹐我把我在 desktop 電腦上安裝的 2.4.9 核心設定檔放在這裡﹐您可以下載回去﹐解壓後用 Load Configuration 的辦法載入設定﹐再根據您實際的情形調整即可。注意哦﹕我的設定是有打開 NTFS 的讀取模組﹐如不需要請取消﹐要不請參考前面的提示修改 /usr/src/linux/fs/ntfs/unistr.c 這個檔﹐否則您會遇到錯誤。 6. 當您完成選擇之後﹐按‘Exit’退出﹐看到“Do you wish to save your new kernel configuration?”﹐確定您選擇‘Yes’。
7. 執行 ls /lib/modules看看裡面有沒有一個目錄和編譯版本相同名字﹐如果有﹐用 ‘mv’命令將之改名﹐如﹕ mv /lib/modules/2.4.9 /lib/modules/2.4.9.bak8. 然後再為 /lib/modules ﹑ /boot﹑和 lilo.conf 做一個備份﹕ cp -af /lib/modules /lib/modules.bak cp -af /boot /boot.bak cp -af /etc/lilo.conf /etc/lilo.conf.bak
9. 最後﹐請按順序輸入﹕ make dep # 建立相依關係 make clean # 清除舊有的設定 make bzImage # 建立核心檔 ( arch/i386/boot/bzImage) make modules # 建立模組 ( drivers, net, fs, kernel, ... etc.) make modules_install # 將模組安裝至系統 (/lib/modules/2.4.9) (注意﹕bzImage 的‘i’為大寫) Tips﹕上面的句子﹐您可以用一行代替﹕ make dep clean bzImage modules modules_install 1>/dev/null甚至﹐您還可以將 make 丟到 background 執行。不過﹐這通常在您比較確定核心沒有問題的時候才使用。我是建議您手工的執行每個 make 命令﹐檢查它的執行結果才進行下一個動作﹐如果有錯誤﹐解決之後才好繼續。 在 make modules_install 之前﹐請先將 /lib/modules/ 目錄下面的相同版本子目錄移除掉﹐或改名。
10. 這個過程比較需時﹐熒幕上會迅速的略過許多信息﹐有興趣可以看看﹐如果您不想看﹐那就將 STOUT 重導到 /dev/null 去﹐保留 STDERR 就好(不要說您不會做哦﹐否則請回去補習上一章的內容)﹔或是分別將它們重導到檔案去﹐在除錯時參考。 如果有問題﹐您通常會卡在 modules 和 bzImage 上面﹐請仔細檢查錯誤信息﹐然後根據信息進行修改﹐直到您再沒看到錯誤為止。(有些警告信息是無須理會的﹐如果您碰到 Error 結尾的句子就要小心了﹐通常在最後面﹐如果看不見﹐那是好消息。) 當您 make bzImage 順利完成之後﹐您應該會看到幾行信息﹐告訴您核心的大小﹕ Root device is (3, 6) Boot sector 512 bytes. Setup is 4648 bytes. System is 936 kB假如您碰到 warning: kernel is too big for standalone boot from floppy的話﹐那就要考慮回去將內建的選項改為模組﹐或儘量減少。否則﹐您將不能為這個核心製作開機磁片﹐也不能運用下面提到的核心安裝測試程序。
安裝核心不過﹐到此為止﹐我們只是將核心編譯出來而已﹐接下來的是要將核心安裝到系統上面去。 先將一張空白磁片放進軟碟機﹐然後輸入﹕ make bzdisk這可能需要一點時間﹐等完成之後﹐輸入﹕ reboot這樣會讓機器重新啟動﹐這時候﹐你要確定您的BIOS裡面的開機順序是以“A”(或 Floppy )為先﹐和確定磁片留在 Floppy Drive 裡面。 我們這樣做的目的﹐是用磁片測試一下新的核心是否工作。我強烈建議您先用磁片測試新核心﹐除非您編譯出來的核心實在塞不進一張磁片中。如果不成功的話﹐您還可以取出磁片﹐用原來的核心來啟動﹐然後再重新編譯﹐再來反復測試。 Tips﹕如果您不能建立磁片開機﹐或是系統上根本沒 floppy drive ﹐那您可以執行 make bzlilo將新核心裝到 /目錄去﹐然後參考後面的 lilo.conf 設定﹐將 image 指向 /vmlinuz ﹐並用新的 label (如 linux.new ) 來測試新核心。
如果新的核心是沒問題﹐也就是能用新核心的 floppy 開機的話﹐等我們重新登入系統後﹐再回到 /usr/src/linux 目錄裡面﹐然後執行﹕ make install這個動作和 make bzdisk一樣﹐只不過將核心安裝到硬碟而已。它會將核心裝在 /boot 目錄去﹐請檢查那裡﹐如果您發現﹕vmlinuz-2.4.9 這個檔案﹐那就是核心了﹗除了核心檔之外﹐您應該還會看到 System.map-2.4.9 這樣的檔案﹕ 您不難發現其中的 vmlinuz 和 System.map 都是 links 吧。事實上﹐如果您不執行 make install 的話﹐可以手工的直接從 /usr/src/linux 目錄下面將相關檔案複製到 /boot 裡面去﹕
Okay﹗到這裡﹐基本上就把核心順利安裝到系統上面了。不過﹐因為我這裡有使用到 RAM DISK 機制﹐在開機的時候啟動我的 SCSI 控制卡模組。事實上我是可以直接將 SCSI 編進內建的啦﹐但作為這篇教學的需要﹐我這裡就為大家進行一次示範設定。如果日後您的系統只有 SCSI 硬碟﹐或是 RAID 系統﹐不能直接內建在核心裡面開機﹐那就可以傚法這裡﹐使用 initrd 的機制了。如果要手工進行﹐您大可以參考 /usr/src/linux/Documentation/initrd.txt 和 ramdisk.txt 文件﹐自己動手。然而﹐系統已經提供一個非常好用的工具﹐幫您搞定這些工作﹕ mkinitrd -f /boot/initrd-2.4.9.img 2.4.9
就這麼簡單﹐它同時會修改 /etc/modules.conf﹐幫您加上相應的 SCSI 模組﹐請檢查這個檔案確認一下模組是否正確﹐要不然可以手工修改過來﹐請您自行 man mkinitrd參考資料囉。如果您還有其它模組需要加在這個檔案裡面﹐可以參考如下的動作﹕ 假如您認為沒必要使用 RAM DISK﹐那就不用管這一段了。
設定 LILOLILO 是 “LInux LOader”的縮寫﹐它是在機器啟動的時候負責載入作業系統的。我們在“安裝”和“開機”的章節裡面都提到過它的作用﹐這裡不再重複。然而﹐在許多時候﹐我們可能需要設定不同的核心來配合不同的測試﹐每次當我們編譯或修改過核心設定﹐那就一定要驚動到 LILO 的設定。我們這裡﹐將正式介紹如何修改 LILO 的設定檔。 我發現﹐在某些系統上﹐例如 Mandrak 8 上面﹐在編譯核心過程中﹐執行 make install 的話﹐會自動幫您修改 /etc/lilo.conf這個重要的檔案。不過﹐RedHat 7.1 似乎還沒這麼自動。無論如何﹐請您修改 /etc/lilo.conf 這個檔案﹐看起來有點像這樣﹕
這裡﹐我們不妨先解讀一下這個檔案的設定結構﹐在最頂上的為 global 設定﹐也就是當 LILO 被啟動之後﹐都會被執行的項目﹕ (a) boot﹕這是指定 LILO 必須安裝在哪裡﹖通常您可以選擇為 MBR 或是 super block。如果是 MBR﹐那您只要指定硬碟的代號就可以了﹐如 /dev/hda ﹔如果是 super block﹐那您必須指定 partition 代號﹐如﹕/dev/hda2 ﹐您必須確定這個 partition 的 mount point 是 /boot 。 MBR 和 super block 的分別是﹕用前者的話﹐那麼機器在接通電源並通過 BIOS 檢測之後﹐開機程序就交由 LILO 來控制﹔如果是後者﹐則有其它的開機管理程式控制﹐並且必須有一個 pointer 指向 super block 所在的 partition。您可以參考後面 image sections 中的 rh62 和 ol24 之範例。 (b) map﹕這是關於 LILO 所使用的對應檔(具體作用我不甚了解)﹐這個檔在第一次執行 lilo 的時候就會建立。 (c) install﹕指定了哪個啟動檔用來安裝在啟動磁區上。 (d) prompt﹕在載入系統之前﹐先進行提示。這時候﹐您可以敲 Tab 鍵來顯示開機選項﹐然後輸入您所選擇的系統。
(e) timeout﹕假如上面的 prompt 沒有任何輸入﹐則在倒數結束時間的情況下選擇預設的系統。倒數時間單位為十分之一秒﹐所以﹐預設會等您 5 秒。(f) message﹕是否在執行 LILO 的時候顯示特定信息﹐也就是這裡指定的檔案內容﹐必須是不超過 65535 bytes 的文字檔。 (g) linear﹕是否以 linear 格式位址取代傳統的 S:H:C 磁碟索引格式﹐通常在 SCSI 硬碟中使用。請謹慎設定﹐不小心使用可能會導致系統不能正確開機。 (h) lba32﹕假如您的開機磁區所在的磁柱數目超過 1024 的話﹐那就要啟用 lba 32bit 位址格式才行。 (i) default﹕假如提示的時候沒有輸入的話﹐所使用的預設系統。它必須是後面 PER-IMAGE 項目中的某一個 label﹐假如沒有指定﹐則一第一個 label 為預設系統。 除了上面這些介紹的項目之外﹐事實上還有很多其它的設定﹐例如 password﹑vga﹑等等。有興趣的話﹐請 man lilo.conf 慢慢看吧。
當您完成 global 設定之後﹐接下來的就是 PER-IMAGE SECTION 的設定﹐簡單點說﹐就是設定開機選單。通常﹐每一個開機選單都是一個獨立的作業系統﹐或是不同的核心(我們剛纔編的就是核心)。先讓我們看看不同核心之間的設定吧﹕(a) image﹕這就是我們剛纔千辛萬苦編譯出來的核心檔位置所在啦﹗這行通常不會縮排﹐也就是句子第一個字母不是空白或 Tab 鍵。如果您要縮排其後的句子﹐建議您用 Tab 鍵﹐而避免用空白鍵。在有些舊的系統中﹐或許會比較敏感﹐不過﹐現在的 LILO 應該沒什麼所謂了。(b) label﹕開機時 LILO 能顯示的選單標籤名稱﹐您喜歡用什麼名字都行﹐只要不會跟其它標籤衝突就行。假如您在 global 裡面設定了 default 標籤﹐那麼必須和這裡的名稱一摸一樣。(c) initrd﹕如果您的核心將 Ram Disk 和 Init RD 編為內建的話﹐那就要在這裡指定您的 initrd 檔位置所在﹐也就是執行 mkinitrd 命令時所指定的檔案。假如您沒有使用 ram disk﹐那就不用設定這行。(d) read-only﹕在開機的過程中﹐root 目錄所掛載的狀態﹐設定為 read-only 比較安全。因為開機完成後﹐它會被重新掛載為 read-write 狀態。(e) root﹕也就是您的 root partition 的位置所在﹐您必須知道正確的位置在哪裡。
在前面的 lilo.conf 範例檔中﹐粗體字的部份就是因應這次核心編譯才需要修改的。我單純的將舊核心那部份(共 5 行)複製到上面﹐然後修改 image﹑initrd 而已﹔然後將原來的舊 label 改為 linux.242 (說明它是 2.4.2 的核心)﹐其它照舊即可。假如您的 lilo.conf 在執行 make install 的時候就修改好了﹐那也請您逐行檢查﹐以作確認。 然後﹐再讓我們看看不同作業系統之間的設定。不過﹐這顯然簡單多了﹕ (a) other﹕其它系統所在的位置。對於 Windows 系統而言﹐則是磁碟第一個 windows 磁區 (c:\) 所在的位置。如果是 linux 系統﹐也就它們所安裝的 super block 位址﹐因為 MBR 只能有一個﹐如果這裡的 MBR 給目前的系統使用了﹐那其它系統就必須裝在 MBR 上。不過﹐如果反過來﹐如果當前的系統裝在 super block 裡面﹐然後用 MBR 裡面其它的 boot loader 來載入當前核心﹐那您必須修改 global 的 boot 設定﹐同時﹐還要在其它系統上的上面建立這個 super block 的指引(如果是其它 linux 系統﹐則在它們的 lilo.conf 上面設定 other ﹐指回這邊)。 (b) optional﹕當核心在建立 map 檔的時候﹐如果 image 還不存在的話﹐可以忽略。否則﹐ LILO 可能不讓您安裝。 (c) label﹕這個應該知道了吧﹖也就是 LILO 的開機選項標籤。
基本上﹐我們前面的設定檔範例就介紹到這裡。前面的設定項目﹐有些是可以放在 global﹐也可以放在各個 section 之中﹐例如 read-only 這個設定。假如您還有其它的設定﹐建議參考 lilo.conf 的 man page。比方說﹐您需要在開機的時候﹐將一些核心選項設定起來﹐那您需要使用到 append 選項。在以前沒有 PnP 的時候﹐或許您需要在啟動的時候把網路卡跑起來﹐那就可以這樣設了﹕ append=“ether=3,0x300,eth0 ether=5,0x320,eth1" 這裡﹐一共指定了兩張網路卡的 IRQ﹑I/O﹑以及卡號(通常第一張網路卡是 eth0﹐第二張是 eth1﹐如此類推)。請記住﹕句子的格式非常嚴格﹐例如 I/O 位置一定要以 0x 開頭﹐然後 “,”和空白也不能亂用﹐而且也有大小寫的分別。例如﹐如果您最多只能抓到 64 Mb 的記憶體(以前的舊核心可能會這樣)﹐那您可以用 append=“mem=128M”來解決。再例如﹐您必須透過選項告訴核心正確的硬碟 Sector:Head:Cylinder 資訊﹐也可以如此設定﹕append=“hd=64,32,202”。這個 append 選項放在 global 或 section 裡面都可以﹐看您怎樣運用而已。 當您的 /etc/lilo.conf 完成設定之後﹐請一定一定不要忘記執行如下命令﹕ lilo
請檢查您剛才寫進去的 label 有否出現。如果在它旁邊還有有一個“*”標記﹐這表示它被選擇為預設開機核心了。如果您想看看 lilo 究竟做了些什麼修改﹐您可以輸入﹕lilo -v -v(越多 -v 越詳盡)。一定要記住﹕只有當您執行了 lilo 命令之後﹐您的 LILO 才會真正裝到系統之上。 如果您修改了 lilo.conf﹐卻沒有執行 lilo 命令﹐情形就好像您 make bzImage 之後沒有將 kernel 複製到 /boot 目錄裡面一樣。 假如您的設定檔有問題﹐您通常都不能順利完成這個命令﹐這樣﹐您的 LILO 也同樣不會裝到系統上面﹐然則﹐請根據錯誤信息進行修改。當一切確定無誤後﹐可以重新開機看看新核心是否工作。當出現 ‘LILO Boot:’提示的時候﹐您可以按‘Tab’鍵看看有哪些選擇﹐然後輸入您要啟動的名稱。如果直接按‘Enter’就會以預設值開機了。因為我們在執行安裝核心到系統之前﹐已經用 floppy 測試過了﹐照理說應該沒什麼問題才對。如果有問題﹐那就不是核心的編譯問題﹐而可能是 LILO 的設定問題而已﹔反過來﹐如果 floppy 不能通過測試﹐那您在這裡設定 LILO 也是枉然﹐甚至弄巧成拙﹗所以﹐我強烈建議您﹕(1) 永遠保留一份開機磁片﹔(2) 安裝新核心之前﹐儘可能先用 floppy 來測試。
Tips﹕事實上﹐除了使用 LILO 之外﹐我們還可以使用其他開機系統哦。比方說﹐您的系統原來已經裝有 NT (或 w2k)了﹐您也可以用 NTLDR 來啟動 linux 呢。下面我粗略的將步驟列出來﹐具體情況要看您實際操作環境了﹕ (a) 參考一下 winNT+Linux 的 HowTO 說明文件。 (b) 以正常的方式安裝 Linux , 最後把 lilo 裝到 superblock 內﹐並記得製作一張 Linux 開機片。 又或者﹕修改 /etc/lilo.conf ﹐將 boot= 修改成 super block 的位置﹐如﹕boot=/dev/hdaX 。注意﹕/dev/hdaX 就是你的 linux /boot 磁區(比方 hda2) 。 然後執行一次 lilo ﹐確定沒有錯誤信息。 (c) 執行下面命令產生開機檔案﹕ dd if=/dev/hda2 of=/bootsect.lnx bs=512 count=1 (事實上﹐您也可以用 dd 來做開機磁片﹐將 of= 設定為 /dev/fd0 就可以了。) (d) 把產生好的 bootsect.lnx 複製到你的 NT C:\ 的目錄下: mkdir /mnt/dos mount -t msdos /dev/hda1 /mnt/dos (如果不是 c:\ 不是 FAT16 格式﹐或許將 -t msdos 換成 -t vfat 或 ntfs﹐需要核心支援這些格式) cp /bootsect.lnx /mnt/dos/bootsect.lnx (e) 退出 linux﹐啟動到 dos﹐然後執行﹕ attrib -r -s -h c:\boot.ini edit c:\boot.ini (f) 在 boot.ini 後面加入: c:\bootsect.lnx="Linux"(g) 存檔﹐並執行﹕ attrib +r +s +h c:\boot.ini 這樣﹐您就可以用 NT 的 Loader 來啟動 Linux 了。
除此之外﹐在新版的 RedHat 系統上﹐除了 LILO 之外還提供了另外的新開機管理程式﹐稱為 GRUB ( GRand Unified Bootloader ) 。如果您勇於嘗新﹐可以參考如下網頁﹕ Grub開機管理程式安裝簡介上面是 Linuxcenter 網站的介紹文章﹐您當然可以到 GNU 網站獲得更多關於 GRUB的資訊。
進行 Patch 前面所介紹的方法﹐是直接抓一個完整的核心回來重新編譯。除了這個方法之外﹐我們還可以使用另外一種方法來為核心進行升級的動作。就是用 patch的方式進行。 假如您曾經溜灠過 www.kernel.org 的核心下載目錄﹐應該會發現一堆 patch-xxxx.xxx.xx 這樣的檔案﹐這些檔案都比較小﹔再仔細看看﹐它們的版本安排﹐非常有順序﹐這就對了﹕關鍵是它的版本順序。因為﹐幫 kernel 進行 patch 的時候﹐必須是逐個逐個版本 patch 上去的﹐期間不能跳過任何一個版本。 比方說﹐您目前的版本是 2.4.2﹐如果您要升級到 2.4.9﹐您有兩個方法﹕ (a) 直接抓 2.4.9 的完整核心回來編﹔ (b) 先抓 2.4.3 的 patch﹐升級到 2.4.3﹑然後在抓 2.4.4 的 patch﹐升級到 2.4.4﹐再來是抓 2.4.5﹑2.4.6﹑2.4.7﹑2.4.8﹑2.4.9 所有這些 patch 回來﹐也同樣可以升級到 2.4.9。
您會發現﹕如果您的版本落差太大﹐直接抓完整的核心回來比較省事一點﹔但如果版本落差不大﹐或許使用 patch 比較方便快捷。採用哪一種方式都可以﹐看您的情形和個人習慣了。不過﹐除了版本升級的時候需要 patch 之外﹐有時候﹐我們在增加一些核心額外的功能的時候﹐也可能需要使用到 patch。所以﹐這裡我們不妨看看如何為核心進行 patch 好了。 例如﹐您對 LinuxVirtualServer 這技術非常感興趣(請參考 http://www.linuxvirtualserver.org/ )﹐不過﹐它的功能卻需要您對核心進行 patch 才能使用得到﹕ (a) 您首先要做的事情﹐是將相關的 patch 下載回來﹕linux-2.4.9-ipvs-0.9.3.patch.gz (或是從本站 下載)﹐當然﹐還要將它的應用程式也抓回來才有得玩﹐要不然﹐只是升級核心是沒有用的﹐因為沒有工具來應用用它﹕ipvsadm-1.19-1.src.rpm。(b) 當您的 patch 抓回來之後﹐請複製到 /usr/src/ 目錄中。 (c) 然後進行解壓﹕ cd /usr/srctar zxvf linux-2.4.9-ipvs-0.9.3.patch.gz(這樣﹐您應該會獲得一個 linux-2.4.9-ipvs-0.9.3.patch 的檔案。)
(d) 接下來﹐就是對核心進行 patch 的動作了﹕ cd /usr/src/linuxpatch -p1 < ../linux-2.4.9-ipvs-0.9.3.patch假如您沒碰到任何錯誤信息﹐而是跑出一大串 patching file xxx_xxx.xxx 的信息﹐那就完成 patch 了﹗ (e) 然後﹐您要執行 make menuconfig 命令﹐將 ipvsadm 的相關模組編譯出來﹕ Networking options ---> IP: Virtual Server Configuration --- > <M> virtual server support (EXPERIMENTAL) (NEW) [*] IP virtual server debugging (NEW) (12) IPVS connection table size (the Nth power of 2) (NEW) --- IPVS scheduler <M> round-robin scheduling (NEW) <M> weighted round-robin scheduling (NEW) <M> least-connection scheduling scheduling (NEW) <M> weighted least-connection scheduling (NEW) <M> locality-based least-connection scheduling (NEW) <M> locality-based least-connection with replication scheduling (NEW) <M> destination hashing scheduling (NEW) <M> source hashing scheduling (NEW) --- IPVS application helper <M> FTP protocol helper (NEW)
(f) 接下來的動作﹐就是重新編譯您的核心和模組囉﹕ make dep bzImage modules modules_install install 1>/dev/null您是否有留意到我這次的 make 沒有使用 clean 選項呢﹖如果您這次 patch 的核心﹐與前面介紹的那次編譯之間﹐沒進行過其它編譯的話﹐基本上不用清除原來的設定。因為這次 patch﹐我們單純是將‘額外’的功能補上而已﹐並沒動到其它任何部份。這樣的話﹐執行速度上會快很多﹐當然﹐如果您時間允許﹐而且力求保障﹐那就在 dep 之後加上 clean ﹐也未嘗不可。 最後﹐只要您重新開機﹐就獲得新的核心功能了。當然﹐如果您想用另外一個核心檔案和另外一個開機標籤的話﹐那就修改好 lilo.conf ﹐同時不要忘記執行 lilo 命令﹐然後才重新開機。
模組管理 當您在編譯核心的時候﹐那些選擇為“*” 就會被內建到核心裡面去﹐也就是開機之後隨著核心啟動而載入。至於那些選擇為“M”的項目﹐就會被編成模組﹐它可以由開機程式呼叫而載入﹐也可以由使用者啟動﹔同時﹐當它們不再需要的時候﹐也可以將之卸載。 Tips﹕在您執行 make modules_install 的時候﹐有一個問題要留意﹕假如在 /lib/moduels 目錄下面﹐已經有一個目錄的名稱﹐和您編譯的核心版本一樣的話﹐那最好就是先將它移除﹐或用 mv 改成備份。因為﹐如果您重新編譯的模組項目﹐或許和上次編的不一樣。 比方說﹐上次您將 A 編成模組﹐執行過 make modules_install﹐那它 A.o 就會存放到 /lib/modues/ 的相應版本子目錄中﹐但您這次將之改為內建﹐或是根本沒不編進核心中﹐您再執行 make moduels_install 的時候﹐A.o 應該不會被存放到那裡的﹐但它卻存放在那裡了。這樣的話﹐您在開機或建立模組相依資訊的時候﹐就會遇到錯誤信息。當然﹐您可以不理會﹐但常看到這些刺眼的句子跑出來﹐也實在不怎麼好受啦。
我們知道核心檔會存放到 /boot 目錄中﹐那模組呢﹖當您執行 make modules 命令之後﹐所有模組只產生在 /usr/src/linux 目下的一些子目錄裡面。您必須執行 make modules_install才能將模組安裝到系統之上。存放這些模組的位置就在 /lib/modules/2.4.9這個目錄之下﹐您不妨溜灠一下各個子目錄的內容﹐以了解系統可用模組有哪些﹖ 在模組真正被使用之前﹐您必須為所有模組建立相依資訊﹐您可以執行 depmod命令後接模組的名稱來建立﹐也可以用 depmod -a 一次過完成所有模組的相依性建立。這個動作﹐會更新 /lib/modules/2.4.9 目錄裡面的 modules.dep 檔案。如果您用 modprobe 來載入模組(後面介紹)﹐那這個檔必須存在﹐其內容也必須正確。如果您進行 depmod 的時候碰到錯誤信息﹐通常會是一些 ‘xxxxx.yyyyy.xxxxxx.o: unresolved symbol(s)’的錯誤﹐這裡也不打算詳細解析了﹐有興趣的話可以參閱這個聯結﹕http://bbs.ee.ntu.edu.tw/boards/Linux/4/8/1.html。 如果您想看看目前有哪些模組被載入了﹐您可以輸入﹕
您會看到一堆模組的名字﹐還有它的大小﹐以及被哪些程式使用。如果是 unused 狀態的話(也就是 Used 為 0 的時候)﹐那表示該模組雖然載入了﹐但目前還沒有被任何程式所使用。然則﹐您可以用下一個命令將之移除。 假如您想將一些已經載入的模組移除的話﹐使用 rmmod後接模組名字就可以了(例如﹕rmmod md )。如果您得到該模組正在使用中 (in used) 的信息﹐那麼先將相關的程式停掉﹐以及相關模組移除就是了。例如﹕
模組之所以靈活﹐就是因為它能隨時移除﹐也能隨時載入。如果您要載入模組的話﹐可以使用 insmod或 modprobe命令﹐後接模組名字來完成。假如您的模組路徑沒有設定正確的話(通常會指向 /lib/modules/下面)﹐那麼您就要加上路徑了﹐不過﹐這不是正常的現象。使用 insmod 和 modprobe 都可以將模組載入﹐它們的分別是﹕後者除了能載入指定模組外﹐連同它相關的必須模組也一同載入。至於哪些是相關的﹐這就是前面介紹的 depmod 必須要負責的事情了。 我們使用的模組﹐除了從核心裡面之間編譯之外﹐我們還可以抓模組的 source 回來自己編模組哦~~下面這個例子﹐是教您如何手工的為 D-Link 530TX 網路卡建立模組﹕ 或許﹐您已經知道在您可以使用 via-rhine.o 來驅動 DL-530TX ﹐您不妨先試試﹐如果不行的話﹐再嘗試用以下的步驟﹕ (a) 到 D-Link 網站下載 linux530_321.tar 原始檔。 (b) 將檔案複製到 /usr/src/dl530 目錄中。這時候如果您的 Linux 還不能連上網路﹐那就用磁片轉移過去吧。下面假設您從 Windows 將檔案下載回來﹐然後用磁片複製到 Linux 之上﹕ mkdir /usr/src/dl530 mount /mnt/floppy cp /mnt/floppy/linux530_321.tar /usr/src/dl530
(c) 將檔案解開﹕ cd /usr/src/dl530 tar xvf linux530_321.tar (d) 用gcc 編譯模組﹕ gcc -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes \ -O6 -I/usr/src/linux/include -c via-rhine.c (注意﹕“-D__KERNEL__ ”裡面之“__”是連續兩個“_”符號﹐另外“O6”不是“零六”哦﹐是英文字母大寫“O”啦。) 如無意外﹐應該會在當前目錄產生出 via-rhine.o 這個模組。(您也可以閱讀 readme 檔﹐使用 make all 的辦法來產生) (e) 接著﹐請執行執行 uname -r 找出您所使用的核心版本﹐比方說﹕2.4.9﹐那您就使用這個 /lib/modules 的子目錄做為後面的路徑。 (f) 如果在 /lib/modules/2.4.9/net/ 下面已經有 via-rhine.o 的話﹐請將其改名﹕ mv /lib/modules/2.4.9/kernel/drivers/net/via-rhine.o \ /lib/modules/2.4.9/kernel/drivers/net/via-rhine.249.o (g) 將編好的模組複製到正確的位置﹕ cp via-rhine.o /lib/modules/2.4.9/kernel/drivers/net/
(h) 執行 netconf 並選擇 "Basic host information"﹐設定如下﹕ Host name + domain rh71.siyongc.domain ---------Adaptor 1----------- [X] Enabled Config mode (o) Manual ( ) Dhcp ( ) Bootp Primary name + domain rh71.siyongc.domain Aliases (opt) rh71 IP address 192.168.100.23 Netmask (opt) 255.255.255.0 Net device eth0 Kernel module via-rhine I/O port (opt) (i) 檢查 /etc/modules.conf 檔﹐確定有如下句子﹕ alias eth0 via-rhine (j) 然後將模組掛入﹕ insmod via-rhine (k) 並用 lsmod 確認模組載入成功。
(l) 執行 mdesg | grep eth0 命令﹐確定系統有抓到網路卡之後﹐重新啟動網路﹕ service network restart (m) 查看網路設定﹕ ifconfig (註﹕請您將主機名稱和 IP 位址修改為您實際的設定。)
測試核心如果有問題﹐用磁片進行開機﹐然後重新檢查一下 /etc/lilo.conf 看看是否設定正確﹐如有修改﹐再執行一次 lilo。既然您可以用磁片開機﹐那麼新的核心就應該沒問題的﹐那通常是系統啟動的問題了。 如果遇到 Unresolved symbol的錯誤信息﹐可能是舊的模組還在 /lib/modules 目錄之下﹐您應該用 uname -r 找出當前的核心版本﹐然後將相應的目錄改名﹐再執行一次 make modules_install 。同時﹐也可試試在編譯核心時﹐在 Loadable module support那裡﹐取消 Set version information on all symbols for modules 的選擇。 有時候您出盡法寶都無法讓那些討厭的 Unresolved symbol 消失﹐要是那些模組並非必須的﹐那麼干脆從 /lib/modules 目錄下面將它移除就是了。當然﹐在編譯核心的時候選擇 no 也行。 編譯核心有時候會遇到許多麻煩﹐尤其是當您從一個舊的版本升級上來。建議您看看 kernel-HOWTO 和 modules mini-howto 之外﹐還應該看看 /usr/src/linux/Documentation 裡面的文章﹐尤其是 Changes﹑modules.txt﹑kmod.txt 等。而且﹐在編譯選項( make menuconfig )的過程中﹐關於任何不明白的設定﹐應該看看 Help 是怎麼說的﹐這非常重要。
L i n u xQ & A http://www.lsi.idv.tw/~lsi/Lession_06.ppt