回顾:

查看和管理进程的命令:

pstree, ps, pidof, pgrep, pkill, top, vmstat, htop, glances, dstat, pmap, kill, killall, bg, fg, jobs, nohup, nice, renice


http://mirrors.sohu.com/fedora_epel


CentOS(RHEL)系列操作系统的启动流程:Intel X86兼容架构

Linux的系统组成:内核 + 应用程序  GNU/Linux:单纯的指Linux内核


从硬盘存储和启动操作系统的角度:


Linux的系统组成:内核 + 根文件系统(rootfs)


内核功能:进程管理,文件系统管理,内存管理,网络协议,驱动程序,安全功能,...


Linux系统的系统运行环境可以分为两部分:

内核空间:内核代码(系统调用)

就是内核进程占用的CPU和内存资源的总和;

用户空间:应用程序(进程或线程)

就是各种存储于文件系统中的应用程序,在发起为进程或线程之后,占据的CPU和内存资源的总和;


操作系统内核的设计流派:

单内核设计:

所有的功能全部集中于同一个程序;运行时表现为一个进程;

Linux就是单内核设计


Linux,我们不需要他成为最先进的,我们只是要使用它;


微内核设计:

每种功能使用一个单独的子系统来实现;

Windows,Solaris都是微内核设计


Linux内核的特点:

单内核 + 模块化:内核之中的功能 + 各个模块提供的功能之和;

为了能够提效,会为速度比较慢的IO设备提供缓冲和缓存;


Linux内核的组成部分:

内核核心文件:

/boot/vmlinuz-VERSION-release

CentOS 5:

/boot/vmlinuz-2.6.18-398.el5

CentOS 6:

/boot/vmlinuz-2.6.32-573.el6.x86_64

CentOS 7:

/boot/vmlinuz-3.10.0-327.el7.x86_64


最新的内核版本:4.13


内核模块文件:

/lib/modules/KERNEL_VERSION/kernel/


ramdisk:

CentOS 5:

/boot/initrd-2.6.18-398.el5.img


CentOS 6/7:

/boot/initramfs-2.6.32-573.el6.x86_64.img

/boot/initramfs-3.10.0-327.el7.x86_64.img


CentOS 5/6: 

生成ramdisk的工具:mkinitrd

CentOS 7:

生成ramdisk的工具:dracut  mkinitrd


rd和ramfs:

ramdisk:双缓冲和双缓存;

ramfs:提效,避免双缓冲和双缓存;



CentOS系列操作系统的启动流程(2)

基于x86架构兼容平台研究系统启动流程;


1.POST:Power-On Self Test,加电自检;

ROM:Read-Only Memory,只读存储器;

CMOS:BIOS,Basic Input and Output System,基本输入输出系统;


X86架构的CPU可以线性寻址的物理存储空间:ROM + RAM


2.BootSequence:启动顺序

作用:决定到何种硬件设备上加载操作系统;

方式:按照指定的次序查找各个引导设备,第一个被找出有引导程序的设备即为本次启动要用到的设备;


BootLoader:引导加载器,程序;

MBR:

Master(Main) Boot Record:

0磁道0扇区:

446Byte: bootloader

64Byte:FAT,File Allocation Table;

2Byte:magic-number,55AA,表示MBR有效;

GPT:


Windows:NTLDR

Linux:

LILO:LInux LOader,有缺陷:不能支持大硬盘;不超过1024柱面;

GRUB:GRand Uniform Bootloader,全球统一引导加载器;

CentOS 6-:

GRUB 0.x:grub legacy


CentOS 7:

GRUB 1.x:grub2


grub提供的功能:

1.为用户提供一个菜单,菜单中列举的是各个可以启动的操作系统内核;

2.可以将用户选定的内核核心文件装载到RAM中,解压缩并展开,将系统控制权移交给内核;

3.交互式的命令行接口;

4.菜单及内核启动的安全保障;


3.内核:

自身初始化:

1) 探测能够识别到的所有的硬件设备;

2) 加载硬件的驱动程序,有可能会借助于ramdisk加载驱动;

3) 以只读的方式挂载根文件系统;

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


4.Init:

Init程序的类型:

CentOS 5:SysV Init

配置文件:/etc/inittab


CentOS 6:Upstart Init

配置文件:/etc/inittab 几乎被废弃;

/etc/init/*.conf


CentOS 7:Systemd

配置文件:/usr/lib/systemd/system/*

/etc/systemd/system/*



小结:

系统初始化流程(内核级别)

POST --> BootSequence(BIOS) --> BootLoader(MBR) --> kernel(内核核心文件只能放置在基本分区上) [--> ramdisk] --> rootfs(read-only) --> /sbin/init


CentOS 5的SysV Init的工作过程:

CentOS 5 SysV Init:

运行级别(run level):为了系统的运行或维护等目的而设置的管理机制;

0-6 : 七个运行级别;

# 0 - 关机,halt,shutdown

# 1 - 单用户模式(Single user mode),root,无需验证;维护模式;

# 2 - 多用户模式(Multiuser),会启动网络功能;但不会启动NFS,维护模式;

# 3 - 多用户模式(Full multiuser mode),完全的功能模式,仅使用CLI,不激活GUI;

# 4 - 预留级别,目前无特别使用的目的;但是习惯上认为与3运行级别相同;

# 5 - 多用户模式(Full multiuser mode),完全的功能模式,默认激活GUI和CLI,默认使用的是GUI;

# 6 - 重启,reboot


通常会使用3,5运行级别作为此次系统启动的默认运行级别;

查看当前系统的运行级别:

who -r

runlevel


切换运行级别:

init [0-6]


Init的配置文件:/etc/inittab,此配置文件有如下功能:

1.在整个系统初始化的过程中要做哪些任务;

启动或关闭哪些后台服务;

如何进行系统初始化;

在验证用户的身份无误之后,如何为用户提供登录提示符,还要区分是图形界面还是文件界面;

当备用电源失效或重新生效时,如何指挥系统操作;

定义了按下"Ctrl + Alt + Delete"组合键时,系统将采取什么行为;


2.所有规定的任务如何执行;

每一行定义一种操作,格式如下:

id:runlevels:action:process


id:一种操作的唯一标识符;

l#, id, pf, pr, #, x, 

runlevel:指定任务执行所依赖的运行级别;

####, #, 留空

action:在何种条件下启动此任务;

wait:等待切换至此任务所在的运行级别时,运行一次;

respawn:一旦此任务结束,就自动重新启动此任务;

initdefault:用于设定默认的运行级别,通常后面的process省略

sysinit:设置系统初始化的方式,一般情况下此处运行/etc/rc.d/rc.sysinit脚本;

powerfail:

powerokwait:

ctrlaltdel:



/etc/rc.d/rc.sysinit:

1.设置主机名称;

2.设置启动的欢迎信息;

3.激活udev和SELinux

4.挂载/etc/fstab文件中定义的所有有效文件系统;

5.激活各个swap设备;

6.检测rootfs,并且以读写的方式重新挂载rootfs;

7.设置系统时间;

8.根据/etc/sysctl.conf文件设置内核参数;

9.激活lvm和软RAID等高级逻辑设备;

10.加载额外的设备的驱动程序;

11.完成清理工作;


/etc/rc.d/rc:

根据特定的运行级别,启动或关闭/etc/rc.d/rc$runlevel.d/*

K*:要停止的服务;K字母后面的两位数字表示优先级;数字越小优先级越高;依赖其他服务的服务应该优先关闭,被其他服务依赖的服务应该稍后关闭;


S*:要启动的服务;S字母后面的两位数字表示优先级;数字越小优先级越高;被其他服务依赖的服务应该优先启动,依赖其他服务的服务应该稍后启动;


rc脚本可以接受一个运行级别作为其参数运行内容的;


脚本框架:

for i in /etc/rc.d/rc#.d/K* ; do

$i stop

done


for i in /etc/rc.d/rc#.d/S* ; do

$i start

done



      所有由rc脚本关闭或启动的链接文件的源文件都存在于/etc/rc.d/init.d,系统为了方便使用,为此目录创建了链接/etc/init.d


所有/etc/init.d(/etc/rc.d/init.d)目录中的脚本执行方式:

# /etc/init.d/SRV_SCRIPT {start|stop|restart|status}

# service SRV_SCRIPT {start|stop|restart|status}


chkconfig命令:

chkconfig - updates and queries runlevel information for system services

查看系统服务相关运行级别下的运行状态:

chkconfig --list [name]


管理系统服务在/etc/rc.d/rc#.d/目录下的服务脚本的链接:

chkconfig --add name

chkconfig --del name

为了能够让chkconfig命令管理系统服务的脚本的链接,每个脚本中都必须有这样的格式:

# chkconfig: 2345 90 60

2345:在哪个运行级别下,此服务是自动启动状;也就是说,在对应的运行级别的rc#.d目录中,是以S开头的文件;如果改位置为"-",则表示所有运行级别都为K开头的;

90:如果在某个运行级别下为开启状态,该数字为S后面的优先级数字;

60:如果在某个运行级别下为停止状态,该数字为K后面的优先级数字;

# description: 对于此系统服务的摘要性描述信息;

单独设置指定运行级别下系统服务的自动启动或关闭的状态;

chkconfig [--level ####] name <on|off|reset>


/etc/rc.d/rc.local脚本:

是init程序在引导用户空间进程启动的过程中,所执行的最后一个脚本;因此,不便于或不需要写在系统服务相关的脚本中的内容但又期望可以开机即运行的功能,可以直接写在此脚本中;


# Run gettys in standard runlevels

1:2345:respawn:/sbin/mingetty tty1

2:2345:respawn:/sbin/mingetty tty2

3:2345:respawn:/sbin/mingetty tty3

4:2345:respawn:/sbin/mingetty tty4

5:2345:respawn:/sbin/mingetty tty5

6:2345:respawn:/sbin/mingetty tty6


mingetty会调用login程序,打开虚拟终端;除了mingetty之外,诸如getty之类的程序也可以生成虚拟终端控制台;


如果默认的运行级别是5,则我们需要/etc/X11/prefdm脚本打开图形界面终端;

X6R11 - X Version 6 Release 11


小结:(用户空间的启动流程),/sbin/init

/sbin/init --> /etc/inittab --> 设置默认运行级别 --> /etc/rc.d/rc.sysinit脚本,完成系统初始化(以读写方式挂在文件系统,设置主机名,等等) --> 关闭那些对应运行级别下需要停止的服务,启动那些对应运行级别下需要开启的服务 --> Ctrl+Alt+Del热键功能 -->UPS电源的失效与恢复之后的操作 --> 生成终端[启动图形界面]


CentOS 6:

Init程序:upstart,其应用程序依然是/sbin/init,其配置文件:

/etc/inittab:仅仅只是用于定义默认运行级别;

/etc/init/*.conf:

rcS.conf:执行系统初始化脚本的任务;

rc.conf:执行根据运行级别关闭或开启系统服务的任务;

start-ttys.conf:执行打开终端相关的任务;

prefdm.conf:执行大小图形界面的任务;


upstart机制:基于事件驱动的程序管理模型;Driven-envet


CentOS 6 系统启动流程:

POST --> BootSequence(BIOS) --> Bootloader --> kernel [-->ramfs] -->rootfs(ro) --> /sbin/init --> 设定默认运行级别 --> 系统初始化 --> 可以并行执行ctrl+alt+del热键功能定义,系统服务的开启和关闭,电源管理,dbus管理等 --> 登录提示符


CentOS 7:

Init程序:systemd,与经典的Init程序完全不同;其配置文件:

/etc/systemd/system/*

/usr/lib/systemd/system/*:systemd的UNIT文件;


/etc/inittab:彻底被废弃;


systemd完全兼容SysV风格的Init程序及其脚本;因此,service类的命令在CentOS7中依然可用;但是,建议使用CentOS7标配的systemctl命令来控制和管理系统服务;


systemctl命令:

systemctl - Control the systemd system and service manager(控制systemd系统和服务管理器)

systemctl [OPTIONS...] COMMAND [NAME...]


使用systemctl管理服务的一般方式:

systemctl {start|stop|restart|status} name[.service]


设置CentOS 7的默认运行级别:

~]# systemctl set-default {multi-user.target | graphical.target}


查看CentOS 7的默认运行级别:

~]# systemctl get-default

控制系统运行等级

 

32. 启动系统救援模式

# systemctl rescue

Broadcast message from root@tecmint on pts/0(Wed2015-04-2911:31:18 IST):

The system is going down to rescue mode NOW!

 

33. 进入紧急模式

# systemctl emergency

Welcome to emergency mode!After logging in, type "journalctl -xb" to view

system logs,"systemctl reboot" to reboot,"systemctl default" to try again

to boot intodefault mode.


34. 列出当前使用的运行等级

# systemctl get-default

multi-user.target


35. 启动运行等级5,即图形模式

# systemctl isolate runlevel5.target

# systemctl isolate graphical.target


36. 启动运行等级3,即多用户模式(命令行)

# systemctl isolate runlevel3.target

# systemctl isolate multiuser.target


36. 设置多用户模式或图形模式为默认运行等级

# systemctl set-default runlevel3.target

# systemctl set-default runlevel5.target


37. 重启、停止、挂起、休眠系统或使系统进入混合睡眠

# systemctl reboot

# systemctl halt

# systemctl suspend

# systemctl hibernate

# systemctl hybrid-sleep


总结:

POST --> BootSequence(启动顺序) --> BootLoader --> kernel --> rootfs --> init


回顾:

Init程序:

chkconfig


Bootloader:

GRUB:GRand Uniform Bootloader,通用统一引导加载器;

grub 0.x:grub legacy

grub 1.x:grub2


grub legacy:

1st stage: stage1,MBR的前446Bytes;

1.5 stage:stage1_5,MBR之后的若干个扇区中;让stage1中的bootloader程序能够识别stage2所在的分区的文件系统;

2nd stage:stage2,磁盘的启动分区,

注意:stage2及内核核心文件必须放置在同一个基本磁盘分区上;


stage2提供的功能:

1.加载操作系统内核核心文件;

2.提供一个菜单和交互式接口;

3.允许用户编辑菜单内容;

4.命令行接口操作模式;

5.身份认证机制,以保证菜单编辑和内核启动的安全;


grub的命令行界面:

grub> 


grub的命令行界面中的常用命令:

help:获取所有的grub命令的名称列表和简要使用方法;

help GRUB_CMD:显示特定命令的详细帮助信息;

root (hd#,#):将指定磁盘的指定分区作为grub程序的根设备;

hd#:磁盘编号,#一般是从0开始的数字;如hd0表示第一块磁盘;

#:分区编号,#一般是从0开始的数字,如0表示第一个分区;


(hd0,0):当前计算机上的第一块磁盘的第一个分区;

find (hd#,#):从指定的分区中搜索文件,并显示出文件所在位置;

kernel /PATH/TO/KERNEL_CORE_FILE:设定本次启动时用到的内核文件的绝对路径;额外还可以在kernel命令中,为内核启动添加更多的内核参数;

ro(以只读方式挂在根文件系统) root=/dev/sda3 selinux(安全特性)=0 init=/sbin/init(内核启动之后第一个引导的程序) quiet(内核启动后不输出很多信息,安静启动) rhgb {1|s|S|single}(单用户模式启动)

initrd /PATH/TO/initramfs-VERSION-release.img(找ramdisk的方式)

    注意:如果不能更改root密码,执行setenforce 0 命令即可,调整为了警告模式


grub的配置文件:

/boot/grub/grub.conf   <--- /etc/grub.conf

default=0

设定默认启动菜单项;整个菜单中的所有的title是从0开始编号的;

timeout=5

用户未作出选择时,grub会自动引导默认菜单对应的内核的超时时间;

splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz

grub的背景图片对应的路径;

hiddenmenu

隐藏grub的启动菜单

password --md5 CRYPTED_PASSWORD

为了保护菜单设置的密码,通常用于防止随意进入单用户模式;

title CentOS 6 (2.6.32-573.el6.x86_64)

定义菜单项中的各个"标题",可以定义多个title项;至少有一项;

  root (hd0,0)

  指定grub的根设备,通常是用来安装grub的那个分区;

  kernel /vmlinuz-2.6.32-573.el6.x86_64 ro root=UUID=5ebb0e76-bb19-4a80-9c70-0d101c0778e1 nomodeset rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet

  该菜单对应的要启动的内核及传递给内核的各个参数;

  initrd /initramfs-2.6.32-573.el6.x86_64.img

  内核所对应的ramdisk(ramfs)文件

password --md5 CRYPTED_PASSWORD

保护操作系统内核的启动;


自制小Linux:

1.在某个正常运行的CentOS里添加一块硬盘;

2.对硬盘分区,创建相应的文件系统,并挂载(/mnt/boot, /mnt/sysroot);

3.安装grub程序

# grub-install --root-directory=/mnt(boot的父目录) /dev/sdb

4.为小Linux的根分区创建目录层级结构:

# mkdir -pv /mnt/sysroot/{bin,boot,dev,etc,lib,lib64,proc,sys,mnt,media,tmp,var,usr,sbin}

5.复制内核文件及ramdisk文件到目标系统的启动分区;

# cp /boot/vmlinuz-VERSION-release /mnt/boot

# cp /boot/initramfs-VERSION-release.img /mnt/boot

6.给grub提供配置文件:

default=0

timeout=10 

title Mylinux (1.0.0)

root (hd0,0)

kernel /vmlinuz-VERSION-release ro root=/dev/sda3 selinux=0 init=/bin/bash

initrd /initramfs-VERSION-release.img

7.将/bin/bash及其共享库文件,复制到/mnt/sysroot下对应的目录中;除此之外,还可以复制其他的各应用程序及相应的共享库文件;

8.多执行几次sync命令,使得内存中缓存或缓冲的数据被保存到磁盘上;

9.新建虚拟机,将小硬盘作为新虚拟机的硬盘使用;将宿主系统挂起之后,再启动小Linux即可。


小实验:

破坏grub,在重启之前可以使用下列方法恢复:dd命令

1.# grub-install --root-directory=/ /dev/sda

2.# grub

grub> root (hd0,0)

grub> setup (hd0)

grub> quit

#


破坏grub或者grub.conf配置文件,重启之后无法正确引导内核;可以使用光盘或U盘等其他的引导设备将系统引导起来,并进入rescue模式,其他操作方法如上。


POST --> BootSequence(BIOS) --> BootLoader(GRUB, MBR-stage1) --> stage1_5 --> stage2 --> kernel --> init


Kernel:

















回顾:

CentOS 5的系统启动流程:

1.POST(Power-On Self Testing)

主板上ROM中存储的BIOS程序,被主板芯片映射入内存,从而协助CPU完成;

2.根据BIOS的启动顺序,依次访问各个存储设备,检查其MBR中是否有引导程序,如果有,则将引导程序加载至内存,并且将硬件的管理权移交给引导程序;

3.引导程序(GRUB),开始加载stage1_5,以驱动文件系统;然后从根设备加载stage2至内存;stage2的代码将会从同一磁盘分区加载kernel至内存,同时将硬件的管理权移交给kernel;

4.kernel试图挂载根文件系统,如果其内部有被直接编译进内核的文件系统驱动程序,则无需其他辅助直接以只读方式挂载根文件系统即可;否则,必须依赖于ramdisk提供的临时根文件系统做为过度,待文件系统驱动成功以后,完成根切换的工作,以只读方式挂载真正的根文件系统;

5.kernel试图启动第一个进程:/sbin/init,而后kernel转入后台,将用户空间的进程管理任务交给init进程来完成;

6.init程序读取其配置文件:/etc/inittab

7.设置系统当前的运行级别

8.执行/etc/rc.d/rc.sysinit脚本,实施系统初始化;

9.执行/etc/rc.d/rc脚本,并且处理/etc/rc.d/rc$runlevel.d下面的所有服务的链接,所有以K开头的服务都被停止;所有以S开头的服务都被启动;

10.根据运行级别,选择打开的终端数量及位置;

11.使用mingetty命令调用login命令,为用户打印登录提示符;


Bootloader:

GRUB:

grub 0.x:grub legacy

grub 1.x:grub2


grub

1st stage:MBR

1_5 stage:MBR之后的若干扇区中;

2nd stage:磁盘的启动分区;


stage2:

提供启动菜单

命令行接口

交互式界面

提供配置文件

加密保护菜单及内核

...

(hd#,#)


root (hd0,0)

kernel /vmlinuz-VERSION-release ro root=UUID="DEVICE_UUID" selinux=0 /sbin/init

initrd /initrd-VERSION-release


grub的配置文件

/boot/grub/grub.conf <--- /etc/grub.conf

default=0

timeout=5

hiddenmenu

splashp_w_picpath=(hd0,0)/*.xpm.gz

password --md5 CRYPTED_PASSWORD

title OS_ID

root (hd0,0)

kernel /vmlinuz-VERSION-release ARGUMENTS...

initrd /initrd-VERSION-release


自制小Linux:

Systemd:

Systemd的新特性:

1.在系统引导的时候可以实现服务的并行启动;

2.能够实现按需激活进程;

在系统启动时,需要随系统启动服务,其服务进程并没有启动,但是Systemd为每一个此类服务进程都注册了对应的套接字;我们成这种服务处理方式为"半激活状态";

3.能够对当前系统的用户空间的每个进程进行状态快照;以后如果进程出现问题或故障,可以迅速恢复进程状态至过去的某一时刻;

4.systemd内部有一种基于依赖关系来定义的服务控制逻辑;


核心管理概念:unit文件 

由systemd相关的配置文件进行标识、识别和配置功能的实现的基础;

unit的文件分类:

系统服务类

socket

目标类

快照类

...


这些配置文件主要保存在:

/usr/lib/systemd/system/*

/etc/systemd/system/*   符号链接

/run/systemd/system/*   非配置关键项;


Unit文件的常见类型:

Service unit:文件的扩展名为.service,用于定义系统服务,一般.service扩展名可以省略;


Target unit:文件的扩展名为.target,用于模拟实现"init程序的运行级别";


Device unit:文件的扩展名为.device,用于定义内核识别出来的各设备;


Mount unit:文件的扩展名为.mount,用于定义可以被systemd管理的文件系统的挂载点;


Automount unit:文件的扩展名为.automount,用于定义文件系统的自动挂载点的位置;


Socket unit:文件的扩展名为.socket,用于标识进程间通信所用到的socket文件;


Swap unit:文件的扩展名为.swap,用于标识swap设备;


Path unit:文件的扩展名为.path,用于监控指定目录中的一个文件或一个子目录;如果被监控的文件或目录不存在,则systemd可以自动创建之;



systemd特性的实现方式:

1.基于socket unit的方式实现进程激活机制;

2.基于device unit的方式实现设备的自动识别,挂载;

3.基于bus的激活机制:

4.基于path的激活机制;


systemd的兼容和不兼容:

兼容:SysV init的脚本;

不兼容:必须使用systemctl命令来管理系统,systemctl命令的格式是固定不变的;所有不经由systemd启动的系统服务或系统功能,systemctl命令无法与之直接通信,也就意味着此类服务或功能,无法通过systemctl来控制;


systemctl命令:

systemctl - Control the systemd system and service manager


systemctl [OPTIONS...] COMMAND [NAME...]


管理服务类的操作:

启动: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

设置服务的开机自启:chkconfig --level runlevels NAME on ==> systemctl enable NAME.service

禁止服务的开机自启:chkconfig --level runlevels NAME off ==> systemctl disable NAME.service

查看某服务是否开机自启:chkconfig --list NAME ==> systemctl is-enabled NAME.service

条件式重启:service NAME condrestart ==> systemctl try-restart NAME.service

重载配置文件:service NAME reload ==> systemctl reload NAME.service


重载或重启:systemctl reload-or-restart NAME.service

重载或条件式重启:systemctl reload-or-try-restart NAME.service


查看某服务当前是否处于激活状态:systemctl is-active NAME.service

查看所有已处于激活状态的服务:systemctl list-units 

--type=UNIT_TYPE:查看指定unit类型的处于活跃状态的服务;

--all:显示所有,包括处于活跃状态和处于非活跃状态的各服务;

查看依赖指定服务的其他服务:systemctl list-dependencies NAME.service


禁止某服务被设定为开机自启:systemctl mask NAME.service

取消禁止某服务被设定为开机自启:systemctl unmask NAME.service


管理target unit:

模拟运行级别:

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, shutdown.target


运行级别间切换:init # ==> systemctl isolate NAME.target

注意:不是所有的target都能使用上述命令进行级别切换的;只有那些在对应的unit文件中包含了AllowIsolate=yes的语法的target才能用于切换;


修改了unit文件之后,需要通过命令才能使之生效;

# systemctl daemon-reload 


查看运行级别:runlevel ==> systemctl list-units --type=target --all


查看默认运行级别:/etc/inittab(id:3:initdefault:) ==> systemctl get-default 

修改默认运行级别:/etc/inittab(id:3:initdefault:) ==> systemctl set-default NAME.target


rescue.target:紧急救援模式

systemctl isolate rescue.target

systemctl rescue


emergency.target:紧急调试模式

systemctl emergency


rescue模式,相当于安全模式,在切换到此模式时,操作系统会运行最底层的驱动程序,以保证服务器可以运行起来;


emergency模式,一般来说,通常是硬件故障,或者硬件不可识别,或者硬件可识别但不可用等关乎于计算机硬件设施的问题,通常系统会启动emergency模式;


除上述模式之外,传统的init命令,shutdown命令,poweroff命令,halt命令,reboot命令其实都是systemctl的符号链接;


可以使用systemctl命令来直接实现上述功能:

关机:systemctl halt,systemctl poweroff

重启:systemctl reboot

挂起:systemctl suspend

休眠(进程快照):systemctl hibernate

挂起并休眠:systemctl hybrid-sleep


Service unit file的基本文件格式:

/etc/systemd/system:存放的都是各个unit file的符号链接;

/usr/lib/systemd/system


如果自行编写unit file,可以直接将文件放置于/etc/systemd/system目录中;也可以将其放在/usr/lib/systemd/system目录中,但是需要为其提供一个符号链接文件放置于/etc/systemd/system目录中;


Service unit file文件的基本格式:

此类unit file通常分为三段:

[Unit]:定义与Unit类型无关的通用选项;用于提供当前unit的描述信息,unit的行为信息,unit的依赖关系,unit相关帮助文档信息等;

常用的选项语句:

Description:定义相关服务的描述信息;意义性的介绍性的描述;

After:定义了此服务在启动前必须依赖的其他服务;

Before:定义了依赖此服务启动的其他服务;

Wants:指明依赖关系,说明该服务依赖于哪些其他的unit;弱依赖,即使被依赖的服务并没有被正确激活,也不会影响当前服务是否可以被激活;

Requires:指明依赖关系,说明该服务依赖于哪些其他的unit;强依赖,只要被依赖的unit无法被正确激活,则当前服务一定无法激活;

Conflict:定义了各unit之间可能存在冲突;

Documentation:定义了跟当前unit相关的管理命令的文档所在;


[Service]:定义与系统服务相关的专用的选项语句;

常用的选项语句:

Type:用于定义影响ExecStart即相关参数的功能的unit进程的启动类型;

simple:默认值,表示由ExecStart语句指明的应用程序启动的进程就是主进程;

forking:复制自身,表示有ExecStart语句指明的应用程序所启动的进程中众多的子进程中一个将成为主进程,而一旦启动完成,父进程会退出;

oneshot:一次性进程,功能类似与simple,在启动后续的unit之前,主进程会退出;

notify:功能类似于simple,但是其后续的unit仅在通过sd_notify()函数发送通知之后,才能运行ExecStart所指明的应用程序;

EnvironmentFile:环境配置文件,此文件一般用于在ExecStart之前被读取,并为ExecStart执行后面的应用程序提供必要的变量以及其他自定义功能等;

ExecStart:指明启动此服务所需要运行的命令或脚本;

ExecReload:指明重载配置文件所需要运行的命令或脚本;

ExecStop:指明停止服务所需要运行的命令或脚本;

ExecStartPre:指明在执行ExecStart指明的命令之前需要运行的命令或脚本;

ExecStartPost:指明在执行ExecStart指明的命令之后需要运行的命令或脚本;

Restart:表示如果服务遭遇有意外而终止,则会自动重启该服务;


[Install]:定义由"systemctl enable"和"systemctl disable"命令在实现服务启动或禁用时用到的专用选项语句;

WantedBy:弱依赖关系,指的是该服务被哪些其他units所依赖;

RequiredBy:强依赖关系,指的是该服务被哪些其他units所依赖;


CentOS 7系统引导过程:

1.POST

2.选择启动设备,读取引导程序

3.装载引导程序(CentOS 7使用的grub2)

4.装载引导程序的配置文件: /etc/grub.d/, /etc/default/grub , /boot/grub2/grub.cfg

5.加载initramfs驱动模块

6.加载内核

7.内核以只读方式挂载rootfs,启动systemd进程;

8.执行initrd-*.target所有的unit,包括挂载/etc/fstab文件中所有有效的文件系统;

9.根切换

10.systemd执行默认的target


Linux Kernel:

内核设计流派:

单内核设计,但是充分借鉴了微内核体系设计的优点,为内核引入了模块化机制,内核高度模块化;

内核被模块化之后,一些最为基本最为重要的内容,被编译到内核核心;而其他更多的功能则以模块的方式来提供;而且支持动态装载和卸载各内核模块;


内核的组成部分:

kernel:内核核心文件,一般为bzImage,经过压缩处理的镜像文件;通常内核核心文件保存在/boot目录下,名称为vmlinuz-VERSION-release


kernel object(ko):内核对象,内核额外功能模块,一般该类文件放置于/lib/modules/VERSION-release


注意:内核模块与内核核心,版本号必须严格匹配;


内核模块其实就是内核源代码的一部分,只是在编译内核的过程中,由于其功能可能并非内核核心所必需,所以以模块的方式被编译;


在编译内核时,内核的功能通常有如下几种选择方式:

[ ] kernel Function:No,不选择编译此功能;

[M] kernel Function:Modules,将此功能编译为内核模块使用;此功能不占据内核空间,只占用磁盘空间;

[*] kernel Function:Yes,将此功能直接编译进内核核心;


ramdisk:内核补充文件,辅助文件,对于内核核心来说,此文件非必须,是否使用此文件取决于内核能否直接驱动rootfs所在的存储设备;

设备的驱动程序,SCSI设备的驱动;

逻辑设备驱动程序:LVM的驱动程序,软RAID驱动程序等;

文件系统:


cpio -i -F initramfs-2.6.32-573.el6.x86_64.img


简化的rootfs


注意:一般来讲,kernel核心文件和ramdisk文件必须具有完全相同的版本号;


内核管理的相关命令:

uname命令:

uname - print system information

uname [OPTION]...

常用选项:

-n:显示节点名称

-r:显示内核版本号,包括VERSION和release

-a:显示所有信息


lsmod命令:

lsmod - program to show the status of modules in the Linux Kernel


显示有Linux内核核心已经装载的内核模块;


lsmod显示的内容,分为三个字段:

模块名称 模块大小 被引用次数及被谁所引用


modinfo命令:

modinfo - program to show information about a Linux Kernel module


modinfo  [ -k kernel ]  [ modulename|filename... ]

常用选项:

-F field:仅显示指定字段的信息;通常只能指定一个字段;

-n:只显示模块文件的绝对路径   (最常用)

-a:只显示模块的作者信息

-d:只显示模块的描述

-l:只显示许可证信息

-p:只显示模块参数信息


depmod命令:

depmod - program to generate modules.dep and map files


内核模块依赖关系文件及系统信息映射文件的生成工具


实现内核模块的动态装载和卸载的命令:

insmod命令:装载指定的内核模块文件,但无法自动解决模块间的依赖关系;

insmod - simple program to insert a module into the Linux Kernel


insmod [ filename ]  [ module options... ]


注意:filename:模块文件的绝对路径;


]# insmod `modinfo -n btrfs`


rmmod命令:

rmmod - simple program to remove a module from the Linux Kernel从Linux内核中删除模块的简单程序


# rmmod module_name


modprobe命令:

modprobe - program to add and remove modules from the Linux Kernel

从内核中移除模块或者向内核中插入模块;


modprobe  [ -C config-file ] [ modulename ]  [ module parameters... ]


默认的配置文件:/etc/modprobe.conf , /etc/modprobe.d/*


modprobe module_name:装载模块,自动识别和解决依赖关系;


modprobe -r module_name:卸载模块