详解linu内存磁盘初始化技术_第1页
详解linu内存磁盘初始化技术_第2页
详解linu内存磁盘初始化技术_第3页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、详解linux内存磁盘初始化技术http:关键词:initrd,内存盘,初始化正文:linux内存初始化技术(initrd )用于支持两阶段的系统引导过程,是在系 统启动过程中被挂载的临时root文件系统(译者注:这里的root文件系统是指 的根文件系统)。initrd 包含很多可执行程序和驱动,并允许在临时的内存磁 盘根文件系统被卸载,内存被释放后挂载真实的root文件系统。在许多嵌入式linux文件系统中,initrd是最终的根文件系统。这篇文章主要讲解了 linux2.6内核的initrd 技术,包括在内核中的创建及使用。1什么是内存磁盘初始化?in itrd 挂载优先级高于真实根文件系

2、统,它被邦定在内核上,做为内核启动 过程的一部分被加载(load )。然后,做为两阶段引导过程的第一部分,内核挂 载(mount) initrd ,用于获得并加载真实有效的文件系统。为了达到这个目的,initrd 包含有最起码的目录与程序,例如in smod,来 安装内核模块到内核中。对于桌面或服务器linux ,initrd 是临时文件系统,它的生存周期很短,仅 仅是做为到达真实根文件系统的桥梁。但对于没有存储设备的嵌入式系统来说, 它才是永久性的根文件系统。本篇文章对这两方面均有涉及。2深入分析initrdin itrd包含有必须的程序和系统文件,用于支持系统的启动的第二阶段过程。创建初始

3、化内存的方法,是随着你所使用的系统版本而改变的。从FedoraCore3以后,initrd就由回送设备(loop device )建立。什么是回送设备?它是一个设备驱动,允许你将一个文件挂载为块设备,并对其文件系统做出描述。 也许loop device并不存在与你的内核中,但是你能够通过内核的配置工具(make menuconfig ) 打开它。路径是: Device Drivers- Block Devices-LoopBack Device support。下面为检查命令:# mkdir temp ; cd temp# cp /boot/i nitrd.img.gz .# gun zip

4、in itrd.img.gz # mount -t ext -o loop in itrd.img /mnt/in itrd# ls -la /mnt/initrd现在,你可以通过查看 /mnt/initrd 的子目录来查看 initrd 的内容。需要注 意的是,即使你的 initrd 镜像文件并不是以 .gz 做为后缀名,但是你同样可以 通过增加此后缀名来让 gunzip 打开它。从 Fedora Core3 开始,默认的 initrd 镜像就是一个压缩的 gpio 归档文件。 除了用挂载文件的方式以外,你同样可以通过 cpio 归档的方式来将其挂载成使 用了回送设备的压缩镜像。你可以通过以

5、下的指令来检查这个 cpio 归档文件的 内容:# mkdir temp ; cd temp# # # cpio -i -make-directories bin root root4096 May 7 02:48 sysroot root4096 May 7 02:48 sysroot一些小的,但是很有必要的程序组合能在./bin目录下得到,包括nash (它 不是一个shell,而是一个脚本解释工具),用于加载内核模块的insmod,以及 lvm 等。上面所示目录中,相对比较有趣的是 root 目录下的初始化文件。这些文件, 和传统的linux启动过程中一样,是在initrd 镜像被解压缩

6、到RAM中时生成的。 待会我们将继续探讨这个问题。3 创建 initrd 的工具现 在,让我们回到一开始的讨论: initrd 的镜像是如何被创建的?在传统 的 linux 系统中, initrd 是在 linux build 的时候被创建的。像 mkinitrd 这样 的许许多多的工具, 都能够用于通过必须的库和模块来自动构建一个用于过渡到 真实根文件系统的 initrd 。事实上, mkinitrd 工具是一个脚本文件,因此,我 们能够很清楚得看到,这个过程是如何进行的。同样的, YAIRD (Yet Another Mkinitrd) 工具,也允许我们自定制每一个 initrd 被构建的

7、阶段。4 自己动手,打造自定义的初始化内存盘由 于很多基于 linux 的嵌入式系统都没有硬盘驱动器, initrd 也可以做为 永久性的根文件系统。 下面我就将告诉你们, 如何创建一个 initrd 镜像。我 使 用的是标准 linux 桌面系统,因此大家即使没有嵌入式目标设备也可以照着做。 除了交叉编译以外,嵌入式目标文件的构建过程是相同的。#!/bin/bash # Housekeeping. # Ramdisk Constants RDSIZE=4000 BLKSIZE=1024# Create an empty ramdisk imagedd if=/dev/zero of=/tmp

8、/ramdisk.img bs=$BLKSIZE count=$RDSIZE# Make it an ext2 mountable file system/sbin/mke2fs -F -m 0 -b $BLKSIZE /tmp/ramdisk.img $RDSIZE# Mount it so that we can populate mount /tmp/ramdisk.img /mnt/initrd -t ext2 -o loop=/dev/loop0# Populate the filesystem (subdirectories) mkdir /mnt/initrd/bin mkdir

9、 /mnt/initrd/sys mkdir /mnt/initrd/dev mkdir /mnt/initrd/proc# Grab busybox and create the symbolic links pushd /mnt/initrd/bin.ln -s busybox ashln -s busybox mountln -s busybox echoln -s busybox ls ln -s busybox cat ln -s busybox psln -s busybox dmesg ln -s busybox sysctl popd# Grab the necessary d

10、ev files cp -a /dev/console /mnt/initrd/dev cp -a /dev/ramdisk /mnt/initrd/dev cp -a /dev/ram0 /mnt/initrd/dev cp -a /dev/null /mnt/initrd/dev cp -a /dev/tty1 /mnt/initrd/dev cp -a /dev/tty2 /mnt/initrd/dev# Equate sbin with bin pushd /mnt/initrd ln -s bin sbin popd# Create the init filecat /mnt/ini

11、trd/linuxrc bootUncompressing Linux. OK, booting the kernel.在内核启动之后,它开始检查 initrd 镜像是否可用,如果答案是确定的,那么就作为根文件系统加载并挂载它。下面就是这个特殊启动过程的结尾:md: Autodetecting RAID arrays md: autorunmd: . autorun DONE.RAMDISK: Compressed image found at block 0 VFS: Mounted root (ext2 file system).Freeing unused kernel memory:

12、208k freed/ $ lsbinetcsysdevlib/ $ cat /proc/1/cmdline/bin/ash/linuxrc/ $ cd bin/bin $ lsash cat echo busybox dmesg ls/bin $ touch zfile/bin $ lsash cat echo busybox dmesg lslinuxrc proc lost+foundsbinmountsysctlpsmountsysctlps zfile当启动之后,可以通过 ash 来进入命令模式。在本例中,我探究了根文件系 统并向你演示了, 你能通过新建文件来写入这个文件系统。 只需

13、要注意, 第一步 是要创建 linuxrc 。6 通过初始化内存盘启动现在,大家已经看到了如何构建并使用一个自定制的初始化内存盘,这一节 则用于介绍,内核是如何辨认 initrd 并将其作为它的根文件系统挂载的。我将 涉及一些 boot chain 中的主要的函数并对发生的事件做出解释。像GRU这样的boot loader ,通常会确认即将加载的内核并复制该内核镜像 与任何相关联的 initrd 到内存中,你可以在你 linux 内核源程序目录下的 ./init 子目录中找到这些功能实现。在 内核与 initrd 镜像被解压缩和复制到内存后,内核被调用。此时,开始 各种各样的初始化过程,最终,

14、你会发现自己处于 init/main.c:init() (subdir/file:function) 。这个函数实现了很多的子系统初始化。 在这里, 要调 用 init /do_mounts.c:prepare_namespace() ,用来准备命名空间 ( 挂载 dev 文 件系统 , RAID, 或者 md, devices, 以及 , 最后的 initrd) 。通过对 init/do_mounts_initrd.c:initrd_load()的调用,最终完成对 initrd 的加载。initrd_load() 调用 init/do_mounts_rd.c:rd_load_image()

15、,来决定是否 通过调用 init /do_mounts_rd.c:identify_ramdisk_image()来加载内存盘镜像。后面这个函数通过检查内核的编号来确定文件究竟是是 minux,etc2 ,romfs ,cramfs ,还是 gzip 格式,直到返回 initrd_load_image 后, init/do_mounts_rd:crd_load()又被调用。 这个函数负责分配空间给内存盘, 并进行校验计算,解压缩,最后将内存盘镜像加载 到内存中。此时,你就已经拥 有了一个适合于挂载的,在块设备中的 initrd 镜像。现在,通过调用 init/do_mounts.c:mount

16、_root() 将这个块设备做为 root 挂载。ok,根设备就被创建了,接下来调用的函数是 init /do_mounts.c:mount_block_root() ,此函数又调用 fs/namespace.c:sys_mount() 来挂载真实的根文 件系统并对其进行 chdir 操 作。最后,会返回到启动函数中, 并调用 init/main.c:run_init_process 。调用 的结果是,初始化进程开始(在这里是通过 /linuxrc )。 linuxrc 可以是一个可 执行程序,也可以是脚本(只要脚本解释器能够正常解释它) 。函数调用的层次关系可以从下表中看出。并不是所有与复制

17、、挂载初始化内 存盘的函数都被列举出来,这里仅仅是大概的,对整体基本流程的回顾:init/main.c:initinit/do_mounts.c:prepare_namespace init/do_mounts_initrd.c:initrd_load init/do_mounts_rd.c:rd_load_image init/do_mounts_rd.c:identify_ramdisk_image init/do_mounts_rd.c:crd_loadlib/inflate.c:gunzipinit/do_mounts.c:mount_rootinit/do_mounts.c:moun

18、t_block_rootinit/do_mounts.c:do_mount_rootfs/namespace.c:sys_mount init/main.c:run_init_processexecve7 无盘启动的应用同 很多嵌入式系统的启动一样,本地磁盘(软驱或者光驱)对于启动内核 和内存盘根文件系统来说,并不是必须的。DHC工具能被用于确认网络参数,例如大家熟 悉的IP抵制和子网掩码等。此外,TFTP能被用于将内核镜像以及 初始化内存盘镜像传送到本地设备。一旦传输完成, linux 内核就能被启动以及 挂载 initrd ,和本地镜像启动的过程一样。8 让你的 initrd 尽可能小当你在构建嵌入式系统时,总是希望 initrd 的镜像尽可能小,恩,这里将 提供一些小技巧。首先就是使用 BusyBox。前面已经提到过,BusyBox包含了很 多较大的工具,通常体积都以 MB计算,但是它成功得将自己的体积控制在几百 KB的范围内。在 本例中, BusyBox 镜像使用的是静态链接,因此不需要提供任何库文件。 但是,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论