ramfs,rootfs,initramfs,initrd

Ramfs是linux中的一个内存文件系统,它的大小是根据当前系统的内存大小动态变化的。也就是说除非系统内存使用完了,不然我们都是可以往ramfs中写入数据的。

ramfs只是一个镜像文件,作为一个镜像文件,我们肯定没有办法直接读取其中的内容,那么怎么办呢?

在linux中有一种loop设备可以用来读取镜像文件,通过losetup来挂载ramfs当做一个loop设备,然后对其进行挂载,我们就可以进入这个ramfs文件系统中了,并往里面添加需要的文件。
losetup命令:

第一步:用dd命令创建一个文件:
dd if=/dev/zero of=floppy.img bs=512 count=2000
第二步:使用losetup命令创建一个loop device
losetup /dev/loop0 floppy.img 
第三步:创建一个文件系统
mkfs -t ext3 /dev/loop0
第四步:挂载
mount /dev/loop0 /tmp
第五步:卸载
umount /tmp
losetup -d /dev/loop0

除了这种方法,还可以使用mount命令:

mount /tmp/fdimage /mnt -t vfat -o loop=/dev/loop3

The command will set up the loop device /dev/loop3 to correspond to the file /tmp/fdimage, and then mount this device on /mnt.

Rootfs其实也是一种ramfs,它是一种特殊的ramfs。它是2.6内核加入的特性,并且不能被卸载。一般情况下,大部分系统会挂载另一个文件系统在它之上,并忽略此ramfs。

initramfs是一种压缩的cpio格式的归档文件,它会在kernel启动的时候解压成rootfs。当解压完成后,kernel会检查rootfs中是否存在init程序。如果存在,就会执行它作为PID1.这个init进程会负责剩余的系统启动任务,包括挂载一个真正的root设备。如果rootfs中不包含一个init程序,那么kernel将按照旧的处理方式去挂载一个root分区,然后去执行其中的/sbin/init来启动init进程。

initramfs有两种存在形式,一种是与kernel编译到一起的,也就是kernel自带的initramfs。另一种就是外部的initramfs,它是一个zip压缩的cpio的归档文件。加载方式和initrd方式一样。

initrd和initramfs是两种概念,initrd出现在initramfs之前,它也是一种ramfs镜像文件,但它不会被作为rootfs的,它是用来在启动过程中初始化系统的,它可以被卸载。

区别如下:

1.它必须是和kernel分离的一种形式存在。
2.它只是一个zip压缩的文件系统,而不是cpio文件。
3.initrd中的/initrd程序只是做一些setup操作并最后返回到内核中执行,而initramfs中的/init执行完了并不返回到内核。
4.initrd切换到root device时,会进行pivot_root并umount ramdisk;initramfs切换rootfs到root device时,使用switch_root。

其实两种最大的区别就是一个可以卸载,一个不可以卸载。那么作为外部文件传入的时候,kernel如何区分到底是initramfs还是initrd镜像呢?

其实就是通过它的格式,到底是zip的cpio呢?还是zip的文件系统呢?由此就决定是否要卸载它。并且当initramfs作为外部文件时,会覆盖掉kernel内部的initramfs的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值