initrd 文件中的init
第 4 章 initrd 中的 init本章学习重点■ 在initrd文件系统中的init文件所扮演的角色■ init文件在系统加载前的操作■ 每一个操作对即将加载的系统的意义■ 在开机时所看到的开机信息从何而来软件架构设计第4章 initrd 中的initLinux 操作系统之奥秘102 在了解 kernel 及 initrd 这两个重要的系统组件后,接下来就可以慢慢接近 Linux 操作系统的 整个流程。
initrd 被 kernel 加载后的开机流程,是依照隐藏在 initrd 文件中的一个 init 文件(在2.4 版 kernel 中的 initrd 文件名为 linuxrc )进行的,按照它所提供的脚本一步一步往下做,包括 之后要从实体硬盘加载实际的操作系统,也是由这个文件提供的。
因此,本章将通过这个文件 让您更深刻地知道 Linux 在进入实际用户所操作的操作系统前做了哪些操作。
首先,请不要将 initrd 中的 init 及 Linux 操作系统中的 init 指令混在一起,这是两个完全不 同的文件,只是刚好文件名称是一样的,Linux 中的 init 指令会在下一章中说明,这里的重点是 initrd 中的脚本文件——init 。
本章一开始,先将整个 init 文件展开来(展开的步骤请参考第 3.3.2 节“修改 initrd ” ),分成几个区块介绍,图 41 是 Fedora Core 6 中的 init 文件的完整内容(每一 个 Linux 版本的 init 文件或多或少会有些许不同),下面我们分别说明每个用框线所区分的区 块。
图中的每一区块都有其目的与该做的事,若贸然拿掉其中一部分,都有可能造成无法开机 的后果。
先介绍图 41 中 A 到 F 每一段的主要功能,并按照 init 执行的顺序,对每一段作较完 整的说明。
A :nash 指令。
B :挂载主要的文件系统。
C :建立设备文件所需的文件系统。
D :建立最初所需使用的设备文件。
E :加载相关模块。
F :切入实体操作系统。
在 A 区块中可以看到,initrd 使用的 script 执行环境是通过一个叫做 nash 的指令构建的, nash 除了文件小、内置一些实用的指令之外,还有一个好处,当 nash 的 script (这里指的是 initrd 中的 init )中所列的每一道指令皆顺利完成,则会返回 0,表示结束;若为1,则表示在执 行过程中有问题产生,这样的机制可在执行时避免一些和本身无关的 kernel 错误信息。
因为整 个 init 是通过nash 一条一条地执行的。
我们要先来介绍这个较少人听说过的指令——nash 。
本章为了要呈现和 Fedora Core 6 中 initrd 相关的信息,有些时候会需要用到安装时的 rescue mode 来作说明,因此部分环境与出现的结果会是在 rescue mode 下产生的,若有与您手 上的 Linux 结果不一样时,请回到安装时的环境,进入 rescue mode 后再做试验。
本章所有小节 的编排顺序,也是以 init 文件所有区域的执行顺序作安排,以便您了解 init 中所经过的每一个 步骤。
4.1 认识nashLinux 操作系统之奥秘103图41:init 文件的完整内容第4章 initrd 中的initLinux 操作系统之奥秘104 4.1 认识nash 整个 init 的流程是由一个 nash 的 script 程序负责,并不是一般在 Linux 所使用的 bash 或 csh ,理由是放在 initrd 中的文件越小越好,而 nash 符合这样的需求,它是一个专门为了 init 文件所设计的 script 直译程序,内置支持某些必用的指令,包含在 init 中所看到的 echo/mknod/mkrootdev/mkdir/mount/setuproot/switchroot/setquiet 这些指令(在 Linux 下使用 man nash 可以看到更完整的说明)。
或许你会有个疑问,为何在刚刚的 init 文件中,有些指令并没有在上一段文章所列的 nash 内置指令清单中出现?那是不是由别的程序所提供的指令?其实 nash 还支持额外的外部指令, 但必须要将这些指令放在/usr/bin 、/bin 、/sbin 或/usr/sbin 下,因为默认情况下,nash 会在上述的 这几个目录中寻找是否有额外的指令需要使用,所以,可以看到 initrd 额外在 bin 目录中放入 insmod 及 modprobe 两个指令。
在 Linux 中其实可以做一些实验,证明某些指令是由 nash 提供的,在此先做一个很简单的 nash script 文件(如图 42 所示)。
图42:nash script用线框起来的部分就是 script 的内容,其内容主要是用 echo 的方式,将结果分成 Linux 指 令与 nash 指令两大块,Linux 指令以 ls 为例;而 nash 的指令则用 showlabels 来作代表。
大家 一定都知道 ls 是 Linux 内置指令,这很确定,但 showlabels 在此要先证明一下不是由 Linux 所提供的(如图 43 所示),请在 Linux 下直接测试showlabels 指令看看。
图43:showlabels 并不是由Linux 提供的4.1 认识nash Linux 操作系统之奥秘105结果发现,Linux 默认是没有 showlabels 这个指令的,因此,可以放心 Linux 与 nash 指 令集中不会有 showlabels 指令重复的问题。
接着就是要开始执行刚才做出来的 script 文件—— nashsample.sh ,看看是不是得到预期的结果(如图 44所示)。
针对执行后的画面说明如下:如图中的箭头,执行时指令为“nash –force nashsample.sh ” ,请注意,一定要加 force 参 数,因为 nash 默认只会在 initrd 的环境中执行,若要在一般 Linux 的环境下,必须加入 force 参数强迫执行。
ls/root 的结果是通过 Linux 执行而产生的,虽然 nash 没有提供 ls ,但默认支持外部指令 (之前提过),所以 nash 可以在/bin 目录中找到 ls 并直接使用,这可以直接在 Linux下试验。
图44:执行script 文件——nashsample.sh在 command line 中直接输入 nash (如图 45 所示),会先跳到 nash 执行的等待画面,接着 如下图中的箭头所示,输入 ls ,按【ENTER 】,再按【CTRLD 】,就会跳出 nash 找到的/bin/ls文件。
图45:nashsample.sh 执行画面在 Linux 指令集中是找不到 showlabels 的,在 nash 中所呈现的结果主要是将各分区的名称 显示出来(后面的部分是 uuid ),若要在 Linux 中一样显示出分区名称,其默认相对应的指令是 e2label (如图 46 所示)。
其实就是因为 nash 够简单、够小、够方便,才会被 initrd 选为默认的 script 执行指令,接 下来就要开始看 initrd 执行的步骤。
第4章 initrd 中的initLinux 操作系统之奥秘106 图46:e2label 指令4.2 挂载主要的文件系统在 init 文件中要执行的第一件事就是建立/proc 及/sys 两个目录(如图 47 所示),作为系统 的主要目录,在 initrd 中已经先行建立好这两个实体目录,因此,init 必须做的便是将这两个目 录以不同一般目录的方式挂载在内存中供kernel 使用。
图47:建立/proc 及/sys 两个目录所谓的不同,以 proc 为例,一般的目录都是产生在文件系统下,也就是硬盘中,可以由用 户决定访问权限及数据的存放,但 proc 不是在硬盘或文件系统下存在的,proc 的产生是由 kernel 在内存中建立的,在 initrd 中,这两个目录都是空的(如图 48 所示),没有任何文件存 在,因为在没有加载 initrd 之前,原本就没有通过 kernel产生文件。
图48:proc 及sys 这两个目录都是空的在 initrd 中,proc 及 sys 必须在加载 kernel 后,才会由 kernel 产生,这在 Linux 系统也是 一样的道理,如果想知道 initrd 被加载时到底会产生哪些目录及文件,可以通过 Linux 安装模 式中的 rescue mode (恢复模式)看出端倪,虽然 rescue mode 默认使用的 initrd 文件与系统安 装后开机用的 initrd 文件不完全一样,但机制上是可以参考的;如果用现有的操作系统,许多4.2 挂载主要的文件系统 Linux 操作系统之奥秘107目录及文件会有比较大的差异;若使用开机用的 intird 文件(DVD 安装光盘中的文件),差异 会更大,因为该 initrd 连格式都不一样,默认执行的文件也都是以安装为主,如 anaconda 。
如何进入 rescue mode 在前面章节已详细介绍,在此不再赘述,但通过第 3 章“kernel 与 initrd ”所介绍的 init ,将可以更清楚地知道 rescue mode 的运行原理。
rescue mode 是直接通过 kernel 加载 initrd 进入单纯由内存开机的虚拟操作系统,方便用户 当遇到任何疑难杂症时,可以在没有任何旧操作系统的包袱下,进入一个最干净的操作系统, 以解决遇到的问题。
直接跳到进入 rescue mode 之后的结果(如图49 所示),一样是以 Fedora Core 6 的操作系 统为例。
在进入 rescue mode 之后,以 3 个简单的步骤来观察和原本未经 kernel 加载前的 initrd 目录不同之处。
在进入 rescue mode 后,经由 kernel 加载的 initrd 会建立需要的 proc 与 sys 相关 的目录及文件,另外,我们也发现,在第一个箭头处,kernel 在默认情况下需要在 initrd 中建立 几个主要的目录: “/proc ” 、 “/dev ” 、 “/sys ” ,至于“/dev ”则会在第 4.3 节“建立设备文件所需 的文件系统”及第4.4 节“转移前的准备”中介绍。
通过grub-install命令把grub安装到u盘-总结
通过grub-install命令把grub安装到u盘-总结通过grub-install命令把grub安装到u盘①准备⼀个u盘。
容量不限。
能有1MB都⾜够了。
②把u盘格式化(我把u盘格式化成FAT、fat32格式了,最后证明也是成功的)。
③开启linux系统,打开命令⾏终端。
进⼊root模式,然后输⼊命令⾏:mount /dev/sdb3 /tmp/bootgrub-install --root-directory=/tmp/boot --no-floppy /dev/sdb注意:上⾯/dev/sdb是我的u盘,在linux系统⾥的盘符吧,那个/dev/sdb3为什么是“3”。
这个因不同的实际情况⽽不同吧。
总的来说,/dev/sdb就是我的u盘的名字,/dev/sdb3就是我的u盘的⼀个分区。
④这个时候。
你会发现,你的u盘。
已经多了⼀个boot⽂件夹,⾥⾯有⼀些内容,这个时候,boot⽂件夹的路径是/dev/sdb3/boot/。
⑤把“/boot/grub/grub.conf”和“/boot/grub/splash.xpm.gz”。
拷贝到“/dev/sdb3/boot/grub/”以下(也就是“u盘/boot/grub/”)。
⑥然后把/dev/sdb3/boot/grub/grub.conf改动成以下内容:# grub.conf generated by anaconda## Note that you do not have to rerun grub after making changes to this file# NOTICE: You do not have a /boot partition. This means that# all kernel and initrd paths are relative to /, eg.# root (hd0,0)# kernel /boot/vmlinuz-version ro root=/dev/sda1# initrd /boot/initrd-version.img#boot=/dev/sdadefault=0timeout=5splashimage=(hd0,0)/boot/grub/splash.xpm.gztitle Red Hat Enterprise Linux Server 1280*1024(3.4.0)root (hd0,0)kernel /boot/vmlinuz-3.4.0 root=/dev/sda1 selinux=0 init=/sbin/init vga=795 fb:oninitrd /boot/initrd.img-3.4.0title Red Hat Enterprise Linux Server 1600*1200(3.4.0)root (hd0,0)kernel /boot/vmlinuz-3.4.0 root=/dev/sda1 selinux=0 init=/sbin/init vga=858 fb:oninitrd /boot/initrd.img-3.4.0⑦重新启动计算机。
initdata方法
initdata方法initdata方法是一种在程序中常见的初始化数据的方式。
它通常用于在代码运行之前,准备和加载程序所需的数据。
initdata方法是一个在程序启动时执行的特殊方法,它的主要目的是设置和准备程序的初始状态。
在initdata方法中,我们可以做一系列的操作,包括但不限于:1. 读取配置文件:程序的配置信息通常存储在配置文件中,通过调用initdata方法可以读取配置文件并将其解析为程序所需的格式。
2. 初始化数据库连接:如果程序需要使用数据库,initdata方法可以负责建立与数据库的连接,并进行必要的设置和配置。
3. 加载静态资源:程序可能需要加载一些静态资源,例如图片、样式表或JavaScript文件等。
initdata方法可以负责将这些资源加载到程序中。
4.创建必要的对象或实例:程序可能需要创建一些必要的对象或实例,以便在程序运行中使用。
比如创建各种业务逻辑的对象、处理器或者数据结构等。
5.执行一些必要的初始化逻辑:程序在运行前可能需要执行一些初始化逻辑,例如创建文件夹、检查环境变量、设置系统参数等。
使用initdata方法可以帮助我们在程序运行之前,准备好所有必要的数据和资源,确保程序运行时的顺利进行。
同时,将初始化逻辑集中在initdata方法中,可以使代码结构更加清晰易读,便于维护和扩展。
需要注意的是,initdata方法应该被谨慎地设计和实现,避免出现性能瓶颈或资源浪费的情况。
在设计initdata方法时,应该考虑到程序的实际需求,并合理分配资源和处理逻辑。
总结起来,initdata方法是一个在程序启动时执行的特殊方法,用于在程序运行之前准备和加载所需的数据和资源。
它可以执行一系列的操作,包括读取配置文件、初始化数据库连接、加载静态资源、创建必要的对象或实例,以及执行一些必要的初始化逻辑。
使用initdata方法可以确保程序在运行前准备好所有必要的数据和资源,使程序运行更加稳定和高效。
RedHat5 内核升级指南
RedHat5.3 升级内核到2.6.33 版本错误:insmod: error inserting '/lib/dm-region-hash.ko' : -1 File exists编译2.6.31内核后重启出现insmod: error inserting '/lib/dm-region-hash.ko' : -1 File exists解决方法:1,解压initrd文件[root@bogon ~]# cp /boot/initrd-2.6.30.4.img /tmp[root@bogon ~]# cd /tmp/[root@bogon tmp]# lsinitrd-2.6.30.4.img[root@bogon tmp]# mkdir newinitrd[root@bogon tmp]# cd newinitrd/[root@bogon newinitrd]# zcat ../initrd-2.6.30.4.img |cpio -i11537 blocks释放之后看到如下内容[root@bogon newinitrd]# lsbin dev etc init lib proc sbin sys sysroot2,ok,下边就是编辑init,删掉其中重复的四行中的两行echo "Loading dm-region-hash.ko module"insmod /lib/dm-region-hash.koecho "Loading dm-region-hash.ko module"insmod /lib/dm-region-hash.ko3,重新打包initrd[root@bogon newinitrd]# find .|cpio -c -o > ../initrd11538 blocks[root@bogon newinitrd]# cd ..[root@bogon tmp]# gzip -9 < initrd > initrd.img[root@bogon tmp]# lsinitrd-2.6.30.4.img initrd initrd.img newinitrd好了,initrd.img就是重新打包的initrd了,然后把initrd.img拷贝到/boot,更改grub.conf里边的initrd-2.6.30.4.img为initrd.img就可以了,这样“insmod: error inserting '/lib/dm-region-hash.ko' : -1 File exists”就不会有了其实将init文件的第二行“setquiet”去掉,你就知道initrd文件到底在做什么了本文来自CSDN博客,转载请标明出处:/jinxl560/archive/2009/09/17/4563716.aspx。
linux内核initrd文件自定义方法
linux内核initrd文件自定义方法重新编译内核后,可能加入了自定义的模块,就有可能需要修改init文件,而init文件就在initrd中,这里记录下操作步骤,以防遗忘。
1. cp /boot/initrd-3.2.img /tmp/mylinux/initrd-3.2.img.gz这里之所以进行改名,是因为initrd-3.2.img是经过gzip压缩过的,所以需要对其解压,但是gzip对解压的文件的文件后缀名又有要求,所以就先进行改名。
2. gunzip initrd-3.2.9.img.gz3. cpio -id < initrd-3.2.9.img经过以上三步,就在当前目录下解压了initrd文件,从而得到了init文件。
根据自己的需求修改init文件后,通过下面命令重新生成initrd文件。
4. find . | cpio -H newc -o | gzip -9 > /boot/initrd-3.2.9.img注意一下内容摘自网上资料,留作参考:en_init_cpio获取gen_init_cpio,工具,gen_init_cpio是编译内核时得到的,在内核源代码的usr 目录下,我们可以通过以下步骤获取它,进入内核源代码执行:# make menuconfig# make usr/这样即编译好gen_init_cpio,gen_initramfs_list.sh 在内核源代码的 script 目录下,将这两个文件 copy 到 /tmp 目录下,/tmp/initrd 为解压好的initrd 目录,执行以下命令制作initrd :#制作initrd :# gen_initramfs_list.sh initrd/ > filelist# gen_init_cpio filelist >initrd.img# gzip initrd.img# mv initrd.img initrd-'uname –r’.img只有用这个方式压缩的initrd ,在Linux系统重启的时候才能一正确的文件格式 boot 起来,也可以用这种方式修改安装光盘的initrd文件然后进行系统安装。
Initrd的加载过程
执行 /linuxrc 脚本;
init()函数分析
static int init(void * unused) {
lock_kernel(); do_basic_setup();
prepare_namespace();
/* * Ok, we have completed the initial bootup, and * we're essentially up and running. Get rid of the * initmem segments and start the user-mode stuff.. */ free_initmem(); unlock_kernel();
优点
把更的内核功能条目编译成模块,减小
了内核大小;
面对各种不同的硬件架构,可以使用initrd
中的linuxrc按需进行模块加载以驱动硬件, 从而提高kernel的可移植性。
使用initrd时的系统启动顺序
1. bootloader将内核和initrd根文件系统加载到内存中;
2. 内核初始化 ram disk 空间并把initrd根文件系统解压释放到 ram disk 中,同时释放原initrd使用的内存;
• do_basic_setup():对系统初始化,系统硬
件此时只有cpu子系统在运转,内存管理和 进程管理也开始工作了;
• prepare_namespace(void):决定根设备
的挂载以及切换根文件系统;
• initrd_load(): 创建 ramdisk 设备文件,
将initrd文件系统释放到 ramdisk 中去;
initrd详解(转)
initrd详解(转)1.什么是 Initrdinitrd 的英⽂含义是 boot loader initialized RAM disk,就是由 boot loader 初始化的内存盘。
在 linux内核启动前, boot loader 会将存储介质中的 initrd ⽂件加载到内存,内核启动时会在访问真正的根⽂件系统前先访问该内存中的 initrd ⽂件系统。
在 boot loader 配置了 initrd 的情况下,内核启动被分成了两个阶段,第⼀阶段先执⾏ initrd ⽂件系统中的“某个⽂件“,完成加载驱动模块等任务,第⼆阶段才会执⾏真正的根⽂件系统中的 /sbin/init 进程。
这⾥提到的“某个⽂件“,Linux2.6 内核会同以前版本内核的不同,所以这⾥暂时使⽤了“某个⽂件“这个称呼,后⾯会详细讲到。
第⼀阶段启动的⽬的是为第⼆阶段的启动扫清⼀切障爱,最主要的是加载根⽂件系统存储介质的驱动模块。
我们知道根⽂件系统可以存储在包括IDE、SCSI、USB在内的多种介质上,如果将这些设备的驱动都编译进内核,可以想象内核会多么庞⼤、臃肿。
Initrd 的⽤途主要有以下四种:1. linux 发⾏版的必备部件linux 发⾏版必须适应各种不同的硬件架构,将所有的驱动编译进内核是不现实的,initrd 技术是解决该问题的关键技术。
Linux 发⾏版在内核中只编译了基本的硬件驱动,在安装过程中通过检测系统硬件,⽣成包含安装系统硬件驱动的initrd,⽆⾮是⼀种即可⾏⼜灵活的解决⽅案。
2. livecd 的必备部件同 linux 发⾏版相⽐,livecd 可能会⾯对更加复杂的硬件环境,所以也必须使⽤ initrd。
3. 制作 Linux usb 启动盘必须使⽤ initrdusb 设备是启动⽐较慢的设备,从驱动加载到设备真正可⽤⼤概需要⼏秒钟时间。
如果将 usb 驱动编译进内核,内核通常不能成功访问 usb 设备中的⽂件系统。
initdata方法
initdata方法initdata方法是在计算机编程中常用的一种方法,它用于初始化数据或设置初始状态。
这个方法可以在程序开始时调用,以确保在实际运行程序之前,必要的数据和状态已经准备好。
initdata方法的具体实现可能有所不同,具体取决于编程语言和应用场景。
以下是一个关于initdata方法的综合描述和示例。
initdata方法通常在程序启动时被调用。
在一些编程框架中,如Java Spring框架,可以使用注解或配置文件指定在程序启动时需要执行的initdata方法。
这样,当程序启动时,initdata方法将会自动被调用。
一个常见的initdata方法的实现逻辑如下:1.读取配置文件:根据需要,我们可以从磁盘或网络中读取配置文件。
配置文件可以包含程序的一些设置、数据库连接信息等。
2.解析配置文件:读取到配置文件后,我们需要解析它,以提取出程序需要的数据。
这可能涉及到解析XML、JSON等不同格式的配置文件。
3.加载数据:根据配置文件中的信息,我们可以从数据库或其他数据源中加载所需数据。
这可能涉及到数据库查询、文件读取等操作。
4.初始化对象:将加载到的数据赋值给相应的变量或对象。
这样,在程序执行期间,我们就可以通过这些对象获取所需的数据。
5.设置初始状态:除了数据外,我们还可以设置一些初始状态。
例如,初始化程序的计数器、设置权限等。
6.其他操作:根据具体需求,我们可能会执行其他一些初始化操作,如建立网络连接、启动消息队列等。
下面是一个使用Java编写的简单示例:```javapublic class MyApplicationprivate static Config config;private static List<User> users;public static void main(String[] args)//程序继续执行}public static void initdatconfig = readConfigFromFile("config.xml");users = loadUsersFromDatabase(config.getDbUrl(, config.getDbUsername(, config.getDbPassword();//其他必要的初始化操作}public static Config readConfigFromFile(String filePath) // 从文件中读取配置数据,并解析成Config对象// 返回解析后的Config对象}public static List<User> loadUsersFromDatabase(String url, String username, String password)//连接数据库,执行查询操作,获取用户数据//返回查询结果}```在上面的示例中,程序启动时会调用initdata方法。
linux init六种模式简介
init 5——进入图形化登录的多用户模式 这是蓝点2.0安装后默认的启动模式。系统启动后或执行init 5命令后,悦目的蓝绿过渡色背景上就出现了漂亮的登录窗口。 所有帐号名都以图标的方式出现在窗口里等待选择,不必自己输入。不过系统管理员可能不高兴——这样系统里有多少用户岂不是让人一目了然?不过在KDE控制中心中修改就可以解决问题的,我就不多说啦。 如果系统出了问题,只要启动仍然能进入这个界面(说明X服务器没有问题),root帐号也可以从这里进入Linux的安全模式,就是在左下角的选择框把 模式从kde换为save failed就行了。当然进入的界面绝对没有美观可言,但用于修复X窗口管理器或应用程序的问题是必不可少的。
�
如果你了解/etc/inittab文件,就千万不要把0设为缺省登录模式,否则你的Linux的运行就只能两点一线了——开机←→停机,或者是开机←→重启的无限循环。 其他的4种模式实际上是由操作系统确定的。如果你愿意修改Linux的源代码,你也可以定义这4种(甚至6种)模式的实际功能。其实只要知道Linux发布厂商的约定就足够了,下面我们就以蓝点2.0为例,看看init的常用约定吧——
init 2——进入无网络服务的多用户模式 如果你的计算机根本没有连网,这个模式就跟普通模式一样了。否则的话别人就不能通过网络www、ftp或telnet登录你的计算机了,但对与ping 命令你的计算机还是会作出反应的。如果连ping你也拒绝访问,那么就不如直接把网线拔了! 如果你的计算机作为网络服务器,这一模式就挺有用了。譬如你要修整系统或更新网站内容,就可以把计算机调到这一模式,然后放心的进行你的工作,等工作完成 后再切换到模式3或5就行了。但注意如果原来已经有用户ftp或telnet进入了你的系统,用init 2 是不能中断他和你的连接的,小心让别人在这个时候黑你一把哦!——执行init 2前先用who命令检查一下吧。 这一模式下,在本机上的使用基本不变。你仍然可以访问网络,上Internet,ftp或telnet到网络中的任何一台服务器。只是你的计算机在网络中不给其他机器提供服务而已。计算机从第3运行级转入这一模式时你会看到一系列网络服务被停止。
grub启动过程
第二阶段:
BIOS通过下面两种方法之一来传递引导记录:
第一, 将控制权传递给initial program loader(IPL),该程序安装在磁盘主引导记录(MBR)中
/boot/grub/stage2 /etc/rc.d/rc<#>.d
/etc/rc.d/init.d/*
stage 1:MBR(512 字节,0头0道1扇区),前446字节存放的是 stage1,后面存放硬盘分区表信息,BIOS将stag1载入内存中0x7c00处并跳转执行。stage1(/stage1/start.S)的任务非常单纯,仅仅是将硬盘0头0道2扇区读入内存。0头0道2扇区内容是源代码中的/stage2/start.S,编译后512字节,它是stage2或者stage1_5的入口。
BIOS启动引导阶段 GRUB启动引导阶段 内核阶段 /init/sysinit阶段
==================================================================================================
读取/boot/grub.conf文件并显示启动菜单;
装载所选的kernel和initrd文件到内存中
第三阶段:内核阶段:
运行内核启动参数;
解压initrd文件并挂载initd文件系统,装载必须的驱动;
start.S的主要功能是将stage2或stage1_5从硬盘载入内存,如果是stage2,则载入0x820处;如果是 stage1_5,则载入0x2200处。
initrd.img工作原理
initrd.img工作原理
initrd.img是一个精简版的文件系统,是在计算机启动时用于加载和驱动操作系统的关键设备和文件。
它包含了必要的设备驱动程序、二进制文件和动态链接库,可以在不影响主文件系统的情况下加载到内存中。
当操作系统需要访问硬件设备时,它会使用initrd.img中的设备驱动来与硬件进行通信。
在系统启动时,内核会先加载initrd.img文件到内存中,再使用它中的驱动来识别并挂载实际的根文件系统。
此后,initrd.img就被卸载并释放出内存。
这种启动方式可以确保系统在加载完rootfs之前已经装载好所有必要的设备驱动程序,以便操作系统能够顺利地启动并运行。
同时,由于initrd.img是只读的,它也能够防止恶意软件对操作系统造成破坏。
