第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

Initramfs 原理和實(shí)踐

標(biāo)簽:
Linux

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/total 67408-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:23 grub-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-udevd115997 blocks

# 最终可以看到如下文件和目录结构就是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 <stdio.h>void main()
{
    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 <sys/cdefs.h>
                        ^
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...”。

https://img1.sycdn.imooc.com//5b3f560300012c8514200744.jpg

 

参考

Custom Initramfs

GNU CPIO Manual

原文出处

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺(jué)得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫(xiě)下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開(kāi)微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消