詳解linux內(nèi)核內(nèi)存管理--配置內(nèi)核與編譯內(nèi)核(非常詳細(xì))
下載內(nèi)核源碼
有兩種方式,一種方式是直接從官網(wǎng):https://www.kernel.org/直接下載,另一種方式是通過git進(jìn)行下載。
首先,在官網(wǎng)內(nèi)核版本分為三種:
mainline:主線版本,最新的
stable:穩(wěn)定版本
longterm:長期支持版本
對于內(nèi)核版本后面有個rc的,表示這個版本開始不會往里面添加新的功能和內(nèi)容,只會在其基礎(chǔ)上解決bug(有些驅(qū)動除外)。
如果你搞不懂這幾個版本區(qū)別,就下載一個stable版本準(zhǔn)沒錯。
現(xiàn)在我們著重說說如何通過git進(jìn)行下載內(nèi)核源碼:
沒有安裝git的先安裝git,命令如下
之后新建一個目錄用于存放獲取的linux內(nèi)核源碼,進(jìn)入到該目錄下,執(zhí)行如下命令來獲取最新的linux內(nèi)核版本 git clone git://http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
這樣就可以直接把內(nèi)核源碼下載到所在目錄下,很方便。
注:
如果需要下載的不是當(dāng)前最新版本的內(nèi)核,也可以通過git進(jìn)行下載其他版本的內(nèi)核源碼,不過在下載其他版本的內(nèi)核源碼的前提是已經(jīng)通過以上git命令下載過內(nèi)核源碼。
首先,當(dāng)通過以上git命令下載好內(nèi)核源碼后,應(yīng)該會有個linux-stable目錄,先進(jìn)入此目錄中,然后執(zhí)行如下命令查看其他內(nèi)核源碼版本列表
git branch -a
然后通過以下命令切換到其他內(nèi)核源碼版本的分支
git checkout 版本名稱(在git branch中的列表中的名稱)
這樣就可以切換到其他版本的linux內(nèi)核源碼了。切換后就直接是目標(biāo)版本的源碼了,也就是說,當(dāng)執(zhí)行上面的命令時,git會把其他版本中內(nèi)容不同的文件替換到本地上,就不用再重新下載一次內(nèi)核源碼了。
【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。∏?00名進(jìn)群領(lǐng)取,額外贈送一份價值699的內(nèi)核資料包(含視頻教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)?

一、配置內(nèi)核
下載完成后,通過如下命令可以將當(dāng)前系統(tǒng)使用的內(nèi)核配置文件復(fù)制到我們下載的最新內(nèi)核源碼目錄中,我們要使用這個配置文件進(jìn)行編譯內(nèi)核
cp /boot/config-x.xx.xxxx-generic ?下載的源碼目錄/.config
如果需要修改配置,可通過
make menuconfig
進(jìn)行修改配置,不過對于menuconfig,好像還會需要其他的庫,我印象是ncurses庫,如果需要則通過apt-get libncurses5-dev安裝這個庫即可。
注:
如果不想使用當(dāng)前系統(tǒng)使用的配置文件,內(nèi)核中也提供了不同平臺默認(rèn)的配置文件,這些配置文件放在: 內(nèi)核源碼目錄/arch/目標(biāo)平臺類型/configs/
如果你編譯的是arm版本的內(nèi)核,那目標(biāo)平臺類型就是arm,如果編譯的是x86版本的內(nèi)核,目標(biāo)平臺類型就是x86。在這個目錄里,那些默認(rèn)的配置文件格式一般為XXXXX_defconfig,找到對應(yīng)的默認(rèn)配置后,使用命令將其放到內(nèi)核源碼目錄下并改名為.config
cp XXXXX_defconfig 內(nèi)核源碼目錄/.config
內(nèi)核源碼目錄下的.config是內(nèi)核編譯的基礎(chǔ),其注明了哪些模塊需要編譯哪些模塊不需要編譯,又有哪些模塊需要編譯成模塊(以模塊進(jìn)行加載,并不加入到內(nèi)核鏡像中),編譯時就是按照里面的列表進(jìn)行編譯的。
二、編譯內(nèi)核
先安裝必要的工具:
sudo apt-get install build-essential
在內(nèi)核源碼目錄中依次執(zhí)行以下命令:
make -jx(x是編譯時使用的線程數(shù)量,如-j2或-j3等。使用線程能加快編譯速度) make modules_install (把安裝modules到/lib/modules/目錄中) make bzImage (將內(nèi)核編譯成bzImage類型的內(nèi)核) make install (安裝內(nèi)核)
整個過程會比較久,我大概編譯了2,3個小時(虛擬機(jī)只配了一個CPU。。。),在編譯過程中有可能使用舊的配置文件會導(dǎo)致編譯失敗,這時可以使用內(nèi)核源碼中默認(rèn)的配置文件試試。
make install幫我們做了引導(dǎo)所需要做的工作,基本上make install后重啟就直接進(jìn)入到最新的內(nèi)核中了,當(dāng)然,這部分工作我們也可以手動去做,接下來我們說說如何去做引導(dǎo)這部分所需要的工作。
第一步,我們要將編譯完成的bzImage復(fù)制到/boot/中,并改個名字,比如我的內(nèi)核版本是4.2.0-rc1,我執(zhí)行的命令就是
cp 內(nèi)核源碼目錄/arch/x86/boot/bzImage /boot/vmlinuz-4.2.0-rc1
注意編譯好的bzImage保存的位置是在內(nèi)核源碼目錄/arch/目標(biāo)平臺類型/boot/中,我這里的目標(biāo)平臺類型是x86。
第二步,將內(nèi)核源碼目錄下的System.map文件復(fù)制到/boot/中,同樣需要改個名字:
cp 內(nèi)核源碼目錄/System.map /boot/System.map-4.2.0-rc1
第三步,生成新版本的initrd.img文件
cd /lib/modules/4.2.0-rc1/ update-initramfs -c -k 4.2.0-rc1
第四步,讓grub引導(dǎo)自動查找新內(nèi)核
update-grub
最后重啟一下,選擇自己的新內(nèi)核進(jìn)入就可以了,如果希望系統(tǒng)自動進(jìn)入最新編譯的內(nèi)核,則需要修改grub的配置文件,其配置文件是/boot/grub/grub.cfg,修改此文件中的set default="X"(X是最新內(nèi)核對應(yīng)在grub中的編號)。
