1.Init程序读取/etc/inittab配置文件

Init是系统的第一个进程,因此PID为1,也是所有进程的父进程,init启动后会读取配置文件/etc/inittab中的设定,其实/etc/inittab文件最主要的作用就是设定Linux的运行等级,其设定形式是“:id:5:initdefault:”,这就表明Linux需要运行在等级5上。Linux的运行等级设定如下:

0:关机

1:单用户模式

2:无网络支持的多用户模式

3:有网络支持的多用户模式

4:保留,未使用

5:有网络支持有X-Window支持的多用户模式

6:重新引导系统,即重启

2.执行/etc/rc.d/rc.sysinit脚本文件

在设定了运行等级后,Linux系统执行的第一个用户层文件就是/etc/rc.d/rc.sysinit脚本程序,它做的工作非常多,包括设定PATH、设定网络配置(/etc/sysconfig/network)、启动swap分区、设定/proc等等。如果你有兴趣,可以到/etc/rc.d中查看一下rc.sysinit文件。

3.执行/etc/rc.d/rcN.d脚本

根据运行级别的不同,系统会运行/etc/rc.d目录下的rc0.d到rc6.d中的相应的脚本程序,来完成相应的初始化工作和启动相应的服务。

对每一个运行级别来说,在/etc/rc.d子目录中都有一个对应的下级目录。这些运行级别的下级子目录的命名方法是rcX.d,其中的X就是代表运行级别的数字。比如说,运行级别3的全部命令脚本程序都保存在/etc/rc.d/rc3.d子目录中。在各个运行级别的子目录中,都建立有到/etc/rc.d/init.d子目录中命令脚本程序的符号链接,但是,这些符号链接并不使用命令脚本程序在/etc/rc.d/init.d子目录中原来的名字。如果命令脚本程序是用来启动一个服务的,其符号链接的名字就以字母S打头;如果命令脚本程序是用来关闭一个服务的,其符号链接的名字就以字母K打头。

许多情况下,这些命令脚本程序的执行顺序都很重要。如果没有先配置网络接口,就没有办法使用DNS服务解析主机名!为了安排它们的执行顺序,在字母S或者K的后面紧跟着一个两位数字,数值小的在数值大的前面执行。比如:/etc/rc.d/rc3.d/S50inet就会在/etc/rc.d/rc3.d/S55named之前执行(S50inet配置网络设置,55named启动DNS服务器)。存放在/etc/rc.d/init.d子目录中的、被符号链接上的命令脚本程序是真正的实干家,是它们完成了启动或者停止各种服务的操作过程。当/etc/rc.d/rc运行通过每个特定的运行级别子目录的时候,它会根据数字的顺序依次调用各个命令脚本程序执行。它先运行以字母K打头的命令脚本程序,然后再运行以字母S打头的命令脚本程序。对以字母K打头的命令脚本程序来说,会传递Stop参数;类似地对以字母S打头的命令脚本程序来说,会传递Start参数。

附: /etc/init.d和/etc/rc.d/init.d的关系

/etc/init.d是指向/etc/rc.d/init.d的符号链接;

[root@localhost etc]#

[root@localhost etc]# pwd

/etc

[root@localhost etc]# ll | grep init.d

lrwxrwxrwx.  1 root root     11 4月  15 2014 init.d -> rc.d/init.d

[root@localhost etc]#

也就是说这两个目录的内容是一样的。那下面所提到的/etc/init.d也可以用/etc/rc.d/init.d来代替。

4.执行/etc/rc.local脚本文件

最后,init会执行/etc/rc.local脚本文件,rc.local就是在一切初始化工作后,Linux留给用户进行个性化的地方。你可以把你想设置和启动的东西放到这里。 执行完该脚本文件后系统就进入登录画面,如下图所示。

(登录画面)

2.关机与重新启动

2.1 关闭机器

关闭操作系统,只需将run level 调整为0即可。或者说,系统会执行/etc/rc.d/rc0.d中的所有script,该目录的所有文件也是以K或S开头的一系列文件(内容省略)。

我们知道/etc/rc.d/rcN.d(这里的N可能为0-6,表示run level)中K开头的服务会停止,S开头的服务会启动,因此在run level为0的情况下,只会启动S00killall与S01halt这两项服务。我们知道killall这服务会终止所有正在运行的服务与服务器,而halt则会关闭系统。

因此我们可以执行:init 0 或使用shutdown、poweroff这类的命令关闭操作系统:shutdown -h  或  poweroff

若将电源选项编入内核中(这是默认值),则关闭系统时会一起将机器的电源关闭(关闭电源这项功能取决于主机板的芯片组,在近几年的主机板都支持这项功能)。

2.2 重新启动

重新启动系统,只需将initial模式调整为6即可。换言之,系统会执行/etc/rc.d/rc0.d中的所有script,该目录的文件也是些以K或S开头的文件。

我们知道/etc/rc.d/rcN.d(这里的N可能为0-6,表示run level)中K开头的服务会停止,S开头的服务会启动,因此在run level为6的情况下,只会启动S00killall与S01reboot这两项服务。我们知道killall这服务会终止所有正在运行的服务与服务器,而reboot则会重新启动系统。

因此我们可以执行:init 6 或使用reboot这类的命令关闭操作系统:reboot

注意:在关闭系统或是重新启动系统之前,别忘了执行sync这命令。sync可将缓冲区的数据写回硬盘中,避免数据的遗失。

因此,如果想要在关机前执行自定义脚本的话,其步骤如下:

将需要自动启动或关闭的脚本放在/etc/rc.d/init.d目录下,然后用命令chkconfig --add filename将自动注册开机启动和关机关闭。实质就是在rc0.d-rc6.d目录下生成一些文件连接,这些连接连接到/etc/rc.d /init.d目录下指定文件的shell脚本。

下面以关机前执行PG_stop.sh脚本为例介绍操作步骤:

1.在/etc/init.d目录下构建自定义脚本并附可执行权限,如:PG_stop.sh

[root@localhost bin]# ll /etc/init.d/ | grep P

-rwxr-xr-x 1 root root   299 08-11 17:56 PG_stop.sh

2.将/etc/init.d/PG_stop.sh 软连接到/etc/rc6.d目录下:

ln -s   /etc/init.d/PG_stop.sh    /etc/rc6.d/K0000PG_stop.sh

[root@localhost rc6.d]# ll /etc/rc6.d/ | grep K0000PG_stop.sh

lrwxrwxrwx 1 root root 22 08-11 11:29 K0000PG_stop.sh -> /etc/init.d/PG_stop.sh

注意名字务必要小于S00killall,使其才系统关闭前调用自定义脚本。这样系统在关闭的时候,就会运行PG_stop.sh并加上stop参数,等同于执行命令PG_stop.sh stop。

3.在/var/lock/subsys/目录下构造一个同名的内容为空的自定义脚本PG_stop.sh

[root@localhost rc6.d]# ll /var/lock/subsys/ | grep P

-rw-r--r-- 1 root root 0 08-11 14:57 PG_stop.sh

上面的第二步和第三步可以用命令chkconfig --addPG_stop.sh来完成。在第二步中我们只在/etc/rc6.d里面建立了软连接,如果用chkconfig的话会同时在rc0.d-rc6.d目录下生成连接文件。

3 程序与信号

3.1 程序与子程序

当我们执行一个程序时,系统会因这个程序而产生一个或多个进程(process),并会给每个进程一个唯一的编号(Process ID,简称PID)。系统启动时由init开始第一个进程,PID为1,之后陆续启动其它进程。所有的进程都由某个现有进程所产生,这个现有的进程称为父进程(Parent Process ID,简称PPID),而父程序所产生的程序称为子程序。

我们可以试着执行ps这命令,过程如下:

[root@localhost ~]# ps

PID TTY          TIME CMD

2207 pts/1    00:00:00 bash

2238 pts/1    00:00:00 ps

命令ps是process的简写,功能是列出正在执行的程序,以上面为例,我们使用ssh或是telnet登录系统则会通过BASH,并执行ps时,则会出现bash这程序,它的PID为2207。

3.2 信号

所谓的signal,指的是信号,也是系统重要的动作之一。系统、应用程序、甚至账号,都可以通过命令或是system call的方式对进程(process)下达信号。而该进程对于信号,有下列三种处理方式:忽略、终止、以及自行定义。我们可以通过kill -l来看看系统有哪些signal:

[root@home root]# kill -l

1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL

5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE

9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2

13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGSTKFLT

17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP

21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU

25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH

29) SIGIO       30) SIGPWR      31) SIGSYS      34) SIGRTMIN

35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4

39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8

43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12

47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14

51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10

55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6

59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2

63) SIGRTMAX-1  64) SIGRTMAX

要终止进程,我们必须对该程序下达SIGKILL的信号,也就是通过kill的命令来对进程下达这个信号。首先我们可以通过ps -ef的命令了解进程的PID为何,再通过kill -KILL 的命令终止该进程。举例而言,若我们知道某进程的PID为1234,可以通过以下的命令来终止该进程:kill -KILL 1234

由上面的列表可以知道,SIGKILL的编号是9,因此使用以下的命令也可以达到完全相同的效果:kill -9 1234

4.进程间通信

Interprocess communication是指内部进程的沟通。在操作系统之下,有许多进程必须互相交换信息。譬如许多程序会共享系统信息、同一程序所产生不同的进程会共享数据等。那么,进程之间要如何沟通呢?最常见的就是通过文件来沟通。举例而言,A程序把信息写到 /tmp/a.txt,而B程序则从 /tmp/a.txt当中读取数据,这样就达到沟通的目的了。除了文件,常见的沟通方式还包括share memory、semaphore、message queues、pipe等。Share memory与semaphore都是通过内存来存取数据,达到内部进程数据交换的目的。

我们可以使用ipcs来观看interprocess communication的状态:

[root@home root]# ipcs

------ Shared Memory Segments --------

key        shmid      owner      perms      bytes      nattch     status

0x5b0695a0 0          root      644        1048576    1

------ Semaphore Arrays --------

key        semid      owner      perms      nsems

0x00000000 65536      apache    600        1

0x00000000 98305      apache    600        1

0x5b0695a2 163843     root      666        14

------ Message Queues --------

key        msqid      owner      perms      used-bytes   messages

如同process一般,我们可以查看或是删除interprocess的id,通过ipcrm,我们可以将ipcs所看到的interprocess删除。语法如下:

ipcrm [ -M key | -m id | -Q key | -q id | -S key | -s id ]

linux内核电源关机流程,linux开机与关机步骤相关推荐

  1. Linux内核网络协议栈流程及架构

    文章目录 Linux内核网络报文处理流程 Linux内核网络协议栈架构 Linux内核网络报文处理流程 linux网络协议栈是由若干个层组成的,网络数据的处理流程主要是指在协议栈的各个层之间的传递. ...

  2. 一文了解linux内核,一文了解Linux的系统结构

    什么是 Linux ? 如果你以前从未接触过Linux,可能就不清楚为什么会有这么多不同的Linux发行版.在查看Linux软件包时,你肯定被发行版.LiveCD和GNU之类的术语搞晕过.初次进入Li ...

  3. Linux内核入门-如何获取Linux内核源代码、生成配置内核

    如何获取Linux内核源代码 如何获取Linux内核源代码 下载Linux内核当然要去官方网站了,网站提供了两种文件下载,一种是完整的Linux内核,另一种是内核增量补丁,它们都是tar归档压缩包.除 ...

  4. Linux内核移植和根文件系统制作(详细步骤精讲)

    第一章移植内核 1.1 Linux内核基础知识 1.1.1 Linux版本 1.1.2 什么是标准内核 1.1.3 Linux操作系统的分类 1.1.4 linux内核的选择 1.2 Linux内核启 ...

  5. linux内核培训广州,嵌入式Linux驱动开发高级培训班-华清远见嵌入式培训中心

    课程目标 本课程以案例教学为主,系统地介绍Linux下有关FrameBuffer.MMC卡.USB设备的驱动程序开发.参加本课程学习的学员,因为具备了Linux设备驱动开发基础,所以本课程针对性较强, ...

  6. 【Linux 内核 内存管理】Linux 内核堆内存管理 ① ( 堆内存管理 | 内存描述符 mm_struct 结构体 | mm_struct 结构体中的 start_brk、brk 成员 )

    文章目录 一.堆内存管理 二.内存描述符 mm_struct 结构体 三.mm_struct 结构体中的 start_brk.brk 成员 一.堆内存管理 Linux 操作系统中的 " 堆内 ...

  7. 【Linux 内核】进程管理 ( Linux 内核中的进程状态 | TASK_RUNNING | TASK_INTERRUPTIBLE | __TASK_STOPPED | EXIT_ZOMBIE )

    文章目录 一.Linux 内核中的进程状态 二.TASK_RUNNING 状态 三.TASK_RUNNING 状态 四.TASK_UNINTERRUPTIBLE 状态 五.__TASK_STOPPED ...

  8. linux内核学习之三:linux中的32位与64位

    linux内核学习之三:linux中的"32位"与"64位" 在通用PC领域,不论是windows还是linux界,我们都会经常听到"32位" ...

  9. 在win10查看本机linux的文件,Windows 10变身开发者利器:内置Linux内核,轻松查看Linux子系统文件...

    原标题:Windows 10变身开发者利器:内置Linux内核,轻松查看Linux子系统文件 来源:创事记 终于!在Windows里可以访问Linux文件了. 这表明,微软插入开源界的触角,越来越深入 ...

  10. 搭建《深入Linux内核架构》的Linux环境

    搭建<深入Linux内核架构>的Linux环境 阅读目录(Content) 作者 软件 概述 正文 一.安装GCC 二.编译Linux内核 三.制作跟文件系统 四.运行qemu 五.启动l ...

最新文章

  1. 2020科目一考试口诀_科目一考试口诀,看完少练超多题,需要轻松备考的学员请收藏!...
  2. Prim算法 求出 最小生成树
  3. 从源码出发:JAVA中对象的比较
  4. 虚基类(c++细节篇七)
  5. c语言程序设计输入c,C语言程序设计(计算输入字符)
  6. 文档过期打不开怎么办_4 个超实用金山文档小技巧,很强大也很简单,赶紧收藏!...
  7. android模拟器 dx,dx欧布奥特曼变身模拟器
  8. 什么是系统架构设计:关于架构演进理论
  9. mysql教程实验4.1_【MySQL】数据库课程实验
  10. JPEG 及MJPEG开发笔记
  11. Java程序员从笨鸟到菜鸟之(五十八)细谈Hibernate(九)hibernate一对一关系映射...
  12. 全球抵押销售点(POS)软件行业调研及趋势分析报告
  13. 如何卸载mysql server 2005_彻底的卸载SQL Server2005
  14. python里面的pip是什么意思_python中pip是什么
  15. 悉尼大学计算机科学专业,悉尼大学计算机科学专业怎么样
  16. 项目中出现npm WARN locking errno: -4048, npm WARN locking code: ‘EPERM‘, npm WARN locking syscall:
  17. 关于收发邮件中的一些概念解释(收件人 抄送人 密送人 回复 回复全部)
  18. 各种说明方法的答题格式_说明文方法答题格式
  19. Mysqldump备份报错1449
  20. 开源项目推荐:Qt有关的GitHub/Gitee开源项目(★精品收藏★)

热门文章

  1. 二手小米手机价格图2022.2.23
  2. 从《流浪地球》高票价,看淘票票、猫眼们也开始“浪”起来了
  3. HTML-CSS(十)文字样式使用
  4. 查看浏览器中网页编码的通用方法
  5. 【C++音视频】mediasoup-demo部署
  6. ARM和X86、X86和X64、Intel和AMD、CPU和GPU介绍
  7. android 关于HOME键
  8. vivoy9s怎么设置返回键_vivoy9s怎么设置双击亮屏 具体操作方法介绍
  9. 头牌知产介绍奶茶店商标注册应选哪类?
  10. TT语音线程优化,一线互联网架构师设计思想解读开源框架