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


# 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:卸载模块