CentOS啓動流程、Grub legacy配置、linux kernel模塊管理、僞文件系統介紹

寫在前面:

    博客書寫牢記5W1H法則:What,Why,When,Where,Who,How。


本篇主要內容:

● 啓動相關基礎概念彙總

啓動流程

● init程序類型

    /etc/rc.d/rc

    chkconfig

    /etc/rc.d/rc.sysinit

● GRUB legacy

    命令行接口

    配置文件

● Linux Kernel

    內核模塊查看與管理

        lsmod

        modinfo

        modprobe

        insmod/rmmod

        depmod

    ramdisk文件管理

        mkinitrd

        dracut

    內核輸出僞文件系統

        /proc

            /proc/sys及內核參數修改

        /sys



基礎概念彙總:

   Linux內核功能:

      進程管理、網絡協議棧(如IP信息)、文件系統管理、驅動程序、安全功能(selinux等)

   內核流派:

      Linux內核爲單內核設計,各功能之間的溝通更加高效,同時也參考了微內核設計結構靈活的特點,對內核的諸多功能實行模塊化設計,以完成動態裝載特定功能。

   MBR:

      Master Boot Record

      佔用硬盤的第一個扇區,即512bytes

         446bytes:裝載boot loader

         64bytes:硬盤分區表

         2bytes:標識字符,確認硬盤是否完好。一般存儲內容爲55AA

   其他分區類型:UEFI+GPT

   多系統:

   無論每個文件系統都會在首部保留一塊啓動扇區(boot sector)提供給操作系統安裝boot loader,然後操作系統在安裝時會在MBR中也寫入boot loader。開機時可以根據MBR中的boot loader條目來直接啓動系統內核,也可以將控制權交給另一個boot分區上的boot loader。從而實現多系統。

wKioL1b3xoLgw0qiAAAZK8P0uYQ517.png


   啓動流程:

      1.硬件加電,系統加載BIOS(Basic Input Output System)

      2.透過BIOS加載CMOS信息,根據CMOS的設定值獲得主機的各硬件配置,如:CPU與接口設備的溝通頻率、開機裝置的搜尋順序、硬盤大小與類型、系統時間、是否啓用即插即用設備(PnP)等等

      3.開機自檢(Power On Self Test)POST:開始執行硬件偵測的初始化,設定PnP裝置,之後根據開機裝置順序,開始進行開機裝置數據讀取。

      4.BIOS會以特殊方式來讀取MBR(Master Boot Record,主引導記錄),所以MBR中的boot loader也會被識別。

      boot loader的主要功能是要識別操作系統的文件格式並據以加載核心到主存儲核心去執行。

         對windows而言,boot loader是ntloader;

         對linux而言,boot loader是LILO(LInux LOader)或GRUB(GRand Uniform Bootloader)

      boot loader的主要功能:

         (1)提供選單。Title List

         (2)載入核心文件,將系統控制權移交給內核。

         (3)轉交其他loader。將開機管理功能移交給其他loader負責。

      補充:boot loader也可以識別硬盤上的分區,並讀取分區上的文件,所以才能夠加載內核。但其識別硬盤的方式與我們平時不太一樣,參考下面grub配置。

      5.boot loader將系統控制權交給內核。

         (1)內核完成自身初始化:

         (2)探測可識別的所有硬件設備,而不是使用BIOS的結果,此時內核完全接管了開機任務,與BIOS無關了;

         (3)加載硬件驅動程序;(可能借助ramdisk)

         (4)以只讀方式掛載根文件系統;

         (5)運行用戶空間第一應用程序/sbin/init

         注意:

            內核掛載根文件系統的時候需要磁盤驅動程序,而磁盤驅動程序在/lib/modules目錄下,這樣就永遠無法掛載硬盤了。

            爲了解決這個問題,centos透過grub加載虛擬文件系統(Inital RAM DISK,/boot/initrdramfs-$(uname -r).img文件)到內存中,ramdisk能夠爲核心提供開機所需的核心模塊、文件系統與磁盤接口驅動程序,這樣內核就能夠識別真正的根文件系統了(由於ramdisk提供了lvm、RAID驅動,所以即使/在lvm或raid分區也可以識別),並幫助核心重新載入第一應用程序來開始後續正常開機。

            當內核識別到硬盤後,會chroot到硬盤所在/,而後完成正常啓動了。

            補充:我們也可以直接將硬盤模塊編譯進內核中,而不是放到/lib/modules目錄動態加載。這樣即使沒有randisk文件,也是可以正常開機的。

      6.系統啓動初始化流程

         centos5.x:

         腳本機制:

            (1)init程序(/sbin/init)根據/etc/inittab定義的默認運行級別設置運行級別

            (2)運行系統初始化腳本/etc/rc.d/rc.sysinit,完成系統初始化

            (3)通過/etc/rc.d/rc腳本關閉對應級別需要停止的服務,啓動需要開啓的服務

            (4)設置登錄終端

            (5)如果運行級別爲5,啓動圖形終端

         centos6.x:

            使用upstart風格的配置文件來調用腳本機制的腳本

         centos7.x

            使用systemd來管理所有的系統初始化、需開啓或關閉的服務、設置登錄終端、圖形終端。


init程序的類型:

   1、CentOS 5-:SysV init

      /sbin/init

      配置文件:/etc/inittab 

      運行級別(runlevel):

         0-6的數字表示7個運行級別:

            0:關機,shutdown

            1:單用戶模式,single user

            2:多用戶模式,multi user,會啓動網絡功能,但不會啓動NFS,維護模式

            3.多用戶模式,multi user,完全功能,文本界面模式

            4.預留界別,目前無特別使用目的,習慣以同3級別功能使用

            5.多用戶模式,multi user,完全功能,圖形界面模式

            6.重啓,reboot

      默認級別:

         3、5

      級別切換:

         init #

      運行級別查看:

         who -r

         runlevel

            輸出2個字符串,第一個爲上次運行級別,N表示無,第二個爲當前運行級別。

      配置文件格式:

         /etc/inittab

         每行定義一種action和對應的process

            id:runlevel:action:process

               id:任務標識,隨意寫

               runlevel:指定切換到哪個運行級別時執行後面的action和process。空表示所有級別

               action:在什麼條件下啓動此任務

                  wait:等待切換到此任務所在級別時執行一次;

                  respawn:一旦此任務終止,就自動重新啓動;

                  initdefault:設定默認運行級別,process項省略;

                  sysinit:設定系統初始化方式,此處一般爲指定/etc/rc.d/rc.sysinit腳本

               process:任務

      例如:

#設置默認運行級別
id:3:initdefault: 
#設置系統初始化執行的腳本文件
si::sysinit:/etc/rc.d/rc.sysinit
#設置切換到某級別時,使用rc腳本完成服務啓動與關閉
l0:0:wait:/etc/rc.d/rc  0
l1:1:wait:/etc/rc.d/rc  1
…………
l6:6:wait:/etc/rc.d/rc  6
#打開終端
tty1:2345:respawn:/usr/sbin/mingetty tty1
... ...
tty6:2345:respawn:/usr/sbin/mingetty tty6


   2、CentOS 6:Upstart

      仍然爲/sbin/init

      配置文件:/etc/inittab(僅用來定義默認運行級別)

         /etc/init/*.conf

      注意:/etc/init/*.conf文件爲upstart風格的配置文件;完全兼容centos5的方式。

         其中

            rcS.conf 配置系統初始化

            rc.conf  配置對應級別服務開啓與關閉

            start-ttys.conf  配置打開終端


   3、CentOS 7:Systemd

      配置文件:/usr/lib/systemd/system/*, /etc/systemd/system/*

      systemd完全兼容SysV腳本機制,因此service命令依舊可用;但建議使用systemctl命令來控制服務。



/etc/rc.d/rc

   這是一個腳本文件,用來控制運行級別切換時的服務開啓與關閉。

   此腳本會根據/etc/rc.d目錄中rc#.d目錄下以K或S開頭的鏈接文件來確定開啓或關閉某項服務

      如:S90crond、K92iptables

      S開頭的爲開啓

      K開頭的爲關閉

      S或K後面的數字表示運行的先後順序,數字越小越優先運行

      數字後面的內容爲服務名稱,是/etc/rc.d/init.d目錄下存在的腳本文件名稱。腳本文件開頭定義了默認運行級別(在哪些級別開啓)、開啓順序(S開頭後跟的數字)、關閉順序(K開頭後跟的數字)。


chkconfig

   chkconfig命令會在/etc/rc.d/rc#.d目錄中創建鏈接文件,以供/etc/rc.d/rc腳本完成運行級別切換時要啓動或關閉的服務。

   #添加管理的服務:

      chkconfig --add SERVICE

      會根據/etc/rc.d/init.d目錄下的SERVICE文件的開頭定義內容在/etc/rc.d/rc#.d目錄中生成對應的鏈接文件。如:

         /etc/rc.d/init.d/crond文件開頭內容:# chkconfig: 2345 90 60

         則通過執行chkconfig --add crond命令後,會在/etc/rc.d/rc2.d、rc3.d、rc4.d和rc5.d目錄中分別生成S90crond鏈接文件。而在/etc/rc.d/rc0.d、rc1.d和rc6.d目錄中生成K60crond鏈接文件。

   #刪除管理服務:

      chkconfig --del SERVICE

      /etc/rc.d/目錄下有一個特殊文件rc.local,它也會在/etc/rc.d/rc2、3、4、5.d目錄中生成鏈接文件,所以當需要在2、3、4、5級別運行某服務時,可以編輯此文件。

   #修改某運行級別開啓、關閉某服務,默認爲2345

      chkconfig [--level <levels>] <name> <on|off|reset|resetpriorities>


/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) 清理操作; 


GRUB(GRand Unified Bootloader)

   目前有兩個版本

      grub 0.x:grub legacy,centos5.x/6.x使用

      grub 1.x:grub2,centos7.x使用

   grub legacy:

      由於MBR中只有446bytes給boot loader使用,無法存儲太多信息,所以grub legacy將程序代碼執行與設定值分成2個步驟(stage)

      stage1:執行裝載在mbr中的程序代碼

      stage2:通過/boot/grub/目錄中的配置文件配置:

         (1)提供菜單、並提供交互式接口

            e:編輯菜單

            c:交互式命令接口

         (2)加載用戶選擇的內核或操作系統

            允許傳遞參數給內核

            可隱藏菜單

         (3)爲菜單提供保護機制:

            爲編輯菜單進行認證

            爲啓用內核或操作系統進行認證。

      存儲設備識別

         (hd#,#)

            hd#:所有設備均識別爲hd,根據識別的順序從0開始編號

            #:分區編號,從0開始

      命令行接口:

         grub> help [KEYWORD]

         grub> find (hd#,#)/FILE

         grub> root (hd#,#)

         grub> kernel /vmlinuz-2.6.32.573.e16.x86_64 root=/dev/mapper/vg0-root [附加選項]

            ro quiet init=/PATH/TO/INIT selinux=0

         grub> initrd /initramfs-2.6.32.573.e16.x86_64.img

         grub> boot

         注意:

            由於我們將boot分區設置爲/,所以對應的路徑下文件也會與linux系統上不同:

               如果/boot/分區是單獨分區,則/boot/ --> /

               如果/boot/分區未單獨分區,則/boot/ --> /boot/

      配置文件:

         /boot/grub/grub.conf

            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: 啓動選定的內核或操作系統時進行認證;

         補充:

            當使用password條目時,可以使用--md5來指明密碼爲md5加密密碼,而加密密碼字符串可以使用grub-md5-crypt命令生成。


開機進入單用戶模式:

   (1) 編輯grub菜單(選定要編輯的title,而後使用e命令); 

   (2) 在選定的kernel後附加

      1, s, S或single都可以;

   (3) 在kernel所在行,鍵入“b”命令;


安裝grub:

   以下兩種方式必須依賴啓動的系統:

      (1)grub-install命令安裝

         grub-install --root-directory=ROOT /dev/DISK

         root-directory指的是boot目錄的父目錄

      (2)grub命令行安裝

         > root (hd0,0)

         > setup (hd0)


Linux Kernel


ldd

   print shared library dependencies

   查看程序(命令)依賴的庫文件


內核的組成部分:

   kernel

      內核核心,一般爲bzImage格式,通常位於/boot/目錄,名稱爲vmlinuz-VERSION-release;

   kernel object:

      內核對象,即內核模塊,通常放置在/lib/modules/VERSION-release/目錄

      注意:內核模塊與內核核心版本必須嚴格匹配

      補充:內核編譯時對部分功能的選項:

         [ ]:N,不編譯此模塊;

         [M]:Module,編譯爲模塊,動態加載

         [*]:Y,編譯進內核核心中

   ramdisk:

      輔助性文件,簡裝版的根文件系統,非必須,這取決於內核是否能直接驅動rootfs所在的設備(包括目標設備驅動、邏輯設備驅動、文件系統驅動)。


查看內核信息:

   uname

      -r:內核release號

      -n:主機名


內核模塊獲取與管理:

   lsmod

      Show the status of modules in the Linux Kernel

      顯示已經加載到內核中的內核模塊的狀態信息。

      輸出含義:

         模塊名稱 大小 被引用次數以及被誰引用

   modinfo

      Show information about a Linux Kernel module

      modinfo [-F field] [-k kernel] [modulename|filename...]

      -F field: 僅顯示指定字段的信息;

      -n:顯示文件路徑;

      需要注意的是,輸出中有一行“depends:”項,表示此模塊依賴的其他模塊名稱。

   modprobe

      Add and remove modules from the Linux Kernel

      動態裝載模塊:

         modprobe module_name 

      動態卸載模塊:

         modprobe -r module_name

      注意:當裝載的模塊依賴其他模塊時,其他模塊會被自動安裝。

   其他裝載與卸載模塊命令:

      insmod

         insmod [module_path] [options]

      rmmod

         rmmod [module_name]

      這組命令需要手動解決模塊依賴關係

   depmod

      depmod [module_path]

         內核模塊依賴關係文件的生成工具。這些信息存放在/lib/modules/`uname -r`/目錄下


ramdisk文件管理:

   (1)mkinitrd

      爲當前使用中的內核重新生成ramdisk文件

      mkinitrd [OPTION...] [<initrd-image>] <kernel-version>

         --with=<module>:指定除默認模塊外,額外裝載只initramfs的模塊

         --preload=<module>:initramfs所提供的需要預先裝載的模塊

      實例:

         ~]# mkinitrd  /boot/initramfs-$(uname -r).img   $(uname -r)

   (2)dracut

      底層的創建initramfs的工具,其實mkinitrd就是調用的此命令。

         dracut [OPTION...] [<image> [<kernel version>]]

      實例: 

         ~]# dracut /boot/initramfs-$(uname -r).img  $(uname -r)


內核輸出的僞文件系統:

   /proc

      內核狀態和統計信息的輸出接口;同時也提供一個配置接口/proc/sys/

      /proc/sys/

         此目錄下的net/ipv4/ip_forward相當於net.ipv4.ip_forward

         值的查看與設定:

            (1)sysctl命令

               專用於查看或設定/proc/sys/目錄下的參數的值;

               sysctl [options] [variable[=value]]

               查看:

                  sysctl -a

                  sysctl variable

               修改:

                  sysctl -w variable=value

            (2)使用cat、echo等命令重定向到文件

               查看:

                  cat /proc/sys/PATH/TO/KERNEL_FILE

               修改:

                  echo "VALUE" > /proc/sys/PATH/TO/KERNEL_FILE

            (3)配置文件

               /etc/sysctl.conf、/etc/sysctl.d/*.conf

               使其立即生效:

                  sysctl -p [CONFIG_FILE]

         常見內核參數:

            net.ipv4.ip_forward:核心轉發;

            vm.drop_caches:內存緩存配置

            kernel.hostname:主機名;

            net.ipv4.icmp_echo_ignore_all:忽略所有ping操作;

   /sys

      開機完成後,內核會輸出識別到的硬件設備信息到/sys目錄。

      sysfs:輸出內核識別出的各硬件設備的相關屬性信息,也有內核對硬件特性的可設置參數;對此些參數的修改,即可定製硬件設備工作特性;

      udev:通過讀取/sys目錄下的硬件設備信息按需爲各硬件設備創建設備文件;udev是用戶空間程序,不能直接操作硬件,所以需要藉助/sys中的文件;

         專用創建dev的工具:devadmin, hotplug;

         udev爲設備創建設備文件時,會讀取其事先定義好的規則文件,一般在/etc/udev/rules.d/目錄下,以及/usr/lib/udev/rules.d/目錄下;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章