initramfs-kernel_ubuntu initramfs

initramfs-kernel_ubuntu initramfsLinux系统启动时使用initramfs(initramfilesystem),initramfs可以在启动早期提供一个用户态环境,借助它可以完成一些内核在启动阶段不易完成的工作。当然initramfs是可选的,Linux中的内核编译选项默认开启initrd。在下面的示例情况中你可能要考虑用initramfs。加载模块,比如第三方driver定制化启动过程(比如打印welcomeme…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

Linux系统启动时使用initramfs (initram file system), initramfs可以在启动早期提供一个用户态环境,借助它可以完成一些内核在启动阶段不易完成的工作。当然initramfs是可选的,Linux中的内核编译选项默认开启initrd。在下面的示例情况中你可能要考虑用initramfs。

加载模块,比如第三方driver

定制化启动过程 (比如打印welcome message等)

制作一个非常小的rescue shell

任何kernel不能做的,但在用户态可以做的 (比如执行某些命令)

一个initramfs至少要包含一个文件,文件名为/init。内核将这个文件执行起来的进程作为main init进程(pid 1)。当内核挂载initramfs后,文件系统的根分区还没有被mount, 这意味着你不能访问文件系统中的任何文件。如果你需要一个shell,必须把shell打包到initramfs中,如果你需要一个简单的工具,比如ls, 你也必须把它和它依赖的库或者模块打包到initramfs中。总之,initramfas是一个完全独立运行的体系。

另外initramfs打包的时候,要求打包成压缩的cpio档案。cpio档案可以嵌入到内核image中,也可以作为一个独立的文件在启动的过程中被GRUB load。

Linux的initramrd img

在/boot目录下的initrd.img-xxx (Ubuntu)或者initramfs-xxx.img (CentOS) 文件即为Linux用的initramfs文件。我们可以将其解压出来看看其目录结构,如下:

# ls -l /boot/total67408

-rw-r–r– 1 root root 1240067 Jul 13 2016 abi-4.4.0-31-generic-rw-r–r– 1 root root 1247269 Aug 15 2017 abi-4.4.0-93-generic-rw-r–r– 1 root root 189566 Jul 13 2016 config-4.4.0-31-generic-rw-r–r– 1 root root 190364 Aug 15 2017 config-4.4.0-93-generic

drwxr-xr-x 5 root root 4096 Jul 4 17:23grub-rw-r–r– 1 root root 21977388 Aug 24 2017 initrd.img-4.4.0-31-generic-rw-r–r– 1 root root 22440248 Aug 24 2017 initrd.img-4.4.0-93-generic-rw——- 1 root root 3879360 Jul 13 2016 System.map-4.4.0-31-generic-rw——- 1 root root 3899015 Aug 15 2017 System.map-4.4.0-93-generic-rw——- 1 root root 6937248 Jul 13 2016 vmlinuz-4.4.0-31-generic-rw——- 1 root root 7000752 Aug 15 2017 vmlinuz-4.4.0-93-generic

# initrd的文件类型是gzip压缩文件

#file /boot/initrd.img-4.4.0-93-generic/boot/initrd.img-4.4.0-93-generic: gzip compressed data, from Unix, last modified: Thu Aug 24 20:51:59 2017#cp /boot/initrd.img-4.4.0-93-generic .# 文件大小为22M

#ls -lh initrd.img-4.4.0-93-generic-rw-r–r– 1 root root 22M Jul 5 15:46 initrd.img-4.4.0-93-generic

# 修改文件的后缀名,否则gzip工具无法识别

#mv initrd.img-4.4.0-93-generic initrd.img-4.4.0-93-generic.gz

# 用gzip解压缩

#gzip -d initrd.img-4.4.0-93-generic.gz

# 解压后的大小为57M

#ls -lh initrd.img-4.4.0-93-generic-rw-r–r– 1 root root 57M Jul 5 15:46 initrd.img-4.4.0-93-generic

# 解压后的文件类型为cpio档案

#file initrd.img-4.4.0-93-generic

initrd.img-4.4.0-93-generic: ASCII cpio archive (SVR4 with no CRC)

# 将文件从cpio档案中copy出来

# cpio-idmv < initrd.img-4.4.0-93-generic

.

lib64

lib64/ld-linux-x86-64.so.2…

lib/systemd

lib/systemd/systemd-udevd115997blocks

# 最终可以看到如下文件和目录结构,就是initramrd的结构

#lsbin conf etc init initrd.img-4.4.0-93-generic lib lib64 run sbin scripts

可以看到initramfs和跟分区文件系统的雏形很像,只是它的大小不大,少了很多工具和库。有些内核模块就在其中,比如:/lib/modules/4.4.0-93-generic/kernel/。

qemu中启动”Hello World” initramfs

在前文“在QEMU环境中使用GDB调试Linux内核”中,已经准备了一个Linux启动环境,但是缺少initramfs。我们可以做一个最简单的Hello World initramfs,来直观地理解initramfs。

Hello World的C程序如下,与普通的Hello World相比,加了一行while(1)。

#include

voidmain()

{

printf(“Hello World\n”);

fflush(stdout);/*让程序打印完后继续维持在用户态 */

while(1);

}

编译helloworld.c程序

# gcc -static -o helloworld -m32 helloworld.c

-static: On systems that support dynamic linking, this prevents linking with the shared libraries. //不让gcc动态链接shared libraries

-m32: Generate code for a 32-bit or 64-bit environment //在前文“在QEMU环境中使用GDB调试Linux内核”中Linux内核被编译成了32位架构,所以这里在gcc的选项中也编译成32位可执行程序

在64位机器上编译成32位程序,可能会报错如下:

In file included from /usr/include/stdio.h:27:0,

from helloworld.c:2:

/usr/include/features.h:374:25: fatal error: sys/cdefs.h: No such file or directory

# include

^

compilation terminated.

解决方案是安装libc6-dev-i386包。

# apt-get install libc6-dev-i386

打包initramfs文件

# echo helloworld | cpio -o –format=newc > hwinitramfs

在qemu中启动编译好的内核,把hwinitramfs指定为initrd,在-append参数中将init指定为helloworld。

# qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd hwinitramfs -append “console=ttyS0 rdinit=helloworld” -nographic

系统能成功启动到输出”Hello World”,并且在用户态停住。结合前文“在QEMU环境中使用GDB调试Linux内核”,可以看到qemu虚机中运行的Linux系统已经成功挂载了initramfs, 在console日志中也能看到“Unpacking initramfs…”。

f192d09497e8e67184b783c8ff56faab.png

参考

0b1331709591d260c1c78e86d0c51c18.png

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/169674.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ubuntu与centos的对比和选择「建议收藏」

    ubuntu与centos的对比和选择「建议收藏」一、分别介绍CentOS(CommunityENTerpriseOperatingSystem)是Linux发行版之一,它是来自于RedHatEnterpriseLinux依照开放源代码规定释出的源代码所编译而成。RedHatEnterpriseLinux(RHEL)是企业发行版。它每五年左右更新一次,在系统的稳定性,前瞻性和安全性上有着极大的优势。由于CentOS…

    2022年9月4日
    3
  • sqlite开发图形界面_linux下sqlite3头文件

    sqlite开发图形界面_linux下sqlite3头文件哈哈,朋友编写了一款服务器web界面管理工具,使用到了SQLite数据库。SQLite介绍SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如Tcl…

    2022年9月8日
    0
  • Flink 入门教程

    实时流处理的应用场景现在的社会已然进入了大数据AI时代,各行各业都有大量的数据需要处理,并希望从数据中挖掘价值。下面简单举几个例子:物联网中各种行为结果数据的实时收集分析金融行业中各种交易行为数据结果的实时收集分析电商行业中用户的浏览点击等行为数据结果的实时收集分析…实时流处理的目标低延迟高吞吐正确性可容错(即可以中断,并可以恢复且保证exactlyonce)顺序性(…

    2022年4月4日
    48
  • 最小二乘法推导以及理解[通俗易懂]

    最小二乘法推导以及理解[通俗易懂]我在网上发现了两种推导方式,于是自己跟着推导了一遍。。。。。(一)(高数式推导): [参考博客](https://blog.csdn.net/MarsJohn/article/details/54911788) 这里先引入两个提前推得出的结论: ![两个结论](https://img-blog.csdnimg.cn/20190907195440348.jpg?x-oss-proce…

    2022年5月17日
    34
  • 详细完整MySQL8.0.23安装教程

    文章目录目录前言一、官网下载MySQL地址:https://dev.mysql.com/downloads/mysql/二、配置解压文件1.解压2.配置my.ini文件三、初始化四、安装启动mysql服务后续前言最近在做一个人脸识别的项目,需要用数据库保存学生信息与前段交互。MySQL的优点1、mysql性能卓越,服务稳定,很少出现异常宕机。2、mysql开放源代码且无版权制约,自主性及使用成本低。3、mysql历史悠久,社区及用户非.

    2022年4月11日
    205
  • 用python画圣诞树、樱花树、卡通图案及打包成exe文件[通俗易懂]

    用python画圣诞树、樱花树、卡通图案及打包成exe文件[通俗易懂]用python画圣诞树、樱花树、卡通图案及打包成exe文件

    2022年8月30日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号