1. 程式人生 > >linux啟動及內核管理

linux啟動及內核管理

開機啟動

一:Linux 系統系統的組成

Linux由kernel和rootfs組成,那麽什麽是kernel,什麽是rootfs呢?
kernel:操作系統內核,操作系統內核是指大多數操作系統的核心部分。kernel用於進程管理、內存管理、網絡管理、驅動程序、文件系統、安全功能
rootfs:程序和glibc。rootfs之所以存在,是因為需要在VFS機制下給系統提供最原始的掛載點。VFS是Linux文件系統實現必須遵循的一種機制,rootfs是一種具體實現的文件系統、Linux下所有文件系統的實現都必須符合VFS的機制(符合VFS的接口);這就是二者的真正關系。
庫:函數集合, function, 調用接口(頭文件負責描述)

程序:二進制執行文件


二:系統啟動過程

操作系統的啟動分為兩個階段:引導boot和啟動startup。引導階段開始於打開電源開關,結束於內核初始化完成和 systemd 進程成功運行。啟動階段接管了剩余工作,直到操作系統進入可操作狀態

引導boot階段

1:POST: Power-On-Self-Test,加電自檢,是BIOS功能的一個主要部分。負責完成對CPU、主板、內存、硬盤子系統、顯示子系統、 串並行接口、鍵盤、 CD-ROM光驅等硬件情況的檢測。
2:讀取MBR
1.Stage 1: BIOS 將查找在接入的磁盤中查找引導記錄,其通常位於 MBR(主引導記錄Master Boot Record),它加載它找到的第一個引導記錄中到內存中,並開始執行此代碼。引導代碼(即階段 1 代碼)必須非常小,因為它必須連同分區表放到硬盤的第一個 512 字節的扇區中。該階段的主要工作就是查找並加載第二段Bootloader程序(stage2),但系統在沒啟動時,MBR根本找不到文件系統,也就找不到stage2所存放的位置,因此,就有了stage1_5

Stage 1.5 在該階段,系統會加載一個存放在分區外的鏡像文件initrd。該文件在系統引導過程中掛載的一個臨時根文件系統,用來支持兩階段的引導過程。initrd文件中包含了各種可執行程序和驅動程序,它們可以用來掛載實際的根文件系統,然後再將這個 initrd RAM磁盤卸載,並釋放內存。
技術分享圖片
Stage 2 /initramfs-$(uname -r).img,需要掛載/dev/sda2前提是有ext4.ko。 GRUB程序會根據/boot/grub/grub.conf文件查找Kernel的信息,然後開始加載Kernel程序,當Kernel程序被檢測並在加載到內存中,GRUB就將控制權交接給了Kernel程序。簡單說就是:加載內核掛載根文件系統

練習:刪除centos6中的/boot/grub/grub.conf文件,並重啟。先使系統臨時啟動後,再重新編寫grub.conf文件,以使下次開機後自動啟動。
技術分享圖片
在刪除該文件後發現,機器還能正常運行,但是當我們重啟呢?發現機器不能正常啟動了。
技術分享圖片
接下來我們按照如下操作進入系統,再詳細講解該文件的作用。
技術分享圖片
接下來我們來學習一下這個文件。看它具體是什麽功能。


    #boot=/dev/sda

    default=0        #設定默認啟動的title的編號,從0開始

    timeout=5       #等待用戶選擇的超時時間

    splashimage=(hd0,0)/boot/grub/splash.xpm.gz    #GRUB的背景圖片

    hiddenmenu     #隱藏菜單

    title CentOS (2.6.18-194.el5PAE)      #內核標題

        root (hd0,0)         #內核文件所在的設備

        kernel /vmlinuz-2.6.18-194.el5PAE ro root=LABEL=/     #內核文件路徑以及傳遞給內核的參數

        initrd /initrd-2.6.18-194.el5PAE.img                            #ramdisk文件路徑

2:啟動startup階段 (服務)

init進程是所有Linux進程的父進程,它的進程號為1。init命令是Linux操作系統中不可缺少的程序之一,init進程是Linux內核引導運行的,是系統中的第一個進程。
接下來我們在學習一個文件:/etc/inittab

id:runlevels:action:process

id 用來定義在inittab文件唯一的條目編號,長度為 1-4個字符
runlevels 列出來運行的級別 為空則代表所有級別
action 要執行的動作
process 要執行的程序

id:3:initdefault:

id 就使用id本身來定義
3 就是列出的運行級別
initdefault
這個動作就是設定默認的運行級別,如果前面runlevels不指定運行級別,那麽會在啟動時在終端詢問,這一行不需要process這一段

si::sysinit:/etc/rc.d/rc.sysinit

id 是 si 只是用來標識
runlevels 為空則代表的是 所有的運行級別
sysinit 是指在系統啟動時執行後面的process(也就是/etc/rc.d/rc.sysinit)
/etc/rc.d/rc.sysinit 這是一個系統初始化腳本,這個腳本裏面初始化很多的進程
/etc/rc.d/rc.sysinit 的作用:
(1) 設置主機名
(2) 設置歡迎信息
(3) 激活udev和selinux
(4) 掛載/etc/fstab文件中定義的文件系統
(5) 檢測根文件系統,並以讀寫方式重新掛載根文件系統
(6) 設置系統時鐘
(7) 激活swap設備
(8) 根據/etc/sysctl.conf文件設置內核參數
(9) 激活lvm及software raid設備
(10) 加載額外設備的驅動程序
(11) 清理操作

服務啟動管理
chkconfig autofs on
chkconfig autofs off
chkconfig autofs on --level 35
service autofs start
service autofs stop
service autofs status
service autofs reload

/etc/init.d/autofs start|stop|status|reload
技術分享圖片
通過這些命令可以修改服務在不同模式下的開關狀態。圖片中顯示的是在不同模式下服務的開關狀態。
之前講的那些服務都是頻繁用的服務,但是那些不經常用的服務呢?如果讓他們一直開著就會很浪費資源,這種情況下就產生了這樣一種策略,讓這些不經常用的服務睡下去,等到需要她們了再把它們叫醒,那麽就要有一個叫醒他們的服務:Xinetd服務。由Xinetd統一去叫醒那些沈睡的服務。下面我們講一下Xinetd服務
Xinetd自身是一個SysV服務,激活與禁用的方式是:chkconfig daemon on/off等價於修改/etc/xinetd.d/daemon disable = no/yes
使修改生效要重啟/etc/init.d/xinetd restart


接下來我們來做幾個實驗。
1.刪除/boot/grub/除grub.conf以外的所有文件,重啟,發現還能啟動
技術分享圖片

2.破壞grub,發現啟動不了,按如下方式修復。

    dd if=/dev/zero of=/dev/sda bs=1 count=446

技術分享圖片

 進入rescue 
    chroot /mnt/sysimage
    grub-install /dev/sda
 kernel /vmlinuz.... ro root=/dev/sda2 selinux=0 
vim /etc/selinux/config
    SELINUX=disabled

技術分享圖片
技術分享圖片

3.接著刪除 /boot/grub/除grub.conf以外的所有文件,發現無法啟動。
技術分享圖片
技術分享圖片
這是因為原本的操作系統有stage2的文件,後來grub-install將原來的給覆蓋了,所以我們只需要再將stage2 找回來就好了。

4.破壞sda1 ,發現系統直接損壞。

dd if=/dev/zero of=/dev/sda bs=1 count=10240 seek=512
    rescue
    chroot /mnt/sysimage
    grub-install /dev/sda #恢復/boot/grub/stage 文件
    grub
        root(hd0,0)
        setup (hd0)

技術分享圖片
技術分享圖片
技術分享圖片

linux啟動及內核管理