打造簡單的linux操作系統(內核的精簡)

我們在實現內核精簡之前首先要知道爲什麼要做內核的精簡,以及我們做內核精簡的主要目的是什麼,內核精簡在實際工作中有什麼應用?


下面我們就談談這些:

內核精簡的主要目的:其實內核的主要目的只有一個就是實現單一或者少數應用。

內核精簡在實際工作中的應用:在公司的網絡往往需要一些服務器,比如web服務器,ftp服務器,DNS服務器。

那我們爲什麼要做內核的精簡呢?因爲我們使用linux的主機實現單一的功能時,並不需要內核中其他的功能。大家都知道,一個操作的系統的內核越大,啓用時佔用的資源就會越多,從而造成系統的穩定性降低,因此我們在做單一的應用時就必須做內核的精簡來減少資源的佔用儘量使系統更加穩定,更加高效。


現在,我們就來打造一個精簡的內核來實現FTP服務的功能。

當然,想要打造一個可以正常使用的內核,那你必須要了解系統啓動的引導過程,下面介紹一下系統啓動時的引導過程:

加電開機後,首先運行CMOS對系統軟硬件進行檢查,查看有沒有損壞或者系統的引導方式是光盤引導還是硬盤引導或者其他介質進行引導。檢測到我們是硬盤引導後,便啓動了系統引導的第一個階段,即由MBR引導(MBR共有512B,其中前446B是bootloader是系統引導的第一階段,中間64B的是分區表,分區表分爲了四行,每行佔用16B分別記錄了【記錄起始柱面結束柱面大小  id】所以linux下硬盤最多有四個主分區或者三個主分區和一個擴展分區的組合,後2B是magic值,是硬盤的唯一標識)。第一階段引導後便開始第二階段引導,便進入grub引導菜單,在這裏可以選擇要啓用的系統,然後加載內核及驅動程序,接着要調用進程。由於在linux系統中一切的進程都依賴於init進程,所以要首先調用init進程,接着會讀取/etc/inittab中的內容,無論/etc/inittab中默認的是何種級別(總共6個級別),系統都會執行/etc/rc.d/rc.sysinit腳本進行系統的初始化操作然後會根據/etc/inittab表中的默認級別進入到相應的/etc/rc{0-6}.d/*執行內部指令。然後,會執行/etc/rc.d/rc.local的開機腳本,接着呈現出用於登陸的終端的界面,至此,整個引導過程結束。


我們實現內核精簡,打造自己的操作系統的原理是:

我們需要具備完整系統環境的宿主機,將我們的硬盤掛到宿主機上,根據原有系統,打造內核、驅動、init及inittab、常用指令、庫文件、及vsftpd應用。最終拆解我們打造好的硬盤掛在我們要打造的主機上。

具體實現步驟:

首先,將硬盤掛在宿主機上進行相應的分區和格式化文件系統,且將相應的分區進行掛載:

分區的指令是:fdisk;格式化文件系統是:mkfs;掛載要先用mkdir建立掛載點,再用mount進行掛載。

1.我們先使用fdisk建立三個主分區【分別爲:boot分區、/分區、交換分區(swap)】


2.使用mkfs進行文件系統格式化,同時將/dev/sdb1/dev/sdb2格式化成ext3,/dev/sdb3格式化成swap分區:


3.建立掛載點,並且掛載分區:

使用mount指令查看掛載的分區:


其次,一個硬盤要想引導,就必須要有自己的MBR,而MBR內存放了引導的第一階段,也必須有引導的第二階段即grub引導階段,還要有內核等等。

a.因爲內核是系統的最核心部分,它不會因爲硬件的不同而做很大的改動,這裏我們將宿主機的內核直接拷貝我們的硬盤的boot目錄下:


然後,我們在宿主機的硬盤空間內新建一目錄,將宿主機的驅動使用zcat解壓在該目錄下,根據需求修改裏面init相應的內容後,重新壓縮保存在/mnt/boot目錄下:


b.這些都做好後我們使用grub-install建立grub的第二階段:

注意:此時形成爲grub目錄下缺少grub的引導菜單文件—grub.conf,我們需要手動創建並且填充相應的內容,進入到/mnt/boot/grub下進行創建:

保存並退出即可。


c.第二階段建立好之後,我們進入grub模式,進行第一階段的建立:

然後,qiut退出即可。

至此,我們的第一階段和第二階段都已經完成了。


第三,我們要進行與init進程相關的操作,但是在進行之前,我們要進入/mnt/sysroot目錄下創建所需要的目錄結構:


由於,要運行init進程,我們要先使用which命令查看init程序的存放位置,使用ldd查看其運行所依賴的庫文件,我們把這些東西全部拷貝到/dev/sdb2的相應的目錄下即可:


由於,考慮到以後還要拷貝許多命令,這些命令也都依賴於許多模塊,單個的拷貝會浪費很多時間,在這裏我做了個腳本程序,方便以後隨時的拷貝:

然後,使用chmod a+x指令改變其爲可執行。


現在,我們測試一下我們的腳本程序能否將我們輸入的命令的二進制文件拷貝到/mnt/sysroot/bin目錄下,將庫文件拷貝到/mnt/sysroot/lib目錄下:

首先查看上面提到的兩個目錄,發現爲空:

運行我們編寫的腳本程序,輸入要拷貝的命令,然後查看/mnt/sysroot/lib、/mnt/sysroot/bin目錄:


測試成功之後,我們先把我們常用的幾個基礎命令拷貝到我們的第二塊硬盤上:


現在,內核和init程序已經拷貝過來了,接下來我們要去建立inittab表格,進入/mnt/sysroot/etc/目錄下,用vim打開/etc/inittab將第21到29行寫到當前目錄下的inittab表內,修改成下圖所示的內容:


由於系統無論進入何種級別都要進行初始化,運行/etc/rc.d/rc.sysinit初始化腳本,所以我們在/mnt/etc目錄下創建rc.d目錄,並且在rc.d目錄下創建rc.sysinit腳本:


rc.sysinit腳本的內容如下:

保存並且退出,使用chmod a+x修改成可執行權限。


接下來,編寫關機腳本syshalt和重啓腳本sysreboot內容如下同樣都保存退出,使用chmod a+x修改其爲可執行:


而,這兩個腳本分別調用了halt和reboot的命令,現在我們將這兩個指令相關的東西拷貝到我們第二塊硬盤的相應的位置,再次運行我們編寫的拷貝指令的腳本cp.sh:

我們執行幾次sync,把相關的信息同步到我們要寫入的第二塊硬盤上。


到此,我們重新打造的精簡linux系統,已經可以成功引導,並開啓了。現在我們先從宿主機上拆解下來,掛載我們的沒有硬盤的機器上測試一下吧。

此時,開關機功能也已經實現。


再次拆解掉硬盤掛載在宿主機上,繼續豐富我們的精簡系統的功能:

此時我們給我們精簡的系統增加主機名設置功能:

由於該腳本需要讀取/etc/sysconfig/network的內容,所以我們在/mnt/sysroot/etc目錄下新建sysconfig目錄,並將宿主機的network文件拷貝到該目錄下:

然後,我們增加網絡功能:由於內核只是存放系統的最核心的部門,其他的文件比如網卡都以模塊單獨存放。我們的網卡屬於硬件,在linux系統中可以使用dmesg查看網卡信息,使用lsmod查看網卡依賴的內核模塊,


接下來我們使用modinfo查看上面兩個模塊的詳細信息:


然後我們在/mnt/sysroot/lib目錄下建一個modules目錄用於存放網卡模塊:


我們再來編輯rc.sysinit腳本程序,在初始化時加載網絡模塊:

可以使用insmod(需要指明具體路徑,指明依賴關係)也可以使用modprobe(自動解決依賴關係),這裏我們使用insmod進行加載:


由於上面用到了hostname、ifconfig、insmod和我們要測試的ping命令,現在去運行腳本將這些命令拷貝到我們的第二塊硬盤上:


這些做完後基本的功能就已經具備,不過我們在啓動時看的grub引導菜單不是很美觀,我們想加一張背景圖片,現在我們就找張自己認爲好看的圖片,做成符合要求的圖片進行應用。

首先,找到一張圖片對圖片進行處理,在linux下有這樣一個圖片處理工具gimp我們現在就掛載光驅進行安裝:

注意:這個工具只能在圖形界面下使用。

gimp打開這個工具,處理圖片,對圖片的要求是:分辨率640X480,圖片質量是十幾色,圖片格式是.xpm,然後保存在/mnt/boot/grub目錄下即可。


接着我們去修改grub.conf文件,加上背景圖片:

多執行幾次sync,同步我們修改的信息到硬盤。


現在再次拆解掉第二塊硬盤,掛載在測試主機上,啓動系統進行測試:

此時,我們引導菜單,就有了背景了:

繼續,進入到系統內部,進行一些命令的測試:


最後,我們實現FTP服務,能夠實現匿名訪問:

1.我們先在宿主機上安裝vsftpd服務


2.拷貝等會兒可能要使用的命令


3.拷貝安裝vsftpd時生成的文件:/etc/vsftpd/vsftpd.conf,由於訪問FTP服務器,需要使用ftp賬號登陸,而在安裝時,會自動生成ftp系統賬號,而此賬號的信息分別存放在/etc/passwd/etc/shadow/etc/group


4.當然在安裝vsftpd時,會自動創建這樣一個目錄/var/ftp/pub,因此,我們需要手動在第二塊硬盤上創建這樣一個目錄:


5.在linux中系統識別用戶是靠id來識別的,當基於名稱訪問時,linux中的nsswitch機制,來指定名稱與id的對應關係,而這個機制依賴於/etc/nsswitch.conf這個文件,而這個文件又依賴於/lib/下幾個nss庫。因此我們將這些文件全部拷貝到第二塊硬盤上:


6.現在,我們需要對/mnt/sysroot/etc/vsftpd/vsftpd.conf文件進行相應的修改:

   a.linux採用的是pam認證,這裏我們需要禁用此項


b.根據需要,我們編輯vsftpd的配置文件如下:

我們把日誌文件禁用掉,如下圖:

由於,我們這裏只是實現匿名登陸,user_list這一項對我們也沒有用處,也禁用掉:

別忘了多執行幾次sync,進行一下信息同步哦!!!


現在,我們把硬盤摳掉掛載在我們要做ftp服務器的主機上試一下我們吧:


然後用本地的一臺主機登陸此ftp服務器:


此時,我們摳掉硬盤繼續掛載宿主機上,創建這樣一個目錄:


再次將硬盤摳掉,掛載我們要做成ftp服務器的主機上,進行測試:


至此,我們的linux內核精簡,打造的簡單的操作系統就實現了簡單的FTP服務器應用了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章