Author: Kendiv
整理於: 2006/02/01
***********************************
一、安裝必要工具
***********************************
1. 安裝module-init-tools-3.2.tar.gz
:http://www.kernel.org/pub/linux/utils/kernel/module-init-tools/
安裝方法:
#tar zxvf module-init-tools-3.2.tar.gz
#cd modules-init-tools-3.2
#./configure --prefix=/
#make moveold
#make all install
#./generate-modprobe.conf /etc/modprobe.conf
2. 升級mkinitrd
:我沒有升級mkinitrd,到goole裡搜吧。
說明:
如果你啟動,載入模組沒有給出模組與核心版本不相容的資訊,就不用重新下載mkinitrd程式來編譯模組產生initrd。因為2.6相對於2.4來說,模組不是每個都改動,
如果你使用的模組沒有改動,就什麼都不用做.
具體的:
1)如果你不使用lvm2或使用lvm來做volume management,你就無需下載新版mkinitrd
2)如果你沒有使用2.6中新的模組,或者新的模組已經編譯進核心,就意味著與2.4使用的initrd.img沒有變化,就連initrd.img也無需產生
initrd.img是由bootload載入入記憶體的,ext3編成模組加在initrd中照樣可以啟動,按我的理解,ext3並非要編譯進核心中,但具體實踐中,
如果沒編譯進核心中,會出現類似如下錯誤:
mount: error 19 mounting ext3
pivotroot: pivot_root(/sysroot,/sysroot/initrd) failed: 2
umount /initrd/proc fail: 2
Freeing unused kernel memory: 244k freed
Kernel panic – not syncing: No init found. Try passing init = option to kernel.
而這可以通過重建initrd.img來解決。所謂在grub.conf中root=LABLE=/必須修改成絕對分區編號,其實也就是因為沒有產生重建initrd.img的問題造成。
如果需要安裝最新的mkinitrd,請注意:新的mkinitrd, 它需要lvm2 和device-mapper
用 rpm -ivh --nodeps mkinitrd-4.1.18-2.i386.rpm 進行安裝
安裝lvm2-2.00.25-1.01.i386.rpm時請用rpm -ivh --nodeps lvm2-2.00.25-1.01.i386.rpm
3. 安裝hotplug工具,如果沒有此工具,則USB滑鼠即使在啟動顯示ok 載入上了也不能用,2.6.15核心可使用hotplug-2004_09_23.tar.gz
:http://www.kernel.org/pub/linux/utils/kernel/hotplug/
安裝方法:
#tar zxvf hotplug-2004_09_23.tar.gz
#cd hotplug-2004_09_23
#make install
4. 下載最新的Kernel原始碼
:http://www.kernel.org/pub/linux/kernel/
***********************************
二、準備Kernel原始碼樹
***********************************
1、下載到tarball包之後,將核心tarball包複製到/usr/src目錄下,假定包在目前的目錄中,運行以下命令:
#cp linux-2.6.0.tar.gz /usr/src
2、轉到/usr/src目錄並解開tarball包,
#cd /usr/src
#tar xvzf linux-2.6.0.tar.gz
預設情況下(使用Intel x86 CPU系列),下面這一步可以省略。
3、將/usr/include/asm、/usr/inlude/linux、/usr/include/scsi連結到/usr/src/linux/include目錄下的對應目錄中。
# cd /usr/include
# rm -Rf asm linux
# ln -s /usr/src/linux/include/asm-i386 asm (如果你使用其它CPU比如PPC,那就需要串連到相應的目錄)
# ln -s /usr/src/linux/include/linux linux
# ln -s /usr/src/linux/include/scsi scsi
4、如果你還下載了補丁包,則打上補丁,你也可以運行scripts/patch-kernel指令檔自動打上補丁(準備好補丁包)或 #zcat patch-2.6.0.gz|patch -p1(我偷懶不打補丁的)。
5、修改核心原始碼 (升級2.6就是為了最佳化,乾脆連原始碼也改了吧)
1)修改/usr/src/linux/include/linux/posix_types.h
設定fd_set支援的最大數量
#define __FD_SETSIZE 1024 --->; 65536
2)修改/usr/src/linux/include/linux/fs.h
設定最大開啟檔案數量(TCP串連數量)
#define INR_OPEN 1024 --->; 65536
#define NR_FILE 8192 --->; 65536
#define NR_RESERVED_FILES 10 --->; 128
3)修改/usr/src/linux/include/net/tcp.h
設定TIMEOUT的時間為1秒
#define TCP_TIMEWAIT_LEN (60*HZ) 60 --->; 1*HZ
設定在backlog隊列裡的半串連的重試次數,每次都會花相應的時間,本質上 也是減少重試時間
#define TCP_SYNACK_RETRIES 5 --->; 3
***********************************
三、定製核心
***********************************
配製核心之前請清理原始碼樹,如果還沒有進入/usr/src/linux-2.6.0目錄,請進入此目錄,命令如下:
#make clean
#make mrproper (這步是為確保原代碼目錄下沒有不正確的.o檔案及檔案的相互依賴,剛解開的tarball包不需此步驟)
注: 可以使用make help來查看協助。
然後可以使用以下四個命令來配置核心:
#make gconfig (需要Gtk開發庫的支援)
#make xconfig (需要Qt開發庫的支援)
#make config
#make menuconfig (推薦)
配置核心選項
#make menuconfig
基本上保持預設選項就可以了,但是要注意的是必須把ext2和ext3檔案系統支援編進核心,否則升級核心重新啟動是會有錯誤:
Kernel panic: No init found. Try passing init= option to kernel
ext2和ext3檔案系統配置為: (全部選擇)
File systems --->
<*>Second extended fs support
Ext2 extended attributes
Ext2 POSIX Access Control Lists
Ext2 Security Labels
<*>Ext3 journalling file system support
Ext3 extended attributes
Ext3 POSIX Access Control Lists
Ext3 Security Labels
JBB (ext3) debugging support
注意:
如果你是ext3檔案系統,則在定製核心設定檔時把對Ext3、Ext2檔案的支援直接編譯進核心,否則,等你啟用新核心時機器就會當掉,出錯資訊如下:
kernel panic : no init found ,try passing init = option to kernel......
或者是:
kernel panic:VFS:Unable to mount root fs on unknown-block(0,0)
把對Ext3、Ext2檔案系統的支援直接編譯進核心,可解決此問題,還有把對“Module unloading“選項也選上,否則的話,你在新核心環境下將無法卸載
核心模組(rmmod命令不能用)。
***********************************
四、編譯核心及模組
***********************************
配置完核心後,開始編譯:
#make dep (編譯2.6核心無需此步驟)
#make -jn (n代表同時編譯的進程,可以加快編譯速度,n由你的配置決定,我的配置用15-25)
注意: 此命令已完成make bzImage及make modules的工作, 產生的bzImage核心檔案在arch/i386/boot目錄中,你的CPU不同核心檔案存放位置也不同
注: 這一步比較耗時,根據機器配置,可能會消耗30分鐘或更長時間。
***********************************
五、編譯可載入模組和安裝新核心
***********************************
如果使用者在配置核心時設定了可載入模組,則需要對這些模組進行編譯,以便將來使用insmod命令進行載入。
# make modules -j25
# make modules_install (安裝核心模組到/lib/modules/2.x.x下)
# make install (完成mkinitrd命令及核心(bzImage)和System.map的拷貝)
完成後,請查看/boot目錄,檔案名稱是有區別的,如是GRUB引導,make install命令已幫你自動修改了引導選項,對於LILO則要手工修改,重寫引導記錄。
***********************************
六、修改相應檔案已適應2.6核心
***********************************
1.核心2.6 的usb 裝置名稱與核心2.4 大不相同。所以我們要改一下哈哈。
在安裝module-init-tools程式包時產生的/etc/modprobe.conf設定檔卻仍然使用usb-ohci這個名字
alias usb-controller usb-ohci
alias usb-controller1 ehci-hcd
因此, 要把它改為:
alias usb-controller ohci-hcd
alias usb-controller1 ehci-hcd
2.需要改一個最重要的檔案/etc/rc.sysconfig 這是一個ln 串連。正真的檔案在/etc/rc.d/裡
#vi /etc/rc.sysinit
把/proc/ksyms 改為如下所示(註:用於配置了HOTPLUG的支援)
KSYMS=/proc/ksyms
改為:
KSYMS=/proc/kallsyms
3.把所有mount -f -t usbdevfs usbdevfs 改為mount -f -t usbfs usbfs 我查看了就二個。
4.建立一個/sys系統這部我也不知道為啥,但你是用預設的/proc/bus/usb 下就提示找不到drivers 檔案。暈死了。
# mkdir /sys
6.修改rc.sysconfig 檔案
在mount -f /proc 下加入
mount -f /sys 這一行
7.# Mount /proc (done here so volume labels can work with fsck)
action $"Mounting proc filesystem: " mount -n -t proc /proc /proc
action $"Mounting sysfs filesystem: " mount -n -t sysfs /sys /sys
加入上面這行
8.修改fstab
#vi /etc/fstab 加入如下
none /sys sysfs defaults 0 0
.
9.修改/etc/init.d/halt 為如下
awk '$2 ~ /^//$|^//proc|^//dev/{next}
改為
awk '$2 ~ /^//$|^//proc|^//sys|^//dev/{next}
10.把needusbstorage=這段改成如下
needusbstorage=
if [ $usb = "1" ]; then
needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" /proc/bus/usb/devices 2>/dev/null`
LC_ALL=C grep 'hid' /proc/bus/usb/drivers || action $"Initializing USB HID interface: " modprobe hid 2> /dev/null
action $"Initializing USB keyboard: " modprobe keybdev 2> /dev/null
action $"Initializing USB mouse: " modprobe mousedev 2> /dev/null
fi
改成如下:
needusbstorage=
if [ $usb = "1" ]; then
needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" /sys/bus/usb/devices 2>/dev/null`
action $"Initializing USB HID interface: " modprobe usbhid 2> /dev/null
action $"Initializing USB keyboard: " modprobe usbkbd 2> /dev/null
action $"Initializing USB mouse: " modprobe usbmouse 2> /dev/null
fi
這些完成就reboot吧! 希望在啟動時全是ok.
補充:
***********************************
七、手動安裝新核心和System.map
***********************************
1、將新核心和System.map檔案拷貝到/boot目錄下
# cp /usr/src/linux-2.6/arch/i386/boot/bzImage /boot/vmlinuz-2.6.15-10custom
# cp /usr/src/linux-2.6/System.map /boot/System.map-2.6.15-10custom
# cd /boot
# rm -f System.map (刪除原來的串連)
# ln -s System.map-2.6.15-10custom System.map (重建立立串連)
***********************************
八、配置LILO
***********************************
1.配置/etc/lilo.conf檔案,在該檔案中加入下面幾行:
image=/boot/vmlinuz-2.6.15-10custom
label=linux-custom
initrd=/boot/initrd-2.6.15-10.img
read-only
root=/dev/hda3 (這與你的具體配置有關)
並把default=linux改為default=linux-custom
2.使新配置生效
# /sbin/lilo
***********************************
九、配置grub使用2.6的I/O調度器
***********************************
設定之前先介紹一下2.6的I/O調度器
2.6包含的四個I/O調度器分別是No-op I/O scheduler、Anticipatory I/O scheduler、Deadline I/O scheduler與CFQ I/O scheduler。
在後文中分別簡稱為ns、as、ds與cfq。
ns是一個簡化的發送器它只作最基本的合并與排序。與案頭系統的關係不是很大,主要用在一些特殊的軟體
與硬體環境下,這些軟體與硬體一般都擁有自己的調度機制對核心支援的要求很小,這很適合一些嵌入式系統內容。作為案頭使用者我們一般不會選擇它。
as是當前核心中預設的I/O調度器。它擁有非常好的效能,在2.5中它就相當引人注意。在與2.4核心進行的對比測試中,在2.4中多項以分鐘為單位
完成的任務,它則是以秒為單位來完成的。正因為如此它成為目前2.6測試版中預設的I/O調度器。但它也存在著弱點,它本身是比較龐大與複雜的,
在一些特殊的情況下,特別是在資料輸送量大型資料庫系統中它會變的比較緩慢。
ds就是針對as的缺點進行改善而來的,還處於測試階段,但已經很穩定了。目前表現出的效能幾乎與as一樣好。加之比as更加小巧,
是相當有前途的調度器,值得一試:)
cfq為系統內的所有任務分配相同的頻寬,提供一個公平的工作環境,它比較適合案頭環境。事實上在測試中它也有不錯的表現,
mplayer xmms等多媒體播放器與它配合的相當好,回放平滑幾乎沒有因訪問磁碟而出現的跳幀現象。對於喜歡在Linux下聽音樂看電影的朋友不妨嘗試一下。
好了,下面說說怎麼設定:參數的格式為elevator=調度器名
修改/boot/grub/grub.conf,在kernel那行後門加入elevator=deadline
例如:kernel /boot/vmlinuz-2.6.10-bk4 ro root=/dev/你的根分區 elevator=deadline
***********************************
使用新核心可能出現的問題及對策
***********************************
1. RedHat使用者rpm命令不能使用,解決辦法:請把變數在全域設定檔中聲明。
這是RPM的一個Bug,特別是對於RH9的使用者,請開啟/etc/profile檔案,命令如下:
#vi /etc/profile (在檔案的末尾加上幾句如下)
if [`uname -r`="2.6.0" ];then
export LD_ASSUME_KERNEL=2.2.5
fi
也就是給系統加上一個全域的環境變數,也可直接鍵入#export LD_ASSUME_KERNEL=2.2.5。
2. 新核心根本起不來,解決方案:重新設定核心(學問挺大),也許還根引導記錄有關(很少了);
3. 新核心模組無法載入,會導致很多問題,比如了防火牆沒法工作了,mount不上光碟片和vfat及ntfs檔案系統,其解決方案:升級module-init-tools軟體包,
RedHat的使用者可能還要修改/etc/rc.d/rc.sysinit檔案;
**************************** 全文完 **************************