启动流程与内核管理

centos6和centos5启动流程与内核管理,启动过程中遇到的系统不能启动,各个阶段该怎么解决

Centos6和centos5

Linux: kernel+rootfs

kernel: 进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能

rootfs:程序和glibc

库:函数集合, function, 调用接口(头文件负责描述)

过程调用:procedure,无返回值

函数调用:function

程序:二进制执行文件

v

内核设计流派:

单内核(monolithic kernel):Linux

把所有功能集成于同一个程序

微内核(micro kernel):Windows, Solaris

每种功能使用一个单独子系统实现 

 

Linux内核特点:/lib/modules

支持模块化:.ko(内核对象)

如:文件系统,硬件驱动,网络协议等

支持内核模块的动态装载和卸载

模块查看:lsmod

模块安装:modprobe mod_name

模块卸载:modprobe -r mod_name

Rmmod

组成部分:

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

ramdisk:辅助的伪根系统,放置有一些必要的驱动模块(破坏也会导致系统无法启动)

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

CentOS 6,7: /boot/initramfs-VERSION-release.img

模块文件:/lib/modules/VERSION-release(大多数放置位置)

 

启动流程

Post加电自检—-MBR引导(446B引导记录+46B磁盘分区表+2B标记位)—-GRUB—-加载内核—-启动init进程

 

Post-mbrstage1-stage1.5-stage2/boot/grub-grub.conf(kernel.initrd)-/sbin/init–/etc/inittab-id:N(启动的默认级别)-/etc/rc.d/rc.sysinit(系统初始化脚本)-/etc/rc.d/rcN.d/service(服务脚本)-/etc/init.d-/etc/rc.d/rc.local(最后一个脚本)–login

 

 

CentOS6启动流程

1.加载BIOS的硬件信息,获取第一个启动设备

2.读取第一个启动设备MBR的引导加载程序(grub)的启动信息

3.加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备

4.核心执行init程序,并获取默认的运行信息

5.init程序执行/etc/rc.d/rc.sysinit文件

6.启动核心的外挂模块

7.init执行运行的各个批处理文件(scripts)

8.init执行/etc/rc.d/rc.local

9.执行/bin/login程序,等待用户登录

10.登录之后开始以Shell控制主机

 

 

如果/boot/initramfs-$(uname -r).img $(uname -r)被误删除用以下命令恢复

ramdisk文件的制作:

(1) mkinitrd命令

为当前正在使用的内核重新制作ramdisk文件

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

vUpstart: init,CentOS 6

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

vSystemd:systemd, CentOS 7

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

/etc/systemd/system

运行级别

/sbin/init  centos之前

为系统运行或维护等目的而设定,0-6,7个级别

0:关机

1:单用户模式(root自动登录),single 维护模式

2:多用户模式,启用网络功能,但不会启动NFS

3:多用户模式,正常模式,文本界面(字符界面)

4:预留级别:同3级别

5:多用户模式,正常模式,图形界面

6:重启

默认级别:3(字符界面)    5(图形界面)

切换级别:init  #

查看级别:runlevel    或者    who  -r

 

Centos6中/etc/inittab中定义了启动的默认级别 ,修改为3,那么启动的时候不加载图形界面,直接进入字符界面。(centos7不起作用)

 

在系统启动时,按任意键,看到系统进入一个界面,按a键进入编辑模式,可以定义用哪个界别进行启动

 

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

 

rc N –> 意味着读取/etc/rc.d/rcN.d/

K*: K##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务

S*: S##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务

 

注:1、S*打头的文件,为系统开启服务的文件,K*打头的文件,为系统关闭的服务文件

2、如果服务之间有依赖关系,如A依赖于B,那么开启的时候,会先开启所依赖的B服务,在开启A服务,关闭的时候,则先关闭A服务,在关闭B服务

 

 

chkconfig命令 (操作服务)

v查看服务在所有级别的启动或关闭设定情形:

chkconfig [–list] [name]

–add  name   添加

–del  name   删除

–level  LLLL:指定要设置的级别,省略时表示2345

–list name   在0-6级别该服务的开启状态

 

Xinetd管理的服务

Xinetd命令:管理一些在使用到该服务时,唤醒该服务的功能

瞬态服务被xinetd进程所管理

配置文件:/etc/xinetd.conf   /etc/xinetd.d/<service>

 

用chkconfig  命令也可以管理瞬态服务的开启和关闭

例: chkconfig  atd   off |on

 

/etc/rc.d/rc.local  可以把需要开机启动的服务放在这个文件下,计算机开机就会自动启动,但是不能用service命令进行管理,可以kill #发送信号进行停止中断

 

 

Centos启动流程(grub)

在grub启动时,分为三个阶段,分别是1,1.5和2,阶段,介绍一下3个阶段

  • stage1:加载MBR,bootloader
  • Stage1——5:MBR之后的27个扇区,让stage1中的BootLoader能够识别stage2所在的分区上的文件系统
  • Stage2:读取磁盘分区(/boot/grub/)

加载 / 需要找到/boot/grub/grub.conf 文件,若果丢失,系统无法启动

 

 

Grub.conf文件

 

Password  –encrypted   STRING     给用sha512算法给grub加密

 

实验:编写服务

  • 编写服务脚本:vim  testver

格式为:#!/bin/bash

#chkconfig :  35 99  00(35为运行级别,99为开启顺序,开启时最后开启00为关闭顺序,关闭时最先关闭)(开始号越大,关闭号则越小)

#description:This is a test service

Case  $1  in

Start)

Echo  testver  is  starting

;;

Stop)

Echo  testver  is  stoping

;;

Restart)

Echo  testver  is  stopped

Echo  testver  is  starting

;;

Status)

[ -f  /app/testver  ] && echo testver is running  || echo testver is stopped

  • 添加服务:

Chmod  +x  testver

Chkconfig  –add  testver

 

实验:删除内核文件,重新安装

  • 进入/boot目录,删除文件vmlinuz-`uname -r`
  • Reboot
  • 挂载光盘进入救援模式
  • 创建目录,将光盘挂载到该目录下,

Mkdir  /mnt/cdrom

Mount  /dev/sr0  /mnt/cdrom

  • 拷贝光盘中的/isolinux/vmlinuz文件到/boot目录下,并且改名

Cp  /mnt/cdrom/isolinux/vmlinuz  /mnt/sysimage/boot/vmlinuz-`uname -r`

  • 重启就可以进入系统

 

实验删除initramfs文件

模拟/boot/initramfs-$(uname -r).img $(uname -r)文件被删除,机器启动不了,修复方法:

  • 在centos6上删除/boot/initramfs-版本号.img 文件
  • 重启系统
  • 光盘启动,进入救援模式
  • 开启一个shell,切换到根目录 ,生成该文件

Chroot   /mnt/sysimage

Mkinitrd /boot/initramfs-`uname -r`.img `uname -r`

  • exit,exit,重启系统
  • 看到系统已经可以启动

 

实验:破坏MBR的前446个字节

  • 模拟破坏:dd  if=/dev/zero  of=/dev/sda  bs=1 count=446
  • 查看破坏情况: hexdump -C  -n  512   可以看到已经全部为0

 

  • 重启系统,可以看到系统直接进入光盘启动页面

 

  • 修复grub:

方法一:1、切根:chroot  /mnt/sysimage

2、修复:grub-install  –root-directory=DIR  /dev/DISK

在这里–root-directory=DIR指的是boot分区的上一级目录,因为boot分区的上一级目录时/ 所以可以默认不谢,/dev/DISK指的是/boot所在的磁盘

Grub-install  /dev/sda

方法二:1、输入  grub

2、root  (hd0,0)写boot所在磁盘的位置

3、输入   setup  (hd0)硬盘所在位置

用方法二进行修复的时候,需要用到stage1文件,需要确保该文件存在

  • 重启恢复

 

实验:破坏1.5阶段

  • 模拟破坏:dd if=/dev/zero of=/dev/sda bs=1 count=13000 skip=512 seek=512
  • 进入救援模式,修复grub
  • 切跟,执行grub-install  /dev/sda 修复完成
  • 修复完成之后,记得sync同步,等一会儿,等数据写完,在重启
  • 重启完成

 

实验:在LVM中删除boot目录和/etc/fstab文件

 

  • 删除rm -rf /boot  /etc/fstab
  • 进入救援模式
  • Lvdisplay 可以看到逻辑卷处于不可活动的状态
  • 激活LVM,   #:vgchange  -ay   ; lvdisplay  可以看到已经激活
  • 挂载逻辑卷

Mount  /dev/VolGroup/lv_root  /mnt/root

  • 编辑/etc/fstab文件,将/挂载

/dev/VolGroup/lv_root   /   ext4  defaults  0  0

/dev/sda1  /boot  ext4  defaults  0  0

  • 将系统重启,并且进入救援模式,可以看到已经可以切换根目录了
  • 将安装光盘进行挂载,挂载的时候会提示错误,是因为此时目录为只读模式,需要重新挂载为rw模式才可以使用

Mount  -o  remount,rw  /mnt/sysimage

Mount  /dev/cdrom  /mnt/cdrom

  • 挂载光盘完成后,就可以安装内核包

Rpm  -ivh  /mnt/cdrom/Package/kernel-XXX.rpm –root=/mnt/sysimage –force

  • 此时切换根,进入/boot目录,可以看到一些文件已经安装成功
  • 接下来,需要安装gurb 文件,

Grub-install  /dev/sda

安装完成后,记得等一段时间,敲几遍syne  等数据写入完成

  • 下面还缺失一个关键性文件,需要我们手动来建立,那就是conf

文件内容如下:

Default=0

Timeout=3

Title=yan

Kernel  /vmlinuz-版本号   root=/dev/VolGroup/lv_root

Initrd  /initramfs-版本号.img

保存退出

  • 重启系统,可以看到系统修复完成,已经可以登录
  • 将swap分区挂载

/dev/mapper/VolGroup/lv_swap  swap  swap  defaults 0  0

挂载完成,用free命令查看,可以看到swap大小

 

 

/procmulu

内核把自己内部状态信息及统计信息,以及可配置参数通过proc伪文件系统加以输出

 

/proc/sys

(1) sysctl命令用于查看或设定此目录中诸多参数

sysctl -w path.to.parameter=VALUE

sysctl -w kernel.hostname=mail.magedu.com

(2) echo命令通过重定向方式也可以修改大多数参数的值

echo “VALUE” > /proc/sys/path/to/parameter

echo “websrv” > /proc/sys/kernel/hostname

 

Sysctl命令

默认配置文件:/etc/sysctl.conf

  • 设置参数

Sysctl  -w  parameter=VALUE

  • 通过读取配置文件设置参数

Sysctl  -p  [/path/to/conf_file]

  • 查看所有生效参数

Sysctl  -a

 

常用的几个参数:

net.ipv4.ip_forward

net.ipv4.icmp_echo_ignore_all

vm.drop_caches

 

/sys目录:

sysfs:为用户使用的伪文件系统,输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的设定信息;有些参数是可以修改的,用于调整硬件工作特性

udev通过此路径下输出的信息动态为各设备创建所需要设备文件,udev是运行用户空间程序

专用工具:udevadmin, hotplug

udev为设备创建设备文件时,会读取其事先定义好的规则文件,一般在/etc/udev/rules.d及/usr/lib/udev/rules.d目录下

 

编译安装内核

  • 模块之间存在依赖性

 

 

 

内核组成部分:1、放在vmlinuz-版本号-release中

2、放在/lib/modules/版本号-内核架构中

 

运行中的内核命令:uname

Uname  -r :显示内核版本

-n:显示节点号

-a:显示所有信息

lsmod命令:

显示由核心已经装载的内核模块

显示的内容来自于: /proc/modules文件

vmodinfo命令:

显示模块的详细描述信息 

modinfo [ -k kernel ] [ modulename|filename… ]

-n: 只显示模块文件路径

-p: 显示模块参数

-a: author 作者

-d: description 描述

-l: license 许可证

lsmod |grep xfs;modinfo xfs

 

装载或卸载内核模块

modprobe命令:

 

vmodprobe [ -C config-file ] [ modulename ] [ module parame-ters… ]

v配置文件:/etc/modprobe.conf, /etc/modprobe.d/*.conf

vmodprobe [ -r ] modulename. 

 

depmod命令:

内核模块依赖关系文件及系统信息映射文件的生成工具

装载或卸载内核模块:

vinsmod命令:指定模块文件,不自动解决依赖模块

insmod [ filename ] [ module options… ]

insmod `modinfo –n exportfs`

lnsmod `modinfo –n xfs`

vrmmod命令:卸载模块

rmmod [ modulename ]

rmmod xfs

rmmod exportfs

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/90780

(0)
上一篇 2018-01-02 09:21
下一篇 2018-01-02 18:42

相关推荐

  • lvs——特殊的lvs-dr模型

    lvs-dr模型中:vip与dip/rip不在同一网段的实验环境设计及配置实现 实验拓扑: 提示:在路由器的内网IP接口上配置一个别名IP,此IP同VIP在同一网段 设计要点: VS上的VIP地址可以直接配置在DIP地址所在的网卡上,Linux主机上,一块网卡可以配置多个地址 RS上的VIP地址必须配置在lo接口上,并且还要关闭arp的响应和通告功能 外网接…

    Linux干货 2016-10-26
  • week8

    1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。 网桥:          连接不同子网,使其透明通信,它们工作在链路层。它们处理的是链路层数据,一般来说就是以太     网帧格式的 &nb…

    Linux干货 2016-12-19
  • 马哥教育网络班22期+第5周课程练习

    1、显示当前系统上root、fedora或user1用户的默认shell; [root@localhost ~]# awk -F: '{print $1,$7}' /etc/passwd| egrep "^\<(root|fedora|user…

    Linux干货 2016-09-15
  • 运维的危险命令,用了必死(1)

    Linux命令行佷有用、很高效,也很有趣,但有时候也很危险,尤其是在你不确定你自己在正在做什么时候。这篇文章并不打算引来你对Linux或linux 命令行的愤怒。我们只是想让你意识到在你运行某些命令时应该三思而后行。(译注:当然,以下命令通常都是在root权限下才能将愚蠢发挥到无可救药;在普通用户身份下,破坏的只是自己的一亩三分地。)

    2017-11-16
  • PHP进阶知识总结

    周末梳理了下这段时间看书的一些知识点,进步的过程不仅要实践,还要安排多看书、思考、总结。 只针对知识点进行了罗列和简单说明,很多细节还未整理好,待后面再专门详细写。   基础易忽略概念   PHP是一个支持面向对象开发的语言,而不是一个纯面向对象的语言 PHP5中保留了对var的支持,但会将var自动转换为public 类型检查函数: i…

    Linux干货 2015-03-10
  • 几个有意思的小脚本

    ①.用脚本画一个圣诞树 效果 ②.用脚本画一个类似国际象棋的棋盘 半成品效果 再像这样在下面多写几个循环,就可以了,我这个方法太笨,全写完要截图的太多,就放一部分意思下 ③.编写一个脚本,打印出九九乘法表 效果 ④.编写一个脚本,可接收一个 1-7 的数字作为参数,用 if 和 case 两种方法实现根据输入的数字输出对应星期的英文 用if的方法 用case…

    2017-05-11