私人定制-linux系統和grub啟動流程中問題及解決方案

系統的啟動流程;

    POST加電自檢–>Boot Sequence(BIOS)–>Boot Loader(MBR)–>kernel(Ramdisk)–>rootfs–>switchroot–>/sbin/init–>/etc/inittab /etc/init.d/*.conf–>設定默認啟動級別–>系統初始化腳本–>關閉或啟動對應級別下的服務–>啟動終端 

    grub:Grand Unified Bootloader

        grub 0.x:grub legacy

        grub 1.x:grub2

        grub legacy:

            stage1:mbr

            stage1_5:mbr之后的扇區,讓stage1中的bootloader能識別stage2所在的分區上的文件系統

            stage2:磁盤分區/boot/grub/

    blob.png

    grub的配置文件:/etc/grub.conf–>/boot/grub/grub.conf

    blob.png

    stage2及內核通常放置于一個基本磁盤分區上:

    1.提供啟動菜單,并提供交互式接口

        a.內核參數

        b.編輯模式,用于編輯菜單

        c.命令模式,交互式接口

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

        允許傳遞參數給內核

        可以藏菜單啟動項

    3.為菜單提供了保護機制

        為編輯啟動菜單進行認證

        為啟用內核或操作系統進行認證

    如何獲取設備

   (hd#,#)

    hd#:磁盤編號,用數字表示,從0開始編號

    #:分區編號,用數字表示,從0開始編號

    grub的命令行接口

        help:獲取幫助列表

        help keyword:詳細幫助信息

        find(hd#,#) /path/to/somefile

        root (hd#,#)

        kernel /path/to/kernel_file:設定本次啟動時用到的內核文件;額外還可以添加許多內核使用的cmdline參數

           如:init=/path/to/init ,selinux=0

        initrd /path/to/initramfs_file:設定為選定的內核提供額外的ramdisk

        boot:引導啟動選定的內核         

   手動在grub命令行接口啟動系統:

       當系統中的grub文件損壞時,除了對文件進行編輯操作進行修復,我們也可以通過COMMAND Line的模式自己手動進行grub的配置

       grub>root(hd#,#)

       grub>kernel /vmlinuz-version-release ro root=/dev/device

       grub>initrd /initramfs-version-release.img

       grub>boot

    blob.png

       配置文件:

       /etc/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]:啟動的內核,為grub的根

       initrd /path/to/initramfd_file:內核匹配的ramfs文件

       password [–md5] STRING:啟動選定的內核或操作系統式進行認證

     blob.png

    blob.png

  grub-md5-crypt命令:

    該命令可以是用簡單的加密算法md5對明文進行加密

    blob.png

進入單用戶模式:

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

2.  在選定的kernel后附加

1,s,S,single

3.  在kernel所在行,鍵入b命令

  安裝grub:

     1.grub-install

       grub-install –root-directory=dir /dev/disk

    blob.png

     2.grub

       grub>root(hd#,#)

       grub>setup(hd#)

  blob.png

  SITUATION ONE:

    當系統啟動stage1過程出現問題,即MBR上前446個字節出現問題,系統不能正確讀取數據,導致系統無法正常啟動,解決方案:

    blob.png

    首先掛載光盤

    blob.png

    由于系統無法讀取MBR,所以直接進入光盤啟動界面,選擇救援模式

    切換當前的根至系統實際的根分區上:chroot /mnt/sysimage

    blob.png 

    使用命令grub-install /dev/device 來修復受損的MBR,然后重啟系統

    blob.png

    出現這個畫面表示系統已經能夠成功啟動了,只需要等待系統掃描完成就可以了。

    

    SITUATION TWO

    在系統進行MBR引導啟動時,如果在stage1.5階段出現問題時,即MBR扇區第一個512字節讀取完后,后面的數據遭到了損壞,無法讀取,系統也無法啟動,這是我們可以進行如下的操作將系統恢復正常:

    blob.png

    可以看到,512字節(55 aa)之后的數據都被擦出了,然后重啟系統

    blob.png

    同樣系統啟動不了,因為破壞了stage1.5,從而系統無法獲取/boot分區掛載的相關數據信息

    blob.png

    同樣,我們選擇光盤的救援模式,進入之后,查看下掛載情況,切換根,同樣使用grub-install命令加上要修復的磁盤,進行修復,修復完成后重啟系統

    SITUATION THREE

    當系統在執行stage2過程中出現問題,如/boot下grub的配置文件配置錯誤或者誤刪了,我們可以除了通過使用光盤掛載來恢復系統,也可以使用網絡中的主機進行修復,具體步驟如下:

    

    blob.png

    如果有網絡源,我們可以通過配置IP,選擇通過網絡上的某臺主機來恢復

    blob.png

    選擇網卡設備,設置IP地址,如果是通過dhcp服務自動獲取IP,就不需要設置IP,直接通過dhcp服務獲取

    blob.png

    blob.png

    另開啟一個終端,可以查看ip獲取情況

    blob.png

    通過df命令,我們可以看到系統的根分區被掛載在/mnt/sysimage上,當前我們是在光盤的根目錄下,所以我們要切換至系統實際的根目錄下,使用命令chroot /mnt/sysimage,然后我們可以通過使用遠程拷貝命令:scp remote:/boot/* /boot/ 將受損的文件替換掉,但要注意,我們遠程鏈接的主機的操作系統應該和我們當前主機的操作系統一致。

 

   SITUATION FOUR
  預想一個更嚴重的情況,當我們刪除了/boot分區,破壞扇區,然后將/etc/fstab文件也刪除了,這種情況下,我們的系統根本就不可能起的來了

    blob.png

    此時,我們進去救援模式,此時系統提示已經找不到任何分區,無法識別分區

    blob.png

  進入bash,使用df查看到沒有系統的分區,可以使用fdisk查看到硬盤分區情況

   blob.png

  創建目錄,然后將進行掛載,然后切換根,創建/etc/fstab文件,將最根本的兩個分區掛載信息寫入該文件中/boot和/ ,然后重啟系統 

    blob.png

   重啟系統后,可以自動掛載分區,這時我們需要安裝kernel包,因為之前我們刪了/boot目錄,掛載光盤,安裝kernel包,然后重啟

    blob.png

  再次進入救援模式,使用grub-install –root-directory=/mnt/sysimage /dev/sda3 ,如果使用了chroot切換了根目錄,那么可以不指定root-directory,因為,我們現在已經位于boot的父目錄上,root-directory指定的是boot的父目錄,然后編寫boot/grub/grub.conf文件,如下:

    blob.png 

  重啟系統:

    blob.png

    SITUATION FIVE

    當然有些情況下,我們系統的使用的并不是常規的磁盤分區,而是采用的邏輯卷進行分區,安裝操作系統,這時,如果上述的某個stage過程出現問題,導致系統無法正常啟動,我們也可以通過如下的操作,來修復我們的系統

    當系統不能正常啟動時,我們應先掛載光盤,然后進入rescue救援模式,這邊我們以最壞的情況做演示,如圖所示,blob.png

    現在系統已經無法正確識別分區,使用df命令,我們也無法看到系統中的邏輯卷,也無從得知卷組,邏輯卷名稱,這時我們需要先對磁盤進行掃描lvscan,來獲取具體有哪些邏輯卷,然后我們可以使用vgchange -ay來激活這些邏輯卷,然后再使用lvscan掃描,這時我們可以看到這些邏輯卷的狀態由inactive變為active

    blob.png

    然后我們需要創建對應的目錄進行掛載,然后將邏輯卷掛載到創建的目錄上

    blob.png

    ,然后“切換”根,不是cd,進入到系統上的根目錄下,我們創建/etc/fstab文件,將最重要的兩個分區寫入文件中,/boot 和 / ,然后重啟系統,重啟之后,系統就能夠識別到掛載的分區,然后我們就可以對照上述的情況,采取對應的操作來使系統恢復正常。

    blob.png

    使用rpm命令修復受損的內核

    blob.png

    使用grub-install 命令修復受損的grub,然后創建grub.conf文件,將相應的配置信息寫進文件中

   blob.png

  重啟,系統就可以正常運作了

   blob.png

 在原有系統的基礎上,做一個微型linux

    1.先準備一塊新硬盤

   blob.png

  2.使用echo ‘- – -’ > /sys/class/scsi_host/host0/scan

   blob.png 

  3.對硬盤進行分區,進行格式化,然后分別掛載到對應目錄下

        blob.png

         blob.png

   4.安裝grub  grub-install –root-directory=/mnt /dev/sdd

        blob.png

   5.編輯grub.conf文件

        vim /mnt/boot/grub/grub.conf

        blob.png

   6.復制內核及initramfs文件

        blob.png

  7.配置fstab文件

    blob.png

 8.復制相關命令

        blob.png

  9.重開個虛擬機,以該硬盤作為啟動盤,開啟系統

        blob.png

     

       

  Linux:單內核設計,但充分借鑒了微內核體系的設計的優點,為內核引入了模塊化機制

內核的組成部分:

  kernel:內核核心,一般為bzimage,通常位于/boot目錄。名稱為vmlinuz-version-release

  kernel object:內核對象,即內核模塊,一般放置于/lib/modules/version-release/

  內核核心與內核模塊版本一定要嚴格匹配;

  []:N

  [M]:modules

  [*]:Y,直接編譯至內核核心

內核:動態裝載和卸載

      ramdisk:輔助性文件,并非必須,取決于內核是否能直接驅動rootfs所在的設備

      目標設備驅動,例如SCSI設備的驅動

      邏輯設備驅動,例如LVM設備的驅動

      文件系統,例如xfs文件系統

      ramdisk:是一個簡裝的根文件系統;

 

  內核信息查看:

      uname命令:print system information

         -r:內核的發行好

         -n:顯示主機名  

  模塊信息獲取

  lsmod:顯示的內核來自于/proc/modules

  modinfo命令:顯示單個內核模塊文件的信息

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

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

      -n 顯示文件路徑

  modprode : add and remove modules from the linux kernel

     格式:modprobe [-r] module_name

           模塊的動態裝載 modprobe module_name

           動態卸載 modprobe –r module_name

   depmod命令:Generate modules.dep and mod files

     內核模塊依賴關系文件及系統信息的生成工具

模塊的裝載和卸載的另一組命令

   insmod:

   insmod [filename] [module options…]

       Filename 模塊文件的文件路徑

   rmmod:

       rmmod [module_name]

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命令

      low level tool generating an initramfs image

      dracut [option…] [<image>] [<kernel version>] 

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

 

內核信息輸出的偽文件系統

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

blob.png

     參數:

       只讀:信息輸出 例如/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

     #cat /proc/sys/path/to/some_kernel_file

     修改:

     #sysctl –w variable=value

(2)文件系統命令(cat echo)

     查看

     # cat /proc/sys/path/to/some_kernel_file

     設定

     #echo “value” > /proc/sys/path/to/some_kernel_file

blob.png

     注意:上述兩種方式的設定僅當前運行內核有效

    (3)配置文件 /etc/sysctl.conf   /etc/sysctl.d/*.conf

         sysctl –p [/path/to/config_file]立即生效

    blob.png

內核參數

    net.ipv4.ip_forward 報文核心轉發功能

    vm.drop_caches 回收內存  /proc/sys/vm/drop_caches丟棄caches  

    kernel.hostname

    net.ipv4.Icmp_echo_ignore_all 禁止其他主機ping

   

/sys目錄

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

    udev:通過讀取/sys目錄下的硬件設備信息按需為各硬件設備創建設備文件

    udev:是用戶空間程序 專用工具devadmin hotplug

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


編譯內核-定制個人LINUX      

    step1: 從官網上選擇一個內核版本下載至本地系統中

    step2: 對下載到的包進行解壓縮,指定解壓的路徑至:/usr/src下,tar xvf linux-*.gz -C /usr/src 

    blob.png

    step3:  拷貝一個配置文件的模板至解壓縮的目錄下,以.config命名

    step4: 使用make menuconfig命令進行個人定制,選擇自己所需要的功能組件,對于那些不需要的功能,我們可以選擇不加載到模塊或者內存中,使用空格鍵進行選擇,M表示加載到模塊中,*表示加載到內存中,我們也可以自己設定kernel的名稱

  blob.png    

    blob.png   

     blob.png

  step5:make -j #   

        #:指明處理器核心總數,推薦使用并行編譯,加快編譯速度

        lscup可以查看cpu數量:

    blob.png

    blob.png


    step6:編譯完成后,模塊安裝

        make modules_install 

    blob.png

   安裝之后,我們可以看到/lib/modules文件下,多了一個模塊,這就是我們剛剛編譯安裝的模塊

    blob.png 

    進入到目錄中,我們可以找到自己個人定制的一些功能模塊

    blob.png


    step7:安裝內核對應文件

    blob.png

    blob.png

    安裝完成后,在/boot目錄下,就多了一個剛編譯的內核核心

    查看/boot/grub2/grub.cfg,可以看到新的內核信息已經寫入到該文件中,之后重啟系統就可以看到增加了一個新的內核

    blob.png

    選擇新編譯的內核,啟動

    blob.png

    系統正常啟動

    blob.png

    至此,個人定制linux系統制作完成

  


原創文章,作者:Stupid_L,如若轉載,請注明出處:http://www.www58058.com/45867

(0)
Stupid_LStupid_L
上一篇 2016-09-13
下一篇 2016-09-13

相關推薦

  • 從Linux小白到大?!c狼共舞的日子11

    馬哥教育網絡班21期+第10周課程練習 1、詳細描述一次加密通訊的過程,結合圖示最佳。 加密過程 1.使用單向加密算法,提取A的文件的特征碼。 2.使用A的私鑰對提取出來的特征碼進行加密,把加密后的特征碼附加在A的文件的后面。 3.使用對稱加密對剛剛的A的文件和加密后的特征碼進行加密,生成對稱加密密鑰 4.使用B的公鑰對第3步驟的對稱加密的密鑰進行加密,加密…

    Linux干貨 2016-12-05
  • linux 3.26 第一課

    setup app

    2018-03-26
  • Haproxy+Keepalived+Varnish+LAMP+Memcacked+NFS 實現WordPress站點的動靜分離

    詳細說明,請點擊CSDN博客的連接地址:http://blog.csdn.net/yhy1271927580/article/details/70195158

    2017-04-16
  • linux程序包管理

    Linux程序包管理        API:Application Program Interface        ABI:Application Binary Interface           Unix-like, &n…

    Linux干貨 2016-12-30
  • 基于nginx實現7層http的負載均衡

    一、實驗環境實驗環境為三臺服務器:1. nginx負載均衡器1. 內網ip:192.168.11.1002. 外網ip:172.16.251.892. 提供網頁服務的RS-1服務器:192.168.11.2013. 提供網頁服務的RS-2服務器:192.168.11.2024. 拓撲如下:二、實驗配置后臺服務器配置:1. 后臺提供網頁服務的兩臺服務器配置:y…

    Linux干貨 2017-06-29
  • linux啟動流程+任務計劃

    20160907 一、作業 1、每周2, 4, 7備份/var/log/messages文件至/logs目錄中,文件名形如“messages-yyyymmdd” 2、每兩小時取出當前系統/proc/meminfo文件中以S或M開頭的信息追加至/tmp/meminfo.txt文件中 二、博客 1、centos5,6啟動流程 開機——POST…

    Linux干貨 2016-09-08
欧美性久久久久