Linux之系统启动和内核管理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux之系统启动和内核管理相关的知识,希望对你有一定的参考价值。

系统启动

常用命令:

runlevel
who -r
/etc/inittab:定义启动级别
/etc/rc.d/init.d/NetworkManager 定义网络管理程序的详细信息
/etc/rc.d/rc.sysinit 系统初始化脚本
/etc/rc.d//rc[0-6].d/定义6个级别对应的服务程序开启或关闭
/etc/rc.d/rc.local 开机最后一步要执行的脚本可以放到此文件中
自定义服务

chkconfig --list 查看定义服务程序详情列表
testsrv需要放入/etc/rc.d/init.d/目录下testsrv
内部定义

#!/bin/bash
chkconfig: 345 66(s-启动) 44(k-关闭)
description: test service
echo ##########

ntsysv可以设置当前级别模式哪些进程启动或不启动,重启生效。*为开机启动项。

chkconfig --add testsrv
chkconfig --del testsrv
chkconfig NetworkManager on|off 不加--level 默认设置2345

/boot/grub/grub.conf
grub-md5-crypt或者grub-crypt --md5
grub-crypt 默认采用sha512
grub-crypt --sha-256
主要项有
default=0
timeout=5
hiddenmenu
passwd --md5 $$$$$$$$$$$$$$$$$$$$$$$$$$加密后的密码
passwd --encrypted ########################加密后密码
title centos
kernel (hd0,0)/vmlinuz-2.6.32-754.el6.x86_64 root=UUID-xxxxx
initrd (hd0,0)/initramfs-xxxxxxxxxxx

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/sda2
#          initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz 该文件为启动选项背景图片,可以自行修改:(ImageMagick包,convert -resize 640*480 -colors 14 centos.jpg centos.xpm)
hiddenmenu
title CentOS 6 (2.6.32-754.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=UUID=a6d8689c-a3ec-415b-a2d2-7fb209c352c9 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-754.el6.x86_64.img

TIPS:

核心驱动文件在/boot/vmlinuz-3.10.0-957.el7.x86_64**内核
按需加载
/usr/lib/modules/3.10.0-957.el7.x86_64中驱动模块
辅助的伪根系统
/boot/initramfs-3.10.0-957.el7.x86_64.img**(打包文件,内部放有内核挂载所需识别驱动模块)
cpio -tv < initramfs-3.10.0-957.el7.x86_64.img 查看内部文件。

modinfo ext4:查看驱动模块所在位置
lsmod:查看所有加载到内存的驱动模块

模拟故障实验1,initramfs-3.10.0-957.el7.x86_64.img伪根文件丢失

重启后故障图:
技术图片
方法1:进入光盘救援模式

chroot /mnt/sysimage切根
mkinitrd /boot/initramfs-`uname -r`.img `uname -r` --force(此项如果boot下没有initramfs文件可不加)------重新生成伪根img文件
或者
dracut /boot/initramfs-$(uname -r).img $(uname -r)------重新生成伪根img文件
exit-------退出当前根
reboot--------重启系统

模拟故障实验2,vmlinuz-3.10.0-957.el7.x86_64内核文件丢失

重启后故障图:
技术图片
方法1:进入光盘救援模式

mount /dev/sr0 /mnt/sysimage/data
cp /mnt/sysimage/data/isolinux/vmlinuz /mnt/sysimage/boot/vmlinuz--$(uname -r)从光盘里把内核文件拷贝到/原boot目录下并加版本信息
reboot--------重启系统

模拟故障实验3,/etc/inittab里,默认启动级别错误定义到0或者1

技术图片
方法:在开机倒计时时,按任意键调出菜单,下面有提示,按a键进入内核模式,在后面补上启动级别3,即可进入系统。进入系统后再重新修改/etc/inittab内默认启动级别为正常级别即可。

模拟故障实验4,MBR里前446字节被清空,grub,stag1被破坏,导致的无法启动系统。(全部清空的话,没有备份分区表无法恢复,切记)

技术图片
方法:进入光盘救援模式

chroot /mnt/sysimage切根
grub安装
安装grub:
(1) grub-install 此命令可用于修复/boot/grub/下的所有文件除了grub.conf和*.xmp.gz文件 但是如果使用grub-install修复后,再把除了grub.conf以外的所有文件拷贝走,重启后将无法进入系统,需要进入救援模式切根再执行grub-install /dev/sda命令 操作完后多此执行sync,防止数据在内存中未写入硬盘
安装grub stage1和stage1_5到/dev/DISK磁盘上,并复制GRUB相关文件到 DIR/boot目录下
grub-install --root-directory=DIR(boot的上级父目录名称) /dev/DISK
(2) grub
grub> root (hd#,#) 中间有空格
grub> setup (hd#)

模拟故障实验5,MBR里前446字节被清空,/boot目录下被清空。

技术图片
方法:进入光盘救援模式

chroot /mnt/sysimage切根
grub-install /dev/sda
mount /dev/sr0 /mnt
cp /mnt/isolinux/vmlinuz /boot/vmlinuz-uname -r
dracut /boot/initramfs-uname -r.img uname -r
最后写grub.cfg文件

default=0
timeout=5
hiddenmenu
title Centos 6
root (hd0,0)
kernel /vmlinuz-2.6.32-754.el6.x86_64 root=UUID=a6d8689c-a3ec-415b-a2d2-7fb209c352c9
initrd /initramfs-2.6.32-754.el6.x86_64.img

模拟故障实验6,MBR里前446字节被清空,/boot目录下被清空。/etc/fstab文件被删除。进行恢复(前提是/和/home还有swap都是逻辑卷创建的文件系统)

方法:进入救援模式
由于分区表没有坏,所以先找分区,写fstab文件
因为所有文件系统都是逻辑卷创建的,默认逻辑卷没有被激活
需要激活用(vgchange -ay
创建临时根目录,挂载逻辑卷/到临时根目录
然后写fstab文件
需要重启重读fstab配置文件。
之后参照实验5,或者安装光盘里的rpm -ivh /mnt/Package/kernel.... --nodeps --force
最后sync几遍重启

模拟故障实验7,grub.conf文件内,initrd和 kernel上下行颠倒

技术图片
技术图片
启动菜单出现后按e编辑菜单,因为两行上下颠倒,所以d删除上面的一行,在剩下行上面o新创一行,然后e取编辑一下,输入initrd /initramfs-xxxxxxx 回车,然后b启动,以上修改为临时性修改。进入程序后再修改grub.conf文件。

模拟故障实验8,开机启动卡在某服务,排错

方法:在开机倒计时时,按任意键调出菜单,下面有提示,按a键进入内核模式,在后面补上启动级别1,进入单用户维护模式。将启动不了的服务临时设置为开机不启动chkconfig testsrv off。然后reboot,开机后再想办法解决。


模拟服务自己写一个testsrv,实现service testsrv start|stop|status|restart

#!/bin/sh                                                                                                                          
#
#chkconfig: - 66 22
#description:testsvr
service=`basename $0`
. /etc/init.d/functions
start(){
    if [ -f /var/lock/subsys/$service ];then
        echo "$service has been started"
    else
        touch /var/lock/subsys/$service
        action "Starting $service"
    fi
}

stop(){
    if [ -f /var/lock/subsys/$service ];then
        rm -rf /var/lock/subsys/$service
        action "stopping $service"
    fi
}

status(){
    if [ -f /var/lock/subsys/$service ];then
        echo "$service is running"
    else
        echo "$service is stopped"   
    fi
}

case $1 in 
start)
    $1
    ;;
stop)
    $1
            ;;
restart)
    stop
    start
    ;;
status)
    $1
    ;;
*)
    echo "Usage service `basename $0`start|stop|status|restart "
esac                                                                                                                    

Centos6启动流程
网址转载流程图
https://s4.51cto.com/wyfs02/M02/87/20/wKiom1fVBELjXsvaAAUkuL83t2Q304.jpg
技术图片

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控制主机

启动流程

POST:Power-On-Self-Test,加电自检,是BIOS功能的一个主要部分。负责完成对CPU、主板、内存、硬盘子系统、显示子系统、串并行接口、键盘等硬件情况的检测

ROM:BIOS,Basic Input and Output System,保存着有关计算机系统最重要的基本输入输出程序,系统信息设置、开机加电自检程序和系统启动自举程序等
RAM:CMOS互补金属氧化物半导体,保存各项参数的设定
按次序查找引导设备,第一个有引导程序的设备为本次启动设备

bootloader: 引导加载器,引导程序

windows: ntloader,仅是启动OS
Linux:功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核
LILO:LInux LOader
GRUB: GRand Unified Bootloader
GRUB 0.X: GRUB Legacy, GRUB2

MBR:第一个扇区

前446字节 bootloader
中间64字节 分区表
最后2字节 55AA

GRUB

primary boot loader : 1st stage,1.5 stage
secondary boot loader :2nd stage,分区文件

kernel

自身初始化:
探测可识别到的所有硬件设备
加载硬件驱动程序(借助于ramdisk加载驱动)
以只读方式挂载根文件系统
运行用户空间的第一个应用程序:/sbin/init

以上是关于Linux之系统启动和内核管理的主要内容,如果未能解决你的问题,请参考以下文章

LINUX PID 1和SYSTEMD PID 0 是内核的一部分,主要用于内进换页,内核初始化的最后一步就是启动 init 进程。这个进程是系统的第一个进程,PID 为 1,又叫超级进程(代码片段

Linux系统启动流程之grub

linux设备驱动之platform平台总线工作原理

Linux系统启动流程之kernel

linux内核结构和启动过程

linux基础之CentOS系统启动流程