系统启动和内核管理

linux的组成

  kernel实现进程管理,内存管理,网络管理,驱动程序,文件系统,安全功能等功能

  rootfs包括程序和glibc库:简称根文件系统

    程序:二进制执行文件

    库:函数集合,function,调用接口(头文件负责描述)

  内核设计流派

    宏内核(monolithic kernel):又称单内核和墙内核,unix,linux

    把所有系统服务当放到内核里,所有功能集成于同一个程序,分层实现不同功能,系统庞大复杂,linux其实在单内核实现了模块化,也就相当于吸收了微内核的优点

    微内核(micro kernel):windows,solaris,harmonyOS

    简化内核功能,在内核之外的用户态尽可能多地实现系统服务,同时加入相互之间的安全保护,每种功能使用一个单独子系统的实现,将内核功能移到用户空间,性能差

  centos6启动流程

    1.加载BIOS的硬件信息,获取第一个启动设备

    2.读取第一个启动设备MBR的引导加载程序(grub)的启动信息

    3.加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备

    4.核心执行init程序,并获取默认的运行情况

    5.init程序执行/etc/rc.d/rc.sysinit文件,重新挂载根文件系统

    6.启动核心的外挂模块

    7.init执行运行的各个批处理文件(script)

    8.init执行/etc/rc.d/rc.local

    9.执行/bin/login城西,等待用户登录

    10.登录之后开始以shell控制主机

  硬件启动post

    post:power-on-self-test,加电自检,是BIOS功能的一个主要部分,负责完成对CPU,主板,内存,硬盘子系统,显示子系统,串并行接口,键盘等硬件情况的检测

    主板的ROM:BIOS,Basic  Input  and output  system,保存着有关计算机系统最重要的基本输入输出程序,系统信息设置,开机加电自检程序和系统启动自举程序等

    主板的RAM:CMOS互补金属化物半导体,保存各项参数的设定,接次序查找引导设备,第一个有引导程序的设备为本次启动设备

   启动加载bootloader

    grub功能和组成

    bootloader:引导加载器,引导程序

    windows,ntloader,仅是启动OS

    Linux:功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本,把用户选定的内核装载到内存中的特定空间中,解压,展开,并把系统控制权移交到内核

   Linux的bootloader

    LILO:linux  loader,早期的bootloader,功能单一

    GRUB:grand unified  bootloader,centos5,6grub0.97:grub  legacy,centos7以后使用grub2.02

    GRUB启动阶段

      primary   boot  loader:

        1st   stage:MBR的前446个字节

        1.5st stage:MBR之后的扇区,让stage1中的bootloader能识别到stage2所在的分区上的文件系统

     secondary boot loader:2nd stage,分区文件/boot/grub/  

     centos6  grub安装

      grub-install  /dev/DISK 

    grub legacy管理

      配置文件:/boot/grub/grub.conf     <------   /etc/grub.conf

      stage2及内核等通常放置于一个基本磁盘分区

      grub  legacy  功能:

      1.提供启动菜单,并提供交互式接口

        a.内核参数

        e.编辑模式,用于编辑菜单

        c.命令模式,交互式接口

      2.加载用户选择的内核和操作系统

        允许传递参数给内核

        可隐藏启动菜单

      3.为菜单提供保护机制

        为编辑启动菜单进行认证

        为启用内核或操作系统进行认证

   grub的命令接口

      help:获取帮助列表

      help  keyword  :详细帮助信息

      find   (hd##)/path/to/somefile

      root  (hd##

      kernel    /path/to/somefile:  设定本次启动的内核文件,额外还可以添加许多内核支持使用的cmdline参数

      initrd   /path/to/initRAMFS_FILE:设定为选定的内核提供额外文件的ramdisk

      boot:引导启动选定的内核

      /proc/cmdline 内核参数

  grub legacy识别硬盘设备

    (hd##

     hd#:磁盘编号,用数字表示,从0开始编号

     #:分区编号,用数字表示,从0开始编号

      实例(hd0,0)表示第一块硬盘,到第一个分区

     

  加载kernel

   kernel自身初始化过程

    RAMDISK   内存盘,虚拟硬盘

    1.探测可识别到的所有硬件设备

    2.加载硬件驱动程序(借助于ramdisk加载驱动)   

    3.以只读方式挂载根文件系统

    4.运行用户空间的第一个应用程序:/sbin/init

   linux内核特点:

     支持模块化:.ko(内核模块),如文件系统,硬件驱动

     支持内核模块的动态加载和卸载

    ramdisk文件的制作:

     mkinitrd命令

      mkinitrd  /boot/initramfs-$(uname -r).img $(uname -r)

     dracut命令

      dracut   /boot/initramfs-`uname -r`.img   `uname -r`

  init初始化

   systemd:systemd,centos7

    配置文件:/etc/systemd/system

    /usr/lib/systemd/system

    运行级别

    为系统运行或维护等目的而设定;0-6:7个级别,一般用3,5做为默认级别

      0:关机

      1:单用户模式(root自动登录)single,维护模式

      2.多用户模式,启动网络功能,但不会启动NFS,维护模式

      3.多用户模式,正常模式,交互界面

      4.预留级别,可同3级别

      5.多用户模式,正常模式,图形界面

      6.重启

    查看级别:

      who   -r

      runlevel

    /etc/rc.d/rc    控制服务脚本的开机自启动运行

    说明:

      rc N ---> 意味着读取/etc/rc.d/rcN.d/

      K:k##:##运行次序;数字越小,越先运行,数字越小的服务,通常为依赖到别的服务

      S:s##:##运行次序;数字越小,越先运行,数字越小的服务,通常为被依赖到的服务

    配置服务开机启动

    chkconfig命令管理服务

      --list  查看所有级别的启动或关闭设定情形:

      --add  添加服务

      --del  删除服务

    ntsysv

    sync  立即写入磁盘

  非独立服务

    服务分为独立服务和非独立服务

    静态(Transient)服务被超级守护进程所管理,也成为非独立服务

    进入的请求首先被xinetd代理

    配置文件

      /etc/xinetd.conf

      /etc/xinetd.d/<service>

    用chkconfig控制非独立服务开机启动

     chkconfig   tftp   on

    开机启动文件rc.local

    /etc/rc.local

    /etc/rc.d/rc.local

    注意:正常级别下,最后启动一个服务599local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向了/etc/rc.d/rc.local脚本

    不便或不需写为服务脚本放置于/etc/rc.d/init.d目录,且邮箱开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中

    /etc/rc.d/rc.local在指定运行级别脚本后运行

    注意:默认ubuntu无/etc/rc.local文件,可以创建此脚本文件并添加执行权限,rc.local的首行必须有shebang机制

    Centos启动过程总结

      post

      boot   loader

      vmlinux(initramfs.img)

      rootfs

      /sbin/init

      /etc/inittab     设置默认运行级别

      /etc/rc.d/rc.sysinit 运行系统初始脚本完成系统初始化

      /etc/rc#.d/sxxxx   启动需要启动服务关闭对应下需要关闭的服务

      /etc/rc.d/rc.local

      设置登录终端

  /proc   目录和内核参数管理

    /proc目录:内核把自己的内部状态信息及统计信息,以及可配置参数通过proc伪文件系统加以输出

      内核参数:

      只读:只用于输出信息

      可写:可接受用户指定”新值“来实现对内核某功能或特性的配置

    sysctl命令   查看或设定此目录中诸多参数

       -w   临时设置某参数

     -p 读取配置文件设置参数

     查看指定参数当前值

      sysctl  /path/to/conf_file

     -a  查看所有生效参数

    常用的内核参数

      net.ipv4.ip_forword

      net.ipv4.icmp_echo_ignore_all     禁止ping

      net.ipv4.ip+nonlocal_bind  #允许应用程序可以监听本地不存在的IP

      vm.drop_caches  3  清除缓存

      fs.file-max=#####        全局打开文件的最大数

      vm.overcommit_memory = 0      

      0表示内核将检查是否有足够可用内存供应用进程使用,如果有足够的可用内存·,内存申请允许,否则内存申请失败,并把错误返回给应用进程

      1表示内核允许分配所有的物理内存,而不管当前的内存状态如何

      2表示内核允许分配超过所有物理内存和交换空间总和的内存

      vm.swappiness  = 10

      禁用IPv6

      net.ipv6.conf.all.disable_ipv6 = 1

      net.ipv6.conf.default.disable_ipv6 = 1

    /sys目录

    使用sysfs文件那系统,为用户使用的伪文件系统,输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的设定信息,有些参数是可以修改的,用于调整硬件工作特性

    udev通过此路径下输出的信息动态为各设备创建所需的设备文件,udev是运行用户空间程序

    专用工具:udevadmin,hotplug

    udev为设备创建设备文件时,会读取其事先定义好的规则文件,一般在/etc/udev/rules.d及/usr/lib/udev/rules.d/目录下

    内核版本

     运行中的内核

      uname命令:print  system infomation

      -n  显示节点名称

      -r  显示version

      -a  显示所有信息

    内核模块命令

      lsmod命令:

        显示由核心已经装载的内核模块

        显示的内容来自于:/proc/modules文件

    modinfo命令

      功能:管理内核模块

      -n  只显示模块文件路径

      -p  显示模块参数

      -a  作者

      -d  描述

   编译内核准备:

     1. 准备好开发环境

     2. 获取目标主机上硬件设备的相关信息

     3. 获取目标主机系统功能的相关信息,例如:需要启动相应的文件系统

     4. 获取内核源代码包

  systemd特性   

    systemd:从centos7版本之后开始用systemd实现init进程,系统启动和服务守护进程管理器,负责在系统启动或运行时,激活系统资源,服务进程和其他进程

    systemd新特性

     1.系统引导时实现服务并启动

     2.按需启动守护进程

     3.自动化的服务依赖关系管理

     4.同时采用socket式D-Bus总线式激活服务

     5.socket与服务程序分离

     6.向后兼容sysv   init脚本

     7.使用systemctl命令管理,systemctl命令固定不变,不可扩展,非由systemd启动的服务

     8.系统状态快照

     systemd核心概念:unit(单元)

       查看unit类型:systemctl -t help

        service unit:文件扩展名为.service,用于定义系统服务

        socket unit:.socket,定义进程间通信用的socket文件,也可在系统启动时,延迟启动服务,实现按需启动

        target unit:文件扩展名为.target,用于模拟实现运行级别

        device unit:.device,用于定义内核识别的设备

        mount unit:.mount,定义文件系统挂载点

        snapshot unit:snapshot,管理系统快照

        swap unit:.swap,用于表示swap设备

        automount unit:.automount,文件系统的自动挂载点

        path unit:path,用于定义文件系统中的一个文件或目录使用,常用于当文件系统变化时,延迟激活服务,如:spool目录

      unit的配置文件

  /usr/lib/systemd/system 每个服务最主要的启动脚本设置,类似于之的/etc/init.d/

  /lib/systemd/system  ubuntu的对应目录

  /run/systemd/system  系统执行过程中所产生的服务脚本,比上面目录有限运行

  /etc/systemd/system  管理员建立的执行脚本,类似于/etc/rc#.d/sxx的功能。比上面目录优先运行

    systemctl管理系统服务service unit

    命令:

     systemctl command name.service

     start | stop |  restart | status |  

           mask     禁止自动和手动启动

     unmask 取消禁止

     is-active  查看某服务当前激活与否的状态 

     list-units  查看所有已经激活的服务

     list-units --type -all    查看所有服务

     enable  设定某服务开机自启,相当于chkconfig   name on

     disable  设定某服务开机禁止启动,相当于chkconfig   name off

     list-unit-files  --type  查看所有服务的开机自启状态,相当于chkconfig --list

     is-enabled 查看服务是否开机自启

     列出失败的服务  --failed

     enable     --now    开机自启

     disable --now    停止自启

     list-dependencies    查看服务的依赖关系

     systemctl kill unitname  杀掉进程

     服务状态

      loaded  unit配置文件已处理

      active(running)一次或多此持续处理的运行

      active(exited)成功完成一次性的配置

      active(waiting)运行中,等待一个事件

      inactive  不运行

      enabled  开机启动

      disabled  开机不启动

      static  开机不启动,但可被另一个启动的服务激活

      indirect  重定向到别处

   service   unit文件格式  

       /etc/systemd/system:系统管理员和用户使用

     /usr/lib/systemd/system:发行版打包者使用

    unit格式说明:

      以“#”开头的行后面的内容会被认为是注释

      相关布尔值,1,yes,on,true都是开启,0,no,off,false都是关闭

      时间单位都是秒,所以要用毫秒(ms)分钟(m)等须显示说明

    service unit file文件通常由三部分组成

     unit:定义与unit类型无关的通用选项,用于提供unit的描述信息,unit行为及依赖关系等

     service:与特定类型相关的专用类型,此处为service类型

     install:定义由“systemctl  enable”以及“systemctl disable”命令在实现服务启用或禁用时用到的一些选项

     unit段的常用选项

      description:描述信息

      after:定义unit的启动次序,表示当前unit应该晚于哪些unit启动,其功能与before相反

      requires:依赖的其他units,强依赖,被依赖的units无法激活时,当前unit也无法激活

      wants:依赖到的其他units,弱依赖

      conflicts:定义units间的冲突关系

     service段的常用选项:

      Type:定义影响Ecerstart及相关参数的功能的unit进程启动类型

         ·  simple:默认值,这个daemon主要由Exerstart接的指令串启动,启动后常驻于内存中

       ·   forking:由Exerstart启动的程序透过spawn延申出其他子进程来作为此daemon的主要服务,原生父进程在启动后就会终止

       ·   oneshot:与simple类似,不过这个程序在工作完毕后就结束了,不会常驻在内存中

       ·   dbus:与simple类似:但这个daemon必须要在取得一个D-Bus的名称后,才会继续运作,因此通常也要同时设定BusNname=才行

       ·    notify:在启动完成后会发送一个通知消息,还需要配合notifyAccess来让systemd接受消息

       ·    idle:与simple类似,要执行这个daemon必须要所有的工作都顺利完毕后才会执行,这类的daemon通常时开机到最后才会执行即可的服务

    Environmenfile:环境配置文件

    Execstart:指明启动unit要运行命令或脚本的绝对路径

    Execstartpre:Execstart前运行

    ExecstartPost:Execstart后运行

    Execstop:指明停止unit要运行的命令或脚本

    Restartsec:设置在重启服务(restart=)前暂停多长时间,默认值是100毫秒(100ms),如果未指定时间单位,那么将重视以秒为单位,例如设为”20“等价于设为“20s”。

    Privatetmp:设定为yes时,会在生成/tmp/systemd-private-UUID-NAME.service-xxxxx/tmp/目录

    Install段常用的选项:

     alias:别名,可使用systemctl  command alias.service

     requiredBy:被那些units所依赖,强依赖

     wantedBy:被哪些units所依赖,弱依赖

     Also:安装本服务的时候还要安装别的相关服务

    注意:对于新建的unit文件,或者修改了的unit文件,要通知systemd重载此配置文件,而后可以选择重启

      systemctl  daemon-reload     重新加载systemd管理器配置

    运行级别

    taget  units:相当于centos 6之前的runlevel,unit配置文件;.target

     查看依赖性:systemctl    list-dependencies  name.target

     级别切换:相当于init N

      systemctl  isolate name.target

     进入默认target

      systemctl default

     注意:只有/lib/systemd/system/*target文件中Allowlsolate=yes才能切换(修改文件需执行systemctl  daemon-reload才能生效)

     获取默认运行级别,相当于查看/etc/inittab

  设置内核参数  

    设置内核参数,只影响当此启动

      启动时,到启动菜单,按e键,找到linux开头的行后添加systemd.unit=desired.target

   centos7之后版本引导顺序

     1.UEFI或BIOS初始化,运行POST开机自检

     2.选择启动设备

     3.引导装载程序,centos7是grub2加载装载程序的配置文件

         /etc/grub.d/

         /etc/default/grub

         /boot/grub2/grub.cfg

     4.加载initramfs驱动模块

     5.加载内核选项

     6.内核初始化,centos7使用systemd代替init

     7.执行initrd.target所有单元,包括挂载/etc/fstab

     8.从initramfs根文件系统切换到磁盘根目录

     9.systemd执行默认target配置,配置文件/etc/systemd/system/default.target

     10.systemd启动sysinit.target初始化系统及basic.target准备操作系统

     11.systemd执行multi-user.target下的本机于服务器服务

     12.systemd执行multi-user.target下的/etc/rc.d/rc.local

     13.systemd执行multi-user.target下的getty.target及登录服务

     14.systemd执行graphical需要的服务

    通过systemd-analyze工具可以了解启动的详细过程          

 

posted @   家购诗  阅读(11)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示