自編 Linux 核心
為什麼要自己編 Linux 核心 ?
缺點:程度還沒到那邊的人,編出來的核心有時候開機會當機。
優點:
1. 修正舊核心的 bug
2. 支援新的硬體
3. 針對自己主機的硬體進行最佳化
4. 關閉不必要的核心模組,精簡編譯完之核心大小
如何挑核心
Linux 有一個存放核心的官方網站 (https://www.kernel.org/),在此網站中會有各個版本的最新核心,我們為了要調整自己使用機器之效能,因此必須要自行編譯核心,在核心官方網站中有三個種類的核心可下載,分別是:
- mainline - 目前開發版本,主要目的是加入新功能及測試,不建議在伺服器/嵌入式系統中使用,以免有未修正之 bug 導致機器不穩。
- stable - 穩定版核心,可提供日常使用
- longterm - 此版核心又稱為 LTS (Long Term Support - 長期支援) 核心,主要目的在於修正已知 bug,非常適合伺服器/嵌入式系統中使用。
如何編核心
1. 安裝程式編譯環境
2. 安裝核心編譯環境
3. 下載核心
4. 編譯核心
5. 安裝核心
6. 重新開機 -> 正常開機(OK)
-> 當機(以舊版核心重開,設法解決問題)
1. 安裝程式編譯環境
編譯 Linux 核心主要會使用到 GCC,在安裝 GCC 之前,我們可以看一下目前系統的 Linux 核心是由那一版的 GCC 所編譯完成,請執行:
$ dmesg | more
可以看到底下片段:
[ 0.000000] Linux version 3.16.0-4-amd64 (debian-kernel@lists.debian.org) (gcc version 4.8.4 (Debian 4.8.4-1) ) #1 SMP Debian 3.16.7-ckt20-1+deb8u3 (2016-01
-17)
此訊息告訴我們 Linux 核心是由 gcc 4.8.4 所編譯完成,因此如果我們安裝 GCC 的話,以 4.8.4 (以上) 為主。
編譯 Linux 核心主要會使用到 GCC,在安裝 GCC 之前,我們可以看一下目前系統的 Linux 核心是由那一版的 GCC 所編譯完成,請執行:
$ dmesg | more
可以看到底下片段:
[ 0.000000] Linux version 3.16.0-4-amd64 (debian-kernel@lists.debian.org) (gcc version 4.8.4 (Debian 4.8.4-1) ) #1 SMP Debian 3.16.7-ckt20-1+deb8u3 (2016-01
-17)
此訊息告訴我們 Linux 核心是由 gcc 4.8.4 所編譯完成,因此如果我們安裝 GCC 的話,以 4.8.4 (以上) 為主。
請安裝
gcc-4.8
cpp-4.8
g++-4.8
這三個套件,其中每個套件各有兩個版本:
gcc
gcc-4.8
gcc-4.9
cpp
cpp-4.8
cpp-4.9
g++
g++-4.8
g++-4.9
我們可以在 /usr/bin 目錄中看到目前的版本為何,或是執行以下指令:
gcc -v
cpp -v
g++ -v
如果我們至 /usr/bin 目錄下執行
ls -l gcc* cpp* g++*
會看到以下輸出:
lrwxrwxrwx 1 root root 7 3月 4 10:05 cpp -> cpp-4.8
-rwxr-xr-x 1 root root 772600 12月 20 2014 cpp-4.8
-rwxr-xr-x 1 root root 833080 12月 26 2014 cpp-4.9
lrwxrwxrwx 1 root root 7 3月 4 10:05 g++ -> g++-4.8
-rwxr-xr-x 1 root root 776696 12月 20 2014 g++-4.8
lrwxrwxrwx 1 root root 7 3月 4 10:05 gcc -> gcc-4.8
-rwxr-xr-x 1 root root 772600 12月 20 2014 gcc-4.8
-rwxr-xr-x 1 root root 24736 12月 20 2014 gcc-ar-4.8
-rwxr-xr-x 1 root root 24704 12月 20 2014 gcc-nm-4.8
-rwxr-xr-x 1 root root 24704 12月 20 2014 gcc-ranlib-4.8
lrwxrwxrwx 1 root root 7 3月 4 10:05 cpp -> cpp-4.8
-rwxr-xr-x 1 root root 772600 12月 20 2014 cpp-4.8
-rwxr-xr-x 1 root root 833080 12月 26 2014 cpp-4.9
lrwxrwxrwx 1 root root 7 3月 4 10:05 g++ -> g++-4.8
-rwxr-xr-x 1 root root 776696 12月 20 2014 g++-4.8
lrwxrwxrwx 1 root root 7 3月 4 10:05 gcc -> gcc-4.8
-rwxr-xr-x 1 root root 772600 12月 20 2014 gcc-4.8
-rwxr-xr-x 1 root root 24736 12月 20 2014 gcc-ar-4.8
-rwxr-xr-x 1 root root 24704 12月 20 2014 gcc-nm-4.8
-rwxr-xr-x 1 root root 24704 12月 20 2014 gcc-ranlib-4.8
這表示上述三個命令都聯結到 4.8 版,全部的聯結版本都要一致才行。檢查方式是執行:
$ gcc -v
$ g++ -v
$ cpp -v
$ gcc -v
$ g++ -v
$ cpp -v
來觀看版本編號,安裝完畢後請編譯 hello.c,指令如下:
gcc hello.c -o hello
再執行
./hello
如果出現 Hello world!! 即代表我們的程式編譯環境安裝 OK!!
2. 安裝核心編譯環境
請安裝以下套件才可編譯核心
kernel-package
libncurses5-dev
bzip2
xz-utils
3. 下載核心
國內 Linux 核心映站在:
linux.cdpa.nsysu.edu.tw (與底下那台合併了)
ftp://ftp.twaren.net/pub/Unix/Kernel/linux/kernel/v4.x/
ftp.isu.edu.tw
請將 Linux 核心下載至 /usr/src 目錄,我們以 4.4.23 為例,請下載
linux-4.4.23.tar.xz
附帶一提:xz 格式是目前壓縮率最高之非失真壓縮演算法
(失真壓縮演算法->jpg)
3.5 解壓縮
請在 /usr/src 目錄執行:
/usr/src/ # tar xfva linux-4.4.23.tar.xz
此時會出現一個 linux-4.4.23 的目錄,我們要建一個 link
/usr/src/ # ln -s linux-4.4.23 linux
4. 編譯核心
a. /usr/src # cd linux
a.5 複製已存在核心編譯參數,注意那個點!!
/usr/src/linux # cp /boot/config-3.16.0-4-amd64 .config
b. 設定編譯核心參數
/usr/src/linux # make menuconfig
General setup --->
Kernel compression mode (XZ) --->
Processor type and features --->
Processor family (Core 2/newer Xeon) --->
[*] Networking support --->
Networking options --->
[*] Network packet filtering framework (Netfilter) ---
IP: Netfilter Configuration ---> M
IPv6: Netfilter Configuration ---> M
修改完畢後退出 Linux 核心編譯的設定畫面。
/usr/src/linux # make menuconfig
General setup --->
Kernel compression mode (XZ) --->
Processor type and features --->
Processor family (Core 2/newer Xeon) --->
[*] Networking support --->
Networking options --->
[*] Network packet filtering framework (Netfilter) ---
IP: Netfilter Configuration ---> M
IPv6: Netfilter Configuration ---> M
c. time make-kpkg --initrd --revision=1.0.lpm kernel_image -j8
編譯完成後,你會有一個檔案叫:
/usr/src/linux-image-4.4.23_1.0.lpm_amd64.deb
我們再來安裝此檔即可,安裝指令如下:
/usr/src # dpkg -i linux-image-4.4.23_1.0.lpm_amd64.deb
/usr/src # dpkg -i linux-image-4.4.23_1.0.lpm_amd64.deb
d. 我們編譯到一半如果出現錯誤的話,該如何解決 ? 例如:
H16TOFW firmware/matrox/g200_warp.fw
H16TOFW firmware/matrox/g400_warp.fw
make[1]: Leaving directory `/usr/src/linux-3.3.7'
/usr/bin/make -j2 ARCH=i386 \
-C Documentation/lguest
make: *** Documentation/lguest: 沒有此一檔案或目錄. Stop.
make: *** [debian/stamp/build/kernel] Error 2
real 38m37.627s
user 65m58.119s
sys 5m21.180s
上述的問題是 LGUEST 不存在,因此我們看 .config 這檔案,將裡面的 LGUEST 設定
完全註記,再重新執行一次 make menuconfig (回到步驟 b)。
5. 安裝核心
/usr/src# dpkg -i linux-image-4.1.18_1.0.lpm_amd64.deb
其畫面如下:
選取了原先未選的套件 linux-image-4.1.18。
(讀取資料庫 ... 目前共安裝了 79198 個檔案和目錄。)
Preparing to unpack linux-image-4.1.18_1.0.lpm_amd64.deb ...
Done.
Unpacking linux-image-4.1.18 (1.0.lpm) ...
設定 linux-image-4.1.18 (1.0.lpm) ...
Running depmod.
Examining /etc/kernel/postinst.d.
run-parts: executing /etc/kernel/postinst.d/apt-auto-removal 4.1.18 /boot/vmlinuz-4.1.18
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 4.1.18 /boot/vmlinuz-4.1.18
update-initramfs: Generating /boot/initrd.img-4.1.18
run-parts: executing /etc/kernel/postinst.d/zz-update-grub 4.1.18 /boot/vmlinuz-4.1.18
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.1.18
Found initrd image: /boot/initrd.img-4.1.18
Found linux image: /boot/vmlinuz-3.16.0-4-amd64
Found initrd image: /boot/initrd.img-3.16.0-4-amd64
done
/usr/src# dpkg -i linux-image-4.1.18_1.0.lpm_amd64.deb
其畫面如下:
選取了原先未選的套件 linux-image-4.1.18。
(讀取資料庫 ... 目前共安裝了 79198 個檔案和目錄。)
Preparing to unpack linux-image-4.1.18_1.0.lpm_amd64.deb ...
Done.
Unpacking linux-image-4.1.18 (1.0.lpm) ...
設定 linux-image-4.1.18 (1.0.lpm) ...
Running depmod.
Examining /etc/kernel/postinst.d.
run-parts: executing /etc/kernel/postinst.d/apt-auto-removal 4.1.18 /boot/vmlinuz-4.1.18
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 4.1.18 /boot/vmlinuz-4.1.18
update-initramfs: Generating /boot/initrd.img-4.1.18
run-parts: executing /etc/kernel/postinst.d/zz-update-grub 4.1.18 /boot/vmlinuz-4.1.18
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.1.18
Found initrd image: /boot/initrd.img-4.1.18
Found linux image: /boot/vmlinuz-3.16.0-4-amd64
Found initrd image: /boot/initrd.img-3.16.0-4-amd64
done
如果安裝過程中有一些 missing firmware 的訊息,這是表示某些 firmware 沒有裝的意思,請直接安裝此套件,再重裝一次核心即可修正。
6. 重新開機 -> 正常開機(OK)
-> 當機(以舊版核心重開,設法解決問題)
沒有留言:
張貼留言