电脑技术学习

zfs文件系统架构解读(一)

dn001

  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 中的 nvlist
zpool_iter.c对系统中中一些或全部存储池进行循环处理
zpool_util.c其他实用程序

  zfs(1M)

  此命令负责创建和管理 ZFS 文件系统。与 zpool(1M) 类似,其目的实际上只是分析命令行参数并将处理结果传递到 libzfs。此命令的源代码可在 usr/src/cmd/zfs 中找到。它包含以下文件:

zfs_main.c命令的主体,负责处理所有的参数和子命令
zfs_iter.c对系统中一些或全部数据集进行循环处理

标签: