05.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 相同。
前面谈到的命令大多仅能针对单一文件来进行压缩,虽然 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 /etc
tar: Removing leading `/' from member names
root@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 的限制所在。简单地说,如果想要备份的数据如下时,则有不同的限制情况:
当待备份的数据为单一文件系统
待备份的数据只是目录,并非单一文件系统
-
所有的备份数据都必须要在该目录下面(如 / 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/vda1
15114266624 <== 单位是 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.back
2+1 records in
2+1 records out
1108 bytes (1.1 kB) copied, 4.6335e-05 s, 23.9 MB/s
root@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.cpio
root@iZ25nbozf5vZ:/etc# file /data/temp/boot.cpio
/data/temp/boot.cpio: ASCII cpio archive (pre-SVR4 or odc)
推荐阅读 |
---|