系統啟動及故障排錯和內核管理

(一)Linux組成結構

  • Linux: kernel+rootfs
    kernel: 進程管理、內存管理、網絡管理、驅動程序、文件系統、安全功能
  • rootfs: 程序和glibc
  • 庫:函數集合, function, 調用接口(頭文件負責描述)
  • 過程調用:procedure ,無返回值
  • 函數調用:function
  • 程序:二進制執行文件

(1)內核介紹

(1)Linux 內核特點:
  • 支持模塊化:.ko (內核對象)
  • 如:文件系統,硬件驅動,網絡協議等
  • 支持內核模塊的動態裝載和卸載
(2)組成部分
  • 核心文件:
  • /boot/vmlinuz- VERSION -release
  • ramdisk :輔助的偽根系統
  • CentOS 5: /boot/initrd- VERSION-release.img
  • CentOS 6,7: /boot/initramfs- VERSION -release.img
  • 模塊文件:/lib/modules/ VERSION-release

(二)CentOS6啟動流程

Linux啟動流程解析圖解

(1) POST自檢:

系統接通電源時自動檢測CPU,內存,主板,顯卡,聲卡,網卡等I/O設備,如果設備正常則進行下一啟動步驟。

(2) MBR引導

MBR(Master Boot Record) MBR記錄一般是在磁盤 0 磁道 1 扇區,共512個字節。前446個字節是BootLoder,后 4*16 的 64 個字節是存放分區信息的,最后 2 個字節是校驗信息,一般是 55AA。

(3) MBR引導GRUB(GRand Unified Bootloader)

Bootloader的工作機制:bootloader可以訪問文件系統,而內核則作為文件而存在。bootloader訪問內核文件時,是將內核文件Vmlinz所在的整個分區當作根去訪問的。我們常用的內核加載器是GRUB(Grand UnifiedBootloader),因此由grub來加載內核。

  # grub文件內部的所有內容
  [root@vinny grub]# ll
  total 280
  -rw-r--r--. 1 root root     63 Jun 19 00:39 device.map
  -rw-r--r--. 1 root root  13428 Jun 19 00:39 e2fs_stage1_5
  -rw-r--r--. 1 root root  12636 Jun 19 00:39 fat_stage1_5
  -rw-r--r--. 1 root root  11780 Jun 19 00:39 ffs_stage1_5
  -rw-------. 1 root root    771 Jun 19 00:39 grub.conf
  -rw-r--r--. 1 root root  11772 Jun 19 00:39 iso9660_stage1_5
  -rw-r--r--. 1 root root  13284 Jun 19 00:39 jfs_stage1_5
  lrwxrwxrwx. 1 root root     11 Jun 19 00:39 menu.lst -> ./grub.conf
  -rw-r--r--. 1 root root  11972 Jun 19 00:39 minix_stage1_5
  -rw-r--r--. 1 root root  14428 Jun 19 00:39 reiserfs_stage1_5
  -rw-r--r--. 1 root root   1341 Nov 15  2010 splash.xpm.gz
  -rw-r--r--. 1 root root    512 Jun 19 00:39 stage1
  -rw-r--r--. 1 root root 126148 Jun 19 00:39 stage2
  -rw-r--r--. 1 root root  12040 Jun 19 00:39 ufs2_stage1_5
  -rw-r--r--. 1 root root  11380 Jun 19 00:39 vstafs_stage1_5
  -rw-r--r--. 1 root root  13980 Jun 19 00:39 xfs_stage1_5

根據上邊的所有展示內容,發現很多后綴相同的文件device.map,menulst,stage1,stage2,以及一系列的stage1_5組成。一下是我對這些文件的解讀,說錯了請大牛糾正。

  • device.map 可能是啟動系統的時候,一些需要加載的驅動模塊,和分區信息的地圖。我們現在出門都需要地圖,更何況刻板認真的計算機。

  • menu.lst 是grub.conf的鏈接文件,當我們啟動系統的時候,會有一個選擇功能選擇菜單,等下免我會詳細介紹。

  • stage:grub引導程序過于龐大,所以在啟動過程中分為三個階段進行:第一階段存放在MBR中第二階段存放于內核文件系統中。第二階段沒有文件系統,怎么訪問呢。這個時候出現了stage1_5階段,反正就是想辦法讓第二階段啟動,所以這個地方出現了很多stage1_5為后綴的文件。

  • grub.conf 文件參數意義

     # grub.conf generated by anaconda
     default=0  # 默認啟動的內核title, 0 表示是第一個  
     timeout=5 # 默認等待時間  
     splashimage=(hd0,0)/grub/splash.xpm.gz  # 指定菜單的背景圖片的路徑。為xpm格式,采用gzip壓縮,只能為14bits色  
     hiddenmenu # 隱藏菜單  
     title CentOS 6 (2.6.32-696.el6.x86_64)  
     # 標題名,用戶可自定義
     root (hd0,0)  
     # 指定 grub 的根位置   
     # 指定 kernel 文件的位置,還要指出 root(系統啟動后) 的位置,掛載方式 ro,這項很關鍵。  
             # 加載后會啟動 init 進程。
             kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=0861b596-c806-4895-97b3-2ef308bdc6a3 nomodeset rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_NO_LVM rd_NO_DM rhgb quiet
              # 在內核啟動過程中裝載根文件系統時有用  
             initrd /initramfs-2.6.32-696.el6.x86_64.img
    

(4)引導加載器程序GRUB

(1)grub legacy

GRUB是bootloader階段的一個程序,這是Centos中最常用的引導程序,CentOS 6安裝的是grub legacy。

CentOS 6的grub legacy

按e:進入編輯模式,用于編輯菜單
編輯模式

然后按c: 進入命令模式,交互式接口
交互式界面

這個界面就和上邊聯系起來了 ,假如你不會寫的話,可以敲help就可以查看幫助。
grub>后邊需要跟上本文中grub.conf 文件參數意義里邊的內容。

(5) 進入kernel

在GRUB中選擇對應的kernel進入,然后kernel會對自身進行初始化,始化系統中各設備并做相關的配置工作,其中包括CPU、I/O、存儲設備等。運行用戶空間的第一個應用程序,在CentOS 6上是init,在CentOS 7上是Systemd。

(1)讀取/etc/inittab來讀取默認級別
    # Default runlevel. The runlevels used are:

    #   0 - halt (Do NOT set initdefault to this)
    #0:關機
    #   1 - Single user mode
    #1:單用戶模式(root, 無須登錄), single, 維護模式
    #   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
    #2: 多用戶模式,會啟動網絡功能,但不會啟動NFS;維護模式;
    #   3 - Full multiuser mode
    #3:多用戶模式,正常模式;文本界面;
    #   4 - unused
    #4:預留級別;可同3級別;
    #   5 - X11
    #5:多用戶模式,正常模式;圖形界面;
    #   6 - reboot (Do NOT set initdefault to this)
    #6:重啟
    id:5:initdefault:

注意:上邊的最后一行是制定每次啟動時后的默認啟動級別,修改它就是修改你的默認啟動級別。
如果要查看當前系統運行的init級別可使用runlevel或者who -r

(2)執行初始化系統腳本 /etc/rc.d/rc.sysinit 來初始化腳本

這個腳本里邊有很多內容,這里就不一一列舉了,只是把它做的事情給列出來。

    # 獲取網絡環境與主機類型。首先會讀取網絡環境設置文件"/etc/sysconfig/network",獲取主機名稱與默認網關等網絡環境。  
    # 打印文本歡迎信息。  
    # 掛載/etc/fstab文件中定義的其它文件系統。  
    # 激活swap  
    # 檢測根文件系統,并以讀寫方式重新掛載  
    # 決定是否啟動SELinux和udev。  
    # 接口設備的檢測  
    # 用戶自定義模塊的加載。用戶可以再"/etc/sysconfig/modules/*.modules"加入自定義的模塊,此時會加載到系統中。  
    # 加載核心的相關設置。按"/etc/sysctl.conf"這個文件的設置值配置功能。  
    # 設置系統時間(clock)。  
    # 設置終端的控制臺的級別。  
    # 設置raid及LVM等硬盤功能。  
    # 以方式查看檢驗磁盤文件系統。  
    # 進行磁盤配額quota的轉換。  
    # 重新以讀取模式載入系統磁盤。  
    # 啟動quota功能。  
    # 啟動系統隨機數設備(產生隨機數功能)。  
    # 清楚啟動過程中的臨時文件。  
    # 將啟動信息加載到"/var/log/dmesg"文件中。
(3)然后執行 /etc/rc.d/rc 腳本

當你選擇默認模式為3的時候,默認會讀取/etc/rc.d/rc3.d 下的所有腳本,來控制系統啟動的時候啟動或者關閉哪些服務。這里面的腳本大致分為以S 開頭的和以 K 開頭的腳本。 S 代表開機時啟動的,K 表示開機時不啟動。
排序的說明:服務的啟動可能會產生依賴的情況。所以無法避免的會出現排序的情況。比如說:S20S198來說會先執行S199后執行S22,是先S2S1比較,之后在比較S20S19以此類推。數字越小越先運行;數字越小的服務,通常為依賴到別的服務;

  • chkconfig命令:查看每個服務對應級別的開關,以及設置相關服務對應級別上的開關;
  • 增加服務:chkconfig --add srv_name 可以將自己寫的一些腳本,讓此命令統一管理。
  • 刪除服務:chkconfig --del srv_name 將服務刪除,意思就是服務不由chkconfig這種機制來管理
  • chkconfig srv_name {on|off}設置服務開機是否自啟動,默認管理的級別是2345. 指定默認級別,可以與其他選項一起使用

注意:正常級別下,最后啟動的一個務:S99local指向了/etc/rc.d/rc.local腳本,且有又想開機時自動運行的命令,可直接放置于/etc/rc.d/rc.local文件中;
【注意】:正常級別下,最后啟動一個服S99local沒有鏈接至/etc/rc.d/init.d一個服務腳本,而是指向了/etc/rc.d/rc.local腳本;因此,不便或不需寫為服務腳本放置于/etc/rc.d/init.d/目錄,且又想開機時自動運行的命令,可直接放置于/etc/rc.d/rc.local文件中。

(6) 手工配置系統啟動配置

(1)系統服務腳本的特點
  • 基本都可以提供start|stop|restart|status這幾個狀態值的接收
  • 服務腳本存放位置,所有的系統服務腳本都放在/etc/rc.d/init.d文件夾中
    系統服務腳本
(2)服務腳本的編寫格式

格式詳解

其中,有三行格式是必須要寫上的#!/bin/bash,#/chkconfig,#description
# chkconfig: runlevels SS KK【SS:表示開始運行的次序,KK:表示關閉程序的次序,-表示都不啟動】 因此可以手動編寫系統服務:

  • (1)把服務腳本放置/etc/init.d目錄下
  • (2)使用chkconfig –add 添加到系統服務
  • (3)重啟系統讓服務生效
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容