剛才我們已經完成了前三步的工作。我們再次對整個Shell指令碼的實現方式進行一次分析:
實現過程分析:
1.分區,按照使用者所選的盤,將其格式化,分區
2.掛載,按照使用者設定的的分區好的盤分別掛載在我們宿主機的一個目錄上。方便對微型linux進行編輯。
3.對微型Linux進行寫入各項配置資訊
4.將微型Linux中我們需要用到的Bash等命令放進去
5.放入核心,和啟動必須載入的設定檔
6.對使用者的硬碟安裝引導程式。
----------------------------------------------------------------------------------------------------------
好的,剛才那算是協助大家整理思路,算是“上集回顧”吧~接下來我們繼續!將Shell指令碼進行到底!
第四步:移植各種各樣我們需要的命令進去:
指令碼分析:
為了移植命令,我們就要先將我們宿主系統上的命令複製過去。
但是僅僅複製命令是不夠的,我們還要將命令所對應的庫檔案複製過去。
那麼,不同的命令有不同的樣式,也有不同/相同的庫檔案。
我們就要辨別到底複製哪些庫檔案,複製到哪,有沒有重複~
最後,我們要知道,不是僅僅複製一個命令就好,我們要迴圈的讓使用者選擇到底需要什麼命令。直到都複製結束~
好的,分析OK,我們按照計划著手去做吧!
function COPYLIB { # 我們依然使用函數,方便以後的調用工作。 #copy command if which $1 &> /dev/null ;then # 判斷使用者輸入的命令是否真的是個命令,總不能我們輸入1,也複製1進去吧~=。= AA=`which $1 | tail -1 | awk '{print $1}'` cp "$AA" $2"$AA" # 如果判斷成功,則複製~ else echo "$1 is not exist" fi #copy lib # 開始複製命令對應的lib庫檔案 for LIB in `ldd "$AA" | grep "/lib/" | sed '1,$s@^[[:space:]]/lib@aaa=> /lib@g' | awk -F"=> " '{print $2}' | cut -d" " -f1`;do LIBPATH=`echo $LIB | sed 's@\(.*\)/[^[:space:]]\{1,\}@\1@g'` # 我們用了一個for迴圈,來判斷我們輸入的命令所含的lib,並且將他們對齊,列表 [ -d ${2}$LIBPATH ] || mkdir ${2}$LIBPATH # 判斷我們即將複製過去的目錄是否存在,萬一不存在則建立 [ ! -e $2/$LIB ] && cp -f $LIB ${2}$LIBPATH && echo "$LIB done" # 開始複製~並提示 複製的效果~~ done}# 到這裡,這個函數就結束了,下面我們準備調用。首先要知道,有兩個命令是必須複製的,一個是bash ,一個是 init ,兩個都是非常非常重要的命令。echo "=========================================================="echo -e "Please input COMMAND with \033[31mbash\033[0m and \033[31minit\033[0m !!!!!"read -p "COMMAND you want?(Quit for 'q') :" CMD1 # 就是因為太重要,所以我們用上一條語句紅色警示使用者,必須先複製這兩條。 # 然後我們製造一個迴圈,方便使用者反覆的加入各種各樣的命令。until [ $CMD1 == 'q' ]; do # 當然,不能總是輸入吧,所以我們只需要按 ‘q’ COPYLIB $CMD1 /mnt/sysroot # 執行函數 並且傳遞我們所輸入的命令。 echo -e "Please input COMMAND with \033[31mbash\033[0m and \033[31minit\033[0m !!!!!" read -p "Which COMMAND you want use ?(Quit for 'q') :" CMD1done
OK~這樣一來,我們的小linux裡也有了各種各樣我們所輸入的命令啦~接下來,就要往裡添加核心了!
讓我們的linux運行起來!!!!!
--------------------------------------------------------------------------------------------
第五步:弄個核心!讓我們的Linux擁有心臟!
在手動打造屬於自己的linux的時候,我們已經知道,我們的核心是直接用Redhat的核心檔案。
然後再修改initrd這個能在記憶體中虛擬出一個小linux方便載入根目錄系統的檔案。
之後,我們將其移植進去就好。
接下來,我們開始做吧~!
function YDFQ { # 依然是函數-。-TMPDIR=`mktemp -d /tmp/little.XX` # 建立一個臨時檔案夾,一會兒我們要解壓initrd.*.img 用哦~cd $TMPDIRzcat /boot/initrd-`uname -r`.img | cpio -id &> /dev/null ## 在臨時檔案夾中解壓並展開我們的initrd檔案,準備修改。sed -i 's@^echo Scanning and configuring dmraid supported devices@#&@g' initsed -i 's@^echo Scanning logical volumes@#&@g' initsed -i 's@^lvm vgscan --ignorelockingfailure@#&@g' initsed -i 's@^echo Activating logical volumes@#&@g' initsed -i 's@^lvm vgchange -ay --ignorelockingfailure vol0@#&@g' initsed -i 's@^resume LABEL=SWAP-sda3@#&@g' init # 在init檔案中注釋掉我們沒用的行~sed -i "s@\(mkrootdev.*\) /.*@\1 sda2@" init # 改變init檔案中有用的,比如我們要判斷到時候執行哪個盤。find . | cpio -H newc -o --quiet | gzip -9 > /mnt/boot/initrd.gz # 重新歸檔並壓縮成initrd.gz檔案~cp /boot/vmlinuz-`uname -r` /mnt/boot/vmlinuz # 將我們整理好的檔案複製到我們的分區中去!}YDFQ /mnt/sysroot # 函數執行的開始-。- 好吧,請原諒我總是將它寫在後面
ok~我們小linux的心臟也有了~接下來,就是最後一步了!!!給硬碟一個引導,讓他知道自己該如何運行!!!!
---------------------------------------------------------------------------------------------------------
第六步:引導檔案!
那麼,既然需要引導,就又要提到我們偉大的 Grub了~ 它能直接給硬碟安裝一個MBR進去~讓其擁有boot loader~
這樣一來,硬碟在開機啟動之後就自己知道自己要做些什麼了~~!
當然,我們的系統我們做主,所以裡面要加上你自己的東西喲!!
開始動手吧!
## 這裡我們要傳遞四個值到我們的函數中 ## $1=我們要安裝對哪個硬碟安裝bootloader ## $2=我們的主要磁碟分割,就是核心檔案等所在的分區 ## $3=核心的名字 ## $4=initrd 的名字~##function GRUB { ## 好吧,各種各樣的函數-。-if [ `basename $2` == boot ];then ## 判斷使用者輸入的主要磁碟分割是否是我們需要的主要磁碟分割,不過這個肯定是了,因為下面我們手動指定了-。- grub-install --root-directory=/mnt $1 &> /dev/null # 安裝grub,到我們的分區去,這樣我們就有了bootloader了! cat >>$2/grub/grub.conf<< EOF # 制定我們自己的開機方式~~default=0timeout=10title Little Linux root (hd0,0) kernel /${3} ro root=/dev/sda2 quiet initrd /${4}EOFelse echo "It's not boot !Exit & Please set it again !" fi}GRUB $DSK /mnt/boot vmlinuz initrd.gz # 好吧,函數開始執行了-。-echo "Congratulation ! Your Mini Linux is install OK !" # 顯示慶祝資訊!告訴使用者我們已經安裝好了!
OK~~!!!! 一切搞定~
接下來我們就去測試把~
按照這樣的寫下來,我們可以說基本實現了一鍵安裝linux,並且是你自己制定的喲!!!!!
~
嗯~
看懂了嗎?會了麼-。-那麼,自己做做吧~~
當然,還是那樣,如果發現有什麼不同,或者各種意見,歡迎與我交流~
共同切磋才能共同進步嘛!!!!
weiyan
2011.8.4