歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux基礎知識

Linux系統的啟動流程以及做個小小的Linux

內核的作用
    進程管理:進程間切換
    內存管理:內存空間分割為內核空間和用戶空間
    IO管理:對底層硬件的使用必須由內來實現,不能由用戶空間進程來實現
    文件系統管理
    驅動程序管理
    安全管理:包括netfilter模塊和selinux模塊等

內核的設計模式
    單內核:模塊都是集成在內核內部(Linux是單內核)
    微內核:模塊都是獨立的,隨用隨加載(Windows是微內核)
    Ps:1.linux是單內核,但是廣泛采用了微內核的設計思想
           2.內核模塊是和內核緊密相關的,一旦換了內核,所有的模塊都不能再使用    

   單線程:只有一個執行流
   多線程:有多個執行流
   
提升程序的執行速度
    1、必須尋多線程開發模式
    2、運行的主機必須有多個或者多核CPU

 

啟動流程
1、POST(Power On and Self Test):加電自檢
    檢查硬件是否工作正常
    將CMOS中的BIOS程序加載到CPU中,依此來檢測硬件工作,然後根據設定的啟動次序去指定的設備上找 系統內核
   
    BIOS的基本功能(很重要)
    1、檢查硬件
    2、獲取硬件信息
    3、指定啟動次序(bootsquence)
   
2、查找內核
    【此時因為沒有內核,所無法直接使用文件系統,因此就找不到文件系統刪的內核文件】
    MBR
        446:bootloader,在文件系統上找內核【bootloader指定了加載內核的方式】
          64:分區表
            2:幻數
    加載內核步驟(重要)
    1)找指定設備的上的MBR(bootloader)
    2)根據bootloader的指引去加載內核文件(vmlinuz-xxx)
    3)然後會將boot分區當做根分區來使用,來獲取系統的基本信息(硬件、軟件)
    PS:因為bootloader可以執行系統加載內核,因此,內核所在的分區的一定是一個特殊分區,此分區沒有文件系統也可以訪問,分區名稱是:/boot
系統中的分區(第一個分區必須是boot)


        /:根分區 (5G以上)
/boot:開機引導分區
【在手動分區的時候,第一個分必須是boot分區】
/proc:

  /sys:偽文件系統分區

/swap:交換分區


    

    內核(kernel)
        源碼:kernel.org
        二進制:/boot/vmlinuz-xxx(壓縮存放,支持自解壓)
    二進制的好處:
            節省內存和存儲空間    
            提高IO
   

3、啟動用戶空間進程


    啟動用戶空間進程:/sbin/init
    1)由內核中的文件系統功能找到並執行/sbin/init,會產生一個ID為1的進程,進程名就是init
    2)init生成用戶空間
   
加載驅動
    【不可能就將全部的驅動都加載到內核中】
    在安裝linux的時候,最後一步會執行一個腳本,此腳本會收集系統的基本信息,硬件,軟件,驅動,將這些信息打包壓縮成一個文件,此文件在centos5.x 叫做initrd-版本號.img;Centos6.x 叫做 initramfs-版本號.img
   
    因此在加載內核到內存的是,會連同initrd/initramfs一起加載到內存中,而且initrd會在內存中展開,將內存中的內核空間當做根分區來使用,在這個根分區中就有了當前系統索要使用的驅動程序。
   
    由initrd所展開生成的根也是一個虛根,在啟動完成用戶空間以後,會切換到真實根

   
chroot命令
    作用:切換根

PS:總結啟動流程
POST-->BIOS(BootSequence)-->MBR(Bootlader)-->vmlnuz,initrd(initramfs)-->/sbin/init(/etc/inittab)

關於/etc/inittab的相關介紹

程序:/sbin/init
配置文件:/etc/inittab(vim /etc/inittab)
linux的運行級別(模式)
    0 - halt (Do NOT set initdefault to this)(關機)
    1 - Single user mode(通常用來修復系統)
    2 - Multiuser, without NFS (The same as 3, if you do not have networking)  (為了解決網絡不通導致系統啟動異常)
    3 - Full multiuser mode(字符級別的多用戶模式)
    4 - unused(系統保留功能)
    5 - X11(圖形界面,前提必須安裝圖形界面)
    6 - reboot (Do NOT set initdefault to this)   (重啟) 
 
*查看級別
    # runlevel
   返回: N 3
    N:表示沒有切換過級別
   切換級別
    # init N 

inittab詳解
    格式:
        id:level:action:process

    action的相關介紹
        initdefault: 設置默認級別
        sysinit:指定系統初始化過程中,要執行的腳本
        wait:等待,監控一旦處於指定級別就執行的操作
        ctrlaltdel:設置當用戶按下 ctrl + alt + del時候所觸發的操作
        powerfail:設置當發生斷電的情況下,所執行的操作
        respawn:指定終端
 
linux系統啟動過程中,會將指定級別下的程序啟動或關閉
    程序的存放位置:/etc/init.d
    程序加入到系統服務以後,會自動生成連接文件
    # chkconfig --add 腳本名
    程序的鏈接文件位置: /etc/rc.d/rcN.d
        /etc/rc0.d 
        /etc/rc1.d
        /etc/rc2.d
        /etc/rc3.d
        /etc/rc6.d
     分別對應系統的七個運行級別
image            
    系統啟動的時候,會首先判斷級別(假設判斷級別為3)
    判斷級別以後,會在/etc/rcN.d下,將所有S開頭的程序啟動,所有K開頭的程序關閉
 
注意:
    一旦將一個程序添加到系統服務,那麼會自動在/etc/rcN.d下創建鏈接文件
grub引導系統啟動,分為三個階段
    stage1:其實就是使用MBR中的bootloader完成內核檢索
    stage1.5:在boot分區中,用來識別文件系統,此階段只有在分區的時候才有用
    stage2:使用 /boot/grub/grub.conf 中的程序完成系統的最終啟動

grub.conf詳解(vim /boot/grub/grub.conf)

default=0  #指定默認使用哪個內核文件,零表示第一個
timeout=5 #設置開機等待時間(可以自己改了玩著試試)
splashimage=(hd0,0)/grub/splash.xpm.gz  #開機背景圖片,也可修改但是照片的格式必須和系 統相同
hiddenmenu #隱藏菜單
title CentOS (2.6.32-431.el6.x86_64)   #開機提示信息
    root (hd0,0)     #指定內核文件所在分區,這裡表示第一個磁盤第一個分區
    kernel /vmlinuz-2.6.32-431.el6.x86_64(指定內核) ro root=/dev/mapper/vg_chenxiaoxu-lv_root rd_LVM_LV=vg_chenxiaoxu/lv_swap rd_NO_LUKS rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 (指定語言)rd_LVM_LV=vg_chenxiaoxu/lv_root(指定根分區位置)  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
    initrd /initramfs-2.6.32-431.el6.x86_64.img

 

           
Grub的基本使用(忘了Linux密碼可以修改)
    1、進入grub界面:在等待時間內按回車鍵
        可用的命令
        e:進入編輯界面(其實編輯/boot/grub/grub.conf)
        a:編輯內核功能
        c:進入命令行模式
    2、進入編輯模式
        e:進入編輯模式       
        c:同上
        b:引導開始進入系統   
        o:新添加一行
        d:刪除
    3、編輯kernel行
        【修改此行可以設置系統的運行模式】
        在原有內容後寫上一個 1 ,進入單用戶模式,然後回車,返回到grub.conf的編輯界面
        按 b 開始引導進入系統
    4、給grub設置密碼
        修改grub.conf,添加一個字段passwd
        方式是:
            在title 上面添加一行內容
            password 123
     注意:添加是的明文密碼,不安全,所以看下邊啦   

    5、給grub設置加密的密碼
        1)生成加密密碼
image         

        2)將密碼添加到/boot/grub/grub.conf中
            password --md5 $1$4ixMm$UXtaHOHwyyQtdtDlk/9no/

            --md5:是指定的加密方式大名叫MD5加密
在新的磁盤上安裝grub

(前提:添加一個新的磁盤大小為1G,必須使用單個文件作為磁盤文件,將此文件存到一個容易找到的地方,

         1)這個新磁盤必須提前進行分區
        2)這個新磁盤必須掛載到系統的某個目錄之上

)   
有兩種安裝方式
    第一種方式:grub-install 進行安裝
    第二種方式:進入grub模式進行安裝

方式二:grub模式安裝    
   # grub
        grub >
       破壞grub的第一階段
        bootloader(MBR-446)
        # dd if=/dev/zero of=/dev/sda bs=1 count=1(泡泡機)
        修復grub的第一階段
        1)進入grub模式
            # grub
        2)測試根分區的編號
            # root  (hd#,#)  PS:這裡的hd#是磁盤編號,#是分區編號
            出現信息:filesystem type unkown 表示不是boot所在分區
        3)在根分區所在的磁盤上安裝grub(bootloader)
            安裝grub的格式:
                grub > setup (hd#)  PS:hd# 表示在指定的磁盤上來安裝grub
  

方式一:grub-install方式安裝
    格式:grub-install --root-directory=路徑
        注意:這個路徑指的是boot所在分區
    1)分區操作
        分區
        格式化
        掛載
            # mount /dev/sdb1 /media
    2)安裝grub
        # gurb-install --root-directory=/media /dev/sdb
   
模塊相關的命令
    lsmod
        已經加載的模塊名稱以及依賴的模塊
    modinfo
        格式:modinfo 模塊名稱
        作用:顯示一個莫得詳細信息
        depends:該模塊所依賴的模塊
        filename:模塊的保存位置
        description:模塊的描述信息
    modprobe
        格式:modprobe 模塊名稱
        作用:動態加載模塊
       
    modprobe -r 模塊名稱:卸載模塊

    insmod
        格式:insmod /patt/to/模塊名稱
        作用: 加載模塊
   
    rmmod
        格式:rmmod 模塊名稱
        作用:卸載模塊


例子:查看顯示floppy模塊信息
           
    查看模塊的相信信息
    # modinfo floppy
       
    查看該模塊是否已經被加載
    # lsmod | grep floppy
    floppy                 61447  0
       
    卸載此模塊
    # modprobe -r floppy
    # lsmod | grep floppy   
       
    重新加載此模塊
    # modprobe floppy
    # lsmod | grep floppy
        floppy                 61447  0        
       
       
       
准備一個新磁盤
安裝grub
編寫一個grub.conf
向這個磁盤移植幾個常用命令ls cd mkdir。。。
       
       
       
制作簡單的linux
1、添加硬盤,創建兩個分區
    1)創建分區
        /dev/sdb1->200M
        /deb/sdb2->xx
    2)掛載分區
        sdb1 --> /media/boot
        sdb2 --> /media/sysroot
       
2、在該硬盤上安裝grub
    # grub-install --root-directory=/media/boot /dev/sdb

3、移植kernel和initrd

4、創建系統的必要目錄
    bin
    sbin
    etc/rc.d
    var
    usr
    tmp
    home
    root
    proc
    sys
    meida
    mnt
    lib
    lib64
   
5、移植系統命令
    bash
    mount
    cd
    ls
    cp
    mkdir
    rm
    touch
   
6、給bash創建軟件鏈接sh

7、生成grub的配置文件
    default=0
    timeout=10
    title my mini linux
        root (hd0,0)
        kernel /vmlinuz ro root=/dev/sda2 quiet selinux=0 init=/bin/bash
        initrd /initramfs.img

8、創建一個init程序,來完成系統初始化
    1)創建init
        #!/bin/bash
        echo -e "wellcome to linux \033[32m zxhk \033[0m"
        # mount -n -t proc proc /proc
        mount -n -t sysfs sysfs /sys
        mount -n -o remount,rw /dev/sda2 /
        /bin/bash
    2)賦予執行權限

    3)修改grub.conf

9、導入網絡功能模塊
    1)導入命令
   
    2)移植網卡模塊
        # cp `modinfo e1000 | head -n1 | awk '{print $2}'` /media/sysroot/lib/

    3)修改init,加載網卡模塊
        #!/bin/bash
        echo -e "wellcome to linux \033[32m zxhk \033[0m"
        # mount -n -t proc proc /proc
        mount -n -t sysfs sysfs /sys
        insmod /lib/e1000.ko
        ifconfig eth0 10.100.0.112 netmask 255.255.0.0
        ifconfig lo 127.0.0.1 netmask 255.0.0.0
        mount -n -o remount,rw /dev/sda2 /
        /bin/bash       

Copyright © Linux教程網 All Rights Reserved