第五章:系統

Linux系統啓動流程
1.載入BIOS的硬件信息與POST加電自檢,並依據設置去的第一個可開機設備;
2.讀取並執行第一個可開機設備內MBR的bootLoader(centos7中爲grub2);
3.依據boot loader的設置載入Kernel,kernel會開始偵測硬件與載入驅動程序,以只讀的方式加載跟文件系統;
4.在硬件驅動成功後,Kernel會主動調用systemd程序,並以default.target準備操作系統;
a.systemd執行sysinit.target初始化系統及basic.target準備操作系統
b.systemd啓動multi-user.target的本機與服務器服務
c.systemd執行multi-user.target下的/etc/rc,d/rc.local文件
d.systemd執行multi-user.target下的getty.target及登陸服務
e.systemd執行graphical需要的服務
f.設置系統時鐘
g.激活lvm設備
h.激活swap設別
i.加載額外的驅動程序

Systemd的由來
linux一直以來採用了init進程但是init有兩個缺點:
1.啓動時間長,init進程就是串行啓動,只有前一個進程啓動完,纔會啓動下一個進程。(這也是CentOS5的主要特徵)
2.啓動腳本複雜,init進程只是執行啓動腳本,不管其他事情,腳本需要自己處理各種情況,這是腳本變得很長且複雜。
init:
centos 5 sys init是啓動速度最慢的,串行啓動過程,無論進程相互之間有無依賴關係
centos 6 upstart init 相對啓動速度快一點有所改進,有依賴的進程之間依次啓動而其他與之沒有依賴關係的則並行同步啓動

systemd爲了解決上問的問題而誕生。他的目標是,爲系統的啓動和管理提供一套完整的解決方案。根據linux管理,字母d是守護進程(daemon)的縮寫systemd名字的含義就是守護整個系統
centos7裏的systemd代替了init,成爲了系統中的第一個進程。PID爲1其他的所有進程都是他的子進程,systemd的優點就是功能強大,使用方便,缺點就是體系龐大,非常複雜。
所有進程無論有無依賴關係則都是並行啓動(當然很多時候進程沒有真正啓動而是隻有一個信號或者說標記而已,在真正利用的時候纔會真正啓動)

Systemd特性簡介
<1>系統引導時實現服務並行啓動
<2>按需激活進程(進程在沒有訪問時是不會被啓動的,但是服務依然處於辦活動狀態,只是服務沒有啓動)
<3>系統狀態快照,自我保存某一時刻進程用戶空間狀態的快照,可以回滾到某一時刻
<4>基於依賴關係定義的服務控制邏輯

Systemd核心概念:unit
在systemd中,服務,掛載等資源統一被稱之爲單元,所以systemd中有許多單元類型,服務但源文件的擴展名是.service,同腳本的功能相似。例如有查看,啓動,停止,重啓,啓用或者禁止服務的參數。
systemd單元文件放置位置
/usr/lib/systemd/system #默認單元文件安裝目錄
/etc/systemd/system #系統管理員創建和管理的單元目錄,優先級最高。
service unit #這類的unit的文件擴展名爲.service,主要用於定義系統服務(其扮演了在centos6上/etc/init.d/目錄下的服務腳本的作用)
target.unit #這類unit的文件擴展名爲.target,主要用於模擬實現"運行級別"的概念,爲其他的unit進行邏輯分組
device unit #這類unit文件擴展名爲.device,用於定義內核識別的設備,然後ude利用systemd識別硬件,完成創建設備文件名。
mount unit #這類unit文件擴展名爲.mount,主要用於定義文件系統掛載點
socket unit #這類unit文件擴展名爲.socket,主要用於進程之間通信用到的socket文件
snapshot unit #這類unit文件擴展名爲.snapshot,主要用於實現管理系統快照
swap unit #這類unit文件擴展名爲.swap,主要用於標識管理swap設備
automount unit #這類unit文件的擴展名爲.automount,主要用於文件系統自動掛載設備
path unit #這類unit文件擴展名爲path,主要用於定義文件系統中的文件或目錄

init程序(負責用戶空間的啓動和管理)

init:init即sysvinit,它是system v的成果,被推廣到其他unix系統。常見的init 命令和/etc/init.d即屬於它。
init的優點來自服務串行啓動,可以保證腳本執行順序,也方便調試和排錯。但也因爲串行啓動導致系統啓動時間很長,在linux被應用到移動端後這個缺點成了大問題。此外init需要編寫複雜的啓動腳本,你可以在init.d裏找個文件看看

upstart:upstart通過並行啓動加快執行速度,但對於相互依賴的服務採用併發啓動。它也支持硬件熱插拔時的動態啓動和卸載。

systemd: systemd的併發更激進,因爲對於相互依賴的服務它也同時啓動。而且它的按需啓動比upstart更優秀。
upstart取代了曾經輝煌的init,而systemd將要取代upstart

A:判斷某個服務器有哪個系統初始化?
Q:其實init會將啓動服務轉交給upstart,而upstart轉交給systemd

注:/etc/init.d #開啓啓動文件存放路徑(記得service ??? enable)

service類單元的管理

systemctl list-unit-files #列出系統中所有的單元文件
systemctl list-unit-files --type=service #理出系統中所有service類的單元文件
systemctl list-units #列出所有啓動的單元文件
systemctl list-units --all #列出啓動和未啓動的單元
systemctl list-unit-files --failed #列出所有啓動失敗的單元
systemctl is-active sshd #查看某個服務的當前狀態是否爲活躍的
systemctl stop sshd #停止服務
systemctl start sshd #啓動服務
systemctl restart sshd #重啓服務
systemctl disable sshd #禁止服務開機啓動
systemctl enable sshd #設置服務開機啓動
systemctl is-enabled sshd #查看服務是否開機啓動
systemctl reload sshd #重新加載服務單元文件(配置文件)
systemctl status sshd #查看服務狀態

serice類的單元文件
service的Unit文件可以分爲三個配置區段,其中Unit和install段時所有Unit文件通用的,可用於配置服務(或其他系統資源)的描述,依賴和隨系統啓動方式。而service段則是服務類型的Unit文件(後綴.service)特有的,用於定義服務的具體管理和操作方法。其他的每種配置文件都會有一個特有的配置段,這就是計中不同Unit配置文件最明顯的區別

手動配置單元文件

Unit段
Description:描述信息
Documentation:指定服務的文檔。可以是一個或者多個文檔的URL路徑
Requires:依賴的其他的Unit列表,列在其中的Unit會在這個服務啓動時同時啓動,並且其中有任意一個服務啓動失敗,這個服務就會被終止
Wants:與Requires相似,但只是在被配置的這個Unit啓動時,觸發啓動列出的每個Unit模塊,而不去考慮這些單元模塊是否成功。
After:與Requires相似,但會在後面列出的所有單元模塊全部啓動完成之後纔會啓動當前的服務。
Before:與After相反,在啓動指定的任意一個單元模塊之前,都會首先確保當前服務已經成功運行。
Conflicts:原這個大暖模塊有衝突的單元模塊,如果列出單元模塊中有已經在運行的,這個服務就不能啓動,反之亦然。

Install段
這個段中的配置與Unit有幾分相似,但是這部分配置需要通過systemctl enable命令來激活,並且可以通過systemctl disable 命令禁用。另外這部分配置的目標模塊通常時特定啓動機別的.target文件,用來使得服務在系統啓動時自動運行。
WantedBy:和前面的Wants相似,當指定的單元或者模塊啓動時候就會啓動當前模塊。
RequiredBy:和前面的Requires作用相似,當指定的單元或者模塊啓動時候就會啓動當前模塊。
Also:當這個服務被enable/disable時,將自動enable/disable後面列出的每個模塊。

Service段
這個段是.service文件獨有的,也是對於服務配置最重要的部分,這部分的配置選項非常多,主要分爲服務生命週期控制和服務上下文配置連個方面,下面是比較常用到的一些參數。
Type:服務的類型,常用的有
simple(默認類型)
forking 和 oneshot:默認類型simple類型可以適應於絕大多數的場景,因此一般可以忽略這個參數的配置,而如果服務進程啓動之後會通過fork系統調用創建子進程,然後關閉應用程序本身進程的情況,則應該將Type的值設置爲forking,否則systemd將不會跟蹤子進程的行爲,而認爲服務已經退出,oneshot類型的服務就是啓動完成之後沒有進程了。
ExecStart:這個參數是幾乎每個.service文件都會有的,指定服務器懂得主要命令,在每個配置文件中只能使用一次。
ExecStartPre:指定在啓動執行ExecStart的命令前的準備工作,可以有多個,如前面第二個例子中所示,所有的命令會按照文件中書寫的順序一次被執行。
ExecStartPost:指定在啓動執行ExecStart的命令後的收尾工作,也可以有多個。
ExecStop:停止服務之前所需要執行的命令。
ExecStopPost:指定在ExecStop命令執行後的收尾工作,也可以有多個。
Restart:這個值用於指定在什麼情況下需要重啓服務進程。常用的值有no,on-sucess,on-failure,on-abnormal,on-abort 和always 。默認值爲no,即不會自動啓動服務。
StandarOutput=標準輸出
StandarError=錯誤輸出

注:https://blog.csdn.net/educast/article/details/86506698

手動創建service類的單元未見

[Unit]
Description=My-demo Service
[Service]
Type=oneshot
ExecStart=/bin/bash /root/test.sh
StandarOutput=syslog
StandarError=inherit

[Install]
WantedBy=multi-user.target

systemctl daemon-reload #重新加載單元文件

注:
shutdown.target #運行級別0(關機)
emergency.target #運行級別1(單用戶)
multi-user.target #運行級別3(最小化)
graphical.target #運行級別5(圖形界面)
reboot.target #運行級別6(重啓)
#######2,4未定義 默認爲3

systemctl list-dependencies multi-user.target #查看單元之間的依賴關係
systemctl get-default #查看啓動系統時默認的單元組(運行級別)
systemctl isolate runlevel5.target #臨時切換系統運行級別
systemctl isolate graphical.target #臨時切換系統運行級別
systemctl set-default multi-user.target #永久切換系統級別

模塊管理

Linux內核

linux內核是單內核,模塊化(動態裝載和卸載)設計的。
linux內核組成部分:
kernel:內核核心,一般爲bzlmage格式,通常位於/boot目錄下,名稱爲vmlinuz-VERSION-relase,當系統啓動之後該文件不再使用,因爲已經加載到內存。
kernel object:內核模塊,一般放置於/lib/modules/VERSION-RELEASE/ 內核模塊於內核和新版本一定要嚴格匹配。

linux是一個一體化的內核由於內核中的各部件聯繫緊密,因此這種內核最重要的特點就是運行效率較高。但也就是由於內核中各種不見聯繫緊密,也給它帶來了一個致命的缺點:當因某種原因需要增加,擴充時,用戶必須對內核全部重新編譯一次。所以,爲了彌補這個缺點,linux建立了模塊機制。
從代碼特徵上來看,模塊就是可完成一項獨立功能大的一組函數的集合。從使用特徵上來看,他在被需要時可以隨時被安裝,而不需要時又可以隨時被卸載。總之,模塊是一個爲內核(從某種意義上來說,內核也是一個模塊)或其他內核模塊提供使用功能的代碼塊。
準確的說,模塊就是一個已編譯但未連接的可執行文件。

什麼是模塊?

從內核角度來看,模塊由在運行時可連接並刪除的,包含了至少2個函數的代碼段。這個代碼段一旦被連接到內核,他就可以時內核的一部分,所以他也被叫做內核模塊。
從用戶角度來看,模塊時內核的一個外掛的配件:需要時可以將其掛接到內核上,已完成用戶要求的任務:不需要時即可將其刪除。他給用戶提供了擴充內核功能的手段。

模塊的特點
	1.模塊本身並不被編譯進內核文件(zlmage或者bzlmage)
	2.可以根據需求,在內核運行期間動態安裝或者卸載。
	內核模塊編譯選擇模式:
		[]:N,不編譯此部分
		[M]:Moudule,以模塊化編譯,可以臨時裝載,佔用磁盤空間,不佔用內核空間。
		[*]:Y,編譯進內核盒新,可以直接調用。

模塊的管理:

lsmod 或 cat /proc/modules #列出已經加載的內核模塊
modinfo vfat #查看模塊信息
modprobe vfat #掛載新模塊以及新模塊相依賴端的模塊
modprobe -r vfat #卸載弄塊以及模塊相依賴的模塊

設置開啓自動掛載模塊
echo '/usr/sbin/modprobe vfat' >> /etc/sysconfig/modules/vfat.modules
chmod a+x /etc/sysconfig/modules/vfat.modules  #賦予文件執行權
echo '/usr/sbin/modprobe vfat' >> /etc/rc.modules	
chmod a+x /etc/rc.modules	
注:/etc/sysconfig/modules/   	#開機自動掛載模塊路徑.modules
	/etc/rc.modules			 	#開機執行的文件rc.

GRUB2簡介
grub2全程時GRand Uinfied BootLoader,Version 2(第二版大一統引導裝載程序)。 他是目前流行大的大部分Linux發行版本的主要引導加載程序。grub2是一個英語計算機尋找操作系統內核並加載其到內存的智能程序。
grub被設計爲兼容操作系統多重引導規範,它能夠用來引導不同版本的Linux和其他的開源操作系統;他還能鏈式加載專有的操作系統的引導記錄。
grub允許用戶從任何給定的Linux發行版本的幾個不同內核中選擇一個進行引導。這個特徵使操作系統,在因爲關鍵軟件不兼容或其它某些原因升級失敗時,具備引導到先前版本的內核的能力。grub能夠通過文件/boot/grub2/grub.cfg進行配置。

實例1:
vi /etc/default/grub
GRUB_TIMEOUT=5 #設置選擇菜單的超時時間
GRUB_CMDLINE_LINUX=“rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet” #取消靜默啓動顯示啓動流程需要刪除rhgb quiet(修改完需要重新生成grub2配置文件)
grub2-mkconfig -o /boot/grub2/grub.cfg #重新生成grub配置文件

grub2配置文件
/etc/default/grub #可以改變引導菜單外觀的主要文件(相當於分割文件,但最終會被/boot/grub2/grub.cfg讀取否則不生效)
/boot/grub2/grub.cfg #grub2的配置文件
/etc/grub.d/* #各種用於生成grub.cfg的腳本文件
/etc/grub.d/40_custom #用戶自定義的配置文件模板

啓動項管理
系統默認的啓動項是通過/etc/default/grub 配置文件內的GRUB_DEFAULT來定義的。不過,要是GRUB_DEFAULT被設置爲saved,這選項便存儲在/boot/grub2/grubenv中。
cat /etc/grub2.cfg (有幾個menuentry就有幾個啓動項,可修改啓動項名稱)
egrep ‘^menuentry’ /boot/grub2/grub.cfg | awk -F “’” ‘{print $2}’
grub2-editenv list #查看默認啓動項
grub2-set-default 1 #設置默認啓動項

實例2:模擬grub故障並修復。
grub2故障模擬
dd if=/dev/zero of=/dev/sda bs=200 count=1 #模擬破壞sda的MBR
reboot #grub不能正常引導
grub2故障修復
將安裝鏡像放到光盤或者U盤中連接到服務器,從光盤或U盤啓動,進入修復控制檯
troubleshoting → rescue a centos system → 1(以讀寫的方式掛載系統環境) → Enter → chroot /mnt/sysimage → grub2 install /dev/sda #重新安裝grub

實例3:單用戶破解root用戶口令
啓動項界面按“e”(編輯greub) → 找到ro改爲rw init=/sysroot/bin/sh → CTRL + X 繼續啓動 → chroot /sysroot #跳轉跟環境 → passwd root → touch /.autorelabel #創建selinux初始化標籤使用的文件 → exit #退出根環境 → reboot #重啓

實例4:grub加密和破解
grub加密
grub2-mkpasswd-pdkdf2 #生成grub加密需要的密碼文
vi /etc/grub.d/40_custom #設置grub加密用戶和口令
set supperusers=“root”
password_pdkdf2 root 密碼文(is以後 不許多加空格)
grub2-mkconfig -o /boot/grub2/grub.cfg
grub破解
將安裝鏡像放到光盤或者U盤中連接到服務器,從光盤或U盤啓動,進入修復控制檯
troubleshoting → rescue a centos system → 1(以讀寫的方式掛載系統環境) → Enter → chroot /mnt/sysimage → 刪除/etc/grub.d/40_custom 裏面定義加密的內容

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章