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機器
在真實的機器上,使用U盤安裝更加方便。我們將在已裝windwos7的x86-64機器上用U盤安裝,確保你的電腦能用U盤啟動,如果不行只能選擇燒寫ISO到DVD光盤中用光盤安盤了。其次要確保硬盤有足夠的空間,如果沒有的話,可以調整windows使用的磁盤空間大小(如果不懂設置方法,可以自己百度一下),我的硬盤預留了20G的空間。
接下來制作U盤安裝盤,這里需要用到Universal-USB-Installer工具(我用的是1.9.5.1版本)。步驟如下:
在windows系統下插入U盤;打開Universal-USB-Installer程序;
在step1中選擇"try unlisted linux ISO";
step2中選擇DVD安裝ISO的路徑;step3選擇要安裝的U盤(推薦勾選"Format");
開始寫入U盤,經過幾十分鐘的等待,U盤安裝完畢,可以使用該U盤啟動了。
(用U盤啟動的方法與主板的類型相關,可在網上搜索相關的內容)
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(或U盤)中的安裝組件,全部選擇默認則可。
加載完后,安裝選項又多了不少。下一步可以"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機器上,系統無法把安裝U盤識別為光盤,不能將安裝U盤作為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即可讓共享功能正常使用。