Chinaunix首页 | 论坛 | 博客
  • 博客访问: 102974
  • 博文数量: 25
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 31
  • 用 户 组: 普通用户
  • 注册时间: 2016-08-31 16:47
文章分类
文章存档

2018年(2)

2017年(13)

2016年(10)

我的朋友

分类: LINUX

2016-12-17 01:19:16

下面来介绍一下initramfs
initramfs是编到内核中的一种根文件系统,使用的是cpio格式,处理流程和我们之前介绍的initrd机制的cpio格式的流程几乎一样,
只不过这个是编译到内核里的,需要用到时内核会自行解压使用。我们在编内核的时候,可以通过
Initramfs source file(s) 来设置需要编入内核的文件系统的路径。


General setup --->  (就是CONFIG_BLK_DEV_INITRD)
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support  
()  Initramfs source file(s)


如果编内核的时候选上了 Initial RAM filesystem and RAM disk (initramfs/initrd) support 这一项,而没有指定
initramfs的路径,内核在编译的时候会自动生成一个最小的cpio包附在内核中,这个自带的cpio包的内容与default_rootfs生成的一样。
如果不支持,会按照默认的过程来挂载,也会执行default_rootfs。

注:default_rootfs函数会创建/dev/console,我们自己制作的最基本的文件系统里也必须有/dev/console,
因为执行时期需要 tty (terminal)


下面还是先来澄清一下initrd和initramfs的关系(个人理解):
1. initrd是启动时加载的,initramfs是编译到内核中的
2. initramfs只支持cpio格式,initrd支持cpio格式和传统的image-initrd格式
3. initramfs被解析处理后原始的cpio包(压缩或非压缩)所占的空间 (&__initramfs_start - &__initramfs_end)
是作为系统的一部分直接保留在系统中,不会被释放掉, 而对于initrd镜像文件,如果没有在命令行中设置"keepinitd"
命令,那么initrd镜像文件被处理后其原始文件所占的空间 (initrd_end - initrd_start)将被释放掉。
4. cpio-initrd的处理和initramfs极其相似,cpio-initrd就是相当于把initramfs处理机制用initrd机制加载
5. 现在普遍用initramfs(嵌入式linux内核)或cpio-initrd(发行版linux的grub),具体有点参见工作流程


下面我们解包一个发行版linux的initrd加载的文件系统来了解一下(CentOS 6.4)
[root@192 boot]# cp initramfs-2.6.32-358.el6.i686.img /home/llz/initramfs/initramfs-2.6.32-358.el6.i686.img.gz
[root@192 initramfs]# gunzip initramfs-2.6.32-358.el6.i686.img.gz 
[root@192 initramfs]# cpio -i --make-directories < initramfs-2.6.32-358.el6.i686.img
[root@192 initramfs]# ls
bin                 emergency  initqueue-finished                 lib          pre-udev  sysroot
cmdline             etc        initqueue-settled                  mount        proc      tmp
dev                 init       initqueue-timeout                  pre-pivot    sbin      usr
dracut-004-303.el6  initqueue  initramfs-2.6.32-358.el6.i686.img  pre-trigger  sys       var


是不是很像我们的文件系统,在挂载我们实际的文件系统之前,它就相当于文件系统


注:对于通用或复杂的内核你会看到CONFIG_BLK_DEV_INITRD被配置上了(如发行版linux,CentOS 6.4,你会在/boot/config-2.6.32-358.el6.i686
里看到 CONFIG_BLK_DEV_INITRD = y),因为发行版linux是比较通用的,要通过制作的initramfs镜像执行一些操作。
但对于嵌入式的linux内核,硬件比较固定,可以把需要的模块编译进内核(比如开发板常用的nand Flash),这时不需要一个
单独的initramfs镜像来干什么,这时只需要按照默认的来就行了,CONFIG_BLK_DEV_INITRD = n,这时会使用默认的initramfs

阅读(2238) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~