Fedora 19編譯內核(打BFS+BFQ+UKSM補丁)簡易指南
准備工作
終端運行,
1
su-c'yum install rpmdevtools yum-utils ncurses-devel'
我的系統裝在SSD上,比較小,所以我把RPM的編譯主目錄放在移動硬盤(/media/c/rpmbuild)上。編輯~/.rpmmacros,修改第一行為:
1
%_topdir /media/c/rpmbuild
保存退出,然後終端下運行rpmdev-setuptree,這個時候/media/c/rpmbuild會自動生成,且下面會有RPM、BUILD、BUILDROOT等文件夾。下載Fedora所用的內核源代碼(不要去下kernel.org上的源碼,Fedora用的內核打了大量的補丁,下載原版內核編譯可能會出現問題)。
1
2
3
yumdownloader --sourcekernel --enablerepo=updates-testing
su-c'yum-builddep kernel-<version>.src.rpm'
rpm -Uvh kernel-<version>.src.rpm
是下載的內核SRPM的版本號,請相應替換之。第三條指令rpm -Uvh可能會出現一堆警告,可以忽視。
現在可以准備內核源代碼了,終端下繼續執行:
1
2
cd/media/c/rpmbuild/SPECS
rpmbuild -bp --target=$(uname-m) kernel.spec
下載好想要打的補丁,比如CK補丁集(BFS)、BFQ IO調度器、UKSM內存整理補丁等,基本都用下面這條指令打上這些補丁。
1
2
cd/media/c/rpmbuild/BUILD/kernel-<version>/linux-<version>/
patch -p1 </PATH_TO_PATCHES/patch-3.10-ck1
編譯內核
這個時候,繼續留在內核源碼目錄(/media/c/rpmbuild/BUILD/kernel-/linux-/),打開Makefile文件進行編輯,把”EXTRAVERSION =”這一行改一下,以便和Fedora倉庫裡的官方內核進行區分,比如”EXTRAVERSION = -librehat”,然後執行下面的指令。
1
2
3
cpconfigs/kernel-<version>-x86_64.config .config
makeoldconfig
makemenuconfig
第一條指令是把默認的配置復制過來(x86_64是64位PC機的配置文件),第二條make oldconfig執行後會有少數幾個選項,按照自己需要選好,然後make menuconfig後就開始對內核配置進行大刀闊斧的改動吧,這裡要提醒一下,一定要關掉Kernel hacking–>Kernel debugging,不然modules文件夾會超級大(默認配置下編譯高達1.7G!)。此外control groups(cgroups)一定要打開,不然Fedora所用的systemd會不能工作。剩下的就是精簡內核模塊、縮小內核體積!編輯完畢記得Save然後Exit.
和wiki上說的不一樣,畢竟咱不是內核開發者不去fedora提交rpm的補丁,不要重新去改SPECS然後rpm -bb什麼的了,直接終端下運行
1
makerpm
稍等(視機器水平,大概幾分鐘到幾十分鐘)完畢後,在/media/c/rpmbuild/RPMS/x86_64(假設你也是64位機器)下會有kernel和kernel-headers的rpm包生成。用rpm指令安裝之:
1
rpm -ivh <new-kernel-rpm>
准備新內核啟動
反正我安裝後沒有給我生成initramfs鏡像,也沒更新GRUB2的grub.cfg文件。所以我終端下執行下面這個指令來生成initramfs鏡像:
1
2
cd/boot
su-c'dracut initramfs-3.10.10-librehat.img 3.10.10-librehat'
其中3.10.10-librehat是內核的名字(/boot/vmlinuz-3.10.10-librehat),然後更新grub.cfg文件:
1
su-c'grub2-mkconfig > /boot/grub2/grub.cfg'
確保輸出中新內核的vmlinuz和initramfs都找到了。現在可以重啟試試新編譯的內核什麼效果了!!!我精簡後/lib/modules/3.10.10-librehat只有30+MB(最骨感的能到20+MB)。
一切順利,而且你打算讓yum不再插手內核的升級,今後內核的升級就包在自己手動優化地編譯了!那麼編輯/etc/yum.conf,在exclude裡加上kernel*(如果沒有exclude就手動加一行),如:
1
exclude=kernel*
如此,yum update或者yum upgrade就會跳過kernel相關的rpm包了!