不要被題目所嚇到,其實裁剪或者說手動做一個小的linux並沒有想象中的那麼難,那麼高大上。{本文都是基於虛擬機實現的}
想要製作或者裁剪一個小的linux,你所需要的是清楚的知道linux的啓動過程,以及啓動後會去哪些路徑執行哪些程序,知道這些就相當的好辦了,linux啓動需要什麼,我們就給他什麼,這樣就可以啓動了。那麼下來就先來看看linux的啓動流程和需要執行的程序。
linux啓動和windows啓動方面還有有些類似的。
首先是①開機自檢(POST,power on self test),接下來就是②BIOS中讀取用戶的硬件的相關設定,其中最重要的就是設置啓動次序(我們這裏肯定是從磁盤啓動了),接下來③讀取MBR中的分區信息了,當系統讀取了到了bootloader,然後硬件工作就交給了操作系統,操作系統④根據GRUB(之前是LILO)引導/boot目錄下根據grub.conf的配置信息從而加載內核信息到物理內存中去,當然/boot中不僅有內核文件,還有系統驅動模塊,當讀取內核後讀入系統驅動模塊,當一切加載完成後,⑤下來進去用戶空間中,進去用戶空間中執行的第一個程序就是/sbin/init,這個配置文件裏面有系統自動運行的程序,如果你需要讓系統開機自動運行什麼程序的話,你就可以將命令或者程序寫入到這個配置文件中。⑥init進程首先讀取/etc/inittab(運行級別的設置文件)當我們打開/etc/inittab文件後,忽略上面的註釋,看到的第一行的內容如下所示:
id:表示操作的id。
3:表示運行級別爲3.
default:表示設置默認運行級別,無需定義級別。
當然系統運行級別除了3,還有0,1,2,4,5,6總共7個運行級別。
0級別:表示關機。
1級別:單用戶模式,直接以root用戶登錄
2級別:多用戶模式。
3級別:完全多用戶模式,文本模式
4級別:預留級別
5級別:完全多用戶模式,圖形模式
6級別:重啓
每種模式下都對應了很多當下模式所啓動的服務或者程序,他們都位於/etc/rc.d/下。
其中打開當前處於3級別中的文件,如下:有很多在相應運行級別中運行的程序。
這個話題先說到這裏,我們去手動製作linux。
如上所說,我們都是基於 VMware虛擬機完成的。
首先手動爲linux額外掛載一個SCSI硬盤,如圖:
接下來就是給這個硬盤分區。
創建兩個分區。一個用來做/boot,一個用來做/sysroot
格式化分區:mke2fs -t ext4 /dev/sdb1
mke2fs -t ext4 /dev/sdb2
完成後,建立兩個目錄用來掛載兩個分區
創建目錄:mkdir -pv /mnt/{boot,sysroot}
掛載分區:mount /dev/sdb1 /mnt/boot
mount /dev/sdb2 /mnt/sysroot
掛載完成之後就要給小linux安裝GRUB引導程序了,具體命令如下:
grub-install --root-directory=/mnt /dev/sdb -->意味着把GRUB安裝進我們的小linux(sdb中)
安裝成功後,就要給我們配置文件對應的/boot分區中放置配置文件要加載的系統內核和設備驅動程序了。我們爲了方便,直接基於本機,直接講本機的系統內核和設備驅動程序放置過去。本機的系統內核和設備驅動程序也在/boot目錄中放置,我們可以直接複製進我們的小linux。
如圖,上面兩個爲本linux下的內核和設備驅動程序。
現在就來複制這兩個進我們的小linux下的/boot中。我們在複製的過程中,爲其改下名字,方便一會我們寫grub.conf的配置文件。
上面爲複製和改名命令,下來查看下結果:
下來就要爲GRUB寫配置文件了,好讓GRUB去引導和加載他,不是嗎?配置文件要寫在/grub目錄下,名字爲grub.conf,下面就讓我們去編輯它。
這樣,GRUB的配置基本結束了。下來就要對/sysroot目錄進行了。
首先,要爲其創建應有的目錄。
大家已經知道系統第一個執行的是:init,我們自己做小linux,那我們直接讓他開機運行shell程序。那既然要這樣,那麼我們就需要把bash拷進我們的bin中了
我們寫一個腳本,用來複制這些命令和其依賴的文件到我們剛建立的目錄中去,在次這個腳本也貼出來:
#!/bin/bash
#
target=/mnt/sysroot
clearCmd() {
if which $cmd &> /dev/null; then
cmdPath=`which --skip-alias $cmd`
else
echo "No such command"
return 5
fi
}
cmdCopy() {
cmdDir=`dirname $1`
[ -d ${target}${cmdDir} ] || mkdir -p ${target}${cmdDir}
[ -f ${target}${1} ] || cp $1 ${target}${cmdDir}
}
libCopy() {
for lib in `ldd $1 | grep -o "/[^[:space:]]\{1,\}"`; do
libDir=`dirname $lib`
[ -d ${target}${libDir} ] || mkdir -p ${target}${libDir}
[ -f ${target}${lib} ] || cp $lib ${target}${libDir}
done
}
while true; do
read -p "Enter a command: " cmd
if [ "$cmd" == 'quit' ] ;then
echo "quit"
exit 0
fi
clearCmd $cmd
[ $? -eq 5 ] && continue
cmdCopy $cmdPath
libCopy $cmdPath
done
這個是腳本內容,我給這個腳本起名爲:copy.sh,一會運行這個腳本把自己想要用到的命令一併都加進去。
bash在啓動的時候,不是直接啓動bash的,也是啓動bash的鏈接文件,所以我們需要爲bash創建一個鏈接文件,所以我們要進入到/bin/bash中爲其添加一個鏈接文件。
當然不能忘記給grub.conf一個執行權限,所以 chmod +x /mnt/boot/grub/grub.conf
這些做完,一個簡陋的linux就可以啓動了,當然不要忘記同步磁盤,爲剛寫入的那些東西通通寫入到磁盤中,使用命令 sync
啓動成功畫面。。。。。。。。。。。。。。。
當然這樣的不算完,或者他可以更加的優化一點。剛開始不是說init啓動用戶進程嗎,我們剛直接讓他運行的bash,那此刻,我們可以給他運行更多的東西,讓這個小系統看起來更像那麼一回事豈不是更好,我們可以給他也開機加載。查看客戶機有那些加載文件。使用mount查看:如下:
那此刻,我們就可以自己寫init文件來讓系統開機自動加載了。
我們在給/sbin/init中寫入開機自己運行的程序的時候,可以自定義添加一些信息,好讓我們知道系統啓動的過程。我們可以在init中加入一句話:the system is running。
具體看腳本文件:
然後給執行權限:chmod +x /mnt/sysroot/sbin/init
當然,還需要將/grub/grub.conf中的init=/bin/bash改成init=/sbin/init.
將改過的系統再開啓來試試效果。
當然這樣的情況下,算是已經完成了。不過我們還可以更加完善點,我們可以給他加入網卡驅動的話,那不是我們就可以遠程來訪問他了。哈哈,不妨來試一試。
首先,我們需要的是網卡驅動,當然還需要裝載網卡的命令,還有查看硬件信息的命令。網卡驅動就有本機模擬的網卡。
複製安裝網卡和查看網卡類的命令進小linux中:如。ifocnfig modprobe。
使用insmod安裝: insmod /lib/modules/e1000.ko
好了,到此結束,以後會完善一些更好的功能的,目前就先這樣。