Linux包管理器

  • RPM管理:安装软件包的工具
    • rpm -ivh package_file
    • -i:install安装
    • -v:打印调试信息
    • -h:包档如果没有破解,则打印50个破折号
  • 常用参数
    • —test:测试安装,但不真正执行安装过程:dry run模式
    • —nodeps:忽略依赖关系
    • —replacepkgs:重新安装
    • —nosignnature:不检查来源合法性
    • —nodigest:不检查包的完整性
    • —noscripts:不执行程序包脚本片段
  • 升级
    • rpm -Uvh 包名
    • rpm -Fvh 包名,旧安装包存在才进行升级操作
  • 查询,-q
    • -a:查询所有软件包
    • -f:查询指定的文件由哪个程序包安装生成
    • -l:查询指定的程序文件安装后生成的所有文件
    • —whatprovides:查询指定的工具是由哪个包提供
    • —whatrequires:查询所指定的工具被哪些包依赖
    • -c:查询程序的配置文件
    • -d:查询程序的文档
    • -i:信息
    • —script:查询程序包自带的脚本片段
    • -R:查询指定的包所依赖的包
    • —provides:列出指定程序包所提供的包
  • 卸载
    • rpm -e 包名
  • 校验
    • rpm -V 包名
    • —nofiledigest 不验证文件摘要
    • —nofiles 不验证软件包中文件
    • —nodeps 不验证包依赖
    • —noscript 不执行验证脚本
  • 常用参数组合

    • -qa:显示当前系统中以RPM方式安装的所有软件列表
    • -qi:查看指定软件包的名称、版本、许可协议、用途描述等详细信息
    • -ql:显示指定的软件包在当前系统中安装的所有目录、文件列表
    • -qf:查看当前指定的文件或目录是由哪个软件包所安装的

      yum包管理工具 ,自动地解决包依赖关系(自动安装依赖包)

  • 服务端

    • 阿里源
    • 163源
    • ……
    • 自建
  • 客户端

    • 配置文件,/etc/yum.conf,为所有仓库提供公共配置
    • 配置文件,/etc/yum.repos.d/*.repo,为仓库的指定提供配置
    • 常用用法
      • yum repolist [all | enabled | disabled],显示仓库列表
      • yum list [all | glob_exp1],显示程序包
      • yum update 包名,升级包
      • yum downgrade 包名,降级
      • yum remove | erase 包名,卸载
      • yum info 包名,查看程序包信息
      • yum provides | whatprovides feature ,查看指定的特性,某文件是由哪个程序包提供的
      • yum makecache ,构成缓存
      • yum clean [all | 包名] ,清理缓存
      • yum search 字符串 ,一指定的关键字搜索程序包名及summary信息
      • yum history [info | list | summary……]
    • 常用参数
      • -y:自动回答yes
      • -q:静默模式,没有输出信息
      • —nogpgcheck:禁止进行gpgcheck
      • —disablerepo=repoid:临时禁制此处指定的repo
      • —enablerepo=repoid:临时启用此处指定的repo
      • —noplugins:禁止所有插件
    • 库配置文件
      1. [root@server ~]# cat /etc/yum.repos.d/CentOS-Base.repo
      2. [base] # 仓库ID
      3. name=CentOS-$releasever - Base #仓库名称
      4. mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
      5. #baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
      6. gpgcheck=1
      7. gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
      8. #released updates

      磁盘管理

  • fdisk命令,对于一块硬盘来说最多管理15个分区

    • -l:查询分区表信息
    • -s<分区> : 给出分区大小(块数)
    • 子命令:
      • p:print,显示已有分区;
      • n:new,创建
      • d:delete,删除
      • w:write,写入磁盘并退出
      • q:quit,放弃更新并退出
      • m:获取帮助
      • l:列表所分区ID
      • t:调整分区类型
  • parted命令,不建议使用,它任何操作都是实时生效,所以需要小心使用
    • 用法:parted [选项]… [设备 [命令 [参数]…]…]
    • parted /dev/sdb mklabel gpt|msdos
    • parted /dev/sdb print
    • parted /dev/sdb mkpart primary 1 200 (默认M)
    • parted /dev/sdb rm 1 parted –l
  • 查看分区

    • 查看内核是否已经识别新的分区:
    • cat /proc/partations

    • 通知内核重新读取硬盘分区表:
    • partx ‐a /dev/DEVICE

    • partprobe [/dev/DEVICE]

      文件系统管理

  • 分区方式:

    • MBR: 使用32位表示扇区数,分区不超过2T ,按柱面进行分区,4个主分区;3主分区+1扩展(N个逻辑分区)。
    • GPT:支持128个分区,使用64位,使用128位UUID(Universally Unique Identifier) 表示磁盘和分区 GPT分区
    • image.png

表自动备份在头和尾两份

  • 文件系统:ext2,3,4,xfs,btrfs,reiserfs,jfs…
  • swap:交换分区
  • 光盘:iso9660
  • Windows:fat32,ntfs
  • 网络文件系统:nfs,cifs
  • 分布式文件系统:ceph,Glutsterfs,moosefs
  • 分类
    • 根据是否支持journal功能
      • 日志型文件系统:ext3,4 ,xfs
      • 非日志型文件系统:ext2,vfat
    • 文件系统的组成部分
      • 内核中的模块:ext4,xfs,vfat
      • 用户空间的管理工具:mkfs,ext4,xfs,mkfs.vfat
    • Linux虚拟文件系统:VFS
  • mkfs命令
    • mkfs
      • image.png
    • mke2fs命令:ext系列文件系统专用管理工具
      • image.png
    • mkswap命令,创建交换分区
      • image.png
    • 其他工具:blkid,e2label
      • blkid:块设备属性信息查看
      • e2label:管理ext系列文件系统的label
    • 文件系统检测,fsck、e2fsck
      • image.png
  • 挂载:将一个设备挂接到另一个已经存在的目录上。我们要访问存储设备中的文件,必须将文件所在的分区挂载到一个已经存在的目录上。
  • 卸载:解除关联关系的过程
  • Note:挂载点下的所有原文件在挂载后会自动隐藏掉,所以通常情况下保证挂载点为空。
  • mount命令
    • -a:挂载/etc/fstab文件中定义好的挂载方式,该文件是开机自动挂载的配置文件
    • -t:指明要挂载设备上的文件系统类型
    • -r:以只读方式挂载
    • -w:读写方式挂载
    • -n:不更新/etc/mtab
    • -L “卷标”:以卷标指定挂载设备
    • -U “UUID”:以指定的UUID挂载设备
    • -B:绑定目录到另一个目录上
  • 相关命令

    • 内存空间使用状态:
    • free [Option]
    • ‐m:以MB为单位
    • ‐g:以GB为单位
    • 文件系统空间占用等信息的查看工具:
    • df:
      • ‐h:human‐reable
      • ‐i:inodes instead of blocks
      • ‐p:以Posix兼容的格式输出
    • 查看某目录总体空间占用状态
    • du [option] …DIR
      • ‐h:human‐readable
      • ‐s:summary
    • dd命令:dd ‐ convert and copy a file
    • dd if=/PATH/FROM/SRC of=/PATH/TO/DEST
      • bs=#; block size,复制单元大小
      • count=#;复制多少个bs;
    • 磁盘的拷贝:
    • dd if=/dev/sda of=/dev/sdb
    • 备份MBR
    • dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1
    • 破坏MBR中的bootloader
    • dd if=/dev/zero of=/dev/sda bs=256 count=1
    • 两个设备设备:
      • /dev/null:数据黑洞
      • /dev/zero:吐零机

        RAID技术

  • 实现方式

    • 硬raid:通过硬件支持raid工作方式
      • 外接式磁盘阵列:通过扩展卡提供适配功能
      • 内接式raid:主板上集成了raid控制
    • 软raid:通过软件的方式模拟raid
  • 级别:
    • raid0:通过至少两块硬盘组成,数据拆分同时向两块不同硬盘里写,读写性能提升,但是不具有安全性。
    • raid1:通过至少两块硬盘组成,数据备份在两块不同硬盘上,安全性能提升,但是没有提高读写性能。
    • raid5:通过至少三块硬盘组成,读写性能提升,通过校验数据来完成数据的冗余性

image.png
image.png

  1. yum install mdadm -y
  2. mdadm -Cv /dev/md0 -a yes -n 4 -l 10 /dev/sdb /dev/sdc /dev/sdd /dev/sde
  3. mkfs.ext4 /dev/md0
  4. mkdir /raid
  5. mount /dev/md0 /raid/
  6. df -Th
  7. mdadm -D /dev/md0

LVM逻辑卷管理

LVM将存储虚拟化,不受限于物理存储,屏蔽硬件相关存储参数,不需要卸载文件系统进行调整卷大小或数据迁移。

  • 基本术语
    • 物理存储设备:系统的存储设备(/dev/sda)
    • 物理卷:PV,需要将物理存储介质创建为物理卷
    • 卷组:VG,由多个物理卷组成
    • 逻辑卷:LV,从相应 的vg上创建来的
    • PE:物理卷被划分为的基本单元,默认为4MB
    • LE:逻辑卷被分为LE的可被寻址的基本单位(同一个卷组中PE,LE是相同的)
  • PV管理工具
    • pvs:简要pv的信息显示
    • pvdisplay:显示pv的详细信息
    • pvcreate /dev/DEVICE:创建pv
  • VG管理工具
    • vgs
    • vgdisplay
    • vgcreate
    • vgexetend
    • vgreduce:需要先进行vpmove操作
  • LV管理工具

    • lvs
    • lvsdisplay
    • lvcreate ‐L #[mMgGtT] ‐n NAME VolumeGreoup‐Path
    • lvremove /dev/VG_NAME/LV_NAME
    • 扩展逻辑卷:
      • lvextend ‐L [+]#[mMgGtT] /dev/VG_NAME/LV_NAME
      • resizefs /dev/VG_NAME/LV_NAME
    • 缩减逻辑卷:
      • umount /dev/VG_NAME/LV_NAME
      • e2fsck ‐f /dev/VG_NAME/LV_NAME
      • resize2fs /dev/VG_NAME/LV_NAME #[mMgGtT]
      • lvreduce ‐L #[mMgGtT] /dev/VG_NAME/LV_NAME
    • mount

      计划任务

  • 分类

    • 未来某一时刻执行一次任务:at,batch
    • 周期性运行某任务:cron
  • at命令

    • at option time
    • option
    • -t time,执行的时间
    • -f file,执行命令的文件
    • -c cats the jobs listed on the command line to standard output,查看任务列表的命令行后标砖输出

      1. [root@server ~]# at --help
      2. at: invalid option -- '-'
      3. Usage: at [-V] [-q x] [-f file] [-mMlbv] timespec ...
      4. at [-V] [-q x] [-f file] [-mMlbv] -t time
      5. at -c job ...
      6. atq [-V] [-q x]
      7. at [ -rd ] job ...
      8. atrm [-V] job ...
      9. batch
    • time

      • HH:MM[YY-mm-dd]
      • moon,midnight,teattime
      • tomorrow
      • now+#{m,h,d,w}
      • batch命令:让系统自动选择空闲的时间去执行
      • atrm [jobid],删除指定at任务
      • batch命令,让系统自动选择空闲时间去执行指定的任务
      • /var/spool/mail/root,计划任务执行输出的文件
  • crond命令:Linux系统是由crond这个系统服务来控制周期性任务,并且这个服务是默认启动的,因为满足使用者控制计划任务,提供了crontab命令
    • 任务调度:首先确保crond守护进程处于运行状态 systemctl status crond | sed ‐n ‘3p’ | awk ‐F” “ ‘{print $2}’
  1. [root@server ~]# cat /etc/crontab
  2. SHELL=/bin/bash
  3. PATH=/sbin:/bin:/usr/sbin:/usr/bin
  4. MAILTO=root
  5. # For details see man 4 crontabs
  6. # Example of job definition:
  7. # .---------------- minute (0 - 59)
  8. # | .------------- hour (0 - 23)
  9. # | | .---------- day of month (1 - 31)
  10. # | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
  11. # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
  12. # | | | | |
  13. # * * * * * user-name command to be executed
  14. [root@server ~]#
  • 时间表示法:
      1. 特定值, 给定时间点有效取值范围内的值
      1. *,给定时间点上有效取值范围内的所有值,表示“每…”
      1. 离散取值:, #,#,# 10,20,10 9 *
      1. 连续取值:‐ #‐# 10-30 9 *
      1. 在指定时间范围上,定义步长 /#:#即为步长 0 /3
    • 每3小时echo命令:
    • 0 /3 root /usr/bin/echo “Hello!”
  • 系统任务调度:系统周期性执行的工作,比如写数据缓存到磁盘中,日志清理,/etc/crontab,这个就是系统任务调度的配置文件
  • 用户任务调度:
    • crontab命令定义
    • 每个用户都有专用的crontab文件,/var/spool/cron/USERNAME
  1. crontab命令:
  2. crontab [‐u user ] [‐l | r | e] [‐i]
  3. l:列出所有任务;
  4. e:编辑任务
  5. r:移除所有任务;
  6. i:同‐r一同使用,在删除某用户指定任务之前需要进行确认
  7. u user:仅root可运行,代为为指定用户管理cron任务;
  8. -n host:指明主机,一般是在集群当中
  9. -c 获取主机(集群当中)
  10. Note:如果在cron任务有使用%请进行转义
  11. 系统命令尽量添加上命令的执行路径
  12. /var/log/cron:计划任务的日志文件
  13. 用户计划任务编辑的时候,如果出现任务不执行,建议增加
  14. SHELL=/bin/bash
  15. PATH=/sbin:/bin:/usr/sbin:/usr/bin

练习:保留app01应用一周内的的日志
0 0 * root find /var/log/app01/ -m ctime +7 -exec rm -rf {}\;

Linux进程管理

  • 在计算机中,系统调用,又称为系统呼叫,指运行在用户空间的程序向操作系统内核请求需要获取更高权限运行的服务。系统调用提供了用户程序于操作系统之间的接口。大多数系统交互操作需求在内核空间执行。比如IO操作进程通讯等。
  • 内核的功能:
    • 进程管理
    • 文件系统
    • 网络功能
    • 内存管理
    • 驱动程序
    • 安全功能
  • 进程创建
    • init:pid为0的父进程
    • 父子进程:进程都是由父进程创建的
      • 进程:操作系统资源分配的最小单元,拥有独立的内存空间
      • 线程:cpu执行的最小单元,由进程创建而来,同一个进程下的多个线程共享内存空间
      • 协程:协程是轻量的线程,如果一个进程只创建了一个线程,可以称之为协程
      • 进程通信:socket,管道,信号量,锁
      • 线程通信:同一个进程下的线程可以直接通信,
  • 进程优先级:
    • 0-99,实时优先级,数字越小,优先级越低
    • 100-139:静态优先级,数字越小,优先级越高
    • Nice值:-20~19,nice值为0时优先级为120
  • 进程类型
    • 守护进程:在系统引导中启动的进程,跟终端无关的进程
    • 前台进程:跟终端相关,通过终端启动的进程
    • 也可以把前台启动的进程送往后台,以守护模式运行
  • 进程状态
    • 运行态,running,正在运行
    • 就绪态,ready,准备运行,比如等待IO操作的进程
    • 睡眠态:
      • 可中断:interruptable
      • 不可中断uninterruptable
    • 停止态:暂停于内存中,但不会被调度,除非手动启动,stopped
    • 僵死态:zombie,僵尸进程,如何去清理系统上的僵尸进程
  • 进程分类
    • CPU-Bound
    • IO-Bound
  • 进程管理工具:pstree,ps,pidof,pgrep,top,htop,glance,pmap,vmstat,dstat,kill,pkill,job,

bg,fg,nohup

  • ps命令:当前所有进程快照的状态
    • Linux系统各进程相关信息均保存在/proc/PID文件中
    • -a:与终端相关的进程
    • -u:以用户为中心组织相关进程状态信息
    • -x:与终端无关的进程
USER PID         %CPU          %MEM            VSZ      RSS TTY      STAT             START   TIME  COMMAND
用户 进程id  cpu占用率 内存占用率  虚拟内存集 常驻内存集         进程状态 启动时间 占据cpu时间 命令
                                                                                                             R:running
                                                       S:interruptable sleeping
                                                       D:uninterruptable sleeping
                                                       T:stopped
                                                       Z:zombie
                                                       +:前台进程
                                                       l:多线程进程
                                                       N:低优先级进程
                                                       <:高优先级进程
                                                       s:session leader
  • 常用组合
    • ps -ef:e,显示所有进程,f,显示完整格式程序信息,PPID代表父进程
    • ps -eFH:F,显示完成格式的进程信息,H,以进程层级格式显示进程相关信息
    • ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm
    • ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
    • ps -Ao pid,tt,user,fname,tmout,f,wchan
      • ni:nice值
      • pri:priority,优先级
      • psr:processor,CPU
      • rtprio:实时优先级
        • pstree,需要安装
        • pidof [软件]:查询进程id
        • top命令:动态显示进程信息
  • load average:0.02, 0.02, 0.05 系统的平均负载 10分钟 5分钟 1分钟。通常来说:平均负载会小于cpu总数。平均负载不等于cpu使用率。平均负载=cpu使用率+就绪态状态的进程对cpu的占用率。
    • 平均负载很高的情况下如何排查:首先查看cpu处于running状态的进程是否正常,然后查看系统中是否存在大量的就绪态状态的进程占用大量资源,最后判断导致平均负载很高的原因到底是什么。
  • %cpu:cpu使用率 用户 系统 nice值 id wait
  • MEM:内存使用情况
  • SWAP:交换内存使用情况
  • buff:缓冲区,数据存储到内存的地址空间
  • cache:缓存区,数据从内存中读取后的地址空间
  • ‐d #:指定刷新时间间隔,默认为3s
  • ‐b:以批次方式
  • ‐n #:显示多少批次
    • htop命令:
  • s:跟踪选进程的系统调用
  • l:显示选定进程打开的文件列表
  • [:将选定的进程绑定至某指定的CPU核心;
    • ‐d #:指定延迟时间
    • ‐u Username:仅显示指定用户的进程
    • ‐s COLOMN:以指定字段进行排序
    • vmstat命令,打印虚拟内存信息
  • vmstat [‐n] [延时[次数]]
[root@server ~]# vmstat 
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 438608   2108 352568    0    0     4     2   19   18  0  0 100  0  0
     procs:
        r:等待运行的进程的个数;
        b:处在非中断睡眠状态的进程个数;(被阻塞的队列的长度)
    memory:
        swpd:交换内存的使用总量
        free:空闲物理内存总量;
        buffer:用于buffer的内存总量;
        cache:用于chache的内存总量;
    swap:
        si:数据进入swap中的数据速率(kb/s)
         so:数据离开swap的数据速率
        io:
            bi:从块设备读入数据到系统的速率;(kb/s)
            bo:保存数据至块设备的速率;
    system:
        in:interrupts,中断速率
        cs:context switch,进程切换速率;
    cpu:
        us:用户空间占据比例
        sy:内核空间占用比例
        id:
        wa:
        st:
  - ‐s:显示内存的统计数据
  • kill命令:向进程发送控制信号,以实现对进程管理
    • kill [-s signal|-p] [-q sigval] [-a] [—] pid…
    • -l,显示当前系统可用信号
    • 常用信号,指定信号量的方式可以是完整名称、信号量的简称、信号量的id
      • SIGHUP:无须关闭进程而让其重读配置文件 1
      • SIGINT:终止正在运行的进程,相当于Ctrl+c 2
      • SIGKILL:杀死正在运行的进程 9
      • SIGTERM:终止正在运行的进程,相当于杀死 15
  • killall [-s signal] program
  • 进程优先级
    • 静态优先级:100‐139 可以手动修改
    • 进程默认启动时nice为0,优先级为120
      • nice,renice
    • nice命令:
      • nice [OPTION] [COMMAND [ARG]…]
    • renice命令:
      • renice [‐n] priority [‐gpu] identifier

image.png

Centos启动流程

  1. POST加电自检

    主要实现的功能是检测各个外围硬件设备是否存在而且能够正常运行起来,实现这一自检功能的是固化在主板上的 ROM(主要代表为CMOS)芯片上的BIOS(Basic Input/Output System)程序;例如BIOS会检测CPU、Memory以及 I/O设备是否能够正常运行,如果是个人计算机的话可能还会检测一下显示器。只要一通电,CPU就会自动去加载 ROM芯片上的BIOS程序,是这样来实现的。而检测完成之后就进行硬件设备的初始化。

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

    主要实现的功能是选择要启动的硬件设备,选择了之后就可以读取这个设备上位于MBR里头的bootloader了。这一 步的实现是这样的:根据BIOS中对启动顺序的设定,BIOS自己会依次扫描各个引导设备,然后第一个被扫描到具有 引导程序(bootloader)的设备就被作为要启动的引导设备。

  3. 加载bootloader(MBR)

    这一步实现起来的步骤比较多,前面的BIOS通过读取并执行启动设备的MBR中的bootloader,而bootloader要实 现的功能就是提供一个菜单给用户,让用户去选择要启动的系统或不同的内核版本,然后把用户选择的内核版本加 载至RAM中的特定空间,接着在RAM中解压、展开,而后把系统控制权移交给内核。 shell ‐ GRUB阶段shell grub是bootloader中的一种,就grub来说,为了打破在MBR中只有446Bytes用于存放bootloader这一限制,所以 这一步的实现是这样的:grub是通过分成三个阶段来实现加载内核这一功能的,这三个阶段分别是:stage1, stage1.5以及stage2。其中: stage1:存放于MBR的前446Bytes,用于加载stage1.5阶段,目的是为了识别并驱动stage2(或者/boot)所 在分区的文件系统; stage1.5:存放于MBR之后的扇区,加载stage2所在分区的文件系统驱动,让stage1中的bootloader能识别 stage2所在分区的文件系统; stage2:存放于磁盘分区之上,具体存放于/boot/grub目录之下,主要用于加载内核文件(vmlinuz‐ VERSION‐RELEASE)以及ramdisk这个临时根文件系统(initrd‐VERSION‐RELEASE.img或initramfs‐VERSION‐ RELEASE.img)。 概述:假如要启动的是硬盘设备,首先我们的硬件平台主板BIOS必须能够识别硬盘,然后BIOS才能加载硬盘中 的bootloader,而bootloader自身加载后就能够直接识别当前主机上的硬盘设备了;不过,能够识别硬盘设备不 代表能够识别硬盘设备中的文件系统,因为文件系统是额外附加的一层软件组织的文件结构,所以要对接一种文件 系统,就必须要有对应的能够识别和理解这种文件系统的驱动,这种驱动就称为文件系统驱动。而stage1.5就是向 grub提供文件系统驱动的,这样stage1就能访问stage2及内核所在的分区(/boot) 注意:kernel和initramfs的文件路径均以grub的”根”作为起始目录,且存放于stage2所在分区上; 需要注意的是,stage2、内核以及ramdisk文件通常放置于一个基本磁盘分区之上,因为grub无法驱动lvm、高级 软raid等复杂逻辑设备,除非提供一个复杂的驱动接口,否则如果stage2及内核等文件都存放在lvm等复杂逻辑设 备上将无法被stage1所识别,更别说加载了!

  4. Kernel自身初始化

    Kerenl在得到系统控制权之后,首先要进行自身初始化,而初始化的主要作用是: (1)探测可识别到的所有硬件设备;

       bootloader将系统控制权移交给内核就好比如后朝推翻前朝,统治者(内核)当权之后,首先要检查一下
    

    有哪些是前朝所留下的,例如有哪些领土、人力、财力、兵力可用等等。 (2)加载硬件驱动程序,即加载真正的根文件系统所在设备的驱动程序(有可能会借助于ramdisk加载驱动);

       这就像统治者(内核)在得知底下存在的人力、财力之后,开始将可以“为我所用”的人力纳入麾下,听自己
    

    使唤,而不听使唤的杀掉;

(3)以只读方式挂载根文件系统; 如果有借助于ramdisk这个临时文件系统(虚根),则在这一步之后会执行根切换;否则不执行根切换。

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

   到这里内核空间的启动流程就结束了,而接下来是用户空间完成后续的系统启动流程。

注意:

ramdisk和内核是由bootloader一同加载到内存当中的,ramdisk是用于实现系统初始化的、基于内存的磁盘

设备,即加载至内存(的某一段空间)后把内存当磁盘使用,并在内存中作为临时根文件系统提供给内核使用,帮

助内核挂载真正的根文件系统。而之所以能够帮助内核挂载根文件系统是因为在ramdisk这个临时文件系统

的/lib/modules目录下有真正的根文件系统所在设备的驱动程序;除此之外,这个临时文件系统也遵循FHS,例如

有这些固定目录结构:/bin, /sbin, /lib, /lib64, /etc, /mnt, /media, …

因为Linux内核有一个特性就是通过使用缓冲/缓存来达到加速对磁盘上文件的访问的目的,而ramdisk是加载

到内存并模拟成磁盘来使用的,所以Linux就会为内存中的“磁盘”再使用一层缓冲/缓存,但是我们的ramdisk本来

就是内存,它只不过被当成硬盘来使用罢了,这就造成双缓冲/缓存了,而且不会起到提速效果,甚至影响了访问性

能;CentOS 5系列以及之前版本的ramdisk文件为initrd‐VERSION‐RELEASE.img,就会出现上述所说到的问题;

而为了解决一问题,CentOS 6/7系列版本就将其改为initramfs‐VERSION‐RELEASE.img,使用文件系统的方式就

可以避免双缓冲/缓存了,我们可以说这是一种提速机制。

需要注意的是,系统发行商为了适应于各个不同的硬件接口,因此将各个不同的硬件接口的驱动组装打包起

来,例如在用户第一次使用光盘安装完系统之后,会动态探测当前主机上的硬件设备并调用与之对应的设备驱动再

做成ramdisk文件的。所以,ramdisk文件并非必须的,如果只是为了将Linux安装于特定硬件平台上,就可以直接

把对应的驱动编译进内核即可,而不需要去使用ramdisk文件了。

  1. init管理用户空间服务进程

    init可以理解成是内核派来管理用户空间的使者,就好像天使代表上帝来访问人间一样。init这个初始化程序会根

据其配置文件执行一系列操作。虽然CentOS 5、CentOS 6以及CentOS 7的init配置 文件各不相同,但总体的启

动流程是不变的。

(1)根据init配置文件设置默认运行级别

对于CentOS 7来说,初始化程序init是systemd,其配置文件为:/usr/lib/system/systemd/*,

/etc/systemd/system/*

image.png
image.png

systemd特性

  • 特性
    • 系统引导是实现服务并行启动;
    • 按需激活进程
    • 系统状态快照;
    • 基于依赖关系定义服务控制逻辑
  • 核心概念unit:
    • 配置文件进行标识和配置:文件中主要包含了系统服务、监听socket、保存的系统快照以及其它与init 相关的信息,保存至:
      • /usr/lib/systemd/system
      • /run/systemd/system
      • /etc/systemd/system
  • unit类型:配置文件的不同文件扩展名代表不同的unit类型
    • Service unit:文件扩展名为.service,用于定义系统服务
    • Target unit:文件扩展名为.target,用于模拟实现“运行级别”
    • Device unit:.device,用于定义内核识别的设备
    • Mount unit:.mount,定义文件系统挂载点
    • Socket unit:.socket,用于标识进程间通信用的socket文件
    • Snapshot unit:.snapshot,管理系统快照
    • Swap unit:.swap,用于标识swap设备
    • Automout unit:.automount,文件系统的自动挂载
    • Path unit :.path,用于定义文件系统中的一个文件或目录
  • 关键特性
    • 基于socket的激活机制:socket与服务程序分离
    • 基于bus的激活机制
    • 基于device的激活机制
    • 基于path的激活机制
    • 系统快照,保存各unit的当前状态信息于持久存储设备中
    • 向后兼容sysv init脚本
  • 管理系统服务:systemctl

    命令:systemctl COMMAND name.service

启动:service name start ==> systemctl start name.service

停止:service name stop ==> systemctl stop name.service

重启:service name restart==> systemctl restart name.service

状态:service name status ==> systemctl status name.service

条件式重启:service name condrestart ==> systemctl try‐restart name.service

重载或重启服务:systemctl reload‐or‐restart name.service

重载或条件式重启服务:systemctl reload‐or‐try‐restart name.service

禁止设定为开机自启:systemctl mask name.service

取消静止设定为开机自启:systemctl unmask name.service

查看某服务当前激活与否的状态:systemctl is‐active name.service

查看某服务是否开机自动启动:chkconfig ‐‐list name

查看所有已经激活的服务:systemctl list‐units ‐‐type service

查看所有服务:

systemctl list‐units ‐‐type service ‐‐all

chkconfig命令的对应关系:

设定某服务自启动:chkconfig name on ==> systemctl enable name.service

禁止:chconfig name off ==> systemctl disable name.service

查看所有服务的开机自启状态:

chkconfig ‐‐list ==> systemctl list‐unit‐files ‐‐type service

target units:

unit配置文件:.target

运行级别:

……

级别切换:

init N ==> systemctl isolate name.target

查看级别:

runlevel ==> systemctl list‐units ‐‐type target

获取默认运行级别:

/etc/inittab ==> systemctl get‐default

修改默认级别:

/etc/inittab ==> systemctl set‐default name.target

切换至紧急救援模式:

systemctl rescue

切换至emergency模式:

systemctl emergency

其他常用命令:

关机:systemctl halt、systmectl poweroff

重启:systemctl reboot

挂起:systemctl suspend

快照:systemctl hibernate

快照并挂起:systemctl hybrid‐sleep