AIX 上总有一种压缩方式适合你

AIX 上总有一种压缩方式适合你

当今世界每天产生大量的数据,有些数据我们需要进行压缩,压缩数据的好处不言而喻:节省空间;方便传输;加密保护等等。很多压缩工具应运而出,每种工具都有自己的特点。对于 AIX 平台上的压缩方法也很多 compress、pack、gzip、 pax、tar 等等。本文将首先简单介绍一下压缩的基本原理然后详细介绍 AIX 平台的常用压缩工具并针对它们各自的特色进行比较,让读者对对 AIX 平台的压缩有针对性的认识,从而能够根据不通的需要选择合适的压缩工具。

于 晶, 软件工程师, IBM

张 光明, 软件工程师, IBM

2010 年 12 月 09 日

  • +内容

数据压缩的原理

数据压缩是指在不丢失信息的前提下,缩减数据量以减少存储空间,提高其传输、存储和处理效率的一种技术方法。或按照一定的算法对数据进行重新组织,减少数据的冗余和存储的空间。数据压缩包括有损压缩和无损压缩。无损压缩是可逆的;有损压缩是不可逆的。

计算机处理信息是以二进制数(0 和 1)的形式表示的,压缩软件把二进制信息中相同的字符串以特殊字符标记起来,从而实现缩小文件大小来达到压缩的目的。压缩的理论基础是信息论。从信息的角度来看,压缩就是去除掉信息中的冗余,即去除掉确定的或可推知的信息,而保留不确定的信息,也就是用一种更接近信息本质的描述来代替原有的冗余的描述,这个本质的东西就是信息量。

数据压缩的硬件和软件工具也非常多,本文将针对 AIX 平台常见的几种数据压缩工具进行介绍和比较并提供常用的示例进行解说,希望您能从中选择合适的压缩工具进行压缩。

AIX 平台上,通常我们看到的 .Z .gz .z .ar .tar 后缀的文件都是压缩文件。通过 compress 可以生成 .Z 压缩文件,通过 compress、uncompress、gzip 可以解压 .Z 格式的压缩文件;通过 gzip 可以生成 .gz 压缩文件,通过 gzip 可以解压 .gz 格式的压缩文件;通过 pack 可以生成 .z 压缩文件,通过 unpack、gzip 可以解压 .z 格式的压缩文件;通过 pax 可以生成 .ar 压缩文件,通过 pax 可以解压 .ar 格式的压缩文件;通过 pax、tar 可以生成 .tar 压缩文件,通过 pax、tar、untar、可以解压 .tar 格式的压缩文件。图 1 描述了各种类型文件的压缩及解压可以选择的 AIX 工具。

图 1. 不同文件类型的压缩及解压
图 1. 不同文件类型的压缩及解压

下面我们将详细介绍 AIX 上主要压缩工具的特点已经用法。

compress

compress 是一个相当古老的 UNIX 档案压缩指令,利用自适应的 Lempel-Zev 编码来减少文件大小。每一个被参数 File 指定的原文件将被可能的压缩文件所代替,压缩后的档案会加上一个 .Z。 延伸档名以区别未压缩的档案,压缩后的档案可以以 uncompress 解压。值得注意的是执行 compress 需要有相应的权限来替换文件。

压缩量依赖于输入大小、由 Bits 变量指定的单位编码的比特数和公共子串的分布。典型地,源代码或英文文本将减少 50% 到 60%。

特点

  • 如果调用压缩进程有适当的权限,压缩文件将保留与原文件相同的所有权、方式和修改时间。
  • 如果指定的文件的路径大于 1023 字节,该命令不工作。
  • 如果没有指定文件,标准输入将被压缩到标准输出。
  • 如果压缩没有减少文件大小,将对标准错误写一个消息而不替换原文件。
  • compress 命令的压缩一般比利用哈夫曼编码或自适应哈夫曼编码实现的压缩更紧凑,计算时间更少,(哈夫曼编码在 pack 命令中被使用)。
  • 若要将数个档案压成一个压缩档,必须先将档案 tar 起来再压缩。

常用示例

  1. $compress -v dsm.opt
     dsm.opt: Compression: 10.14% This file is replaced with dsm.opt.Z.

    该命令压缩 dsm.opt 文件,-v 参数将程式执行的讯息印在荧幕上。标准输出显示压缩百分比为 14 %。dsm.opt 文件被压缩并重命名为 dsm.opt.Z。

  2. $compress -b 12 dsm.old

    该命令指定文件中公共子串的比特的最大值为 12。-b 参数设定共同字串数的上限,以位元计算,可以设定的值为 9 至 16 bits 。由于值越大,能使用的共同字串就 越多,压缩比例就越大,所以一般使用预设值 16 bit。  

  3. $compress – df dsm.opt.

    该命令将 dsm.opt.Z 解压成 dsm.opt,若档案已经存在 -df 程式则会自动覆盖档案。由于系统会自动加入 .Z 为延伸档名,所以该命令中 dsm.opt.Z 写成 dsm.opt 也会当作 dsm.opt.Z 来处理。

    Z

uncompress

Compress 的解压也可以由 uncompress 来完成。uncompress 命令恢复由 compress 命令压缩的原文件。

uncompress 命令恢复由 compress 命令压缩的原文件。每个由 File 参数指定的压缩文件被除去而由展开后的副本所替换。展开后的文件与压缩的版本名字相同,但没有 .Z 扩展名。如果用户有 root 用户权限,展开后的文件保留与原文件相同的所有者、组、方式和修改时间。如果用户没有 root 用户权限,则文件保留相同的方式和修改时间,但获取新的所有者和组。如果没有指定文件,则标准输入将展开为标准输出。

示例

$uncompress dsm.opt.Z

该命令解压 dsm.opt.Z 文件,并重命名为 dsm.opt。

pack

pack 命令以压缩格式存储由 File 参数指定的文件。输入文件由一个原文件名附加 .z 后缀的压缩文件所代替。压缩文件维持了同原始文件同样的访问方式、访问和修改日期和所有者。 输入文件名包含不超过 253 个字节,以允许有空间添加 .z 后缀。如果 pack 命令成功执行,原始文件就被除去。

如果 pack 命令不能创建更小的文件,它就停止处理并报告不能节省空间。(节省空间失败通常发生于小文件或者是统一字符分布的文件。)空间节省的数额取决于输入文件的大小和字符分布频率。由于译码树形成了每个 .z 文件的第一部分,因此对于小于 3 个块的文件不会节省空间。典型情况下,文本文件减少 25 % 到 40 %。

文件位置

/usr/bin/pack

特色

  • 采用 Huffman 编码来压缩文件。因此 pack 命令始终只能压缩小于 8MB 的文件。
  • pack 命令在下列任何一个条件下都不能压缩:文件已经压缩过;输入文件名超过了 253 个字节;文件有链接;文件是目录;文件不能打开;不能通过压缩节省存储块;名称为 File.z 的文件已经存在;.z 文件不能创建;处理中发生 I/O 错误。

示例

  1. $pack dsm.sys dsm.sys.ini
     pack: dsm.sys: This file is reduced in size 47.3%. 
     pack: dsm.sys.ini: This file is reduced in size 47.5%.

    该命令压缩名为 dsm.sys 和 dsm.sys.ini 的文件并显示修改的文件名。压缩的版本重命名为 dsm.opt.z 和 dsm.sys.z。 此 pack 命令显示每个压缩文件的文件大小减小百分比。

  2. $ pack - dsm.sys
     pack: dsm.sys: This file is reduced in size 47.3%. 
     The file changed from 6296 to 3315 bytes. 
     The Huffman tree has 11 levels below the root. 
     There are 49 distinct bytes in input. 
     The dictionary overhead is 67 bytes. 
     The effective entropy is 4.21 bits per byte. 
     The asymptotic entropy is 4.13 bits per byte.

    该命令压缩名为 dsmwebcl.log 的文件并显示该文件的统计信息。

unpack

unpack 命令展开由 pack 命令创建的文件。对每个指定的文件,unpack 命令搜索名为 File.z 的文件。如果这个文件是压缩文件,则 unpack 命令用其展开的版本来替换它。unpack 命令通过从 File 除去 .z 后缀来给新的文件命名。如果用户有 root 用户权限,则新的文件具有和原文件一样的访问方式、访问和修改时间、所有者和组。如果用户没有 root 用户权限,则该文件保留同样的访问方式、访问时间和修改时间,但获取新的所有者和组。

unpack 命令仅对以 .z 结束的文件进行操作。结果,当指定不以 .z 结束的文件名时,unpack 添加该后缀并搜索目录以寻找带有这种后缀的文件名。

文件位置

/usr/bin/unpack

特色

  • 如果正在解压的文件有链接,unpack 命令会把警告写到标准错误。与其来源的压缩文件比较,新解压的文件有不同的索引节点。但是,任何其它链接到压缩文件原索引节点的文件仍然存在,仍然处于压缩状态。
  • 以下情况则文件不能解压:文件名(除 .z 文件之外)多于 253 字节;文件不能打开;文件不是压缩文件;有展开文件名的文件已存在;不能创建被解压的文件。

示例

$ unpack dsm.sys.z dsm.sys.ini 
 unpack: dsm.sys: This file is now unpacked. 
 unpack: dsm.sys.ini: This file is now unpacked.

该命令展开了压缩文件 dsm.sys.z 和 dsm.sys.ini.z,并用名为 dsm.sys 和 dsm.sys.ini 的文件来替换它们。unpack 命令的文件名可以带有或不带 .z 后缀。

pax

抽取、写以及列出归档文件成员;复制文件和目录层次结构。 -r 和 -w 标志指定了归档操作的类型。通过 pax 主要可以实现 4 大功能包括:列出已归档文件的成员文件(列表方式);使用 -r 标志抽取归档文件(读取方式);使用 -w 标志写归档文件(写方式)用 -r 和 -w 标志复制文件(复制方式)。

pax 命令应该是用于系统转储和 2 GB 以上的映像的首选存档方法。 pax 命令还可以用于查看和修改 tar 和 cpio 格式的文件,下面的示例中将会给出相应解释。

文件位置

/usr/bin/pax

特点

  • 系统缺省支持 64- 位 POSIX- 定义的数据格式。目的是允许归档大文件,例如 dump 文件。归档文件大小可以大于或等于 8 GB
  • 支持长用户名(或组名)
  • 支持大于 2097151 的超大 UID/GID
  • 支持长路径名或链接名
  • 用 -o 标志可以修改归档算法

注意事项

  • 在读取或复制方式下,如果需要中间目录来抽取归档成员,pax 执行与 mkdir 子例程相同的操作,中间目录作为路径参数,值 S_IRWXU 作为方式参数。
  • 如果没有任何指定的模式或文件操作数与至少一个文件或归档成员匹配,pax 为每个不匹配的模式或文件操作数写一条诊断消息到标准错误,并以错误状态退出。
  • 遍历目录过程中,pax 将检测无限循环;例如,进入一个作为最后访问文件的祖先的先前访问的目录。在检测到无限循环时,pax 将诊断消息写到标准错误然后终止。
  • 当 pax 处于读取方式或列表方式,使用 -x pax 归档格式和文件名、链接名、所有者名或任何其他扩展的头记录中的字段,这些字段无法从 pax UTF8 编码集格式转换到当前编码集和语言环境,pax 写诊断消息到标准错误,如 -o invalid= 选项所描述的那样处理文件,然后处理归档中的下一个文件。
  • 对于 AIX 5.3,在缺省情况下 pax 命令将忽略扩展属性。-U 选项通知 pax 来归档或恢复扩展属性,它包括 ACL。-pe 选项将保留 ACL。指定 -pe 选项时,如果 pax 无法保留 ACL,诊断消息将写入标准错误,但是不会删除抽取的文件。将返回非零退出代码。pax 归档文件中的扩展属性条目需要新的记录类型。

示例

  1. $pax -wf mytest.ar -x pax test1

    该命令将在当前目录下为目录 test1 创建 pax 格式的归档 mytest.ar。使用 -w 标志来写归档文件,-x 参数指定输出归档格式。pax 有 3 中输出格式:pax、copyio、ustar。pax 为缺省数据交换格式。特定字符归档文件的格式的缺省分块值是 10240。支持以 512 递增的从 512 到 32256 的分块值;cpio 扩展 cpio 交换格式。特定字符归档文件的格式的缺省分块值是 5120。支持以 512 递增的从 512 到 32256 的分块值 ; ustar 扩展 tar 交换格式。特定字符归档文件的格式的缺省分块值是 10240。支持以 512 递增的从 512 到 32256 的分块值。

    值得注意的是:pax 并不一定会减小目录的大小。

  2. $ pax -rvf bin.ar -o delete=path
     PAX format archive 
     bin 
     bin/tsmstats.lck 
     bin/dsmcert.kdb.z 
     bin/dsm.tar 
     bin/dsmcert.crl.Z 
     bin/dsm.opt 
     bin/dsm.sys.ar

    该命令将抽取 bin.ar,抽取过程中要忽略 pax 格式的归档的路径名。当归档文件中包含 ASCII 码,抽取到 z(VM/ESA)操作系统时为了避免出现乱码现象我们需要在添加其他的标志来进行抽取。

  3. $ pax -r -f myfile1.pax -o from=ISO8859-1,to=IBM-1047

    该命令将抽取 myfile1.pax 文件,该命令保证了归档文件中的 ASCII 码解压到 zVM/ESA)操作系统的正常使用。

  4. $ pax -rw bin newdir

    该命令将 bin 目录层次结构复制到 newdir 中同时保留了源文件的大多数属性,如硬连接数和文件访问次数等。如果 newdi 目录中包含相同的文件或目录那么该命令不会覆盖原有的目录结构,该命令会提示类似下面的信息:

  5. $ pax: bin : The file/directory exists and will not be overwritten.

tar

tar 是一个已移植到 Linux 中的经典 UNIX 命令。 tar 是 tape archive(磁带归档)的缩写,最初设计用于将文件打包到磁带上,现在也可用于其它存储介质。使用 tar 可以打包整个目录树,这使得它特别适合用于备份。归档文件可以全部还原,或从中展开单独的文件和目录。备份可以保存到基于文件的设备或磁带设备上。文件可以在还原时重定向,以便将它们重新放到一个与最初保存它们的目录(或系统)不同的目录(或系统)。 tar 是与文件系统无关的。它可以使用在 ext2、ext3、 jfs、Reiser 和其他文件系统上。单独使用时,生成具有 .tar 扩展名的文件。当与 Gzip 结合用于数据压缩时,生成的文件扩展名可能是 .tgz、.tar.gz 或与 compress 结合用于数据压缩时,生成的文件扩展名则是 .tar.Z。

tar 命令通过将文件写入归档存储介质或将文件从介质中取回,来处理归档。 由 tar 命令使用的文件通过 File 参数来表示。如果 File 参数引用一个目录,则引用该目录并递归引用该目录下全部的文件和目录。

tar 命令有两组标志:必需标志和可选标志。必需标志控制 tar 命令的操作,包括 -c、-r、-t、-u 和 -x 标志。要执行 tar 命令至少要选择一个必需标志。选择了必需标志后,您可以选择一个可选标志,但可选标志对控制 tar 命令不是必需的。

文件位置

/dev/rmt0 指定缺省磁带设备。

/bin/tar 指定 tar 命令的符号链接。

/usr/bin/tar 包含 tar 命令。

注意事项

  • 由于在 tar 命令中对头块空间的限制,当恢复到某些系统时,大于 65,535 的用户号(UID)和组标识号(GID)将毁坏。大小约束只影响所有权和许可权而不对数据造成损害。
  • ustar 头格式允许文件大到 8 GB。因此,tar 命令支持归档最大 8 GB 的文件。
  • tar 不保留任何稀疏分配的文件的稀疏属性。任何在恢复前原是稀疏的文件,将按文件大小在文件系统内分配其所有空间。
  • tar 打包不一定能够压缩文件大小。

示例

  1. $tar – c myfile1

    该命令将文件 myfile1 写到缺省磁带机上新的归档中(例如 /dev/rmt0)。通常 AIX 会连接一些磁带,如果没有物理磁带或者缺省磁带没有配好 tar 命令就会打印出类似下面的错误信息

  2. $tar: /dev/rmt0: There is a request to a device or address that does not exist.

    为了避免上述情况发生通常建议用户在使用 tar 命令时指定 -f Archive,使用 Archive 变量表示要读或写的归档。

  3. $tar – cvf myfile1.tar myfile1

    该命令将文件 myfile1 在当前目录下归档,归档文件名为 myfile1.tar,同时处理每个文件时列出它们的名称。

    有时候我们只需要某个类型的文件并不想打包整个文件夹,可以通过使用 tar 命令时指定 -L InputList 实现。-L 选项的 Inputlist 参数是一个文件名称,该名称列出需要归档的文件和目录。

  4. $tar – cvf /usr/log.tar – L log_list

    该命令归档 log_list 文件中列出的文件和目录,归档文件到 /usr/log.tar。这里的 log_list 列表文件可以通过一下命令获得:

  5. $ls *.log > log.lst

    Tar 文件的恢复也是通过 tar 命令来完成的。

  6. $tar – xf myfile1.tar

    该命令恢复归档文件 myfile1.tar 到当前目录。

    有时我们想先看看 tar 包中有那些文件,然后再决定是否进行解 tar,通过 -t 标志可以按照文件在归档中的顺序列出文件。

  7. $tar – vtf myfile1.tar

    该命令列出 myfile1.tar 磁盘归档文件中各文件的名称。值得注意的是文件可能会多次列出。有时候我们会遇到 gzip 格式的文件,通过 -z 参数 tar 同样可以解压 gzip 格式的文件。

  8. $tar – zxvfmyfile1.tar.gz

该命令解压 myfile1.tar.gz 文件到当前目录。

GZIP

   gzip 最早由 Jean-loup Gailly 和 Mark Adler 创建,用于 UNIX 系统的文件压缩。Gzip 是一种无损失的数据压缩格式。gzip(也称 zip 或 zlib)所使用的算法是开源、无专利的 LZ77(Lempel-Ziv 1977)算法的变体。该算法寻找输入数据内的重复字符串。二次出现的字符串由一个指向前一字符串的指针(以对的形式 -- 距离和长度)代替。其中,距离限定为 32 KB,长度限定为 258 字节。如果字符串没有在这前 32 KB 内出现,它就会作为文字字节序列发出(这里所说的字符串 定义为随意字节序列,并不仅限于可打印的字符)。我们在 Linux 中经常会用到后缀为 .gz 的文件,它们就是 GZIP 格式的。现今已经成为 Internet 上使用非常普遍的一种 数据压缩格式,或者说一种文件格式。

实例

  1. $gzip *
     gzip: dsmcert.crl.Z already has .Z suffix – unchanged 
     gzip: dsmerror.log.gz already has .gz suffix -- unchanged 
     gzip: dsmwebcl.log.z already has .z suffix -- unchanged

    该命令压缩把当前目录下的每个文件压缩成 .gz 文件。当前目录下已经存在的压缩文件,例如 .Z .z .gz 后缀文件,gzip 将不对它们进行操作;对 .ar .tar 作为后缀的文件责仍然可能进行压缩。

  2. $gzip – dv *
     [root@aixsvt01> /usr/..../bin] $ gzip -dv * 
     cert.arm.gz:             26.6% -- replaced with cert.arm 
     dsmcert.crl.Z:           18.7% -- replaced with dsmcert.crl 
     dsmcert.kdb.z:           66.7% -- replaced with dsmcert.kdb

    该命令把当前目录下每个压缩的文件解压,并列出详细的信息。该命令可以解压当前目录下多种压缩格式的压缩文件,例如 .Z .z .gz 后缀的压缩文件。

  3. $ gzip -l *.gz
     compressed  uncompr. ratio uncompressed_name 
     631       824  26.6% cert.arm 
     44        12 -16.6% dsmcad.info 
     675       836  22.8% (totals)

    该命令详细显示当前目录下 .gz 后缀压缩的文件的信息但是并不解压。

  4. gzip myfile.tar

    该命令压缩 tar 备份文件 myfile.tar,此时压缩文件的扩展名为 .tar.gz。

zcat

zcat 命令允许用户扩展并查看压缩文件而不用将该文件解压。zcat 命令并不重命名扩展的文件,也不除去 .Z 的扩展名。zcat 命令将扩展输出写入标准输出。

示例

 $ zcat dsm.old.Z 
 SERVERNAME        test 
 COMMM             tcpip

该命令查看 dsm.opt.z 文件的解压内容被写入标准输出。文件名并未被重命名也并未解压。

总结

如果您是计划对 AIX 系统的数据进行压缩,要选择合适的压缩工具进行压缩您需要考虑几个方面的因素。例如:选择的对象是目录还是单纯的文件;压缩的数据是否大于 2g;对压缩的比例和时间有什么要求等等。开始压缩前您可以参照 图 2 来进行压缩工具的筛选。各种压缩工具的具体特点请参照本文前面的内容。

图 2. 压缩工具选择
图 2. 压缩工具选择
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值