系統啟動流程

linux系統啟動流程

內核的設計結構
單內核:linux(線程–lwp輕量級進程)
微內核:windows(支持真正意義上的多線程)

單內核:很多功能驅動都集成在一起

微內核:內核很小,功能單一。模塊化

linux為了適應眾多用戶的不同硬件需求,linux內核在設計上采用模塊化設計??梢詣討B加載模塊。
核心模塊:ko 內核所獨有的。
共享對象:so

紅帽的系統下內核的模塊在/lib/modules/內核版本號命名的目錄
模塊之間也存在依賴關系。
例如:/lib/modules/3.10.0-327.el7.x86_64/kernel/放的是內核模塊。50多MB

內核名稱 vmlinuz-x.x.xx /boot/vmlinuz-x.x.xx 內核 1.9MB


pc-linux

POST–>BIOS(啟動順序去哪找啟動位置)–>MBR
(bootloader,446字節)–>kernel(探測基本的硬件)–>initrd–>/sbin/init

詳細啟動過程
bootloader(MBR)是個程序
linux的bootloader
LILO:linux loader 不支持硬盤超過1個g的
GRUB:GRadn Unitied bootloader
MBR太小,所以GRUB分成兩段
第一階段是為了引導第二段,在MBR 中。為了識別boot分區。對于grub就是根分區。
grub的1.5階段,在第一個扇區的后續扇區。
也就是mbr在0扇區,后續扇區12…扇區存放1.5 stage(為boot分區提供文件系統驅動,大小不固定)
/boot/grub/ 下有1satge和1.5stage的備份。還有stage2 但是不是備份。

        第1.5階段 識別不同類型的文件系統。是的多個文件。         第二階段是引導操作系統的 后兩個階段在/boot/grub目錄下,grub也有配置文件,開機啟動項,雙系統的啟動順序,開啟圖片....

bootload是將內核和initrd一起裝進內核。

init /sbin/int 二進制的可執行程序 (用戶空間的主導程序)

內核啟動之前沒有加載文件系統,而內核又存放在文件系統之上。
/ 根所在的分區,又叫rootfs
內核裝載根文件系統
內核要使用文件系統 ,就要有設備驅動和文件系統模塊

內核靠驅動識別硬件,為了適應安裝到不同平臺的需要,就需要大量的驅動。在安裝操作系統的時候生產了一個包含該平臺設備驅動的中間層臨時的文件系統(不能同時存在兩個根但是根是可以切換的)。使得內核可以識別根文件系統然后加其他模塊。 整個過程就是根切換。

這臨時文件系統其實是一個文件,安裝操作系統時生成的,只不過內核能夠將其再內存中展開為一個模擬的文件系統(紅帽5上通常被稱為ramdisk,紅帽6上成為ramfs)。
ramdisk–>initrd centos5
制作工具:mkinitrd
ramfs–>initramfs centos6、7
制作工具:dracut,mkinitrd

chroot 命令
可以實現根切換,將一個臨時的目錄切換為根,在該目錄下必須存在/bin/bash,以及bash需要的庫文件,復制過去即可保持原有的文件層級結構。就可以在命令界面下切換過去。

用戶也可以實現根切換,與內核的根切換還是不完全一樣。
內核根切換,使用的命令也不一樣,內核切換時將三個目錄帶了過來,/proc,/sys,/dev
[root@localhost ~]# ldd /bin/bash
linux-vdso.so.1 => (0x00007fffb9f05000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f81904ef000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f81902eb000)
libc.so.6 => /lib64/libc.so.6 (0x00007f818ff29000)
/lib64/ld-linux-x86-64.so.2 (0x00007f819072f000)

[root@localhost ~]# tree /test/ /test/ ├── bin └── lib64     ├── ld-linux-x86-64.so.2     ├── libc.so.6     ├── libdl.so.2     └── libtinfo.so.5 [root@localhost ~]# chroot /test bash-4.2#  bash-4.2#  bash-4.2#

init

級別不同,運行的服務不同。
linux 有運行級別之稱 0-6
0:halt
1:單用戶模式,直接以管理員的身份進入,不需要密碼。
2:多用戶模式,有網絡功能,但是不啟用nfs
3:正常的多用戶模式,test mode 命令行模式
4:保留級別
5:圖形模式
6:reboot

init運行在那個級別取決于配置文件,/etc/inittab
定義了默認運行級別


centos

grub

可以在啟動界面編輯grub的配置。以指定的級別啟動。例如進入1級別,單用戶模式(又叫維護模式)。
grub修改配置文件也可以加密碼。使用grub-md5-crypt命令生成加密的密碼放到grub的配置文件中即可。
在配置文件中加入 password –md5 密碼

顯示當前運行級別
who -r
runlevel

查看內核release號
uname -r

grub損壞如何修復。

先人為破壞MBR中的bootloader 硬盤的前446字節
dd if=/dev/zero of=/dev/sda count=1 bs=400
sync

修復grub,就是從新安裝grub

1、使用grub命令
grub>root (hd0,0) 設置kernel所在的分區。(設置后有提示)
grub> setup (hd0) 安裝到kernel所在的設備上

2、安裝grub
grub-install –root-directory=/ 這里的根指的是boot的父目錄

給其他設備安裝grub,首先設備要有分區表,并且boot目錄已經掛在了分區。

grub配置文件損壞了如何修復
啟動系統后會自動進入grub命令模式
grub>find
grub>root
grub>kernel
grub>initrd
grub>boot


kernel初始化過程

1、探測 2、驅動初始化(從initrd文件中載入驅動模塊(centos6以后都是使用initramfs文件))     initramfs-2.6.32-642.el6.x86_64.img 3、以只讀方式掛載根文件系統         [root@yangyouwei kernel.image]# cat /boot/grub/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-642.el6.x86_64)                 root (hd0,0)                 kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=UUID=d65c9d00-5327-4d1b-ab7c-9d1f01dc3c74 rd_NO_LUKS rd_NO_LVM.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=128M  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet                 initrd /initramfs-2.6.32-642.el6.x86_64.img 4、裝載第一個進程init(PID:1)

注:內核非常的小,所以有很多硬件驅動都沒有,但是硬件驅動或其他功能模塊,都放在/boot/initrd或initramfs 這個偽文件系統中。這個文件是安裝操作系統時生成的,但也不是必要的。有些情況可以沒有。但是如果系統安裝在lvm或raid..等特殊硬件上,就需要驅動。當然也可以自己編譯內核,將其放進內核中,也就不需要這個文件。

系統初始化流程(內核級別):post–>讀取bios中啟動次序–>bootloader–>kernel和ramdisk–>裝在根文件系統–>/sbin/init

/sbin/init;(/etc/inittab)
cenos5之前的: SysV int
配置文件:/etc/inittab

centos6以后使用另外一種版本的init---upstart;ubuntu開發的init程序,可以并行啟動多個服務。         upstart是對sysv init改進的。         配置文件:/etc/init/*.conf centos7:systemd;另一種init程序??梢圆⑿袉佣鄠€服務。(比較優秀)         配置文件:/usr/lib/systemd/system                 /etc/systemd/system

以centos5為例講解sysvinit

運行級別:為了系統的運行或維護等目的而設定的機制     0-6:7個級別         0: 關機         1: 單用戶模式(single user),root用戶,無須認證;維護模式         2: 多用戶模式(multl user),會啟動網絡功能,但不會啟動NFS;維護模式         3: 多用戶模式(multl user),完全功能模式,文本界面         4: 預留級別;目前無特別使用目的,但習慣以同3級別功能使用         5: 多用戶模式(multl user),圖形界面。完全功能         6: 重啟,reboot 默認級別3、5、     級別切換 init # 級別查詢 who -r         runlevel

init

/sbin/init /etc/inittab 以cenos5為例     /etc/inittab     每行定義一種action以及與之相對應的process     id:runlevel:action:process         id:一個任務的標識符         runlevel:在那些級別下啟動次任務,為空表示所有級別         action:在什么條件下啟動次任務                     process:指具體的任務,一個程序或腳本。     action:         wait:等待切換至次任務所在的級別時執行一次。         respawn:此任務終止時就會自動啟動         initdefault:設定默認運行級別;此時process省略         sysinit:設定系統初始化方式,此處一般為指定/etc/rc.d/rc.sysinit腳本     10:0:wait:/etc/rc.d/rc 3     /etc/rc.d/rc 腳本的作用。         意味著去啟動或關閉/etc/rc.d/rc3.d目錄下的服務腳本所控制的服務         所有以k開頭的都是要停止的服務         所有以s開頭的都是要啟動的服務         腳本執行的順序是先關閉k的后啟動s的         k后面的數字只的是優先級。glob風格排序。         服務之間也有依賴關系。所以啟動和關閉的順序不一樣。 centos6為例:     [root@yangyouwei ~]# ls /etc/init/ ###這個目錄是/etc/inittab的文件的切片。     ck-log-system-restart.conf  rcS.conf     ck-log-system-start.conf    rcS-emergency.conf     ck-log-system-stop.conf     rcS-sulogin.conf     control-alt-delete.conf     readahead-collector.conf     init-system-dbus.conf       readahead.conf     kexec-disable.conf          readahead-disable-services.conf     plymouth-shutdown.conf      serial.conf     prefdm.conf                 splash-manager.conf     quit-plymouth.conf          start-ttys.conf     rc.conf                     tty.conf     [root@yangyouwei ~]# ls /etc/init.d  ####這個文件是init的腳本     abrt-ccpp         firstboot     messagebus      portreserve   sandbox     abrtd             functions     mysqld          postfix       saslauthd     abrt-oops         haldaemon     netconsole      pppoe-server  single     acpid             halt          netfs           psacct        smartd     atd               htcacheclean  network         quota_nld     spice-vdagentd     auditd            httpd         NetworkManager  rdisc         sshd     autofs            ip6tables     nfs             rdma          sssd     blk-availability  iptables      nfslock         restorecond   svnserve     bluetooth         irqbalance    nfs-rdma        rngd          sysstat     certmonger        kdump         ntpd            rpcbind       udev-post     cpuspeed          killall       ntpdate         rpcgssd       wdaemon     crond             lvm2-lvmetad  oddjobd         rpcidmapd     winbind     cups              lvm2-monitor  openct          rpcsvcgssd    wpa_supplicant     dnsmasq           mdmonitor     pcscd           rsyslog       ypbind 每個程序基于事件驅動來編寫的。

/etc/rc.d/rc.sysinit完成的任務

1、激活udev和selinux 2、根據/etc/sysctl.conf文件,來設定內核參數 3、設定系統時鐘 4、裝載鍵盤映射 5、應用交換分區 6、設置主機名 7、根文件系統檢測,并以讀寫方式重新掛載  8、激活RAID和LVM設備 9、啟用磁盤配額 10、根據/etc/fstab檢查并掛載其他文件系統 11、清理過期的鎖和PID文件

**init在完成系統初始化時,檢測文件系統,此時文件系統還是以只讀放是掛載的。如果文件系統有問題,很多時候不能進入系統。會提示輸入密碼進入系統。進入后也是不能刪除修改任何文件,可以使用 mount -o remount,rw / /dev/sda# 即可修改配置文件。

**
rc.sysinit

/etc/rc.d目錄下存放的腳本
[root@yangyouwei ~]# ls /etc/rc.d/
init.d rc0.d rc2.d rc4.d rc6.d rc.sysinit
rc rc1.d rc3.d rc5.d rc.local

對應系統啟動級別的腳本     相應目錄下的以k開頭的腳本是在該級別下要停止的腳本     以s開頭的是要在該級別下運行的腳本。

/etc/rc.d/init.d/(鏈接)—>/etc/init.d/
chkcofig –add 創建的鏈接

服務類腳本
start

Sysv風格 :/etc/rc.d/init.d下面的腳本要支持以下參數
start|stop|restart|status
reload|configtest

都有一下的行 # chkconfig: 2345 13 99  ###定義默認啟動的級別,啟動的優先次序,關閉的優先次序      如果定義啟動級別為  -  表示都是k。 # description: 描述該腳本的簡單功能 設置啟動和關閉優先級時,應考慮依賴關系。依賴的先啟動,后關閉。 運行級別下的腳本執行順序     當chkconfig命令來為此腳本在rc#.d目錄創建鏈接時,runlevels表示默認創建為s*開頭的鏈接。除此自外的級別默認創建為k*開頭的鏈接。s后面的啟動優先級為ss所表示的數字‘k后面關閉優先次序為kk所表示的數字。 這兩行必須有#號

創建腳本后需要放到/etc/init.d/目錄下,運行一下
chkconfig –add SERVICENAME
SERVICENAME 服務腳本的名稱不帶.sh

chkconfig: 2345 13 99 執行chkconfig –add 時,在指定級別里添加s開頭的鏈接,其他級別的均為k

chkconfig 使用方法
SYNOPSIS
chkconfig [–list] [–type type][name] 列出(指定/所有)服務各個級別的狀態
chkconfig –add name 添加服務
chkconfig –del name 刪除服務
chkconfig –override name
chkconfig [–level levels] name 修改 相應系統運行級別下的啟動還是關閉
chkconfig [–level levels] [–type type] name

服務腳本,通過chkcofing加入服務后,就可以通過service SERVICENAME stop|start… 控制服務

如果沒有能力寫服務腳本還可以將要運行的服務命令直接寫在/etc/rc.d/rc.local中

[root@yangyouwei ~]# cat /etc/rc.d/rc.local  #!/bin/sh # # This script will be executed *after* all the other init scripts. # You can put your own initialization stuff in here if you don't # want to do the full Sys V style init stuff.

系統初始化腳本:/etc/rc.d/rc.sysinit
1、設置主機名
2、設置歡迎信息
3、激活udev和selinux
4、掛在/etc/fstab文件中定義的所有文件系統
5、檢測根文件系統,如果沒有問題以讀寫方式掛在
6、設置系統始終;讀取硬件時鐘,通過腳本實現
7、根據/etc/sysctl.conf文件來設置內核參數
8、激活lvm及軟RAID設備
9、激活個swap設備
10、加載額外設備的驅動程序
11、清理操作

總結用空間的啟動流程

/sbin/init(/etc/inittab)

init的配置文件inittab的任務
設置默認運行級別–>運行系統初始化腳本,完成系統初始化–>關閉對應級別下要停止的服務,啟動對應級別下要開啟的服務–>設置登陸終端

centos6啟動流程

centos6以后使用另外一種版本的init—upstart;ubuntu開發的init程序,可以并行啟動多個服務。
upstart是對sysv init改進的。

init程序:         為了兼容init,其執行主程序依然叫init /sbin/init         配置文件:/etc/init/*.conf                 /etc/inittab(僅用于定義系統默認啟動級別)

centos7啟動流程

init程序     systemd         配置文件             /usr/lib/systemd/system/*             /etc/systemd/system/*     默認的服務都不啟動,當訪問那個服務,那個服務才啟動。     兼容centos6的服務 /etc/init.d/下的服務     systemd 的服務腳本放在  /usr/lib/systemd/system 設置系統默認啟動級別      systemctl set-default TARGET.target

完全兼容sysv腳本機制;因此,service還是可以使用。不過建議使用systemctl來控制服務;

systemctl {start|stop|restat|status} name[.service]

yum install ImageMagick
win.jgp
convert -resize 640×480 -colors 14 win.jpg win.xpm
gzip win.xpm
vim /boot/grub/grub.conf

原創文章,作者:yyw,如若轉載,請注明出處:http://www.www58058.com/47801

(0)
yywyyw
上一篇 2016-09-19
下一篇 2016-09-19

相關推薦

  • 馬哥教育網絡班21期+第3周課程練習

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。 [root@centos ~]# who | awk '{print $1 $NF}'| uniq -d root(192.168.40.1) derulo(19…

    Linux干貨 2016-07-22
  • mysql-yum安裝多實例

    1.安裝包 yum install mariadb-server 2.創建文件 3 分別生成3306,3307,3308數庫文件 4.復制主配置文件并分別修改端口路徑 5.準備一個啟動腳本并開啟服務 /mysqldb/3307/mysqld start 6.用mysql -S 命令進入    

    2018-01-28
  • Openssl——為你的信息保駕護航

    OpenSSL基礎 ·傳輸層協議:TCP,UDP,SCTP         port:進程地址,進程向內核注冊使用某端口(獨占) ·同一主機上的進程間通信:IPC,message queue,shm,semerphor ·不同主機上的進程間通信:socket  &nbs…

    Linux干貨 2016-09-22
  • 第四周作業

    1.復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其他用戶均沒有任何訪問權限; [root@centos7 ~]# cp -r /etc/skel/ /home/tuser1[root@centos7 ~]# ls -ld /home/tuser1drwxr-xr-x. 2 root root 72 1…

    Linux干貨 2016-11-27
  • shell腳本編程2

    shell腳本編程2   今天繼續學習了shell腳本編程,續之前寫的腳本編程1。上次主要學了編程的基礎,腳本格式,變量類型及變量的使用,條件測試,數字運算并且進行了部分練習,因為這部分邏輯思維能力要求不是很高,因此記憶起來難度不是特別大。   從今天開始便進入了流程控制以及函數、數組、高級字符串操作、高級變量等內容的學習,總體來說難度和…

    Linux干貨 2016-08-16
  • Mozart的劍(文本處理工具)——叁劍(grep、正則表達式)

    之前的句子 煙鎖池塘柳 炮鎮海城樓 因荷而得藕 有杏不需梅 認識于小林寒風的一篇小說《鳳山遺夢》 grep grep是一種強大的文本搜索工具,它能使用正則表達式搜索文本,并把匹配的行打印出來。 作用:文本搜索工具,根據用戶指定的“模式”對目標文本逐行進行匹配檢查;打印匹配到的行。模式:由正則表達式字符及文本字符所編寫的過濾條件 用法: grep [OPTIO…

    2017-08-03
欧美性久久久久