00:00
大家好。欢迎大家继续收看上硅谷的linus运维课程。我是沈超老师,这节课我们继续来录制经典面试题。系统管理类的面试题,我们来看看第五道面试题启动流程。这也是一套这个经典的面试题。在我们的这个较多的笔试题当中,我们都会有这样的问题,甚至这种题是可以在面试当中,哎,如果我对你的这个Linux,我想这样看看你就Linux的熟悉程度啊,我都可能会在面试当中来问你这样的问题,都是有可能的。那这套题哎,他问,简述Linux启动过程。这个有点小问题,为啥?我们567,甚至前面的三就是RED3567,这里都指的是EL啊RHEL版本啊,就是企业版的。那它其实启动或多或少都有点儿变化。啊,那相对来说五版本六版本之间变化还不是太大,因为这个一般它的内核是从2.4升级到了2.6。
01:09
还都是二主版本。但是七呢,它的内核变成了3.10。那六和七之间的启动过程变化还是异常巨大的,所以呢,这个家伙问的这东西他没有问清楚是。下个版本。那我们假设呢,那一般来说还是假设是六,因为目前来讲。我们的六还是这个主流的这个应用版本啊,在工作中企业中我们用的这个主版本依然还是六,所以啊,我假设他问的是六,那有人说老师那万一问七怎么办啊,没事儿,待会儿我们在这个类似面试题或者扩展面试题当中,我们把七的启动过程也说一遍好吧。那。各位,那我们这里说啊,经典的比时间看六和七的变化较大,我们假设是使用的六啊啊,那我们来看一下启动过程,其实我们说啊。
02:02
呃,真正的启动过程可能比这个还要复杂一点啊,那我们说我们这种笔试题或者是面试的话。我不可能让你给我说的这个太详细,完整无缺,你能把这个说个八九不离十,我觉得问题就不大了啊,问题就不大了,这是它的基本启动过程,基本启动过程,当然你如果要想看详细的启动过程,那我们说我们第一版的系数Linux当中用的是六。第二版的汽车Linux当中用的是气,里面都有详细的启动流程的这个介绍啊,那我们来看一下它的过程,那假设是六,首先第一步服务器家电,也就是开机。开机之后呢,会加载我们的BA。BIS会先进行一遍系统自检啊,这是BIS必备了,比如说你要是系统当中什么内存坏了啊,什么什么这个这个显卡没有啊,它都会启动自检完,然后就会发现起不来,然后嘀嘀嘀嘀嘀报警,我不知道你们听过没这声,然后系统就直接起不来了。
03:01
那这种boss盖自检完之后。贝尔斯会开始加载启动引导程序,那在我们的六当中,我们的启动引导程序是grab啊,这是我们Linux经典的启动引导程序。那。呃的作用,其实它就是俩作用,一个加载内核,你要启动谁就加载谁的内核,第二个呢,它支持多系统启动啊,比如说万一你的系统当中既装了Linux,又装了Windows gra可以把启动过程交给比如说你要想启动Windows。它会把这个启动过程交给Windows的这个启动引导程序,由它来完成Windows启动过程,所以它可以支持多系统启动啊。这个事儿啊,我多说一句啊,多系统启动了这个事儿。各位,你们可能会发现在我们的课程当中没有讲如何多系统安装,在一台电脑里进行多系统安装。我说,这个事儿在真实的服务器上几乎是不可能的。
04:02
咱也别说太死啊,我说几乎原因。你想,我怎么可能在服务器上既装一个Windows,又装一个linus?而且这东西要想切换它必须是要到机房,你能拿到服务器的时候,在启动的时候进行键盘来切换它,远程切换还很麻烦。不是说完全不行,还但是很麻烦啊,尤其尤其是你要是这个就linus切Windows还行,Windows切linus这事就很麻烦,我就说各位,所以我们说这个事儿在实际工作中根本就不现实。这个多系统安装是一个典型的实验室的这样一个技术,哎,在教学环境我不想用虚拟机,我觉得虚拟机可能是假的,尤其是之前的时候,虚拟机版本比较低的时候,那时候虚拟机确实问题比较多,现在好多了。那这个时候我就可以在我的电脑里既装一个Windows,又装一个Windows,诶那但是他们我们说我们就曾经见过,我们有一些老师就觉得,诶这个技术很重要,我天天都要用啊,所以给学员花很长时间来解释这个,但我们说这是典型的一种个人技术,他在真实的工作中几乎不可能出现,所以我们说这玩意儿咱们没必要花时间去理他啊。
05:17
但是我们说grab有两个功能,一个就是启动你自己的这个操作系统,另外一个就是可以允许你这个调用其他的启动引导程序来启动其他的程序啊,这是的作用。那那我们就别说加载其他系统了,我们就说加载Linux,那它的主要作用就是加载Linux的内核。当然啊,各位,这里其实还少了一个小步骤干嘛?加载内核之后呢,我们的这个grab还会加载一个叫做int RAM FS这样一个玩意儿,这是什么虚拟文件系统?其实主要目的是为了启动一些这个必备的驱动程序的,因为有我们这个内核啊,按理说系统内核自检之后啊,我们是由系统内核来加载硬件程序,硬件的驱动的。
06:09
但是这个驱动它分了几种情况,一种情况呢,是直接写入内核了。我认为这个驱动非常重要,在系统启动过程当中当中是必备的,所以这些驱动直接写入内核。但是,如果把所有的驱动都写入到内核中,我们的内核就会变得太大了。那我们都知道,任何的东西太过臃肿,它的太过臃肿的话,太大了,它的性能就会下降。所以在直接写入内核的驱动不会太多。嗯。那第二种情况呢,就是什么,以模块的方式诶。把它放入到硬盘中。把驱动。我们绝大多数的驱动都是这种方法,模块放在哪儿?放在你的Li下系统的根目录下,立下modus这个目录当中。
07:03
我们绝大多数的驱动,驱动都是放在这儿的,那也就是说。我们内核加载驱动的时候,把BB驱动在内核里的这些东西加载起来。剩余的部分呢,取硬盘里去取。那为什么这个grab还要加载一个叫做int iitt啊TRA。Ramfs这样一个虚拟的这样一个。呃,虚拟的鼠标写了不就就就这么着吧啊。虚拟的这样一个文件系统,原因就是有部分必备的驱动。系统把它放在了模块当中。如果系统Linux内核没有这部分驱动,我的内核就加载不起来。为了解决这个问题啊,那些驱动太大了,直接放入内核会导致Linux性能下降,那为了解决这个问题,我们就出现了这样一个虚拟啊文件系统,它里面就是放这些必备驱动的,主要放的是硬盘的这种驱动。
08:00
啊,比如说我们的这个SCS接口啊,或者我们SAS接口啊,Sata接口这样新型的的这个这种硬盘接口驱动放在这里。其实我说。如果我们只是简述启动过程,我们可以没必要理这个东西,你可以不理他就完了,你就像我这样写,我觉得就已经足够完整了,来就是吧。由grab加奖内盒。由内核重新自检来各位系统进行了两次自检。我们Linux这个彩信的一般是内核自己的自检,然后呢由他来加载驱动。这也是我们Linux比Windows为数不多相对来说比较方便的地方。我们Linux大多数的硬件是不需要手工安装驱动的。啊,刚刚说了,一种是直接放入内核的,另外一种是放入模块的,这两种Linux都能识别。除非就是内核也没有,模块也没有,比如说比较新的一些硬件,这个时候才需要你手工安装这种驱动,这种需要手工安装的驱动在服务器上其实非常少见,个人机比较多。
09:08
服务器很少见。换句话说。你的服务器如果安装Linux,是不需要单独安装驱动的,装完Linux就自动识别了,这是我们为数不多的比Windows要稍微方便一点的地方。好。驱动加载完内核,会调用我们系统的第一个进程。下的。嗯。这个地儿大家注意啊。我们如果到七的话。这个地儿就变了。之前的都一样,从这开始,六和七差别巨大。我们待会儿来说七,我们先看六了。那。Linux进程,这个进程其实从Linux出现开始,不要说什么三五了,就是更早的版本,它都是系统加载的第一个进程。那我们系统linus都是通过来完成后续的加载过程,它是线性加载的,也就说由Li调用下一个,由它调用下一个。
10:10
再由它调用下一个,一个一个加调用顺序加载,然后生效。这个是咱们的Linux的开发者Li纳斯托瓦斯当年确定了这样一个。启动的基本过程。那到了七之后呢,我们说啊,各位汉直接把这玩意儿抛弃了。相当于他直接把林纳斯托马斯给抛弃了。也就是说七的整个的这个这个或者是大体的结构,不是linu斯托斯设计的,而是red另外一个工程师设计的。所以。我们说啊,七更新这么多年,为什么还大范围普及,还很少,甚至我们都知道这两天出现八了都对吧,八都出来了,七都没有得到大赛的普及,原因就是有很多原因啊。
11:00
其实最主要的原因就是变化太大了,还有一个原因就是Li Linux本人也比较抵触这玩意。他不是太推荐啊,也是有这原因吧,行吧,这个咱就不扯淡了,我们就说啥,我们来看还是看我们的这个加载过程,那我们还说你记得啊,六的时候加载了系统的第一个进程是SP下的SSP下的这个in这个进程。它是线性加载的,由它呢调用。rcs.com这个配置文件,通过这个配置文件进行系统的初始化。比如说你的初始的什么,呃,什么什么这个这个语言环境啊,语言环境不在这,语言环境在这个。配置文件里环境变量配置文件里我们一些,比如说初始加载的什么这个啊。呃,这个硬件信息啊,等等这些信息都是由他来配置的。这玩意儿调用完执行完就结束了,他不需要再往后继续调用。接下来呢?啊由它依然还是啊由它来,其实其实我们就说由它,我们把它变成线性的调它带在这,再由它呢调ta。
12:05
这个文件我们应该都见过。这种东西我们在讲课的时候,我们也详细说过,它是用来决定你的系统的默认运行级别的。什么叫默认运行级别?其实你就可以理解为是图形界面还是字符界面,我要进入哪个界面?那当我确认了,比如说我要进入这个字符界面,哎,我要进入三级别,这是字符界面,那怎么办呢。那怎么办呢?我们就干嘛确认默认级别之后,还需要调用一个初始化配置文件,这里把这个级别所必备的一些初始配置做完,然后呢,再调用什么。ETC下,你看我这样写的。IC0杠六点。换句话说。你是己?就调用哪个目录下的,比如说我是三,它就调用ic3.d目录当中所有的脚本。
13:00
这个脚本啊,我们进去看一下,我们进去看一下。我这里系统开了。我我把它连上。我把它系统连上。我进去看一下。我这里是六,那我们进去看一下就到IC3点DIC3。点D当中。好,那我们可以看到这里面。一堆的链接文件,浅蓝色的啊,我们LL看,那我们看他练的是谁,练的是不是都是一些执行文件,对吧,那这些执行文件是这样的。在开机的时候,按照这个只要是S开头了。就把这些东西全部起来,就把这些脚本全部起来。哎,如果是S开头了,也就说从这开始啊。那把这些脚本都起来。按照顺序S后面的零一数字代表代表顺序,那也就是说我要进入字符界面的话啊,我要进入三级别,因为我们现在在RC3点地下。
14:01
我只要把这些所有的S脚本都起来,我的三级别就运行完了。那K开头的是干嘛的,是你关机的时候,或者退出这个级别的时候,把这些脚本这些程序再关了,明白了,按照顺序关掉就行了,所以我们说啊各位。那我们就说啊,按照你的对应级别。把这个ic3.d,如果是字符界面,如果是图形,就是ic5.d里面该起的脚本全部起来。你的系统就启动完成了。就这么简单。最后呢,在登录界面之前读取ic.logo当中的程序,哎,你还记得吗?我们说啊,如果我们想要让一个服务开机自启动,我的建议是你就可以把它直接写入,把它的启动脚本写在这里,原因看到了吗?在启动的时候会加载这个文件。这里面写什么启动命令,写什么命令,系统在登录的时候都会执行一遍。这就是六的基本过程,其实也没多复杂。
15:02
那这样的话,这就是六个过程那。我把六的过程画了一个示意图啊,我们看一下它是线性的,你看到了吗?BI2加MBR,也就是这个grab grab用来加载内核,如果多系统的话,调用其他的这个启动引导程序,那我们现在是单内核。然后内核解压自检,找到这个虚拟文件系统,建立仿真目录,加载部分的驱动,挂载真正的根目录,然后调用。连接连接调用它,然后上面这部分进行初始化,下面这部分调用连这个连接tab。然后确认默认运行级别,然后再初始化一个文件,然后调用对应的级别里的这。诶,这个文件把里面所有的这个脚本按照顺序启动起来,读取IC角老口,然后看到登录界面,启动完成。如果我们是字符界面,到这就结束了,如果是图形界面,它在这里会调用我们的图形,哎,在Linux当中,图形用大X代表它。
16:06
车启动数据那。我们说啊,我们的服务器不会安装图形界面,所以我们不再探讨,也不用再去管图形界面的系统,到这里就结束了。这就是六的这个启动过程,如果你能把这个玩意儿在笔试或者面试的时候说个八九不离十,这个问题就没问题了。好。那如果是七的怎么办?那我们说七和六变得还是比较大的,那我们来看看七。那前半部分都一样。服务器加电加载BIS,由BAS来调用启动引导程序,小心七当中不再是gra,而是GRA2啊,其实大体上差别就是这单对g grab2来讲,其实呃,这个原理上变化不大,但是它的表现,它的配置文件和原先的差别还是挺大的。但是作用是一样的啊,狗罐干嘛加上内核?
17:03
然后内核呢,重新自检,接下来G282接着调用虚拟文件系统,加载部分必备的驱动,然后呢。呃,必备驱动加载完之后,这个这个内核也会加载剩余的驱动啊,剩余驱动这个时候我们系统内核监管启动过程,然后呢,内核干嘛调用第一个进程CD。小新还记得六的第一个镜头是谁?隐匿是吧?好了,这就是七和六重大的变化。首先我们说我们六调用的系统,第一个进程是。而我们气变成了C4。这里不光是一个名字的变化。而是后续的启动过程,全部都不一样。我们六是线性的,我们刚刚看到了一个掉一个,再调一个,再调一个,直到完成启动对吧。这样的启动方法,它的优点是相对简单。
18:00
缺点是启动时间可能较长,相对可能较慢,因为它需要每一个加载栏再去调用下一个。而我们的七开始啊,我们其实你们如果这个既装了六也装了七,你们可能会发现七的启动时间是要比六稍微短一点。啊,其实短一点,但是不是太明显。不像六和五,就六明显比五的这个启动时间要短,因为六优化的启动过程,那我们说七可能理论上来说还是要短的原因。七是一种瀑布流启动,换句话说,你可以理解为是并发式启动。由CD开始启动后续的所有的程序。同时起。哎,而不是像是上面这个一个加一个,一个加一个顺序加载,它是同时启动。那这样的话,理论上来讲,它的速度是不是肯定要比六要快一点?对吧,那呃,这是它的变化,我们知道就行,但如果我说如果在笔试或者面试里,他要追问你一句七,那他一定问的是这个什么,上面是线性启动,下面这个是瀑布流启动啊。
19:08
或者你可以说是并发式启动,同时启动,就这个意思,OK。前半部分基本一样。区别就是变成了CD。后半部分就完全不一样,然后呢,我们就看看啊。有听不见。开始调用默认单元组,叫做default点。小心。这个默认单元组就和我们刚刚六当中的那个运行级别类似。也就是说,你可以理解为这个就是什么,我来确定我是要启动字符界面还是图形界面。我来确定这个。那字符界面的话叫做MU-user.target it,如果是图形界面叫graphic graphic,就那图形的单词点target。那我们说。我们服务器。
20:01
图形界面为辅,字符界面为主,所以我拿字符界面来举例,好吧?也就是说,由CT现在确定我要启动字符界面。确定了这个之后呢,开始做这些东西,开始同时加载,同时呢,它是瀑布流。那首会加载一个叫做S的单元组初始化系统了。加载一个basic.target的单元组,用来这个准备操作系统的加载杠user,这就是我们的字符界面的必备的一些初始化程序,然后呢?由target再去调用这个文件,诶,还记得这个吗?哎,这个跟六一样啊,也就是说这个文件依然会起作用。它依然在启动的时候会把它加载一遍,换句话说在七里,如果你想让某一个程序开机自动运行也可以啊,直接把它。写入这个配置文件就可以了。
21:01
OK,哎,没问题啊,然后呢,然后呢,我们由它来干嘛。在加载这个get,这个get TT链是本机终端的这个必备的,终端类的这些必备的这些界面就可以看到自界面,然后就启动完成。哎,各位它会在这儿啊,也会跟刚刚那个一样,就跟我们六一样类似,就是把七里面,比如说进入字符界面所必备的程序,干嘛在这里全部启动一遍。你可以不用理他,具体了你就知道,他也跟刚刚那个类似,就启动一遍就完成了。所以你记得如果问你七和六的启动过程,其实最主要问的就是这个。七首先启动的程序不再是,而是system。第二个事就是它是瀑布流,或者是并发式启动。你把这玩意儿说明白就行了。至于具体调用什么的,这个事儿,我说其实还是挺复杂的,真的没必要全部都知道。
22:00
这就是过程。那同样我也画了一个这个这个这个这个启动流程,我们可以看到前半部分都一样。刀装有样解压加载驱动啊,然后调用什么这个这个呃。然后调用虚拟目录,然后加载必备的程序,好了开始。调用C4,然后并发式启动。然后呢,上面初始化系统,调用一些准备操作系统,把这个里面所起对应的所有的服务起来,把这个字符界面下所有的服务起来,调用这个配置文件,把里面的脚本运行一下,开启这个调用终端,这个这个单元组,然后呢开启登录终端,就是这样一个过程。呃,如果简单点来说,其实没还可以,不是太复杂,如果你在笔试当中啊,其实我说其实我说你把前面能说明白。到这里能说清楚这个,然后说清楚它是并发的调用,然后调用默认单元组,然后最终启动就可以了。中间这个细节不一定一定要把它弄记下来,这个还是挺复杂的,不一定能背下来,能把这几个重点说清楚就可以了。
23:11
好了,各位。这是一道经典的题。不光在笔试当中常见。在面试过程中也很常见。我再说一遍,像这种考概念类的题。肯定是要比考优化类,考这种总结类、经验类的题要简单。但是。他能拿出来考你概念的东西。一般都是要不然就是非常重要,要不然就是比较复杂,说不太明白的东西。所以啊,你也不要就认为这个考概念类的这种题,这是个考概念类的题啊。他就整了。概念类的题是需要背的,但是我说概念类的题能够提前准备。我提前把这东西备好,万一碰到,哎,我在整个面试过程中,我这家公司不一定问我下家公司就有可能的,对吧,我只要备好,我到那个后期之后,我干嘛,我肯定能用到。
24:03
但是经验的这种气啊。有时候我就说,我们总结完之后呢。就算我们总结了,也不一定和对方的心,因为每个人或者工作中用的东西它不一样,对吧,所以那个东西就是在干嘛。可能你自己也要总结总结,再一个呢,可能提前要做功课,要看看这家公司它主要的业务是什么。对吧,好了,那总体来说还是今天类的这种题稍微简单点才能提前做准备对吧。好,那这道题呢,就是这样,我们这节课呢,讲了六的启动过程。和七的启动过程啊,这样两个过程,我们需要了解它的这个启动原理好。这节课的内容就这样,我们下节课再见。
我来说两句