[转] initrd详解
转自:http://www.cnblogs.com/leaven/archive/2010/01/07/1641324.html
在Linux操作系统中,有一项特殊的功能——初始化内存盘INITRD(INITial Ram Disk)技术,而且内核支持压缩的文件系统映像。有了这两项功能,我们可以让Linux系统从小的初始化内存盘启动,并把系统内存的一部分作为根文件系统挂载。
Ramdisk就是将内存的一部分分配为一个分区并作为硬盘来使用。对于系统运行时不断使用的程序,将它们放在Ramdisk中将加快计算机的操作,如大数据量的网络服务器、无盘工作站等。为了能够使用Ramdisk,我们在编译内核时须将block device中的Ramdisk支持选上,它下面还有两个选项,一个是设定Ramdisk的大小,默认是4096k;另一个是设定默认个数。如果要使用initrd,还得选上的支持。它既可以直接编译进内核,也可以编译成模块,在需要的时候加载。我们由于在启动时就用它,所以必须将它直接编译进内核。
下面是2.6内核对模块选择路径:
Linux Kernel Configuration
-> Device Drivers
->Block devices
->RAM block device support
->Default number of RAM disks (设定Ramdisk的个数,默认是16)
->Default RAM disk size (kbytes) (设定Ramdisk的大小,默认是4096k)
Linux Kernel Configuration
->General setup
->Inital RAM filesystem and RAM disk(initramfs/initrd) support
如果对Ramdisk的支持已经编译进内核,我们就可以使用它了。首先在/mnt目录下创建目录ram,运行mkdir
/mnt/ram;然后对/dev/ram0创建文件系统,运行mke2fs /dev/ram0;最后挂载上/dev/ram,运行mount
/dev/ram0 /mnt/ram,就可以象对普通硬盘一样对它进行操作了。值得注意的是,在创建文件系统的时候,在屏幕上输出1024
inodes ,4096 blocks,即ramdisk大小为4M=4096个块,但是我们挂载上之后,用命令df –k
/dev/ram查看时,显示出来ramdisk大小只有3963K,这是由于文件系统本身占用了一些空间。(这个空间是在编译核心时就由Default
RAM disk size (kbytes)确定下来)
我们能根据需要改变ramdisk的大小。如我们要把默认的4M增大到8M,当ramdisk是直接编译进内核的情况下,可在grub配置文件 grub.conf中加入ramdisk=8192 ,运行grub后,重启计算机后,ramdisk大小变为8M。
例如要设置Ramdisk的大小为8M,在grub中可以用:
# grub.conf -
default=0
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title Redice Linux
root (hd0,0)
kernel /vmlinuz ro root=LABEL=/ hdc=ide-scsi ramdisk=8192
initrd /initrd
这样Ramdisk的大小就变成16M了。这个参数是Ramdisk直接编译到核心时才能使用的,如果Ramdisk编译为模块,则应该使用模块参数来设置Ramdisk的大小:
a、在模块加载配置文件 /etc/modules.conf中加入一行:
options rd rd_size=8192,
b、在加载rd模块是在后面加上说明,即insmod rd rd_size=8192。
# insmod rd rd_size=8192
编译到核心时,可以通过下面的一些核心命令行参数来配置Ramdisk:
ramdisk_size - ramdisk的大小(Kbytes);
ramdisk - 与ramdisk_size的作用相同;
ramdisk_blocksize - ramdisk的块大小,默认情况为1024;
当以模块的形式译时,模块支持以下几个加载参数:
rd_size - 同上面的ramdisk_size或ramdisk参数;
rd_blocksize - 同上面的ramdisk_blocksize;
或者在启动是作为启动行参数ramdisk=8192;
创建initrd ramdisk 映像
上面已经提到,Ramdisk需要先格式化然后才能使用。那么,如果核心希望使用ramdisk该如何做呢?于是initrd产生了,initrd全称是
initial RAM disk ,它提供一种让核心可以简单使用Ramdisk的能力,简单的说,这些能力包括:
格式化一个 Ramdisk;
加载文件系统内容到Ramdisk;
将Ramdisk作为根文件系统;
我们可以将initrd形像的比作Norton
Ghost备份的硬盘分区,而Linux启动阶段的Ramdisk相当于一个未格式化的硬盘分区,核心可以直接将initrd的内容释放到一个未初始化的Ramdisk里,这个过程与Ghost恢复一个分区的过程十分相似。于是,相应的内容被加载到相应的Ramdisk中,同时,这个Ramdisk也被格式化成某种由initrd格式所表达的分区格式。
initrd与Ghost备份的分区有许多相似之处,例如,它有一定的大小,包含分区上的文件系统格式等。initrd支持的格式包括:Ext2文件系统、Romfs文件系统、cramfs文件系统、minix文件系统、如果核心选择了Gzip支持(通常这是默认的,在init/do_mounts_rd.c中定义的BUILD_CRAMDISK宏)还可以使用Gzip压缩的initrd。相关的代码可以在核心源码
drivers/block/rd.c:identify_ramdisk_image中找到。
制作initrd
initrd 主要有两种格式:传统的ramdisk和cpio格式(这种格式的好处是内核原生不需要额外的文件系统支持)
制作initrd传统的作法是通过软盘(显然过时了,不介绍了)、ramdisk或loop设备(/dev/loop)。通过ramdisk来制作的方法比较简单(以ext2文件系统为例):
通过ramdisk
# mkfs.ext2 /dev/ram0
# mount /dev/ram0 /mnt/rd
# cp _what_you_like_ /mnt/rd # 把需要的文件复制过去
# dd if=/dev/ram0 of=/tmp/initrd
# gzip -9 /tmp/initrd
这个过程也最能够解释initrd的本质,对于Linux来说,Ramdisk的一个块设备,而initrd是这个块设备上所有内容的“克隆”(由命令dd来完成)而生成的文件。核心中加载initrd相关的代码则用于完成将相反的过程,即将这一个文件恢复到Ramdisk中去。
通过loop设备来制作initrd的过程:
dd if=/dev/zero of=/tmp/initrd bs=1024 count=4096 # 制作一个4M的空白文件
losetup /dev/loop0 /tmp/initrd # 映射到loop设备上;
mkfs.ext2 /dev/loop0 # 创建文件系统;
mount /dev/loop0 /mnt/rd
cp _what_you_like_ /mnt/rd # 复制需要的文件;
umount /mnt/rd
losetup -d /dev/loop0
gzip -9 /tmp/initrd
通过cpio来制作initrd的过程:
cd /path/to # 到需要复制的文件的目录
find . |cpio -o -H newc |gzip -c > ../initrd.gz
不过,现在已经有了一些更好的工具来完成这些工作,包括genromfs(uClinux里常用的工具),genext2fs,mkcramfs、mkinitrd等。这些工具提供了一些方便开发的新特性,例如,不需要上面烦索的过程,只要将文件复制到某个目录中,将其作为根目录,即可生成initrd;另一个重要的改进是,这些工具都可以以普通用户的身份来生成initrd。
[转] initrd详解的更多相关文章
- 详解Linux目录(目录树详细解释)
给大家一篇关于Linux目录 方面的详细说明,好好读一下! Linux目录详解(RHEL5.4) linux有四种基本文件系统类型:--普通文件:如文本文件.c语言源代码.shell脚本等,可以用ca ...
- Linux(centos)系统各个目录的作用详解
Linux(centos)系统各个目录的作用详解 文件系统的类型 LINUX有四种基本文件系统类型:普通文件.目录文件.连接文件和特殊文件,可用file命令来识别. 普通文件:如文本文件.C语言元代码 ...
- Linux的启动流程以及GRUB详解
一.Linux引导和启动流程 概述,计算机电源接通后通过BISO之后,没有问题,就会去硬盘上找到MBR(Main Boot Record 主引导记录区)位于整个硬盘的0磁道0柱面1扇区, ...
- Linux基本配置和管理 4 ---- Linux系统启动详解
1 系统启动的流程 BIOS -> MBR+boot code -> 执行引导程序: GRUB -> 加载内核 -> 执行init -> 运行runlevel 2 启动详 ...
- Windows XP硬盘安装Ubuntu 12.04双系统图文详解
Windows XP硬盘安装Ubuntu 12.04双系统图文详解 Ubuntu 12.04 LTS版本于2012年4月26日发布,趁着五一放假,赶紧在自己的Windows XP的电脑上安装下Ubun ...
- Grub2配置详解(转)
grub2基础教程-修订版 smallapple 目录 一.grub2新特性 二.grub2安装与启动 三.grub2配置文件 ...
- iptables详解--转
出处:http://yijiu.blog.51cto.com/433846/1356254 iptables详解 基本概念: 1.防火墙工作在主机边缘:对于进出本网络或者本主机的数据报文,根据事先设定 ...
- Linux 启动详解之init
1.init初探 init是Linux系统操作中不可缺少的程序之一.init进程,它是一个由内核启动的用户级进程,然后由它来启动后面的任务,包括多用户环境,网络等. 内核会在过去曾使用过init的几个 ...
- Iptables详解七层过滤
<Iptables详解七层过滤> 一.防火墙简介 防火墙其实就是一个加固主机或网络安全的一个设备或者软件而已,通过防火墙可以隔离风险区域与安全区域的连接,同时不会妨碍风险区域的访问.当然需 ...
随机推荐
- ServiceWorker.state
[ServiceWorker.state] ServiceWorker.state The state read-only property of the ServiceWorker interfac ...
- 第七篇:Jmeter连接MySQL的测试
.准备一个有数据表格的MySQL数据库: 2.在测试计划面板上点击浏览按钮,把你的JDBC驱动添加进来: mysql-connector-java-5.1.26-bin.jar 3.添加一个线程组-- ...
- Centos7 安装mysql5.7.24
从mysql官网下载 mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz 拷贝到Centos的/opt目录下 1. 解压缩 tar -xzvf mysql-5.7.2 ...
- Java 日期时间 Date类型,long类型,String类型表现形式的转换
Java 日期时间 Date类型,long类型,String类型表现形式的转换 1.java.util.Date类型转换成long类型 java.util.Date dt = new Date(); ...
- JMeter学习(三)元件的作用域与执行顺序(转载)
转载自 http://www.cnblogs.com/yangxia-test 1.元件的作用域 JMeter中共有8类可被执行的元件(测试计划与线程组不属于元件),这些元件中,取样器是典型的不与其它 ...
- 【OpenGL】第一个窗口
包含头文件: #include <GL/glew.h> // GLFW #include <GLFW/glfw3.h> 初始化与配置GLFW: glfwInit(); //初始 ...
- .resources文件转为可视化.resx文件
ResGen.exe启动闪退.--方法不对 参考:http://www.opdown.com/soft/101205.html 在cmd中启动ResGen.exe. 打开cmd:输入 C:\Windo ...
- vue-cli 配置 proxyTable pathRewrite
vue-config-index.js中,proxyTable中的pathRewrite有什么用呢? 首先,在ProxyTable模块中设置了‘/api’,target中设置服务器地址,也就是接口的开 ...
- POJ-1426.Findthemultiple.(BFS)
一开始模拟了一波大数取余结果超时了,最后改成long long过了emmm... 本题大意:给出一个200以内的数n,让你找出一个m使得m % n == 0,要求m只有1和0组成. 本题思路:BFS模 ...
- Java自学之路(小白向)
首先学习一门语言无非就受教与自学两种方式,本博文针对自学(穷逼没钱报班,大学又不是计算机专业,只能自学啊) 开个玩笑,其实有很多人是适合自学的,下面介绍. 一.要充满自信我自己就可以学好(够面试用的入 ...