学习笔记-操作系统内核和启动流程

OS:
内核的功能:

进程管理:task_struct, scheduler
内存管理:
I/O管理:中断,中断处理
文件系统:ext3,ext4
驱动程序:
安全相关:SELinux

通用软件,平台类的软件

内核设计流派:

单内核:各功能做在一起,单一体系结构
    Linux:虽然是单内核,但是采用了微内核的思想,模块化设置:核心+外围功能模块组成
    .ko: kernel object
    内核支持动态装卸载模块
微内核:内核子系统
    Window

fork()

init:负责管理用户空间的进程
    init:PID 1
    /sbin/init: 可执行文件

Linux系统的初始化流程:

POSI(自检):让CPU执行事先存在的代码->ROM cpu看到的内存是ROM和RAM的结合。怎么让CPU找到代码?CPU必须完成自取,出厂就规定好cpu访问的地址。cpu通电就访问内存。
BIOS:boot Sequencece 指定顺序
MBR:512
    446:bootloader(必须能识别文件系统)
    64:分区表
    2:5A
kernel文件:必须放在基本磁盘分区上。放在LVM和RAID上会让BootLoader(太小,无法支持复杂功能)无法识别vmlinuz。被BootLoader识别后装载到内存中。vmlinuz是压缩文件。它通过自解压(vmlinuz由两段代码组成,未压缩+压缩。未压缩的代码可以解压)。vmlinuz展开后开始工作。BootLoader就完成了自己的功能。
剩下的交给内核来执行。内核完成工作后开始用户空间第一个进程init,init在根目录下。所以要加载根目录?
内核如何加载根?根放的位置在LVM,还是光盘,。。。?
内核刚起来还没加载驱动,难道要把所有驱动先安装一遍,再去找根?
所以需要一个特殊文件,由BootLoader来识别。放在基本磁盘上。这就是initrd(这个文件是安装系统,安装完后,收集一下设备的驱动的相关信息,打包一下生成的),来告诉内核的硬件设备类型。这和文件和内核一块加载到内存中。内核把initrd当磁盘来用,initrd是个文件系统,就是把内存当成磁盘来用,下面有/bin /sbin 等等,帮主内核完成初始化的。从initrd中找到了访问真正根的驱动,这时候要把initrd拆掉,来把真正的根挂上。在踢之前会把initrd的设备文件复制到根上,可以避免根再次识别。根挂好后就可以执行init了。
由init来完成接下工作:挂载其他的额外系统
/sbin/init
    /etc/inittab 是init的配置文件,定义了要执行的脚本
    /etc/rc.d/rc.sysinit脚本:来完成后续的许多系统初始化
/lib/modules 
initrd:在红帽6叫initramfs
    rd:ram disk


init: init:
CentOS 5: SysV格式的系统初始化程序
  早期是   串行化:
  A->B->C
CentOS 6:Upstartz
    类似并行:所以这个启动快,和SysV不兼容
     dbus
       A
       B
       C
 后来又有SystemD:参考OS X中并行初始化过程,

运行级别:
chkconfig –list查看各个级别
0-6:7个级别
0:关机
1:单用户模式,直接以root用户登录
2:多用户模式模式,不支持NFS文件系统
3:完全多用户模式,文本模式
4:预留级别
5:完全多用户模式,支持图形模式
6:重启
默认开机时3或5模式
这些启动和关闭的进程都在/etc/init.d/下
每个文件中会有# chkconfig: - 58 74这一行,规定了启动顺序,和结束的输出
每个级别的启动项都是遍历对应的文件rc0.d-rc6.d来启动执行的,
[root@localhost rc.d]# ls
init.d rc rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rc.local rc.sysinit

[root@localhost boot]# chkconfig --list
NetworkManager  0:off   1:off   2:on    3:on    4:on    5:on    6:off
abrt-ccpp       0:off   1:off   2:off   3:on    4:off   5:on    6:off
abrtd           0:off   1:off   2:off   3:on    4:off   5:on    6:off
acpid           0:off   1:off   2:on    3:on    4:on    5:on    6:off
atd             0:off   1:off   2:off   3:on    4:on    5:on    6:off

/sbin/initd的配置文件
每行定义一种操作:

    id:操作的ID
    runlevels:在那些级别下执行此操作
    action:动作
        initdefault:设置默认运行级别,无需定义操作
        sysinit:指定系统初始化脚本
             si::sysinit:/etc/rc.d/rc.sysinit
        wait:等待系统切换至此级别运行一次
        ctrlaltdel:定义组合键被按下时要运行的命令
        respawn:当指定的操作进程被关闭时立即重启一次
    process:操作

/etc/inittab

# Default runlevel. The runlevels used are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
#
id:5:initdefault:

/etc/inittab中定义的操作:

设定默认运行级别
指定系统运行的初始脚本
启动指定级别下启动的服务,并关闭需要停止的服务
定义CtrlAltD组合操作
初始化字符终端
启动图像终端

总结:POSI->BIOS(Boot Sequence)->MBR(Bootloader)–>kernel(CentOS5:initrd CentOS6:initramfs)–>/sbin/init(Cent5:/etc/inittab CentOS6:/etc/inittab ,etc/init/*.conf)

/etc/inittab:
CentOS5:每一行定义一个操作
CentOS6:upstart 脚本

init要完成的任务
设定默认运行级别
指定系统运行的初始脚本
启动指定级别下启动的服务,并关闭需要停止的服务
        /etc/init.d/
            /etc/rc.d/rcN.d (0-6)
                S##:要启动的任务
                K##:要停止的任务
定义CtrlAltD组合操作
初始化字符终端
    终端:对应的是设备
        /dev/tty#, /dev/ttyS#
        调用:login->/etc/issue 显示登录时的信息
启动图像终端
    X-Window,桌面管理器

系统初始化脚本/etc/rc.d/rc.sysinit

设置主机名
打印文本欢迎信息
激活SElinux和Udev
激活交换分区
挂载/etc/fstab定义的本地文件系统
检查根文件系统并对其以读写方式重新挂载
设置系统时钟
装载键盘映射
根据/etc/sysyctl.conf设置内核参数
激活RAID和LVM设备
清理操作

BIOS

设定硬盘启动顺序,把有操作系统的盘作为第一启动盘

MBR:

bootloadder:程序。安装操作系统时,会给硬盘安装bootladder
    LILO:LInux LOader : 不能引导1024柱面以后的分区
    GRUB:Grand Unified Bootloader
        1st stage:位于MBR中,为了引导2nd stage
        1.5 stage:位于boot基本磁盘分区中,为了识别内核文件所在的文件系统提供文件系统识别扩展
        2nd stage:位于boot基本磁盘分区中,GRUB的引导程序
            boot分区大小
                CentOS5:100M
                CentOS6:200M
        /boot/grub/
            stage2:配置文件
            grub.conf
        grub的功能:
            1:选择启动的内核或系统
                能隐藏选择界面
            2:交互式借口
                e:编辑模式
            3:基于密码的保护
                启用内核映像
                    定义在title之下
                传递参数(进入编辑模式)
                    定义在全局段中

grub接口:
title:操作系统或内核的标题
root:设备内核文件所在分区为grup根
kernel:定义要使用的内核文件,后面可附加传递内核的启动参数
initrd:指定为内核提供额外驱动等功能的ram disk或ram fs文件
/etc/grub.conf配置文件语法

    default=# 默认启动的内核或OS title
    timeout=# 默认用户选择要求启动的内核或OS时长,单位:秒
    splashimage= 指定使用的背景图片
    hiddenmenu:隐藏菜单
    title
        root(hd0,0)
            (device,part)
             device表示方式:在grup中。以hd开头。并紧跟着一个数字做个磁盘的标记,从0开始编号
             part表示方式:代表分区,从0开始编号
        kernel:
            指定内核文件及传递给内核参数
                参数:ro root=/path/to/DEVICE quiet 把DEVICE设备当做根。以只读的方式 quiet不显示内核输出信息
        initrd:
            文件:通常为cpio归档,并使用gzip压缩;通常以.img作为文件名的后缀
#boot=/dev/sda
default=0 默认启动的
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.32-431.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=0144d9ef-fde1-4a1b-8209-391df9cc1f66 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-431.el6.x86_64.img
~                                                    

init的级别1的表示方式:
1, s , single, S、
单用户模式几乎不会启动任何服务,且不需要用户登录,但是会指型/etc/rc.d/rc.sysinit
运行级别的切换
#init [0-6]

如果MBR的grup被删掉
挂载CD-ROM选择CD-ROM启动,选择紧急求援模式 :然后进行
grup的安装

第一种方式
#grup
grup> root (hd#,#)
grup> setup (hd#)
grup> quit

第二种方式:
#chroot /mnt/sysimage
#grup-install --root-director=/ /dev/sda
                    boot所在的目录

然后在把grup.conf文件修复
这里写图片描述

猜你喜欢

转载自blog.csdn.net/weixin_36209467/article/details/82533369