> Linux教程 > 系统运维 >

使用nfs进行网络备份


  关于一个网络的unix主机的正确备份方法,系统管理员们存在很多的争论。有些 认为磁带就是答案,而其他一些人则倾向于更先进一些的方法,比如可重写的cdrom。 不管什么方法,他们的最终目标都是:备份网络主机,并能够方便地索引和恢复。
  80年代末期,为节省开支,我决定使用一个闲置的服务器运行nfs,它有一个装载了 1/4英寸的dc6525磁带的500兆磁带机。方法很简单,同时它工作的也很好。我为每台主机 分配了三盘磁带,每星期进行三次循环备份。唯一的问题是磁带太笨重了,而且很多情况 下不可靠。dc6525的时代过去了,更贵、更复杂的设备取代了它们。
  过去几年里,我开始更新我的24台主机的网络。在开始前, 我考虑了可写cdrom和其 他一些商业产品。在对比了海量存储设备的商业产品的开销后, 我断定建造一个运行 linux的中心nfs服务器更为经济。基于我的原始模式,我用两个运行raid的热插拔scsi硬 盘取代了磁带机。这样能进行实时备份,数据可移动,同时将来能方便的扩充。
  本文中我将探讨nfs使用的一些很基本的方法。这些方法很多为你们所熟知, 但往往 被认为太复杂、太过时或者太难以实现而丢在一边。我们将仅仅接触nfs庞大冰山的一角。 由于nfs几乎是无限的可定制,这里的例子仅仅用来作为基本的指导。
  一般而言,进行任何形式的备份都需要思考,计划,以及对文件、外设和每个主机任 务的深入了解。网络中任何两个备份方案都不尽相同。备份的核心包括/etc目录下的配置 文件,各种cron文件,以及各系统特定的二进制程序。服务器中,根据服务器任务的不同, 我们需要备份/var/mail,web目录,或者/var/db。
  制定备份计划的第一步是,仔细检查目标系统,确定系统相关的文件,并记录下来。

nfs基础   在开始前,先介绍一些nfs的基本概念。nfs运行于udp上,在1989年三月由sun微系统 公司提出并定为rfc1094。多数人认为nfs不够安全,容易受到一系列漏洞的攻击,特别是 rpc portmapper的漏洞。除开安全性不谈, nfs仍然是公认的装载和备份远程文件系统的 方法,特别是在局域网上。也就是说,在公网上使用nfs时,理解防火墙技术相当重要。 你至少需要使用tcp wrapper或者在/etc/hosts.allow文件中提供可信赖名单。 永远不要 毫无保护的使用nfs,并且总是在没有使用时杀掉mountd和rcp.portmap进程。
  nfs的运作原理是远程装载,在每个主机上运行unix的portmapper和mountd(处理nfs 装载请求的服务器)守护进程。/etc/exports控制对服务器的访问,它包含一个授权主机 的清单,以及用户权限和允许的目录。

下面是mountd帮助手册的一段话:
  当mountd启动时,会使用mount系统调用将输出主机的地址和配置载入到内核中。 一 旦更改exports文件,应当向mountd进程发送挂起信号,以使其重新载入配置信息。 在发 送SIGHUP信号后,应检查syslog确认mountd没有在exports文件中发现语法错误。如果 mountd发现内核不支持nfs,将试图装载包含nfs程序的lkm。
  大部分bsd内核缺省时内置了nfs支持并可以在/etc/rc.conf中配置, 而linux则需要 可加载模块或者重新编译内核。

nfs备份原理
  nfs备份方法相对来说很简单:将所有主机装载到nfs服务器上,编写一个.tar备份脚 本,并检查所有机器的下列权限设定是否一致:1、读写存取 2、装载权限 3、 GID/UID

输出和权限:
  /etc/exports文件包括了nfs服务器的各个选项。在下面的例子中, jack.foo.com将 在nfs上装载到/jack,并允许读写。

# File /etc/exports on NFS Server
# When backing up an entire system, including root files (UID 0)
# you would use the no_root_squash option as outlined below *
# For files belonging to jack, the only option required is 'rw'

/jack jack.foo.com(rw,no_root_squash)

  UID/GID设置可能会令人混淆,特别在nfs服务器和主机是不同unix变种,或者使用不 同的密码机制的情况下。所有者和组权限依赖于UID/GID,在client和server段必须一致。 如果用户jack在客户机jack上的UID是2020,他必须在nfs服务器上的UID也是2020。
  如果nfs服务器上已经有用户使用UID2020,假设叫sam,则从客户机的UID2020在服务 器上显示为sam。当UID 2020还未使用时,文件将简单标记为UID 2020所有, 而没有用户 标识。(我们经常碰到这种情况,当解压ftp下来的文件时,原文件用户joe的UID 1010在 我们的系统上属于另一个用户,结果解压出来的文件就归另一用户所有了。)

  当恢复数据的时候,基于同样的原因,必须确认目标主机的UID/GID匹配。exports的 帮助手册说:
  通常,不希望客户机上的root用户在nfs服务器上也有root权限。为此,uid 0通常映 射为另一个id:所谓的匿名或者nobody。这叫做root squashing,是默认配置,可使用 no_root_squash关闭。小心使用此选项。
  注意要备份密码和组文件。每当在客户机上加减用户,记得要更新备份。

  两个简单的nfs服务器脚本
  本例中,我们启动rpc.portmap, rpc.mountd和rcp.nfsd, 并将每个进程的进程id写 入nfs.pid

#!/bin/bash
# Script to start NFS
/usr/sbin/rpc.portmap
sleep 1

/usr/sbin/rpc.mountd
sleep 1

/usr/sbin/rpc.nfsd
/sbin/pidof /usr/sbin/rpc.portmap > /var/run/nfs.pid
/sbin/pidof /usr/sbin/rpc.nfsd >> /var/run/nfs.pid
/sbin/pidof /usr/sbin/rpc.mountd >> /var/run/nfs.pid
echo "NFS READY"
# EOF

我们使用下面的脚本杀掉nfs.pid中的所有进程,从而停止nfs。

#!/bin/bash
# Script to stop NFS
kill `cat /var/run/nfs.pid`
/bin/rm /var/run/nfs.pid
echo "NFS HALTED"

同步备份
  通过在所有主机和nfs服务器上设置cron任务来在特定时间启动、停止和使用nfs,我 们可以实现同步备份。在备份后,所有主机停止nfs服务。为了精确同步, 所有主机应当 使用中心ntp时间服务调整时间。
  nfs服务器通过与上面相似的脚本在cron中启动, 并依据完全备份所需要的时间来确 定激活的时间段。对较大的备份来说,30分钟是一个不错的选择。之后,所有客户端装载 到服务器上,写入它们的文件,然后卸载。本例中使用tar。其他方法包括使用dump等命令。

#!/bin/sh
# File NFSBackup Script for jack.foo.com
echo 'Initialize NFS Backup'
mount nfs.foo.com:/jack /mnt/jack
df

echo "Is nfs.foo.com mounted?"
read ans;

echo "Full Backup of Jack to follow"
sleep 4

cd /mnt/jack
tar -cvvf jack.tar /vmlinuz /System.map /root /mydocs /etc
/bin /sbin /var/local /var/spool /usr/sbin /usr/bin home
/usr/home/glenn /usr/home/ifconfig
sleep 5

umount /mnt/jack
echo "finished"

  恢复文件
  几乎所有实际应用中,都使用手工恢复。直到今天,完全恢复还是令人混淆,特别是 当目标主机有多种用途。典型情况下,我们将主机装载到nfs服务器, 从远端文件系统读 取备份来完成恢复工作。

  使用mount命令将jack.foo.com装载到nfs.foo.com上:
mount nfs.foo.com:/jack /mnt/jack;
然后改变路径到 /mnt/jack
只需简单的从nfs.foo.com上untar jack.tar即可进行恢复。
tar -xvf jack.tar
然后将需要的文件从/mnt/jack拷贝到适当的位置。
以上仅仅是众多可用方法中的一种。

概述
下面是需要遵循的基本规则:

* 在完全重新安装系统的情况下,确认新安装的操作系统版本和原系统相同。这对所有配置文件的匹配尤其重要。 
* 确认所有用户的UID/GID和以前相同。使用原始的的密码和组文件检查所有用户。注意每个UID/GID与远端系统一致。简单的使用root恢复一切是不够的。 
* 记得在重装时恢复原始的内核。比如在linux下,运行lilo或者grub装载原来的内核。 
* 记住存档备份并放置到安全的地方,最好是离线。冗余能够在物理损坏时挽救你的数据。 

我的工作始终围绕着unix,其间我接触过不下50种备份方法,包括复杂的硬件设备,媒质,各种图形界面和基于web的界面。有些现在仍然使用,而大多数则已淘汰。就我而言,nfs加上tar(dump)仍然是最好的选择。它需要一些正确配置nfs的知识,但是总而言之,这是保护有价值数据的最可信赖的方式之一。 (责任编辑:IT)