首页 > 其他分享 >制作initramfs/initrd镜像

制作initramfs/initrd镜像

时间:2024-12-23 11:13:12浏览次数:7  
标签:kernel RAM initramfs initrd 模块 镜像 disk

参考 http://www.cnblogs.com/wwang

Linux kernel在自身初始化完成之后,需要能够找到并运行第一个用户程序(这个程序通常叫做“init”程序)。
用户程序存在于文件系统之中,因此,内核必须找到并挂载一个文件系统才可以成功完成系统的引导过程。

在grub中提供了一个选项“root=”用来指定第一个文件系统,
但随着硬件的发展,很多情况下这个文件系统也许是存放在USB设备,SCSI设备等等多种多样的设备之上,
如果需要正确引导,USB或者SCSI驱动模块首先需要运行起来,可是不巧的是,这些驱动程序也是存放在文件系统里,因此会形成一个悖论。

为解决此问题,Linux kernel提出了一个RAM disk的解决方案,
把一些启动所必须的用户程序和驱动模块放在RAM disk中,
这个RAM disk看上去和普通的disk一样,有文件系统,有cache,
内核启动时,首先把RAM disk挂载起来,等到init程序和一些必要模块运行起来之后,再切到真正的文件系统之中。

上面提到的RAM disk的方案实际上就是initrd。 
如果仔细考虑一下,initrd虽然解决了问题但并不完美。 
比如,disk有cache机制,对于RAM disk来说,这个cache机制就显得很多余且浪费空间;
disk需要文件系统,那文件系统(如ext2等)必须被编译进kernel而不能作为模块来使用。

Linux 2.6 kernel提出了一种新的实现机制,即initramfs。
顾名思义,initramfs只是一种RAM filesystem而不是disk。
initramfs实际是一个cpio归档,启动所需的用户程序和驱动模块被归档成一个文件。
因此,不需要cache,也不需要文件系统。


I. initramfs

详细的initramfs的资料可以参考如下:

(1) 黃敬群先生的blog:深入理解 Linux 2.6 的 initramfs 機制

http://blog.linux.org.tw/~jserv/archives/001954.html

(2) initramfs, a new model for initial RAM

http://www.linuxdevices.com/articles/AT4017834659.html

下面是一些使用initramfs的简单帮助

1. 查看initramfs的内容

# mkdir temp ; cd temp
# cp /boot/initrd.img-2.6.24-16 initrd.img-2.6.24-16.gz
# gunzip initrd.img-2.6.24-16.gz
# cpio -i --make-directories < initrd.img-2.6.24-16

2. 创建initramfs

命令:mkinitramfs, update-initramfs

1) mkinitramfs
# mkinitramfs -o /boot/initrd.img 2.6.24-16

Note: 2.6.24-16是需要创建initramfs的kernel版本号,
如果是给当前kernel制作initramfs,可以用uname -r查看当前的版本号。
提供kernel版本号的主要目的是为了在initramfs中添加指定kernel的驱动模块。
mkinitramfs会把/lib/modules/${kernel_version}/ 目录下的一些启动会用到的模块添加到initramfs中。

2)update-initramfs

更新当前kernel的initramfs
# update-initramfs -u

在添加模块时,initramfs tools只会添加一些必要模块,
用户可以通过在/etc/initramfs-tools/modules文件中加入模块名称来指定必须添加的模块。

II. initrd

目前还是有不少Linux发行版采用initrd(即RAM disk的方式)来实现引导,所以了解一下mkinitrd这个命令也很有必要。


mkinitrd类似于mkinitramfs,是用于生成initrd的一个工具。最基本的用法参考下面:
#mkinitrd /boot/initrd.img $(uname -r)

如果需要指定哪些module在启动时必须load,需要加上--preload=module或者 --with=module这样的选项。 
这两者的区别在于--preload指定的module会在/etc/modprobe.d/* 里声明的任何SCSI模块之前被加载,--with指定的module会在/etc/modprobe.d/* 里声明的任何SCSI模块之后被加载。

另外还有一个选项需要被注意,即--builtin=module。
在manual里这个选项的解释是:
Act as if module is built into the kernel being used. 
mkinitrd will not look for this module, and will not emit an error if it does not exist.
This option may be used multiple times.

根据上面的解释,可以看出builtin选项另外还有一个取巧的用处。
以我所用的平台Acer Aspire One为例, 
我在用mkinitrd制作RAM disk镜像是出现一个错误“No module ohci-hcd found ...”,
遇到这个情况,builtin选项就起作用了,
用--builtin=ohci-hcd, mkinitrd就可以忽略ohci-hcd不存在这个事实了。

标签:kernel,RAM,initramfs,initrd,模块,镜像,disk
From: https://www.cnblogs.com/scotth/p/18623479

相关文章

  • 使用脚本从HuggingFace镜像站下载模型或数据集
    在模型训练和部署中,往往会遇到访问HF超时的问题。因此我们常常会提前将模型权重或数据集下载到本地。但相关文件往往比较多,在网页上手动下载太过繁琐。一个一键下载指定HF仓库的脚本就非常实用。命令行安装huggingface-clipipinstall-Uhuggingface_hub创建python脚本如......
  • docker近期能用的镜像加速器
    加速器地址:https://docker.1ms.run配置方法创建或修改/etc/docker/daemon.json文件{"registry-mirrors":["https://docker.1ms.run"]}加载重启dockersystemctlrestartdocker查看是否成功[root@zabbix-server~]#dockerinfoRegistryMirrors:https://doc......
  • 进程内存转储工具|内存镜像提取-取证工具
    1.内存转储,内存转储(MemoryDump)是将计算机的物理内存(RAM)内容复制到一个文件中的过程,这个文件通常被称为“内存转储文件”或“核心转储文件”(CoreDump),内存转储的主要目的是为了调试和分析程序崩溃,系统故障或其他异常情况,通过分析转储文件,开发人员和系统管理员可疑了解在发生问......
  • VMware.ESXi 8.0U3 Dell服务器镜像驱动注入
    最近在做esxi镜像时遇到的一些问题一、VMware.PowerCLI的安装问题在线安装速度实在太慢了,用了小蓝毛还是很慢,强烈建议使用离线安装模式1.下载离线安装包 VMwarePowerCLI12.7.02.将文件解压到ps模块目录下 C:\Windows\System32\WindowsPowerShell\v1.0\Modules3.打开Po......
  • OpenWRT——官方镜像安装Docker(网络环境需设置)并配置Sun-Pannel
    首先确认宿主机网络环境符合要求curlGoogle.com1.确认没问题后开始安装Dockeropkgupdateopkginstalldockerddockerluci-app-dockerman无需重启,退出浏览器重新登录即可确认docker安装完成2.一键部署Sun-Pannel项目地址https://github.com/hslr-s/sun-pa......
  • mindie-llm 镜像指南
    mindie-llm镜像指南(rc2版)基础镜像:mindie_1.0.rc2:cann_8.0.rc2-py_3.10-ubuntu_22.04基础容器启动命令(后续只做单卡推理):dockerrun-itd--namemindie-llm-eASCEND_VISIBLE_DEVICES=0-v/app:/app-p9000:8900mindie_1.0.rc2:cann_8.0.rc2-py_3.10-ubuntu_22.04b......
  • dracut 与initramfs-tools 区别
      initrd与initramfs  dracut与initramfs-tools的区别dracut 和 initramfs-tools 都是用于生成initramfs(初始RAM文件系统)的工具,但它们在设计理念、功能和使用方法上有一些显著的区别。dracutdracut 是下一代的initramfs系统,与传统的 mkinitrd 相比,它......
  • 在Android Studio中,通过设置腾讯镜像和代理解决无法下载gradle和gradle.plugin等组件
    诸神缄默不语-个人CSDN博文目录这个出现在刚打开项目的时候,下载一堆必要的组件……无法下载gradle的报错信息是:CouldnotinstallGradledistributionfrom'https://services.gradle.org/distributions/gradle-8.9-bin.zip'.Reason:java.net.SocketTimeoutException:......
  • 使用dockerfile构建python3的镜像并启动容器另一种方式
    使用dockerfile构建python3的镜像并启动容器另一种方式1.新建目录DockerfilesmkdirDockerfilescdDockerfiles2.新建文件DockerfiletouchDockerfile写入以下内容:FROMcentos:7.6.1810MAINTAINERtest#指定作者信息RUNset-ex\#预安装所需组件&......
  • Dodcker如何导入镜像tar
    Dodcker如何导入镜像tar我们可以将docker镜像导出为压缩文件,然后再在另一主机上导入。要在Docker中导入一个.tar格式的镜像文件,您可以使用dockerload命令。这个命令会将一个保存的镜像压缩文件(.tar,.tar.gz或.tgz)加载到Docker镜像库中。dockerload-i<image_name>.tar例如......