LinuxDay16——启动流程和内核管理

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)

posted @ 2018-05-14 20:00  Gmiao  阅读(200)  评论(0编辑  收藏  举报