linux内核实验平台搭建,搭建自己的Linux实验系统(一)
當你對操作系統已經有了基本的把握;而且對Linux也有了初步的了解,可是,如果你是一個程序員,你肯定還是會覺得惴惴不安:Linux到底是怎么回事?
求知和求實是程序員的天性,我們當然有義務滿足自己的天性,所以,相關的實踐必需在此展開。可是,我們到底要實踐些什么呢?
不如從搭建Linux系統開始。
在搭建的時候,我們需要制作一個root文件系統:你很清楚了,所有必須的軟件和數據都在上面,只要我們選定的范圍合適,那么什么是操作系統最核心的組成部分在我們實驗以后顯然會一清二楚;我們需要制作一個內核鏡像:沒有內核,操作系統將會怎樣?但是沒有(不包含)用不到的內核功能,操作系統肯定會安然無恙。實驗過后,你肯定會清楚內核到底要做些什么!內核和文件系統都有了,那不就OK了?稍等,怎么把兩者綁定到一塊呢?還有硬件啟動的麻煩事,怎么才能讓系統真正開始工作呢?
“安得倚天抽寶劍,將汝截為三段!”一段編譯,一段創建,一段自己連…
好了,不開玩笑了,讓我們開始吧。
搭建的基礎?
首先我們必須做出一個基本決定,到底是從源代碼開始搭建呢?還是從現有系統上裁減出一個系統呢?如果是從源代碼開始搭建,那么我們需要對所有的軟件包進行下載、編譯、鏈接和安裝,這中間步驟非常繁瑣,在這里我們不希望選取這種方式。說實話,其實這方面有非常不錯的Howto文檔LinuxFromScrach(有翻譯好的中文文檔),你完全可以按照該文檔進行搭建。
但是,我們的考慮是用最小的代價--消耗時間最短、相關硬件需求最少--來完成操作,而且整個過程必須保證安全可靠,即使初學者出現一些誤操作,也不應該影響原來安裝好的系統。所以,我們決定從現有的系統上抽出我們所需的原料。
分三步建立系統
非常遺憾,搭建Linux操作系統的人基本上都是diyer,所以不存在什么標準流程。但是大體流程都大同小異,無非是:首先編譯內核——將內核源代碼編譯成一個可執行的鏡像文件,當然,此時可能還會需要編譯一些模塊,這要取決于你是如何配置內核的。
有了編譯好的內核還遠遠不夠,因為你還沒有能容納系統程序和應用程序的文件系統,所以接下來需要創建一個root文件系統。文件系統要包含什么?第二步會有詳細的說明。
內核與文件系統都有了,現在是萬事具備,只欠東風了。只要將內核和文件系統邦定到一起,讓機器啟動后載入我們編譯的內核,進而安裝root文件系統,然后執行其中的初始化程序,我們的工作就大功告成了。說來輕松,可這個收尾動作難度系數還是蠻高的,初學者往往都在這里要栽跟頭--你必須對系統啟動過程了如指掌才能左右逢源。
搭建一個操作系統是我們深入了解Linux系統的一個非常好的途徑。當然,由于操作系統這門學科本身涵蓋面非常廣,而實際的操作系統軟件又龐大不堪。所以,一開始從任何層面著手實踐肯定都會有盲點,有不能理解的地方,其實不用著急,隨著內容的逐漸展開,希望您和我們一起探討,共同解開這些疑惑。
前面提到過,我們希望搭建的過程安全便捷,但不是每個朋友都能找到空硬盤或者磁盤(看看你的機器,也許連軟驅都沒有)來做新系統的。而且為了防止初學的朋友不小心誤操作,新開分區等危險操作也應該盡力避免。所以,我們決定在系統啟動時使用RAM盤來存放根文件系統。
提醒:這種實現其實在嵌入式系統中常常用到,許多嵌入系統并沒有硬盤,只有容量很小的ROM disk,里面存放壓縮過的數據;而且運行中根本就不需要向磁盤存儲任何數據。
現在開始,我們一同做個這樣的實驗小系統,你要付出些代價是:時間+無數次擊健。
編譯內核
第一步要做的工作是挑選一個合適版本的內核源代碼包,然后編譯它。不要以為編譯內核很神秘,其實它和編譯普通程序差不多,內核源代碼其實就是“一大堆”程序,它也是通過編譯一個個的文件,然后將它們鏈接成一個可執行鏡像文件。這個鏡像就是你在/boot目錄下看到的vmlinuz-*。(如果你細心的話,一定能發現在該目錄下還有一個叫vmlinux的文件。其實這兩個文件是一回事,前面那個不過是經過壓縮的罷了。)
正如第一部分所提到過的,Linux內核具有很強的伸縮性,在編譯內核時,你很容易就能發現這一點:很多功能是可選的,如果系統需要它,就可以將其編譯到內核。不過加入太多的功能會使內核迅速膨脹起來。一種替代的方式是將某些功能編譯成模塊,放在文件系統里,等你真正需要它時,再把它載入到內存中供內核使用。
雖然是個實驗系統,但我們希望它支持盡可能多的硬件和實現盡可能多的功能。所以我們配置內核編譯選項時,除了支持最基本的ext2文件系統,PCI接口,自動裝載模塊機制以外,又把ext3,JFS,即插即用,網絡,SCSI,USB等比較常用的部分加入到內核中(我們的系統不大,所以,為了方便起見把它們都直接編譯到了內核。不過也留下網卡驅動以模塊形式編譯,好讓大家印證一下模塊自動載入機制)。此外,為了能在虛擬內存中建立root文件系統,內核還必須支持Ramdisk和initrd。
內核網絡設備選項里包含大量網卡驅動程序,你必須知道自己的網卡類型才能正確選擇,一般情況下都將網卡驅動編譯為模塊,在系統啟動后載入。我們的實驗系統運行在vmware下,而vmware虛擬網卡驅動為pcnet32,因此只包含這個驅動模塊。
編譯步驟
巧婦難為無米之炊,首先得去下載一份內核源代碼。就算一直是飯來張口,也別指望我能給你提供內核源碼,自己到網站上下載一個想要版本的內核源代碼吧。如果是gz結尾的壓縮源文件,就使用tar xvzf linux-2.6.x.tar.gz解開,如果是bz2結尾的,就用tar xvjf linux-2.6.x.tar.bz2解開。
內核版本編號可是有點講究的,簡單的說,偶數為穩定版本,奇數為開發版本。我們選用的是2.4.18版,希望大家下載最新版本2.6.32。
進入解開后的內核源代碼目錄(標準系統默認情況下在目錄/usr/src/linux下存放該系統的內核源代碼,如果你自己解壓源碼包,那么如果不指明具體的目錄,默認解壓到當前目錄的linux目錄下),執行命令make menuconfig,進行內核編譯選項的配置,選擇需要的功能,以模塊形式編譯或直接編譯到內核。配置信息默認情況下保存在隱含文件.config中,你也可以選擇將其保存到指定的文件中,比如可以把信息記錄在MiniSys.config中,在以后重新配置內核時可以方便地導入指定的配置文件(即使是老手,配置內核有時也會出現問題,導致編譯失敗。我們建議初學者從默認情況開始,逐步加減內核編譯選項,小步更改,多次練習,逐步掌握內核配置本領)。
make menucofig提供給你一個終端圖形界面的配置菜單,其中列出了內核所能提供的全部功能,如果你在選項前打上*標號,那么該選項被編譯到內核中,如果打上M標號則被編譯為模塊,對于你不清楚的選項的意義,可以使用?查看它的幫助文檔。除了用make meunconfig外,如果你有復古情結的話,可以試試使用make config,它完成同樣的功能,不過你得有足夠得耐心去忍受洪水一般涌過的命令行信息,同時不厭其煩對功能項進行取舍(選或)。如果你在X環境下(桌面環境),不妨使用make xconfig配置,相比前兩種方法,它更容易看清楚一些,推薦眼神不好的網友使用。
保存內核配置后,就執行make dep,該操作檢查代碼之間的相互依賴關系,比如引用的頭文件是不是都被包含了。
makeclean,該操作用來清除以前編譯內核時遺留下來的生成物。采取這個步驟是習慣問題,現在新版本的內核已經不是必需的了。
makebzImage或make zImage,編譯內核——bzimage和zImage兩種內核之間最大的差別是對于內核體積大小的限制。zImage內核需要放在實模式1MB的內存之內,所以其體積受到了限制。而bzImage的內核沒有1MB內存限制,因此通常用它。
編譯過程漫長而且乏味(至少在我的vmware虛擬機中非常慢),尤其討厭的是,要是你選擇功能不當,那編譯時就會出錯,終止編譯過程。這時你不得不從頭開始,修改選項,重新編譯,好不麻煩。所以每次配置都不要追求勇猛精進,最好參考我們的建議,逐步添加功能,保存配置信息,以防不測。
注意,內核編譯完了,還要編譯模塊。即使您在配置內核時沒有使用任何模塊,最好也不要跳過此步驟,在編譯完內核后立刻編譯并安裝模塊是個好習慣。當然,如果您確實沒有配置什么模塊的話,這部分工作很快就會結束。
makemodules,編譯內核模塊,凡是在配置內核時標記為M的部分都將被編譯為模塊。
makemodules_install,將編譯好的內核模塊安裝到正確的位置上,一般會放在/lib/modules//這個目錄下。當然,如果你想改變模塊的安裝目錄,可以修改Makefile文件,通過設置INSTALL_MOD_PATH來改變模塊的安裝目錄。
等蝗蟲一樣的字符風暴在屏幕上停歇后(當然不是滿屏的出錯信息!),你真的擁有新內核了。它藏在內核源碼目錄下的子目錄arch/i386/boot下,叫作bzImage或zImage(根據你的make操作而定),模塊也被安裝到了相應的位置上。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的linux内核实验平台搭建,搭建自己的Linux实验系统(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle 相同的sql执行两次 执行
- 下一篇: linux 查看java最大内存配置,L