这篇文章主要介绍“linux rootfs指的是什么”,在日常操作中,相信很多人在linux rootfs指的是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux rootfs指的是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
linux rootfs是指linux中的根文件系统;根文件系统首先是内核启动时所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。
一、什么是文件系统
文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:文件系统的接口,对对象操作和管理的软件集合,对象及属性。从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。
尽管内核是linux的核心,但文件却是用户与操作系统交互所采用的主要工具。这对linux来说尤其如此,这是因为在UNIX传统中,它使用文件I/O机制管理硬件设备和数据文件。
二、什么是根文件系统
根文件系统首先是内核启动时所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。
三、根文件系统为什么这么重要
根文件系统之所以在前面加一个”根“,说明它是加载其它文件系统的”根“,那么如果没有这个根,其它的文件系统也就没有办法进行加载的。
根文件系统包含系统启动时所必须的目录和关键性的文件,以及使其他文件系统得以挂载(mount)所必要的文件。例如:
init进程的应用程序必须运行在根文件系统上;
根文件系统提供了根目录“/保?br/> linux挂载分区时所依赖的信息存放于根文件系统/etc/fstab这个文件中;
shell命令程序必须运行在根文件系统上,譬如ls、cd等命令;
总之:一套linux体系,只有内核本身是不能工作的,必须要rootfs(上的etc目录下的配置文件、/bin/sbin等目录下的shell命令,还有/lib目录下的库文件等···)相配合才能工作。
Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。成功之后可以自动或手动挂载其他的文件系统。因此,一个系统中可以同时存在不同的文件系统。在 Linux 中将一个文件系统与一个存储设备关联起来的过程称为挂载(mount)。使用 mount 命令将一个文件系统附着到当前文件系统层次结构中(根)。在执行挂装时,要提供文件系统类型、文件系统和一个挂装点。根文件系统被挂载到根目录下“/鄙虾螅诟柯枷戮陀懈募低车母鞲瞿柯迹募?bin/sbin/mnt等,再将其他分区挂接到/mnt目录上,/mnt目录下就有这个分区的各个目录和文件。
四、如何在内核中挂载根文件系统
init/main.c-> start_kernel ()→vfs_caches_init (totalram_pages)→ mnt_init ()→/*,sysfs用来记录和展示linux驱动模型,sysfs先于rootfs挂载是为全面展示linux驱动模型做好准备,//,mnt_init()调用sysfs_init()注册并挂载sysfs文件系统,然后调用kobject_create_and_add()创建fs目录,*/sysfs_init ();/*,init_rootfs()注册rootfs,然后调用init_mount_tree()挂载rootfs */init_rootfs (); init_mount_tree (); 1,sysfs文件系统目前还没有挂载到rootfs的某个挂载点上,后续init程序会把sysfs挂载到rootfs的系统挂载点上; 2,rootfs是基于内存的文件系统,所有操作都在内存中完成,也没有实际的存储设备,所以不需要设备驱动程序的参与。基于以上原因,linux在启动阶段使用rootfs文件系统,当磁盘驱动程序和磁盘文件系统成功加载后,linux系统会将系统根目录从rootfs切换到磁盘文件系统。 start_kernel vfs_caches_init mnt_init init_rootfs注册rootfs文件系统 init_mount_tree 挂载rootfs文件系统 vfs_kern_mount mount_fs 类型:山,其实是rootfs_mount mount_nodev fill_super 其实是ramfs_fill_super 时间=inode ramfs_get_inode(某人,NULL,, S_IFDIR |, fsi→mount_opts.mode,, 0); 某人→s_root =, d_make_root (inode); static const  struct qstr name =, QSTR_INIT (“/?, 1); (1 *) __d_alloc (root_inode→i_sb,,,名字); … 时间=mnt→mnt.mnt_root 根源;(2 *) mnt→mnt.mnt_sb =,根→d_sb; (3 *) mnt→mnt_mountpoint =, mnt→mnt.mnt_root; (4 *) mnt→mnt_parent =, mnt; (5 *) 时间=root.mnt mnt; 时间=root.dentry mnt→mnt_root; mnt→mnt_flags |=, MNT_LOCKED; set_fs_pwd(当前→fs,,,根); set_fs_root(当前→fs,,,根); … rest_init kernel_thread来(kernel_init, NULL,, CLONE_FS);linux rootfs指的是什么