推薦-CentOS 6的系統啟動流程

?一、POST加電自檢

    按下電源后ROM芯片中的CMOS程序執行并檢測CPU、內存等設備是否存在并正常運行,CMOS中的程序叫BIOS,可以設置硬盤接口,網卡聲卡開關之類的簡單設置。一般PC機主板上有一個紐扣電池,這個電池就是給ROM供電的,可以保證主板斷電后BIOS的一些基本設置不會重置。

    下面是一個比較新的主板的BIOS,在老主板上一般只有英文不會有中文界面,老式主板只支持鍵盤操作不支持鼠標,現在很多新主板已經可以支持鼠標操作了。QQ截圖20160410201854.jpg


二、引導加載次序Boot Sequence

    在系統啟動前計算機是不知道你系統在哪里的,需要按照設備啟動順序一次查找引導加載器器bootloader,這個查找次序可以自己在BIOS中設定,一般在boot選項中設置,【注意】不同廠商不同版本的主板設置方法是不同的,請以廠商的官方說明為準。

b.jpg

三、引導加載器bootloader

    前面說了系計算機是不知道系統在哪里的,所以需要程序進行引導,這個引導的程序就叫bootloader,不同操作系統的bootloader是不同的,windows使用的bootloader程序是ntloader,只能對windows進行引導不能對其他系統進行引導,而Linux的bootloader叫GRUB,可以對其他操作系統進行引導(包括windows),正是因為這樣,所以在裝既有Windows又有Linux的雙系統的時候,需要先裝Windows,再裝Linux。

    功能:提供一個菜單,允許用戶選擇要啟動系統或不同的內核版本;把用戶選定的內核裝載到內存中的特定空間中,解壓、展開,并把系統控制權移交給內核。

    bootloader的引導程序GRUB放在MBR中。

四、引導加載器程序GRUB

    1、grub legacy

    前面提到GRUB是bootloader階段的一個程序,這是Centos中最常用的引導程序,CentOS 6安裝的是grub legacy

    下面是CentOS 6的grub legacy

blob.png

    按e:進入編輯模式,用于編輯菜單;

blob.png

    然后按c: 進入命令模式,交互式接口;

blob.png

    常用的命令有

#help: 獲取幫助列表
#help KEYWORD: 詳細幫助信息
#find (hd#,#)/PATH/TO/SOMEFILE:
#root (hd#,#)設定grub的根設備
#kernel /PATH/TO/KERNEL_FILE: 設定本次啟動時用到的內核文件;額外還可以添加許多內核支持使用的cmdline參數;
#例如:init=/path/to/init, selinux=0
#initrd /PATH/TO/INITRAMFS_FILE: 設定為選定的內核提供額外文件的ramdisk;
#boot: 引導啟動選定的內核;

    CentOS 6中grub的配置文件保存在/boot/grub/grub.conf中

[root@localhost grub]# vim 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/mapper/VolGroup-lv_root
#          initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.32-431.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS rd_NO_MD rd_LVM_LV=VolGroup/lv_swap crashkernel=auto LANG=zh_CN.UTF-8 rd_LVM_LV=VolGroup/lv_root  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
        initrd /initramfs-2.6.32-431.el6.x86_64.img

    其中常用的配置

default=#: 設定默認啟動的菜單項;落單項(title)編號從0開始;
timeout=#:指定菜單項等待選項選擇的時長;
splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜單背景圖片文件路徑;
hiddenmenu:隱藏菜單;
password [--md5] STRING: 菜單編輯認證;
title TITLE:定義菜單項“標題”, 可出現多次;
root (hd#,#):grub查找stage2及kernel文件所在設備分區;為grub的“根”; 
kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:啟動的內核
initrd /PATH/TO/INITRAMFS_FILE: 內核匹配的ramfs文件;
password --md5 STRING: 啟動選定的內核或操作系統時進行認證;

    2、GRUB2

    CentOS 7上安裝的是gurb2

[root@localhost ~]# rpm -q grub2
grub2-2.02-0.34.el7.centos.x86_64

    下面是centos7的GRUB,如果什么都不選,在3秒后系統會進入默認設置的那一項系統。

blob.png

    按e進入GRUB編輯blob.png

    按ctrl+c進入命令行模式

blob.png

    常用的命令行命令有下面這些:

1. help
    查看命令用法,顯示所有可用命令
    help search 
    search 命令用法
2. ls
    列出當前的所有設備。如 (hd0) (hd0,1) (hd0,5) (hd1) (hd1,1) (hd1,2) .......
    ls -l
    詳細列出當前的所有設備。對于分區,會顯示其label及uuid。
    ls /
    列出當前設為root的分區下的文件
    ls (hd1,1)/
    列出(hd1,1)分區下文件
3. search
    search -f /ntldr
    列出根目錄里包含ntldr文件的分區,返回為分區號
    search -l LINUX
    搜索label是LINUX的分區。
    search --set -f /ntldr
    搜索根目錄包含ntldr文件的分區并設為root,注意如果多外分區含有ntldr文件,set 失去作用
4. loopback
    loopback命令可用于建立回放設備,如
    loopback lo0 (hd1,1)/abc.iso
    可以使用lo0設備來訪問abc.iso里的內容,比如說,可以從abc.iso里的軟盤映像中啟動
    loopback lo0 (hd1,1)/aa.iso
    linux (lo0)/memdisk
    initrd (lo0)/abc.img
    要刪除某一回放設備,可以使用-d參數:
    loopback -d lo0
5. set
    使用set可以設置變量的值
    set root=
    set timeout=
    需要調用變量的值時,使用${AA},如set root=(hd1,1)
    則${root}=(hd1,1)
6. pager
    分頁顯示。
    set pager=1
    滿頁時暫停,按space繼續
    set pager=0
    取消分頁
7. linux
    linux取代grub中的kernel

    CentOS 7的/boot/grub2/grub.conf官方建議是不要隨便修改的,一般都是在grub.d文件下生成新的啟動目錄,再重新生成

    默認啟動的修改可通過/boot/grub2/grubenv文件修改

[root@localhost grub2]# vim grubenv 

# GRUB Environment Block
saved_entry=CentOS Linux (3.10.0-327.el7.x86_64) 7 (Core)
#########################################################

    可以進入/etc/grub.d下查看

[root@localhost grub.d]# ls
00_header  01_users  20_linux_xen     30_os-prober  41_custom
00_tuned   10_linux  20_ppc_terminfo  40_custom     README

    進入README可以查看grub.d中文件的說明

[root@localhost grub.d]# cat README 

All executable files in this directory are processed in shell expansion order.

  00_*: Reserved for 00_header.
  10_*: Native boot entries.
  20_*: Third party apps (e.g. memtest86+).

The number namespace in-between is configurable by system installer and/or
administrator.  For example, you can add an entry to boot another OS as
01_otheros, 11_otheros, etc, depending on the position you want it to occupy in
the menu; and then adjust the default setting via /etc/default/grub.
#00 _ *:為00 _header保留
#10 _ *:本機引導條目
#20 _ *:第三方應用程序(例如memtest86)

五、進入kernel

    在GRUB中選擇對應的kernel進入,然后kernel會對自身進行初始化

    探測可識別到的所有硬件設備。

    加載硬件驅動程序。

    以只讀方式掛載根文件系統。

    運行用戶空間的第一個應用程序,在CentOS 6上是init,在CentOS 7上是Systemd

    內核組成部分:

        kernel: 內核核心,一般為bzImage,通常在/boot目錄下,名稱為vmlinuz-VERSION-RELEASE;

        kernel object: 內核對象,一般放置于/lib/modules/VERSION-RELEASE/

六、運行init

    CentOS 6上init所在的位置是在/sbin/init,init共分為7個級別

#0:關機
#1:單用戶模式(root, 無須登錄), single, 維護模式;
#2: 多用戶模式,會啟動網絡功能,但不會啟動NFS;維護模式;
#3:多用戶模式,正常模式;文本界面;
#4:預留級別;可同3級別;
#5:多用戶模式,正常模式;圖形界面;
#6:重啟

    例如你要關機可直接輸入init 0進行關機操作

[root@localhost sbin]# init 0

     如果要查看當前系統運行的init級別可使用runlevel或者who -r

[root@localhost sbin]# runlevel 
N 5
[root@localhost sbin]# who -r
         運行級別 5 2016-04-10 18:25

    init的配置文件在/etc/inittab

[root@localhost sbin]# vim /etc/inittab 

# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
# with configuration in /etc/sysconfig/init.
#
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).
#
# Default runlevel. The runlevels used are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
# 
id:5:initdefault:
#這里定義的默認運行級別為5

    配置文件中的格式是:id:runlevel:action:process

    此配置文件每行定義一個級別

id:指入口標識符,它是一個字符串,對于getty或mingetty等其他login程序項,要求id與tty的編號相同,否則getty程序將不能正常工作。
runlevel:init的系統運行級別
action:是用來定義后面process的運行方式,常用的有下面幾種
        wait: 切換至此級別運行一次;
        respawn:此process終止,就重新啟動之;
        initdefault:設定默認運行級別;process省略;
        sysinit:設定系統初始化方式,此處一般為指定/etc/rc.d/rc.sysinit
process:為具體的執行程序,

    例如設置為l0:5:wait:/etc/rc.d/rc 5

    /etc/rc.d/rc是一個Shell腳本,它接受5作為參數,去執行/etc /rc.d/rc5.d/目錄下的所有的rc啟動腳本,/etc/rc.d/rc5.d/目錄中的這些啟動腳本實際上都是一些鏈接文件,而不是真正的rc 啟動腳本,真正的rc啟動腳本實際上都是放在/etc/rc.d/init.d/目錄下。而這些rc啟動腳本有著類似的用法,它們一般能接受start、stop、restart、status等參數。

    /etc/rc.d/rc5.d/中的rc啟動腳本通常是K或S開頭的鏈接文件。

#K開頭的文件:運行次序是數字越小,越先運行;數字越小的服務,通常為依賴到別的服務;關閉服務。
#S開頭的文件:運行次序是數字越小,越先運行;數字越小的服務,通常為被依賴到的服務;啟動服務。
[root@localhost rc5.d]# pwd
/etc/rc.d/rc5.d
[root@localhost rc5.d]# ls
K01numad         K69rpcsvcgssd      S05cgconfig     S23NetworkManager    S80postfix
K01smartd        K73winbind         S07iscsid       S24nfslock           S82abrt-ccpp
K02oddjobd       K75ntpdate         S08ip6tables    S24rpcgssd           S82abrtd
K05wdaemon       K75quota_nld       S08iptables     S25blk-availability  S84ksm
K10psacct        K76ypbind          S10network      S25cups              S85ksmtuned
K10saslauthd     K84wpa_supplicant  S11auditd       S25netfs             S90crond
K15htcacheclean  K85ebtables        S11portreserve  S26acpid             S95atd
K15httpd         K86cgred           S12rsyslog      S26haldaemon         S97libvirtd
K15svnserve      K87restorecond     S13cpuspeed     S26hypervkvpd        S99certmonger
K46radvd         K88sssd            S13irqbalance   S26udev-post         S99libvirt-guests
K50dnsmasq       K89rdisc           S13iscsi        S28autofs            S99local
K50netconsole    K95firstboot       S13rpcbind      S50bluetooth
K50snmpd         K99rngd            S15mdmonitor    S55sshd
K50snmptrapd     S01sysstat         S20kdump        S58ntpd
K60nfs           S02lvm2-monitor    S22messagebus   S70spice-vdagentd

七、運行系統初始化腳本

    系統初始化腳本對應的文件是/etc/rc.d/rc.sysinit

    大概就是這個樣子,因為太長,省略了很多

[root@localhost rc.d]# vim rc.sysinit 

#!/bin/bash
#
# /etc/rc.d/rc.sysinit - run once at boot time
#
# Taken in part from Miquel van Smoorenburg's bcheckrc.
#

HOSTNAME=$(/bin/hostname)

set -m

if [ -f /etc/sysconfig/network ]; then
    . /etc/sysconfig/network
fi
if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then
    HOSTNAME=localhost
fi

if [ ! -e /proc/mounts ]; then
        mount -n -t proc /proc /proc
        mount -n -t sysfs /sys /sys >/dev/null 2>&1
fi
######################后面的省略######################
其中主要的內容就是
#(1) 設置主機名;
#(2) 設置歡迎信息;
#(3) 激活udev和selinux; 
#(4) 掛載/etc/fstab文件中定義的文件系統;
#(5) 檢測根文件系統,并以讀寫方式重新掛載根文件系統;
#(6) 設置系統時鐘;
#(7) 激活swap設備;
#(8) 根據/etc/sysctl.conf文件設置內核參數;
#(9) 激活lvm及software raid設備;
#(10) 加載額外設備的驅動程序;
#(11) 清理操作;

八、啟動系統服務

    centos6下的系統服務腳本都放在/etc/rc.d/init.d或者/etc/init.d中,可以看到兩個文件中的內容是一樣的,因為/etc/init.d鏈接到了/etc/rc.d/init.d中

[root@localhost init.d]# ll /etc/init.d
lrwxrwxrwx. 1 root root 11 2月  20 18:57 /etc/init.d -> rc.d/init.d
[root@localhost rc.d]# cd -
/etc/rc.d/init.d
[root@localhost init.d]# ls
abrt-ccpp         cups          iscsi              netfs           rdisc        spice-vdagentd
abrtd             dnsmasq       iscsid             network         restorecond  sshd
abrt-oops         ebtables      kdump              NetworkManager  rngd         sssd
acpid             firstboot     killall            nfs             rpcbind      svnserve
atd               functions     ksm                nfslock         rpcgssd      sysstat
auditd            haldaemon     ksmtuned           ntpd            rpcidmapd    udev-post
autofs            halt          libvirtd           ntpdate         rpcsvcgssd   wdaemon
blk-availability  hsqldb        libvirt-guests     numad           rsyslog      winbind
bluetooth         htcacheclean  lvm2-lvmetad       oddjobd         sandbox      wpa_supplicant
certmonger        httpd         lvm2-monitor       portreserve     saslauthd    ypbind
cgconfig          hypervkvpd    mdmonitor          postfix         single
cgred             ip6tables     messagebus         psacct          smartd
cpuspeed          iptables      netcf-transaction  quota_nld       snmpd
crond             irqbalance    netconsole         radvd           snmptrapd

    通過chkconfig命令可以查看什么系統級別下開啟了哪些服務,以及添加服務到系統中并在指定級別下啟動

    查看chkconfig –list

[root@localhost rc5.d]# chkconfig --list
NetworkManager  0:關閉 1:關閉 2:啟用 3:啟用 4:啟用 5:啟用 6:關閉
abrt-ccpp       0:關閉 1:關閉 2:關閉 3:啟用 4:關閉 5:啟用 6:關閉
abrtd           0:關閉 1:關閉 2:關閉 3:啟用 4:關閉 5:啟用 6:關閉
acpid           0:關閉 1:關閉 2:啟用 3:啟用 4:啟用 5:啟用 6:關閉
atd             0:關閉 1:關閉 2:關閉 3:啟用 4:啟用 5:啟用 6:關閉
auditd          0:關閉 1:關閉 2:啟用 3:啟用 4:啟用 5:啟用 6:關閉
autofs          0:關閉 1:關閉 2:關閉 3:啟用 4:啟用 5:啟用 6:關閉

    添加chkconfig –add 服務名,在添加的時候需要將對應的服務放入/etc/init.d中,并在服務腳本中加入chkconfig: LLLL nn nn

    寫到LLLL的init級別就是S的,沒寫得就是K的,第一個nn代表S的數字,第二個nn代表K的數字

[root@localhost init.d]# chkconfig --add httpd

    刪除chkconfig –del 服務名

[root@localhost init.d]# chkconfig --del httpd

      【注意】:正常級別下,最后啟動一個服務S99local沒有鏈接至/etc/rc.d/init.d一個服務腳本,而是指向了/etc/rc.d/rc.local腳本;因此,不便或不需寫為服務腳本放置于/etc/rc.d/init.d/目錄,且又想開機時自動運行的命令,可直接放置于/etc/rc.d/rc.local文件中。

九、打印登錄提示符

    系統在啟動完服務后會打印登錄提示符,然后輸入賬號密碼,進入對應的命令行界面或圖形界面。

十、總結

    系統的啟動流程總的來說分成以下幾個步驟:

    1、加電自檢

    2、按照BIOS中設置的Boot Sequence查找有bootloader程序的設備

    3、加載MBR中的bootloader程序GRUB

    4、進入GRUB設置的默認kernel

    5、kernel初始化

    6、運行init程序

    7、運行系統初始化腳本

    8、啟動對應服務

    9、打印登錄提示符

以上只是本人對系統啟動流程的理解,若有不對之處請指出,本人會對其進行修改。

原創文章,作者:N17_信風,如若轉載,請注明出處:http://www.www58058.com/14153

(0)
N17_信風N17_信風
上一篇 2016-04-10
下一篇 2016-04-11

相關推薦

  • N25期第六周作業

    請詳細總結vim編輯器的使用并完成以下練習題 1.復制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加# sed -r 's/^[^[:space:]]+/#&/g' /tmp/rc.sysinit :%s/^[^[:space:]]\+/#&a…

    Linux干貨 2016-12-26
  • 網絡組(Network Teaming)

    網絡組(Network Teaming) 網絡組:是將多個網卡聚合在一起的方法,從而實現容錯和提高吞吐量 網絡組不同于舊版中bonding技術,提供更好的性能和擴展性 網絡組由內核驅動和teamd守護進程實現. 多種方式runner     broadcast     roundrobin     …

    Linux干貨 2017-03-26
  • Mysql之主從復制

    Mysql之主從復制 節點一 修改配置文件設置唯一ID開起二進制日志 [root@node1 ~]# vim /etc/my.cnf 增加以下內容     [mysqld]     log-bin=master_bin &nbsp…

    Linux干貨 2016-07-19
  • DNS服務基礎

    DNS服務:是一種工作在應用層的特定應用,也是.c/s架構模式的,DNS的是一種應用層協議,他的端口是UPD協議的53號端口,()根據應用場景不同也會用到tcp協議)這就意味著DNS是默認通過UDP協議進行通信的 我們訪問任何一個網站都是通過主機名的方式進行訪問的;例如www.baidu.com,這是個主機名.稱之為FQDN(完全限定域名) 常見的頂級域中的…

    Linux干貨 2016-11-07
  • n28 第二周作業

    n28 第二周作業

    Linux干貨 2017-12-09
  • 文件的權限和訪問控制列表

      在linux管理中,為了使不同的用戶對文件有不同的操作權限。我們需要正確的修改文件的權限,一方面是為安全著想, 另一方面則是防止自己辛辛苦苦碼出的東西被其它用戶給誤刪。 1.如何修改文件的屬主和屬主:   前面用戶和組管理的內容中,我們已經對文件的屬主、屬組問題做了說明。有時候我們需要對一些文件的屬組和屬組進行修改…

    Linux干貨 2016-08-04

評論列表(1條)

欧美性久久久久