操做系統啓動流程和Centos6和Centos7的啓動過程詳解

1. 操做系統啓動流程和Centos6和Centos7的啓動

1.1 GRUB引導管理器

GNU GRUB(GRand UnifiedBootloader簡稱「GRUB」)是一個來自GNU項目的多操做系統啓動程序。GRUB是多啓動規範的實現,它容許用戶能夠在計算機內同時擁有多個操做系統,並在計算機啓動時選擇但願運行的操做系統。GRUB可用於選擇操做系統分區上的不一樣內核,也可用於向這些內核傳遞啓動參數。php

GNU GRUB 和GRUB是GRand Unified Bootloader的縮寫,它是一個多重操做系統啓動管理器。用來引導不一樣系統,如windows,linux。html

GNU GRUB的前身爲Grand Unified Bootloader。它主要用於類Unix系統;同大多Linux發行版同樣,GNU系統也採用GNU GRUB做爲它的啓動器。Solaris從10 1/06版開始在x86系統上也採用GNU GRUB做爲啓動器。linux

注意:目前 GRUB 分紅 GRUB legacy 和 GRUB 2。版本號是 0.9x 以及以前的版本都稱爲 GRUB Legacy ,從 1.x 開始的就稱爲 GRUB 2。ios

在X86架構的機器中,Linux、BSD 或其它Unix類的操做系統中GRUB、LILO 是你們最爲經常使用,應該說是主流。nginx

計算機在啓動的時候,首先由BIOS中的程序執行自檢,自檢經過後,就根據CMOS的配置找到第一個可啓動磁盤的MBR中的Boot Loader程序(通常在啓動盤的第一個物理扇區,佔416字節),並把控制權交給Boot Loader,由Boot Loader進一步完成操做系統內核的加載。當Boot Loader找到內核以後,就把控制權交給操做系統內核,由內核繼續完成系統的啓動。json

能夠看出,Boot Loader是計算機啓動中第二個要執行的程序,它是引導操做系統的關鍵程序。能夠引導操做系統的Boot Loader主要有LiLo、GRUB以及Windows下的MBR程序。其中,GRUB是目前使用最爲普遍,而且很是優秀的一款啓動引導程序。小程序

GRUB對設備的命名windows

首先,GRUB對設備的命名必須包含在小括號( )內;其次,GRUB不區分IDE硬盤和SCSI硬盤,統一使用hdx,其中x指定BIOS中硬盤的編號,並從0開始計數,並且IDE硬盤編號小於SCSI硬盤;第三,GRUB用fdx指定軟盤設備,x是軟盤驅動器號。下面是一些GRUB對設備命名的舉例:centos

q(fd0)表示第1個軟盤瀏覽器

q(hd0,1)表示第1個硬盤的第2個分區

q(hd0,0)/boot/vmlinuz表示第1個硬盤的第一個分區下的boot/目錄下的vmlinuz文件。若是沒有指定某個分區,則表示使用整個設備,不然只使用指定的分區

q(hd0,2,a)專用於FreeBSD,FreeBSD有一個slice概念,把一個分區進一步分爲幾個slice,此處指明是第1塊硬盤的第3個分區中的slice a。

GRUB的執行流程

當系統加電後,固化在BIOS中的程序首先對系統硬件進行自檢,自檢經過後,就加載啓動磁盤上的MBR,並將控制權交給MBR中的程序(stage1),stage1執行,判斷本身是否GRUB,若是是且配置了stage1_5,則加載stage1_5,不然就轉去加載啓動扇區,接着,stage2被加載並執行,由stage2藉助stage1_5驅動文件系統,並查找grub.conf,顯示啓動菜單供用戶選擇,而後根據用戶的選擇或默認配置加載操做系統內核,並將控制權交給操做系統內核,由內核完成操做系統的啓動。

GRUB涉及到幾個重要的文件:

第一個就是stage1。它被安裝在MBR扇區(0面0磁道的第1扇區),大小爲512字節(446字節代碼+64字節分區表+2字節標誌55AA),它負責加載存放於0面0道第2扇區的start程序。

第二個是stage1_5。stage1_5負責識別文件系統和加載stage2,因此stage1_5每每有多個,以支持不一樣文件系統的讀取。在安裝GRUB的時候,GRUB會根據當前/boot/分區類型,加載相應的stage1_5到0面0磁道的第3扇區。stage1_5是由start加載的。

第三個是stage2。它負責顯示啓動菜單和提供用戶交互接口,並根據用戶選擇或默認配置加載操做系統內核。同前兩個文件不一樣,stage2是存放在磁盤上/boot/grub下。

第四個是menu.lst(/boot/grub/grub.conf的連接)。grub.conf是一個基於腳本的文本文件,其中包含菜單顯示的配置和各個操做系統的內核加載配置。GRUB根據grub.conf顯示啓動菜單,提供同用戶交互界面。GRUB正是根據用戶選擇或默認配置和grub.conf的內核配置加載相應的內核程序,並把控制權交給內核程序,使得內核程序完成真正的操做系統的啓動。

其它重要文件,GRUB除了上面敘述的主要文件以外,還包括支持交互功能的一些磁盤程序。主要包括/sbin/下的grub、grub-install、grub-md5-crypt和grub-terminfo和/usr/bin/mbchk,以及/boot/grub下的設備映像文件(device.map)和菜單背景圖像文件(splash.xpm.gz)。

經過上面的分析總結,能夠很容易地看出,GRUB實際上包含兩部分,一部分被安裝在磁盤的特殊扇區,另一部分則以文件的形式存在。要讓GRUB啓動操做系統,就必須首先把GRUB的stage1和stage1_5(根據文件系統自動選擇是否安裝)安裝到磁盤的特殊扇區,另外,在磁盤的/boot/grub下存在有grub.conf、device.map等文件和支持交互的程序,並且這些程序必須在PATH環境變量指定的路徑中。具有了這些知識,相信無論是安裝、配置、備份或修復GRUB都不是件很難的是情。

安裝GRUB到MBR

GRUB的工做目錄是在/boot/grub下,而make install並沒將其安裝到/boot/grub。因此,安裝完成後要執行以下一些操做:

a)把/usr/local/share/grub/i386-pc/目錄下的全部文件通通拷貝到/boot/grub/目錄下(要先下載源碼包進行./configure,make, make install)

#cp /usr/local/share/grub/i386-pc/* /boot/grub/

b)在/boot/grub下建立grub.conf文件,並創建一個到grub.conf的軟連接menu.lst

#cd /boot/grub

#touch grub.conf

#ln -s grub.conf menu.lst

注意!若是已經存在grub.conf,就最好不要再次建立,須要時直接修改便可。

c)確認/usr/local/sbin和/usr/local/bin在PATH變量的值中,執行以下命令檢查

#env |grep PATH

若是發現/usr/local/sbin和/usr/local/bin不在PATH變量中,能夠經過以下命令修改:

#export PATH=$PATH /usr/local/sbin:/usr/local/bin

d)安裝GRUB到MBR

GRUB在啓動中,被BIOS調用,只有放在MBR中才能夠被調用,因此,GRUB要讓BIOS調用,就必須安裝在MBR中。其實是將stage1安裝到MBR中,也可能根據文件系統選擇安裝了stage1_5。下面,提供幾個安裝GRUB的例子:

#grub-install /dev/hda //將GRUB安裝到第1塊IDE硬盤的MBR

#grub-install /dev/sda//將GRUB安裝到第1塊SCSI硬盤的MBR

#grub-install /dev/fd0//將GRUB安裝到軟盤

#grub-install /dev/hda1//將GRUB安裝到第1快硬盤的0扇區,當用其它引導程序引導系統時,每每選擇這種方式,以避免覆蓋其它引導程序。

e)在GRUB的命令行模式下安裝GRUB

關於GRUB命令行模式及其操做方法請參考3小節的內容。在系統顯示啓動菜單時候按下c鍵,或者系統啓動後在命令行執行/usr/sbin/grub程序,均可以進入GRUB的命令行模式。命令行模式下安裝GRUB的基本過程以下:

----指定啓動設備

grub>root (hd0,0)#除了root後必須有空格,別的位置均不能有空格!

此處(hd0,0)是指第1塊硬盤的第1個分區。若是不能肯定包含GRUB的stage1文件的分區,能夠經過find指令查找肯定:

grub>find /boot/grub/stage1#查找stage1

GRUB將會查找文件/boot/grub/stage1並顯示包含這個文件的設備名,這個設備就是上面要用到的設備。

----安裝GRUB

grub>setup (hd0)#除了setup後必須有空格,別的位置均不能有空格!

這條命令將會在第1塊硬盤的MBR安裝GRUB,若是不想在MBR安裝GRUB,而是但願將GRUB安裝在某分區的引導扇區的話,能夠用下面的命令安裝:

grub>setup (hd0,0)#除了setup後必須有空格,別的位置均不能有空格!

這將會在第1塊硬盤的第1個分區的引導扇區安裝GRUB。

----退出GRUB

grub>quit

f)重啓機器,新安裝的GRUB生效

GRUB配置文件示例

grub.conf是GRUB的配置文件,其結構比較簡單,能夠分爲兩部分,第一步分是全局配置,另一部分就是每一個操做系統的啓動配置。其中能夠有多個操做系統的菜單配置。下面就是一個具體的例子。

#=================/boot/grub/grub.conf文件範例==================

timeout 30 #等待用戶選擇菜單項的時間(以秒計),超時則引導默認的選項

default 0 #默認選項,第一項

fallback 1 #若是第一項出錯,則啓動下面的後備選項

splashimage=(hd0,0)/grub/splash.xpm.gz #GRUB啓動畫面

#如下是啓動Linux的配置

titleRed Hat Linux Enterprise AS3 for syd168 #啓動項的菜單標題

root (hd0,0) #指定根文件系統,第1塊硬盤第1個扇區中的/boot。

kernel /vmlinuz-2.4.18 ro root=LABEL=/ #內核在/boot中

initrd /initrd-2.4.18-14.img #啓動RAM盤在/boot下

#如下是啓動Windows的配置,若是隻有Linux就不須要

title Windows2003 Enterprise for syd168 #Windows啓動菜單標題

root noverify(hd0,1) #該操做系統在hd0的第二分區,不mount

chainloader +1 #從第一個硬盤的第二個分區引導Windows

#=================/boot/grub/grub.conf文件範例

上面的例子,只是簡單說明了GRUB中啓動Linux和Windows的配置方法。更多的啓動配置請參考下面內容。

5.引導多系統配置

GRUB支持多操做系統引導。用GRUB引導後能夠進入命令行模式或者菜單模式,能夠經過靈活的命令行模式選擇引導各個分區的操做系統,指定引導參數。GRUB支持三種引導方法,一種是直接引導操做系統內核,另外一種是經過chainload進行間接引導,第三種就是經過網絡引導操做系統。

對於GRUB可以支持的Linux,FreeBSD,OpenBSD,NetBSD,GUN Mach等能夠經過直接引導完成,可是對於GRUB不支持的操做系統(如Windows),須要用第二種方法chainload來完成。下面就分別來看看這幾種引導方法:

(1) 直接引導

配置過程一般以下:

a) 用root命令設置包含操做系統內核的根設備

b) 用kernel命令裝載內核映象文件,若是這個內核引導的時有參數的話,能夠直接將參數加在內核文件名的後面

c) 用module或modulenounzip裝載內核模塊

d) boot開始引導

(2) chainload引導

a) 設置GRUB的根設備,用rootnoverify (hdx,y)指定

b) 開始引導,用chainloader +1指定,此處「+1」是指示GRUB讀入分區的第一個扇區的引導記錄。

c) 執行boot開始引導

以上是通常的chainloader方式,對於DOS和WINDOWS,能夠簡單地用兩條指令進行引導:chainloader (hdx,y)+1,而後boot,其中x,y用來指明所在分區號。

(3) 從網絡引導:

爲了使GRUB可以支持從網絡引導,須要在編譯時打開網絡支持選項(請參考源文件中的netboot/README.netboot)。另外,要在網絡中設置兩個服務:動態IP服務(BOOTP、DHCP或RARP)和FTP服務。而後,分別針對不一樣的服務器BOOTP,DHCP或RARP運行bootp,dhcp或rarp。若是一切設置無誤的話GRUB就會給出IP,IP netmask和TFTP服務器的IP和網關的IP地址。最後,從網上獲得操做系統的映象文件。下面是一個例子:

grub> bootp

Probing…[NE*000]

NE2000 base …

Address: 192.168.110.23 Netmask: 255.255.255.0

Server: 192.168.110.14 Gateway: 192.168.110.1

grub> root (nd)

grub> kernel /tftproot/gnumach.gz root=sd0s1

==================================================

下面就是各個玩家對這個問題分析討論的總結。

首先讓咱們看看傳統的啓動流程:加載並運行Master Boot Record(MBR)主引導區內容(如lilo等)。而後掃描分區表,定位活動分區,並將活動分區上的引導扇區內容加載到內存中執行。

系統引導過程主要由如下幾個步驟組成(以硬盤啓動爲例)

一、 開機;

二、 BIOS加電自檢(POST——Power On Self Test),內存地址爲0fff:0000;

三、 將硬盤第一個扇區(0頭0道1扇區,也就是Boot Sector)讀入內存地址0000:7c00處;

四、 檢查(WORD)0000:7dfe是否等於0xaa55.若不等於則轉去嘗試其餘介質;若是沒有其餘啓動介質,則顯示 「No ROM BASIC」 ,而後死機;

五、 跳轉到0000:7c00處執行MBR中的程序;

六、 MBR先將本身複製到0000:0600處,而後繼續執行;

七、 在主分區表中搜索標誌爲活動的分區。若是發現沒有活動分區或者不止一個活動分區,則中止;

八、 將活動分區的第一個扇區讀入內存地址0000:7c00處;

九、 檢查(WORD)0000:7dfe是否等於0xaa55,若不等於則顯示 「Missing Operating System」,而後中止,或嘗試軟盤啓動;

十、 跳轉到0000:7c00處繼續執行特定系統的啓動程序;

十一、 啓動系統。

裝grub到邏輯分區,那麼就必定把grub裝入的邏輯分區設爲活動的。不過,這時候,grub接管了11步之後的動做:從stage 1.5讀出grub.conf。再由配置和用戶選擇決定下一步的引導行爲。

通常安裝grub都有兩種狀況,對於安裝到MBR這種狀況而言,GRUB直接覆蓋了原來的MBR引導程序。這也是爲何要換回「原來的 windows的引導方式」,只要用dos引導fdisk /mbr一下就能夠的緣由。爲何能夠這樣作,請注意,1-11步中有兩個地方出現了0000:7c00。無論是dos boot sector仍是nt loader它自己也是從0000:7c00運行的。其實ms當年開發分區管理的這個小程序至關因而在bios引導boot sector中插進去的。grub由於也是寫的從0000:7c00這個內存開始的子程序,那麼既能夠被BIOS加載又能夠被dos的MBR加載應該好理 解了吧。

開機自檢後,引導權交給了硬盤的MBR,此時grub就啓動了。由grub來引導windows /linux均可以。注意:linux不必定要安裝在活動分區,由於引導程序在MBR!可是windows必定要安裝在活動分區(可引導的 windows),第二個windows能夠不安裝在活動分區,但它的引導文件必定在活動分區。

大致順序是:

grub—->windows–>查找引導文件—引導加載—啓動windows

grub—->linux—>查找引導文件(/boot)–>引導加載—啓動linux

那麼,若是把grub安裝到了其它的分區上,不是MBR呢?這是grub所裝在的那個主分區必須被設爲活動分區。由於MBR(物理主引導分 區)中其實並無 OS相關的引導程序的,一般MBR只是掃描並讀取隨後的分區表,找到相應的活動分區,讀取相應活動分區的第一個扇區的512字節程序並運行,該程序負責進 一步引導相應分區的相應系統。所以,大概的運行次序是

BIOS—>MBR—->GRUB—->菜單。

這樣,大致的真實流程就能夠總結以下了:

一、 開機;

二、 BIOS加電自檢(POST——Power On Self Test),內存地址爲0fff:0000;

三、 將硬盤第一個扇區(0頭0道1扇區,也就是Boot Sector)讀入內存地址0000:7c00處;

四、 檢查(WORD)0000:7dfe是否等於0xaa55.若不等於則轉去嘗試其餘介質;若是沒有其餘啓動介質,則顯示 「No ROM BASIC」 ,而後死機;

五、 跳轉到0000:7c00處執行MBR中的程序;

六、 MBR先將本身複製到0000:0600處,而後繼續執行;假如先裝XP後裝LINUX,而且LINUX沒有裝在MBR,那這個MBR中的數據仍是WIN 寫的數據,它的做用都是下步中所說的做用,就是搜索主分區表中標誌爲活動的分區,那麼這個時候就必須把GRUB所在的主分區設置爲活動的分區,這個時候才 能正常的啓動GRUB,而後GRUB的STAGE1在調STAGE1.5和其餘的,從而來引導整個系統。假如說先裝XP後裝LINUX,可是GRUB裝在 了MBR,那樣STAGE1直接調入內存,STAGE1在調STAGE1.5和STAGE2等,從而來引導系統。那這個時候是不須要將GRUB其餘文件所 在的主分區設爲活動分區的,它直接調STAGE1.5等,而後再調STAGE2等,來識別文件系統,從而實現可多啓動。

七、 在主分區表中搜索標誌爲活動的分區。若是發現沒有活動分區或者不止一個活動分區,則中止;

八、 將活動分區的第一個扇區讀入內存地址0000:7c00處;

九、 檢查(WORD)0000:7dfe是否等於0xaa55,若不等於則顯示 「Missing Operating System」,而後中止,或嘗試軟盤啓動;

十、 跳轉到0000:7c00處繼續執行特定系統的啓動程序;

十一、 啓動系統。

一點資料:

能正常工做的grub應該包括一下文件:stage一、stage二、*stage1_五、menu.lst。

其中stage1的大小必定是512字節,它要被安裝(也就是寫入)某個硬盤的主引導記錄,或者某個活動分區(這個分區要用fdisk標記 成可啓動的)的啓動扇區。stage1的主要的也是惟一的做用就是找到你存放在硬盤上某個地方的stage2文件,來完成後續的工做。

stage2 文件能夠存在在某個特定的文件系統中,好比你分了一個linux分區,在上面建立一個ext2文件系統,而後把這個文件拷貝到這個分區的某個目錄下。也可 以把stage2直接存放在硬盤的某個位置,也就是未分區的某個地方。不過,好像沒有多少人會這麼作吧。

由於stage1的容量有限(主引導記錄MBR和啓動扇區的大小隻可以是512字節),因此它對文件系統是沒法識別的,那若是你把 stage2存放 在 ext2或者fat格式的文件系統上,它如何來找到這個文件呢?這就要用到上面提到的那些stage1_5的文件了,它們負責解釋文件系統。你的 stage2放在什麼格式的文件系統上,就要調用對應的那個stage1_5文件。好比,你把stage2存放在ext2格式的文件系統上,就須要 e2fs_stage1_5;stage2存放在fat格式的文件系統上,就須要fat_stage1_5了。

CentOS6是如何啓動的

Linux的啓動其實和windows的啓動過程很相似,不過windows咱們是沒法看到啓動信息的,而Linux啓動時咱們會看到許多啓動信息,例如某個服務是否啓動。Linux系統的啓動過程大致上可分爲五部分:內核的引導、運行init、系統初始化、創建終端、用戶登陸系統。

  1. 內核引導

當計算機打開電源後,首先是BIOS開機自檢,按照BIOS中設置的啓動設備(一般是硬盤)來啓動。緊接着由啓動設備上的grub程序開始引導Linux,當引導程序成功完成引導任務後,Linux從它們手中接管了CPU的控制權,而後CPU就開始執行Linux的核心映象代碼,開始了Linux啓動過程。也就是所謂的內核引導開始了,在內核引導過程當中實際上是很複雜的,咱們就當它是一個黑匣子,反正是Linux內核作了一系列工做,最後內核調用加載了init程序,至此內核引導的工做就完成了。交給了下一個主角init.

  1. 運行init

init 進程是系統全部進程的起點,你能夠把它比擬成系統全部進程的老祖宗,沒有這個進程,系統中任何進程都不會啓動。init 最主要的功能就是準備軟件執行的環境,包括系統的主機名、網絡設定、語言、文件系統格式及其餘服務的啓動等。 而全部的動做都會經過 init的配置文件/etc/inittab來規劃,而inittab 內還有一個很重要的設定內容,那就是默認的 runlevel (開機運行級別)。先來看看運行級別Run level,Linux就是經過設定run level來規定系統使用不一樣的服務來啓動,讓Linux的使用環境不一樣。咱們來看看這個inittab文件裏面的支持級別。

# inittab is only used by upstart for the default runlevel.

#

# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.

#

# System initialization is started by /etc/init/rcS.conf

#

# Individual runlevels are started by /etc/init/rc.conf

#

# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf

#

# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,

# with configuration in /etc/sysconfig/init.

#

# For information on how to write upstart event handlers, or how

# upstart works, see init(5), init(8), and initctl(8).

#

# Default runlevel. The runlevels used are:

# 0 - halt (Do NOT set initdefault to this)

# 1 - Single user mode

# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)

# 3 - Full multiuser mode

# 4 - unused

# 5 - X11

# 6 - reboot (Do NOT set initdefault to this)

#

id:3:initdefault:

inittab配置文件格式和以前老版本CentOS5或者更老版本比有很大改動。Runlevels共七個級別,0表示關機,1表示單用戶,2表示沒有網絡的命令行級別,3命令行級別(大多服務器都用這個級別),4爲保留級別,5爲圖形化級別,6爲重啓。這個文件中除了最後一行外,其餘都爲註釋行,也就是說最後一行纔是關鍵,它用來指定服務器跑哪一個級別,這裏除了能夠設置2,3,5外其餘級別都不能設置。在該文件的前面部分,能夠看到不少行都說起到某個配置文件,而全部配置文件都是在/etc/init/目錄下。

  1. 系統初始化

系統初始化,就是去執行/etc/init/下的各個配置文件。inittab配置文件中有這麼一行 「System initialization is started by /etc/init/rcS.conf」 也就是說系統初始化會先執行/etc/init/rcS.conf 而該配置文件中又有一行 「exec /etc/rc.d/rc.sysinit」 因此,重心又轉移到了這個rc.sysinit文件上,它會作以下工做:激活交換分區,檢查磁盤,加載硬件模塊以及其它一些須要優先執行任務。當rc.sysinit程序執行完畢後,將返回init繼續下一步,又到了/etc/init/rc.conf, 在這個配置文件裏,最關鍵的一行爲 「exec /etc/rc.d/rc $RUNLEVEL」 而$RUNLEVEL是在/etc/inittab中定義的(最下面的那一行),以我們的/etc/inittab爲例,表示$RUNLEVE=3, 因此此時會執行 「/etc/rc.d/rc 3」 此時其實是把/etc/rc.d/rc3.d/ 下的腳本都給執行了,隨後/etc/rc.d/rc.local也會被執行,一般咱們會把開機啓動執行的命令放到這個腳本下。服務執行完,系統初始化也就完成了。接下來該創建終端了。

  1. 創建終端

創建終端是由配置文件/etc/init/tty.conf, /etc/init/serial.conf和/etc/sysconfig/init等配置文件來完成的。在二、三、四、5的運行級別中都將以respawn方式運行mingetty程序,mingetty程序能打開終端、設置模式。同時它會顯示一個文本登陸界面,這個界面就是咱們常常看到的登陸界面,在這個登陸界面中會提示用戶輸入用戶名,而用戶輸入的用戶將做爲參數傳給login程序來驗證用戶身份。

  1. 用戶登錄系統

對於運行級別爲5的圖形方式用戶來講,他們的登陸是經過一個圖形化的登陸界面。登陸成功後能夠直接進入KDE、Gnome等窗口管理器。而本文主要講的仍是文本方式登陸的狀況:當咱們看到mingetty的登陸界面時,咱們就能夠輸入用戶名和密碼來登陸系統了。

Linux的帳號驗證程序是login,login會接收mingetty傳來的用戶名做爲用戶名參數。而後login會對用戶名進行分析:若是用戶名不是root,且存在 「/etc/nologin」 文件,login將輸出nologin文件的內容,而後退出。這一般用來系統維護時防止非root用戶登陸。只有 「/etc/securetty」 中登記了的終端才容許root用戶登陸,若是不存在這個文件,則root能夠在任何終端上登陸。」/etc/usertty」 文件用於對用戶做出附加訪問限制,若是不存在這個文件,則沒有其餘限制。

在分析完用戶名後,login將搜索 「/etc/passwd」 以及 「/etc/shadow」 來驗證密碼以及設置帳戶的其它信息,好比:主目錄是什麼、使用何種Shell。若是沒有指定主目錄,將默認爲根目錄;若是沒有指定Shell,將默認爲 「/bin/bash」。

login程序成功後,會向對應的終端在輸出最近一次登陸的信息(在 「/var/log/lastlog」 中有記錄),並檢查用戶是否有新郵件(在 「/usr/spool/mail/」 的對應用戶名目錄下)。而後開始設置各類環境變量:對於bash來講,系統首先尋找 「/etc/profile」 腳本文件,並執行它;而後若是用戶的主目錄中存在 .bash_profile 文件,就執行它,在這些文件中又可能調用了其它配置文件,全部的配置文件執行後後,各類環境變量也設好了,這時會出現你們熟悉的命令行提示符,到此整個啓動過程就結束了。

圖形界面與命令行界面切換

Linux預設提供了六個命令窗口終端機讓咱們來登陸。默認咱們登陸的就是第一個窗口,也就是tty1,這個六個窗口分別爲tty1,tty2 … tty6,你能夠按下Ctrl + Alt + F1 ~ F6 來切換它們。若是你安裝了圖形界面,默認狀況下是進入圖形界面的,此時你就能夠按Ctrl

  • Alt + F1 ~ F6來進入其中一個命令窗口界面。當你進入命令窗口界面後再返回圖形界面只要按下Ctrl + Alt + F7 就回來了。若是你用的vmware 虛擬機,命令窗口切換的快捷鍵爲 Alt + Space + F1~F6. 若是你在圖形界面下請按Alt + Shift + Ctrl + F1~F6 切換至命令窗口。

init程序的類型:

SysV: init, CentOS 5以前, 配置文件: /etc/inittab。

Upstart: init,CentOS 6, 配置文件: /etc/inittab, /etc/init/*.conf。

Systemd: systemd, CentOS 7,配置文件: /usr/lib/systemd/system、 /etc/systemd/system。

最後是總結CentOS系統啓動流程:

post(加電自檢) –> BootSequence(啓動順序選擇BIOS中實現)–> bootloder(引導加載器,MBR中實現 –> Kernel(加載內核,會生成ramdisk –> rootfs(以readonly方式加載根文件系統)–> /sbin/init(運行第一個應用程序(至關於小管家)) –> 設置默認容許級別 –> 容許系統初始化腳本,完成系統初始化 –> 關閉對應級別下要中止的服務,啓動對應級別下須要開啓的服務 –> 設置登錄終端 –> [啓動圖形終端]

systemd與Upstart(Centos6)的區別以及做用

System V init運行級別 systemd目標名稱 做用
0 runlevel0.target, poweroff.target 關機
1 runlevel1.target, rescue.target 單用戶模式
2 runlevel2.target, multi-user.target 等同於級別3
3 runlevel3.target, multi-user.target 多用戶的文本界面
4 runlevel4.target, multi-user.target 等同於級別3
5 runlevel5.target, graphical.target 多用戶的圖形界面
6 runlevel6.target, reboot.target 重啓
emergency emergency.target 緊急Shell

若是想要將系統默認的運行目標修改成「多用戶,無圖形」模式,可直接用ln命令把多用戶模式目標文件鏈接到/etc/systemd/system/目錄:

[root@localhost~]# ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target

Centos7啓動過程

一、 什麼是CentOs系統啓動流程

CentOs系統啓動流程是CentOs主機從開機加電自檢到整個系統(包括應用程序)都處於一個正常工做的狀態;

整個流程從宏觀可分爲硬件與系統兩個層面,而系統又能夠分爲內核空間和用戶空間的啓動,每一塊都是按照某些規則自動運行。

二、 瞭解CentOS系統啓動流程對咱們有什麼幫助

在實際工做中,CentOs主機不免會出現沒法啓動或啓動異常,而在瞭解了CentOs系統啓動流程後,能夠針對問題對症下藥,並且經過學習CentOs系統啓動流程後,可掌握部分的Linux工做機制,爲之後的解決Linux故障打下紮實的基礎。

三、 CentOs系統啓動流程詳解

在講解CentOs系統啓動流程前,先講一下Linux系統的組成與運行中的系統環境分層,有助於掌握啓動流程的原理。

Linux系統的組成:內核 + 根文件系統

內核可實現如下功能:進程管理、內存管理、網絡協議棧、文件系統、安全功能、驅動程序。

內核是linux的整個核心,確切的說內核便是Linux,其餘程序都是經過調度內核來實現其功能。

運行中的系統環境分層:內核空間bootfs + 用戶空間rootfs

內核空間: 由內核代碼組成,擁有系統級別權限,可直接更改硬件;

用戶空間: 由各類應用程序組成,經過調用內核來完成各類複雜的任務。

Centos7系統的啓動流程:

一、uefi或BIOS初始化,開始開機自檢

這個過程是開機後,BIOS或UEFI進行硬件檢查的階段。

二、加載mbr到內存

自檢硬件沒有問題時候,這裏以BIOS爲例,BIOS將會直接找硬盤的第一個扇區,找到前446字節,將MBR加載到內存中,MBR將告訴程序下一階段去哪裏找系統的grub引導。此階段屬於grub第一階段。grub還有1.5階段和2階段。

三、加載GRUB程序的階段

引導裝載程序, centos7是grub2

加載裝載程序的配置文件:/etc/grub.d/ /etc/default/grub

/boot/grub2/grub.cfg,選擇多操做系統啓動,加載Linux內核

四、加載Linux內核和inintamfs模塊

加載內核,核心開始解壓,啓動一些最核心的程序。

可見在 kernel 掛載根文件系統完成後,啓動 init 進程。init 進程是 linux 系統啓動的第一個進程,那麼 CentOS7 中的第一個進程是什麼?

# 解壓 查看CentOS7 內核文件:

mkdir -p /data/img

# 不通版本內核版本號可能不一樣。

cp /boot/initramfs-3.10.0-693.11.6.el7.x86_64.img /data/img

cd /data/img

/usr/lib/dracut/skipcpio initramfs-3.10.0-693.11.6.el7.x86_64.img | zcat | cpio -id --no-absolute-filenames

解壓後的目錄以下

lrwxrwxrwx. 1 root root 7 Jan 24 10:27 bin -> usr/bin

drwxr-xr-x. 2 root root 42 Jan 24 10:27 dev

drwxr-xr-x. 12 root root 4096 Jan 24 10:27 etc

lrwxrwxrwx. 1 root root 23 Jan 24 10:27 init -> usr/lib/systemd/systemd

lrwxrwxrwx. 1 root root 7 Jan 24 10:27 lib -> usr/lib

lrwxrwxrwx. 1 root root 9 Jan 24 10:27 lib64 -> usr/lib64

drwxr-xr-x. 2 root root 6 Jan 24 10:27 proc

drwxr-xr-x. 2 root root 6 Jan 24 10:27 root

drwxr-xr-x. 2 root root 6 Jan 24 10:27 run

lrwxrwxrwx. 1 root root 8 Jan 24 10:27 sbin -> usr/sbin

-rwxr-xr-x. 1 root root 3117 Jan 24 10:27 shutdown

drwxr-xr-x. 2 root root 6 Jan 24 10:27 sys

drwxr-xr-x. 2 root root 6 Jan 24 10:27 sysroot

drwxr-xr-x. 2 root root 6 Jan 24 10:27 tmp

drwxr-xr-x. 7 root root 61 Jan 24 10:27 usr

drwxr-xr-x. 2 root root 27 Jan 24 10:27 var

可見 init 進程軟鏈到了 systemd。此時 systemd 成爲linux第一個進程(PID=1),接管系統啓動。

爲了讓內核足夠的輕小,硬件驅動並沒放在內核文件裏面。

kernel內核開始初始化,用systemd來代替centos6之前的init程序

先執行initrd.target(/usr/lib/systemd/system/initrd.target)全部單元,包括掛載/etc/fstab文件中系統,掛載以後,就能夠切換到根目錄了。

從initramfs根文件系統切換到磁盤的根目錄

五、systemd執行默認target配置

centos7表面有「運行級別」這個概念,實際是爲了兼容之前的系統,每一個所謂「運行級別」都有對應的軟鏈接指向,默認的啓動級別/etc/systemd/system/default.target,根據它的指向能夠找到系統要進入到哪一個模式。

[root@localhost img]# ll /etc/systemd/system/default.target

lrwxrwxrwx. 1 root root 37 10月 21 05:33 /etc/systemd/system/default.target -> /lib/systemd/system/multi-user.target

能夠看到在多用戶字符界面,指向到了multi-user.target,

[root@localhost img]# cat /lib/systemd/system/multi-user.target

[Unit]

Description=Multi-User System

Documentation=man:systemd.special(7)

Requires=basic.target

Conflicts=rescue.service rescue.target

After=basic.target rescue.service rescue.target

AllowIsolate=yes

文件中配置項 Requires=multi-user.target 將控制權交給 multi-user.target (至關於舊概念的運行級別)。

Centos6模式和7對應關係:

init 0 ==> runlevel0.target, poweroff.target

init 1 ==> runlevel1.target, rescue.target

init 2 ==> runlevel2.target, multi-user.target

init 3 ==> runlevel3.target, multi-user.target

init 4 ==> runlevel4.target, multi-user.target

init 5 ==> runlevel5.target, graphical.target

init 6 ==> runlevel6.target, reboot.target

systemd執行sysinit.target(/usr/lib/systemd/system/sysinit.target)初始化系統及basic.target(/usr/lib/systemd/system/basic.target.wants/)準備操做系統。

systemd啓動multi-user.target下的本機與服務器服務(/etc/systemd/system/multi-user.target.wants)

systemd執行multi-user.target下面的/etc/rc.d/rc.local

Systemd執行multi-user.target(/usr/lib/systemd/system/multi-user.target.wants/)下的getty.target及登陸服務

getty.target,它是啓動終端的systemd對象。若是到此步驟,系統沒有指定啓動圖形桌面,到此就能夠結束了.

-----------------------------------------------------

若是須要啓動圖形界面,要在此基礎上啓動桌面程序。

systemd執行graphical圖形化須要的服務

至此係統啓動完成,能夠正常使用。

官方給出啓動流程圖

Centos 7 操做系統啓動流程

POST --> BIOS(boot) --> Bootloader(MBR(446)) --> kernel(initrd) --> init(systemd) (systemd內啓動流程:/usr/lib/systemd/system/default.target —>multi-user.target—>basic.targetsysinit.target-local-fs.target- getty.target)

雖然systemd的引用target的順序如上,可是真正的啓動順序爲從下到上,其中管理單元能夠並行啓動,從而使效率大大提升。

要查看具體的啓動順序能夠經過以下命令輸入到文件,而後經過瀏覽器打開查看。

systemd-analyze plot > boot.html

列出全部正在運行的單元,按從初始化開始到啓動所花的時間排序。

systemd-analyze blame

Centos7 Systemd的詳解

1、systemd的由來

Linux一直以來採用init進程可是init有兩個缺點:

一、啓動時間長。Init進程是串行啓動,只有前一個進程啓動完,纔會啓動下一個進程。(這也是CentOS5的主要特徵)

二、啓動腳本複雜。Init進程只是執行啓動腳本,無論其餘事情。腳本須要本身處理各類狀況,這使得腳本變得很長並且複雜。

Init:

Centos 5 Sys init 是啓動速度最慢的,串行啓動過程,不管進程相互之間有無依賴關係。

Centos6 Upstart init 相對啓動速度快一點有所改進。有依賴的進程之間依次啓動而其餘與之沒有依賴關係的則並行同步啓動。

Centos7 Systemd 與以上都不一樣。全部進程不管有無依賴關係則都是並行啓動(固然不少時候進程沒有真正啓動而是隻有一個信號或者說是標記而已,在真正利用的時候纔會真正啓動。)

2、systemd

Systemd爲了解決上文的問題而誕生。它的目標是,爲系統的啓動和管理提供一套完整的解決方案。根據linux慣例,字母d是守護進程(daemon) 的縮寫。Systemd名字的含義就是 守護整個系統。

Centos 7裏systemd代替了init,成爲了系統的第一個進程。PID爲1.其餘全部的進程都是它的子進程。Systemd 的優勢是功能強大,使用方便,缺點是體系龐大,很是複雜。事實上,如今還有不少人反對使用 Systemd,理由就是它過於複雜,與操做系統的其餘部分強耦合,違反"keep simple, keep stupid"的Unix 哲學。

https://www.linuxidc.com/upload/2016_12/161201103830211.png

Systemd 架構圖

3、服務管理

一、systemctl

Systemctl是systemd的主要命令,用於管理系統。

Centos 7 :service unit

注意:能兼容早期的服務腳本

命令格式

#systemctl COMMAND name.service

重啓系統

# systemctl reboot

關閉系統,切斷電源

# systemctl poweroff

CPU中止工做

# systemctl halt

暫停系統

# systemctl suspend

讓系統進入冬眠狀態

# systemctl hibernate

讓系統進入交互式休眠狀態

# systemctl hybrid-sleep

啓動進入救援狀態(單用戶狀態)

# systemctl rescue

啓動服務

#service name start ==> systemctl start name.service

中止服務

#service name stop ==> systemctl stop name.service

重啓服務

#service name restart ==> systemctl restart name.service

查看服務狀態

#service name status ==> systemctl status name.service

條件式重啓:已啓動才重啓,不然不作操做

#service name condrestart ==> systemctl tryrestart name.service

重載或重啓服務:先加載,再啓動

#systemctl reload-or-restart name.service

重載或條件式重啓服務:

#systemctl reload-or-try-restart name.service

禁止自動和手動啓動:

#systemctl mask name.service

取消禁止:

#systemctl unmask name.service

二、服務查看:

查看全部服務的開機自啓狀態:

chkconfig --list ==> systemctl list-unit-files --type service

用來列出該服務在哪些運行級別下啓用和禁用

chkconfig sshd –list ==>ls /etc/systemd/system/*.wants/sshd.service

查看服務是否開機自啓:

systemctl is-enabled name.service

其它命令:

查看服務的依賴關係:

systemctl list-dependencies name.service

殺掉進程:

systemctl kill 進程名

顯示某個 Unit 的全部底層參數

# systemctl show httpd.service

顯示某個 Unit 的指定屬性的值

# systemctl show -p CPUShares httpd.service

設置某個 Unit 的指定屬性

# sudo systemctl set-property httpd.service CPUShares=500

三、服務狀態:

顯示狀態

systemctl list-unit-files --type service –all

loaded:Unit 配置文件已處理

active(running)一次或屢次持續處理的運行

active(exited)成功完成一次性的配置

active(waiting)運行中,等待一個事件

inactive不運行

enabled開機啓動

disabled開機不啓動

static開機不啓動,但可被另外一個啓用的服務激活

四、hostnamectl

hostnamectl命令用於查看當前主機的信息。

顯示當前主機的信息

# hostnamectl

設置主機名。

# hostnamectl set-hostname Centos7

五、localectl

localectl命令用於查看本地化設置。

查看本地化設置

# localectl

# 設置本地化參數。

# localectl set-locale LANG=en_GB.utf8

# localectl set-keymap en_GB

六、 timedatectl

123456789 timedatectl

timedatectl命令用於查看當前時區設置。

查看當前時區設置

顯示全部可用的時區

# timedatectl list-timezones

# 設置當前時區

$# timedatectl set-timezone America/New_York

# timedatectl set-time YYYY-MM-DD

# timedatectl set-time HH:MM:SS

七、loginctl

loginctl命令用於查看當前登陸的用戶。

# 列出當前session

# loginctl list-sessions

# 列出當前登陸用戶

# loginctl list-users

# 列出顯示指定用戶的信息

# loginctl show-user (ruanyf) 用戶

4、unit

Systemd能夠管理系統中全部資源。不一樣的資源統稱爲unit(單位)。Unit表示不一樣類型的systemd對象,經過配置文件進程標識和配置;文件中主要包含了系統服務、監聽socket、保存的系統快照以及其它與init相關的信息。

一、Unit類型

Unit一共分爲12種。

Sysstemctl –t help 查看unit類型

Service unit:文件擴展名爲.Service,用於定義系統服務

Target unit : 文件名擴展爲.target,用於模擬實現「運行級別」

Device unit :.device ,用於定義文件內核識別設備

Mount unit: .mount 定義文件系統掛載點。

Socket unit: .socket, 用於標識進程間通訊用的socket文件,也可在系統啓動時,延遲啓動服務,實現按需啓動

Snapshot unit: .snapshot, 管理系統快照

Swap unit: .swap, 用於標識swap設備

Automount unit: .automount,文件系統的自動掛載點

Path unit: .path,用於定義文件系統中的一個文件或目錄使用,經常使用於當文件系統變化時,延遲激活服務,如:spool目錄

Scope unit :不是由systemd啓動的外部進程

Slice unit :進程組

Timer unit :定時器

二、systemctl list-units命令能夠查看當前系統的全部 Unit 。

列出正在運行的 Unit

# systemctl list-units

列出全部Unit,包括沒有找到配置文件的或者啓動失敗的

# systemctl list-units --all

列出全部沒有運行的 Unit

# systemctl list-units --all --state=inactive

列出全部加載失敗的 Unit

# systemctl list-units --failed

列出全部正在運行的、類型爲 service 的 Unit

# systemctl list-units --type=service

三、unit狀態

systemctl status命令用於查看系統狀態和單個 Unit 的狀態。

顯示系統狀態

#systemctl status

顯示單個 Unit 的狀態

# sysystemctl status bluetooth.service

顯示遠程主機的某個 Unit 的狀態

# systemctl -H root@Centos7.example.com status httpd.service

除了status命令,systemctl還提供了三個查詢狀態的簡單方法,主要供腳本內部的判斷語句使用。

顯示某個 Unit 是否正在運行

# systemctl is-active application.service

顯示某個 Unit 是否處於啓動失敗狀態

# systemctl is-failed application.service

顯示某個 Unit 服務是否創建了啓動連接

# systemctl is-enabled application.service

四、依賴關係

Unit 之間存在依賴關係:A 依賴於 B,就意味着 Systemd 在啓動 A 的時候,同時會去啓動 B。

#systemctl list-dependencies命令列出一個 Unit 的全部依賴。

# systemctl list-dependencies nginx.service

上面命令的輸出結果之中,有些依賴是 Target 類型(詳見下文),默認不會展開顯示。若是要展開 Target,就須要使用--all參數。

# systemctl list-dependencies --all nginx.service

5、unit配置文件

一、概述

每個 Unit 都有一個配置文件,告訴 Systemd 怎麼啓動這個 Unit 。

Systemd 默認從目錄/etc/systemd/system/讀取配置文件。可是,裏面存放的大部分文件都是符號連接,指向目錄/usr/lib/systemd/system/,真正的配置文件存放在那個目錄。

systemctl enable httpd.service命令用於在上面兩個目錄之間,創建符號連接關係。(Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.)等同於 ln -s /usr/lib/systemd/system/httpd.service /etc/systemd/system/multi-user.target.wants/httpd.service。固然systemdctl diable httpd.service 則至關於刪除這個軟鏈接。

/usr/lib/system/system:每一個服務最主要的啓動腳本設置,相似於以前的/etc/init.d/

/run/system/system:系統執行過程當中所產生的服務腳本,與上面目錄優先運行。

/etc/systemd/system:管理員創建的執行腳本,相似於/etc/rc.d/rcN.d/Sxx的功能,比上面目錄優先運行。

二、配置文件狀態

systemctl list-unit-files命令用於列出全部配置文件。

列出全部配置文件

#systemctl list-unit-files

列出指定類型的配置文件

#systemctl list-unit-files --type=service

systemctl list-unit-files該命令會輸出一個列表,從中能夠看到每一個配置文件的狀態。

Unit config filestatus

lvm2-lvmetad.service disabled

lvm2-lvmetad.socket enabled

lvm2-lvmpolld.service disabled

lvm2-lvmpolld.socket enabled

這個列表顯示每一個配置文件的狀態,一共有四種。

enabled:已創建啓動連接

disabled:沒創建啓動連接

static:該配置文件沒有[Install]部分(沒法執行),只能做爲其餘配置文件的依賴

masked:該配置文件被禁止創建啓動連接

注意,從配置文件的狀態沒法看出,該 Unit 是否正在運行。這必須執行前面提到的systemctl status命令。

# systemctl status httpd.service

三、配置文件格式

1)unit配置文件格式

[Unit]

Description=backup /etc

Requires=atd.service

[Service]

Type=simple

ExecStart=/bin/bash -c "echo /testdir/bak.sh|at now"

[Install]

WantedBy=multi-user.target

[unit] :定義與Unit類型無關的通用選項;用於提供unit的描述信息、 unit行爲及依賴關係等

[Service]:與特定類型相關的專用選項;此處爲Service類型

[Install]:定義由「 systemctl enable」以及"systemctl disable「命令在實現服務啓用或禁用時用到的一些選項

二、Unit段的經常使用選項:Description:簡短描述

Description:描述信息

After:定義unit的啓動次序,表示當前unit應該晚於哪些

unit啓動,其功能與Before相反

Requires:依賴到的其它units,強依賴,被依賴的units沒法激活時,當前unit也沒法激活

Wants:依賴到的其它units,弱依賴

Conflicts:定義units間的衝突關係

BindsTo:與Requires相似,它指定的 Unit 若是退出,會致使當前 Unit 中止運行

Before:若是該字段指定的 Unit 也要啓動,那麼必須在當前 Unit 以後啓動

Conflicts:這裏指定的 Unit 不能與當前 Unit 同時運行

Condition...:當前 Unit 運行必須知足的條件,不然不會運行

Assert...:當前 Unit 運行必須知足的條件,不然會報啓動失敗

三、service經常使用的選項

Type:定義影響ExecStart及相關參數的功能的unit進程啓動類型

simple:默認值,這個daemon主要由ExecStart接的指令串來啓動,啓動後常駐於內存中

forking:由ExecStart啓動的程序透過spawns延伸出其餘子程序來做爲此daemon的主要服務。原生父程序在啓動結束後就會終止。

oneshot:與simple相似,不過這個程序在工做完畢後就結束了,不會常駐在內存中

dbus:與simple相似,但這個daemon必需要在取得一個D-Bus的名稱後,纔會繼續運做.所以一般也要同時設定BusNname= 才行

notify:在啓動完成後會發送一個通知消息。還須要配合NotifyAccess 來讓 Systemd 接收消息

idle:與simple相似,要執行這個daemon必需要全部的工做都順利執行完畢後纔會執行。這類的daemon通

常是開機到最後才執行便可的服務。

EnvironmentFile:環境配置文件

ExecStart:指明啓動unit要運行命令或腳本的絕對路徑

ExecStartPre: ExecStart前運行

ExecStartPost: ExecStart後運行

ExecRsload: 重啓當前服務時執行的命令

ExecStopPost:中止當前服務以後執行的命令

ExecStartSec:自動重啓當前服務間隔的秒數

ExecStop:指明中止unit要運行的命令或腳本

Restart:當設定Restart=1 時,則當次daemon服務意外終止後,會再次自動啓動此服務。

TimeoutSec:定義 Systemd 中止當前服務以前等待的秒數。

Environment:指定環境變量。

四、install 經常使用選項

Install段的經常使用選項:

Alias:別名,可以使用systemctl command Alias.service

RequiredBy:被哪些units所依賴,強依賴

WantedBy:被哪些units所依賴,弱依賴

Also:安裝本服務的時候還要安裝別的相關服務

注意:對於新建立的unit文件,或者修改了的unit文件,要通知systemd重載此配置文件,然後能夠選擇重啓。

# systemctl daemon-reload

# systemctl daemon-reload

#systemctl restart httpd.service

更加詳細的unit配置文件格式 請參考官方文檔

www.freedesktop.org/software/sy…

6、Target

啓動計算機的時候,須要啓動大量的 Unit。若是每一次啓動,都要一一寫明本次啓動須要哪些 Unit,顯然很是不方便。Systemd 的解決方案就是 Target。

簡單說,Target 就是一個 Unit 組,包含許多相關的 Unit 。啓動某個 Target 的時候,Systemd 就會啓動裏面全部的 Unit。從這個意義上說,Target 這個概念相似於"狀態點",啓動某個 Target 就比如啓動到某種狀態。

傳統的init啓動模式裏面,有 RunLevel 的概念,跟 Target 的做用很相似。不一樣的是,RunLevel 是互斥的,不可能多個 RunLevel 同時啓動,可是多個 Target 能夠同時啓動。

一、Target命令

查看當前系統的全部 Target

# systemctl list-unit-files --type=target

查看一個 Target 包含的全部 Unit

# systemctl list-dependencies multi-user.target

查看啓動時的默認 Target

# systemctl get-default

設置啓動時的默認 Target

# systemctl set-default multi-user.target

切換 Target 時,默認不關閉前一個 Target 啓動的進程, systemctl isolate 命令改變這種行爲,

關閉前一個 Target 裏面全部不屬於後一個 Target 的進程 systemctl isolate multi-user.target

二、Target與傳統 RunLevel 的對應關係以下。

Traditional runlevel New target name Symbolically linked to...

Runlevel 0 | runlevel0.target -> poweroff.target

Runlevel 1 | runlevel1.target -> rescue.target

Runlevel 2 | runlevel2.target -> multi-user.target

Runlevel 3 | runlevel3.target -> multi-user.target

Runlevel 4 | runlevel4.target -> multi-user.target

Runlevel 5 | runlevel5.target -> graphical.target

Runlevel 6 | runlevel6.target -> reboot.target

三、它與init進程的主要差異以下。

(1)默認的 RunLevel(在/etc/inittab文件設置)如今被默認的 Target 取代,位置是/etc/systemd/system/default.target,一般符號連接到graphical.target(圖形界面)或者multi-user.target(多用戶命令行)。

(2)啓動腳本的位置,之前是/etc/init.d目錄,符號連接到不一樣的 RunLevel 目錄 (好比/etc/rc3.d、/etc/rc5.d等),如今則存放在/lib/systemd/system和/etc/systemd/system目錄。

(3)配置文件的位置,之前init進程的配置文件是/etc/inittab,各類服務的配置文件存放在/etc/sysconfig目錄。如今的配置文件主要存放在/lib/systemd目錄,在/etc/systemd目錄裏面的修改能夠覆蓋原始設置。

7、日誌管理

Systemd 統一管理全部 Unit 的啓動日誌。帶來的好處就是,能夠只用journalctl一個命令,查看全部日誌(內核日誌和應用日誌)。日誌的配置文件是/etc/systemd/journald.conf。

一、journalctl功能強大,用法很是多。

查看全部日誌(默認狀況下 ,只保存本次啓動的日誌)

# journalctl

查看內核日誌(不顯示應用日誌)

# journalctl -k

查看系統本次啓動的日誌

# journalctl -b

# journalctl -b -0

查看上一次啓動的日誌(需更改設置)

# journalctl -b -1

查看指定時間的日誌

# journalctl --since="2012-10-30 18:17:16"

# journalctl --since "20 min ago"

# journalctl --since yesterday

# journalctl --since "2015-01-10" --until "2015-01-11 03:00"

# journalctl --since 09:00 --until "1 hour ago"

顯示尾部的最新10行日誌

# journalctl -n

顯示尾部指定行數的日誌

# journalctl -n 20

實時滾動顯示最新日誌

# journalctl -f

查看指定服務的日誌

# journalctl /usr/lib/systemd/systemd

查看指定進程的日誌

# journalctl _PID=1

查看某個路徑的腳本的日誌

# journalctl /usr/bin/bash

查看指定用戶的日誌

# journalctl _UID=33 --since today

查看某個 Unit 的日誌

# journalctl -u nginx.service

# journalctl -u nginx.service --since today

實時滾動顯示某個 Unit 的最新日誌

# journalctl -u nginx.service -f

合併顯示多個 Unit 的日誌

# journalctl -u nginx.service -u php-fpm.service --since today

二、查看指定優先級(及其以上級別)的日誌,共有8級

0: emerg

1: alert

2: crit

3: err

4: warning

5: notice

6: info

7: debug

# journalctl -p err -b

日誌默認分頁輸出,--no-pager 改成正常的標準輸出

# journalctl --no-pager

以 JSON 格式(單行)輸出

# journalctl -b -u nginx.service -o json

以 JSON 格式(多行)輸出,可讀性更好

# journalctl -b -u nginx.serviceqq

-o json-pretty

顯示日誌佔據的硬盤空間

# journalctl --disk-usage

指定日誌文件佔據的最大空間

# journalctl --vacuum-size=1G

指定日誌文件保存多久

# journalctl --vacuum-time=1years

相關文章
相關標籤/搜索