系统启动流程和服务管理
centos6
bios加电自检--mbr引导系统--grub菜单--加载内核--init进程初始化
centos7
bios加电自检--mbr引导系统--grub2菜单--加载内核--systemd进程初始化
一、系统启动
1、BIOS(Basic Input Output System 基本输入输出系统 )加电自检、硬件初始化、引导操作系统
2、读取并且执行第一个开机设备中的MBR(Master Boot Record 主引导记录 )的
bootloader(grub程序:Grand unified bootloader 大统一启动加载器 )
3、依据bootloader设置去加载内核,内核开始侦测硬件并加载驱动程序
boot loader主要功能如下:
提供选单:用户可以选择不同的开机项目
载入核心文件:直接指向可开机的程序区域来开始操作系统
转交其他loader:将开机管理功能转交给其他Loader负责
内核在Linux中的存放位置为/boot分区下,主要有2个文件要被加载:
vmlinuz-3.10.0-514.el7.x86_64 内核文件
initramfs-3.10.0-514.el7.x86_64.img 虚拟文件系统
可以使用:lsinitrd 命令查看虚拟文件系统。
[root@localhost boot]# lsinitrd initramfs-3.10.0-957.el7.x86_64.img
如果是sysvinit启动程序(linux6版本)
4、内核启动init进程
5、系统初始化
6、init找到/etc/inittab文件,决定系统的运行级别(X)
7、触发相应的运行级别的事件,运行/etc/rcX.d下的脚本
8、执行/etc/rc.local文件,来到登录界面
9、输入用户名密码,进入到系统中
如果是systemd启动程序(Linux7版本)
GRUB2相较于GRUB一代的提升:更健壮、可移植、更强大。支持
BIOS、uEFI和OpenFirmware,支持GPT和MBR分区表。支持非Linux
系统,如苹果HFS文件系统和Windows的NTFS文件系统
systemd 是 linux 系统中最新的初始化系统(init),它主要的设计目标
是克服 sysvinit 固有的缺点,提高系统的启动速度。systemd 和
ubuntu 的 upstart 是竞争对手,但是时至今日 ubuntu 也采用了
4、在硬件驱动加载成功后,内核会主动呼叫systemd程序,并以
default.target流程开机
5、systemd执行sysinit.target初始化系统及basic.target准备操作系统
6、systemd启动multi-user.target下的本机与服务器服务
7、systemd执行multi-user.target下的/etc/rc.d/rc.local文件
8、systemd执行multi-user.target下的getty.target及登录服务
9、systemd执行graphical需要的服务
二,Init和Systemd的区别
init
1、启动时间长,init是串行启动,只有前一个进程启动完,才会启动下一个进程
2、启动脚本复杂,Init进程只是执行启动脚本,不管其他事情,脚本需要自己处
理各种情况,这往往使得脚本变得很长
3、由Linux内核加载运行,位于 /sbin/init ,是系统中第一个进程,PID永远为1
对于支持 service 的程序,安装的时候,会自动的在 /etc/init.d 目录添加一
个配置文件。当我们使用 service 控制程序时,比如执行开启httpd的服
务:service httpd start 。那么我们的 service 就会开启 /etc/init.d/httpd
配置文件里面指向的 /usr/sbin/httpd 可执行文件
systemd
1、按需启动服务,减少系统资源消耗。
2、尽可能并行启动进程,减少系统启动等待时间
3、由Linx内核加载运行,位于 /usr/lib/systemd/system,是系统中第一个进程,
PID永远为1
对于支持 systemd 的程序,安装的时候,会自动的在
/usr/lib/systemd/system 目录添加一个配置文件。当我们使用 systemctl
控制该程序时,比如执行开启httpd服务:systemctl start httpd.service 。
那么我们的 systemctl 就会开启 httpd.service 配置里面指向的
/usr/sbin/httpd 可执行文件
如果我们想让该程序开机启动,我们可以执行命令 systemctl enable
httpd,这个命令相当于在 /etc/systemd/system 目录添加一个软链接,指
向 /usr/lib/systemd/system 目录下的 httpd.service 文件。这是因为开机
时,Systemd只执行 /etc/systemd/system 目录里面的配置文件
三,init配置文件和systemd文件的区别
Init 进程的配置文件
/etc/init.d/ 服务启动脚本配置文件存放目录
/etc/inittab 默认运行级别配置文件
/etc/init/rcS.conf 系统初始化配置文件
/etc/init/rc.conf 各运行级别初始化的配置文件-
/etc/init/rcS-sulogin.conf 单用户模式启动 /sbin/sushell 环境的配置文件
/etc/init/control-alt-delete.conf 终端下的 ctrl+alt+del 热键操作的配置文件
/etc/sysconfig/init tty终端的配置文件
/etc/init/start-ttys.conf 配置tty终端的开启数量、设备文件
/etc/init/tty.conf 或 etc/init/serial.conf 控制tty终端的开启
Systemd进程的配置文件
/etc/systemd/system/default.target 取代/etc/inittab文件配置,通常符号链接到 /lib/systemd/system/graphical.target
/run/systemd/system/ 系统执行过程中所产生的服务脚本所在目录
/etc/systemd/system/ 里面存放着不同级别的开启自启服务
/usr/lib/systemd/system/ 和 /lib/systemd/system/ 和,两个文件完全一样,因为lib是/usr/lib的软链接 每个服务最主要的启动脚本设置,类似于之前的 /etc/init.d/
四,运行级别和说明
注:图形切字符 ctrl+alt+F2(F2-F6) 字符切回图形 alt + F1
查看运行级别:
runlevel : 显示切换前的运行级别 和当前运行级别
systemctl get-default : 显示当前运行级别
永久设置开机模式:
vim /etc/inittab #centos6
systemctl set-default multi-user.target/runlevel3 开机默认为文本模式
systemctl set-default graphical.target/runlevel5 开机默认为图形模式
五,Systemd服务管理
Systemd 是 Linux 系统中最新的初始化系统(init),它主要的设计目标是克服 sysvinit 固有的缺点,提高系统的启动速度。systemd和ubuntu的upstart是竞争对手,从15.04版本开始,Ubuntu也已经采systemd作为其标准的系统初始化系统.
系统初始化需要做的事情非常多。需要启动后台服务,比如启动 SSHD 服务;需要做配置工作,比如挂载文件系统。这个过程中的每一步都被systemd 抽象为一个配置单元,即 unit。可以认为一个服务是一个配置单元;一个挂载点是一个配置单元;一个交换分区的配置是一个配置单元;
Service unit:系统服务,最常见的类型 Target unit:多个 Unit 构成的一个组,执行环境类型 Device Unit:硬件设备 Mount Unit:文件系统的挂载点 Automount Unit:自动挂载点 Path Unit:侦测特定文件或目录类型的 Scope Unit:不是由 Systemd 启动的外部进程 Slice Unit:进程组 Snapshot Unit:Systemd 快照,可以切回某个快照 Socket Unit:进程间通信的 socket服务 Swap Unit:swap 文件 Timer Unit:循环执行的服务
Rhel6 用 service 和 chkconfig 来管理服务,它是 SystemV 架构下的一个工具。
Rhel7 是用 systemctl 来管理服务,它融合了之前的 service 和 chkconfig 的功能于一体。
可以使用它永久性或只在当前会话中启用/禁用服务。systemctl 是 systemd 架构下的一个工具。
systemd的一些常用命令:
RHEL7的服务systemctl脚本存放在:/usr/lib/systemd/目录,有系统(system)和用户(user)之分,像需要开机不登陆就能运行的程序,存在系统服务里,即:/usr/lib/systemd/system目录下。每一个服务以.service结尾,一般会分为3部分:[Unit]、[Service]和[Install],每个部分内部是一些等号连接的键值对,注意,键值对的等号两侧不能有空格。
vim /usr/lib/systemd/system/sshd.service [Unit] Description=OpenSSH server daemon Documentation=man:sshd(8) man:sshd_config(5) After=network.target sshd-keygen.service Wants=sshd-keygen.service [Service] Type=notify EnvironmentFile=/etc/sysconfig/sshd ExecStart=/usr/sbin/sshd -D $OPTIONS ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure RestartSec=42s [Install] WantedBy=multi-user.target [Unit] [Unit]区块通常是配置文件的第一个区块,用来定义 Unit 的元数据,以及 配置与其他 Unit 的关系。它的主要字段如下。 Description:简短描述 Documentation:文档地址 Requires:当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败 Wants:与当前 Unit 配合的其他 Unit,如果它们没有运行,当前 Unit 不会启动失败 BindsTo:与Requires类似,它指定的 Unit 如果退出,会导致当前 Unit 停止运行 Before:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之后 启动 After:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之前 启动 Conflicts:这里指定的 Unit 不能与当前 Unit 同时运行 Condition...:当前 Unit 运行必须满足的条件,否则不会运行 Assert...:当前 Unit 运行必须满足的条件,否则会报启动失败 [Service] [Service]部分是服务的关键,是服务的一些具体运行参数的设置,只有 Service 类型的 Unit 才有这个区块。它的主要字段如下。 Type:定义启动时的进程行为。它有以下几种值。 Type=simple:默认值,执行ExecStart指定的命令,启动主进程 Type=forking:以 fork 方式从父进程创建子进程,创建后父进程 会立即退出 Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继 续往下执行 Type=dbus:当前服务通过D-Bus启动 Type=notify:当前服务启动完毕,会通知Systemd,再继续往下 执行 Type=idle:若有其他任务执行完毕,当前服务才会运行 ExecStart:启动当前服务的命令 ExecStartPre:启动当前服务之前执行的命令 ExecStartPost:启动当前服务之后执行的命令 ExecReload:重启当前服务时执行的命令 ExecStop:停止当前服务时执行的命令 ExecStopPost:停止当前服务之后执行的命令 RestartSec:自动重启当前服务间隔的秒数 Restart:定义何种情况 Systemd 会自动重启当前服务,可能的值包括 always(总是重启)、on-success、on-failure、on-abnormal、onabort、on-watchdog TimeoutSec:定义 Systemd 停止当前服务之前等待的秒数 Environment:指定环境变量 [install] [Install]通常是配置文件的最后一个区块,用来定义如何启动,以及是否开 机启动。它的主要字段如下。 WantedBy:它的值是一个或多个 Target,当前 Unit 激活时 (enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中 RequiredBy:它的值是一个或多个 Target,当前 Unit 激活时,符号 链接会放入/etc/systemd/system目录下面以 Target 名 + .required后 缀构成的子目录中 Alias:当前 Unit 可用于启动的别名 Also:当前 Unit 激活(enable)时,会被同时激活的其他 Unit 注意: 如果服务没有Install段落,一般意味着应该通过其它服务自动调用它们 Target 简单说,Target 就是一个 Unit 组,包含许多相关的 Unit 。启动某个 Target 的时候,Systemd 就会启动里面所有的 Unit。从这个意义上说, Target 这个概念类似于"状态点",启动某个 Target 就好比启动到某种状 态。 传统的init启动模式里面,有 RunLevel 的概念,跟 Target 的作用很类似。 不同的是,RunLevel 是互斥的,不可能多个RunLevel同时启动,但是多个 Target可以同时启动。 //查看当前系统的所有 Target $ systemctl list-unit-files --type=target // 查看一个 Target 包含的所有 Unit $ systemctl list-dependencies multi-user.target //查看启动时的默认 Target $ systemctl get-default //设置启动时的默认 Target $ sudo systemctl set-default multi-user.target //切换 Target 时,默认不关闭前一个 Target 启动的进程, $ systemctl isolate 命令改变这种行为, //关闭前一个 Target 里面所有不属于后一个 Target 的进程 $ sudo systemctl isolate multi-user.target