在老的 Linux 发行版本中,系统运行分成不同的运行级别(run level),不同的级别所启动的服务搭配有所不同。较新的 Linux 发行版本,比如 CentOS 7+,已经将运行级别替换成另一个新的概念--目标(target)。本文会为大家做一个比较,并对两者间的区别做以诠释。

运行级别 Run Level

大家都知道 Windows 有安全模式,它是Windows的最小模式,和普通模式相比,安全模式可以让用户更好地进行系统检测以及错误修复。Linux 的运行级别是个类似的机制,不同的运行级别有不同的作用:

我们通常用到的是级别 3 和 5,一般服务器不需要安装图形界面,并且需要支持用户远程连接,所以运行级别会选择 3;个人电脑一般需要 GUI,所以会选择运行级别 5。

想查看当前系统的运行级别可以使用命令用到命令

#runlevel

N 5

上面的结果表示当前的运行级别是 5。在不同级别间切换可以使用命令

#init [运行级别]

比如当前运行在级别 3,是多用户字符界面,想要启动 GUI 图形界面,只需要输入 init 5

虽然运行级别可以实时切换,如果想修改系统启动时默认的运行级别,在 CentOS 5 和 6 中也可以修改 /etc/inittab 文件来进行配置。

系统初始化进程 systemd vs. init

在 CentOS 7 之前,系统的初始化进程是 init,它的 PID 是 1,初始化进程就是系统第一个被执行的程序,所有其他进程都是它的子进程,所以我们切换运行级别用到的命令是 init,系统启动默认运行级别的配置文件是 /etc/inittab。

从 CentOS 7 开始,系统初始化进程采用了全新的 systemd。从它的名字可以看出,它是一个服务,由系统自动在后台运行。和 init 相比,systemd 有一些明显的优势:

1) systemd 在系统启动时使用了并发的启动机制,而 init 是按顺序依次启动每项服务。实际上很多服务之间没有依赖关系,不需要依次等待。在 Linux 早期,计算机的CPU是单核的,一次只能处理一项任务,所以 init 的设计有它的合理性。但随着硬件技术发展,现在的服务器CPU大多是多核心的,可以同时处理多项任务,systemd 可以并发启动那些不相关的服务,所以系统启动速度得到了极大的提升。

2) systemd 是按需启动服务,而 init 是将所有后台服务统统启动,全部完成后才允许用户登录。init 的这种方式会使得系统启动比较慢,另外也会占用比较多的系统资源。systemd 采用的方式是只有某个服务被请求时才会启动它,使用完成后会动态将该服务关闭,所以不管是启动速度,还是系统资源的使用, systemd 都有很大的优势。

systemd 有两个核心的概念,单元(unit)和 目标(target)。systemd 进程对系统的管理就是通过一个个的单元来实现的。比如服务,每一个服务都有一个对应的单元,而且每个单元都有一个配置文件,配置文件通常以 .service 作为文件名后缀,像 sshd 服务,它的配置文件就是 /usr/lib/systemd/system/sshd.service

有一类比较重要的单元叫目标单元(target unit),或者简称目标(target),它们的配置文件名后缀为 .target。在 systemd 中,我们用 target 来模拟实现系统不同的运行级别。

通过目标(Target)来实现运行级别

上面提到,CentOS 7 将系统初始化进程从 init 改为了 systemd,init 的运行级别(runlevels)也改成了用目标(target)来实现,不同的运行级别和目标之间是什么对应关系呢,我们用下面这张图来做了一个总结:

常用的运行级别是 3 (多用户字符模式)和 5(多用户图形界面模式),它们分别对应的目标就是 multi-user.target 和 graphical.target。设置和切换不同的运行级别,CentOS 7 还是向前支持 init 命令,但是更建议我们使用 systemd 的管理工具 systemctl 来完成。

1) 查看当前系统默认运行,可以使用 systemctl get-default 命令

#systemctl get-default

multi-user.target

2) 切换不同运行级别,以管理员身份使用 systemctl [目标名称] 命令

#systemctl isolate graphical.target    切换到图形界面

3) 设置系统启动默认运行级别

在 CentOS 5 和 6 中,系统启动默认的运行级别可以在 /etc/inittab 文件中进行配置,但在 CentOS 7 中,我们打开这个配置文件看一下:

从配置文件内容可以看到,“在这里做任何的配置对系统都是没有作用的,systemd 用目标来取代运行级别。默认有两个主要的目标,multi-user.target 相当于运行级别 3,graphical.target 相当于运行级别 5。使用 systemctl get-default 来看当前使用目标,使用 systemctl set-default Target.target 来设置系统默认目标”。

所以我们用下面的命令来试一下,将系统启动目标设置为 graphical

#systemctl set-default graphical.target

设置成功后,重启电脑,发现果然进入了 GUI 图形界面模式。

最后

到这里,systemd 如何使用 target 来替换 init 的 runlevels 就介绍完了。可能很多老 Linux 用户还是比较习惯于用 init,但毕竟 systemd 是更一种更先进的技术和方式,大家还是应该更积极地去接受并学习它。

推荐阅读:

《软链接 vs. 硬链接》

《Linux 目录详解》

《虚拟机安装 Linux 最完整攻略》

《Xshell 与 Xftp 的安装与使用》

《Linux,Unix,GNU 到底有什么样的渊源?》

- The End -

Linux的运行等级与目标的更多相关文章

  1. linux系统启动过程及运行等级详解

    一.启动过程 1. 开机流程简述 1)加载BIOS硬件信息,并获取第一个启动设备的代号 2)读取第一个启动设备的MBR的引导加载程序的启动信息 3)加载核心操作系统的核心信息,核心开始解压缩,并且尝试 ...

  2. telint---切换当前正在运行的Linux系统的运行等级

    telint命令用于切换当前正在运行的Linux系统的运行等级 Send control commands to the init daemon. --help Show this help --no ...

  3. Linux下面有7个运行等级  run level

    Linux下面有7个运行等级  run level run level 0  系统停机状态,系统默认运行级别不能设为0,否则不能正常启动 run level 1  单用户工作状态,root权限,用于系 ...

  4. 【无私分享:ASP.NET CORE 项目实战(第十章)】发布项目到 Linux 上运行 Core 项目

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 ASP.Net Core 给我们带来的最大的亮点就是跨平台,我在我电脑(win7)上用虚拟机建了个 CentOS7 ,来演示下 ...

  5. linux 系统运行级别及修改[转]

    Linux运行级别从0-6,共7个. 0:关机.不能将系统缺省运行级别设置为0,否则无法启动. 1:单用户模式,只允许root用户对系统进行维护. 2:多用户模式,但不能使用NFS(相当于Window ...

  6. Linux的运行级别和chkconfig用法

    Linux的运行级别和chkconfig用法        一.Linux的运行级别 在装MySQL的时候,才知道了Linux的运行级别这么一回事.汗…自己太水了…下面总结一下: 什么是运行级别呢?简 ...

  7. 在Linux上运行C#

    众所周知,C#是Microsoft推出的.NET语言,只能在.NET平台上运行,例如Win 9x.ME.NT.2000.XP和Win CE之类的操作系统.但是,现在却有了一个叫做Mono的项目,它的目 ...

  8. 发布项目到 Linux 上运行 Core 项目

    发布项目到 Linux 上运行 Core 项目 目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 ASP.Net Core 给我们带来的最大的亮点就是跨平台,我在我电脑(win ...

  9. linux/unix运行级别

    在SYSTEM V 风格的UNIX系统中,系统被分为不同的运行级别,这和BSD分支的UNIX有所不同,常用的为0~6七个级别:0关机 1单用户 2不带网络的多用户 3带网络的多用户 4保留,用户可以自 ...

随机推荐

  1. Nginx重写请求后将url?后的参数去除

    2019独角兽企业重金招聘Python工程师标准>>> 使用?结尾     注意,关键点就在于"?"这个尾缀.重定向的目标地址结尾处如果加了?号,则不会再转发传递 ...

  2. 虚拟化学习笔记-KVM虚拟化跨机迁移原理

    参考:https://zhuanlan.zhihu.com/p/27055555 在线迁移过程划分为三个阶段:准备阶段.迁移阶段和切换阶段.迁移环境为虚拟化底层KVM+Qemu.虚拟化管理Libvir ...

  3. Geomesa-Hbase集群部署

    本文记录一下Geomesa-Hbase集群部署,在单机部署的基础上 https://www.cnblogs.com/help-silence/p/12817447.html 1.搭建集群 https: ...

  4. 小老板,我300M的网,网速很慢怎么办?

    首先考虑是不是DNS的问题: 我们先测试一下! 一.Google的DNS: 8.8.8.8 丢包严重 PASS但是扶墙的时候是必备的,如果有扶墙的需求的话可以备用. 二.百度DNS 180.76.76 ...

  5. 数学--数论--HDU1222 狼和兔子(最大公约数)

    问题描述 有一座周围有n个洞的小山.孔从0到n-1有符号. 兔子必须藏在其中一个洞中.狼以逆时针方向搜索兔子.他第一个进入的洞是一个用0签名的洞.然后,他将每m个洞进入一个洞.例如,m = 2和n = ...

  6. 轻量化模型:MobileNet v2

    MobileNet v2 论文链接:https://arxiv.org/abs/1801.04381 MobileNet v2是对MobileNet v1的改进,也是一个轻量化模型. 关于Mobile ...

  7. Entity Framework使用EntityState和Attach来保存数据变化以及更新实体的个别字段

    在使用Entity Framework作为ORM来存取数据的过程中,最常规的操作就是对数据对象的更新.本文将会包含如何Attach Entity到一个数据Context中,以及如何使用EntitySt ...

  8. C# 多线程(18):一篇文章就理解async和await

    目录 前言 async await 从以往知识推导 创建异步任务 创建异步任务并返回Task 异步改同步 说说 await Task 说说 async Task 同步异步? Task封装异步任务 关于 ...

  9. React Hooks总结

    Hook 前言 什么是Hook 自从 16.8 版本开始,hooks 的出现使得你可以在不编写 class 的情况下使用状态管理以及其它 React 的特性. 那么在 React Hooks 出现之前 ...

  10. spring的单元测试

    如果spring 4.3.18这个版本的spring要使用junit,需要使用junit的junit-4.12之上的版本.使用这个版本junit的时 候需要引入hamcrest-all的jar包.之前 ...