/etc/inittab文件说明

article/2025/9/26 13:15:03

        本文将把/etc/inittab作为研究起点,向外扩展辐射相关系统知识并一一进行说明。

        在Linux系统中,/etc/inittab配置文件用来设置系统的默认运行级别。什么是系统的运行级别?且看下文。

一、Linux系统的运行级别

        1、7个运行级别

        Linux系统有7个运行级别(runlevel),它们分别是:

        运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动;

        运行级别1:单用户工作状态,root权限,用于系统维护,禁止运程登陆 ;

       运行级别2:多用户状态(没有NFS);

        运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式;

        运行级别4:系统未使用,保留;

        运行级别5:X11控制台,登陆后进入图形GUI模式;

        运动级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动。

        2、运行级别的原理

        (1)在目录/etc/rc.d/init.d中有许多服务脚本,一般称为服务(service)。这里要说明一下,/etc/rc.d/init.d这个目录并不是固定的,由于后续各子系统开发过程中的调整,这个目录也可能为/etc/init.d或其它目录。另外,在这个服务脚本目录中可以设置服务自启动;

        (2)在/etc/rc.d(或/etc/)下有7个名为rcN.d的目录,对应系统的7个运行级别;

        (3)rcN.d目录下都是一些链接文件,这些文件都链接到init.d目录下的service脚本,它的命名规则是K+nn+服务名或S+nn+服务名,其中nn为两位数字;

        (4)系统会根据指定的运行级别进入到相应的rcN.d目录,并按照文件名顺序检索目录下手链接文件:对于以K开头的文件,系统将终止对应的服务,对于以S开头的文件,系统将启动对应的服务;

        (5)查看当前运行级别的命令:runlevel;

        (6)进入其他运行级别的命令:init N

        (7)init0为关机,init 6为重启系统。

二、inittab文件

        1、作用及使用流程        

        Linux内核启动完成后,内核通过启动第一个用户进程(init进程)来启动其他用户的进程或服务,因此init是Linux系统中所有进程的父进程。

        init进程将解析inittab文件,运行操作系统的配置脚本,对Linux系统进行初始化。这个解析与运行过程如下:

         2、格式分析

        inittab是一个不可执行的文本文件,它被要求按照固定的格式书写,从而便于init进程识别。inittab的每一行都是一个登记项,它的结构如下:

identifier:run_level:action:process

        (1)identifier

        identifier是每个登记项的标识符,最多为4个字符,用于唯一标识每个登记项,不能重复

        (2)run_level

        run_level是系统运行级别,用于指定相应的登记项在哪个运行级别中处理。如果该字段为空, 那么相应的登记项将适用于所有的运行级别。在该字段中,可以同时指定一个或多个运行级别,其中各运行级别分别以数字0.1.2.3.4.5.6表示,且无需对其进行分隔

        (3)action

        表示对应登记项的process在一定条件下所要执行的动作:

动作作用
respawninit应该监视这个进程,即使它结束也应该被重新启动
waitinit应该运行这个进程一次,并等待其结束后再进行下一步操作
once       init只运行一次该进程
boot系统地运行该进程
bootwait在系统启动时运行,init等待进程完成
ctrlaltdel当Ctrl+Alt+Del三个键同时按下时运行,把SIGINT信号发送给init
sysinit在运行boot或bootwait进程之前运行
powerfail当init收到SIGWR信号时运行
powerokwait当收到SIGWD信号且/etc/文中 的电源状态包含OK时运行
powerwait当收到SIGPWD信号,并且init等待进程结束时运行。

        (4)process

        pocess表示所要执行的shell命令。任何合法的shell语法都适用于该字段。

        3、举例

        以之前使用qemu模拟开发板中的inittab为例进行说明:

# /etc/inittab
::sysinit:/etc/init.d/rcS    #系统开机或重新启动时执行rcS文件
console::askfirst:-/bin/sh    #系统启动后,运行登陆程序
::ctrlaltdel:/sbin/reboot    #按下组合键“Ctrl+Alt+Del”,重启Linux系统
::shutdown:/bin/umount -a -r    #系统关机时,卸载所有文件系统
::restart:/sbin/init        #重启init进程
#所有的runlevel都为空,因此适用于所有runlevel

        需要说明:“-/bin/sh”中的“-”是有用处的,加上这个“-”,那么 会在登陆终端之后调用/etc/目录下的profile文件,而不加“-”则不会执行这个脚本。

三、为什么没有/etc/inittab

        在旧式的System V initialization中,/etc/inittab可是个相当重要的文件。init进程启动后第一时间找的就是它!inittab负责初始化系 统,设置系统runlevel及进 入各runlevel对应要执行的命令。假设当前inittab中设置的默认runlevle是5,则init会运行/etc/init.d/rc 5命令,该命令会依据系统服务的依赖关系遍历执行/etc/rc5.d中的脚本/程序。进入/etc/rc5.d目录可以发现里面的文件都是到/etc /init.d/下对应的脚本/程序的软链接。以S开头的为启动的意思,以K开头的为停止。并且S/K后面的两位数数字代表了服务的启动顺序(由服务依赖 关系决定)。

        那么Upstart job是怎么样的呢?我们知道,System V initializaiton是以runlevel为核心,依据服务间依赖关系的init方式,但在Upstart job,runlevel虽说对于服务的启动也有影响但已不是关键所在。Upstart job是事件驱动的,系统服务的启动、停止等等均是由事件决定的,反过来,系统服务的启动、停止也可以作为事件源触发其他服务。并且事件并不一定得由系统内部产生, 用户可以手工的键入start/stop [Service]产生事件来启动/终止服务。man upstart-evnets查看upstart job所定义的事件,可以发现,runlevel也被当作事件来对待(因runlevel的改变而产生的事件),诸如此类还有其他如 startup,started,filesystem等等。那么系统服务又是如何知道自己应该什么时候启动,什么时候终止的呢?答案就在 于/etc /init中(有的distros可能是在/etc/event.d)。进入/etc/init目录下一看,均是系统服务的配置文件,或者说,是job definition files。(实际上Upstart init只需要/etc/init这么一个目录,不像System V init,“拐弯抹脚”转好多圈才到达目的地,在性能上不如前者)。

        Ubuntu采用的就是Upstart job,它的init并不会直接奔着/etc/init.d或者/etc/rc${runlevel}.d/而去,它采用了折衷的办法,通过 /etc/init下的某些配置文件调用/etc/rc${runlevel}.d/中的脚本以启动采用旧式System V-style的服务。(这是精髓)


http://chatgpt.dhexx.cn/article/ww7DhgPI.shtml

相关文章

就是找不到inittab

解决办法1 因为版本更新现在已经不用inittab文件了 而是再这里找 代码 sudo raspi-config 我要找的是关闭串口登录的文件 #T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100 需要用#注释掉行 sudo raspi-config 这个代码直接图形化了 先选interfacing options (各…

inittab脚本启动解析

init的进程号为1,是所有进程的父进程,内核初始化完毕之后,init程序开始运行。其他软件也同时开始运行。init程序通过/etc/inittab文件进行配置。 /etc/inittab文件格式:id:run-levels:action:process,共包含4项,用冒号…

制作嵌入式根文件系统

首先介绍点背景知识,关于inittab的: init进程是系统中所有进程的父进程,init进程繁衍出完成通常操作所需的子进程,这些操作包括:设置机器名、检查和安装磁盘及文件系统、启动系统日志、配置网络接口并启动网络和邮件服务&#xff…

Java 类加载的过程

文章目录 类加载的过程一、加载二、验证三、准备四、解析五、初始化 类加载的过程 一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载(Loading)、验证(Verifification)、…

类加载过程是怎样的?

典型回答 一般来说,我们把Java的类加载过程分为三个主要步骤:加载、链接、初始化,具体行为在Java虚拟机规范里有非常详细的定义。 加载阶段(Loading):它是Java将字节码数据从不同的数据源读取到JVM中&…

类加载机制。

文章目录 一、类加载机制:二、类加载器:三、双亲委派机制: 一、类加载机制: 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Cl…

什么是类加载?

类加载 什么是类加载机制? 类加载机制是指虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是拟虚拟机的类加载机制。 如何区分一个文件的文件的类…

(一) 类加载过程详解 (类加载机制 第一篇)

当我们用java命令运行某个类的main函数启动程序时,首先需要通过类加载器把主类加载到 JVM。 package com.shendu;public class JvmTest01 {public static final int initData 666; public int compute() { int a 1;int b 2;int c (a b) * 10;return c;}public…

JVM(三):类加载机制(类加载过程和类加载器)

一、为什么要使用类加载器? Java语言里,类加载都是在程序运行期间完成的,这种策略虽然会令类加载时稍微增加一些性能开销,但是会给java应用程序提供高度的灵活性。例如: 1.编写一个面向接口的应用程序,可能…

类加载机制(类加载过程和类加载器)

一、为什么要使用类加载器? Java语言里,类加载都是在程序运行期间完成的,这种策略虽然会令类加载时稍微增加一些性能开销,但是会给java应用程序提供高度的灵活性。例如: 1.编写一个面向接口的应用程序,可能…

类加载的过程是怎样的?

写在前面 本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和文献引用请见100个问题搞定Java虚拟机 解答 JVM加载java类就是将字…

类加载(基本说明、流程图、类加载各个阶段完成的任务)

目录 基本说明 类加载过程流程图 类加载各阶段完成的任务 加载阶段 ​编辑 连接阶段-验证 连接阶段-准备 连接阶段-解析 Initialization(初始化) 类加载就是当字节码文件有了过后,进行下一步工作,不管是创建对象,还是干其…

什么是类的加载

一、什么是类的加载 java文件通过编译器变成了.class文件,接下来类加载器又将这些.class文件加载到JVM中。其中类装载器的作用其实就是类的加载。 其实,类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料…

Windows下cmd命令—systeminfo

该命令是Windows中用于显示关于计算机及其操作系统的详细配置信息,包括操作系统配置、安全信息、产品 ID 和硬件属性,如 RAM、磁盘空间和网卡和补丁信息等。 例如:查看自己的计算机是32位还是64位 可以通过如下步骤: ①首先&…

SysInfoTools MS SQL Transaction Log Recovery 22.0

SysInfo DBF 修复工具专门用于修复由 dBase II IV、V Visual FoxPro、Clipper、dBXL、dBFast、CodeBase、MultiBase、Arago 生成的损坏、损坏和无法访问的 DBF 文件。从 SysInfoTools 下载最新和更复杂的基于 Windows 的应用程序 DBF 恢复实用程序,它可以一次性完美…

MASM32编程完善SysInfo遇到奇怪故障,真切感受全局变量和局部变量之别……

SysInfo主要是通过WMI来获取系统信息的,但是WMI获取的操作系统信息中没有Windows操作系统是32位还是64位的内容,所以需要另外想办法编程获取,比较常见的方法是调用Windows API函数GetNativeSystemInfo()或IsWow64Process()。之前分别用MASM32…

系统信息:uname,sysinfo,gethostname,sysconf

且欲近寻彭泽宰,陶然共醉菊花怀。 文章目录 系统信息系统标识 unamesysinfo 函数gethostname 函数sysconf()函数 系统信息 系统标识 uname 系统调用 uname()用于获取有关当前操作系统内核的名称和信息,函数原型如下所示(可通过"man 2 …

Django-搭建sysinfo获取系统信息

文章目录 前言一、项目搭建二、主机信息监控三、Celery定时任务和异步任务 前言 使用Django,搭建sysinfo,Linux中,sysinfo是用来获取系统相关信息的结构体 本篇基于:https://github.com/hypersport/sysinfo#readme项目借鉴路径: https://gi…

SysInfo(电脑系统信息)0.0.0.1beta2

文件说明符 : D:\masm32\wmi\sysInfo\sysInfo0.0.0.1beta2.exe 属性 : A--- 数字签名:否 PE文件:是 语言 : 中文(简体,中国) 文件版本 : 0.0.0001 beta2 说明 : 电脑系统信息 版权 : PurpleEndurer 产品版本 : 0.0.0001 beta2 产品名称 : 电脑系统信息 公司名称 : P…

sysinfo函数、结构体使用

1&#xff0c;头文件&#xff1a; #include <sys/sysinfo.h>2&#xff0c;函数声明&#xff1a; int sysinfo(struct sysinfo *info);3&#xff0c;返回值&#xff1a; 成功返回0&#xff0c;错误返回-1&#xff1b; 4&#xff0c;sysinfo结构体名称 Linux 2.3.23(i38…