备份和还原¶
在本章中,您将学习如何使用 Linux 备份和还原您的数据。
目标: 在本章中,未来的 Linux 管理员们将学习如何:
使用 tar
和 cpio
命令进行备份;
检查他们的备份并恢复数据。
压缩或解压他们的备份。
备份, 恢复, 压缩
知识性:
复杂性:
阅读时间: 40 分钟
说明
在本章中,命令结构通过使用 "device" 来指定备份的目标位置以及还原时的源位置。 该设备可以是外部介质,也可以是本地文件。 随着本章的展开,你应该对这一点有所了解,但如果你需要的话,可以随时参考这篇笔记以获得解释。
备份满足了以确切且有效的方式保存和恢复数据的需求。
备份使您可以保护自己免受以下情况的影响:
- 数据破坏:自愿或非自愿的。 人为的或技术手段的。 病毒等
- 数据删除:自愿或非自愿的。 人为的或技术手段的。 病毒等
- 完整性:数据变得不可用。
没有系统是绝对可靠的,也没有人是万无一失的,所以为了避免丢失数据,必须对数据进行备份,以便在出现问题后能够恢复。
备份介质应该保存在服务器以外的另一个房间(或建筑物)中,这样灾难就不会破坏服务器和备份。
此外,管理员必须定期检查介质是否仍可读。
概论¶
有两个规范,即 备份 和 归档。
- 存档会在操作后销毁信息源。
- 备份会在操作后保留信息源。
这些操作包括将信息保存到文件、外设或支持的介质(磁带、磁盘等)中。
流程¶
备份需要系统管理员严格遵守规定。 系统管理员在执行备份操作之前需要考虑以下问题:
- 合适的媒介是什么?
- 应该备份什么?
- 有多少份?
- 备份需要多长时间?
- 方法?
- 多久一次?
- 自动或手动?
- 存储在哪里?
- 要保存多久?
- 是否有成本问题需要考虑?
除了这些问题外,系统管理员还应该根据实际情况考虑性能、数据重要性、带宽消耗和维护复杂性等因素。
备份方法¶
- 全量备份:指把硬盘或数据库内的所有文件、文件夹或数据作一次性的复制。
- 增量备份:指对上一次全量备份或增量备份后更新的数据进行备份。
- 差异备份 :指全量备份后兑变更文件的备份。
- 选择性备份(部分备份):指备份系统的一部分。
- 冷备份:指系统处于关闭或维护状态时的备份。 备份的数据与该时间段内系统的数据完全一致。
- 热备份: 指系统正常运行时的备份。 由于系统中的数据随时在更新,备份的数据相对于系统的实际数据有一定的滞后性。
- 异地备份:指将数据备份到另一个地理位置,以避免因火灾、自然灾害、盗窃等造成的数据丢失和服务中断。
备份频率¶
- 定期:在主要系统更新之前的特定时间段内进行备份(通常在非高峰时段)
- 循环:以天、周、月等为单位进行备份
提示
在系统更改之前,进行备份可能很有用。 然而,每天备份每月都会变更的数据是没有意义的。
恢复方法¶
根据可用的实用程序,可以进行几种类型的恢复。
在某些关系数据库管理系统中,"recover"(有时在文档中使用 "recovery" )和 "restore" 的相应操作是不同的,这要求您查阅官方文档以获取更多信息。 有关更多信息,请参阅官方文档。 本基础文档不会详细介绍 RDBMS 的这一部分。
- 完全恢复:数据恢复基于全量备份或 "全量备份+增量备份" 或 "全量备份+差异备份" 。
- 选择性恢复:数据恢复基于选择性备份(部分备份)。
我们不建议在执行恢复操作之前直接删除当前活动操作系统中的目录或文件(除非您知道删除后会发生什么)。 如果你不知道会发生什么,你可以在当前操作系统上执行 "快照" 操作。
提示
出于安全原因,建议您在执行恢复操作之前将还原的目录或文件存储在 /tmp 目录中,以避免旧文件(旧目录)覆盖新文件(新目录)的情况。
工具与相关技术¶
有许多实用程序可以进行备份。
- 编辑器工具;
- 图形工具;
- 命令行工具:
tar
、cpio
、pax
、dd
、dump
等
我们在这里使用的命令是 tar
和 cpio
。 如果您想了解 dump
工具,请参阅 本文档。
tar
:易于使用;
允许将文件添加到现有备份中。
cpio
:保留所有者;
- 保留所有组、日期和权限。
- 跳过损坏的文件;
- 可对整个文件系统使用。
说明
这些命令以专有的和标准化的格式保存。
Replication:一种将一组数据从一个数据源复制到另外一个或多个数据源的备份技术,主要分为 同步复制 和 异步复制 。 这是面向新手系统管理员的高级备份部分,因此这份基础文档不会详述这些内容。
命名惯例¶
使用命名约定可以让人们迅速定位备份文件的内容,从而避免危险的恢复操作。
- 目录名称;
- 所使用的实用工具;
- 所使用的选项;
- 日期。
提示
备份的名称必须是一目了然的。
说明
在 Linux 系统中,除了图形用户界面(GUI)环境中的少数例外情况(如 .jpg、.mp4、.gif)外,大多数文件都没有扩展名的概念。 换句话说,大多数文件不需要扩展名。 人为添加后缀的原因是为了方便人类用户识别。 例如,如果系统管理员看到 .tar.gz
或 .tgz
文件扩展名,那么他就知道如何处理该文件。
备份文件属性¶
单个备份文件可以包含以下属性:
- 文件名(包括手动添加的后缀);
- 备份文件本身的 atime、ctime、mtime、btime (crtime);
- 备份文件本身的文件大小;
- 备份文件中的文件或目录的属性或特征将被部分保留。 例如,保留文件或目录的 mtime,但不保留
inode
号。
存储方法¶
有两种不同的存储方法:
- 内部:将备份文件存储在当前工作磁盘上。
- 外部:将备份文件存储在外部设备上。 外部设备可以是 USB 驱动器、CD、磁盘、服务器或 NAS 等。
磁带归档 - tar
¶
tar
命令允许在多个连续介质上保存(multi-volume 选项)。
可以提取全部或部分备份。
即使以绝对模式提到要备份的信息的路径,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
创建压缩备份¶
使用 bzip2
创建压缩备份是通过 cvfj
键完成的:
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
提取(解压缩)备份¶
使用 xvf
键提取(解压缩)*.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
从备份 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
的文件。
扩展知识
虽然通配符和正则表达式通常具有相同的符号或样式,但它们匹配的对象完全不同,因此人们经常混淆它们。
通配符:用于匹配文件名或目录名。 正则表达式:用于匹配文件的内容。
您可以在 此文档 中看到更详细的介绍。
CoPy Input Output - cpio
¶
cpio
命令允许在不指定任何选项的情况下在多个连续介质上进行保存。
可以提取全部或部分备份。
与 tar
命令不同的是,它没有同时备份和压缩的选项。 因此,它分两步完成:备份和压缩。
cpio
拥有三种操作模式,每种模式对应着一种不同的功能:
copy-out 模式 - 创建备份(归档)。 您可以通过
-o
或--create
选项启用此模式。 在此模式中,您必须使用特定命令(find
、ls
或cat
)生成一个文件列表并将其传递给 cpio。find
:浏览树(无论是否递归);ls
:列出一个目录(无论是否递归);cat
:读取包含要保存的树或文件的文件。说明
ls
不能与-l
(细节)或-R
(递归)一起使用。它需要一个简单的名称列表。
copy-in 模式 – 从归档中提取文件。 您可以通过
-i
选项启用此模式。- copy-pass 模式 - 将文件从一个目录复制到另一个目录。 您可以通过
-p
或--pass-through
选项启用此模式。
与 tar
命令一样,用户在创建归档时需要注意文件列表的保存方式(绝对路径 或 相对路径)。
次要功能:
-t
- 打印输入的内容表。-A
- 追加到现有归档。 仅工作在 copy-in 模式。
注意
cpio
的一些选项需要与正确的操作模式相结合才能正常工作,参见 man 1 cpio
。
copy-out 模式¶
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
命令向执行备份的 cpio
命令返回与 /etc
目录内容(递归)对应的文件列表。
保存时不要忘记 >
符号或 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 | 显示文件属性。 |
备份之后,您需要读取其内容以确保没有错误。
同样,在执行恢复之前,必须读取将要使用的备份的内容。
copy-in 模式¶
用于恢复备份的 cpio
命令语法:
cpio {-i| --extract} [-E file] [-options] [< device]
示例:
cpio -iv < /backups/etc.152.cpio | less
选项 | 说明 |
---|---|
-i | 恢复完整的备份。 |
-E file | 仅恢复文件名包含在文件中的文件。 |
--make-directories 或 -d | 重建缺失的树结构。 |
-u | 替换所有文件,即使它们存在。 |
--no-absolute-filenames | 允许以相对方式恢复绝对模式下的备份。 |
警告
默认情况下,在恢复时不恢复磁盘上最后修改日期较新或等于备份日期的文件(以避免用较旧的信息覆盖最近的信息)。
另一方面,u
选项允许您恢复文件的旧版本。
示例:
- 绝对备份的绝对恢复
cpio –ivF home.A.cpio
- 对现有树结构进行绝对恢复
u
选项允许您覆盖恢复位置的现有文件。
cpio –iuvF home.A.cpio
- 以相对模式恢复绝对备份
长选项 no-absolute-filename
允许在相对模式下进行恢复。 实际上,路径开头的 /
将被删除。
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
。