為什麼要自己編 Linux 核心 ?
缺點:程度還沒到那邊的人,編出來的核心有時候開機會當機。
優點:
1. 修正舊核心的 bug
2. 支援新的硬體
3. 針對自己主機的硬體進行最佳化
如何編核心
1. 安裝程式編譯環境
2. 安裝核心編譯環境
3. 下載核心
4. 編譯核心
5. 安裝核心
6. 重新開機 -> 正常開機(OK)
-> 當機(以舊版核心重開,設法解決問題)
1. 安裝程式編譯環境
請安裝
gcc
cpp
g++
這三個套件,其中每個套件各有兩個版本:
gcc
gcc-4.3
gcc-4.4
cpp
cpp-4.3
cpp-4.4
g++
g++-4.3
g++-4.4
我們可以在 /usr/bin 目錄中看到目前的版本為何,或是執行以下指令:
gcc -v
cpp -v
g++ -v
如果我們至 /usr/bin 目錄下執行
ls -l gcc* cpp* g++*
會看到以下輸出:
lrwxrwxrwx 1 root root 7 2011-04-21 20:25 cpp -> cpp-4.4
-rwxr-xr-x 1 root root 209192 2010-09-21 21:43 cpp-4.3
-rwxr-xr-x 1 root root 218540 2010-11-14 20:30 cpp-4.4
lrwxrwxrwx 1 root root 7 2011-04-21 20:31 g++ -> g++-4.4
-rwxr-xr-x 1 root root 210376 2010-09-21 21:43 g++-4.3
-rwxr-xr-x 1 root root 219628 2010-11-14 20:30 g++-4.4
lrwxrwxrwx 1 root root 7 2011-04-21 20:31 gcc -> gcc-4.4
-rwxr-xr-x 1 root root 208232 2010-09-21 21:44 gcc-4.3
-rwxr-xr-x 1 root root 217068 2010-11-14 20:31 gcc-4.4
這表示上述三個命令都聯結到 4.4 版,全部的聯結版本都要一致才行。
安裝完畢後請編譯 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/v3.x/
ftp.isu.edu.tw
請將 Linux 核心下載至 /usr/src 目錄,我們以 3.3.7 為例,請下載
linux-3.3.7.tar.xz
附帶一提:xz 格式是目前壓縮率最高之非失真壓縮演算法
(失真壓縮演算法->jpg)
3.5 解壓縮
請在 /usr/src 目錄執行:
/usr/src/ # xz -dc linux-3.3.7.tar.xz | tar xfv -
此時會出現一個 linux-3.3.7 的目錄,我們要建一個 link
/usr/src/ # ln -s linux-3.3.7 linux
4. 編譯核心
a. /usr/src/ # cd linux
a.5 複製已存在核心編譯參數
/usr/src/ # cp /boot/config-2.6.xx .config
b. make menuconfig
c. time make-kpkg --initrd --revision=lpm.1.0 kernel_image -j 2
編譯完成後,你會有一個檔案叫:
linux-image-3.3.7_lpm.1.0_i386.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-3.3.7_lpm.1.0_i386.deb
其畫面如下:
選取了原先未被選取的套件 linux-image-3.3.7。
(正在讀取資料庫 ... 207468 files and directories currently installed.)
正在解開 linux-image-3.3.7 (從 linux-image-3.3.7_lpm.1.0_i386.deb)...
Examining /etc/kernel/preinst.d/
Done.
正在設定 linux-image-3.3.7 (lpm.1.0) ...
Running depmod.
Examining /etc/kernel/postinst.d.
run-parts: executing /etc/kernel/postinst.d/dkms 3.3.7 /boot/vmlinuz-3.3.7
dkms: running auto installation service for kernel 3.3.7:
virtualbox-ose (3.2.10)...failed.
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 3.3.7 /boot/vmlinuz-3.3.7
update-initramfs: Generating /boot/initrd.img-3.3.7
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168f-2.fw for module r8169
/usr/src# dpkg -i linux-image-3.3.7_lpm.1.0_i386.deb
其畫面如下:
選取了原先未被選取的套件 linux-image-3.3.7。
(正在讀取資料庫 ... 207468 files and directories currently installed.)
正在解開 linux-image-3.3.7 (從 linux-image-3.3.7_lpm.1.0_i386.deb)...
Examining /etc/kernel/preinst.d/
Done.
正在設定 linux-image-3.3.7 (lpm.1.0) ...
Running depmod.
Examining /etc/kernel/postinst.d.
run-parts: executing /etc/kernel/postinst.d/dkms 3.3.7 /boot/vmlinuz-3.3.7
dkms: running auto installation service for kernel 3.3.7:
virtualbox-ose (3.2.10)...failed.
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 3.3.7 /boot/vmlinuz-3.3.7
update-initramfs: Generating /boot/initrd.img-3.3.7
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168f-2.fw for module r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168f-1.fw for module r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8105e-1.fw for module r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168e-3.fw for module r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168e-2.fw for module r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168e-1.fw for module r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168d-2.fw for module r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168d-1.fw for module r8169
run-parts: executing /etc/kernel/postinst.d/pm-utils 3.3.7 /boot/vmlinuz-3.3.7
run-parts: executing /etc/kernel/postinst.d/zz-update-grub 3.3.7 /boot/vmlinuz-3.3.7
Generating grub.cfg ...
Found background image: /usr/share/images/desktop-base/desktop-grub.png
Found linux image: /boot/vmlinuz-3.3.7
Found initrd image: /boot/initrd.img-3.3.7
Found linux image: /boot/vmlinuz-3.0.4
Found initrd image: /boot/initrd.img-3.0.4
Found linux image: /boot/vmlinuz-2.6.39.4
Found initrd image: /boot/initrd.img-2.6.39.4
Found linux image: /boot/vmlinuz-2.6.38.4
Found initrd image: /boot/initrd.img-2.6.38.4
Found linux image: /boot/vmlinuz-2.6.32-5-686-bigmem
Found initrd image: /boot/initrd.img-2.6.32-5-686-bigmem
Found linux image: /boot/vmlinuz-2.6.32-5-686
Found initrd image: /boot/initrd.img-2.6.32-5-686
done
正在進行 readahead-fedora 的觸發程式 ...
安裝過程中有一些 missing firmware 的訊息,這是表示 firmware-realtek 沒有裝的意思,請直接安裝此套件,再重裝一次核心即可修正。
6. 重新開機 -> 正常開機(OK)
-> 當機(以舊版核心重開,設法解決問題)