`
- 浏览:
864348 次
- 性别:
- 来自:
济南
-
- linux运行级别
linux启动之后会在一个级别运行,下面列出了这些运行级别:
0 系统停止
1 单用户系统,不需要登陆
2 多用户系统但不支持NFS,命令行模式登陆
3 完整多用户模式,命令行模式登陆
4 未用
5 X11图形模式,图形模式登陆
6 重新启动系统
这些可以在/etc/initab文件中可以看到0-6级的注释,代码段如下:
# 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)
1.级别 0
系统停止。注意不要把该级别设置为默认模式,否则系统每次启动以后就会自动停止,无法进入。
这个运行级别主要用于关闭任务,在 rc0.d 目录下的各个连接命令都是此级别的命令。在关闭时,这些命令逐个执行。它们将杀掉所有进程、关闭虚拟内存和交换文件、卸载文件系统和交换分区。
关机操作在 DOS 下和 Linux 下截然不同。在 DOS 提示符下,可以很放心地直接关闭电源。但是,在 Linux 下不能这么做。Linux 的文件系统在启动时被装入,在关闭时要被卸载。这种差别正是 Linux 强大功能的前提。
在 Linux 下,要通过输入命令 shutdown 加上参数来关闭、重启计算机或者通过按下热键“Ctrl”+“Alt”+“Del”来重新启动。
2.级别 1
单用户模式。该模式只能许可一个用户从本地计算机上登录 rc1.d 目录下的所有文件与此运行级别相连。此运行级别一般用于系统管理与维护,如:给 Linux 系统升级,安装新软件等等。
在此模式下,只能由管理员进入而其他用户无法登录。因为在启动时,文件系统被加载但是网络却没有被加载,无法通过网络登录。
3.级别 2
多用户模式。用户可以通过网络进行登录。在不支持网络的情况下该模式和模式 3 是相的,rc2.d 目录下所有文件与此级别相连。
4.级别 3
完全多用户模式。这是缺省的运行模式,在此模式下所有网络服务程序一起运行。rc3.d录下的文件与此级别相连。
5.级别 4
未使用模式,rc4.d 目录与此级别相连。这一级别是用户自定义的运行级别,用户可以根需要自己定义。如果想运行此级别的话,必须在 rc3.d 目录下放入连接文件,就像其他 rc*.d目录下的文件,并指明是启动还是终止进程。
6.级别 5
在 Linux 下运行 X Window 就是使用这一级别。在此级别下除了因特网的域名服务器的named 与级别 3 不同,其余的都相同。
7.级别 6
这
是个重新启动系统的运行级别。rc6.d 目录与此级别相连。既然是重新启动也就是关闭当前系统,但不关闭电源,所以此目录下的连接与级别为 0 的在
rc0.d 下的连接基本相同。不同之处在于,虽然它们都执行 halt(关闭)命令,但是给 halt 传递的参数不一样,因而级别 6
能够重新启动系统。
- inittab文件解释
inittab文件的格式:
label:runlevel:action:process
label:
1~4字符的标签,可以是任意字符构成的字符串,表示输入的值。一些系统label为2个字符。某些特定的标签是常用的,在Red Hat Linux中使用的标签是:
id 用来定义缺省的init运行的级别
si 是系统初始化的进程
ln 其中的n从1~6,指明该进程可以使用的runlevel的级别
ud 是升级进程
ca 指明当按下Ctrl+Alt+Del是运行的进程
pf 指当UPS表明断电时运行的进程
pr 是在系统真正关闭之前,UPS发出电源恢复的信号时需要运行的进程
x 是将系统转入X终端时需要运行的进程
runlevel:
定义该记录项被调用时的运行级别,可以由一个或多个运行级别构成,也可以是空,空则代表运行级别0~6.
当请求init改变运行级别时,那些rstate字段中不包括新运行级别的进程将收到SIGTERM警告信号,并且最后被杀死;只有a、b、c启动的命令外(a、b、c不是真正的运行级别) ????
action:
定义了该进程应该运行在何种状态下,即如何处理process字段指定的进程.
代码:
boot 只有在系统启动时,init才处理这样的记录项,启动相应进程,忽略runlevel,并不等待处理结束就去处理下一个记录项。当这样的进程终止时,系统也不重启它。
bootwait 系统启动后,当第一次从单用户模式进入多用户模式时处理这样的记录项,init启动这样的进程,并且等待它的处理结束,然后再进行下一个记录项的处理,当这样的进程终止时,系统也不重启它。
ctrlaltdel 当Ctrl+Alt+Del三个键同时按下时运行,把SIGINT信号发送给init。忽略 runlevel
initdefault 指定一个默认的运行级别,只有当init一开始被调用时才扫描这一项,如果runlevel
字段指定了多个运行级别,其中最大的数字是默认的运行级别,如果runlevel
字段是空的,init认为字段是0123456,于是进入级别6,这样便陷入了一个循环,如果inittab文件中没有包含initdefault的记录项,则在系统启动时请求用户为它指定一个初始运行级别
kbrequest 当init从键盘中收到信号时运行。这里要求键盘组合符合KeyBoardSigral(参见/usr/share/doc/kbd-*关于键盘组合的文档)
off 启动process字段指定的进程如果指定的进程正在运行,init就给它发SIGTERM警告信号,在向它发出信号SIGKILL强制其结束之前等待5秒,如果这样的进程不存在,则忽略这一项。
once不等待处理结束就去处理下一记录项。当这样的进程终止时,也不再重新启动它,在进入新的运行级别时,如果这样的进程仍在运行,init也不重新启动它。
ondemand 功能同respawn 当系统指定特定的运行级别A、B、C时运行
powerfail 当init收到SIGPWR(断电)信号时运行
powerokwait 当收到SIGPWD信号且/etc/文件中的电源状态包含OK时运行
powerwait 当收到SIGPWD信号,并且init等待进程结束时运行
respawn 不管何时process中止,init都重新启动进程,并且init不等到启动结束而继续扫描inittab中的后续process。如果process已经存在,就什么也不做。
sysinit 在运行boot或bootwait进程之前运行,指定的进程在访问控制台之前执行,这样的记录项仅用于对某些设备的初始化,目的是为了使init在这样的设备上向用户提问有关运行级别的问题,init需要等待进程运行结束后才继续。
wait 启动process字段指定的进程,并等到处理结束才去处理inittab中的下一记录项。
process
字段包含init执行的进程,该进程采用的格式与在命令行下运行该进程的格式一样,因此process字段都以该进程的名字开头,紧跟着是运行时,紧跟着
是运行时要传递给该进程的参数。比如/sbin/shutdown -t3 -r
now,该进程在按下Ctrl+Alt+Del时执行,在命令行下也可以直接输入来重新启动系统。
Process字段中进程可以是任意的守候进程、可执行脚本或程序。
另外:在任何时候,可以在文件inittab中添加新的记录项,级别Q/q不改变当前的运行级别,重新检查inittab文件,可以通过命令init Q或init q使init进程立即重新读取并处理文件inittab.
特殊目的的记录
仔细学习例子文件,学习应用其中关于inittab的语法格式。该文件的大多数内容都可以忽略,因为超过一半的内容都是注释,剩余的一些文件内容主要是用来实现某些特殊的功能:
id 的值表明缺省的runlevel是3。
ud 的值可以唤醒/sbin/update进程,该进程为保持磁盘的完整性,将在对磁盘进行I/O操作之前清空整个I/O缓冲区。
pf、pr和ca的值只被特定的中断所调用。
如果系统是专用的X终端,则只需x的输入值。
getty进程来提供虚拟终端设备的服务,例如:
3:2345:respawn:/sbin/mingetty tty3
标
签字段的值是3,3是设备tty3的数字后缀,tty3与相应的进程相关联,该getty进程可以启动的runlevel是2、3、4和5,当该进程终止
时,init马上就重新启动它。启动进程的路径名是/sbin/mingetty,该进程是实现虚拟终端支持的最小版本的getty,为tty3提供启动
虚拟设备的进程。
si::sysinit:/etc/rc.d/rc.sysinit
该值告诉init程序运行/etc/rc.d
/rc.sysinit脚本文件来初始化系统,该脚本文件与所有启动的脚本类似,它只是一个包含Linux的
shell命令的可执行文件,注意输入的字符串必须包括该脚本的完整路径。不同版本的Linux存放该脚本的位置也不相同,但不用刻意去记忆这些位置,只
需查看/etc/inittab文件即可,该文件中包含启动脚本文件的确切位置。
redhat 9 默认initab文件内容:
default runlevel
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 a neworking)
3 - full multiuser mode
4 - unused
5 - X11
6 - reboot halt (do not set initdefault to this)
id:5:initdefault:
//默认init进程被调用时的运行级别为5(不能设为0和6,这样系统将不能启动)
si::sysinit:/etc/rc.d/rc.sysinit
//si是系统初始化进程,init程序运行/etc/rc.d/rc.sysinit脚本文件来初始化系统,init等待脚本运行结束才继续运行下个进程。
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
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
//对相应运行级别,运行脚本/etc/rc.d/rc,并传入相应运行级参数0~6
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
//按下ctrl+alt+del时执行shutdown -t3 -r now
pf::powerfail:/sbin/shutdown -f -h +2
//当UPS电源提示断电的时候,他还将提供几分钟时间供电,这时系统执行shutdown -f -h +2 (-f 表示重启的时候跳过文件系统的检查)
pr:12345:powerwait:/shutdown -c
//表示供电恢复时取消正在执行的shutdown命令。
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
//2345运行级,运行对应的终端程序
x:5:respawn:/etc/X11/prefdm -nodaemon
//如果是x终端模式要运行的程序
- linux自动启动脚本
linux启动之后会运行一个init程序,首先读取inittab配置文件,决定系统的运行模式,在读取inittab的过程中,执行rc0.d~rc6.d目录下的运行级别脚本,然后执行/etc/rc.local;
由于执行rc0.d~rc6.d目录下的运行级别脚本是执行/etc/rc.d/rc脚本执行的那么我们就来看看这个脚本
/etc/rc.d/rc脚本说明:
#! /bin/bash
#
# rc This file is responsible for starting/stopping
# services when the runlevel changes.
#
# Original Author:
# Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org
>
#
# check a file to be a correct runlevel script
check_runlevel ()
{
# Check if the file exists at all.
#判断文件存在,并可执行
[ -x "$1" ] || return 1
# Reject backup files and files generated by rpm.
#拒绝备份文件格式的文件名
case "$1" in
*.rpmsave|*.rpmorig|*.rpmnew|*~|*.orig)
return 1
;;
esac
return 0
}
# Now find out what the current and what the previous runlevel are.
# 获取到运行级别,如inittab中的/etc/rc.d/rc 0~6指定了运行级别,这儿的参数$1就是inittab中的命令传的的参数0~6的数字
argv1="$1"
set `/sbin/runlevel`
runlevel=$2
previous=$1
export runlevel previous
#设置变量,当前运行级别,上一个运行级别
#如果没有上一个运行级别,那么previous=N
#载入/etc/init.d/functions脚本,载入需要用到的函数定义
. /etc/init.d/functions
# See if we want to be in user confirmation mode
if [ "$previous" = "N" ]; then
if [ -f /var/run/confirm ] \
|| grep -i confirm /proc/cmdline >/dev/null ; then
rm -f /var/run/confirm
CONFIRM=yes
export CONFIRM
echo $"Entering interactive startup"
else
echo $"Entering non-interactive startup"
fi
fi
# Get first argument. Set new runlevel to this argument.
# 如果$argv1不是空串,赋予runlevel为argv1指定的运行级
[ -n "$argv1" ] && runlevel="$argv1"
# Is there an rc directory for this new runlevel?
# 如果没有对应级别的rc($runlevel).d的目录,那么程序退出
[ -d /etc/rc$runlevel.d ] || exit 0
# First, run the KILL scripts.
#在相应运行级别的rc($runlevel).d目录下,遍历以K开头的文件,逐个取出
#经过一系列判断之后,执行脚本,传入stop参数
for i in /etc/rc$runlevel.d/K* ; do
check_runlevel "$i" || continue
#判断文件存在可
# Check if the subsystem is already up.
subsys=${i#/etc/rc$runlevel.d/K??}
[ -f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ] \
|| continue
# Bring the subsystem down.
# 查找在文件中是否包含killproc和action单词,-q选择是不显示输入,只返回状态
# 执行脚本,传入stop参数
if egrep -q "(killproc |action )" $i ; then
$i stop
else
action $"Stopping $subsys: " $i stop
fi
done
# Now run the START scripts.
#获取/etc/rc($runlevel).d目录下,以S开头得文件
#对每个文件经过check之后,执行脚本,传入start参数
for i in /etc/rc$runlevel.d/S* ; do
check_runlevel "$i" || continue
# Check if the subsystem is already up.
subsys=${i#/etc/rc$runlevel.d/S??}
[ -f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ] \
&& continue
# If we're in confirmation mode, get user confirmation
if [ -n "$CONFIRM" ]; then
confirm $subsys
case $? in
0) :;;
2) CONFIRM=;;
*) continue;;
esac
fi
# Bring the subsystem up.
if [ "$subsys" = "halt" -o "$subsys" = "reboot" ]; then
export LC_ALL=C
exec $i start
fi
if egrep -q "(daemon |action |success |failure )" $i 2>/dev/null \
|| [ "$subsys" = "single" -o "$subsys" = "local" ]; then
$i start
else
action $"Starting $subsys: " $i start
fi
done
分析上面得rc脚本,就不难理解,为什么启动脚本在rc0~6.d目录下要用S开头命名,停止脚本要在rc0~6.d目录下要用K开头命名.
我写了一篇oracle自动启动的文章,启动的脚本都是以S开头,关闭的脚本都是以K开头,所以如果在编写自动启动程序,或者自动关闭程序的脚本的时候,需要符合这个命名要求,才能被正确地执行.
- 用户登录启动
用户登录之后会运行/etc/profile,在执行profile的时候,最后有一段代码,如下:
for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
. $i
fi
done
这段代码将遍历/etc/profile.d目录,执行所有以*.sh(以sh结尾)文件名的脚本;
执行/etc/profile之后,然后执行用户$HOME/.bash_profile脚本
如果/etc/profile.d在目录下建立以*.sh文件名的脚本,在每次用户登录的时候都会启动;而有些用程序只需启动一次,不需要每次登录都启动,如数据库,web服务,应用服务器等.
用户可以根据自己的情况,决定登录时启动程序,还是主机启动是启动程序.
由于程序运行的方式可能会不断变化,有些用户会把程序不断地从一个目录拷贝到另外一个目录,名字也会不断地修改,其实用户只需要在一个地方存放应用程序,在配置目录用ln -s建立一个阮连接就可以了;
- 退出时自动启动
退出登录时候,将自动执行$HOME/.bash_logout文件,如果在该命令中添加一些程序执行命令,在用户退出登录时这些命令将被自动启动.如,在该文件最后添加:agentctl stop,表示退出的时候将执行该命令,停止apache服务.
- 一些shell启动文件
$HOME/.bash_history 记录用户操作命令的记录
$HOME/.bash_logout 用户退出登录的时候执行这个脚本
$HOME/.bash_profile 用户登录,执行完/etc/profile之后执行.bash_profile(在unix下为.profile,linux下为unix)
$HOME/.bashrc shell 登录时自动执行
/etc/profile 每个用户登录的时候都必须执行的脚本
/etc/fstab 系统每次启动的时候需要mount磁盘的操作信息
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
嵌入式Linux系统启动过程中涉及多个关键脚本和配置文件,它们共同协作完成了从内核初始化到用户应用程序启动的全过程。通过对这些脚本和配置的理解,可以帮助开发者更好地定制和优化嵌入式Linux系统。
在SUSE Linux(如openSUSE)中,为了实现系统启动时自动执行某些脚本或命令,需要了解和利用特定的启动脚本机制。本文将详细介绍openSUSE 11和10 SP2中的启动文件设置方法,并通过一个具体的例子来展示如何实现开机...
为了确保Oracle服务(包括数据库服务和监听器)能够在Linux操作系统启动时自动运行,需要进行一系列配置工作。本文将详细解析如何在Linux环境下实现Oracle服务和监听器的自动启动,并对提供的脚本代码进行逐行解读。...
- action 字段:指示 init 如何处理 process 字段指定的进程,包括 respawn(自动重启)、wait(等待进程结束)、once(仅启动一次)、boot(启动时启动)、bootwait(启动后等待运行级别改变)。 四、arm-linux ...
以下是对Linux启动过程的详细概述: 1. **硬件启动阶段** - 当计算机开启电源,BIOS(基本输入输出系统)进行上电自检(POST),检查硬件设备,如CPU、内存、硬盘、显卡等。如果发现任何故障,它可能会发出警告音...
Linux 的开机启动流程涉及 BIOS 自检、MBR 引导、加载内核、初始化 init 进程、设定运行级别及启动终端等步骤。 Linux 的日常管理涉及到文件管理命令(如 cp、mv、rm)、文档编辑命令(如 vi、nano)、磁盘管理命令...
综上所述,本文从Linux系统的概念出发,深入探讨了虚拟机技术及其在Linux安装中的应用,进而介绍了Linux的基本命令、Shell编程、启动配置流程以及如何进行系统裁剪与移植。最后,通过一系列具体的实验步骤,帮助读者...
主要包括Linux的基本概念和操作,Linux的树型结构,Linux的文本编辑,Linux的安装和启动,用户管理,Shell编程技术,进程管理,C编译器,系统扩充,维护与监视,Linux的图形界面,网络的基本概念与设置,Linux在网络...
有时为了调试或维护的目的,可能需要暂时关闭CRS的自动启动功能,待问题解决后再恢复其自动启动状态。 #### 四、检查 CRS 的运行状态 ##### 查看 CRS 是否启动 ```shell crsctl check crs ``` 执行此命令后,会返回...
涵盖了 Linux 的基础知识、Linux 和 Windows 的区别、Unix 和 Linux 的区别、Linux 内核、Linux 的基本组件、Linux 体系结构、BASH 和 DOS 之间的基本区别、Linux 开机启动过程和 Linux 系统缺省的运行级别等。...
登录成功后,用户将进入一个 Shell 环境,此时 Linux 启动过程宣告完成。 ### 结论 本文详细介绍了 Linux 系统从开机到用户登录的整个启动过程。从硬件自检到引导程序加载内核,再到内核初始化和 `init` 进程的...
特别是在使用 BusyBox 作为初始化进程(init)的情况下,它负责整个系统的启动配置和管理。 ##### 1. kernel/init/main.c 中的 init 进程 在内核的启动过程中,init 进程是由内核直接创建的第一个用户态进程。通常...
通过这个全面的Linux标准教程,你可以掌握Linux系统的基本操作和管理技能,为后续的系统管理、开发工作或深入学习其他相关技术(如服务器管理、云计算、自动化运维等)奠定基础。不断实践和学习,你将能够熟练驾驭...
Linux系统管理是IT领域中的重要技能,尤其在服务器运维、云计算和自动化脚本编写等方面有着广泛的应用。"轻松学会Linux系统"旨在帮助初学者在短时间内掌握Linux的基本操作和管理技巧。下面将详细介绍Linux系统管理的...
迷你shell通常是简化版的Unix/Linux shell,它实现了基本的命令解析、执行和控制功能,适合教学或特定场景下的轻量级应用。这个项目的目标是创建一个可以根据需求进行定制的shell,它可能包含以下功能:命令解析、...
E.6.17 我安装Linux时没有遇到错误, 但是在重启动时, 我只能得到L, LI 和其他一个项目. 为什么? E.7 使用Red Hat Linux E.7.1 我不能运行我编译的任何程序, 因为 我得到一个"command not found"出错信息. 我在目录...
Linux的启动流程大致分为五个阶段:内核引导、运行init、系统初始化、建立终端以及用户登录。这确保了系统从开机到用户可以正常使用的过程。 【用户登录与终端】 用户可以通过终端设备登录Linux系统,终端有两种...
通过`systemd`或`init`系统管理服务的启动、停止和状态查看。 【进程管理】 `ps`用于查看当前进程,`top`或`htop`提供实时的系统资源监控,`kill`和`pkill`发送信号来结束进程,`nohup`让命令在后台运行并忽略挂断...