首页 > 编程知识 正文

制作根文件系统,什么叫做根

时间:2023-05-05 15:34:56 阅读:120224 作者:4533

了解title:根文件系统

tags: linux

date :2018-09-1919336056336005

---

根文件系统了解文件系统的概念。 文件系统是一组软件,用于管理存储设备的扇区,并将对这些扇区的访问权限转化为对目录和文件名的访问权限。 在高层以特定目录和文件名访问文件时,文件系统会将该目录文件名转换为对扇区号的访问。

虚拟文件系统接口(VFS (是在linux上定义的文件系统的统一接口,各种类型的文件系统使用同一接口向用户提供http://www.Sina.com/) 支持不支持实际设备(ROM )的虚拟文件系统实际存储设备(ROM ),远程文件系统和本地文件系统http://www.Sina.com 根文件系统是.实际文件系统linux支持中包含的ext2、ext3、vfat、jffs、ramfs、nfs等文件系统jffs2:主要是nor型flass cramfs:只读压缩文件系统。 可以在两种flash中使用。 基于ramdisk:ram的文件系统。 将部分固定大小的内存用作块设备。 这是将实际的文件系统而不是实际的文件系统加载到内存中的机制。 可以通过ramdisk将经常访问且不需要修改的文件放在内存中,大大提高系统性能。 基于initramfs3360ram的文件系统。 initramfs出现在2.6内核中,类似于tmpfs。 基于内存的文件系统,不需要创建内存块设备。 将文件添加到ramfs时,会自动配置更多内存,并删除或阻止文件以释放内存。 (如果ramdisk未满,则使用的多余内存不可用于其他事情。 如果ramdisk已满但仍有内存未使用,则必须重新格式化后才能扩展使用。 ) nfs:是sun开发的在不同计算机之间通过网络共享文件的技术。 在嵌入式linux系统的开发调试阶段,利用该技术可以在主机上构建基于nfs的根文件系统,并将其挂载到嵌入式设备上,可以方便地修改根文件系统的内容。 启动进程内核并进行一系列初始化后,装载根文件系统并运行APP应用程序。 根文件系统必须预先按照一定的文件系统格式,包含对应的内容数据。 Kernel根据启动参数查找并装载根文件系统的位置

根文件系统ramdisk启动创建ramdisk文件系统压缩包,然后使用引导装载器将该文件压缩包下载到内存中。 系统启动时,在uboot的bootargs环境变量中传递启动参数,并更改为bootargs=initrd=0x31000000。0x 200000 root=/dev/ramrwinit=/linuxrc console=tty sac0mem=64,指定从ramdisk启动。 ramdisk压缩文件的第一个地址位于内存地址0x31000000,文件大小为0x200000。将内核配置Default kernel command string设置为:“initrd=0x 31000000,0x 200000

如果33558www.Sina.com/root文件系统本身尚不存在,内核如何根据/dev/xxx找到相应的设备呢?

根文件系统根文件系统与其他文件系统的挂载方式不同。 内核通过直接解析设备的名称,获取设备的主设备号、从设备号,可以访问对应的设备驱动程序。 因此,init/main.c有一个长列,如root_dev_names(hda、hdab、sda、sdb、nfs、ram、mtdblock……),基于该表中的设备名称请注意,为bootloader或内核设置的启动参数root=/dev/xxx只是一个代码名称,实际的根文件系统中不一定存在此设备文件。

对于ARM,在文件arch/arm/plat-s 3c 24 xx/common-smdk.c中有分区表。

staticstructmtd _ partitions mdk _ default _ NAND _ part [ ]={ [0]={.name=' boot ', size=0x00020000, off sssot [2]={.name='RootFileSystem ', size=0x02000000, offset=0x00000

leSystem",.size = 0x05d80000,.offset = 0x02280000, }}; initramfs

initramfs将根目录直接编译到linux内核镜像中 ,这种方法不同于前面两种方法需要在uboot启动参数中指定ramdisk加载到内存的地址或者文件系统在flash中的分区,由于已经将根目录编译到linux的.init.ramfs段中了,所以启动的时候直接将linux内核镜像的.init.ramfs段的内容解压到系统的rootfs中。

initrd

启动时用到initrd来mount根文件系统。注意理解ramdisk和initrd这两个概念,其实ramdisk只是在ram上实现的块设备,类似与硬盘操作,但有更快的读写速度,它可以在系统运行的任何时候使用,而不仅仅是用于启动;

initrd(boot loader initialized RAM disk)可以说是启动过程中用到的一种机制,具体的实现过程也使用ramdisk技术。就是在装载linux之前,bootloader可以把一个比较小的根文件系统的映象装载在内存的某个指定位置,姑且把这段内存称为initrd(这里是initrd所占的内存,不是ramdisk,注意区别),然后bootloader通过传递参数的方式告诉内核initrd的起始地址和大小(也可以把这些参数编译在内核中),在启动阶段就可以暂时的用initrd来mount根文件系统。initrd的最初的目的是为了把kernel的启动分成两个阶段:在kernel中保留最少最基本的启动代码,然后把对各种各样硬件设备的支持以模块的方式放在initrd中,这样就在启动过程中可以从initrd所mount的根文件系统中装载需要的模块。这样的一个好处就是在保持kernel不变的情况下,通过修改initrd中的内容就可以灵活的支持不同的硬件。在启动完成的最后阶段,根文件系统可以重新mount到其他设备上,但是也可以不再 重新mount(很多嵌入式系统就是这样)。 initrd的具体实现过程是这样的:bootloader把根文件系统映象装载到内存指定位置,把相关参数传递给内核,内核启动时把initrd中的内容复制到ramdisk中(ram0),把initrd占用的内存释放掉,在ram0上mount根文件系统。从这个过程可以看出,内核需要对同时对ramdisk和initrd的支持(这种需要都编入内核,不能作为模块)。

鸡生蛋蛋生鸡

内核刚启动时,磁盘设备、网络设备都还没有被驱动起来,所以无法访问磁盘,没法给磁盘启用对应的文件系统。那赶紧安装磁盘驱动程序,网络驱动程序呀,怎么不加载呢?因为磁盘种类太多了,没法把所有的驱动都编译到内核里头,那样内核得变得多大呀,所以就只能把这些驱动程序编译成模块的方式,在内核加载的时候现场判断当前用的是什么磁盘再加相应的磁盘驱动模块。那就加载磁盘驱动模块呀,等什么呢?原因是编译成驱动模块后,在这个阶段压根就没法加载!还没文件系统呢,怎么加载驱动模块?结果启用文件系统的前提是磁盘的驱动程序已经加载,而驱动程序的加载的前提是已经有文件系统存在,这就成了鸡生蛋,蛋生鸡的问题,怎么破?想到内核加载的时候,RAM其实已经可用了,那就基于RAM建立一个临时文件系统吧,这个临时的文件系统自己挂载到自己身上,然后我们指定这个文件系统为根文件系统,这样就有了起步的文件系统啦,借助这个临时的文件系统把磁盘驱动模块、网络驱动模块加载上,这样就可以挂载实际的文件系统啦,有了实际的文件系统之后再把这个实际的文件系统指定为根文件系统,这就好啦,然后其他的各式各样的文件系统就可以陆陆续续的挂载在这个根文件系统下了。
回到之前的一个问题,怎么建立一个基于RAM的虚拟文件系统?首先,在编译内核得时候就编译一个很精简的虚拟文件系统进去,然后内核在启动的时候先注册一个rootfs这个虚拟文件系统,然后挂载这个虚拟文件系统,那rootfs这个虚拟文件还是个空的,得给里头放点东西呀,放什么呢?就放编译进内核里头的那个很精简的虚拟文件系统里的内容。怎么内容放进rootfs里去?方法简单粗暴,直接把编译进内核里头的那个很精简的虚拟文件系统里的内容解压到rootfs里,这个过程叫填充rootfs。

参考链接

“文件系统”与“根文件系统”详解

linux启动根文件系统

知乎:何为文件系统,何为根文件系统?

cnblog 根文件系统原理

转载于:https://www.cnblogs.com/zongzi10010/p/10023700.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。