歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

如何制作一個小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文件不能直接使用,我們要改一下裡面的一個參數。

本文URL地址:http://www.bianceng.cn/OS/Linux/201410/45408.htm

文件類型是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

Copyright © Linux教程網 All Rights Reserved