系統啟動和內核管理

Linux組成

  • Linux:kernel+rootfs

    • kernel:進程管理、內存管理、網絡管理、驅動程序、文件系統、安全功能
    • rootfs:程序和glibc

      • 庫:函數集合,function,調用接口(頭文件負責描述)

        • 過程調用:procedure,無返回值;
        • 函數調用:function;有返回值,可以賦值于變量中;
      • 程序:二進制執行文件

    包括根目錄以及包含/ boot,/ dev,/ etc,/ bin,/ sbin和some / tmp(用于臨時文件)的最小的子目錄和文件集。

  • 內核設計流派

    • 單內核(monoli kernel):Linux
      把所有功能集成于同一個程序
    • 微內核:(micro kernel):Windows,Solaris
      每種功能使用一個單獨的子系統實現
  • Linux內核特點:

    • 支持模塊化:.ko(內核對象)
      如:文件系統,硬件驅動,網絡協議等
    • 支持內核模塊的動態裝載和卸載
    • 組成部分:

      • 核心文件:/boot/vmlinuz-VERSION-release

        • ramdisk:輔助的臨時根系統;并非是必須的;
          CentOS 5: /boot/initrd-VERSION-release.img
          CentOS 6,7: /boot/initramfs-VERSION-release.img
      • 模塊文件:/lib/modules/VERSION-release

CentOS 5和6的啟動流程

POST:Power-On-Self-Test

  • 加電自檢,是BIOS功能的一個主要部分。負責完成對CPU、主板、內存、硬盤子系統、顯示子系統、串并行接口、鍵盤、CD-ROM光驅等硬件情況的檢測。
  • ROM:BIOS,Basic Input and Output System,保存著有關計
    算機系統最重要的基本輸入輸出程序,系統信息設置、開機加電自檢程序和系統啟動自舉程序等。

  • RAM:CMOS互補金屬氧化物半導體,保存各項參數的設定

Boot Sequence

按次序查找引導設備,第一個有引導程序的設備為本次啟動設備

  • bootloader: 引導加載器,引導程序

    • windows: ntloader,僅是啟動OS

    • Linux:功能豐富,提供菜單,允許用戶選擇要啟動系統或不同的內核版本;把用戶選定的內核裝載到內存中的特定空間中,解壓、展開,并把系統控制權移交給內核;

      • LILO:LInux LOader;當時針對于的硬盤較小,故現在PC機上大多不適用,手機上使用較多;
      • GRUB: GRand Unified Bootloader

        1. GRUB 0.X: GRUB Legacy;
        2. GRUB 1.X:GRUB2;

      bootloader代碼量很小,為了簡化;使得其無法驅動軟設備,也就無法訪問設備上的文件;
      故內核文件不能放在邏輯卷上,只能放在基本的磁盤分區

  • MBR
    512bytes

    • 446: bootloader;
      64: 分區表;
      2: 55AA;
      查看二進制文件:hexdump -C /dev/sda -n 512
  • GRUB:

    • stage 1:mbr
    • stage 1.5:mbr之后的扇區,
      讓stage 1中的bootloader能識別stage2所在的分區上的文件系統
    • stage 2:磁盤分區(/etc/grub/)
      配置文件:/boot/grub/grub.conf <– /etc/grub.conf
  • kernel:

    自身初始化:

    1. 探測可識別到的所有硬件設備;
    2. 加載硬件驅動程序(借助于ramdisk加載真正的根文件系統);
    3. 只讀方式掛載根文件系統(rootfs);
      避免內核和操作系統有bug,故采用只讀模式;
      當完成掛載后根所在的設備的bin、sbin、boot…;就是/bin、/sbin、/boot…
    4. 運行用戶空間的第一個應用程序:/sbin/init
    • ramdisk:加載真正的根文件設備驅動程序
      內核中的特性之一:使用緩沖和緩存來加速對磁盤上的文件訪問,并加載相應的硬件驅動

      • ramdisk –> ramfs 一種提速機制
      • CentOS 5: initrd
        工具程序:mkinitrd
        CentOS 6,7: initramfs
        工具程序:mkinitrd, dracut
      • ramdisk文件的制作:

        1. mkinitrd命令;為當前正在使用的內核重新制作ramdisk文件

          • –with=:除了默認的模塊之外需要裝載至initramfs中的模塊;
          • –preload=:initramfs所提供的的模塊需要預先裝載的模塊;

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

        2. dracut命令;為當前正在使用的內核重新制作ramdisk文件
          dracut /boot/initramfs-$(uname -r).img $(uname -r)
    • init程序的類型:運行的第一個應用程序

      • SysV: init, CentOS 5之前
        配置文件:/etc/inittab

      • Upstart: init,CentOS 6
        配置文件:/etc/inittab;為了兼容centos5
        /etc/init/*.conf

      • Systemd:systemd, CentOS 7
        配置文件:/usr/lib/systemd/system
        /etc/systemd/system

系統初始化(內核級別)

  • POST –> 讀取BIOS中的BootSequence,確定引導加載設備–>讀取此設備的Bootloader(MBR中) –> kernel(ramdisk) –> rootfs(只讀) –> /sbin/init(systemd)

CentOS 5:SysV init


  • 運行級別:為系統運行或維護等目的而設定;0-6:7個級別
    0:關機;init 0;不能設置為默認級別
    1:單用戶模式(root自動登錄), single, 維護模式
    2: 多用戶模式,啟動網絡功能,但不會啟動NFS(網絡文件系統);維護模式
    3:多用戶模式,完全功能模式;文本界面;
    4:預留級別;目前無特別使用目的,可同3級別
    5:多用戶模式,完全功能模式;圖形界面
    6:重啟;init 6;不能設置為默認級別

    • 默認級別: 3, 5
      切換級別:init #
      查看級別:runlevel ; who -r
  • 配置文件:/etc/inittab
    每一行定義一種action以及與之對應的process
    id : runlevel : action : process

    • id:一個任務的標識符
    • runlevels:在哪些級別啟動此任務;#,###,也可以為空,表示所有級別;
    • action:在什么條件下啟動此任務

      • wait: 等待切換至此任務所在的級別時運行一次;
        respawn:一旦此process終止,就重新啟動之;
        initdefault:設定默認運行級別;process省略
        sysinit:設定系統初始化方式,此處一般為指定/etc/rc.d/rc.sysinit(centos 7 沒有此腳本);
    • process:任務

init啟動流程

  • 設定默認級別:/etc/inittab

    id:3:initdefault:
  • 設定系統初始化腳本:CentOS 5中是在/etc/inittab,CentOS 6中沒有此信息,但腳本依舊在/etc/rc.d/rc.sysinit;

    si::sysinit:/etc/rc.d/rc.sysinit
    • 設置主機名;

      [root@centos6 rc.d]# grep network /etc/rc.d/rc.sysinit 
      if [ -f /etc/sysconfig/network ]; then
       . /etc/sysconfig/network
       # In theory there should be no more than one network interface active
       # Use the network address to set the hostname of the client.  This
       if [ -x /usr/sbin/system-config-network-tui ]; then
       /usr/sbin/system-config-network-tui
       # Reread in network configuration data.
       if [ -f /etc/sysconfig/network ]; then
       . /etc/sysconfig/network
      if [ -x /usr/sbin/system-config-network-cmd ]; then
           /usr/sbin/system-config-network-cmd --profile ${arg##netprofile=}
      
      [root@centos6 rc.d]# cat /etc/sysconfig/network
      NETWORKING=yes
      HOSTNAME=centos6.8
    • 設置歡迎信息;
    • 激活udev和selinux;
    • 掛載/etc/fstab文件中定義的所有文件系統;

      [root@centos6 rc.d]# grep /etc/fstab /etc/rc.d/rc.sysinit 
         # First try to mount scratch storage from /etc/fstab, then any
         # First try to mount persistent data from /etc/fstab, then any
         restorecon $(awk '!/^#/ && $4 !~ /noauto/ && $2 ~ /^\// { print $2 }' /etc/fstab) >/dev/null 2>&1
      action $"Enabling /etc/fstab swaps: " swapon -a -e
    • 檢測根文件系統,并以讀寫方式重新掛載根文件系統

      [root@centos6 rc.d]# grep rw /etc/rc.d/rc.sysinit 
         rw_mount_dev=$(blkid -t LABEL="$RW_LABEL" -l -o device)
         elif [ x$rw_mount_dev != x ] && mount $rw_mount_dev $mountopts "$RW_MOUNT" > /dev/null 2>&1; then
         for file in /etc/rwtab /etc/rwtab.d/* /dev/.initramfs/rwtab ; do
             mount -t nfs $CLIENTSTATE/$HOSTNAME $STATE_MOUNT -o rw,nolock
         if [ "$opt" = "rw" ]; then
       action $"Remounting root filesystem in read-write mode: " mount -n -o remount,rw /
      
      其中:mount -n -o remount,rw
    • 設置時鐘;
    • 根據/etc/sysctl.conf文件來設置內核參數;
    • 激活lvm及軟raid設備;

      [root@centos6 rc.d]# grep change /etc/rc.d/rc.sysinit 
             action $"Setting up Logical Volume Management:" /sbin/lvm vgchange -a ay --sysinit --ignoreskippedcluster
    • 激活swap設備;
    • 加載額外設備的驅動程序;
    • 清理操作;
  • 啟動對應級別的服務:

    在CentOS 5中的/etc/inittab文件中  
    
    l0:0:wait:/etc/rc.d/rc 0
    l1:1:wait:/etc/rc.d/rc 1
    ... ...
    l6:6:wait:/etc/rc.d/rc 6
    
    rc N -->意味著讀取/etc/rc.d/rcN.d
    • /etc/rc.d/rcN.d/目錄下的服務腳本控制服務(守護進程);
      這些目錄下的K*或S*是/etc/rc.d/init.d/下對應的腳本的鏈接;

      CentOS 5或6:都在/etc/rc.d/rc
      
      for srv in /etc/rc.d/rcN.d/K*; do
           $srv stop
      done
      for srv in /etc/rc.d/rcN.d/S*; do
            $srv start
      done
      運行時:先執行K,再執行S;
         K*:要停止的服務; K##*:##運行次序;數字越小,越先關閉;數字越小的服務,通常為依賴別的服務的服務;
         S*:要啟動的服務; S##*:##運行次序;數字越小,越先啟動;數字越小的服務,通常為被依賴的服務
    • /etc/rc.d/init.d/*(/etc/init.d/*)服務腳本

      1. /etc/rc.d/init.d/*(/etc/init.d/*)服務腳本編寫
        最好學習/etc/rc.d/init.d/*(/etc/init.d/*)系統腳本
        示例:

        #!/bin/bash
        #
        #chkconfig:35 98 01
        #description:test service
        case $1 in
        start)
            echo testsrv is stsrting
            touch /root/testsrv
            ;;
        stop)
            echo testsrv is stop
            rm -f /root/testsrv
            ;;
        status)
            [ -f /root/testsrv ] && echo testsrv is starting || echo testsrv is stoped
            ;;
        *)
            echo "testsrv usage:start|stop|status"
        esac
      2. /etc/rc.d/init.d/*(/etc/init.d/*)服務腳本執行方式

        /etc/init.d/SRV_SCRIPT{start|stop|restart|status}
        or
        service SRV_SCRIPT{start|stop|restart|status}
        
        [root@centos6 rc.d]# ll /etc/init.d /etc/rc.d/init.d -d
        lrwxrwxrwx. 1 root root   11 May 10 22:57 /etc/init.d -> rc.d/init.d
        drwxr-xr-x. 2 root root 4096 May 11 07:36 /etc/rc.d/init.d  
        
        直接運行/etc/init.d下的腳本 == service 
        例如:/etc/init.d/httpd status == service httpd status
      3. /etc/rc.d/init.d/*(/etc/init.d/*)服務腳本的刪除
        chkconfig –del name
        rm -rf name
        chkconfig –list:查看是否刪除
    • chkconfig命令:管控/etc/rc.d/init.d(/etc/init.d/)每個服務腳本在各級別下的啟動或關閉狀態;

      • 查看服務在所有級別的啟動或關閉設定情形:
        chkconfig [–list] [name]
      • 添加:
        SysV的服務腳本放置于/etc/rc.d/init.d (/etc/init.d)
        chkconfig –add name

        1. 能被添加的服務的腳本定義格式之一:

          #!/bin/bash
          #LLLL 表示初始在哪個級別下啟動,-表示都不啟動
          # chkconfig: LLLL nn nn
          # description:
        2. 能被添加的服務的腳本定義格式之二:
          查看/etc/init.d/crond
      • 刪除:
        chkconfig –del name
      • 修改指定的鏈接類型
        chkconfig [–level levels] name <on|off|reset>
        –level LLLL: 指定要設置的級別;省略時默認為2345
        僅下次開機時改變,目前不改變;
    • ntsysv命令:圖形界面管理服務
    • service命令:手動管理服務

      • service 服務 start|stoprestart
      • service –status-all 查看當前所有服務狀態
    • 瞬態(Transient)服務被xinetd進程所管理

      • 進入的請求首先被xinetd代理
        配置文件:/etc/xinetd.conf、/etc/xinetd.d/<service>
        與libwrap.so文件鏈接
        用chkconfig控制的服務:chkconfig tftp on
    • 注意:

      • 正常級別下,最后啟動一個服務S99local沒有鏈接至/etc/rc.d/init.d一個服務腳本,而是指向了/etc/rc.d/rc.local腳本
      • 不便或不需寫為服務腳本放置于/etc/rc.d/init.d/目錄,且又想開機時自動運行的命令,可直接放置于/etc/rc.d/rc.local文件中
      • /etc/rc.d/rc.local在指定運行級別腳本后運行
      • 可以根據情況,進行自定義修改
      • 當某個服務無法啟動,導致系統無法啟動,進入單用戶模式下進行修改模,進行修復;
        但是,當單用戶模式也無法啟動時,進入菜單(a);

        1. 可將啟動模式修改:init=/bin/bash;進入命令行操作
        2. 因為當第一次掛載根文件系統時是只讀模式,修改為讀寫模式;mount -o remount,rm /
        3. 進行修復
  • 打印各啟動終端:

    tty1:2345:respawn:/usr/sbin/mingetty tty1
    tty2:2345:respawn:/usr/sbin/mingetty tty2
    ...
    tty6:2345:respawn:/usr/sbin/mingetty tty6
    • mingetty會自動調用login程序
    • 打開虛擬終端的程序除了mingetty之外,還有諸如getty等
  • 如果默認級別是5級別的話會運行圖形界面的啟動:
    x:5:respawn:/etc/X11/prefdm -nodaemon

啟動流程(用戶空間):/sbin/init(/etc/inittab)

  • 設置默認運行級別 –> 運行系統初始化腳本,完成系統初始化 –> 關閉對應級別下需要關閉的服務,啟動對應級別下需要啟動服務 –> 設置登錄終端 [–>啟動圖形終端]

啟動流程(內核空間+用戶空間)

  • POST –> Boot Sequence(BIOS) –> Boot Loader –>Kernel(ramdisk) –> rootfs –> switchroot –> /sbin/init –>(/etc/inittab, /etc/init/*.conf) –> 設定默認運行級別 –> 系統初始化腳本rc.sysinit –> 關閉或啟動對應級別的服務 –> 啟動終端(先是啟動字符終端;如果運行級別是5,則啟動圖形界面)

CentOS 6


  • init程序:upstart,但依然為/sbin/init,其配置文件:

    • /etc/inittab(僅用于定義默認運行級別)

    • /etc/init/*.conf (其他的在這些文件中)

    *.conf遵循upstart風格的配置文件;

CentOS 7


  • init程序:systemd,配置文件:

    • /usr/lib/systemd/system/*
      /etc/systemd/system/*
  • 完全兼容SysV腳本機制;因此,service命令依然可用;不過,建議使用systemctl命令來控制服務;

    • systmctl {start|stop|restart|status} name[.service]

Grub

  • grub:GRand Unified Bootloader

    • grub 0.x:grub legacy
    • grub 1.x:grub2
  • grub legacy:

    • stage 1:mbr;不屬于任何分區,是硬盤的mbr的前446字節;
    • stage 1.5:mbr之后的扇區,讓stage 1中的bootloader能識別stage2所在的分區上的文件系統;
    • stage 2:磁盤分區(/etc/grub/)
      配置文件:/boot/grub/grub.conf <– /etc/grub.conf
      /boot/grub/中的

    • stage2及內核等通常放置于一個基本磁盤分區;

      • 功用:

        1. 提供菜單、并提供交互式接口

          • a:內核參數;
          • e:編輯模式,用于編輯菜單;
          • c:命令模式,交互式接口
        2. 加載用戶選擇的內核或操作系統
          允許傳遞參數給內核
          可隱藏此菜單
        3. 為菜單提供了保護機制
          為編輯菜單進行認證
          為啟用內核或操作系統進行認證
    • 如何識別設備:
      (hd#,#)

      • hd#:磁盤編號,用數字表示;從0開始編號
      • #:分區編號boot分區所在,用數字表示;從0開始編號
    • cat /proc/cmdline 內核參數
      內核參數文檔:/usr/share/doc/kernel-doc-2.6.32/Documentation/kernel-parameters.txt

    • grub的命令行接口

      • help:獲取幫助信息
        help KEYWORD:詳細幫助信息
      • find (hd#,#)/PATH/TO/SOMEFILE;
      • root (hd#,#)
      • kernel /PATH/TO/KERNEL_FILE:設定本次啟動時用到的內核文件;額外還可以添加許多內核支持使用的命令行參數;
        如:init=/path/to/init , selinux=0
      • initrd /PATH/TO/KERNEL_FILE:設定為選定的內核提供額外文件的ramdisk;
      • boot:引導啟動的內核;

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

        1. grub> root (hd#,#)
        2. grub> ketnel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE
        3. grub> initrd /initramfs-VERSION-RELEASE.img
        4. grub> boot
    • 配置文件:/boot/grub/grub.conf

      • 配置項:

        1. default=#:設定默認啟動的菜單項;菜單項(title)編號從0開始;
        2. timeout=#:指定菜單項等待選項選擇的時長;
        3. splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:Z指明菜單背景圖片文件路徑;

          • yum searrch ImageMagick
          • 生成.xpm:convert -resize 640×480 -colors 14 win.png win.xpm
          • more win.xpm
          • gzip win.xpm
          • 修改grub.conf中splashimage選項
        4. hiddenmenu:隱藏菜單;
        5. password [–md5|–encrypted] STRING:菜單編輯認證;
        6. title TITLE:定義菜單項“標題”

          • root (hd#,#):boot所在分區;grub查找stage2及ketnel文件所在設備分區;為grub的“根”;
          • kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:啟動的內核

            kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=UUID=472a74aa-d91e-4b79-844b-90415bdfb7c8  rhgb(啟動時的圖標)  quiet(靜默,不顯示啟動過程)

          • initrd /PATH/TO/INITRAMFS_FILE:與內核匹配的ramfs文件;
          • password [–md5|–encrypted] STRING:啟動選定的內核或操作系統時進行認證;
    • 生成grub口令

      • grub-md5-crypt :生成md5口令
      • grub-crypt :生成sha512口令
    • 破解root口令:
      啟動系統時,設置其運行級別1;進入單用戶模式
    • 進入單用戶模式:
      (1) 編輯grub菜單(選定要編輯的title,而后使用e命令)
      (2) 在選定的kernel后附加
      1, s, S或single都可以
      (3) 在kernel所在行,鍵入“b”命令
    • 安裝grub:

      1. grub-install:二進制類的文件可以恢復,圖片、grub.conf的文件不會恢復。
        安裝grub stage1和stage1_5到/dev/DISK磁盤上,并復制GRUB相關文件到 DIR/boot目錄下
        grub-install –root-directory=DIR /dev/DISK
      2. grub:依賴于/boot/grub/中的除grub.conf之外的文件;
        grub> root (hd#,#)
        grub> setup (hd#)
      3. sync:強制寫入硬盤
    • 在/boot/grub/目錄下除grub.conf之外的其他文件都是備份文件,(/boot/grub/stage1內沒有分區表):

      • 初始狀態下grub使用的文件在硬盤的一個位置,而并非使用grub下的文件;系統啟動使用的是grub.conf文件;
      • 但是在后期如果做過修復工作后,grub使用的是grub目錄下的文件,所以此時grub不可使用

      實驗:

      • 破壞stage1:

        • 備份:dd if=/dev/sda of=/app/mbr bs=1 count=512
        • 破壞:dd if=/dev/zero of=/dev/sda bs=1 count=446;;
        • 表現:stage1破壞后系統會直接進行光盤引導
        • 修復1:使用grub-install –root-directory=/ /dev/DISK
        • 修復2:不啟動且此時/boot/grub/下的文件沒有任何改動,可以使用grub修復;

          1. grub(hd0,0)
          2. setup(hd0)
      • 破壞stage1.5:

        • 破壞:dd if=/dev/zero of=/dev/sda bs=1 count=2048 skip=512 seek=512
        • 表現:跳過光盤引導,菜單不顯示,說明破壞成功;
        • 修復:使用grub依賴于配置文件stage1、stage1.5、stage2

          1. grub>root (hd0,0)
          2. grub>setup (hd0)
      • 破壞stage2:

        • 破壞:把/boot/grub/下的所有文件都移除;
        • 修復:使用grub-install /dev/sda

          1. 修復完成后/boot/grub/中的文件會恢復,grub.conf不會恢復;要么copy、要么手寫一份;

自制Linux

  • 分區并創建文件系統
    fdisk /dev/sdb
    分兩個必要的分區
    /dev/sdb1對應/boot /dev/sdb2對應根 /
    mkfs.ext4 /dev/sdb1
    mkfs.ext4 /dev/sdb2

  • 掛載boot
    mkdir /mnt/boot 子目錄必須為boot
    mount /dev/sdb1 /mnt/boot

  • 安裝grub
    grub-install –root-directory=/mnt /dev/sdb

  • 恢復內核和initramfs文件
    cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/
    cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot

  • 建立grub.conf:
    vim /mnt/boot/grub.conf

    title newlinux
    root (hd0,0)
    kernel /vmlinuz-2.6.32-642.el6.x86_64 root=/dev/sda2 selinux=0 init=/bin/bash
    initrd /initramfs-2.6.32-642.el6.x86_64.img
  • chroot /mnt/sysroot

  • 創建一級目錄
    mkdir /mnt/sysroot
    mount /dev/sdb2 /mnt/sysroot
    mkdir –pv /mnt/sysroot/{etc,lib,lib64,bin,sbin,tmp,var,usr,sys,proc,opt,home,root,boot,dev,mnt,media}

  • 復制bash和相關庫文件

  • ldd查看程序所使用的的庫文件
  • 復制相關命令及相關庫文件
    如:ls,cat,vim,reboot,hostname等

救援模式

  • 在根文件系統無法使用時需要,如/bin/mount刪除
    對系統沒有特殊要求
    從光盤引導(boot.iso或者安裝光盤#1)
    從USB盤(由boot.iso制作)引導

  • 文件系統重組
    Anaconda將會詢問是否應該掛載文件系統
    /mnt/sysimage/*
    /mnt/stage2
    $PATH包括硬盤的目錄

  • 文件系統節點
    提供系統特定的設備文件
    mknod了解major/minor

系統配置文件丟失修復

  • 系統在引導期間,很重要的一個過程就是init進程讀取其配置文件/etc/inittab,啟動系統基本服務程序及默認運行級別的服務程序完成系統引導,如果/etc/inittab誤刪除或修改錯誤,Linux將無法正常啟動。此時,只有通過救援模式才可以解決此類問題。

    • 有備份文件的回復方法
      沒有備份文件的恢復辦法
  • 有備份文件的恢復辦法:

    • 進入救援模式,執行chroot命令后,如果有此文件的備份(強烈建議系統中的重要數據目錄,如/etc、/boot等要進行備份),直接將備份文件拷貝回去,退出重啟即可。如果是配置文件修改錯誤,如比較典型的/boot/grub/grub.conf及/etc/passwd的文件修改錯誤,也可以直接修正恢復。假設有備份文件/etc/inittab.bak,則在救援模式下執行:

      • sh-3.1# chroot /mnt/sysimage
        sh-3.1# cp /etc/inittab.bak /etc/inittab
  • 沒有備份文件的恢復辦法

    • 如果一些配置文件丟失或軟件誤刪除,且無備份,可以通過重新安裝軟件包來恢復,首先查找到/etc/inittab屬于哪一個RPM包

      • ~]# chroot /mnt/sysimage
        ~]# rpm -qf /etc/inittab
        initscripts-9.03.49-1.el6.centos.x86_64
        ~]# exit 退出chroot模式
    • 掛載存放RPM包的安裝光盤(在救援模式下,光盤通常掛載在/mnt/source目錄下)
      ~]# mount /dev/sr0 /mnt/source

    • CentOS6系統的RPM包存放在光盤Package目錄下,要修復的硬盤系統的根目錄在/mnt/sysimage下,需要使用–root選項指定其位置。覆蓋安裝/etc/inittab文件所在的RPM包:
      ~]# rpm -ivh –replacepkgs | force /mnt/source/Packages/initscripts-9.03.49-1.el6.centos.x86_64.rpm
      其中的rpm命令選項“–replacepkgs”表示覆蓋安裝,執行完成后,即已經恢復了此文件

    • 如果想只提取RPM包中的/etc/inittab文件進行恢復,可以在進入救援模式后,執行命令:
      ~]# rpm2cpio /mnt/source/Packages/initscripts-9.03.49-1.el6.centos.x86_64.rpm| cpio -idv ./etc/inittab
      ~]# cp etc/inittab /mnt/sysimage/etc
      注意此命令執行時不能將文件直接恢復至/etc目錄,只能提取到當前目錄下,且恢復的文件名稱所在路徑要寫完整的路徑。提取文件成功后,將其復制到根分區所在的/mnt/sysimage目錄下相應位置即可

/proc目錄

  • /proc目錄:
    內核把自己內部狀態信息及統計信息,以及可配置參數通過proc偽文件系統加以輸出,還提供了一個配置接口,/proc/sys;

    • 參數:

      • 只讀:輸出信息
      • 可寫:可接受用戶指定“新值”來實現對內核某功能或特性的配置;/proc/sys,大多數只有root可寫;
        /proc/sys:net/ipv4/ip_forward 相當于 net.ipv4.ip_forward

        1. sysctl命令:專用于查看或設定/proc/sys目錄下參數的值;

          • 設置某參數
            sysctl -w parameter=VALUE
            sysctl -w path.to.parameter=VALUE
            sysctl -w kernel.hostname=mail.magedu.com
          • 查看所有生效參數
            sysctl -a
        2. 文件系統命令(cat、echo):命令通過重定向方式也可以修改大多數參數的值

          • 查看:cat /proc/sys/PATH/TO/SOME_KERNEL_FILE

          • 設定:echo “VALUE” > /proc/sys/PATH/TO/SOME_KERNEL_FILE
            echo “VALUE” > /proc/sys/path/to/parameter
            echo “websrv” > /proc/sys/kernel/hostname

        3. 配置文件:/etc/sysctl.conf,/etc/sysctl.d/*.conf
          通過重讀取配置文件設置參數
          sysctl -p [/path/to/conf_file]
          注:上述兩種方式的設定僅當前運行內核有效;

        4. 常用的幾個參數:
          net.ipv4.ip_forward:核心轉發功能;
          net.ipv4.icmp_echo_ignore_all
          vm.drop_caches :強制系統釋放緩存
          kernel.hoestname:主機名
          net.ipv4.icmp_echo_ignore_all:忽略所有ping操作;

/sys目錄

  • /sys目錄:

    • sysfs:為用戶使用的偽文件系統,輸出內核識別出的各硬件設備的相關屬性信息,也有內核對硬件特性的設定信息;有些參數是可以修改的,用于調整硬件工作特性。

    • udev:通過此路徑下輸出的信息動態為各設備創建所需要設備文件,udev是運行用戶空間程序,不能直接跟硬件打交道;專用工具:udevadmin, hotplug

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

編譯安裝內核

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

  • 內核組成部分:

    • kernel: 內核核心,一般為bzImage,通常在/boot目錄下,名稱為vmlinuz-VERSION-RELEASE;

    • kernel object: 內核對象,一般放置于/lib/modules/VERSION-RELEASE/

      • cat config-2.6.32-642.el6.x86_64內核模塊與內核核心版本一定要嚴格匹配;
        [ ]: N,不設計成內核模塊;
        [M]: M,Module;編譯為內核模塊
        [*]: Y,編譯進內核核心
    • ramdisk:輔助性文件,并非必須,者取決于內核是否能直接驅動rootfs所在的設備;
      ranmdisk:是一個簡裝版的根文件系統;如果不需要進行根文件系統切換的話ramdisk也可使用;但是只能臨時保存;

      • 借助ramdisk能夠加載的內容:

        1. 目標設備驅動,如;SCSI設備的驅動;
        2. 邏輯設備驅動,如LVM設備的驅動;
        3. 文件系統,如xfs文件系統;
  • 內核信息獲取
    uname命令:
    uname – print system information
    uname [OPTION]…

    • -n: 顯示節點名稱,主機名;
      -r: 顯示VERSION-RELEASE;
      -a:顯示所有信息
      -v:顯示版本號,編譯版本;

    文件:/boot/vmlinuz-VERSION-RELEASE

  • 模塊信息獲取

    • lsmod命令:
      顯示由核心已經裝載的內核模塊
      顯示的內容來自于: /proc/modules文件

      • 顯示模塊名稱
      • 顯示模塊大小
      • 模塊被引用次數
      • 被什么模塊所引用
    • modinfo命令:
      顯示模塊文件的詳細描述信息;
      讀取/lib/modules文件;
      不指明顯示當前已安裝的內核中的模塊信息;
      modinfo [ -k kernel ] [ modulename|filename… ]

      • -n: 只顯示模塊文件路徑
        -p: 顯示模塊參數
        -a: author
        -d: description
        -l: license
        -F field: 僅顯示指定字段的信息
  • 內核模塊管理

    • modprobe命令:動態裝載或卸載內核模塊

      • modprobe [ -C config-file ] [ modulename ] [ moduleparame-ters… ]
      • 配置文件:

        1. -C:指明配置文件
        2. 默認是此文件:/etc/modprobe.conf,/etc/modprobe.d/*.conf
      • modprobe [ -r ] modulename…
    • depmod命令:
      內核模塊依賴關系文件及系統信息映射文件的生成工具

    • 裝載或卸載內核模塊:

      • insmod命令:指定模塊文件,不自動解決依賴模塊
        insmod [ filename ] [ module options… ]
        filename:模塊文件的文件路徑

        insmod modinfo –n exportfs
        lnsmod modinfo –n xfs

      • rmmod命令:卸載模塊
        rmmod [ module_name ]

        rmmod xfs
        rmmod exportfs

        insmod、rmmod組合使用

  • 編譯內核

    • 前提:

      1. 準備好開發環境
      2. 獲取目標主機上硬件設備的相關信息
      3. 獲取目標主機系統功能的相關信息,例如:需要啟用相應的文件系統
      4. 獲取內核源代碼包,www.kernel.org
    1. 開發環境準備

      • 包組(CentOS 6):
        開發庫:Server Platform Development
        開發工具:Development Tools
      • 目標主機硬件設備相關信息:
        CPU:
        #cat /proc/cpuinfo
        #x86info -a
        #lscpu
    2. 硬件設備

      • PCI設備:

        • lspci
          -v
          -vv
        • lsusb
          -v
          -vv
        • lsblk 塊設備
      • 了解全部硬件設備信息
        hal-device:CentOS6
    3. 內核編譯安裝系統

      • 安裝開發包組
        下載源碼文件
        .config:準備文本配置文件
        make menuconfig:配置內核選項
        make [-j #]
        make modules_install:安裝模塊
        make install :安裝內核相關文件

        • 安裝bzImage為/boot/vmlinuz-VERSION-RELEASE
          生成initramfs文件
          編輯grub的配置文件

      編譯安裝內核示例:
      tar xf linux-3.10.67.tar.xz -C /usr/src
      cd /usr/src
      ln -sv linux-3.10.67 linux
      cd /usr/src/linux
      cp /boot/config-$(uname -r) ./.config
      make help
      make menuconfig
      make -j 2
      make modules_install
      make install
      reboot

  • 編譯內核

    1. 配置內核選項

      • 支持“更新”模式進行配置:make help
        (a) make config:基于命令行以遍歷的方式去配置內核中可配置的每個選項
        (b) make menuconfig:基于curses的文本窗口界面
        (c) make gconfig:基于GTK (GNOME)環境窗口界面
        (d) make xconfig:基于QT(KDE)環境的窗口界面

      • 支持“全新配置”模式進行配置
        (a) make defconfig:基于內核為目標平臺提供的“默認”配置進行配置
        (b) make allyesconfig: 所有選項均回答為“yes“
        (c) make allnoconfig: 所有選項均回答為”no“

    2. 編譯
      全編譯:make [-j #]
      編譯內核的一部分功能:
      (a) 只編譯某子目錄中的相關代碼
      # cd /usr/src/linux
      # make dir/
      (b) 只編譯一個特定的模塊
      # cd /usr/src/linux
      # make dir/file.ko

      例如:只為e1000編譯驅動:
      make drivers/net/ethernet/intel/e1000/e1000.ko

    • 如何交叉編譯內核:

      • 編譯的目標平臺與當前平臺不相同
        # make ARCH=arch_name
    • 要獲取特定目標平臺的使用幫助

      • # make ARCH=arch_name help
        # make ARCH=arm help
    • 在已經執行過編譯操作的內核源碼樹做重新編譯需要事先清理操作:
      make clean:清理大多數編譯生成的文件,但會保留config文件等
      make mrproper: 清理所有編譯生成的文件、config及某些備份文件
      make distclean:mrproper、patches以及編輯器備份文件

    • 卸載內核

      • 刪除/lib/modules/目錄下不需要的內核庫文件
        刪除/usr/src/linux/目錄下不需要的內核源碼
        刪除/boot目錄下啟動的內核和內核映像文件
        更改grub的配置文件,刪除不需要的內核啟動列表

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

(0)
ss
上一篇 2017-05-13 22:33
下一篇 2017-05-14 09:20

相關推薦

  • 第二周博客作業

    1、Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示? cat(concatenate)#從頭開始看     文本文件查看工具 SYNOPSIS:     cat [OPTION]… [FILE]… -A 輸出行最后加上$號 -n 輸出行號 例…

    Linux干貨 2016-12-12
  • 22期第二周課堂練習

    Linux上文件系統管理類命令都有哪些,其常用的使用方法及其相關示例演示     (1).cp文件復制命令     單源復制:cp [OPTION]… [-T] SOURCE DEST     多源復制:cp&nbs…

    Linux干貨 2016-08-22
  • 第二周:文件管理練習

    1.Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示 目錄管理管理類命令 mkdir make directories mkdir [OPTION]… DIRECTORY… 注意:路徑基名作為命令的作用對象時,基名之前的路徑必須要存在;     -p:自動按需創建父目錄…

    Linux干貨 2016-09-23
  • Ansible初識

    Ansible概念 ansible是自動化運維工具,基于Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。ansible是基于模塊工作的,本身沒有批量部署的能力。真正具有批量部署的是ansible所運行的模塊,ansible只是提供一種框架。說…

    2017-07-08
  • GRUB

    GRUB(Boot Loader):  grub: GRand Unified Bootloader grub 0.x: grub legacy grub 1.x: grub2 grub legacy: stage1: mbr stage1_5: mbr之后的扇區,讓stage1中的bootloader能識別stage2所在的分區上的文件系統; s…

    Linux干貨 2016-04-12
  • Linux文件類型及顏色標示

    在Linux系統中,有多種文件類型,不同的文件類型有不同的顏色。 ls -l 目錄,這個命令可以在顯示的類容中的第一個位置查看目錄里面文件的類型。 Linux下用字符表示的文件類型 -:普通文件 d:目錄文件 l:鏈接文件 b:塊設備文件 c:字符設備文件 p:管道文件 同時 白色:表示普通文件 藍色:表示目錄 綠色:表示可執行文件 紅色:表示壓縮文件 淺藍…

    Linux干貨 2016-10-17
欧美性久久久久