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 ” ),分成几个区块介绍,图 4­1 是 Fedora Core 6 中的 init 文件的完整内容(每一 个 Linux 版本的 init 文件或多或少会有些许不同),下面我们分别说明每个用框线所区分的区 块。

图中的每一区块都有其目的与该做的事,若贸然拿掉其中一部分,都有可能造成无法开机 的后果。

先介绍图 4­1 中 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图4­1: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 文件(如图 4­2 所示)。

图4­2:nash script用线框起来的部分就是 script 的内容,其内容主要是用 echo 的方式,将结果分成 Linux 指 令与 nash 指令两大块,Linux 指令以 ls 为例;而 nash 的指令则用 showlabels 来作代表。

大家 一定都知道 ls 是 Linux 内置指令,这很确定,但 showlabels 在此要先证明一下不是由 Linux 所提供的(如图 4­3 所示),请在 Linux 下直接测试showlabels 指令看看。

图4­3:showlabels 并不是由Linux 提供的4.1 认识nash Linux 操作系统之奥秘105结果发现,Linux 默认是没有 showlabels 这个指令的,因此,可以放心 Linux 与 nash 指 令集中不会有 showlabels 指令重复的问题。

接着就是要开始执行刚才做出来的 script 文件—— nash­sample.sh ,看看是不是得到预期的结果(如图 4­4所示)。

针对执行后的画面说明如下:如图中的箭头,执行时指令为“nash –force nash­sample.sh ” ,请注意,一定要加 force 参 数,因为 nash 默认只会在 initrd 的环境中执行,若要在一般 Linux 的环境下,必须加入 force 参数强迫执行。

ls/root 的结果是通过 Linux 执行而产生的,虽然 nash 没有提供 ls ,但默认支持外部指令 (之前提过),所以 nash 可以在/bin 目录中找到 ls 并直接使用,这可以直接在 Linux下试验。

图4­4:执行script 文件——nash­sample.sh在 command line 中直接输入 nash (如图 4­5 所示),会先跳到 nash 执行的等待画面,接着 如下图中的箭头所示,输入 ls ,按【ENTER 】,再按【CTRL­D 】,就会跳出 nash 找到的/bin/ls文件。

图4­5:nash­sample.sh 执行画面在 Linux 指令集中是找不到 showlabels 的,在 nash 中所呈现的结果主要是将各分区的名称 显示出来(后面的部分是 uuid ),若要在 Linux 中一样显示出分区名称,其默认相对应的指令是 e2label (如图 4­6 所示)。

其实就是因为 nash 够简单、够小、够方便,才会被 initrd 选为默认的 script 执行指令,接 下来就要开始看 initrd 执行的步骤。

第4章 initrd 中的initLinux 操作系统之奥秘106 图4­6:e2label 指令4.2 挂载主要的文件系统在 init 文件中要执行的第一件事就是建立/proc 及/sys 两个目录(如图 4­7 所示),作为系统 的主要目录,在 initrd 中已经先行建立好这两个实体目录,因此,init 必须做的便是将这两个目 录以不同一般目录的方式挂载在内存中供kernel 使用。

图4­7:建立/proc 及/sys 两个目录所谓的不同,以 proc 为例,一般的目录都是产生在文件系统下,也就是硬盘中,可以由用 户决定访问权限及数据的存放,但 proc 不是在硬盘或文件系统下存在的,proc 的产生是由 kernel 在内存中建立的,在 initrd 中,这两个目录都是空的(如图 4­8 所示),没有任何文件存 在,因为在没有加载 initrd 之前,原本就没有通过 kernel产生文件。

图4­8: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 之后的结果(如图4­9 所示),一样是以 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盘-总结通过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方法是一个在程序启动时执行的特殊方法,它的主要目的是设置和准备程序的初始状态。

在initdata方法中,我们可以做一系列的操作,包括但不限于:1. 读取配置文件:程序的配置信息通常存储在配置文件中,通过调用initdata方法可以读取配置文件并将其解析为程序所需的格式。

2. 初始化数据库连接:如果程序需要使用数据库,initdata方法可以负责建立与数据库的连接,并进行必要的设置和配置。

3. 加载静态资源:程序可能需要加载一些静态资源,例如图片、样式表或JavaScript文件等。

initdata方法可以负责将这些资源加载到程序中。

4.创建必要的对象或实例:程序可能需要创建一些必要的对象或实例,以便在程序运行中使用。

比如创建各种业务逻辑的对象、处理器或者数据结构等。

5.执行一些必要的初始化逻辑:程序在运行前可能需要执行一些初始化逻辑,例如创建文件夹、检查环境变量、设置系统参数等。

使用initdata方法可以帮助我们在程序运行之前,准备好所有必要的数据和资源,确保程序运行时的顺利进行。

同时,将初始化逻辑集中在initdata方法中,可以使代码结构更加清晰易读,便于维护和扩展。

需要注意的是,initdata方法应该被谨慎地设计和实现,避免出现性能瓶颈或资源浪费的情况。

在设计initdata方法时,应该考虑到程序的实际需求,并合理分配资源和处理逻辑。

总结起来,initdata方法是一个在程序启动时执行的特殊方法,用于在程序运行之前准备和加载所需的数据和资源。

它可以执行一系列的操作,包括读取配置文件、初始化数据库连接、加载静态资源、创建必要的对象或实例,以及执行一些必要的初始化逻辑。

使用initdata方法可以确保程序在运行前准备好所有必要的数据和资源,使程序运行更加稳定和高效。

RedHat5 内核升级指南

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文件自定义方法

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的加载过程

Initrd的加载过程
• handle_initrd(): 挂载 ramdisk 为根目录,
执行 /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详解(转)

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提供了一个操作系统(软件)和系统外围关键设备(硬件)最底级别的接口,在这个阶段,检测系统外围关键设备是否“准备好”,以供操作系统使用。
第二阶段:
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是只读的,它也能够防止恶意软件对操作系统造成破坏。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档