系統啓動流程以及內核管理

linux的組成:

 linux是單內核的系統,而windows是多個微內核的組成的操作系統 
 linux內核的作用:進程管理,內存管理,設備管理,網絡管理,硬件驅動,安全機制

啓動流程:

1,POST加電自檢
    作用:對電腦的各種硬件進行檢測,看是否正常
        ROM(主要):加載BIOS保存電腦的輸出程序,但是它是保存在內存之中
        RAM:保存電腦的各種參數設置,不然BIOS設置存不住,比如時間。並且指定對應的啓
        動項,如從光盤還是硬盤啓動
        bootloader:引導加載器,負責引導程序。解壓,展開內核,並且把控制權交給內核。如
        用GRUB啓動,在6,7版本上不一樣
2,MBR引導
    1,前446個字節放的是bootloader,中間64個字節存放磁盤的分區表,最後兩個字節是55AA
3,grub
    1,加載grub文件夾中的內容
4,kernel進行初始化
    1,以只讀的方式掛載根
    2,運行系統的第一個程序/sbin/init
    3,探測所有的硬件設備
    4,加載各種硬件的驅動程序

    在centos7中硬件的驅動程序是按照需求加載的,如果開機啓動時沒有檢測到硬件,那麼就
    不會加載相對應的驅動程序,用來節省啓動時間,讓啓動的更加迅速

    vmlinuz放着最核心的驅動文件,這個文件在光盤中存在,是紅帽公司出廠的時候打包到光
    盤中。如果丟失可以進行復制。在編譯內核或內核文件丟失時候可以用到此文件,後綴要
    加上內核的版本號(name -r)

注:硬件的驅動程序存放在/lib/modules/kernel` uname -r `/中,如果需要則加載,不需要不
加載

輔助的文件系統存放在greb下的initramfs.img文件中

注:在6,7上放的虛擬的文件系統,在跟早的系統上放的是虛擬的光盤,然而光盤佔用的磁盤
空間非常的大,從而導致啓動的時長更加長

用modeinfo 可以看到驅動模塊的詳細信息,以及驅動模塊的存放目錄

    綜上所述:在系統中特定的文件系統的根放在grub下的initramfs中,可以看到文件系統的驅
    動不是放在boot目錄中,而是放在其他目錄中。那麼在系統啓動時,並不會加載文件系統驅
    動所在的目錄。但是如果不加載文件系統驅動,則無法掛載根目錄,導致系統無法啓動。
    因此在centos中,會在grub下這個文件中會做一個這個僞根目錄,以便於啓動的時候運行

    注:查看initramfs.img文件,不過要改文件名,改成GZ後綴的文件名,改成之後在進行解
    壓縮。就可以看到操作系統的根的驅動。只有在啓動過程中有這個驅動,那麼纔可以加載
    文件系統的根

    常見問題:
        1,沒有initramfs.img文件
            解決:
                切換根目錄
                用mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)來進行修復

        2,在centos7上沒有boot目錄的內容
            解決:
                拷貝光盤裏的vmlinuz文件,加上版本號
                重啓系統即可

內核的特點:

在官網下載內核,下載之後解壓後的init目錄下存放着內核的源碼,可以查看,並修改源碼,
並且修改啓動的第一個進程

在centos6和7上對應的init文件不屬於一個包,可以用rpm來查看,因爲在這兩個系統上並不
是由一個應用程序啓動的

早期centos的加載是等待執行,可以理解成當一個進程啓動完成之後,纔會啓動另一個進
程。這樣很多缺點,如系統啓動時間過長,或者某一個應用程序無法啓動,從而導致整個系
統都無法啓動。所以在centos後期的版本中進程之間是並行執行啓動,這樣可以大大的節省
啓動時間,也可以在啓動時排除一些進程不必要的干擾

    默認啓動模式:在centos6上可以改動/etc/inittab中改開機啓動的模式,在centos7也有此
    文件,但是centos7上無法再此文件中定義啓動的模式,需要通過調用系統命令來修改系
    統的默認啓動模式,且在centos7系統中定義的只有兩種啓動模式,分別是圖形和命令行
        centos6:
            查看:runlevel
            修改:在配置文件中修改id:3:initdefault: 
            注:
                0,關機模式
                1,單用戶模式(系統進行維護,破解root口令)
                3,多用戶模式
                5,圖形界面
                6,重啓

                如在配置文件中誤修改成重啓模式,可在開機界面進入單用戶模式修改

        centos7:
            查看:systemctl get-default
            修改:
                systemctl set-default graphical.target  
                systemctl set-default multi-user.target         

系統的啓動流程:

系統啓動的第一個程序:/sbin/init
init讀取其初始化文件:
    centos6:/etc/inittab
    centos7:systemctl set-default name.target(只有/lib/systemd/system/*.target文件中AllowIsolate=yes 才能切換)

/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) 清理操作 
rc N --> 意味着讀取/etc/rc.d/rcN.d/(進行系統初始化)
    作用:在其中有很多的K開頭的文件和S開頭的文件,其中K代表是關閉,S代表是啓動,其
    中的數字代表啓動的順序

    注:
        1,在切換模式的時候/etc/rc.d/rcN.d/裏面的服務也會重新啓動一遍
        2,自己編寫的腳本在啓動時儘量往後放,因爲自己編寫的腳本需要依賴很多其他程序才
        能夠運行,當然關閉的時候要首先關閉自己編寫的腳本

        調整服務的啓動次序:
            chkconfig可以查看到當前的各個服務的啓動級別,也可以進行設置

            例:chkconfig --level 345 atd off 改這個級別下的自啓動,如果不帶任何選項,那麼則代
            表的是2-5模式之中關閉

        源碼包安裝的服務在書寫啓動腳本的格式(儘量用case語句):
            必須加上的行:
                chkconfig 2345(-) (S)96  (K)06 (設置啓動的等級,啓動和關閉的順序)
                description: test service (在centos6上加不加都可以,在5版本上必須得加上這一行,才
                能啓動對應的服務)
        美化啓動腳本,引用相應的functions文件中的action函數:
            source /etc/init.d/function
            action "xxx is stop"

        將啓動腳本通過chkconfig命令加入到啓動項裏,如果刪除可以用這個命令刪除,不然會有
        相應的緩存文件
        chkconfig add :添加服務
        chkconfig del :刪除服務

        注:在linux運行的過程中可能一些服務由於種種原因導致無法啓動,那麼切換開機啓動模式,然後在對相關進行改動即可

        如果不想用chkconfig加入到自啓動中,可以加入到rc.local中,注意這個腳本中的服務是最
        後啓動的服務

        xinetd(超級守護進程)管理的服務:
            作用:
                centos6系統中一些服務的代理服務,在centos7中交由systemd代理。在centos6中的某
                些服務會依賴於這個服務的啓動而啓動,從而來減少系統的壓力比如已經淘汰的Telnet
                服務,就是依賴於xinted服務的啓動而啓動
            對象:
                一些訪問量不多的服務,當有人訪問這個服務時纔會啓動對應的服務,可以節約一些啓
                動的資源
            啓動:
                要修改要啓動服務對應的配置文件,把disabled這一項改成no

    在生產中要註釋掉的快捷鍵,避免誤操作:ctrl alt delete 三鍵連按是重啓
            centos6:
                註釋/etc/init/control-alt-delete.conf的start on control-alt-delete這一行
            centos7:
                刪除/usr/lib/systemd/system/ctrl-alt-del.target

grub:

配置文件:
    default=#: 設定默認啓動的哪一個內核;落單項(title)編號從0開始, 
    timeout=#:指定菜單項等待選項選擇的時長
    splashimage=(hd#,#)/PATH/XPM_FILE:菜單背景圖片文件路徑(可以自定義啓動圖片,
    但是圖片的像素是640*480,後綴是xpm.gz)
    title TITLE:定義菜單項“標題”
    hiddenmenu:隱藏菜單(如果沒有,那麼不按e就可以看到啓動項)
    password [--md5] STRING: 可以爲啓動項增加密碼
    kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:啓動的內核 
    initrd /PATH/TO/INITRAMFS_FILE: 內核匹配的ramfs文件

    注: initrd必須在kernel下面,因爲要先加載文件系統

grub分區啓動的常見問題:
    1,缺少前446個字節的bookloader(一階段,進入救援模式)
        解決:
            進入救援模式下
            1:
                grub-install --root-directory=DIR(掛載的目錄) /dev/DISK(對應的分區)——————掛載對應的磁盤
            2(boot下的備份文件必須要存在):
                #] grub
                grub>root (hd0,0)—————掛載根分區 
                grub>setup (hd0)—————生成對應的MBR分區表
    2,沒有grub配置文件(二階段錯誤,出現grub提示符)
        解決:
            手動寫grub.conf配置文件
    3,沒有grub目錄和前446個字節
        解決:
            1,切換根目錄
            2,grub-install /dev/sda
            3,寫grub.conf文件
                default=0
                timeout=3
                title my linux
                kernel /vmlinuz ro root=/dev/sda1 selinux=0
                initrd /initramfs.img
                注:root (hd0,0)可寫可不寫,默認根分區是第一個分區
            4,重啓系統
    4,boot分區全部刪除
        解決:
            1,進入救援模式,開啓一個shell,切換根目錄
            2,掛載光盤,拷貝內核文件(vmlinuz),mkinitrd /boot initramfs.img `uname -r`(可以直接裝內核,不過要強制安裝內核)
            3,grub-install /dev/sda(重做MBR分區)
            4,寫grub.conf文件
            5,重啓系統
    5,刪除boot分區,刪除fstab文件(基於邏輯卷安裝的系統)
        解決:
            centos6:
                1,用fdisk命令先找到根分區的屬於哪個分區,然後用blkid命令查看當前分區有沒有邏
                輯卷,並找到對應的掛載目錄
                2,用lvdisplay可以看到邏輯卷是否處於啓用狀態,如果沒有啓用,可以用vgchange -ay可以啓用邏輯卷
                3,啓用之後編輯/etc/fstab(要在對應的根目錄下)
                4,重啓系統
                5,切換根目錄
                6,生成grub-install /dev/sda(重做MBR分區)
                7,寫grub.conf文件
            centos7:
                1,進入BIOS界面,設置光盤啓動,進入救援模式
                2,掛載光盤,並強制安裝內核
                3,安裝完成之後,製作grub配置文件grub2-install /dev/sda(重做MBR分區)
                4,用 grub2-mkconfig -o /boot/grub2/grub.cfg 生成grub.cfg文件
                5,重啓電腦
grub加密(6,7上的加密方式不一樣)
    6上加密:
        在grub.conf的配置文件中加入password這一行,後面跟上對應的密碼
            明文:
                直接輸入密碼
            密文:
                grub-md5-crypt生成密碼串
                加入配置文件password --md5 密碼串(輸入a進入單用戶模式改密碼)
    7上加密:
        明文:
            在/etc/grub.d/00_header中加入如下幾行
            cat << EOF
            set superusers='admin'
            password admin qwe123
            E0F
        密文:
            用grub2-mkpasswd-pbkdf2生成密文
            把密文寫入到配置文件之中
            g重新生成配置文件:grub2-mkconfig  -o  /boot/grub2/grub.cfg

製作小型的linux系統:

必須要有的分區:boot分區,根分區

拿到獨立的磁盤,進行分區,分區之後創建文件系統

把創建分系統掛載到系統的目錄上,並用相應的命令用grub-install生成boot下必須要的文
件(生成完成後需要檢查一下boot下的文件是否存在)

書寫grub.conf配置文件在centos6上要手動輸入,在centos7上可以用grub2-mkconfig生成對
應的文件

把根目錄掛載對應的目錄下,並創建常用文件夾,並且複製一些常用命令對應的動態鏈接庫
文件,並複製網卡的驅動模塊(modeinfo查看驅動的位置,ethtool -i 查看網卡驅動insmod可
以加載網卡模塊)

切換根目錄,檢查是否成功,成功後即可移植此磁盤到別的電腦中

創建一臺新的虛擬機把對應的磁盤加入到虛擬機之中,然後開啓虛擬機,並加載網卡驅動

注:
    使新制作的系統有網絡功能:
    查看網卡的驅動模塊:ethtool -i ech0
    查看網卡驅動模塊的所在位置,並拷貝到新的磁盤中:modinfo e1000
    啓動新的虛擬機,添加網卡驅動模塊:insmod e1000
    添加成功後用ifconfig添加網址即可通訊

proc文件夾:

作用:內存中加載的文件吧·

配置文件:/etc/sysctl 配置文件的格式中.代表目錄中的/(如路由轉發等,以及禁止ping的
功能,在centos6上是寫好的文件,在centos7上是空白,需要手動添加)
寫完配置文件後,可以用sysctl -p選項可以讓配置立即生效,可以用sysctl -a查看當前內存中
生效的配置文件(如果該文件中沒有內容,那麼需要手動添加)

清除緩存(man proc):
    echo 3 > /proc/sys/vm/drop_caches

內核編譯(通常在/boot目錄下):

編譯方法:和大部分軟件的源代碼編譯的方式差不多,但是內核中有很多的功能,要在生產
中判斷有些功能是否啓用(內核裁剪),從而加快系統的運行效率

編譯過程:
    準備好安裝編譯環境,以及10G以上內存空間,查看主機的CPU架構,下載好對應的內核
    源碼包(www.kernel.org)

    .config:準備文本配置文件

    make menuconfig:配置內核選項(看哪些功能需要,哪些功能不需要)

    make && make install (生成的內核在/lib/modules/生成對應的文件,名字就是內核的版本) 
查看當前生效的內核模塊:

    lsmod顯示由核心已經裝載的內核模塊(其實是查看/proc/modules文件)

    modinfo可以顯示所有模塊的信息,即使是沒有裝載的模塊都會顯示出來

    modprobe可以加載相應的模塊(模塊的配置文件在/etc/modprobe.d/中)

    注:insmod也可以加載和卸載模塊,不過此命令會有依賴性,所有不常用類似於rpm裝軟件包。
        modprobe在加載和卸載內核模塊的時候,不會檢查驅動的依賴性,類似於裝軟件的yum

Busybox:

作用:可以用來定製小型的Linux操作系統,比如手機系統,到各種智能的終端設備,它佔用
的空間十分小,只需要一個小型的內核和Busybox就可以運行

原理:每個命令都有相應的動態鏈接庫文件,但是這些庫文件中有些庫文件是相同的,所以
可以利用這個軟件對一些啓動的動態鏈接庫進行優化,排除掉冗餘的庫文件,從而來簡化系
統的各項功能

編譯:
    裝一些依賴的軟件包
    裝完之後下載busybox,解壓後進入其中
    make menuconfig 選一些特定的功能
    make && make install   如果出錯,執行make clean後,重新執行上面命令 
    mkdir /mnt/sysroot/ 
    cp -a _install/* /mnt/sysroot/ 

檢查:切換根目錄,看命令是否執行,如果製作小型的linux系統,那麼則需要對應的boot分區,以及相應的文件

注:busybox僅支持sh,ash,不支持bash。如果想切換根目錄致_install下,需要切換shell,或者把bash命令,以及相關的庫文件拷貝到該目錄下,即可切換

systemd:

管理啓動的軟件:可以並行啓動一些程序(取出一些程序的依耐性,在Ubantu上也有使用)

systemd啓動機制:
    基於socket的激活機制:socket與服務程序分離(有些程序是基於套接字文件啓動的程序,
    比如mysql,這個服務啓動的時候會打開相應的3306端口,在本地打開MySQL是按照套接
    字文件進行啓動,而遠程打開則是通過3306端口進行訪問) 
    基於d-bus的激活機制
    基於device的激活機制  
    基於path的激活機制 

優點:可以同時啓動多個應用服務,啓動成功沒有任何提示,啓動不成功會報錯
缺點:不止任何的擴展,但是在6上面可以支持定義的一些啓動項
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章