① 如何學習編譯內核
我用的是RedHat9.0, 根據第一貼 "2.4->2.6內核升級指南", 首先需要把必要的軟體包都升級到要求的版本以上, 經過折騰, 有的是直接用rpm -Uvh 或 rpm -ivh, 有的是直接用源代碼編譯, 總算把大部分軟體包都升級了. 有一個軟體包oprofile死活裝不上, 用rpm裝的時候出來這樣的錯誤:
error: Failed dependencies:
libc.so.6(GLIBC_2.3.4) is needed by oprofile-0.8-0.20040121.3
可是我的/lib目錄里明明有
lrwxrwxrwx 1 root root 13 8月 2 10:45 libc.so.6 -> libc-2.3.2.so
(我已經經歷過N次這樣的錯誤了, 這是我非常痛恨rpm的主要原因.)
改用源代碼編譯的時候, make的時候出來這樣的錯誤:
The present kernel configuration has moles disabled.
Type 'make config' and enable loadable mole support.
Then build a kernel with mole support enabled.
TNND, RedHat9預設的內核編譯居然是moles disabled!!!我折騰來折騰去就是想把2.4.20-8的內核升級到2.6.12.4去, 到頭來還得讓我先編譯原來2.4.20-8的內核? 先把這事放一放, oprofile說不定不是很有用的模塊.
接下來順利地把mole-init-tools升上去了. 然而在升級mkinitrd的時候又碰到了致命的問題.
根據說明, 要想升級mkinitrd, 首先要升級lvm2和device-mapper, 用rpm -Uvh升級lvm2的時候出來一大堆的錯誤:
error: Failed dependencies:
libdevmapper.so.1.00 is needed by lvm2-2.00.15-2
libdevmapper.so.1.00(Base) is needed by lvm2-2.00.15-2
libselinux.so.1 is needed by lvm2-2.00.15-2
lvm < 1.0.3-19 conflicts with lvm2-2.00.15-2
看來要先裝device-mapper再裝lvm2, 另外lvm與lvm2沖突, 要先卸載lvm.
那就卸載lvm吧, NND, lvm is needed by (installed) mkinitrd-3.4.42-1
顧不得了, 用rpm -e -nodeps卸載. 不過現在還是先把device-mapper裝好, 再收拾lvm2.
會過頭來, 用rpm升級device-mapper, 結果出來
error: Failed dependencies:
libselinux.so.1 is needed by device-mapper-1.00.14-3
查了一下, 機器上卻是沒有libselinux.so.1, 在網上盪了一個rpm軟體包, 結果又是這樣一個錯誤,
error: Failed dependencies:
libc.so.6(GLIBC_2.3.4) is needed by libselinux-1.11.4-1
我不知道我機器里的libc.so.6發了什麼豬瘟, 看來是因為我機器里的libc.so.6-->libc-2.3.2.so不是GLIBC_2.3.4.
只好再到網上去盪了一個glibc的軟體包, 用rpm -Uvh升級的時候, 好了, 出來一大堆沖突
package glibc-32bit-9-200508050455 is intended for a x86_64 architecture file /lib/i686/libc.so.6 from install of glibc-32bit-9-200508050455 conflicts with file from package glibc-2.3.2-11.9
file /lib/i686/libm.so.6 from install of glibc-32bit-9-200508050455 conflicts with file from package glibc-2.3.2-11.9
file /lib/i686/libpthread.so.0 from install of glibc-32bit-9-200508050455 conflicts with file from package glibc-2.3.2-11.9
file /lib/ld-linux.so.2 from install of glibc-32bit-9-200508050455 conflicts with file from package glibc-2.3.2-11.9
file /lib/libBrokenLocale.so.1 from install of glibc-32bit-9-200508050455 conflicts with file from package glibc-2.3.2-11.9
② linux編譯內核步驟
一、准備工作
a) 首先,你要有一台PC(這不廢話么^_^),裝好了Linux。
b) 安裝好GCC(這個指的是host gcc,用於編譯生成運行於pc機程序的)、make、ncurses等工具。
c) 下載一份純凈的Linux內核源碼包,並解壓好。
注意,如果你是為當前PC機編譯內核,最好使用相應的Linux發行版的源碼包。
不過這應該也不是必須的,因為我在我的Fedora 13上(其自帶的內核版本是2.6.33.3),就下載了一個標準的內核linux-2.6.32.65.tar.xz,並且順利的編譯安裝成功了,上電重啟都OK的。不過,我使用的.config配置文件,是Fedora 13自帶內核的配置文件,即/lib/moles/`uname -r`/build/.config
d) 如果你是移植Linux到嵌入式系統,則還要再下載安裝交叉編譯工具鏈。
例如,你的目標單板CPU可能是arm或mips等cpu,則安裝相應的交叉編譯工具鏈。安裝後,需要將工具鏈路徑添加到PATH環境變數中。例如,你安裝的是arm工具鏈,那麼你在shell中執行類似如下的命令,假如有類似的輸出,就說明安裝好了。
[root@localhost linux-2.6.33.i686]# arm-linux-gcc --version
arm-linux-gcc (Buildroot 2010.11) 4.3.5
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for ing conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
註:arm的工具鏈,可以從這里下載:回復「ARM」即可查看。
二、設置編譯目標
在配置或編譯內核之前,首先要確定目標CPU架構,以及編譯時採用什麼工具鏈。這是最最基礎的信息,首先要確定的。
如果你是為當前使用的PC機編譯內核,則無須設置。
否則的話,就要明確設置。
這里以arm為例,來說明。
有兩種設置方法():
a) 修改Makefile
打開內核源碼根目錄下的Makefile,修改如下兩個Makefile變數並保存。
ARCH := arm
CROSS_COMPILE := arm-linux-
注意,這里cross_compile的設置,是假定所用的交叉工具鏈的gcc程序名稱為arm-linux-gcc。如果實際使用的gcc名稱是some-thing-else-gcc,則這里照葫蘆畫瓢填some-thing-else-即可。總之,要省去名稱中最後的gcc那3個字母。
b) 每次執行make命令時,都通過命令行參數傳入這些信息。
這其實是通過make工具的命令行參數指定變數的值。
例如
配置內核時時,使用
make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig
編譯內核時使用
make ARCH=arm CROSS_COMPILE=arm-linux-
注意,實際上,對於編譯PC機內核的情況,雖然用戶沒有明確設置,但並不是這兩項沒有配置。因為如果用戶沒有設置這兩項,內核源碼頂層Makefile(位於源碼根目錄下)會通過如下方式生成這兩個變數的值。
SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
-e s/arm.*/arm/ -e s/sa110/arm/ \
-e s/s390x/s390/ -e s/parisc64/parisc/ \
-e s/ppc.*/powerpc/ -e s/mips.*/mips/ \
-e s/sh[234].*/sh/ )
ARCH?= $(SUBARCH)
CROSS_COMPILE ?=
經過上面的代碼,ARCH變成了PC編譯機的arch,即SUBARCH。因此,如果PC機上uname -m輸出的是ix86,則ARCH的值就成了i386。
而CROSS_COMPILE的值,如果沒配置,則為空字元串。這樣一來所使用的工具鏈程序的名稱,就不再有類似arm-linux-這樣的前綴,就相當於使用了PC機上的gcc。
最後再多說兩句,ARCH的值還需要再進一步做泛化。因為內核源碼的arch目錄下,不存在i386這個目錄,也沒有sparc64這樣的目錄。
因此頂層makefile中又構造了一個SRCARCH變數,通過如下代碼,生成他的值。這樣一來,SRCARCH變數,才最終匹配到內核源碼arch目錄中的某一個架構名。
SRCARCH := $(ARCH)
ifeq ($(ARCH),i386)
SRCARCH := x86
endif
ifeq ($(ARCH),x86_64)
SRCARCH := x86
endif
ifeq ($(ARCH),sparc64)
SRCARCH := sparc
endif
ifeq ($(ARCH),sh64)
SRCARCH := sh
endif
三、配置內核
內核的功能那麼多,我們需要哪些部分,每個部分編譯成什麼形式(編進內核還是編成模塊),每個部分的工作參數如何,這些都是可以配置的。因此,在開始編譯之前,我們需要構建出一份配置清單,放到內核源碼根目錄下,命名為.config文件,然後根據此.config文件,編譯出我們需要的內核。
但是,內核的配置項太多了,一個一個配,太麻煩了。而且,不同的CPU架構,所能配置的配置項集合,是不一樣的。例如,某種CPU的某個功能特性要不要支持的配置項,就是與CPU架構有關的配置項。所以,內核提供了一種簡單的配置方法。
以arm為例,具體做法如下。
a) 根據我們的目標CPU架構,從內核源碼arch/arm/configs目錄下,找一個與目標系統最接近的配置文件(例如s3c2410_defconfig),拷貝到內核源碼根目錄下,命名為.config。
注意,如果你是為當前PC機編譯內核,最好拷貝如下文件到內核源碼根目錄下,做為初始配置文件。這個文件,是PC機當前運行的內核編譯時使用的配置文件。
/lib/moles/`uname -r`/build/.config
這里順便多說兩句,PC機內核的配置文件,選擇的功能真是多。不編不知道,一編才知道。Linux發行方這樣做的目的,可能是想讓所發行的Linux能夠滿足用戶的各種需求吧。
b) 執行make menuconfig對此配置做一些需要的修改,退出時選擇保存,就將新的配置更新到.config文件中了。
注
③ 如何編譯/交叉編譯內核模塊, Linux 2.6.
欏�build 能夠編譯內核樹目錄內的內核模塊,也能夠編譯內核樹目錄外的內核模塊(外部內核模塊)。. 編譯外部內核模塊的命令: #cd <your-mole-dir> #make -C <path-to-kernel> M=`pwd` 其中<your-mole-dir> 為要編譯的內核模塊所在目錄,<path-to-kernel> 為內核源碼所在的目錄。 對於發行版本的Linux ,可以用: #make -C /lib/moles/`uname -r`/build M=`pwd` 注意:使用Kbuild 之前,必須先成功編譯過內核源碼。 說明: .#make -C <path-to-kernel> M=`pwd` moles 作用與上面的命令一樣 .以前的內核版本可以使用 #make -C <path-to-kernel> SUBDIRS=`pwd` moles. 安裝外部內核模塊 #make -C <path-to-kernel> M=`pwd` moles_install 默認安裝目錄為:/lib/moles/`uname -r`/extra ,可以通過INSTALL_MOD_PATH 宏在默認安裝路徑前加前綴。 例如: #make -C <path-to-kernel> INSTALL_MOD_PATH=/opt M=`pwd` moles_install 則編譯後的模塊會放在/opt/lib/moles/`uname -r`/extra 通過宏INSTALL_MOD_DIR 可以修改是否放在'extra' 下,例如: #make -C <path-to-kernel> INSTALL_MOD_DIR=golf M=`pwd` moles_install 則編譯後的模塊會放在/lib/moles/`uname -r`/golf . 編譯單個文件 #make -C <path-to-kernel> M=`pwd` <filename>. 其他命令 #make -C <path-to-kernel> M=`pwd` clean #make -C <path-to-kernel> M=`pwd` help.Kbuild 文件 Linux的Kbuild 會在內核模塊目錄下查找Kbuild 文件,如果有,則在編譯時會使用該文件。示例: 假設有這么幾個文件:8123_if.c 8123_if.h 8123_pci.c 8123_bin.o_shipped( 二進制的模塊文件) Kbuild 文件的內容: obj-m := 8123.o 8123-y:8123_if.o 8123_pci.o 8123_bin.o Makefile的內容: #為了兼容舊版本的Kbuild ifneq($(KERNELRELEASE),) include Kbuildelse# 正常的Makefile KDIR:=/lib/moles/`uname -r`/buildall::$(MAKE) -C $(KDIR) M=`pwd` $@ # 其他targetgenbin:echo "X" > 8123_bin_shippedendif 注意,沒有源碼的二進制.o 文件必須以原文件名加_shipped 結尾,例如8123_bin.o_shipped,KBuild 會把8123_bin.o_shipped 復制為8123_bin.o ,然後一起編譯。 應該用: ifeq ($(obj),) obj= .
④ 如何編譯一個內核
1. 預備工作
我推薦使用root用戶執行下面所有的步驟. 如果你還沒有創建root登陸口令, 請運行下面的命令:
sudo passwd root
然後, 以root身份登陸:
su
如果你想使用一般用戶來替代root用戶, 記住在本文所有命令前輸入sudo, 比如當我運行
apt-get update
你需要運行下面的命令來替代, 等.
sudo apt-get update
1.1 Ubuntu 6.10上的/bin/sh ("Edgy Eft")
在Ubuntu 6.10, /bin/sh預設是一個鏈接到/bin/dash的字元鏈接. 當你編譯軟體源代碼的時候, /bin/dash似乎還存在問題. 至少我已經遇到了一些問題. 所以我把/bin/sh鏈接到了/bin/bash.
如果你使用Ubuntu 6.10, 現在你可以運行:
rm -f /bin/sh
ln -s /bin/bash /bin/sh
2 安裝必需的軟體包 (為內核編譯做准備)
首先我們升級軟體(包)庫:
apt-get update
然後我們安裝所有需要的軟體包:
apt-get install kernel-package libncurses5-dev fakeroot wget bzip2
3 下載內核源代碼
接下來我們下載需要的內核到/usr/src目錄(去
www.kernel.org
網站下載你需要的內核版本, 比如. linux-2.6.18.1tar.bz2(你可以從這里下載所有的2.6內核: http://www.kernel.org/pub/linux/kernel/v2.6/). 然後下載到/usr/src目錄:
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.1.tar.bz2
然後解壓內核源代碼, 創建一個指向內核源代碼目錄的linux字元鏈接:
tar xjf linux-2.6.18.1.tar.bz2
ln -s linux-2.6.18.1 linux
cd /usr/src/linux
4 給內核源代碼打補丁(可選)
有時你的預設內核不支持新買的設備, 你需要安裝新的驅動. 或者你需要使用虛擬技術或其它高級的技術, 而這些現有的內核都不支持. 這樣情況下你需要給給內核源代碼打補丁(當然補丁已經發布..)
現在我們假設你已經下載需要的補丁(以下例子我叫它patch.bz2)到/usr/src. 運行下面的命令給內核源代碼直接打上補丁(你的用戶必須位於/usr/src/linux目錄):
bzip2 -dc /usr/src/patch.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch.bz2 | patch -p1
第一個命令用於測試, 對內核沒有任何影響. 如果沒有顯示錯誤, 你可以運行第二個命令給內核打補丁. 如果第一個命令有誤, 請務繼續的操作!
你也能夠通過內核的prepatches方式打補丁. 比如, 如果你需要一個功能, 而這個功能僅存在於2.6.19-rc4中,
正式完整的內核版本仍沒有發布, 而patch-2.6.19-rc4.biz2已經發布. 你可以把這個補丁打到2.6.18的內核源代碼中,
但請不要達到2.6.18.1或2.6.18.2, 等. 這個規則在接下來的網頁中註明:
http://kernel.org/patchtypes/pre.html
prepatches等同於linux中的測試發行; 他們位於存檔的測試目錄中,
我們可以使用patch(1)工具對上一個完整發行版(版本號分三部分)打補丁(例如, 2.6.12-rc4
prepatch只可以給2.6.11內核源代碼打補丁, 而不是2.6.11.10.)
所以如果你想編譯2.6.19-rc4內核, 你必須在步驟3.1下載2.6.18(
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2
)替代2.6.18.1內核源代碼!
下面是如何給2.6.18打上2.6.19-rc4補丁:
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.19-rc4.bz2
cd /usr/src/linux
bzip2 -dc /usr/src/patch-2.6.19-rc4.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch-2.6.19-rc4.bz2 | patch -p1
5. 配置內核
使用當前工作內核的配置文件做為新內核配置文件的基礎是一個很好的主意. 因此我們拷貝已存的配置文件到/usr/src/linux:
cp /boot/config-`uname -r` ./.config
然後運行
make menuconfig
然後我們看到內核的配置菜單. 移動綠色游標到 Load an Alternate Configuration File 行後選擇.config文件(包含了當前工作內核的配置)做為配置文件:
然後瀏覽內核配置菜單, 選擇你需要的功能. 完成配置後, 選擇Exit, 回答下面的問題(Do you wish to save your new kernel configuration? 你希望保存新的內核配置嗎?), 選擇Yes:
6 構建內核
執行下面命令來構建內核:
make-kpkg clean
fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image
kernel_headers
在--append-to-version= 後面你可以寫上任何字元串來區別內核版本, 但是必須以" - "符號開始而且後面不包括任何空格.
保持耐心, 內核編譯需要一定時間, 主要看你的內核配置和處理器速度.
7 安裝新內核
在成功構建內核後, 你在/usr/src目錄能發現兩個.deb軟體包.
cd /usr/src
ls -l
在我的測試系統上, 他們分別名為
linux-image-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb
(包含了實際的內核) 和
linux-headers-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb
(包含了需要的文件, 用於以後需要編譯額外的內核模塊). 我是這樣安裝的:
dpkg -i linux-image-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb
dpkg -i linux-headers-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb
(現在你甚至能夠拷貝這兩個.deb文件到其它的Ubuntu系統, 通過上面的方式安裝. 你將不再需要編譯內核.)
然後檢查 /boot/grub/menu.lst文件, 現在你將能發現新內核使用的兩個引導配置塊:
vi /boot/grub/menu.lst
在我測試系統上已經添加好的引導配置塊是這樣的:
title Ubuntu, kernel 2.6.18.1-custom
root (hd0,0)
kernel /boot/vmlinuz-2.6.18.1-custom root=/dev/sda1 ro quiet splash
initrd /boot/initrd.img-2.6.18.1-custom
savedefault
boot
title Ubuntu, kernel 2.6.18.1-custom (recovery mode)
root (hd0,0)
kernel /boot/vmlinuz-2.6.18.1-custom root=/dev/sda1 ro single
initrd /boot/initrd.img-2.6.18.1-custom
boot
現在重啟系統:
shutdown -r now
如果一切進展順利, 你的新內核正常工作. 你還可以通過運行下面命令來檢查新內核是否運行:
uname -r
這將會顯示如:
2.6.18.1-custom
如果系統沒有起來, 重啟一下, 你會看到:
按ESC進入GRUB菜單:
選擇你以前的內核啟動系統, 現在你能再次嘗試編譯新的工作內核. 不要忘記從/boot/grub/menu.1st文件中移去不需要的引導內核信息.
⑤ Linux內核源碼如何編譯
首先uname -r看一下你當前的linux內核版本
1、linux的源碼是在/usr/src這個目錄下,此目錄有你電腦上各個版本的linux內核源代碼,用uname -r命令可以查看你當前使用的是哪套內核,你把你下載的內核源碼也保存到這個目錄之下。
2、配置內核 make menuconfig,根據你的需要來進行選擇,設置完保存之後會在當前目錄下生成.config配置文件,以後的編譯會根據這個來有選擇的編譯。
3、編譯,依次執行make、make bzImage、make moles、make moles
4、安裝,make install
5、.創建系統啟動映像,到 /boot 目錄下,執行 mkinitramfs -o initrd.img-2.6.36 2.6.36
6、修改啟動項,因為你在啟動的時候會出現多個內核供你選擇,此事要選擇你剛編譯的那個版本,如果你的電腦沒有等待時間,就會進入默認的,默認的那個取決於 /boot/grub/grub.cfg 文件的設置,找到if [ "${linux_gfx_mode}" != "text" ]這行,他的第一個就是你默認啟動的那個內核,如果你剛編譯的內核是在下面,就把代表這個內核的幾行代碼移到第一位如:
menuentry 'Ubuntu, with Linux 3.2.0-35-generic' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
gfxmode $linux_gfx_mode
insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root 9961c170-2566-41ac-8155-18f231c1bea5
linux/boot/vmlinuz-3.2.0-35-generic root=UUID=9961c170-2566-41ac-8155-18f231c1bea5 ro quiet splash $vt_handoff
initrd/boot/initrd.img-3.2.0-35-generic
}
當然你也可以修改 set default="0"來決定用哪個,看看你的內核在第幾位,default就填幾,不過我用過這種方法,貌似不好用。
重啟過後你編譯的內核源碼就成功地運行了,如果出現問題,比如滑鼠不能用,usb不識別等問題就好好查查你的make menuconfig這一步,改好後就萬事ok了。
最後再用uname -r看看你的linux內核版本。是不是你剛下的那個呢!有沒有成就感?
打字不易,如滿意,望採納。
⑥ 如何編譯linux內核
內核,是一個操作系統的核心。它負責管理系統的進程、內存、設備驅動程序、文件和網路系統,決定著系統的性能和穩定性。Linux作為一個自由軟體,
在廣大愛好者的支持下,內核版本不斷更新。新的內核修訂了舊內核的bug,並增加了許多新的特性。如果用戶想要使用這些新特性,或想根據自己的系統度身定
制一個更高效,更穩定的內核,就需要重新編譯內核。本文將以RedHat Linux 6.0(kernel
2.2.5)為操作系統平台,介紹在Linux上進行內核編譯的方法。
一、 下載新內核的源代碼
目前,在Internet上提供Linux源代碼的站點有很多,讀者可以選擇一個速度較快的站點下載。筆者是從站點www.kernelnotes.org上下載了Linux的最新開發版內核2.3.14的源代碼,全部代碼被壓縮到一個名叫Linux-2.3.14.tar.gz的文件中。
二、 釋放內核源代碼
由於源代碼放在一個壓縮文件中,因此在配置內核之前,要先將源代碼釋放到指定的目錄下。首先以root帳號登錄,然後進入/usr/src子目錄。如果用戶在安裝Linux時,安裝了內核的源代碼,則會發現一個linux-2.2.5的子目錄。該目錄下存放著內核2.2.5的源代碼。此外,還會發現一個指向該目錄的鏈接linux。刪除該連接,然後將新內核的源文件拷貝到/usr/src目錄中。
(一)、用tar命令釋放內核源代碼
# cd /usr/src
# tar zxvf Linux-2.3.14.tar.gz
文件釋放成功後,在/usr/src目錄下會生成一個linux子目錄。其中包含了內核2.3.14的全部源代碼。
(二)、將/usr/include/asm、/usr/inlude/linux、/usr/include/scsi鏈接到/usr/src/linux/include目錄下的對應目錄中。
# cd /usr/include
# rm -Rf asm linux
# ln -s /usr/src/linux/include/asm-i386 asm
# ln -s /usr/src/linux/include/linux linux
# ln -s /usr/src/linux/include/scsi scsi
(三)、刪除源代碼目錄中殘留的.o文件和其它從屬文件。
# cd /usr/src/linux
# make mrproper
三、 配置內核
(一)、啟動內核配置程序。
# cd /usr/src/linux
# make config
除了上面的命令,用戶還可以使用make menuconfig命令啟動一個菜單模式的配置界面。如果用戶安裝了X window系統,還可以執行make xconfig命令啟動X window下的內核配置程序。
(二)、配置內核
Linux的
內核配置程序提供了一系列配置選項。對於每一個配置選項,用戶可以回答"y"、"m"或"n"。其中"y"表示將相應特性的支持或設備驅動程序編譯進內
核;"m"表示將相應特性的支持或設備驅動程序編譯成可載入模塊,在需要時,可由系統或用戶自行加入到內核中去;"n"表示內核不提供相應特性或驅動程序
的支持。由於內核的配置選項非常多,本文只介紹一些比較重要的選項。
1、Code maturity level options(代碼成熟度選項)
Prompt for development and/or incomplete code/drivers
(CONFIG_EXPERIMENTAL) [N/y/?]
如果用戶想要使用還處於測試階段的代碼或驅動,可以選擇「y」。如果想編譯出一個穩定的內核,則要選擇「n」。
1、 Processor type and features(處理器類型和特色)
(1)、Processor family (386, 486/Cx486, 586/K5/5x86/6x86, Pentium/K6/TSC, PPro/6x86MX) [PPro/6x86MX] 選擇處理器類型,預設為Ppro/6x86MX。
(2)、Maximum Physical Memory (1GB, 2GB) [1GB] 內核支持的最大內存數,預設為1G。
(3)、Math emulation (CONFIG_MATH_EMULATION) [N/y/?] 協處理器模擬,預設為不模擬。
(4)、MTRR (Memory Type Range Register) support (CONFIG_MTRR) [N/y/?]
選擇該選項,系統將生成/proc/mtrr文件對MTRR進行管理,供X server使用。
(5)、Symmetric multi-processing support (CONFIG_SMP) [Y/n/?] 選擇「y」,內核將支持對稱多處理器。
2、 Loadable mole support(可載入模塊支持)
(1)、Enable loadable mole support (CONFIG_MODULES) [Y/n/?] 選擇「y」,內核將支持載入模塊。
(2)、Kernel mole loader (CONFIG_KMOD) [N/y/?] 選擇「y」,內核將自動載入那些可載入模塊,否則需要用戶手工載入。
3、 General setup(一般設置)
(1)、Networking support (CONFIG_NET) [Y/n/?] 該選項設置是否在內核中提供網路支持。
(2)、PCI support (CONFIG_PCI) [Y/n/?] 該選項設置是否在內核中提供PCI支持。
(3)、PCI access mode (BIOS, Direct, Any) [Any] 該選項設置Linux探測PCI設備的方式。選擇「BIOS」,Linux將使用BIOS;選擇「Direct」,Linux將不通過BIOS;選擇「Any」,Linux將直接探測PCI設備,如果失敗,再使用BIOS。
(4)Parallel port support (CONFIG_PARPORT) [N/y/m/?] 選擇「y」,內核將支持平行口。
4、 Plug and Play configuration(即插即用設備支持)
(1)、Plug and Play support (CONFIG_PNP) [Y/m/n/?] 選擇「y」,內核將自動配置即插即用設備。
(2)、ISA Plug and Play support (CONFIG_ISAPNP) [Y/m/n/?] 選擇「y」,內核將自動配置基於ISA匯流排的即插即用設備。
5、 Block devices(塊設備)
(1)、Normal PC floppy disk support (CONFIG_BLK_DEV_FD) [Y/m/n/?] 選擇「y」,內核將提供對軟盤的支持。
(2)、Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support (CONFIG_BLK_DEV_IDE) [Y/m/n/?] 選擇「y」,內核將提供對增強IDE硬碟、CDROM和磁帶機的支持。
6、 Networking options(網路選項)
(1)、Packet socket (CONFIG_PACKET) [Y/m/n/?] 選擇「y」,一些應用程序將使用Packet協議直接同網路設備通訊,而不通過內核中的其它中介協議。
(2)、Network firewalls (CONFIG_FIREWALL) [N/y/?] 選擇「y」,內核將支持防火牆。
(3)、TCP/IP networking (CONFIG_INET) [Y/n/?] 選擇「y」,內核將支持TCP/IP協議。
(4)The IPX protocol (CONFIG_IPX) [N/y/m/?] 選擇「y」,內核將支持IPX協議。
(5)、Appletalk DDP (CONFIG_ATALK) [N/y/m/?] 選擇「y」,內核將支持Appletalk DDP協議。
8、SCSI support(SCSI支持)
如果用戶要使用SCSI設備,可配置相應選項。
9、Network device support(網路設備支持)
Network device support (CONFIG_NETDEVICES) [Y/n/?] 選擇「y」,內核將提供對網路驅動程序的支持。
10、Ethernet (10 or 100Mbit)(10M或100M乙太網)
在該項設置中,系統提供了許多網卡驅動程序,用戶只要選擇自己的網卡驅動就可以了。此外,用戶還可以根據需要,在內核中加入對FDDI、PPP、SLIP和無線LAN(Wireless LAN)的支持。
11、Character devices(字元設備)
(1)、Virtual terminal (CONFIG_VT) [Y/n/?] 選擇「y」,內核將支持虛擬終端。
(2)、Support for console on virtual terminal (CONFIG_VT_CONSOLE) [Y/n/?]
選擇「y」,內核可將一個虛擬終端用作系統控制台。
(3)、Standard/generic (mb) serial support (CONFIG_SERIAL) [Y/m/n/?]
選擇「y」,內核將支持串列口。
(4)、Support for console on serial port (CONFIG_SERIAL_CONSOLE) [N/y/?]
選擇「y」,內核可將一個串列口用作系統控制台。
12、Mice(滑鼠)
PS/2 mouse (aka "auxiliary device") support (CONFIG_PSMOUSE) [Y/n/?] 如果用戶使用的是PS/2滑鼠,則該選項應該選擇「y」。
13、Filesystems(文件系統)
(1)、Quota support (CONFIG_QUOTA) [N/y/?] 選擇「y」,內核將支持磁碟限額。
(2)、Kernel automounter support (CONFIG_AUTOFS_FS) [Y/m/n/?] 選擇「y」,內核將提供對automounter的支持,使系統在啟動時自動 mount遠程文件系統。
(3)、DOS FAT fs support (CONFIG_FAT_FS) [N/y/m/?] 選擇「y」,內核將支持DOS FAT文件系統。
(4)、ISO 9660 CDROM filesystem support (CONFIG_ISO9660_FS) [Y/m/n/?]
選擇「y」,內核將支持ISO 9660 CDROM文件系統。
(5)、NTFS filesystem support (read only) (CONFIG_NTFS_FS) [N/y/m/?]
選擇「y」,用戶就可以以只讀方式訪問NTFS文件系統。
(6)、/proc filesystem support (CONFIG_PROC_FS) [Y/n/?] /proc是存放Linux系統運行狀態的虛擬文件系統,該項必須選擇「y」。
(7)、Second extended fs support (CONFIG_EXT2_FS) [Y/m/n/?] EXT2是Linux的標准文件系統,該項也必須選擇「y」。
14、Network File Systems(網路文件系統)
(1)、NFS filesystem support (CONFIG_NFS_FS) [Y/m/n/?] 選擇「y」,內核將支持NFS文件系統。
(2)、SMB filesystem support (to mount WfW shares etc.) (CONFIG_SMB_FS)
選擇「y」,內核將支持SMB文件系統。
(3)、NCP filesystem support (to mount NetWare volumes) (CONFIG_NCP_FS)
選擇「y」,內核將支持NCP文件系統。
15、Partition Types(分區類型)
該選項支持一些不太常用的分區類型,用戶如果需要,在相應的選項上選擇「y」即可。
16、Console drivers(控制台驅動)
VGA text console (CONFIG_VGA_CONSOLE) [Y/n/?] 選擇「y」,用戶就可以在標準的VGA顯示方式下使用Linux了。
17、Sound(聲音)
Sound card support (CONFIG_SOUND) [N/y/m/?] 選擇「y」,內核就可提供對音效卡的支持。
18、Kernel hacking(內核監視)
Magic SysRq key (CONFIG_MAGIC_SYSRQ) [N/y/?] 選擇「y」,用戶就可以對系統進行部分控制。一般情況下選擇「n」。
四、 編譯內核
(一)、建立編譯時所需的從屬文件
# cd /usr/src/linux
# make dep
(二)、清除內核編譯的目標文件
# make clean
(三)、編譯內核
# make zImage
內核編譯成功後,會在/usr/src/linux/arch/i386/boot目錄中生成一個新內核的映像文件zImage。如果編譯的內核很大的話,系統會提示你使用make bzImage命令來編譯。這時,編譯程序就會生成一個名叫bzImage的內核映像文件。
(四)、編譯可載入模塊
如果用戶在配置內核時設置了可載入模塊,則需要對這些模塊進行編譯,以便將來使用insmod命令進行載入。
# make moles
# make modelus_install
編譯成功後,系統會在/lib/moles目錄下生成一個2.3.14子目錄,裡面存放著新內核的所有可載入模塊。
五、 啟動新內核
(一)、將新內核和System.map文件拷貝到/boot目錄下
# cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-2.3.14
# cp /usr/src/linux/System.map /boot/System.map-2.3.14
# cd /boot
# rm -f System.map
# ln -s System.map-2.3.14 System.map
(二)、配置/etc/lilo.conf文件。在該文件中加入下面幾行:
default=linux-2.3.14
image=/boot/vmlinuz-2.3.14
label=linux-2.3.14
root=/dev/hda1
read-only
(三)、使新配置生效
# /sbin/lilo
(四)、重新啟動系統
# /sbin/reboot
新內核如果不能正常啟動,用戶可以在LILO:提示符下啟動舊內核。然後查出故障原因,重新編譯新內核即可。
了解更多開源相關,去LUPA社區看看吧。
⑦ 如何重新編譯linux內核
因為一般電腦安裝的系統都是Windows,而整個編譯過程都需要在Linux環境下實現,所以最好是在虛擬機里安裝Linux系統來完成這一過程。我使用的虛擬機是VMware-workstation-full-v7.1.4。
然後,我們需要下載一個較高版本的Linux系統的鏡像文件,安裝在虛擬機上,作為編譯環境。我使用的是ubuntu-11.04-desktop-i386。之所以選擇較高版本,是因為它的界面比較方便用戶操作。
然後下載一個Linux內核源代碼文件,將它保存到虛擬機上新安裝的系統中去。並解壓到/usr/src目錄。我使用的是linux-2.6.36,下載低版本的原因是,小巧輕便,易於編譯。
解壓命令如下:
bzip2
-d
linux-2.6.36.tar.bz2
tar
-xvf
linux-2.6.36.ta
修改/usr/src/linux-2.6.36/kernel/sys.c文件,在文件末尾增加一個系統調用函數。自行編寫一個簡單的程序即可,只為測試用。
修改/usr/src/linux-2.6.36/arch/x86/kernel/syscall_table_32.S,為新添加的程序配置系統調用號。
在/usr/src/linux-2.6.36/arch/x86/include/asm/unistd_32.h中配置系統調用表。
下面就是最重要的內核編譯與安裝:
首先配置編譯信息,使其生成適合當前機器的Makefile,輸入make
oldconf
ig。
接著還要輸入make
menuconfig,在字元界面下進行必要的細微的修改。
然後要經過四步編譯過程(直接輸入命令即可):
(1)make
bzImage
將內核編譯為壓縮映像,存儲在源碼根目錄下的「System.map」文件中。
(2)make
moles
編譯各個模塊。
(3)sudo
make
moles_install
安裝模塊
(4)sudo
make
install
安裝內核
第(2)(3)步等待時間較長,可能需要數個小時,請耐心等待。
無報錯的話重啟進入GRUB界面,就可以看到新編譯的內核了。
按回車鍵進入我們編譯的目標內核中,用關鍵詞搜索查看新增加的系統調用「my
call」是否已在內核中:
編寫測試程序,調用新添加的系統調用:
測試成功,說明系統調用添加成功,進而說明內核編譯成功!
以上的辦法你可以試一下,希望對你有所幫助。
⑧ 誰能給個Ubuntu編譯內核的詳細步驟啊,我的是Ubuntu10.04,想編譯一下更高版本的內核,網上方法試過很多了
ubuntu千萬別自己搞內核編譯,因為ubuntu系統對內核是有修改的,你自己就算編譯成功,以後系統也會出現很多問題。
⑨ 如何編譯內核及製作RPM包
前言
要編譯自內核能各種同答案列舉:
1 研究習內核源碼
2 支持新硬體或者打某項內核功能
3 升級內核更新版本
4 按自要求定製優化內核功能
種種...
折騰需要理由我說面直接進入主題
編譯式
編譯內核種式kernel.org載選擇載需要版本內核源碼
:linux-2.6.32-rc1.tar.bz2載內核源碼/home/user/目錄進入載目錄解壓壓縮包
#cd /home/user/
#tar -xjvf linux-2.6.32-rc1.tar.bz2
二 准備編譯環境
始前首先確認面軟體包已經安裝(編譯標普華4.0直接全部安裝CD3保證條件)
* rpmdevtools
* yum-utils
fedora系統使用命令安裝:
#yum install yum-utils rpmdevtools
1. rpmbuild命令工作所需目錄樹面命令完該操作手建立目錄樹
命令建立:
#rpmdev-setuptree
命令/usr/src/rpmbuild/目錄目錄結構(位置沒則能前用戶目錄).
# tree /usr/src/rpmbuild/
rpmbuild/
|-- BUILD
|-- RPMS
|-- SOURCES
|-- SPECS
`-- SRPMS
面部rpmbuild環境建立rpm
3. 安裝內核源碼包需要依賴組件(跳步操作)
su -c 'yum-builddep kernel-.src.rpm'
4.安裝內核源碼系統默認目錄/usr/src/neoshine:
rpm -Uvh kernel-.src.rpm
三 配置內核(config配置文件)
面介紹何解源碼包並修改配置重新打包源碼
1. 解源碼包並打所補丁BUILD目錄
cd ~/rpmbuild/SPECS
rpmbuild -bp --target=`uname -m` kernel.spec
kernel源碼找:
/usr/src/neoshine/rpmbuild/BUILD/kernel-/linux-. directory
配置內核源碼
1. 進入內核源碼:
cd ~/rpmbuild/BUILD/kernel-2.6.$ver/linux-2.6.$ver.$arch/
2. 復制/boot/config*配置文件源碼目錄,config文件已經配或者其備份kernel配置文件:
cp /boot/config2.6- 2.6.$ver.$arch .config
3. 先檢查kernel配置新增選項:
make oldconfig
4. 定製內核功能關閉initrd支持選項執行圖形化內核配置工具:
make menuconfig
註:generic setup選項找initial RAM system and RAM disk(initramfs and initrd) support 項取消編譯同確保跟文件系統應驅系統所存儲器應驅都已經編譯內核(否則啟系統).
5. .config文件第行改面內容(注意:沒行面編譯報錯)
# i386
6. 拷貝.configSOURCES/:
cp .config ../SOURCES/config-$arch
四 編譯新內核
1. 面始准備編譯新內核包
打SPEC/kernel.spec
vim SPEC/kernel.spec
改變面行內容定製自內核擴展名(fc10類):
%define buildid .
步新內核rpm包程需要編譯內核源碼包
使用面命令新內核源碼包
rpmbuild -bb --with baseonly --without debuginfo --target=`uname -m` kernel.spec
參數說明:bb表示編譯二進制包即源碼包without debuginfo 表示沒調試信息
target=`uname -r`表示應前平台內核包
面命令功執行完BUILD/i686目錄新內核安裝包
五 安裝新內核
rpm -ivh kernel-$ver-$arch.rpm
步操作自安裝內核boot目錄安裝應內核模塊/lib/moles/目錄並且新內核應grub引導菜單
修改grub引導菜單格式
title new kernel
kernel /boot/vmlinuz-$ver-$arch root=/dev/sdax(hdax)
注意處要使用uuid指定跟文件系統(能掛載根區導致內核死機)要再加顯示相關參數(內核支持應設置看黑黑屏幕)
至禁用initrd新內核配置安裝完畢