cenos6啟動流程
- 加載BIOS的硬件信息,獲取第一個啟動設備
- 讀取第一個啟動設備MBR的引導加載程序(grub)的啟動信息
- 加載核心操作系統的核心信息,核心開始解壓縮,并嘗試驅動所有的硬件設備
- 核心執行init程序,并獲取默認的運行信息
- init程序執行/etc/rc.d/rc.sysinit文件
- 啟動核心的外掛模塊
- init執行運行的各個批處理文件(scripts)
- init執行/etc/rc.d/rc.local
- 執行/bin/login程序,等待用戶登錄
- 登錄之后開始以Shell控制主機
POST
Power-On-Self-Test,加電自檢,是BIOS功能的一個主要部分。負責完成對CPU、主板、內存、硬盤子系統、顯示子系統、串并行接口、鍵盤、CD-ROM光驅等硬件情況的檢測
ROM:BIOS,Basic Input and Output System,保存著有關計算機系統最重要的基本輸入輸出程序,系統信息設置、開機加電自檢程序和系統啟動自舉程序等
RAM:CMOS互補金屬氧化物半導體,保存各項參數的設定
按次序查找引導設備,第一個有引導程序的設備為本次啟動設備
Boot Sequence
選擇要啟動的硬件設備,選擇了之后就可以讀取這個設備上位于MBR里頭的bootloader了。這一步的實現是這樣的:根據BIOS中對啟動順序的設定,BIOS自己會依次掃描各個引導設備,然后第一個被掃描到具有引導程序(bootloader)的設備就被作為要啟動的引導設備
GRUB
POST --> Boot Sequence(BIOS) --> Boot Loader --> Kernel(ramdisk) --> rootfs --> switchroot --> /sbin/init -->(/etc/inittab, /etc/init/*.conf) --> 設定默認運行級別 --> 系統初始化腳本rc.sysinit --> 關閉或啟動對應級別的服務 --> 啟動終端
- 提供菜單
- 啟動內核
- 轉交給別的loader(linux)
stage1:mbr
stage1_5:mbr之后的扇區,讓stage1中的bootloader能識別stage2所在的分區上的文件系統
stage2:磁盤分區(/boot/grub/)
安裝grub
-
grub-install
安裝grub stage1和stage1_5到/dev/DISK磁盤上,并復制GRUB相關文件到 /boot/grub目錄下
-
grub
grub> root (hd#,#)
grub> setup (hd#)
交互式,指定根,安裝grub到磁盤,根據/boot/grub/下的grub文件進行修復,如無此類文件,還是要通過grub-install進行修復
/boot/grub/grub.conf <-- /etc/grub.conf
[root@centos6 grub]# cat grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/sda2
# initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS 6 (2.6.32-696.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=7e51be47-2999-407e-8e20-1c48096a3a8c rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-696.el6.x86_64.img
default=#:設定默認啟動的菜單項;落單項(title)編號從0開始
timeout=#:指定菜單項等待選項選擇的時長
splashimage=(hd#,#)/PATH/XPM_FILE:菜單背景圖片文件路徑
password [--md5] STRING:啟動菜單編輯認證
hiddenmenu:隱藏菜單
title TITLE:定義菜單項“標題”, 可出現多次
root (hd#,#):查找stage2及kernel文件所在設備分區;為grub的根
kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:啟動的內核
initrd /PATH/TO/INITRAMFS_FILE:內核匹配的ramfs文件
password [--md5|--encrypted ] STRING:啟動選定的內核或操作系統時進行認證
grub加密
grub-md5-crypt:md5加密
grub-crypt:sha512加密
default=0
timeout=5
password magedu 解鎖grub編輯時,需要密碼
password --md5 xxxxxx 使用grub-md5-crypt生成
password --encrpted xxxxx 使用grub-crypt
title redhat 6
root (hd0,0)
kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=bfd90cd4-8516-4a60-8f1a-f7c3511a6b3f rhgb quiet selinux=0
initrd /initramfs-2.6.32-696.el6.x86_64.img
password magedu #這里的作用,進入內核時就會要求驗證密碼
kernel
自身初始化:
- 探測可識別到的所有硬件設備
- 加載硬件驅動程序(借助于ramdisk加載驅動)
- 以只讀方式掛載根文件系統
- 運行用戶空間的第一個應用程序:/sbin/init
ramdisk
ramdisk是用于實現系統初始化的、基于內存的磁盤設備,即加載至內存(的某一段空間)后把內存當磁盤使用,并在內存中作為臨時根文件系統提供給內核使用,幫助內核掛載真正的根文件系統。而之所以能夠幫助內核掛載根文件系統是因為在ramdisk這個臨時文件系統的/lib/modules目錄下有真正的根文件系統所在設備的驅動程序;除此之外,這個臨時文件系統也遵循FHS,例如有這些固定目錄結構:/bin, /sbin, /lib, /lib64, /etc, /mnt, /media, …
ramdisk文件的制作:
- mkinitrd /boot/initramfs-(uname -r).img(uname -r)
- dracut /boot/initramfs-(uname -r).img(uname -r)
init初始化
/sbin/init --> (/etc/inittab) --> 設置默認運行級別 --> 運行系統初始腳本、完成系統初始化 --> (關閉對應下需要關閉的服務)啟動需要啟動服務 --> 設置登錄終端
- 讀取其初始化文件/etc/inittab
- 初始運行級別(RUN LEVEL)
- 系統初始化腳本
- 對應運行級別的腳本目錄
- 捕獲某個關鍵字順序
- 定義UPS電源終端/恢復腳本
- 在虛擬控制臺生成getty
- 在運行級別5初始化X
/etc/inittab
運行級別:為系統運行或維護等目的而設定
0:關機
1:單用戶模式(root自動登錄), single, 維護模式
2:多用戶模式,啟動網絡功能,但不會啟動NFS;維護模式
3:多用戶模式,正常模式;文本界面
4:預留級別;可同3級別
5:多用戶模式,正常模式;圖形界面
6:重啟
默認級別: 3, 5
切換級別:init #
查看級別:runlevel ; who -r
CentOS5的/etc/inittab
每一行定義一種action以及與之對應的process
d:runlevel:action:process
action:
wait:切換至此級別運行一次
respawn:此process終止,就重新啟動之
initdefault:設定默認運行級別;process省略
sysinit:設定系統初始化方式,此處一般為指定
/etc/rc.d/rc.sysinit
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
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
CentOS6的/etc/inittab
設置系統默認的運行級別
/etc/rc.d/rc.sysinit
系統初始化腳本
- 設置主機名
- 設置歡迎信息
- 激活udev和selinux
- 掛載/etc/fstab文件中定義的文件系統
- 檢測根文件系統,并以讀寫方式重新掛載根文件系統
- 設置系統時鐘
- 激活swap設備
- 根據/etc/sysctl.conf文件設置內核參數
- 激活lvm及software raid設備
- 加載額外設備的驅動程序
- 清理操作
/etc/rc.d/rcN.d/
關閉或啟動這個運行級別下的服務,(注意:關閉在前,啟動在后)
[root@centos6 ~]# ls /etc/rc.d/rc3.d/
K01smartd K69rpcsvcgssd K95firstboot S13irqbalance S26udev-post
K02oddjobd K73winbind K99rngd S13rpcbind S28autofs
K05wdaemon K74ntpd S01sysstat S15mdmonitor S50bluetooth
K10psacct K75ntpdate S02lvm2-monitor S22messagebus S55sshd
K10saslauthd K75quota_nld S05rdma S23NetworkManager S80postfix
K15htcacheclean K76ypbind S08ip6tables S24nfslock S82abrtd
K15httpd K84wpa_supplicant S08iptables S24rpcgssd S83abrt-ccpp
K30spice-vdagentd K87restorecond S10network S25blk-availability S90crond
K50dnsmasq K88sssd S11auditd S25cups S95atd
K50kdump K89netconsole S11portreserve S25netfs S99certmonger
K60nfs K89rdisc S12rsyslog S26acpid S99local
K61nfs-rdma K92pppoe-server S13cpuspeed S26haldaemon
K表示關閉,S表示開啟,##表示運行次序,數字越小,越先運行,數字越小的服務,通常為被依賴到的服務
注意:正常級別下,最后啟動一個服務S99local沒有鏈接至/etc/rc.d/init.d一個服務腳本,而是指向了/etc/rc.d/rc.local腳本
不便或不需寫為服務腳本放置于/etc/rc.d/init.d/目錄,且又想開機時自動運行的命令,可直接放置于/etc/rc.d/rc.local文件中
管理服務
chkconfig
- --list [name]:查看服務在所有級別的啟動或關閉設定情形
- --add name:添加服務
- --del name:刪除服務
- [--level levels] name <on|off|reset>:指定要設置的級別;省略時表示2345
自定義服務
[root@centos6 grub]# ls /etc/init.d/
abrt-ccpp crond irqbalance nfs rdisc single
abrtd cups kdump nfslock rdma smartd
abrt-oops dnsmasq killall nfs-rdma restorecond spice-vdagentd
acpid firstboot lvm2-lvmetad ntpd rngd sshd
atd functions lvm2-monitor ntpdate rpcbind sssd
auditd haldaemon mdmonitor oddjobd rpcgssd sysstat
autofs halt messagebus portreserve rpcidmapd udev-post
blk-availability htcacheclean netconsole postfix rpcsvcgssd wdaemon
bluetooth httpd netfs pppoe-server rsyslog winbind
certmonger ip6tables network psacct sandbox wpa_supplicant
cpuspeed iptables NetworkManager quota_nld saslauthd ypbind
可以直接使用/etc/init.d/SOMESERCICE
來啟動、關閉、重啟和查看指定的服務,當然也可以使用service命令來管理服務
xinetd
瞬態服務被xinetd進程所管理,當被管理的服務被請求時,喚醒服務,無請求時自動交給xinetd管理
常見故障
-
故障原因:未使用grub-install安裝過grub相關文件,刪除/boot/grub/中除grub.conf以外的所有文件
故障現象:啟動不受影響
-
故障原因:使用grub-install安裝過grub相關文件,刪除/boot/grub/中除grub.conf以外的所有文件
故障現象:菜單進不去,直接提示ERROR 15
解決辦法:
- 進入rescue
- chroot /mnt/sysimage
- grub-install /dev/sda
- sync;exit
- reboot
-
故障原因:破壞硬盤的前446字節,即破壞grub的stage1階段,dd if=/dev/zero of=/dev/sda bs=1 count=446
故障現象:菜單進不去,直接提示ERROR 15
解決辦法:見2
-
故障原因:破壞stage1.5,dd if=/dev/zero of=/dev/sda bs=1 count=10240 seek=512
故障現象:菜單進不去,光標一直閃爍
解決辦法:見2
-
故障原因:刪除/boot/grub/grub.conf
故障現象:不進菜單,直接進入grub命令行
解決辦法:見2,或者直接在grub命令行操作
root (hd0,0)
kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=/dev/sda2 rhgb quiet selinux=0
initrd /initramfs-2.6.32-696.el6.x86_64.img
-
boot
注意:第一步先按照順序掛載上,然后第二部使用tab補全,看文件就可以判斷出是不是boot目錄
-
故障原因:刪除/boot/grub/下的所有文件
故障現象:菜單進不去,直接提示ERROR 15
解決辦法:
進入rescue
chroot /mnt/sysimage
grub-install /dev/sda
-
vim /boot/grub/grub.conf
default=0
timeout=5
title redhat
root (hd0,0)
kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=bfd90cd4-8516-4a60-8f1a-f7c3511a6b3f rhgb quiet
initrd /initramfs-2.6.32-696.el6.x86_64.img exit;reboot
-
故障原因:刪除整個/boot
故障現象:不進入菜單,直接希納是ERROR 15
解決辦法:
進入rescue
chroot /mnt/sysimage
grub-install /dev/sda
mount /dev/cdrom /media
cp /media/isolinux/vmlinuz /boot/vmlinuz-$(uname -r)
mkinitrd /boot/initramfs-(uname -r).img(uname -r)
-
vim /boot/grub/grub.conf
default=0
timeout=5
title redhat
root (hd0,0)
kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=bfd90cd4-8516-4a60-8f1a-f7c3511a6b3f rhgb quiet
initrd /initramfs-2.6.32-696.el6.x86_64.img exit;reboot
-
故障原因:刪除/etc/fstab,刪除/etc/init/rcS.conf,刪除/etc/rc.d/rc.sysinit,刪除/boot下的所有文件
故障現象:不進入菜單,直接希納是ERROR 15,并且進入救援模式無法找到根并進行自動掛載
解決辦法:
進入rescue
-
編寫/etc/fstab
UUID=b6d6d6ca-8f04-43a3-84a4-d34d2b2f50d1 /boot ext4 defaults 0 2
UUID=bfd90cd4-8516-4a60-8f1a-f7c3511a6b3f / ext4 defaults 0 1
UUID=50950a59-83cb-4688-80ec-d9883019fcce /app ext4 defaults 0 0
UUID=5a1ff0b5-5c19-42e3-8b6a-65e7d332ee0c swap swap defaults 0 0 重新進入rescue
chroot /mnt/sysimage
grub-install /dev/sda
-
恢復內核文件及ramdisk
cp /media/isolinux/vmlinuz /boot/vmlinuz-$(uname -r)
mkinitrd /boot/initramfs-(uname -r).img(uname -r)
-
vim /boot/grub/grub.conf
default=0
timeout=5
title redhat
root (hd0,0)
kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=bfd90cd4-8516-4a60-8f1a-f7c3511a6b3f rhgb quiet
initrd /initramfs-2.6.32-696.el6.x86_64.img rpm -qf /etc/init/rcS.conf /etc/rc.d/rc.sysinit
-
mount /dev/cdrom /media
cp /media/Packages/initscripts-9.03.58-1.el6.centos.x86_64.rpm /app
rpm2cpio initscripts-9.03.58-1.el6.centos.x86_64.rpm |cpio -id
cp etc/init/rcS.conf /etc/init
cp etc/rc.d/rc.sysinit /etc/rc.d
exit;reboot
-
故障原因:基于lvm,將/etc/fstab及/boot下的所有文件刪除
故障現象:不進入菜單,直接希納是ERROR 15,并且進入救援模式無法找到根并進行自動掛載
解決辦法:
- 進入rescue
- lvscan;vgchange -ay
- 同上
-
故障原因:刪除//etc/inittab
故障現象:一直加載系統
解決辦法:有備份直接救援模式恢復即可,下面是無備份的解決辦法
進入rescue
chroot /mnt/sysimage
rpm -qf /etc/inittab
exit退出chroot模式
mount /dev/sr0 /mnt/source
-
rpm -ivh --replacepkgs | force /mnt/source/Packages/initscripts-9.03.49-1.el6.centos.x86_64.rpm
rpm2cpio /mnt/source/Packages/initscripts-9.03.49-1.el6.centos.x86_64.rpm| cpio -idv ./etc/inittab;cp etc/inittab /mnt/sysimage/etc
reboot
自制Linux
-
分區并創建文件系統,至少分兩個區,一個/boot,一個/
fdisk /dev/sdb mkfs.ext4 /dev/sdb1;mkfs.ext4 /dev/sdb2
-
創建對應目錄并掛載
mkdir /mnt/sysimage;mount /dev/sdb2 /mnt/sysimage/ mkdir /mnt/sysimage/boot;mount /dev/sdb1 /mnt/sysimage/boot/
-
安裝grub
grub-install --root-directory=/mnt/sysimage /dev/sdb
-
恢復內核和initramfs文件
cp /boot/vmlinuz-2.6.32-696.el6.x86_64 /mnt/sysimage/boot/ cp /boot/initramfs-2.6.32-696.el6.x86_64.img /mnt/sysimage/boot/
-
建立grub.conf
default=0 timeout=5 title redhat root (hd0,0) kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=/dev/sda2 rhgb quiet selinux=0 init=/bin/bash initrd /initramfs-2.6.32-696.el6.x86_64.img
-
利用腳本復制bash和相關命令及相關庫文件,如:ifconfig,insmod,ping,mount,ls,cat,df,lsblk,blkid等
#!/bin/bash copy_cmd() { local cmd_destdir=$destdir$(dirname $(which $1)) if [ ! -d $cmd_destdir ];then mkdir -pv $cmd_destdir fi cp -v $(which $1) $cmd_destdir } copy_libfile() { ldd $(which $1) |grep -oE "/.* " | while read libfile do local lib_destdir=$destdir$(dirname $libfile) local lib_destfile=$destdir$libfile if [ -e $lib_destfile ];then continue elif [ -d $lib_destdir ];then cp -v $libfile $lib_destdir else mkdir -pv $lib_destdir cp -v $libfile $lib_destdir fi done } destdir=/mnt/sysimage if [ ! -d $destdir ];then mkdir $destdir fi while true;do echo -ne "\e[33mPlease input a execute command:\e[0m" read cmd if [ "$cmd" == quit ];then exit fi which $cmd &> /dev/null || { echo $cmd not exist;continue; } copy_cmd $cmd copy_libfile $cmd done
-
拷貝網卡模塊文件
cp /lib/modules/2.6.32-696.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/sysimage/lib64/
-
創建根下其他目錄
mkdir /mnt/sysimage/{etc,dev,proc,sys,home,var,mnt,media,root,tmp,lib}
chroot /mnt/sysimage;sync
-
啟動后配置網卡
insmod /lib64/e1000.ko ifconfig eth0 xxx.xxx.xxx.xxx/16
內核
uname
顯示系統信息,常用選項:
- -n:顯示節點名稱
- -r:顯示VERSION-RELEASE
- -a:顯示所有信息
lsmod
顯示由核心已經裝載的內核模塊,顯示的內容來自于:/proc/modules文件
modinfo
顯示模塊的詳細描述信息,常用選項:
- -n:只顯示模塊文件路徑
- -p:顯示模塊參數
- -a:author
- -d:description
- -l:license
modprobe
裝載內核模塊,-r選項卸載內核模塊
depmod
內核模塊依賴關系文件及系統信息映射文件的生成工具
insmod
裝載指定模塊文件,不自動解決依賴模塊
rmmod
卸載模塊
編譯內核
- 安裝開發包組
yum groupinstall "Development Tools"
- 下載源碼包,并解壓到
/usr/local/src
下,tar xvf linux-4.17.3.tar.xz -C /usr/local/src
- 安裝所需的其他rpm包,
yum -y install ncurses-devel elfutils-libelf-devel openssl-devel
- 使用
make menuconfig
啟動一個基于curses的文本窗口界面,可以用來配置內核參數,比如啟用NTFS文件系統,會生成一個.config
文件,一般情況下在安裝完操作系統的時候,會在其/boot
目錄下生成一個config-VERSION-RELEASE
的內核參數配置文件,可以復制過來作為初始化使用 - 使用
make [-j 8]
來編譯,-j
選項用來指定內核的數目 - 使用
make modules_install
來安裝模塊 - 使用
make install
安裝內核相關的文件,然后重啟即可
清理編譯文件
make clean:清理大多數編譯生成的文件,但會保留config文件等
make mrproper:清理所有編譯生成的文件、config及某些備份文件
make distclean:mrproper、patches以及編譯器備份文件
卸載內核
- 刪除/lib/modules/目錄下不需要的內核庫文件
- 刪除/usr/src/linux/目錄下不需要的內核源碼
- 刪除/boot目錄下啟動的內核和內核映像文件
- 更改grub的配置文件,刪除不需要的內核啟動列表
centos7啟動流程
內核啟動流程
- POST,加電自檢
- 根據 boot sequence加載啟動的硬盤
- 加載磁盤的第0個扇區第0個磁道(前512個字節),讀取boorloader,也就是前446個字節,執行grub的第一個階段,然后執行grub的1.5階段,加載/boot目錄所在分區的驅動,讀取/boot/grub下的內容,執行grub的第二個階段,將內核和ramdisk讀取到內存,借助ramdisk將真正的根掛載
/sbin/init
centos5:SysVinit啟動流程的時候是串行的,即使服務之間沒有依賴關系
centos6:Upstart啟動服務的時候,依賴的服務之間才是串行的,不依賴的服務之間是并行的
centos7:Systemd啟動服務的時候,所有的服務之前都是并行的,如果B服務依賴于A服務,那么B服務在啟動的時候,A服務會主動發送一個信號欺騙B服務自己已經啟動,B是能夠正常啟動的,雖然它們之間存在依賴關系,但是只有在真正的使用B服務的時候,才會用到A服務提供到的能力
systemd
系統啟動和服務器守護進程管理器,負責在系統啟動或運行時,激活系統資源,服務器進程和其他進程
特點:
- 系統引導時實現服務并行啟動
- 按需啟動守護進程
- 自動化的服務依賴關系管理
- 同時采用socket式與D-Bus總線式激活服務
- 系統狀態快照
unit
unit表示不同類型的systemd對象,通過配置文件進行標識和配置,文件中主要包含了系統服務、監聽的socket,保存的系統快照以及其他與init相關的信息
配置文件
/usr/lib/systemd/system:每個服務主要的啟動腳本設置,類似于之前的/etc/init.d/
/run/systemd/system:系統執行過程中所產生的服務腳本,比上面目錄優先運行
/etc/systemd/system:管理員建立的執行腳本,類似于/etc/rc.d/rcN.d/Sxx類的功能,比上面的目錄優先運行
類型
可以使用 systemctl -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目錄
systemctl
在centos7中推薦使用systemctl來管理服務,當然依然兼容之前版本中的service來管理服務。用法:systemctl COMMAND SERVICENAME.service
systemctl start name.service:啟動服務
systemctl stop name.service:停止服務
systemctl restart name.service:重啟服務
systemctl status name.service:查看服務狀態
systemctl try-restart name.service:條件式重啟,已啟動才重啟,否則不做操作
systemctl reload name.service:重載
systemctl mask name.service:禁止自動或手動啟動服務
systemctl unmask name.service:取消禁止
systemctl enable name.service:開機啟動服務
systemctl disable name.service:開機不啟動服務
systemctl is-active name.service:查看某服務當前激活與否的狀態
systemctl list-units -t service:查看所有已經激活的服務
systemctl list-units -t service -a:查看所有服務
systemctl list-unit-files --type service:查看所有服務的開機自啟狀態
systemctl is-enabled name.service:查看服務是否開啟
systemctl list-dependencies name.service:查看服務依賴關系
systemctl kill unitname:殺死進程
systemctl rescue:切換至緊急救援模式
systemctl emergency:切換至emergency
systemctl halt/poweroff:關機
systemctl reboot:重啟
systemctl suspend:掛起
systemctl hibernate:休眠
systemctl hybrid-sleep:休眠并掛起
服務狀態
loaded:unit配置文件已處理
active(running):一次或多次持續處理的運行
active(exited):成功完成一次性的配置
active(waitinig):運行中,等待一個事件
inactive:不運行
enabled:開機啟動
disabled:開啟不啟動
static:開機不啟動,但是可以被另一個啟動的服務激活
service unit格式
[root@centos7 ~]# cat /usr/lib/systemd/system/crond.service
[Unit]
Description=Command Scheduler
After=auditd.service systemd-user-sessions.service time-sync.target
[Service]
EnvironmentFile=/etc/sysconfig/crond
ExecStart=/usr/sbin/crond -n $CRONDARGS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
[Install]
WantedBy=multi-user.target
unit
定義與Unit類型無關的通用選項,用于提供unit的描述信息、unit行為以及依賴關系
Description:描述信息
After:定義unit的啟動次序,表示當前unit應該晚于哪些unit啟動,其功能與Before相反
Requires:依賴到的其它units,強依賴,被依賴的units無法激活時,當前unit也無法激活
Wants:依賴到的其它units,弱依賴
Conflicts:定義units間的沖突關系
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后運行
ExecStop:指明停止unit要運行的命令或腳本
Restart:當設定Restart=1 時,則當次daemon服務意外終止后,會再次自動啟動此服務
Install
定義由”systemctl enable”以及”systemctl disable”命令在實現服務啟用或禁用時用到的一些選項
Alias:別名,可使用systemctl command Alias.service
RequiredBy:被哪些units所依賴,強依賴
WantedBy:被哪些units所依賴,弱依賴
Also:安裝本服務的時候還要安裝別的相關服務
注意:對于新創建的unit文件,或者修改了的unit文件,要通知systemd重載此配置文件,而后可以選擇重啟:systemctl daemon-reload
運行級別
在systemd中,運行級別由unit文件中的.target文件來定義
[root@centos7 system]# ll /usr/lib/systemd/system/runlevel?.target
lrwxrwxrwx. 1 root root 15 May 15 12:54 /usr/lib/systemd/system/runlevel0.target -> poweroff.target
lrwxrwxrwx. 1 root root 13 May 15 12:54 /usr/lib/systemd/system/runlevel1.target -> rescue.target
lrwxrwxrwx. 1 root root 17 May 15 12:54 /usr/lib/systemd/system/runlevel2.target -> multi-user.target
lrwxrwxrwx. 1 root root 17 May 15 12:54 /usr/lib/systemd/system/runlevel3.target -> multi-user.target
lrwxrwxrwx. 1 root root 17 May 15 12:54 /usr/lib/systemd/system/runlevel4.target -> multi-user.target
lrwxrwxrwx. 1 root root 16 May 15 12:54 /usr/lib/systemd/system/runlevel5.target -> graphical.target
lrwxrwxrwx. 1 root root 13 May 15 12:54 /usr/lib/systemd/system/runlevel6.target -> reboot.target
使用systemctl list-unit-files --type target -all
查看所有target的狀態
使用systemctl list-dependencies graphical.taget
查看依賴性
級別切換:依然可以使用init來切換,也可以使用systemctl isolate name.target
來切換
獲取默認運行級別:systemctl get-default
設置默認運行級別:systemctl set-default multi-user.target
grub2
在centos7中使用了grub2替代了grub legacy
引導順序
- UEFi或BIOS初始化,運行POST開機自檢
- 選擇啟動設備,引導裝載程序, centos7是grub2
- 加載裝載程序的配置文件:/etc/grub.d/、/etc/default/grub、/boot/grub2/grub.cfg
- 加載initramfs驅動模塊
- 加載內核選項
- 內核初始化,centos7使用systemd代替init
- 執行initrd.target所有單元,包括掛載/etc/fstab
- 從initramfs根文件系統切換到磁盤根目錄
- systemd執行默認target配置,配置文件/etc/systemd/system/default.target
- systemd執行sysinit.target初始化系統及basic.target準備操作系統
- systemd啟動multi-user.target下的本機與服務器服務
- systemd執行multi-user.target下的/etc/rc.d/rc.local
- Systemd執行multi-user.target下的getty.target及登錄服務
- systemd執行graphical需要的服務
設置內核參數
開機grub設置內核參數,只影響當次啟動。在linnux16行后添加 systemd.unit=NAME.target
修復grub2
修復grub2:
BIOS:grub2-install /dev/sda
UEFI:grub2-install
修復配置文件:grub2-mkconfig > /boot/grub2/grub.cfg
調整默認啟動內核:vim /etc/default/grub
常見故障
-
故障原因:默認啟動級別被設置為reboot.target
故障現象:開機無限重啟
解決辦法:
- 在grub菜單下按e
- 在linux16這一行的最后加上 systemd.unit=multi-user.target,再按下
Ctrl
+x
- 進入系統設置默認的運行級別
-
故障原因:忘記root口令
故障現象:進不去系統
解決辦法:
方法一:
- 啟動時任意鍵暫停啟動
- 按e鍵進入編輯模式
- 將光標移動linux16開始的行,改為rw init=/sysroot/bin/sh
- 按ctrl+x啟動
- chroot /sysroot
- passwd root
- touch /.autorelabel
- exit
- reboot
方法二:
- 啟動時任意鍵暫停啟動
- 按e鍵進入編輯模式
- 將光標移動linux16開始的行,添加內核參數rd.break
- 按ctrl+x啟動
- mount –o remount,rw /sysroot
- passwd root
- touch /.autorelabel
- exit
- reboot
-
故障原因:MBR前446字節被破壞
故障現象:進不去菜單
解決辦法:
- 進入rescue
- 鍵入1,continue
- chroot /mnt/sysimage
- grub2-install /dev/sda
- exit;reboot
-
故障原因:boot目錄缺失
故障現象:提示進入rescue模式
解決辦法:
- 進入rescue
- chroot /mnt/sysimage
- grub2-install /dev/sda
- mount /dev/sr0 /mnt
- rpm -ivh /mnt/Package/kernel-XXXX --force
- grub2-mkconfig > /boot/grub2/grub.cfg
- exit;reboot