内核

内核设计流派

  • 单内核设计:把所有的功能集成与同一个程序;比如Linux
  • 微内核设计:每种功能使用一个单独的子系统实现;比如Windows,Solaris

Linux内核特点

  • 支持模块化:.ko(ketnel object)
  • 支持模块化运行时动态装载或卸载;
  • 组成部分:
    • 核心文件:/boot/vmlinuz-VERSION-release
    • ramdisk:启动时划出内存中的某一空间当磁盘用,不是必须的
      • CentOS 5:/boot/vmlinuz-VERSION-release.img
      • CentOS 6,7,8:/boot/initramfs-VERSION-release.img
    • 模块文件:/lib/modules/VERSION-release

CentOS7启动流程

1.POST加电自检

  • 检测硬件设备是否能够正常运行(主板上ROM芯片上的BIOS程序实现)
  • BIOS程序能够检测CPU/Memory/硬盘/IO设备是否能够正常运行
  • 如果是个人PC机,还会检测显示器
  • 只要通电,CPU就会自动去加载ROM芯片上的BIOS程序,实现硬件设备初始化

2.Boot Sequence(选择启动设备以加载MBR)

  • 选择要启动的硬件设备,选择之后就开始读取这个设备位于MBR头里的BootLoader
  • 根据BIOS中对启动顺序的设定,依次扫描引导设备
  • 然后第一个被扫描到的具有引导程序(BootLoader)的设备会成为要启动的引导设备

3.加载BootLoader

  • 功能:

    • BIOS通过读取并执行启动设备中的BootLoader
    • BootLoader会提供一个菜单给用户,让用户去选择要启动的系统或者不同的内核版本
    • 用户将内核版本加载至MBR中的特定程序,接着将在RAM中解压展开,将系统控制权
      交由给内核
  • GRUB阶段: 是BootLoader中的一种,主要功能是实现加载内核

    • stage1: 用于加载stage1.5阶段,目的是为了识别驱动stage2 (/boot/)所在分区的文件系统
    • stage1.5 :加载stage2阶段所在分区的文件系统驱动,让stage1中BootLoader能识别stage2所在分区的文件系统
    • stage2: 存放在磁盘分区上,具体存放在/boot/grub目录中,主要用于加载内核文件以及ramdisk这个临时根文件系统

4.Kernel初始化

  • 探测可识别的所有硬件设备;
  • 加载硬件的驱动程序
  • 以只读方式挂载根文件系统
  • 运行用户空间中的第一个应用程序: /sbin/init(/sbin/systemd)(进程号为0)

5.管理用户空间服务进程

  • init初始化程序会根据系统上的配置文件执行一系列操作
    (Centos5/6/7上关于Init的配置文件不一样,但是总体的启动流程是不变的)
  • 根据Init配置文件设置默认运行级别
    CentOS7: 初始化Init程序是systemd;配置文件为:
    a) /usr/lib/systemd/system/* 
    b) /etc/systemd/system/* 
  • Note: Centos6 –> Centos7 Init管理程序的变化-> systemd (并行)

总结:

  1. 加电自检
    检查服务器硬件是否正常

  2. MBR引导

    读取磁盘的MBR存储记录信息,引导系统启动

  3. grup菜单
    选择启动的内核/进行单用户模式重置密码

  4. 加载系统内核信息
    可以更好的使用内核控制硬件

  5. 系统的第一个进程运行起来 systemd (并行)
    服务启动的时候,同时一起启动

  6. 读取系统启动文件
    /etc/systemd/system/default.target

  7. 读取系统初始化文件
    /usr/lib/systemd/system/sysinit.target

  8. 使服务可以开机自启动
    /etc/systemd/system 加载此目录中的信息,实现服务开机自动启动

  9. 运行mingetty进程
    显示开机登录信息界面

CentOS7之Systemd特性

新特性

  • 系统引导实现服务运行并启动
  • 按需激活进程
  • 系统服务状态快照
  • 基于依赖关系定义服务控制逻辑

核心概念:Unit

unit由其相关配置文件进行标识和配置,文件中主要包含系统服务、监听socket、保存的系统快照以及其他与init相关的配置信息都会保存至:

  • /usr/lib/systemd/system/ 每个服务最主要的启动脚本设置,类似于之前的/etc/init.d/
  • /run/systemd/system/ 系统执行过程中所产生的服务脚本,比上面目录优先运行
  • /etc/systemd/system/ 管理员建立的执行脚本,类似于/etc/rcN.d/Sxx的功能,比上面目录优先运行

Unit类型

systemctl -t help 查看unit类型

  1. service unit: 文件扩展名为.service;用于定义系统服务
    [root@test ~]# cat /usr/lib/systemd/system/chronyd.service
  2. Target unit: 文件扩展名为.target;用于模拟实现”运行级别”
    [root@test ~]# cat /usr/lib/systemd/system/sockets.target
  3. Device unit: 文件扩展名为.device;用于定义内核标识的设备
  4. Mount unit: 文件扩展名为.mount; 用于定义文件系统挂载点
  5. socket unit:文件扩展名为.socket;用于标识进程间通信的socket文件
  6. Snapshot unit: 文件扩展名为.snapshot;用于管理系统快照
  7. Swap unit: 文件扩展名为.swap;用于标识swap设备
  8. Automount unit: 文件扩展名为..automount;管理自动挂载的文件系统
  9. Path unit: 文件扩展名为.path; 用于定义文件系统中的一个文件或目录

关键特性

  • 基于socket的激活机制: socket与服务程序分离
  • 基于device的激活机制: ….
  • 基于path的激活机制
  • 基于bus的激活机制
  • 系统快照,保存各init的当前状态信息于持久化存储设备中
  • 向后兼容 sysv/init 脚本

不兼容

  • systemctl的命令是固定不变的
  • 非由systemd启动的服务,systemctl无法与之通信

运行级别:0-6

  • 0: 关机
  • 6:重启
  • 1:单机用户
  • 2:多用户,无网络连接
  • 3:无图形化,多用户,网络连接
  • 5:图形化,多用户,网络连接

1zhBPP.png

  • target units:

    • unit配置文件:.target
    • ls /usr/lib/systemd/system/*.targe
    • systemctl list-unit-files --type target --all
  • 运行级别:

    • 0 ==> runlevel0.target, poweroff.target 关机
    • 1 ==> runlevel1.target, rescue.target 单用户模式
    • 2 ==> runlevel2.target, multi-user.target 多用户,无网络连接
    • 3 ==> runlevel3.target, multi-user.target 多用户,有网络连接
    • 4 ==> runlevel4.target, multi-user.target 保留
    • 5 ==> runlevel5.target, graphical.target 图形化,多用户,有网络连接
    • 6 ==> runlevel6.target, reboot.target 重启
  • 查看依赖性:
    systemctl list-dependencies graphical.target

  • 级别切换:init N ==> systemctl isolate name.target

    • systemctl isolate multi-user.target
      注:只有/lib/systemd/system/*.target文件中AllowIsolate=yes 才能切换(修改文件需执行systemctl daemon-reload才能生效)
  • 查看target:

    • runlevel
    • who -r
    • systemctl list-units --type target
  • 获取默认运行级别:

    • /etc/inittab ==> systemctl get-default
  • 修改默认级别:

    • /etc/inittab ==> systemctl set-default name.target

    • systemctl set-default multi-user.target

    • ls –l /etc/systemd/system/default.target

systemctl命令

用于管理系统服务

[root@test ~]# systemctl --help
systemctl [OPTIONS…] {COMMAND} …

  • 启动服务: systemctl start name.service
  • 重启服务: systemctl restart name.service
  • 停止服务: systemctl stop name.service
  • 开机自启: systemctl enable name.service
  • 开机不自启: systemctl disable name.service
  • 禁止某服务设定开机自启:systemctl mask name.service
  • 取消此禁止:systemctl unmask name.service
  • 重载或者重启服务: systemctl reload-or-restart name.service
  • 条件式重启:systemctl try-restart name.service
  • 重载或者条件式重启服务: systemctl try-reload-or-restart name.service
  • 查看服务状态: systemctl status name.service
    • loaded Unit配置文件已处理
    • active(running) 一次或多次持续处理的运行
    • active(exited) 成功完成一次性的配置
    • active(waiting) 运行中,等待一个事件
    • inactive 不运行
    • enabled 开机启动
    • disabled 开机不启动
    • static 开机不启动,但可被另一个启用的服务激活
  • 查看某个服务当前激活与否状态: systemctl is-active chronyd.service
  • 查看某个服务是否开机启动: systemctl is-enabled chronyd.service
  • 查看所有已经激活的服务: systemctl list-units --type service
  • 查看所有服务:systemctl list-units --type service --all
  • 列出失败的服务:systemctl --failed --type=service
  • 列出依赖的单元:systemctl list-dependencies name.service

运行级别相关操作:

  • 查看运行级别: runlevel == systemctl list-units --type target
  • 切换运行级别: init N == sytemctl isolate name.target
  • 获取默认运行级别: systemctl get-default
  • 设置默认运行级别: systemctl set-default TARGET.target
  • 切换紧急救援模式: systemctl rescue
  • 切换救援模式: systemctl emergency 真正的最简洁的系统启动模式

其他常用命令:

service unit file:

文件通常由三部分组成:

  • [Unit]:定义与Unit类型无关的通用选项;用于提供unit的描述信息、unit行为及依赖关系等
  • [Service]:与特定类型相关的专用选项;此处为Service类型
  • [Install]:定义由”systemctl enable”以及”systemctl disable”命令在实现服务启用或禁用时用到的一些选项

Unit段的常用选项:

  • Descrlption :描述信息;意义性描述;
  • After :定义unit的启动次序;表示当前unit应该晚于哪些unit启动;其功能与Before相反;
  • Requles :依赖到的其它units ;强依赖,被依赖的units无法激活时,当前unit即无法激活;
  • Wants :依赖到的其它units ;弱依赖;
  • Conflicts :定义units间的冲突关系;

其余的自行百度

示例

  • 显示所有单元状态
    systemctl 或 systemctl list-units

  • 只显示服务单元的状态
    systemctl --type=service

  • 显示sshd服务单元
    systemctl status sshd.service

  • 验证sshd服务当前是否活动
    systemctl is-active sshd

  • 启动,停止和重启sshd服务
    systemctl start sshd.service
    systemctl stop sshd.service
    systemctl restart sshd.service

  • 重新加载配置
    systemctl reload sshd.service

  • 列出活动状态的所有服务单元
    systemctl list-units --type=service

  • 列出所有服务单元
    systemctl list-units --type=service --all

  • 查看服务单元的启用和禁用状态
    systemctl list-unit-files --type=service

  • 列出失败的服务
    systemctl --failed --type=service

  • 列出依赖的单元
    systemctl list-dependencies sshd

  • 验证sshd服务是否开机启动
    systemctl is-enabled sshd

  • 禁用network,使之不能自动启动,但手动可以
    systemctl disable network

  • 启用network
    systemctl enable network

  • 禁用network,使之不能手动或自动启动
    systemctl mask network

  • 启用network
    systemctl unmask network

启动排错

  • 文件系统损坏
    先尝试自动修复,失败则进入emergency shell,提示用户修复
  • 在/etc/fstab不存在对应的设备和UUID
    等一段时间,如不可用,进入emergency shell
  • 在/etc/fstab不存在对应挂载点
    systemd 尝试创建挂载点,否则提示进入emergency shell.
  • 在/etc/fstab不正确的挂载选项
    提示进入emergency shell

破解CentOS7的root口令

方法一

  1. 启动时任意键暂停启动
  2. 按e键进入编辑模式
  3. 将光标移动linux16开始的行,添加内核参数rd.break
  4. 按ctrl-x启动
  5. mount –o remount,rw /sysroot
  6. chroot /sysroot
  7. passwd root
  8. touch /.autorelabel
  9. exit
  10. reboot

方法二

  1. 启动时任意键暂停启动
  2. 按e键进入编辑模式
  3. 将光标移动linux16开始的行,改为rw init=/sysroot/bin/sh
  4. 按ctrl-x启动
  5. chroot /sysroot
  6. passwd root
  7. touch /.autorelabel
  8. exit
  9. reboot

修复GRUB2

  • GRUB“the Grand Unified Bootloader”
    引导提示时可以使用命令行界面
    可从文件系统引导
  • 主要配置文件 /boot/grub2/grub.cfg
  • 修复配置文件
    grub2-mkconfig > /boot/grub2/grub.cfg
  • 修复grub
    grub2-install /dev/sda BIOS环境
    grub2-install UEFI环境
  • 调整默认启动内核
    vim /etc/default/grub
    GRUB_DEFAULT=0