admin 管理员组文章数量: 1086019
2024年12月24日发(作者:制表格初入门)
Linux reboot流程简单分析
——张水平 2016-10-31
第一部分、linux关机与启动大致流程
㈠、Linux 关机过程
在linux领域内大多用在服务器上,很少遇到关机的操作。毕竟服务器上跑
一个服务是永无止境的,除非特殊情况下,不得已才会关机。
在linux下的关机和重启可能由两种行为引发,一是通过用户编程,一是系
统自己产生的消息。用户和系统进行交互的方式也有两个,一个是系统调用:
sys_reboot,另一个就是apm或则acpi的设备文件,通过对其操作也可以使系统
关机或者重启。
Linux关机命令详解
在Linux下一些常用的关机/重启命令有shutdown、halt、reboot、及init,
它们都可以达到重启系统的目的,但每个命令的内部工作过程是不同的。
wn
shutdown命令安全地将系统关机。 有些用户会使用直接断掉电源的方式来
关闭linux,这是十分危险的。因为linux与windows不同,其后台运行着许多进
程,所以强制关机可能会导 致进程的数据丢失﹐使系统处于不稳定的状态﹐甚
至在有的系统中会损坏硬件设备。
而在系统关机前使用shutdown命令﹐系统管理员会通知所有登录的用户系
统将要关闭。并且login指令会被冻结﹐即新的用户不能再登录。直接 关机或者
延迟一定的时间才关机都是可能的﹐还可能重启。这是由所有进程〔process〕都
会收到系统所送达的信号〔signal〕决定的。这让像vi之 类的程序有时间储存目
前正在编辑的文档﹐而像处理邮件〔mail〕和新闻〔news〕的程序则可以正常地
离开等等。
shutdown执行它的工作是送信号〔signal〕给init程序﹐要求它改变runlevel。
Runlevel 0被用来停机〔halt〕﹐runlevel 6是用来重新激活〔reboot〕系统﹐而
runlevel 1则是被用来让系统进入管理工作可以进行的状态﹔这是预设的﹐假定
没有-h也没有-r参数给shutdown。要想了解在停机〔halt〕或者重新开机 〔reboot〕
过程中做了哪些动作﹐你可以在这个文件/etc/inittab里看到这些runlevels相关
的资料。
shutdown 参数说明:
[-t] 在改变到其它runlevel之前﹐告诉init多久以后关机。
[-r] 重启计算器。
[-k] 并不真正关机﹐只是送警告信号给每位登录者〔login〕。
[-h] 关机后关闭电源〔halt〕。
[-n] 不用init﹐而是自己来关机。不鼓励使用这个选项﹐而且该选项所产生的后
果往往不总是你所预期得到的。
[-c] cancel current process取消目前正在执行的关机程序。所以这个选项当然没有
时间参数﹐但是可以输入一个用来解释的讯息﹐而这信息将会送到每位使用者。
[-f] 在重启计算器〔reboot〕时忽略fsck。
[-F] 在重启计算器〔reboot〕时强迫fsck。
[-time] 设定关机〔shutdown〕前的时间。
----最简单的关机命令
其实halt就是调用shutdown -h。halt执行时﹐杀死应用进程﹐执行sync系统调
用﹐文件系统写操作完成后就会停止内核。
参数说明:
[-n] 防止sync系统调用﹐它用在用fsck修补根分区之后﹐以阻止内核用老版本
的超级块〔superblock〕覆盖修补过的超级块。
[-w] 并不是真正的重启或关机﹐只是写wtmp〔/var/log/wtmp〕纪录。
[-d] 不写wtmp纪录〔已包含在选项[-n]中〕。
[-f] 没有调用shutdown而强制关机或重启。
[-i] 关机〔或重启〕前﹐关掉所有的网络接口。
[-p] 该选项为缺省选项。就是关机时调用poweroff。
reboot的工作过程差不多跟halt一样﹐不过它是引发主机重启﹐而halt是关机。
它的参数与halt相差不多。
init是所有进程的祖先﹐它的进程号始终为1﹐所以发送TERM信号给init会终止
所有的用户进程﹑守护进程等。shutdown 就是使用这种机制。init定义了7个
运行级别(runlevel),init 0为关机﹐init 1为重启。关于init可以长篇大论﹐这里
就不再叙述。另外还有telinit命令可以改变init的运行级别﹐比如﹐telinit -iS可
使系统进入单用户模式﹐并且得不到使用shutdown时的信息和等待时间。
㈡、Linux启动简化过程:
⑴、BIOS或者启动固件加载并运行引导装载程序boot loader;
⑵、boot loader在磁盘上找到内核镜像,将其载入内核并启动,开始由操作
系统接管硬件;
⑶、内核初始化设备及其驱动程序;
⑷、内核挂载根文件系统;
⑸、使用PID为1的进程init,开始启动用户空间;
⑹、init启动其它用户进程;
⑺、用户登录
第二部分、固件自检,加载引导程序
⑴、第一个部分是对系统硬件进行故障检测,也叫做加电自检(Power On Self
Test,简称POST),功能是检查计算机系统是否良好;通常完整的POST自检将包
括对CPU,640K基本内存,1M以上的扩展内存,ROM,主板,CMOS存储器,
串并口,显示卡,软硬盘子系统及键盘进行测试,一旦在自检中发现问题,系统
将给出提示信息或鸣笛警告。自检中如发现有错误,将按两种情况处理:对于严
重故障(致命性故障)则停机,此时由于各种初始化操作还没完成,不能给出任
何提示或信号;对于非严重故障则给出提示或声音报警信号,等待用户处理。
⑵、第二个部分是初始化,包括创建中断向量、设置寄存器、对一些外部设
备进行初始化和检测等,其中很重要的一部分是读取BIOS配置,对系统硬件进
行状态配置和检查。
⑶、最后一个部分是查找引导程序,用来引导DOS或其他操作系统。查找
顺序取决于BIOS设置。
第三部分、操作系统的启动
㈠、加载内核
操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。
以我的电脑为例,/boot 目录下面大概是这样一些文件:
㈡、启动初始化进程
内核文件加载以后,就开始运行第一个程序 /sbin/init,它的作用是初始化
系统环境。
由于init是第一个运行的程序,它的进程编号(pid)就是1。其他所有进程
都从它衍生,都是它的子进程。
注意:init是一个二进制文件,是系统启动后执行的第一个进程。
㈢、确定运行级别
许多程序需要开机启动。它们在Windows叫做"服务"(service),在Linux
就叫做"守护进程"(daemon)。
linux系统都有一个运行级别(runlevel)的概念,不同的运行级别配置将导致
系统的启动过程有很大差异,比如当配置 runlevel为 1是,是不进入图形界面
的。系统启动过程中会有一个init进程来拉起许多其他进程(各种系统服务,窗
口界面)。在ubuntu上(11.10,12.04是这样,其他版本或其他linux发行版不确定)init
会执行两个目录下的脚本,一个是/etc/init/下的,另一个是/etc/rc?.d/下的,问号
可能是0~6的其中一个数字,代表运行级别。接下来,讲解一下流程以加深理解。
在ubuntu上,init进程首先执行/etc/init/目录下的,这个文件
指明了本次启动的默认运行级别。这是上面第一步的意义:确保默认运行级别是
2。接下来目录/etc/init下的其他脚本的执行都会根据不同的运行级别做出不同的
动作,比如lightdm会判断运行级别是否处于1,2,3,4,5中的一个,是则启动
lightdm,不是则不启动lightdm。这便是上面第二步的意义,修改 ,
把“2”加入到判断语句,使得lightdm在运行级别2的时候不要启动。明白了这些,
你就可以灵活一点,例如把默认级别设置为3,而把3加入那个判断语句,也可
以达到阻止lightdm启动的效果。完成了/etc/init/目录下的启动动作,init进程会
继续执行/etc/rc2.d目录下的脚本。
init进程的一大任务,就是去运行这些开机启动的程序。但是,不同的场合
需要启动不同的程序,比如用作服务器时,需要启动Apache,用作桌面就不需
要。Linux允许为不同的场合,分配不同的开机启动程序,这就叫做"运行级别"
(runlevel)。也就是说,启动时根据"运行级别",确定要运行哪些程序。
Linux系统有7个运行级别(runlevel):
运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常
启动;
运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆;
运行级别2:多用户状态(没有NFS);
运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式;
运行级别4:系统未使用,保留;
运行级别5:X11控制台,登陆后进入图形GUI模式;
运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正
常启动。
init进程首先读取文件 /etc/inittab,它是运行级别的设置文件。如果你打开
它,可以看到第一行是这样的:
initdefault的值是5,表明系统启动时的运行级别为5。如果需要指定其他级
别,可以手动修改这个值。
那么,运行级别5有些什么程序呢,系统怎么知道每个级别应该加载哪些程
序呢?......回答是每个运行级别在/etc目录下面,都有一个对应的子目录,指定
要加载的程序。
Ubuntu、Debian系列与RedHat、CentOS启动级别含义有所区别,我们公司所
用麒麟系统是基于Ubuntu的;
Ubuntu系列运行级别定义如下:
0 – Halt 关机模式
1 – Single 单用户模式
2 - Full multi-user with display manager (GUI)
3 - Full multi-user with display manager (GUI)
4 - Full multi-user with display manager (GUI)
5 - Full multi-user with display manager (GUI)
6 – Reboot 重启
可以发现2~5级是没有任何区别的,他们为多用户模式
而RedHat系列的runlevel级别定义如下:
0 - Halt 关机
1 - Single user mode 单用户模式
2 - Multi user mode 多用户模式
3 - Multi user mode character interface 字符界面的多用户模式
4 - Undefinition 未定义
5 - Multi user mode graphics interface 图形界面的多用户模式
6 – Reboot 重启
㈣、加载开机启动程序与系统初始化
在init的配置文件中有这么一行: si::sysinit:/etc/rc.d/t 它调用执行
了/etc/rc.d/t,而t是一个bash shell的脚本,它主要是完成一些系
统初始化的工作,t是每一个运行级别都要首先运行的重要脚本。
它主要完成的工作有:激活交换分区,检查磁盘,加载硬件模块以及其它一
些需要优先执行任务。
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"来自行设定。
前面提到,七种预设的"运行级别"各自有一个目录,存放需要开机启动的程
序。不难想到,如果多个"运行级别"需要启动同一个程序,那么这个程序的启动
脚本,就会在每一个目录里都有一个拷贝。这样会造成管理上的困扰:如果要修
改启动脚本,岂不是每个目录都要改一遍?
Linux的解决办法,就是七个 /etc/rcN.d 目录里列出的程序,都设为链接文
件,指向另外一个目录 /etc/init.d ,真正的启动脚本都统一放在这个目录中。init
进程逐一加载开机启动程序,其实就是运行这个目录里的启动脚本。
这样做的另一个好处,就是如果你要手动关闭或重启某个进程,直接到目录
/etc/init.d 中寻找启动脚本即可。
/etc/init.d 这个目录名最后一个字母d,是directory的意思,表示这是一个
目录。
㈤、用户登录
开机启动程序加载完毕以后,就要让用户登录了。
一般来说,用户的登录方式有三种:
(1)命令行登录
(2)ssh登录(远程登录)
(3)图形界面登录
这三种情况,都有自己的方式对用户进行认证。
(1)命令行登录:init进程调用getty程序(意为get teletype),让用户输
入用户名和密码。输入完成后,再调用login程序,核对密码(Debian还会再多
运行一个身份核对程序/etc/pam.d/login)。如果密码正确,就从文件 /etc/passwd
读取该用户指定的shell,然后启动这个shell。
(2)ssh登录:这时系统调用sshd程序(Debian还会再运行/etc/pam.d/ssh ),
取代getty和login,然后启动shell。
(3)图形界面登录:init进程调用显示管理器,Gnome图形界面对应的显
示管理器为gdm(GNOME Display Manager),然后用户输入用户名和密码。如果
密码正确,就读取/etc/gdm/Xsession,启动用户的会话。
㈥、进入 login shell
所谓shell,简单说就是命令行界面,让用户可以直接与操作系统对话。用
户登录时打开的shell,就叫做login shell。
Debian默认的shell是Bash,它会读入一系列的配置文件。上一步的三种情
况,在这一步的处理,也存在差异。
(1)命令行登录:首先读入 /etc/profile,这是对所有用户都有效的配置;
然后依次寻找下面三个文件,这是针对当前用户的配置(用户的家目录,我们以
root登录,那么就是root目录)。
~/.bash_profile
~/.bash_login (可选)
~/.profile (可选)
需要注意的是,这三个文件只要有一个存在,就不再读入后面的文件了。比
如,要是 ~/.bash_profile 存在,就不会再读入后面两个文件了。
(2)ssh登录:与第一种情况完全相同。
(3)图形界面登录:只加载 /etc/profile 和
~/.bash_profile 不管有没有,都不会运行。
~/.profile。也就是说,
版权声明:本文标题:Linux reboot流程 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1735098036a1634213.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论