還記得Windows的啓動流程嗎?相信你們能說出來個大概,爲何說出個大概呢,由於Windows是圖形界面啓動的,可是開機過程都作了什麼,你知道嗎,相反,Linux啓動的時候,會把這些加載到屏幕上面顯示,那接下來咱們來看看Linux啓動都發生了些什麼把!!!
linux
Linux啓動流程圖shell
簡解開機啓動流程centos
當用戶打開電源後,BIOS開機自檢,肯定啓動設備,安裝啓動設備啓動設備上面安裝的GRUB開始引導Linux,Linux首先先進行內核引導,經過跟切換,執行init程序,init程序肯定啓動級別,根據啓動級別進行系統初始化和運行的服務,而後返回init啓動終端,用戶經過驗證成功登錄Shell,這就是一個從開機到登錄的啓動過程bash
第一步:硬件引導啓動
網絡
這一部分簡單的說就是,BIOS程序引導並加載MBRBootloader程序,也即grub bootloader程序。ssh
當用戶打開電源後POST開始自檢,檢測硬件設備是否確實或者存在故障(是否影響正常開機),若是不影響正常開機,就把任務交給BIOS
ide
BIOS經過搜索,安裝啓動肯定啓動設備post
啓動項爲硬盤,BIOS去讀取硬盤的前512字節到內存,找到BootLoader,肯定GRUBui
第二步:GRUB引導啓動內核this
這一步分概況起來即便:GRUB程序加載執行並開始引導kernel程序
Boot Loader就是在操做系統內核運行以前運行的一小段程序。經過GRUB引導能夠肯定內核程序,由於引導扇區只有446字節,GRUB只是一個小的程序安裝在裏面,真正使用的在MBR後面的扇區存放,咱們想使用Bootloader GRUB功能必須讀取後面的文件,Bootloader GRUB功能程序的運行和加載配置選項分爲三個階段
A.Stage1階段:
Stage1階段其實就是執行系統安裝時預先寫入到MBR的Bootloader中的程序。
Stage1階段的任務僅是將硬盤0柱面0磁道2扇區的內容讀入內存並執行,它是Stage1.5階段或Stage2階段的入口,引導進入Stage1.5階段或Stage2階段。
在此Stage1階段,尚未識別文件系統的能力。
B.Stage1.5階段
stage1.5階段是stage1階段和stage2階段的中間橋樑。stage1.5階段具備識別啓動分區文件系統的能力,此後GRUB程序便有能力去訪問/boot分區下/grub目錄下的 stage2文件,並將stage2載入內存執行。
C.Stage2階段
Stage2階段執行時,首先會解析GRUB程序的配置文件grub.conf,並依配置文件決定是否顯示系統啓動菜單。而後加載內核鏡像到內存中,經過initrd程序創建RAMDisk內存虛擬根文件系統。此時控制權將轉交給內核程序。
第三部:內核引導啓動
這一部分主要是經過在內存中創建虛擬根文件系統實現相關設備的驅動並創建和切換到真正的根文件系統。
解壓內核鏡像加載到內存,以及initrd程序創建RAMDisk內存虛擬根文件系統後,內核開始驅動基本硬件,並調用虛擬根文件系統中的init程序加載驅動模塊初始化系統中各類設備的相關配置工做,其中包括CPU、I/O、存儲設備等。當所需的驅動程序加載完後,會根據grub.conf配置文件中「root=XXX」部分所指定的內容建立一個根設備,而後將根文件系統以只讀的方式掛載,並切換到真正的根文件系統上,同時調用系統進程的老祖宗進程/sbin/init程序,進入系統初始化階段。
第四步:系統初始化
這一步是經過/sbin/init,init程序準備軟件運行壞境,啓動系統服務
經過/etc/inittab文件肯定運行級別,而後去執行系統初始化腳本/etc/rc.sysinit,爲用戶初始化用戶空間環境,在完成初始化後,根據運行級別,系統開始對應級別的目錄啓動服務,關閉那些不要的服務(裏面S99local -> ../rc.local)用戶自動服務啓動腳本
文件詳解:
/etc/inittab文件
這個文件是設置系統啓動的默認級別
設置默認運行級別
(1)運行級別:爲了系統的運行或維護等目的而設定的機制;
0-6:共7個級別;
0:關機,shutdown
1:單用戶模式(single user),root用戶,無須認證,維護模式;
2:多用戶模式(multi user),會啓動網絡功能,但不會啓動NFS,維護模式;
3:多用戶模式(multi user),徹底功能模式,文本界面;
4:預留級別:目前無特別使用目的,但習慣以同3級別功能使用;
5:多用戶模式(multi user),徹底功能模式,圖形界面;
6:重啓,reboot
centos5和6已經不同了,CentOS5這裏還能夠設置【ctrl】+【alt】+【del】和【UPS】【tty】【和系統初始化腳本】,如今這些已經默認了,在這個文件由詳解
系統初始化腳本:/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)清理操做;
腳本文件/etc/rc.d/
關閉/啓動對應級別下的服務
[root@localhost ~]# ls /etc/rc.d/ init.d rc rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rc.local rc.sysinit
腳本文件/etc/rc.d/rc做用爲當級別切換時啓動或中止服務;此腳本接受傳遞的參數給腳本中$runlevel變量,而後,讀取/etc/rc$runlevel.d/K*和/etc/rc$runlevel.d/S*全部文件,這些文件就是爲何開機啓動後,有些服務會自動啓動,有些服務沒有啓動的緣由。
[root@localhost ~]# ls /etc/rc.d/rc3.d/ K01smartd K69rpcsvcgssd K95rdma S13cpuspeed S25netfs S82abrtd K05wdaemon K73winbind K99rngd S13irqbalance S26acpid S90crond K10psacct K74ntpd S01sysstat S13rpcbind S26haldaemon S95atd K10saslauthd K75ntpdate S02lvm2-monitor S15mdmonitor S26udev-post S99firstboot K15htcacheclean K75quota_nld S08ip6tables S22messagebus S28autofs S99local K15httpd K84wpa_supplicant S08iptables S23NetworkManager S50bluetooth K30spice-vdagentd K87restorecond S10network S24nfslock S50kdump K50dnsmasq K89netconsole S11auditd S24rpcgssd S55sshd K60nfs K89rdisc S11portreserve S25blk-availability S80postfix K61nfs-rdma K92pppoe-server S12rsyslog S25cups S82abrt-ccpp
K*:要中止的服務,K##*,優先級,數字越小,越優先關閉,依賴的服務先關閉,而後再關閉被依賴的。
S*:要啓動的服務,S##*,優先級,數字越小,越是優先啓動,被依賴的服務先啓動,而依賴的服務後啓動。
這些文件都是連接文件,它們連接到了/etc/init.d/*目錄下的各個程序的,例如ntpd這個腳本
[root@localhost ~]# ls /etc/rc.d/rc3.d/K74ntpd -ld lrwxrwxrwx. 1 root root 14 Jul 25 08:38 /etc/rc.d/rc3.d/K74ntpd -> ../init.d/ntpd
那咱們怎麼設置某一服務下次重啓系統後是該關閉或者開啓呢?可使用chkconfig命令實現:
checkconfig
命令格式:
chkconfig [options] Service_Name [on|off] Options: --add #→添加程序服務 --list #→列出當前系統上全部的服務對應的級別是關閉仍是啓動 --del #→刪除某個服務(只是刪除連接文件,不刪除原文件) --level [on|off] #→指定某個服務對應哪些級別是on或off
用戶自定義開機啓動程序,能夠根據本身的需求將一些執行命令或是寫到腳本/etc/rc.d/rc.local.當開機時就能夠自動加載啦!
[root@localhost ~]# ll /etc/rc.d/rc3.d/S99local lrwxrwxrwx. 1 root root 11 Jul 25 08:37 /etc/rc.d/rc3.d/S99local -> ../rc.local
第五步:啓動終端,用戶登陸shell
這一步是用戶登陸shell過程
若是沒有改變級別,默認狀況執行/sbin/mingetty打開6個純文本終端,讓用戶輸入用戶名和密碼。輸入完成後,再調用login程序,覈對密碼。若是密碼正確,就從文件 /etc/passwd 讀取該用戶指定的shell,而後啓動這個shell。
GRUB詳解
當計算機加電自檢後,ROM BIOS加載MBR(主引導扇區,即硬盤第一扇區)中的代碼到內存中,這個扇區一共512字節,前446字節內容存放grub(bootloader)的關鍵引導程序,接着64字節放置硬盤分區表DPT(Disk Partition Table),一共四能夠有四個主分區,佔64個字節,這也是爲何主分區最多隻有四個的緣由,最後2個字節是固定的標誌0x55AA。當BIOS把引導程序加載到內存後就把控制權交給grub,然後grub的剩餘代碼將完成其它代碼的加載和搬移以及文件系統初始化查找等工做,最終加載內核映像文件,從而把控制權交給真正的內核運行。
/boot/grub/grub.conf配置文件詳解:
[root@centos6 grub]# ll /etc/grub.conf #/etc/grub.conf /boot/grub/grub.conf爲鏈接文件 lrwxrwxrwx. 1 root root 22 8月 11 03:29 /etc/grub.conf -> ../boot/grub/grub.conf [root@centos6 grub]# 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 #設定默認啓動菜單項,默認爲0開始 timeout=5 #指定菜單等待選擇的時長 splashimage=(hd0,0)/grub/splash.xpm.gz #指定菜單的背景圖片的路徑,爲xpm格式,採用gzip壓縮 hiddenmenu #是否影藏菜單 password --md5 $1$1S9Xy$1MuGZSoPc2vAtkW.jvz0X/ #菜單編輯認證 title CentOS 6 (2.6.32-642.el6.x86_64) #定義菜單項 password 123456 #能夠選擇明文 root (hd0,0) #本次grub查找stage2及其kernel文件所在設備分區,指定grub的根 kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=UUID=240533cf-b37f-4460-974f-702bab867da5 nomodeset rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet #須要啓動的內核 initrd /initramfs-2.6.32-642.el6.x86_64.img #內核匹配的ramfs文件
我剛纔在裏面加入了兩個密碼,對GRUB的保護機制,輸入密碼才能編輯
生成加密的密文
[root@localhost ~]# grub-md5-crypt Password: Retype password: $1$1S9Xy$1MuGZSoPc2vAtkW.jvz0X/
問題來了
若是grub被破壞了致使系統沒法啓動該怎麼辦???
經過光盤進入緊急救援模式來進行修復
1,用關盤啓動,在安裝界面選擇 Rescue installed system 進入救援模式
2,根據提示選擇語言和鍵盤
3,選擇是否配置網卡,選擇no
4,根據硬盤上的系統提示已經找到並掛載在/mnt/sysimage下,continue用讀寫模式加載
5,輸入 chroot /mnt/sysimage 改變磁盤根目錄
6,fdisk -l /dev/sda 使用fdisk檢查分區
7,grub-install /dev/sda 安裝grub引導程序到磁盤/dev/sda的MBR扇區
8,exit
centos 7的安裝修複方式
sh 3.1#grub
grub>root(hd0,0)
grub>setup(hd0)
grub>quit