內核和根文件系統的編譯與配置
一、准備工作
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內核編譯配置(menuconfig)、文件系統製作
深入解析Linux內核配置與文件系統製作
Linux內核配置採用Menuconfig模式,操作直觀、方便,用戶可對內核功能進行自定義選擇。配置步驟包括在源碼目錄下輸入命令`# make menuconfig ARCH=arm`,隨後會彈出配置主界面,界面中包含多種功能選項,如交叉編譯工具前綴、模塊支持、塊設備支持、處理器類型、電源管理、匯流排支持、文件系統、設備驅動等。
其中,塊設備支持選項使用戶能夠卸載已載入的塊設備,這是硬碟、USB和SCSI設備用戶所需的功能。而處理器類型選項允許用戶選擇不同架構的處理器配置,以適應不同設備需求。電源管理相關選項有助於優化系統在不同使用場景下的能耗。
內核配置步驟還包括對網路支持、文件系統、安全選項等模塊的詳細配置。每個選項都對應著特定的功能,用戶可根據實際需求進行選擇。選擇完成後,通過`make`命令即可生成配置好的內核。
文件系統製作則是另一重要環節。使用`tar`命令解壓所需的Linux工具包,接著使用`make_ext4fs`命令創建特定大小的EXT4文件系統。例如,為了創建一個314572800位元組大小的根文件系統,命令為`make_ext4fs -s -l 314572800 -a root -L linux rootfs_qtopia_qt4.img rootfs_qtopia_qt4`。若需創建一個512MB大小的系統文件系統,命令則為`make_ext4fs -s -l 512M -a system system_new.img system`。
根文件系統與普通文件系統的主要區別在於其作為整個系統的初始引導環境,包含了系統運行所需的基本文件、配置和程序。創建根文件系統是構建Linux系統的重要步驟,它直接關繫到系統啟動和運行的順利與否。
總結來說,Linux內核配置與文件系統製作是構建和優化Linux系統的關鍵步驟。通過合理配置內核,用戶可確保系統運行穩定、高效。而精心製作的文件系統則為系統的運行提供了必要條件,二者相互配合,共同推動Linux系統的穩定發展與應用。
Ⅲ 小白自製Linux開發板 三. Linux內核與文件系統移植
Linux內核移植與文件系統構建過程
對於F1C100S/F1C200S,Linux官方源碼提供了licheepi nano的支持。我們可以通過使用licheepi nano的配置文件來完成內核移植。
首先,進入Linux系統官網下載最新長時間支持版本(推薦5.10.69)或根據個人需要選擇其他版本。在新頁面中,選擇【summary】,點擊【tag】中的【...】進行下載。下載完成後,將代碼復制到Ubuntu虛擬機並解壓。
接下來配置編譯過程。在VS中打開Linux內核代碼,找到Makefile文件並進行如下配置:指定架構為Arm,使用已安裝的編譯工具。修改Makefile中的ARCH 和 CROSS_COMPILE欄位,或直接在make命令中加上對應參數。進行內核配置,使用licheepi_nano的配置文件替換sunxi_defconfig,並完成內核和設備樹的編譯。
為了確保TF卡設備樹的正確配置,我們需要修改suniv-f1c100s.dtsi和suniv-f1c100s-licheepi-nano.dts文件。通過在根節點添加代碼確保設備樹正確識別硬體。
在編譯過程中,可能會因Ubuntu系統差異遇到編譯錯誤,可以通過復制錯誤信息並安裝缺失組件解決。首次編譯可能需要較長時間,完成後,內核文件zImage和設備樹文件suniv-f1c100s-licheepi-nano.dtb將生成。
為TF卡配置分區,通過Gparted軟體新建兩個分區,一個用於存放內核文件和設備樹文件,另一個用於根文件系統。選擇fat16和ext4格式,並配置相應卷標。完成分區後,使用文件管理器查看掛載的兩個分區。
將生成的內核文件和設備樹文件復制到TF卡的BOOT分區。插入開發板,重啟後,系統將自動進入內核啟動環節,此時需要確保文件系統正確掛載。
接下來進行文件系統移植。選擇Buildroot工具製作文件系統,通過官網下載buildroot2018.2.11版本並解壓。配置Target options、Build options、Toolchain和System configuration,確保系統兼容性。執行構建文件系統命令,等待完成。
將最終生成的rootfs.tar文件解壓到TF卡的第二分區。插入TF卡,進入root賬號後,系統將成功掛載根文件系統,進入shell交互環境。
對於命令行前置顯示#號的問題,修改/etc/profile文件以實現與常規Linux相同的操作體驗。在開發板運行過程中,需執行命令正常關閉系統,否則可能造成文件系統損壞。
完成內核和文件系統的移植後,我們可以通過Linux的GPIO系統在小開發板上實現LED燈的點燈實驗。配置文件系統,修改相關命令,編譯完成rootfs後重新寫入開發板。了解GPIO編號和值的計算方式,通過shell命令操作LED燈。
最後,雖然當前實現的點燈實驗較為基礎,但它是Linux內核功能的初步應用。未來,我們計劃升級硬體設備並進行更深入的開發。讓我們期待接下來的探索吧!
Ⅳ 如何配置linux內核
在做Virtualization這段時間,編譯過多次Linux kernel,編譯Kernel過程中配置config這一步是相對來說比較復雜的。對編譯內核過程中的配置這一步做詳細的說明吧,總結一下,多數內容源於網上的多篇文章。
首發在我的博客:http://renyongjie668.blog.163.com/blog/static/1600531201143010295156/
首先,配置時可能出現的選項,對其選擇先來個說明吧。
Typically, your choices for each option are shown in the format [Y/m/n/?] The capitalized letter is the default, and can be selected by just pressing the Enter key. The four choices are:
y Build directly into the kernel.
n Leave entirely out of the kernel.
m Build as a mole, to be loaded if needed.
? Print a brief descriptive message and repeat the prompt.
y表示是(相應功能將直接編譯進內核),m表示模塊(相應功能將編譯為一個模塊,在需要時載入),以及n表示否(相應功能不會包含進內核)。?則(對該配置項)列印出簡要的描述信息並重復剛才的選擇提示。
其次,我使用的最多的兩個配置命令分別是:make muneconfig和make oldconfig
make oldconfig和make config類似,但是它的作用是在現有的內核設置文件基礎上建立一個新的設置文件,只會向用戶提供有關新內核特性的問題,在新內核升級的過程 中,make oldconfig非常有用,用戶將現有的配置文件.config復制到新內核的源碼中,執行make oldconfig,此時,用戶只需要回答那些針對新增特性的問題。
make menuconfig基於終端的一種配置方式,提供了文本模式的圖形用戶界面,用戶可以通過游標移動來瀏覽所支持的各種特性。使用這用配置方式時,系統中必須安裝有ncurese庫。
在內核樹的根目錄中,有一個.config文件,它記錄了內核的配置選項,可直接對它進行修改,再運行。在.config文件中,每個配置和選項的值只能為」y」和」m」兩者之一,如果不需要這個特性不再支持她,那麼可以將對應的選項用」#」注釋掉。實際上,如果你手頭有合適的.config文件,可以運行make oldconfig 直接按.config的內容來配置$ sudo make oldconfig
對內核的配置都是圍繞.config來展開的. 即便開始.config文件不存在,進行配置後會創造它.
一般來說,內核配置保存於/usr/src/linux-*/.config文件中。在/boot/config-<版本>有其備份。請保留它以備後用。
常見的幾種配置方式:
為了完成內核的配置,必須切換到root用戶,然後轉入內核源碼目錄(就是你下載新內核的目錄):
#cd /usr/src/linux/linux-2.6.38
然後執行下面命令之一:
#make config
#make oldconfig
#make menuconfig
#make gconfig
#make defconfig
#make allyesconfig
#make allmodconfig
1.make config
基於文本的最為傳統的也是最為枯草的一種配置方式,但是它可以使用任何情況,這種方式會為每一個內核支持的特性向用戶提問,如果用戶回答「y」,則把特性編譯進內核;回答「m」,則它特性作為模塊進行編譯;回答「n」,則表示不對該特性提供支持
如果回答每個問題前,必須考慮清楚,如果在配置過程中犯了錯誤給了錯誤的回答,就只能按「ctcl+c」強行退出了
2.make oldconfig
make oldconfig和make config類似,但是它的作用是在現有的內核設置文件基礎上建立一個新的設置文件,只會向用戶提供有關新內核特性的問題,在新內核升級的過程 中,make oldconfig非常有用,用戶將現有的配置文件.config復制到新內核的源碼中,執行make oldconfig,此時,用戶只需要回答那些針對新增特性的問題
make silentoldconfig : Like above, but avoids cluttering the screen with questions already answered.和上面oldconfig一樣,但在屏幕上不再出現已在.config中配置好的選項。
3.make menuconfig
基於終端的一種配置方式,提供了文本模式的圖形用戶界面,用戶可以通過游標移動來瀏覽所支持的各種特性。使用這用配置方式時,系統中必須安裝有ncurese庫,否則會顯示「Unable to find the Ncurses libraies」的錯誤提示
4.make xoncifg
基 於X Winodws的一種配置方式,提供了漂亮的配置窗口,不過只有能夠在X Server上使用root用戶欲行X應用程序時,才能夠使用,它依賴於QT,如果系統中沒有安裝QT庫,則會出現「Unable to find the QT installation」的錯誤提示
5.make gconfig
與make xocnifg類似,不同的是make gconfig依賴於GTK庫
6.make defconfig
按照默認的配置文件arch/i386/defconfig對內核進行配置,生成.config可以用作初始化配置,然後再使用make menuconfig進行定製化配置
7.make allyesconfig
盡量多地使用「y」設置內核選項值,生成的配置中包含了全部的內核特性
make allnoconfig :除必須的選項外,其它選項一律不選. (常用於嵌入式系統).
8.make allmodconfig
盡可能多的使用「m」設置內核選項值來生成配置文件
下載好Linux內核源代碼後,在源代碼的根目錄執行
make localyesconfig或者make localmodconfig
然後系統就會根據你的硬體自動生成一個適應你的硬體的.config (內核的配置文件)
make localmodconfig會執行lsmod命令查看當前系統中載入了哪些模塊(Moles),並最後將原來的.config中不需要的模塊去掉,僅保留前面lsmod出來的這些模塊,從而簡化了內核的配置過程。
這樣做確實方便了很多,但是也有個缺點:該方法僅能使編譯出的內核支持當前內核已經載入的模塊。因為該方法使用的是lsmod的結果,如果有的模塊當前沒有載入,那麼就不會編到新的內核中。
There』s an additional 「make localyesconfig」 target, in case you don』t want to use moles and/or initrds.
幾條好的建議:
除非您使用初始化ramdisk (initrd),否則絕不要把掛載根文件系統必需的驅動程序(硬體驅動以及文件系統驅動)編譯成模塊!而如果您確實使用初始化ramdisk,請為ext2FS支持選項選擇Y,因為ramdisk使用該文件系統。您還需要initrd支持。
如果您系統中有網卡,將它們的驅動編譯成模塊。這樣,您就能夠在/etc/moles.conf中用別名定義哪一塊網卡第一,哪一塊第二,等等。如果您將驅動程序編譯進了內核,它們載入的順序將取決於當初它們鏈接進內核的順序,而這不一定是您想要的。
最後,如果您不清楚某個選項的含義,請閱讀其幫助!而如果該幫助信息依然不能解決您的困惑,請保留該選項原來的樣子。(在config和oldconfig中可以按?鍵訪問幫助。)
配置最終結束後,請保存您的配置並退出。
參考資料:
http://www.cnmaizi.com/tech/elebuild/simplify-linux-kernel-config-rapid-compile-method-collect/
http://man.ddvip.com/linux/Mandrakelinuxref/compiling-conf.html
http://www.huomo.cn/os/article-5d18.html
編譯 Linux2.6 內核總結: http://www.cublog.cn/u/13991/showart.php?id=79823
編譯內核:http://my.chinaunix.net/space.php?uid=25806768&do=blog&id=302764
內核_.config 內核配置及Makefile:http://www.cnblogs.com/parrynee/archive/2010/05/13/1734689.html