1. 程式人生 > >LinuxDay16——啟動流程和內核管理

LinuxDay16——啟動流程和內核管理

spc modprobe password 安卓 config output bios 階段 查看

CentOS 5和6的啟動流程

Linux: kernel+rootfs

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

  rootfs: 

    glibc

  庫:函數集合,function,調用接口

    過程調用:procedure(沒有任何返回值即結果)

    函數調用:function(必有返回值即結果)

  程序

內核設計流派:

  單內核設計:集中管理,linux

    把所有功能集成於同一個程序;

  微內核設計:分散管理,Windows,solaris

    每個功能使用一個單獨子系統實現;

Linux內和特點:

  支持模塊化:.ko

  支持模塊的動態裝載和卸載;

組成部分:

  核心文件:/boot/vmlinuz-VERSION-release(壓縮格式)

    ramdisk:

      CentOS 5:/boot/initrd-VERSION-release.img

      CentOS 6:/boot/initrmfs-VERSION-release.img

  模塊文件:/lib/modules/VERSION-release

CentOS 系統啟動流程:

I POST:加電自檢;

  ROM:CMOS

    BIOS:Basic Input&Output System

    ROM+RAM

II BOOT Sequence:引導加載次序

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

  bootloader:引導加載器,程序

    windows:ntloader

    Linux:

      LILO:lInux LOader(早期or安卓手機中)

      GRUB:GRand Uniform Bootloader

        GRUB 0.X:GRUB Legac

        GRUB 1.X:GRUB2

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

  MBR:主引導記錄 (0磁道0扇區)

    446:bootloader

    64:fat 磁盤分區表 (文件系統分配表)

    2:55AA

  GRUB:

    bootloader:1st stage 位於MBR(主要目的是找到硬盤上的第二階段)

    1.5stage(幫助GRUB識別分區文件系統)(安裝時匹配好文件系統 放置在MBR之後的扇區)

    disk:2nd stage

III kernel:

  自身初始化:

    探測可識別到的所有硬件設備;

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

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

    運行用戶控件的第一個應用程序:/sbin/init

    

  init程序的類型:

    sysV:init,CentOS 5

      配置文件:/etc/inittab

    Upstart:init,CentOS 6

      配置文件:/etc/inittab, /etc/init/*.conf

    Systemd:systemd,CentOS 7

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

  ramdisk:

    內核中的特性之一:使用緩沖和緩存來加速對磁盤上的文件訪問;

      ramdisk --> ramfs

      CentOS 5:initrd,工具程序:mkinitrd

      CentOS 6:initramfs,工具程序:mkinitrd,dracut

  系統初始化(前半段):

  POST --> BootSequence (BIOS) --> Bootloader(MBR) --> kernel(ramdisk) --> rootfs(只讀) --> init(取決於配置文件)

IV /sbin/init

  CentOS 5:

    運行級別:為例系統的運行或維護等應用目的而設定:

      0~6:7個級別

      0:關機

      1:單用戶模式(root,無需登錄),single,維護模式;

      2:多用戶模式,會啟動網絡功能,但不會啟動NFS;維護模式;

      3:多用戶模式,正常模式;文本界面;

      4:預留級別;可同3級別;

      5:多用戶模式,正常模式;圖形界面

      6:重啟

    默認級別:

      3,5

    切換級別

      init 0

    查看級別

      runlevel

      who -r

V 配置文件:/etc/inittab

  每一行定義一種action以及與之對應的process

    id:runlevel:action:process

      action:

wait:切換至此級別運行一次;

respawn:此process終止,就重新氣動之;

initdefault:設定默認運行界別:process省略

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

...

id:3:initdefaule:設定默認級別3

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

l0:0wait:/etc/rc.d/rc 0

l1:1wait:/etc/rc.d/rc 1

...

    l6:6wait:/etc/rc.d/rc 6

說明 rc 0 --> 意味著讀取/etc/rc.d/rc0.d

K*:K##* 運行次序;數字越小,越先運行;數字越小的服務,通常為依賴到別的服務;

S*:S##* 運行次序;數字越小,越先運行;數字越小的服務,通常為被依賴別的服務;

for srv in /etc/rc.d/rc0.d/K*;do

  $srv stop

done

for srv in /etc/rc.d/rc0.d/S*;do

  $srv star

done

chkconfig命令

查看服務在所有級別的啟動或甘比設定情況;

chkconfig --list name

添加:

SysV的服務腳本放置於/etc/rc.d/init.d(/etc/init.d)

chkconfig --add name

#!/bin/bash

#

# chkconfig: LLLL(0~6)級別 nn(S#) mm(K#)

刪除:

chkconfig --del name

修改指定的鏈接類型

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

--level LLLL: 指定要設置的級別;省略默認表示2345

註意:正常級別下,最後啟動一個服務S99local沒有鏈接至/etc/rc.d/init.d一個服務腳本,而是指向了/etc/rc.d/rc.local腳本;因此不便或不需寫為服務腳本放置位於/etc/rc.d/rc.local文件中/etc/rc.d/rc.local在指定運行級別腳本後運行;可以根據情況,進行自定義修改;

tty1:2345:respawn:/usr/sbin/mingetty tty1

tty2:2345:respawn:/usr/sbin/mingetty tty2

...

tty6:2345:respawn:/usr/sbin/mingetty tty6

mingetty會自動調用login程序

x:5:respawn:/etc/X11/prefdm -nodaemon

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

總結:/sbin/init --> (/etc/inittab) --> 設置默認運行級別 --> 運行系統初始腳本、完成系統初始化 --> 關閉對應下需要關閉的服務,啟動需要啟動的服務 --> 設置登錄終端

CentOS 6:

  init程序為:start其配置文件:

    /etc/inittab, /etc/init/*.conf,

    註意:/etc/init/*.conf配置文件的語法 遵循 upstart配置文件語法格式,和CentOS5不同

啟動系統時,設置其運行級別1;

進入單用戶模式:

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

(2) 在選定的kernel後附加

1, s, S或single都可以

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

(4)passwd

GRUB(Boot Loader):

GRUB:GRand Uniform Bootloader

  GRUB 0.X:GRUB Legac

  GRUB 1.X:GRUB2

grub Legacy

  stagel:mbr

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

  sstage2:磁盤分區(/boot/grub)

  配置文件:/boot/grub/grub.conf <-- /etc/grub.conf

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

功能

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

a:編輯模式,用於編輯菜單;

c:命令模式,交互式接口;

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

允許傳遞參數給內核

可隱藏此菜單

(3)為菜單提供了保護機制

為編輯菜單進行認證

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

註意* 若/boot未獨立分區(即boot在根下): grub尋找文件路徑為 /boot/grub/grub.conf

若/boot獨立分區:grub尋找文件路徑為(即繞過boot) /grub/grub.conf

如何識別設備:

(hd#,#)

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

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

(hd0,0)第一塊硬盤第一分區

grubd命令行接口

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/KERNEL_FILE:設定為選定的內核提供額外文件的ramdisk

boot:引導啟動選定的內核;

手動在grub命令行接口啟動程序;

grub > root(hd#,#)

grub > kernel /vmlinuz-VERSION-release ro root=/dev/DEVICE

grub > initrd /initramfs-VERSION-release.img

grub > 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/VMLUNZ_FILE [PARAMETERS]:啟動的內核

initrd /PATH/TO/INITRAMFS_FILE:內核匹配的ramfs文件

password [--md5] STRING;啟動選定的內核或操作系統時進行認證;

  grub-md5-crypt(openssl) 命令

進入單用戶模式:

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

(2)在選定的kernel後附加

    1,s,S,或single都可以

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

CentOS7系列啟動流程

CentOS7與6版本的不同之處:

6 : grub0.9和upstart

7 : grub2和systemd

主要介紹一下grub2和systemd吧,其他的啟動流程幾乎一樣

grub2

/etc/default/grub
/boot/grub2/grub.cfg
grub2-mkconfig -o /boot/grub2/grub.cfg 生成grub2的配置文件
*在救援模式下修復grub
# chroot /mnt/sysimage
# grub2-install /dev/sda
# grub2-mkconfig -o /boot/grub2/grub.cfg

在grub命令行啟動系統
> insmod xfs
> set root=(hd0,1)
> linux16 /vmlinux-... root=/dev/sda2 selinux=0
> initrd16 /initramfs-...

systemd

系統啟動和服務器守護進程管理器,負責在系統啟動或運行時,激活系統資源,服務器進程和其它進程。

Systemd新特性:

系統引導時實現服務並行啟動

按需啟動守護進程

自動化的服務依賴關系管理

同時采用socket式與D-Bus總線式激活服務

系統狀態快照

unit:表示不同類型的systemd對象

/usr/lib/systemd/system:每個服務最主要的啟動腳本設置,類似於6系列的/etc/init.d/目錄的功能

/run/systemd/system:系統執行過程中所產生的服務腳本

/etc/systemd/system:管理員建立的執行腳本,功能類似於6系列中/etc/rc.d/rcN.d/Sxx目錄的功能

類型:

Service unit: (.service),用於定義系統服務

Target unit: (.target),用於模擬實現運行級別

Device unit: (.device),用於定義內核識別的設備

Mount unit: (.mount),定義文件系統掛載點

Socket unit: (.socket), 用於標識進程間通信用的socket文件,也可在系統啟動時,延遲啟動服務,實現按需啟動

Snapshot unit: (.snapshot),管理系統快照

Swap unit: (.swap), 用於標識swap設備

Automount unit:(.automount),文件系統的自動掛載點

Path unit:(.path),用於定義文件系統中的一個文件或目錄使用,常用於當文件系統變化時,延遲激活服務

systemctl命令

相關管理工具:

sysctl修改內核參數的工具

-p 重新讀入/etc/sysctl.conf

-a 列出當前生效的內核參數

-w net.ipv4.ip_forward = 1 即時生效

uname

-r:顯示內核版本號

-a:顯示全部信息

-n:顯示主機名

lsmod:顯示已經裝載的模塊

modinfo:顯示模塊的詳細信息

-n:顯示模塊路徑

-p:顯示模塊參數

-a:顯示模塊作者

-d:顯示模塊描述信息

-l:顯示模塊的遵循的協議

modprobe:裝載模塊

-r:卸載模塊

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

insmod:指定裝載模塊文件,但不自動解決依賴模塊

rmmod:卸載模塊

time cmd 檢測命令執行花的時間

lscpu:查看CPU信息

lspci:查看pci相關信息

lsusb:查看usb相關信息

lsblk:查看塊設備相關信息

hal-device:查看所有硬件信息(CentOS6.x)

LinuxDay16——啟動流程和內核管理