歡迎您光臨本站 註冊首頁

剖析Linux之製作一個小LINUX

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0
經過半下午的不懈努力,終於完成了馬哥布置的作業——製作一個小LINUX,或許有很多學哥學姐已經寫過自己的製作過程,這裡我了分享一下,寫下自己的製作過程及中間遇到的困難.本人文筆不是很好,就不多說了,直接開工.
要製作一個小的Linux,我們就要了解Linux系統開機的整個過程,其實很簡單,跟WIN差不多.POST(BIOS加電自檢)-->根據BIOS的設定啟動相應的設備-->Boot loader -->解壓內核到內存 -->運行init進程
整個過程大概如上所述.其中,內核在載入的過程中所完成的工作包括以下: 硬體探測
完成設備驅動程序初始化(initrd獲取驅動程序,以模塊的形式存在)
掛載根文件系統(以只讀方式掛載)
裝載/sbin/init,啟動系統的PID為1的進程
系統的主進程init主要是根據/etc/inittab文件中的定義,來進行工作的.下面再看一下inittab文件是怎麼寫的,我們可以man inittab看一下,該文件的組成部分以及各組成部分的詳細信息.NAME
inittab - format of the inittab file used by the sysv-compatible
init process

id:runlevels:action:process

各欄位的解釋ID:就是一ID號,說白了就是一名字,代號,可以隨便取.RUNLEVELS:運行級別ACTION:在什麼情況下PROCESS:運行什麼命令
以下是action常用的選項action:
respawn 重新啟動,當進程結束后,將會馬上被重啟
wait只有進入某個特定級別以後process才會啟動一次,並且直到其結束為止,不再有其它動作
initdefault 設定默認運行級別
sysinit 系統初始化,這個進程將在系統啟動過程中會被執行一次
ctrlaltdel: 用戶同時按下ctrl alt del執行進程
看一下inittab文件的內容id:3:initdefault:#名字叫id,運行級別為3,initdefault的意思上面已經有解釋了.設定默認運行級別的



si::sysinit:/etc/rc.d/rc.sysinit#名字叫si,運行級別沒寫,表示所有的運行級別,動作叫sysinit,表示系統的初始化,然後初始化要運行的腳本為/etc/rc.d/rc.sysinit

l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
#名字叫 l1---l6,運行級別為0-6,分別對應系統的6個運行級別,每個級別分別運行所對應的/etc/rc.d/rc 0 在/etc/rc.d里有個腳本叫rc,這個腳本主要是調用/etc/rc.d/rc.[0-6]/目錄里的文件,該目錄里的文件都是以K加數字加服務名或者S加數字加服務名組成,其中K表示KILL,要殺掉的服務,也即是系統開機后,不運行的服務,S表示start,運行對應級別後,所要運行的服務,其後面所對應的數字是服務的優先順序.
ca::ctrlaltdel:/sbin/shutdown -t3 -r now#名字叫ca,所有運行級別,當按下Ctrl Alt Del的時候,運行/sbin/shutdown命令,也就是說:當用戶按下CTRL ALT DEL組合鍵后,系統會在3分鐘內重啟.這樣很危險,建議改成其它的.
pf::powerfail:/sbin/shutdown -f -h 2 "Power Failure; System Shutting Down"
#名字叫pf,所有的運行級別,powerfail表示停電之後(對UPS有效),執行後面的shutdown
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"#名字叫pr,在12345的運行級別,powerokwait 表示停電不久,在指定關機的時間內,又來電了,就執行後面的shutdown內容


1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
#名字分別叫123456,都是在2345級別,rewpawn表示後面執行的進程只要一結束,就立即重啟它們


x:5:respawn:/etc/X11/prefdm -nodaemon#名字叫x,在5級別下,只要後面的進程一結束,就立即重新運行它們.
INIT調用了/etc/inittab文件后,系統就開始啟動了,其實inittab文件就是判斷系統是運行在哪個級別以及設置默認的級別,判斷完默認級別後,開啟指定級別目錄內的服務(/etc/rc.d/rc.N目錄內的所有腳本).然後調用了一個rc.sysinit腳本.
LINUX開機其實大概就做這麼多事情.
我們要做一個LINUX,首先POST就可以略過考慮了,還有BIOS里設置設備啟動次序的.那再往後,我們要做的就是要有一個bootloader了,這個可以通過安裝grub來實現 ,至於怎麼安裝grub,我已經有一篇博客說過了,這裡就不再說了.再往後,就是要有一個內核了,內核引導完成後,有一個init進程,這個進程其實就是/sbin/init這個命令來調用的.那我們把這個拷過來,就行了.init又是根據/etc/inittab文件來工作的,那我們就再創建一個inittab的文件,inittab文件又要調用 /etc/rc.d/rc.sysinit這個文件,我們再寫一個這樣的文件,任務就完成了.就這麼多東西,呵呵,有點兒亂,整理一下下
構建一個小LINUX需要的東西有:bootloader(grub),kernel,init,inittab,rc.sysinit.好了,思路搞清楚了,下面開工吧.
首先要有一個內核,內核我們可以通過拷貝系統自身的內核來實現.記得一定要放對目錄,不要亂放,放到grub的同級目錄.vmlinuz是系統的內核文件,initrd.img是內核所需要載入的一些驅動,但是initrd.img文件不能直接使用,我們要改一下裡面的一個參數.文件類型是gzip的,但是不能直接解壓,不然會報:無法識別的後綴名.要先改成.gz的,然後再解壓,解壓完成後,再看一下是cpio的,然後再用cpio把文件取出來,就看到了一個微型的linux,這個微型的linux裡面,只有驅動,沒有其它東西,文件基本上都在lib下.然後我們要改一下init文件,裡面有一項叫mkrootdev,這裡是要指定的根設備.就是系統的根.如果沒錯,就不用改,如果有錯,要改一下的.改成我們的小linux所在的磁碟設備名,grub已經戰用了一個/dev/sda1,那這裡我們就要改成/dev/sda2,做為小LINUX的根.


改完之後,內核這一步我們就做完了.下面就是做init了init在/sbin下,,我們要在我們的根文件系統上,創建出/sbin目錄,然後把init放進去.inittab文件在/etc/inittab裡面,也同樣的放進去.然後在inittab文件裡面,簡單的寫兩項就行了,如下[root@Honway sysroot]# cat etc/inittab
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
第一行是設置系統的默認運行級別的,第二行是調用rc.sysinit文件的.這個文件不存在,我們也要創建出來,包括其父目錄.然後在裡面隨便寫點東西就可以了.[root@Honway sysroot]# cat etc/rc.d/rc.sysinit
#!/bin/bash
echo -e "\033[34m \033[05mHello,Welcome to my host.\033[0m"
bash
比如我們就寫上面一句話,然後打開bash,bash也沒有,,我們還要拷貝/bin/bash文件放到對應的目錄以上的做完之後,還有拷貝一些庫文件放到對應的目錄,命令的運行,是要調用庫文件的,用ldd命令查看一下init和bash兩個命令要調用哪些庫文件,然後拷貝到相對應的目錄即可.[root@Honway sysroot]# ldd /bin/bash
linux-gate.so.1 => (0x00e68000)
libtermcap.so.2 => /lib/libtermcap.so.2 (0x00d65000)
libdl.so.2 => /lib/libdl.so.2 (0x00d5f000)
libc.so.6 => /lib/libc.so.6 (0x00bee000)
/lib/ld-linux.so.2 (0x00bd0000)
這裡我們只拷貝/開頭的庫文件,其它不用管.到這裡,系統就算是製作完成了.是不是很EASY.呵呵.如果想使用一些其它的命令,比如/bin/ls,也只需要把命令拷過去,然後對應的庫弄過去,就OK了.看一下我們製作出來的小系統吧
搞定了,是不是很有成就感啊.呵呵,上面有個小錯,可能是我initrd.img文件裡面的init文件沒有改好,再改下就行了.你還等什麼,趕快也試試吧……

本文出自 「吖吖個呸」 博客,請務必保留此出處http://gm100861.blog.51cto.com/1930562/784870


[火星人 ] 剖析Linux之製作一個小LINUX已經有600次圍觀

http://coctec.com/docs/linux/show-post-47175.html