系統啟動流程


CentOS 5和6的啟動流程
服務管理
Grub管理
自制Linux
啟動排錯
編譯安裝內核

系統啟動流程:

 POST --> 讀取BootSequence (BIOS),決定引導次序 -->讀取引導設備的Bootloader(MBR grubstage1-->stage1.5/boot/filkeststem--> boot-->/boot/grub.conf/-->磁盤分區上讀取 kernel(ramdisk來完成對真正根文件所在設備的加載) -->掛載rootfs(只讀)到根設備上 --> 開始運行/sbin/init-->(/etc/inittab /etc/init/*.conf)-->設置默認運行級別-->運行系統初始化腳本,完成系統初始化-->關閉對應級別下需要停止的服務,啟動對應級別下需要開啟的服務.-->rc.local-->設置登錄終端[-->圖形終端]

概論

1.linux組成部分:kernel(內核)+rootfs(GUN,根文件系統)
    kernel:進程管理、內存管理、網絡管理、驅動程序、文件系統、安全功能
        IPC:Inter process communication
            消息隊列,semerphor,shm
            socket
    rootfs:程序和庫文件glibc
        程序:二進制執行文件
        glibc:函數集合,function,調用接口
            過程調用:prpcedure,無返回值
            函數調用:function
2.kernel設計流派
    微內核:(monolithic kernel):Linux
        把所有工具集成與同一個程序
    單內核:(micro kernel): Windows, Solaris
        每種功能使用一個單獨子系統實現(模塊化)

3.Linux內核特點:
    支持模塊化: .ko(內核對象)
        如:文件系統,硬件驅動,網絡協議等
    支持內核模塊的動態裝載和卸載
4.linux內核組成部分:
        核心文件: /boot/vmlinuz-VERSION-release  vmlinuz的字母表示內核是壓縮文件
            輔助的偽根系統:ramdisk
                啟動操作系統,需要驅動,但驅動在根文件系統上,開機時掛載不了根文件系統,就需要一個第三方來輔助,生成一個虛擬的根文件系統,生成專用用戶的專用驅動,來加載真正的根文件系統上的驅動.


                CentOS 5: /boot/initrd-VERSION-release.img
                CentOS6,7: /boot/initramfs-VERSION-release.img
        模塊文件: /lib/modules/VERSION-release(內核版本號)
            注意:安裝多版本的內核,有多個模塊目錄

5.模塊文件目錄: /lib/modules/2.6.32-431.el6.x86_64/kernel 
    arch :與平臺相關的特有代碼(x86 x64)
    crypto  :加密解密的組件
    drivers  :    驅動
    fs  :文件系統
    kernel  :內核追蹤用到的組件
    lib  :庫
    mm  :內存管理
    net  :網絡管理
    sound:聲音驅動

6.運行中的系統環境可分為兩層:內核空間,用戶空間
    用戶空間:應用代碼(進程或線程)
    內核空間(內核模式):內核代碼(系統調用)
        任何應用程序在運行過程中,有可能需要不斷發起模式轉換,兩種空間不斷轉換.轉換的速率決定系統的性能.
7.建議在生產環境里面,將ctrl+alt+del里面重啟的快捷鍵禁用

啟動流程

僅適用于MBR類型架構的PC主機

1.centos6啟動流程
系統啟動流程

1.POST加電自檢
2.加載BIOS的硬件信息,獲取第一個啟動設備。
3.讀取第一個啟動設備MBR的引導加載程序(grub)的啟動信息
4.加載核心操作系統的核心信息,核心開始解壓縮,并嘗試驅動所有的硬件設備。
5.核型執行init程序并獲取運行信息。
6.Init執行/etc/rc.d/rc.sysinit文件。
7.啟動核心的外掛模塊(/etc/modprobe.conf)。
8.Init執行運行的各個批處理文件(scripts).
9.Init執行/etc/rc.d/rc.local.
10.執行/bin/login程序,等待用戶登錄。
11.登錄之后開始以Shell控制主機。
1. POST: Power-On-Self-Test,加電自檢,是BIOS功能的一個主要部分。負責完成對CPU、主板、內存、硬盤子系統、顯示子系統、 串并行接口、鍵盤、 CD-ROM光驅等硬件情況的檢測。

 post(加電自檢) 其實就是按開機鍵的那個過程,檢測你的系統硬件信息 ,通過什么檢測(cpu) 什么都不會干,執行事先編排好的指令和程序,cpu從哪加載指令和程序,能從硬盤拿數據嗎?去內存拿數據 剛系統初始化過程中內存是空白的,沒有數據,  
 這就要求系統自己完成這個的過程,通常內存有兩種:ROM RAM ,計算機識別的內存和我們平時說的內存是不一樣的 設備尋址時 不光識別物理4G內存條,還有一個低地址空間(BIOS的空間)在主板上有一個ROM芯片,里面嵌入了一段程序,(叫BIOS 基本輸入輸出系統)程序的作用就是掃描計算機的硬件, 開機過程中計算機會將他的指針指向內存低地址空間    自動在開機過程中CPU的指揮下將某個特殊的硬件的設備內容裝在進內存,將BOis中的程序和指令映射進(物理地址空間)ROM 中,cpu就能讀取指令,檢測設備是否完整不需要任何額外指令,是硬件內置的,這個過程就是加電自檢。
 bios 還要完成啟動設備的次序決定,決定哪個設備先啟動(USB裝系統)

    ROM: BIOS, Basic Input and Output System,保存著有關計算機系統最重要的基本輸入輸出程序,系統信息設置、 開機加電自檢程序和系統啟動自舉程序等。
    RAM: CMOS互補金屬氧化物半導體,保存各項參數的設定按次序查找引導設備,第一個有引導程序的設備為本次啟動設備

2.bootloader: 引導加載器,引導程序
    從BISO中按次序查找各引導設備,第一個有引導程序的設備即為本次啟動要用到的設備.
    程序類型:
        windows: ntloader,僅是啟動OS
        Linux:功能豐富,提供菜單,
            LILO: LInux LOader(缺陷:無法支持大硬盤分區)
            GRUB: GRand Unified Bootloader(統一引導加載器)
                centos 5,6: GRUB 0.X: GRUB Legacy(經典版), 各種安卓手機使用
                centos 7:   GRUB 1.X: GRUB2(跟0.X版本比,完全重寫)
    功能:提供一個菜單,允許用戶選擇要啟動系統或不同的內核版本;把用戶選定的內核裝載到內存中的特定空間中,解壓、展開,并把系統控制權移交給內核
    MBR:Master Boot Record 
        512字節: 446byts: bootloader; 64byts: 分區表; 2byts: 55AA
            bootloader空間太小,446字符的代碼只能實現最基本的功能
    GRUB:
       為向用戶提供更好的開機體驗,加入開機菜單,開機圖片等更多功能,bootloader的小空間不能滿足,grub分成三個階段,第一階段放在bootloader,bootloader不再直接加載內核,而是加載grub的第二階段,第二階段是一個虛擬操作系統,在磁盤分區內,有大的容量.相當于在啟動操作系統前,啟動一個虛擬操作系統(程序),不受MBR的限定,提供復雜的功能(陣列圖,菜單,交互式接口),選定操作系統后,再由第二階段加載內核文件.在第二階段之前,還有第1.5階段,提供文件系統驅動,方便虛擬系統的生成.

       第一階段: primary boot loader : 1st stage, 1.5 stage
       第1.5階段 :Partition:filesystem driver,1.5stage 文件系統驅動接口
       第二階段 :Partition /boot/grub/ : 2nd stage,分區文件

    不支持復雜邏輯的軟raid,內核分件只能放在基本磁盤分區上
   UEFI:可擴展固件接口(Extensible Firmware Interface,EFI)是 Intel 為 PC 固件的體系結構、接口和服務提出的建議標準。其主要目的是為了提供一組在 OS 加載之前(啟動前)在所有平臺上一致的、正確指定的啟動服務,被看做是有近20多年歷史的 BIOS 的繼任者。
   GPT: GUID磁碟分割表(GUID Partition Table,縮寫:GPT)其含義為“全局唯一標識磁盤分區表”,是一個實體硬盤的分區表的結構布局的標準。它是可擴展固件接口(EFI)標準(被Intel用于替代個人計算機的BIOS)的一部分,被用于替代BIOS系統中的一32bits來存儲邏輯塊地址和大小信息的主開機紀錄(MBR)分區表。
3.kernel:
    有gurb中選定內核,把內核文件展開后,kernel自身初始化,然后接管系統的控制權,開始完成復雜的操作.
    自身初始化操作(按順序操作):
        A.探測可識別到的所有硬件設備
        B.加載硬件驅動程序(有可能借助于ramdisk加載驅動)
        C.以只讀方式掛載根文件系統(只讀掛載,以防內核的錯誤操作,操作過程出錯)
        D.運行用戶空間的第一個應用程序: /sbin/init

     init程序的類型:
         CentOS 5之前: SysV init 
            配置文件: /etc/inittab
        CentOS 6: Upstart init (支持并發啟動服務)
            配置文件: /etc/inittab(只是定義系統啟動級別)
            /etc/init/*.conf(ntOS 7主要使用)
        Ce: Systemd systemd 
            配置文件: /usr/lib/systemd/system, /etc/systemd/system
    ramdisk:
        不在發行版系統光盤上事先存在,而是在裝系統后,掃描硬件設備后動態生成的
         內核中的特性之一:使用緩沖和緩存來加速對磁盤上的文件訪問
            ramdisk 轉換成 ramfs(文件系統) 提高速度
            centos 5: initrd, 創建工具程序: mkinitrd
            CentOS 6,7initramfs,創建工具程序: mkinitrd, dracut
        系統初始化過程:
        POST --> 讀取BootSequence (BIOS),決定引導次序 -->讀取引導設備的Bootloader(MBR) -->磁盤分區上讀取 kernel(ramdisk來完成對真正根文件所在設備的加載) -->掛載rootfs(只讀)到根設備上 --> 開始運行/sbin/init( systemd

4.init程序(sbin/init)

centos5:SysV init
    運行級別:為了系-統的運行或維護等目的而設定的機制;
        0-6 :7個級別    
            0:關機 shutdowm
            1:單用戶模式(root自動登錄), single, 維護模式
            2: 多用戶模式,啟動網絡功能,但不會啟動NFS;維護模式
            3:多用戶模式,正常模式;文本界面
            4:預留級別;,目前無特別適用目的, 可同3級別
            5:多用戶模式(multi user),完全功能模式;圖形界面
            6:重啟
        默認級別: 3, 5
        切換級別: init #
        查看級別: runlevel ; who -r
   配置文件: /etc/inittab
        每一行定義一種action以及與之對應的process
            id:runlevel:action:process
                id:一個任務的標識符
                runlevels:在哪些級別啟動此任務;#,###,也可以為空,表示所有級別
                action:在什么條件下啟動此任務
                    wait: 等待切換至此任務所在的級別時運行一次
                    respawn:此任務終止時,就重新啟動之
                    initdefault:設定默認運行級別; process省略
                    sysinit:設定系統初始化方式,此處一般為指定/etc/rc.drc.sysinit
                    ca::ctrlaltdel:/sbin/shutdown -t3 -r now
                    process:具體任務 ,通常是應用程序,或腳本,或二進制程序
            例:
                id:3:initdefault:  表示設定默認啟動級別(centos6兼容)
                si::sysinit:/etc/rc.d/rc.sysinit 表示所有級別利用/etc/rc.d/rcsysinit設定系統初始化
                l3:3:wait:/etc/rc.d/rc 3 表示當切換到3級別時運行/etc/rc.d/rc腳本,往腳本里傳遞參數為3,意味著去啟動或關閉/etc/rc.d/rc3.d/目錄下的服務腳本所控制的服務,不同級別,數字不同.
                6:2345:respawn:/usr/sbin/mingetty tty6(定義終端1-6):表示在2345運行級別啟動mingetty指令,給指令傳遞參數tty1,一旦該程序停止,要自動重啟。mingetty會調用login程序,打開虛擬終端的程序,除了minget ty之外,還有諸如getty等
                x:5:respawn:/etc/X11/prefdm -nodaemon 表示在5運行級別啟動時,打開圖形化終端    
    系統初始化腳本:/etc/rc.d/rc.sysinit,完成后才會啟動各種服務
        (1) 設置主機名
        (2) 設置歡迎信息
        (3) 激活udev和selinux
        (4) 掛載/etc/fstab文件中定義的文件系統
         (5) 檢測根文件系統,并以讀寫方式重新掛載根文件系統
        (6) 設置系統時鐘
        (7) 激活swap設備
        (8) 根據/etc/sysctl.conf文件設置內核參數
        (9) 激活lvm及software raid設備
        (10) 加載額外設備的驅動程序
        (11) 清理操作

     運行級別的相關服務:
       init在利用/etc/inittab配置文件,進行用戶空間系統初始化時,會有關于默認運行級別的定義,當定義好默認運行級別,利于/etc/rc.d/rc.sysinit完成系統
初始化后,就會按照運行級別,來關閉、打開相應級別下的服務

    /etc/rc:規定關閉啟動服務機制
         rc腳本接受一個運行級別數字為參數,/etc.rc.d/有rc+運行級別的目錄,有K和S開頭+運行級別+服務名的文件,每個文件鏈接/etc/init.d相應的程序文件.
          各種服務的控制腳本程序是存放在/etc/rc.d/init.d/目錄下,然后各個對應級別下要關閉或開的程序以軟連接的方式存放在/etc/rc.d/rc運行級別.d/目錄下
                以K開頭的表示要關閉的服務,K##*:關閉優先級,##數字越小,越是優先關閉;依賴的服務先關閉,而后關閉被依賴的;
                以S開頭的表示要開啟的服務,##*:啟動優先級,##數字越小,越是優先啟動;被依賴的服務先關閉,依賴別人的服務后啟動

                一般是先關閉相關服務后,再開啟相關服務

         /etc/rc.d/rc.local 該腳本為正常行級別運行后的最后一個腳本,可以將一些希望開機時自動啟動,但又不合適編輯成服務腳本的一些命令或程序,寫在該文件中,
單獨成行,即可完成開機自動啟動;正常級別下,最后啟動一個服務S99local沒有鏈接至/etc/rc.d/init.d一個服務腳本,而是指向了/etc/rc.d/rc.local腳本

    對應的文件在/etc/init/control-alt-delete.conf里,可通過/etc/inittab獲知其定義信息

  /etc/rc.d/init.d/下的腳本的格式:
     這類腳本都需要在開頭注釋段標明:一般要接受至少start、stop、restart、status四個參數
         #!/bin/bash
          # crond    start/stop the cron daemon 標明腳本功能 ,此項可以不寫 
          # chkconfig:LLL NN MM  標明該服務腳本初始狀態下的運行級別,啟動優先級,關閉優先級,必須要寫
             LLL:自動為on級別
             NN:自動為on的優先級
             MM:自動為OFF的優先級   例:# chkconfig:2345 11 88
         # description:  描述
         功能代碼段 …

 /etc/init.d/*(/etc/rc.d/init.d/*)服務腳本執行方式:
        #/etc/init.d/服務腳本 {start/restart/stop/status}
        #service SRV_SCRIPT {start/restart/stop/status}

為了統一管理服務關閉啟動,設置服務腳本機制.利用chkconfig命令自動在各級別目錄下創建對應的K或S的服務管理鏈接文件,且可以管理服務腳本的開機啟動或關閉等,要想利用chkconfig進行管理,腳本必須要滿足上述注釋段的要求,然后將腳本放到/etc/init.d/目錄下

    chkconfig命令:管控/etc/init.d/每個服務腳本在各級別下的啟動或關閉狀態;
         查看:chkconfig --list [服務名]
         添加:chkconfig --add 服務名
             SysV的服務腳本放置于/etc/rc.d/init.d (/etc/init.d)
         刪除:chkconfig --del 服務名    
         修改執行的連接類型:
             chkconfig [--level LEVELS] name <on|off|reset>
                 --level LEVELS:指定級別,默認為234

動態管理服務  xinetd
   service命令,手動管理服務
   瞬態( Transient)服務被xinetd進程所管理進入的請求首先被xinetd代理
    配置文件: /etc/xinetd.conf、 /etc/xinetd.d/<service>
    與libwrap.so文件鏈接
    用chkconfig控制的服務:
        chkconfig tftp on

總結(用戶空間的啟動流程):/sbin/init(/etc/inittab)            
    設置默認運行級別-->運行系統初始化腳本,完成系統初始化-->關閉對應級別下需要停止的服務,啟動對應級別下需要開啟的服務.-->設置登錄終端[-->圖形終端]

  centos6:
        init程序:upstart,但依然為/sbin/init,其配置文件:/etc/init/*.conf
            為了兼容centos5,仍然有/etc/inittab,但僅僅是定義系統默認運行級別

系統啟動流程

        /etc/rcs.conf:定義系統初始化腳本
        /etc/rc.conf:主配置文件,
        /etc/start-tty.conf:定義啟動虛擬終端
        /etc/init-system-dbus.conf: 定義啟動服務
            注意:*.confwei為upstar風格的配置文件.
        GRUB:完全一樣

 centos7:
    init程序:systemd,配置文件:/usr/lib/systemd/system/*,/etc/systemd/system/*
    與centos5,6的開機啟動服務相比,centos7開機時不啟動任何服務,當訪問某種服務時,才會啟動服務,不訪問的服務保持沉默狀態

    完全兼容SycV腳本機制;因此,server命令依然可用,不過,建議使用systemctl命令來控制服務.
        systemctl {start|stop|restart|status} name[.service]
    設定默認系統運行級別:(不再是修改/etc/inittab,此文件指明更改方法)
        命令:systemctl set-default TARGET.target
        查看當期的運行平臺: systemctl get-default
        常用的運行平臺:
            # multi-user.target: analogous to runlevel 3
            # graphical.target: analogous to runlevel 5
        沒有運行級別的概念,為了兼容centos5.6,設定不同的運行平臺,來對應0-6的運行級別

2.詳解GRUB(BOOT Loader)

grub legacy:主要運行分三個階段
    stage1(第一階段):安裝在mbr中
    stage1.5(第1.5階段):存放在mbr之后的扇區中,讓stage1中的bootloader能識別stage2所在的分區上的文件系統(否則他是沒辦法加載第二階段的)
    stage2(第2階段):這個就是我們開機能看到提供菜單,讓我們能夠編輯時的加載界面的那個階段,第二階段是存放在磁盤分區上的,一般都在/boot/grub/目錄下
    =====以上就是grub的組織格式======

    grub也有配置文件:/boot/grub.conf通常有個符號連接文件在/etc/grub.conf
    配置文件:/boot/grub/grub.conf <-- /etc/grub.conf
    因此當我們系統啟動的時候如果要加載grub所在的磁盤時,會讀取這個磁盤上的Mbr,從此能加載到stage1,stage1加載完以后會嘗試去加載stage1.5,stage1.5階段讀到以后,從而就能夠驅動stage2所在的磁盤分區;其實這個磁盤分區上不但有第二階段,還有內核文件和ramdisk等等,都在這個分區上放置著,這就是為什么grub能夠加載內核文件的原因。注意:主板bios必須能夠識別硬盤。然后bios才能去加載硬盤上的boot loader,磁盤上boot loader加載完以后就能夠直接識別當前主機能識別到的硬盤設備了,但是,硬盤設備能夠識別,并不以為著能夠識別硬盤中的文件系統,因為文件系統是額外附加的一層軟件組織的文件結構。所有要想能夠對接某種文件系統,必須要用到文件系統驅動。所謂的stage1.5階段也就是給grub提供了文件系統驅動,從而grub就能夠訪問對應的stage2和內核所在的分區了,這通常應該是一個基本磁盤分區,畢竟stage1.5不可能做的過于復雜。所以grub的第二階段,以及內核以及ramdisk文件通常都會放在一個基本磁盤分區
    stage2及內核等通常放置于一個基本磁盤分區(就是一般的磁盤分區,不是lvm和軟raid;因為grub根本就驅動不了邏輯卷)
    功用:
        (1)提供菜單,并提供交互式接口
            e:編輯模式,用于編輯菜單
            c:命令模式,交互式接口(命令行接口)
        (2)加載用戶選擇的內核或操作系統
            允許用戶傳遞參數給內核
            可隱藏菜單
        (3)    為菜單提供保護機制    
                為編輯菜單進行認證
                為啟動內核或操作系統進行認證    

    如何識別硬盤設備:
        (hd#,#)第幾塊硬盤的第幾個分區
            hd#: 磁盤編號,用數字表示;從0開始編號
            #: 分區編號,用數字表示; 從0開始編號
        (hd0,0) 第一塊硬盤,第一個分區

grub的命令行接口
    help:獲取幫助列表
    help KEYWORD:詳細幫助信息
    find (hd#,#)/PATH/TO/SOMEFILE:

系統啟動流程

    root (hd#,#) 把哪個磁盤設備設定為根設備
    kernel /PATH/TO/KERNEL_FILE: 設定本次啟動時用到的內核文件;額外還可添加許多內核支持使用 cmdline參數
        例如: max_loop=100 selinux=0 init=/path/to/init
    initrd /PATH/TO/INITRAMFS_FILE: 設定為選定的內核提供額外文件的ramdisk;必須與內核版本號完全匹配,否則無法被內核裝載
    boot: 引導啟動選定的內核

cat /proc/cmdline 顯示/boot/grub/grub.conf中內核的參數

內核參數文檔:/usr/share/doc/kernel-doc-2.6.32/Documentation/kernel-parameters.txt

手動在grub命令行接口啟動系統:
    grub> root (hd#,#) 指明根設備
    grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE(只讀方式啟動根文件系統)
    grub> initrd /initramfs-VERSION-RELEASE.img 指明ramdisk文件
    grub> boot  引導內核

配置文件: /boot/grub/grub.conf

系統啟動流程

    default=#: 設定默認啟動的菜單項;落單項(title)編號從0開始
    timeout=#:指定菜單項等待選項選擇的時長(用戶在規定時間內不操作,自動跳過菜單)
    splashimage=(hd#,#)/PATH/TO/XPM_FILE:菜單背景圖片文件路徑,支持顏色很少
    hiddenmenu:隱藏菜單
    password [--md5] STRING: 啟動菜單編輯認證 STRING:加密密碼串 重啟生效
    title TITLE:定義菜單項“標題” , 可出現多次
        root (hd#,#): grub查找stage2及kernel文件所在設備分區;為grub“根”
        kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:啟動的內核   ,這里的根是指root指向的第一個硬盤,第一個分區(hd0,0).  
            刪除rhgb quiet選項,取消開機圖形界面,查看內核啟動消息
        initrd /PATH/TO/INITRAMFS_FILE: 內核匹配的ramfs文件
        password [--md5] STRING: 啟動選定的內核或操作系統時進行認證
        Max_loop=100 增加loop設備的數量(內核參數)

            獨立分區的boot    kernel和initrd 可以寫成 (hd0,0)/vimlinuz-
            非獨立分區的boot kernrl      (hd0.0)/boot/vimlinuz-


grub加密:
    1.openssl passwd -1 或 指定鹽: openssl passwd -salt "weds" -1
    2grub-md5-crypt命令,生成密碼串,

     編輯/boot/grub/grub.conf  把生成的密碼串放到password字段后 
        #password --md5 $1$8xzRy$xKj1/D5nb.9flfTfSRl5x.

系統啟動流程

進入單用戶模式:(可破解root密碼)
    啟動系統時,設置其運行級別1
    進入單用戶模式:
    (1) 編輯grub菜單(選定要編輯的title,而后使用e命令);
    (2) 在選定的kernel后附加
        1, s, S或single都可以;編輯好敲回車
    (3) 在kernel所在行,鍵入“ b”命令
安裝grub:
    (1) grub-install
        安裝grub stage1和stage1_5到/dev/DISK磁盤上,并復制GRUB相關文件到 DIR/boot目錄下
        grub-install --root-directory=DIR /dev/DISK
    (2) grub
        grub> root (hd#,#)
        grub> setup (hd#)

系統啟動流程

3.自制linux系統

1.分區并創建文件系統
        fdisk /dev/sdb
    分兩個必要的分區
        /dev/sdb1對應/boot /dev/sdb2對應根 /
        mkfs.ext4 /dev/sdb1
2.掛載boot
    mkdir /mnt/boot
    mount /dev/sdb1 /mnt/boot
3.安裝grub
    grub-install --root-directory=/mnt /dev/sdb
4.. 恢復內核和initramfs文件
    cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/
    cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot
5.建立grub.conf文件
    Vim /mnt/boot/grub.conf
        kernel /vmlinuz-2.6.32-642.el6.x86_64 root=/dev/sda2 selinux=0 init=/bin/bash
    chroot /mnt/sysroot
6. 創建一級目錄
    mkdir /mnt/sysroot
    mount /dev/sdb2 /mnt/sysroot
    mkdir –pv/mnt/sysroot/{etc,lib,lib64,bin,sbin,tmp,var,usr,sys,proc,opt,home,root,boot,dev,mnt,media}
7. 復制bash和相關庫文件

4.救援模式

5.內核 Kernel

centos系統啟動流程:POST-->biso-->bootloaer
加電自檢后,讀取bootloader中某個磁盤的MBR,kernel ,rootfs,init都是bootloader引導.

ldd命令:打印二進制程序文件的依賴庫,沒有對應文件的庫,是真正的二進制程序入口.
    ldd /bin/ls | grep -o "lib[^[:space:]]*"

系統啟動流程

內核設計體系:單內核,微內核
    linux:單內核,但充分借鑒微內核體系設計的優點:為內核引入了模塊化機制
        內核的組成部分:
            kernel:內核核心,一般為bzimage,通常位為/boot目錄,一般我們看到這個文件,就說明內核文件沒用了,在系統啟動時已經被加載過,開機后不在被使用,放在目錄里,方便我們后期管理.
            kernel object:內核對象,即內核模塊,一般放置于/lib/modules/VERSION-release/.
                A.內核模塊與內核核心版本一定要嚴格匹配;
                B.內核模塊化的主要動因:為了能夠支持第三方廠商的硬件設備及其驅動程序,可以引進內核模塊化的方式設計,這樣每一個廠商都可以把自己的設備驅動寫成內核模塊,當用到這個設備時,單獨編譯這個內核模塊.針對于當前內核的源碼樹,編譯這個模塊,并裝載到內核上就可以使用了;

                C.在對內核的編譯中,定義某個內核的功能,分為三種選擇:
                     [ ]:N 編譯時不啟動功能,留空
                    [M]:Module 編譯成內核模塊,用到時臨時裝載,只占用磁盤空間,不占用內核內存空間
                    [*]:Y 直接編譯進內核核心,只要內核在,功能就在,不用裝載.
                D.內核:動態裝載和卸載
            ramdisk:輔助性文件,并非必須,這取決于內核是否能直接驅動rootfs所在的設備;能直接驅動,ramdisk就不需要;不能驅動,就需要借助ramdisk封裝驅動,不僅包括設備的驅動程序,也可以包括設備上的格式化所提供的邏輯設備,比如說lVM,文件系統;如果都編譯成模塊的話,都可以加載到內核中.
                借助于ramdisk,能加載的驅動,包括為:
                    目標設備驅動,例如:ISCSI設備的驅動
                    邏輯設備驅動,例如:LVM設備的驅動
                    文件系統,例如:XFS文件系統
                ramdksk:是一個簡裝版的根文件系統;不能作為一個操作系統使用,因為運行在內存中,缺少長久性,所以操作系統必須在持久性存儲設備上,這也是做根切換的原因.提供設備驅動,僅僅是為了能夠讓內核找到真正的根文件系統.
        內核信息查看:
            uname命令:
               -a, --all 全部顯示
               -s, --kernel-name 內核名稱
               -n, --nodename  節點名稱(主機名)    
               -r, --kernel-release  內核發行號
               -v, --kernel-version  內核編譯版本號
               -m, --machine   硬件架構類型
               -p, --processor   cpu類型
               -i, --hardware-platform  硬件平臺名稱
               -o, --operating-system   操作系統類型

系統啟動流程

        模塊信息查看:
             lsmod命令:顯示當前內核已加載的模塊名,模塊大小,被引用次數,被什么模塊所引用
                 抽取/proc/modules的信息,lsmod抽取內核自己的輸出接口的信息,以人性化的方式輸出.
             modinfo命令:顯示指定模塊文件的詳細信息
                    無論模塊是否被裝載,都可以用modinfo查看,modinfo就是通過獲取/lib/modules目錄下與當前內核版本同名的目錄下的模塊原數據文件,加以顯示的.模塊原數據文件類似于rpm包的元數據數據庫,可以支持查詢操作,需要專門的命令.每個文件都是經過hash格式編碼,文件里面的都是鍵值對,從中查找數據的性能是O1(恒定)的,衡量一個算法的標準,O1,On,Olocaln.. 

                    選項:
                        -F:只顯示指定字段的信息
                        -a:
                        -n:顯示文件路徑,相當于 -F filename,
                        -k:默認顯示當前內核信息,要想顯示其他內核的相關模塊,使用-k選項指明kernel,和模塊名

系統啟動流程

         模塊信息管理:
             modprobe命令:模塊動態裝載和卸載
                modpobe [-r] mod_name
                模塊動態裝卸載也可以基于文件實現,-c指明配置文件,默認是/etc/modprobe.d/*.conf文件
                選項:
                    裝載模塊: modprobe 模塊名          被依賴的模塊也會被裝載
                    卸載模塊: modprobe- r 模塊名    正在使用的和默認裝載的模塊千萬不要卸載,會影響系統使用

系統啟動流程

             depmod命令:生成模塊依賴關系
                內核模塊依賴關系文件及系統信息映射文件的生成工具
                大多數命令選項,不使用;只有在新增模塊時,這個模塊依賴于其他模塊,不得不手動改寫模塊文件.自己手動執行drpmod命令
                在對另外一個的內核文件生成依賴關系,并且保存文件也不放在/boot目錄下,才有必要使用-b,-F,-E 選項指明內核文件,和內核模塊
             模塊裝載和卸載的另一組命令:
                insmod命令:
                    insmod [filename][module options...]
                            filename:模塊文件的文件路徑,配合modinfo -n 查看模塊文件路徑

系統啟動流程

                rmmod命令:
                    rmmod [module_name(模塊名)]

系統啟動流程

        ramdisk文件的管理:
            不是直接生成的,而是由命令管理的
            (1)mkinitrd命令: centos5 但6,7也有連接
                為當前使用中的內核重新制作ramdisk文件
                文件名:
                    centos5:initrd-2.6.32-504.30.3.el6.x86_64kdump.img
                    centos6,7:initramfs-2.6.32-504.30.3.el6.x86_64.img 
                命令格式:
                    mkinitrd [OPTION...] [<initrd-image>] <kernel-version>
                        --with=<module>:除了默認的模塊之外需要裝載至initramfs中的模塊,重新制作ramdisk的重要原因,添加新的模塊.
                        --preload=<module>:initramfs所提供的模塊需要預先裝載的模塊;

                    示例: mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
            (2)dracut命令 centos 6,7
                    較為底層的生成ramdisk文件的工具
                    #dracut  [OPTION...] [<initrd-image>] <kernel-version>
                    示例:dracut /boot/initramfs-$(uname -r).img $(uname -r)

        內核信息輸出的偽文件系統:
            /proc/:內核狀態和統計信息的輸出接口.可以通過各種文件系統直接管理.同時,還提供一個配置接口,/proc/sys;
                參數:
                    只讀:信息輸出;/proc下以數字命名的目錄,只是用來輸出某進程的相關信息./例如:/proc/#/*
                    可寫:可接受用戶指定一個"新值"來實現對內核某功能或特性的配置;寫權限只有管理員擁有./proc/sys/
                            專門用來修改用于支持修改其值的參數,從而能夠讓我們實現配置內核參數的
                    偽文件系統的參數與/proc/sys/目錄下的每個文件有映射關系,都相對與/proc/sys/目錄而言,每個參數對應著我們所看到的/proc/sys/目錄下的每個文件, 文件路徑中的斜杠分隔符替換成點號,就成為參數名;
                        示例:net/ipv4/ip_forward相當于net.ipv4.ip_forward

                修改方式:    
                    (1)sysclt命令
                        專用于查看或設定/proc/sys/目錄下參數的值
                        命令使用格式:
                            sysclt [options] [variable[=value]]
                                查看:
                                    #sysclt -a 查看全部信息
                                    #sysclt variable 指定參數名稱 variable為文件目錄的簡裝路徑,以點分隔
                                修改其值:
                                    #sysclt -w variable=value

系統啟動流程

                    (2)文件系統命令(cat,echo)
                        偽文件系統,不能使用文本編輯器去直接編輯,而應該使用重定向的方式覆蓋原值
                        查看:
                            #cat /proc/sys/PATH/TO/SOME_KERNEL_FILE    
                        設定:使用覆蓋重定向修改內核參數
                            echo "node1" > /proc/sys/kernel/hostname

系統啟動流程

                        注意:上述兩種方式的設定僅當前內核有效,內核或系統重啟,配置失效
                    (3)配置文件
                        有可能是兩種文件,
                        centos 5,6: /etc/sysctl.conf 
                        centos7:    /etc/sysctl.d/*.conf 分隔成多段配置
                        修改配置文件,不會立即生效,下次啟動系統
                        立即有效:重讀此配置文件,通知讓sysctl命令重讀此文件,并根據此文件的設定,來修改內核參數相關值即可
                            sysctl -p [/PATH/TO/CONFLG_FILE] 從指定文件中加載內核參數的相關設定,默認讀取/etc/sysctl.conf,可指定其他文件,但最好在/etc/sysctl.d/目錄下.
                內核參數:
                    1.net.ipv4.ip_forward,核心路由轉發功能
                    2./proc/sys/vm/drop_caches:回收內存
                        0:
                        1:
                        2:
                    3./proc/sys/kernel.hostname:主機名
                    4./proc/sys/net/ipv4/icmp_exho_ignore_all 忽略別人ping自己,自己可以ping 別人
         /sys/目錄:
                掛載的是sysfs:輸出內核識別出的各硬件設備的相關屬性信息,也有內核對硬件特性的可設定參數;對此些參數的修改,即可定制硬件設備工作特性;
                    [root@Wencx ~]# ls /sys
                    block  bus  class  dev  devices  firmware  fs  hypervisor  kernel  module  power
                    塊設備,總線,
                    不同目錄,通過不同視角對各設備劃分的類別;根據總線劃分,根據類別劃分等等,另外也會根據某些特殊內容做些不同類的輸出,或者說很多文件,很多設備所輸出的位置不止一個目錄,但是在多個目錄下指向的同一個文件或設備.

                對一個linux主機來講,每一個硬件設備被訪問就要有設備文件,設備文件在/dev/目錄下,內核怎么知道不同用戶會有哪些硬件設備呢?事先不得而知.那應該準備怎樣的設備文件來讓內核識別呢?不知道的情況下,只能全部列出所有的設備文件,linux內核2.4以后在/dev/目錄下有兩萬多個設備文件,無法預測用戶用到哪些設備,所以把用戶但凡用到的全創建出來,那么有兩個問題?一.用戶使用的很少,大多數文件浪費,雖不占用磁盤空間,但文件數量過大,二,沒辦法通過設備文件判斷某個設備的存在./sys/目錄在linux2.6內核引入后,使得我們能夠按需創建設備文件,意思是說,每一次當內核系統完成自身初始化的時候,它會自動探測識別出每一個硬件設備信息,而后在把設備信息在系統啟動完后,在內核初始化完后,在根文件系統掛載后,在重新探測輸出到/sys/目錄下,有多少硬件都在/sys/目錄下顯示.但是有些設備沒有設備文件,就會臨時讀取/sys/目錄下的設備信息,給它按需創建設備文件.對/dev/目錄來說至關重要.

                udev:通過讀取/sys/目錄下的硬件設備信息按需為各硬件設備創建設備文件.是用戶空間程序,不能直接跟硬件打交道,/sys/目錄的存在才讓udev讀取硬件設備信息.專用命令:devadmin,hotplug;

                當根文件掛載完成后,系統初始化已經結束,系統就不會輸出硬件信息./sys/目錄的存在就會強制內核重新輸出一遍內核信息,把內核中的各硬件設備信息輸出至/sys/目錄下,而這時候udev就會通過讀取/sys/目錄下的硬件設備信息按需為各硬件設備創建設備文件.

                /dev/目錄下許多文件是Udev創建的,還有一些是內核創建的,比如說內核還要識別/sda硬盤,如果不能識別sda硬盤,標識為一個設備的話,怎么掛載設備?為了讓設備訪問正常,內核自動通過devtmpfs(設備臨時文件系統),為每個內核必須用到的設備創建一個設備文件,這些設備文件可以在根文件系統掛載以后,從內核直接移到/dev/目錄下,但不是完全移動,剩下的拷到udev,

                udev為設備創建設備文件時,會讀取其事先定義好的規則文件,一般在/etc/udev/rules.d目錄下,以及在/usr/lib/rules.d/目錄下;

                /etc/udev/rules.d/70-persistent-net.rules文件,更改網卡配置文件的定義,并更改

原創文章,作者:wencx,如若轉載,請注明出處:http://www.www58058.com/45996

(0)
wencxwencx
上一篇 2016-09-13 09:17
下一篇 2016-09-13 09:50

相關推薦

  • bash的基礎特性

    1、Bash的命令補全      使用tab鍵可以實現命令補全或者路徑補全 2、Bash的命令行展開      使用~,可以展開為用戶的家目錄;             例如#cd ~ 表示切換目錄到當前用戶家目錄中   &nbs…

    Linux干貨 2016-11-02
  • vsftpd 配置文件的一些設置

    ftp:File Transfer protocol 文件傳輸協議 兩個連接: tcp:命令連接 tcp:數據連接 主動模式:服務器端通過20端口主動連接客戶端,客戶端監聽在于服務器端的建立連接的端口+1上,服務器工作在tcp/20 被動模式:客戶端使用自己與服務器端建立端口+1上連接客戶端的隨機端口 防火墻上連接追蹤 數據要流失化文本:文件流二進制 c/s…

    Linux干貨 2017-09-10
  • MySQL半同步配置

    先配置主從服務器,過程見另一篇博庫 就是先搭一個主從服務器,然后 1、先在主節點上安裝半同步復制的主節點專用插件 MariaDB [(none)]> SHOW PLUGINS;這條命令可以查看有哪些插件可以用 2、從節點也一樣先裝插件 從節點上先停止線程 STOP SLAVE; 主節點上 從節點上 START SLAVE; 這里需要手動的停止一下線程,…

    Linux干貨 2016-11-21
  • Mariadb數據庫復制系列(二):主主復制

       實驗二:MySQL雙主復制架構的實現 雙主的實現方式與主/從類似,僅是兩個主機即使主節點,又是對方的從節點雙主模型容易造成數據的不一致性,因此要慎用! 1、實驗環境 2、在兩個節點上安裝mariadb-server服務 3、修改兩個節點的服務器配置文件 4、兩個節點上各自啟動服務,各授權一個具有復制權限的用戶 5、查看兩個節點的二進制日志的狀態 6、在…

    Linux干貨 2016-11-24
  • Boot目錄下內容丟失導致系統無法啟動

    Boot目錄下內容丟失導致系統無法啟動 筆者朋友近期在一次學習過程中不慎將虛擬機中boot目錄下內容丟失,導致系統無法啟動。當然此前他并不知道是這樣,只是應為莫名的彈出框報錯所有導致系統無法啟動。此后朋友將此故障告知筆者,筆者本身其實也是小白剛剛學習linux不就,但是對這些稀奇古怪的故障感覺很有興趣,所以筆者就掉進坑里搞了好久才搞出來點眉目來。為了讓更多學…

    Linux干貨 2016-10-24
  • 淺述sed命令

    1、sed工作原理       sed(stream editor)是一種流編輯器,本身也是一個管道命令,可以分析編輯標準輸入(standard input),包括對數據進行替換、刪除、新增、選取特定行等等。運行時以行為單位,每次只處理一行的內容,因此它又被稱為行編輯器。sed還可與正則表達式配合使用,從而簡…

    Linux干貨 2016-08-10
欧美性久久久久