系統啓動和內核管理

系統啓動和內核管理


CentOS 5和6的啓動流程  

服務管理

Grub管理  

自制Linux  

啓動排錯  

編譯安裝內核


Linux組成


Linux: kernel+rootfs 

kernel: 

  進程管理、

  內存管理、

  網絡管理、

  驅動程序、

  文件系統、

  安全功能 

rootfs:程序和glibc 

  庫:函數集合, function, 調用接口(頭文件負責描述) 

    過程調用:procedure,無返回值 

    函數調用:function 程序:二進制執行文件  

內核設計流派: 

    單內核(monolithic kernel):Linux 把所有功能集成於同一個程序 

    微內核(micro kernel):Windows, Solaris 每種功能使用一個單獨子系統實現



    Linux內核特點: 支持模塊化:.ko(內核對象) 

        如:文件系統,硬件驅動,網絡協議等 支持內核模塊的動態裝載和卸載  

    組成部分: 

        核心文件:/boot/vmlinuz-VERSION-release ramdisk:

        輔助的僞根系統

            CentOS 5: /boot/initrd-VERSION-release.img 

            CentOS6,7: /boot/initramfs-VERSION-release.img 

        模塊文件:/lib/modules/VERSION-release



centos6啓動流程


1.加載BIOS的硬件信息,獲取第一個啓動設備。 

2.讀取第一個啓動設備MBR的引導加載程序(grub)的啓動信息 

3.加載核心操作系統的核心信息,核心開始解壓縮,並嘗試驅 動所有的硬件設備。 

4.核型執行init程序並獲取運行信息。 

5.Init執行/etc/rc.d/rc.sysinit文件。 

6.啓動核心的外掛模塊(/etc/modprobe.conf)。 

7.Init執行運行的各個批處理文件(scripts). 

8.Init執行/etc/rc.d/rc.local. 

9.執行/bin/login程序,等待用戶登錄。 

10.登錄之後開始以Shell控制主機。


啓動流程


 POST:Power-On-Self-Test,加電自檢,是BIOS功能的一個主要部 分。負責完成對CPU、主板、內存、硬盤子系統、顯示子系統、串並行接 口、鍵盤、CD-ROM光驅等硬件情況的檢測。 ROM:BIOS,Basic Input and Output System,保存着有關計 算機系統最重要的基本輸入輸出程序,系統信息設置、開機加電自檢程序和 系統啓動自舉程序等。 RAM:CMOS互補金屬氧化物半導體,保存各項參數的設定 按次序查找引導設備,第一個有引導程序的設備爲本次啓動設備  


 bootloader: 引導加載器,引導程序 

     windows: ntloader,僅是啓動OS 

     Linux:功能豐富,提供菜單,允許用戶選擇要啓動系統或不同的內 核版本;把用戶選定的內核裝載到內存中的特定空間中,解壓、展開,並把 系統控制權移交給內核 

 LILO:LInux LOader 

 GRUB: GRand Unified Bootloader 

     GRUB 0.X: GRUB Legacy, GRUB2


MBR: 446: bootloader, 64: 分區表, 2: 55AA

GRUB: primary boot loader : 1st stage,1.5 stage secondary boot loader :2nd stage,分區文件

kernel: 

    自身初始化: 

        探測可識別到的所有硬件設備 

        加載硬件驅動程序(可能藉助於ramdisk加載驅動) 

        以只讀方式掛載根文件系統 

        運行用戶空間的第一個應用程序:/sbin/init


init程序的類型:

     SysV: init, CentOS 5之前 

         配置文件:/etc/inittab

     Upstart: init,CentOS 6 

         配置文件:/etc/inittab, /etc/init/*.conf

     Systemd:systemd, CentOS 7 

         配置文件:/usr/lib/systemd/system /etc/systemd/system


     ramdisk:  

         內核中的特性之一:使用緩衝和緩存來加速對磁盤上的文件 訪問 

             ramdisk --> ramfs 提高速度 

             CentOS 5: initrd,  工具程序:mkinitrd 

             CentOS 6: initramfs, 工具程序:mkinitrd, dracut  

    系統初始化: POST --> BootSequence (BIOS) --> Bootloader(MBR) --> kernel(ramdisk) --> rootfs(只讀) -> init(systemd)



     /sbin/init CentOS 5  

         運行級別:爲系統運行或維護等目的而設定;0-6:7個級別 

         0:關機 

         1:單用戶模式(root自動登錄), single, 維護模式 

         2: 多用戶模式,啓動網絡功能,但不會啓動NFS;維護模式 

         3:多用戶模式,正常模式;文本界面 

         4:預留級別;可同3級別 

         5:多用戶模式,正常模式;圖形界面 

         6:重啓  

     默認級別: 3, 5 切換級別:init #  

     查看級別:runlevel ; who -r


 init初始化


init讀取其初始化文件:/etc/inittab 

初始運行級別(RUN LEVEL) 

系統初始化腳本 

對應運行級別的腳本目錄 

捕獲某個關鍵字順序 

定義UPS電源終端/恢復腳本 

在虛擬控制檯生成getty 

在運行級別5初始化X


CentOS5的inittab文件


配置文件:/etc/inittab  

    每一行定義一種action以及與之對應的process 

    id:runlevel:action:process action: 

    wait: 切換至此級別運行一次; 

    respawn:此process終止,就重新啓動之 

    initdefault:設定默認運行級別;process省略 

    sysinit:設定系統初始化方式,此處一般爲指定 

        /etc/rc.d/rc.sysinit 

    ca::ctrlaltdel:/sbin/shutdown -t3 -r now 

    id:3:initdefault: 

    si::sysinit:/etc/rc.d/rc.sysinit 

    l0:0:wait:/etc/rc.d/rc 0 

    l1:1:wait:/etc/rc.d/rc 1... 

    l6:6:wait:/etc/rc.d/rc 6



CentOS6 /etc/inittab和相關文件 


/etc/inittab 

    設置系統默認的運行級別 

        id:3:initdefault:

/etc/init/control-alt-delete.conf

/etc/init/tty.conf

/etc/init/start-ttys.conf  

/etc/init/rc.conf  

/etc/init/prefdm.conf



用戶空間啓動流程


/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*: K##*:##運行次序;數字越小,越先運行;數字 越小的服務,通常爲依賴到別的服務 

        S*: S##*:##運行次序;數字越小,越先運行;數字 越小的服務,通常爲被依賴到的服務 


   for srv in /etc/rc.d/rcN.d/K*; do 

       $srv stop 

   done for 


   srv in /etc/rc.d/rcN.d/S*; do 

       $srv start 

   done



   chkconfig命令



 chkconfig命令  

     查看服務在所有級別的啓動或關閉設定情形: 


     chkconfig [--list] [name]  

     添加: 

         SysV的服務腳本放置於/etc/rc.d/init.d (/etc/init.d) 

         chkconfig --add name 

         #!/bin/bash 

         #LLLL 表示初始在哪個級別下啓動,-表示都不啓動 

         # chkconfig: LLLL nn nn  

     刪除: 

         chkconfig --del name 修改指定的鏈接類型 

         chkconfig [--level levels] name <on|off|reset> 

         --level LLLL: 指定要設置的級別;省略時表示2345

          ntsysv命令



xinetd管理的服務 



service 命令:

    手動管理服務 service 服務 start|stop|restart 

    service --status-all  

瞬態

(Transient)服務被xinetd進程所管理 

進入的請求首先被xinetd代理 

配置文件:/etc/xinetd.conf、/etc/xinetd.d/<service> 

與libwrap.so文件鏈接 

用chkconfig控制的服務: 

    chkconfig tftp on



破解root口令 



總結:/sbin/init --> (/etc/inittab) --> 設置默認運行級 別 --> 運行系統初始腳本、完成系統初始化 --> (關閉對應 下需要關閉的服務)啓動需要啓動服務 --> 設置登錄終端

CentOS 6 init程序爲: upstart, 其配置文件: /etc/inittab, /etc/init/*.conf,配置文件的語法 遵循 upstart配置文件語法格式,和CentOS5不同



grub legacy


 CentOS 6啓動流程: POST --> Boot Sequence(BIOS) --> Boot Loader --> Kernel(ramdisk) --> rootfs --> switchroot --> /sbin/init ->(/etc/inittab, /etc/init/*.conf) --> 設定默認運行級別 --> 系統 初始化腳本rc.sysinit --> 關閉或啓動對應級別的服務 --> 啓動終端  


 grub: GRand Unified Bootloader 

 grub 0.x: grub legacy 

 grub 1.x: grub2 

 grub legacy: 

     stage1: mbr 

     stage1_5: mbr之後的扇區,讓stage1中的bootloader 能識別stage2所在的分區上的文件系統 

     stage2:磁盤分區(/boot/grub/)



 配置文件:/boot/grub/grub.conf <-- /etc/grub.conf stage2及內核等通常放置於一個基本磁盤分區  


 功用:  

     (1) 提供啓動菜單、並提供交互式接口 

         a:內核參數 

         e: 編輯模式,用於編輯菜單 

         c: 命令模式,交互式接口  

     (2) 加載用戶選擇的內核或操作系統 

         允許傳遞參數給內核 

         可隱藏啓動菜單  

     (3) 爲菜單提供了保護機制 

         爲編輯啓動菜單進行認證 

         爲啓用內核或操作系統進行認證



識別硬盤設備: 

    (hd#,#) 

    hd#: 磁盤編號,用數字表示;從0開始編號 

    #: 分區編號,用數字表示; 從0開始編號 

    (hd0,0) 第一塊硬盤,第一個分區

手動在grub命令行接口啓動系統: 

   grub> root (hd#,#) 

   grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE 

   grub> initrd /initramfs-VERSION-RELEASE.img 

   grub> boot



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


default=#: 設定默認啓動的菜單項;落單項(title)編號從0開始 

timeout=#:指定菜單項等待選項選擇的時長 

splashp_w_picpath=(hd#,#)/PATH/TO/XPM_FILE:菜單背景圖片文件路徑 

hiddenmenu:隱藏菜單 password [--md5] STRING: 啓動菜單編輯認證 

title TITLE:定義菜單項“標題”, 可出現多次 

root (hd#,#):grub查找stage2及kernel文件所在設備分區;爲grub“根” 

kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:啓動的內核 

initrd /PATH/TO/INITRAMFS_FILE: 內核匹配的ramfs文件 

password [--md5] STRING: 啓動選定的內核或操作系統時進行認證



grub加密 


grub-md5-crypt命令  

破解root口令: 

    啓動系統時,設置其運行級別1  


   進入單用戶模式: 

       (1) 編輯grub菜單(選定要編輯的title,而後使用e命令); 

       (2) 在選定的kernel後附加 1, s, S或single都可以; 

       (3) 在kernel所在行,鍵入“b”命令



grub安裝 


 安裝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#)



自制linux系統



分區並創建文件系統 

    fdisk /dev/sdb 

    分兩個必要的分區 

    /dev/sdb1對應/boot   /dev/sdb2對應根 

    / mkfs.ext4 /dev/sdb1  

掛載boot 

     mkdir /mnt/boot 

     mount /dev/sdb1 /mnt/boot  

安裝grub 

     grub-install --root-directory=/mnt /dev/sdb



 恢復內核和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

 

建立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


創建一級目錄 

        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}

複製bash和相關庫文件


救援環境



在根文件系統無法使用時需要,如/bin/mount刪除  

對系統沒有特殊要求  

從光盤引導(boot.iso或者安裝光盤#1)  

從USB盤(由boot.iso製作)引導


文件系統重組 

    Anaconda將會詢問是否應該掛載文件系統 

    /mnt/sysp_w_picpath/* 

    /mnt/stage2 

    $PATH包括硬盤的目錄  

文件系統節點 

    提供系統特定的設備文件 

    mknod瞭解major/minor #’s


系統配置文件丟失修復



系統在引導期間,很重要的一個過程就是init進程讀取其配 置文件/etc/inittab,啓動系統基本服務程序及默認運行 級別的服務程序完成系統引導,如果/etc/inittab誤刪除 或修改錯誤,Linux將無法正常啓動。此時,只有通過救援 模式纔可以解決此類問題。  


有備份文件的回覆方法  

沒有備份文件的恢復辦法


有備份文件的恢復辦法: 進入救援模式,執行chroot命令後,如果有此文件 的備份(強烈建議系統中的重要數據目錄,如/etc 、/boot等要進行備份),直接將備份文件拷貝回 去,退出重啓即可。如果是配置文件修改錯誤,如 比較典型的/boot/grub/grub.conf及/etc/passwd 的文件修改錯誤,也可以直接修正恢復。假設有備 份文件/etc/inittab.bak,則在救援模式下執行: 

sh-3.1# chroot /mnt/sysp_w_picpath 

sh-3.1# cp /etc/inittab.bak /etc/inittab



沒有備份文件的恢復辦法 如果一些配置文件丟失或軟件誤刪除,且無備份,可以通過重新 安裝軟件包來恢復,首先查找到/etc/inittab屬於哪一個RPM包 

# chroot /mnt/sysp_w_picpath 

# rpm -qf /etc/inittab initscripts-9.03.49-1.el6.centos.x86_64 

退出chroot模式: 

# exit 

掛載存放RPM包的安裝光盤(在救援模式下,光盤通常掛載在 /mnt/source目錄下):


# mount /dev/sr0 /mnt/source CentOS6系統的RPM包存放在光盤Package目錄下,另外,因 爲要修復的硬盤系統的根目錄在/mnt/sysp_w_picpath下,需要使用-root選項指定其位置。覆蓋安裝/etc/inittab文件所在的RPM 包: 

# rpm -ivh --replacepkgs | force /mnt/source/Packages/ initscripts-9.03.49-1.el6.centos.x86_64.rpm 其中的rpm命令選項“--replacepkgs”表示覆蓋安裝,執行完成 後,即已經恢復了此文件。



如果想只提取RPM包中的/etc/inittab文件進行恢復,可以在進 入救援模式後,執行命令: 

# rpm2cpio /mnt/source/Packages/initscripts-9.03.491.el6.centos.x86_64.rpm| cpio -idv ./etc/inittab 


# cp etc/inittab /mnt/sysp_w_picpath/etc 注意此命令執行時不能將文件直接恢復至/etc目錄,只能提取到 當前目錄下,且恢復的文件名稱所在路徑要寫完整的路徑。提取 文件成功後,將其複製到根分區所在的/mnt/sysp_w_picpath目錄下相 應位置即可




內核編譯


單內核體系設計、但充分借鑑了微內核設計體系的優點,爲 內核引入模塊化機制。  


內核組成部分: 

    kernel: 內核核心,一般爲bzImage,通常在/boot目錄 下,名稱爲vmlinuz-VERSION-RELEASE;  


kernel object: 內核對象,一般放置於 

    /lib/modules/VERSION-RELEASE/ 

      [ ]: N 

      [M]: M 

      [*]: Y 

      輔助文件:ramdisk 

      initrd 

      initramfs



內核版本


運行中的內核: 

    uname命令: 

    uname - print system information 

    uname [OPTION]... 

        -n: 顯示節點名稱; 

        -r: 顯示VERSION-RELEASE; 

        -a:顯示所有信息



內核模塊命令



lsmod命令: 顯示由核心已經裝載的內核模塊 

    顯示的內容來自於: /proc/modules文件

modinfo命令: 顯示模塊的詳細描述信息 

    modinfo [ -k kernel ]  [ modulename|filename... ] 

        -n: 只顯示模塊文件路徑 

        -p: 顯示模塊參數 

        -a: author 

        -d: description 

        -l: license 

    lsmod |grep xfs;modinfo xfs



內核模塊管理



modprobe命令: 

    裝載或卸載內核模塊

modprobe [ -C config-file ]  [ modulename ]  [ module parame-ters... ]  


配置文件:

    /etc/modprobe.conf, 

    /etc/modprobe.d/*.conf


  modprobe [ -r ] modulename...



depmod命令: 內核模塊依賴關係文件及系統信息映射文件的生成工具  

  

  裝載或卸載內核模塊:


  insmod命令:指定模塊文件,不自動解決依賴模塊 

          insmod [ filename ]  [ module options... ] 

          insmod `modinfo –n exportfs` 

          lnsmod `modinfo –n xfs`


      rmmod 

          rmmod [ modulename ] 

          rmmod xfs 

          rmmod exportfs



/proc目錄 



/proc目錄: 內核把自己內部狀態信息及統計信息,以及可配置參數通 過proc僞文件系統加以輸出 參數:只讀:輸出信息 可寫:可接受用戶指定“新值”來實現對內核某功 能或特性的配置


/proc/sys 

    (1) sysctl命令用於查看或設定此目錄中諸多參數 

        sysctl -w path.to.parameter=VALUE 

        sysctl -w kernel.hostname=mail.magedu.com 

    (2) echo命令通過重定向方式也可以修改大多數參數的值 

        echo "VALUE" > /proc/sys/path/to/parameter 

        echo “websrv”  > /proc/sys/kernel/hostname


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章