「乾貨」Linux 核心學習:環境搭建和核心編譯

「乾貨」Linux 核心學習:環境搭建和核心編譯

01

環境搭建--安裝Debian7.3

本系列文章假設讀者已對linux有一定的瞭解,其實學習linux核心不需要有很深的關於linux的知識,只需要瞭解以下內容:linux基礎知識及基本shell命令;現代作業系統的基本概念;C語言和gcc基本使用。

在開始我們的linux核心學習之前。首先需要搭建我們的工作學習環境,即安裝linux系統。關於linux系統構建本身的學問已經複雜到可以成為一個獨立的學科了,畢竟這不是我們學習的內容,所以我選擇最簡單的方法:選擇一個linux發行版進行安裝。

01

選擇linux發行版

即使使用最簡單的構建工作環境的方法,也耗費了我許多時間。

“選擇”之所以這樣困難,正是因為可供選擇的太多了!

linux發行版有成百上千種,每個發行版都有不同的特點,確實讓人難於取捨。我先後試裝過Gentoo,Arch,debian,fedora。發行版的選擇見仁見智,我不敢說哪個發行版好,哪個不好,每個發行版都有它的擁躉。這裡 建議在選擇時考慮幾個問題:設計哲學,社群支援和包管理器。

實際上,選擇哪種發行版都關係不大,發行版之間的差別基本上都是外圍元件,對linux的核心的修改都不會很多。

況且我們在學習linux核心,或者開發linux驅動時,一般都是以官方核心(即Linus維護的主線核心)為基準.所以我們搭建好環境後幾乎都是要選擇一個版本的官方核心來重新編繹以備用的。

現階段有時間可以多試試不同的發行版,選擇自己最喜歡,用起來最順手的,一旦選擇好了,就不要再改了,一直堅持用它,把它用得滾瓜爛熟.人們會關注你在linux環境中是否得心應手,一般不會關心你懂得用多少種linux發行版。

經過反覆的試用,比較,我最終選擇了Debian,吸引我的是它的崇尚自由的設計哲學;強大的社群支援;數量龐大的軟體包。 相對而言debian還是比較保守的,我用的當前的最新穩定版Debian7。3,在2013年12月釋出,它使用的核心還是3。2的(現在官方最新的穩定版核心為3。12。8),不過它配套的工具如GCC,make等,即使用來編繹最新版的核心也已經夠用了。

02

選擇主機環境

網上很多有經驗的linux專家級人物都建議直接在自己的工作機或家庭機上安裝linux系統,所有日常工作,生活都在linux系統裡完成。

不過對於大多數人來說,這太不現實了了。作為桌面系統,當對於windows而言,linux還是有許多不方便的,即使是最近幾年非常火的ubuntu,號稱可以替換windows的發行版,在日常使用的軟體方面,還是有不小的差距;

再者,我們在工作中常常還是需要開發windows程式,而家裡更不合適了,家裡人基本上都用慣了windows,總不能強迫他們去用不懂的linux系統吧。因此,windows+vmware作為主機環境對於許多人來說,還是第一選擇。

另外還需要一臺真實電腦上安裝linux系統,因為在vmware裡的客戶系統無法訪問主機中一些硬體,如pci裝置等,當開發這些裝置的驅動時必須在真實機器上除錯。

我使用的主機環境有兩個:windows 7+vmware10。0。1環境中安裝debian以及x86-64位機器上的windows 7+debian雙系統。

03

安裝準備

安裝準備工作的第一步當然是下載安裝映象了。Debian的下載地址:www。debian。org/CD/http-ftp。

因為在公司限制上網,另外也不喜歡老是線上安裝軟體,就直接下載了一個用於amd64平臺的DVD安裝映象.有3G多,常用的軟體都有了,需要時直接從DVD裡安裝就行了,一勞永逸。

3.1 vmware

首先使用vmware建立vmware虛擬機器,建立時候,“Guest operation system”選擇“Debian 7 64位”這一項。

核心分配512M即可,硬碟20G足夠了。vmware虛擬機器可以直接將iso檔案作為客戶機的光碟使用,因此安裝起來非常方便。

只需要在虛擬設定中的DVD光碟機的連線選項設定為“使用ISO映象檔案”,並指定DVD安裝ISO映象的路徑即可(後面為了簡潔起見,將這一操作稱為“ISO映象加入虛擬機器”),接下來開機即可用光碟引導(如果虛擬機器磁碟已安裝有系統,則需要在虛擬機器的BIOS裡設定光碟啟動,這跟普通電腦設定方法是相同的)。

3.2 x86-64機器

在真實的機器上,使用隨身碟安裝更加方便。我們將在已裝windwos7的x86-64機器上用隨身碟安裝,確保你的電腦能用隨身碟啟動,如果不行只能選擇燒寫ISO到DVD光碟中用光碟安盤了。其次要確保硬碟有足夠的空間,如果沒有的話,可以調整windows使用的磁碟空間大小(如果不懂設定方法,可以自己百度一下),我的硬碟預留了20G的空間。

接下來製作隨身碟安裝盤,這裡需要用到Universal-USB-Installer工具(我用的是1。9。5。1版本)。步驟如下:

在windows系統下插入隨身碟;開啟Universal-USB-Installer程式;

在step1中選擇“try unlisted linux ISO”;

step2中選擇DVD安裝ISO的路徑;step3選擇要安裝的隨身碟(推薦勾選“Format”);

開始寫入隨身碟,經過幾十分鐘的等待,隨身碟安裝完畢,可以使用該隨身碟啟動了。

(用隨身碟啟動的方法與主機板的型別相關,可在網上搜索相關的內容)

04

安裝系統

為了使用方便,兩個系統將採用相同的安裝配置,另外我只安裝基本的shell環境和必要的工具軟體。

使用GUI模式雖然美觀,看起來爽,但是對我們這些硬體資源貧乏的窮人來說,執行GUI就是種浪費;其次,與windows不同,linux的X Window完全執行在使用者態,與核心關係不大;再者,在漂亮的桌面環境上放一個終端視窗,總覺得很怪異。

我覺得核心和驅動開發者都應該用shell環境,只在需要進行UI相關的測試或編寫UI程式時才使用GUI環境。

言歸正傳,繼續進行我們的系統安裝吧。經過上面的步驟,不管是vmware還是x86-64機器,debian安裝介面總算是出現了。

選擇“advanced option”——>“expert install”進入專家安裝模式(現在專家那麼多,咱也來冒充一回吧!!)。彈出了一列選項,其實裡面有很多選項都沒必要使用的,大部分都可以在系統安裝完成後進行設定。

選項列表的前面是安裝語言和鍵盤設定,這些可以跳過,就用預設的English就行了,反正在文字模式下也顯示不了中文。首先要執行的是“ Load installer components from cd”,這一步會載入ISO(或隨身碟)中的安裝元件,全部選擇預設則可。

載入完後,安裝選項又多了不少。下一步可以“setup user and passwords”,在配置選擇中,最好選擇“不使用root帳號”,root帳戶許可權太大,現在的linux界普遍認為不用為妙,可以使用sudo工具執行特權操作,建立自己的使用者名稱和密碼,按提示操作即可。

接著就要配置磁碟分割槽了,首先要“detect disks”,讓安裝程式先檢測磁碟,然後進行“partition disks”,怕安裝程式弄壞我的磁碟,我喜歡選擇了“Manual”模式。懶得去設計分割槽,將剩餘空間全部劃成了一個“/”分割槽,分割槽的屬性分別是:“ext4”型別,“primary”,“bootable”選項。完成分成,忽略關於沒有交換分割槽的警告,寫入磁碟就完了。

現在可以開始“install the base system”。安裝過程中有個提示,問你要選擇哪個核心,我選了“linux-image-3。2。0-4-amd64”,沒去研究供選擇的兩個核心有何不同;接下來又提示initrd的選擇,為了節省空間,選擇了“targeted:only 。。。。。”。

接下來可以“configure the package manager”,因為我不想讓系統連網,所以就在“use a network mirror”選擇了“no”,另外其他的“service”也全部不選,當然這些選項都可以在系統安裝好以後進行修改。

最後選擇安裝軟體:“select and install software”,在軟體列表中,我只選擇了安裝“standard system utilities”,其他全部不裝。

到這裡,實質上的系統已經安裝完了,就差引導部分了。有grub和lilo可選,我更喜歡grub,因此選擇:“install the grub boot loader”。debian7。3用的是grub2,功能非常強大。

在安裝過程中grub會自動檢測當前磁碟中安裝的其他的系統,可以放心將grub安裝到MBR中,不必擔心你的windows會無法啟動。安裝完畢,選擇“finish the install”,重啟系統吧!

05

安裝開發工具

現在我們有了一個基本的debian系統,但是還沒有gcc等開發工具,無法進行日常工作,需要安裝這些工具。

5.1 設定安裝源

debian的包管理器非常完善,我們現在安裝軟體就用debian強大的apt-get命令。但是在使用前要先配置安裝源,以告訴apt-get命令去哪裡找我們的軟體。

安裝軟體儘量都從下載的ISO安裝,既然下載了那麼大的一個ISO映象,就別浪費了。debian可以設定幾種安裝源,如CD安裝源,網路安裝源,本地安裝源。

5.1.1 設定CD安裝源

在vmware中,可以將ISO檔案當作光碟使用,實在是太方便了。因此,在vmware中我們設定以CD作為安裝源,實際上在安裝系統時,系統的包管理器就已經把DVD安裝盤加入安裝源了,可以檢視/etc/apt/sources。list檔案。

如果沒有加入,或者想加入別的CD安裝源也非常簡單,只需執行以下操作:

將ISO加入虛擬機器

掛載光碟:sudo mount /dev/cdrom /media/cdrom

將光碟加入安裝源:sudo apt-cdrom add

開啟/etc/apt/sources。list檢視是否新增成功

更新軟體件表:sudo apt-get update

5.1.2 設定本地安裝源

在真實的x86-64機器上,系統無法把安裝隨身碟識別為光碟,不能將安裝隨身碟作為CD安裝源加入。

不過我們可以將ISO檔案掛載到某個目錄,再將該目錄作為本地安裝源加入包管理器,步驟如下:

建立本地安裝源目錄:sudo mkdir /mnt/iso_1

掛載ISO檔案到該目錄:sudo mount /。。。/debian-*。iso /mnt/iso_1

新增本地安裝源:開啟/etc/apt/sources。list,新增一行,內容為:deb file:///mnt/iso_1 wheezy main

更新軟體列表:sudo apt-get update

5.2 安裝開發工具

5。2。1 安裝VIM,執行命令:sudo apt-get install vim

安裝系統時安裝的是精簡版的VIM:vim。tiny,功能不齊全,因此安裝完整的VIM,喜歡其他程式碼編輯工具的網路可以安裝其他工具。

VIM安裝完後進行配置,在/etc/vim/vimrc檔案最後加上以下幾行(不包括括號內容):

set nobackup (開啟時不建立備份檔案)

set ts=4 (設定tab鍵寬度為4個字元寬)

set atuoindent (啟用自動縮排功能)

set cindent (啟用C語言縮排功能)

set shiftwidth=4 (縮排寬度為4個字元寬)

syntax on (開啟語法高亮功能)

5。2。2 安裝開發工具包:sudo apt-get install build-essential

build-essential包含了常用的gcc,g++,make等開發工具.

5。2。3 安裝linux-headers:sudo apt-get install linux-headers-3。2。0-4-amd6

需要編繹系統自帶核心相關的模組時,必須安裝該核心對應的linux-headers,裡面包含核心配置資訊,核心標頭檔案等。

5。2。4 安裝ncurses-dev:sudo apt-get install libncurses5-dev

核心配置指令碼依賴於該工具,如果沒有安裝的話,配置核心裡會出錯。

5。2。5 安裝git:sudo apt-get install git

著名的流行的分散式版本管理工具,由Linus開發,官方核心開發用的版本管理工具也是git。Linus的作品,不能不用啊!

git需要先配置使用者名稱和email:

git config ——global user。name “xxxxxx”

git config ——global user。email “xxxxxx@xxx。com”

06

環境搭建完成

可以正式開始我們的linux核心學習之旅了。

02

編譯核心

環境搭好後,馬上就進入到下一環節——編譯核心。linux的核心是整個系統最核心的部分,核心的功能基本上決定了系統的能力。

linux的核心程式碼使用的是GPL授權,允許自由下載,修改並重新發布核心,只要求釋出修改後的核心的同時提供原始碼。

各種各樣的核心版本眾多,幾乎所有的linux發行版都會對核心進行或多或少的修改,debian也不例外。這些核心都有個源頭,即Linus維護的官方核心,其他的核心幾乎都是建立在官方核心的基礎上的。我們的核心學習,也是以官方核心為準。

linux官方核心的網站是:www。kernel。org。從裡面可以瞭解到核心開發的最新動態,現在就把該網址加入收藏夾吧。

(另外有個網站:www。lwn。net裡面有許多linux大牛發表的觀點,也值得收藏)。

從linux核心3。0開始,核心版本命名採用的策略跟以前不一樣,命名格式為3。A。B,其中A為核心的版本,B為補丁的版本。即3。A。B與3。A。C的核心是相同的版本,具有相同的功能,如果C>B,只是說明3。A。C相比3。A。B修補了一些BUG而已。

進入核心3。0時代後,核心的開發工作發展迅速,版本更新得很快,第一個3。0版本是在2011年7月,而現在,最新的穩定版已是3。12。8,而新的3。13版核心開發工作也已接近尾聲,即將釋出穩定版了。(“zh。wikipedia。org/wiki/linux”核心“介紹了部分版本的特性)。

01

選擇核心版本

首先我們需要從www。kernel。org選擇一個版本。實際上從2。6版本開始,核心的架構沒有特別大的變動,基本上是新增新的功能,新增新的驅動的支援,核心介面有一些變動。

另外,除非不得已,不要再使用2。4及更低版本,因為2。6核心的整個架構經過全面重新設計,效率更高,功能更完善,也更安全。

我覺得儘量選擇與發行版使用的核心版本差不多的話會比較好點,核心跟其他元件相對會配合得好些,不知是不是這樣。debian7。3使用的核心是3。2的,而現在該核心版本的最新版為3。2。54,使用相同核心版本的帶有最新補丁的核心重編譯並替換原來的核心,可以最大程度上減少與系統其他部分的相容性問題,這樣我們可以將主要精力集中在核心的學習上。

下載得到的核心名為linux-3。2。54。tar。xz。

下面將描述在上一課中搭建的“windows7+vmware10。0。1+debian7。3”的系統中編譯核心linux-3。2。54的步驟,在真實機器上安裝的debian7。3系統上編譯的方法也是類似的。

02

安裝vmware-tools

核心檔案下載好後,需複製到vmware客戶系統(即debian系統)。

最好的方法是使用vmware提供的檔案共享功能,這個功能由vmware-tools軟體包提供,需要先安裝該軟體包。首先設定共享目錄,在VMware選單欄上點選”虛擬機器“——>”設定“,開啟設定頁面,點選”選項“屬性頁,點選”共享資料夾“,在右端選擇”總是啟用“,再點選”新增“,按提示設定主機中用於共享的目錄路徑和共享名稱(我用的是workspace)。

啟動debian系統後,點選選單欄的”虛擬機器“——>”安裝VMWare Tools“。稍等片刻後,虛擬機器的CD光碟機動應該已經有了vmware-tools的安裝盤。在debian系統按以下步驟進行:

掛載光碟:sudo mount /dev/cdrom /media/cdrom

複製安裝包: cp /media/cdrom/VM*。tar。gz 。/

解壓安裝包:tar -xvf 。/VM*。tar。gz

cd 。/vmware-tools-distrib

安裝:sudo 。/vmware-install。pl(安裝過程中所有選項都使用預設即可)

安裝完成了,檢查發現/mnt目錄下多了一項hgfs目錄,裡面是主機共享目錄,即/mnt/hgfs/workspace。

03

準備新的核心原始碼

將下載的核心原始碼放在上一步中設定的主機共享目錄中,然後解壓到預設的核心原始碼目錄:sudo tar -xvf /mnt/hgfs/workspace/linux-*。tar。gz -C /usr/src

/usr/src目錄下是專門存放核心原始碼的。

放在其他目錄也可以編譯的,不過我們還是遵循通用的規則吧。

我們的debian系統是64位版本(正式名稱是x86_64),為了避免出現問題,我們的核心也將編譯成x86_64版本,故修改下原始碼目錄名稱:sudo mv /usr/src/linux-3。2。54 /usr/src/linux-3。2。54。x86_64。同時把原始碼目錄下的Makefile檔案內容也改一下:

sudo vim /usr/src/linux-3。2。54。x86_64/Makefile

搜尋字串”EXTRAVERSION =“,在”=“後面加上”。x86_64“。

這樣,編譯出來的核心映象,模組目錄等都會自動加上”。x86_64“字尾。

04

配置核心

配置核心就是告訴編譯器,原始碼中的哪些功能要編譯進核心,哪些編譯成模組,哪些不需要編譯。原始碼中包含了幾千個選擇,因此配置核心是個很複雜很吃力的工作,為了簡化這個工作,核心開發者為各個平臺編寫了預設的簡單配置檔案。以x86平臺為例,配置檔案放在”arch/x86/configs“目錄下,可將這些配置檔案作為配置工作的起點,選擇其中一個檔案複製到原始碼目錄下,並命令名為”。config“(注意前面有個”。“,它是隱藏檔案),這是核心編譯時使用的配置檔案,也是核心配置工具啟動時載入的檔案,當然核心配置修改後的配置資訊也儲存在這個檔案裡。

由於VMWare的硬體與普通的硬體不同,用核心開發者提供的配置檔案編譯出來的核心無法引導系統,我們先暫時忽略有關核心配置的複雜細節,走條捷徑,以debian系統安裝時產生的配置檔案作為我們配置核心的起點。

既然debian能引導,用它編譯出來的核心應該不會有什麼大問題,複製debian的配置檔案到原始碼目錄,並配置:

sudo cp /boot/config-3。2。0-4-amd64 /usr/src/linux-3。2。54。x86_64/。config

cd /usr/src/linux-3。2。54。x86_64/

sudo make menuconfig

即使不修改核心的配置還是需要執行sudo make menuconfig,因為發行版的核心可能經過修改,使用的。config也可能會有差異,執行一下sudo make menuconfig,它會重新分析。config檔案,設定檔案中描述的配置資訊,退出後再儲存成新核心適用的。config檔案(退出時,配置工具會詢問你是否儲存修改,需要選擇”yes“)。

05

編譯,安裝新核心

核心配置完成了,可以編譯核心了,分別執行以下命令,進行編譯並安裝核心:

sudo makesudo make modules_installsudo make install

make命令根據配置資訊進行編譯,包括模組。debian系統預設加入了許多驅動模組,整個編譯過程比較耗時,估計長達1。5~2個小時,在編譯時可能出現各種問題,需要根據錯誤提示進行修改。

本次編譯模組時就提示“drivers/staging/rts5139”這個模組編譯出錯,這是一個USB讀卡器的驅動,不是什麼必需的驅動,直接在核心配置中去掉該模組吧。

因此,重新執行sudo make menuconfig,找到該模組:“Device Drivers”——>”Staging drivers“——>”Realtek RTS5139 USB card reader support“。去掉該模組支援,退出儲存,重新執行sudo make。

make modules_install命令用於安裝可裝載模組,這些模組會自動安裝到/lib/modules/3。2。54。x86_64下。

make install命令執行三個操作:複製核心映象到/boot目錄下;生成initrd-img;更新grub。命令成功執行成功後,新的核心已可以使用,並且列在引導選單中。

06

重啟系統

重啟系統,grub引導選項中多了我們新編譯的核心選擇,選擇新核心引導。進入系統後執行命令uname -r 檢視當前的核心版本,顯示為“3。2。54。x86_64”,確實是我們新編譯的核心。

不過,在VMWare中重編譯核心後,vmware-tools的檔案共享功能不起作用了,這是因為vmware-tools中包含了核心模組,重編譯後,這些模組不能再正常載入了。

只需執行命令:sudo vmware-config-tools。pl(全部使用預設選項),重新配置vmware-tools即可讓共享功能正常使用。