1. 程式人生 > >鳥哥的Linux私房菜讀書筆記--核心的編譯與安裝

鳥哥的Linux私房菜讀書筆記--核心的編譯與安裝

1、編譯核心與核心模組

[[email protected] linux-3.10.89]# make vmlinux <==未經壓縮的核心
[[email protected] linux-3.10.89]# make modules <==僅核心模組
[[email protected] linux-3.10.89]# make bzImage <==經壓縮過的核心(預設)
[[email protected] linux-3.10.89]# make all <==進行上述的三個動作

我們常見的在 /boot/ 底下的核心檔案,都是經過壓縮過的核心檔案,因此,上述的動作中比較常用 的是 modules 與 bzImage 這兩個,其中 bzImage 第三個字母是英文大寫的 I 喔!bzImage 可以制 作出壓縮過後的核心, 也就是一般我們拿來進行系統開機的資訊囉!所以,基本上我們會進行的動 作是: [

[email protected] linux-3.10.89]# make -j 4 clean <==先清除暫存檔 [[email protected] linux-3.10.89]# make -j 4 bzImage <==先編譯核心 [[email protected] linux-3.10.89]# make -j 4 modules <==再編譯模組 [[email protected] linux-3.10.89]# make -j 4 clean bzImage modules <==連續動作! 上述的動作會花費非常長的時間,編譯的動作依據你選擇的專案以及你主機硬體的效能而不同。此外, 為啥要加上 -j 4 呢? 因為我的系統上面有四個 CPU 核心,這幾個核心可以同時進行編譯的行為, 這樣在編譯時速度會比較快!如果你的 CPU 核心數 (包括超執行緒) 有多個, 那這個地方請加上你 的可用 CPU 數量吧! 最後製作出來的資料是被放置在 /usr/src/kernels/linux-3.10.89/ 這個目錄下,還沒有被放到系統的相關 路徑中喔!在上面的編譯過程當中,如果有發生任何錯誤的話, 很可能是由於核心專案的挑選選擇 的不好,可能你需要重新以 make menuconfig 再次的檢查一下你的相關設定喔! 如果還是無法成功 的話,那麼或許將原本的核心資料內的 .config 檔案,複製到你的核心原始檔案目錄下, 然後據以 修改,應該就可以順利的編譯出你的核心了。最後注意到,下達了 make bzImage 後,最終的結果應 該會像這樣:

Setup is 16752 bytes (padded to 16896 bytes).
System is 4404 kB
CRC 30310acf
Kernel: arch/x86/boot/bzImage is ready (#1)
[[email protected] linux-3.10.89]# ll arch/x86/boot/bzImage
-rw-r--r--. 1 root root 4526464 Oct 20 09:09 arch/x86/boot/bzImage

2、實際安裝模組

對於同一版本的模組反覆安裝會產生衝突,解決方法: · 先將舊的模組目錄更名,然後才安裝核心模組到目標目錄去; · 在 make menuconfig 時,那個 General setup 內的 Local version 修改成新的名稱。

3、開始安裝新賀新年與多重核心選單

<1>移動核心到 /boot 且保留舊核心檔案 保留舊核心有什麼好處呢?最大的好處是可以確保系統能夠順利開機啦!因為核心雖然被編譯成功了, 但是並不保證我們剛剛挑選的核心專案完全適合於目前這部主機系統, 可能有某些地方我們忘記選 擇了,這將導致新核心無法順利驅動整個主機系統,更差的情況是, 你的主機無法成功開機成功! 此時,如果我們保留舊的核心,呵呵!若新核心測試不通過,就用舊核心來啟動啊!嘿嘿! 保證比 較不會有問題嘛!另外,核心檔案通常以 vmlinuz 為開頭,接上核心版本為依據的檔名格式,因此 可以這樣做看看:

[[email protected] linux-3.10.89]# cp arch/x86/boot/bzImage /boot/vmlinuz-3.10.89vbird <==實際核心
[[email protected] linux-3.10.89]# cp .config /boot/config-3.10.89vbird <==建議配置檔案也複製備份
[[email protected] linux-3.10.89]# chmod a+x /boot/vmlinuz-3.10.89vbird
[[email protected] linux-3.10.89]# cp System.map /boot/System.map-3.10.89vbird
[[email protected] linux-3.10.89]# gzip -c Module.symvers > /boot/symvers-3.10.89vbird.gz
[[email protected] linux-3.10.89]# restorecon -Rv /boot

<2>建立相對應的 Initial Ram Disk (initrd) 由於鳥哥的系統使用 SATA 磁碟,加上剛剛 SATA  磁碟支援的功能並沒有直接編譯到核心去,所以當然要使用 initramfs 來載入才行! 使用如下的方 法來建立 initramfs 吧!記得搭配正確的核心版本喔!

[[email protected] ~]# dracut -v /boot/initramfs-3.10.89vbird.img 3.10.89vbird

<3>編輯開機選單 (grub) 前面的檔案大致上都擺放妥當之後,同時得要依據你的核心版本來處理檔名喔!接下來就直接使用 grub2-mkconfig 來處理你的 grub2 開機選單設定即可!讓我們來處理處理先!

[[email protected] ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.89vbird # 應該要最早出現!
Found initrd image: /boot/initramfs-3.10.89vbird.img
.....(底下省略).....

因為預設較新版本的核心會放在最前面成為預設的開機選單專案,所以你得要確認上述的結果中,第 一個被發現的核心為你剛剛編譯好的核心檔案才對喔! 否則等一下開機可能就會出現使用舊核心開 機的問題。現在讓我們重新啟動來測試看看囉! <4>重新以新核心開機、測試、修改 如果上述的動作都成功後,接下來就是重新啟動並選擇新核心來啟動系統啦!如果系統順利啟動之後, 你使用 uname -a 會出現類似底下的資料:

[[email protected] ~]# uname -a
Linux study.centos.vbird 3.10.89vbird #1 SMP Tue Oct 20 09:09:11 CST 2015 x86_64
x86_64 x86_64 GNU/Linux

包括核心版本與支援的硬體平臺都是 OK 的!嘿嘿!那你所編譯的核心就是差不多成功的啦! 如果 運作一陣子後,你的系統還是穩定的情況下,那就能夠將 default 值使用這個新的核心來作為預設開 機囉! 這就是核心編譯!那你也可以自己處理嵌入式系統的核心編譯

5、以最新核心版本編譯centos7.x的核心

1. 先下載 ELRepo 上面的 SRPM 檔案!同時安裝它: [[email protected] ~]# wget  http://elrepo.org/linux/kernel/el7/SRPMS/kernel-ml-4.2.3-1.el7.elrepo.nosrc.rpm [[email protected] ~]# rpm -ivh kernel-ml-4.2.3-1.el7.elrepo.nosrc.rpm 2. 根據上述的檔案,下載正確的核心原始碼: [[email protected] ~]# cd rpmbuild/SOURCES [[email protected] SOURCES]# wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.2.3.tar.xz [[email protected] SOURCES]# ll -tr .....(前面省略)..... -rw-r--r--. 1 root root 85523884 Oct 3 19:58 linux-4.2.3.tar.xz # 核心原始碼 -rw-rw-r--. 1 root root 294 Oct 3 22:04 cpupower.service -rw-rw-r--. 1 root root 150 Oct 3 22:04 cpupower.config -rw-rw-r--. 1 root root 162752 Oct 3 22:04 config-4.2.3-x86_64 # 主要的核心功能 3. 修改核心功能設定: [[email protected] SOURCES]# vim config-4.2.3-x86_64 # 大約在 5623 行找到底下這一行,並在底下新增一行設定值! # CONFIG_VFIO_PCI_VGA is not set CONFIG_VFIO_PCI_VGA=y [[email protected] SOURCES]# cd ../SPECS [[email protected] SPECS]# vim kernel-ml-4.2.spec # 大概在 145 左右找到底下這一行: Source0: ftp://ftp.kernel.org/pub/linux/kernel/v4.x/linux-%{LKAver}.tar.xz # 將它改成如下的模樣: Source0: linux-%{LKAver}.tar.xz 4. 開始編譯並打包: [[email protected] SPECS]# rpmbuild -bb kernel-ml-4.2.spec # 接下來會有很長的一段時間在進行編譯行為,鳥哥的機器曾經跑過兩個小時左右才編譯完! # 所以,請耐心等候啊! Wrote: /root/rpmbuild/RPMS/x86_64/kernel-ml-4.2.3-1.el7.centos.x86_64.rpm Wrote: /root/rpmbuild/RPMS/x86_64/kernel-ml-devel-4.2.3-1.el7.centos.x86_64.rpm Wrote: /root/rpmbuild/RPMS/x86_64/kernel-ml-headers-4.2.3-1.el7.centos.x86_64.rpm Wrote: /root/rpmbuild/RPMS/x86_64/perf-4.2.3-1.el7.centos.x86_64.rpm Wrote: /root/rpmbuild/RPMS/x86_64/python-perf-4.2.3-1.el7.centos.x86_64.rpm Wrote: /root/rpmbuild/RPMS/x86_64/kernel-ml-tools-4.2.3-1.el7.centos.x86_64.rpm Wrote: /root/rpmbuild/RPMS/x86_64/kernel-ml-tools-libs-4.2.3-1.el7.centos.x86_64.rpm Wrote: /root/rpmbuild/RPMS/x86_64/kernel-ml-tools-libs-devel-4.2.3-1.el7.centos.x86_64.rpm 如上表最後的狀態,你會發現竟然已經有 kernel-ml 的軟體包產生了!接下來你也不需要像手動安裝 核心一樣,得要一個一個專案移動到正確的位置去, 只要使用 yum install 新的核心版本,就會有 4.2.3 版的核心在你的 CentOS 7.x 當中了耶!相當神奇! [[email protected] ~]# yum install /root/rpmbuild/RPMS/x86_64/kernel-ml-4.2.3-1.el7.centos.x86_64.rpm [[email protected] ~]# reboot [[email protected] ~]# uname -a Linux study.centos.vbird 4.2.3-1.el7.centos.x86_64 #1 SMP Wed Oct 21 02:31:18 CST 2015 x86_64 x86_64 x86_64 GNU/Linux