(020) Linux之归档和备份

十年运维系列之基础篇 - Linux

作者:曾林 

联系:1494445739@qq.com

网站:www.jplatformx.com

版权:文章未经同意请勿转载


一、引言

      维护系统数据安全是计算机系统管理者的基本任务之一,及时创建系统文件的备份文件是维护系统数据安全的一种常用方法。即便对于非系统管理员,经常创建备份文件或是在设备之间、文件夹之间移动大文件集通常都是非常有益的。

 

二、文件压缩

      在计算领域的发展历史中,人们一直在努力实现以最小的可利用空间存储最多的数据,其中可利用空间包括内存、存储设备或者网络带宽。许多如今认为理所当然的数据服务,比如便携式音乐播放器、高清电视和带宽互联网等之所以能够存在,都应归功于有效的数据压缩技术。

      数据压缩是一个移除数据冗余信息的过程。如下例,假设有一张100*100像素的全黑图像文件,就数据压缩而言(假设每个像素占用24位,也就是3字节),该图像也会占用100*100*3=30,000字节的存储量。

      压缩算法(压缩采用的数学方法)一般分为两大类:无损压缩和有损压缩。无损压缩保留原文件中的所有数据,也就是说这种方式的压缩文件还原时,还原后的文件与原文件完全一致。而有损压缩,在压缩时为了实现更大程度的压缩而删除了某些数据信息,有损压缩文件还原时,与原文件并不是完全吻合,但是与原文件差别并不大。JPEG(图像压缩技术)和MP3(音频压缩技术)是典型的有损压缩实例。下面的讨论中,仅仅涉及无损压缩,因为计算机上的大多数数据无法容忍任何数据损失。

 

  1. gzip——文件压缩和解压缩

      gzip命令用于压缩一个或更多文件。执行命令后,原文件会被其压缩文件取代。与之相反,gunzip命令则将压缩文件还原为原文件。如下图:

      在本例中我们创建了一个名为foo.txt的文本文件,其内容为某目录所含文件的列表清单,然后运行gzip命令。于是,压缩后的文件foo.txt.gz便取代了原文件。foo.*表达式的文件,我们可以看到原文件已被压缩文件所取代,并且压缩后的文件大小差不多才是原文件的1/5。此外,我们还可以看到,压缩后的文件与原文件有着相同的权限和时间戳。接着,我们运用gunzip命令进行了解压缩,如此该压缩文件又被原始文件取代,而且权限和时间戳仍然保持一致。

      gzip有许多选项,下表列出了会经常使用的一些:

选项 功能描述
-c 将输出内容写到标准输出并且保持原有文件。也可以用--stdout和--to-stdout取代
-d 解压缩。加上此选项,gzip命令便类似于gunzip。也可以用--decompress或--uncompress替代
-f 强制压缩,即便原文件的压缩版本已经存在了。也可以使用--force替代
-h 显示有用信息
-l 列出所有压缩文件的压缩统计。也可以用--list替代
-r 如果该命令行的操作参数中有一个或多个目录,那么递归压缩包含在目录中的文件。也可以用--recursive代替
-t 检验压缩文件的完整性。也可以用--test代替
-v 在压缩时显示详细信息。也可以用--verbose代替
-number 设定压缩级别。number是1(速度最快,压缩比最小)~9(速度最慢,压缩比最大)范围中的一个整数。当然1~9的数值亦可以分别描述为--fast和--best。gzip默认压缩比为6

       查看gzip压缩后的文件内容可以使用zcat命令,zcat命令的作用与cat命令类似,只不过它可以用来显示压缩文件的内容而不用事先经过解压缩。如下图所示:

 

      2. bzip2——牺牲速度以换取高质量的数据压缩

      bzip2程序与gzip命令功能相仿,但使用不同的压缩算法。该算法具有高质量的数据压缩能力,但却降低了压缩速度。多数情况下,其用法与gzip相仿,只是用bzip2压缩后的文件是以.bz2为后缀。

      bzip2相对应的解压缩命令为bunzip2,查看压缩文件的命令是bzcat命令。

 

三、文件归档

      归档是与压缩操作配合使用的一个常用文件管理任务。归档是一个聚集众多文件并将它们组合为一个大文件的过程,它通常作为系统备份的一部分,而且通常也用于将旧数据从某个系统移到某些长期存储设备的情况下。

 

  1. tar——磁带归档工具 

      tar命令是类UNIX系统中用于归档文件的经典工具。tar是tape archive的缩写。由此可见,该命令最初的作用就是磁带备份。虽然该命令仍可用于传统的磁带备份,但同样也可用于其他存储设备。大家肯定经常看到文件名以.tar和.tgz结尾的文件,它们分别是用普通的tar命令归档的文件和用gzip归档的文件。tar归档文件可以由许多独立的文件、一个或多个目录层次或者两者的混合组合而成,其用法如下:

shell> tar mode[options] tar_file pathname...

      其中的部分mode如下表所示:

模式 描述
c 创建文件/目录列表的归档文件
x 从归档文件中提取文件
t 列出归档文件的内容
r 在归档文件末尾添加指定路径名文件

      其实针对tar的mode来说,我们只需要记住c和x即可。c用来创建归档文件,x用来提取归档文件。下面就来实际展示一下tar命令的用法。

      首先,创建100个目录,而且在每个目录下创建26个文件。命令如下:

      shell> mkdir -p foo/dir-{00{1..9},0{10..99},100}

      shell> touch foo/dir-{00{1..9},0{10..99},100}/file-{A-Z}

      下面,用tar命令为整个foo文件夹创建一个归档文件。

      shell> tar -cf foo.tar foo

      该命令创建了一个叫做foo.tar的tar归档文件,该归档文件包含了foo文件夹的整个目录结构。从命令行中可以看到,tar命令的操作模式c参数和用于指定归档文件名的f参数可以直接连着写在一起而中间不需要连字符隔开。然后,请注意,mode参数必须在任何选项之前指定。

      下面的命令行用于列出归档文件的内容,可以用来查看已经备份了哪些文件。

      shell> tar -tf foo.tar

      如想获取更详细的信息,可以增加-v选项。此选项可以列出文件的属性、权限等信息,而t模式只是列出文件或者目录名信息。

shell> tar -tvf foo.tar

现在,将归档文件foo.tar提取到foo目录下,操作如下:

shell> mkdir foo

shell> cd foo

shell> tar -xvf ../foo.tar

      此时查看foo目录下的内容,便会发现该文档文件已经成功提取,并且是原文件的精确复制。但是存在一个问题,除非是以超级用户的名义执行该命令,不然,从归档文件中提取出来的文件和目录的所有权属于执行归档操作的用户而不是文件的原始作者。

      tar命令处理档案文件路径名的方式也很有趣,其默认的路径名是相对路径而不是绝对路径,tar命令创建归档文件时会简单地通过移除路径名前面的斜杠来实现相对路径。作为演示,下面会重新创建一个归档文件,此次明确指定一个绝对路径。

shell> cd

shell> tar cvf foo.tar ~/foo

      记住,当按下enter键的时候,上面命令行中输入的目录~/foo会自动扩展为/home/me/foo,也就是绝对路径。此时,经过提取后的文件的路径就为$PWD/home/$USER/foo了。

      当从归档文件中提取文件时,可以限制只提取某些文件。例如,如果希望从归档文件中只提取单个文件,可以用如下命令行:

shell> tar xvf archive.tar pathname|filename

在命令后面添加要提取的文件的路径名,可以确保tar只恢复指定文件,而且可以指定多个路径名。

      tar命令创建归档文件时通常辅助以find命令。首先使用find命令查找到需要被归档的文件,然后使用tar对这些文件统一进行归档。实例如下:

shell> find foo -iname 'file-a' -exec tar rf foo-fileA.tar '{}' ';' 或

shell> find foo -iname 'file-a' -exec tar rf foo-fileA.tar '{}' '+' 或

shell> find foo -iname 'file-a' | xargs tar -cvf foo-fileA.tar

      tar命令结合find命令很适应创建目录树以及整个系统的增量备份,使用find命令找到那些在时间文件之后创建的文件,便可以创建一份只包含上一次归档之后创建的文件的归档文件,当然假定该时间戳文件是在每一个归档文件创建之后就立刻更新。

      虽然可以从外部使用gzip命令创建压缩归档文件,但tar命令已经提供了gzip的+z选项和bzip2+j选项来集成gzip和bzip2压缩功能了。这样的话,制作压缩归档文件就可以直接使用下列命令:

shell> tar czf foo.tar.gz foo 或

shell> tar czf foo.tgz foo 或

shell> tar cjf foo.bz2 foo 或

shell> tar cjf foo.tbz foo

 

      2. zip——打包压缩文件

      zip程序既是文件压缩工具也是文件归档工具。win用户肯定很熟悉这种文件格式,因为其读写的是.zip后缀的文件。然而,Linux系统中,gzip才是主要的压缩指令,bzip2次之。Linux用户主要使用zip程序与windows系统交换文件,而不是将其用于压缩或是归档文件。

      zip最基本的调用方式如下:

      shell> zip options zipfile file...

      例如,创建一个foo的zip归档文件,可以输入下面的命令行:

      shell> zip -r foo.zip foo

      此例中,如果不加-r选项递归的话,只会保留foo这个目录而不包含目录中内容。虽然程序会自动默认添加后缀.zip,但是为了清晰,最好还是在命令行中添加文件后缀。

      利用unzip可以提取zip中的文件。使用方法如下:

      shell> unzip -lv zipfile filepath

      注:这里的l选项作用是列出zipfile中路径名为filepath文件的信息,但并不从zip文档中提取出来。v选项的作用是显示提取文件内容的更加详细的信息。如下图所示:

 

四、同步文件和目录

      将一个或多个目录与本地系统(通常是某种可移动存储设备)或是远程系统上其他的目录保持同步,是维护系统备份文件的常用方法。例如,本地系统上有一个正在开发的网站备份,用户通常会在远程Web服务器上进行“实时”备份以实现同步更新。

  1. rsync——远程文件、目录的同步

      针对类UNIX操作系统,完成这一同步任务最合适的工具当属rsync。该命令通过运用rsync远程更新协议,同步本地系统与远程系统上的目录,该协议允许rsync命令快速检测到本地和远程系统上两个目录之间的不同,从而以最少数量的复制动作以完成两个目录之间的同步。因此,rsync命令与其他复制命令相比,显得既快又经济。

      rsync命令调用方式如下:

      shell> rsync options source destination

      这里的source和destination是下列选项之一:

  • 一个本地文件或目录
  • 一个远程文件或目录,形式为[user@]host:path
  • 一个远程rsync服务器,由rsync://[user@]host[:port]/path指定

      请注意:source和destination中必须有一个本地文件,因为rsync不支持远程系统与远程系统之间的复制。我们现在在本地文件系统上实践一下rsync命令,如下图所示:

      此命令行中,我们运用了-a(用于归档-进行递归归档并保留文件属性)选项。当然也可以加上-v选项来查看同步明细信息。

      再次运行该命令,会得到不同的结果。如下图所示:

      请注意,此时并不会列出文件列表。因为rsync命令检测出tmp和tmp_bak两个文件夹之间并没有区别,因为不需要进行任何复制操作。如果tmp目录中某个文件被修改了,那么rsync会检测到该变化并且只复制这个刚刚更新的文件。

      另外需要注意rsync另外一个选项--delete,它的作用以移除那些残留于备份设备中而源设备中已经不存在的文件(这一步骤在第一次备份的时候无关紧要,但是在后续的复制操作中会起作用)。重复插入该外围设备并运行rsync命令,对于小型系统来说,这是一个持续备份的好(虽然不是完美的)方法。当然,如果此处使用别名会更加方便。于是我们可以定义一个别名,然后将其添加到.bashrc文件中,以提供该备份功能。命令如下:

      shell> alias buckup="rsync -av --delete source target"

      以后如果要再同步此目录时,直接在shell环境中运行backup即可。

 

      2. 在网络上使用rsync命令

      通过网络复制文件是rsync用法的另一个美妙之处。毕竟,rsync命令名中的r其实指的就是remote(远程)。远程复制的命令与本地文件或目录并不大,只是多加了远程主机的前导而已。命令如下:

      shell> rsync -av --delete user@host:/path/rsync_dir target

 

posted @ 2015-03-07 19:09  jplatformx  阅读(671)  评论(0编辑  收藏  举报