Linux系統啓動過程詳解

1)BIOS自檢
2)啓動Grub/Lilo
3)加載內核
4)執行init進程
5)通過/etc/inittab文件進行初始化
6)登陸Linux

1)BIOS自檢
  a)POST(Power On Self Test),對硬件進行檢測
  計算機在通電後首先由BIOS進行自檢,即所謂的POST(Power On Self Test),對硬件進行檢測
  依據BIOS內設置的引導順序從硬盤、軟盤或CDROM中讀入"引導塊"
      在PC中,Linux是從BIOS中的地址0xFFFF0處開始的
  BIOS的第一個步驟是加電自檢(POST),對硬件進行檢測
        第二個步驟是進行本地設備的枚舉和初始化
  BIOS由兩部分組成: POST代碼和運行時服務
  當POST完成後,它從內存中清理出來,但BIOS運行時服務依然保留在內存中,目標操作系統可以使用這些服務
  要引導一個操作系統,BIOS運行時會按照CMOS的設置的順序來搜索處於活動狀態並可引導的設備:軟盤、CD-ROM、硬盤上的分區、網絡上的某個設備、USB(通常Linux是從硬盤引導的
  主引導記錄MBR中包含主引導加載程序。MBR是一個512字節大小的扇區,位於磁盤上的第一個扇區中(0道0柱面1扇區))當MBR被加載到RAM中之後,BIOS會把控制權交給MBR
 
  b)提取MBR的信息
  要看MBR的內容,請使用下面的命令
  #從/dev/sda上讀取前512個字節的內容,並將其寫入mbr.bin文件中
  [root@localhost pam.d]# dd if=/dev/sda of=mbr.bin bs=512 count=1
 
  #以十六進制和ASCII碼格式打印這個二進制文件的內容
  [root@localhost pam.d]# od -xa mbr.bin
0000000 48eb 0090 d08e 00bc fb7c d88e b9fc 0080
          k   H dle nul  so   P   < nul   |   {  so   X   |   9 nul nul
0000020 f48b 00bf 8e06 f3c0 a566 2fea 0006 1000
         vt   t   ? nul ack  so   @   s   f   %   j   / ack nul nul dle


2)啓動GRUB/Lilo
  GRUB和LILO都是引導加載程序,它們會引導操作系統。當機器引導它的操作系統時,BIOS會讀取引導介質上最前面的512字節(即MBR: master boot record)
 
3)加載內核
  當內核映像被加載到內存後,內核階段就加開始了
  內核映像並不是一個可執行的內核,而是一個壓縮過的內核映像。通常它是一個zImage(壓縮映像,小於512KB)或bzImage(較大的壓縮映像,大於512KB),它是提前使用zlib進行壓縮的
  在這個內核映像前面是一個例程,它實現少量硬件設置,並對內核映像中包含的內核進行解壓,然後將其放入高端內存中,如果有初始RAM磁盤映像,就會將它移動到內存中,並標明以後使用,然後此例程會調用內核,並開始啓動內核引導的過程
  在GRUB命令中,我們可以使用initrd映像引導一個特定的內核,方法如下:
  grub> kernel /bzImage-2.6.14.2
  [Linux-bzImage, setup=0x1400, size=0x29672e]
 
  grub>initrd /initrd-2.6.14.2.img
  [Linux-initrd @ 0x5f13000, 0xcc199 bytes]
 
  grub> boot
  Uncompressing Linux... Ok, booting the kernel.
 
  如果不知道要引導的內核的名稱,只需使用/然後按下Tab鍵,就會顯示內核和initrd映像列表
 
  對grub命令行進行加密
  a)使用命令/sbin/grub-md5-crypt來產生grub使用的密碼
  [root@localhost pam.d]# /sbin/grub-md5-crypt
   Password:
   Retype password:
   $1$3YbPF$zFVRY6J8VxNR9Ok4fXRkr1

  b)修改/etc/grub.conf加入password --md5 $1$3YbPF$zFVRY6J8VxNR9Ok4fXRkr1 一定要放在title之前
  這樣重啓系統時在grub的啓動grub菜單時,想再按e命令進行編輯時,必須先按p鍵後輸入密碼才成
 
4)執行init進程
  init進程是所有進程的起點,內核在完成內核引導後,即在本線程(進程)空間內加載init程序,它的進程號爲1
  init進程是所有進程的發起者和控制者
  init進程有兩個作用:
    扮演終結父進程的角色:所有的孤兒進程都會被init進程接管
    進入某個特定的運行級別時運行相應的程序,以此對各種運行級別進行管理,這個作用由/etc/inittab文件定義的
   
5)通過/etc/inittab文件進行初始化
  init進程的工作是根據/etc/inittab來執行相應的腳本進行系統初始化,如設置鍵盤、字體,裝載模塊,設置網絡等,對於RedHat來說,按以下順序執行
  a)執行/etc/rc.d/rc.sysinit(由init執行的第一個腳本)
    此步可進行的工作有:
    設置$PATH變量
    配置網絡
    爲虛擬內存啓動交換
    設置系統的主機名
    檢查root文件系統,以進行必要的修復
    檢查root文件系統的配額
    爲root文件系統打開用戶和組的配額
    以讀/寫的方式重新裝載root文件系統
    清除被裝載的文件系統表/etc/matb
    把root文件系統輸入到mtab
    使用系統爲裝入模塊做準備
    查找模塊的相關文件
    檢查文件系統,以進行必要的修復
    加載所有其他文件系統
    清除幾個/etc文件,如/etc/mtab、/etc/fastboot和/etc/nologin
    刪除UUCP的lock文件
    刪除過時的子系統文件
    刪除過時的pid文件
    設置系統時鐘
    打開交換
    初始化串行端口
    裝入模塊
   
   b)執行/etc/rc.d/rcX.d[KS]
    首先終止K開頭的服務(用來關閉一個服務),然後啓動S開頭的服務(用來啓動一個服務)
    對每一個運行級別來說,在/etc/rc.d子目錄中都有一個對應的下級目錄。
    這些運行級別的下級子目錄的命名方法上rcX.d, 其中X就是代表運行級別的數字
    在各個運行級別的子目錄中,都建立有到/etc/rc.d/init.d子目錄中命令腳本程序的符號鏈接
    鏈接的名稱在K與S後有一個數字,表示執行順序,數字小的先執行如K01tog-pegasus  、 S00microcode_ctl
    對以K開頭的腳本執行時系統會傳遞stop參數,而S開頭的腳本系統會傳遞start參數
   
   c)執行/etc/rc.d/rc.local
    Redhat中運行模式2,3,5都把/etc/rc.d/rc.local作爲初始化腳本中的最後一個文件,所以用戶可以自己在這個文件中添加一些需要在其他初始化工作之後,登陸之前執行的命令
 
 
6)執行/bin/login
   login程序會提示使用者需輸入帳號與密碼,接着編碼並確認密碼的正確性,若二者相合,則爲使用者進行初始化環境,並將控制權交給shell,即等用戶登錄。
 
   ----------------至此,Linux啓動過程全部結束----------------------
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章