请选择 进入手机版 | 继续访问电脑版

[LINUX] 在Linux体系 上开启Initrd文件体系 的方法

[复制链接]
查看53 | 回复5 | 2021-9-4 22:14:32 | 显示全部楼层 |阅读模式

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
.....


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

avatar 水497 | 2021-9-18 12:47:20 | 显示全部楼层
admin楼主练了葵花宝典吧?
回复

使用道具 举报

avatar 小瑞熙 | 2021-9-20 15:08:51 | 显示全部楼层
学习雷锋,好好回帖!
回复

使用道具 举报

avatar 123457000 | 2021-9-20 16:17:24 | 显示全部楼层
顶!顶!顶!
回复

使用道具 举报

avatar 尹泽汐猩 | 2021-10-7 16:00:37 | 显示全部楼层
楼上的心情不错啊!
回复

使用道具 举报

终于看完了,很不错!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则