11.開機流程、模塊管理與loader

 


Boot Loader:認識操做系統的文件格式,並據以加載核心到主存儲器執行。LILO(早期)、grub(如今主流)、spfdisk(臺灣)linux

BIOS:(Basic Input Output System)"基本輸入輸出系統"。其實,它是一組固化到計算機主板上一個ROM芯片上的程序,它保存着計算機最重要的基本輸入輸出的程序、系統設置信息、開機後自檢程序和系統自啓動程序。 其主要功能是爲計算機提供最底層的、最直接的硬件設置和控制。vim

CMOS:(Complementary Metal Oxide Semiconductor),互補金屬氧化物半導體常指保存計算機基本啓動信息(如日期、時間、啓動設置等)的芯片。有時人們會把CMOS和BIOS混稱,其實CMOS是主板上的一塊可讀寫的RAM芯片,是用來保存BIOS的硬件配置和用戶對某些參數的設定。windows

PnP設置:(plugin and play)PNP是由Microsoft提出的,意思是系統自動偵測周邊設備和板卡並自動安裝設備驅動程序,作到插上就能用,無須人工干預,是Windows自帶的一項技術。centos

MBR:(master boot record)主要啓動記錄區,每一個開機裝置的第一個啓動扇區bash

INT 13:直接經過控制磁盤控制器來訪問磁盤,但這樣就要涉及許多的硬件細節,如是OS們都藉助於BIOS的int 13h中斷例程來訪問磁盤.網絡

SATA:(Serial Advanced Technology Attachment),是由Intel、IBM、Dell、APT、Maxtor和Seagate公司共同提出的硬盤接口規範。ide

IDE:Integrated Drive Electronics)即「電子集成驅動器」,俗稱PATA並口。工具


 

/boot/vmlinuz     or   /boot/vmlinuz-verson          ----核心檔案測試

/lib/modules                ----模塊的放置位置(驅動程序多以模塊的方式存在,/lib和/必須在同一分區)ui

/boot/initrd     or   /boot/initrd-verson          ----虛擬文件系統 ,可以透過boot loader加載到內存仿真成一個根目錄,該文件系統還可提供一直程序加載開機過程須要的核心模塊(驅動程序)

/etc/inittab                ----/sbin/init的配置文件,包含runlevel等設定項目

/etc/rc.d/rc.sysinit        ----這個腳本在加載各項系統服務前設定好系統環境(不一樣的發行版可能會不一樣)【1-12】

/etc/rc.d/rc.local            ----用戶自定義的開機啓動腳本

/etc/sysconfig/                ----開機過程涉及到的配置文件

/etc/sysconfig/modules/                ----用戶自定義加載的模塊的位置

/etc/modprobe.conf                ----對應自定義模塊的配置文件(系統發現驅動程序錯誤時咱們才須要手動處理),更多信息:man modprobe.conf

/boot/vmlinuz        or        /boot/vmlinuz-verson        ----..核心

/boot/initrd     or   /boot/initrd-verson        ----..核心解壓縮須要藉助的虛擬文件系統

/lib/modules/version/kernel            or        /lib/modles/$(username -r)/kernel

/usr/src/linux                ----核心原始碼,預設不會安裝

/proc/verson                ----核心版本

/proc/sys/kernel                ----系統核心功能

 


 

 

1 . linux的開機流程分析

    1.1開機流程一覽【1-0】

    1.2BIOS,boot loader與kenel載入    

        1.1.1BIOS,開機自測與MBR

        1.1.2Boot Loader的主要功能

            注意:每一個文件系統(扇區)都會保留一個boot sector(啓動扇區)提供給操做系統安裝boot loader,若是一個系統安裝在A分區,那麼MBR和A分區的boot loader中都會保存一份boot loader.【1-1】

            一:提供選單

            二:載入核心檔案

            三:轉交其它loader

            【開機管理程序的選單功能與控制權轉交功能示意圖    1-2】

        1.1.3加載核心偵測硬件與initrd的功能

        注意:linux將核心解壓縮到主存儲器後開始接管BIOS後的工做,利用核心的功能偵測驅動周邊裝置。核心會從新偵測一遍硬件,不必定會用到BIOS偵測的硬件信息。

        # ls --format=single-column -F /boot        ----觀察與核心相關的文件【1-3】

        【 BIOS與boot loader及核心加載流程示意圖    1-4】

        1.現將/boot/initrd複製到/tmp/initrd中,等待解壓縮

        # mkdir /tmp/initrd 

        # cp /boot/initrd-2.6.18-92.el5.img  /tmp/initrd/

        # cd /tmp/initrd

        # file  initrd-2.6.18-92.el5.img        ----查看該文件的格式,發現時gzip壓縮格式

        2.將上述檔案解壓縮

        #  mv initrd-2.6.18-92.el5.img    initrd-2.6.18-92.el5.gz      ----改爲文件名改成.gz結尾,這樣一來解壓縮軟件就能夠識別了

        # gzip -d initrd-2.6.18-92.el5.gz        ----解壓縮

        # file initrd-2.6.18-92.el5        ----查看該檔案的類型信息,發現是cpio指令壓縮成的

        3.用cpio指令解壓縮

        # cpio -ivcdu <   initrd-2.6.18-92.el5 ;ll       ---解壓換個文檔看看虛擬恩建系統是什麼樣子的【1-5】

        4.觀察init檔案內重要的執行項目

        # cat /tmp/initrd/init        ----【1-6】

    1.3第一支程序Init及配置文件/etc/inittab與runlevel

        1.3.1Run level:執行等級有哪些【1-7

        # cat /etc/inittab        ----【1-8,9】

        【1-10    inittab的檔案語法】

        1.3.2init的處理流程和簡單設置方法【1-11】

    1.4init處理系統初始化流程(/ec/rc.d/rc.sysinit)

        # cat /etc/rc.d/rc.sysinit        ----查看各類服務啓動以前系統的的初始化工做【1-12】

    1.5啓動系統服務與相關啓動配置文件(/etc/rc.d/rc N & /etc/sysconfig)

        # ll /etc/rc5.d/        ----觀察run level爲5時系統服務的啓動狀況(能夠觀察一下/etc/init.d/rc這個腳本)

    1.6用戶自定義開機啓動程序(/etc/rc.d/rc.local)

    注意:一種比較麻煩的方法是將自定義的腳本放到/etc/init.d/下,而後在/etc/rc5.d/下創建連結檔,下面給出一般的簡單的方式

    # vim /etc/rc.d/rc.local            ----該文檔由/etc/rc.d/rc.sysinit在系統初始化時調用

    1.7根據/etc/inittab之設定,加載終端機或x-windows接口【1-14】

    1.8開機過程會用到的主要配置文件:/etc/modprobe.conf,/etc/sysconfig/*

        1.8.1關於模塊:/etc/modprobe.conf【1-15】

        1.8.2/etc/sysconfig/*【 1-16 幾個重要配置文件介紹】   

    1.9Runlevel的切換:runlevel,init

        注意:# init 0    ----實現關機;# init 6實現重啓

        # renlevel        ----查看主機目前的run level

        # init 3        ----暫時切換run level爲3(若是想在下次開機時依然生效須要修改/etc/inittab)

        # runlevel        ----查看變化

 


 

2 .核心與核心模塊

    /boot/vmlinuz        or        /boot/vmlinuz-verson        ----..核心

    /boot/initrd     or   /boot/initrd-verson        ----..核心解壓縮須要藉助的虛擬文件系統

    /lib/modules/version/kernel            or        /lib/modles/$(username -r)/kernel

    /usr/src/linux                ----核心原始碼,預設不會安裝

    /proc/verson                ----核心版本

    /proc/sys/kernel                ----系統核心功能

    /lib/moduels/$(uname -r)/modules.dep            ----記錄了核心支持的模塊的各項相依相

    2.1核心模塊與相依性:depmod

    # ll /lib/moduels/$(uname -r)/kernel        ----查看核心目下的子目錄【1-18】

    depmod    創建核心模塊相依性檔案的指令【1-19】

    案例一:假設作好了一個網卡驅動程序a.ko,更新核心相依性

    # cp a.ko    /lib/modules/$(uname -r)/kernel/drivers/net        ----將驅動模塊放入相應的文件夾中(系統給了特殊定義的文件夾)

    # depmod        ----該指令會將使以前作好的程序移動到標準放置目錄,並依據相關目錄的定義將全部模塊捉出來分析,最後將分析的結果寫入/lib/moduels/$(uname -  r)/modules.dep文檔中

    2.2核心模塊的觀察:lsmod,modinfo

        # lsmod        ----查看目前核心加載的所有模塊,顯示格式(模塊名稱 模塊大小 被誰使用)【1-20】

        # modinfo mi    ----查看模塊mi的詳細信息,能夠看到這個模塊的來源以及模塊的說明,該指令還能夠查看模塊的檔案(須要完整檔名)

    2.3核心模塊的加載與移除:insmod,modprobe,rmmod

        insmod    手動加載模塊指令,要求後面跟模塊(建議使用modprobe,會主動檢查模塊依賴性)

        # insmod /lib/modules/$(uname -r)/kernel/fs/cifs/cifs.ko        ---手動載這個文件系統相關的模塊,後面必須是(不會自動檢查模塊的依賴性)

        # lsmod | grep cifs        ----看看是否手動載入成功

        rmmod    手動移除模塊,若是有依賴問題將沒法移除【1-22】

        # rmmod  cifs        ----將剛剛加載的模塊移除

        modprobe    取代insmod和rmmod,自動解決依賴問題

        # modprobe cifs        ----    加載cifs文件系統模塊(不須要完整的檔名,由於完整文件名記錄在/lib/mudules/`uname -r`/modules.dep,而該指令會自動搜尋這個文件)【1-23】

        # modprobe -r cifs        ----移除這個模塊

        案例一:手動加載vfat這二個模塊,而後觀察vfat依賴的模塊

        # modprobe vfat        ----加載模塊

        # lsmod | grep vfat        ----觀察發現是fat

    2.4核心模塊的額外參數設定:/etc/modprobe.conf 

        案例一:兩個網絡卡使用贊成該模塊,設置額外的模塊參數防止衝突

        # vi /etc/modprobe.conf

        alias eth0 ne    ----eth0網卡使用ne這個模塊

        alias eth1 ne    ----eth1網卡也使用這個模塊

        options eth0 io=0x300 irq=5        ----強制指定io基地址和中斷請求

        options eth1 io=0x320 irq=7 

        注:查看系統資源配置信息

        # cat /proc/interrupts        ---- 列出正在使用的IRQ(共16條IRQ請求線)中斷資源

        # cat /proc/ioports        ----列出正在使用的io端口地址

        # cat /proc/dma        ----列出正在使用的dma(直接存儲器存取,DMA0-7)通道


3 .Boot loaler:Grub

    3.1boot loader的兩個stage

        stage1:執行MBR或者boot loader中的最小主程序(只有446bytes的存儲空間,只有最小主程序存儲在裏面)

        stage2:主程序加載配置文件(通常來講都在/boot/下面)

        #  ls -l /boot/grub        ----查看與grub有關的配置文件【1-24】

    3.2grub的配置文件/boot/grub/menu.lst與選單類型:磁盤代號,menu.lst

        注意:grub是目前應用最普遍的開機管理程序,它的特色:【1-25】

        3.2.1硬盤與分割槽在grub中的代號【1-26】

        案例:假設系統中只有一顆sata硬盤,該硬盤的第一個邏輯分割槽在Linux與grub當中的代號和檔名【1-27】

        檔名:/dev/sda5        grub中的代號:(hd0,4)

        3.2.2/boot/grub/menu.lst配置文件

        # vim  /boot/grub/menu.lst            ----看看grub的配置文件【1-28,29】

            3.2.2.1選單中提供的兩種開機方式

                第一種:直接指定核心開機(以/boot獨立分區的情形爲例)

                # vim /boot/grub/menu.lst

                title CentOS(2.6.18-92.el5)        ----    設置這個選單的標題

                    root (hda0,0)        ----root指核心檔案所在的分區而不是根目錄所在分區,這裏指的是第一塊硬盤的第一個分區(/boot在/dev/hda1爲獨立分區)

                    kernel    /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quite        ----指出核心檔名和根目錄掛載的分區(/1指的是/dev/hda2),rhgb指色彩顯示,quite是安靜模式

                    initrd    /intrd-2.6.18-92.el5.img        ----這裏指出虛擬文件系統的檔名

            或者

                 title CentOS(2.6.18-92.el5)

                    kernel    (hda0,0) /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quite      

                    initrd    (hda0,0) /intrd-2.6.18-92.el5.img   

                注:/boot獨立分區和非獨立分區各給出一個案例【1-30】 

 

                第二種:利用chain loader轉角控制權的方式

                # vim /boot/grub/menu.lst

                title windows  partition        ----該案例針對裝在/dev/hda1上的windows

                    root (hd0,0)        ----指出chain loader在第一塊硬盤的第一個分割槽內

                    chainloader    +1    ----在這個分區的第一個扇區(即boot loader的位置)

            改進(該分區須要設定爲激活狀態)

                title windows  partition 

                    hide (hd0,4)        ----隱藏/dev/hda5上的linux

                    rootnoverity (hd0,0)        ----grub默認檢查激活狀態,咱們設定不檢查這個分區

                    chainloader +1

                    makeactive        ----設定此分區爲開機碟

    3.3initrd的重要性與創建新的initrd檔案:mkinitrd

    注意:initrd未必會被用到,只有當核心不具有某種驅動以識別某些類型的文件系統是才須要,好比驅動在IDE接口的硬盤中就不須要,由於核心具有相關驅動【1-31】

    mkinitrd    重置initrd文件的指令【1-32】

    案例一

    # mkinitrd    -v initrd_$(uname -r)  $(uname -r)       ----以默認方式創建一個新的initrd檔案,指定核心的版本並顯示運做過程

    # ll initrd_*        ----能夠看看這個檔案創建好了沒【1-33】

    案例二

    # mkinitrd -v --with=8139too initrd_vbirdtest  $(uname -r)        ----建立時添加8139too這個模塊  ,意味着載入虛擬文件系統時會載入這個模塊 

    3.4測試與安裝grub:grub-install,grub sheel

    grub-install    安裝grub配置文件的指令【1-34】

    案例一:將grub安裝在目前系統的MBR下,系統所在磁盤爲/dev/hda

    # grub-install /dev/hda        ---查看/boot/grub下回發先文件已經被更新了

    案例二:將grub安裝在某個指定分區的Boot sector內(假設/dev/hda3),注意grub能夠安裝在該系統所掛載的任何一個分區的boot sector內,不妨假設爲/home掛載的位置

    # ggrub-install --root-directory=/home  /dev/hda3

    # ll /home/boot/grub/        ----    觀察安裝進來沒有

    案例三:編輯三個開機選項【1-35】 

    # vim /boot/grub/menu.lst

    default=0        ----第一個選單爲默認選單

    timeout=30        ----設置等待30秒

    splashimage=(hd0,0)/grub/splash.xpm.gz        ----選單背景圖片的位置

    #hidenmenu        ----讀秒期間顯示完整的選單畫面(預設隱藏)

    title CentOS(2.6.18-92.el5)

        root (hd0,0)       ----root指核心檔案所在的分區而不是根目錄所在分區,這裏指的是第一塊硬盤的第一個分區(/boot在/dev/hda1爲獨立分區)

        kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quite        ----指出核心檔名和根目錄掛載的分區

        initrd /initrd-2.6.18-92.el5.img        ----虛擬文件系統的檔名

    title /dev/hda1 boot sector <=====================本例中的第一個新增選單(使用/dev/hda1中的boot loader)

        root (hd0,0)

        chainloader +1        ----第一個扇區

    title MBR loader        <=========================新增第二個選單(從新讀取MBR中的boot loader)

        root (hd0)        ----用整顆硬盤的代號表示MBR

        chainloader +1

    title single use mode    <========================新增第三個選單(強制進入單人維護模式)

        root (hd0,0)       ----root指核心檔案所在的分區而不是根目錄所在分區,這裏指的是第一塊硬盤的第一個分區(/boot在/dev/hda1爲獨立分區)

        kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quite   single     ----指出核心檔名和根目錄掛載的分區、單人維護模式 

        initrd /initrd-2.6.18-92.el5.img        ----虛擬文件系統的檔名

            grub sheel     安裝grub主程序到boot loader的工具

                    1.幾個經常使用指令

                        grub> root (hdx,x)        選中含有grub目錄的分區(/boot/grub/所在的分區)

                        grub> find /boot/grub/stage1        ----看看可否找到安裝信息檔案

                        grub> find /boot/vmlinuz        ----看看可否找到核心文件

                        grub> setup (hdx,x)        ---將grub安裝在該分區上的boot sector

                        grub> setup (hdx)        ----將grub裝在相應硬盤的MBR上

                        grub> quit        ----離開grub sheel

                      2.幾個案例

                        案例一

                        # grub         ---進入grub sheel

                        grub> root (hd0,0)        ----/boot/grub在hda1中,grub能分辨出該分割槽的文件系統

                        grub> find /boot/grub/stage1        ----看看有沒有grub主程序,會顯示裝置的檔名

                        grub> find /boot/vmlinuz-2.6.18-92.el5     ----搜尋核心(/boot不獨立分區)     or     find /boot/vmlinuz-2.6.18-92.el5     ----搜尋核心(/boot獨立分區)

                        grub> setup (hd0)        ----將主程序安裝到MBR

                        grub> setup (hd0,0)        ----在/dev/hda1的boot sector中 也安裝一份

                        grub>quit        ----退出grub sheel,安裝好的grub主程序會讀取/(hd0,0)/gurb/menu.lst這個配置文件

    3.5開機前的額外功能修改

    注意:遇到開機問題時能夠嘗試在選單階段從新編輯選單,可是若是grub也故障的話就應該嘗試外部掛載方式啓動了

    3.6關於核心功能中的vga設定(修改終端分辨率)

        # grep 'FRAMEBUFFER_CONSOLE' /boot/config-2.6.18-92.el5        ----查看核心是否支持終端分辨率的修改

        CONFIG_FRAMEBUFFER_CONSOLE=y        ----這一行後面爲y表示支持,若是被註釋或者n表示不支持

        # vim /boot/grub/menu.lst

         title CentOS(2.6.18-92.el5)

                    kernel    (hda0,0) /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quite vga=790    ----分辨率設置依據表【1-36】      

                    initrd    (hda0,0) /intrd-2.6.18-92.el5.img   

    3.7BIOS沒法讀取大硬盤的問題

        緣由:BIOD沒法正確識別大硬盤中kernel和initrd存儲的實際位置

        解決方法一(系統安裝前):根據BIOS至少可以讀取1024磁柱之內的數據,分區時將/boot獨立分區且先分出這個分區給/boot    (推薦)

        解決方法二(系統安裝後):簡單一點直接重灌,即從新制做一個分區掛載/boot,保證這個新的/boot掛載的分區在1024轉之內    (推薦)

        解決方法三(後):用光驅開機,藉助grub的可編寫能力進入linux

        解決方法四:直接將硬盤的信息寫到BIOS

    3.8爲個別選單加上密碼:gurb-md5-crypt

        # grub-md5-crypt        ----經過這個指令獲得一個對密碼字串加密後的md5值,$.....(以$開頭,以 . 結尾)

        # vim /boot/grub/menu.lst        ---編輯grub配置文件對選單加密

 

        title CentOS(2.6.18-92.el5)

                    password    --md5 $.......        ----這一行具有加密的做用,注意必定是在title底下第一行,這種方式能夠經過編輯模式計入選單修改選單破解

                    kernel    (hda0,0) /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quite vga=790    ----分辨率設置依據表【1-36】      

                    initrd    (hda0,0) /intrd-2.6.18-92.el5.img  

        升級 (用戶想進入編輯模式的話就要輸入密碼)

 

    default=0        ----第一個選單爲默認選單

    timeout=30        ----設置等待30秒    

    password    --md5 $.......          ----放在總體設置處

    splashimage=(hd0,0)/grub/splash.xpm.gz        ----選單背景圖片的位置

    #hidenmenu        ----讀秒期間顯示完整的選單畫面(預設隱藏)

    title CentOS(2.6.18-92.el5)

       lock             ----在選單中增長lock字段

       kernel    (hda0,0) /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quite vga=790    ----分辨率設置依據表【1-36】      

       initrd    (hda0,0) /intrd-2.6.18-92.el5.img 

 

 


4 .開機過程當中的問題解決

    4.1忘記root密碼的解決之道

        第一步:重啓

        第二步:開機進入grub選單

        第三步:選擇一個進入詳細設定,移動到kernel那一行,e進入編輯狀態

        grub edit> kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/ rhgb quite  single

        第四步:【ENTER】,b,這時進入單人維護模式並獲得一個sheel

        第五步:# passwd        ----重置root的密碼

        第六步:# init 5        ----進入x窗口模式

    4.2init配置文件錯誤(/etc/inittab損壞)

        第一步:重啓

        第二步:開機進入grub編輯狀態

        第三步:grub> kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/ rhgb quite  init=/bin/bash        ----由於執行init時,任何開機模式都須要讀取/etc/inittab文件,所以咱們將實際的init替換爲/bin/bash,從而掠過文件系統直接進入bash sheel

        第四步:【ENTER】,b,這時一個sheel工做

        第五步:# mount  -o remount,rw  /        ----由於根目錄在開機階段是以只讀的方式掛載的,所以咱們從新以可擦寫狀態掛載

                      # mount -a        ----根據/etc/fstab的內容進行從新掛載文件系統測試

        第六步:此時能夠進行救援了(修改/etc/inittab)

        第七步:重啓

    4.3BIOS磁盤對應的問題(device.map),兩個系統分別安裝在兩顆磁盤

    注意:此時BIOS依據設定得到第一個可開機的裝置,並讀取boot loader,即grub,但grub中對磁盤的記錄代號是依據偵測的順序編寫的,可能不對應BIOS的指定

    # vim /boot/grub/device.map        ----寫死裝置的對應

     (fd0)    /dev/fd0

    (hd0)    /dev/hda

    或者

    # grub-install  --recheck /dev/hda1    ----device.map會被主動更新

    4.4因文件系統錯誤而沒法開機

       【文件系統錯誤示意圖    1-37】

        Give root passwd for maintenance

        (or type Control-D to continue):******        ----輸入密碼取得bash

        # mount -o remount,rw   /     ----將根目錄從新掛載爲可讀寫狀態

        # fsck  /dev/md0        ----作quota時出錯的話用fsck進行檢測

        clear[Y/N]y        ----清理錯誤

    4.5利用chroot切換到另外一顆硬盤工做

    第一步:進入一個正常的linux系統(cd/u盤/硬盤)

    第二步:將故障的linux所在的分區全對應原來分區掛載的位置部進行以下掛載

    # mount /dev/hdb1  /chroot/

    # mount /dev/hdb2   /chroot/var

    # mount /dev/hdb3   /chroot/home

    # mount /dev/hdb4  /chroot/usr

    # chroot /chroot        ----更換根目錄

5.重點回顧【1-38】

6.本章習題

模擬題一:利用救援光盤來處理系統錯誤致使的沒法開機的問題

第一步:利用光盤開機,進入救援模式偵測

boot:linux rescue        ----進入救援模式的偵測,按下F5就能夠看到輸入的選項

第二步:進行相似裝機的基本設置,以後救援光盤會將偵測到的centos整合成一個chroot等待處理

第三步:chroot /mnt/sysimage        ----進入偵測到的出問題的系統,這是會獲得一個sheel

第四步:# df        ----查看出錯的系統是否被正確地掛載了

第五步:對系統進行修復

簡答題:【1-39,40】

相關文章
相關標籤/搜索