一 zfs文件系统架构解读

05年时,第一次接触到ZFS,直觉感到这个文件系的架构新颖,有探究的愿望,可随着时间的流逝,回到Linux世界后,又把它抛在脑后了,再次看到ZFS,就无法释然了(据说Linus眼馋ZFS好久了,想把ZFS移植到Linux,取代EXT3,成为下一代Linux内核默认的文件系统) 。
ZFS中的这个Z就是“Zettabyte,也就是说存储量级是Zetta级,1Z=1024的3次方个T,而一个T又等于1024个G,我们可以看出zfs是一个海量级的文件系统 。为什么需要海量级?想想未来的网络存储,企业和科学研究的数据量,现在的32位文件系统远难以承载了 。ZFS这个128位的文件系统,估计存储整个地球的信息都没有问题了 。FreeBSD社区的牛人,已经着手对ZFS进行了移植 。
在ZFS的架构里,最底层的是存储池,所有的存储介质都放在这个存储介质里面,然后再在这个存储池上面部署ZFS的文件系统,下面这个图是zfs的整体架构,摘自http://www.openSolaris.org/os/community/zfs/source/ 的首页:该页对此图给予了解释:
三个主要组件:ZPL(ZFS POSIX Layer,ZFS POSIX 层)、DMU(Data Management Unit,数据管理单元)和 SPA( Storage Pool Allocator,存储池分配器) 。
三个基本层:Interface Layer(接口层,与ZPL对应),Transactional Object Layer(事物对象层,与DMU对应),Pooled Storage Layer(存储池层,与SPA组件对应) 。
从用户角度看:
文件系统使用者(Filesystem Consumers)
这些应用程序是基本的应用程序,可通过 POSIX 文件系统 API 单独与 ZFS 交互 。实际上,每个应用程序都可归为此类别 。系统调用是通过 OpenSolaris VFS 层传递到 ZPL的 。
设备使用者(Device Consumers)
ZFS 提供了一种创建“仿真卷的方式 。对这些卷的备份通过存储池中的存储进行的,但在 /dev下显示为一个普通设备 。这并不是典型的使用案例,不过有一些例子充分说明了这种功能的有用之处 。有少量应用程序直接与这些设备交互,但对设备使用最多的还是,位于设备层之上的内核文件系统或目标驱动程序 。
基于GUI的管理
Solaris 在内部版本 28 中提供了基于 Web 的 ZFS GUI 。虽然还不是 OpenSolaris 的组成部分,但它是位于 JNI 层之上基于 Java 的 GUI 的一个示例 。< /p>
管理程序
这些应用程序是管理 ZFS 文件系统或存储池的(包括检查属性和数据集分层结构) 。尽管还有一些分散的程序(如zoneadm、zoneadmd、fstyp),但两个主要的应用程序还是 zpool(1M) 和 zfs(1M) 。
zpool(1M)
此命令负责创建和管理 ZFS 存储池 。其主要目的是分析命令行输入,将其转换为 libzfs 调用,并顺带处理出现的任何错误 。此命令的源代码可在 usr/src/cmd/zpool 中找到 。它包含以下文件:
zpool_main.c命令的主体,负责处理所有的参数和子命令zpool_vdev.c负责将一系列 vdev 转换成 libzfs 中的 nvlistzpool_iter.c对系统中中一些或全部存储池进行循环处理zpool_util.c其他实用程序
zfs(1M)
此命令负责创建和管理 ZFS 文件系统 。与 zpool(1M) 类似,其目的实际上只是分析命令行参数并将处理结果传递到 libzfs 。此命令的源代码可在 usr/src/cmd/zfs 中找到 。它包含以下文件:
【一 zfs文件系统架构解读】zfs_main.c命令的主体,负责处理所有的参数和子命令zfs_iter.c对系统中一些或全部数据集进行循环处理

    推荐阅读