前兩天我寫了如何通過宿主Redhat系統通過精簡和調用以及修改的方式,打造一個完全屬於自己的微型LInux!
詳見:http://blog.csdn.net/wei2856059/article/details/6654801
但是,很多人懶啊~~,所以我又寫了寫指令碼,通過分步實現的方式。達到用一個指令碼,完全的按照使用者想要達到的目的安裝一個屬於自己的微型Linux。
那麼下面我們來看如何?:
----------------------------------------------------------------------------------------------------------------------
實現過程分析:
1.分區,按照使用者所選的盤,將其格式化,分區
2.掛載,按照使用者設定的的分區好的盤分別掛載在我們宿主機的一個目錄上。方便對微型linux進行編輯。
3.對微型Linux進行寫入各項配置資訊
4.將微型Linux中我們需要用到的Bash等命令放進去
5.放入核心,和啟動必須載入的設定檔
6.對使用者的硬碟安裝引導程式。
好的~過程已經分析OK了,下面我們動手開始寫吧!!!
-----------------------------------------------------------------------------------------------------------------------
第一步:實現自動分區!!
我們將問題分開來看,於是成了這樣:
寫一個指令碼,實現將一個硬碟中原有分區資訊全部刪除,並重新將其分為三個區:
1、提示使用者指定要操作的磁碟;如果此硬碟中有分區,顯示分區資訊,並判斷此中分區是否仍然處於掛載狀態;
如果是,則顯示分區和對應的掛載點;否則,則說明分區沒有掛載;
2、提示使用者接下來操作會破壞硬碟上的所有資料,並詢問使用者是否繼續進行;形如:Continue(y/N)?
如果使用者選擇繼續,則抹除此硬碟上的所有分區資訊(如果是仍處理掛載狀態的分區,則需要先卸載);否則退出;
3、將此硬碟分為三個主要磁碟分割:
第一個主要磁碟分割,50M,ext3檔案系統
第二個主要磁碟分割,512M,ext3檔案系統
第三個主要磁碟分割,256M,swap檔案系統
OK,開始實現:
#!/bin/bash#: Title: All_Mini_Linux.sh#: Synopsis:#: DateTime: 2011-08-04 00:36:35#: Version: 0.1#: Author: weiyan#: Options: #read -p "The target disk: " DSK # 提示使用者選擇即將分區的硬碟if fdisk -l $DSK | grep "^/dev" &> /dev/null ; then #判斷硬碟的分區狀態。 fdisk -l $DSK | grep "^/dev" PARTS=`fdisk -l $DSK | grep "^/dev" | awk '{print $1}'` for I in $PARTS; do # 使用迴圈的方式,將硬碟上每一個分區的狀態和是否掛載,掛載在哪告訴使用者。 if mount | grep "$I" &> /dev/null; then mount | grep "$I" else echo "$I is not mounted." fi donefiSPART() { # 製作名為SPART的函數,這個函數的功能就是提示使用者準備分區,當允許分區則開始分區! read -p "Warning !!!!! Next you do it will wipe your disk !!!! Continue(y/N)?" CHOICE case $CHOICE in y|Y) for I in $PARTS; do if mount | grep "$I" &> /dev/null; then fuser -km $I umount $I fi done dd if=/dev/zero of=$DSK bs=512 count=1 &> /dev/null # 將使用者所選的硬碟的MBR直接擦除。讓其成為空白盤。echo ' n p 1+50Mnp2+512Mnp3+256Mt382w' | fdisk $DSK &> /dev/null # 將分區的資訊傳遞給 fdisk,開始分區。 partprobe $DSK sleep 1 # 分區之後要用sleep命令讓系統“沉睡”1秒,這樣可以讓分區的資訊真正的同步進硬碟,而不至于格式化出錯。 mke2fs -j ${DSK}1 &> /dev/null # 分別格式化每一個分區並且格式化虛擬分區。 mke2fs -j ${DSK}2 &> /dev/null mkswap ${DSK}3 &> /dev/null return 0 ;; n|N) return 1 ;; *) return 2 ;;esac}SPART # 執行這個 SPART 函數。[ $? -eq 0 ] && echo "The Disk wipe success !!!!!!!" || echo "Failure" # 判斷函數的傳回值,如果是0,則提示分區成功。
這樣一來,我們就有了一個完整的分好了區,並且格式化了的硬碟了。接下來呢?
將硬碟掛載!
---------------------------------------------------------------------------------------------------------------------
第二步:掛載!
那麼將第二步好好的整理一下,發現它其實是不是實現了下面的功能呢?
寫一個指令碼,實現將上述步驟中建立的分區掛載至某目錄:
1、寫一個函數,接受兩個參數,完成以下功能:
參數1為/boot分區對應的裝置,傳遞至函數之後將其掛載至/mnt/boot;
參數2為/分區對應的裝置,傳遞至函數之後將其掛載至/mnt/sysroot;
說明:上述的掛載點/mnt/boot和/mnt/sysroot如果事先不存在,需要先建立;如果事先存在,且已經被某裝置掛載使用,則需要先卸載原來掛載的裝置;
2、將第一個指令碼中實現的分區1和分區2傳遞給些函數執行;
那麼,目標有了,我們來實現它!
function GUAZAI { # 建立一個名為 GUAZAI 的函數 [ -d /mnt/boot ] || mkdir -p /mnt/boot # 先判斷我們要掛載的目錄在不在,如果不在,則建立。 umount /mnt/boot &> /dev/null # 當有了目錄之後,直接先卸載掉它,不管他之前有沒有被掛載。(讓我懶一下把-。-) mount $1 /mnt/boot # 掛載我們指定的參數1的目錄,到掛載點。 [ -d /mnt/sysroot ] || mkdir -p /mnt/boot # 同上,判斷第二個。 umount /mnt/sysroot &> /dev/null mount $2 /mnt/sysroot}GUAZAI ${DSK}1 ${DSK}2 # 執行這個函數,並傳遞給它兩個需要掛載的分區參數。
OK,掛載也掛載完了,接下來呢?
--------------------------------------------------------------------------------------------------------------------------
第三步:寫入配置資訊!
分析一下,我們要寫入的配置資訊:
首先要在我們的第二塊分區上建立各種各樣的檔案夾,比如/bin /sbin /usr /root /home /tmp /etc 等等等等。
然後我們要建立/etc/inittab 這個檔案
之後建立讀取分區資訊掛載資訊的檔案/etc/fstab
再然後呢?建立/etc/rc.d/rc.sysinit檔案~
ok~分析得當!開始著手寫入吧!
#這裡我們使用函數,傳遞參數,參數只有$1,而$1則是我們的分區2所掛載的目錄/mnt/sysrootfunction ROOTFS { # 使用函數實現各項功能,方便其他使用者或者其他程式的調用,多寫成函數,為以後著想喲! if [ -d $1 ];then if mount | grep "$1" &> /dev/null ; then # 判斷我們的分區2是否正確的掛載了 cd $1 mkdir {boot,proc,sys,dev,home,root,etc/{rc.d,sysconfig,init.d},bin,sbin,lib,usr/{bin,sbin,lib,include},var/{log,run},tmp,mnt,opt,media} -pv &> /dev/null #在這個目錄裡建立我們所需要用到的,各項檔案夾。(麻雀雖小,五髒俱全嘛) chmod 1777 tmp/ # create inittabcat >>$1/etc/inittab<< EOF #建立inittab 寫入如下的資訊id:3:initdefault:si::sysinit:/etc/rc.d/rc.sysinitEOF# create rc.sysinit #建立rc.sysinit 寫入如下的資訊cat >>$1/etc/rc.d/rc.sysinit<< EOF#!/bin/bashecho -e "\t\tWelcome to \033[031;1mLittle\033[0m Linux..."mount -n -o remount,rw /mount -n -a/bin/bashEOF chmod +x etc/inittab # 分別賦予他們執行的許可權(你總不會想看到他們放在那卻不能用吧-。-?) chmod +x etc/rc.d/rc.sysinit# create fstab # 建立fstab 將我們到時候要掛載的分區資訊寫入。這裡注意,一定是“到時候”要掛載的。cat >>$1/etc/fstab<< EOF/dev/sda2 / ext3 defaults 0 0/dev/sda1 /boot ext3 defaults 0 0sysfs /sys sysfs defaults 0 0proc /proc proc defaults 0 0EOF else read -p "Error,the $1 not mount ! Contiune(y|N)?" MOT # 如果發現我們的分區2還沒有掛上!就停止! case $MOT in # 不過這應該是不會沒掛上的,否則我們上一步豈不是白做了!? y|Y) ROOTFS /mnt/sysroot ;; *) echo "Exit......" return 5 ;; esac fi fi}ROOTFS /mnt/sysroot # 最後,執行這個函數,傳遞給他一個/mnt/sysroot這個參數~~OK~
好的!我們完成了前三步!總結一下:
我們先按照使用者選擇的硬碟,將其分區,分成3塊,然後都將其格式化。
之後我們把需要用到的分區掛載到我們設定的目錄上去!
然後我們將分區內寫入各項配置資訊。
接下來,看第二篇啦~完成後面三個步驟!!OK,加油~換個頁面,我們繼續!!