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

.....

linux initrd模式,在Linux系统上开启Initrd文件系统的方法相关推荐

  1. metasploit下载教程linux,在Debian 10/9系统上安装Metasploit Framework的方法

    本文介绍在Debian 10/9操作系统上安装Metasploit Framework的方法,以脚本的方式安装,全程相当的简单,按照以下步骤操作即可. 在Debian 10/Debian 9上安装Me ...

  2. CentOS Linux release 7.8.2003 系统上部署KVM系统

    CentOS Linux release 7.8.2003 系统上部署KVM系统 1.升级内核操作 yum update -y kernel kernel-firmware reboot 2. 安装必 ...

  3. 在linux(ubuntu16.04)系统上安装RTL8822CE网卡驱动

    在linux(ubuntu16.04)系统上安装RTL8822CE网卡驱动 1.下载8822CE驱动https://github.com/alanfox2000/realtek-linux/tree/ ...

  4. linux chrome 硬件加速,在Chrome上开启硬件加速和预先渲染的方法技巧

    在 Chrome 上开启硬件加速的方法非常简单,Chrome 正式版和测试版都可以通过在about:flags中开启硬件加速以提升网页浏览体验并延长电池使用时间,如果你是那种动不动就开30个标签以上的 ...

  5. 如何启用计算机端口,Win7系统下开启计算机端口的方法

    计算机端口是计算机与外界通讯交流的出口,有时候由于操作的失误会把计算机的端口关闭,这时候就需要用户手动去开启.在Win7系统下,用户该如何开启端口呢?下面小编为大家介绍两种比较实用的方法. Win7系 ...

  6. ubuntu java8 java9_在Ubuntu/Debian系统上安装Java 9的方法

    本文介绍在Ubuntu/Debian系统上安装Oracle Java 9的方法:使用webupd8team/java PPA,相同的PPA提供了Java 8和Java 7等旧版Java的软件包,如果你 ...

  7. 在Ubuntu 18.04系统上安装Java 11的方法

    本文将介绍在Ubuntu 18.04/Ubuntu 16.04/Debian 9系统上安装Java 11的方法,可以通过openjdk-11.0.1_linux-x64_bin.tar.gz.jdk- ...

  8. 执行cmd命令时:因为在此系统上禁止运行脚本的解决方法

    执行cmd命令时:因为在此系统上禁止运行脚本的解决方法 参考文章: (1)执行cmd命令时:因为在此系统上禁止运行脚本的解决方法 (2)https://www.cnblogs.com/cat-eol/ ...

  9. redhat和ubuntu系统下挂载ntfs文件系统的方法(转载)

    1.首先确定你的linux kernel版本是什么(Redhat9.0默认的kernel版本是2.4.20-8 )  #> rpm -qa|grep kernel  会显示类式的如下信息:  k ...

最新文章

  1. 2021-07-26 TypeError: can‘t convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the
  2. JS 得到时间的各个部分
  3. lay弹窗库的一个坑
  4. 今晚8点:基于强化学习的关系抽取和文本分类 | PhD Talk #18
  5. centos网络隔一段时间就断_如果是中专学历,以后做网络工程师会有瓶颈吗?
  6. Explaining Classifiers using Adversarial Perturbations on the Perceptual Ball论文解读
  7. Android开发:菜单栏Menu用法讲解
  8. php中正则表达式中的特殊符号
  9. SQL文件示例(Mysql)
  10. SAP常用TCODE
  11. 统计学习方法第二版pdf_notability笔记pdf版乱码解决方法
  12. EAS BOS 后台事务定义步骤
  13. 未来电子服务领域信用系统的架构和发展趋势预测
  14. 边沿触发器(T触发器)
  15. 知识付费系统源码(开源知识付费系统平台下载)
  16. ffmpeg实战教程(十一)手把手教你实现直播功能,不依赖第三方SDK
  17. html 拖放插件,DAD – jQuery拖拽/拖放插件
  18. 紫薯第10章数学 kaungbin专题14数论基础
  19. 【181125】VC++ 绘制立方体的生成与控制旋转程序源代码
  20. 打印出每个学生的总分和平均分,每门课的总分和平均分

热门文章

  1. Relia Tech活性VEGFR重组蛋白丨小鼠 VEGF120实例展示
  2. SGU - 106 The equation(扩欧+细节处理)
  3. 赚钱宝背后的CDN技术演进
  4. 物联网卡到底是不是“坑”
  5. 传输控制协议(TCP)
  6. 孔子和李白都是武林高手
  7. c语言中警号的作用,熟悉的警号
  8. Eclipse WTP 入门
  9. 12.自媒体文章-自动审核
  10. 【干货#001】小程序使用有赞ZanUI