initrd概述

initrd即initial ramdisk,它是在系统引导过程中挂载的一个临时根文件系统.激活系统所须加载的文件系统.

下面先了解下kernel到initrd的流程:

在grub加载kernel时,kernel会在内存中制造一个rootfs当做临时空间供系统使用,接下来,kernel会将initrd当做是一个系统,将其mount到rootfs上启动.这个文件很重要,因为它负责开机时加载kernel所无法提供的模块.当initrd被加载后,为了让用户能够访问到文件系统,就需要该文件系统的模块,相当于驱动.另外,还需要额外的所有必须要预先加载的模块.

下面来看下如何打开initrd,这里我使用的是debian5操作系统

1.创建一个目录,将/boot/initrd.img-2.6.18-6-amd64 复制到该目录下.

root@192.168.30.68:tmp# mkdir initrd
root@192.168.30.68:tmp# cd initrd/
root@192.168.30.68:initrd# ls
root@192.168.30.68:initrd# cp /boot/initrd.img-2.6.18-6-amd64 .
root@192.168.30.68:initrd# ls
initrd.img-2.6.18-6-amd64
2.将initrd文件名改为.gz文件,将其解压缩.
root@192.168.30.68:initrd# file initrd.img-2.6.18-6-amd64 #发现该文件是一个gzip压缩过的文件
initrd.img-2.6.18-6-amd64: gzip compressed data, from Unix, last modified: Thu Sep 24 18:21:40 2009
root@192.168.30.68:initrd# mv initrd.img-2.6.18-6-amd64 initrd.img-2.6.18-6-amd64.gz
root@192.168.30.68:initrd# file initrd.img-2.6.18-6-amd64.gz 
initrd.img-2.6.18-6-amd64.gz: gzip compressed data, from Unix, last modified: Thu Sep 24 18:21:40 2009
root@192.168.30.68:initrd# gunzip initrd.img-2.6.18-6-amd64.gz
3.使用file发现解压缩过后的文件是一个cpid格式,是一种备份格式,使用cpio,参数'i' 代表解包 与'd' 代表在需要时自动建立第一层目录.
root@192.168.30.68:initrd# file initrd.img-2.6.18-6-amd64
initrd.img-2.6.18-6-amd64: ASCII cpio archive (SVR4 with no CRC)
root@192.168.30.68:initrd# cpio -id < initrd.img-2.6.18-6-amd64
32912 blocks
root@192.168.30.68:initrd# ls
bin  conf  etc  init  initrd.img-2.6.18-6-amd64  lib  lib64  sbin  scripts
root@192.168.30.68:initrd# rm initrd.img-2.6.18-6-amd64 
rm: remove regular file `initrd.img-2.6.18-6-amd64'? y
root@192.168.30.68:initrd# ls
bin  conf  etc  init  lib  lib64  sbin  scripts

也可以直接通过zcat读取gzip格式的文件,再将读出来的结果由pipeline交给cpio解开

root@192.168.30.68:initrd# zcat initrd.img-2.6.18-6-amd64 | cpio -id
32912 blocks
root@192.168.30.68:initrd# ls
bin  conf  etc  init  initrd.img-2.6.18-6-amd64  lib  lib64  sbin  scripts

以上就是initrd文件打开后的目录架构,当kernel启动加载initrd时,并没有任何系统的目录架构,这时会先以initrd所提供的目录当做是系统的暂时目录.

其中有个lib目录:里面存放着许多的模块,即现在系统所有的模块,这代表目录中所存放的模块都是开机所必须加载的模块.例如当kernel加载Initrd之后,initrd将会加相应的网络模块驱动,以便让我们进入操作系统能够识别到网卡.

root@192.168.30.68:initrd# lsmod | grep bnx2  #本机网络驱动
bnx2                  183048  0 
root@192.168.30.68:initrd# find . -name 'bnx2*' #initrd里bnx2对应的模块
./lib/modules/2.6.18-6-amd64/kernel/drivers/net/bnx2.ko
./lib/firmware/bnx2-09-4.0.5.fw
./lib/firmware/bnx2-06-4.0.5.fw

假如临时又添加了一块最新的网卡,希望在开机时加载,这时只要修改initrd文件的内容在打个包就可以了,比起重新编译kernel或者安装操作系统要方便多了.


下面介绍如何让将修改后的initrd文件再重新打包起来.

1.在修改后的文件目录下,使用find将所有的文件列出来,再通过pipeline,把所有清单交给cpio指令.cpio用到的参数'c'代表用新的SVR4可移植格式.'o'代表建立文件.最后用gzip以最佳的压缩效率'-9'压缩(默认是-6),使用'>'导出.

root@192.168.30.68:initrd# ls
bin  conf  etc  init  lib  lib64  sbin  scripts
root@192.168.30.68:initrd# find | cpio -co | gzip -9 > initrd.img-2.6.18-6-amd64 
32884 blocks
root@192.168.30.68:initrd# ls
bin  conf  etc  init  initrd.img-2.6.18-6-amd64  lib  lib64  sbin  scripts
root@192.168.30.68:initrd# file initrd.img-2.6.18-6-amd64 
initrd.img-2.6.18-6-amd64: gzip compressed data, from Unix, last modified: Tue May 14 13:50:26 2013, max compression
2.将该文件copy到/boot/下.重启机器生效.


此外在initrd被kernel加载后的开机流程,是依照initrd文件中的一个init文件,由它所提供的脚本一步一步往下做,包括实体硬盘加载实际的操作系统也是由这个文件提供的.

root@192.168.30.68:initrd# ls
bin  conf  etc  init  lib  lib64  sbin  scripts
root@192.168.30.68:initrd# cat init
#!/bin/sh

echo "Loading, please wait..."

[ -d /dev ] || mkdir -m 0755 /dev
[ -d /root ] || mkdir -m 0700 /root
[ -d /sys ] || mkdir /sys
[ -d /proc ] || mkdir /proc
[ -d /tmp ] || mkdir /tmp
mkdir -p /var/lock
mount -t sysfs -o nodev,noexec,nosuid none /sys 
mount -t proc -o nodev,noexec,nosuid none /proc 

# Note that this only becomes /dev on the real filesystem if udev's scripts
# are used; which they will be, but it's worth pointing out
tmpfs_size="10M"
if [ -e /etc/udev/udev.conf ]; then
	. /etc/udev/udev.conf
fi
mount -t tmpfs -o size=$tmpfs_size,mode=0755 udev /dev
[ -e /dev/console ] || mknod -m 0600 /dev/console c 5 1
[ -e /dev/null ] || mknod /dev/null c 1 3
> /dev/.initramfs-tools
mkdir /dev/.initramfs

# Export the dpkg architecture
export DPKG_ARCH=
. /conf/arch.conf

# Set modprobe env
export MODPROBE_OPTIONS="-qb"

# Export relevant variables
export ROOT=
export ROOTDELAY=
export ROOTFLAGS=
export ROOTFSTYPE=
export break=
export init=/sbin/init
export quiet=n
export readonly=y
.....




转载于:https://my.oschina.net/davehe/blog/130795

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值