準備工做:linux
yum install bzip2 libncurses5-dev kernel-package zlib1g-dev gcc make kernel-package wget module-init-tools procps libncurses5-devvim
1,下載內核包linux-2.6.39.3放到/usr/src 目錄下es5
cd /usr/srcspa
tar -xvjf linux-2.6.39.3.tar.bz2 .net
cd linux-2.6.39.3ip
make mrproper 清除環境變量,即清除配置文件ci
make menuconfig 在菜單模式下選擇須要編譯的內核模塊:rem
initrd是舊版本mkinitrd生成的。若是直接編譯可能會出錯get
出現:mount:could not find filesystem‘/dev/root’的解決方法hash
解決方法就是加入對舊版sysfs路徑的支持,方法以下:
1)、經過make menuconfig選中如下對應的選項
General setup -->
[*] enable deprecated sysfs features to support old userspace tools
2)、修改.config文件
修改.config文件中CONFIG_SYSFS_DEPRECATED_V2,將本來被註釋掉的
CONFIG_SYSFS_DEPRECATED_V2 改爲CONFIG_SYSFS_DEPRECATED_V2=y
注 : 修改這項是由於舊版的mkinitrd及其nash在內核沒有CONFIG_SYSFS_DEPRECATED_V2參數時默認使用舊版sysfs路 徑格式,從而在新內核下沒法正確訪問/sys內的硬盤信息節點。
而後能夠寫一個編譯的腳本 vim neihe.sh 在中間加入
#! /bin/sh
make dep
make clean 確保全部東西均保持最新狀態.
make -j4 bzImage 生成內核文件
make modules 編譯模塊
make modules_install 安裝模塊
make install 安裝
安裝完成後去 /boot/grub/grub.conf 中把默認啓動內核改成0
這樣啓動的時候可能還會報錯的 做以下修改initrd-2.6.39.3initrd-2.6.39.3.imginitrd-2.6.39.3.imginitrd-2.6.39.3.imginitrd-2.6.39.3.imginitrd-2.6.39.3.imginitrd-2.6.39.3.img
1,解壓initrd文件
[root@localhost ~]# cp /boot/initrd-2.6.39.3.img /tmp
[root@localhost ~]# cd /tmp/
[root@localhost tmp]# ls
initrd-2.6.39.3.img
[root@localhost tmp]# mkdir newinitrd
[root@localhost tmp]# cd newinitrd/
[root@localhost newinitrd]# zcat ../initrd-2.6.39.3.img |cpio -i
11537 blocks
釋放以後看到以下內容
[root@localhost newinitrd]# ls
bin dev etc init lib proc sbin sys sysroot
2,下邊就是編輯init,刪掉其中重複的四行中的兩行
echo "Loading dm-region-hash.ko module"
insmod /lib/dm-region-hash.ko
echo "Loading dm-region-hash.ko module"
insmod /lib/dm-region-hash.ko
3,從新打包initrd
[root@bogon newinitrd]# find .|cpio -c -o > ../initrd-2.6.39.3.img
11538 blocks
[root@bogon newinitrd]# cd ..
[root@bogon tmp]# gzip -9 < initrd-2.6.39.3 > initrd-2.6.39.3.img
[root@bogon tmp]# ls
initrd-2.6.39.3.img newinitrd
好了,initrd.img就是從新打包的initrd了,而後把initrd.img拷貝到/boot,更改grub.conf裏邊的initrd-2.6.39.3.img
這樣「insmod: error inserting '/lib/dm-region-hash.ko' : -1 File exists」 就不會有了
編譯完成後生成linux deb 包,先dpkg -i裝image,再裝headers
安裝完成之後再update-grub 進入/boot/grub/menu.lst中選擇啓動的內核項 默認的第一項爲0
ps:在編譯完成內核後開機可能出現 Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0)的錯誤 在/boot/grub/menu.lst中能夠發現新加的內核多是沒有 initrd /initrd.img-2.6.37.6 未生成的緣由不明 能夠手動生成
執行命令
mkinitramfs -o /boot/initrd.img-2.6.34.10 2.6.34.10(/boot/initrd.img-2.6.34.10是這個啓動加載文件的生成路徑 2.6.34.10是 /lib/modules/2.6.34.10)而後update-grub 再啓動新內核就沒有問題了
卸載一個已經安裝的內核包
debian卸載舊內核要先看看有哪些舊的內核,用命令:
dpkg --get-selections |grep linux
若是你的內核是以kernel開頭的就把上面的linux改爲kernel,以後再用
dpkg --purge --force-remove-essential linux-image-XXX