日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux启动流程及自定义gurb

發布時間:2023/12/20 linux 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux启动流程及自定义gurb 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

linux 啟動流程

POST BIOS(boot sequence) 所選擇的啟動設備次序的MBR中是否有引導程序, ----> MBR(bootloader) 提供內核列表 ------->加載選定的Kernel,initrd(內存模擬的磁盤設備需要緩存),initramfs(緩存) ?---->獲取到根文件系統并掛載,運行init

?

bootloadler開始以后的掛載流程

1、當系統讀取bootloader,掛載內核分區的時候,不識別更高級的磁盤分區上,只能放在基本磁盤分區,而且只支持read1,所以內核和根不在同一個磁盤分區上,我們通常把內核所在的基本磁盤分區掛載到boot分區上。

2、最終bootloader在啟動的時候是在臨時掛載的 / 下找 vminuz?

?

3、為了節約磁盤空間vmlinuz是被壓縮的,節約空間和保證IO速度。在使用的時候內核需要解壓,此時vmlinuz被分為2段,一段是沒有壓縮(解壓算法),另一端是壓縮的。

解壓后 bootloader讀取initramfs,的控制權完全交給kernel,內核完成自身初始化,加載磁盤完成后啟動init

?

問題1:/lib/modules在跟文件系統中,kernel如何掛載?不掛載又怎么能找到這個硬盤的驅動程序?

/lib/modules/中是linux所需要的所有模塊存放位置,但是kernel現在不知道我們的設備硬件是什么,kernel不可能將所有的模塊都放在內核中,因為硬件設備以及功能模塊太多了。所以就放到了/lib/modules。但是/lib/modules又是在跟文件系統中。那此時kernel如何能找到硬盤的驅動模塊完成并加載呢?因為此時的模塊就是在根文件系統上,我們需要先掛載他才能找到所有的模塊。這個情況就是為什么要在boot分區中還要放置一個initrd文件的原因了。這個就是啟動時加載Kernel后掛載的臨時根文件系統。

?

問題2:又是誰探測到了你的硬盤的型號,并把對應的驅動模塊放置在initramfs文件中提供給bootloader呢?

是安裝操作系統時,安裝程序在安裝操作系統時可以探測到你的硬盤是什么設備,需要什么啟動程序,做成initramfs文件放到了 bootloader可以讀取到的根文件系統中,這樣kernel就可以通過這個文件加載根文件系統,而后就可以讀取/lib/modules/ 加載所有的其他需要的模塊了

就是這個文件,所以有可能都安裝了同樣的操作系統,但是硬盤的驅動不同。導致了硬盤互換也不能啟動的原因。

initrd是個文件系統,幫助kernel完成初始化。內核要將其掛載,以這個為根,掛載后在這里加載真正根文件系統的驅動模塊,加載后initrd中有個程序運行后可以替換跟文件系統,將真正的根文件系統替換initrd,替換完以后這個應用程序由誰終止,自身終止就是系統啟動的第0個進程。之后就是要訪問/sbin/init

/sbin/init: 功能

  /etc/inittab

    /etc/rc.d/rc.sysinit腳本

      操作:

      設置主機名

      打印文本歡迎信息

      激活selinux 與 udev探測額外的硬件設備并為其裝在模塊

      激活swap

      ? 掛載etc/fstab中定義的本地文件系統

      實現檢測根文件系統,并對其以讀寫方式重新掛在

      設置系統時鐘,從硬件讀取時鐘,維護系統軟時鐘

      裝在鍵盤映射

      根據 etc/sysctl.conf 設置內核參數

      激活軟raid與lvm設備

      清理var等等目錄的操作

    設定默認運行級別

    啟動各種服務    

 init特性:

  id 操作的id

  runlevels 在那些級別下運行次操作

  action ? 動作

    initdefault 默認執行

  process 操作

?

  Centos 5 init: SystemV格式:啟動順序是串行化,初始化程序一個一個執行

  Centos 6 init: Upstart:程序依然有依賴,但是不用等待所依賴的程序完成初始化完成(啟動初始化程序通過dbus相互通信),和System V兼容性不太好。

  Centos 7 : ? SystemD,和SysV兼容。并且參考OS X 中并行初始化的過程

    啟動應用程序:將應用程序定義到啟動級別中

      ? 0:關機

     ? ? ?1:單用戶模式

      2:多用戶模式,不支持NFS文進系統    

      3:完全多用戶模式

      4:預留級別

      5:完全多用戶模式:圖形模式

      6:重啟

  /etc/init/rcS.conf ? upstart 支持的腳本   

  

start on startupstop on runleveltask# Note: there can be no previous runlevel here, if we have one it's bad # information (we enter rc1 not rcS for maintenance). Run /etc/rc.d/rc # without information so that it defaults to previous=N runlevel=S. console output pre-start script
#啟動前腳本
for t in $(cat /proc/cmdline); docase $t inemergency)start rcS-emergencybreak;;esacdone end script exec /etc/rc.d/rc.sysinit #中間會執行這個腳本 post-stop script #upstat特有的格式,會定義什么時候執行
#停止后腳本if [ "$UPSTART_EVENTS" = "startup" ]; thenif [ "$UPSTART_EVENTS" = "startup" ]; then[ -f /etc/inittab ] && runlevel=$(/bin/awk -F ':' '$3 == "initdefault" && $1 !~ "^#" { print $2 }' /etc/inittab)[ -z "$runlevel" ] && runlevel="3"for t in $(cat /proc/cmdline); docase $t in-s|single|S|s) runlevel="S" ;;[1-9]) runlevel="$t" ;;esacdoneexec telinit $runlevelfi end script

直到最后打印登錄界面

?

/proc/cmdline ?啟動內核時傳遞給內核的參數 ?or /proc/process/cmdline 啟動程序時的啟動命令。

?

MBR:

  bootloader:引導加載器,裝操作系統時又不同的操作系統設定安裝的。

  引導程序:

    win:ntloder

    linux:LILO:

        LInux LOader,不能引導位于1024柱面(Cylinder以后的分區)的操作系統

       GRUB: GRand Unified Bootloader

          把系統引導過程劃分了3端:

               1st stage:位于 MBR bootloader--為了引導snd stage

               1.5 stage:位于boot分區上,為識別內核文件所在的文件系統,系統文件系統擴展(為什么linux可以識別更多的文件系統)

               2ndstage:位于boot分區上,GRUB引導程序

               

[root@vm2 keepalived]# ls /boot/grub/ device.map ffs_stage1_5 jfs_stage1_5 reiserfs_stage1_5 stage2 xfs_stage1_5 e2fs_stage1_5 grub.conf menu.lst splash.xpm.gz ufs2_stage1_5 fat_stage1_5 iso9660_stage1_5(docker) minix_stage1_5 stage1 vstafs_stage1_5

 menu.lst -> ./grub.conf 這個就是grob主配置文件,stage2 讀取這個配置文件

# 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/mapper/VolGroup-lv_root # initrd /initrd-[generic-]version.img #boot=/dev/sda default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.32-358.el6.x86_64)root (hd0,0)kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root nomodeset rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quietinitrd /initramfs-2.6.32-358.el6.x86_64.img

?

?grob 功能;

  1,選擇啟動的內核或系統

    內核:linux

    系統,win or linux

    隱藏

  2.提供交互式接口

    e:可以編輯修改grob.conf 中的內容

   ? ? ?1:單用戶模式,給予密碼的保護(1,啟用內核,2,傳遞參數及進入編輯模式)

    

?

grub.conf 中title 就是現實在啟動界面的字符

root(hd0,0) 設定內核所在分區為grub的根

kernel 制定內核文件的路徑。后面可以傳遞給內核的啟動參數

initrd : 指定為內核提供額外驅動功能的ramdisk(因為kernel認為這是磁盤,所以需要做一個磁盤轉換為內存的緩存,所以速度慢) ?,單 ramfs(因為是文件系統,不需要再次緩存,所以快)

?

> c

進入修改模式

help root 獲取root命令的幫助

?

查找vmlinuz內核在哪個磁盤上,如果有可以tab補全

然后就可以輸入 grub> root (hd0,0) ? ? 回車

? ? ? ? ? ? ? ? ? ? ?grub> kernel /vmlinz-2.6.32-358.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root?這個root值必須要寫最好備份一份root的位置。因為這個是找不到的

? ? ? ? ? ? ? ? ? ? ?grub> initrd ?/initramfs-2.6.32-642.el6.x86_64.img?#這個文件版本必須和kernel版本對應       ? ?

? ? ? ? ? ? ? ? ? ? ?boot ?啟動

>e

進入編輯模式

>e 針對某一行進行修改

修改grub 的根分區

?

?

修改添加kernel參數

添加 : 1 單用戶模式:幾乎不會啟動任何服務,且不要登錄,但是會執行/etc/rc.d/rc.sysinit

  ? ?  如果不上執行rc.sysinit ?傳遞 emergency

   ? ? 如果想讓用戶不能隨意進入單用戶模式,兩種方式

    位置不同輸入密碼的時間就不同

    

    設置加密密碼:

    

        

? ? ? ? ??

   重啟

    

    ?需要敲e建輸入密碼 ,這是需要p進入密碼輸入

    ?啟動輸入密碼:

    

?

grub.conf 位置文件其他的含義  

?

default=0 . #定義默認啟動那個title timeout=5   #啟動倒計時 splashimage=(hd0,0)/grub/splash.xpm.gz #顯示啟動時背景圖片 hiddenmenu       #隱藏菜單 默認隱藏,只顯示倒計時。去掉就直接顯示選擇的那個os password --md5 $1$PFbU5/$/h/7uhL5LISHvrPyVTBiz0 #password centos title CentOS 6 (2.6.32-642.el6.x86_64)root (hd0,0) #hd0 磁盤, 0分區
               #磁盤表示方式:在grub中,都已hd開頭,并緊跟一個數字做各磁盤設備的標記,第幾塊硬盤
               #分區:0-3 主分區,邏輯分區從5開始,一般boot在磁盤的最外道的分區上
                    
kernel
/vmlinuz-2.6.32-642.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS LANG=en_US.UTF-8
          rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet# 制定內核文件,及傳遞給內核的參數
#ro root=/path/to/DEVICE 以只讀方式掛載真正的根分區位置,而后在sysinit中還要重新rw掛在一邊
#quiet 內核初始化信息模式:靜默,不輸初始化信息
     initrd
/initramfs-2.6.32-642.el6.x86_64.img
#通常為cpio歸檔,并使用gzip壓縮,通常以img作為后綴,因為這個是個磁盤映像文件。
      password
--md5 $1$PFbU5/$/h/7uhL5LISHvrPyVTBiz0 ~

?

轉載于:https://www.cnblogs.com/python-way/p/6189260.html

總結

以上是生活随笔為你收集整理的linux启动流程及自定义gurb的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。