开发者社区> 技术小胖子> 正文

systemd及启动流程

简介:
+关注继续查看

CentOS 7 使用systemd替换了SysV。Systemd目的是要取代Unix时代以来一直在使用的init系统,兼容SysV和LSB的启动脚本,而且够在进程启动过程中更有效地引导加载服务。

systemd的特性有:

  • 支持并行化任务

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

  • 按需启动守护进程(daemon);

  • 利用 Linux 的 cgroups 监视进程;

  • 支持快照和系统恢复;

  • 维护挂载点和自动挂载点;

  • 各服务间基于依赖关系进行精密控制。

systemd基本工具

输出激活的单元:

  1. $ systemctl

以下命令等效:

  1. $ systemctl list-units

输出运行失败的单元:

  1. $ systemctl --failed

所有可用的单元文件存放在 /usr/lib/systemd/system/ 和 /etc/systemd/system/ 目录(后者优先级更高)。查看所有已安装服务:

  1. $ systemctl list-unit-files

使用单元

一个单元配置文件可以描述如下内容之一:系统服务(.service)、挂载点(.mount)、sockets(.sockets) 、系统设备(.device)、交换分区(.swap)、文件路径(.path)、启动目标(.target)、由 systemd 管理的计时器(.timer)。详情参阅 man 5 systemd.unit。

使用 systemctl 控制单元时,通常需要使用单元文件的全名,包括扩展名(例如 sshd.service)。但是有些单元可以在systemctl中使用简写方式。

  • 如果无扩展名,systemctl 默认把扩展名当作 .service。例如 netcfg 和 netcfg.service 是等价的。

  • 挂载点会自动转化为相应的 .mount 单元。例如 /home 等价于 home.mount。

  • 设备会自动转化为相应的 .device 单元,所以 /dev/sda2 等价于 dev-sda2.device。

注: 有一些单元的名称包含一个 @ 标记, (e.g. name@string.service): 这意味着它是模板单元 name@.service 的一个 实例。 string 被称作实例标识符, 在 systemctl 调用模板单元时,会将其当作一个参数传给模板单元,模板单元会使用这个传入的参数代替模板中的 %I 指示符。 在实例化之前,systemd 会先检查 name@string.suffix 文件是否存在(如果存在,应该就是直接使用这个文件,而不是模板实例化了)。大多数情况下,包换 @ 标记都意味着这个文件是模板。如果一个模板单元没有实例化就调用,该调用会返回失败,因为模板单元中的 %I 指示符没有被替换。

立即激活单元:

  1. # systemctl start <单元>

立即停止单元:

  1. # systemctl stop <单元>

重启单元:

  1. # systemctl restart <单元>

命令单元重新读取配置:

  1. # systemctl reload <单元>

输出单元运行状态:

  1. $ systemctl status <单元>

检查单元是否配置为自动启动:

  1. $ systemctl is-enabled <单元>

开机自动激活单元:

  1. # systemctl enable <单元>

注意: 如果服务没有Install段落,一般意味着应该通过其它服务自动调用它们。如果真的需要手动安装,可以直接连接服务,如下(将foo替换为真实的服务名):

  1. # ln -s /usr/lib/systemd/system/foo.service /etc/systemd/system/graphical.target.wants/

取消开机自动激活单元:

  1. # systemctl disable <单元>

显示单元的手册页(必须由单元文件提供):

  1. # systemctl help <单元>

重新载入 systemd,扫描新的或有变动的单元:

  1. # systemctl daemon-reload

电源管理

安装 polkit 后才可使用电源管理。

如果你正登录在一个本地的systemd-logind用户会话,且当前没有其它活动的会话,那么以下命令无需root权限即可执行。否则(例如,当前有另一个用户登录在某个tty),systemd 将会自动请求输入root密码。

重启:

  1. $ systemctl reboot

退出系统并停止电源:

  1. $ systemctl poweroff

待机:

  1. $ systemctl suspend

休眠:

  1. $ systemctl hibernate

混合休眠模式(同时休眠到硬盘并待机):

  1. $ systemctl hybrid-sleep

编写单元文件

systemd单元文件的语法来源于 XDG桌面入口配置文件.desktop文件,最初的源头则是Microsoft Windows的.ini文件。单元文件可以从两个地方加载,优先级从低到高分别是:

  • /usr/lib/systemd/system/: 软件包安装的单元

  • /etc/systemd/system/: 系统管理员安装的单元

注意: 当systemd运行在用户模式下时,使用的加载路径是完全不同的。

单元文件的语法,可以参考系统已经安装的单元,也可以参考man systemd.service中的EXAMPLES章节

小贴士: 以 # 开头的注释可能也能用在 unit-files 中, 但是只能在新行中使用。 不要在 systemd 的参数后面使用行末注释, 否则 unit 将会启动失败。

处理依赖关系

使用systemd时,可通过正确编写单元配置文件来解决其依赖关系。典型的情况是,单元A要求单元B在A启动之前运行。在此情况下,向单元A配置文件中的 [Unit] 段添加 Requires=B 和 After=B 即可。若此依赖关系是可选的,可添加 Wants=B 和 After=B。请注意 Wants= 和 Requires= 并不意味着 After=,即如果 After= 选项没有制定,这两个单元将被并行启动。

依赖关系通常被用在服务(service)而不是目标(target)上。例如, network.target 一般会被某个配置网络接口的服务引入,所以,将自定义的单元排在该服务之后即可,因为 network.target 已经启动。

服务类型

编写自定义的 service 文件时,可以选择几种不同的服务启动方式。启动方式可通过配置文件 [Service] 段中的 Type= 参数进行设置。

  • Type=simple(默认值):systemd认为该服务将立即启动。服务进程不会fork。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型。

  • Type=forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便systemd能够跟踪服务的主进程。

  • Type=oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。

  • Type=notify:与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。

  • Type=dbus:若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。

  • Type=idle: systemd会等待所有任务(Jobs)处理完成后,才开始执行idle类型的单元。除此之外,其他行为和Type=simple 类似。

type的更多解释可以参考 systemd.service(5)

修改现存单元文件

要更改由软件包提供的单元文件,先创建名为 /etc/systemd/system/<单元名>.d/ 的目录(如 /etc/systemd/system/httpd.service.d/),然后放入 *.conf 文件,其中可以添加或重置参数。这里设置的参数优先级高于原来的单元文件。例如,如果想添加一个额外的依赖,创建这么一个文件即可:

  1. /etc/systemd/system/<unit>.d/customdependency.conf

  2. [Unit]

  3. Requires=<新依赖>

  4. After=<新依赖>

其它举例,

  1. /etc/systemd/system/unit.d/customexec.conf


  2. [Service]

  3. ExecStartExecStart=

  4. ExecStart=new command

想知道为什么修改 ExecStart 前必须将其置空

下面是自动重启服务的一个例子:

  1. /etc/systemd/system/unit.d/restart.conf


  2. [Service]

  3. Restart=always

  4. RestartSec=30

然后运行以下命令使更改生效:

  1. # systemctl daemon-reload

  2. # systemctl restart <单元>

此外,把旧的单元文件从 /usr/lib/systemd/system/ 复制到 /etc/systemd/system/,然后进行修改,也可以达到同样效果。在 /etc/systemd/system/ 目录中的单元文件的优先级总是高于 /usr/lib/systemd/system/ 目录中的同名单元文件。注意,当 /usr/lib/ 中的单元文件因软件包升级变更时,/etc/ 中自定义的单元文件不会同步更新。此外,你还得执行 systemctl reenable <unit>,手动重新启用该单元。因此,建议使用前面一种利用 *.conf 的方法。

小贴士: 用 systemd-delta 命令来查看哪些单元文件被覆盖、哪些被修改。系统维护的时候需要及时了解哪些单元已经有了更新

单元配置文件的 vim 语法高亮支持

可从官方仓库安装 vim-systemd 软件包,使 unit 配置文件在 Vim 下支持语法高亮。

目标(target)

启 动级别(runlevel)是一个旧的概念。现在,systemd 引入了一个和启动级别功能相似又不同的概念——目标(target)。不像数字表示的启动级别,每个目标都有名字和独特的功能,并且能同时启用多个。一些 目标继承其他目标的服务,并启动新服务。systemd 提供了一些模仿 sysvinit 启动级别的目标,仍可以使用旧的 telinit 启动级别 命令切换。
获取当前目标

不要使用 runlevel 命令了:

  1. $ systemctl list-units --type=target

创建新目标

在 Fedora 中,启动级别 0、1、3、5、6 都被赋予特定用途,并且都对应一个 systemd 的目标。然而,没有什么很好的移植用户定义的启动级别(2、4)的方法。要实现类似功能,可以以原有的启动级别为基础,创建一个新的目标 /etc/systemd/system/<新目标>(可以参考 /usr/lib/systemd/system/graphical.target),创建 /etc/systemd/system/<新目标>.wants 目录,向其中加入额外服务的链接(指向 /usr/lib/systemd/system/ 中的单元文件)。

目标表

SysV 启动级别 Systemd 目标 注释
0 runlevel0.target, poweroff.target 中断系统(halt)
1, s, single runlevel1.target, rescue.target 单用户模式
2, 4 runlevel2.target, runlevel4.target, multi-user.target 用户自定义启动级别,通常识别为级别3。
3 runlevel3.target, multi-user.target 多用户,无图形界面。用户可以通过终端或网络登录。
5 runlevel5.target, graphical.target 多用户,图形界面。继承级别3的服务,并启动图形界面服务。
6 runlevel6.target, reboot.target 重启
emergency emergency.target 急救模式(Emergency shell)

切换启动级别/目标

systemd 中,启动级别通过“目标单元”访问。通过如下命令切换:

  1. # systemctl isolate graphical.target

该命令对下次启动无影响。等价于telinit 3 或 telinit 5。

修改默认启动级别/目标

开机启动进的目标是 default.target,默认链接到 graphical.target (大致相当于原来的启动级别5)。可以通过内核参数更改默认启动级别:

小贴士: 可以省略扩展名 .target。

  •  systemd.unit=multi-user.target (大致相当于级别3)

  •  systemd.unit=rescue.target (大致相当于级别1)

另一个方法是修改 default.target。可以通过 systemctl 修改它:

  1. # systemctl enable multi-user.target

命令执行情况由 systemctl 显示:链接 /etc/systemd/system/default.target 被创建,指向新的默认启动级别。该方法当且仅当目标配置文件中有以下内容时有效:

  1. [Install]

  2. Alias=default.target

目前,multi-user.target、graphical.target 都包含这段内容。

临时文件

/usr/lib/tmpfiles.d/ 和 /etc/tmpfiles.d/ 中的文件描述了 systemd-tmpfiles 如何创建、清理、删除临时文件和目录,这些文件和目录通常存放在 /run 和 /tmp 中。配置文件名称为 /etc/tmpfiles.d/<program>.conf。此处的配置能覆盖 /usr/lib/tmpfiles.d/ 目录中的同名配置。

临时文件通常和服务文件同时提供,以生成守护进程需要的文件和目录。例如 Samba 服务需要目录 /run/samba 存在并设置正确的权限位,就象这样:

  1. /usr/lib/tmpfiles.d/samba.conf

  2. D /run/samba 0755 root root

此外,临时文件还可以用来在开机时向特定文件写入某些内容。比如,要禁止系统从USB设备唤醒,利用旧的 /etc/rc.local 可以用 echo USBE > /proc/acpi/wakeup,而现在可以这么做:

  1. /etc/tmpfiles.d/disable-usb-wake.conf

  2. w /proc/acpi/wakeup - - - - USBE

详情参见 man 5 tmpfiles.d。

注意: 该方法不能向 /sys 中的配置文件添加参数,因为 systemd-tmpfiles-setup 有可能在相关模块加载前运行。这种情况下,需要首先通过 modinfo <模块名> 确认需要的参数,并在 /etc/modprobe.d 下的一个文件中设置改参数。另外,还可以使用 udev 规则,在设备就绪时设置相应属性。

定时器

定时器是以 .timer 为后缀的配置文件,记录由system的里面由时间触发的动作, 定时器可以替代 cron 的大部分功能。

日志

systemd提供了自己日志系统(logging system),称为 journal. 使用 systemd 日志,无需额外安装日志服务(syslog)。读取日志的命令:

  1. # journalctl

默认情况下(当 Storage= 在文件 /etc/systemd/journald.conf 中被设置为 auto),日志记录将被写入 /var/log/journal/。该目录是 systemd 软件包的一部分。若被删除,systemd 不会自动创建它,直到下次升级软件包时重建该目录。如果该目录缺失,systemd 会将日志记录写入 /run/systemd/journal。这意味着,系统重启后日志将丢失。

Tip: 如果 /var/log/journal/ 位于 btrfs 文件系统,应该考虑对这个目录禁用写入时复制

过滤输出

journalctl可以根据特定字段过滤输出,例如:

显示本次启动后的所有日志:

  1. # journalctl -b

不过,一般大家更关心的不是本次启动后的日志,而是上次启动时的(例如,刚刚系统崩溃了)。可以使用 -b 参数:

  • journalctl -b -0 显示本次启动的信息

  • journalctl -b -1 显示上次启动的信息

  • journalctl -b -2 显示上上次启动的信息 journalctl -b -2

  • Show all messages from date (and optional time):

  1. # journalctl --since="2012-10-30 18:17:16"

  • Show all messages since 20 minutes ago:

  1. # journalctl --since "20 min ago"

  • 显示最新信息

  1. # journalctl -f

  • 显示特定程序的所有消息:

  1. # journalctl /usr/lib/systemd/systemd

  • 显示特定进程的所有消息:

  1. # journalctl _PID=1

  • 显示指定单元的所有消息:

  1. # journalctl -u netcfg

  • Show kernel ring buffer:

  1. # journalctl -k

  • Show auth.log equivalent by filtering on syslog facility:

  1. # journalctl -f -l SYSLOG_FACILITY=10

详情参阅man journalctl、man systemd.journal-fields,以及Lennert的这篇博文

日志大小限制

如果按上面的操作保留日志的话,默认日志最大限制为所在文件系统容量的 10%,即:如果 /var/log/journal 储存在 50GiB 的根分区中,那么日志最多存储 5GiB 数据。可以修改 /etc/systemd/journald.conf 中的 SystemMaxUse 来指定该最大限制。如限制日志最大 50MiB:

  1. SystemMaxUse=50M

详情参见 man journald.conf.

配合syslog使用

systemd提供了 socket /run/systemd/journal/syslog,以兼容传统日志服务。所有系统信息都会被传入。要使传统日志服务工作,需要让服务链接该 socket,而非 /dev/log(官方说明)。Arch 软件仓库中的 syslog-ng 已经包含了需要的配置。

设置开机启动 syslog-ng:

  1. # systemctl enable syslog-ng

这里有一份很不错的 journalctl指南。

Forward journald to /dev/tty12

In /etc/systemd/journald.conf enable the following:

  1. ForwardToConsole=yes

  2. TTYPath=/dev/tty12

  3. MaxLevelConsole=info

重启journald:

  1. # systemctl restart systemd-journald

centos5启动流程

 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

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

          password --md5 CRYPTED_PASSWORD

          title OS_ID

            root (hd0,0)

            kernel /vmlinuz-VERSION-release ARGUMENTS...

            initrd /initrd-VERSION-release

systmd的新特性

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

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

   在系统启动时,需要随系统启动服务,其服务进程并没有启动,


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





      本文转自Vincent一马 51CTO博客,原文链接:http://blog.51cto.com/mazhenbo/1953018,如需转载请自行联系原作者




版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
19624 0
【Android 启动过程】Android 应用启动流程 | Activity 启动流程
【Android 启动过程】Android 应用启动流程 | Activity 启动流程
23 0
Golang 程序启动流程分析
本文主要介绍 Golang 程序启动流程中的关键代码,启动过程的主要代码是通过 Plan9 汇编编写的,如果没有做过底层相关的东西看起来还是非常吃力的,笔者对其中的一些细节也未完全搞懂,如果有兴趣可以私下讨论一些详细的实现细节,其中有一些硬编码的数字以及操作系统和硬件相关的规范理解起来相对比较困难。针对 Golang runtime 中的几大组件也会陆续写出相关的分析文章。
28 0
HarmonyOS(鸿蒙)——启动流程
HarmonyOS(鸿蒙)——启动流程
40 0
flowable 启动流程
flowable 启动流程
34 0
怎么设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程
10083 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
24749 0
21117
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载