Linux組成
Linux: kernel+rootfs(根文件系統)
kernel功能: 進程管理、內存管理、網絡管理、驅動程序、文件系統、安全功能
rootfs:程序和glibc
庫:函數集合, function, 調用接口(頭文件負責描述) 過程調用:procedure,無返回值 函數調用:function 程序:二進制執行文件
內核設計流派:
單內核(monolithic kernel):Linux
把所有功能集成于同一個程序微內核(micro kernel):Windows, Solaris(hurb)(太完美了沒有成功)
每種功能使用一個單獨子系統實現
linux設計思想:內核核心僅保留最基本功能,而把其它功能做成子系統;各子系統之間依靠通信完成基本功能
內核
Linux內核特點:
支持模塊化:.ko(內核對象有些是驅動模塊)
如:文件系統,硬件驅動,網絡協議等支持內核模塊的動態裝載和卸載
組成部分:
一.核心文件:/boot/vmlinuz-VERSION-release
生成時間是光盤自帶的時間,出場時寫入的時間,如果沒了可以從別處考一個過來
ramdisk:輔助的偽根系統(虛擬文件系統,生成時間是安裝時的時間) CentOS 5: /boot/initrd-VERSION-release.img 虛擬出來的一個磁盤 CentOS6,7: /boot/initramfs-VERSION-release.img 虛擬出來的文件系統 這是一個cpio的文檔格式 cat 。。。|cpio -id
刪除/boot/initramfs-VERSION-release.img文件修復
這個無法從別處拷貝只能單獨生成!
步驟
1.重啟進光盤修復
會發現,能進入界面引導界面卻不能下一步的生成!這說明可以進入boot,但無法下一步!
2.在/boot下重新生成此文件
不切換根的話很多工具會用不了!mkinitrd命令是硬盤上的命令!
注意:最后一步要很長時間才能生成,要耐心等待,結束后exit.exit兩次重啟
二.模塊文件:/lib/modules/VERSION-release
注意:雖然安裝時內核10M多,其就實除了核心文件是驅動/lib/modules, 根文件系統的驅動有可能和根不相同,你可以訪問boot但不一定能訪問根,因為根的驅動在根下的lib, 所以boot里面放驅動,把boot加載,從而找到根的驅動把根掛上! boot又是怎么啟動的呢,是前面的grub的工作了!
CentOS 系統啟動流程:
1. POST:
Power-On-Self-Test,加電自檢,是BIOS功能的一個主要部分。負責完成對CPU、主板、內存、硬盤子系統、顯示子系統、串并行接口、鍵盤、CD-ROM光驅等硬件情況的檢測。
ramdisk:自檢流程!
內核中的特性之一:使用緩沖和緩存來加速對磁盤上的文件訪問
ramdisk —> ramfs 提高速度
CentOS 5: initrd 文件, 工具程序:mkinitrd
CentOS 6: initramfs 文件, 工具程序:mkinitrd, dracut
ROM:BIOS,Basic Input and Output System,保存著有關計算機系統最重要的基本輸入輸出程序,系統信息設置、開機加電自檢程序和系統啟動自舉程序等。
RAM:CMOS互補金屬氧化物半導體,保存各項參數的設定
按次序查找引導設備,第一個有引導程序的設備為本次啟動設備
2.bootloader: 引導加載器,引導程序
windows: ntloader,僅是啟動OS
Linux:功能豐富,提供菜單,允許用戶選擇要啟動系統或不同的內核版本;把用戶選定的內核裝載到內存中的特定空間中,解壓、展開,并把系統控制權移交給內核
LILO:LInux LOader GRUB: GRand Unified Bootloader GRUB 0.X: GRUB Legacy, GRUB2 例如:你裝了個雙內核,開機的菜單選項就是grub生成的
GRUB:
primary boot loader : 1st stage,1.5 stage 1.5階段被放在第一個扇區的后續扇區!(都在0柱面上,所以分區時從1扇區開始分的?。┻@個扇區裝載的就是 boot的驅動! secondary boot loader :2nd stage,分區文件 1階段和1.5階段這些在/boot/grub下都有(以1 1_5結尾)備份文件(可以刪除),但2的不是備份文件,不能刪除!?。?/pre>MBR:只放置了一點grub內容,用來尋找/boot下的驅動模塊(1.5階段)
446: bootloader, 64: 分區表, 2: 55AA 由于MBR在硬盤的第一個扇區,不用驅動!
3.kernel:
通過boot下的核心文件和boot下的驅動掛載根
![]()
自身初始化:
探測可識別到的所有硬件設備
加載硬件驅動程序(可能借助于ramdisk加載驅動)
ramdisk: 加載至內存中,此段內存空間被虛擬成了塊設備; 用于提供硬盤驅動程序;系統安裝時臨時生成的; ramdisk被內核識別為“根文件系統”,即rootfs,常被稱作“臨時根”;以只讀方式掛載根文件系統(真正的根)
因為grub下的 grub.conf有寫,也寫了根的驅動程序所在位置為當下的initramfs-***.img文件運行用戶空間的第一個應用程序:/sbin/init
4.init:
-
init讀取其初始化文件:/etc/inittab
初始運行級別(RUN LEVEL) 系統初始化腳本 對應運行級別的腳本目錄 捕獲某個關鍵字順序 定義UPS電源終端/恢復腳本 在虛擬控制臺生成getty 在運行級別5初始化X
-
個版本服務啟動
CentOS 5:** SysV init** 特點:啟動用戶空間的服務程序,通常通過腳本進行;有依賴關系的服務將被串行啟動; 配置文件:/etc/inittab CentOS 6: **Upstart** 特點:守護進程間的通信依賴于D-Bus進行,因此,可基本實現類似并行啟動; 配置文件:/etc/inittab, /etc/init/*.conf CentOS 7: **Systemd** 特點:服務只有在第一次被訪問到時才會真正啟動起來; 配置文件:/usr/lib/systemd/
系統初始化總結:
POST —> BootSequence (BIOS) —> Bootloader(MBR) —> kernel(ramdisk) —> rootfs(只讀) —> init(systemd)
/sbin/init
Linux系統運行級別:為系統維護的目的而設定,途徑是設定啟動或關閉服務實現; 0-6: 7個級別 0:關閉所有服務;關機 1:維護模式,單用戶模式,sigle模式;此級別可允許root用戶直接登錄而無須認證; 2:維護模式,多用戶模式,需要用戶認讓,會啟動網絡功能,但不支持使用NFS; 3:正常級別,完全多用戶模式,文本界面; 4:預留級別 5:正常級別,完全多用戶模式,圖形界面; 6:關閉所有服務;重啟 默認級別:3,5 切換級別: init [0-6] init 0 init 6 查看級別: runlevel命令 who -r
總結(用戶空間的啟動流程): /sbin/init (/etc/inittab)
設置默認運行級別 —> 運行系統初始化腳本,完成系統初始化 —> 關閉對應級別下需要停止的服務,啟動對應級別下需要開啟的服務—> 設置登錄終端 [—> 啟動圖形終端]
配置文件:/etc/inittab(CentOS 5 6)配置文件格式
格式:
每一行定義一種action以及與之對應的process
id:runlevel:action:process 任務的標示符:運行級別:任務在什么時候啟動,如何啟動:啟動的到底是什么任務 id:一個任務的標識符; runlevels:在哪些級別啟動此任務;#,###,也可以為空,表示所有級別; 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
初始化用戶空間環境;此腳本會執行許多系統初始化任務;
啟動對應級別下設定為要啟動的服務,關閉那些設定為要停止的服務;
l1:1:wait:/etc/rc.d/rc 1 l2:2:wait:/etc/rc.d/rc 2 l3:3:wait:/etc/rc.d/rc 3
rc是一個腳本,傳遞一個參數,表示運行這個參數模式的相應腳本 例如:啟動虛擬終端:一下內容表示當你在2345級別下切換終端時會自動運行/sbin/mingetty(啟動虛擬終端)程序;這就是我們用ctrl+alt+F# 啟動虛擬終端的原因 一般啟動6個虛擬終端: tty1:2345:respawn:/sbin/mingetty tty1 tty2:2345:respawn:/sbin/mingetty tty2 tty3:2345:respawn:/sbin/mingetty tty3 每個虛擬終端啟動之后,會立即通過此終端附加一個應用程序(/sbin/mingetty)調用login程序 打開虛擬終端的程序除了mingetty之外,還有諸如getty等; 如果默認級別為5,還會啟動一個圖形虛擬終端;會附加X應用程序;
總結(centos 5用戶空間的啟動流程): /sbin/init (/etc/inittab)
設置默認運行級別 —> 運行系統初始化腳本,完成系統初始化 —> 關閉對應級別下需要停止的服務,啟動對應級別下需要開啟的服務—> 設置登錄終端 [—> 啟動圖形終端]
centos 6:
(1) CentOS 6的init程序為upstart,其配置文件依然為/etc/init/*.conf;(/etc/inittab 僅用于定義默認運行級別)此些配置遵循upstart語法格式進行編程;
(2) CentOS 6的服務控制事實上大多數并沒有使用upstart腳本來控制,而依然使用的是SysV風格的腳本;
注意:*.conf為upstart風格的配置文件; rcS.conf rc.conf tty.conf start-tty.conf
centos 7
init程序:systemd,配置文件:/usr/lib/systemd/system/, /etc/systemd/system/
完全兼容SysV腳本機制;因此,service命令依然可用;不過,建議使用systemctl命令來控制服務;
# systemctl {start|stop|restart|status} name[.service]
注意:centos 7 啟動時init中的服務沒有什么啟動流程,服務都是同時并行啟動,服務之間的依賴關系在啟動時默認不解決;等服務都啟動好后才解決依賴問題。(如果你在開機時就只用到三個那么就只啟動三個服務,其他都默認不啟動,等用到的時候再啟動?。?/p>
/etc/rc.d目錄講解
1 init.d目錄
里面包括了各種系統服務的文件。rc#.d里面的各種文件就是來自此文件,只不過換了個名字
;
2./etc/rc->rc.d/rc 此腳本的意義 當init運行等級切換時用于負責啟動或停止服務
意味著:通過/etc/rc.d/rc#.d/下所有鏈接文件來決定如何啟動或關閉服務;
所有以S開頭的,都被傳遞start參數以啟動; 所有以K開頭的,都被傳遞stop參數以停止;
3./etc/rc.d/rc.sysinit腳本的功能:
(1) 根據配置文件中的設定來設定主機名(讀取/etc/sysconfig/network文件中的HOSTNAME進行);
(2) 打印文本歡迎信息;
(3) 激活SELinux和udev;
(4) 掛載所有定義在/etc/fstab文件中的文件系統;
(5) 激活swap設備;
(6) 檢測根文件系統,并實現以讀寫方式重新掛載;
(7) 設置系統時鐘;
(8) 根據/etc/sysctl.conf文件設定內核參數的值;
(9) 激活LVM和RAID設備;
(10) 加載額外的設備驅動程序;
(11) 清理操作
4、rc #.d 目錄
此目錄保存的文件其實都是init.d下的文件只不過改了下名字,以便于服務啟動順序。
K*:要停止的服務;K##*,優先級,數字越小,越是優先關閉;依賴的服務先關閉,而后關閉被依賴的;
S*:要啟動的服務;S##*,優先級,數字越小,越是優先啟動;被依賴的服務先啟動,而依賴的服務后啟動;表示系統最后啟動,里面沒什么,自己可以把一些服務加進去,這樣就便于系統開機就啟動
5./etc/init.d/* (/etc/rc.d/init.d/*)腳本執行方式:
# /etc/init.d/SRV_SCRIPT {start|stop|restart|status}
# service SRV_SCRIPT {start|stop|restart|status}
/etc/init.d/SVC_SCRIPTS, 此些腳本遵循LSB服務腳本的定義規范,都接受至少四個最基本的參數,{start|stop|status|restart}; start stop restart status: 查看服務運行狀態;
6.在此目錄下添加腳本的方法:
1.能被添加的服務的腳本定義格式之一:
#!/bin/bash # # chkconfig: LLLL(運行級別) NN MM # description: LLL表示初始在哪個級別下啟動,-表示都不啟動 注意:后邊的NN表示S##*中##所代表的數字,數字要小于其它依賴于它的服務(要啟動在其他依賴于他的服務之前) MM代表K##*中所代表的數字,數字要大于它所依賴的服務的優先級
2. 添加進各個rc#.d
chkconfig —add 腳本的名字
讓這個服務腳本受 chkconfig 管理,這樣后就會自動的讓rc#.d(指明的運行級別下)生成 KNN腳本名字 的文件或S##
這樣以后就能直接用 service 服務名字 {stop|start|status}了
刪除:chkconfig --del name 修改指定的鏈接類型:
chkconfig命令
查看服務在所有級別的啟動或關閉設定情形:
chkconfig [—list] [name]
添加:SysV的服務腳本放置于/etc/rc.d/init.d (/etc/init.d)
chkconfig —add name:為某存放在/etc/init.d的服務在對應的/etc/rc.d/rc0-6.d目錄添加符號鏈接;
#!/bin/bash #LLLL 表示初始在哪個級別下啟動,-表示都不啟動 # chkconfig: LLLL nn nn #description
刪除:
chkconfig —del name: 把指定SVC_SCRIPTS的在7個級別符號鏈接統統刪除;
修改指定的鏈接類型
chkconfig [—level levels] name
– —level LLLL:選項明確指定的級別為on或off, 余下的級別保存原有; 省略時表示2345
– ntsysv命令
注意:正常級別下,最后啟動的一個服務S99local沒有鏈接至/etc/init.d下的某腳本,而是鏈接至了/etc/rc.d
/rc.local (/etc/rc.local)腳本;因此,不便或不需寫為服務腳本的程序期望能開機自動運行時,直接放置于此腳本文件中即可。
原創文章,作者:qzx,如若轉載,請注明出處:http://www.www58058.com/45230