加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux 的启动流程--转

发布时间:2021-01-30 02:17:19 所属栏目:Linux 来源:网络整理
导读:半年前,我写了 ,探讨BIOS和主引导记录的作用。 那篇文章不涉及操作系统,只与主板的板载程序有关。今天,我想接着往下写,探讨操作系统接管硬件以后发生的事情,也就是操作系统的启动流程。 这个部分比较有意思。因为在BIOS阶段,计算机的行为基本上被写死
副标题[/!--empirenews.page--]

半年前,我写了,探讨BIOS和主引导记录的作用。那篇文章不涉及操作系统,只与主板的板载程序有关。今天,我想接着往下写,探讨操作系统接管硬件以后发生的事情,也就是操作系统的启动流程。

01.png这个部分比较有意思。因为在BIOS阶段,计算机的行为基本上被写死了,程序员可以做的事情并不多;但是,一旦进入操作系统,程序员几乎可以定制所有方面。所以,这个部分与程序员的关系更密切。我主要关心的是Linux操作系统,它是目前服务器端的主流操作系统。下面的内容针对的是Debian发行版,因为我对其他发行版不够熟悉。第一步、加载内核操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。

02.png以我的电脑为例,/boot 目录下面大概是这样一些文件:

  • $ ls /boot
  •   config-3.2.0-3-amd64
  •   config-3.2.0-4-amd64
  •   grub
  •   initrd.img-3.2.0-3-amd64
  •   initrd.img-3.2.0-4-amd64
  •   System.map-3.2.0-3-amd64
  •   System.map-3.2.0-4-amd64
  •   vmlinuz-3.2.0-3-amd64
  •   vmlinuz-3.2.0-4-amd64
  • 复制代码

    第二步、启动初始化进程内核文件加载以后,就开始运行第一个程序 /sbin/init,它的作用是初始化系统环境。

    03.png由于init是第一个运行的程序,它的进程编号(pid)就是1。其他所有进程都从它衍生,都是它的子进程。第三步、确定运行级别许多程序需要开机启动。它们在Windows叫做"服务"(service),在Linux就叫做"守护进程"(daemon)。init进程的一大任务,就是去运行这些开机启动的程序。但是,不同的场合需要启动不同的程序,比如用作服务器时,需要启动Apache,用作桌面就不需要。Linux允许为不同的场合,分配不同的开机启动程序,这就叫做"运行级别"(runlevel)。也就是说,启动时根据"运行级别",确定要运行哪些程序。

    04.pngLinux预置七种运行级别(0-6)。一般来说,0是关机,1是单用户模式(也就是维护模式),6是重启。运行级别2-5,各个发行版不太一样,对于Debian来说,都是同样的多用户模式(也就是正常模式)。init进程首先读取文件 /etc/inittab,它是运行级别的设置文件。如果你打开它,可以看到第一行是这样的:

  • id:2:initdefault:
  • 复制代码

    initdefault的值是2,表明系统启动时的运行级别为2。如果需要指定其他级别,可以手动修改这个值。那么,运行级别2有些什么程序呢,系统怎么知道每个级别应该加载哪些程序呢?......回答是每个运行级别在/etc目录下面,都有一个对应的子目录,指定要加载的程序。

  • ? ? /etc/rc0.d
  •   /etc/rc1.d
  •   /etc/rc2.d
  •   /etc/rc3.d
  •   /etc/rc4.d
  •   /etc/rc5.d
  •   /etc/rc6.d
  • 复制代码

  • $ ls??/etc/rc2.d
  •   README
  •   S01motd
  •   S13rpcbind
  •   S14nfs-common
  •   S16binfmt-support
  •   S16rsyslog
  •   S16sudo
  •   S17apache2
  •   S18acpid
  •   ...
  • 复制代码

    可以看到,除了第一个文件README以外,其他文件名都是"字母S+两位数字+程序名"的形式。字母S表示Start,也就是启动的意思(启动脚本的运行参数为start),如果这个位置是字母K,就代表Kill(关闭),即如果从其他运行级别切换过来,需要关闭的程序(启动脚本的运行参数为stop)。后面的两位数字表示处理顺序,数字越小越早处理,所以第一个启动的程序是motd,然后是rpcbing、nfs......数字相同时,则按照程序名的字母顺序启动,所以rsyslog会先于sudo启动。这个目录里的所有文件(除了README),就是启动时要加载的程序。如果想增加或删除某些程序,不建议手动修改 /etc/rcN.d 目录,最好是用一些专门命令进行管理(参考这里和这里)。第四步、加载开机启动程序前面提到,七种预设的"运行级别"各自有一个目录,存放需要开机启动的程序。不难想到,如果多个"运行级别"需要启动同一个程序,那么这个程序的启动脚本,就会在每一个目录里都有一个拷贝。这样会造成管理上的困扰:如果要修改启动脚本,岂不是每个目录都要改一遍?Linux的解决办法,就是七个 /etc/rcN.d 目录里列出的程序,都设为链接文件,指向另外一个目录 /etc/init.d ,真正的启动脚本都统一放在这个目录中。init进程逐一加载开机启动程序,其实就是运行这个目录里的启动脚本。

    05.png下面就是链接文件真正的指向。

  • $ ls -l /etc/rc2.d
  •   README
  •   S01motd -> ../init.d/motd
  •   S13rpcbind -> ../init.d/rpcbind
  •   S14nfs-common -> ../init.d/nfs-common
  •   S16binfmt-support -> ../init.d/binfmt-support
  •   S16rsyslog -> ../init.d/rsyslog
  •   S16sudo -> ../init.d/sudo
  •   S17apache2 -> ../init.d/apache2
  •   S18acpid -> ../init.d/acpid
  •   ...
  • 复制代码

    这样做的另一个好处,就是如果你要手动关闭或重启某个进程,直接到目录 /etc/init.d 中寻找启动脚本即可。比如,我要重启Apache服务器,就运行下面的命令:

  •  $ sudo /etc/init.d/apache2 restart
  • 复制代码

    (编辑:辽源站长网)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读