使用 Linux 构建家庭 Terabyte 备份系统
高容量磁盘驱动器现在已经广泛普及,价格与几年前相比简直是不可思议的便宜。此外,随着越来越多的 Linux 用户将 CD 翻录到磁盘,保存数码相机的图像,并使用数字摄像机和 DVR(如 MythTV)录制视频,备份和归档大量数据的需求变得至关重要。由于磁盘崩溃而丢失您孩子的照片和视频——或您的音频音乐库——将是一场灾难。幸运的是,使用廉价的磁盘驱动器和免费软件,可以轻松廉价地构建高容量、基于 Linux 的备份服务器。
实际上,任何家用 PC 都可以满足备份服务器的基本要求。如果您的备份窗口较长或数据量相对较小,则计算机速度慢不是障碍。确保您的网络速度足够快,以便在备份窗口内传输数据。对于较旧的设备,备份的瓶颈可能是磁盘数据传输带宽(取决于磁盘技术,为 30-150Mbps)。
许多消费级计算机的散热能力不足以支持两个以上的内置硬盘。大多数主板最多支持四个板载磁盘(通常是四个 ATA/IDE 设备,但两个 ATA/IDE 和两个 SATA 的组合正变得越来越普遍)。外部 USB 高容量驱动器也可用。如果您的计算机较旧且具有 USB1,请购买廉价的 USB2 PCI 扩展卡,速度快十倍。
SCSI 的限制较少,但价格昂贵,并且往往使购买者局限于“当月流行”的 SCSI 技术。磁盘扩展和升级的一个选项是主机总线适配器 (HBA),例如 Promise Technology 制造的那些。HBA 是 PCI 扩展卡上的磁盘控制器。HBA 通常不需要额外的软件,有自己的 BIOS,并且不受 PC BIOS 对磁盘大小的限制。HBA 使您可以将大磁盘(超过 120GB)放入具有旧 BIOS 的系统中,从 ATA-33 升级到 ATA-150,或混合使用 ATA 和 SATA 磁盘。
您可能需要考虑购买专用文件服务器。能够容纳六个磁盘的裸机服务器(完全预组装,不含磁盘或操作系统)的成本可能低于 1,500 美元。通过这项初始投资,您可以根据需要扩展磁盘空间,每 GB 不到 0.80 美元,或者通过插入 USB 磁盘来扩展。一旦您确定了需要的磁盘数量,请考虑它们的空间、散热和噪音要求。图 1 显示了一个使用旧服务器构建的备份系统示例。该系统具有超过 1TB 的存储容量。
即使您选择从头开始构建服务器并配备高容量磁盘,您也可以预期您的 TB 级以上备份服务器的成本仍然以每 GB 价格计算是最低的。这是因为存储成本已经大幅下降。表 1 提供了备份服务器的各种不同配置,以及每种配置的估计每 GB 价格(注意:价格是估计值,不包括税费或运费)。从表中可以看出,配备超过 2TB 存储空间的新服务器的构建成本可能低于每 GB 1.50 美元。这将备份大量的家庭电影、数码照片和音乐文件!
表 1. 一些备份选项,以及估计的每 GB 成本
类型 | 配置 | 容量 (TB) | 每 GB 成本 ($) |
---|---|---|---|
ATA/SATA 磁盘 | 内置磁盘 | 0.4 | 0.56 |
Linux 桌面* | 三个内置磁盘 | 1.2 | 0.84 |
Linux 桌面* | 三个内置磁盘加两个 USB 外部磁盘 | 2.0 | 0.73 |
LaCie 2TB 存储 | 网络服务器设备 | 2 | 1.15 |
Linux 服务器** | 六个内置磁盘 | 2.4 | 1.21 |
Linux 服务器** | 六个内置磁盘加两个 USB 外部磁盘 | 3.2 | 1.08 |
*Intel Celeron D 478 325 2.53GHz,256MB 内存。 **Intel SC5275 机箱,Intel ATX 主板,双 3GHz Xeon CPU,2GB 内存。
在过去的几年里,我使用 Red Hat Linux 9 构建了备份服务器,但您可以使用任何版本的 Linux。我使用 Red Hat 9 是因为它稳定、免费、当前维护(Fedora Legacy Project)且易于安装和配置。如果您购买新计算机,您可能必须使用更新版本的 Linux。对于成本至上的低预算系统,我通常不使用 RAID,但值得考虑。
Linux 备份服务器的软件要求非常低。需要基本的网络管理实用程序(包括安全外壳 SSH 和安全外壳守护程序 sshd)和 rsync。rsync 是一个快速、增量复制/同步实用程序,大多数 Linux 发行版都附带它。使用 SSH 和 rsync,您可以执行几乎所有基本的备份任务。备份服务器也充当文件服务器是有利的,因此我也安装了 Samba,即 SMB 文件服务器。我使用 Samba 是因为它MS Windows 客户端的默认文件服务器,并且任何 UNIX 系统(包括 Mac OS X)也可以使用 Samba 客户端轻松访问它。如果您有同构 UNIX 网络,则可以使用 NFS,我在此处不讨论它。
如果您需要将额外的磁盘连接到服务器,首先要确保您有足够的数据(IDE/SATA/SCSI)电缆和电源线来容纳扩展。确保您的驱动器与 Linux 兼容(尽管大多数都兼容)。关闭计算机电源并断开电源线。将磁盘物理连接到您的计算机。Linux 应该在启动时识别新磁盘。如果您的驱动器未被识别,则说明您的磁盘不兼容,或者您需要找到并安装其驱动程序。使用以下命令检查启动消息中是否有新驱动器dmesg命令。IDE 驱动器的启动消息可能如下所示
hdb: ST3400832A, ATA DISK drive
所有 IDE/ATA(和一些 SATA)驱动器都有 hdx 的名称,其中 x 替换为字母表中的字母(在本例中为 b)。同样,添加新的 USB 或 SCSI(和一些 SATA)磁盘会给出启动消息,指示新的驱动器名称 sdx,其中 x 替换为相应的字母。
大多数 Linux 发行版都带有 GUI 磁盘管理器。这些磁盘管理器允许您定义和格式化分区(我通常每个备份磁盘使用一个分区)、分配挂载点(例如,/data1、/data2)并挂载分区。该过程也可以从命令行完成,使用 fdisk 创建分区。
创建新分区
要在 hdb(上面)上创建新分区,请键入
fdisk /dev/hdb
类型m在 fdisk 提示符下获取帮助摘要。键入n在提示符下询问我们正在创建的新分区
Command action e extended p primary partition (1-4) p
对于单个主分区,键入p:
Partition number (1-4):1
然后提示您输入分区号(键入1对于单个分区)。接下来,通过确定第一个和最后一个柱面来设置分区大小。由于我们使用整个磁盘,因此您应该能够选择默认值(第一个和最后一个柱面)
First cylinder (1-48641, default 1): Using default value 1 Last cylinder or +size or +sizeM or +sizeK (1-48641, default 48641): Using default value 48641
类型w写入分区表。现在您有了一个分区 /dev/hdb1,它占据了整个磁盘。
接下来,使用 mkfs 命令以您选择的文件系统格式(我的是 ext3 格式)格式化分区
mkfs -t ext3 /dev/hdb1
为您新磁盘的新分区创建一个挂载点(我将其称为 /data1)
mkdir /data1
挂载新创建的 ext3 分区
mount -t ext3 /dev/hdb1 /data1
并测试读取和写入。最后,在 /etc/fstab(挂载表)中添加一行,以便在启动过程中自动挂载
# Device mountpoint fstype options freq pass_no /dev/hdb1 /data1 ext3 defaults 1 2
大多数 Linux 发行版都包含 rsync。您的备份客户端和服务器上都需要 rsync 和 SSH。通过在命令提示符下键入以下命令来检查是否已安装 rsyncrsync或检查已安装软件包的列表。如果您找不到软件包的二进制发行版,可以通过 rsync 主页(请参阅在线资源)上的链接下载 rsync 的源代码。
通过网络运行 rsync 的最简单方法是以独立应用程序的形式运行,并使用 SSH 进行身份验证。您可以将 rsync 作为守护程序运行,它具有更多功能,但在本例中您不需要这样做。我在此处使用名为 foo 的备份客户端和名为 bar 的服务器来说明这一点。
要使用 rsync 和 SSH 将 Linux 机器 foo 上的目录 /home 复制到备份服务器 bar 的目录 /data1/foo,请从客户端 foo 键入
rsync -az /home -e ssh bob@bar:/data1/foo
系统将提示您输入用户 bob 的密码,然后 foo /home 目录将复制到 bar 上的 /data1/foo/home(bob 需要在服务器上有一个帐户,并且对 /data1/foo 具有写入权限)。
为避免每次都输入 bob 的密码,请为 SSH 身份验证创建不带密码的私钥/公钥对。这允许您自动化登录过程。
生成密钥对
在您要登录的机器上(在本例中以 bob 身份登录到 bar),键入ssh-keygen -d生成密钥对。如果其他用户可以访问/读取密钥,请输入密码。否则,按 Enter 键。更改到 .ssh 目录并将公钥复制到允许列表
cd ~/.ssh cp id_dsa.pub authorized_keys2
将私钥复制到您将从中登录的机器上的帐户的 .ssh 目录(例如,foo 上的 root 用户)。从 bar(您要登录的机器)中删除私钥
scp id_dsa root@foo:~/.ssh/id_dsa rm id_dsa
在您要登录的机器上,启动 SSH 代理,并将密钥添加到代理的列表(ssh-add如果您在上面的第一步中输入了密码,则会要求输入密码)
eval `ssh-agent` ssh-add
现在您可以从 foo 无密码登录到帐户 bob bar
ssh bob@foo
您可以在 foo 上运行脚本以使用 bar 上的 bob 帐户在 bar 上复制 foo。您应该阅读 rsync 的文档,它具有许多功能(超过 70 个命令行选项)。特别是,如果误用 -delete 选项可能会造成灾难性后果。列表 1 显示了为期七天的增量备份。每周每天更改或删除的文件都存储在以日期命名的目录中(由 -backup-dir 设置)。最新的备份存储在目录 current 中。
列表 1. 完全和增量 rsync
#!/bin/sh # This script does backups of foo to the backup server bar # in a 7 day rotating incremental backup. # Based on script by Andrew Tridgell # directory to backup BDIR=/home # Remote directory on backup server BACKUP_HOME=/data1/foo # Backup login account on remote server BACKUP_LOGIN=bob # the name of the backup server BSERVER=bar BACKUPDIR=`date +%A` OPTS="--force --ignore-errors --delete --backup -backup-dir=$BACKUP_HOME/$BACKUPDIR -av" export PATH=$PATH:/bin:/usr/bin:/usr/local/bin # Dump output to backup file date > /var/log/backup.$BACKUPDIR.log # the following line clears the last week's incremental directory [ -d /tmp/emptydir ] || mkdir /tmp/emptydir rsync --delete -a /tmp/emptydir/ BACKUP_LOGIN@$BSERVER:$BACKUP_HOME/$BACKUPDIR/ rmdir /tmp/emptydir # now the actual transfer rsync $OPTS $BDIR BACKUP_LOGIN@$BSERVER:$BACKUP_HOME/current >> /var/log/backup.$BACKUPDIR.log
如果您喜欢压缩存档格式,您仍然可以运行tar通过网络进行完整备份
tar cvfz - /home | ssh bob@bar dd of=/data1/foo/current.tar.gz
并使用 -newer 选项进行增量 tar 备份。
rsync 比 tar 命令更有效,因为 rsync 仅复制当前数据副本和先前数据副本之间的差异。
您可以在大多数平台(包括 MS Windows)上使用 rsync 和 SSH,但实际上,文件服务器设置是更可取的,尤其是在您运行 MS Windows 客户端时。对于 MS Windows 机器,Windows 备份应用程序是更可取的。最简单的方法是运行备份以写入 Samba 服务器上的共享。
如果您的 Linux 安装支持 SMB 文件共享,则可能已安装 Samba。如果未安装,则几乎所有发行版都包含二进制文件。如果您的发行版不是这种情况,或者您更喜欢使用最新的 Samba 版本,请下载源代码并编译和安装。官方 Samba 发行版可从 Samba 主页获得(请参阅资源)。有关安装和初始配置 Samba 的信息,请参阅那里的文档。
一旦您的备份服务器安装了 Samba 服务器,所有 Samba 配置都是通过编辑 smb.conf 文件进行的,该文件通常位于 /etc/samba/smb.conf 或 /usr/local/samba/lib/smb.conf 中。Samba 通常包含图形配置实用程序,如 SWAT。有关启动或停止 Samba 的信息,请参阅您的文档。您应该配置您的服务器以确保 Samba 在服务器首次启动时启动。
按照上面的备份示例,在服务器 bar 上,设置一个简单的 smb.conf 文件,或者尝试将以下部分附加到现有的 smb.conf 文件以定义一个名为 bob 的共享
[bob] comment = foo backup account path = /data1/foo valid users = bob public = no writable = yes
接下来,将 bob 添加为 Samba 用户,并使用任何安全密码(bob 必须有一个 Linux 帐户以及读取/写入 /data1/foo 目录的权限)
smbpasswd -a bob New SMB password: somepassword Retype new SMB password: somepassword Added user bob
对于 MS Windows 客户端,使用用户名 bob 和 bob Samba 帐户的 SMB 密码将共享 \\bar\bob 映射为 MS Windows 中的网络驱动器。然后,您应该能够将备份运行到映射的网络驱动器。我通常使用免费的 ntbackup 软件,并将其设置为将 .bkf 文件写入网络存储。ntbackup 随 Windows 2000 和 XP 免费提供,并且可以从 Windows 客户端运行自动、定期计划的备份。基于 Windows 客户端的备份的优势在于可以备份系统的整个状态(包括 Windows 注册表)。
您还可以使用 Samba 为大多数 UNIX 或 Mac OS X 客户端提供文件服务。smb 客户端默认安装在 Mac OS X 中。在 Linux 发行版中,确保安装了 smb 客户端软件包。smb 共享应挂载到机器 foo 的 /backup 挂载点
mount -t smbfs -o username=bob,password=somepassword //bar/foo /backup
要使备份驱动器在系统启动时挂载,请在 /etc/fstab 中放置如下行
//bar/data1/foo /backup smbfs rw,username=bob,password=somepassword 0 0
为了增加额外的安全级别,您可以考虑在您的整体备份计划中添加第二个服务器,该服务器位于异地,远离您的主备份服务器所在的家庭或办公室位置。这允许您每周将备份服务器镜像到异地位置一次。这样,如果您在主要位置发生火灾或其他灾难,您的数据仍然可用。图 2 显示了此设置的示例配置。
列表 2 是一个基本脚本,它使用 rsync 将服务器 bar 镜像到异地镜像 baroffsite。始终设置备份以自动且定期运行。始终保留备份日志,并始终检查备份日志。
列表 2. rsync 镜像 bar 到 baroffsite
#!/bin/sh # Mirror /data1 on bar to /data1/bar on baroffsite. #Backup directory on bar BACKUP=/data1 #Backup directory on baroffsite BACKUP_OFF=/data1/bar # Give the day of week as name of backup BACKUPNAME=`date +%A` # Offsite server BSERVER=baroffsite # Backup account on backup server BAC_ACC=backup date > /var/log/backup.$BACKUPNAME.log /usr/bin/rsync -avz --delete -e ssh $BACKUP $BAC_ACC@$BSERVER:$BACKUPOFF >> /var/log/backup.$BACKUPNAME.log # Email the log to administrator cat /var/log/backup.$BACKUPNAME.log | mail -s 'Mirror Check' backup_guy@mycompany.com
为了监控您的备份过程并确保您的备份按计划运行(以及您的备份服务器没有耗尽磁盘空间),重要的是要实施一些自动监控和报告。列表 3 是一个简单的脚本,可以设置为通过 cron 定期运行,并向您发送已发生的备份摘要以及每个分区上剩余的磁盘空间量。
列表 3. 简单的时间戳和磁盘空间列表器
#!/bin/sh # Check space on partitions # List timestamps in chronological order BACKUPS=/data1 #Identify directories to check # Give the day of week as name of backup BACKUPNAME=`date +%A` #Timestamp date > /var/log/backup.$BACKUPNAME.log # Disk space on partitions df -k > /var/log/backup.$BACKUPNAME.log echo ' ' >> /var/log/backup.$BACKUPNAME.log #List timestamps on backup server # ls -lRt is much more verbose ls -lt $BACKUPS/* >> /var/log/backup.$BACKUPNAME.log # Email the log to administrator cat /var/log/backup.$BACKUPNAME.log | mail -s 'Backup Check' backup_guy@mycompany.com
本文的资源: /article/8635。
Duncan Napier 在不列颠哥伦比亚省温哥华地区担任计算机和仪器顾问。