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

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文件修复
这里写图片描述

启动流程:POST–>BIOS(boot sequence) –> GRUB(bootloader(stage1:mbr;stage2:grub目录中)) –> kernel(initrd) –> SHELL

HOST:宿主机
Target:目标机

基于HOST只做一个简单的可启动的Linux

   1.给目标磁盘分区
      两个:
         宿主机上:/dev/sdb1 /dev/sdb2
        /dev/sdb1 挂载至 /mnt/boot
        /dev/sdb2 挂载至 /mnt/sysroot

   2.安装grub至目标磁盘
    # grub-install --root-directory=/mnt /dev/sdb

   3、复制内核和initrd文件
      cp /boot/vmlinuz-Version  /mnt/boot/vmlinuz
      cp /boot/initramfs-Version.img /mnt/boot/iniyramfs.img

   4.创建目标文件的根系统文件
   mkdir -pv /mnt/sysroot/{etc/rc.d,usr,var,proc,sys,dev,lib,lib64,bin,sbin,boot,src,mnt,media,home,root}
   接着去移植bash等至目标主机的根文件系统

    5.为grub提供配置文件
    vim /mnt/boot/grub/grub.conf
    default=0
    timeout=5
    title
     root(hd0,0)
     kernel /vmlinuz ro root=/dev/sda1 selinux=0 init=/bin/bash
     initramfs /initramfs

Linux的内核:单内核,支持动态装载和卸载

模块:/lib/modules/Kernel_version/

查看pci(网络设备)设备的命令
#lspci -v

查看当前内核装载的的所有模块
#lsmod

查看某模块的详细信息
#modinfo MOD_NANE

动态装载模块
#modprobe MOD_NAME
#insmod /path/to/lib

动态卸载模块
#modprobe -r MOD_NAME
#rmmod path

/sbin/init

/etc/inittab
    /etc/rc.d/rc.sysinit
    启动对应级别的需要启动的服务,停止需要停止的服务
        /etc/rc.d/rcN.d
            S##
            K##
            符号链接:/etc/init.d/
            ##:表示优先级(0-99),数字越小,优先级越高

#chkconfig
    --add SERVICE_NAME
         chkconfig --add 添加服务
#chkconfig SERVICE_NAME {on|off}
#chkconfig --level SERVICE_NAME {on|off}
#chkconfig --del SERVICE_NAME

添加一个服务进程

[root@localhost init.d]# chkconfig --add tservice 
[root@localhost init.d]# chkconfig --list | grep tservice
tservice        0:off   1:off   2:on    3:on    4:on    5:on    6:off
[root@localhost init.d]# ls -l ../rc3.d/*tservice*
lrwxrwxrwx. 1 root root 18 Sep 10 07:18 ../rc3.d/S88tservice -> ../init.d/tservice
[root@localhost init.d]# 

写一个简单功能的服务脚本tservice :

!/bin/bash
#
# description: Test Service Script
# chkconfig: 2345 88 87

#source一个文件,引用里面的函数failure success
. /etc/init.d/functions  

lockFile=/var/lock/tservice

start() {
        if [ -e $lockFile ]; then
                echo -ne "tservice is already started."
                failure #打印空格加[FAILURE]
                echo
                return 5
        else
                touch $lockFile
                echo -ne "tservice is running."
                success #打印空格加[OK]
                echo
                return 0
        fi
}

stop() {
        if [ -e $lockFile ]; then
                rm -f $lockFile
                echo "stop tservice finished.."
                return 0
        else
                echo "tservice is not running.."
                return 6
        fi
}

restart() {
        stop
#!/bin/bash
#
# description: Test Service Script
# chkconfig: 2345 88 87

. /etc/init.d/functions

lockFile=/var/lock/tservice

start() {
        if [ -e $lockFile ]; then
                echo -ne "tservice is already started."
                failure
                echo
                return 5
        else
                touch $lockFile
                echo -ne "tservice is running."
                success
                echo
                return 0
        fi
}

stop() {
        if [ -e $lockFile ]; then
                rm -f $lockFile
                echo "stop tservice finished.."
                return 0
        else
                echo "tservice is not running.."
                return 6
        fi
}

打印多个空格的方式

[root@localhost init.d]# echo -ne "\033[60G"
                                                           [root@localhost init.d]# 
[root@localhost init.d]# 

总结:

系统启动流程

   post-->BIOS(boot sequence)-->MBR(bootloader)-->Kernel(initrd,initrafs)-->/sbin/init(/etc/inittab)
 init:
   SysV:init:/etc/inittab
   upstart:/etc/inittab,/etc/init/*.conf
   SystemD:OS X
 /etc/inittab
    设置默认级别运行级别
    定义运行的系统初始化脚本:rc.sysinit
    启动制定下的S开头的服务,关闭K开头的服务
      chkconfig —add|--del|--level
      #description
      #chkconfig:lever spri kpri
    ctrlaltdel
    启动字符终端
    启动图形终端
/etc/rc.sysinit
    设定主机名
    激活selinux和udev
    挂载文件系统
    激活swap
    以读写方式重新挂载根文件系统
    设置内核参数
    系统时钟
    键盘映射
    加载额外的驱动程序

裁剪的Linux:POST–>BIOS–>GRUB(stage1(MBR))–>stage2(boot分区)–> Kernel(initramfs)

 传递给内核的参数
 selinux={0|1}
 init=/bin/bash
 ro
 root=/path/to/device
 quiet

Linux:单内核

模块化:动态
  /lib/modules
  lsmod,modinfo,modprobe,insmod,,modprobe -r ,rmmod
  dep文件:模块的依赖关系
  sysbols:符号映射
  depmod:用来生成模块依赖关系
     kernel文件夹下
        arch:架构
        crypto:加密模块
        drivers:驱动
        fs:文件系统
           有两部分组成
        kernel:内核调试模块
        lib:内核本身通用库
        mm:内存管理,少部分在这。大部分在内核中
        net:网络协议的实现
           netfilter:软件防火墙
           openvswith:虚拟机
           sunrpc:
        sound:声音

    CentOS6:
       与官方kernel可能不一样

    src.rpm
       源码rpm包+specs文件
       步骤:
         1.创建mockbuild用户
         2.切换至mockbuild用户,而后安装src.rpm包
         3.rpmbuild -bb|-ba ~/rpmbuild/SPECS/package_name.spec
         4.制作完成的rpm包:位于/root/rpmbuild/RPMS/x86_64中
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值