(一)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啟動流程
(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。
按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 表示開機時不啟動。
排序的說明:服務的啟動可能會產生依賴的情況。所以無法避免的會出現排序的情況。比如說:S20
和S198
來說會先執行S199
后執行S22
,是先S2
和S1
比較,之后在比較S20
和S19
以此類推。數字越小越先運行;數字越小的服務,通常為依賴到別的服務;
-
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)重啟系統讓服務生效