跳至内容

备份与恢复

在本章中,您将学习如何使用 Linux 来备份和恢复您的数据。


目标:在本章中,未来的 Linux 管理员将学会如何

✔ 使用 tarcpio 命令进行备份;
✔ 检查备份并恢复数据;
✔ 压缩或解压缩备份。

🏁 备份恢复压缩

知识: ⭐ ⭐ ⭐
复杂度⭐ ⭐

阅读时间:40 分钟


注意

在本章中,命令结构将使用“设备”来指定备份的目标位置以及恢复时的源位置。设备可以是外部介质或本地文件。您将在本章的展开过程中体会到这一点,但如果需要,您可以随时回顾此注释以获得澄清。

备份将满足有效保存和恢复数据的需求。

备份可保护您免受以下情况的影响

  • 损坏:自愿或非自愿。人为或技术。病毒,...
  • 删除:自愿或非自愿。人为或技术。病毒,...
  • 完整性:数据变得不可用。

没有系统是万无一失的,也没有人是万无一失的,所以为了避免数据丢失,必须对其进行备份,以便在出现问题后进行恢复。

备份介质应存放在与服务器不同的房间(或建筑物)中,以免灾难同时毁坏服务器和备份。

此外,管理员必须定期检查介质是否仍然可读。

概述

有两个原则:备份归档

  • 归档会在操作后销毁信息源。
  • 备份会在操作后保留信息源。

这些操作包括将信息保存在文件、外围设备或支持的介质(磁带、磁盘等)上。

过程

备份需要系统管理员付出大量的纪律和严谨。系统管理员在执行备份操作之前需要考虑以下问题

  • 合适的介质是什么?
  • 需要备份什么?
  • 多少份副本?
  • 备份需要多长时间?
  • 方法?
  • 多久一次?
  • 自动还是手动?
  • 存放在哪里?
  • 将保留多久?
  • 是否有成本问题需要考虑?

除了这些问题之外,系统管理员还应根据实际情况考虑性能、数据重要性、带宽消耗和维护复杂性等因素。

备份方法

  • 完全备份:指一次性复制硬盘或数据库中的所有文件、文件夹或数据。
  • 增量备份:指备份自上次完全备份或增量备份以来更新的数据。
  • 差异备份:指备份自完全备份以来已更改的文件。
  • 选择性备份(部分备份):指备份系统的一部分。
  • 冷备份:指在系统关机或维护状态下进行的备份。备份的数据与此期间系统中的数据完全相同。
  • 热备份:指在系统正常运行时进行的备份。由于系统中的数据随时可能更新,因此备份的数据与系统真实数据存在一定的延迟。
  • 远程备份:指将数据备份到另一个地理位置,以避免因火灾、自然灾害、盗窃等原因造成数据丢失和服务中断。

备份频率

  • 定期:在重大系统更新之前(通常在非高峰时段)进行备份
  • 周期:按天、周、月等单位进行备份

技巧

在系统更改之前进行备份可能很有用。但是,每天备份一次只会在每月更改一次的数据是没有意义的。

恢复方法

根据可用的实用程序,将可能执行几种类型的恢复。

在某些关系型数据库管理系统中,“恢复”(有时文档中会使用“recovery”)和“还原”(restore)操作是不同的。有关更多信息,请参阅官方文档。本基本文档不会过多详细介绍 RDBMS 的这部分内容。

  • 完全恢复:基于完全备份或“完全备份 + 增量备份”或“完全备份 + 差异备份”的数据恢复。
  • 选择性恢复:基于选择性备份(部分备份)的数据恢复。

在执行恢复操作之前,不建议直接删除当前活动操作系统中的目录或文件(除非您知道删除后会发生什么)。如果您不知道会发生什么,可以对当前操作系统执行“快照”操作。

技巧

出于安全原因,建议在执行恢复操作之前,将恢复的目录或文件存储在 /tmp 目录中,以避免旧文件(旧目录)覆盖新文件(新目录)的情况。

有许多实用程序可用于备份。

  • 编辑器工具;
  • 图形化工具;
  • 命令行工具tarcpiopaxdddump 等。

这里我们将使用的命令是 tarcpio。如果您想了解 dump 工具,请参阅本文档

  • tar:

  • 易于使用;

  • 允许将文件添加到现有备份。

  • cpio:

  • 保留所有者;

  • 保留组、日期和权限;
  • 跳过损坏的文件;
  • 可用于整个文件系统。

注意

这些命令以专有和标准化的格式保存。

复制:一种备份技术,它将一组数据从一个数据源复制到另一个或多个数据源,主要分为同步复制异步复制。这是初级系统管理员的高级备份部分,因此本基本文档将不详细介绍这些内容。

命名约定

使用命名约定可以快速定位备份文件的内容,从而避免危险的恢复。

  • 目录名称;
  • 使用的实用程序;
  • 使用的选项;
  • 日期。

技巧

备份名称必须明确。

注意

在 Linux 世界中,大多数文件除了 GUI 环境中的少数例外(如 .jpg、.mp4、.gif)之外,都没有扩展名概念。换句话说,大多数文件扩展名不是必需的。人为添加后缀的原因是为了方便用户识别。如果系统管理员看到 .tar.gz.tgz 文件扩展名,他就会知道如何处理该文件。

备份文件的属性

单个备份文件可以包含以下属性

  • 文件名(包括手动添加的后缀);
  • 备份文件本身的 atime、ctime、mtime、btime(crtime);
  • 备份文件本身的文件大小;
  • 备份文件中的文件或目录的属性或特征将被部分保留。例如,将保留文件或目录的 mtime,但 inode 号将不被保留。

存储方法

有两种不同的存储方法

  • 内部:将备份文件存储在当前工作磁盘上。
  • 外部:将备份文件存储在外部设备上。外部设备可以是 USB 驱动器、CD、磁盘、服务器或 NAS 等。

磁带归档器 - tar

tar 命令允许将数据保存到多个连续的介质上(多卷选项)。

可以解压备份的全部或部分内容。

tar 即使备份的信息路径以绝对模式指定,也会隐式地以相对模式进行备份。但是,绝对模式的备份和恢复是可能的。如果您想查看 tar 用法的单独示例,请参阅本文档

恢复指南

需要提出的正确问题是

  • 什么:部分还是完整;
  • 在哪里:数据将被恢复的位置;
  • 如何:绝对还是相对。

警告

在恢复之前,务必考虑并确定最合适的方法,以避免错误。

恢复通常在发生需要快速解决的问题后进行。糟糕的恢复在某些情况下可能会使情况变得更糟。

使用 tar 进行备份

UNIX 系统上创建备份的默认实用程序是 tar 命令。这些备份可以被 bzip2xzlziplzmalzopgzipcompresszstd 压缩。

tar 允许您从备份中提取单个文件或目录、查看其内容或验证其完整性。

估算备份大小

以下命令估算可能的 tar 文件的大小(以字节为单位)

$ tar cf - /directory/to/backup/ | wc -c
20480
$ tar czf - /directory/to/backup/ | wc -c
508
$ tar cjf - /directory/to/backup/ | wc -c
428

警告

请注意,命令行中存在“-”会干扰 zsh。切换到 bash

tar 备份的命名约定

这是一个 tar 备份命名约定的示例,知道日期将添加到名称中。

文件 后缀 功能
cvf home home.tar /home 以相对模式,未压缩形式
cvfP /etc etc.A.tar /etc 以绝对模式,无压缩
cvfz usr usr.tar.gz /usr 以相对模式,gzip 压缩
cvfj usr usr.tar.bz2 /usr 以相对模式,bzip2 压缩
cvfPz /home home.A.tar.gz /home 以绝对模式,gzip 压缩
cvfPj /home home.A.tar.bz2 /home 以绝对模式,bzip2 压缩

创建备份

以相对模式创建备份

使用 cvf 键以相对模式创建未压缩的备份

tar c[vf] [device] [file(s)]

示例

[root]# tar cvf /backups/home.133.tar /home/
描述
c 创建备份。
v 显示已处理文件的名称。
f 允许您指定备份(介质)的名称。

技巧

tar 键前的连字符(“-”)是可选的!

以绝对模式创建备份

使用 cvfP 键以绝对模式创建未压缩的备份

tar c[vf]P [device] [file(s)]

示例

[root]# tar cvfP /backups/home.133.P.tar /home/
描述
P 以绝对模式创建备份。

警告

使用 P 键时,要备份的文件路径必须输入为绝对路径。如果未指示两个条件(P 键和绝对路径),则备份以相对模式进行。

使用 gzip 创建压缩备份

使用 cvfz 键以 gzip 创建压缩备份

tar cvzf backup.tar.gz dirname/
描述
z 将备份压缩为 gzip 格式。

注意

.tgz 扩展名等同于 .tar.gz

注意

对于所有备份操作,保持 cvftvfxvf)键不变,只需在键的末尾添加压缩键,即可使命令更易于理解(例如:cvfzcvfj 等)。

使用 bzip2 创建压缩备份

使用 cvfj 键以 bzip2 创建压缩备份

tar cvfj backup.tar.bz2 dirname/
描述
j 将备份压缩为 bzip2 格式。

注意

.tbz.tb2 扩展名等同于 .tar.bz2 扩展名。

压缩效率比较

压缩和解压缩都会影响资源消耗(时间和 CPU 使用率)。

以下是文本文件集从低到高的压缩效率排名

  • compress (.tar.Z)
  • gzip (.tar.gz)
  • bzip2 (.tar.bz2)
  • lzip (.tar.lz)
  • xz (.tar.xz)

向现有备份添加文件或目录

可以向现有备份添加一个或多个项目。

tar {r|A}[key(s)] [device] [file(s)]

/etc/passwd 添加到备份 /backups/home.133.tar

[root]# tar rvf /backups/home.133.tar /etc/passwd

添加目录类似。此处将 dirtoadd 添加到 backup_name.tar

tar rvf backup_name.tar dirtoadd
描述
r 将文件或目录追加到存档的末尾。
A 将一个存档中的所有文件追加到另一个存档的末尾。

注意

无法将文件或文件夹添加到压缩备份中。

$ tar rvfz backup.tgz filetoadd
tar: Cannot update compressed archives
Try `tar --help' or `tar --usage' for more information.

注意

如果备份是以相对模式执行的,则以相对模式添加文件。如果备份以绝对模式执行,则以绝对模式添加文件。

混合模式可能导致恢复时出现问题。

列出备份内容

可以在不解压备份的情况下查看其内容。

tar t[key(s)] [device]
描述
t 显示备份的内容(是否压缩)。

示例

tar tvf backup.tar
tar tvfz backup.tar.gz
tar tvfj backup.tar.bz2

当备份中的文件数量增加时,可以使用管道符(|)和一些命令(lessmoremost 等)来实现分页查看效果。

tar tvf backup.tar | less

技巧

要列出或检索备份的内容,无需提及创建备份时使用的压缩算法。也就是说,tar tvf 等同于 tar tvfj,用于读取内容。压缩类型或算法必须只在创建压缩备份时选择。

技巧

在执行恢复操作之前,应始终检查和查看备份文件的内容。

检查备份的完整性

在创建备份时,可以使用 W 键测试备份的完整性

tar cvfW file_name.tar dir/

在创建备份后,可以使用 d 键测试备份的完整性

tar vfd file_name.tar dir/

技巧

通过在之前的键后添加第二个 v,您将获得已存档文件的列表以及存档文件与文件系统中现有文件之间的差异。

$ tar vvfd  /tmp/quodlibet.tar .quodlibet/
drwxr-x--- rockstar/rockstar     0 2021-05-21 00:11 .quodlibet/
-rw-r--r-- rockstar/rockstar     0 2021-05-19 00:59 .quodlibet/queue
[…]
-rw------- rockstar/rockstar  3323 2021-05-21 00:11 .quodlibet/config
.quodlibet/config: Mod time differs
.quodlibet/config: Size differs
[…]

W 键也用于将存档的内容与文件系统进行比较。

$ tar tvfW file_name.tar
Verify 1/file1
1/file1: Mod time differs
1/file1: Size differs
Verify 1/file2
Verify 1/file3

无法使用 W 键验证压缩存档。而是必须使用 d 键。

tar dfz file_name.tgz
tar dfj file_name.tar.bz2

解压(untar)备份

使用 xvf 键解压(untar*.tar 备份

/savings/etc.133.tar 备份中将 etc/exports 文件解压到当前目录的 etc 目录中

tar xvf /backups/etc.133.tar etc/exports

将压缩备份 /backups/home.133.tar.bz2 中的所有文件解压到当前目录

[root]# tar xvfj /backups/home.133.tar.bz2

将备份 /backups/etc.133.P.tar 中的所有文件解压到其原始目录

tar xvfP /backups/etc.133.P.tar

警告

出于安全原因,解压以绝对模式保存的备份文件时应谨慎。

再次强调,在执行解压操作之前,应始终检查备份文件的内容(特别是以绝对模式保存的备份)。

描述
x 解压备份中的文件(无论是否压缩)

使用 xvfz 键解压 tar-gzipped*.tar.gz)备份

tar xvfz backup.tar.gz

使用 xvfj 键解压 tar-bzipped*.tar.bz2)备份

tar xvfj backup.tar.bz2

技巧

要解压或列出备份的内容,无需提及用于创建备份的压缩算法。也就是说,tar xvf 等同于 tar xvfj 用于解压内容,tar tvf 等同于 tar tvfj 用于列出内容。

警告

要将文件恢复到其原始目录(tar xvfP 键),您必须使用绝对路径生成备份。也就是说,使用 tar cvfP 键。

仅从 tar 备份中解压一个文件

要从 tar 备份中解压特定文件,请在 tar xvf 命令末尾指定该文件的名称。

tar xvf backup.tar /path/to/file

前面的命令仅从 backup.tar 备份中解压 /path/to/file 文件。该文件将被恢复到活动目录中创建或已存在的 /path/to/ 目录。

tar xvfz backup.tar.gz /path/to/file
tar xvfj backup.tar.bz2 /path/to/file
从 backup tar 中解压一个文件夹

要仅从备份中解压一个目录(包括其子目录和文件),请在 tar xvf 命令末尾指定目录名称。

tar xvf backup.tar /path/to/dir/

要解压多个目录,请依次指定每个名称

tar xvf backup.tar /path/to/dir1/ /path/to/dir2/
tar xvfz backup.tar.gz /path/to/dir1/ /path/to/dir2/
tar xvfj backup.tar.bz2 /path/to/dir1/ /path/to/dir2/
使用通配符从 tar 备份中解压一组文件

指定通配符以解压与指定匹配模式匹配的文件。

例如,要解压所有扩展名为 .conf 的文件

tar xvf backup.tar --wildcards '*.conf'

  • --wildcards *.conf 对应于扩展名为 .conf 的文件。

扩展知识

尽管通配符和正则表达式通常具有相同的符号或样式,但它们匹配的对象完全不同,因此人们经常混淆它们。

通配符(wildcard character):用于匹配文件名或目录名。正则表达式:用于匹配文件内容。

您可以在本文档中看到更详细的介绍。

复制输入输出 - cpio

cpio 命令允许在多个连续介质上保存,无需指定任何选项。

可以解压备份的全部或部分内容。

tar 命令不同,没有同时备份和压缩的选项。因此,它分两步完成:备份和压缩。

cpio 有三种操作模式,每种模式对应一个不同的功能

  1. 复制输出模式 - 创建备份(存档)。通过 -o--create 选项启用此模式。在此模式下,您必须使用特定命令(findlscat)生成文件列表并将其传递给 cpio。

  2. find:浏览树,递归或非递归;

  3. ls:列出目录,递归或非递归;
  4. cat:读取包含要保存的树或文件的文件。

    注意

    ls 不能与 -l(详细信息)或 -R(递归)一起使用。

    它需要一个简单的名称列表。

  5. 复制输入模式 – 从存档中提取文件。您可以通过 -i 选项启用此模式。

  6. 复制传递模式 – 将文件从一个目录复制到另一个目录。您可以通过 -p--pass-through 选项启用此模式。

tar 命令一样,用户在创建存档时必须考虑文件列表的保存方式(绝对路径相对路径)。

辅助功能

  1. -t - 打印输入内容列表。
  2. -A - 追加到现有存档。它仅在复制输入模式下工作。

注意

cpio 的某些选项需要与正确的操作模式结合才能正常工作。请参阅 man 1 cpio

复制输出模式

cpio 命令的语法

[files command |] cpio {-o| --create} [-options] [< file-list] [> device]

示例

通过重定向 cpio 的输出

find /etc | cpio -ov > /backups/etc.cpio

使用备份介质的名称

find /etc | cpio -ovF /backups/etc.cpio

find 命令的结果通过管道(字符 |Left Shift+\)输入到 cpio 命令。

在这里,find /etc 命令将对应于 /etc 目录内容(递归)的文件列表返回给 cpio 命令,该命令执行备份。

保存时不要忘记 > 符号或 F save_name_cpio

选项 描述
-o 通过cp-out模式创建备份。
-v 显示已处理文件的名称。
-F 备份到特定介质,该介质可以替换 cpio 命令中的标准输入(“<”)和标准输出(“>”)

备份到介质

find /etc | cpio -ov > /dev/rmt0

介质可以有多种类型

  • 磁带驱动器:/dev/rmt0
  • 分区:/dev/sda5/dev/hda5 等。

文件列表的相对和绝对路径

cd /
find etc | cpio -o > /backups/etc.cpio
find /etc | cpio -o > /backups/etc.A.cpio

警告

如果在 find 命令中指定的路径是绝对路径,则备份将以绝对模式执行。

如果在 find 命令中指定的路径是相对路径,则备份将以相对模式执行。

将文件追加到现有备份

[files command |] cpio {-o| --create} -A [-options] [< fic-list] {F| > device}

示例

find /etc/shadow | cpio -o -AF SystemFiles.A.cpio

仅当介质是直接访问介质时,才能添加文件。

选项 描述
-A 将一个或多个文件追加到现有备份。
-F 指定要修改的备份。

压缩备份

  • 先保存然后压缩
$ find /etc | cpio  –o > etc.A.cpio
$ gzip /backups/etc.A.cpio
$ ls /backups/etc.A.cpio*
/backups/etc.A.cpio.gz
  • 保存压缩
find /etc | cpio –o | gzip > /backups/etc.A.cpio.gz

tar 命令不同,没有同时保存和压缩的选项。因此,它分两步完成:保存和压缩。

第一种方法的语法更容易理解和记忆,因为它分两步完成。

对于第一种方法,备份文件会被 gzip 实用程序自动重命名,该实用程序将 .gz 添加到文件名末尾。同样,bzip2 实用程序会自动添加 .bz2

读取备份内容

cpio 命令读取 cpio 备份内容的语法

cpio -t [-options] [< fic-list]

示例

cpio -tv < /backups/etc.152.cpio | less
选项 描述
-t 读取备份。
-v 显示文件属性。

在进行备份后,您需要读取其内容以确保没有错误。

同样,在执行恢复之前,必须读取将要使用的备份的内容。

复制输入模式

cpio 命令恢复备份的语法

cpio {-i| --extract} [-E file] [-options] [< device]

示例

cpio -iv < /backups/etc.152.cpio | less
选项 描述
-i 恢复完整备份。
-E file 仅恢复文件名包含在 file 中的文件。
--make-directories-d 重建缺失的树结构。
-u 替换所有文件,即使它们已存在。
--no-absolute-filenames 允许以相对方式恢复以绝对模式制作的备份。

警告

默认情况下,在恢复时,磁盘上修改日期晚于或等于备份日期的文件不会被恢复(以避免用旧信息覆盖新信息)。

另一方面,u 选项允许您恢复旧版本的文件。

示例

  • 绝对备份的绝对恢复
cpio –ivF home.A.cpio
  • 现有树结构的绝对恢复

u 选项允许您覆盖恢复发生位置的现有文件。

cpio –iuvF home.A.cpio
  • 相对模式下绝对备份的恢复

长选项 no-absolute-filenames 允许相对模式恢复。实际上,路径开头的 / 将被删除。

cpio --no-absolute-filenames -divuF home.A.cpio

技巧

可能需要创建目录,因此使用了 d 选项。

  • 恢复相对备份
cpio –iv < etc.cpio
  • 文件或目录的绝对恢复

恢复特定文件或目录需要创建列表文件,然后必须删除该列表文件。

echo "/etc/passwd" > tmp
cpio –iuE tmp -F etc.A.cpio
rm -f tmp

压缩 - 解压缩实用程序

在备份时使用压缩可能会带来一些缺点

  • 延长备份和恢复时间。
  • 使无法将文件添加到备份中。

注意

因此,最好先备份再压缩,而不是在备份过程中压缩。

使用 gzip 压缩

gzip 命令压缩数据。

gzip 命令的语法

gzip [options] [file ...]

示例

$ gzip usr.tar
$ ls
usr.tar.gz

文件名将获得 .gz 扩展名。

它保留相同的权限以及相同的最后访问和修改日期。

使用 bzip2 压缩

bzip2 命令也压缩数据。

bzip2 命令的语法

bzip2 [options] [file ...]

示例

$ bzip2 usr.cpio
$ ls
usr.cpio.bz2

文件名将获得 .bz2 扩展名。

bzip2 的压缩效果比 gzip 好,但执行时间更长。

使用 gunzip 解压缩

gunzip 命令解压缩压缩数据。

gunzip 命令的语法

gunzip [options] [file ...]

示例

$ gunzip usr.tar.gz
$ ls
usr.tar

文件名由 gunzip 截断,并移除 .gz 扩展名。

gunzip 还解压缩具有以下扩展名的文件

  • .z;
  • -z;
  • _z;
  • -gz;

使用 bunzip2 解压缩

bunzip2 命令解压缩压缩数据。

bzip2 命令的语法

bzip2 [options] [file ...]

示例

$ bunzip2 usr.cpio.bz2
$ ls
usr.cpio

文件名由 bunzip2 截断,并移除 .bz2 扩展名。

bunzip2 还解压缩具有以下扩展名的文件

  • -bz;
  • .tbz2;
  • tbz.