马哥笔记第十三天系统启动流程、grub、模块、bash函数

  1. kernel的功能:进程管理、文件系统、硬件驱动、内存管理、安全功能:SELinux、网络子系统,标准库:glibc

    进程是运行在cpu上但用户进程受控于内核,用户进程需要完成特权指令时将触发软中断由用户模式转为内核模式,由内核代为执行特权指令并把结果返回给用户进程。

    Linux为单内核体系结构但是它支持模块化,模块还可以动态装载或卸载,Linux内核:核心 + 外围模块

    核心:/boot/vmlinux-VERSION-release

    模块:/lib/modules/VERSION-release,内核模块一般都以.ko结尾: kernel object

    ramdisk: /boot/initramfs-VERSION-release.img:在内核启动过程中装载根文件系统时有用

    linux支持多版本内核共存,在以上目录中会体系多版本号

    linux系统启动流程:POST:加电自检,cpu寻址空间由ROM+RAM共同组成:ROM(bios)今后会被EFI所代替。

    引导次序:按次序找引导设备,第一个有引导程序的设备为启动设备

    MBR:Master Boot Record寻找启动设备第一个扇区(sector):512bytes组成(446: bootloader、64: partation table、2: 5A)

    运行bootloader: Centos5/6linux为传统GRUB(GRand Unified Bootloader),提供可启动内核,并自身可识别内核所在分区的文件系统,当内核启动后bootloader把控制权交给内核自己退场

    内核和ramdisk一同被GRUB装载在内存中,ramdisk提供硬盘驱动模块,内核是在内存中结合cpu运行

    kernel内核启动后:自身初始化、识别硬件、装载驱动程序、以只读方式装载根文件系统、/sbin/init,当内核把init进程启动后整个启动过程结束

    CentOS 5: SysV, init文件在:/etc/inittab --> /etc/rc.d/rc.sysinit

    entOS 6 Upstart,init文件功能被分为多个文件 /etc/init/*.conf --> /etc/rc.d/rc.sysinit

    CentOS 7 Systemd:系统启动文件/usr/lib/systemd/system/

    启动步骤一、CentOS 5: kernel 会根据配置文件 /etc/inittab启动系统第一个进程 /sbin/init

    设定系统默认运行级别:共有7个级别0-6:

    0:关机、1:单用户模式 single user mode、2: multi user mode,非完全多用户模式不支持NFS功能、3:完全多用户模式,文本接口、4:未使用,预留级别、5:完全多用户械,图形接口、6: 重启。切换级别:init #

    启动步骤二、通过/etc/rc.d/rc.sysinit脚本,进一步初始化系统

    启动步骤三、启动指定运行级别的默认启动服务,停止指定运行级别下默认关闭服务;在/etc/rc.d/下有各个运行级别对应目录,每个目录都记录着程序在该级别运行状态、S##: 启动的服务、K##:停止的服务、##:01-99,数字越小,越优先启动或关闭;

    脚本如果期望能够被chkconfig命令使用,要在脚本中添加如下行:

    # chkconfig: - 85 15

    -:当此脚本由chkconfig控制时时,默认哪些级别就是开启的,也可以指定级别如:# chkconfig: 345 85 15,当chkconfig控制该程序时只对345级别生效。85为开启优先级。15为关闭优先级。添加程序如下:

            复制脚本到/etc/init.d/下,用 chkconfig --add 添加脚本启动项并在各启动级别目录下创建链接文件,chkconfig --del删除自启动项,chkconfig SRV_SCRIPT {on|off}设定启动或关闭项,默认2345,也可以针对某一个级别设定相关服务例如:chkconfig --level

    /etc/rc.d/rc.local (/etc/rc.local):该脚本为系统启动完成最后运行一个脚本。

    启动步骤四:定义一些组合键的功能,通常是Ctrl+Alt+Delete

    启动步骤五:初始化字符终端

    启动步骤六:如果有需要,启动图形终端

  2. CentOS 6: /etc/inittab,由/etc/init/*.conf 下配置文件定义init的初始化动作,由upstart调用,程序为/sbin/init

    /etc/rc.d/rc.sysinit: 系统初始化脚本包括如下操作(设定主机名:读取/etc/sysconfig/network文件中的HOSTNAME参数、显示文本欢迎信息、激活SELinux和udev、挂载/etc/fstab文件中定义的其它文件系统、激活swap、检测根文件系统,并以读写方式重新挂载、设置系统时钟、根据/etc/sysctl.conf设置内核参数、激活LVM和RAID设备、加载额外设备的驱动程序、清理操作)

    初始化流程:POST --> (BIOS)boot sequence --> MBR(bootloader) --> kernel + ramdisk(5和6不同的文件名称,initrd、initramfs) --> mount rootfs (ro) --> /sbin/init (CentOS 5: /etc/inittab, CentOS6 /etc/init/*.conf) 

    设定默认运行级别 --> 使用/etc/rc.d/rc.sysinit初始化系统 --> 分别启动并关闭指定服务 -->Ctrl+Alt+Delete组合键 --> 启动字符终端 --> 启动图形终端

    GRUB: GRand Unified Bootloader,grub程序由两段组成:stage1: MBR (0柱面 0磁道 1扇区)只为读取随后文件系统指定扇区。stage1_5: MBR随后的扇区装载文件系统类型。stage2: 读取grub.conf配置文件,并实现引导功能的扩展

    GRUB功能:

            1、提供菜单,并提供交互式接口(e: 进入编辑模式 在内核后添加single,后按b就可以进入单用户模式、c:进入命令行接口模式)

            2、选择要启动的内核或系统(允许传递引导参数给内核,选择界面可隐藏)

            3、为编辑功能提供保护机制(选择运行指定的内核得先输入密码、使用e命令得先输入密码)

    grub命令行接口:

            root:指定哪个分区为要启动的系统或内核文件所在的分区,所有硬盘都识别为hd,不同的硬盘基于数字标识:如hd0, hd1等,同一个硬盘上的不同分区,也使用数字标识,如root (hd0,0)

            find (DEVICE)/path/to/file,用于查找内核在那个分区上。

            kernel: 指定要运行的内核文件,例如:kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/sda3,只读模式挂载根文件系统事先需要知道根文件系统位置,必须指定ramdisk文件

            initrd:为要运行的内核指定其可用的ramdisk文件例如:initrd /initramfs-2.6.32-358.el6.x86_64.img

            boot: 启动此前配置好的内核或系统。

    grub.conf文件在/boot/grub目录下。配置文件内容说明:

            default=: 选择第几个title配置的内核或系统,各title从0开始编号

            timeout=#: 菜单显示的超时时长;

            splashimage=/path/to/some_image_file:指定菜单的背景图片;此图片只能为14bits色,xpm格式,gzip压缩;

            hiddenmenu: 隐藏菜单

            title :显示于菜单中的标题

                  root (hd0,0):指定装载盘符

                  kernel /vmlinuz-2.6.32-504.12.2.el6.x86_64 ro root=/dev/sda2 selinux=0 init=/bin/bas:指定内核文件和挂载方式,

                   initrd /initramfs-2.6.32-504.12.2.el6.x86_64.img:指定ramdisk文件

    grub保护机制:

            生成密码:grub-md5-crypt

            保护编辑功能如(进入单用户模式和命令行模式),则需要title之外的添加:password --md5 密码串

            保护使用某内核,则需要内核对应的title之下添加,password --md5 密码串

    安装grub的方式:使用grub-install命令,

            安装方式一,当前所在硬盘上安装例如:grub-install /dev/sda

            安装方式二,在第二块盘上添加grub常用选项:--root-directory=path,该路径必须是内核和initrd文件所在boot的父目录,例如:在/mnt/boot,该指定目录为/mnt,挂载方式:grub-install --root-directory=/mnt /dev/sdb

  3. 总结启动次序:POST --> 引导次序(BIOS)--> BootLoader(MBR) --> kernel + ramdisk (临时根) --> 根切换 (rootfs) --> /sbin/init (配置文件)

    配置文件:设置默认运行级别 --> 指定系统初始化脚本进行系统初始化 --> 启动服务(关闭服务)(/etc/rc.d/rc#.d, /etc/rc.d/init.d/) --> /etc/rc.d/rc.local -> 设置CtrlAltDel组合的功用 --> 启动终端(mingetty),并在终端附加登录程序(login) --> 如果级别为5, 则要启动 X server

    nsswitch: 检查用户帐号否存在如果存在,将其解析为UID;nsswitch是库文件,而非服务:在/usr/lib64/libnss*、/lib64/libnss*

    pam: pluggable authentication module, 做用户认证,库 (API):/lib64/security/*

    GRUB: GRand Unified Bootloader,(stage1、stage1_5、stage2)

    Linux内核:单内核,模块化,内核的组成部分:/boot/vmlinuz-VERSION、/lib/modules/VERSION/下*.ko(kernel object)

            内核模块管理:lsmod: 显示内核已装载模块

            动态装卸载模块:卸载:modprobe -r MOD_NAME或rmmod MOD_NAME、装载:modprobe MOD_NAME 或 insmod /path/to/module_file,用insmod 必须写明模块的完整路径。

            查看模块详细信息:modinfo MOD_NAME。字段说明:depends显示依赖模块

            检查并生成模块间依赖关系的命令:depmod

  4. bash编程函数:可调用:函数名出现的地方,会被自动替换为函数体;

    函数的返回值:函数的执行结果返回值:代码输出echo, print,命令执行后返回的结果

    执行状态返回值:函数体中最后一次执行的命令状态结果,自定函数执行状态的返回值:return 

    函数可以接受参数:在函数体中调用函数参数:位置参数($1, $2,$#, $*, $@)

    练习:写一个脚本,完成如下功能(使用函数):

            1、提示用户输入一个可执行命令;

            2、获取这个命令所依赖的所有库文件(使用ldd命令);

            3、复制命令至/mnt/sysroot/对应的目录中

            4、复制各库文件至/mnt/sysroot/对应的目录中;




  5. function cpdir {
        if [ -f `which $1` ];then
            count=`which $1`
            if [ -d /media/sysroot`dirname $count` ];then
               [ -f /media/sysroot$count ] || cp -a $count /media/sysroot$count
               lddso $1
            else
                 mkdir -p /media/sysroot$(dirname $count)
               [ -f /media/sysroot$count ] || cp -a $count /media/sysroot$count
               lddso $1
           fi
        else
            echo "error"
            exit 2
        fi
    }
    function lddso {
        for i in $(ldd `which $1` | grep -E -o "/[^[:space:]]{1,}");do
           echo "$i"
            if [ -d /media/sysroot$(dirname $i) ];then
                  [ -f /media/sysroot$i ] || cp $i /media/sysroot$i
            elif [ ! -d /media/sysroot ];then
                    mkdir -p /media/sysroot$(dirname $i)
                  [ -f /media/sysroot$i ] ||  cp $i /media/sysroot$i
            elif [ ! -d `$dirname $i` ];then
                   mkdir -p /media/sysroot$(dirname $i)
                   [ -f /media/sysroot$i ] ||  cp $i /media/sysroot$i
            else
                 exit 3
            fi
          done
    }
    read -p "please inport command:" comm
    while [ $comm != "quit" ];do
          cpdir $comm
          read -p "please inport command:" comm 
          done


    练习:

    写一个脚本,判定192.168.0.0网络内有哪些主机在线,在线的用绿色显示;不在线的用红色显示;(使用函数)

            写一个脚本,判定172.16.0.0网络内有哪些主机在线,在线的用绿色显示;不在线的用红色显示;(使用函数)

  6. #!/bin/bash
    OnlineCounter=0
    OfflineCounter=0
    ipnet () {
    for((i=1;i<256;i++));do
        if  ping -c 1 -w 1 $1.$i &> /dev/null ;then
            let OnlineCounter++
            echo -e "\033[32m $1.$i \033[0m"
        else
            let OfflineCounter++
            echo -e "\033[31m $1.$i \033[0m" 
        fi
    done
    echo "Online counter: $OnlineCounter and Offline Counter: $OfflineCounter"
    }
    ipnet 192.168.146


你可能感兴趣的:(bash,grub,马哥)