2003年1月19日 星期日

Linux 的核心(Kernel) - 使用RPM更新核心注意事項

1. 使用 rpm -ivh kernel-<version>.<arch>.rpm 來安裝核心, 並用新核心開機, 如果有問題則回用舊核心開機
2. 不要使用 rpm -U 更新核心
3. 如果新核心開機沒有問題, 則使用 rpm -e kernel-<oldversion> 刪除舊核心

確定系統上是否已經存在一個版本, 如果存在則確定要安裝的版本是否是新版本, 並且將刪除舊版本的檔案, 不包括在建立 RPM 時標記為設定檔案, 然後將安裝新檔案, 執行 RPM 中所有安裝指令, 然後更新已安裝的資料庫

由於升級會刪除舊的核心版本, 如果新安裝的核心不穩定, 則可能會導致系統無法啟動, 並且必須使用備用啟動媒體, 例如開機磁片或CDROM, 若藉由安裝而不是升級, 核心的舊版本仍然可用, 並且可以從開機程式(boot loader)中選擇

因為所有核心RPM的檔案都是特定版本, 即在名稱中包含版本資訊, 或儲存在特定版本的路徑中, 因此可以安裝多版核心軟體包, 如果使用 rpm -ivh 而不是 -U 參數, 則新核心將被新增到系統中, 但是舊核心仍會保留, 如果忘記編輯 lilo.conf 及執行 lilo, 當系統上的新核心出現問題時, 則不會導致系統無法啟動, 因為舊核心仍然可以使用

Linux 的核心(Kernel) -7 核心編譯-4 安裝

安裝核心模組:
在安裝核心之前, 使用 make modules_install 安裝核心模組, 模組檔案將被複製到 /lib/modules/version/directory , 如果核心版本與已安裝的核心版本相同, 則新模組將覆蓋舊模組, 可能會使舊核心無法使用

9. make modules install 
(ps: 檢查 /lib/modules/kernel-version)

安裝核心:
make install 指令使用 /sbin/installkernel 來放置新核心和 System.map 檔案, 還會設定適當的符號鏈接, 執行 depmod 並建立最初的 ramdisk, 新核心的條目將添加到 GRUB 上, 但不會更改當前的預設核心

10. make install   (kernel image) (/boot->vmlinuz)

更新LILO (如有使用的話):
如果系統使用 LILO 開機程式而不是 GRUB, 則需要將新編譯的核心的新條目添加到 /etc/lilo.conf並執行 LILO 安裝程式 /sbin/lilo 來更新 LILO 的設定 (完成 kernel 後要記得修改 lilo.conf 或 grub.conf)

設定檔案(非必要): 
保留用於編譯核心的設定檔案的副本對於追蹤哪些核心啟用了哪些功能非常有用

cp /usr/src/linux-2.4/.config  /boot/config-2.4.18-3custorn

2003年1月18日 星期六

Linux 的核心(Kernel) -6 核心編譯-3 建立

建立子目錄設定檔案: 
使用 make dep 將 .config 檔案和最上層 Makefile 中定義的設定傳到子目錄設定檔案

6. make dep  (建立相依性)

編譯核心: 
Linux 核心通常是從 gzip 壓縮的映像檔載入, 其中一種是使用 make bzImage 建立, 編譯後可以在 /usr/src/linux-2.4/arch/i386/boot/bzImage 找到壓縮的核心映像檔

7. make bzImage  (產生 kernel Image)

編譯核心模組: 
核心模組儘管使用與基本核心相同的源檔案進行編譯, 但它們是通過單獨的 make 進行編譯, 通常編譯的時間會有點長, 大多數核心代碼都以核心模組的形式存在, 相關文件可以使用 /usr/src/linux-2.4/Documentation

8. make modules  (產生 modules)


ps. 上面步驟可合而為一: #make  dep  bzImage  modules

2003年1月17日 星期五

Linux 的核心(Kernel) -5 核心編譯-2 設定

試作編譯Linux核心:
從/usr/src/linux-2.4執行, 新的核心版本為2.4.18-3custom

定義適當的EXTRA VERSION: 
核心版本在最上層 Makefile 的上部定義, 確保核心 EXTRAVERSION 是唯一的, 因此模組不會覆蓋可能已經安裝的任何核心的模組

1. 設定 /usr/src/linux-2.4/Makefile: EXTRAVERSION = -3custom (設定kernel版本)

從合適的設定範本開始: 
執行 make mrproper (在 Makefile 中定義的目標, 該目標將來源(sources)恢復到乾淨狀態), 然後將適合的硬體的目標複製到 .config, 最後 make oldconfig 建立一個始於 usr/src/linux-2.4/.config 的檔案

2. make mrproper  (清除環境)
3. cp -p configs/kernel-2.4.18-i686.config  .config   (copy i686的設定檔)
4. make oldconfig  現行環境 (修改 .config)(.config kernel 設定檔)

自定 .config 設定檔案: 
有數百種可能的設定選項可用, 幾種實用工具可幫助對各種選項及其依賴性進行分類, 對於特定的核心組件, 可以選擇 (1)將元件靜態編譯到核心中, (2) 將元件包括為可動態載入的模組,  (3)將元件從核心中完全排除. 選擇核心選項時, 需考慮系統上的特定硬體以及對協定和服務的需求

5. make xconfig (make menuconfig, 或 make config)  (修改 .config)

。在"代碼成熟度級別選項(Code Maturity Level Options)"下, 選"提示開發或代碼/驅動程式不完整(Prompt for development and/or incomplete code/drivers)", 如果未選此選項則某些基本服務 (如nfsd) 可能無法正常工作
。針對處理器系列進行優化, 然後關閉數學模擬和SMP支援
。模組化所有可能的硬體支援
。關閉 ISDN 和 IrDA 支援, 以及對舊 CDROM 驅動程式的支援

Linux 的核心(Kernel) -4 核心編譯-1

。預設核心位置: /boot
。核心版本名設定慣例
-主要版本, 次要版本, 修補程式級別
。核心RPMs
- kernel-<version>.<arch>.rpm
- kernel-source-<version>.<arch>.rpm
- kernel-<version>. src. rpm
。編譯所需的RPMs

核心版本名設定慣例
核心名通常由主要版本號, 次要版本號和修補程式級別表示, 偶數版本(例如2.4.x)表示核心是穩定開發分支的一部分, 奇數版本(2.3.x)表示核心是開發中的

核心RPMs
。kernel-<版本>.<arch>.rpm: 預編譯的核心和模組
。kernel-source-<版本>.<arch>.rpm: 為<arch>建立標準核心所需的核心源(較少的標頭和與SMP相關的代碼), 安裝在 /usr/src/linux-2.4 中
。kernel-<版本>.src.rpm: 核心源代碼, kernel.org 發布的原始資源以及所有與核心相關的RPM 時使用的所有修補程式

編譯所需的RPMs
核心源: glibc-kernheaders (以前為kernel-headers), kemel-source
編譯器工具: gcc, dev86, cpp, make, binutils
文庫(Libraries): glibc-devel, ncurses, ncurses-devel

2003年1月16日 星期四

Linux 的核心(Kernel) -3 核心模組設定

。模組設定檔: /etc/modules.conf
- module aliases
- module parameters
。模組檢查: /sbin/modinfo

核心模組處理
當核心需要模組時, 它將使用 modprobe 載入它, 而 kmod 程式負責根據需要執行modprobe

模組設定
許多模組接受可以在載入時指定的參數, 例如 sb Soundblaster(音效卡) 模組接受 irq, dma 和 io 這些藉由驅動程式設定系統資源的參數, 可以在 /etc/modules.conf 設定檔中指定各種參數的預設值, 當 modprobe 載入模組時, 它將查詢該檔案以獲取適當的預設值, 還可以在 /etc/modules.conf 中指定各種模組的別名, 以及在載入或卸載模組時要執行的 shell 命令

例如  /etc/modules.conf :
pre-install pcmcia_core /etc/rc.d/init.d/pcmcia start
alias eth0 tulip
options sb io=0x220 irq=7 dma=0 mpu_io=0x300

較新的模組允許使用者可以試探模組支援的參數, 模組的作者以及模組的簡要說明, 例如modinfo -p sb 說明了上面討論的參數等

2003年1月15日 星期三

Linux 的核心(Kernel) -2 模組化核心

模組化核心元件
所有設定和硬體都不需要常駐在核心中的元件, 核心的許多元件都可以編譯為可動態載入的模組, 這可以增加核心功能, 而無需增加啟動時載入的核心映像檔的大小, 啟動時不需要的任何補充功能都是模組化的理想選擇, 包括周邊設備驅動程式和補充檔案系統

/lib/modules 目錄
核心模組位於 /lib/modules/(kernel-version)中, 目錄名稱必須與核心版本 (由 uname -r 或uname -a 取得) 完全相同, /lib/modules/<kernel-version> 的結構在 2.4 核心中已更改, kernel/{arch, drivers, fs, net} 提供了附加的層次結構級別

控制模組
模組通常由核心依需求載入, lsmod 指令可列出了核心中當前常駐的模組, 使用 insmod 指令可使核心載入特定的模組, 並且可以將各種模組參數指定為命令參數, rmmod 指令可在閒置時卸載模組
w-studio lsmod

w-studio insmod
w-studio.idv.tw
w-studio rmmod

智慧式控制模組
許多模組依賴於其他模組, 可以使用 depmod 指令產生模組相依關係資料庫, 若 rc.sysinit 中被設定為在系統啟動時執行 depmod -A 則不需要手動執行此命令, 該命令將比較文件時間並根據需要更新 modules.dep, 然後可以使用 modprobe 指令來載入核心模組, 並且對 insmod指令進行三處改進:
。modprobe 將載入特定模組所需的任何基礎模組
。modprobe 將查詢 /etc/modules.conf 以獲取預設模組參數
。modprobe 可以測試模組列表, 當成功載入模組時將停止測試列表中的其他模組
w-studio depmod

w-studio modprobe

初始化 RAM 磁碟映像
若對 SCSI, RAID 和 software RAID 設備的支援模組化, 由於掛載 root 檔案系統可能需要這些模組, 因此可以將這些模組儲存在稱為初始 RAM 磁碟映像或 initrd 的補充文件中, initrd 是檔案系統的壓縮映像檔, 其中包含核心安裝 root 檔案系統之前可能需要的模組, mkinitrd 可用於建立 initrd, 為了使核心使用 initrd, 必須將 bootloader 設定為使用它

Linux 的核心(Kernel) -1

Linux 的核心(Kernel)

核心共分為兩種, Monolithic(整體、單一) 及 Modular(模組化):

  • 整體核心(Monolithic) 是指在單個文件中建構對所有硬體, 網路協定和檔案系統所支持的核心.
  • 模組化核心(Modular) 是指其中一些驅動程式被建構為目標文件(模組)的核心, 核心可以依需求載入這些模組.

簡單來說核心就是控制及支援硬體, 網路協定和檔案系統的東西

模組化核心(Modular)是大多數發行版的標準, 因為它們允許核心在各種硬體上運作, 但不會在多餘的支持下膨脹核心, 具有整體核心(Monolithic)的系統可能會稍微加快啟動速度, 但是除了瑣碎的啟動和載入時間差異外, 整體核心不會比模組化核心表現更好

現今的眾多Linux發行版都已安裝穩定的核心, 不需要再自行重建核心, 且有問題時發行版商都會迅速發布新的核心及發行版, 在有下列狀況時才需自行重建核心:
。進行優化作為路由器而不是當作主機使用
。出於安全原因禁用不必要的功能
。啟用原本沒啟用的功能
。重新配置頁面大小, 以更改核心空間和用戶空間之間的記憶體位址分配
。更改在啟動時或通過 /proc/sys 無法設定的核心操作參數
。滿足許多筆記型電腦的特殊需求, 特別是在電源方面

2003年1月10日 星期五

Linux Boot Loader 故障排除 troubleshooting

Linux 早期版本有時會遇到開機時會無法順利開機, 可能是因為安裝多重系統時 Windows 作業系統將 MBR 給清掉, 或是 Linux 的 boot loader 設定有問題, 這時就需要系統安裝時所使用的安裝光碟來執行修復

1. 將安裝光碟第一片放入光碟機開機, 出現操作畫面時不要先按 Enter, 先輸入 linux rescue 再按 Enter 執行修復模式

2. 接著出現選擇語言時建議選英文, 因為之後修復模式用不到中文

2003年1月5日 星期日

Linux 的 Boot Loader (以 Red Hat 7.3 為例)

Linux 的 Boot Loader, 當硬碟中同時存在兩個以上作業系統時(如 Windows)可以藉此選擇要啟動的作業系統partition, 現行的 Boot Loader 有兩種, 一個是 LILO(LInux LOader), 另一個是 GRUB(GRand Unified Boot-loader)

第一階段: 選擇從哪一個Partition開機
第二階段: 從 /boot 載入 kernel image
Linux硬碟中分割區

硬碟中MBR內容
1. LILO(LInux LOader):
Red Hat Linux 7.3 的 LILO 畫面

早期的 LILO 沒有圖案, 只有簡單的文字

LILO的設定檔: /etc/lilo.conf

lilo.conf 簡單說明:
prompt 自動顯示LILO提示而無需SHIFT鍵
timeout=50 n*0.1秒 (50*0.1=5秒)
default=linux 預先載入的label標籤
boot=/dev/hda 第一階段載入位置
map=/boot/map map檔案位置
install=/boot/boot.b 第二階段載入位置
message=/boot/message 開機時出現的文字或圖樣訊息
linear 使用大容量硬碟時的設定選項
image=/boot/vmlinuz-2.4.18-3 kernel核心檔案
         label=linux 開機磁區的標籤
         initrd=/boot/initrd-2.4.18-3.img 載入RAM disk, 把kernel沒有的Driver載入
         read-only 掛載root唯讀
         root=/dev/hda3 root的路徑


2. GRUB(GRand Unified Boot-loader):
Red Hat Linux 7.3 的 GRUB 畫面, 早期 Linux 是只有文字型 LILO, 沒有 GRUB

GRUB 設定檔: /boot/grub/grub.conf

grub.conf 簡單說明:
default=0 預設開機選項, 0也就是第一個title
timeout=10 開機等待秒數
splashimage=(hd0,0)/grub/splash.xpm.gz GRUB的背景顯示圖樣
title Red Hat Linux (2.4.18-3) 開機標籤敘述
          root (hd0,0) 啟動的partition位置(hda0,0)=/dev/hda1
          kernel /vmlinuz-2.4.18-3 ro root=/dev/hda3 載入核心檔案及唯讀root路徑
          initrd /initrd-2.4.18-3.img 載入RAM disk

2003年1月2日 星期四

Linux 系統的開機程序

Linux 系統的開機程序主要有4個:
1. BIOS
2. MBR/Boot Loader
3. Kernel
4. init

1. BIOS:
。偵測外部設備
。選擇開機磁碟
。讀取開機磁碟的第一個磁區(MBR)及執行

2. MBR/Boot Loader:
。使用GRUB或LILO作為開機程式
。先選擇要從哪一個partition開機
。再從 /boot 找到 Kernel image 並載入

3. Kernel:
。偵測裝置
。載入裝置驅動程式
。掛載唯讀根目錄檔案系統
。載入 init 等程序

4. init:
。從 /etc/inittab 設定檔執行 run level
。系統初始化程式
。run level特定的程式目錄
。截取某些關鍵序列
。定義UPS電源故障/還原程式
。在虛擬控制台上生成gettys
。run level 5中初始化X