linux系統啓動過程

Linux系統啓動流程、grub修復、模塊管理及內核參數設定
runlevel, who -r , chkconfig ,grub ,grub-install , mkinitrd , dracut ,sysctl ,lsmod ,modinfo , modprobe , depmod , insmod ,rmmod
Linux系統的組成部分


kernel

/boot/vmlinuz-VERSION-RELEASE


initrd

Centos 5 : /boot/initrd-VERSION-RELEASE.img
Centos 6/7 : /boot/initramfs-VERSION-RELEASE.img


filesystem


模塊文件

一般存放於/lib/modules/$(uname -r)/目錄下


內核的設計流派

單內核設計
把所有功能集成於同一個程序中,其中linux就是以單內核設計


微內核設計
每個功能使用一個單獨的子系統實現,每個子系統通信需有特殊的機制來實現,其中winodows、solaris的內核設計方式就爲微內核。


Linux內核的特點

單內核設計
支持模塊化(.ko的文件,[]kernel object])
支持模塊運行時動態裝載或卸載
內核可以將驅動模塊或者功能模塊編譯進內核,由內核初始化直接加載完成

linux啓動流程示意(內核空間---用戶空間)


內核空間

POST—>BootSequence(BIOS)—>bootloader(MBR)—>kernel(ramdisk) —>rootfs(只讀方式掛載)—> /sbin/init


用戶空間:

/sbin/init(/etc/inittab) --> { id:#:initdefault: --> si::sysinit:/etc/rc.d/rc.sysinit --> l#:#:wait:/etc/rc.d/rc # --> /etc/rc.d/rc#.d/[1、開始S開頭的服務;2、結束K開頭的服務]}-->/etc/rc.d/rc.local
注意:以上{}中,表示在/etc/inittab文件中完成的步驟。



內核空間啓動步驟
1、POST加電自檢

當按主機電源鍵,計算機主板通電,並完成已下操作:
加載Bios中的ROM中的程序,來檢測各種硬件設備Bios : Baisc input and output system



2、BootSequence

按bootsequence的啓動列表,查找MBR或UEFI的活動設備。

3、Bootloader

找到MBR後查找引導加載器(bootloader程序),讀取mbr中的bootloader,加載boootloader中的grub程序

Grub的工作原理

stage1: 加載mbr中的所有分區信息
stage1.5: mbr之後的扇區,讓stage1中的bootloader能識別stage2所在的文件分區上的文件系統
stage2: 磁盤分區之上(/boot/grub/)

注意:MBR能識別基本的硬盤設備,但不能識別高級的文件系統,如lvm , raid等
Bootloader的類型及使用場景

ntloader
windows


LILO(linux loader)
早期的Linux系統
安卓手機設備


grub(Grand Uniform bootloader)
Centos 5/6 (grub 0.X)
Centos 7 (grub 1.X)


4、加載虛根文件系統(ramfs)

完成虛根ramfs的初始化,以此來識別硬盤上的文件系統。

5、掛載rootfs

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

6、初始化init進程

運行進程ID爲1的Init進程,利用init啓動流程完成用戶空間的啓動步驟

用戶空間啓動步驟
SysVinit進程的初始化


讀取/etc/inittab,需完成如下加載步驟:

系統運行級別加載:id:#initdefault:
si::sysinit:/etc/rc.d/rc.sysinit : 加載運行/etc/rc.d/rc.sysinit文件,完成如下動作:
激動Udev和selinux
根據/etc/sysctl.conf文件,來設置內核參數
設定系統時鐘
裝載鍵映射
啓用交換分區
設置主機名
要文件系統檢測,並以讀寫方式重新掛載
激活raid和lvm設備
啓用磁盤配額
根據/etc/fstab檢測並掛載所有文件系統
清理過期的鎖和PID文件


l0:0:wait:/etc/rc.d/rc 0 ---> /etc/rc.d/rcX.d/* 對應系統運行級別,開啓或關閉系統各服務,如下:
停止K*的服務
啓動S*開頭的服務
以上服務都由chkconfig命令管理,並由service命令調用執行停止或關閉操作。



tty6:2345:respawn:/usr/sbin/mingetty tty6,啓動登錄窗口,並打印歡迎界面
其是mingetty調用login程序,完成密碼驗證過程


加載/etc/rc.d/rc.local文件
此文件是系統最後啓動的一個文件,可以將不需要寫在服務維護腳本的命令放置在這裏,它將會隨系統一起啓動完成。



注意:

Centos7的init程序爲systemd,其配置文件存放於:/usr/lib/systemd/system/ ; /etc/systemd/system/

Centos6的init爲upstart,但爲了兼容SysV風格,名稱也爲Init,其配置文件放置於/etc/init/*.conf

upstart的初始化流程
/etc/inittab(定義了默認的運行級別)-->/etc/init/rc.conf(其中定義了相應的運行級別所要執行對應級別下的服務/etc/rc.d/rcX.d/ ,根據命令exec /etc/rc.d/rc $RUNLEVEL 來調用`/etc/rc.d/rcX.d/`)-->/etc/rc.d/rc.local
================
/etc/inittab文件格式說明

id:runlevel:action:process
id: 一個任務的標識
runlevel: 在哪些級別下啓動此任務,可以爲空,即表示所有級別
action:在什麼條件下啓動此任務
wait : 等待切換至此任務所在的級別時執行一次
respawn : 設定默認運行給別,此時process省略
sysinit: 設定系統初始化方式,此處一般爲指定/etc/rc.d/rc.sysinit腳本


process:任務


示例
    0:0:wait:/etc/rc.d/rc 0 : 意味着去啓動或者關閉/etc/rc.d/rc3.d/目錄下的服務腳本所控制的服務,所有K開頭的要停止的服務,所有S開頭的啓動。 其中表示優先級,K中數值越小,表示越先關閉,S中數據越小表示越先開啓。一般依賴的服務先關閉,然後再關閉被依賴的。或者一般被依賴的服務先啓動,依賴的服務後啓動
============
運行級別:

0:關機,shutdown
1: 單用戶模式,(single user) root用戶,無須認證登陸
2:多用戶模式(multi user),會啓動網絡功能,但不會啓動NFS;維護模式
3:多用戶模式(multi user),完全功能模式,文本界面
4:預留級別:目前無特別使用目的。但習慣與同3級別功能使用
5: 多用戶模式:(multi user),完全功能模式,圖形界面。
6: 重啓,reboot

查看系統運行級別

runlevel
who -r
systemctl get-default(Centos 7)

=========
系統服務類腳本的添加和管理
添加一個腳本格式
    #!/bin/bash
    #
    #chkconfig: 2345 50 60 #表示2345開啓,其他關閉
    #description XXXXX
    下面是腳本正文,需要接受至少如下四個參數:
    {start|stop|restart|status}
使用chkconfig命令添加服務及管理

首先需要將腳本複製至/etc/init.d/中。
再使用chkocnfig --add 腳本名稱(服務名稱)
再使用service 腳本服務 start

=============
chkconfig命令

chkconfig --add service_name
添加一個服務腳本


chkconfig --del service_name
刪除一個服務腳本


chkconfig --list
查看所有服務的啓動狀態


chkconfig 2345 service_name on
在2345運行級別啓用此服務


chkconfig 2345 service_name off
在2345運行級別下關閉此服務


grub如何識別設備

1、Boot需單獨分區
grub的位置應該爲/grub/vmlinz


2、識別磁盤都爲hd
(hd#,#) : 第一個表示磁盤分區,第二個#表示分區,都用數字表示,從零開始編號


grub的命令行接口

help:獲取幫助列表
help KEYWORD : 詳細幫助信息
find (hd#,#)/PATH/TOSOMFILE
find (hd0,0)/vmlinuz-2.6.32
root(hd0,0)  :把那個設備設置爲根設備

kernel /path/to/kernel_file: 設定本次啓動時用到的內核文件,額外還可以添加許多內核使用的command參數
      例如:init=/path/to/init, selinux=0,quiet

initrd /path/to/initramfs_file | initrd_file : 設定爲選定的內核提供額外文件的ramfs(必須與內核版本號完全匹配)
boot:引導啓動選定的內核   

手動在grub命令行接口啓動系統:
grub> root(hd0,0)
grub> kernel /vmlinuz-version-release ro root=/dev/DEVICE
grub> initrd /initramfs-version-release.img
grub> boot

注意:ro : 表示以只讀方式掛載根文件系統
     root=/dev/DEVICE : 應該寫根文件系統所在的磁盤分區
grub的文件的配置格式
/etc/grub/grub.conf
default=0  # 設置默認啓動的tile,0表示第一個tile
timeout=5    # 在啓動時選擇tile時的超時時間
hiddenmenu #是否隱藏啓動界面
password --md5 密碼串(使用grub-md5-crypt工具加密的密碼串)#如果加密,編輯grub時會要求輸入密碼
title (Centos 6.6)  #啓動時的菜單名稱
    root (hd0,0) # 表示kernel的存放位置,hd統一表示爲所有硬盤,第一個0表示第一塊硬盤,第二個0表示一個分區
    kernel /vmlinuz.VERSION.release #kerenl文件的存放路徑
    initrd /initramfs.VERSION.release.img #initramfs的存放路徑
    password --md5 密碼串 #這個密碼加密後,啓動相應的內核時,會要求輸入密碼


    #注意:title中的每一行都必須要縮進一個空白字符,當grub損壞時,可以使用"find (h0,0)/"查找目錄下的文件,使用TAB鍵補全,如果有就會列出所有的文件,如果沒有,表示(hd0,0)指定有錯誤,需再查找其他的分區中是否有。
進入單用戶模式:

1、編輯grub菜單(選定要編輯的title ,e命令)
2、在選定的kernel後附加1,S,s 或者single都可以
3、在kernel所在行,鍵入b命令       

手動安裝grub的方法


1、grub-install --root-directory=/mnt /dev/sdb
  注意:--root-directory=/mnt : 這個位置必須指定爲boot目錄所在的父目錄,grub會自行在父目錄中找到boot目錄,然後把grub程序安裝到對應的目錄中,一般情況在掛載新預備安裝gurb的硬盤時,需要在文件系統上建立一個boot目錄,再把對應的磁盤掛到boot目錄中,這樣grub纔會找到boot目錄,在下面建立所需的文件,如果掛載時不創建boot目錄,那和以grub會在目錄下創建boot目錄,啓動時需要將kernel和initrd的位置就應該爲/boot/vmliunz格式


2、分步驟安裝
  grub
  grub> root (hd0,0)
  grub> setup (h0,0)


手動修復grub引導程序
模擬損壞mbr

dd if=/dev/zero of=/dev/sda bs=200 count=1
需要先備份好mbr,使用dd if=/dev/sda of=/root/sda bs=512 count=1



修復過程

1、掛載安裝光盤,執行linux rescue 進行急救模式
2、chroot /mnt/sysp_w_picpath
3、執行grub-install --root-directory=/ /dev/sda        /dev/sda : 這是對磁盤的mbr修復指定位置,必須是磁盤,不能是分區,就是mbr所存放的位置


新加硬盤,提供直接單獨運行bash系統
####創建文件系統並掛載
mke2fs -t ext4 /dev/sdb1
mke2fs -t ext4 /dev/sdb2
mkdir /media/boot
mount /dev/sdb1  /media/boot/
grub-install --root-directory=/media /dev/sdb
cp /boot/vmlinuz-2.6.32-573.el6.x86_64 /media/boot/vmlinuz
cp /boot/initramfs-2.6.32-573.el6.x86_64.img /media/boot/initramfs.img
####grub配置文件信息
vim /media/boot/grub/grub.conf
    default=0
    timeout=5
    hiddenmenu
    title (Centos6.6)
        root (hd0,0)
        kernel /vmlinuz ro root=/dev/sda2 selinux=0 init=/bin/bash
        initrd /initramfs.img
####給根文件系統提供bash和相應的庫文件
mount /dev/sdb2 /mnt/
cd /mnt/
mkdir $(ls /) -pv
cp /bin/bash /mnt/bin/bash
ldd /bin/bash
cp /lib64/libtinfo.so.5 /mnt/lib64/
cp /lib64/libdl.so.2 /mnt/lib64/
cp /lib64/libc.so.6 /mnt/lib64/
cp /lib64/ld-linux-x86-64.so.2 /mnt/lib64/
chroot /mnt/
ramfs文件的管理
1、mkinitfs 命令(Centos5)

synopsis: mkinitrd [OPTION...] [<initrd-p_w_picpath>] <kernel-version>

示例:

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

2、dracut 命令(Centos 6\7)
示例:

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

內核信息輸出的僞文件系統:


1、/proc目錄


內核狀態及統計信息的輸出接口,同時還提供了一個配置接口:/proc/sys,可以使用sysctl命令修改其內核參數,其此目錄下的大部分文件都可接受用戶指定的一個"新值",來實現對內核某功能或特性的配置


2、/sys目錄

輸出內核識別出的各種配置設備的相關信息,也有內核對硬件特性的可設置參數,可定製硬件的特性

udev功能


通過讀取sys目錄下的硬件設備信息,按需爲各硬件設備創建設備文件。當系統初始化的過程中,會探測計算機各種硬件設備信息,此記錄會保存至/sys目錄下,當系統啓動完成後,udev會按照/sys目錄下的各設備文件,創建相應的硬件信息。udev爲設備創建設備文件時,會讀取其事先定義好的規則文件,一般在其工作目錄下。


udev的工作目錄

/etc/udev/rules.d  : 自定義的規則目錄
/lib/udev/rules.d/ : 默認的規則目錄
/dev/.udev/rules.d : 臨時規則目錄存放位置(Centos 7纔有)


udev目錄下的文件
  root@zhenping rules.d]# ls /lib/udev/rules.d/
  01-log-block.rules           60-persistent-storage-tape.rules  75-cd-aliases-generator.rules          81-kvm-rhel.rules
  10-console.rules             60-persistent-v4l.rules           75-net-description.rules               88-clock.rules
  10-dm.rules                  60-wacom.rules                    75-persistent-net-generator.rules      90-pulseaudio.rules
  11-dm-lvm.rules              61-mobile-action.rules            75-tty-description.rules               91-drm-modeset.rules
  13-dm-disk.rules             61-option-modem-modeswitch.rules  77-mm-ericsson-mbm.rules               95-devkit-power-battery-recall-dell.rules


內核參數調整方法
1、配置文件修改(永久有效,但需重新啓動後)


修改/etc/sysctl.conf 或者/etc/sysctl.d/*.conf
  net.ipv4.ip_forward = 0


注意:如果需要修改後的參數立即有效,需使用sysctl -p 命令重讀其配置信息加載到內核中。
2、使用命令進行修改(臨時有效,下次重啓後丟失)
sysctl命令
sysctl -sysctl - configure kernel parameters at runtime


synopsis :  sysctl [options] [variable[=value]] [...]


[options]


-a : 顯示當前可配置的所有參數

-w VAR=VLUE : 更改參數值

-p : 從/etc/sysctl.conf文件中重新加載內核設定值


示例

sysctl net.ipv4.ip_forward : 查看其值
sysctl -w kernel.hostname=zhenping.mac : 設置其計算機名爲zhenping.mac
sysctl -a : 查看所有可配置的內核參數

使用文件系統命令cat和echo設置和查看

cat /proc/sys/kernetl/hostname
echo "VALUE" > /proc/sys/kernel/hostname

常見內核參數

net.ipv4.ip_forward : 核心轉發功能
vm.drop_caches : 釋放buff/cache空間,值有0\1\2
kernel.hostname : 主機名
net.ipv4.icmp_echo_ignore_all : 忽略所有發往自己的ping操作

模塊管理
lsmod命令

lsmod - 查看所有系統被裝載的模塊


lsmod 
顯示系統被裝載的所有模塊


注意:其是提取/proc/modules文件信息
=========
modinfo命令

modinfo - Show information about a Linux Kernel module
其通過/lib/modules/[KERNEL-VERSION]/modules/下的所有文件進行分析並顯示的,默認情況下在內核modules編譯安裝的時候,會在其目錄下生成所有modules的依賴關係等,建立對應的索引信息


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


[options]


-k MODULE : 查看指定的模塊信息

-F FIELD : 只顯示指定字段的信息

-n MODULE 顯示指定模塊的存放路徑


=====
modprobe命令:

modprobe - Add and remove modules from the Linux Kernel

synopsis: modprobe [-r] module_name

示例:

modprobe MODULE : 裝載指定的模塊文件
modprobe -r MODULE : 卸載指定的模塊文件

modprobe可以自行解決模塊與模塊的依賴關係,並將依賴的模塊也一併啓用
====
depmod命令
內核模塊依賴關係文件的生成工具,系統模塊的生成文件路徑爲:/lib/modules/KERNEL-VERSION/下
======
模塊裝載和卸載的另一組命令:
insmod命令

insmod /lib/modules/3.10.0-229.el7.x86_64/kernel/fs/btrfs/btrfs.ko (模塊一定要爲完整路徑)

rmmod命令

rmmod MODULE : 卸載指定的模塊


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