升級2.6內核到底需要進行哪些事情?
升級到2.6是不是make config;make bzImage;make modules;make ...到最後處理一下grub或lilo的配置這麼簡單?
本文講述了一點升級到kernel-2.6最起碼的事情,注意是最起碼的:
首先你要知道2.6需要注意的幾件事情:
多了一個sysfs虛擬文件系統
老版本的modutils不能用了,module-init-tools要安裝。
modules.conf和modprobe.conf是怎麼回事兒?
USB模塊名都變了
聲卡配置怎麼辦?kernel-2.6采用alsa, alsa的配置工具是什麼?
升級kernel會導致一些軟件不能使用嗎?
什麼版本的gcc都行嗎?
...
好了,繼續,我的系統環境:
MagicLinux 1.2pre4b, gcc-3.3.1
要升級的2.6版本是2.6.0test7
編譯:
第一步很簡單,按照慣例,打好補丁,配置,編譯。
我仍然是打成了rpm包,打了cp936少數漢字錯誤的一個補丁。
SMBFS和系統文件系統缺省的codec都為cp936。
因為是作產品,所以打開了盡可能多的驅動,包括USB鍵盤和鼠標。
打了for i586, i686, athlon的3個包,成功。
編譯initscripts, 編譯modutils和module-init-tools, 編譯mkinitrd
安裝。
你會發現,系統多了一套modules命令,就是*.old,這就是不能用的命令,
新的命令基於這些old,由module-init-tools提供。
安裝所有軟件包,檢查grub配置沒有問題,重啟。
啟動過程中USB驅動載入錯誤。
發現自己在/etc/modules.conf中定義的alias char-major-188 off無效
檢查,發現一個generate-modprobe.conf腳本:到/etc/運行。
generate-modprobe.conf modprobe.conf移植modules.conf配置。
重啟:char-major-188模塊找不到錯誤消失,說明alias char-major-188生效。
繼續usb配置問題:發現/proc/bus/usb/根本不存在,這就是前面提到到sysfs問題:
代碼:
1, mkdir /sys
2, 在/etc/rc.sysinit中,只要有mount -f /proc就在下面加上mount -f /sys
3, 在/etc/rc.sysinit中,找到:
action $"Mounting proc filesystem: " mount -n -t proc /proc /proc
加上:
action $"Mounting sysfs filesystem: " mount -n -t sysfs /sys /sys
4,在/etc/fstab中加上:
none /sys sysfs defaults 0 0
5,把/etc/rc.d/init.d/halt中的:
awk '$2 ~ /^/$^/proc^/dev/{next}
修改成:
awk '$2 ~ /^/$^/proc^/sys^/dev/{next}
重啟,USB載入仍然錯誤。
但是/下已經多了一個文件系統/sys
/sys/bus/usb仍然不存在。
怎麼辦?手動probe模塊測試:
modprobe hid
modprobe usbmouse(注意不是mousedev了和keybdev了)
lsmod看看,內核裡確實加載了,但是usb鼠標紋絲不動。
忘了最重要的一個:
modprobe usb-uhci
系統提示不存在。
原來usb-uhci也沒有了,usb-ohci當然也沒有了。
而是uhci-hcd.
modprobe uhci-hcd,呵呵,鼠標可以用了。
修改/etc/rc.sysinit/
找到跟usb有關的信息:
代碼:
usb=0
if ! LC_ALL=C grep -iq "nousb" /proc/cmdline 2>/dev/null && ! LC_ALL=C grep -q "usb" /proc/devices 2>/dev/null ; then
aliases=`/sbin/modprobe -c awk '/^alias usb-controller/ { print $3 }'`
if [ -n "$aliases" -a "$aliases" != "off" ]; then
modprobe usbcore
for alias in $aliases ; do
[ "$alias" != "off" ] && action $"Initializing USB controller ($alias): " modprobe $alias
done
[ $? -eq 0 -a -n "$aliases" ] && usb=1
fi
fi
if ! LC_ALL=C grep -iq "nousb" /proc/cmdline 2>/dev/null && LC_ALL=C grep -q "usb" /proc/devices 2>/dev/null ; then
usb=1
fi
if [ $usb = 1 -a ! -f /proc/bus/usb/devices ]; then
action $"Mounting USB filesystem: " mount -t usbdevfs usbdevfs /proc/bus/usb
fi
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
大體解釋一下:
定義usb變量為0
定義aliases變量為:
/sbin/modprobe -c awk '/^alias usb-controller/ { print $3 }的執行結果。
aliases存在且不為空時:
載入usbcore
然後載入aliases定義的內容,
置usb為1
掛接usbdevfs
needusbstorage大概就是U盤了,這個變量跟下面幾句沒關系。
載入hid,鍵盤,鼠標驅動。
這裡需要修改的是:
1,/proc/sys/usb定義是錯的,應該是/sys
2,modprobe -c 能不能找到alias usb-controller,從而定義變量aliases為usb-uhci, 運行一下是不能的。
3,模塊名不對,usbmouse和usbkbd才對。
根據邏輯,修改成:
代碼:
modprobe usbcore
action $"Initializing USB controller (uhci-hcd): " modprobe uhci-hcd
usb=1
if [ $usb = 1 -a ! -f /sys/bus/usb/devices ]; then
action $"Mounting USB filesystem: " mount -t usbdevfs usbdevfs /sys/bus/usb
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 hid 2> /dev/null
action $"Initializing USB keyboard: " modprobe usbkbd 2> /dev/null
action $"Initializing USB mouse: " modprobe usbmouse 2> /dev/null
fi
載入usbcore, uhci-hcd(也就是usb-uhci的新版本)
然後掛接usbdevfs,然後定義needusbstorage為以後的使用,然後就是載入鼠標鍵盤驅動。
檢查一下rc.sysinit和/etc/rc.d/init.d/halt腳本,看看還有沒有/proc/bus/usb的定義,通通搞成/sys/bus/usb.
重啟,OK,模塊正常載入,鼠標可以用了。
啟動kde,沒聲。
對了,以前一直用oss,現在內核提供的是alsa.
找出一個配置工具alsaconf,這個是alsa-drivers的utils
配置,不行,找不到聲卡,問題在於kernel-2.6的模塊不再是.o而是.ko
修改alsaconf中所有的.o為.ko.
配置,OK,找到聲卡為i810內嵌的,也就是ac97音效,正確的寫入了
/etc/modules.conf,
lsmod一看,內核模塊沒有馬上載入,說明alsaconf還是有點問題,
modprobe一下:
modprobe snd-intel8x0,OK了,內核驅動載入。
用alsa play播放:
aplay sample.wav
有聲音了。
重啟,lsmod看看,snd-intel8x0沒有載入,/etc/modules.conf裡不是有了嗎?
以我的判斷,肯定是正確的,試試generate-modprobe.conf,剛才那個
char-major-188的錯誤就是這麼解決的。
做完之後,再重啟,再lsmod看看,還是沒有載入聲卡驅動。
modprobe snd-intel8x0,出錯,看來是modprobe.conf導致的,
把裡面的sound相關配置通通刪掉,重啟後modprobe又可以出聲了。
沒有辦法,好好讀讀alsaconf代碼,發現了以前單獨安裝alsa的時候一個經典的東西:
alsasound啟動進程。
這個東西也在alsadrivers的utils目錄,找出來。
./alsasound start自動載入所有模塊
./alsasound stop 自動卸載所有模塊
OK,目的達到。
cp alsasound /etc/rc.d/init.d
chkconfig --add alsasound
再看看alsaconf原來可以進行測試聲音的播放,只是以前從來沒有把wav文件裝上過,
拷貝一個wav文件,再次運行:
alsaconf
配置成功,然後自動載入模塊成功,然後就是aplay這個wav.
OK,至此為止,基本的kernel-2.6升級工作完成了。
lsusb, usbview, kde 信息中心中usb目錄定義仍然不對,所以通過這些命令你看不到系統任何usb信息
自己修正吧,其他的軟件問題也不少,所以以上的工作是最基礎的,所以建議大家沒事不要趕什麼潮流。
對了,忘了說了,kernel-2.6安裝後,我測試重新編譯kernel-2.6,gcc出現異常,連續測試7次,每次
都在隨機的位置退出編譯,說明gcc已經不能正常工作,可能又要LD_ASSUME_KERNEL,始終不是一件好事。
繼續升級glibc, gcc再所難免'
以我的判斷,肯定是正確的,試試generate-modprobe.conf,剛才那個
char-major-188的錯誤就是這麼解決的。
做完之後,再重啟,再lsmod看看,還是沒有載入聲卡驅動。
modprobe snd-intel8x0,出錯,看來是modprobe.conf導致的,
把裡面的sound相關配置通通刪掉,重啟後modprobe又可以出聲了。
沒有辦法,好好讀讀alsaconf代碼,發現了以前單獨安裝alsa的時候一個經典的東西:
alsasound啟動進程。
這個東西也在alsadrivers的utils目錄,找出來。
./alsasound start自動載入所有模塊
./alsasound stop 自動卸載所有模塊
OK,目的達到。
cp alsasound /etc/rc.d/init.d
chkconfig --add alsasound
再看看alsaconf原來可以進行測試聲音的播放,只是以前從來沒有把wav文件裝上過,
拷貝一個wav文件,再次運行:
alsaconf
配置成功,然後自動載入模塊成功,然後就是aplay這個wav.
OK,至此為止,基本的kernel-2.6升級工作完成了。
lsusb, usbview, kde 信息中心中usb目錄定義仍然不對,所以通過這些命令你看不到系統任何usb信息
自己修正吧,其他的軟件問題也不少,所以以上的工作是最基礎的,所以建議大家沒事不要趕什麼潮流。
對了,忘了說了,kernel-2.6安裝後,我測試重新編譯kernel-2.6,gcc出現異常,連續測試7次,每次
都在隨機的位置退出編譯,說明gcc已經不能正常工作,可能又要LD_ASSUME_KERNEL,始終不是一件好事。
繼續升級glibc, gcc再所難免'