章節導航:linux
前言小程序
Linux系統啓動流程centos
實驗前的準備bash
實驗過程網絡
拷貝命令腳本ide
1、前言工具
咱們生活中離不開電腦,時時刻刻在跟操做系統打交道,有時候會被系統中出現的錯誤搞得頭昏腦脹,使用操做系統,不如親自動手組建一個本身的簡單的系統,體驗一下製做操做系統的樂趣。在系統的學習了Linux操做系統以後,就有了理論基礎,因此,火燒眉毛的想作一個本身的簡單的Linux小系統,有興趣的同窗也能夠來動手作一作。學習
在接下來的文章中,小編會先從Linux系統的啓動流程入手,將啓動過程一一展現出來,再進行實驗指導。ui
2、Linux系統啓動流程spa
這些自檢的功能是有一個軟件程序來實現的,這個軟件程序叫作:BIOS。BIOS是基本輸入輸出系統,他是裝在一個硬件芯片CMOS之上,加電過程給CMOS通電,BIOS會根據CMOS上的一些配置信息去讀取硬件的狀態,以後進行硬件設備的初始化。
加電自檢主要是檢測一下硬件設備是夠存在並可以正常運行,如:CPU、內存、硬盤是否存在並能正常運行,CPU風扇是否可以運轉散熱,以及一些外圍的輸入輸出設備是否存在,可是有些設備存在與否不影響系統的正常啓動,如鍵盤、鼠標。
在硬件初始化以後,BIOS會列出一些能夠啓動的裝置順序,接下來就開始讀取第一個能夠啓動的設備中操做系統的核心文件。咱們必須以一個啓動管理程序來處理這些核心文件的加載問題,這個啓動管理程序爲:Bootloader,Boot loader是一個程序,他確定依賴於一個硬件之上,這個硬件就是硬盤,準確的說是第一個能夠啓動的硬盤的第一個扇區內,就是咱們以前讀到的MBR(主引導記錄)當中。因此,在加電自檢以後BIOS會將系統引導到MBR中,找到Boot loader。
Boot Loader就是在操做系統內核運行以前運行的一段小程序。經過這段小程序,能夠初始化硬件設備,創建內存空間的映射圖,從而將系統的軟硬件環境爲最終調用操做系統內核作好準備。Boot Loader使用最廣的就是Grub了,系統將Linux下/boot/grub/grub.conf的配置文件讀取到內存中,根據配置文件中的信息找到內核文件和僞根文件,並將僞根文件加載到內存中,模擬出一個根文件系統,再進行加載內核文件。
Bootloader能夠加載kernel和initrd,而後在內存中讓initrd解壓縮成根目錄,而後內核能夠在這個虛擬的根文件系統之上加載合適的驅動程序,來加載硬盤等設備,以後釋放虛擬的根文件系統,並以只讀的方式掛載磁盤上真實的根文件系統,以後就開始正常的啓動過程。此時內核程序已經徹底接管了BIOS工做,以後的操做都是有內核來完成的。
在內核、硬件及驅動信息加載完畢後,內核會呼叫用戶空間的第一個執行程序/sbin/init,inti進程主要功能是準備軟件運行環境,包括系統的主機名稱、網絡配置、文件系統格式、服務運行級別等其餘服務的啓動管理。這些全部的操做都是經過init的配置文件來定義的。
Init的配置文件:
Centos5:因爲centos5採用的是Sys init方式,其特色是啓動用戶空間的服務程序,一般經過腳本運行,有依賴關係的服務將被串行啓動,這也就致使了centos5的系統啓動過程很是的緩慢,配置文件爲:/etc/initab
Centos6:採用Upstart的方式,其特色是守護進程間的通訊依賴於D-Bus進行,所以,可基本實現相似並行啓動:配置文件:/etc/inittab,/etc/init/*.conf
Centos7:採用Systemd方式,其特色是服務只有在第一次被訪問到時纔會真正啓動起來,所以Centos7系統的啓動過程很是之快,配置文件是:/usr/lin/system/*。
在定義完運行級別後,Linux系統執行的第一個用戶層文件就是rc.sysinit腳本程序,這個腳本爲初始化用戶空間環境,會執行許多系統初始化任務;在完成系統初始化腳本後,系統還會啓動對應級別下設定爲要啓動的服務,關閉那些設定爲要關閉的服務。該步驟是根據inittab配置文件中定義的運行級別,來運行對應運行目錄中的服務設定腳本。
在服務啓動的最後,會執行最後一個腳本:/etc/rc.d/rc.local,這個腳本是留個用戶的,能夠將用戶想要啓動的東西放到這裏。
此時就進入了輸入username和password的時刻了,漫漫開機之路就算到此結束了。
附上啓動流程圖:
3、實驗前的準備
咱們要製做的是U盤Linux系統,因此要準備一個U盤,不須要太大夠用就行。
須要準備的工具:U盤、虛擬機或Centos的主機一臺、Centos6系統。
U盤的要求:通常Linux系統不識別NTFS的文件系統,因此要是U盤是NTFS的系統,咱們須要將其格式化爲FAT32文件系統的格式,這樣系統才能識別。
4、實驗過程
一、啓動虛擬機的VMware USB Arbitration Service服務
咱們須要虛擬機可以識別USB接口上的U盤,因此要開啓這個服務,若是一斤開啓了,能夠直接跳過步驟,小編將爲你們演示如何開啓該服務。
如圖所示:
右擊個人電腦,打開管理,進入:
在服務中找到VMware USB Arbitration Service項,將服務啓動起來,這個時候從新打開虛擬機。
二、將U盤掛載到虛擬機中的系統上
打開虛擬機後,將右下方顯示的磁盤標誌,找到本身的U盤,選擇鏈接:
三、 對U盤進行分區
咱們須要將U盤分爲兩個分區,一個用來當作boot分區,一個用來當作根分區。使用:fdisk 命令。
在小編的電腦上識別到的U盤爲/dev/sdc盤號,因此執行:fdisk/dev/sdc,將/dev/sdc1做爲boot分區,分出大小1G;將/dev/sdc2做爲根分區,將剩餘空間所有分給根分區。
四、 將分區格式化爲ext4文件系統
分好區後並不能直接使用,咱們須要將分區格式化後才能夠正常使用,使用命令:mkfs.ext4 /dev/sdc1須要將/dev/sdc1和/dev/sdc2兩個分區進行格式化。
五、 建立掛載將要設置爲boot分區的目錄
該目錄必須爲boot,這樣在生成一些數據的時候纔不會亂,由於咱們要將分區/dev/sdc1掛載到命名爲/boot的目錄下,咱們需新建目錄,爲了避免和本地系統上的boot目錄混淆,小編建立新的目錄:mkdir –p /linshi/boot
六、 將/dev/sdc1掛載到/linshi/boot目錄上
執行命令:mount /dev/sdc1 /linshi/boot
七、 對boot分區/dev/sdc1安裝grub
執行命令:grub-install --root-directory=/linshi /dev/sdc
該命令是用來安裝修復grub引導文件的,若是grub目錄中的文件損壞了,能夠經過該命令進行恢復。由於咱們要在U盤的boot目錄上安裝grub,因此須要指定一個位置,那就是—root-directory=/linshi,對象爲/dev/sdc
查看/linshi/boot下的目錄樹結構:
查看U盤的MBR表:
八、 將本地的boot下的內核文件和僞根文件拷貝到U盤中的boot下,命令以下:
cp /boot/vmlinuz-2.6.32-696.e16.x86_64 /linshi/boot/
cp /boot/initramfs-2.6.32-696.e16.x86-64.img /linshi/boot/
執行過程如圖所示:
九、 手動編寫grub.conf配置文件
Vim /mnt/boot/grub/grub.conf
內容以下:
default=0
timeout=5
hiddenmenu
title Centos-jiake
root(hd0,0)
kernel/vmlinuz-2.6.32-696.e16.x86_64 root=UUID=(U盤的根分區的UUID) selinux=0 init=/bin/bash
initrd/ initramfs-2.6.32-696.e16.x86-64.img
如圖所示:
十、 建立掛載根分區的目錄,並掛載U盤的根分區
mkdir /linshi/sysroot
mount /dev/sdc2 /linshi/sysroot
如圖:
十一、 在U盤的根分區下建立與本地根下相同的目錄
一個一個建立太慢,咱們使用一個快捷的方式,先將本地根下的目錄名所有存放起來,作成一個列表,而後一次性建立。
先ls / > /mulu.txt
mkdir –p `cat mulu.txt`
如圖:
十二、 拷貝網卡驅動
有時候咱們須要用用網卡,因此咱們將網卡驅動一塊拷貝過去,若是不想使用網卡功能,能夠不用拷貝這個文件驅動。
使用locate e1000找到網卡驅動的位置,e1000是網卡的驅動程序文件。
如圖所示:
1三、 經過命令拷貝腳本,將須要使用的命令拷貝到U盤的根分區上
這個腳本是小編本身編寫的,若是你不會,不用着急,小編會在後面附上源代碼。若是你要使用腳本,記得給腳本加上執行的權限。具提的操做能夠看小編的截圖:
1四、 查看咱們U盤根分區下的樹狀結構圖
咱們拷貝完命令,必定要驗證命令是否拷貝成功,而且路徑必定要正確。命令原來在什麼地方,拷貝過來還要放到對應的目錄下。不然會致使命令不可用。
1五、 完成命令移植的功能後,將U盤放到獨立的機器上啓動
要關機將U盤拔下來,這裏小編使用電腦做爲整機,從U盤啓動,因此就不能呈上優質的截圖了。一下圖片使用手機拍攝。
對於不一樣的機型,進入本地BIOS的按鍵也不一樣,請各位同窗自行尋找進入BIOS的按鍵,進入BIOS須要將U盤設爲第一啓動項,(爲了在BIOS的boot啓動項顯示出U盤,須要先將U盤插入電腦)
找到本身的U盤,使用shift +將U盤移動到第一位:
完成後按下F10保存退出啓動:
1六、 啓動成功!
稍等片刻,咱們就能看到成功進入bash的界面了,因爲咱們自制了一個簡單的Linux系統,因此目前只是使用bash進入了一個簡單的bash環境,能夠執行一些簡單的命令,若是想使用init啓動進程,須要配置更多的文件,若是有興趣的同窗能夠據需深刻研究。
5、拷貝命令腳本
#!/bin/bash
#將用戶指定的命令拷貝到對應的根目錄下
copy_comd() {
com_path=`which $1`
com_dest=`dirname $com_path`
[ ! -d $dir$com_dest ] && mkdir -p $dir$com_dest
ls $dir$com_path &> /dev/null && { echo "該命令已存在!" ;return 99; }
cp $com_path $dir"$com_path"
echo -e "$com_path \e[33;5m ====>\e[0m $dir"$com_path""
}
#將命令所依賴的庫文件拷貝到對應的目錄中
copy_comfile(){
ldd $(which $1) |grep -oE "/.* " | while read libfile
do
local lib_destdir=$dir$(dirname $libfile)
local lib_destfile=$dir$libfile
if [ -e $lib_destfile ];then
continue
elif [ -d $lib_destdir ];then
cp $libfile $lib_destdir
echo -e "$libfile \e[33;5m ===> \e[0m $lib_destfile"
else
mkdir -p $lib_destdir &> /dev/null
cp $libfile $lib_destdir
echo -e "$libfile \e[33;5m ===> \e[0m $lib_destfile"
fi
done
}
#主程序(須要先指定根目錄,每一個執行步驟均可以quit退出。)
while true;do
read -p "Please input the dir("quit" to exit!): " dir
if [ "$dir" == quit ] ;then
exit
fi
[ -z $dir ] && { echo -e "\e[31m Please input the dir!\e[0m";continue;}|| break
done
ls -d $dir &> /dev/null || mkdir -p $dir
while true; do
read -p "Please input the command that you want to copy("quit" to exit! ): " com
if [ "$com" == quit ]; then
exit
fi
which "$com" &> /dev/null || { echo "This command is no exited!" ;continue; }
copy_comd $com
ret=$?
[ $ret -eq 99 ] && continue
copy_comfile $com
done
#(記得給腳本加執行權限哦!)