• 第五部分 linux系统管理员 开机流程 模组管理 与loader


    第五部分   linux系统管理员  开机流程  模组管理  与loader

     
    开机流程分析
    cmos保存电脑硬件的参数
    bios 基本的输入输出系统  读取硬件的软件
    MBR  master boot record  主要的开机记录扇区  里面可以安装开机管理程序  例如grub  pfdisk等有446字节
    partition table   分区表  记录硬盘分割的状态64字节
    其中上面的mbr和分区表都记录在硬盘的第一个扇区  大小为512字节
    主分区最多4个p1-p4 primary
    扩展分区最多一个   扩展分区要占据1个主分区的盘号的位置    扩展分区中可以建立多个逻辑分区   并口硬盘逻辑分区(63)多余串口硬盘的逻辑分区数量(15个)
    windows和linux操作系统又有所不同
    mbr  无法安装2.2t以上的容量    分区表只有16个字节
    GPT    GUID partition table 磁盘分区表
    MBR为512字节大小    而 GPT为4k大小的块大小   为了兼容磁盘  所以定义上gpt将区块易LBA 512字节来规划   最前面的34个LBA 组成分区磁块的信息记录   最后面的33个LBA作为备份
    boot loader   每个分区的第一个部分都会预留一块给系统引导程序 
    MBR中可以安装引导程序  windows默认安装   linux可手动安装   所以先安装windows 再装linux
    1.BIOS读取cmos的设置 进行自我检测  并依据设置取得第一个可开机的装置
    2.读取并执行第一个开机装置内的MBR的boot loader   也就是grub2     spfdisk等程序
    3.根据boot loader的设置 载入操作系统的kernel    内核会检测硬件并且加入驱动程序
    4.驱动完成之后   kernel会主动呼叫systemd程序  并且以default.target流程开机
    systemd执行syssinit.target初始化系统以及basic.target准备系统      系统初始化包括运行环境
    systemd启动multi-user.target下的本机与服务器服务 操作系统的基本服务和网络服务
    systemd执行multi-user.target下的/etc/rc.d/rc.local文件 自定义本机自启服务
    systemd执行multi-user.target下的getty.target及登录服务 终端环境
    systemd执行graphical需要的服务 图形界面服务
     
    BIOS boot loader 与kernel载入
    boot loader 的功能 认识操作系统的文件格式并且将核心加载到内存中去执行,由于不同的操作系统的文件格式不同 ,所以每种操作系统都有自己的boot loader
     
      图中的蓝色块为boot  sector      扇区    
    boot loader程序安装到此扇区或者mbr中
    ·此程序提供如下功能
    a 菜单    多重开机选项
    b 载入核心文件 直接指向可开机的程序区段来开始操作系统
    c 转交给其他的loader 将开机管理功能转交给其他的loader负责
    需要注意的是windows的loader默认没有控制权转交的功能,所以不能使用windows的loader来载入linux的loader
     
      如图中所示  
    菜单一 MBR grub2----kernel file----booting
    menu2 MBR grub2----boot sector(Windows loader)----Windows kernel----booting
    menu3 MBR grub2----boot sector(grub2)----kernel file(linux)----booting
    载入的核心kernel侦测硬件与initramfs的功能
    boot loader 读取核心   linux将核心解压到内存中  并且利用核心的功能,开始测试驱动和周边的装置,linux核心会议自己的功能重新检测一次硬件,而不一定会使用BIOS检测的硬件信息  此时核心已经接管bios后的工作了
    核心文件的位置:/boot   取名为/boot/vmlinuz
    核心模块放在/lib/modules/目录当中  因为模组要放到磁盘的根目录内所以分区时要注意  /和/lib在同一个分区
    一般的非必要的功能且可以编译为模块的核心功能   所以usb sata   scsi等磁盘装置的驱动程序通常都是以模组的方式来存在的。
      bios    ----boot loader ----kernel    ---检测硬件挂在根目录取得驱动程序
    但是kernel不认识sata硬盘  所以需要载入sata的驱动程序  否则无法挂在根目录    但是驱动程序在/lib/modules内  无法挂在根目录的情况下如何读取/lib/modules/内的驱动呢?  此时就需要通过虚拟的文件系统 来挂在目录
    虚拟文件系统 initial ram disk或者initial ram filesystem 一般会使用的文件名称为/boot/initrd或者/boot/initramfs
    通过bootloader载入到内存当中 并且执行其中的程序来载入开机过程中所需要的核心模块 通常就是磁盘等文件系统的驱动 载入完成之后 会调用systemd来开始后续的正常开机流程 如上图所示
    如图中所示 boot loader 能够载入kernel和initramfs ---initramfs解压缩成为根目录 ----kernel用此目录来载入适当的驱动程序,最终释放虚拟文件系统,并挂在实际的根目录文件系统,然后开始正常的开机流程。
    1.查看initramfs里面的文件内容
    lsinitrd /boot/initramfs-3.10.0-299.e17.x86_64.img
    其中包括一条重要的信息
    lrwxrwxrwx 1 root 时间 init-->usr/lib/systemd/systemd
    包含两大部分 一个是事先宣告一些文件
    另一个是核心回去读取的重要文件
     
    2.去掉上面宣告的文件
    a: mkdir /tmp/initramfs 创建一个解压的目录
    cd /tmp/initramfs
    dd if=/boot/initramfs-3.10.0-229.e17.x86_64.img of=initramfs.gz bs=11264 skip=1 删除前面宣告的部分
    ll initramfs.gz;fileinitramfs.gz 显示文件权限;文件类型
    b: gzip -d initramfs.gz 解压缩文件
    file intramfs 查看文件类型
    c: cpio -i -d -H --no-absolute-filenames < initramfs 用cpio的命令解压 不要绝对路径
    ll
    从结果中可以看出一个小型的根目录文件系统 此时kernel就可以挂载了
    d: 查看此小型的文件系统中    systemd是以哪个target来执行开机的
    ll /usr/lib/systemd/system/default.target
    显示结果指向  --->initrd.target
    e: 查看内设的initrd.target相依的所有服务信息
    systemctl list-dependencies   initrd.target
     
    结论:initramfs是一个小型的根目录   这个小型根目录通过systemd来进行管理    通过initrd.target来开机  此环境依赖于basic.target     sysinit.target等等硬件检测、核心功能启用的流程   然后开始让系统顺利运行,最后卸载initramfs   实际挂载系统的根目录。
     
     
     
    第一程序systemd及使用default.target进入开机流程分析
    当核心载入完毕 硬件驱动加载之后 此时主机硬件已经准备就绪了 此时核心会主动调用systemd这个程序,此程序准备软件执行的环境 包括主机名 网络 语言环境 文件格式及其他服务的启动等。
    默认的操作系统的环境为default.target 主要项目 有multi-user.target 以及 graphical.target 还包括比较特殊的额rescue.target emergency.target shutdown.target等等 以及包括虚拟文件系统initramfs中的initrd.target
    runlevel于systemd中的target对应关系
    /usr/lib/systemd/system/runlevel0.target--------->poweroff.target
     runlevel1.target--------->rescue.target
     runlevel2.target--------->multi-user.target
    multi-user.target
    multi-user.target
    5 graphical.target
    6 reboot.target
    systemd的处理流程
     
    1.local-fs.target + swap.target 主要挂载本机/etc/fstab里面所规范的文件系统与相关的内存置换空间
    2.sysinit.target 这个主要检测硬件 载入所需要的核心模块等动作。
    3.basic.target 载入主要的周边硬件驱动程序与防火墙相关任务
    4.multi-user.target下面的其他一般系统或网络服务的载入
    5.图形界面相关服务如 gdm.service 等其他服务的载入
     
     
    systemd执行sysinit.target初始化系统 basic.target准备系统
    systemctl list-dependencies sysinit.target 查看依赖关系
    大致的分类 此过程为初始化系统
    a: dev-hugepages.mount dev-mqueue.mount等的挂载服务 主要挂载和内存分页与信息队列 挂载后会出 现/dev下的相应的目录
    b: 磁盘阵列 网络磁盘 LVM文件系统 文件系统对照服务等等
    c: 开机过程的信息传递与动画执行 plymouthd服务搭配plymouth指令
    d: 日志式文件的使用 systemd-journald这个服务的启用
    e: 额外的核心模块的载入 通过/etc/modules-load.d/*.conf 配置文件的设置
    f: 额外的核心参数设置 包括/etc/sysctl.conf 以及/etc/sysctl.d/*.conf内部设置
    g: 设置终端的文字显示格式 console
    h: 启动动态设备管理员 就是udevd 用在动态对应实际设备存取与设备文件名对应的一个服务
     
    basic.target 启动系统服务
    a 音频驱动
    b 防火墙
    c 载入cpu微指令
    d selinux
    e 将开机过程 写入/var/log/dmesg
    f 加载管理员指定的模块 /etc/sysconfig/modules/*.modules 及/etc/rc.modules
    g timer 定时任务
    multi-user.target下的服务
    上面提到的初始化和基本的两项流程结束后 要进入主机服务和网络服务的功能了
    multi-user.target将会启动
    /etc/systemd/system/multi-user.target.wants/下需要启动的服务
    如果用户想将主机的服务和网那个罗服务的各个unit enable ,就将它放到/etc/systemd/system/multi-user.target.wants/ 这个目录下做个链接 如此就可以在开机的时候去启动它 如果是设置为disable的话 就是在上个目录中删除掉相应服务的链接文件。大多数的哦服务都是同时启动 而不是依序启动 这就是systemd的功能。
     
    与systemV的rc.local.service
    systemV的情况 如果想让系统额外执行程序 需要将程序或脚本的绝对路径写入到/etc/rc.d/rc.loacl这个文件中去,
    systemd的情况下 需要将脚本设定文件到/etc/systemd/system下 然后使用systemctl enable的方式来启动它 而不是直接使用rc.local这个文件
    rc.local.service 此服务的功能 不需要启动 会自己判断/etc/rc.d/rc.loacal 是否具有可执行的权限来判断是否要启动此服务
    增加可执行的权限 chmod a+x /etc/rc.d/rc.local
    systemctl daemon-reload
    systemctl list-dependencies multi-user.target | grep rc-local
    会发现有rc-local.service 出现了
    提供tty界面与登入的服务
    multi-user.target 底下还有getty.target的操作界面 包括systemd-logind.service systemd-user-sessions.service
    不一定哪个服务先启动 如果systemd-logind.service或者systemd-user-sessions.service服务尚未执行完毕的话 那么还是无法登陆的 所以会出现以下情况 刚开机时出现tty1屏幕提示符 马上输入用户名和密码并不能登录 但是稍微等一会之后就会顺利登录了
     
     
     
     
    graphical.target下的服务
    如果default.target为图形界面 那么在multi-user.target执行完毕之后会执行此项服务
    先查看以来关系
    systemctl list-dependencies graphical.target
    会出现很多的服务 其中比较重要的是图形界面方面的gdm.service
     开机流程中会用到的主要配置文件
    与systemV兼容 很多服务脚本设置还是会读取/etc/sysconfig/下面的环境设置文件
    1.关于模块:/etc/modprobe.d/*.conf及/etc/modules-load.d/*.conf
    加载用户自定义模块 
    /etc/modules-load.d/*.comf 仅核心载入模块的位置
    /etc/modprobe.d/*.conf 可以加上模块参数的位置
    systemd默认将需要的驱动都加载了 尽量不动 但是如果有特定的参数 需要处理 应该在这里进行,
    举例:
    vsftpd这个服务 端口该为555 就需要修改防火墙设定 其中针对ftp的防火墙设定中有一个模块为
    nf_conntrack_ftp 所以需要将此模块写入系统开机流程中
    a vim /etc/modules-load.d/vbird.conf 此为自定义的模块配置文件
    一个驱动模块写一行
    b vim /etc/modprobe.d/vbird.conf 模块额外的参数设置位置
    options nf_conntrack_ftp ports=555
    将原来的21端口改为555
    c lsmod | grep nf_conntrack_ftp 验证
    无显示 需要载入此模块
    d systmctl restart systemd-modules-load.service 载入模块
    lsmod | grep nf_conntarck_ftp
     
    2.常规的设定文件  
    /etc/sysconfig/*
     
    authconfig:使用本机的/etc/passwd, /etc/shadow 等 以及/etc/shadow 密码记录使用何种加密算法 身份登录机制
    cpupower linux核心如何操作cpu 对应的服务为 cpupower.service
    firewalld ipatables-config ebtables-config
    防火墙服务启动的额外参数
    network-scripts
    网卡驱动
     
     
                                                            核心与核心模块
     
    kernel的重要性   不言而喻
    文件位置
    核心:/boot/vmlinuz   或者  /boot/vmlinuz-version
    核心解压缩所需要的RAM DISK:/boot/initramfs (/boot/initramfs-version)
    核心模块:/lib/modules/version/kernel或者/lib/modules/$(unmae -r)/kernel
    核心原始代码:/usr/src/linux或者/usr/src/kernels/   需要用户安装   默认不安装
     
    系统的信息记录:/proc/version 核心版本
    /proc/sys/kernel/ 系统核心功能
    遇到新硬件的解决办法
    a 重新编译核心 加入最新的硬件驱动程序源码
    b 将该硬件的驱动程序编译成为模块 在开机的时候加载该模块
    核心模块与依赖关系
    相依赖性文件 /lib/modules/$(uname -r)/modules.dep 这个文件 记录在核心支持的模块的各项相依性
    建立此文件的命令 depmod
    A 搜寻比此.dep文件内更新的模块 找到新模块才会更新
    n 不写入.dep文件 而是将结果输出到屏幕上
    e 显示出当前已经载入的 但是不可执行的模块名称
    举例
    cp a.ko /lib/modules/$(uname -r)/kernel/drivers/net
    depmod
    核心模块的观察
    lsmod 列出模块的列表 包括名称 大小 是否被其他模块使用
    modinfo 单个模块的详细信息
    核心模块的加载与移除 手动加载模组
    modprobe 比较简单 解决依赖性问题 会主动的去搜寻moduels.dep的内容 建议
    insmod 不会分析相依性 insmod 绝对路径 参数
    rmmod [-fw] module_name
    f:强制
      w:等待使用完成后   再删除
    核心模块的额外参数设置   /etc/modprobe.d/*conf
    针对模块的特殊要求
     
     
                             Boot Loader : Grub2
     
    此为boot loader的程序
    bootloader  的两个stage    阶段
    在第一个开机装置的MBR去读取boot loader   446字节     第一个sector
    stage1:执行boot Loader  主程序
    必须要安装在开机区      最小主程序    
    stage2:主程序加载配置文件
    通过boot loader加载配置与相关的环境参数文件  包括系统定义与主要设定的文件grub.cfg   一般配置文件在/boot 下面
    grub.cfg 是主要的配置文件 grub2认识的文件系统格式非常多
    i386-pc x86架构的pc 所需要的grub2的相关模块文件夹
    grub2的配置文件 grub.cfg介绍
    认识较多的文件系统    可以利用grub2的主程序直接在文件系统中查找核心文件名
    开机时   可以自行编辑与修改开机设定的项目   类似bash的指令
    动态查找配置文件,不需要再修改配置文件后重新安装grub2     重启即可生效
    a 分区代号
    三种模式
    (hd0,1) 默认使用的语法   由grub2自动判断分割格式
    (hd0,msdos1) 磁盘分割为传统的MBR模式
    (hd0,gpt1) 磁盘分割为GPT模式
    说明:小括号     hd表示    搜索顺序为硬盘的编号      第一个为0 顺延     每个硬盘的第一个分区为1   顺延
    硬盘从0开始   分区从1开始
            注意与grub1版本是有区别的
    b 配置文件
    不建议自行修改配置文件的内容   但是可以用grub2-mkconfig指令来产生新的grub.cfg文件
    配置文件中的内容  比较重要的
     set root='hd0,gpt2'    配置文件所在位置     /与/boot在不同的分区   所以hd0,2     又因为gpt的分区格式  所以使用(hd0,gpt2)
    linux16 /vmlinuz-... root=/dev/mapper/centos-root ...
    因为/与/boot不在同一个分区  所以会显示/boot/vmlinuz-xxx--->(/boot)/vmlinuz-xxx--->(hd0,msdos1)/vmlinuz-xxx     用迭代的方式
    initrd16 /initramfs-3.10...
    此为initramfs所在的文件名   与linux16那个vmlinuz-xxx相同   文件名需要搭配   set root=xxx   那个项目的装置  才会得到正确的位置。
     
    grub2配置文件的维护   /etc/default/grub   与  /etc/grub.d
    不建议手动修改    应该要透过/etc/default/grub  这个主要环境配置文件与/etc/grub.d/目录内的相关配置文件来处理
    /etc/default/grub  主要环境配置文件
    grub_timeout       grub_timeout_style    grub_terminal_output      grub_default      grub_cmdline_linux
    举例:
    1.vim /etc/default/grub
    grub_timeout=40
    grub_default=0
    2.开始重新建立 grub.cfg
    grub2-mkconfig -o /boot/grub2/grub.cfg
    3.检查是否真的改变
    grep timeout /boot/grub2/grub.cfg
     
    菜单建立的脚本  /etc/grub.d/*
    grub2-mkconfig  会分析/etc/grub.d/*下面的文件  然后执行该文件来建立grub.cfg
    grub.d/下面的文件包括:
    00_header     建立初始的显示项目  包括需要载入的模块分析   tty的格式  秒数   菜单是否隐藏
    10_linux 根据分析/boot底下的文件   尝试找到正确的linux核心与读取这个核心需要文件模块与参数
    30_os-prober 默认到系统上找到其他的partition里面可能含有的操作系统
    40_custom 有其他自己手动加上的菜单项目
     
    直接指定核心开机
    先到cfg配置文件中取得需要制作的核心菜单   然后将它复制的奥40_custom
    再到40_custom当中根据需求修改即可
    通过chainloader的方式移交Loader控制权
    将控制权交给下一个boot loader而已   两个参数    一个是前往的boot sector所在的分区代号   另一个是设定chainloader在分区的boot sector上    
    举例   假设系统分区在/dev/sda1    有且仅有一个硬盘  那么要grub将控制权交给 windows的loader   只需要
    menuentry "windows"{
    insmod chain 载入chainloader的模块
    insmod ntfs 加载windows的文件系统模块
    set root=(hd0,1) 指定启动的分区 
    chainloader +1 到boot sector   将loader软件读取出来
    }
     
     
    initramfs的重要性与建立新的initramfs文件
    需要initramfs的时刻为
    根目录所在的磁盘为sata   usb 或者 scsi等
    根目录所在文件系统为lvm  raid等特殊格式
    根目录所在文件系统为非传统linux认识的文件系统时候
    其他必须要在核心载入时提供的模块
    一般发行版提供initramfs文件  但是如果有特殊的需要重做initramfs文件,可以使用dracut   /   mkinitrd来处理    
     
    语法:dracut [-fv] [--add-drivers 列表] initramfs文件名   核心版本
     
    测试与安装grub2
    grub2-install [--boot-directory=DIR]  INSTALL_DEVICE
    DIR为实际的目录   grub2-install会默认将所有的文件都复制的奥/boot/grub2/*   如果想要复制到其他目录与装置区  就要用到后面的参数
    举例     grub2-install /dev/vda
     
    df -T | grep -i xfs
    查看系统中是否有xfs文件系统
    grub2-install --skip-fs-probe /dev/vda4  
     强制安装
    grub2-install --force  --recheck --skip-fs-probe   /dev/vda4
    如此就将grub2这个主程序安装到/dev/vda4以及MBR中
    总结
    a 如果从其他的boot loader转成grub2的时候   得先使用grub2-install 来安装grub2
    b 如果安装到分区  需要加上额外的参数才能顺利安装上
    c 开始编辑/etc/default/grub以及/etc/grub.d/*   这几个重要的配置文件
    d 使用grub2-mkconfig -o /boot/grub2/grub.cfg来建立开机的配置文件
     
  • 相关阅读:
    数据结构与算法_20 _ 散列表(下):为什么散列表和链表经常会一起使用?
    数据结构与算法_19 _ 散列表(中):如何打造一个工业级水平的散列表?
    数据结构与算法_17 _ 跳表:为什么Redis一定要用跳表来实现有序集合?
    数据结构与算法_18 _ 散列表(上):Word文档中的单词拼写检查功能是如何实现的?
    数据结构与算法_16 _ 二分查找(下):如何快速定位IP对应的省份地址
    数据结构与算法_15 _ 二分查找(上):如何用最省内存的方式实现快速查找功能
    线程池ThreadPoolExecutor源码详解
    用信鸽来解释 HTTPS
    并发集合类之图解CopyOnWriteArrayList
    认识RabbitMQ从这篇文章开始
  • 原文地址:https://www.cnblogs.com/dongguolei/p/7902599.html
Copyright © 2020-2023  润新知