Linux 服务器文件压缩工具简介

简介

压缩计算机上的文件和目录的原因有很多。一些更直接的好处是节省了磁盘空间,并使用更少的带宽进行网络通信。

在本指南中,我们将讨论一些不同的数据压缩方法,并谈谈各种方法的一些权衡。我们还将讨论一些相关的操作,如存档,这些操作使我们的压缩工具更加灵活。

我们将在Ubuntu12.04VPS实例上演示这些工具,但它们在任何现代Linux发行版上的操作几乎完全相同。

压缩归档基础知识

在我们开始讨论我们将使用的实际工具之前,我们应该定义我们的术语并讨论压缩和归档技术的一些不同特征。

压缩 是一种使用不同的算法和数学计算来减小磁盘文件大小的方法。文件以某些方式进行格式化,即使其内容不同,它们的一般结构在某种程度上也是可预测的。此外,内容本身经常被重复。这两个领域都代表着使用压缩技术的机会。

有损无损压缩

在讨论与计算机和文件类型相关的压缩时,相同的术语可能意味着一些不同的事情,具体取决于上下文。让我们以MP3音乐文件为例。MP3是一种压缩声音文件,用于从较大的源音乐文件创建较小的文件。

这种类型的压缩与我们将在本指南中讨论的内容有根本的不同。这是因为MP3是通过分析音频文件的波形并基本上找出它可以永久丢弃哪些数据,同时仍然保留原始文件的精神或一般声音来创建的。

这被称为有损 压缩方法,因为它确实会丢失未写入MP3的原始文件中的信息。以后您不能将MP3转换回相同的源文件。

用户可能不会注意到压缩,但它并不包含原始文件的所有相关信息。压缩比越高,压缩开始影响音频的主要部分就越多。

另一个例子是JPEG图像。 压缩得越多,丢失的重要数据就越多,压缩就越明显。 JPEG压缩实用程序将尝试找到彼此足够接近的颜色字段,并将整个字段替换为单一颜色。 使用的压缩比越大,将以这种方式覆盖的颜色范围就越大。

或者,无损 压缩方法创建的文件比原始文件小,可用于重建原始文件。无损压缩是我们将在本指南中介绍的类型。这种类型的压缩不使用近似来压缩数据,而是使用某些算法来识别文件的重复部分。它会删除这些元素,并用占位符替换它们。它会继续,并将后来出现的模式替换为 对同一占位符的引用。

这使得计算机可以在更少的磁盘空间上存储信息。可以将此过程视为创建定义数据块的变量列表,然后稍后使用这些变量填充程序。这实际上是每种无损压缩技术使用的两个阶段:将高度重复的值映射到较小的、易于引用的值,然后使用引用更改每个值的出现次数。

此外,现代无损压缩技术被认为是自适应 的。这意味着他们不会从一开始就分析整个输入文件,并从中创建引用替换的词典。相反,他们边走边分析文件,并根据实际重复的数据重写词典。随着这一过程的继续,词典逐渐变得更有效率。

档案背景

存档数据的概念通常是指备份数据并将其保存到安全位置,通常是以压缩格式保存。一般来说,Linux服务器上的存档的含义略有不同。通常它指的是tar文件。

过去,来自服务器的数据通常备份到磁带存档上,磁带存档是可用于存储顺序数据的磁带设备。这仍然是某些行业的首选备份方法。为了高效地执行此操作,创建了tar程序,以便您可以将文件系统中的多个文件作为一个文件进行寻址和操作,并且具有完整的权限和元数据。然后,您可以从存档中提取一个文件或整个文件系统。

基本上,tar文件是一种文件格式,它创建了一种分发、存储、备份和操作相关文件组的便捷方式。我们还将在本指南中讨论归档,因为归档过程中通常会对归档进行压缩,以便以更高效的方式存储数据。

比较不同的压缩工具

Linux有许多不同的压缩工具可用。 他们每个人都在某些领域做出牺牲,每个人都有自己的优势。 我们将偏向于使用tar的压缩方案,因为它们比其他方法灵活得多。

GZIP压缩

gzip工具通常被归类为在Linux机器上压缩数据的经典方法。它自1992年以来一直存在,目前仍在发展中,仍然有很多事情要做。

gzip工具使用的是一种称为deflate的压缩算法,该算法也用于其他流行的技术,如PNG图像格式、HTTP Web协议和SSH安全外壳协议。

它的主要优点之一是速度。 它可以以比一些竞争技术更高的速率压缩和存储数据,特别是在比较每个实用程序的最紧凑的压缩格式时。 它在压缩和解压缩期间的内存使用方面也非常高效,并且在优化最佳压缩时似乎不需要更多内存。

另一个考虑因素是兼容性。由于gzip是一个如此古老的工具,几乎所有的Linux系统,无论年龄大小,都会有这个工具来处理数据。

它最大的缺点是,它对数据的压缩不如其他一些选项那么彻底。如果您正在进行大量的快速压缩和解压缩,这可能是一种很好的格式,但如果您计划压缩一次并存储文件,则其他选项可能具有优势。

通常,gzip文件以.gz扩展名存储。您可以使用gzip压缩文件,只需输入如下命令:

gzip sourcefile

这将压缩文件,并在您的系统上将名称更改为Sourefile.gz

如果您想递归压缩整个目录,可以这样传递-r标志:

gzip -r directory1

这将在目录中向下移动,并分别压缩每个文件。这通常不是首选的做法,通过将目录存档并将结果文件作为一个整体进行压缩可以获得更好的结果,我们稍后将介绍如何做到这一点。

要了解有关压缩文件的更多信息,您可以使用-l标志,它会给您一些统计信息:

1gzip -l test.gz

1compressed uncompressed ratio uncompressed_name
2               5133 14073 63.7% test

如果需要将结果通过管道传输到另一个实用程序,可以使用-c标志告诉gzip将压缩文件发送到标准输出。 在这个例子中,我们将简单地将它直接导入一个文件:

1gzip -c test > test.gz

您可以通过传递一个介于1和9之间的编号标志来调整压缩优化。-1标志(及其别名--fast)代表最快但最不彻底的压缩。-9标志(及其别名--Best)代表最慢、最彻底的压缩。默认选项是-6,这是一个很好的中间选择。

1gzip -9 compressme

要删除一个文件,你只需将-d标志传递给gzip(也有别名,如gunzip,但它们做的是同样的事情):

1gzip -d test.gz

bzip2压缩

另一种常见的压缩格式和工具是bzip2。虽然比1996年首次引入的gzip2‘更现代一些,但bzip2’作为gzip的传统替代方案被大量实现。

gzip依赖于deflate算法,而bzip2则是一种称为Burrow-Wheeler算法的算法的实现。这种方法上的差异导致了一组与gzip截然不同的优势和劣势。

对于大多数用户来说,最重要的权衡是以更长的压缩时间为代价进行更大的压缩。bzip2工具可以创建比gzip更紧凑的文件,但由于算法更复杂,实现这些结果所需的时间要长得多。

幸运的是,解压缩时间没有压缩时间那么长,所以使用bzip2格式分发文件可能是有利的,因为您只会在压缩过程中遭受时间损失,并且能够分发在合理的时间内可以解压缩的较小文件。解压时间仍然比gzip大很多,但没有压缩操作那么大的影响。

另一件要记住的事情是,内存要求比gzip更高。这对大多数机器不会有影响,但在小型嵌入式设备上,这可能会影响您的选择。您可以选择传递-s标志,这将使内存需求减少大约一半,但也会导致较低的压缩比。

使用此机制压缩的文件通常会被赋予.bz2文件扩展名。

要创建一个bzip2压缩文件,您可以简单地输入如下内容:

bzip2 afile

这将压缩文件并将其命名为afile.bz2

如上所述,您可以传递-s标志来表示实用程序应在减少内存模式下运行。 这也不会压缩,但它不需要那么多的资源。

1bzip2 -s afile

虽然bzip2实现了编号标志,但它们的含义与gzip有所不同。在这里,它们表示实用程序设法实现其压缩的块大小,因此这更多地是内存使用与压缩大小的度量,而不是时间与压缩大小的度量。默认行为是-9标志,这意味着(相对)较高的内存使用率,但会有更大的压缩。

1bzip2 -1 file

要解压bzip压缩文件,可以传入-d标志:

1bzip2 -d file.bz2

这将返回一个名为FILE的未压缩文件。

XZ压缩

空间中相对较新的是xz压缩机制。 这个压缩工具于2009年首次发布,并从那时起获得了稳定的追随者。

xz压缩实用程序利用一种称为LZMA2的压缩算法。该算法比前两个示例具有更高的压缩比,当您需要在有限的磁盘空间上存储数据时,它是一种很好的格式。它创建较小的文件。

这也是要付出代价的,在大多数领域,bzip2‘都会受到影响。虽然xz产生的压缩文件比其他实用程序小,但压缩所需的时间_显著_更长。例如,在一个相当大的文件上使用重压缩标志时,gzip可能需要大约半分钟,bzip2可能需要大约一分钟,而xz`可能需要大约四到五分钟。

xz压缩工具在内存需求方面也受到了影响,有时比其他方法高出一个数量级。如果您使用的是内存充足的系统,这可能不是问题,但这是一个需要牢记的考虑事项。

虽然压缩时间可能比最好的时间长得多,但解压缩时间实际上是相对较好的。虽然它的解压速度永远不会接近gzip,但它的解压速度通常比bzip2快得多。用于解压缩的内存使用量也不是很惊人(但相对来说仍然相当高)。

这一系列的优点和缺点使它成为像软件一样分发文件的一种很好的格式。您将不得不提前承受压缩时间的损失,但您的文件的消费者将受益良多。他们将有一个紧凑的文件,很快就会解压。

此格式的另一个隐藏缺点是,由于其过时,某些较旧的系统可能不支持此格式。如果你想获得最大的兼容性,你可能会被迫将目光投向别处。

以这种格式创建的文件通常采用.xz扩展名。

要压缩文件,只需调用不带任何参数的实用程序:

xz file

这将处理该文件并生成一个名为file.xz的文件。

要列出文件的压缩情况,可以在压缩文件上传入-l标志:

1xz -l test.xz

1Strms Blocks Compressed Uncompressed Ratio Check Filename
2    1 1 5,016 B 13.7 KiB 0.356 CRC64 test.xz

如果您需要将压缩输出发送到标准输出,您可以使用-c标志将其发送给实用程序。在这里,我们可以再次将其直接定向回一个文件:

1xz -c test > test.xz

对于编号的标志,xz使用较小的数字表示压缩速度较快。事实上,它有一个-0‘标志,表示最快的预设。-6`标志是默认设置,对于大多数用例来说,它是一个很好的中间选择。如果您确实需要对较大的文件进行压缩,您可以使用较高的标志,这可能需要很长时间,但可能会显示一些好处。

如果您需要更多的压缩,并且不关心时间、内存需求等,您可以使用-e标志,它使用另一个极端压缩变量。这还可以使用数字标志修改其性能:

1xz -e -9 large_file

这将需要很长时间,最终可能不会显示出非常显著的收益,但如果您需要该功能,可以使用该选项。

要解压缩文件,需要再次传递-d标志:

1xz -d large_file.xz

这会将数据解压缩到一个名为Large_FILE的文件中。

使用带压缩的焦油归档

虽然单独的压缩方法本身很有用,但大多数情况下,您会看到它们与tar配合使用来压缩文件存档。这允许我们保留我们包装的文件的目录结构、权限等。

tar命令实际上是非常直接的关系。 它包括命令行标志,可用于在归档过程完成后自动调用相关的压缩工具,所有这些都在一个步骤中完成。

在gzip中使用tar

要创建一个tar归档文件,然后使用gzip实用程序进行压缩,您可以传递-z标志,该标志表示您希望在归档文件之上使用gzip压缩。实际上,像大多数工具一样,tar标志实际上不需要前导-。实现压缩存档的一个常见习语是:

tar czvf compressed.tar.gz directory1

这将从名为)。 它将创建详细的输出,使用gzip压缩结果存档,并输出到一个名为)。

文件创建完成后,我们可以使用-t标志而不是创建标志来窥探:

1tar tzvf compressed.tar.gz

1drwxr-xr-x demouser/demouser 0 2014-03-19 18:31 directory1/
2-rw-r--r-- demouser/demouser 5458 2014-03-19 18:31 directory1/httpd.conf.orig
3-rw-r--r-- demouser/demouser 2295 2014-03-19 18:31 directory1/nginx.conf.orig
4-rw-r--r-- demouser/demouser 5458 2014-03-19 18:21 directory1/httpd.conf

以后要解压文件并解压存档,可以使用-x标志:

1tar xzvf compressed.tar.gz

这将在当前目录中重新创建目录结构。

结合bzip2使用tar

要使用bzip2进行归档,可以将-z标志替换为-j标志,-z标志是gzip特有的。

这意味着压缩的归档创建命令将修改为:

tar cjvf bzipcompressed.tar.bz2 directory2

同样,您可以通过传递-t标志来查看归档中包含的文件:

1tar tjvf bzipcompressed.tar.bz2

1drwxr-xr-x demouser/demouser 0 2014-03-19 18:31 directory2/
2-rw-r--r-- demouser/demouser 5458 2014-03-19 18:31 directory2/httpd.conf.orig
3-rw-r--r-- demouser/demouser 2295 2014-03-19 18:31 directory2/nginx.conf.orig
4-rw-r--r-- demouser/demouser 5458 2014-03-19 18:21 directory2/httpd.conf

您可以通过键入以下命令将文件和目录结构解压缩到当前目录:

1tar xjvf bzipcompressed.tar.bz2

将tar与XZ配合使用

任何远程最新版本的tar都添加了类似的xz压缩功能。它们使用-J标志遵循完全相同的格式。

tar cJvf xzcompressed.tar.xz directory3

要显示信息,请使用相同的机制:

1tar tJvf xzcompressed.tar.xz

1drwxr-xr-x demouser/demouser 0 2014-03-19 18:31 directory3/
2-rw-r--r-- demouser/demouser 5458 2014-03-19 18:31 directory3/httpd.conf.orig
3-rw-r--r-- demouser/demouser 2295 2014-03-19 18:31 directory3/nginx.conf.orig
4-rw-r--r-- demouser/demouser 5458 2014-03-19 18:21 directory3/httpd.conf

遵循相同的模式进行提取:

1tar xJvf xzcompressed.tar.xz

这将使您的完整目录结构恢复原样。

结论

希望您现在有了足够的信息来做出明智的决定,决定在不同的情况下偏爱哪种压缩方法。我们在这篇文章中讨论的所有压缩方案都有非常吸引人的优点,这取决于您情况的具体要求。

重要的是要意识到每个解决方案可能固有的性能缺点和兼容性问题。 您对这些问题的重视程度完全取决于您操作的机器以及您必须支持的客户类型。 大多数现代机器不应该太注意这些细节,但是如果在与旧机器交互时盲目地实现压缩类型,它们可能会导致问题。

By Justin Ellingwood
Published At
Categories with 技术
comments powered by Disqus