編譯過的內核版本
A. linux內核有多大,不同Linux版本內核有什麼差別呢
根據版本的不同,內核大小也不同,新版本為幾百M。
1、發行版的不同,主要是對於版本的選擇,穩定性的測試,還有錯誤修正補丁都會讓每個發行版有自己特殊的內核。
2、官方內核的不同,這個區別很好說,官方的開發是基於 git 版本控制的,去看兩個 git 版本就知道了。一般是硬體支持,還有新的功能演算法,還有驅動增減,錯誤修補什麼的。
Linux的內核版本編號有點像如下的樣子:
2.6.32-642.el6.x86_64
主版本.次版本。發布版本-修改版本。
雖然編號就是如上的方式來編寫,不過依據Linux內核的發展歷程,內核版本的定義有點不太相同。
奇數、偶數版本分類:
在2.6x版本以前,托瓦斯將內核的發展方向分為兩類,並根據這兩類內核的發展分別給予不同的內核編號,那就是:
主、次版本為奇數:開發中版本。
如2.5.xx,這種內核版本主要用於測試與發展新功能,所以通常這種版本僅有內核開發工程師會使用。如果有新增的內核程序代碼,會加到這種版本當中,等到很多工程師測試沒問題後,才加入下一版本的穩定內核中;
主、次版本為偶數:穩定版本。
如2.6.xx,等到內核功能發展成熟後會加到這類版本中,主要用在一般家庭計算機以及企業版本中,重點在於提供一個用戶相對穩定的Linux操作環境平台。
至於發布版本則是在主、次版本架構不變的情況下,新增的功能累積到一定程度後新發布的內核版本。而由於Linux 的內核是使用CPL的授權,因此大家都能夠進行內核程序代碼的修改。
因此,如果有針對一個版本的內核修改過的部分程序代碼,那麼這個被修改過的新內核版本就可以加上所謂的修改版本。
Linux內核版本與Linux發行版本。
Linux內核版本與發行版本的版本並不相同,因為所謂的Linux版本指的應該是內核版本,而目前最新的內核版本應該是4.7.2(2016/08)才對,並不會有7.x的版本出現。
(1)編譯過的內核版本擴展閱讀:
Linux內核的任務:
1、從技術層面講,內核是硬體與軟體之間的一個中間層。作用是將應用層序的請求傳遞給硬體,並充當底層驅動程序,對系統中的各種設備和組件進行定址。
2、從應用程序的層面講,應用程序與硬體沒有聯系,只與內核有聯系,內核是應用程序知道的層次中的最底層。在實際工作中內核抽象了相關細節。
3、內核是一個資源管理程序。負責將可用的共享資源(CPU時間、磁碟空間、網路連接等)分配得到各個系統進程。
4、內核就像一個庫,提供了一組面向系統的命令。系統調用對於應用程序來說,就像調用普通函數一樣。
B. 如何升級/編譯Linux內核
下載內核
如果您只是想編譯一個您已安裝內核的新版本(例如,實現 SMP 支持),那不需要下載任何代碼 -- 跳過此部分繼續下一屏。
您可以在 http://www.kernel.org/pub/linux/kernel 上找到內核代碼。當您進入到那後,您將發現內核的源代碼按內核版本(v2.2、v2.3 等),被組織到多個不同的目錄中。在每個目錄中,您將發現文件被冠以"linux-x.y.z.tar.gz"和"linux-x.y.z.tar.bz2"。這些就是 Linux 內核的源代碼。您也將看到冠以 "patch-x.y.z.gz" 和 "patch-x.y.z.bz2" 的文件。這些是用來更新前面完整的內核源代碼的補丁包。如果您希望編譯一個新的內核版本,您將需要下載這些"linux"文件其中之一。
內核解包
如果您已從 kernel.org 下載一個新的內核,現在是要將其解包時候了。首先,cd /usr/src。如果這里有一個存在的"linux"目錄,將其改名為"linux.old" ("mv linux linux.old",以 root 許可權)。
現在,可以解開新的內核包了。仍然在 /usr/src 目錄下,輸入 tar xzvf /path/to/my/kernel-x.y.z.tar.gz 或者 cat /path/to/my/kernel-x.y.z.tar.bz2 | bzip2 -d | tar xvf -,根據您下載的源代碼是用 gzip 或 bzip2 壓縮的。在輸入完此命令後,您下載的內核源代碼會被釋放到一個新的"linux"目錄下。注意 -- 全套內核源代碼通常將在硬碟上佔用超過 50 兆空間!
討論配置問題
在您編譯內核前,您需要配置它,配置是您精確控制在新內核中啟用(禁止)哪些內核功能的機會。您也將控制哪些會被編譯到內核的二進制映像(在啟動時被載入)而哪些被編譯到需要時載入的內核模塊文件。
老式配置內核的方法是極為痛苦的過程,並涉及到進入 /usr/src/linux 目錄並輸入 make config 命令。請放棄這種配置內核的方式 -- 除非您想在命令行上回答幾百個(對!幾百個)「yes/no」的問題。
配置的新途徑
我們是現代人類,我們不在輸入 make config,而是輸入 make menuconfig 或者 make xconfig。如果您想要配置您的內核,使用上述選擇之一。如果您輸入 make menuconfig,您將使用一個漂亮的基於文本的彩色菜單系統來配置內核。如果您輸入 make xconfig,您將使用一個更漂亮的基於 X-Window 的 GUI 界面來配置內核的各種選項。這里有一個使用 "make menuconfig" 的屏幕截圖:
當使用 "make menuconfig" 時,在左面出現一個 "< >" 的選項能被編譯成為一個模塊。當選項被選中,按下空格鍵來循環選擇選項是被選中或未選中, ("<*>")表示將被編譯成內核映像而("<M>")表示將被編譯成模塊。
配置技巧
在這里有極其多的內核選項,而且我們無法在此一一解釋 -- 所以請利用內核內置的幫助功能。基本上每個選項都至少有一些描述,而且每個通常都有一行"如果您不知道這個選項的含義,輸入 Y。(或者 N)"。這些提示在您不知道一個特定選項的含義時能幫助您。要使用幫助,選中您有疑問的選項然後按 "?" 鍵。
編譯和安裝內核
make dep; make clean
一旦您的內核配置完畢,就可開始編譯它了。在我們能編譯它前,我們需要生成依賴(dependency)信息並清除任何老的"編譯結果"。這可以通過在 /usr/src/linux 下輸入 make dep; make clean 完成。
make bzImage
現在是編譯真正的二進制內核映像時候了。輸入 make bzImage。過幾分鍾後,編譯會結束而且您在 /usr/src/linux/arch/i386/boot(x86 PC 內核)目錄下找到 bzImage 文件。我們將待會告訴您如何安裝這個新內核,但是現在我們要看看模塊編譯了。
編譯模塊
現在我們有了 bzImage,下面要編譯模塊了。即使您在配置內核時沒有使用任何模塊,也不要跳過此步驟 -- 在編譯完 bzImage 後立刻編譯模塊是個好習慣。而且,如果您真的沒有模塊需要編譯,這個步驟也非常快就結束了。輸入 make moles; make moles_install。這將導致模塊被編譯而且被安裝到 /usr/lib/<內核版本號> 目錄下。
祝賀您!您的內核已經被編譯完成了,您的內核模塊也編譯完成並被安裝。現在是要重新配置 LILO,這樣您能使用新的內核。
啟動配置
LILO 入門
現在是最後來重新配置 LILO 的時候了,它將負責載入新的內核。LILO 是最流行的 Linux 引導工具,而且為所有的主流 Linux 發行商所採用。您要作的第一件事是察看您的 /etc/lilo.conf 文件。它將包含一行看似 "image=/vmlinuz" 的語句。該語句告訴 LILO 到何處找到內核。
啟動配置, 第二部分
要配置 LILO 來使用新的內核,您有兩種選擇。第一個是覆蓋您現有的內核 -- 除非您手頭上有一些緊急啟動措施如還有此內核的引導盤,這很危險的方法。
更為安全的選擇是配置 LILO 是得它能從新的或舊的內核引導。LILO 可配置成從新內核預設啟動,但仍提供一種方法讓您遇上問題時能選擇舊的內核來啟動。這是推薦的作法,也是我們將隨後介紹的方法。
啟動配置, 第三部分
您的 lilo.conf 文件有可能看起來如下:
boot=/dev/hda
delay=20
vga=normal
root=/dev/hda1
read-only
image=/vmlinuz
label=linux
要在您的 lilo.conf 文件中增添新的項目,參見下列步驟。首先,拷貝 /usr/src/linux/arch/i386/boot/bzImage 到您的根(root)分區上的一個文件,例如 /vmlinuz2。一旦拷貝完畢,復制您 lilo.conf 文件的最後三行並將它們添加到該文件的最後... 我們即將結束整個步驟了...
啟動配置, 第四部分
現在,您的 lilo.conf 文件應該看起來如下:
boot=/dev/hda
delay=20
vga=normal
root=/dev/hda1
read-only
image=/vmlinuz
label=linux
image=/vmlinuz
label=linux
首先,將第一個 "image=" 行改為 "image=/vmlinuz2"。其次,將第二個 "label=" 行改為 "label=oldlinux"。然後,確定在文件的開始有一行 "delay=20" -- 如果沒有,增添一行。如果它已經存在,將數字至少設為 20。
啟動配置, 第五部分
您最後的 lilo.conf 文件將看起來如下:
boot=/dev/hda
delay=20
vga=normal
root=/dev/hda1
read-only
image=/vmlinuz2
label=linux
image=/vmlinuz
label=oldlinux
作完這些修改後,您將需要以 root 身份運行 "lilo"。這非常重要!如果您不執行此步,啟動的過程無法繼續。運行 "lilo" 將給 lilo 一個機會來更新它的啟動映射。
C. 已經編譯好的內核怎麼修改vermagic
修改include/linux/vermagic.h裡面的VERMAGIC_STRING值即可。(默認是把不同部分組合起來,你直接用固定字元串硬寫,把-svn2067去掉)
D. 如何編譯Linux內核
一、編譯環境
ubuntu 5.10,要編譯的內核源碼版本2.6.12 二、下載並解壓源代碼 首先從linux內核的官網www.kernel.org把源代碼下載下來。為了和後面實驗要求符合,我們要下載使用O(1)調度器的源碼。因此這里下載了2.6.12版本源碼。下載 下linux-2.6.12.tar.bz2,將下載源碼放入/usr/src/目錄下。如下圖所示: 解壓該源碼: 三、構建編譯環境 現在我們得到的只是源代碼,只是許許多多的文本文件,要想使這些文件成為可以運行的程序,需要使用編譯器進行編譯以及鏈接。編譯器有很多,但在里linux下一般都使用gnu的開源編譯器套件,這里包括gcc等,現在我們安裝基本的編譯器套件,如圖所示: 四、安裝ncurses庫 這里使用Ubuntu系統,因為系統自帶的ncurses庫在支持make menuconfig的時候會出錯,所以,依然要安裝ncurses庫,這里我們從源碼安裝。首先去ncurses官網http://ftp.gnu.org/pub/gnu/ncurses/ 上下載源碼。這里我們下載5.9版本,並通過簡單的安裝方式.configure 和make、make install方式安裝。如下圖所示: 五、配置內核 一切准備工作做完,現在我們就可以配置內核了,這里我們使用make menuconfig方式。如下圖: 在使用make menuconfig這個命令後,會出現如下的字元界面,我們就可以在這個界面上對內核進行配置。但是如果這不是你第一次配置這個內核,那麼請先運行:make mrproper來清除以前的配置,回到默認配置,然後再運行:make menuconfig.
在這里,我們以對cpu支持的配置為例,其餘的選項就不一一詳述,首先查看本機的cpu類型,如下圖:
在這里我們可以看到,我的電腦的cpu是AMD Athlon的,因此我們在cpu選項裡面選用AMD,如下圖所示:
在這里需要注意的是:
A、 cpu的設置在linux內核編譯過程中,不是必需的,即使保持默認的386選項(我們剛才把它改成了AMD),內核也能正常運行,只不過運行慢一些而已。
B、 一般容易出問題的地方在於Device Driver的設置。我在一開始就遇到了在內核編譯完,通過grub引導系統過程中報 「ALERT! /dev/sda1 does not exist . Dropping to a shell!」的錯誤。這是因為硬碟驅動沒有配置好而造成的。運行lspci命令,查看到下面這行:
由此確定,需要配置SCSI、PCI-X、Fusion-MPT驅動,需要在響應的驅動選項里將[M]設置為[*],因為硬碟驅動是在系統開機的時候載入,所以不能以模塊形式載入。
把這幾個驅動內部的選項全部改為[*]:
六、編譯內核
對內核的配置完成之後,現在就可以開始編譯內核了,只需要一個簡單的make命令即可,之後我們就只能慢慢等,直到編譯完成,在我的電腦上,大概用了25分鍾。下圖是運行make後的部分輸出。
七、安裝內核
編譯完成之後,我們需要安裝內核,主要分為如下幾步:
1)、安裝模塊
安裝模塊,對於內核來說,每一個內核版本有自己的模塊目錄,默認在/lib/moles/內核版本號這個目錄下,make moles_install會創建對應的目錄,並把對應的模塊文件拷貝過去。注意,這一步必須要在編譯過內核再做。
2)、拷貝bzImage文件
bzImage文件是內核映像文件,是啟動內核所必需的,我們應當把它拷貝到/boot目錄下。在這里,我為自己新建了一個目錄,我們把它拷貝過去,並且按照一般內核映像文件的命名方式為它改名為vmlinuz-2.6.12。
3)、製作initrd文件
initrd文件命名為initrd.img-2.6.12
4)、修改grub啟動項
要能引導起我們的新系統,需要更改grub配置,增加啟動選項。ubuntu 5.10的grub版本比較低,配置文件為/boot/grub/menu.lst,高版本的grub可能在/boot/grub/grub.cfg里。在原有啟動項基礎上,添加我們自己的啟動項,並把它設為默認啟動項,配置如下:
5)重啟
不出意外的話,我們的內核已經正常載入了,運行uname -a,會發現,內核版本已經是2.6.12了。
E. linux編譯模塊的內核版本和現在使用的內核版本不一致的話,怎麼將現在使用的內核版本配成編譯所要的
修改Makefile中的KDIR參數,你現在的Makefile是怎樣寫的?
參考Makefile:
obj-m := moles.o
moles-objs := mymod.o
KDIR=/lib/moles/`uname -r`/build
PWD =$(shell pwd)
default:
make -C $(KDIR) M=$(PWD) moles
clean:
rm -rf *.o .* .cmd *.ko *.mod.c .tmp_version
F. 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文件中了。
注
G. linux內核編譯問題
根據你的警告是提示,找不到這些驅動模塊,應該是沒有編譯驅動模塊或者沒有安裝驅動模塊造成的。
1、要確保你的內核包是完整的,而且是centos配套版本(因為各大發行版都會針對自己的情況對內核進行配置和改動,直接用kernel.org的原版內核可能會有些故障)
2、編譯前要 先make clean一下,把以前編譯剩下的東西清掉,重頭再來。
3、編譯時順序執行如下命令
make bzImage 生成內核映像
make moles 生成驅動模塊
make moles_install 安裝驅動模塊
make install 安裝內核
H. 在編譯內核版本為3.12.6中加入yaffs2文件系統時出現以下情況,如何破!!
所有人回答都不對,linux 版本總是對這些宏改來改去,搞的早期的軟體都不支持了,比如說:
早期內核是這樣定義的:
typedef uid_t kuid_t;
typedef gid_t kgid_t;
linux 3.1以後內核,不知道世界某個角落的2B程序員奇思妙想,改成下面這樣的:
typedef struct {
uid_t val;
}kuid_t;
typedef struct {
gid_t val;
}kgid_t;
看到上面的代碼,你就會明白,所有引用到uid_t和gid_t變數的地方,都要改為下面的調用方法:
ia_uid.val;
ia_gid.val;
I. 怎麼查看編譯的Linux內核源代碼的版本信息
but he failed And he was socked with sweat.