请选择 进入手机版 | 继续访问电脑版

[LINUX] Linux怎样 启动流程?Linux启动流程详解

[复制链接]
查看95 | 回复14 | 2021-9-5 01:18:27 | 显示全部楼层 |阅读模式

在BIOS阶段,计算机的活动 基本上被写死了,可以做的事变 并不多;一样寻常 就是通电、BIOS、主引导记录、操作体系 这四步。以是 我们一样寻常 以为 加载内核是linux启动流程的第一步。

Linux_boot_1

第一步、加载内核

操作体系 接受 硬件以后,起首 读入 /boot 目次 下的内核文件。

Linux_boot_2

我们查看一下,/boot 目次 下面大概是如许 一些文件:

  1.   $ ls /boot
  2.   
  3.   config-3.2.0-3-amd64
  4.   config-3.2.0-4-amd64
  5.   grub
  6.   initrd.img-3.2.0-3-amd64
  7.   initrd.img-3.2.0-4-amd64
  8.   System.map-3.2.0-3-amd64
  9.   System.map-3.2.0-4-amd64
  10.   vmlinuz-3.2.0-3-amd64
  11.   vmlinuz-3.2.0-4-amd64
复制代码

第二步、启动初始化历程

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

Linux_boot_3

由于init是第一个运行的程序,它的历程 编号(pid)就是1。其他全部 历程 都从它衍生,都是它的子历程 。

第三步、确定运行级别

很多 程序必要 开机启动。它们在Windows叫做"服务"(service),在Linux就叫做"保卫 历程 "(daemon)。

init历程 的一大任务 ,就是去运行这些开机启动的程序。但是,不同的场合必要 启动不同的程序,比如用作服务器时,必要 启动Apache,用作桌面就不必要 。Linux答应 为不同的场合,分配不同的开机启动程序,这就叫做"运行级别"(runlevel)。也就是说,启动时根据"运行级别",确定要运行哪些程序。

Linux_boot_4

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

  1. id:2:initdefault:
复制代码

initdefault的值是2,表明体系 启动时的运行级别为2。假如 必要 指定其他级别,可以手动修改这个值。

那么,运行级别2有些什么程序呢,体系 怎么知道每个级别应该加载哪些程序呢?回答是每个运行级别在/etc目次 下面,都有一个对应的子目次 ,指定要加载的程序。

  1. /etc/rc0.d
  2. /etc/rc1.d
  3. /etc/rc2.d
  4. /etc/rc3.d
  5. /etc/rc4.d
  6. /etc/rc5.d
  7. /etc/rc6.d
复制代码

上面目 次 名中的"rc",表示run command(运行程序),末了 的d表示directory(目次 )。下面让我们看看 /etc/rc2.d 目次 中到底指定了哪些程序。

  1.   $ ls /etc/rc2.d
  2.   
  3.   README
  4.   S01motd
  5.   S13rpcbind
  6.   S14nfs-common
  7.   S16binfmt-support
  8.   S16rsyslog
  9.   S16sudo
  10.   S17apache2
  11.   S18acpid
  12.   ...
复制代码

可以看到,除了第一个文件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历程 逐一加载开机启动程序,实在 就是运行这个目次 里的启动脚本。

Linux_boot_5

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

  1.   $ ls -l /etc/rc2.d
  2.   
  3.   README
  4.   S01motd -> ../init.d/motd
  5.   S13rpcbind -> ../init.d/rpcbind
  6.   S14nfs-common -> ../init.d/nfs-common
  7.   S16binfmt-support -> ../init.d/binfmt-support
  8.   S16rsyslog -> ../init.d/rsyslog
  9.   S16sudo -> ../init.d/sudo
  10.   S17apache2 -> ../init.d/apache2
  11.   S18acpid -> ../init.d/acpid
  12.   ...
复制代码

如许 做的另一个好处,就是假如 你要手动关闭或重启某个历程 ,直接到目次 /etc/init.d 中探求 启动脚本即可。比如,我要重启Apache服务器,就运行下面的下令 :

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

/etc/init.d 这个目次 名末了 一个字母d,是directory的意思,表示这是一个目次 ,用来与程序 /etc/init 区分。

第五步、用户登录

开机启动程序加载完毕以后,就要让用户登录了。

Linux_boot_6

一样寻常 来说,用户的登录方式有三种:

(1)下令 行登录

(2)ssh登录

(3)图形界面登录

这三种环境 ,都有本身 的方式对用户举行 认证。

(1)下令 行登录:init历程 调用getty程序(意为get teletype),让用户输入用户名和暗码 。输入完成后,再调用login程序,核对暗码 (linux还会再多运行一个身份核对程序/etc/pam.d/login)。假如 暗码 准确 ,就从文件 /etc/passwd 读取该用户指定的shell,然后启动这个shell。

(2)ssh登录:这时体系 调用sshd程序(linux还会再运行/etc/pam.d/ssh ),代替 getty和login,然后启动shell。

(3)图形界面登录:init历程 调用表现 管理器,Gnome图形界面临 应的表现 管理器为gdm(GNOME Display Manager),然后用户输入用户名和暗码 。假如 暗码 准确 ,就读取/etc/gdm3/Xsession,启动用户的会话。

第六步、进入 login shell

所谓shell,简单说就是下令 行界面,让用户可以直接与操作体系 对话。用户登录时打开的shell,就叫做login shell。

Linux_boot_7

linux默认的shell是Bash,它会读入一系列的设置 文件。上一步的三种环境 ,在这一步的处理,也存在差异。

(1)下令 行登录:起首 读入 /etc/profile,这是对全部 效 户都有用 的设置 ;然后依次探求 下面三个文件,这是针对当前用户的设置 。

  1.   ~/.bash_profile
  2.   ~/.bash_login
  3.   ~/.profile
复制代码

必要 留意 的是,这三个文件只要有一个存在,就不再读入后面的文件了。比如,要是 ~/.bash_profile 存在,就不会再读入后面两个文件了。

(2)ssh登录:与第一种环境 完全雷同 。

(3)图形界面登录:只加载 /etc/profile 和 ~/.profile。也就是说,~/.bash_profile 不管有没有,都不会运行。

第七步,打开 non-login shell

诚实 说,上一步完成以后,Linux的启动过程就算竣事 了,用户已经可以看到下令 行提示符或者图形界面了。但是,为了内容的完备 ,必须再先容 一下这一步。

用户进入操作体系 以后,常常会再手动开启一个shell。这个shell就叫做 non-login shell,意思是它不同于登录时出现的谁人 shell,不读取/etc/profile和.profile等设置 文件。

Linux_boot_8

non-login shell的紧张 性,不仅在于它是用户最常打仗 的谁人 shell,还在于它会读入用户本身 的bash设置 文件 ~/.bashrc。大多数时间 ,我们对于bash的定制,都是写在这个文件内里 的。

你大概 会问,要是不进入 non-login shell,岂不是.bashrc就不会运行了,因此bash 也就不能完成定制了?毕竟 上,Debian已经思量 到这个标题 了,请打开文件 ~/.profile,可以看到下面的代码:

  1.   if [ -n "$BASH_VERSION" ]; then
  2.     if [ -f "$HOME/.bashrc" ]; then
  3.       . "$HOME/.bashrc"
  4.     fi
  5.   fi
复制代码

上面代码先判断 变量 $BASH_VERSION 是否有值,然后判断 主目次 下是否存在 .bashrc 文件,假如 存在就运行该文件。第三行开头的谁人 点,是source下令 的简写情势 ,表示运行某个文件,写成"source ~/.bashrc"也是可以的。

因此,只要运行~/.profile文件,~/.bashrc文件就会连带运行。但是上一节的第一种环境 提到过,假如 存在~/.bash_profile文件,那么有大概 不会运行~/.profile文件。办理 这个标题 很简单,把下面代码写入.bash_profile就行了。

  1.   if [ -f ~/.profile ]; then
  2.     . ~/.profile
  3.   fi
复制代码

如许 一来,不管是哪种环境 ,.bashrc都会实行 ,用户的设置可以放心地都写入这个文件了。

Bash的设置之以是 云云 繁琐,是由于汗青 缘故原由 造成的。早期的时间 ,计算机运行速率 很慢,载入设置 文件必要 很长时间,Bash的作者只好把设置 文件分成了几个部分,阶段性载入。体系 的通用设置放在 /etc/profile,用户个人的、必要 被全部 子历程 继承的设置放在.profile,不必要 被继承的设置放在.bashrc。

趁便 提一下,除了Linux以外, Mac OS X 利用 的shell也是Bash。但是,它只加载.bash_profile,然后在.bash_profile内里 调用.bashrc,而且不管是ssh登录还是在图形界面里启动shell窗口都是云云 。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

avatar 馥琳 | 2021-9-10 02:46:18 | 显示全部楼层
顶顶更健康!
回复

使用道具 举报

avatar 就放荡不羁就h | 2021-9-12 23:16:15 | 显示全部楼层
青春不在了,青春痘还在!
回复

使用道具 举报

avatar 娣玲 | 2021-9-16 21:35:17 | 显示全部楼层
admin楼主的病历本丢我这里了!
回复

使用道具 举报

avatar 小野妹子868 | 2021-9-19 01:00:12 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的网站,运动刷步数还是免费刷的,QQ和微信都可以刷,特别好用。访问地址:http://yd.mxswl.com 猫先森网络
回复

使用道具 举报

avatar 123457278 | 2021-9-29 18:11:41 | 显示全部楼层
对牛弹琴的人越来越多了!
回复

使用道具 举报

avatar 我本迷茫 | 2021-9-30 07:04:36 | 显示全部楼层
收藏了,怕admin楼主删了!
回复

使用道具 举报

avatar 云端午节 | 2021-10-13 23:54:23 | 显示全部楼层
很多天不上线,一上线就看到这么给力的帖子!
回复

使用道具 举报

avatar 深圳林妙可 | 2021-10-14 05:10:39 | 显示全部楼层
admin楼主是好人!
回复

使用道具 举报

avatar 无缘人1 | 2021-10-15 20:01:29 | 显示全部楼层
admin楼主又闹绯闻了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则