在Linux系统上开启Initrd文件系统的方法

  initial RAM disk

  Linux初始RAM磁盘(initrd)是在系统引导过程中挂载的一个临时根文件系统,用来支持两阶段的引导过程。initrd文件中包含了各种可执行程序和驱动程序,它们可以用来挂载实际的根文件系统,然后再将这个 initrd RAM磁盘卸载,并释放内存。在很多嵌入式Linux系统中,initrd 就是最终的根文件系统。本文将探索 Linux 2.6 的初始 RAM磁盘,包括如何创建以及如何在Linux内核中使用。

  什么是初始 RAM 磁盘

  初始RAM磁盘(initrd)是在实际根文件系统可用之前挂载到系统中的一个初始根文件系统。initrd与内核绑定在一起,并作为内核引导过程的一部分进行加载。内核然后会将这个 initrd文件作为其两阶段引导过程的一部分来加载模块,这样才能稍后使用真正的文件系统,并挂载实际的根文件系统。

  initrd 中包含了实现这个目标所需要的目录和可执行程序的最小集合,例如将内核模块加载到内核中所使用的 insmod 工具。

  在桌面或服务器Linux 系统中,initrd 是一个临时的文件系统。其生存周期很短,只会用作到真实文件系统的一个桥梁。在没有存储设备的嵌入式系统中,initrd 是永久的根文件系统。本文将对这两种情况进行探索。

  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

  .....

(0)

相关推荐

  • 在Linux系统上实现IP转发的方法

    大家好,今天我们学习一下在 Linux 上用 iptables 实现从一个网络接口到另一个接口的IP转发(数据包转发).IP转发的概念是,使 Linux 机器像路由器一样将数据从一个网络发送到另一个网 ...

  • Linux系统上安装MRTG来监控网络流量

    Multi Router Traffic Grapher------MRTG是一个监控网络链路流量负载的工具软件,通过snmp协议得到设备的流量信息,并将流量负载以包含PNG格式的图形的HTML 文档 ...

  • 如何进行检查Linux系统上的网络连接

    在Linux系统上有许多可用于查看的网络设置和连接命令,使用快捷的命令来进行配置系统上的网络连接,方便使用者来查看网络配置和连接. 操作方法 01 首先使用ifquery命令,窗口显示一个网络接口列表 ...

  • Linux系统下如何制作Live USB?Linux系统下制作Live USB的方法

    不管是使用Win系统,还是安装了Linux系统,只要不会对原本的系统造成损害,用户可以使用Live USB尝试Linux的各种发行版本,那么,Linux系统下该如何制作Live USB呢?下面小编就给 ...

  • 在Linux系统上使用交换文件扩展swap空间的方法

    想像一种情景,当我们的Linux系统用尽交换空间时,在这种情况下,我们想要使用swap分区扩展交换空间,但在某些情况下磁盘上已经没有可用的空闲分区了,致使我们不能把它扩大. 因此,在这种情况下,我们可 ...

  • 在Linux系统上安装Wine的教程

    Wine,一个在Linux平台上非常受欢迎并且强大的开源应用,有了它,我们可以在Linux平台上完美运行Windows应用与游戏. WineHQ团队,近期宣布了一个新的开发版本Wine1.7.29.这 ...

  • 在Linux系统上配置SNMP的方法

    在Debian或Ubuntu上配置SNMP 要在基于Debian的系统上安装SNMP代理(snmpd),请运行以下命令: 代码如下: root@server:~# apt-get install sn ...

  • Linux系统MySQL开启远程连接

    远程连接服务器上的MySQL. Navicat软件连接数据库报错:2003-can't connect to MYSQL serve 操作方法 01 远程连接上Linux系统,确保Linux系统已经安 ...

  • 在Linux系统上进行openmp多线程编程的方法

    OpenMP是一种多处理器多线程的编程语言,能够支持多个平台,包括Linux系统,那么Linux下要如何进行openmp多线程编程呢?一起来了解下吧。 关键语法: 代码如下: #inlcude 《om ...