1. 程式人生 > >Linux系統啟動流程及系統裁剪

Linux系統啟動流程及系統裁剪

一、核心管理簡要理論

1、核心的功能 
(1)程序管理 
(2)記憶體管理(核心管理程式碼中程式碼量最大的部分) 
(3)I/O管理:中斷及中斷處理 
(4)檔案系統:ext3,ext4,reiserfs,xfs等。。 
(5)驅動程式 
(6)安全相關:SELinux

2、核心設計流派 
(1)單核心:單一體系結構(Linux) 
<1>特點: 
①模組化設計:核心+外圍功能性模組組成 
②核心支援動態裝解除安裝模組

(2)微核心:核心子系統,更容易用於多執行緒程式設計(Windows、Solaris)

二、Linux系統的初始化流程

1、系統啟動流程總結 
(1) 
POST(Power on self Testing)

 
–>BIOS(boot sequence) 
–>GRUB(bootloader),分兩階段{stage1:在MBR中。stage2:在grub目錄中} 
–>Kernel(找到initrd,被打包的模組) 
–>SHELL

2、POST(Power on self testing)的作用 
(1)開啟電源後,檢測硬體裝置是否正常工作。

3、BIOS的作用 
(1)若電腦有多個儲存裝置,BIOS就會按照中的Boot Sequence(啟動佇列)來選擇MBR所在的儲存裝置。

4、GRUB(Grand Unified Bootloader) 
(1)1st stage(第一階段):位於MBR中,為引導2nd stage。 
(2)1.5 stage:位於boot基本磁碟分割槽中,為識別核心檔案所在的檔案系統提供檔案識別擴充套件。 
(3)位於boot基本磁碟分割槽中,GRUB的載入程式。

5、啟動kernel 
(1)啟動vmlinuz,vmlinuz是一段壓縮存放的程式碼,分為兩端,一個解壓程式碼,一個為核心程式碼。 
(2)vmlinuz一般在boot目錄下。 
(3)vmlinuz完成對核心的初始化

(4)核心初始化時候需要啟動使用者程序:/sbin/ini,需要/lib/modules中的核心模組,但核心模組在根分割槽上,vmlinuz識別/分割槽又需要核心模組。(雞和蛋問題) 
<1>解決方案:安裝作業系統的時候,安裝程式能識別核心模組所在磁碟,並將核心模組打包為initrd供vmlinuz識別使用。

6、使用者空間程序/sbin/init啟動以後的工作 
(1)執行/etc/rc.d/rc.ssysinit指令碼完成系統初始化工作

三、系統裁剪流程詳解

1、系統裁剪要求:有GRUB引導系統,並且使用init指令碼實現網絡卡驅動的裝載,以及IP地址的配置,新增tserver服務,並在系統啟動時啟動此服務並顯示。

2、操作環境的目標 
(1)在vmware12中操作,系統為Centos6.5 
(2)基於宿主機(Host)製作一個簡單可啟動的Linux

3、流程概括 
(1)為虛擬機器新增一塊新硬碟,併為其分割槽,安裝GRUB 
(2)複製核心檔案(vmllinuz)和initrd檔案至新硬碟中。 
(3)移植bash,網路相關命令ifconfig、ip、ping命令,檔案列表命令ls,服務管理命令chkconfig,模組裝載解除安裝命令insmod、rmmod,掛載解除安裝命令mount、umount,檔案檢視命令cat至目標主機(Target)的/檔案系統中。 
(4)為grub提供配置檔案。 
(5)為目標主機配置/sbin/init檔案啟動網路服務和其他服務。 
(6)將目標主機的硬碟裝載其他電腦上。

4、新增新硬碟並分割槽、格式化和掛載 
(1)在虛擬機器上新增一塊20G的硬碟,名為TinyLinux。 
這裡寫圖片描述

(2)為硬碟分割槽{一個為500M(boot分割槽),一個為1G(/分割槽)}

 # fidk /dev/sdb
  • 1

這裡寫圖片描述

(3)檢查分割槽是否成功

# partprobe /dev/sdb
# cat /proc/partitions
  • 1
  • 2

這裡寫圖片描述

(4)分割槽格式化

# mke2fs -t ext4 /dev/sdb1
# mke2fs -t ext4 /dev/sdb2
  • 1
  • 2

這裡寫圖片描述

(5)在/mnt目錄下建立boot目錄以及sysroot目錄,並將上面兩個檔案系統進行掛載。

# mkdir /mnt/{boot,sysroot}
# mount /dev/sdb1 /mnt/boot
# mount /dev/sdb2 /mnt/sysroot
# mount
  • 1
  • 2
  • 3
  • 4

這裡寫圖片描述

5、安裝GRUB 
(1)安裝命令grub格式: 
# grub-install –root-directory=(boot所在目錄) /dev/sd[a-z] 
(2)例:

# grub-install --root-directory=/mnt /dev/sdb
  • 1

這裡寫圖片描述

6、複製核心檔案和initrd檔案至目標主機磁碟 
(1)核心檔案為宿主機中的/boot/vmlinuz-VERSION 
(2)initrd檔案為宿主機的/boot/initramfs-VERSION.img 
(3)複製示例:

# cp /boot/vmlinuz-2.6.32-431.el6.x86_64 /mnt/boot/vmlinuz
# cp /boot/initramfs-2.6.32-431.el6.x86_64.img /mnt/boot/initramfs.img
# ls /mnt/boot
  • 1
  • 2
  • 3
  • 4

這裡寫圖片描述

7、建立目標主機的根檔案系統 
(1)根檔案系統一般包含的目錄: 
etc/rc.d,usr,var,proc,sys,dev,lib,lib64,bin,sbin,boot,srv,mnt,media,root 
(2)示例:

# mkdir -pv /mnt/sysroot/{etc/rc.d,usr,var,proc,sys,dev,lib,lib64,bin,sbin,boot,srv,mnt,media,root}
  • 1

這裡寫圖片描述

8、移植bash等命令至目標主機根檔案系統 
(1)移植的時候需要把命令的可執行檔案以及所依賴的庫檔案複製,命令才能被執行。 
(2)可執行檔案位於/bin目錄下,庫檔案在/lib目錄 或者/lib64目錄下。 
(3)用which COMMAND 命令可檢視命令的執行檔案在哪個位置 
用 ldd `which COMMAND`命令可檢視命令所依賴的庫檔案在哪個位置。

(4)用一個指令碼實現將命令的可執行檔案以及其所依賴的庫檔案複製到目標主機根檔案系統中

#!/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} ] && echo -e "\033[31mThe ${1} exist!\033[0m" && return 5
        [ -f ${target}${1} ] || cp $1 ${target}${cmdDir}
        echo -e "\033[32mCopy ${1} success.\033[0m"
}

libCopy(){
        for lib in `ldd $1 | grep -o "/[^[:space:]]\{1,\}"`;do
                libDir=`dirname $lib`
                [ -d ${target}${libDir} ] || mkdir -p ${target}${libDir}
                [ -f ${target}${lib} ] && echo -e "\033[31mThe ${lib} exist!\033[0m" && continue
                [ -f ${target}${lib} ] || cp $lib ${target}${libDir}
                echo -e "\033[32mCopy ${lib} success.\033[0m"
        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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

(5)複製示例:

# bash /root/scripts/cpcmd.sh

bash
ls
cat
insmod
rmmod
mount
umount
ifconfig
ip
ping
chkconfig
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

這裡寫圖片描述
這裡寫圖片描述
複製成功。

9、為提供配置檔案 
(1)示例:

# vim /mnt/boot/grub/grub.conf
內容為:
default=0
timeout=5
title Tiny Linux
        root (hd0,0)
        kernel /vmlinuz ro root=/dev/sda2  quiet selinux=0 init=/bin/bash
        initrd /initramfs.img
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

(2)欄位解釋: 
<1>default =# :指定預設啟動的核心或者OS(Operating System) 
<2>timeout=# :等待使用者選擇要啟動的核心或OS的時長,單位為秒。 
<3>splashimage=/path/to/splashimage_file :指定使用的背景圖片 
<4>hiddenmenu:隱藏選單 
<5>tittle

    root (Device(磁碟裝置),Part(磁碟分割槽) )
        ①Device表示方式:在grub中,統統以hd開頭,並緊跟一個數字做各磁碟裝置的標誌,從0開始編號。
        ②Part表示方式:代表分割槽,從0開始編號

    kernel 
        ①指定核心檔案及傳遞給核心的引數,常用引數:ro root=/path/to/device,
        表示把該裝置檔案所表示的裝置當作核心去掛載時的根使用的真正根分割槽所在的裝置。(只讀掛載) 
        引數格式:ro root=/path/to/device quiet
        quiet為靜默模式

    initrd
        ①檔案通常為cpio歸檔,並使用gzip壓縮;通常以.img作為檔案字尾名(映像檔案)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

10、將目標主機的硬碟裝載其他電腦上。

切記在裝載前先把宿主機掛起,再裝載在其他電腦上,以免資料被損壞。 
(1)在vmware12中建立一個新的虛擬機器,核心為64位即可,一下是我自己的配置: 
這裡寫圖片描述

(2)為該虛擬機器提供硬碟,在Centos6.5目錄下找到TinyLinux.vmdk檔案即可 
這裡寫圖片描述
這裡寫圖片描述

(3)啟動該虛擬機器,若有grub引導並出現如下介面,並且命令正確,證明TinyLinux小系統能成功執行。

這裡寫圖片描述

這裡寫圖片描述

11、複製網絡卡模組至目標主機的 
(1)網絡卡模組所在路徑: 
/lib/modules/2.6.32-431.el6.x86_64/kernel/drivers/net/e1000/e1000.ko 
(2)建立/mnt/sysroot/lib/modules目錄

# mkdir /mnt/sysroot/lib/modules
  • 1

(3)複製網絡卡模組至/mnt/sysroot/lib/modules目錄下

# cp /lib/modules/2.6.32-431.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib/modules/
  • 1

這裡寫圖片描述

12、為目標主機配置/sbin/init檔案啟動網路服務和其他服務 
(1)將上面步驟中開啟的新的虛擬機器關機,重新開啟掛起的Centos6.5 
(2)編輯/mnt/sysroot/sbin/init檔案

# vim /mnt/sysroot/sbin/init

編輯內容:
#!/bin/bash
#
echo -e "\tWelcome to \033[34mKingOlie Tiny \033[0mLinux"
mount -n -t proc proc /proc
mount -n -t sysfs sysfs /sys
insmod /lib/modules/e1000.ko
[ $? -eq 0 ] && echo -e "Loaded e1000 module \033[60G[ \033[32mOK\033[0m ]"
ifconfig lo 127.0.0.0/8
ifconfig eth0 172.17.45.243/24
mount -n -o remount,rw /dev/sda2 /
/bin/bash
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
# chmod  +x /mnt/sysroot/sbin/init
謹記必須給init指令碼加上執行許可權,否則系統啟動的時候並不會執行init,會出現kernel panic錯誤。
# sync
使用sync將記憶體寫入的資料同步到磁碟中去。可以使用多次,以確保檔案資料已經被同步到磁碟中。
  • 1
  • 2
  • 3
  • 4

(3)編輯/mnt/boot/grub/grub.conf檔案,將init指定為sbin目錄下的init

(4)如果目標主機啟動時候顯示綠色OK字樣,證明網絡卡模組已經被裝載。 
這裡寫圖片描述

(5)用ping命令檢驗網路模組能否正常工作

# ping 172.17.45.243
此時,ctrl+c按鍵並不能中斷ping命令,因為該小系統並沒有配置ctrl+c熱鍵。
建議使用以下命令限定ping次數和時間檢測:
# ping -w 5 -c 5 172.17.45.243
  • 1
  • 2
  • 3
  • 4

這裡寫圖片描述

=======================