linux系統引導流程


 

 

1.固件:硬件和軟件結合。加電自檢是我們按下電源會檢測硬件像cpu、內存、網卡等信息。(從硬件層次檢測硬件是否可用)

  • 固件設置實例:設置時間

軟件時間和硬件時間:

[root@VM_0_12_centos ~]# hwclock #硬件時間 ^[[AWed 28 Mar 2018 09:22:15 PM CST  -0.811743 seconds
[root@VM_0_12_centos ~]# date #軟件時間
Wed Mar 28 21:22:18 CST 2018

 

 

hwclock兩個重要參數:

 -s, --hctosys        set the system time from the hardware clock
 -w, --systohc        set the hardware clock from the current system time

 

 

 hwclock  --hctosys   #以硬件時鍾為標准修改軟件時鍾

hwclock  --systohc  #以軟件時鍾為標准修改硬件時鍾

 

 

 

 加入兩個時鍾都不正確:

修改軟件時鍾:

NAME
       date - print or set the system date and time

SYNOPSIS
       date [OPTION]... [+FORMAT]
       date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]  #修改軟件時鍾

 

 

修改硬件時鍾:

hwclocl --set --date="9/22/96 16:45:35"

 

 

2.檢測完之后跳轉到mbr(主引導記錄)里面讀取一個很重要的數據bootloader(后續的所有工作都是bootloader完成)和partition table、magic number

 

 grub的配置:

[root@VM_0_12_centos ~]# grep kernel -n /boot/grub2/grub.cfg
101:    linux16 /boot/vmlinuz-3.10.0-514.26.2.el7.x86_64 root=/dev/vda1 ro crash
kernel=auto console=ttyS0 console=tty0 panic=5 LANG=C
116:    linux16 /boot/vmlinuz-3.10.0-327.el7.x86_64 root=UUID=49f819fd-e56d-48a4
-86d3-7ebe0a68ec88 ro crashkernel=auto console=ttyS0 console=tty0 panic=5
130:    linux16 /boot/vmlinuz-0-rescue-f9d400c5e1e8c3a8209e990d887d4ac1 root=UUI
D=49f819fd-e56d-48a4-86d3-7ebe0a68ec88 ro crashkernel=auto console=ttyS0 console
=tty0 panic=5

 

 

 

 3. bootloader載入內核:

內核的概念: (linux是一堆源碼,在開機的時候會看到booting the kernel,從軟件層次檢測硬件是否可用)

  主要作用就兩個:驅動硬件(所謂驅動就是系統識別硬件,讓操作系統認識硬件,從軟件識別硬件是否可用)、啟動完init進程其任務就完成了。

 

 

 4.init進程也是linux啟動的第一個進程;

init進程的任務:

 

 解釋:

  init進程的pid為1,其PPID為0,PPID就是父進程ID,其父進程是內核任務調度器。

  linux是一個實時系統就是將處理時間按時間分配,如果你這次時間沒有處理完下次繼續給你分配時間的時候再處理,這就需要一個CPU時間調度器,也就是PID為0的內核調度器。

 

  linux中由一個進程派生出的進程成為子進程。如果一個進程的父進程死了,其子進程也不能存在。linux中父進程死掉子進程存活的進程成為孤兒進程,在linux中不允許孤兒進程的存在。linux掃描到存在孤兒進程的時候會自動將這個孤兒進程的父進程設置為init進程(PID為1的進程)。

   子進程死亡,父進程應該切換和子進程之間的聯系,這個子進程成為僵屍進程,J進程,這種進程也不允許存在。

 

 5 讀取/etc/inittab文件

 

 

 

 inittab定義linux的7個運行級別

0:   關機狀態(系統默認運行級別不能設為0,否則不能正常啟動)

1:  單用戶模式(類似於windows的安全模式),只允許root登錄,用於系統維護,禁止遠程登陸

 2.  多用戶模式。只是沒有NFS服務(網路文件服務,實現文件共享),

3.  多用戶模式,有NFS服務

4.  系統未使用,保留,可以讓用戶自定義一些啟動程序。

5.  X11控制台,登陸后進入圖形GUI模式。與3一樣是多用戶模式,只是有圖像界面。

6. 系統正常關閉並重啟,默認運行級別不能設為6,否則不能正常啟動。

 

 

運行級別的切換:

1.查看運行級別:  (如果修改過應該是S   3)

[root@iz2ze46xi6pjjj69ailg9lz ~]# runlevel
N 3

 

 

2.切換運行級別:

 init [0123456Ss]   或者  telinit [0123456Ss]

 實際上telnet是init的一個軟連接:

[root@iz2ze46xi6pjjj69ailg9lz ~]# ll `which init`
lrwxrwxrwx 1 root root 22 Aug 18  2017 /usr/sbin/init -> ../lib/systemd/systemd

 

 

 例如:

telinit 3  #運行級別切換到3

 

 

 

 

另外:在centos7中,/etc/inittab現在的內容是:

# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main ta
rgets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To view current default target, run:
# systemctl get-default
#
# To set a default target, run:
# systemctl set-default TARGET.target
#

 

 如果改變默認的運行級別只需要放開注解就可以。

 

 

 

 

 

3.   inittab文件剖析:

在inittab中,所有條目采用如下格式:

id:runlevel:action:process

id:標識符,一般為兩位字母或者數字(長度為1-4位即可)

run-levels:指定運行級別,可以指定多個

action:指定運行狀態

process:指定要運行的腳本和命令(前面三個是process的鋪墊)

 

action常用取值:

initdefault    指定系統常用級別

sysinit   系統啟動執行process中指定的命令

wait:執行process中的指令,並等其他指令結束再運行其他命令

once:執行process中的指令,不等其結束

Ctrlaltdel:按下ctrl+AltDel時執行process的指令。

 

4.   inittab重要的兩個條目:

  rc.sysinit是一個標准的shell腳本,如果我們想開機不管哪個運行級別都執行一段腳本我們可以把腳本或者命令放在/etc/rc.d/rc.sysinit里面。

 

  inittab記錄了默認級別、必須啟動的腳本、電源管理、6個終端等信息。

 

接下來系統會照着inittab指定的運行級別的目錄下的腳本:(/etc/rc.d/rc[0-6].d目錄分別對應着運行級別的目錄):

假入系統的缺省運行級別為3,系統會執行/etc/rc./rc3.d/目錄下的腳本;

[root@iz2ze46xi6pjjj69ailg9lz rc3.d]# ll
total 0
lrwxrwxrwx. 1 root root 20 Aug 18  2017 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx  1 root root 19 Mar 28 18:00 S01acpidtd -> /etc/init.d/acpidtd
lrwxrwxrwx  1 root root 18 Mar 29 06:00 S01wipefs -> /etc/init.d/wipefs
lrwxrwxrwx. 1 root root 17 Aug 18  2017 S10network -> ../init.d/network
lrwxrwxrwx  1 root root 22 Sep  1  2017 S20cloudmonitor -> ../init.d/cloudmonito
r
lrwxrwxrwx  1 root root 15 Sep  1  2017 S50aegis -> ../init.d/aegis
lrwxrwxrwx  1 root root 17 Oct 18 01:24 S80aegis -> /etc/init.d/aegis
lrwxrwxrwx  1 root root 20 Sep  1  2017 S98agentwatch -> ../init.d/agentwatch
lrwxrwxrwx  1 root root 16 Nov  5 11:45 S99tomcat -> ../init.d/tomcat

 /etc/rc./rc3.d/下的腳本命名規則:(我們發現下面的腳本都是軟連接,類似於windows的快捷方式)

S99tomcat
  S代表Start,啟動的時候執行腳本,開啟服務(只有大寫S開會啟動,小寫也不會啟動),執行腳本的時候linux會傳入一個start參數,
  K代表kill: 關閉服務,執行腳本會傳入一個stop參數
    
  99代表啟動級別:數字越小越優先啟動,如果級別相同的話會按照創建順序執行
  tomcat:是服務名字,這個不重要

 

如果我們希望一個腳本開機不啟動可以通過刪除該運行級別下的腳本或者將腳本重新命名,不以S開頭則不會啟動。

[root@iz2ze46xi6pjjj69ailg9lz rc3.d]# mv ./S99tomcat s99tomcat #將以S開頭的改為以小寫s開頭,開機也不會啟動
[root@iz2ze46xi6pjjj69ailg9lz rc3.d]# ll
total 0
lrwxrwxrwx. 1 root root 20 Aug 18  2017 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx  1 root root 19 Mar 28 18:00 S01acpidtd -> /etc/init.d/acpidtd
lrwxrwxrwx  1 root root 18 Mar 29 06:00 S01wipefs -> /etc/init.d/wipefs
lrwxrwxrwx. 1 root root 17 Aug 18  2017 S10network -> ../init.d/network
lrwxrwxrwx  1 root root 22 Sep  1  2017 S20cloudmonitor -> ../init.d/cloudmonito
r
lrwxrwxrwx  1 root root 15 Sep  1  2017 S50aegis -> ../init.d/aegis
lrwxrwxrwx  1 root root 17 Oct 18 01:24 S80aegis -> /etc/init.d/aegis
lrwxrwxrwx  1 root root 20 Sep  1  2017 S98agentwatch -> ../init.d/agentwatch
lrwxrwxrwx  1 root root 16 Nov  5 11:45 s99tomcat -> ../init.d/tomcat

 

注意:     /etc/rc[0-6].d是/etc/rc.d/rc[0-6].d的軟連接:    /etc/init.d是/etc/rc.d/init.d的一個軟連接

[root@iz2ze46xi6pjjj69ailg9lz etc]# ll | grep rc
-rw-r--r--.  1 root root     2853 Nov  6  2016 bashrc
-rw-r--r--.  1 root root     1620 Nov  6  2016 csh.cshrc
lrwxrwxrwx   1 root root       11 Aug 18  2017 init.d -> rc.d/init.d
-rw-r--r--.  1 root root      942 Jun  7  2013 inputrc
-rw-r--r--   1 root root     1968 Dec 17  2014 mail.rc
lrwxrwxrwx   1 root root       10 Aug 18  2017 rc0.d -> rc.d/rc0.d
lrwxrwxrwx   1 root root       10 Aug 18  2017 rc1.d -> rc.d/rc1.d
lrwxrwxrwx   1 root root       10 Aug 18  2017 rc2.d -> rc.d/rc2.d
lrwxrwxrwx   1 root root       10 Aug 18  2017 rc3.d -> rc.d/rc3.d
lrwxrwxrwx   1 root root       10 Aug 18  2017 rc4.d -> rc.d/rc4.d
lrwxrwxrwx   1 root root       10 Aug 18  2017 rc5.d -> rc.d/rc5.d
lrwxrwxrwx   1 root root       10 Aug 18  2017 rc6.d -> rc.d/rc6.d
drwxr-xr-x. 10 root root     4096 Aug 18  2017 rc.d
lrwxrwxrwx   1 root root       13 Aug 18  2017 rc.local -> rc.d/rc.local
-rw-r--r--   1 root root     1982 Dec 22  2016 vimrc
-rw-r--r--   1 root root     1982 Dec 22  2016 virc
-rw-r--r--   1 root root     4479 Nov  6  2016 wgetrc

 

 5.如果我們設置一個自啟動服務程序:

ln -s 

chkconfig命令

ntsysv

 

6.如果系統出現錯誤或者服務啟動失敗,我們如何查看:

(1)查看硬件檢測的信息

dmesg

 

(2)如果是服務啟動失敗,我們可以查看linux的日志文件。(linux下的所有的日志文件都記錄在:/var/log目錄下)

[root@VM_0_12_centos log]# pwd
/var/log
[root@VM_0_12_centos log]# ll
total 119848
drwxr-xr-x. 2 root   root                 4096 Apr 21  2016 anaconda
drwxr-x---. 2 root   root                 4096 Mar 29 09:08 audit
-rw-r--r--  1 root   root                 8661 Mar 20 09:18 boot.log
-rw-------. 1 root   utmp            113854849 Mar 29 10:30 btmp
drwxr-xr-x. 2 chrony chrony               4096 Nov 24  2015 chrony
-rw-------  1 root   root              1661869 Mar 29 10:43 cron
-rw-r--r--  1 root   root                27765 Mar 20 09:18 dmesg
-rw-r--r--  1 root   root                    1 Mar 20 09:00 dmesg.old
-rw-------  1 root   root                    1 Mar 20 09:00 grubby
drwxr-sr-x  3 root   systemd-journal      4096 Mar 20 09:00 journal
-rw-r--r--. 1 root   root               292292 Mar 29 10:35 lastlog
-rw-------. 1 root   root                 8207 Mar 29 08:39 maillog
-rw-------. 1 root   root              2227855 Mar 29 10:43 messages
drwxr-xr-x. 2 ntp    ntp                  4096 Apr 13  2017 ntpstats
drwx------. 2 root   root                 4096 Jun 10  2014 ppp
-rw-------  1 root   root               333272 Mar 29 10:35 secure
-rw-------  1 root   root              1977368 Mar 24 03:27 secure-2018032415218
33821.gz
-rw-------  1 root   root              2326626 Mar 29 03:11 secure-2018032915222
64621.gz
-rw-------. 1 root   root                    1 Mar 20 09:00 spooler
-rw-------. 1 root   root                    1 Mar 20 09:00 tallylog
drwxr-xr-x. 2 root   root                 4096 Apr 21  2016 tuned
-rw-r--r--  1 root   root                    1 Mar 20 09:00 wpa_supplicant.log
-rw-rw-r--. 1 root   utmp                60288 Mar 29 10:35 wtmp
-rw-------  1 root   root                  170 Mar 28 19:11 yum.log

 

 

總結:

  (1)fireware(固件)開機自檢,檢驗硬件設備是否正常,如果正常則讀取硬盤上面存放數據的第一個位置MBR(Master Boot Record)里面的bootloader

  (2)BootLoader里面最重要的是存放了一個自舉程序(GRUB)

   (3)GRUB 載入內核(kernel)   驅動硬件、啟動init進程

  (4)init進程讀取/etc/inittab,

    首先執行腳本:/etc/rc.d/rc.sysinit   (不管任何運行級別都會執行這個腳本)

    然后根據initdefault查到默認的運行級別並且去/etc/rc.d/rcN.d下執行腳本,以S開頭的腳本是啟動服務的腳本,以K開頭是關閉服務的腳本

  (5)最后會建立終端,等待用戶登錄。顯示user、name。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM