背景知識
計算機啟動基本流程如下
1)首先開機自檢-POST,
2)自檢通過后根據CMOS的配置找到第一個可啟動磁盤的MBR中的boot loader程序(一般在啟動磁盤的第一個物理扇區,占446字節),並把控制權交給boot loader
3)bootloader完成操作系統內核的加載,並把控制權交給內核
4)內核繼續完成系統的啟動
說明:
1)POST,會檢查自身硬件是否正常. 在BIOS進行設置,管理
2)BIOS:保存着系統最重要的基本輸入輸出程序,系統信息設置、開機上電自檢程序和系統啟動自舉程序等。
3)CMOS:主板上的一塊可讀寫的RAM芯片,主要用來保存當前系統的硬件配置和操作人員對某些參數的設定。由系統通過一塊后備電池供電,因此無論是在關機狀態中,還是遇到系統掉電情況,CMOS信息都不會丟失。現在多數廠家將CMOS設置程序做到了 BIOS芯片中,在開機時通過按下某個特定鍵就可進入CMOS設置程序而非常方便地對系統進行設置,因此這種CMOS設置又通常被叫做BIOS設置。
4)MBR:主引導記錄,一共512字節,詳細內容如下
446: bootloader
64: fat--磁盤分區表
2: 55AA--bootloader是否有效的標記
要了解boot loader,首先需要說下boot sequnence.
5)BOOT Sequence: 按次序查找各引導設備,第一個有引導程序的設備即為本次啟動用到設備。引導設備中用到的程序叫 bootloader(引導加載器)。
例如:
windows上的引導加載器叫ntloader
Linux:LILO:LInux loader
為了能夠引導不同的操作系統,於是有了GRUB
GRUB: GRand Uniform Bootloader---統一引導加載器,可引導多個引導系統,現在發展到第2代。
GRUB 0.X: GRUB Legacy
GRUB 1.x: GRUB2---2代GRUB,完全重寫了
功能:提供一個菜單,允許用戶選擇要啟動系統或不同的內核版本;把用戶選定的內核裝載到內存中的特定空間中,然后解壓、展開,並把系統控制權移交給內核;
6)內核加載后需要解壓,展開,然后進行自身初始化,包括如下內容:
1)探測可識別到的所有硬件設備;
2)加載硬件驅動程序;(有可能會借助於ramdisk加載驅動)
3)以只讀方式掛載根文件系統;
4)運行用戶空間的第一個應用程序:/sbin/init
7)ramdisk--虛擬內存盤,通過軟件將一部分內存(RAM)模擬為硬盤來使用的一種技術
內核中的特性之一:使用緩沖和緩存來加速對磁盤上的文件訪問;
這種技術在centos5中存在一個問題:內存把ramdisk當作是一個硬盤,即使這部分已經放在內存中,依然會被ramdisk當作硬盤放到緩沖區,浪費了資源,而ramfs可以被視為一個文件系統,可以直接在內存中運行,所以centos5-->6做了一個升級,ramdisk --> ramfs
CentOS 5: initrd, 工具程序:mkinitrd
CentOS 6: initramfs, 工具程序:mkinitrd, dracut
正文開始
1. /sbin/init是如何運作的呢?
CentOS 5:
運行級別:為了系統的運行或維護等應用目的而設定;
0-6:7個級別
0:關機
1:單用戶模式(root, 無須登錄), single ----維護模式,比如可以重置密碼;
2: 多用戶模式,會啟動網絡功能,但不會啟動NFS -----維護模式;
3:多用戶模式,正常模式;文本界面;
4:預留級別;可同3級別;
5:多用戶模式,正常模式;圖形界面;
6:重啟
默認級別:
3, 5
切換級別:
init #
查看級別:
runlevel
who -r
配置文件:/etc/inittab
文件中每一行定義一種action以及與之對應的process,每一列如下
id:runlevel:action:process,例如id:5:initdefault:
action:
wait: 切換至此級別運行一次;
respawn:此process終止,就重新啟動之;
initdefault:設定默認運行級別;process省略;
sysinit:設定系統初始化方式,此處一般為指定/etc/rc.d/rc.sysinit;
...
一些例子:
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
說明:rc 0 --> 意味着讀取/etc/rc.d/rc0.d/
K*: K##*:##運行次序;數字越小,越先運行;數字越小的服務,通常依賴到別的服務----要先殺;
S*: S##*:##運行次序;數字越小,越先運行;數字越小的服務,通常被依賴到的服務---要先啟動;
運行過程如下:
for srv in /etc/rc.d/rc0.d/K*; do
$srv stop
done
for srv in /etc/rc.d/rc0.d/S*; do
$srv start
done
etc/rc.d/init.d/目錄下的所有啟動腳本都被鏈接到/etc/rc.d/目錄下的各級別目錄中,比如/rc3.d, rc4.d, rc5.d
CentOS 7 ,配置文件:/usr/lib/systemd/system, /etc/systemd/system
CentOS 6,配置文件:/etc/inittab, /etc/init/*.conf (其實用的這個)
2. chkconfig命令:
查看服務在所有級別的啟動或關閉設定情形: chkconfig [--list] [name]
添加:新添加了一個服務程序,需要把啟動腳本放在目錄/etc/rc.d/init.d (/etc/init.d),然后需要在各級別上創建鏈接文件
chkconfig --add name,在配置文件中指明級別,優先級如下
#!/bin/bash
#
# chkconfig: LLLL nn nn (這里的LLLL表示各級別,寫上的就表示S,第一個nn表示S的優先級,第2個nn表示K的優先級,例如chkconfig: 345 66 33,一般K的優先級要小於S的優先級)
查看鏈接文件,比如新建服務名字是testsrv,ls -l /etc/rc.d/rc0.d/K33testsrv ls -l /etc/rc.d/rc3.d/S66testrv
刪除:chkconfig --del name
修改指定的鏈接類型:
chkconfig [--level levels] name <on|off|reset>
--level LLLL: 指定要設置的級別;省略時表示2345;
注意:
正常級別下(ls /etc/rc.d/rc3.d/目錄中),最后啟動一個服務S99local沒有鏈接至/etc/rc.d/init.d一個服務腳本,而是指向了/etc/rc.d/rc.local腳本(ls -l /etc/rc.d/rc3.d/S99local查看);因此,不便或不需寫成腳本放置於/etc/rc.d/init.d/目錄,且又想開機時自動運行的命令,可直接放置於/etc/rc.d/rc.local文件中(里面放置開機服務最后一步要運行的東西);
3. update-rc.d命令
ubuntu中和chkconfig類似的開機啟動控制命令
以tomcat為例子,如果是啟動命令,可以在/etc/rc.local中添加
如果想運行腳本,則需要先將腳本復制或者軟連接到/etc/init.d/目錄下,然后用:update-rc.d tomcat defaults NN命令(NN為啟動順序,比如95),如果想卸載, update-rc.d -f tomcat remove