在前一篇《Linux系統基礎-管理之系統啓動過程及系統初始化學習總結 》當中已經瞭解到了系統的一些基本啓動過程和初始化過程,這篇文章是結合前面的知識而做的一個小實驗。
一、說明
1、實驗拓撲:
2、實驗環境:
操作系統:CentOS-6.5 x86_64
虛擬機版本:VMware Workstation 10.0.0 build-1295980
HOST主機名:station10.example.com
如上圖我們需要有一臺上面裝有CentOS 6.5-x86_64系統的的PC Server以下我簡稱爲"HOST"以及一臺沒有操作系統,沒有硬盤的PC客戶端,以下簡稱"Target",有朋友這時會問了,Target既沒有系統、也沒有硬盤那怎麼可能啓動呀?我們的實驗目的是通過一臺本身安裝有操作系統的主機上通過對當前系統或者說藉助當前系統我們裁剪出一個微型的Linux系統,並使之能啓動起來。
下面就看我詳細的操作步驟吧...
二、操作步驟:
1、 在HOST上面添加一塊20G的硬盤;在HOST上爲被識別爲sdb;
2、在/mnt下創建兩個目錄(/mnt/sysroot,/mnt/boot)用來掛載作爲微型系統的boot和真正的根文件系統;對此磁盤分區,格式化爲ext4格式的文件系統,並將其分別掛載分區至/mnt/boot./mntsysroot;
當然我們可以先寫一個腳本(Autoparti。sh)較爲方便自動的達到我們分區,格式化和掛載的目的。
以下爲腳本內容(小生shell腳本編寫能力有限,望各位勿噴。)
#---------------CopyRight-------------- # Name:AutopartitionMount # Version Number:1.00 # Type:Tools # Language:bash shell # Date:2014-03-9 # Author:Maoqiuguo # Email:[email protected] #--------------Environment------------- # Terminal: Xmanager SLS (Registered) # Linux 2.6.32-431.el6.x86_64 # GNU Bash 4.1.2 #-------------------------------------- #!/bin/bash function MOUNT { mke2fs -t ext4 "$d_path"1 &>/dev/null mke2fs -t ext4 "$d_path"2 &>/dev/null mount "$d_path"1 /mnt/boot &> /dev/null mount "$d_path"2 /mnt/sysroot &> /dev/null [ $? -eq 0 ] && echo -e "\033[44;37;5m Partition the mount has been completed!\033[0m" || echo -e "\033[31mError...\033[0m" } read -p "Please input a device file path:" d_path while ! [[ $d_path == "quit" ]];do if [ -z $d_path ] || ! [ -b $d_path ];then echo -e "\033[31mInput Error...\033[0m" read -p "Please input a device file path again:" d_path else echo -e "\033[5;31mThe following will clear the data in the disk, whether or not to continue!\033[0m" read -p "Sure,enter[y|yes]:" anwser anwser=`echo $anwser | tr 'A-Z' 'a-z'` if [[ $anwser == "y" ]] || [[ $anwser == "yes" ]];then dd if=/dev/zero of=$d_path bs=510 count=1 &> /dev/null echo -e 'n\np\n1\n \n+200M \nn\np\n2\n \n+10G\nw' | fdisk $d_path &> /dev/null if [ -d /mnt/boot ] && [ -d /mnt/sysroot ];then MOUNT else mkdir /mnt/{boot,sysroot} MOUNT fi else exit 8 fi exit fi done exit 9
下圖是該腳本執行後的結果:
4、安裝grub至稍後作爲Target的硬盤上,即/dev/sdb;
5、將HOST上的內核文件vmlinuz及initrd文件initramfs複製到/mnt/boot目錄下;
6.在/mnt/sysroot目錄下創建目標主機Target的根文件系統;
7、下面這個cp.sh腳本是爲了從HOST上面移植命令和所依賴的各種庫文件到微型系統裏面使用的;
#---------------CopyRight-------------- # Name:cp.sh # Version Number:3.00 # Type:Tools # Language:bash shell # Date:2014-03-9 # Author:Maoqiuguo # Email:[email protected] #--------------Environment------------- # Terminal: Xmanager SLS (Registered) # Linux 2.6.32-431.el6.x86_64 # GNU Bash 4.1.2 #-------------------------------------- #!/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() { forlib 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" exit0 fi clearCmd$cmd [ $? -eq 5] && continue cmdCopy$cmdPath libCopy$cmdPath done
下圖是cp.sh腳本執行界面:
此時我們需要切換到微型系統真正更目錄系統下面的bin目錄爲bash創建一個軟連接;
8、爲Target的Grub提供配置文件(可參考宿主主機的grub文件進行創建);
9、現在已經準備得差不多了,我現在先創建一個Target;
對於朋友們來說對新建一個虛擬機不陌生了吧,那我在創建過程當中需要注意的事項給貼出來吧;
①注意版本的選擇
②我們選擇的就是掛載在HOST上面的那塊盤,而無需新建
③最後完成我們Target的創建。
10、此時我將HOST給掛起,因爲他們不能共同使用一個硬盤設備,然後將sdb掛載至Target
,調整BIOS選項,讓其從硬盤啓動,看一下是否能啓動;
grub引導界面
系統初始化過程...
暈!內核恐慌了,系統告訴我找不到init程序。那我就爲它創建一個吧。
13、將Target關機,讓HOST啓動。首先我們知道init存放的位置是超級用戶二進制程序的目錄下,它也和其他程序放在一起的,也就是微型系統的根目錄下的sbin目錄了,我們手動寫一個就行了:
修改之後我們需要爲它賦予執行權限
然後我還需要修改grub.conf文件,因爲grub需要引導着內核去找init程序。
最後重複上面的步驟10。
好了,已經成功的進入了,命令也可以使用了。
14、最後我們裝載網卡驅動模塊,讓其具有網絡功能;還是得先將Target關機,讓HOST啓動;
①爲微型系統創建存放驅動模塊的目錄,將HOST上的網卡驅動模塊copy至Target:
②將HOST掛起,讓Target啓動並裝載網卡驅動模塊;
③我先測試一下ping 迴環地址能通,如果能通說明網卡驅動模塊裝載成功。
④接下來爲網卡eth0配置IP,並測試能否連到我的windows ip。
⑤再次證明了我的網卡驅動模塊裝載成功了,但是有個問題問題,就是每次我重啓之後都要去裝載網卡驅動模塊和手動配置IP地址,顯得還不夠自動化,如果能將這些操作都寫到一個配置文件中讓它在系統啓動、初始化的時候就爲我把這些都做了那多好;上篇博客中也提到了,在系統初始化的時候有個配置文件是專門用來設定系統一些配置的這個文件就是/etc/rc.d/rc.sysinit;但是我的微型系統裏面並沒有這個文件;那此時我也可以寫到init這個程序文件當中;
15、將Target關機,讓HOST啓動,再次編輯微型系統的init程序文件:
16、將HOST掛起,讓Target啓動; 驗證結果:
好了,到此爲止一個具有簡單網絡功能的微型Linux的系統已完成,後續會逐漸完善它的功能。