当前位置: 首页 > news >正文

Linux 学习笔记(9)

九、 运行级别
1 Linux 系统的运行级别 (runlevel)
Linux 系统有 7 个运行级别, Linux 系统任何时候都运行在一个指定的运行级别上,不同的运行级
别所运行的程序和服务不尽相同,所要完成的工作和要达到的目的也不相同
· 运行级别 0 系统停机 (halt) 状态,系统的默认运行级别不能设为 0 ,否则不能正常启动
· 运行级别 1 单用户工作 (single user) 状态, root 权限,用于系统维护,禁止远程登陆
· 运行级别 2 多用户 (multiuser) 状态 ( 没有 NFS)
· 运行级别 3 完全的多用户 (multiuser) 状态 ( NFS) ,登陆后进入控制台命令行模式
· 运行级别 4 系统未使用,保留
· 运行级别 5 X11 控制台 (xdm gdm kdm) ,登陆后进入图形 GUI 模式 · 运行级别 6 系统正常关闭并重启 (reboot) ,默认运行级别不能设为 6 ,否则不能正常启动
2 、运行级别的原理
在目录 /etc/rc.d/init.d 下有许多服务器脚本程序,一般称为服务 (service) , 在 /etc/rc.d
7 个名为 rcN.d 的目录,其中 N=0-6 ,对应于系统的 7 个运行级别, rcN.d 目录下,都是
一些符号链接文件,这些链接文件都指向 init.d 目录下的 service 脚本文件,这些链接文件的命
名规则是 "K+nn+ 服务名 " "S+nn+ 服务名 " ,其中 nn 2 位数字:
: rc3.d 目录下的链接文件 S80sendmail 就指向 service 脚本文件 ../init.d/sendmail
系统会根据指定的 runlevel 进入对应的 rcN.d 目录,并按照文件名顺序检索目录下的链接文件
• 对于以 K 为开头的链接文件,系统将终止对应的服务
• 对于以 S 为开头的链接文件,系统将启动对应的服务
通过这种方式来实现 " 不同的运行级别运行不同的程序和服务 "
3 /etc/inittab 配置文件详解
init 的进程号是 1 ,从这一点就能看出, init 进程是系统所有进程的起点, Linux 在完成核内引导以后,
就开始运行 init 程序, init 程序需要读取设置文件 /etc/inittab inittab 是个不可执行的文本文件,他有若
干行指令所组成。在 Redhat 系统中, inittab 的内容如下所示 ( 以“ ###" 开始的中注释为笔者增加的 )
如果你改变了 inittab 文件,那么要使他立即生效,需要使用一个命令: init q
#
# inittab This file describes how the INIT process should set up
# the system in a certain run-level.
#
# Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
# Modified for RHS Linux by Marc Ewing and Donnie Barnes
#
# Default runlevel. The runlevels used by RHS are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
### 表示当前缺省运行级别为 5(initdefault)
id:5:initdefault:
### 启动时自动执行 /etc/rc.d/rc.sysinit 脚本 (sysinit)
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2 l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
### 当运行级别为 5 时,以 5 为参数运行 /etc/rc.d/rc 脚本, init 将等待其返回 (wait)
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
### 在启动过程中允许按 CTRL-ALT-DELETE 重启系统
# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
# When our UPS tells us power has failed, assume we have a few minutes
# of power left. Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
### 2 3 4 5 级别上以 ttyX 为参数执行 /sbin/mingetty 程序,打开 ttyX 终端用于用户登录,
### 如果进程退出则再次运行 mingetty 程序 (respawn)
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
### 5 级别上运行 xdm 程序,提供 xdm 图像方式登录界面,并在退出时重新执行 (respawn)
# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm -nodaemon
以上面的 inittab 文件为例,来说明一下 inittab 的格式。其中以 # 开始的行是注释行,除了注释行之
外,每一行都有以下格式:
id:runlevel:action:process
对上面各项的周详解释如下:
1. id
id 是指入口标识符,他是个字符串,对于 getty mingetty 等其他 login 程序项,需求 id tty 的编
号相同,否则 getty 程序将不能正常工作。
2. runlevel
runlevel init 所处于的运行级别的标识,一般使用 0 6 S s 0 1 6 运行级别被系统保留:
其中 0 作为 shutdown 动作, 1 作为重启至单用户模式, 6 为重启; S s 意义相同,表示单用户模式,
且无需 inittab 文件,因此也不在 inittab 中出现,实际上,进入单用户模式时, init 直接在控制台
/dev/console )上运行 /sbin/sulogin 。在一般的系统实现中,都使用了 2 3 4 5 几个级别,在 Redhat
系统中, 2 表示无 NFS 支持的多用户模式, 3 表示完全多用户模式(也是最常用的级别), 4 保留给用户
自定义, 5 表示 XDM 图像登录方式。 7 9 级别也是能使用的,传统的 Unix 系统没有定义这几个级别。
runlevel 能是并列的多个值,以匹配多个运行级别,对大多数 action 来说,仅当 runlevel 和当前运行级
别匹配成功才会执行。
3. action
action 是描述其后的 process 的运行方式的。 action 可取的值包括: initdefault sysinit boot bootwait
等:
initdefault 是个特别的 action 值,用于标识缺省的启动级别;当 init 由核心激活以后,他将读取 inittab
中的 initdefault 项,取得其中的 runlevel ,并作为当前的运行级别。如果没有 inittab 文件,或其中没有
initdefault 项, init 将在控制台上请求输入 runlevel
sysinit boot bootwait action 将在系统启动时无条件运行,而忽略其中的 runlevel
其余的 action (不含 initdefault )都和某个 runlevel 相关。各个 action 的定义在 inittab man 手册
中有周详的描述。
4. process
process 为具体的执行程序。程序后面能带参数。
第三部分:系统初始化
init 的设置文件中有这么一行:
si::sysinit:/etc/rc.d/rc.sysinit
他调用执行了 /etc/rc.d/rc.sysinit ,而 rc.sysinit 是个 bash shell 的脚本,他主要
init 的设置文件中有这么一行:
si::sysinit:/etc/rc.d/rc.sysinit
他 调用执行了 /etc/rc.d/rc.sysinit ,而 rc.sysinit 是个 bash shell 的脚本,他主要是完成一些系统初始化的
工作, rc.sysinit 是每一个运行级别都要首先运行的重要脚本。他主要完成的工作有:激活交换分区,检
查磁盘,加载硬件模块及其他一些需要优先执行任务。 rc.sysinit 约有 850 多行,不过每个单一的功能还是比较简单,而且带有注释,建议有兴趣的用户能自行
阅读自己机器上的该文件,以了解系统初始化所周详情况。由于此文件较长,所以不在本文中列出来,
也不做具体的介绍。
rc.sysinit 程序执行完毕后,将返回 init 继续下一步。
第四部分:启动对应运行级别的守护进程
rc.sysinit 执行后,将返回 init 继续其他的动作,通常接下来会执行到 /etc/rc.d/rc 程序。以运行级别 5
为例, init 将执行设置文件 inittab 中的以下这行:
l5:5:wait:/etc/rc.d/rc 5
这一行表示以 5 为参数运行 /etc/rc.d/rc /etc/rc.d/rc 是个 Shell 脚本,他接受 5 作为参数,去执行 /etc/rc.d
/rc5.d/ 目录下的所有的 rc 启动脚本, /etc/rc.d/rc5.d/ 目录中的这些启动脚本实际上都是一些链接文件,
而不是真正的 rc 启动脚本,真正的 rc 启动脚本实际上都是放在 /etc/rc.d/init.d/ 目录下。而这些 rc 启动
脚本有着类似的用法,他们一般能接受 start stop restart status 等参数。
/etc/rc.d/rc5.d/ 中的 rc 启动脚本通常是 K S 开头的链接文件,对于以以 S 开头的启动脚本,将以 start
参数来运行。而如果发现存在相应的脚本也存在 K 打头的链接,而且已处于运行态了 ( /var/lock/subsys/
下的文件作为标志 ) ,则将首先以 stop 为参数停止这些已启动了的守护进程,然后再重新运行。这样做
是为了确保是当 init 改动运行级别时,所有相关的守护进程都将重启。
至于在每个运行级中将运行哪些守护进程,用户能通过 chkconfig setup 中的 "System Services" 来自行
设定。常见的守护进程有:
amd :自动安装 NFS 守护进程
apmd: 高级电源管理守护进程
arpwatch :记录日志并构建一个在 LAN 接口上看到的以太网地址和 IP 地址对数据库
autofs :自动安装管理进程 automount ,和 NFS 相关,依赖于 NIS
crond Linux 下的计划任务的守护进程
named DNS 服务器
netfs :安装 NFS Samba NetWare 网络文件系统
network :激活已设置网络接口的脚本程序
nfs :打开 NFS 服务
portmap RPC portmap 管理器,他管理基于 RPC 服务的连接
sendmail :邮件服务器 sendmail
smb Samba 文件共享 / 打印服务
syslog :一个让系统引导时起动 syslog klogd 系统日志守候进程的脚本
xfs X Window 字型服务器,为本地和远程 X 服务器提供字型集
Xinetd :支持多种网络服务的核心守护进程,能管理 wuftp sshd telnet 等服务
这些守护进程也启动完成了, rc 程序也就执行完了,然后又将返回 init 继续下一步。
第五部分:建立终端
rc 执行完毕后,返回 init 。这时基本系统环境已设置好了,各种守护进程也已启动了。 init 接下来会打
6 个终端,以便用户登录系统。通过按 Alt+Fn(n 对应 1-6) 能在这 6 个终端中转换。在 inittab 中的以下
6 行就是定义了 6 个终端:
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6 从上面能看出在 2 3 4 5 的运行级别中都将以 respawn 方式运行 mingetty 程序, mingetty 程序能打
开终端、设置模式。同时他会显示一个文本登录界面,这个界面就是我们经常看到的登录界面,在这个
登录界面中会提示用户输入用户名,而用户输入的用户将作为参数传给 login 程序来验证用户的身份。
第六部分:登录系统,启动完成
对于运行级别为 5 的图像方式用户来说,他们的登录是通过一个图像化的登录界面。登录成功后能直接
进入 KDE Gnome 等窗口管理器。而本文主要讲的还是文本方式登录的情况:
当我们看到 mingetty 的登录界面时,我们就能输入用户名和密码来登录系统了。
Linux 的账号验证程序是 login login 会接收 mingetty 传来的用户名作为用户名参数。然后 login
对用户名进行分析:如果用户名不是 root ,且存在 /etc/nologin 文件, login 将输出 nologin 文件的内容,
然后退出。这通常用来系统维护时防止非 root 用户登录。只有 /etc/securetty 中登记了的终端才允许 root
用户登录,如果不存在这个文件,则 root 能在所有终端上登录。 /etc /usertty 文件用于对用户作出附加
访问限制,如果不存在这个文件,则没有其他限制。
在分析完用户名后, login 将搜索 /etc/passwd /etc/shadow 来验证密码及设置账户的其他信息,比如:
主目录是什么、使用何种 shell 。如果没有指定主目录,将默认为根目录;如果没有指定 shell ,将默认
/bin/bash
login 程序成功后,会向对应的终端在输出最近一次登录的信息 ( /var/log/lastlog 中有记录 ) ,并检查用
户是否有新邮件 ( /usr/spool /mail/ 的对应用户名目录下 ) 。然后开始设置各种环境变量:对于 bash 来说,
系统首先寻找 /etc/profile 脚本文件,并执行他;然后如果用户的主目录中存在 .bash_profile 文件,就执
行他,在这些文件中又可能调用了其他设置文件,所有的设置文件执行后后,各种环境变量也设好了,
这时会出现大家熟悉的命令行提示符,到此整个启动过程就结束了。
4 、相关命令
4.1 、查看当前系统运行等级
[root@test ~]# runlevel
N 5
//’N’ 代表先前的 Runlevel; ‘5’ 代表目前的 Runlevel
4.2 、切换系统运行等级
#init N
// 切换到运行级别 N
# init 0
// 关机
# init 6
// 重启动系统

相关文章:

  • Springboot同一台服务器部署多个项目,导致redis混淆,如何根据不同项目区分
  • 【NR 定位】3GPP NR Positioning 5G定位标准解读(四)
  • 全量知识系统问题及SmartChat给出的答复 之6 三套工具之1
  • Unity(第二十三部)导航
  • oracle基础体系
  • 安装Docker及DockerCompose
  • LockBit病毒入侵揭秘:如何防范与应对
  • (libusb) usb口自动刷新
  • YOLO V5、SAM、RESNET50模型在GPU环境下搭建过程
  • pytorch项目代码记录
  • 【亚马逊云科技】通过Amazon CloudFront(CDN)快速访问资源
  • C++ 面试题
  • 独立游戏《星尘异变》UE5 C++程序开发日志2——创建并编写一个C++类
  • 【java-面试题】start和run的区别
  • 从零开始学习Netty - 学习笔记 -Netty入门【半包,黏包】
  • 2018一半小结一波
  • create-react-app项目添加less配置
  • Druid 在有赞的实践
  • JavaScript设计模式之工厂模式
  • Java知识点总结(JavaIO-打印流)
  • maven工程打包jar以及java jar命令的classpath使用
  • orm2 中文文档 3.1 模型属性
  • spring boot 整合mybatis 无法输出sql的问题
  • Vue.js源码(2):初探List Rendering
  • 前端存储 - localStorage
  • 数据可视化之 Sankey 桑基图的实现
  • 微信公众号开发小记——5.python微信红包
  • 新版博客前端前瞻
  • 原生Ajax
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • 阿里云ACE认证之理解CDN技术
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • # 飞书APP集成平台-数字化落地
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #NOIP 2014# day.2 T2 寻找道路
  • #大学#套接字
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (4)STL算法之比较
  • (ros//EnvironmentVariables)ros环境变量
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (四)汇编语言——简单程序
  • (转)Sublime Text3配置Lua运行环境
  • (转)原始图像数据和PDF中的图像数据
  • .Net core 6.0 升8.0
  • .net FrameWork简介,数组,枚举
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .ui文件相关
  • @RequestParam详解
  • [ IO.File ] FileSystemWatcher
  • [14]内置对象
  • [2016.7.Test1] T1 三进制异或
  • [202209]mysql8.0 双主集群搭建 亲测可用
  • [Android View] 可绘制形状 (Shape Xml)