Linux系统管理员常常问的一个问题是:如何备份我的系统?对于windows系统来说,进行备份是很简单的工作(仅仅需要在菜单模式下点击鼠标就可以完成)。 Linux备份工作则要麻烦的多,若你不熟悉Linux系统文件和设备,情况则会变得更糟。该篇文章讨论了在Linux环境下保护数据的方法和相关的设备信息。
1、什么是备份?
最简单的讲,备份数据的过程就是拷贝重要的数据到其他的介质之上(通常是可移动的),以保证在原始数据丢失的情况下可以恢复数据。一次备份可能是简单的cp命令,将一个文件复制到其他目录下,也可能是使用特定的程序将数据流写进一个特定的设备中的复杂过程。很多情况下是将要备份的数据写入到磁带机中,但有些情况也不是这样的。在Linux环境下,或其他Unix系统,备份可以是将文件拷贝到已存在的文件系统,可替换的文件系统,磁带机,远程文件系统,甚至是远程系统的上的磁带机。当然,从用户的角度来看,并不存在磁带机或ZIP驱动器的概念,而仅仅是文件而已。
2、应该选择哪一种备份设备?
市场上有很多自称是“完美的系统备份选择”的设备,包括磁带机,便携式磁盘驱动器,甚至有神秘的Internet备份系统。对于备份操作来说,磁带机提供了最可信的存储方式。为什么是磁带机呢?当然,Iomega公司的Jaz或Zip驱动器看上去是令人感兴趣的备份工具,但是它们易于在硬盘驱动器崩溃的情况下因为文件系统的原因而导致问题出现。对于Internet备份来说,当你因为系统崩溃而不能访问互联网时,就不能恢复系统的数据。同样,你能真正信任你的数据存放在别人的远程系统么?
因此,我们选择了磁带机,但是如何访问磁带机呢?正如文章前面提到的,在Linux系统中,在用户状态的角度来看,任何都可以被看做是文件。因此,可以“打开”合适的磁带驱动器文件来进行写入操作,将要备份的数据写入到文件中去。虽然这听上去过于简单了,但是实际情况就是这样。Linux环境下根文件系统的/dev目录包含了所有和物理设备关联的文件。当对这些文件进行操作,实际上是在操作下层的物理设备。下面的表格说明了Linux环境下设备文件是如何和物理设备关联起来的:
设备(Device) 回卷(Rewinding) 不回卷(No-Rewind)
1st SCSI tape drive /dev/st0 /dev/nst0
2nd SCSI tape drive /dev/st1 /dev/nst1
nth SCSI tape drive /dev/st[n-1] /dev/nst[n-1]
1st ATAPI tape drive /dev/ht0 /dev/nht0
2nd ATAPI tape drive /dev/ht1 /dev/nht1
nth ATAPI tape drive /dev/ht[n-1] /dev/nht[n-1]
1st floppy tape drive /dev/ft0 /dev/nft0
|
这正如在上表中看的那样,设备名是基于位于针对这种设备类型的分层结构的设备的逻辑数字,而不是其物理ID(SCSI)或者IDE通道(ATAPI)。因此,即使某个SCSI磁盘机被分配为SCSI设备的ID4,如果它是SCSI链的第一个磁带设备,则它将是 /dev/st0, 而不是/dev/st4,这种命名惯例有利于跟踪系统中的磁带设备,甚至在拥有多个驱动类型的磁带设备。同样,在2.0.X内核下,只支持单个ATAPI设备,2.2版本的内核可以使用多个ATAPI驱动(ht0, ht1,...)。
现在我们来看看这些文件是如何被命名的,回卷和不回卷的区别在哪里呢?简单的说,回卷设备允许在结束操作以后,自动将磁带回卷到开始处,而不回卷设备在操作结束以后,将磁带机停留在当时的位置而不进行回卷操作。对于大多数简单备份操作,回卷设备更适合一些,因为在备份操作结束以后其自动回卷以准备取出磁带。而对于那些复杂的备份操作(如附加备份,逻辑搜索及那些高端备份工具的操作),不回卷设备更适合一些。
3、Linux环境下的设备访问
在Linux环境下,设备访问是通过和它们关联的设备节点文件。这些节点位于/dev目录下,但是不要混淆概念—一个设备节点不仅仅是一个简单的文件。当打开一个设备节点以供访问时,其有特殊的属性来通知内核操作的是哪一个物理设备。每一个节点文件都有一个关联的主号和从号(major and minor number)及设备类型属性,例如,对于SCSI磁带机的设备节点情况如下:
crw-rw-rw- 1 root operator 9, 0 Dec 1 04:10 /dev/st0
|
第一个“c”表示该设备是一个字符设备(意味着该设备在I/O操作时每次仅仅处理一个字符),主号为9,从号为0。主号就象一个地址来通知内核使用哪个设备驱动器,而从号则被用来定义该设备的某个特定实例的功能。如果该节点文件不存在呢?Linux提供了一个命令来方便的创建一个设备节点文件-mkmod,命令格式如下:
mknod /dev/nodename [c|b] major minor
|
然而若系统中没有合适的设备节点,则需要检测内核是否支持了这种类型的设备。这可以通过命令cat /proc/devices的输出来察看,在我的系统中,情况如下:
Character Devices
1 mem 10 misc
2 pty 14 sound
3 ttyp 21 sg
4 ttyS 29 fb
5 cua 37 ht
7 vcs 128 ptm
9 st 136 pts
Block Devices
1 ramdisk
2 fd
3 ide0
9 md
22 ide1
|
很多管理员在操作回卷设备时都会遇到关于mt命令的问题。mt命令实现操作一个“磁带”设备。例如,命令mt -f /dev/st0 eod 命令设置磁带为进行新的附加备份做好准备,磁带机/dev/st0将前进到数据结束处以准备新的附加备份操作,但由于st0是回卷设备,磁带机在定位到数据结束以后马上回卷到开始处并关闭磁带设备(因为st0是一个回卷设备)。这时候如果进行备份操作则会覆盖磁带中的数据信息,而不是将新数据附在磁带数据结束处。若使用非回卷设备,mt将会把磁带停留在eod的位置,随后的备份操作将被添加到上次备份结束以后的地方。
对于这种问题的推荐解决方法是在为希望使用的非回转设备建立符号链接,如:/dev/tape,mt命令在没有提供-f参数时则可以使用/dev/tape来操作该设备。若系统拥有多个磁带设备,则你可以不使用符号链接的方式,而使用环境变量TAPE=/dev/nst[x]来达到一样的结果。对于上面两种方法,在使用mt命令时不需要使用-f参数,例如:mt eod,则会自动使用正确的介质位置,而无需关心使用的是哪个/dev设备。