• <tr id='jm0j8'><strong id='jm0j8'></strong><small id='jm0j8'></small><button id='jm0j8'></button><li id='jm0j8'><noscript id='jm0j8'><big id='jm0j8'></big><dt id='jm0j8'></dt></noscript></li></tr><ol id='jm0j8'><table id='jm0j8'><blockquote id='jm0j8'><tbody id='jm0j8'></tbody></blockquote></table></ol><u id='jm0j8'></u><kbd id='jm0j8'><kbd id='jm0j8'></kbd></kbd>
  • <acronym id='jm0j8'><em id='jm0j8'></em><td id='jm0j8'><div id='jm0j8'></div></td></acronym><address id='jm0j8'><big id='jm0j8'><big id='jm0j8'></big><legend id='jm0j8'></legend></big></address><dl id='jm0j8'></dl>
    <fieldset id='jm0j8'></fieldset>

      1. <span id='jm0j8'></span>

        1. <i id='jm0j8'><div id='jm0j8'><ins id='jm0j8'></ins></div></i>
        2. <ins id='jm0j8'></ins>

          <i id='jm0j8'></i>

          <code id='jm0j8'><strong id='jm0j8'></strong></code>

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

            • 时间:
            • 浏览:10
            • 来源:124软件资讯网

                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

                .....