文件系统基本概念
- 文件系统
- 2023-05-13
- 85热度
- 0评论
mount的机制是如何实现的?
inode是如何分配的。磁盘inode和内存inode有什么区别?
dentry缓存是怎么回事?如何管理?
free命令中Cache和buff有什么区别?Page cache了?如何管理文件数据缓存?
扇区与簇
物理块和扇区,逻辑块和簇是相同概念。扇区(物理块)是磁盘最小的存储单元,磁头从磁盘读取数据的最小单元,一般是512B,即磁头每次从磁盘读取数据,都是一个扇区一个扇区读写。但对于操作系统来说无法对数目众多的扇区进行寻址,所以操作系统对磁盘的操作是以多个扇区组成形成一个簇为单位。
物理块/扇区是对磁盘操作而言的;逻辑块/簇是对软件操作系统(或文件系统)而言的,在linux中称为块,在windows中称为簇,操作系统从磁盘中拿一块数据,即完成一次磁盘IO。
块的大小在磁盘格式化时被指定,一般有1K/2K/4K,如果块的大小设置为4K,那么磁盘要读取8个扇区之后才将数据给操作系统。如果一个文件的大小是1K,而块的大小是4K,那么文件也会占用一个块的大小,剩余3K将会被空闲处理。
什么是文件系统
文件系统是一个控制数据存取的软件系统,实现文件的增、删、查、改等操作。文件系统是可以构建在磁盘(flash、SD卡、SSD等),也可以构建在网络或内存上,甚至可以构建在一个文件上。文件系统更重要的功能是抽象了一个更加容易访问的存储空间接口,这些接口包括对于程序开发的API和用户的操作等。
底层是具体的硬件设备,硬件设备是具备存储功能的介质包括磁盘、内存、网络、甚至文件。中间层是操作系统将存储介质抽象为一个连续的线性空间,线性空间可分为大小相同的块(1KB、2KB、4KB等),抽象为连续的线性空间主要是便于顶层的文件系统管理。顶层就是文件系统,文件系统对线性空间进行管理和抽象,便于用户进行操作,文件系统一般呈现为目录树,这里的层级结构就是平常的目录、子目录和文件等元素的集合。
- 目录:是一种容器,可以容纳子目录和普通文件,通过目录来对文件进行分类,便于用户访问,在linux中目录也是文件。
- 文件:是文件系统中存储数据的实体,文件有文件名,用于标识一个文件,文件的种类很多如txt、mp3、doc等,不同的文件类型需要对应于的应用来打开。具体文件可以分为普通文件、字符设备文件、块设备文件、套接字文件。
- 链接:分为软链接和硬链接;软链接是文件的另一种形态,其内容指向另外一个文件的路径,软链接也称为符号链接。硬链接则不同,是一个已存在文件的附加名称,在目录中增加了一项,但是其内容与源文件内容完全相同。
在linux系统中一切都是文件,可以使用ls -l通过显示结果查看文件类型。
常见的文件系统
- 本地文件系统:实现对磁盘的管理,常用的用EXT4、FAT、XFS、ZFS等
- 伪文件系统:不是持久化的数据,对应内存的文件系统,便于用于以文件的形式与内核数据交互,如proc、sysfs、configfs、debugfs等。
- 网络文件系统:基于tcp/ip协议的文件系统,运行具有网络的计算机访问另外一具有网络的计算机像访问本地文件系统一样。
文件系统使用
文件内容的访问
对于普通用户来说,通过命令或鼠标就能对文件进行操作,对于程序员来说可以通过API接口来进行完成,下面是举例常用接口。
API | 描述 |
---|---|
open | 打开文件 |
read | 从文件读数据 |
write | 从文件写数据 |
close | 关闭文件 |
lseek | 移动文件指针位置 |
lseek | 删除文件 |
格式化文件系统与挂载
格式化文件系统是在一个存储设备上构建一个文件系统,而挂载则是将文件系统激活在文件系统的目录树中可以进行访问。
(1)文件系统的构建命令
mkfs.xxx /dev/xxx
如mkfs.ext4 /dev/sdb, 将块设备格式化为ext4文件系统
(2)文件系统挂载
文件系统只有挂载到系统中,才可以进行访问。
mount -t [fs type] -o [opt] device dir
如mount -t ext4 /dev/sdb /mnt/ext4
除了手动挂载文件系统,linux还支持自动挂载,通过配置fstab配置文件即可进行挂载对应的设备。
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
devtmpfs /dev devtmpfs defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
tmpfs /var tmpfs defaults 0 0
还可以基于文件来构建文件系统,下面是示例:
# 1生成一个全0的二进制文件
dd if=/dev/zero of=ext4.bin bs=1M count=100
#2 格式化为EXT4文件系统
mkfs.ext4 ext4.bin
#3 使用loop设备,访问块设备,需要在内核把CONFIG_BLK_DEV_LOOP打开。
losetup /dev/loop0 ./ext4.bin
#4 挂载文件系统
mkdir ext4
mount /dev/loop10 ext4
文件系统的目录下可以挂载其他文件系统。