欢迎登陆真网站,您的到来是我们的荣幸。 登陆 注册 忘记密码? ☆设为首页 △加入收藏
欢迎加入真幸福QQ群
电脑知识: 基础知识 网络技术 操作系统 办公软件 电脑维修 电脑安全 windows7 windows8 windows10 服务器教程 平板电脑 视频播放教程 网络应用 互联网 工具软件 浏览器教程 QQ技巧 输入法教程 影视制作 YY教程 wps教程 word教程 Excel教程 PowerPoint
云南西双版纳特产小花糯玉米真空包装


如何隐藏Excel工作表行或列
阿里云邮箱群发退信显示错误代码怎么办?
谷歌输入法怎么打符号
1234笔画输入法怎么小键盘输入?
Win7系统网络打印机的详细怎么设置
光速输入法怎么添加自定义短语?
搜狗输入法怎么使用双拼?
Win7系统开机自动打开浏览器并提示登入怎么关闭?
Win7系统通过更改Host文件来访问Google的方法
Win7安装Dreamweaver CS6提示错误代码0xc000007b怎么办?
在Linux系统上开启Initrd文件系统的方法
【 来源:网络 】【 点击:1 】 【 发布时间:2017_03_03 08:59:59 】

   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

  .....

本网站由川南居提供技术支持,fkzxf版权所有 浙ICP备12031891号