vlambda博客
学习文章列表

05.Linux学习——压缩与打包

“在 Linux 下面有相当多的压缩指令命令可以运行操作。这些压缩指令命令可以让我们更方便地从网络上面下载大型的文件。”

Linux 系统常见的压缩命令


在 Linux 的环境中,压缩文件的扩展名大多是:*.tar, *.tar.gz, *.tgz, *.gz, *.Z, *.bz2。虽说扩展名在 Linux 中没有什么作用,但是因为 Linux 支持的压缩命令非常多,且不同的命令所用的压缩技术并不相同,当然彼此之间可能就无法相互压缩/解压缩文件。因此,为了方便我们使用,一般都会在压缩文件上添加适当的扩展名。


  • *.Z:compress 程序压缩的文件;
  • *.gz:gzip 程序压缩的文件;
  • *.bz2:bzip2 程序压缩的文件;
  • *.tar:tar 程序打包的数据,并没有压缩过;
  • *.tar.gz:tar 程序打包的文件,其中经过 gzip 的压缩;
  • *.tar.bz2:tar 程序打包的文件,其中经过 bzip2 的压缩。


Linux  上常见的压缩命令就是 gzip 和 bzip2,至于 compress 已经不再流行了。gzip 已经替换了 compress。后来又开发出 bzip2 这个压缩比更好的压缩命令。不过,这些命令通常仅能针对一个文件来压缩与解压缩,如此一来,每次压缩与解压缩都要一大堆文件,岂不烦人?此时,那个所谓的的打包软件 tar 就显得很重要了。


这个 tar 可以将很多文件“打包”成为一个文件。甚至是目录也可以这么玩。不过,单纯的 tar 功能仅是“打包”而已,即是将很多文件集结成为一个文件,事实上,它并没有提供压缩的功能,后来才将整个 tar 与压缩的功能结合在一起,如此一来提供使用者更方便并且更强大的压缩与打包功能。


1、gzip,zcat

gzip 可以说是应用最广的压缩命令了。目前 gzip 可以解开 compress、zip 与 gzip 等软件所压缩的文件。至于 gzip 所新建的压缩文件为 *.gz 的文件名。

root@iZ25nbozf5vZ:/data/temp# gzip -v access.log access.log: 92.9% -- replaced with access.log.gz

使用 gzip 进行压缩时,在默认的状态下原本的文件会被压缩成为 .gz 的文件名,原文件就不再存在了。如果在压缩的时候同时保留原本的文件,可以使用 -c 参数。

root@iZ25nbozf5vZ:/data/temp# gzip -c access.log > access.log.gz root@iZ25nbozf5vZ:/data/temp# ll-rw-r--r-- 1 root root 61440 Jan 23 22:04 access.log-rw-r--r--  1 root root  4370 Jan 23 22:19 access.log.gz


此外,使用 gzip 压缩的文件在 Windows系统中,可以被 WinRAR 这个软件解压缩。由于 access.log 是文本文件,因此我们可以使用 zcat 直接读取压缩文件的内容出来。

root@iZ25nbozf5vZ:/data/temp# zcat access.log.gz


2、bzip2,bzcat

若说 gzip 是为了替代 compress 并提供更好的压缩比而成立的,那么 bzip2 则是为了取代 gzip并提供与日俱增的压缩比而来的。bzip2 的压缩比比 gzip 还要好。它的用法几乎与 gzip 相同。

[root@www ~]# bzip2 [-cdkzv#] 文件名[root@www ~]# bzcat 文件名.bz2参数:-c :将压缩的过程产生的数据输出到屏幕上;-d :解压缩的参数;-k :保留原文件,而丌会删除原始的文件;-z :压缩的参数-v :可以显示出原文件/压缩文件的压缩比等信息;-# :与 gzip 同样的,都是在计算压缩比的参数,-9 最佳,-1 最快。
root@iZ25nbozf5vZ:/data/temp# bzip2 -zk access.log root@iZ25nbozf5vZ:/data/temp# ll-rw-r--r-- 1 root root 61440 Jan 23 22:19 access.log-rw-r--r--  1 root root  3949 Jan 23 22:19 access.log.bz2


在不解压时直接使用 bzcat 读取压缩后的文本文件内容即可,用法与 zcat 相同。


打包命令:tar


前面谈到的命令大多仅能针对单一文件来进行压缩,虽然 gzip 与 bzip2 也能够针对目录来进行压缩,不过,这两个命令对目录的压缩指的是将目录内的所有文件 "分别" 进行压缩的操作。而不像在 Windows 的系统,可以使用类似 WinRAR 这一类的压缩软件来将好多数据“包成一个文件“的样式。


这种将多个文件或目录包成一个大文件的命令功能,我们可以称呼它是一种”打包命令“。在 Linux 下就是有名的 tar。tar 可以将多个目录或文件打包成一个大文件,同时还可以通过 gzip/bzip2 的支持,将该文件同时进行压缩。由于 tar 的使用太广泛了,目前 Windows 的 WinRAR 也支持 .tar.gz 文件名的解压缩。


tar 的参数非常多。我们只讲几个常用的参数,更多参数可自行 man tar 查询。

[root@www ~]# tar [-j|-z] [cv] [-f 新建的文件名] filename... <==打包与压缩[root@www ~]# tar [-j|-z] [tv] [-f 新建的文件名] <==查看文件名[root@www ~]# tar [-j|-z] [xv] [-f 新建的文件名] [-C 目录] <==解压缩参数:-c :建立打包文件,可搭配 -v 来查看过程中被打包的文件名(filename)。-t :查看打包文件的内容含有哪些文件名,重点在查看文件名。-x :解打包或解压缩的功能,可以搭配 -C (大写) 在特定目录解开。 特别留意的是,-c, -t, -x 不可同时出现在一串命令行中。-j :通过 bzip2 的支持进行压缩/解压缩:此时文件名最好为 *.tar.bz2-z :通过 gzip 的支持进行压缩/解压缩:此时文件名最好为 *.tar.gz-v :在压缩/解压缩的过程中,将正在处理的文件名显示出来。-f filename:-f 后面要接被处理的文件名。建议 -f 单独写一个参数。-C 目录 :这个参数用在解压缩,若要在特定目录解压缩,可以使用这个参数。-p :保留备份数据的原本权限与属性,常用于备份(-c)重要的配置文件。-P :保留绝对路径,即允许备份数据中含有根目录存在之意。--exclude=FILE:在压缩的过程中,不要将 FILE 打包。


其实最简单的使用 tar 就只要记忆下面的方式即可:

  • 压 缩:tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称
  • 查 询:tar -jtv -f filename.tar.bz2
  • 解压缩:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录


那个 filename.tar.bz2 是我们自己取的文件名,tar 并不会主动产生创建的文件名。我们要自定义。所以扩展名就显得很重要了。如果不加 [-j|-z] 的话,文件名最好取为 *.tar 即可。如果是 -j 参数,代表有 bzip2 的支持,因此文件名最好就取为 *.tar.bz2 ,因为 bzip2 会产生 .bz2 的扩展名。至于如果是加上了 -z 的 gzip 的支持,那文件名最好取为 *.tar.gz。


另外,由于"-f filename"是紧接在一起的,过去很多文章常会写成"-jcvf filename",这样是对的, 但由于参数的顺序理论上是可以变换的,所以很多读者会误认为"-jvfc filename",也可以,事实上这样会导致产生的文件名变成 c, 因为 -fc。所以建议你在学习 tar 时,将"-f filename"与其他参数独立出来,会比较不容易发生问题。

root@iZ25nbozf5vZ:/etc# tar -jpc -f /data/temp/etc.tar.bz2 /etctar: Removing leading `/' from member namesroot@iZ25nbozf5vZ:/etc# ls -l /data/temp/total 712...-rw-r--r-- 1 root root 653883 Feb 12 11:04 etc.tar.bz2


完整备份工具:dump


某些时刻你想要针对文件系统进行备份或者是存储的功能时,不能不谈到这个 dump 命令。这个命令除了能够针对整个文件系统备份之外,也能够仅针对目录来备份。



dump 的功能很强,它除了可以备份整个文件系统之外,还可以制定等级。什么意思呢?假设你的/home 是独立的一个文件系统,那你第一次进行过 dump 后,再进行第二次 dump 时,你可以指定不同的备份等级,假如指定等级为 1 时,此时新备份的数据只会记录与第一次备份所有差异的文件而已。0~9 每个等级备份时的差异如下图依此类推所示:


虽然 dump 支持整个文件系统或者是单一目录,但是对于目录的支持还是比较不足的,这也是 dump 的限制所在。简单地说,如果想要备份的数据如下时,则有不同的限制情况:

  • 当待备份的数据为单一文件系统

如果是单一文件系统,那么该文件系统可以使用完整的 dump 功能,包括利用 0~9 的数个 level 来备份,同时,备份时可以使用挂载点或者是设备文件名来进行备份(例如/dev/vdb1 之类的设备文件名)
  • 待备份的数据只是目录,并非单一文件系统

例如你仅想要备份/data/temp/,但是该目录并非独立的文件系统时。此时备份就有限制。包括:
  • 所有的备份数据都必须要在该目录下面(如 / data/temp /);
  • 且仅能使用 level 0,即仅支持完整备份而已;
  • 不支持 -u 参数,即无法创建 /etc/dumpdates 这个 level 备份的时间记录文件。

1、dump

dump 的参数虽然非常繁杂,不过如果只是想要简单的操作时,你只要记得下面的几个参数就很够用了。

[root@www ~]# dump [-Suvj] [-level] [-f 备份文件] 待备份数据[root@www ~]# dump -W参数:-S :仅列出后面的待备份数据需要多少磁盘空间才能够备份完毕;-u :将这次 dump 的时间记录到 /etc/dumpdates 文件中;-v :将 dump 的文件过程显示出来;-j :加入 bzip2 的支持,将数据进行压缩,默认 bzip2 压缩等级为 2;-level:就是我们谈到的等级,从 -0 ~ -9 共十个等级;-f :有点类似 tar,后面接产生的文件,亦可接例如 /dev/st0 设备文件名等;-W :列出在 /etc/fstab 里面的具有 dump 设置的分区是否有备份过。


例如测试一下备份某文件系统需多少容量:

root@iZbp11rlps5stovkddy98rZ:~# dump -S /dev/vda115114266624 <== 单位是 byte


2、restore

备份文件就是在急用时可以恢复系统的重要数据。dump 的恢复使用的是 restore 这个命令。

[root@www ~]# restore -t [-f dumpfile] [-h] <==用来查看 dump 文件[root@www ~]# restore -C [-f dumpfile] [-D 挂载点] <==比较 dump 与实际文件[root@www ~]# restore -i [-f dumpfile] <==进入互动模式[root@www ~]# restore -r [-f dumpfile] <==还原整个文件系统参数:相关的各种模式,各种模式无法混用。例如不可以写 -tC 。-t :此模式用在查看 dump 起来的备份文件中含有什么重要数据。类似 tar -t功能。-C :此模式可以将 dump 内的数据拿出来跟实际的文件系统做比较, 最终会列出"在 dump 文件内有记录的,且目前文件系统不一样"的文件。-i :进入互动模式,可以仅还原部分文件,用在 dump 目录时的还原。-r :将整个文件系统还原的一种模式,用在还原针对文件系统的 dump 备份。其他较常用到的参数功能:-h :查看完整备份数据中的 inode 与文件系统 label 等信息。-f :后面就接你要处理的那个 dump 文件。-D :与 -C 进行搭配,可以查出后面接的挂载点与 dump 内有不同的文件。


其他常见的压缩与备份工具


1、dd

这个 dd 命令最大的功效应该是在于“备份”。因为 dd 可以读取磁盘设备的内容(几乎是直接读取扇区),然后将整个设备备份成一个文件呢。真的是相当好用,dd 的用途有很多,但是我们仅讲 一些比较重要的参数,如下:

[root@www ~]# dd if="input_file" of="output_file" bs="block_size" count="number"参数:if :就是 input file,也可以是设备。of :就是 output file,也可以是设备。bs :规划的一个 block 的大小,若未指定则默认是 512 bytes(一个扇区大小)。count:多少个 bs 的意思。


例如:将 /etc/passwd 备份到 /data/temp/password.back当中:

root@iZ25nbozf5vZ:/etc# dd if=/etc/passwd of=/data/temp/password.back2+1 records in2+1 records out1108 bytes (1.1 kB) copied, 4.6335e-05 s, 23.9 MB/sroot@iZ25nbozf5vZ:/etc# ls /data/temp/password.back/data/temp/password.back


因为 ddd 这个命令可以复制磁盘分区中扇区表面的数据。当然连同 superblock,boot sector, meta data等全部也会复制。所以当你想要构建两块一模一样的磁盘时,只需要执行诸如“dd if=/dev/sda of=/dev/sdb”,就能够让两块磁盘一模一样,甚至 /dev/sdb 不需要分区与格式化。


2、cpio

这个命令挺有趣的,因为 cpio 备份任何东西,包括设备设备文件。不过 cpio 有个大问题,那就是它不会主动去找文件来备份。cpio 得要配合类似 find 等可以找到文件名的命令来告知 cpio 该被备份的数据在哪里。

[root@www ~]# cpio -ovcB > [file|device] <==备份[root@www ~]# cpio -ivcdu < [file|device] <==还原[root@www ~]# cpio -ivct < [file|device] <==查看备份会使用到的参数: -o :将数据 copy 输出到文件或设备上。 -B :让默认的 Blocks 可以增加至 5120 bytes ,默认是 512 bytes。 这样的好处是可以让大文件的存储速度加快。还原会使用到的参数: -i :将数据自文件或设备复制到系统当中。 -d :自动建立目录。使用 cpio 所备份的数据内容不见得会在同一层目录中,因此我们 必项要让 cpio 在还原时可以建立新目录,此时就得要 -d 参数的帮助。 -u :自动的将较新的文件覆盖较旧的文件。 -t :需配合 -i 参数,可用在查看以 cpio 新建的文件或设备的内容。一些可共享的参数: -v :让存储的过程中文件名可以在屏幕上显示。 -c :一种较新的 portable format 方式存储。


例如将 /boot 下面的所有文件都备份到 /data/temp/boot.cpio:

root@iZ25nbozf5vZ:/etc# find /boot/ | cpio -ocvB > /data/temp/boot.cpio/boot//boot/memtest86+.bin...
root@iZ25nbozf5vZ:/etc# ll -h /data/temp/boot.cpio-rw-r--r-- 1 root root 27M Feb 12 13:38 /data/temp/boot.cpioroot@iZ25nbozf5vZ:/etc# file /data/temp/boot.cpio/data/temp/boot.cpio: ASCII cpio archive (pre-SVR4 or odc)


推荐阅读