第五章:在你搞砸之前阅读此章(备份和恢复)

系统故障最常见的原因来自于人,但硬件和操作系统也会发送故障。

始终假设最坏的情况即将发生。

我们将从使用tar(1)进行系统备份和管理磁带驱动器开始,然后使用script(1)检查记录系统的行为。最后,我们考虑使用单用户模式和安装介质进行恢复和重建。

系统备份

只有当你关心你的数据时,才需要系统备份。

在线备份很容易被任何破坏实时服务器的东西损坏或销毁。正确的备份会安全地离线存储。

rsync(1)等工具,甚至ZFS复制,都不会创建实际的备份;它们创建了方便的在线副本。

完整的备份和恢复操作需要磁带驱动器和介质。也可以通过网络备份到文件,或备份到可移动媒体。磁带仍然是许多环境的重要媒介。

备份磁带

FreeBSD支持SCSI和USB磁带驱动器。SCSI驱动器是最快、最可靠的。USB磁带机并不总是符合标准,因此并不总是与FreeBSD兼容。

检查sa设备的/var/run/dmesg.boot文件,以确定FreeBSD识别到了磁带机。类似以下信息:

在我们关于这个磁带机的所有信息中,最重要的是你的FreeBSD系统知道这个设备是sa0➊。我们还看到它连接到SCSI ID为3➌的SCSI卡mps0➋上,我们看到了驱动器的型号➍以及它可以以每秒600MB的速度➎运行的事实。

磁带驱动器设备节点、倒带和弹出

磁带是一种线性(linear)存储介质。磁带的每个部分都包含一段特定的数据。

应避免在每次备份操作后倒带(rewinding)。当你在单个磁带上运行多个备份时,请使用适当的设备节点以确保不会在任务之间倒带磁带。

磁带机有几个不同的设备节点,每个节点都使磁带机的行为不同。最基本的磁带机控制机制是用于访问它的设备节点。普通磁带驱动器有三个节点:

磁带是顺序访问设备,要访问磁带特定部分上的某些数据,你必须将磁带回滚(roll back)以找到该部分。倒退还是不倒退是一个重要的问题。

不同磁带设备节点的行为因操作系统而异。不同版本的Unix,使用不同的磁带管理软件,处理磁带的方式不同。不要对备份磁带做出假设!

如果使用与设备名称匹配的节点名称,则当你的命令完成时,磁带机将自动倒带。我们的示例SCSI磁带机的设备名称为sa0,因此,如果您使用/dev/sa0作为设备节点运行命令,则当命令完成时,磁带将倒带。

如果您不希望磁带在命令完成时自动倒带,请使用以n开头的节点名称停止倒带。也许您需要将另一台机器的第二个备份附加到磁带上,或者您想在倒带和弹出之前对磁带进行编目。在我们的示例中,使用/dev/nsa0运行命令而不进行倒带。

要在命令完成时自动弹出磁带,请使用以e开头的节点。例如,如果您正在运行完整系统备份,您可能希望磁带在命令完成后弹出,以便操作员可以将磁带放在箱子里运到异地或存放在存储器中。我们的示例使用/dev/esa0设备名称在命令完成时弹出磁带。某些磁带机可能不支持自动弹出;他们会要求你按下物理按钮,操作将磁带从驱动器中拉出的杠杆。识别此类驱动器的最简单方法是尝试通过设备节点弹出它,看看会发生什么。

$TAPE 变量

许多程序假定您的磁带驱动器是/dev/sa0,但这并不总是正确的。即使您只有一个磁带机,您也可能希望自动弹出它(/dev/esa0)或在完成时不倒带(/dev/nsa0)。

许多(但不是全部)与备份相关的程序使用环境变量$TAPE来控制默认情况下使用的设备节点。您始终可以在命令行上覆盖$TAPE,但将其设置为最常用的选项可以为您以后节省一些麻烦。

使用mt(1)查看磁带状态

现在您知道如何找到磁带机,您可以使用mt(1)对其执行基本操作,如倒带、重新张紧、擦除等。mt(1)做的一件基本事情是检查磁带机的状态,如下所示:

我们首先看到的是驱动器密度➊。较旧的驱动器可以有不同密度的磁带用于不同的目的,但现代磁带驱动器会尽可能紧密地打包数据。这种特殊的磁带机是DDS-3型号;虽然你可以选择使用另一种密度,但它提供的所有选择都是DDS-3。我们还看到这个磁带机使用DCLZ算法➋提供硬件压缩。在底部附近,我们看到磁带机现在在做什么➌。

status命令可能会给您不同类型的消息。最有问题的是告诉您的磁带机没有配置:

这意味着您在$tape变量指向的设备节点上实际上没有磁带。您可以通过使用-f标志指定设备节点(例如,mt -f /dev/nsa1 status)来尝试设备节点和mt(1),尽管您应该从dmesg.boot获得正确的信息。如果您确定您的设备节点是正确的,也许您没有将磁带插入驱动器,或者磁带驱动器需要清洁(cleaning)。

您可能从mt状态中得到的另一个响应是mt: /nsa0: Device busy。您询问了磁带的状态,它回答说:“我现在不能说话。我很忙。”请稍后重试,或检查ps -ax以查看使用磁带驱动器的命令。当您使用实际的磁带时,一次只能有一个程序实例访问它。从磁带中提取文件时,无法列出磁带的内容。

其他磁带命令

最常用的mt(1)子命令有:retension(重新拉伸)、erase(擦除)、rewind(倒带)、offline(下线)。

磁带往往会拉伸(stretch),尤其是在第一次使用后。重新拉伸(retensioning)磁带就是用命令mt retension将磁带完全向前和向后拉伸。重新拉伸可以消除磁带的所有松弛,使备份更加可靠。

erase会从删除磁带中所有数据。这不是一个可靠的擦除,mt erase只需滚动磁带并覆盖所有内容一次。这可能需要很长时间。如果你想快速擦除磁带,可以使用mt erase 0 将磁带简单地标记为空白(实际数据还保存在磁带上)。

mt rewind命令将磁带回滚到开头,与通过器默认设备节点访问设备相同。

mt offline命令将磁带脱机——倒带并弹出它。

并非所有磁带机都支持所有功能。尤其是较旧的磁带机非常敏感,甚至很粗糙,需要非常具体的设置才能正常工作。

BSD tar(1)

tar(1)用于将系统备份到磁带。tar是tape archiver的缩写,它实际上是为备份而写的。

FreeBSD还包括dump(8),但它仅适用于不使用软更新日志的UFS文件系统。

使用tar(1)备份到磁带或文件。包含tarred文件的备份文件称为tarball。从tarball中恢复一个文件或文件子集非常快速和简单。从磁带恢复备份的一部分也很容易,但速度并没有那么快。

FreeBSD的tar版本名为bsdtar,可以与GNU tar完全一致地运行,也可以严格按照POSIX tar运行。bsdtar基于libarchive(3)构建,libarchive是一个专门用于创建和提取备份存档的库。得益于libarchive,bsdtar可以从任何地方提取文件,从传统的磁带备份到ISO映像,所有这些都可以使用相同的界面,甚至可以打开RPM、zip文件或几乎任何其他存档。

无论您使用什么备份软件,文件都可能在您尝试备份时发生变化。日志文件在末尾不断添加内容,而数据库可以在文件中的任何位置更改。文件系统快照始终保持一致,UFS(第11章)和ZFS(第12章)都支持它们。切勿备份实时数据库;相反,将数据库转储到存档文件中并备份该存档。

tar模式

tar可以执行由命令行标志控制的多种不同操作。这些不同的动作被称为modes(模式)。您需要阅读手册页以获取所有tar模式的完整描述,但以下列表描述了最常用的模式。

创建归档

使用 create mode (-c)创建新的存档。除非你另有指定,否则此标志会将所有内容备份到你的磁带驱动器($TAPE或/dev/sa0)。要备份整个系统,你需要告诉tar从根目录开始归档所有内容:

作为响应,您的磁带驱动器应该亮起,如果您的磁带足够大,最终将为您提供完整的系统备份。然而,许多现代硬盘驱动器的容量都超过了磁带驱动器的容量,因此只备份系统的重要部分是有意义的。例如,如果您的计算机上只需要/home和/var/目录中的文件,则可以在命令行上指定这些目录:

列出归档内容

list mode(-t)列出归档中的所有文件:

此列表包括备份中的所有文件,可能需要一段时间才能运行。请注意,文件名中缺少初始斜线;例如,/tmp显示为tmp。这在恢复过程中变得很重要。

从备份中提取文件

在extract(-x)模式下,tar从存档中检索文件并将其复制到磁盘。这也称作untarring。tar将提取的文件放在当前位置。如果你想用备份中的文件覆盖系统的现有/etc目录,请转到跟目录。

另一方面,要还原主目录中的/etc副本,我会线转到主目录:

如果备份包含初始斜线,tar将始终提取相对于根目录的文件。/etc/rc.conf的还原备份将始终写入/etc/rc.conf。

没有前导/,您可以在任何地方恢复文件;恢复的/etc/rc.conf可以作为/home/mwlucas/etc/rc.conf重新启动。如果我正在从已停用的机器上恢复文件,我不希望它们覆盖当前机器上的文件;我想把它们放在其他地方,这样它们就不会干扰我的系统。

验证备份

diff模式(-d)将磁带上的文件与磁盘上的文件进行比较。如果磁带上的所有内容都与系统匹配, tar -d 将静默运行。

如果你真的想要一个完美的备份(也成为冷备份),在运行备份之前,你需要关闭到单用户模式。

tar的其他功能

Tar还有其他几个功能,可以使其更友好或更有用。这些包括详细行为、不同类型的压缩、权限还原和最流行的选项——备用存储。

使用非默认存储

默认情况下,Tar将所有内容都馈送到磁带驱动器,但-f标志允许您指定另一个设备或文件作为目标。在前面的所有示例中,我要么使用默认的磁带驱动器/dev/sa0,要么设置了$tape。如果两者都没有,我需要用-f指定一个磁带机:

您还可以备份到文件(或tarball),而不是使用磁带。通过互联网分发的源代码经常以tarball的形式分发。使用相同的-f标志指定文件名。例如,为了备份这本书的章节,我每隔一段时间就会运行以下命令来创建tarball bookbackup.tar:

这个文件可以很容易地备份到其他地方的机器上——所以即使我的房子烧毁了,这本书也是安全的。然后,我可以把电话和电线连接到邻居家,借一台笔记本电脑,找到一个开放的无线接入点,运行tar-xf bookbackup.tar,在等待保险公司的同时,在烧焦的树林里工作。(不管怎样,当时我无法做太多其他事情。)

详细

除非遇到错误,否则Tar通常会静默运行。这在大多数情况下都是好的(谁想在每次运行备份时读取服务器上的完整文件列表?),但有时你喜欢有一种观看程序工作的温暖模糊的感觉。添加-v标志会使tar打印它处理的每个文件的名称。您可以使用verbose标志创建所有正在备份或还原的文件的完整列表。在常规备份或还原中,这种冗长的内容使错误难以发现。

压缩

Bsdtar继承了对libarchive(3)理解的每种压缩算法的支持。我们将按照从最理想到最不理想的顺序,介绍一些您可能用于创建档案的内容。Bsdtar支持更多的压缩算法,但您通常不会使用它们来创建存档。

XZ 压缩

-J启用xz压缩算法。非FreeBSD主机可能需要通过xz(1)管道恢复才能读取它们。使用XZ压缩的tarball通常以.txz结尾。

bzip 压缩

-j启用bzip压缩算法,它比gzip压缩比更高,但要使用更多的CPU时间。并非所有tar版本都支持bzip压缩。以.tbz结尾。

gzip 压缩

-z启用gzip压缩算法。通常以.tar.gz或.tgz结尾,偶尔也会以.taz结尾。

原始Unix 压缩

相比之下,所有Unix版本的tar都可以使用-Z标志启用compress(1)压缩文件。此压缩效率不如gzip,但几乎所有的tar都支持compress(1)。扩展名通常为.tar.Z。

权限还原

-p标志恢复对提取文件的原始权限。默认情况下,tar将提取文件的所有者设置为提取文件的用户名。这对于源代码来说很好,但对于系统还原,你确实希望还原文件的原始权限。

FreeBSD的libarchive可以自动检测备份中使用的压缩类型。虽然在创建存档时必须指定所需的压缩,但在提取时不需要给出压缩算法。让tar(1)确定压缩类型,它将自动执行正确的操作,即使存档是用你从未见过的算法压缩的。

更多

Tar具有许多功能,可以适应备份、文件、文件系统和磁盘数十年的变化。有关函数的完整列表,请阅读man tar(1)。

记录发生的事情

现在,您可以备份整个系统,并在单个文件中跟踪更改。剩下的就是跟踪你面前的屏幕上发生了什么。其中一个很少被提及但每个系统管理员都应该知道的非常有用的工具是script(1)。它记录您键入的所有内容以及屏幕上显示的所有内容。您可以记录错误并记录输出,以便以后进行剖析和分析。例如,如果你运行的程序每次都在同一个地方失败,你可以使用脚本复制你的击键和程序的响应。这在升级系统或从源代码构建软件时特别有用;日志文件的最后30行左右是对帮助请求的一个很好的补充。 要启动script(1),只需键入script。您将恢复命令提示符,并可以继续正常工作。当你想停止录制时,只需键入exit或按CTRL-D。你的活动将出现在一个名为typescript的文件中。如果您希望文件具有特定名称或位于特定位置,只需将该名称作为脚本的参数:

此工具对于准确记录您键入的内容以及系统的响应方式非常有用。任何时候你需要寻求帮助,都可以考虑script(1)。

修复损坏的系统

学习操作系统的最好方法就是玩它,你玩得越努力,学到的就越多。如果你玩得足够努力,你肯定会打破一些东西,这是一件好事——修复一个严重损坏的系统可以说是最快的学习方法。如果您刚刚使您的系统无法启动,或者计划快速学习以冒这个风险,那么本节适合您。如果你的系统被严重损坏,你会学到很多东西,而且很快。

单用户模式(在第4章中讨论)允许您访问许多不同的命令和工具。但是,如果你已经销毁了这些工具呢?也许你甚至损坏了/rescue中的静态链接程序。这就是安装媒体发挥作用的地方。

FreeBSD安装镜像有一个激活实时系统(live system)的选项。这个实时系统包括FreeBSD默认附带的所有程序。当您启动安装介质时,您可以选择进入实时CD而不是安装。

您必须熟悉系统管理才能使用live CD。本质上,live CD为您提供了一个命令提示符和各种Unix实用程序。你可以使用启动时的错误消息和你放在耳边的镇流器来解决问题。是你对着电脑。在我使用live CD或其前身的前六次中,计算机赢了三次。然而,在那之后,我的成功率大大提高了。阅读这本书以及其他Unix管理手册将提高你成功的几率。

对于一般问题情况,不可能概述一个循序渐进的过程;您必须遵循的确切步骤取决于您对糟糕、无辜的操作系统造成的确切损害。然而,如果你真的很绝望,live CD可以让你在不重新安装的情况下进行恢复。我遇到了一些问题,我不小心破坏了我的/etc目录,或者损坏了显示登录提示的getty(1)程序。仔细使用live CD可以在重新安装所需时间的一小部分内修复这些问题。如果没有别的,也许你可以备份任何幸存下来的数据,然后重新安装。

始终使用与您运行的FreeBSD版本大致相同的安装介质。您可能可以使用12.2安装CD来修复12.1系统,但14-current安装盘可能会导致一系列新的问题。

现在你可以从几乎任何可能犯的错误中恢复过来,让我们深入FreeBSD的核心:内核。