备份与恢复¶
在本章中,您将学习如何使用 Linux 来备份和恢复您的数据。
目标:在本章中,未来的 Linux 管理员将学会如何
使用
tar
和 cpio
命令进行备份;
检查备份并恢复数据;
压缩或解压缩备份。
备份、恢复、压缩
知识:
复杂度:
阅读时间:40 分钟
注意
在本章中,命令结构将使用“设备”来指定备份的目标位置以及恢复时的源位置。设备可以是外部介质或本地文件。您将在本章的展开过程中体会到这一点,但如果需要,您可以随时回顾此注释以获得澄清。
备份将满足有效保存和恢复数据的需求。
备份可保护您免受以下情况的影响
- 损坏:自愿或非自愿。人为或技术。病毒,...
- 删除:自愿或非自愿。人为或技术。病毒,...
- 完整性:数据变得不可用。
没有系统是万无一失的,也没有人是万无一失的,所以为了避免数据丢失,必须对其进行备份,以便在出现问题后进行恢复。
备份介质应存放在与服务器不同的房间(或建筑物)中,以免灾难同时毁坏服务器和备份。
此外,管理员必须定期检查介质是否仍然可读。
概述¶
有两个原则:备份和归档。
- 归档会在操作后销毁信息源。
- 备份会在操作后保留信息源。
这些操作包括将信息保存在文件、外围设备或支持的介质(磁带、磁盘等)上。
过程¶
备份需要系统管理员付出大量的纪律和严谨。系统管理员在执行备份操作之前需要考虑以下问题
- 合适的介质是什么?
- 需要备份什么?
- 多少份副本?
- 备份需要多长时间?
- 方法?
- 多久一次?
- 自动还是手动?
- 存放在哪里?
- 将保留多久?
- 是否有成本问题需要考虑?
除了这些问题之外,系统管理员还应根据实际情况考虑性能、数据重要性、带宽消耗和维护复杂性等因素。
备份方法¶
- 完全备份:指一次性复制硬盘或数据库中的所有文件、文件夹或数据。
- 增量备份:指备份自上次完全备份或增量备份以来更新的数据。
- 差异备份:指备份自完全备份以来已更改的文件。
- 选择性备份(部分备份):指备份系统的一部分。
- 冷备份:指在系统关机或维护状态下进行的备份。备份的数据与此期间系统中的数据完全相同。
- 热备份:指在系统正常运行时进行的备份。由于系统中的数据随时可能更新,因此备份的数据与系统真实数据存在一定的延迟。
- 远程备份:指将数据备份到另一个地理位置,以避免因火灾、自然灾害、盗窃等原因造成数据丢失和服务中断。
备份频率¶
- 定期:在重大系统更新之前(通常在非高峰时段)进行备份
- 周期:按天、周、月等单位进行备份
技巧
在系统更改之前进行备份可能很有用。但是,每天备份一次只会在每月更改一次的数据是没有意义的。
恢复方法¶
根据可用的实用程序,将可能执行几种类型的恢复。
在某些关系型数据库管理系统中,“恢复”(有时文档中会使用“recovery”)和“还原”(restore)操作是不同的。有关更多信息,请参阅官方文档。本基本文档不会过多详细介绍 RDBMS 的这部分内容。
- 完全恢复:基于完全备份或“完全备份 + 增量备份”或“完全备份 + 差异备份”的数据恢复。
- 选择性恢复:基于选择性备份(部分备份)的数据恢复。
在执行恢复操作之前,不建议直接删除当前活动操作系统中的目录或文件(除非您知道删除后会发生什么)。如果您不知道会发生什么,可以对当前操作系统执行“快照”操作。
技巧
出于安全原因,建议在执行恢复操作之前,将恢复的目录或文件存储在 /tmp 目录中,以避免旧文件(旧目录)覆盖新文件(新目录)的情况。
工具和相关技术¶
有许多实用程序可用于备份。
- 编辑器工具;
- 图形化工具;
- 命令行工具:
tar
、cpio
、pax
、dd
、dump
等。
这里我们将使用的命令是 tar
和 cpio
。如果您想了解 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
命令。这些备份可以被 bzip2
、xz
、lzip
、lzma
、lzop
、gzip
、compress
或 zstd
压缩。
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
。
注意
对于所有备份操作,保持 cvf
(tvf
或 xvf
)键不变,只需在键的末尾添加压缩键,即可使命令更易于理解(例如:cvfz
或 cvfj
等)。
使用 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
当备份中的文件数量增加时,可以使用管道符(|
)和一些命令(less
、more
、most
等)来实现分页查看效果。
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 xvf
的 P
键),您必须使用绝对路径生成备份。也就是说,使用 tar cvf
的 P
键。
仅从 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
有三种操作模式,每种模式对应一个不同的功能
-
复制输出模式 - 创建备份(存档)。通过
-o
或--create
选项启用此模式。在此模式下,您必须使用特定命令(find
、ls
或cat
)生成文件列表并将其传递给 cpio。 -
find
:浏览树,递归或非递归; ls
:列出目录,递归或非递归;-
cat
:读取包含要保存的树或文件的文件。注意
ls
不能与-l
(详细信息)或-R
(递归)一起使用。它需要一个简单的名称列表。
-
复制输入模式 – 从存档中提取文件。您可以通过
-i
选项启用此模式。 - 复制传递模式 – 将文件从一个目录复制到另一个目录。您可以通过
-p
或--pass-through
选项启用此模式。
与 tar
命令一样,用户在创建存档时必须考虑文件列表的保存方式(绝对路径或相对路径)。
辅助功能
-t
- 打印输入内容列表。-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
.