LVM 和可移动 IDE 驱动器备份系统

作者:Mike Fogarty

当我就职的公司,一家土木工程和测量公司,决定将其所有 AutoCad 图纸转移到中央文件服务器上时,我们面临的备份情况比以往任何时候都要大几个数量级。当时(现在规模更大)我们大约有 120,000 个文件,总计 200GB,这些文件处于活跃更改状态,需要至少每天备份一次。

我的第一个想法是某种磁带备份系统,但是当我开始研究它们时,我对遇到的价格感到震惊。一个足够大的磁带自动加载机来容纳我们的文件系统大约需要 12,000 美元,而一个 40GB 的磁带则要 89 美元。当我第一次说服我的老板让我在我们的服务器上运行 Linux 时,价格便宜是一个很大的卖点。那么,还有什么替代方案呢?

我一直在使用一个可移动的 120GB IDE 驱动器在家中来回传输数据;驱动器花费了我 101 美元,可移动托架花费了 17 美元。我还有一个退役的 1GHz P4 电脑,花费了大约 800 美元——这个数学题开始变得有趣起来。如果我能找到一种方法将 120GB 的驱动器组合在一起,我就能成功了。就在那时,我发现了 Linux LVM(逻辑卷管理器)。

使用 LVM,如果您愿意,可以将可移动驱动器视为大型廉价磁带,并使用任何传统的增量和完全备份轮换方案,例如汉诺塔。我们根据自身需求采取了一种略有不同的方法。对我来说,为了从磁带中恢复文件,您必须按顺序搜索它,恢复完整备份,按顺序应用增量备份,最后才能得到您想要的版本,这似乎总是很麻烦。我想要一个备份系统,它可以让我打开和检查图纸,以确定它们是否是合适的版本,然后再进行恢复,而使用 LVM 我就得到了我想要的。这样做需要更多的驱动器,但我在自动加载机上节省的 12,000 美元可以购买大量的驱动器。

我可能应该借此机会警告大家,我仍然是 Linux 新手,我做的事情无疑会让更有经验的人不寒而栗。我为自己辩解的唯一理由是,我仍在学习,而且这些东西在现实世界中运行得非常好,我发现没有必要改变它们。

我们首先设置了 P4 电脑,配备了一个用于操作系统的 IDE 驱动器、一个 CD-ROM 驱动器(用于加载操作系统)和两个可移动驱动器托架,每个托架包含一个 120GB IDE 驱动器。后来它扩展到 RAID 控制器上的四个驱动器,作为 JBOD,但让我们保持这个示例简单。我们在备份服务器上加载了 Red Hat 8.0——第一个包含 LVM 的 Red Hat 版本——并在网络上为其分配了一个 IP 地址。以适合您自己网络的方式配置您的电脑。

因为我们将要将这些驱动器移入和移出机箱并异地存放,所以我们需要一种方法来跟踪哪个驱动器是哪个。我使用了不干胶字母,并将留在机箱中的第一个驱动器托架部分标记为 A,将取出的部分标记为 A1。留在机箱中的第二个驱动器托架部分标记为 B,取出的部分标记为 B1。这些是我们一天的备份。随后的几天被称为 A2B2、A3B3 等等。

完成此操作后,我们准备配置我们的驱动器,在本例中为 /dev/hdb 和 /dev/hdd,用于 LVM。首先以 root 用户身份登录并键入fdisk /dev/hdb. fdisk 返回一个有用的警告,因为我们正在使用 120GB 的驱动器,所以柱面数设置得高于某个数字,但我们可以安全地忽略这一点。相信我,我们可以。

假设我们从一个新的未格式化的磁盘开始,我们希望创建一个新分区。键入n然后按 Enter 键。fdisk 现在询问我们是否要创建扩展分区还是主分区。我们想要一个主分区,所以键入p. fdisk 现在想知道分区号 (1-4),所以键入 1。

接下来,fdisk 想知道我们分区的起始柱面。默认值为 1;按 Enter 键接受它。fdisk 现在想知道我们分区的结束柱面。默认值是驱动器上最后一个可用的柱面;再次,按 Enter 键接受它。

让我们看一下到目前为止我们创建的内容。要查看分区表,请键入p并按 Enter 键。我们应该看到类似以下内容


DEVICE   BOOT  START  END    BLOCKS    ID    SYSTEM

/dev/hdb1       1    15017   (large    83     Linux
                             number)


到目前为止,我们还没有实际修改分区表。这些更改由 fdisk 保存在内存中,直到我们告诉它写入它们。在任何时候,我们都可以通过键入q.

退出 fdisk 而不进行永久更改。到目前为止,一切看起来都不错,除了分区类型,它似乎是 83 Linux。我们需要将其更改为 Linux LVM,我们通过键入t然后8e. 现在,当我们通过键入p读取分区表时,我们应该看到


DEVICE   BOOT  START  END    BLOCKS    ID    SYSTEM

/dev/hdb1       1    15017   (large    8e    Linux LVM
                             number)


这就是我们想要的,所以我们现在通过键入w正式更改分区表。此时,fdisk 变得非常兴奋,并告诉我们分区表已更改并返回一些关于它正在做什么的持续信息,然后草率地将我们丢回到命令提示符下。

除了我们需要对我们将要包含在逻辑卷集中的任何其他驱动器重复此过程外,我们已经完成了最棘手的部分。

此时,我们准备开始创建逻辑卷。在 lvm 手册页中可以找到许多有用的信息。键入man lvm会将您带到父页面,该页面提供了指向子标题手册页的说明。现在我们的磁盘已格式化为 Linux LVM,我们需要将它们创建为物理卷,以便包含在卷组中。我们通过键入pvcreate /dev/hdb1 /dev/hdd1.

现在我们必须将我们创建的物理卷加入到一个卷组中,从中可以创建一个或多个逻辑卷。LVM 的一个特殊之处是,此时我们必须为我们的卷组设置物理扩展大小。也就是说,我们必须定义一个特定大小的单位,以兆字节为单位,称为物理扩展。我们从该卷组创建的任何逻辑卷都不能包含超过 64k 个物理扩展。如果我们怀疑我们的逻辑卷最终可能包含 1TB 的数据,我们需要将我们的物理扩展设置为 16MB。我们在创建卷组时通过键入


vgcreate -s 16M a1b1 /dev/hdb1 /dev/hdd1     

现在我们有了一个名为 a1b1 的卷组,它由两个物理卷 /dev/hdb1 和 /dev/hdd1 组成。让我们创建一个逻辑卷,它使用此卷组上的所有可用空间,方法是键入lvcreate -L 226g a1b1.

-L 选项指定大小 (226GB)。由于某种原因,我从未能够让一个广告宣传为 120GB 的驱动器在此点产生超过 113GB 的容量。在上面的 lvcreate 行中,我们实际上接受了默认的逻辑卷名称 (lvol1),所以我们的逻辑卷现在是 /dev/a1b1/lvol1。请注意,最后一个字符是数字一而不是小写字母 l。现在我们需要在我们的逻辑卷上创建一个文件系统。我更喜欢为我们的图纸文件使用 ext3 文件系统,因为它们的文件很大。我们可以通过键入mke2fs -j /dev/a1b1/lvol1.

文件系统需要一段时间才能创建,但完成后,唯一剩下要做的就是创建一个挂载点。我们通过键入mkdir /mnt/back来完成。我们通过键入


mount /dev/a1b1/lvol1 /mnt/back  


挂载我们的逻辑卷。df -h /mnt/back我们可以通过键入它来测试它;操作系统应该报告我们在 /dev/a1b1/lvol1 上有大约 226GB 的可用空间。

如果将来我们需要向此卷组添加驱动器,我们可以使用 vgextend 和 e2fsadm 动态地进行。我们现在需要为我们希望创建的每个卷组重复此过程。我每周使用一个,并且每月我都会取出一个轮换并保存一年。这不必一次完成;我每天做一个,直到全部完成。

我们的网络主要由 Windows 工作站组成,通过 Samba 连接到 Linux 服务器。因此,我们设置了一个 Samba 配置,以相同的方式使我们的备份服务器可用。首先,将默认的 Samba 配置文件复制到一个安全的位置。在 Red Hat 系统上,这是 /etc/samba/smb.conf。现在,我们编写一个新的更简单的 smb.conf。使用您最喜欢的编辑器,键入


encrypt passwords=yes

netbios name=yourbackupserver

workgroup=yourworkgroupname

[back]

read only=no

path=/mnt/back


将其另存为 /etc/samba/smb.conf。现在我们将通过键入/etc/rc.d/init.d/smb restart重新启动 Samba 服务器。在第一天晚上,我们使用 cp 将整个文件系统复制到 a1b1。您可能需要在您的系统上取消别名 cp,以确保未设置 -i 标志。对于 200GB,此 cp 过程可能需要 10-12 小时。在第二天晚上,我们将整个文件系统复制到 a2b2,依此类推,直到我们拥有每周每一天的完整副本。在随后的晚上,我们使用cp -au并且只复制自上次备份以来已更改的文件。这只需要一两个小时,并且具有一个优点,即从主服务器意外删除的任何文件都保留在备份中。

每天更换驱动器时,激活卷组和挂载逻辑卷有点繁琐,因此我们编写了一个小的 Perl 脚本来为我们执行此操作。使用我们最喜欢的编辑器,我们将此脚本放在一起:像这样


#!/usr/bin/perl


$hold = `vgscan | grep a[0-9]b[0-9]`;

$hold2 = substr($hold, 39, 4);

`vgchange -a y $hold2`;

`mount /dev/$hold2/lvol1 /mnt/back`;

print "$hold2 mounted\n";


并将其保存为 /home/me/mountback.pl。我们通过键入chmod 700 /home/me/mountback.pl.

使其可执行。在第一行,我们的脚本创建一个名为 $hold 的变量,运行操作系统命令 vgscan 以搜索卷组,将此命令的输出管道传输到 grep,grep 搜索包含 a、后跟 0-9 的数字、后跟 b、后跟 0-9 的数字的行,并将其放在 $hold 中。在下一行,我们创建一个名为 $hold2 的变量,对放在 $hold 中的文本行运行 substring 命令,抓取前 39 个字符后的四个字符,并将它们放在 $hold2 中。这应该是我们卷组的名称,a1b1。

在手动运行 vgscan 几次之后,卷组名称将出现在文本行中的位置变得很明显。在第三行,我们运行 vgchange,使用 -a 选项(激活),并为其提供 y 选项表示 yes 以及当前卷组的名称,该名称应该在 $hold2 中。在第四行,我们将逻辑卷挂载到我们之前创建的挂载点。在最后一行,我们将我们已挂载的卷的名称打印到屏幕上。如果我们做错了什么,我们在这里会收到一些奇怪的消息。我一直打算回头为此脚本添加一些错误检查,但不知何故我一直没有抽出时间来做。它日复一日,年复一年地工作良好。

因此,总结一下我们的步骤,要更换我们的备份驱动器,我们键入shutdown -hnow。当机器完成关机后,我们移除标记为 a1 和 b1 的驱动器,并将它们替换为标记为 a2 和 b2 的驱动器。然后,我们启动机器并以 root 用户身份登录。键入/home/me/mountback.pl,我们应该看到 a2b2 已挂载。

我们现在已准备好进行今晚的备份。这最好作为主服务器上的 cron 作业运行,主服务器可能具有更多更快的处理器、RAM 等。一段时间以来,我一直满意地使用基于 cp -au 的 shell 脚本,并且最近开始尝试 rsync。我有充分的理由相信 tar 也能很好地工作。一个简单的脚本可能类似于


#!/bin/bash

echo $0 >> /var/spool/mail/me

echo "START:" >> /var/spool/mail/me

date >> /var/spool/mail/me

mount -t smbfs -o username=me,password=mepassword

//backupserver/back /mnt/mountpoint

(above 2 lines should be on 1 line in your script)

cp -au /files /mnt/mountpoint

umount /mnt/mountpoint

echo "FINISH:" >> /var/spool/mail/me

date >> /var/spool/mail/me


这会将我们备份服务器上的逻辑卷挂载到主服务器上的挂载点,复制自上次备份以来已更改的所有文件,并向我们发送一封电子邮件,其中包含我们的备份 cron 作业的名称、备份开始时间和备份结束时间。然后,脚本卸载逻辑卷。

我希望这篇文章对任何发现自己处于类似备份情况并正在考虑将可移动 IDE 驱动器作为一种可能的解决方案的人有所帮助。当我刚开始从事这一行工作时,我会研究那些展示如何做我迫切需要学习的事情的文章,仔细遵循它们并很好地掌握这个过程,直到最后作者说类似这样的话,“现在你所要做的就是对通常的配置文件进行一些更改,重新编译内核,你就完成了”,这会使整个事情对我来说毫无用处。我试图不让这种情况在这里发生,但是如果有人试图实施此解决方案并遇到障碍,请给我发送电子邮件至 mikef@farnerbarley.com,我会尽力帮助您克服困难。

Mike Fogarty 是 Farner, Barley and Associates 的系统管理员,该公司是佛罗里达州中部的一家土木工程和测量公司。他拥有伊利诺伊大学的 Linux 系统管理证书,并且是系统管理员协会 SAGE 的成员。

加载 Disqus 评论