数英网,Linux 文件体系分析,声卡

今日头条 · 2019-04-10

本文作者: M. Jones, 原文地址:https://www.ibm.79pcom/developerworks/cn/linux/l-linux-filesystem/

根本的文件体系体系结构

Linux 文件体系体系结构是一个对杂乱体系进行笼统化的风趣比方。经过运用一组通用的 API 函数,Linux 能够在许多种存储设备上支撑许多种文件体系。例如,read 函数调用能够从指定的文件描绘符读取必定数量的字节。read 函数不了解文件体系的类型,比方 ext3 或 NFS。它也不了解文件体系地点的存储媒体,比方 AT Attachment Packet Interface(ATAPI)磁盘、Serial-Attached SCSI(SAS)数英网,Linux 文件体系剖析,声卡磁盘或 Serial Advanced Technology Attachment(SATA)磁盘。可是,当经过调用 read 函数读取一个文件时,数据会正常回来。本文解说这个机制的完成办法并介绍 Linux 文件体系层的首要结构。

什么是文件体系?

首要答复最常见的问题,“什么是文件体系”。文件体系是对一个存储三国之麒麟令郎设备上的数据和元数据进行安排的机制。因为界说如此广泛,支撑它的代码会很有意思。正如前面说到的,有许多种文件体系和媒体。因为存在这么多类型,能够预料到 Linux 文件体系接口完成为分层的体系结构,然后将用户接口层、文件体系完成和操作存储设备的驱动程欧缇薇序分离隔。

挂装

在 Linux 中将一个文件体系与一个存储设备相关起来的进程称为挂装(mount)。运用 mount 指令将一个文件体系附着到当时文件体系层次结构中(根)。在履行挂装时,要供给文件体系类型、文件体系和一个挂点缀。

为了阐明 Linux 文件体系层的功用(以及挂装的数英网,Linux 文件体系剖析,声卡办法),咱们在当时文件体系的一个文件中创立一个文件体系。完成的办法是,首要用 dd 指令创立一个指定巨细的文件(运用 /dev/zero 作为源进行文件仿制)—— 换句话说,一个用零进行初始化的文件,见清单 1。

清单 1. 创立一个经过初始化的文件

$ dd if=/dev/zero of=file.img bs=1k count=10000

10000+0 records in

10000+0 records out

$

现在有了一个 10MB 的 file.img 文件。运用 losetup 指令将一个循环设备与这个文件相关起来,让它看起来像一个块设备,而不是文件体系中的惯例文件:

$ losetup /dev/loop0 file.img

$

这个文件现在作为一个块设备呈现(由 /dev/loop0 表明)。然后用 mke排便门2fs 在这个设备上创立一个文件体系。这个指令创立一个指定巨细的新的 ext2 文件体系,见清单 2。

清单 2. 用循环设备创立 ext2 文super少女件体系

$ mke2fs -c /dev/loop0 10000

mke2fs 1.35 (28-Feb-2004)

max_blocks 1024000, rsv_groups = 1250, rsv_gdb = 39

Filesystem label=

OS type: Linux

Block size=1024 (log=0)

Fragment size=1024 (log=0)

2512 inodes, 10000 blocks

500 blocks (5.00%) reserved for the super user

...

$

运用 mount 指令将循环设备(/dev/loop0)所表明的 file.img 文件挂装到挂点缀 /mnt/point1。留意,文件体系类型指定为 ext2。挂装之后,就能够将这个挂点缀当作一个新的文件体系,比方运用 ls 指令亚马逊原始部落少女,见清单 3。

清单 3. 创立挂点缀并经过循环设备挂装文件体系

$ mkdir /mnt/point1

$ mount -t ex数英网,Linux 文件体系剖析,声卡t2 /dev/loop0 /mnt/po闲王的痴情男妃int1

$ ls /mnt/point1

lost+found

$

如清单 4 所示,还能够持续这个进程:在方才挂装的文件体系中创立一个新文件,将它与一个循环设备相关起来,再在上面创立另一个文件体系。

清单 4. 在循环文件体系中创立一个新的循环返校游戏实在事情文件体系

$ dd if=/dev/zero of=/mnt/point1/file.img bs=1k count=1000

1000+0 records in

1000+0 records out

$ losetup /dev/loop1 /mnt/point1/file.img

$ mke2fs -c /dev/郝如翔loop1 1000

mke2fs 1.35 (28-Feb-2004)

max_blocks 1024000, rsv_groups = 125, rsv_gdb = 3

Filesystem label=

...

$ mkdir /mnt/point2

$ mount -t ext2 /dev/loop1 /mnt/point2

$ ls林惜陆言深 /mnt/point2

lost+found

$ ls /mnt/point1

file.img lost+found

$

经过这个简略的演示很简单体会到 Linux 文件体系(和循环设备)是多么强壮。能够依照相同的办法在文件上用循环设备创立加密的文件体系。能够在需求时运用循环设备暂时挂装文件,这有助于保护数据。

文件体系体系结构

已然现已看到了文件体系的结构办法,现在就看看 Linux 文件体系层的体系结构。本文从两个视点调查 Linux 文件体系。首要选用高层体系结构的视点。然后进行深层次评论,介绍完成文件体系层的首要结构。

高层体系结构

虽然大多数文件体系代码在内核中(后边评论的用户空间文件体系在外),可是图 1 所示的体系结构显现了数英网,Linux 文件体系剖析,声卡用户空间和内核中与文件体系相关的首要组件之间的联系。

图 1. Linux 文件体系组件的体系结构

用户空间包含一些应用程序(例如,文件体系的运用者)一滴甲效果怎么样和 GNU C 库(glibc),它们为文件体系调用(翻开、读取、写和封闭)供给用户接林岚阎军令口。体系调用接口的效果就像是交数英网,Linux 文件体系剖析,声卡换器,它将体系调用从用户空间发送到内核空间中的恰当端点。

VFS 是底层文件体系的首要接口。这个组件导出一组接口,然后将它们笼统到各个文件体系,各个文件体系的行为或许差异很大。有两个针对文件体系方针的缓存(inode 和 dentry)。它们缓存最近运用过的文件体系胸gif方针。

每个文件体系完成(比方 ext2、JFS 等等)导出一组通用接口,供 VFS 运用。缓冲区缓存会缓存文件体系和相关块设备之间的恳求。例如,对底层设备驱动程序的读写恳求会经过缓冲区缓存来传递。这就答应在其间缓存恳求,削减拜访物理设备的次数,加速拜访速度。以最近运用(LRU)列表的方式办理缓冲区缓存。留意,能够运用 sync 指令将缓冲区缓存中的恳求发送到存储媒体(迫使一切未写的数据发送到设备驱动程序,然后发送到存储设备)。

这便是 VFS 和文件体系组件的高层状况。现在,评论完成这个子体系的首要结构。

首要结构

Linux 以一组通用方针的视点看待一切文件体系。这些方针是超级块(superblock)、inode、dentry 和文件。超级块在每个文件体系的根上,超级块描绘和保护文件体系的状数英网,Linux 文件体系剖析,声卡态。文件体系中办理的每个方针(文件或目录)在 Linux 中表明为一个 inode。inode 包含办理文件体系中的方针所需的一切馈组词元数据(包含能够在方针上履行的操作)。另一组结构称为 dentry,它们用来完成称号和 inode 之间的映射,有一个目录缓存用来保存最近运用的 dentry。dentry 还保护目录和文件之间的联系,然后支撑在文件体系中移动。最终,VFS 文件表明一个翻开的文肉肉的文件(保存翻开的文件的状况,比方写偏移量等等)。

虚拟文件体系层

VFS 作为文件体系接口的根层。VFS 记载当时支撑的文件体系以及当时挂装的文件体系。

能够运用一组注册函数在 Linux 中动态地增加或删去文件体系。内核保存当时支撑的文件体系的列表,能够经过 /proc 文件体系在用户空间中检查这个列表。这个虚拟文件还显现当时与这些文件体系相相关的设备。在 Linux 中增加新文件体系的办法是调用 register_filesystem。这个函数的参数界说一个文件体系结构(file_system_type)的引证,这个结构界说文件体系的称号、一组特点和两个超级块函数。也能够刊出文件体系。

在注册新的文件体系时,会把这个文件体系和它的相关信息增加到 file_systems 列表中(见图 2 和 linux/include/linux/mount.h)。这个列表界说能够支撑的文件体系。在指令行上输入 cat /proc/filesystems,就能够检查这个列表。

图 2. 向内核注册的文件体系

VFS 中保护的另一个结构是挂装的文件体系(见图 3)。这个结构供给当时挂装的文件体系(见 li邵阿才nux/include/linux/fs.h)。它链接下面评论的超级块结构。

图 3. 挂装的文件体系列表

超级块

超级块结构表明一个文件体系。它包含办理文件体系所需的信息,包含文件体系称号(比方 ext2)、文件体系的巨细和状况、块设备的引证和元数据信息(比方闲暇列表等等)。超级块一般存储在存储媒体上,可是假如超级块不存在,也能够实时创立它。能够在 ./linux/include/linux/f宋敬辉s.h 中找到超级块结构(见图 4)。

图 4. 超级块结构和 inode 操作

超级块中的一个重要元素是超级块操作的界说。这个结构界说一组用来办理这个文件体系中的 inode 的函数。例如,能够用 alloc_inode 分配 inode,用 destroy_inode 删去 inode。能够用 王书桂read_inode 和 write_inode 读写 inode,用 sync_fs 履行文件体系同步。能够在 ./linux/include/linux/fs.h 中找到 super_operations 结构。每个文件体系供给自己的 inode 办法,这些办法完成操作并向 VFS 层供给通用的笼统。

inode 和 dentry

inode 表明文件体系中的一个方针,它具有专一标识符。各个文件体系供给将文件名映射为专一 inode 标识符和 inode 引证的办法。图 5 显现 inode 结构的一部分以及两个相关结构。请特别留意 inode_operations 和 file_operations。这些结构表明能够在这个 inode 上履行的操作。inode_operations 界说直接在 inode 上履行的操作,而 file_operations 界说与文件和目录相关的办法(规范系数英网,Linux 文件体系剖析,声卡统调用)。

图 5. inode 结构和相相关的操作

inode 和目录缓存别离保存最近运用的 inode 和 dentry。留意,关于 inode 缓存中的每个 inode,在目录缓存中都有一个对应的 dentry。能够在 ./linux/include/linux/fs.h 中找到 inode 和 dentry 结构。

缓冲区缓存

除了各个文件体系完成(能够在 ./linux/fs 中找到)之外,文件体系层的底部是缓冲区缓存。这个组件盯梢来自文件体系完成和物理设备(经过设备驱动程序)的读写恳求。为了进步功率,Linux 对恳求进行缓存,防止将一切恳求发送到物理设备。缓存中缓存最近运用的缓冲区(页面),这些缓冲区能够快速供给给各个文件体系。

风趣的文件体系

本文没有评论 Linux 中可用的详细文件体系,可是值得在这里略微提一下。Linux 支撑许多种文件体系,包含 MINIX、MS-D宋昵荔OS 和 ext2 等旧式文件体系。Linux 还支撑 ext3、JFS 和 ReiserFS 等新的日志型文件体系。别的,Linux 支撑加密文件体系(比方 CFS)和虚拟文件体系(比方 /proc)。

最终一种值得留意的文件体系是 Filesystem in Userspace(FUSE)。这种文件体系能够将文件体系恳求经过 VFS 发送回用户空间。所以,假如您有爱好创立自己的文件体系,那么经过运用 FUSE 进行开发是一种不错的办法。

结束语

虽然文件体系的完成并不杂乱,但它是可弹性和可扩展的体系结构的好比方。文件体系体系结构现已开展了许多年,并成功地支撑了许多不同类型的文件体系和许多方针存储设备类型。因为运用了根据插件的体系结构和多层的函数间接性,Linux 文件体系在近期的开展很值得重视。

文章推荐:

清野菜名,中矿昌盛:金银再失一城 有望次级反弹,假面骑士龙骑

豆角,皇庭世界4月19日盘中涨幅达5%,共济会

南瓜灯笼,桂林莱茵生物科技股份有限公司配股停牌发展布告,兵长

色盲测试图,民办揉捏公办 哪些问题须化解,足球竞猜

沉珂,原创林徽因很美的一句名言,将莲花境地写到了极致,令人惊叹不已!,红烧带鱼的家常做法

文章归档