[笔记]快乐的Linux命令行《十九》归档和备份

57 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情

前言

计算机系统管理员的一个主要任务就是保护系统的数据安全。一种方法是通过时时备份系统文件,来保护数据。即使你不是一名系统管理员,复制东西,在各个位置和设备之间移动大量的文件,也是很有帮助的。在这一章中,我们将会看看几个经常用来管理文件集合的程序。

它们就是文件压缩程序:

  • gzip –压缩或者展开文件

  • bzip2 –块排序文件压缩器

归档程序:

  • tar –磁带打包工具

  • zip –打包和压缩文件

还有文件同步程序:

  • rsync –同步远端文件和目录

一、归档和备份

数据压缩就是一个删除冗余数据的过程。 压缩算法(数学技巧被用来执行压缩任务)分为两大类,

  • 无损压缩
  • 有损压缩

无损压缩保留了原始文件的所有数据。

这意味着,当还原一个压缩文件的时候,还原的文件与原文件一模一样。而另一方面,有损压缩,执行压缩操作时会删除数据,允许更大的压缩。当一个有损文件被还原的时候,它与原文件不相匹配; 相反,它是一个近似值。有损压缩的例子有 JPEG(图像)文件和 MP3(音频)文件。在我们的讨论中,我们将看看完全无损压缩,因为计算机中的大多数数据是不能容忍丢失任何数据的。

1.1 压缩文件

这个 gzip 程序被用来压缩一个或多个文件。

当执行 gzip 命令时,则原始文件的压缩版会替代原始文件。

相对应的 gunzip 程序被用来把压缩文件复原为没有被压缩的版本。

我们运行 gunzip 程序来解压缩文件。随后,我们能见到压缩文件已经被原始文件替代了,同样地保留了相同的权限和时间戳。

压缩命令 gzip命令

image.png

解压命令 gunzip命令

这个 gunzip 程序,会解压缩 gzip 文件,假定那些文件名的扩展名是.gz,所以没有必要指定它,只要指定的名字与现有的未压缩文件不冲突就可以:

不要强迫性压缩 我偶然见到人们试图用高效的压缩算法,来压缩一个已经被压缩过的文件,

通过这样做: $ gzip picture.jpg

不要这样。

你可能只是在浪费时间和空间!如果你再次压缩已经压缩过的文件,实际上你会得到一个更大的文件。这是>因为所有的压缩技术都会涉及一些开销,文件中会被添加描述此次压缩过程的信息。如果你试图压缩一个已经不包含多>余信息的文件,那么再次压缩不会节省空间,以抵消额外的花费。

1.2 归档文件

个常见的,与文件压缩结合一块使用的文件管理任务是归档。归档就是收集许多文件,并把它们捆绑成一个大文件的过程。归档经常作为系统备份的一部分来使用。当把旧数据从一个系统移到某种类型的长期存储设备中时,也会用到归档程序。

在类似于 Unix 的软件世界中,这个 tar 程序是用来归档文件的经典工具。

它的名字,是tape archive 的简称,揭示了它的根源,它是一款制作磁带备份的工具。

而它仍然被用来完成传统任务,它也同样适用于其它的存储设备。

我们经常看到扩展名为.tar 或者.tgz 的文件,它们各自表示“普通”的 tar 包和被 gzip 程序压缩过的 tar 包。一个 tar 包可以由一组独立的文件,一个或者多个目录,或者两者混合体组成。

压缩命令语法如下:

tar [-z|-j|-J] -c [-v] [-f ] 目标文件名 源文件

解压命令语法如下:

tar [-z|-j|-J] -x [-v] [-f ] 待加压文件名 [-C 目录]

这里的 mode 是指以下操作模式(这里只展示了一部分,查看 tar 的手册来得到完整列表)之一:

image.png

1.3 同步文件和目录

维护系统备份的常见策略是保持一个或多个目录与另一个本地系统(通常是某种可移动的存储设备)或者远端系统中的目录(或多个目录)同步。

我们可能,例如有一个正在开发的网站的本地备份,需要时不时的与远端网络服务器中的文件备份保持同步。

在类似于 Unix 系统的世界里,能完成此任务且备受人们喜爱的工具是 rsync这个程序能同步本地与远端的目录。

通过使用 rsync 远端更新协议,此协议允许 rsync 快速地检测两个目录的差异,执行最小量的复制来达到目录间的同步。比起其它种类的复制程序,这就使 rsync 命令非常快速和高效。

rsync 被这样唤醒: 这里 source 和 destination 是下列选项之一:

  • 一个本地文件或目录
  • 一个远端文件或目录,以 [user@]host:path 的形式存在
  • 一个远端 rsync 服务器,由 rsync://[user@]host[:port]/path 指定 注意 source 和 destination 两者之一必须是本地文件。

rsync 不支持远端到远端的复制

在网络间使用 rsync 命令

rsync 程序的真正好处之一,是它可以被用来在网络间复制文件。毕竟,rsync 中的“r”象征着“remote”。远程复制可以通过两种方法完成。

第一个方法要求另一个系统已经安装了rsync 程序,还安装了远程 shell 程序,比如 ssh。比方说我们本地网络中的一个系统有大量可用的硬盘空间,我们想要用远程系统来代替一个外部驱动器,来执行文件备份操作。

假定远程系统中有一个名为/backup 的目录,其用来存放我们传送的文件,我们这样做:

[me@linuxbox ~]$ sudo rsync -av --delete --rsh=ssh /etc /home /usr/local remote-sys:/backup

我们对命令做了两处修改,来方便网络间文件复制。

首先,我们添加了 --rsh=ssh 选项,其指示 rsync 使用 ssh 程序作为它的远程 shell。以这种方式,我们就能够使用一个 ssh 加密通道,把数据安全地传送到远程主机中。

其次,通过在目标路径名前加上远端主机的名字(在这种情况下,远端主机名为 remote-sys),来指定远端主机。

rsync 可以被用来在网络间同步文件的第二种方式是通过使用 rsync 服务器。rsync 可以被配置为一个守护进程,监听即将到来的同步请求。这样做经常是为了允许一个远程系统的镜像。例如,Red Hat 软件中心为它的 Fedora 发行版,维护着一个巨大的正在开发中的软件包的仓库。

对于软件测试人员,在发行周期的测试阶段,镜像这些软件集合是非常有帮助的。因为仓库中的这些文件会频繁地(通常每天不止一次)改动,定期同步本地镜像,这是可取的,而不是大量地拷贝软件仓库。

这些软件库之一被维护在 Georgia Tech;我们可以使用本地rsync 程序和它们的 rsync 服务器来镜像它。

[me@linuxbox ~]$ mkdir fedora-devel

[me@linuxbox ~]$ rsync -av -delete rsync://rsync.gtlib.gatech.edu/fedora-linux

core/development/i386/os fedora-devel

在这个例子里,我们使用了远端 rsync 服务器的 URI,其由协议(rsync://远端主机名(rsync.gtlib.gatech.edu),和软件仓库的路径名组成。

总结