使用fusecompress对文件系统进行透明压缩

刚刚从Windows转入Linux的时候,有一点让我非常不适应,那就是没有支持透明压缩的文件系统。所谓的透明压缩的文件系统是指可以像NTFS文件系统那样透明地对文件进行压缩,而用户可以通常的方式使用文件,而不会察觉到文件实际上已经被压缩了。在当时(一年半前左右),支持透明压缩的Btrfs文件系统还处于相对早期的开发阶段,根本不可能拿来使用。而reiserfs也还无法对文件内容进行压缩,仅仅是在文件系统组织上对小文件进行一些处理,获得相对不大的压缩率。要获得更好的压缩,还是要靠对内容的压缩才行。

后来我就发现了fusecompress,当时的fusecompress还不完善,但是已经足以满足我的需求。而现在fusecompress已经较一年前有了很大的进步,支持了lzma压缩,对于速度要求不高,而数据较多的情况下是不错的选择。而使用zlib进行压缩则可以得到较快的压缩速度和不错的压缩率。我现在有两个挂载点使用zlib,两个挂载点使用lzma。对了fusecompress是可以选择不同的压缩算法,可以自由指定压缩块大小。想要更快的速度就选择小一点的压缩快,想要大一点的压缩率就可以使用大一点的压缩块。

fusecompress是以挂载的方式来实现透明压缩的。你可以将一个目录挂载到另一个目录,也可以将这个目录挂载到自己身上。挂载后,就可以在目标挂载点进行正常的文件访问,而压缩后的文件将会保存在源挂载点上。

我的一个lzma挂载点用来挂载texlive的整个程序目录,texlive可是一个大东西,我安装的texlive2009在磁盘占用的空间将近2G。考虑到texlive的程序文件并不会频繁修改,而lzma解压的速度并不慢,我就使用lzma来挂载整个texlive目录了。这样,我空间紧缺的根目录上又多出了600兆,这足够再装十几个软件的了。

使用透明压缩不仅仅可以腾出硬盘空间,还能减少磁盘物理读写。想想看,假设有一个100M的文件,被压缩到了50M,那么这个文件在磁盘上实际就只占用了50M的区域,而读取此文件的时候磁盘实际上只进行了50M数据的读取,理论上将磁盘物理操作减少到了原来的一半,硬盘也会表示压力小了不少,这对延长硬盘寿命真是大有裨益。磁盘操作减少了,处理器的工作就增加了,但是有谁听说过因为处理器用太多而导致处理器提前退役的吗?个人电脑上坏得最快的设备最常见的还是硬盘吧。说起来前几周我一块只用了2年半的硬盘就因为坏道太多而提前下岗了。

修改fstab,自动挂载压缩文件系统

fusecompress可以直接写在fstab里面,让系统启动就自动挂载压缩文件系统。但是挂载前要记得先把想挂载的目录所在的分区给挂载上来。在fstab里面直接使用fusecompress的写法如下

# <file system> <mount point>   <type>  <options>  <dump>  <pass>
fusecompress#/media/DEV/.DEV  /media/DEV/.zip   fuse    fc_c:lzma,fc_b:128,allow_other 0 0

这个就是把.DEV挂载到.zip,之后.DEV里面就是压缩过的数据,在.zip里面就可以像平常一样访问文件。参数中的allow_other是允许其他用户访问此挂载点,因为在fstab中挂载的目录是以root身份挂载的,所以必须加上allow_other,这样才能让非root的用户访问挂载点内的内容。放心,虽然有allow_other参数,但是挂载点还是受到传统的Unix文件权限保护的。需要注意的是,这行挂载指令不要写在 /usr 或 / 的挂载指令之前,否则在 /usr 或 / 还没有挂载上的时候就想使用fusecompress,是没法找到fusecompress这个文件的,挂载就会失败。

我把挂载点设为.zip是有原因的。我不想把整个分区都压缩,只想压缩这个分区下的某几个目录,如果为每一个目录都挂载一次那就太麻烦了,所以我在这个分区下只创建了一个压缩目录,然后,在这个目录中创建几个子目录,再回到分区挂载点根下创建指向这几个子目录的符号链接。这样就只需要挂载一个压缩目录,而在多个目录中进行透明压缩了。.zip这个目录平时不需要进去,所以弄成隐藏的,我只需要访问那几个符号链接就可以了。

fusecompress能自动根据文件类型,仅压缩那些能获得较好压缩率的文件类型。在默认设置下,诸如图片啊,压缩包啊,音乐啊,视频之类的文件都不会进行压缩处理,而是直接写入。压缩这些文件并不能获得多少压缩率,反而会浪费时间。当然这些都是可选的,你可以自己指定需要压缩哪些类型的文件,而不要压缩哪些类型都文件。

fusecompress的灵活性是NTFS的透明压缩所不能比拟的,刚刚转到Linux时我还认为Linux不如Windows的一个方面就是没有能支持透明压缩的文件系统,但是现在我已经离不开fusecompress了,自由自定压缩参数以符合不同需求,这比NTFS的压缩强太多了。发现fusecompress后没多久我就不再觉得NTFS的透明压缩是Windows比Linux强的一个方面了。实际上我还用fusecompress做了一些糟糕事,不过这超出本文介绍fusecompress的范围了,所以另文以述。

需要提醒的是,在我写这文的时候,fusecompress位于谷歌代码上的项目已经不再更新了,他们的主页已经转移到了其他地方,具体是哪里我忘了,请自行咨询谷歌。Ubuntu的软件源里面也已经有了较新版本的fusecompress,但是好像不支持某些压缩方法,最后好像我也是自己下源码回来编译的。

想起来Btrfs应该快进入稳定阶段了,可能在下一个内核版本就会去掉“实验”标记。Btrfs也能支持多种压缩方法的透明加密,直接在文件系统上实现的内核级别的透明压缩,应该会比用户空间的fusecompress快一些。具体怎样就等Btrfs稳定可用之后再做决定了。

本文发表于 技术向,并添加了 , , , , 标记。保存永久链接到书签。

发表评论

电子邮件地址不会被公开。