新兴实践_新兴文件系统简介

这是一句古老的谚语,但仍然很准确:“在UNIX®中,所有内容都是文件”。 从概念上讲,每个UNIX资源都是一个简单的文件,您可以打开,读取,写入或两者兼而有之。 实验数据是一个文件,外壳启动脚本,UNIX内核,主目录,每个网络套接字和/ bin / ls可执行文件也是一个文件。

但是,并非每个文件都相同。 您的实验数据可能是高度定制的数据库。 Shell脚本是一个文本文件,尽管有一个重要的区别:开头的!# (通常称为shebang )行指示哪个应用程序解释该文件。 内核是二进制文件,与每个可执行文件一样,都是二进制文件,都具有系统工具可以操纵的可预测的特定格式。 目录是用于编目内容的专用索引。

此外,并非每个文件都以相同的方式存储。 文件的结构和大小取决于基础文件系统 -将文件数据持久保存到物理设备的子系统。 相同的数据(例如,同一文件的两个副本)在不同的文件系统上的组织方式不同。 每个文件系统都规定了自己的存储策略,可以将其设计为满足特定条件。 例如,可以优化一个文件系统的速度,优化另一个文件系统的空间效率,而优化另一个文件系统的持久性以防止数据丢失或损坏。 通常,没有正确或错误的文件系统可供部署:您必须分析存储需求并选择适合您目的的文件系统或文件系统组合。 UNIX(和许多供应商)提供了大量的文件系统,因此您一定会发现有好处的。

表1仅列出了一些可用于UNIX(在许多情况下为Linux®)的文件系统。

表1. UNIX文件系统
文件系统 效益
Zettabyte文件系统(ZFS) 您可以使用通用的现成存储介质构造一个本质上无限的文件系统( Zettabyte是2 70字节),ZFS还可在写入时压缩数据,从而进一步最大化介质。
网络文件系统(NFS) NFS是UNIX的强大功能,它使远程文件系统看起来像是本地的。 NFS是共享数据的理想选择。
日记文件系统(JFS) JFS和许多其他选择一样,保留对每个文件所做更改的日志或日志 。 如果发生崩溃或损坏,将“重播”日志以还原文件。
B树文件系统(Btrfs) Btrfs是最新的文件系统之一,旨在成为即将发布的Linux版本的默认文件系统,它维护数据和元数据校验和以确保持久的防弹性。 Btrfs还提供快照,可以混合几乎任何大小的设备。

自己的文件系统

通常,文件系统需要针对其量身定制媒体,因此从一个文件系统更改为另一个文件系统通常需要备份,格式化物理驱动器以及冗长的还原和验证过程。 显然,这样的更改是根本的,并且是系统管理员的唯一权限。

但是,最近对许多UNIX和Linux内核的扩展允许任何用户创建和使用各种文件系统而没有特殊特权。 被称为FUSE ,它是User Space中的Filesystem的缩写,您可以使用该软件轻松创建新的文件系统。 从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文件系统所需的库,以及一个用于安装和卸载FUSE文件系统的名为fusermount的应用程序。 Fusermount有一些特殊选项,但可以接受通常会提供给vanilla mount命令的选项。

自己动手做NFS

安装基础代码后,您可以继续安装FUSE文件系统。 第一个尝试使用的FUSE文件系统是SSHFS,这是基于SFTP的文件系统。 通过SSHFS,您可以将任何远程目录作为本地文件系统挂载,只要您的服务器支持SSH(大多数情况下就是如此)。 在继续之前,请确保您的系统具有Glib 2.0和Gthread 2.0。 如果您的计算机具有GNOME,则可能具有这些库;请参见第28页的“库”。 否则,请从源代码或通过操作系统的本机软件包管理器安装它们。 (Debian Linux系统具有Aptitude。RedHat 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和其他命令)在远程文件上运行。

要卸载FUSE文件系统,可以键入fusermount -u /some/mount/point 。 或者,由于FUSE文件系统的行为与普通文件系统相同,因此可以键入umount /some/mount/point

另一个远程文件系统变体称为S3FS 。 S3FS不会使用自己的远程服务器和SFTP,而是将Amazon Simple Storage Service(Amazon S3)存储桶安装为本地文件系统。 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帐户,则可以使用以下命令安装您拥有的任何存储桶:

$ 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扩展归档文件的一个警告:软件作者警告不要写入归档文件,因为如果Write操作失败,所有更改都会丢失。 通常,尽管如此,少量的写操作也可以正常工作。 但是,您可能会发现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®台式机上运行的Ubuntu版本10。 在清单8mount记录中,您可以在底部看到archivemount文件系统,在顶部可以看到Linux机器安装的典型物理设备。

秘密文件系统

根据前两个示例,您可以想象FUSE可以包装许多网络服务和文件格式,以提供对远程或打包文件的无缝访问。 确实,有许多可行的实现。 WikipediaFS挂载为本地文件系统,您可以在其中本地编辑文章。 其他软件包为Blogger,Flickr和Google Mail服务提供了几乎相同的功能。

FUSE的另一种用法是镜像或并行维护文件副本。 一个典型的例子是以FUSE为中心的加密文件系统(EncFS)。 给定一个源目录和一个目标目录,写入源目录的所有文件都会自动加密并保存到目标目录。 librlog是一个灵活的消息记录库,是EncFS的先决条件。 从源代码或发行版的存储库安装它,然后继续构建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:

通常,您可以选择“偏执狂”模式。 接下来,输入密码以保护文件,然后再次输入以确认密码。 清单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的功能。 一些功能强大的文件存储解决方案也在用户空间中运行。 例如,ZFS-Fuse是用户空间中ZFS的实现。 MooseFS是一个容错的,网络分布式文件系统。 它将数据分散在多个物理服务器上,但用户将汞合金视为一种类似于UNIX的文件系统资源。 GlusterFS是基于FUSE的高性能分布式文件系统。

描述GlusterFS部署不在本文讨论范围之内,但是简短的介绍应该演示您可以使用FUSE构建的功能,避免内核修改和补丁。 具体来说,GlusterFS可以:

  • 跨越任意数量的机器。
  • 将完全不同的异构存储设备和物理文件系统(GlusterFS称为砖)聚合到一个统一的池或名称空间中。
  • 临时组合文件系统功能(GlusterFS称为翻译程序),以构建定制的存储解决方案。 一个翻译器提供复制,而另一个则通过TCP / IP实现连接。
  • 通过预读,后写和许多其他技巧来提高性能。

GlusterFS版本3极大地简化了该软件的初始设置,这仅比在整个系统的子网络中建立SSH密钥要复杂得多。 但是更好的是,GlusterFS不需要内核更新或特殊的自定义。 因为它是用FUSE编写的,所以它可以在内核环境之外运行,并且可以由任何开发人员扩展。

点亮保险丝!

保险丝是一项不可思议的技术。 使用它,您可以使用许多流行的编程语言开发新的文件系统,包括Python,Ruby,Lua, C/C++ ,Java™语言等等。 此外,创建和部署新文件系统并不要求更改所有正在运行的系统的内核。 您可以在另一篇题为“ 使用FUSE开发自己的文件系统:不需要内核编程 ”的developerWorks文章中了解有关FUSE如何与内核协同工作的更多信息。 请参阅“ 相关主题”部分,以获取其他阅读材料以及指向此处提到的项目的链接。

现在有大量的FUSE文件系统可用,并且每天都有更多的FUSE文件系统出现。 ZFS-Fuse和GlusterFS是非常复杂的解决方案的两个示例,但是archivemount和SSHFS同样有用。 所有FUSE文件系统都满足特定要求。 如果您有特殊要求,则可以考虑使用FUSE和一些代码来编写自己的文件系统。


翻译自: https://www.ibm.com/developerworks/aix/library/au-spunix_newfs/index.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值