Linux启动过程

回顾:linux

查看和管理进程的命令:c#

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兼容架构bash

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


从硬盘存储和启动操做系统的角度:网络


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


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


Linux系统的系统运行环境能够分为两部分:socket

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

就是内核进程占用的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:卸载模块

相关文章
相关标签/搜索