第八章、文件与文件系统的压缩,打包和备份
8.1 压缩文件的用途和技术
- 很多情况下文件太大导致使用不方便,这时候就可以使用文件压缩技术
- 考虑到计算机的二进制,我们在内存空间中存下数字1,其实是一个字节存了数据1,其余7个字节全为0,这样就会造成内存空间的浪费。
- 有两种常见的压缩技术,一种是将上述的0的空间去掉,将所有内容“挤压”在一起;第二种是记录共有“100个1”。压缩后与压缩的文件所占用的磁盘空间大小,可以被称为是压缩比。
8.2 Linux系统常见的压缩指令
- 在linux的环境中,压缩文件的扩展名大多是:*.tar,*.tar.gz,*.tgz,*.gz,*.Z,*.bz2,*xz。
- 有这么多扩展名的原因是Linux支持的压缩指令非常多,而且不同的指令所用的压缩技术并不相同,当然彼此之间可能就无法互通压缩/解压缩文件案了。
- Linux上常见的压缩指令就是gzip,bzip以及最新的xz
- 下面介绍gzip的使用方法
-
当使用gzip进行压缩时,在预设的状态下原本的文件会被压缩成为*.gz*的档名,源文件就不存在了,这一点和windows系统下压缩的情况不同。此外,使用gzip压缩的文件在windows系统中,还可以被WinRAR/7zip这个软件解压缩
-
cat/more/less可以使用不同方式来读取纯文本档,而zcat/zmore/zless则可以对应于cat/more/less的方式来读取纯文本档被压缩后的压缩文件。由于gzip这个压缩指令主要是想用来取代compress的,所以不但compress的压缩文件案可以使用gzip来解开,同时zcat这个指令也可以同时读取compress于gzip的压缩文件。znew可以将**.Z文件转成gzip**的格式。
-
另外,如果想要从文字压缩文件当中找数据的话,可以透过egrep来搜寻关键词。而不需要将压缩文件解开才以grep进行。这对查询备份中的文本文件数据相当有用。
-
如果说gzip是为了取代compress并提供更好的压缩比而成立的,那么bzip2就是为了取代gzip并提供更加的压缩比而来的。bzip2的压缩比比gzip还要好。其用法也和gzip相差不大:
- xz是压缩比更高的软件
- 这个软件的压缩比会前面两种好得多,但是运算时间也比前面的久很多。所以,如果不考虑时间成本,使用xz会比较好,但是如果时间紧急,gzip恐怕才是最好的选择。
8.3 打包指令:tar
- 前面谈到的指令可以针对单一文件来进行压缩,虽然gzip,bzip2,xz也能够针对目录来进行压缩,不过,这两个指令对目录的压缩值得是
将目录内的所有文件“分别”进行压缩
的动作。而不像在Windows的系统,可以使用类似WinRAR这一类的压缩软件来将好多数据“包成一个文件”的样式。 - 这样将多个文件或目录包成一个大文件的指令功能,我们可以称他为“打包指令”。在Linux中,这样的打包指令就是tar。tar可以将多个目录或文件打包成一个大文件,同时还可以透过gzip/bzip2/xz的支持,将该文件进行压缩。在Windows系统上的WinRAR也支持**.tar.gz**档名的解压缩。
- tar的选项与参数非常的多,下面是几个常用的选项,更多选项可以man tar查询。
- 其实最简单的使用方式只需要记住下面的方式:
压 缩:tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称
查 询:tar -jtv -f filename.tar.bz2
解压缩:tar -jxv -f filename.tar.bz2 -C 要解压缩的目录
- 其中filename.tar.bz2是我们自己取的档名,tar不会主动产生建立的档名。如果不加
-z|-j|-J
的话,档名最好取为***.tar即可。如果是-j
选项,代表有bzip2的支持,因此档名最好就取为*.tar.bz2**;如果是-z
就是加上了gzip的支持,那么档名最好取为***.tar.gz**。
8.4 XFS 文件系统的备份与还原
- 使用tar通常是针对目录树系统来进行备份的工作,那么如果想要针对整个文件系统来进行备份与还原呢
XFS 文件系统备份 xfsdump
- 其实xfsdump的功能很强,他除了可以进行文件系统的完整备份(full backup)之外,还可以进行累积备份(Incremental backup)。那么累积备份又是什么呢?假设**/home是一个独立的文件系统,那在第一次使用xfsdump进行完整备份后,等过一段事件的文件系统自然运作后,你再进行第二次xfsdump**时,就可以选择累积备份了。此时新备份的数据只会记录与第一次完整备份所有差异的文件而已。
- 如图,上方的“实时文件系统”是一直随着时间而变化的数据,例如在**/home里面的文件数据会一直变化一样。而底下的方块则是xfsdump备份起来的数据,第一次备份一定是完整备份,完整备份在xfsdump中被定义为 level 0。等到第二次备份时,/home文件系统内的数据已经与level 0不一样了,而level 1仅只是比较目前的文件系统与level 0之间的差异后,备份有变化过的文件而已。level 2是与level 1进行比较。各个level的记录文件则放置于/var/lib/xfsdump/inventory**中。
- 另外,使用xfsdump时,要注意以下的限制:
xfsdump不支持没有挂载的文件系统备份
xfsdump必须使用root权限才能操作
xfsdump只能备份XFS文件系统
xfsdump备份下来的数据(文件或储存媒体)只能让xfsrestore解析
xfsdump是透过文件系统的UUID来分辨各个备份档的,因此不能备份两个具有相同UUID的文件系统
- xfsdump的使用虽然非常的繁复,不过如果只是要进行简单操作时,只需记得以下几个选项:
xfsdump [-L S_label] [-M M_label] [-l #] [-f] 待备份资料
xfsdump -I
XFS 文件系统还原 xfsrestore
- 备份文件就是在急用时可以恢复系统的重要数据,所以有备份自然要有复原了。xfsdump的复原使用的是xfsrestore这个命令。
8.5 光盘写入工具
- 刻录行为通常的做法是这样的:
- 先将所需要备份的数据建置成为一个映像档(iso),利用mkisofs指令来处理
- 将该映像文件刻录至光盘或DVD当中,利用cdrecord来处理
mkisofs:建立映像档
- mkisofs的使用方法如下:
- 其实mkisofs有非常多的选项可以选择,不过如果我们只是想制作数据光盘时,上述的选项也够用了。光盘的格式一般称为
iso9660
,这种格式一般仅支持旧版的DOS檔名,檔名只能以8.3(文件名8个字符、扩展名3个字符)的方式存在。如果加上-r
这个选项之后,那么文件的信息能够被记录地比较完整,可包括UID/GID与权限等等。所以要记得加上-r
的选项。 - 此外,一般预设情况下,所有要被加到映像档中的文件都会被放置到映像文件中的根目录,如此一来可能会造成刻录后的文件不易分类的情况。所以,也可以使用
-graft-point
这个选项,当你使用了这个选项之后,可以用以下的方法来定义位于映像文件中的目录,例如:- 映像文件中的目录所在=实际Linux文件系统的目录所在
/movies/=/srv/movies/
在Linux的/srv/movies/内的文件,加至映像文件中的/movies/目录/linux/etc=/etc
将Linux中的/etc/内的所有数据备份到映像文件中的/linux/etc/目录中
cdrecord:光盘刻录工具
- 新版的CentOS7使用的是wodim这个文字界面指令来进行刻录的行为,不过为了兼容旧版的cdrecord指令,因此wodim也有连结到cdrecoed就是了。因此,还是可以使用cdrecord这个指令。
- 另外还有针对DVD的选项功能:
- driveropts=burnfree :打开 Buffer Underrun Free 的写入功能
-sao
:支持DVD-RW的格式
8.6 其他常见的压缩与备份工具
dd
- 这个dd指令最大的功效,是在于备份。因为他可以读取磁盘装置的内容(几乎是直接读取扇区“sector”),然后将整个装备备份成一个文件。他的用途有很多,我们将一些比较重要的选项:
- 其实使用dd来进行备份是很笨的方法。因为默认dd是一个一个扇区去读/写的,而且即使没有用到的扇区也会被写入备份档中。因此这个文件会变得跟原本的磁盘一模一样大。不像使用xfsdump只备份文件系统中有使用到的部分。不过,dd就是因为不理会文件系统,单纯有啥记录啥,因此不论该磁盘内的文件系统你是否认识,他都是可以备份、还原的。
cpio
- 这个指令cpio可以备份任何东西,包括装置设备文件。不过cpio有个大问题,就是他不会主动的去找文件来进行备份。所以要配合类似find等可以找到文件名的指令来告知cpio该被备份的数据在哪里。
- 我们可以发现,上述的选项与指令中怎么会没有指定需要备份的数据呢?还有哪个大于号、小于号都是什么意思。因为cpio会将数据整个显示在屏幕上,因此我们可以透过将这些屏幕的数据重新导向
>
一个新的文件。至于还原呢,就是将备份文件读进来cpio<
进行处理。- 备份:
find / | cpio -ocvB > /dev/st0
- 还原:
cpio -idvc < /dev/st0
- 备份: