Systemd——CentOS7的init

Systemd:

    POST –> Boot Sequeue(BIOS) –> Bootloader(MBR) –> kernel(ramdisk) –> rootfs –> /sbin/init

init:

         CentOS5:SysV init

         CentOS6:Upstart

         CentOs7:Systemd

Systemd:系统启动和服务器守护进程管理器,负责在系统启动或运行时,激活系统资源,服务器进程和其它进程

Systemd的新特性:

         系统引导时实现服务并启动

         按需激活

         自动化的服务依赖关系管理

         同时采用socket式与D-Bus总线式激活服务

         系统状态快照

核心概念:unit<单元>

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

                 /usr/lib/systemd/system:每个服务最主要的启动脚本设置,类似于之前的/etc/init.d/

                 /run/systemd/system:系统执行过程中所产生的服务脚本,比上面目录优先运行

                 /etc/systemd/system:管理员建立的执行脚本,类似于/etc/rc.d/rcN.d/Sxx类的功能,比上面目录优先运行

unit的常见类型:

         Service unit:文件扩展名为.service,用于定于系统服务

         Target unit:文件扩展为.target,用于模拟实现“运行级别”

         Device unit:文件扩展名为.device,用于定义内核标识的设备

         Mount unit:文件扩展名为.mount,定义文件系统挂载点

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

         Snapshot unit:文件扩展名为.snapshot,管理系统快照

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

         Automount unit:文件扩展名为.automount,文件系统自动挂载设备

         Path unit:文件扩展名为.path,用于定义文件系统中的一文件或目录

关键特性:

         基于socket的激活机制;socket于程序分离

         基于bus的激活机制

         基于device的激活机制

         基于Path的激活机制

         系统快照:保存各unit的当前状态信息于持久存储设备中

         向后兼容sysv init脚本

                 /etc/init.d/

不兼容:

         systemctl的命令是固定不变的,不可扩展

         非由systemd启动的服务,systemctl无法与之通信

管理系统服务:

         CentOS7:service类型的unit文件

        

         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

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

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

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

        

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

         查看所有已激活的服务:systemctl list-units –type|-t service

         查看所有服务(已激活及未激活):chkconfig –list ==> systemctl list-units –type|-t service –all|-a

        

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

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

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

         查看所有服务的开机自启状态:chkconfig –list ==> systemctl list-unit-files –type service

        

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

         取消此禁止:systemctl unmask NAME.service

        

         查看服务的依赖关系:systemctl list-dependencies NAME.service

         杀掉进程:systemctl kill  进程名

服务状态:

         systemctl list-units –type service –all 显示状态

         loaded:Unit 配置文件已处理

         active(running): 一次或多次持续处理的运行

         active(exited): 成功完成一次性的配置

         active(waiting): 运行中,等待一个事件

         inactive: 不运行

         enabled: 开机启动

         disabled: 开机不启动

         static:开机不启动,但可被另一个启用的服务激活

管理target units

         运行级别:

                 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

        

         级别切换:init N ==> systemctl list-units NAME.target

        

         查看级别:runlevel ==> systemctllist-units –type target

         查看所有级别:systemctl list-units -t target -a

        

         获取默认运行级别:systemctl get-default

         修改默认运行级别:systemctl set-default NAME.target

        

         切换至紧急救援模式:systemctl rescue

         切换至emergency模式:systemctl emergency

其他常用命令:

         关机:systemctl halt ,systemctl poweroff

         重启:systemctl reboot

         挂起:systemctl suspend

         快照:systemctl hibernate

         快照并挂起:systemctl hybrid-sleep

CentOS7引导顺序:

         UEFi 或BIOS 初始化,运行POST 开机自检

         选择启动设备

         引导装载程序, centos7 是grub2

         加载装载程序的配置文件:/etc/grub.d/

                 /etc/default/grub /boot/grub2/grub.cfg

         加载initramfs 驱动模块

         加载内核选项

         内核初始化,centos7 使用systemd 代替init

         执行initrd.target 所有单元,包括挂载/etc/fstab

         从initramfs 根文件系统切换到磁盘根目录

         systemd 执行默认target 配置,配置文件

                 /etc/systemd/default.target /etc/systemd/system/

         systemd 执行sysinit.target 初始化系统及basic.target 准备操作系统

         systemd 启动multi-user.target 下的本机与服务器服务

         systemd 执行multi-user.target 下的/etc/rc.d/rc.local

         Systemd 执行multi-user.target 下的getty.target 及登入服务

         systemd 执行graphical 需要的服务

service unit file:

         ·文件通常由三部分组成:

                 [Unit]:定于与Unit类型无关的通用选项;用于提供unit的描述信息、unit行为及依赖关系等

                 [Service]:与特定类型相关的专业选项;此处为Service类型

                 [Install]:定义由“systemctl enable”以及“systemctl disable”命令在实现服务启用或禁用时用到的一些选项

        

         ·Unit段的常用选项:

                 Description:描述信息;意义性描述

                 After:定义unit的启动次序;表示当前unit应该晚于那些unit启动;其功能与Before相反

                 Requles:依赖到的其他units;强依赖,被依赖的units无法激活时,当前unit即无法激活

                 Wants:依赖到的其他units;弱依赖

                 Conficts:定义units间的冲突关系

        

         ·Service段的常用选项:

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

                         类型:<常见的是simple forking  notify>

                                 simple:默认值,这个daemon主要由ExecStart接的指令串来启动,启动后常驻于内存中

                                 forking:由ExecStart启动的程序透过spawns延伸出其他子程序来作为此daemon的主要服务。原生父程序在启动结束后就会终止

                                 oneshot:与simple类似,不过这个程序在工作完毕后就结束了,不会常驻在内存中

                                 dbus:与simple类似,但这个daemon必须要在取得一个D-Bus的名称后,才会继续运作. 因此通常也要同时设定BusNname=  才行

                                 notify:在启动完成后会发送一个通知消息。还需要配合NotifyAccess来让Systemd接收消息

                                 idle:与simple 类似,要执行这个daemon必须要所有的工作都顺利执行完毕后才会执行。这类的daemon 通常是开机到最后才执行激活的服务

                 EnvironmentFile:环境配置文件

                 ExecStart:指明启动unit要运行的命令或脚本;ExecStartPre,ExecStartPost

                 ExecStop:指明停止unit要运行的命令或脚本

                 Restart:当设定Restart=1  时,则当次daemon 服务意外终止后,会再次自动启动此服务

        

         ·Install段的常用选项:

                 Alias:别名,可使用systemctl command Alias.service

                 RequiredBy:被那些units所依赖;强依赖

                 WantsBy:被那些units所依赖;弱依赖

        

         ·注意:对于新创建的unit文件或修改了的unit文件,要通知systemc重载此配置文件

                 # systemctl daemod-reload

服务Unit文件示例:

         vim /etc/systemd/system/bak.service

                 [Unit]

                 Description=backup my etc

                 Requires=atd.service

                 [Service]

                 Type=simple

                 ExecStart=/bin/bash -c "echo /testdir/bak.sh|at now"

                 [Install]

                 WantedBy=multi-user.target

                 systemctl daemon-reload

                 systemctl start bak

设置内核参数:

        

         设置内核参数 ,只影响当次启动启动时,在linux16 行后添加systemd.unit=desired.target

                 systemd.unit=emergency.target

                 systemd.unit=recure.target

                         recure.target比emergency支持更多的功能,例如日志等

修改默认启动项:

        修改/etc/default/grub文件可以修改grub2的启动菜单,修改完成后用:

                # grub2-mkconfig -o /boot/grub2/grub.cfg

        重新生成配置文件

                GRUB_DEFAULT=#  :默认的启动菜单为那个

启动排错:

         文件系统损坏

                 先尝试自动修复,失败则进入emergency shell,提示用户修复

         在/etc/fstab不存在对应的设备和UUID

                 等一段时间,如不可用,进入emergencyshell

        

         在/etc/fstab不存在对应挂载点

                 systemd 尝试创建挂载点,否则提示进入emergency shell.

         在/etc/fstab不正确的挂载选项

                 提示进入emergency shell

破解root口令:

         启动时任意键暂停启动

         按e键进入编辑模式

         将光标移动linux16 开始的行,添加内核参数rd.break

         按ctrl-x 启动

         mount –o remount,rw /sysroot

         chroot /sysroot

         passwd root

         touch /.autorelabel

修复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 环境

练习:


1、为编译安装的httpd服务,实现service unit文件

获取源码包

tar xf httpd-2.4.9.tar.bz2

cd httpd-2.4.9/

./configure –prefix=/usr/local/apache

make 

make install

echo "ServerName  local.localdomain" /usr/local/apache/conf/httpd.conf

创建service unit文件

vim /etc/systemd/system/apache.service

666.png

重载配置文件:# systemctl daemod-reload

启动服务,查看端口,并访问网页

Systemd——CentOS7的init

Systemd——CentOS7的init

Systemd——CentOS7的init

Systemd——CentOS7的init

关闭服务,查看端口情况

Systemd——CentOS7的init

Systemd——CentOS7的init

2、破解centos7口令

启动时任意键暂停启动

按e键进入编辑模式

将光标移动linux16 开始的行,添加内核参数rd.break

按ctrl+x 启动

mount –o remount,rw /sysroot

chroot /sysroot

passwd root

touch /.autorelabel

3、修改默认的启动内核

# vim /etc/default/grub

1001.png

# grub2-mkconfig -o /boot/grub2/grub.cfg

4、启动时临时禁用SELinux

启动时任意键暂停启动

按e键进入编辑模式

将光标移动linux16 开始的行,添加内核参数selinux=0

按ctrl+x 启动

5、启动时进入emergency模式

启动时任意键暂停启动

按e键进入编辑模式

将光标移动linux16 开始的行,添加内核参数systemd.unit=emergency.target

按ctrl+x 启动

6、删除编译安装的新内核

删除/boot目录下新内核的vmlinuz和initramfs文件

删除/usr/lib/modules/目录下新内核生成的文件

删除/boot/grub2/grub.cfg文件中,新内核生成的菜单

原创文章,作者:megedugao,如若转载,请注明出处:http://www.178linux.com/48027