【linux】文件系统与操作

文件系统

文件系统是用来管理硬件存储设备存储文件的方式,数据在外部存储设备上都是以二进制形式存储,那么何为文件、何为目录、何为可执行程序,怎么读写,怎么规划存储空间都是由文件系统决定,不同的文件系统管理方式不同。

文件系统的功能就是对存储设备的扇区进行管理,将这些扇区的访问变成了对目录和文件名的访问。我们在上层按照特定的目录和文件名去访问一个文件时,文件系统会将这个目录+文件名转换成对扇区号的访问。

根文件系统

内核刚启动时,磁盘设备、网络设备都还没有被驱动起来,所以无法访问磁盘,没法给磁盘启用对应的文件系统。那赶紧安装磁盘驱动程序,网络驱动程序呀,怎么不加载呢?因为磁盘种类太多了,没法把所有的驱动都编译到内核里头,那样内核得变得多大呀,所以就只能把这些驱动程序编译成模块的方式,在内核加载的时候现场判断当前用的是什么磁盘再加相应的磁盘驱动模块。但是还没文件系统,没有办法加载驱动模块。

结果启用文件系统的前提是磁盘的驱动程序已经加载,而驱动程序的加载的前提是已经有文件系统存在,所以此时的方法就是在内存建立一个临时文件系统(/boot/initrd文件),然后指定这个文件系统为根文件系统,借助这个临时的文件系统把磁盘驱动模块、网络驱动模块加载上,这样就可以访问磁盘、网络设备等外设了,可以挂载切换到实际的文件系统了,有了实际的文件系统之后再把这个实际的文件系统指定为根文件系统,然后其他的各式各样的文件系统就可以陆陆续续的挂载在这个根文件系统下了。

怎么在内存建立虚拟文件系统?

首先,在编译内核得时候就编译一个很精简的虚拟文件系统进去,然后内核在启动的时候先注册一个rootfs这个虚拟文件系统,然后挂载这个虚拟文件系统,那rootfs这个虚拟文件还是个空的,得给里头放点东西呀,放什么呢?就放编译进内核里头的那个很精简的虚拟文件系统里的内容。怎么内容放进rootfs里去?方法简单粗暴,直接把编译进内核里头的那个很精简的虚拟文件系统里的内容解压到rootfs里,这个过程叫填充rootfs。

根文件系统是内核启动时所mount的第一个文件系统,内核代码映像文件保存在根文件系统中(/boot),在启动过程中在根文件系统挂载完成后把一些基本的初始化脚本和服务加载到内存中运行。

我们平常所理解的文件系统一般是指磁盘文件系统,在linux中磁盘文件一般需要挂载到根文件系统的/dev下。而根文件系统是内核启动后加载到内存当中的?

根文件系统通常有这几种方式挂载:

  1. 文件系统已经存在于硬盘(或者类似的设备)的某个分区上了,kernel根据启动的命令行参数(root=/dev/xxx),直接进行mount。这里有一个问题,在root文件系统本身还不存在的情况下,kernel如何根据/dev/xxx来找到对应的设备呢?原来kernel通过直接解析设备的名称来获得设备的主、从设备号,然后就可以访问对应的设备驱动了。所以在init/main.c中有很长一串的root_dev_names,通过这个表就可以根据设备名称得到设备号。
  2. 启动时用到initrd来mount根文件系统。在将内核加载到内存中前,将一个比较小的根文件系统镜像加载到内存当中(/boot/initrd),姑且将这段内存称为initrd然后通过传递参数的方式告诉内核initrd的起始地址和大小(也可以把这些参数编译在内核中),在启动阶段就可以暂时的用initrd来mount根文件系统,initrd的最初的目的是为了把kernel的启动分成两个阶段:在kernel中保留最少最基本的启动代码,然后把对各种各样硬件设备的支持以模块的方式放在initrd中,这样就在启动过程中可以从initrd所mount的根文件系统中装载需要的模块。这样的一个好处就是在保持kernel不变的情况下,通过修改initrd中的内容就可以灵活的支持不同的硬件。在启动完成的最后阶段,根文件系统可以重新mount到其他设备上,但是也可以不再重新mount(很多嵌入式系统就是这样)。

linux操作系统的磁盘分区与目录结构

文件系统以磁盘为基础存储文件,文件系统是一个逻辑概念,磁盘是一个物理概念。

磁盘分区

硬盘分区包括主分区扩展分区逻辑分区。linux规定每个硬盘设备最多能有4个主分区(其中包含扩展分区),每个扩展分区需要占用一个主分区号,即主分区和扩展分区总共不超过4个,逻辑分区的数量不限。

linux中每个设备都能映射到一个系统的文件,对于硬盘,驱动标识符为sdx*sd表明设备类型,x为盘好(a是基本盘,b是基本从属盘,c是辅助主盘,d是辅助从属盘);*代表分区,前4个分区用数字1~4表示,表示主分区或扩展分区。例如sda2表示第1个硬盘上的第2个主分区或扩展分区。

每一个分区都是一个文件系统,都有自己的目录层次结构。

linux常见的文件系统

  • ext2文件系统
  • ext3文件系统
  • Swap文件系统
  • VFAT
  • NFS
  • XFS
  • IOS 9660
  • proc
  • 虚拟文件系统

linux目录结构

常用的磁盘操作命令

linux文件系统的挂载操作

常用的文件操作

https://www.cnblogs.com/zongzi10010/p/10023700.html