对话 UNIX: 新型文件系统简介

在 UNIX® 中,所有东西都是文件,但是并非以相同的方式存储每个文件。文件系统决定在介质上如何分解并组织文件。在过去,介质 意味着磁带或磁盘。但是,文件系统现在可以把任何源 — 远程服务器、存档文件甚至其他文件系统 — “翻译” 为虚拟介质。本文介绍几种新式的文件系统。

Martin Streicher, 软件开发人员, Pixel, Byte, and Comma

作者照片 - martin streicherMartin Streicher 是一位 Ruby on Rails 的自由开发人员和 Linux Magazine 的前任主编。Martin 毕业于 Purdue University 并获得计算机科学学位,从 1986 年起他一直从事 UNIX 类系统的编程工作。他喜欢收集艺术品和玩具。


developerWorks 投稿作者

2011 年 5 月 05 日

简介

有句老话说:“在 UNIX® 中,所有东西都是文件”,这种说法很准确。从概念上说,每个 UNIX 资源都是一个简单的文件,可以打开、读和/或写它。您的实验数据、shell 启动脚本、UNIX 内核、主目录、每个网络套接字和 /bin/ls 可执行程序等等都是文件。

常用缩略词

  • SFTP: 安全传输协议
  • SSH: 安全 Shell

但是,每个文件并不相同。实验数据可能是高度定制的数据库。shell 脚本是文本文件,但是有一个重要的特征:以 !#(常常称为 shebang)开头的行指出由哪个应用程序解释此文件。内核和所有可执行程序都是二进制文件,它们都采用可预知的系统工具可操纵的特定格式。目录是用于内容编目的特殊索引。

另外,每个文件并非以相同的方式存储。文件的结构和大小取决于底层文件系统 — 即把文件数据存储到物理设备上的子系统。相同的数据 — 比如同一文件的两个拷贝 — 在不同的文件系统上以不同的方式组织。每个文件系统规定自己的存储战略,可能是为满足特定的条件而设计的。例如,一种文件系统可能是以提高速度为目的而优化的,另一种文件系统偏重高效地使用空间,还有一种文件系统偏重于防止数据丢失或损坏。通常,对于部署哪种文件系统,并没有简单的答案:必须分析自己的存储需求,选择能够满足目标的文件系统或文件系统组合。UNIX(和许多软件商)提供很多种文件系统,所以一定能找到适合自己需要的文件系统。

表 1 列出适用于 UNIX(在许多情况下也适用于 Linux®)的几种文件系统。

表 1. UNIX 文件系统
文件系统优点
Zettabyte 文件系统 (ZFS)实质上规模无限的文件系统(1 zettabyte 等于 270 字节),可以使用常见的现成的存储介质构造它。ZFS 还可以在写数据时压缩数据,从而进一步扩大介质容量。
网络文件系统 (NFS)这是 UNIX 的出色特性之一,NFS 让远程文件系统看起来像是本地的。NFS 非常适合共享数据。
日志文件系统 (JFS)JFS 和许多替代品保留对每个文件所做的更改的日志。当系统崩溃或损坏时,“重播” 日志以恢复文件。
B 树文件系统 (Btrfs)Btrfs 是最新的文件系统之一,是未来的 Linux 版本的默认文件系统,它通过维护数据和元数据校验和来保证持久性。Btrfs 还提供快照并可以混合使用几乎任何大小的设备。

您自己的文件系统

通常,文件系统要求相应地调整介质,所以把一种文件系统改为另一种通常要使用格式化的物理备份驱动器,还需要很长的恢复和检验过程。显然,这样的更改很复杂,只能由系统管理员执行。

但是,许多 UNIX 和 Linux 内核最近的一项扩展让任何用户都可以创建和使用多种文件系统,不需要特殊的特权。这个扩展称为 FUSE,即 Filesystem in User Space。可以使用这种软件非常轻松地创建新的文件系统。从 FUSE 派生的文件系统可以通过 SFTP 挂装文件;自动地扫描文件中的病毒;像本地驻留的数据文件一样操作只读的 CD-ROM 光盘。

让我们在一个常见的操作系统平台上安装 FUSE,研究任何用户现在都可以使用的一些新型文件系统。现代的 UNIX 和 Linux 内核通常都包含对 FUSE 的支持,所以构建此软件的过程与构建任何实用程序代码相似。必须下载软件包,解压它,运行配置脚本以探测系统的功能,构建并安装代码。 清单 1 给出用于安装 FUSE 的代码。

清单 1. 安装 FUSE
$ wget http://downloads.sourceforge.net/project/\
  fuse/fuse-2.X/2.8.4/fuse-2.8.4.tar.gz
$ tar xzf fuse-2.8.4.tar.gz
$ cd fuse-2.8.4

$ ./configure
$ make
$ sudo make install

到本文发表时,最新版本是 FUSE 2.8.4。一定要从 FUSE 项目主页下载最新代码(见 参考资料 中的链接)。编译之后,FUSE 包安装构建新的 FUSE 文件系统所需的很多库和名为 fusermount 的应用程序,这个应用程序用于挂装和卸载 FUSE 文件系统。除了通常提供给 mount 命令的选项之外,fusermount 还有几个特殊选项。


自制 NFS

安装基础代码之后,可以继续安装 FUSE 文件系统。我们要尝试的第一个 FUSE 文件系统是 SSHFS,它是一种基于 SFTP 的文件系统。只要服务器支持 SSH(大多数服务器都符合这个条件),就可以通过 SSHFS 把任何远程目录挂装为本地文件系统。在继续操作之前,要确认系统上有 Glib 2.0 和 Gthread 2.0。如果系统上有 GNOME,很可能有这些库;否则,从源代码或通过操作系统的本机包管理器安装它们。(Debian Linux 系统有 Aptitude。Red Hat Linux 系统提供 rpmyumYaST。)清单 2 给出安装 SSHFS 的代码。

清单 2. 安装 SSHFS
$ wget http://sourceforge.net/projects/\
  fuse/files/sshfs-fuse/2.2/sshfs-fuse-2.2.tar.gz/download
$ tar xzf sshfs-fuse-2.2.tar.gz
$ cd sshfs-fuse-2.2
$ ./configure
$ make
$ sudo make install

如果运行 Ubuntu 或者 UNIX 或 Linux 的其他变体,您的发行版可能提供所有软件包的预构建二进制代码。例如,在 Ubuntu 上,目前可以用以下命令安装列出的所有 FUSE 软件:

$ apt-get install libglib2.0-dev fuse-utils libfuse2 sshfs

如果您依赖的代码是最新的,还可能能够用 apt-get install sshfs 命令安装 SSHFS。

安装了 FUSE 库和 SSHFS,就可以把能够通过 SSH 访问的任何远程目录挂装为本地文件系统(见 清单 3)。通过组合 sshmount,提供远程系统的名称、登录凭证、希望挂装的远程目录和本地挂装点(可以是任何本地目录)。

清单 3. 把能够通过 SSH 访问的目录挂装为文件系统
$ ssh me@example.org ls
bin            Documents  lib      Media   Pictures  Sites   tmp
Desktop        Downloads  Library  Movies  projects  Source
Documentation  Dropbox    local    Music   Public    src

$ cd ~
$ mkdir -p mounts/example
$ sshfs me@example.org:/home/me mounts/example
$ cd mounts/example
$ ls
bin            Documents  lib      Media   Pictures  Sites   tmp
Desktop        Downloads  Library  Movies  projects  Source
Documentation  Dropbox    local    Music   Public    src

如您所见,现在可以像本地文件一样方便地使用远程目录的内容。如果您是使用多个系统的开发人员,SSHFS 让您能够用本地命令 — 比如 cpmake 等 — 操作远程文件。

可以输入 fusermount -u /some/mount/point 以卸载 FUSE 文件系统。因为 FUSE 文件系统的表现就像一般的文件系统一样,所以也可以输入 umount /some/mount/point

另一个远程文件系统变体称为 S3FS。S3FS 并不使用您自己的远程服务器和 SFTP,而是把 Amazon Simple Storage Service (Amazon S3) bucket 挂装为本地文件系统。S3FS “自然、透明地在 S3 中” 存储文件,还可以启用本地缓存以尽可能减少下载量。最大文件大小是 5GB。与 SSHFS 一样,可以下载并构建源代码,然后马上就能使用它。

注意:S3FS 包依赖于 cURL 库开发头文件和 LibXML2 库。

清单 4 给出安装 S3FS 实例的代码。

清单 4. 安装 S3FS
$ wget http://s3fs.googlecode.com/files/s3fs-r191-source.tar.gz
$ tar xzf s3fs-r191-source.tar.gz
$ cd s3fs
$ make
$ sudo make install

假设您已经有一个 Amazon S3 账号,账号提供访问密钥和秘密访问密钥,就可以用以下命令挂装自己的任何 bucket:

$ s3fs bucket_name -ouse_cache=/tmp -o accessKeyId=your_access_key \
  -o secretAccessKey=your_secret_access_key /mnt

有了 S3FS,就可以把整个 Git 存储库放在 Amazon S3 上,或者使用 rsync 在 Amazon 的存储系统上存储备份。


访问任何存档

FUSE 的另一个重要工具是 archivemount,这个实用程序可以把很多形式的存档挂载为本地文件系统,包括 tarball(即用 gzip 压缩的 tar 存档)。假设系统上有 libarchive,就可以快速地构建 archivemount,见 清单 5

清单 5. 安装 archivemount
$ wget http://www.cybernoia.de/software/archivemount/archivemount-0.6.1.tar.gz
$ tar xzf archivemount-0.6.1.tar.gz
$ cd archivemount-0.6.1
$ ./configure
$ make
$ sudo make install

例如,可以使用 archivemount 把它自己的 tarball 挂装为文件系统。清单 6 给出代码。

清单 6. 把 tarball 挂装为文件系统
$ tar tfz archivemount-0.6.1.tar.gz
archivemount-0.6.1/
archivemount-0.6.1/README
...
archivemount-0.6.1/archivemount.c
archivemount-0.6.1/CHANGELOG

$ mkdir -p ~/mnt/tgz
$ archivemount archivemount-0.6.1.tar.gz ~/mnt/tgz
$ cd ~/mnt/tgz/archivemount-0.6.1
$ ls
aclocal.m4         archivemount.c  configure     depcomp      Makefile.in
archivemount.1     CHANGELOG       configure.ac  install-sh   missing
archivemount.1.in  config.h.in     COPYING       Makefile.am  README

与 SSHFS 相似,archivemount 为 tarball 提供与本地文件系统相似的无缝的访问。顺便说一句,如果在 tarball 的 “文件系统” 中修改、删除或添加任何文件,那么当卸载 FUSE 文件系统时所有修改会保存到原来的 tarball 中。fusermount -u ~/mnt/tgz 命令从指定的挂装点卸载 FUSE 文件系统。清单 7 列出一个 tarball “文件系统” 的内容。

清单 7. 通过 archivemount 写文件
$ cd ~/mnt/tgz/archivemount-0.6.1
$ echo 'Remember this for later.' > NOTES
$ ls
aclocal.m4         CHANGELOG     COPYING      Makefile.in
archivemount.1     config.h.in   depcomp      missing
archivemount.1.in  configure     install-sh   NOTES
archivemount.c     configure.ac  Makefile.am  README
$ fusermount -u ~/mnt/tgz

$ tar tfz archivemount-0.6.1.tar.gz
archivemount-0.6.1/
archivemount-0.6.1/README
...
archivemount-0.6.1/CHANGELOG
archivemount-0.6.1/NOTES

清单 7 中最后的 tar 命令确认 NOTES 确实已经添加到 tarball 中了。对于用 archivemount 扩展存档,有一个警告:软件的作者指出,在存档中写文件应该谨慎,因为如果写操作失败,所有修改都会丢失。但是,一般来说,少量写操作不会出问题。尽管如此,archivemount 的只读特性是非常出色的。

如果希望检查通过 FUSE 挂装的文件系统,只需运行典型的 mount 命令并寻找标有 fuse 的系统,见 清单 8

清单 8. 通过 FUSE 挂装的文件系统
$ mount
/dev/sda1 on / type ext3 (rw,relatime,errors=remount-ro)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
...
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
fusectl on /sys/fs/fuse/connections type fusectl (rw)
archivemount on /home/strike/mnt/tgz type fuse.archivemount (rw,nosuid,nodev,user=strike)

本文所用的测试环境是在 Dell® 桌面 PC 上运行的 Ubuntu 10。在 清单 8 所示的 mount 脚本中,可以在底部看到 archivemount 文件系统,在顶部看到 Linux 挂装的典型物理设备。


适合保存机密数据的文件系统

根据前两个示例,您可以想到 FUSE 能够包装许多连网的服务和文件格式,从而对远程或打包的文件提供无缝的访问。确实有很多有效的实现。WikipediaFS 把 Wikipedia 挂装为本地文件系统,可以在其中本地地编辑文章。其他软件包为博客、Flickr 和 Google Mail 服务提供相似的功能。

FUSE 的另一个特性是镜像,即并行地维护文件的拷贝。典型的示例是 FUSE-centric Encrypted File System (EncFS)。指定一个源目录和一个目标目录,写到源目录中的所有文件就会自动地加密并保存到目标目录中。EncFS 需要 librlog,这是一个灵活的消息日志记录库。从源代码或发行版的存储库安装它,然后继续构建 EncFS,见 清单 9

清单 9. 安装 EncFS
$ wget http://encfs.googlecode.com/files/encfs-1.6-1.tgz
$ tar xzf encfs-1.6-1.tgz
$ cd encfs-1.6-1
$ ./configure
$ make
$ sudo make install

安装软件包之后,就可以使用它了。必须创建两个新目录 — 一个用于保存原来的文件,一个用于保存加密的文件。encfs 实用程序映射这两个目录,见 清单 10

清单 10. 创建用于加密的目录对
$ mkdir ~/data
$ mkdir ~/encrypted_data
$ encfs ~/encrypted_data ~/data
Creating new encrypted volume.
Please choose from one of the following options:
 enter "x" for expert configuration mode,
 enter "p" for preconfigured paranoia mode,
 anything else, or an empty line will select standard mode.
?> p

Paranoia configuration selected.

Configuration finished.  The file system to be created has
the following properties:
Filesystem cipher: "ssl/aes", version 2:2:1
Filename encoding: "nameio/block", version 3:0:1
Key Size: 256 bits
Block Size: 1024 bytes, including 8 byte MAC header
Each file contains 8 byte header with unique IV data.
Filenames encoded using IV chaining mode.
File data IV is chained to filename IV.
File holes passed through to ciphertext.

-------------------------- WARNING --------------------------
The external initialization-vector chaining option has been
enabled.  This option disables the use of hard links on the
file system. Without hard links, some programs may not work.
The programs 'mutt' and 'procmail' are known to fail.  For
more information, please see the encfs mailing list.
If you would like to choose another configuration setting,
please press CTRL-C now to abort and start over.

Now you will need to enter a password for your file system.
You will need to remember this password, as there is absolutely
no recovery mechanism.  However, the password can be changed
later using encfsctl.

New Encfs Password:
Verify Encfs Password:

一般情况下,可以选择 "paranoia" 模式。接下来,输入用于保护文件的密码并再次输入以确认密码。清单 11 给出代码。

清单 11. EncFS 自动地加密新文件
$ cd ~/data
$ vi secrets.txt
[Create file with your secrets.]
$ ls
secrets.txt
$ ls ~/encrypted_data
LKs2bi5sfttNlyExybM6eNck

创建的每个文件都会出现在加密的目录中,甚至文件名也加密了。操作完之后,只需卸载未加密的目录,见 清单 12。此目录的内容被删除,只留下加密的文件。

清单 12. 卸载未加密的目录
$ fusermount -u ~/data
$ ls ~/data
No such file or directory
$ ls ~/encrypted_data
LKs2bi5sfttNlyExybM6eNck

要想查看未加密的文件,应该把一个挂装点连接到前面加密的文件集。当出现提示时,输入密码以验证自己的身份:

$ encfs ~/encrypted_data ~/data
EncFS Password:

$ ls ~/data
secrets.txt

重新挂装之后,可以以明文看到原来的文件。对文件的任何修改会被重新编码。


FUSE:并不是玩具!

尽管前面的示例相当简单,但是不要低估 FUSE 的能力。一些强大的文件存储解决方案也在用户空间中运行。例如,ZFS-Fuse 是一种用户空间中的 ZFS 实现。MooseFS 是一种容错的网络分布式文件系统。它把数据分散在几个物理服务器上,但是用户作为一个与 UNIX 相似的文件系统资源操作它。GlusterFS 是一个基于 FUSE 的高性能分布式文件系统。

解释 GlusterFS 部署超出了本文的范围,但是应该简要描述可以用 FUSE 构建的功能,从而避免修改内核和应用补丁。具体地说,GlusterFS 可以:

  • 跨越任意数量的计算机。
  • 把不同类型的存储设备和物理文件系统 — GlusterFS 将它们称为 brick — 聚合为一个统一的池或名称空间。
  • 以特殊的风格组合文件系统特性 — GlusterFS 将它们称为 translator — 以构建定制的存储解决方案。例如,一个 translator 提供复制,而另一个通过 TCP/IP 实现连接。
  • 通过提前读、延迟写和许多其他技术大大提高性能。

GlusterFS 3 大大简化了软件的初始设置,只比跨系统子网建立 SSH 密钥复杂一点儿。但更棒的是,GlusterFS 不要求更新内核或执行特殊的定制。因为它是用 FUSE 编写的,它在内核的环境之外操作,任何开发人员都可以扩展它。


发挥 FUSE 的威力!

FUSE 是一种不可思议的技术。有了它,就可以用任何流行的编程语言开发新的文件系统,包括 Python、Ruby、Lua、C/C++、Java™ 语言等。另外,创建和部署新的文件系统并不需要修改所有正在运行的系统的内核。可以通过另一篇 developerWorks 文章 “使用 FUSE 开发自己的文件系统:无需进行内核编程” 进一步了解 FUSE 如何与内核协作。其他资料和这里提到的项目的链接见 参考资料

现在已经有很多 FUSE 文件系统,而且还在不断出现新的。ZFS-Fuse 和 GlusterFS 是非常尖端的解决方案,而 archivemount 和 SSHFS 的功能比较简单。所有 FUSE 文件系统都用以满足特定的需求。如果您有特殊的需求,可以考虑使用 FUSE 开发自己的文件系统,这只需编写很少的代码。

参考资料

学习

  • 对话 UNIX:阅读本系列中的其他部分。
  • Zettabyte 文件系统:进一步了解奇异的 ZFS,它最初是由 Sun 创建的,现在由 Oracle 维护。
  • 网络文件系统:进一步了解 NFS 及其漫长的历史。NFS 最早的版本出现在 1989 年。
  • 日志文件系统:许多文件系统都提供日志以防止数据丢失。最初的 JFS 是由 IBM 于 1990 年创建的。
  • B 树文件系统:Wikipedia 提供对 Btrfs 的精彩介绍以及其他代码和技术信息来源的链接。
  • 加密文件系统:可以通过 EncFS 项目页面了解它的所有选项。请特别注意维护 EncFS 备份的页面。
  • MooseFS:MooseFS 是一种容错的网络分布式文件系统。它适用于具有 FUSE 实现的任何系统,包括 Mac OS X。
  • AIX and UNIX 专区:developerWorks 的“AIX and UNIX 专区”提供了大量与 AIX 系统管理的所有方面相关的信息,您可以利用它们来扩展自己的 UNIX 技能。
  • AIX and UNIX 新手入门:访问“AIX and UNIX 新手入门”页面可了解更多关于 AIX 和 UNIX 的内容。
  • AIX and UNIX 专题汇总:AIX and UNIX 专区已经为您推出了很多的技术专题,为您总结了很多热门的知识点。我们在后面还会继续推出很多相关的热门专题给您,为了方便您的访问,我们在这里为您把本专区的所有专题进行汇总,让您更方便的找到您需要的内容。
  • AIX and UNIX 下载中心:在这里你可以下载到可以运行在 AIX 或者是 UNIX 系统上的 IBM 服务器软件以及工具,让您可以提前免费试用他们的强大功能。
  • IBM Systems Magazine for AIX 中文版:本杂志的内容更加关注于趋势和企业级架构应用方面的内容,同时对于新兴的技术、产品、应用方式等也有很深入的探讨。IBM Systems Magazine 的内容都是由十分资深的业内人士撰写的,包括 IBM 的合作伙伴、IBM 的主机工程师以及高级管理人员。所以,从这些内容中,您可以了解到更高层次的应用理念,让您在选择和应用 IBM 系统时有一个更好的认识。
  • 技术书店:在技术书店浏览关于这些和其他技术主题的图书。

获得产品和技术

  • libarchive:从 Google Code 上的存储库下载 libarchive 的源代码。构建并使用 archivemount 需要 libarchive
  • archivemount:从 archivemount 的项目页面下载它的源代码。这个软件把存档文件挂装为本地文件系统。

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=AIX and UNIX
ArticleID=656814
ArticleTitle=对话 UNIX: 新型文件系统简介
publish-date=05052011