1 / 46

Linux 安裝入門與基本管理 課程目標: 學習 Linux 平台下的安裝設定 與 建置一個基本的 Linux 伺服器 國家高速電腦中心 -- 林尚毅

Linux 安裝入門與基本管理 課程目標: 學習 Linux 平台下的安裝設定 與 建置一個基本的 Linux 伺服器 國家高速電腦中心 -- 林尚毅 http://www.lsi.idv.tw/~lsi/ lsigiga@giga.net.tw. Lession 6 Kernel 的更新 與編譯.

Télécharger la présentation

Linux 安裝入門與基本管理 課程目標: 學習 Linux 平台下的安裝設定 與 建置一個基本的 Linux 伺服器 國家高速電腦中心 -- 林尚毅

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Linux 安裝入門與基本管理 課程目標: 學習Linux平台下的安裝設定 與 建置一個基本的Linux伺服器 國家高速電腦中心 -- 林尚毅 http://www.lsi.idv.tw/~lsi/ lsigiga@giga.net.tw

  2. Lession 6 Kernel 的更新 與編譯

  3. <<摘要>>Linux ﹐其靈魂所在﹐就是它穩定而強大的核心。而事實上﹐Linux 的定義﹐也只是這個核心﹐只是大家目前使用的系統﹐是經過包裝的﹐在核心之外﹐還有各種各樣的套件( 包括不同的 shell )整合一起。如果您有時間﹐而且願意上網路去抓﹐那些套件都可以自己找得到。有些人﹐幫您把核心編好﹐套件也設定好並加以整合﹐同時將安裝程式寫好﹐還提供套件管理工具﹐以及將環境設定妥當﹐然後燒成 CD﹐那就是我們常見的 Linux 套裝系統了。我們稱這些 Linux 套裝系統的發行版本為 Distribution ﹐例如大家聞名的 RedHat﹐Slackware﹐OpenLinux﹐TurboLinux﹐SuSE﹐Debian﹐等等﹐都是 distributions 。不管它們如何包裝﹐但骨子裡頭的東西﹐也就是使用的核心﹐都一樣﹕都是 Linux ﹗

  4. 那核心究竟如何定義呢﹖說簡單些﹐就是作業系統(Operating System)﹐它負責處理所有系統的東西﹐包括硬碟的控制﹑記憶體管理﹑行程管理﹑檔案系統﹑網路功能﹑等等。我們可以將核心看成是一個架於程式和硬體之間的界面操作系統﹐離開來核心﹐什麼東西都用不了。而核心的編譯好壞﹐也會影響到系統的效能﹐甚至﹐一些系統功能(如 tcp/ip)﹐就必須要編進核心才行。

  5. 簡介 Linux本身便附有核心程式的原始碼,這使得使用者可以很方便的"制造"出一個 核心程式出來,尤其是自行更改或是向外取得某部份原始程式後、或是想要更改對一 些設備的支援時,便是重編核心的時機,"重編核心"好像是一件多麼不同的事,其實 真正的動作也只是再去編譯、連結出一個程式,而且所編連出的核心,不管是由lilo 或是loadlin.exe所啟動,在編譯的過程中原來的核心程式並未先刪除,唯有各部份 的程式都編好後才去組成核心程式,所以重編核心這件事是Linux愛好者所不可放棄 的一件事,因為每台PC的設備並不相同,核心依實際的情況去蕪存菁後,才能發揮最 大的功用。

  6. 選擇版本不管您的核心是從網路上抓的﹐還是從 CDROM 裡面 copy 出來的﹐首先要確定的事情是﹕這個版本是否適合您﹖ 事實上﹐Linux 核心的版本號碼上面﹐就隱含著一些重要的資訊。先讓我們看看您目前使用的核心版本吧﹕ # uname -r 2.4.2-2 不知道您對這這些數字有何認識呢﹖不知道不要緊﹐讓我告訴您吧﹕ <主版本>.<次版本>.<修訂版本>-<副版本>

  7. 然後﹐再讓我們看看核心版本的維護流程﹕

  8. 事實上﹐在眾多的核心版本中﹐我們需要特別留意的是第二個數字﹐也就是次版本的號碼﹕ (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 ....

  9. 無論如何﹐當新核心推出之後﹐都不建議立即在真正工作的系統上面應用﹐尤其是在商業機構中﹐不要拿營運中的系統來做白老鼠。就算您獲得一個被認為是穩定的版本﹐也應該經過反復的測試﹐以及隨時留意核心團體所公佈的最新資訊。只有經過一段時期和廣泛的應用與回報﹐再加上自己的嚴格測試之後﹐才能決定是否要應用在工作的環境中。 事實上﹐更新核心不是為了幹時髦﹐您必須很清楚您的需要是什麼﹐假如當前核心已經能應付您的需要﹐那就繼續保留它就是了。

  10. 另外﹐還有一個地方要留意的﹕就是您目前使用的應用程式和新版核心之間的兼容性如何﹖其中最頭痛的地方莫過於 Library 的更新。因為 Library 是核心和程式之間的主要溝通界面﹐實在有太多的程式需要使用到 Library 提供的函式庫。如果單純為了升級某一個套件﹐而需要更新 Library 版本的話﹐在很大程度上也會牽涉到核心版本的升級﹔但其它應用程式是否能使用新版的 Library 卻是個非常棘手的難題。調過來說﹐如果您單純為了某一核心功能而升級核心﹐而導致所有 Library 和應用程式都必須更新﹐您必須有足夠的 study 和風險評估﹐否則當您發現牽一髮動全身的時候﹐再臨急抱佛腳﹐恐為時已晚了。況且﹐許多隱藏性的問題﹐可能要等到積壓了某一時期之後才能浮現出來﹐這個恐怕更是讓人吃不了兜著走。 無論如何﹐如果您覺得要升級核心的話﹐三思而後行﹗

  11. 取得 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 的子目錄。

  12. 如果您的核心是從 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 將它改一個名字吧。 當我們的目錄準備好之後﹐就是我們進行編譯的步驟了﹕

  13. 進行編譯不過﹐編譯核心一點都不輕鬆﹐而且是相當費神費時的事情。幸好現在的機器越來越快﹐而且核心的編譯程式也好用多了。 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

  14. 如果在Xwindows裡面﹐可以輸入﹕make xconfig。不過﹐我們這裡使用 menuconfig 就好。在這個界面裡面﹐不如先學習一下如何操作鍵盤吧﹕ (a) 界面是以層級形式顯示選項﹐您首先進入的頂層選單。然後您可以用‘向上’和‘向下’方向鍵來選擇選項。 (b) 如果您發現所選擇的選項的最右邊有一個向右的箭頭﹐那就表示其下還有更進一層的子選單。 (c) 在選單的底部﹐分別有﹕Select﹑Exit﹑和 Help 的按鈕﹐只要按‘tab’鍵就可以循環選擇。 (d) 當您用上下方向鍵選擇好有子選單的選項﹐以及確定底部按鈕為 Select 之後﹐敲‘Enter’就可以進入下一層選單。 (e) 如果按 tab 鍵選擇 Exit 的話﹐就會退回上一級選單 (也可以按‘Esc’﹐但要非常小心﹐因為不留神多按兩下的話可能會退出程式﹐然後您又不確定是保存還是放棄好﹗所以不鼓勵用‘Esc’)。

  15. (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 還原核心的原始設定了。(如果對核心的選項夠了解﹐可以複製一份設定檔﹐然後直接修改裡面的設定﹐是最快的方法﹗)

  16. 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’。

  17. 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

  18. 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/ 目錄下面的相同版本子目錄移除掉﹐或改名。

  19. 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的話﹐那就要考慮回去將內建的選項改為模組﹐或儘量減少。否則﹐您將不能為這個核心製作開機磁片﹐也不能運用下面提到的核心安裝測試程序。

  20. 安裝核心不過﹐到此為止﹐我們只是將核心編譯出來而已﹐接下來的是要將核心安裝到系統上面去。 先將一張空白磁片放進軟碟機﹐然後輸入﹕ make bzdisk這可能需要一點時間﹐等完成之後﹐輸入﹕ reboot這樣會讓機器重新啟動﹐這時候﹐你要確定您的BIOS裡面的開機順序是以“A”(或 Floppy )為先﹐和確定磁片留在 Floppy Drive 裡面。 我們這樣做的目的﹐是用磁片測試一下新的核心是否工作。我強烈建議您先用磁片測試新核心﹐除非您編譯出來的核心實在塞不進一張磁片中。如果不成功的話﹐您還可以取出磁片﹐用原來的核心來啟動﹐然後再重新編譯﹐再來反復測試。 Tips﹕如果您不能建立磁片開機﹐或是系統上根本沒 floppy drive ﹐那您可以執行 make bzlilo將新核心裝到 /目錄去﹐然後參考後面的 lilo.conf 設定﹐將 image 指向 /vmlinuz ﹐並用新的 label (如 linux.new ) 來測試新核心。

  21. 如果新的核心是沒問題﹐也就是能用新核心的 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 裡面去﹕

  22. 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

  23. 就這麼簡單﹐它同時會修改 /etc/modules.conf﹐幫您加上相應的 SCSI 模組﹐請檢查這個檔案確認一下模組是否正確﹐要不然可以手工修改過來﹐請您自行 man mkinitrd參考資料囉。如果您還有其它模組需要加在這個檔案裡面﹐可以參考如下的動作﹕ 假如您認為沒必要使用 RAM DISK﹐那就不用管這一段了。

  24. 設定 LILOLILO 是 “LInux LOader”的縮寫﹐它是在機器啟動的時候負責載入作業系統的。我們在“安裝”和“開機”的章節裡面都提到過它的作用﹐這裡不再重複。然而﹐在許多時候﹐我們可能需要設定不同的核心來配合不同的測試﹐每次當我們編譯或修改過核心設定﹐那就一定要驚動到 LILO 的設定。我們這裡﹐將正式介紹如何修改 LILO 的設定檔。 我發現﹐在某些系統上﹐例如 Mandrak 8 上面﹐在編譯核心過程中﹐執行 make install 的話﹐會自動幫您修改 /etc/lilo.conf這個重要的檔案。不過﹐RedHat 7.1 似乎還沒這麼自動。無論如何﹐請您修改 /etc/lilo.conf 這個檔案﹐看起來有點像這樣﹕

  25. 這裡﹐我們不妨先解讀一下這個檔案的設定結構﹐在最頂上的為 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 鍵來顯示開機選項﹐然後輸入您所選擇的系統。

  26. (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 慢慢看吧。

  27. 當您完成 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 的位置所在﹐您必須知道正確的位置在哪裡。

  28. 在前面的 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 的開機選項標籤。

  29. 基本上﹐我們前面的設定檔範例就介紹到這裡。前面的設定項目﹐有些是可以放在 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

  30. 請檢查您剛才寫進去的 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 來測試。

  31. 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 了。

  32. 除此之外﹐在新版的 RedHat 系統上﹐除了 LILO 之外還提供了另外的新開機管理程式﹐稱為 GRUB ( GRand Unified Bootloader ) 。如果您勇於嘗新﹐可以參考如下網頁﹕ Grub開機管理程式安裝簡介上面是 Linuxcenter 網站的介紹文章﹐您當然可以到 GNU 網站獲得更多關於 GRUB的資訊。

  33. 進行 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。

  34. 您會發現﹕如果您的版本落差太大﹐直接抓完整的核心回來比較省事一點﹔但如果版本落差不大﹐或許使用 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 的檔案。)

  35. (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)

  36. (f) 接下來的動作﹐就是重新編譯您的核心和模組囉﹕ make dep bzImage modules modules_install install 1>/dev/null您是否有留意到我這次的 make 沒有使用 clean 選項呢﹖如果您這次 patch 的核心﹐與前面介紹的那次編譯之間﹐沒進行過其它編譯的話﹐基本上不用清除原來的設定。因為這次 patch﹐我們單純是將‘額外’的功能補上而已﹐並沒動到其它任何部份。這樣的話﹐執行速度上會快很多﹐當然﹐如果您時間允許﹐而且力求保障﹐那就在 dep 之後加上 clean ﹐也未嘗不可。 最後﹐只要您重新開機﹐就獲得新的核心功能了。當然﹐如果您想用另外一個核心檔案和另外一個開機標籤的話﹐那就修改好 lilo.conf ﹐同時不要忘記執行 lilo 命令﹐然後才重新開機。

  37. 模組管理 當您在編譯核心的時候﹐那些選擇為“*” 就會被內建到核心裡面去﹐也就是開機之後隨著核心啟動而載入。至於那些選擇為“M”的項目﹐就會被編成模組﹐它可以由開機程式呼叫而載入﹐也可以由使用者啟動﹔同時﹐當它們不再需要的時候﹐也可以將之卸載。 Tips﹕在您執行 make modules_install 的時候﹐有一個問題要留意﹕假如在 /lib/moduels 目錄下面﹐已經有一個目錄的名稱﹐和您編譯的核心版本一樣的話﹐那最好就是先將它移除﹐或用 mv 改成備份。因為﹐如果您重新編譯的模組項目﹐或許和上次編的不一樣。 比方說﹐上次您將 A 編成模組﹐執行過 make modules_install﹐那它 A.o 就會存放到 /lib/modues/ 的相應版本子目錄中﹐但您這次將之改為內建﹐或是根本沒不編進核心中﹐您再執行 make moduels_install 的時候﹐A.o 應該不會被存放到那裡的﹐但它卻存放在那裡了。這樣的話﹐您在開機或建立模組相依資訊的時候﹐就會遇到錯誤信息。當然﹐您可以不理會﹐但常看到這些刺眼的句子跑出來﹐也實在不怎麼好受啦。

  38. 我們知道核心檔會存放到 /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。 如果您想看看目前有哪些模組被載入了﹐您可以輸入﹕

  39. 您會看到一堆模組的名字﹐還有它的大小﹐以及被哪些程式使用。如果是 unused 狀態的話(也就是 Used 為 0 的時候)﹐那表示該模組雖然載入了﹐但目前還沒有被任何程式所使用。然則﹐您可以用下一個命令將之移除。 假如您想將一些已經載入的模組移除的話﹐使用 rmmod後接模組名字就可以了(例如﹕rmmod md )。如果您得到該模組正在使用中 (in used) 的信息﹐那麼先將相關的程式停掉﹐以及相關模組移除就是了。例如﹕

  40. 模組之所以靈活﹐就是因為它能隨時移除﹐也能隨時載入。如果您要載入模組的話﹐可以使用 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

  41. (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/

  42. (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 確認模組載入成功。

  43. (l) 執行 mdesg | grep eth0 命令﹐確定系統有抓到網路卡之後﹐重新啟動網路﹕ service network restart (m) 查看網路設定﹕ ifconfig (註﹕請您將主機名稱和 IP 位址修改為您實際的設定。)

  44. 測試核心如果有問題﹐用磁片進行開機﹐然後重新檢查一下 /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 是怎麼說的﹐這非常重要。

  45. L i n u xQ & A http://www.lsi.idv.tw/~lsi/Lession_06.ppt

More Related