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


# 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:卸載模塊