系统启动及故障排错和内核管理

(一)Linux组成结构

  • Linux: kernel+rootfs
    kernel: 进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能
  • rootfs: 程序和glibc
  • 库:函数集合, function, 调用接口(头文件负责描述)
  • 过程调用:procedure ,无返回值
  • 函数调用:function
  • 程序:二进制执行文件

(1)内核介绍

(1)Linux 内核特点:
  • 支持模块化:.ko (内核对象)
  • 如:文件系统,硬件驱动,网络协议等
  • 支持内核模块的动态装载和卸载
(2)组成部分
  • 核心文件:
  • /boot/vmlinuz- VERSION -release
  • ramdisk :辅助的伪根系统
  • CentOS 5: /boot/initrd- VERSION-release.img
  • CentOS 6,7: /boot/initramfs- VERSION -release.img
  • 模块文件:/lib/modules/ VERSION-release

(二)CentOS6启动流程

系统启动及故障排错和内核管理_第1张图片
Linux启动流程解析图解

(1) POST自检:

系统接通电源时自动检测CPU,内存,主板,显卡,声卡,网卡等I/O设备,如果设备正常则进行下一启动步骤。

(2) MBR引导

MBR(Master Boot Record) MBR记录一般是在磁盘 0 磁道 1 扇区,共512个字节。前446个字节是BootLoder,后 4*16 的 64 个字节是存放分区信息的,最后 2 个字节是校验信息,一般是 55AA。

(3) MBR引导GRUB(GRand Unified Bootloader)

Bootloader的工作机制:bootloader可以访问文件系统,而内核则作为文件而存在。bootloader访问内核文件时,是将内核文件Vmlinz所在的整个分区当作根去访问的。我们常用的内核加载器是GRUB(Grand UnifiedBootloader),因此由grub来加载内核。

  # grub文件内部的所有内容
  [root@vinny grub]# ll
  total 280
  -rw-r--r--. 1 root root     63 Jun 19 00:39 device.map
  -rw-r--r--. 1 root root  13428 Jun 19 00:39 e2fs_stage1_5
  -rw-r--r--. 1 root root  12636 Jun 19 00:39 fat_stage1_5
  -rw-r--r--. 1 root root  11780 Jun 19 00:39 ffs_stage1_5
  -rw-------. 1 root root    771 Jun 19 00:39 grub.conf
  -rw-r--r--. 1 root root  11772 Jun 19 00:39 iso9660_stage1_5
  -rw-r--r--. 1 root root  13284 Jun 19 00:39 jfs_stage1_5
  lrwxrwxrwx. 1 root root     11 Jun 19 00:39 menu.lst -> ./grub.conf
  -rw-r--r--. 1 root root  11972 Jun 19 00:39 minix_stage1_5
  -rw-r--r--. 1 root root  14428 Jun 19 00:39 reiserfs_stage1_5
  -rw-r--r--. 1 root root   1341 Nov 15  2010 splash.xpm.gz
  -rw-r--r--. 1 root root    512 Jun 19 00:39 stage1
  -rw-r--r--. 1 root root 126148 Jun 19 00:39 stage2
  -rw-r--r--. 1 root root  12040 Jun 19 00:39 ufs2_stage1_5
  -rw-r--r--. 1 root root  11380 Jun 19 00:39 vstafs_stage1_5
  -rw-r--r--. 1 root root  13980 Jun 19 00:39 xfs_stage1_5

根据上边的所有展示内容,发现很多后缀相同的文件device.map,menulst,stage1,stage2,以及一系列的stage1_5组成。一下是我对这些文件的解读,说错了请大牛纠正。

  • device.map 可能是启动系统的时候,一些需要加载的驱动模块,和分区信息的地图。我们现在出门都需要地图,更何况刻板认真的计算机。

  • menu.lst 是grub.conf的链接文件,当我们启动系统的时候,会有一个选择功能选择菜单,等下免我会详细介绍。

  • stage:grub引导程序过于庞大,所以在启动过程中分为三个阶段进行:第一阶段存放在MBR中第二阶段存放于内核文件系统中。第二阶段没有文件系统,怎么访问呢。这个时候出现了stage1_5阶段,反正就是想办法让第二阶段启动,所以这个地方出现了很多stage1_5为后缀的文件。

  • grub.conf 文件参数意义

     # grub.conf generated by anaconda
     default=0  # 默认启动的内核title, 0 表示是第一个  
     timeout=5 # 默认等待时间  
     splashimage=(hd0,0)/grub/splash.xpm.gz  # 指定菜单的背景图片的路径。为xpm格式,采用gzip压缩,只能为14bits色  
     hiddenmenu # 隐藏菜单  
     title CentOS 6 (2.6.32-696.el6.x86_64)  
     # 标题名,用户可自定义
     root (hd0,0)  
     # 指定 grub 的根位置   
     # 指定 kernel 文件的位置,还要指出 root(系统启动后) 的位置,挂载方式 ro,这项很关键。  
             # 加载后会启动 init 进程。
             kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=0861b596-c806-4895-97b3-2ef308bdc6a3 nomodeset rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_NO_LVM rd_NO_DM rhgb quiet
              # 在内核启动过程中装载根文件系统时有用  
             initrd /initramfs-2.6.32-696.el6.x86_64.img
    

(4)引导加载器程序GRUB

(1)grub legacy

GRUB是bootloader阶段的一个程序,这是Centos中最常用的引导程序,CentOS 6安装的是grub legacy。

系统启动及故障排错和内核管理_第2张图片
CentOS 6的grub legacy

按e:进入编辑模式,用于编辑菜单
系统启动及故障排错和内核管理_第3张图片
编辑模式

然后按c: 进入命令模式,交互式接口
系统启动及故障排错和内核管理_第4张图片
交互式界面

这个界面就和上边联系起来了 ,假如你不会写的话,可以敲 help就可以查看帮助。
grub>后边需要跟上本文中 grub.conf 文件参数意义里边的内容。

(5) 进入kernel

在GRUB中选择对应的kernel进入,然后kernel会对自身进行初始化,始化系统中各设备并做相关的配置工作,其中包括CPU、I/O、存储设备等。运行用户空间的第一个应用程序,在CentOS 6上是init,在CentOS 7上是Systemd。

(1)读取/etc/inittab来读取默认级别
    # Default runlevel. The runlevels used are:

    #   0 - halt (Do NOT set initdefault to this)
    #0:关机
    #   1 - Single user mode
    #1:单用户模式(root, 无须登录), single, 维护模式
    #   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
    #2: 多用户模式,会启动网络功能,但不会启动NFS;维护模式;
    #   3 - Full multiuser mode
    #3:多用户模式,正常模式;文本界面;
    #   4 - unused
    #4:预留级别;可同3级别;
    #   5 - X11
    #5:多用户模式,正常模式;图形界面;
    #   6 - reboot (Do NOT set initdefault to this)
    #6:重启
    id:5:initdefault:

注意:上边的最后一行是制定每次启动时后的默认启动级别,修改它就是修改你的默认启动级别。
如果要查看当前系统运行的init级别可使用runlevel或者who -r

(2)执行初始化系统脚本 /etc/rc.d/rc.sysinit 来初始化脚本

这个脚本里边有很多内容,这里就不一一列举了,只是把它做的事情给列出来。

    # 获取网络环境与主机类型。首先会读取网络环境设置文件"/etc/sysconfig/network",获取主机名称与默认网关等网络环境。  
    # 打印文本欢迎信息。  
    # 挂载/etc/fstab文件中定义的其它文件系统。  
    # 激活swap  
    # 检测根文件系统,并以读写方式重新挂载  
    # 决定是否启动SELinux和udev。  
    # 接口设备的检测  
    # 用户自定义模块的加载。用户可以再"/etc/sysconfig/modules/*.modules"加入自定义的模块,此时会加载到系统中。  
    # 加载核心的相关设置。按"/etc/sysctl.conf"这个文件的设置值配置功能。  
    # 设置系统时间(clock)。  
    # 设置终端的控制台的级别。  
    # 设置raid及LVM等硬盘功能。  
    # 以方式查看检验磁盘文件系统。  
    # 进行磁盘配额quota的转换。  
    # 重新以读取模式载入系统磁盘。  
    # 启动quota功能。  
    # 启动系统随机数设备(产生随机数功能)。  
    # 清楚启动过程中的临时文件。  
    # 将启动信息加载到"/var/log/dmesg"文件中。
(3)然后执行 /etc/rc.d/rc 脚本

当你选择默认模式为3的时候,默认会读取/etc/rc.d/rc3.d 下的所有脚本,来控制系统启动的时候启动或者关闭哪些服务。这里面的脚本大致分为以S 开头的和以 K 开头的脚本。 S 代表开机时启动的,K 表示开机时不启动。
排序的说明:服务的启动可能会产生依赖的情况。所以无法避免的会出现排序的情况。比如说:S20S198来说会先执行S199后执行S22,是先S2S1比较,之后在比较S20S19以此类推。数字越小越先运行;数字越小的服务,通常为依赖到别的服务;

  • chkconfig命令:查看每个服务对应级别的开关,以及设置相关服务对应级别上的开关;
  • 增加服务:chkconfig --add srv_name 可以将自己写的一些脚本,让此命令统一管理。
  • 删除服务:chkconfig --del srv_name 将服务删除,意思就是服务不由chkconfig这种机制来管理
  • chkconfig srv_name {on|off}设置服务开机是否自启动,默认管理的级别是2345. 指定默认级别,可以与其他选项一起使用

注意:正常级别下,最后启动的一个务:S99local指向了/etc/rc.d/rc.local脚本,且有又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中;
【注意】:正常级别下,最后启动一个服S99local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向了/etc/rc.d/rc.local脚本;因此,不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中。

(6) 手工配置系统启动配置

(1)系统服务脚本的特点
  • 基本都可以提供start|stop|restart|status这几个状态值的接收
  • 服务脚本存放位置,所有的系统服务脚本都放在/etc/rc.d/init.d文件夹中
    系统启动及故障排错和内核管理_第5张图片
    系统服务脚本
(2)服务脚本的编写格式

系统启动及故障排错和内核管理_第6张图片
格式详解

其中,有三行格式是必须要写上的 #!/bin/bash,#/chkconfig,#description
# chkconfig: runlevels SS KK【SS:表示开始运行的次序,KK:表示关闭程序的次序,-表示都不启动】 因此可以手动编写系统服务:

  • (1)把服务脚本放置/etc/init.d目录下
  • (2)使用chkconfig –add 添加到系统服务
  • (3)重启系统让服务生效

你可能感兴趣的:(系统启动及故障排错和内核管理)