Linux啓動過程

回顧:linux

查看和管理進程的命令:c#

pstree, ps, pidof, pgrep, pkill, top, vmstat, htop, glances, dstat, pmap, kill, killall, bg, fg, jobs, nohup, nice, renice緩存


http://mirrors.sohu.com/fedora_epel安全


CentOS(RHEL)系列操做系統的啓動流程:Intel X86兼容架構bash

Linux的系統組成:內核 + 應用程序  GNU/Linux:單純的指Linux內核服務器


從硬盤存儲和啓動操做系統的角度:網絡


Linux的系統組成:內核 + 根文件系統(rootfs)架構


內核功能:進程管理,文件系統管理,內存管理,網絡協議,驅動程序,安全功能,...框架


Linux系統的系統運行環境能夠分爲兩部分:socket

內核空間:內核代碼(系統調用)

就是內核進程佔用的CPU和內存資源的總和;

用戶空間:應用程序(進程或線程)

就是各類存儲於文件系統中的應用程序,在發起爲進程或線程以後,佔據的CPU和內存資源的總和;


操做系統內核的設計流派:

單內核設計:

全部的功能所有集中於同一個程序;運行時表現爲一個進程;

Linux就是單內核設計


Linux,咱們不須要他成爲最早進的,咱們只是要使用它;


微內核設計:

每種功能使用一個單獨的子系統來實現;

Windows,Solaris都是微內核設計


Linux內核的特色:

單內核 + 模塊化:內核之中的功能 + 各個模塊提供的功能之和;

爲了可以提效,會爲速度比較慢的IO設備提供緩衝和緩存;


Linux內核的組成部分:

內核核心文件:

/boot/vmlinuz-VERSION-release

CentOS 5:

/boot/vmlinuz-2.6.18-398.el5

CentOS 6:

/boot/vmlinuz-2.6.32-573.el6.x86_64

CentOS 7:

/boot/vmlinuz-3.10.0-327.el7.x86_64


最新的內核版本:4.13


內核模塊文件:

/lib/modules/KERNEL_VERSION/kernel/


ramdisk:

CentOS 5:

/boot/initrd-2.6.18-398.el5.img


CentOS 6/7:

/boot/initramfs-2.6.32-573.el6.x86_64.img

/boot/initramfs-3.10.0-327.el7.x86_64.img


CentOS 5/6: 

生成ramdisk的工具:mkinitrd

CentOS 7:

生成ramdisk的工具:dracut  mkinitrd


rd和ramfs:

ramdisk:雙緩衝和雙緩存;

ramfs:提效,避免雙緩衝和雙緩存;



CentOS系列操做系統的啓動流程(2)

基於x86架構兼容平臺研究系統啓動流程;


1.POST:Power-On Self Test,加電自檢;

ROM:Read-Only Memory,只讀存儲器;

CMOS:BIOS,Basic Input and Output System,基本輸入輸出系統;


X86架構的CPU能夠線性尋址的物理存儲空間:ROM + RAM


2.BootSequence:啓動順序

做用:決定到何種硬件設備上加載操做系統;

方式:按照指定的次序查找各個引導設備,第一個被找出有引導程序的設備即爲本次啓動要用到的設備;


BootLoader:引導加載器,程序;

MBR:

Master(Main) Boot Record:

0磁道0扇區:

446Byte: bootloader

64Byte:FAT,File Allocation Table;

2Byte:magic-number,55AA,表示MBR有效;

GPT:


Windows:NTLDR

Linux:

LILO:LInux LOader,有缺陷:不能支持大硬盤;不超過1024柱面;

GRUB:GRand Uniform Bootloader,全球統一引導加載器;

CentOS 6-:

GRUB 0.x:grub legacy


CentOS 7:

GRUB 1.x:grub2


grub提供的功能:

1.爲用戶提供一個菜單,菜單中列舉的是各個能夠啓動的操做系統內核;

2.能夠將用戶選定的內核核心文件裝載到RAM中,解壓縮並展開,將系統控制權移交給內核;

3.交互式的命令行接口;

4.菜單及內核啓動的安全保障;


3.內核:

自身初始化:

1) 探測可以識別到的全部的硬件設備;

2) 加載硬件的驅動程序,有可能會藉助於ramdisk加載驅動;

3) 以只讀的方式掛載根文件系統;

4) 運行用戶空間的第一個應用程序: /sbin/init


4.Init:

Init程序的類型:

CentOS 5:SysV Init

配置文件:/etc/inittab


CentOS 6:Upstart Init

配置文件:/etc/inittab 幾乎被廢棄;

/etc/init/*.conf


CentOS 7:Systemd

配置文件:/usr/lib/systemd/system/*

/etc/systemd/system/*



小結:

系統初始化流程(內核級別)

POST --> BootSequence(BIOS) --> BootLoader(MBR) --> kernel(內核核心文件只能放置在基本分區上) [--> ramdisk] --> rootfs(read-only) --> /sbin/init


CentOS 5的SysV Init的工做過程:

CentOS 5 SysV Init:

運行級別(run level):爲了系統的運行或維護等目的而設置的管理機制;

0-6 : 七個運行級別;

# 0 - 關機,halt,shutdown

# 1 - 單用戶模式(Single user mode),root,無需驗證;維護模式;

# 2 - 多用戶模式(Multiuser),會啓動網絡功能;但不會啓動NFS,維護模式;

# 3 - 多用戶模式(Full multiuser mode),徹底的功能模式,僅使用CLI,不激活GUI;

# 4 - 預留級別,目前無特別使用的目的;可是習慣上認爲與3運行級別相同;

# 5 - 多用戶模式(Full multiuser mode),徹底的功能模式,默認激活GUI和CLI,默認使用的是GUI;

# 6 - 重啓,reboot


一般會使用3,5運行級別做爲這次系統啓動的默認運行級別;

查看當前系統的運行級別:

who -r

runlevel


切換運行級別:

init [0-6]


Init的配置文件:/etc/inittab,此配置文件有以下功能:

1.在整個系統初始化的過程當中要作哪些任務;

啓動或關閉哪些後臺服務;

如何進行系統初始化;

在驗證用戶的身份無誤以後,如何爲用戶提供登陸提示符,還要區分是圖形界面仍是文件界面;

當備用電源失效或從新生效時,如何指揮系統操做;

定義了按下"Ctrl + Alt + Delete"組合鍵時,系統將採起什麼行爲;


2.全部規定的任務如何執行;

每一行定義一種操做,格式以下:

id:runlevels:action:process


id:一種操做的惟一標識符;

l#, id, pf, pr, #, x, 

runlevel:指定任務執行所依賴的運行級別;

####, #, 留空

action:在何種條件下啓動此任務;

wait:等待切換至此任務所在的運行級別時,運行一次;

respawn:一旦此任務結束,就自動從新啓動此任務;

initdefault:用於設定默認的運行級別,一般後面的process省略

sysinit:設置系統初始化的方式,通常狀況下此處運行/etc/rc.d/rc.sysinit腳本;

powerfail:

powerokwait:

ctrlaltdel:



/etc/rc.d/rc.sysinit:

1.設置主機名稱;

2.設置啓動的歡迎信息;

3.激活udev和SELinux

4.掛載/etc/fstab文件中定義的全部有效文件系統;

5.激活各個swap設備;

6.檢測rootfs,而且以讀寫的方式從新掛載rootfs;

7.設置系統時間;

8.根據/etc/sysctl.conf文件設置內核參數;

9.激活lvm和軟RAID等高級邏輯設備;

10.加載額外的設備的驅動程序;

11.完成清理工做;


/etc/rc.d/rc:

根據特定的運行級別,啓動或關閉/etc/rc.d/rc$runlevel.d/*

K*:要中止的服務;K字母后面的兩位數字表示優先級;數字越小優先級越高;依賴其餘服務的服務應該優先關閉,被其餘服務依賴的服務應該稍後關閉;


S*:要啓動的服務;S字母后面的兩位數字表示優先級;數字越小優先級越高;被其餘服務依賴的服務應該優先啓動,依賴其餘服務的服務應該稍後啓動;


rc腳本能夠接受一個運行級別做爲其參數運行內容的;


腳本框架:

for i in /etc/rc.d/rc#.d/K* ; do

$i stop

done


for i in /etc/rc.d/rc#.d/S* ; do

$i start

done



      全部由rc腳本關閉或啓動的連接文件的源文件都存在於/etc/rc.d/init.d,系統爲了方便使用,爲此目錄建立了連接/etc/init.d


全部/etc/init.d(/etc/rc.d/init.d)目錄中的腳本執行方式:

# /etc/init.d/SRV_SCRIPT {start|stop|restart|status}

# service SRV_SCRIPT {start|stop|restart|status}


chkconfig命令:

chkconfig - updates and queries runlevel information for system services

查看系統服務相關運行級別下的運行狀態:

chkconfig --list [name]


管理系統服務在/etc/rc.d/rc#.d/目錄下的服務腳本的連接:

chkconfig --add name

chkconfig --del name

爲了可以讓chkconfig命令管理系統服務的腳本的連接,每一個腳本中都必須有這樣的格式:

# chkconfig: 2345 90 60

2345:在哪一個運行級別下,此服務是自動啓動狀;也就是說,在對應的運行級別的rc#.d目錄中,是以S開頭的文件;若是改位置爲"-",則表示全部運行級別都爲K開頭的;

90:若是在某個運行級別下爲開啓狀態,該數字爲S後面的優先級數字;

60:若是在某個運行級別下爲中止狀態,該數字爲K後面的優先級數字;

# description: 對於此係統服務的摘要性描述信息;

單獨設置指定運行級別下系統服務的自動啓動或關閉的狀態;

chkconfig [--level ####] name <on|off|reset>


/etc/rc.d/rc.local腳本:

是init程序在引導用戶空間進程啓動的過程當中,所執行的最後一個腳本;所以,不便於或不須要寫在系統服務相關的腳本中的內容但又指望能夠開機即運行的功能,能夠直接寫在此腳本中;


# Run gettys in standard runlevels

1:2345:respawn:/sbin/mingetty tty1

2:2345:respawn:/sbin/mingetty tty2

3:2345:respawn:/sbin/mingetty tty3

4:2345:respawn:/sbin/mingetty tty4

5:2345:respawn:/sbin/mingetty tty5

6:2345:respawn:/sbin/mingetty tty6


mingetty會調用login程序,打開虛擬終端;除了mingetty以外,諸如getty之類的程序也能夠生成虛擬終端控制檯;


若是默認的運行級別是5,則咱們須要/etc/X11/prefdm腳本打開圖形界面終端;

X6R11 - X Version 6 Release 11


小結:(用戶空間的啓動流程),/sbin/init

/sbin/init --> /etc/inittab --> 設置默認運行級別 --> /etc/rc.d/rc.sysinit腳本,完成系統初始化(以讀寫方式掛在文件系統,設置主機名,等等) --> 關閉那些對應運行級別下須要中止的服務,啓動那些對應運行級別下須要開啓的服務 --> Ctrl+Alt+Del熱鍵功能 -->UPS電源的失效與恢復以後的操做 --> 生成終端[啓動圖形界面]


CentOS 6:

Init程序:upstart,其應用程序依然是/sbin/init,其配置文件:

/etc/inittab:僅僅只是用於定義默認運行級別;

/etc/init/*.conf:

rcS.conf:執行系統初始化腳本的任務;

rc.conf:執行根據運行級別關閉或開啓系統服務的任務;

start-ttys.conf:執行打開終端相關的任務;

prefdm.conf:執行大小圖形界面的任務;


upstart機制:基於事件驅動的程序管理模型;Driven-envet


CentOS 6 系統啓動流程:

POST --> BootSequence(BIOS) --> Bootloader --> kernel [-->ramfs] -->rootfs(ro) --> /sbin/init --> 設定默認運行級別 --> 系統初始化 --> 能夠並行執行ctrl+alt+del熱鍵功能定義,系統服務的開啓和關閉,電源管理,dbus管理等 --> 登陸提示符


CentOS 7:

Init程序:systemd,與經典的Init程序徹底不一樣;其配置文件:

/etc/systemd/system/*

/usr/lib/systemd/system/*:systemd的UNIT文件;


/etc/inittab:完全被廢棄;


systemd徹底兼容SysV風格的Init程序及其腳本;所以,service類的命令在CentOS7中依然可用;可是,建議使用CentOS7標配的systemctl命令來控制和管理系統服務;


systemctl命令:

systemctl - Control the systemd system and service manager(控制systemd系統和服務管理器)

systemctl [OPTIONS...] COMMAND [NAME...]


使用systemctl管理服務的通常方式:

systemctl {start|stop|restart|status} name[.service]


設置CentOS 7的默認運行級別:

~]# systemctl set-default {multi-user.target | graphical.target}


查看CentOS 7的默認運行級別:

~]# systemctl get-default

控制系統運行等級

 

32. 啓動系統救援模式

# systemctl rescue

Broadcast message from root@tecmint on pts/0(Wed2015-04-2911:31:18 IST):

The system is going down to rescue mode NOW!

 

33. 進入緊急模式

# systemctl emergency

Welcome to emergency mode!After logging in, type "journalctl -xb" to view

system logs,"systemctl reboot" to reboot,"systemctl default" to try again

to boot intodefault mode.


34. 列出當前使用的運行等級

# systemctl get-default

multi-user.target


35. 啓動運行等級5,即圖形模式

# systemctl isolate runlevel5.target

# systemctl isolate graphical.target


36. 啓動運行等級3,即多用戶模式(命令行)

# systemctl isolate runlevel3.target

# systemctl isolate multiuser.target


36. 設置多用戶模式或圖形模式爲默認運行等級

# systemctl set-default runlevel3.target

# systemctl set-default runlevel5.target


37. 重啓、中止、掛起、休眠系統或使系統進入混合睡眠

# systemctl reboot

# systemctl halt

# systemctl suspend

# systemctl hibernate

# systemctl hybrid-sleep


總結:

POST --> BootSequence(啓動順序) --> BootLoader --> kernel --> rootfs --> init


回顧:

Init程序:

chkconfig


Bootloader:

GRUB:GRand Uniform Bootloader,通用統一引導加載器;

grub 0.x:grub legacy

grub 1.x:grub2


grub legacy:

1st stage: stage1,MBR的前446Bytes;

1.5 stage:stage1_5,MBR以後的若干個扇區中;讓stage1中的bootloader程序可以識別stage2所在的分區的文件系統;

2nd stage:stage2,磁盤的啓動分區,

注意:stage2及內核核心文件必須放置在同一個基本磁盤分區上;


stage2提供的功能:

1.加載操做系統內核核心文件;

2.提供一個菜單和交互式接口;

3.容許用戶編輯菜單內容;

4.命令行接口操做模式;

5.身份認證機制,以保證菜單編輯和內核啓動的安全;


grub的命令行界面:

grub> 


grub的命令行界面中的經常使用命令:

help:獲取全部的grub命令的名稱列表和簡要使用方法;

help GRUB_CMD:顯示特定命令的詳細幫助信息;

root (hd#,#):將指定磁盤的指定分區做爲grub程序的根設備;

hd#:磁盤編號,#通常是從0開始的數字;如hd0表示第一塊磁盤;

#:分區編號,#通常是從0開始的數字,如0表示第一個分區;


(hd0,0):當前計算機上的第一塊磁盤的第一個分區;

find (hd#,#):從指定的分區中搜索文件,並顯示出文件所在位置;

kernel /PATH/TO/KERNEL_CORE_FILE:設定本次啓動時用到的內核文件的絕對路徑;額外還能夠在kernel命令中,爲內核啓動添加更多的內核參數;

ro(以只讀方式掛在根文件系統) root=/dev/sda3 selinux(安全特性)=0 init=/sbin/init(內核啓動以後第一個引導的程序) quiet(內核啓動後不輸出不少信息,安靜啓動) rhgb {1|s|S|single}(單用戶模式啓動)

initrd /PATH/TO/initramfs-VERSION-release.img(找ramdisk的方式)

    注意:若是不能更改root密碼,執行setenforce 0 命令便可,調整爲了警告模式


grub的配置文件:

/boot/grub/grub.conf   <--- /etc/grub.conf

default=0

設定默認啓動菜單項;整個菜單中的全部的title是從0開始編號的;

timeout=5

用戶未做出選擇時,grub會自動引導默認菜單對應的內核的超時時間;

splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz

grub的背景圖片對應的路徑;

hiddenmenu

隱藏grub的啓動菜單

password --md5 CRYPTED_PASSWORD

爲了保護菜單設置的密碼,一般用於防止隨意進入單用戶模式;

title CentOS 6 (2.6.32-573.el6.x86_64)

定義菜單項中的各個"標題",能夠定義多個title項;至少有一項;

  root (hd0,0)

  指定grub的根設備,一般是用來安裝grub的那個分區;

  kernel /vmlinuz-2.6.32-573.el6.x86_64 ro root=UUID=5ebb0e76-bb19-4a80-9c70-0d101c0778e1 nomodeset rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet

  該菜單對應的要啓動的內核及傳遞給內核的各個參數;

  initrd /initramfs-2.6.32-573.el6.x86_64.img

  內核所對應的ramdisk(ramfs)文件

password --md5 CRYPTED_PASSWORD

保護操做系統內核的啓動;


自制小Linux:

1.在某個正常運行的CentOS裏添加一塊硬盤;

2.對硬盤分區,建立相應的文件系統,並掛載(/mnt/boot, /mnt/sysroot);

3.安裝grub程序

# grub-install --root-directory=/mnt(boot的父目錄) /dev/sdb

4.爲小Linux的根分區建立目錄層級結構:

# mkdir -pv /mnt/sysroot/{bin,boot,dev,etc,lib,lib64,proc,sys,mnt,media,tmp,var,usr,sbin}

5.複製內核文件及ramdisk文件到目標系統的啓動分區;

# cp /boot/vmlinuz-VERSION-release /mnt/boot

# cp /boot/initramfs-VERSION-release.img /mnt/boot

6.給grub提供配置文件:

default=0

timeout=10 

title Mylinux (1.0.0)

root (hd0,0)

kernel /vmlinuz-VERSION-release ro root=/dev/sda3 selinux=0 init=/bin/bash

initrd /initramfs-VERSION-release.img

7.將/bin/bash及其共享庫文件,複製到/mnt/sysroot下對應的目錄中;除此以外,還能夠複製其餘的各應用程序及相應的共享庫文件;

8.多執行幾回sync命令,使得內存中緩存或緩衝的數據被保存到磁盤上;

9.新建虛擬機,將小硬盤做爲新虛擬機的硬盤使用;將宿主系統掛起以後,再啓動小Linux便可。


小實驗:

破壞grub,在重啓以前可使用下列方法恢復:dd命令

1.# grub-install --root-directory=/ /dev/sda

2.# grub

grub> root (hd0,0)

grub> setup (hd0)

grub> quit

#


破壞grub或者grub.conf配置文件,重啓以後沒法正確引導內核;可使用光盤或U盤等其餘的引導設備將系統引導起來,並進入rescue模式,其餘操做方法如上。


POST --> BootSequence(BIOS) --> BootLoader(GRUB, MBR-stage1) --> stage1_5 --> stage2 --> kernel --> init


Kernel:

















回顧:

CentOS 5的系統啓動流程:

1.POST(Power-On Self Testing)

主板上ROM中存儲的BIOS程序,被主板芯片映射入內存,從而協助CPU完成;

2.根據BIOS的啓動順序,依次訪問各個存儲設備,檢查其MBR中是否有引導程序,若是有,則將引導程序加載至內存,而且將硬件的管理權移交給引導程序;

3.引導程序(GRUB),開始加載stage1_5,以驅動文件系統;而後從根設備加載stage2至內存;stage2的代碼將會從同一磁盤分區加載kernel至內存,同時將硬件的管理權移交給kernel;

4.kernel試圖掛載根文件系統,若是其內部有被直接編譯進內核的文件系統驅動程序,則無需其餘輔助直接以只讀方式掛載根文件系統便可;不然,必須依賴於ramdisk提供的臨時根文件系統作爲過分,待文件系統驅動成功之後,完成根切換的工做,以只讀方式掛載真正的根文件系統;

5.kernel試圖啓動第一個進程:/sbin/init,然後kernel轉入後臺,將用戶空間的進程管理任務交給init進程來完成;

6.init程序讀取其配置文件:/etc/inittab

7.設置系統當前的運行級別

8.執行/etc/rc.d/rc.sysinit腳本,實施系統初始化;

9.執行/etc/rc.d/rc腳本,而且處理/etc/rc.d/rc$runlevel.d下面的全部服務的連接,全部以K開頭的服務都被中止;全部以S開頭的服務都被啓動;

10.根據運行級別,選擇打開的終端數量及位置;

11.使用mingetty命令調用login命令,爲用戶打印登陸提示符;


Bootloader:

GRUB:

grub 0.x:grub legacy

grub 1.x:grub2


grub

1st stage:MBR

1_5 stage:MBR以後的若干扇區中;

2nd stage:磁盤的啓動分區;


stage2:

提供啓動菜單

命令行接口

交互式界面

提供配置文件

加密保護菜單及內核

...

(hd#,#)


root (hd0,0)

kernel /vmlinuz-VERSION-release ro root=UUID="DEVICE_UUID" selinux=0 /sbin/init

initrd /initrd-VERSION-release


grub的配置文件

/boot/grub/grub.conf <--- /etc/grub.conf

default=0

timeout=5

hiddenmenu

splashp_w_picpath=(hd0,0)/*.xpm.gz

password --md5 CRYPTED_PASSWORD

title OS_ID

root (hd0,0)

kernel /vmlinuz-VERSION-release ARGUMENTS...

initrd /initrd-VERSION-release


自制小Linux:

Systemd:

Systemd的新特性:

1.在系統引導的時候能夠實現服務的並行啓動;

2.可以實現按需激活進程;

在系統啓動時,須要隨系統啓動服務,其服務進程並無啓動,可是Systemd爲每個此類服務進程都註冊了對應的套接字;咱們成這種服務處理方式爲"半激活狀態";

3.可以對當前系統的用戶空間的每一個進程進行狀態快照;之後若是進程出現問題或故障,能夠迅速恢復進程狀態至過去的某一時刻;

4.systemd內部有一種基於依賴關係來定義的服務控制邏輯;


核心管理概念:unit文件 

由systemd相關的配置文件進行標識、識別和配置功能的實現的基礎;

unit的文件分類:

系統服務類

socket

目標類

快照類

...


這些配置文件主要保存在:

/usr/lib/systemd/system/*

/etc/systemd/system/*   符號連接

/run/systemd/system/*   非配置關鍵項;


Unit文件的常見類型:

Service unit:文件的擴展名爲.service,用於定義系統服務,通常.service擴展名能夠省略;


Target unit:文件的擴展名爲.target,用於模擬實現"init程序的運行級別";


Device unit:文件的擴展名爲.device,用於定義內核識別出來的各設備;


Mount unit:文件的擴展名爲.mount,用於定義能夠被systemd管理的文件系統的掛載點;


Automount unit:文件的擴展名爲.automount,用於定義文件系統的自動掛載點的位置;


Socket unit:文件的擴展名爲.socket,用於標識進程間通訊所用到的socket文件;


Swap unit:文件的擴展名爲.swap,用於標識swap設備;


Path unit:文件的擴展名爲.path,用於監控指定目錄中的一個文件或一個子目錄;若是被監控的文件或目錄不存在,則systemd能夠自動建立之;



systemd特性的實現方式:

1.基於socket unit的方式實現進程激活機制;

2.基於device unit的方式實現設備的自動識別,掛載;

3.基於bus的激活機制:

4.基於path的激活機制;


systemd的兼容和不兼容:

兼容:SysV init的腳本;

不兼容:必須使用systemctl命令來管理系統,systemctl命令的格式是固定不變的;全部不經由systemd啓動的系統服務或系統功能,systemctl命令沒法與之直接通訊,也就意味着此類服務或功能,沒法經過systemctl來控制;


systemctl命令:

systemctl - Control the systemd system and service manager


systemctl [OPTIONS...] COMMAND [NAME...]


管理服務類的操做:

啓動: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

設置服務的開機自啓:chkconfig --level runlevels NAME on ==> systemctl enable NAME.service

禁止服務的開機自啓:chkconfig --level runlevels NAME off ==> systemctl disable NAME.service

查看某服務是否開機自啓:chkconfig --list NAME ==> systemctl is-enabled NAME.service

條件式重啓:service NAME condrestart ==> systemctl try-restart NAME.service

重載配置文件:service NAME reload ==> systemctl reload NAME.service


重載或重啓:systemctl reload-or-restart NAME.service

重載或條件式重啓:systemctl reload-or-try-restart NAME.service


查看某服務當前是否處於激活狀態:systemctl is-active NAME.service

查看全部已處於激活狀態的服務:systemctl list-units 

--type=UNIT_TYPE:查看指定unit類型的處於活躍狀態的服務;

--all:顯示全部,包括處於活躍狀態和處於非活躍狀態的各服務;

查看依賴指定服務的其餘服務:systemctl list-dependencies NAME.service


禁止某服務被設定爲開機自啓:systemctl mask NAME.service

取消禁止某服務被設定爲開機自啓:systemctl unmask NAME.service


管理target unit:

模擬運行級別:

0 ==> runlevel0.target, poweroff.target

1 ==> runlevel1.target, rescue.target

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

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

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

5 ==> runlevel5.target, graphical.target

6 ==> runlevel6.target, shutdown.target


運行級別間切換:init # ==> systemctl isolate NAME.target

注意:不是全部的target都能使用上述命令進行級別切換的;只有那些在對應的unit文件中包含了AllowIsolate=yes的語法的target才能用於切換;


修改了unit文件以後,須要經過命令才能使之生效;

# systemctl daemon-reload 


查看運行級別:runlevel ==> systemctl list-units --type=target --all


查看默認運行級別:/etc/inittab(id:3:initdefault:) ==> systemctl get-default 

修改默認運行級別:/etc/inittab(id:3:initdefault:) ==> systemctl set-default NAME.target


rescue.target:緊急救援模式

systemctl isolate rescue.target

systemctl rescue


emergency.target:緊急調試模式

systemctl emergency


rescue模式,至關於安全模式,在切換到此模式時,操做系統會運行最底層的驅動程序,以保證服務器能夠運行起來;


emergency模式,通常來講,一般是硬件故障,或者硬件不可識別,或者硬件可識別但不可用等關乎於計算機硬件設施的問題,一般系統會啓動emergency模式;


除上述模式以外,傳統的init命令,shutdown命令,poweroff命令,halt命令,reboot命令其實都是systemctl的符號連接;


可使用systemctl命令來直接實現上述功能:

關機:systemctl halt,systemctl poweroff

重啓:systemctl reboot

掛起:systemctl suspend

休眠(進程快照):systemctl hibernate

掛起並休眠:systemctl hybrid-sleep


Service unit file的基本文件格式:

/etc/systemd/system:存放的都是各個unit file的符號連接;

/usr/lib/systemd/system


若是自行編寫unit file,能夠直接將文件放置於/etc/systemd/system目錄中;也能夠將其放在/usr/lib/systemd/system目錄中,可是須要爲其提供一個符號連接文件放置於/etc/systemd/system目錄中;


Service unit file文件的基本格式:

此類unit file一般分爲三段:

[Unit]:定義與Unit類型無關的通用選項;用於提供當前unit的描述信息,unit的行爲信息,unit的依賴關係,unit相關幫助文檔信息等;

經常使用的選項語句:

Description:定義相關服務的描述信息;意義性的介紹性的描述;

After:定義了此服務在啓動前必須依賴的其餘服務;

Before:定義了依賴此服務啓動的其餘服務;

Wants:指明依賴關係,說明該服務依賴於哪些其餘的unit;弱依賴,即便被依賴的服務並無被正確激活,也不會影響當前服務是否能夠被激活;

Requires:指明依賴關係,說明該服務依賴於哪些其餘的unit;強依賴,只要被依賴的unit沒法被正確激活,則當前服務必定沒法激活;

Conflict:定義了各unit之間可能存在衝突;

Documentation:定義了跟當前unit相關的管理命令的文檔所在;


[Service]:定義與系統服務相關的專用的選項語句;

經常使用的選項語句:

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

simple:默認值,表示由ExecStart語句指明的應用程序啓動的進程就是主進程;

forking:複製自身,表示有ExecStart語句指明的應用程序所啓動的進程中衆多的子進程中一個將成爲主進程,而一旦啓動完成,父進程會退出;

oneshot:一次性進程,功能相似與simple,在啓動後續的unit以前,主進程會退出;

notify:功能相似於simple,可是其後續的unit僅在經過sd_notify()函數發送通知以後,才能運行ExecStart所指明的應用程序;

EnvironmentFile:環境配置文件,此文件通常用於在ExecStart以前被讀取,併爲ExecStart執行後面的應用程序提供必要的變量以及其餘自定義功能等;

ExecStart:指明啓動此服務所須要運行的命令或腳本;

ExecReload:指明重載配置文件所須要運行的命令或腳本;

ExecStop:指明中止服務所須要運行的命令或腳本;

ExecStartPre:指明在執行ExecStart指明的命令以前須要運行的命令或腳本;

ExecStartPost:指明在執行ExecStart指明的命令以後須要運行的命令或腳本;

Restart:表示若是服務遭遇有意外而終止,則會自動重啓該服務;


[Install]:定義由"systemctl enable"和"systemctl disable"命令在實現服務啓動或禁用時用到的專用選項語句;

WantedBy:弱依賴關係,指的是該服務被哪些其餘units所依賴;

RequiredBy:強依賴關係,指的是該服務被哪些其餘units所依賴;


CentOS 7系統引導過程:

1.POST

2.選擇啓動設備,讀取引導程序

3.裝載引導程序(CentOS 7使用的grub2)

4.裝載引導程序的配置文件: /etc/grub.d/, /etc/default/grub , /boot/grub2/grub.cfg

5.加載initramfs驅動模塊

6.加載內核

7.內核以只讀方式掛載rootfs,啓動systemd進程;

8.執行initrd-*.target全部的unit,包括掛載/etc/fstab文件中全部有效的文件系統;

9.根切換

10.systemd執行默認的target


Linux Kernel:

內核設計流派:

單內核設計,可是充分借鑑了微內核體系設計的優勢,爲內核引入了模塊化機制,內核高度模塊化;

內核被模塊化以後,一些最爲基本最爲重要的內容,被編譯到內核核心;而其餘更多的功能則以模塊的方式來提供;並且支持動態裝載和卸載各內核模塊;


內核的組成部分:

kernel:內核核心文件,通常爲bzImage,通過壓縮處理的鏡像文件;一般內核核心文件保存在/boot目錄下,名稱爲vmlinuz-VERSION-release


kernel object(ko):內核對象,內核額外功能模塊,通常該類文件放置於/lib/modules/VERSION-release


注意:內核模塊與內核核心,版本號必須嚴格匹配;


內核模塊其實就是內核源代碼的一部分,只是在編譯內核的過程當中,因爲其功能可能並不是內核核心所必需,因此以模塊的方式被編譯;


在編譯內核時,內核的功能一般有以下幾種選擇方式:

[ ] kernel Function:No,不選擇編譯此功能;

[M] kernel Function:Modules,將此功能編譯爲內核模塊使用;此功能不佔據內核空間,只佔用磁盤空間;

[*] kernel Function:Yes,將此功能直接編譯進內核核心;


ramdisk:內核補充文件,輔助文件,對於內核核心來講,此文件非必須,是否使用此文件取決於內核可否直接驅動rootfs所在的存儲設備;

設備的驅動程序,SCSI設備的驅動;

邏輯設備驅動程序:LVM的驅動程序,軟RAID驅動程序等;

文件系統:


cpio -i -F initramfs-2.6.32-573.el6.x86_64.img


簡化的rootfs


注意:通常來說,kernel核心文件和ramdisk文件必須具備徹底相同的版本號;


內核管理的相關命令:

uname命令:

uname - print system information

uname [OPTION]...

經常使用選項:

-n:顯示節點名稱

-r:顯示內核版本號,包括VERSION和release

-a:顯示全部信息


lsmod命令:

lsmod - program to show the status of modules in the Linux Kernel


顯示有Linux內核核心已經裝載的內核模塊;


lsmod顯示的內容,分爲三個字段:

模塊名稱 模塊大小 被引用次數及被誰所引用


modinfo命令:

modinfo - program to show information about a Linux Kernel module


modinfo  [ -k kernel ]  [ modulename|filename... ]

經常使用選項:

-F field:僅顯示指定字段的信息;一般只能指定一個字段;

-n:只顯示模塊文件的絕對路徑   (最經常使用)

-a:只顯示模塊的做者信息

-d:只顯示模塊的描述

-l:只顯示許可證信息

-p:只顯示模塊參數信息


depmod命令:

depmod - program to generate modules.dep and map files


內核模塊依賴關係文件及系統信息映射文件的生成工具


實現內核模塊的動態裝載和卸載的命令:

insmod命令:裝載指定的內核模塊文件,但沒法自動解決模塊間的依賴關係;

insmod - simple program to insert a module into the Linux Kernel


insmod [ filename ]  [ module options... ]


注意:filename:模塊文件的絕對路徑;


]# insmod `modinfo -n btrfs`


rmmod命令:

rmmod - simple program to remove a module from the Linux Kernel從Linux內核中刪除模塊的簡單程序


# rmmod module_name


modprobe命令:

modprobe - program to add and remove modules from the Linux Kernel

從內核中移除模塊或者向內核中插入模塊;


modprobe  [ -C config-file ] [ modulename ]  [ module parameters... ]


默認的配置文件:/etc/modprobe.conf , /etc/modprobe.d/*


modprobe module_name:裝載模塊,自動識別和解決依賴關係;


modprobe -r module_name:卸載模塊

相關文章
相關標籤/搜索