美文网首页Linux科技Linux程序员
系统启动和内核管理

系统启动和内核管理

作者: Miracle001 | 来源:发表于2017-07-06 23:06 被阅读89次

    一、Linux组成

    Linux:kernel+rootfs
      kernel:进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能
      rootfs:程序和glibc
      库:函数集合,function,调用接口(头文件负责描述)
            过程调用:procedure,无返回值
            函数调用:function
      程序:二进制执行文件
    
    内核设计流派
        单内核(monolithic kernel):Linux
            把所有功能集成于同一个程序
        微内核(micro kernel):Windows, Solaris
            每种功能使用一个单独子系统实现
    
    Linux内核特点:
        支持模块化:.ko(内核对象)rpm -ql kernel|grep ext4.ko
            如:文件系统,硬件驱动,网络协议等
        支持内核模块的动态装载和卸载
    
    rpm -qi kernel
    内核组成部分:系统驱动存放位置(3个位置)
        核心文件:/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启动流程

    Paste_Image.png
    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→mbr→grub (1stage→stage1.5→stage 2)/boot/grub→/boot/grub/grub.conf→
    kernel /vmlinuz.XXX root= → /boot/initramfs|/boot/initrd.`uname -r`.img 
    ------------------------------------------------
    init初始化
    /sbin/init --/etc/inittab ---/etc/rc.d/rc.sysinit(/etc/fstab)---
    /etc/rc#.d/K,S ---/etc/rc.d/rc.local --/bin/login
    
    POST
      加电自检,是BIOS功能的一个主要部分
      ROM:检查硬件,断电丢不了
      RAM:有电池
    bootloader:引导加载器,引导程序
    MBR:446——bootloader;64——分区表;2——55AA
    GRUB:
       primary boot loader:
          df -Th
          1st stage  446字节,容量小,不能存放ext4.ko驱动
          1.5 stage  存放并加载ext.ko驱动,解压缩
       secondary boot loader:
          2nd stage  还要加载ext.ko驱动(boot和分区的fs可能不同),启动分区文件
    kernel
      自身初始化
        探测可识别到的所有硬件设备
        加载硬件驱动程序(借助于ramdisk加载驱动、本身无ext.ko驱动)
        以只读方式挂载根文件系统
        运行用户空间的第一个应用程序:/sbin/init
    
    1.5阶段的解压缩(过程)
    cd /boot;ls
    cp initramfs-VERSION-release.img /app
    cd /app
    mv initramfs-VERSION-release.img initramfs-VERSION-release.img.gz
    gzip -d initramfs-VERSION-release.img.gz
    file initramfs-VERSION-release.img  查询文件格式(cpio格式)
    cpio -tv < initramfs-VERSION-release.img
    cpio -tv < initramfs-VERSION-release.img |grep ext4.ko
    
    证明/boot/grub/目录下的文件可以移除(过程)
    cd /boot/grub/;ls  此时的文件都是备份文件,可以移动或删除
    mv * /app/
    mv /app/grub.conf /app/splash.xpm.gz  .  保留文件grub.conf(配置文件)和splash.xpm.gz(图形界面)
    reboot
    

    三、启动流程

    内核中的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问,并加载相应的硬件驱动;
    ramdisk --> ramfs  提高速度
    CentOS 5:模拟磁盘——initrd——速度慢
        工具程序:mkinitrd
    CentOS 6,7:模拟文件系统——initramfs——速度快
        工具程序:mkinitrd, dracut
    
    系统初始化:
    POST --> BootSequence(BIOS) --> Bootloader(MBR) --> kernel(ramdisk) --> rootfs(只读) --> init(systemd)
    
    ramdisk文件的制作
    (1)mkinitrd命令(通用)
    为当前正在使用的内核重新制作ramdisk文件
    mkinitrd  /boot/initramfs-$(uname -r).img  $(uname -r)
    mkinitrd  /boot/initramfs-`uname -r`.img  `uname -r`  
    (2)dracut命令(6,7可用)
    为当前正在使用的内核重新制作ramdisk文件
    dracut /boot/initramfs-$(uname -r).img $(uname -r)
    
    实验:删除并恢复文件/boot/initramfs-VERSION-release.img
    (1)救援模式→shell进程
    (2)chroot /mnt/sysimage  必须切根
    (3)cd /boot
    (4)mkinitrd /boot/initramfs-`uname -r`.img  `uname -r`
    (5)cat /boot/grub/grub.conf;ls /boot;  两个文件中的文件名要相同才可以;
    (6)grub -install /dev/sda(可以省略)
    (7)sync...exit
    

    四、系统启动流程

    rpm -ql /sbin/init
    init程序的类型
    (1)SysV:init,CentOS 5之前
        配置文件:/etc/inittab
    (2)Upstart:init,CentOS6
        配置文件:/etc/inittab,/etc/init/*.conf
    (3)Systemd:systemd,CentOS 7
        配置文件:/usr/lib/systemd/system
                /etc/systemd/system
    
    /sbin/init CentOS6之前
    运行级别:为系统运行或维护等目的而设定;0-6:7个级别
      0:关机
      1:单用户模式(root自动登录), single, 维护模式
      2: 多用户模式,启动网络功能,但不会启动NFS;维护模式
      3:多用户模式,正常模式;文本界面
      4:预留级别;可同3级别
      5:多用户模式,正常模式;图形界面
      6:重启
    默认级别:3, 5
    切换级别:init#
    查看级别:runlevel; who -r
    

    init初始化

    init读取其初始化文件:/etc/inittab
    初始运行级别(RUN LEVEL)
    系统初始化脚本
    对应运行级别的脚本目录
    捕获某个关键字顺序
    定义UPS电源终端/恢复脚本
    在虚拟控制台生成getty
    在运行级别5初始化X
    

    五、CentOS 5的inittab文件

    配置文件:/etc/inittab
    每一行定义一种action以及与之对应的process
        id:runlevel:action:process
        action:
            wait: 切换至此级别运行一次
            respawn:此process终止,就重新启动之(设置再生程序:mingetty 会自动调用login程序)
            initdefault:设定默认运行级别;process省略
            sysinit:设定系统初始化方式,此处一般为指定
                /etc/rc.d/rc.sysinit
            ca::ctrlaltdel:/sbin/shutdown -t3 -r now
                ctrl+alt+shift:快捷键---(多长时间后)自动关机
        id:3:initdefault:
        si::sysinit:/etc/rc.d/rc.sysinit
        l0:0:wait:/etc/rc.d/rc0
        l1:1:wait:/etc/rc.d/rc1...
        l6:6:wait:/etc/rc.d/rc6
    
    实验:增加终端tty
    增加新终端,reboot才会生效;
    
    实验:centos5:/etc/inittab文件里的id行的5更改为6---死循环---解决方案
    按任意键---在光标行(grub行)最后加3---进入3模式后,vim /etc/inittab---6更改为5即可;
    
    实验:破解root口令(centos5/6)
    开机倒计时界面,按a---选择第一行,按a---光标所在行最后加1/S/s/single---进入界面后,passwd更改口令即可;
    

    六、CentOS 6 /etc/inittab和相关文件

    /etc/inittab
        设置系统默认的运行级别
        id:3:initdefault:
    /etc/init/control-alt-delete.conf
    /etc/init/tty.conf
    /etc/init/start-ttys.conf
    /etc/init/rc.conf
    /etc/init/prefdm.conf
    
    /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) 清理操作
    

    说明:rcN --> 意味着读取/etc/rc.d/rcN.d/

    K*: K##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务
    S*: S##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务
    
    for srv in /etc/rc.d/rcN.d/K*; do
        $srvs top
    done
    for srv in /etc/rc.d/rcN.d/S*; do
        $srvs tart
    done
    
    K/S+次序号+服务名称;
    K---关机;S---开机;
    
    Paste_Image.png
    (1)正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向了/etc/rc.d/rc.local脚本;
    (2)不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中;
    (3)/etc/rc.d/rc.local在指定运行级别脚本后运行;
    (4)可以根据情况,进行自定义修改;
    
    cat /etc/rc.d/init.d/functions
    借鉴centos5的文件,完成作业
    
    编写服务脚本/root/bin/testsrv.sh,完成如下要求
    (1) 脚本可接受参数:start, stop, restart, status
    (2) 如果参数非此四者之一,提示使用格式后报错退出
    (3) 如是start:则创建/var/lock/subsys/SCRIPT_NAME, 并显示“启动成功”
    考虑:如果事先已经启动过一次,该如何处理?
    (4) 如是stop:则删除/var/lock/subsys/SCRIPT_NAME, 并显示“停止完成”
    考虑:如果事先已然停止过了,该如何处理?
    (5) 如是restart,则先stop, 再start
    考虑:如果本来没有start,如何处理?
    (6) 如是status, 则如果/var/lock/subsys/SCRIPT_NAME文件存在,则显示“SCRIPT_NAMEis running...”
    如果/var/lock/subsys/SCRIPT_NAME文件不存在,则显示“SCRIPT_NAME is stopped...”
    其中:SCRIPT_NAME为当前脚本名
    (7)在所有模式下禁止启动该服务,可用chkconfig和service命令管理
    

    七、chkconfig命令

    ntsysv命令
    更改当前模式;
    mv S05... K95...  (数字不是随便写的、考虑其依赖的服务)
    ntsysv --level=3  更改3模式
    开机启动---[*]---S开头
    开机不启动---[]---K开头
    
    (1)查看服务在所有级别的启动或关闭设定情形:
    chkconfig [--list] [name]
    (2)添加:
    SysV的服务脚本放置于/etc/rc.d/init.d(/etc/init.d)
    chkconfig --add name
    (3)删除:
    chkconfig --del name
    (4)修改指定的链接类型
    chkconfig [--level #] name <on|off|reset>
    --level #: 指定要设置的级别;省略时表示2345
    
    chkconfig --list atd
    chkconfig --level 23 atd on
    不同服务---不同模式---不同状态
    
    cat /etc/rc.d/init.d/sshd
    chkconfig行的S开头数字越大越好,原因是可能会依赖其他的服务,开机次序排到后面最好;
    
    Paste_Image.png Paste_Image.png
    自定义:开机后自动运行的脚本---可以放在/etc/rc.d/rc5.d/rc.local文件里;
    
    实验:创建服务脚本
    cd /etc/init.d  存放服务脚本
    思路:
    步骤一:创建服务脚本
    vim testsrv
    #!/bin/bash
    #chkconfig: - 58 20
    #disciption:this is a testing script(5---必须写正确;6---不要求;建议写)
    start(){
            echo testsrv is starting...
            touch /app/testsrv.pid
    }
    stop(){
            echo testsrv is stoping
            rm -f /app/testsrv.pid
    
    }
    case $1 in 
    start)
            start
            ;;
    stop)
            stop
            ;;
    restart)
            stop
            start
            ;;
    status)
            [ -e /app/testsrv.pid ] && echo testsrv is running || echo testsrv is stopped
            ;;
    *)
            echo "Usage:`basename $0` start|stop|status"
    esac
    步骤二:测试是否成功
    chkconfig --add testsrv
    chkconfig --level 345 testsrv on
    chkconfig --list testsrv
    chkconfig --del testsrv
    chkconfig --list testsrv
    chkconfig testsrv on(on---开机启动;off---开机不启动)
    ll /etc/rc0.d/*testsrv*
    ll /etc/rc5.d/*testsrv*
    

    八、xinetd管理的服务

    service 命令:手动管理服务
    service 服务 start|stop|restart
    service --status-all  查看当前所有服务的状态
    chkconfig --list  开机状态
    chkconfig sshd on; service sshd start;  开机启动;当前启动 (先chkconfig,再service;)
    
    例
    service atd stop
    /etc/init.d/atd stop
    
    独立服务(访问量大的服务):独立定义;
    非独立服务(访问量少的服务):利用xinetd管理;xinetd本身是一个独立服务;
    瞬态(Transient)服务——被xinetd进程所管理——进入的请求首先被xinetd代理(超级守护进程)
    centos6  默认无xinetd服务
    配置文件:/etc/xinetd.conf、/etc/xinetd.d/<service>
    与libwrap.so文件链接
    
    telnet-server(不安全、不加密、不常用)  此安装包依赖于xinetd服务;
    安装telnet-server包过程中,xinetd也被安装;
    chkconfig --list  最下方可以看到xinetd服务;
    
    (1)安装
    yum -y install telnet-server
    (2)更改配置文件
    vim /etc/xinetd.d/telnet: disable=yes更改为disable=no
    或者
    chkconfig telnet on
    此时,xinetd服务并不知道telnet服务启动了;
    (3)重启xinetd服务
    service xinetd status  刚安装的服务是不会马上被启动的
    service xinetd start
    grep telnet /etc/services  查看端口(23)
    ss -ntl  查看端口
    ss -ntlp  
    (4)xinetd只是监听,真正接受用户访问的还是telnet本身
    ps aux|grep telnet  
    centos7上操作: 安装telnet;telnet 192.168.128.129(centos6 ip)
    telnet---不能用root口令; 连接时,用普通用户口令;
    centos6上操作: iptables -vnL; iptables -F;
    ss -ntlp
    
    某些服务(例如:ftp)可以调成独立服务或者非独立服务;
    ftp——光盘安装或者网络自动安装;
    centos7: 可以看做都是非独立服务---按需激活---systemd---所以启动快
    

    相关文章

      网友评论

      本文标题:系统启动和内核管理

      本文链接:https://www.haomeiwen.com/subject/rybxhxtx.html