蚊章汇 - rsync
type: channel
link: https://linuxcn.bwsl.wang/tag/rsync/
items: scp 用户的 rsync 迁移指南
items: 使用 rsync 复制大文件的一些误解
items: 如何使用 rsync 的高级用法进行大型备份
items: 如何使用 rsync 通过 SSH 恢复部分传输的文件
items: 如何在使用 scp 命令时递归地排除文件
items: rdiff-backup：一个 Linux 中的远程增量备份工具
items: 使用 rsync 来备份 Linux 系统
items: Shell脚本：使用rsync备份文件/目录
items: 为LUKS加密的磁盘/分区做增量备份
items: Linux中使用rsync——文件和目录排除列表

scp 用户的 rsync 迁移指南
type: item
date: 2020-09-03T18:30:08+08:00
description: 在 SSH 8.0 预发布公告中，OpenSSH 项目表示，他们认为 scp 协议已经过时，不灵活，而且不容易修复，然后他们继而推荐使用 sftp 或 rsync 来进行文件传输。然而，很多用户都是从小用着 scp 命令长大的，所以对 rsync 并不熟悉。此外，rsync 可以做的事情也远不止复制文件，这可能会给菜鸟们留下复杂和难以掌握的印象。尤其是，scp 命令的标志大体上可以直接对应到 cp 命令的标志，而 rsync 命令的标志却和它大相径庭。本文将为熟悉 scp 的人提供一个介绍和过渡的指南。让我们跳进最常见的场景：复制文件和复制目录。复制文件对于复制单个文件而言，scp 和 rsync 命令实际上是等价的。比方说，你需要把 foo.txt 传到你在名为 server 的服务器上的主目录下：$ scp foo.txt me@server:/home/me/ 相应的 rsync 命令只需要输入 rsync 取代 scp：$ rsync foo.txt me@server:/home/me/ 复制目录对于复制目录，就有了很大的分歧，这也解释了为什么 rsync 会被认为比 scp 更复杂。如果你想把 bar 目录复制到 server 服务器上，除了指定 ssh 信息外，相应的 scp 命令和 cp 命令一模一样。$ scp -r bar/ me@server:/home/me/ 对于 rsync，考虑的因素比较多，因为它是一个比较强大的工具。首先，我们来看一下最简单的形式：$ rsync -r bar/ me@server:/home/me/ 看起来很简单吧？对于只包含目录和普通文件的简单情况，这就可以了。然而，rsync 更在意发送与主机系统中一模一样的文件。让我们来创建一个稍微复杂一些，但并不罕见的例子：# 创建多级目录结构 $ mkdir -p bar/baz # 在其根目录下创建文件 $ touch bar/foo.txt # 现在创建一个符号链接指回到该文件 $ cd bar/baz $ ln -s ../foo.txt link.txt # 返回原位置 $ cd - 现在我们有了一个如下的目录树：bar ├── baz │ └── link.txt -> ../foo.txt └── foo.txt 1 directory, 2 files 如果我们尝试上面的命令来复制 bar，我们会注意到非常不同的（并令人惊讶的）结果。首先，我们来试试 scp：$ scp -r bar/ me@server:/home/me/ 如果你 ssh 进入你的服务器，看看 bar 的目录树，你会发现它和你的主机系统有一个重要而微妙的区别：bar ├── baz │ └── link.txt └── foo.txt 1 directory, 2 files 请注意，link.txt 不再是一个符号链接，它现在是一个 foo.txt 的完整副本。如果你习惯于使用 cp，这可能会是令人惊讶的行为。如果你尝试使用 cp -r 复制 bar 目录，你会得到一个新的目录，里面的符号链接和 bar 的一样。现在如果我们尝试使用之前的 rsync 命令，我们会得到一个警告：$ rsync -r bar/ me@server:/home/me/ skipping non-regular file "bar/baz/link.txt" rsync 警告我们它发现了一个非常规文件，并正在跳过它。因为你没有告诉它可以复制符号链接，所以它忽略了它们。rsync 在手册中有一节“符号链接”，解释了所有可能的行为选项。在我们的例子中，我们需要添加 -links 标志：$ rsync -r --links bar/ me@server:/home/me/ 在远程服务器上，我们看到这个符号链接是作为一个符号链接复制过来的。请注意，这与 scp 复制符号链接的方式不同。bar/ ├── baz │ └── link.txt -> ../foo.txt └── foo.txt 1 directory, 2 files 为了省去一些打字工作，并利用更多的文件保护选项，在复制目录时可以使用归档标志 -archive（简称 -a）。该归档标志将做大多数人所期望的事情，因为它可以实现递归复制、符号链接复制和许多其他选项。$ rsync -a bar/ me@server:/home/me/ 如果你感兴趣的话，rsync 手册页有关于存档标志的深入解释。注意事项不过，使用 rsync 有一个注意事项。使用 scp 比使用 rsync 更容易指定一个非标准的 ssh 端口。例如，如果 server 使用 8022 端口的 SSH 连接，那么这些命令就会像这样：$ scp -P 8…

使用 rsync 复制大文件的一些误解
type: item
date: 2019-10-02T21:40:00+08:00
description: 有一种观点认为，在 IT 行业工作的许多人经常从网络帖子里复制和粘贴。我们都干过，复制粘贴本身不是问题。问题是当我们在不理解它们的情况下这样干。几年前，一个曾经在我团队中工作的朋友需要将虚拟机模板从站点 A 复制到站点 B。他们无法理解为什么复制的文件在站点 A 上为 10GB，但是在站点 B 上却变为 100GB。这位朋友认为 rsync 是一个神奇的工具，应该仅“同步”文件本身。但是，我们大多数人所忘记的是了解 rsync 的真正含义、用法，以及我认为最重要的是它原本是用来做什么的。本文提供了有关 rsync 的更多信息，并解释了那件事中发生了什么。关于 rsyncrsync 是由 Andrew Tridgell 和 Paul Mackerras 创建的工具，其动机是以下问题：假设你有两个文件，file_A 和 file_B。你希望将 file_B 更新为与 file_A 相同。显而易见的方法是将 file_A 复制到 file_B。现在，假设这两个文件位于通过慢速通信链接（例如，拨号 IP 链接）连接的两个不同的服务器上。如果file_A 大，将其复制到 file_B 将会很慢，有时甚至是不可能完成的。为了提高效率，你可以在发送前压缩 file_A，但这通常只会获得 2 到 4 倍的效率提升。现在假设 file_A 和 file_B 非常相似，并且为了加快处理速度，你可以利用这种相似性。一种常见的方法是仅通过链接发送 file_A 和 file_B 之间的差异，然后使用这个差异列表在远程端重建文件。问题在于，用于在两个文件之间创建一组差异的常规方法依赖于能够读取两个文件。因此，它们要求链接的一端预先提供两个文件。如果它们在同一台计算机上不是同时可用的，则无法使用这些算法。（一旦将文件复制过来，就不需要做对比差异了）。而这是 rsync 解决的问题。rsync 算法有效地计算源文件的哪些部分与现有目标文件的部分匹配。这样，匹配的部分就不需要通过链接发送了；所需要的只是对目标文件部分的引用。只有源文件中不匹配的部分才需要发送。然后，接收者可以使用对现有目标文件各个部分的引用和原始素材来构造源文件的副本。另外，可以使用一系列常用压缩算法中的任何一种来压缩发送到接收器的数据，以进一步提高速度。我们都知道，rsync 算法以一种漂亮的方式解决了这个问题。在 rsync 的介绍之后，回到那件事！问题 1：自动精简配置有两件事可以帮助那个朋友了解正在发生的事情。该文件在其他地方的大小变得越来越大的问题是由源系统上启用了 自动精简配置 Thin Provisioning （TP）引起的，这是一种优化存储区域网络（SAN）或网络连接存储（NAS）中可用空间效率的方法。由于启用了 TP，源文件只有 10GB，并且在不使用任何其他配置的情况下使用 rsync 进行传输时，目标位置将接收到全部 100GB 的大小。rsync 无法自动完成该（TP）操作，必须对其进行配置。进行此工作的选项是 -S（或 –sparse），它告诉 rsync 有效地处理稀疏文件。它会按照它说的做！它只会发送该稀疏数据，因此源和目标将有一个 10GB 的文件。问题 2：更新文件当发送一个更新的文件时会出现第二个问题。现在目标仅接收 10GB 了，但始终传输的是整个文件（包含虚拟磁盘），即使只是在该虚拟磁盘上更改了一个配置文件。换句话说，只是该文件的一小部分发生了更改。用于此传输的命令是：rsync -avS vmdk_file syncuser@host1:/destination同样，了解 rsync 的工作方式也将有助于解决此问题。上面是关于 rsync 的最大误解。我们许多人认为 rsync 只会发送文件的增量更新，并且只会自动更新需要更新的内容。但这不是 rsync 的默认行为。如手册页所述，rsync 的默认行为是在目标位置创建文件的新副本，并在传输完成后将其移动到正确的位置。要更改 rsync 的默认行为，你必须设置以下标志，然后 rsync 将仅发送增量：--inplace 原地更新目标文件 --partial 保留部分传输的文件 --append 附加数据到更短的文件 --progress 在传输时显示进度条因此，可以确切地执行我那个朋友想要的功能的完整命令是：rsync -av --partial --inplace --append --progress vmdk_file syncuser@host1:/destination注意，出于两个原因，这里必须删除稀疏选项 -S。首先是通过网络发送文件时，不能同时使用 –sparse 和 –inplace。其次，当你以前使用过 –sparse 发送文件时，就无法再使用 –inplace 进行更新。请注意…

如何使用 rsync 的高级用法进行大型备份
type: item
date: 2019-05-17T07:15:33+08:00
description: 基础的 rsync 命令通常足够来管理你的 Linux 备份，但是额外的选项使大型备份集更快、更强大。很明显，备份一直是 Linux 世界的热门话题。回到 2017，David Both 为 Opensource.com 的读者在使用 rsync 备份 Linux 系统方面提了一些建议，在这年的更早时候，他发起了一项问卷调查询问大家，在 Linux 中你的 /home 目录的主要备份策略是什么，在今年的另一个问卷调查中，Don Watkins 问到，你使用哪种开源备份解决方案。我的回复是 rsync。我真的非常喜欢 rsync！市场上有大量大而复杂的工具，对于管理磁带机或者存储库设备，这些可能是必要的，但是可能你需要的只是一个简单的开源命令行工具。rsync 基础我为一个大概拥有 35,000 开发者并有着几十 TB 文件的全球性机构管理二进制仓库。我经常一次移动或者归档上百 GB 的数据。使用的是 rsync。这种经历使我对这个简单的工具充满信心。（所以，是的，我在家使用它来备份我的 Linux 系统）基础的 rsync 命令很简单。rsync -av 源目录 目的地目录实际上，在各种指南中教的 rsync 命令在大多数通用情况下都运行的很好。然而，假设我们需要备份大量的数据。例如包含 2,000 个子目录的目录，每个包含 50GB 到 700GB 的数据。在这个目录运行 rsync 可能需要大量时间，尤其是当你使用校验选项时（我倾向使用）。当我们试图同步大量数据或者通过慢的网络连接时，可能遇到性能问题。让我给你展示一些我使用的方法来确保好的性能和可靠性。rsync 高级用法rsync 运行时出现的第一行是：“正在发送增量文件列表。” 如果你在网上搜索这一行，你将看到很多类似的问题：为什么它一直运行，或者为什么它似乎挂起了。这里是一个基于这个场景的例子。假设我们有一个 /storage 的目录，我们想要备份到一个外部 USB 磁盘，我们可以使用下面的命令：rsync -cav /storage /media/WDPassport-c 选项告诉 rsync 使用文件校验和而不是时间戳来决定改变的文件，这通常消耗的时间更久。为了分解 /storage 目录，我通过子目录同步，使用 find 命令。这是一个例子：find /storage -type d -exec rsync -cav {} /media/WDPassport \;这看起来可以，但是如果 /storage 目录有任何文件，它们将被跳过。因此，我们如何同步 /storage 目录中的文件呢？同样有一个细微的差别是这些选项将造成 rsync 会同步 . 目录，该目录是源目录自身；这意味着它会同步子目录两次，这并不是我们想要的。长话短说，我的解决方案是一个 “双-递增”脚本。这允许我分解一个目录，例如，当你的家目录有多个大的目录，例如音乐或者家庭照片时，分解 /home 目录为单个的用户家目录。这是我的脚本的一个例子：HOMES="alan" DRIVE="/media/WDPassport" for HOME in $HOMES; do cd /home/$HOME rsync -cdlptgov --delete . /$DRIVE/$HOME find . -maxdepth 1 -type d -not -name "." -exec rsync -crlptgov --delete {} /$DRIVE/$HOME \; done第一个 rsync 命令拷贝它在源目录中发现的文件和目录。然而，它将目录留着不处理，因此我们能够通过 find 命令迭代它们。这通过传递 -d 参数来完成，它告诉 rsync 不要递归目录。-d, --dirs 传输目录而不递归然后 find 命令传递每个目录来单独运行 rsync。之后 rsync 拷贝目录的内容。这通过传递 -r 参数来完成，它告诉 rsync 要递归目录。-r, --recursive 递归进入目录这使得 rsync 使用的增量文件保持在一个合理的大小。大多数 rsync 指南为了简便使用 -a （或者 archive） 参数。这实际是一个复合参数。-a, --archive 归档模式；等价于 -rlptgoD（没有 -H,-A,-X）我传递的其他参数包含在 a 中；这些是 -l、-p、-t、-g和 -o。-l, --links 复制符号链接作为符号链接 -p, --perms 保留权限 -t, --times 保留修改时间 -g, --group 保留组 -o, --owner 保留拥有者（只适用于超级管理员）--delete 选项告诉 rsync 删除目的地目录中所有在源目录不存在的任意文件。这种方式，运行…

如何使用 rsync 通过 SSH 恢复部分传输的文件
type: item
date: 2018-05-03T05:36:09+08:00
description: 由于诸如电源故障、网络故障或用户干预等各种原因，使用 scp 命令通过 SSH 复制的大型文件可能会中断、取消或损坏。有一天，我将 Ubuntu 16.04 ISO 文件复制到我的远程系统。不幸的是断电了，网络连接立即断了。结果么？复制过程终止！这只是一个简单的例子。Ubuntu ISO 并不是那么大，一旦电源恢复，我就可以重新启动复制过程。但在生产环境中，当你在传输大型文件时，你可能并不希望这样做。而且，你不能继续使用 scp 命令恢复被中止的进度。因为，如果你这样做，它只会覆盖现有的文件。这时你会怎么做？别担心！这是 rsync 派上用场的地方！rsync 可以帮助你恢复中断的复制或下载过程。对于那些好奇的人，rsync 是一个快速、多功能的文件复制程序，可用于复制和传输远程和本地系统中的文件或文件夹。它提供了大量控制其各种行为的选项，并允许非常灵活地指定要复制的一组文件。它以增量传输算法而闻名，它通过仅发送源文件和目标中现有文件之间的差异来减少通过网络发送的数据量。 rsync 广泛用于备份和镜像，以及日常使用中改进的复制命令。就像 scp 一样，rsync 也会通过 SSH 复制文件。如果你想通过 SSH 下载或传输大文件和文件夹，我建议您使用 rsync。请注意，应该在两边（远程和本地系统）都安装 rsync 来恢复部分传输的文件。使用 rsync 恢复部分传输的文件好吧，让我给你看一个例子。我将使用命令将 Ubuntu 16.04 ISO 从本地系统复制到远程系统：$ scp Soft_Backup/OS\ Images/Linux/ubuntu-16.04-desktop-amd64.iso sk@192.168.43.2:/home/sk/ 这里，sk是我的远程系统的用户名192.168.43.2 是远程机器的 IP 地址。现在，我按下 CTRL+C 结束它。示例输出：sk@192.168.43.2's password: ubuntu-16.04-desktop-amd64.iso 26% 372MB 26.2MB/s 00:39 ETA^c 正如你在上面的输出中看到的，当它达到 26％ 时，我终止了复制过程。如果我重新运行上面的命令，它只会覆盖现有的文件。换句话说，复制过程不会在我断开的地方恢复。为了恢复复制过程，我们可以使用 rsync 命令，如下所示。$ rsync -P -rsh=ssh Soft_Backup/OS\ Images/Linux/ubuntu-16.04-desktop-amd64.iso sk@192.168.43.2:/home/sk/ 示例输出：sk@192.168.1.103's password: sending incremental file list ubuntu-16.04-desktop-amd64.iso 380.56M 26% 41.05MB/s 0:00:25 看见了吗？现在，复制过程在我们之前断开的地方恢复了。你也可以像下面那样使用 -partial 而不是 -P 参数。$ rsync --partial -rsh=ssh Soft_Backup/OS\ Images/Linux/ubuntu-16.04-desktop-amd64.iso sk@192.168.43.2:/home/sk/ 这里，参数 -partial 或 -P 告诉 rsync 命令保留部分下载的文件并恢复进度。或者，我们也可以使用以下命令通过 SSH 恢复部分传输的文件。$ rsync -avP Soft_Backup/OS\ Images/Linux/ubuntu-16.04-desktop-amd64.iso sk@192.168.43.2:/home/sk/ 或者，rsync -av --partial Soft_Backup/OS\ Images/Linux/ubuntu-16.04-desktop-amd64.iso sk@192.168.43.2:/home/sk/ 就是这样了。你现在知道如何使用 rsync 命令恢复取消、中断和部分下载的文件。正如你所看到的，它也不是那么难。如果两个系统都安装了 rsync，我们可以轻松地通过上面描述的那样恢复复制的进度。如果你觉得本教程有帮助，请在你的社交、专业网络上分享，并支持我们。还有更多的好东西。敬请关注！干杯!via: https://www.ostechnix.com/how-to-resume-partially-downloaded-or-transferred-files-using-rsync/作者：SK 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出

如何在使用 scp 命令时递归地排除文件
type: item
date: 2018-01-30T19:35:00+08:00
description: Q：我需要将所有包含 *.c 文件的文件夹从名为 hostA 的本地笔记本复制到 hostB。我使用的是下面的 scp 命令，但不知道如何排除特定的文件（如 *.out）：$ scp -r ~/projects/ user@hostB:/home/delta/projects/ 如何告诉 scp 命令在 Linux/Unix 命令行中排除特定的文件或目录？人们可以使用 scp 命令在网络主机之间安全地复制文件。它使用 ssh 进行数据传输和身份验证。典型的语法是：scp file1 user@host:/path/to/dest/ scp -r /path/to/source/ user@host:/path/to/dest/ scp 排除文件我不认为你可以在使用 scp 命令时过滤或排除文件。但是，有一个很好的解决方法来排除文件并使用 ssh 安全地复制它。本页面说明如何在使用 scp 递归复制目录时过滤或排除文件。如何使用 rsync 命令排除文件语法是：rsync av -e ssh --exclude='*.out' /path/to/source/ user@hostB:/path/to/dest/ 这里：-a ：递归到目录，即复制所有文件和子目录。另外，打开归档模式和所有其他选项（相当于 -rlptgoD）-v ：详细输出-e ssh ：使用 ssh 作为远程 shell，这样所有的东西都被加密--exclude='*.out' ：排除匹配模式的文件，例如 *.out 或 *.c 等。rsync 命令的例子在这个例子中，从 ~/virt/ 目录递归地复制所有文件，但排除所有 *.new 文件：$ rsync -av -e ssh --exclude='*.new' ~/virt/ root@centos7:/tmp 示例输出：如果远程服务器上找不到 rsync，那么 rsync 命令将失败。在这种情况下，请尝试使用以下 scp 命令，该命令在当前目录中使用 bash shell 模式匹配 （它不能与 -r 选项一起使用）：$ ls 示例输出：centos71.log centos71.qcow2 centos71.qcow2.new centos71.v2.qcow2.new meta-data user-data 复制除 .new 之外的当前目录中的所有内容：$ shopt -s extglob $ scp !(*.new) root@centos7:/tmp/ 示例输出：centos71.log 100 % 4262 1.3MB/s 00:00 centos71.qcow2 100 % 836MB 32.7MB/s 00: 25 meta-data 100 % 47 18.5KB/s 00:00 user-data 100 % 1543 569.7KB/s 00:00 有关更多信息，请参阅以下手册页：$ man rsync $ man bash $ man scp via: https://www.cyberciti.biz/faq/scp-exclude-files-when-using-command-recursively-on-unix-linux/作者：Vivek Gite 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出

rdiff-backup：一个 Linux 中的远程增量备份工具
type: item
date: 2017-05-10T16:37:00+08:00
description: rdiff-backup 是一个用于本地/远程增量备份的强大而易用的 Python 脚本，它适用于任何 POSIX 操作系统，如Linux、Mac OS X 或 Cygwin。它集合了镜像和增量备份的显著特性。值得注意的是，它保留了子目录、dev 文件、硬链接，以及关键的文件属性，如权限、uid/gid 所有权、修改时间、扩展属性、acl 以及 resource fork。它可以通过管道以高效带宽的模式工作，这与流行的 rsync 备份工具类似。rdiff-backup 通过使用 SSH 将单个目录备份到另一个目录，这意味着数据传输被加密并且是安全的。目标目录（在远程系统上）最终会得到源目录的完整副本，但是此外的反向差异会存储在目标目录的特殊子目录中，从而可以恢复前一段时间丢失的文件。依赖要在 Linux 中使用 rdiff-backup，你需要在系统上安装以下软件包：Python v2.2 或更高版本librsync v0.9.7 或更高版本pylibacl 和 pyxattr Python 模块是可选的，但它们分别是 POSIX 访问控制列表（ACL）和扩展属性支持必需的。rdiff-backup-statistics 需要 Python v2.4 或更高版本。如何在 Linux 中安装 rdiff-backup重要：如果你通过网络运行它，则必须在两个系统中都安装 rdiff-backup，两者最好是相同版本。该脚本已经存在于主流 Linux 发行版的官方仓库中，只需运行以下命令来安装 rdiff-backup 及其依赖关系：在 Debian/Ubuntu 中$ sudo apt-get update $ sudo apt-get install librsync-dev rdiff-backup 在 CentOS/RHEL 7 中# wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-9.noarch.rpm # rpm -ivh epel-release-7-9.noarch.rpm # yum install librsync rdiff-backup 在 CentOS/RHEL 6 中# wget http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm # rpm -ivh epel-release-6-8.noarch.rpm # yum install librsync rdiff-backup 在 Fedora 中# yum install librsync rdiff-backup # dnf install librsync rdiff-backup [Fedora 22+] 如何在 Linux 中使用 rdiff-backup如前所述，rdiff-backup 使用 SSH 连接到网络上的远程计算机，SSH 的默认身份验证方式是用户名/密码，这通常需要人工交互。但是，要自动执行诸如脚本等自动备份之类的任务，那么你需要配置使用 SSH 密钥无密码登录 SSH，因为 SSH 密钥增加了两台 Linux服务器之间的信任来简化文件同步或传输。在你设置了 SSH 无密码登录后，你可以使用下面的例子开始使用该脚本。备份文件到不同分区下面的例子会备份 /etc 文件夹到另外一个分区的 Backup 文件夹内：$ sudo rdiff-backup /etc /media/aaronkilik/Data/Backup/mint_etc.backup 备份文件到不同分区要排除一个特定文件夹和它的子目录，你可以如下使用 --exclude 选项：$ sudo rdiff-backup --exclude /etc/cockpit --exclude /etc/bluetooth /media/aaronkilik/Data/Backup/mint_etc.backup 我们可以如下使用 --include-special-files 包含所有的设备文件、fifo 文件、socket 文件和链接文件：$ sudo rdiff-backup --include-special-files --exclude /etc/cockpit /media/aaronkilik/Data/Backup/mint_etc.backup 还有另外两个重要标志来用于选择文件，--max-file-size 用来排除大于给定字节大小的文件，--min-file-size 用于排除小于给定字节大小的文件：$ sudo rdiff-backup --max-fil…

使用 rsync 来备份 Linux 系统
type: item
date: 2017-02-25T00:26:00+08:00
description: 探索 rsync 在备份方案中的作用。在系统管理员的工作中备份无疑是一个重要的部分。当没有完整备份或者良好规划的备份和实施时，就可能或早或晚不可挽回地丢失重要的数据。所有公司，无论大小，都运营在数据之上。考虑到丢失业务数据造成的经济和业务损失，从最小的个人公司到最大的跨国企业，没有一个公司能在丢失大部分数据以后得以幸存。你的办公室可以通过保险赔偿重建，但是你的数据就不可能再恢复了。这里提到的丢失是指数据的完全损坏。而不是指数据被偷走，那是另一种灾难。我这里说的是数据被完全摧毁。即使你只是个人用户而不是一个企业，备份你自己的数据也是非常重要的，我有二十年来的个人财务数据和我现在已经关闭的企业的数据，以及大量的电子发票。也包括近年来我创作的大量不同类型的文档、报告和数据报表。我不想失去任何这些数据。所以备份是我数据长期安全的必要保障。备份软件选择有许多软件可以执行备份。大多数 Linux 发行版提供至少一种开源的备份软件。同时也有许多商业备份软件，但是这些都不符合我的需求，所以我决定使用基础的 Linux 工具来进行备份。在我为 Open Source Yearbook 写的文章， 最佳搭档之 2015：tar 和 ssh 中，我说明了昂贵的商业备份软件在设计实施可行的备份计划中并不是必要的。从去年开始我尝试了另一种选择， rsync 命令，它有许多我已经从中受益的有趣特性。我的主要需求是所创建的备份，用户不需要解压备份压缩包就能定位和恢复文件，以便节约创建备份的时间。这篇文章的目的只是为了说明 rsync 在我的备份方案中的作用。并不是 rsync 的全部能力或者它的各种适用场景的概览。rsync 命令Andrew Tridgell 和 Paul Mackerras 编写了 rsync ，首次发布于 1996 年。它的目标是向另一台电脑同步文件。你注意到了他们为什么取这个名字了吗（remotely synchronize）？它是大多数发行版都提供的开源软件。rsync 能够用于同步两个目录或目录树，无论它们是在同一个计算机上还是不同的计算机上，而且不仅如此，它还能做到更多。它创建或者更新的目录与源目录完全一样。新的目录不是以 tar 或 zip 等打包存储，而是普通的目录和文件，常见的 Linux 工具都能轻松访问，而这正是我所需要的。rsync 的最重要的特性之一是它处理源目录被修改的已有文件的方式。它使用分块校验来比较源文件和目标文件，而不是从源把整个文件复制过去。如果两个文件所有块的校验和都相同，那么就不用传输数据。否则只有被改变的块被传输。这样节约了远程同步消耗的大量时间和带宽。比如，我第一次使用 rsync 脚本来把我所有的主机备份到一个外接的大型 usb 硬盘上需要三个小时，因为所有的数据都需要传输过去。而接下来的备份需要的时间就只是 3 到 8 分钟，这取决于上次备份以来创建和改变了多少文件。我使用 time 命令来记录实际花费的时间。昨天晚上，我只花了三分钟来从六个远程系统和本地工作站备份大概 750 Gb 数据。实际上只有在白天改变的几百 Mb 数据需要备份。下面的命令可以用来同步两个目录及其任意子目录的内容。也就是说，在新目录的内容和源目录同步完之后，它们的内容完全一样。rsync -aH sourcedir targetdir -a 选项表示归档模式，它会保持权限、所有关系和符号（软）链接。-H 选项用来保持硬链接。注意源目录和目标目录都可以在远程主机上。假设昨天我们使用 rsync 同步了两个目录。今天我们想再同步一次，但是我们从源目录删除了一些文件。rsync 默认只复制新的和改变过的文件到新目录里，而不去改变新目录里被我们删除的文件，但是如果你想让那些在源目录里被删除的文件在新目录里也被删除，那么你可以加上 --delete 选项来删除。另一个有趣的选项，也是我个人最喜欢的选项是 --link-dest，因为它极大地增加了 rsync 的能力和灵活性。--link-dest 使每日备份只花费很少的额外空间和很短的时间。用这个选项指定前一天的备份目录，以及今天的备份目录，然后 rsync 会创建今天的新备份目录，并将昨天备份目录里的每一个文件在今天的备份目录中创建硬链接。现在我们在今天的备份目录中有一大堆指向昨天备份的硬链接。文件没有被重复创建，而是创建了一些硬链接。对于硬链接，在 Wikipedia 中有非常详细的描述。而在用昨天的备份目录文件的硬链接创建了今天的备份之后，rsync 和平常一样进行备份，如果在文件中检测到了变化，就不会做硬链接，而是从昨天的备份目录里复制一个文件的副本，再把源文件中变化的部分复制过去。（LCTT 译注：此处疑似原文表述不清，参见 generator.c 的 try_d…

Shell脚本：使用rsync备份文件/目录
type: item
date: 2015-06-25T18:13:00+08:00
description: 本文我们介绍一个shell脚本，用来使用rsync命令将你本地Linux机器上的文件/目录备份到远程Linux服务器上。使用该脚本会以交互的方式实施备份，你需要提供远程备份服务器的主机名/ip地址和文件夹位置。我们使用一个单独的列表文件，在这个文件中你需要列出要备份的文件/目录。我们添加了两个脚本，第一个脚本在每次拷贝完一个文件后询问密码（如果你启用了ssh密钥验证，那么就不会询问密码），而第二个脚本中，则只会提示一次输入密码。我们打算备份bckup.txt，dataconfig.txt，docs和orcledb。[root@Fedora21 tmp]# ls -l total 12 -rw-r--r--. 1 root root 0 May 15 10:43 bckrsync.sh -rw-r--r--. 1 root root 0 May 15 10:44 bckup.txt -rw-r--r--. 1 root root 0 May 15 10:46 dataconfig.txt drwxr-xr-x. 2 root root 4096 May 15 10:45 docs drwxr-xr-x. 2 root root 4096 May 15 10:44 oracledb bckup.txt文件包含了需要备份的文件/目录的详情[root@Fedora21 tmp]# cat /tmp/bckup.txt /tmp/oracledb /tmp/dataconfig.txt /tmp/docs [root@Fedora21 tmp]# 脚本 1：#!/bin/bash # 将备份列表文件的路径保存到变量中 backupf='/tmp/bckup.txt' # 输入一个提示信息 echo "Shell Script Backup Your Files / Directories Using rsync" # 检查是否输入了目标服务器，如果为空就再次提示用户输入 while [ x$desthost = "x" ]; do # 提示用户输入目标服务器地址并保存到变量 read -p "Destination backup Server : " desthost # 结束循环 done # 检查是否输入了目标文件夹，如果为空就再次提示用户输入 while [ x$destpath = "x" ]; do # 提示用户输入目标文件夹并保存到变量 read -p "Destination Folder : " destpath # 结束循环 done # 逐行读取备份列表文件 for line in `cat $backupf` # 对每一行都进行处理 do # 显示要被复制的文件/文件夹名称 echo "Copying $line ... " # 通过 rsync 复制文件/文件夹到目标位置 rsync -ar "$line" "$desthost":"$destpath" # 显示完成 echo "DONE" # 结束 done 运行带有输出结果的脚本[root@Fedora21 tmp]# ./bckrsync.sh Shell Script Backup Your Files / Directories Using rsync Destination backup Server : 104.*.*.41 Destination Folder : /tmp Copying /tmp/oracledb ... The authenticity of host '104.*.*.41 (104.*.*.41)' can't be established. ECDSA key fingerprint is 96:11:61:17:7f:fa:...... Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '104.*.*.41' (ECDSA) to the list of known hosts. root@104.*.*.41's password: DONE Copying /tmp/dataconfig.txt ... root@104.*.*.41's password: DONE Copying /tmp/docs ... root@104.*.*.41's password: DONE [root@Fedora21 tmp]# 脚本 2：#!/bin/bash # 将备份列表文件的路径保存到变量中 backupf='/tmp/bckup.txt' # 输入一个提示信息 echo "Shell Scri…

为LUKS加密的磁盘/分区做增量备份
type: item
date: 2015-06-16T22:17:32+08:00
description: 我们中有些人出于安全原因，在家里或者VPS上通过Linux统一密钥配置（LUKS）为硬盘驱动器加密，而这些驱动器的容量很快会增长到数十或数百GB。因此，虽然我们享受着LUKS设备带来的安全感，但是我们也该开始考虑一个可能的远程备份方案了。对于安全的非现场备份，我们将需要能在LUKS加密的设备上以块级别操作的东西。因此，最后我们发现这么个状况，我们每次都需要传输想要做备份的整个LUKS设备（比如说200GB大）。很明显，这是不可行的。我们该怎么来处理这个问题呢？一个解决方案： Bdsync这时，一个卓越的开源工具来拯救我们了，它叫Bdsync（多亏了Rolf Fokkens）。顾名思义，Bdsync可以通过网络同步“块设备”。对于快速同步，Bdsync会生成并对比本地/远程块设备的块的MD5校验和，只同步差异部分。rsync在文件系统级别可以做的，Bdsync可以在块设备级别完成。很自然，对于LUKS加密的设备它也能工作得很好。相当地灵巧！使用Bdsync，首次备份将拷贝整个LUKS块设备到远程主机，因而会花费大量时间来完成。然而，在初始备份后，如果我们在LUKS设备新建一些文件，再次备份就会很快完成，因为我们只需拷贝修改过的块。经典的增量备份在起作用了！安装Bdsync到LinuxBdsync并不包含在Linux发行版的标准仓库中，因而你需要从源代码来构建它。使用以下针对特定版本的指令来安装Bdsync及其手册页到你的系统中。Debian，Ubuntu或Linux Mint$ sudo apt-get install git gcc libssl-dev $ git clone https://github.com/TargetHolding/bdsync.git $ cd bdsync $ make $ sudo cp bdsync /usr/local/sbin $ sudo mkdir -p /usr/local/man/man1 $ sudo sh -c 'gzip -c bdsync.1 > /usr/local/man/man1/bdsync.1.gz' Fedora或CentOS/RHEL$ sudo yum install git gcc openssl-devel $ git clone https://github.com/TargetHolding/bdsync.git $ cd bdsync $ make $ sudo cp bdsync /usr/local/sbin $ sudo mkdir -p /usr/local/man/man1 $ sudo sh -c 'gzip -c bdsync.1 > /usr/local/man/man1/bdsync.1.gz' 对LUKS加密的设备实施非现场增量备份我假定你已经准备好了一个LUKS加密的块设备作为备份源（如，/dev/LOCDEV）。同时，我假定你也有一台远程主机，用以作为源设备的备份点（如，/dev/REMDEV）。你需要在两台系统上具有root帐号访问权限，并且设置从本地访问远程的无密码SSH访问。最后，你需要安装Bdsync到两台主机上。要在本地主机上初始化一个远程备份进程，我们需要以root执行以下命令：# bdsync "ssh root@remote_host bdsync --server" /dev/LOCDEV /dev/REMDEV | gzip > /some_local_path/DEV.bdsync.gz 这里需要进行一些说明。Bdsync客户端将以root打开一个到远程主机的SSH连接，并执行带有--server选项的Bdsync客户端。明确说明一下，/dev/LOCDEV是我们的本地主机上的源LUKS块设备，而/dev/REMDEV是远程主机上的目标块设备。它们可以是/dev/sda（作为整个磁盘），或者/dev/sda2（作为单个分区）。本地Bdsync客户端的输出结果随后被管道输送到gzip，用来在本地主机中创建DEV.bdsync.gz（所谓的二进制补丁文件）。你第一次运行上面的命令的时候，它会花费很长一段时间，这取决于你的互联网/局域网速度，以及/dev/LOCDEV的大小。记住，你必须有两个大小相同的块设备（/dev/LOCDEV和/dev/REMDEV）。下一步是要将补丁文件从本地主机拷贝到远程主机。一种方式是使用scp：# scp /some_local_path/DEV.bdsync.gz root@remote_host:/remote_path 最后一步，是要在远程主机上执行以下命令，它们会将补丁文件应用到/dev/REMDEV：# gzip -d < /remote_path/DEV.bdsy…

Linux中使用rsync——文件和目录排除列表
type: item
date: 2014-12-23T19:10:00+08:00
description: rsync是一个十分有用，而且十分流行的linux工具。它用于备份和恢复文件，也用于对比和同步文件。我们已经在前面的文章讲述了如何在Linux下使用rsync，而今天我们将增加一些更为有用的rsync使用技巧。排除文件和目录列表有时候，当我们做大量同步的时候，我们可能想要从同步的文件和目录中排除一个文件和目录的列表。一般来说，像设备文件和某些系统文件，或者像临时文件或者缓存文件这类占据不必要磁盘空间的文件是不合适同步的，这类文件是我们需要排除的。首先，让我们创建一个名为“excluded”的文件（当然，你想取什么名都可以），然后将我们想要排除的文件夹或文件写入该文件，一行一个。在我们的例子中，如果你想要对根分区进行完整的备份，你应该排除一些在启动时创建的设备目录和放置临时文件的目录，列表看起来像下面这样：然后，你可以运行以下命令来备份系统：$ sudo rsync -aAXhv --exclude-from=excluded / /mnt/backup 从命令行排除文件你也可以从命令行直接排除文件，该方法在你要排除的文件数量较少，并且在你想要将它写成脚本或加到crontab中又不想脚本或cron依赖于另外一个文件运行时十分有用。例如，如果你想要同步/var到一个备份目录，但是你不想要包含cache和tmp这些通常不会有重要内容的文件夹，你可以使用以下命令：$ sudo rsync -aAXhv --exclude={"/var/cache","/var/tmp"} /var /home/adrian/var 该命令易于在脚本或cron中使用，也不会依赖其它文件。via: http://linoxide.com/linux-command/exclude-files-rsync-examples/作者：Adrian Dinu 译者：GOLinux 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出