对话U N I新型文件系统简介Lele was written in 2021在 UNIX 中,所有东西都是文件,但是并非以相同的方式存储每个文件。
文件系统决定在介质上如何分解并组织文件。
在过去,介质意味着磁带或磁盘。
但是,文件系统现在可以把任何源—远程服务器、存档文件甚至其他文件系统—“翻译” 为虚拟介质。
本文介绍几种新式的文件系统。
简介有句老话说:“在 UNIX 中,所有东西都是文件”,这种说法很准确。
从概念上说,每个 UNIX 资源都是一个简单的文件,可以打开、读和/或写它。
您的实验数据、shell 启动脚本、UNIX 内核、主目录、每个网络套接字和 /bin/ls 可执行程序等等都是文件。
常用缩略词SFTP:安全传输协议SSH:安全 Shell但是,每个文件并不相同。
实验数据可能是高度定制的数据库。
shell 脚本是文本文件,但是有一个重要的特征:以?!#(常常称为?shebang)开头的行指出由哪个应用程序解释此文件。
内核和所有可执行程序都是二进制文件,它们都采用可预知的系统工具可操纵的特定格式。
目录是用于内容编目的特殊索引。
另外,每个文件并非以相同的方式存储。
文件的结构和大小取决于底层文件系统?—即把文件数据存储到物理设备上的子系统。
相同的数据—比如同一文件的两个拷贝—在不同的文件系统上以不同的方式组织。
每个文件系统规定自己的存储战略,可能是为满足特定的条件而设计的。
例如,一种文件系统可能是以提高速度为目的而优化的,另一种文件系统偏重高效地使用空间,还有一种文件系统偏重于防止数据丢失或损坏。
通常,对于部署哪种文件系统,并没有简单的答案:必须分析自己的存储需求,选择能够满足目标的文件系统或文件系统组合。
UNIX (和许多软件商)提供很多种文件系统,所以一定能找到适合自己需要的文件系统。
列出适用于 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 的支持,所以构建此软件的过程与构建任何实用程序代码相似。
必须下载软件包,解压它,运行配置脚本以探测系统的功能,构建并安装代码。
给出用于安装 FUSE 的代码。
清单 1. 安装 FUSE到本文发表时,最新版本是 FUSE 2.8.4。
一定要从 FUSE 项目主页下载最新代码(见中的链接)。
编译之后,FUSE 包安装构建新的 FUSE 文件系统所需的很多库和名为fusermount的应用程序,这个应用程序用于挂装和卸载 FUSE 文件系统。
除了通常提供给?mount命令的选项之外,fusermount 还有几个特殊选项。
自制 NFS安装基础代码之后,可以继续安装 FUSE 文件系统。
我们要尝试的第一个 FUSE 文件系统是 SSHFS,它是一种基于 SFTP 的文件系统。
只要服务器支持 SSH(大多数服务器都符合这个条件),就可以通过 SSHFS 把任何远程目录挂装为本地文件系统。
在继续操作之前,要确认系统上有?Glib 和?Gthread。
如果系统上有 GNOME,很可能有这些库;否则,从源代码或通过操作系统的本机包管理器安装它们。
(Debian Linux 系统有 Aptitude。
Red Hat Linux 系统提供?rpm、yum和YaST。
)给出安装 SSHFS 的代码。
清单 2. 安装 SSHFS如果运行 Ubuntu 或者 UNIX 或 Linux 的其他变体,您的发行版可能提供所有软件包的预构建二进制代码。
例如,在 Ubuntu 上,目前可以用以下命令安装列出的所有 FUSE 软件:如果您依赖的代码是最新的,还可能能够用?apt-get install sshfs命令安装 SSHFS。
安装了 FUSE 库和 SSHFS,就可以把能够通过 SSH 访问的任何远程目录挂装为本地文件系统(见?)。
通过组合?ssh和mount,提供远程系统的名称、登录凭证、希望挂装的远程目录和本地挂装点(可以是任何本地目录)。
清单 3. 把能够通过 SSH 访问的目录挂装为文件系统如您所见,现在可以像本地文件一样方便地使用远程目录的内容。
如果您是使用多个系统的开发人员,SSHFS 让您能够用本地命令—比如cp、make等—操作远程文件。
可以输入?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库。
给出安装 S3FS 实例的代码。
清单 4. 安装 S3FS假设您已经有一个 Amazon S3 账号,账号提供访问密钥和秘密访问密钥,就可以用以下命令挂装自己的任何 bucket:有了 S3FS,就可以把整个 Git 存储库放在 Amazon S3 上,或者使用?rsync在 Amazon 的存储系统上存储备份。
访问任何存档FUSE 的另一个重要工具是?archivemount,这个实用程序可以把很多形式的存档挂载为本地文件系统,包括 tarball(即用 gzip 压缩的 tar 存档)。
假设系统上有?libarchive,就可以快速地构建?archivemount,见?。
清单 5. 安装 archivemount例如,可以使用?archivemount把它自己的 tarball 挂装为文件系统。
给出代码。
清单 6. 把 tarball 挂装为文件系统与 SSHFS 相似,archivemount为 tarball 提供与本地文件系统相似的无缝的访问。
顺便说一句,如果在 tarball 的“文件系统” 中修改、删除或添加任何文件,那么当卸载 FUSE 文件系统时所有修改会保存到原来的 tarball 中。
fusermount -u ~/mnt/tgz命令从指定的挂装点卸载 FUSE 文件系统。
列出一个tarball “文件系统” 的内容。
清单 7. 通过 archivemount 写文件$ tar tfz 0.6.10.6.10.6.10.6.10.6.1中最后的tar命令确认NOTES确实已经添加到 tarball 中了。
对于用archivemount扩展存档,有一个警告:软件的作者指出,在存档中写文件应该谨慎,因为如果写操作失败,所有修改都会丢失。
但是,一般来说,少量写操作不会出问题。
尽管如此,archivemount的只读特性是非常出色的。
如果希望检查通过 FUSE 挂装的文件系统,只需运行典型的?mount命令并寻找标有fuse的系统,见。
清单 8. 通过 FUSE 挂装的文件系统本文所用的测试环境是在 Dell 桌面 PC 上运行的 Ubuntu 10。
在所示的mount脚本中,可以在底部看到archivemount文件系统,在顶部看到Linux 挂装的典型物理设备。
适合保存机密数据的文件系统根据前两个示例,您可以想到 FUSE 能够包装许多连网的服务和文件格式,从而对远程或打包的文件提供无缝的访问。
确实有很多有效的实现。
WikipediaFS把 Wikipedia 挂装为本地文件系统,可以在其中本地地编辑文章。
其他软件包为博客、Flickr 和 Google Mail 服务提供相似的功能。
FUSE 的另一个特性是镜像,即并行地维护文件的拷贝。
典型的示例是FUSE-centric Encrypted File System (EncFS)。
指定一个源目录和一个目标目录,写到源目录中的所有文件就会自动地加密并保存到目标目录中。
EncFS 需要?librlog,这是一个灵活的消息日志记录库。
从源代码或发行版的存储库安装它,然后继续构建 EncFS,见?。
清单 9. 安装 EncFS安装软件包之后,就可以使用它了。
必须创建两个新目录—一个用于保存原来的文件,一个用于保存加密的文件。
encfs实用程序映射这两个目录,见。
清单 10. 创建用于加密的目录对一般情况下,可以选择 "paranoia" 模式。
接下来,输入用于保护文件的密码并再次输入以确认密码。
给出代码。
清单 11. EncFS 自动地加密新文件创建的每个文件都会出现在加密的目录中,甚至文件名也加密了。
操作完之后,只需卸载未加密的目录,见?。
此目录的内容被删除,只留下加密的文件。
清单 12. 卸载未加密的目录要想查看未加密的文件,应该把一个挂装点连接到前面加密的文件集。
当出现提示时,输入密码以验证自己的身份:重新挂装之后,可以以明文看到原来的文件。