1 linux启动过程分析

发布 2022-09-20 18:41:28 阅读 9478

启动第一步--加载bios

当你打开计算机电源,计算机会首先加载bios信息,bios信息是如此的重要,以至于计算机必须在最开始就找到它。这是因为bios中包含了 cpu的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、pnp特性等等。在此之后,计算机心里就有谱了,知道应该去读取哪个硬件设备了。

启动第二步--读取mbr

众所周知,硬盘上第0磁道第一个扇区被称为mbr,也就是master boot record,即主引导记录,它的大小是节,别看地方不大,可里面却存放了预启动信息、分区表信息。

系统找到bios所指定的硬盘的mbr后,就会将其复制到0×7c00地址所在的物理内存中。其实被复制到物理内存的内容就是boot loader,而具体到你的电脑,那就是lilo或者grub了。

启动第三步--boot loader

boot loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做好一切准备。

boot loader有若干种,其中grub、lilo和spfdisk是常见的loader。

我们以grub为例来讲解吧,毕竟用lilo和spfdisk的人并不多。

系统读取内存中的grub配置信息(一般为或并依照此配置信息来启动不同的操作系统。

启动第四步--加载内核。

根据grub设定的内核映像所在路径,系统读取内存映像,并进行解压缩操作。此时,屏幕一般会输出“uncompressing linux”的提示。当解压缩内核完成后,屏幕输出“ok, booting the kernel”。

系统将解压后的内核放置在内存之中,并调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备,完成linux核心环境的建立。至此,linux内核已经建立起来了,基于linux的程序应该可以正常运行了。

启动第五步--用户层init依据inittab文件来设定运行等级。

内核被加载后,第一个运行的程序便是/sbin/init,该文件会读取/etc/inittab文件,并依据此文件来进行初始化工作。

其实/etc/inittab文件最主要的作用就是设定linux的运行等级,其设定形式是“:id:5:

initdefault:”,这就表明linux需要运行在等级5上。linux的运行等级设定如下:

0:关机。1:单用户模式。

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

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

4:保留,未使用。

5:有网络支持有x-window支持的多用户模式。

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

关于/etc/inittab文件的学问,其实还有很多,在后序文章中设计到的,卖个关子,敬请期待,呵呵。

启动第六步--init进程执行。

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

启动第七步--启动内核模块。

具体是依据/etc/文件或/etc/目录下的文件来装载内核模块。

启动第八步--执行不同运行级别的脚本程序。

根据运行级别的不同,系统会运行到中的相应的脚本程序,来完成相应的初始化工作和启动相应的服务。

启动第九步--执行/etc/

你如果打开了此文件,里面有一句话,读过之后,你就会对此命令的作用一目了然:

# this script will be executed *after* all the other init scripts.

# you can put your own initialization stuff in here if you don’t

# want to do the full sys v style init stuff.

就是在一切初始化工作后,linux留给用户进行个性化的地方。你可以把你想设置和启动的东西放到这里。

启动第十步--执行/bin/login程序,进入登录状态。

此时,系统已经进入到了等待用户输入username和password的时候了,你已经可以用自己的帐号登入系统了。

linux启动过程分析。

缘起 我使用linux有一段时间了,最开始和大多数人一样,使用的是redhat,后来机缘巧合之下,我需要使用gentoo 帮别人解决一个问题,从此喜欢上了gentoo,并且在这只小兔子身上学习到了很多东西。后来ubuntu如火如荼的流行,周围也有一些朋友开始转换至 ubuntu,在使用redhat 的时候,安装软件通常等于上网寻找源**,make和 make install,使用了gentoo以后,安装软件等于emerge软件名字,这个转变当然让我觉得很爽,但是由于我只有一个很烂的旧电脑,内存也不是很强劲,我不得不总是对我的家人说:今晚要开一晚上的机器,它要工作。

然后,我开始在升级和使用旧版本之间进行取舍,最终,我的gentoo变成了一个无法升级的老牛拉破车。 至今我仍认为gentoo是非常好的linux发行版,不过,前提是你有一个很快的机器,它又一个超大的内存和强劲的cpu。 ubuntu的出现让我多了一个选择,它是一个二进制的发行版,并且使用apt来管理所有的软件,换句话说,安装软件的命令由emerge变成了apt- get,并且不需要编译,安装软件的速度超快,在国内也有速度很快的镜像和庞大的社区支持。

这对于一台破电脑来说是多么的重要。

我将家里的小电脑安装上了ubuntu,这个小电脑本来寄托了我很多的希望,不过现在,只能放在客厅的电视旁边敝帚自珍了。我将它作为一个支持多种**的****器使用。借助于ubuntu丰富的软件支持,我想它可以随时扩充满足我所有的客厅电脑需求。

这个美丽的期待很快被无情的粉碎了,在看任何rmvb 格式的电影的时候,它都会每隔一段时间**画面出现暂时的停顿,这种停顿在**大的**i文件的时候表现的更为明显。主要的原因当然是由于小电脑的性能不能满足ubuntu上的mplayer的需求,不过由于在之前的gentoo中并没有出现同样的问题,我相信一定可以通过某种优化来解决这个问题。

小电脑使用via c3 1g的cpu,主板为epia m10k,我决定去via的主页上寻找答案。

从上电到switchroot

让我们从启动开始,看看fc6都做了些什么。

众所周知,和所有别的发行版本一样,fc6是由grab引导的,grab通常被安装在主引导扇区,也就是说,如果你在主板的bios中设置了从硬盘启动,那么主板自检以后所执行的第一部分**就是grub,grub将在其安装时候指定的位置寻找 这个文件,并且根据这个文件的配置,加载相应的内核,启动linux。这里值得我们注意的是,由于grub的这种机制,即使是格式化你觉得已经完全不再使用的硬盘分区,也可能造成灾难性的后果,假设我们把grub安装在了 mbr,并且将配置文件放置在hda2,hda1安装了一套windows操作系统,通过grub实现多重引导,但是现在我们想放弃hda2的linux 系统,或者想把它换成另外一套linux发行版,我们可能会选择格式化hda2,虽然grub被安装在mbr,但是hda2的被格式化仍然会破坏其配置文件所在的目录,grub将无法正常启动,你也就无法正常引导位于hda1的windows系统了,因为grub会提示错误,不给你选择系统的机会。这种情况在实际的双系统使用过程中,可能经常会遇到。

遇到这种问题,常见的修复方法是使用软盘启动windows,使用fdisk /mbr命令使用windows系统提供的mbr覆盖gurb的mbr**,或者使用其他方式启动linux(软盘,u盘或者光盘),重新安装grub。 虽然天不会塌下来,但是相信也会让你很不爽了,所以要小心。

内核是所有linux的核心,grub在成功的读取了配置文件以后,将会找到 kernel所在的位置,加载内核并且把电脑的控制权交给kernel程序,在fc对应的grub的文件中,我们通常可以看到类似这样的语句:

root (hd0,2) 这句话告诉我们,从现在开始,根路径将被设置为第一个硬盘的第3个分区,然后是。

kernel /boot/ ro root=label=/ rhgb quiet,这句话告诉我们,从根分区的boot目录的这个文件中读取内核,执行内核的时候使用 "ro root=label=/ rhgb quiet"这样的参数,内核的执行参数可以控制内核的行为,比如ro参数告诉内核,以只读方式挂载根分区,而quiet则告诉内核,启动的时候不要打印任何信息。这些参数不光影响内核的执行,大多数的发行版也使用这些参数控制启动完毕以后后续的动作。这些参数可以在任何时候从/proc/cmdline 这个文件中获得。

现在,grub找到了内核(hd0,2) /boot/它将整个电脑的控制权交给了这个程序,内核开始进行各种初始化的动作,你可以将 quiet参数去掉,以便看看内核都做了哪些事情,也可以在系统启动成功以后,使用dmesg这个命令查看内核启动的时候,都打印了哪些东西,总的来说, 内核做的都是一些和硬件打交道的事情,比如初始化内存,检测并初始化硬件等,在内核启动的最后,它将寻找init程序并将电脑的控制权交给这个程序。

有越来越多的新硬件需要linux的支持,如果把所有的硬件检测工作都放在内核中完成,内核会变得无比巨大,这不光是没有效率的,事实上也是不可能和不允许的,因此,如果你清楚的知道你的电脑都拥有哪些硬件,并且在未来不会添加新的硬件,你可以只将那些你需要的硬件编译到内核中去,然后直接启动你的 linux系统(事实上,早期的gentoo系统要求每个安装者在安装的时候编译自己的内核),但是对于fc6这样的发行版来说,为了让全球大多数的pc 都可以顺利使用它,它使用模块的方式编译了尽可能多的硬件支持,并且在启动的时候在grub的配置文件中指定了initrd参数。

实验1Linux入门

实验类型 验证性实验。1 了解linux运行环境。2 熟悉linux的常用基本命令。3 熟悉和掌握linux下常用编辑工具vi。1 登录linux。2 熟悉linux的常用基本命令如ls who pwd ps等。3 通过windows操作系统中的ftp程序,练习windows和linux之间的文件交...

实验1Linux入门

实验类型 验证性实验。1 了解linux运行环境。2 熟悉linux的常用基本命令。3 熟悉和掌握linux下常用编辑工具vi。1 登录linux。2 熟悉linux的常用基本命令如ls who pwd ps等。3 通过windows操作系统中的ftp程序,练习windows和linux之间的文件交...

实验1Linux入门

实验类型 验证性实验。1.熟悉linux环境。2.熟悉linux的常用命令。3.掌握在linux下运行一个简单c程序。4.掌握linux与windows之间文件共享。1.linux的登陆。实验环境 虚拟机 redhat 9.0 图形界面 用户名 root 密码 123456 2.在操作命令前,新建一...