磁带机简介
目前市场上有很多自称是“完美的系统备份选择”的设备,包括磁带机,便携式磁盘驱动器,甚至还有一些神秘的Internet备份系统。对于备份操作来说,还是磁带机提供了最可信的存储方式。为什么是磁带机呢?当然,Iomega公司的Jaz或Zip驱动器看上去是令人感兴趣的备份工具,但是它们易于在硬盘驱动器崩溃的情况下因为文件系统的原因而出现问题。对于Internet备份来说,当你因为系统崩溃而不能访问互联网时,就不能恢复系统的数据。同样,你能真正信任你的数据存放在别人的远程系统中么?因此,我们选择了磁带机,但是如何访问磁带机呢?正如Linux、UNIX系统的设备一样,在Linux、 UNIX系统中,从用户的角度来看,任何设备都可以看做是文件。因此,可以“打开”合适的磁带驱动器文件来进行写入操作,将要备份的数据写入到文件中去。虽然这听上去过于简单了,但是实际情况就是这样。Linux、UNIX环境下根文件系统的/dev目录包含了所有和物理设备关联的文件。当对这些文件进行操作时,实际上是在操作下层的物理设备。
磁带机设备的关联
下表举例说明了在Linux环境下设备文件是如何和物理设备关联起来的。
正如表中看到的那样,设备名是基于位于针对这种设备类型的分层结构的设备的逻辑数字,而不是其物理ID(SCSI)或者IDE通道(ATAPI)。因此,即使某个SCSI磁带机被分配为SCSI设备的ID4,如果它是SCSI链的第一个磁带设备,则它将是 /dev/st0, 而不是/dev/st4,这种命名惯例有利于跟踪系统中的磁带设备时也适用,甚至在拥有多个驱动类型的磁带设备时也适用。同样,在2.0.X内核下,只支持单个ATAPI设备,2.2版本的内核可以使用多个ATAPI驱动(例如ht0, ht1,...等)。
现在我们来看看这些文件是如何被命名的,回卷和不回卷的区别在哪里呢?简单的说,回卷设备允许在结束操作以后,自动将磁带回卷到开始处,而不回卷设备在操作结束以后,将磁带机停留在当时的位置而不进行回卷操作。对于大多数简单备份操作,回卷设备更适合一些,因为在备份操作结束以后其自动回卷以准备取出磁带。而对于那些复杂的备份操作(如附加备份,逻辑搜索及那些高端备份工具的操作),不回卷设备更适合一些。
在UNIX环境下,磁带机设备文件和物理设备关联的情况就比较复杂了,要和磁带机的类型以及UNIX系统的类型而变,下表只举例说明常用的Sun Solaris操作系统下磁带机设备文件和物理设备关联的情况。
磁带机的命令
下面介绍一下磁带机的读写命令和操作管理命令,最常用的磁带机读写命令是tar, 它可以对磁带进行列目录、读和写目录文件,下面是对磁带机读写命令的介绍:
列磁带目录:tar tvf 磁带机设备文件名
首次写入磁带:tar cvf 磁带机设备文件名 欲记录的文件或目录名
增量写入磁带:tar rvf 磁带机设备文件名 欲记录的文件或目录名
读磁带: tar xvf 磁带机设备文件名 欲读出的文件或目录名
注:上面的磁带机设备文件名即指磁带机设备在Linux、UNIX系统中的关联缩写。磁带机的其他操作命令和更详细的使用说明可参考tar的man page。
磁带机读写命令举例:
$ tar tvf /dev/rmt/0h/* 列磁带目录*/
$ tar cvf /dev/rmt/0h/usr2/ora_bak/full01.dmp.gz /* 首次写入磁带 */
$ tar rvf /dev/rmt/0h/usr2/ora_bak/full02.dmp.gz /* 增量写入磁带 */
$ tar xvf /dev/rmt/0h /usr2/ora_bak/full02.dmp.gz /* 读磁带 */
最常用的磁带机操作管理命令是mt, mt命令是操作磁带机的一个很常用的命令, 利用它可以十分方便地管理磁带机设备,下面是对磁带机操作管理命令的介绍:
拉紧磁带:mt -f 磁带机设备文件名 retension
倒带: mt -f 磁带机设备文件名 rewind
列出磁带机状态:mt -f 磁带机设备文件名 status
擦掉数据:mt -f 磁带机设备文件名 erase
注:关于mt命令更详细的使用说明可参考mt的man page。
磁带机操作管理命令举例:
$ mt -f /dev/rmt/0h retension /* 拉紧磁带 */
$ mt -f /dev/rmt/0h rewind /* 倒带 */
$ mt –f /dev/rmt/0h status /* 列出磁带机状态 */
$ mt -f /dev/rmt/0h erase /* 擦掉磁带数据 */
这样,在Linux、UNIX系统下对磁带机进行管理和使用的方法就给大家介绍完了,磁带机设备是网络和系统管理员经常使用的设备,关于这方面的资料也比较少,所以针对这个现象,撰写此搞供大家阅读。
设备(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]
另一篇文章
Redhat Enterprise Linux 磁带机简单操作
Linux下使用磁带机的方式有多种,主要有通过Amanda、Tar等
软件进行操作。
Amanda是提供了远程集中备份的功能,通过分别设置客户端、
服务器端,实现远程集中存储备份。而Tar主要用于单机环境下
,将数据直接写入磁带的备份。针对单一节点的备份,只要简
单的使用Tar命令进行备份、恢复即可。
安装
对于目前厂家的HP DAT24/40系列外置SCSI磁带机,都带有自动
回卷功能。将其接在外置SCSI的总线上,并重新启动服务器。
重新引导后,执行dmesg将可以看到新的磁带机设备叫/dev/st0
。
blk: queue ef0d7a14, I/O limit 4095Mb (mask
0xffffffff)audit subsystem ver 0.1
initialized(scsi0:A:3): 10.000MB/s transfers
(10.000MHz, offset 15) Vendor: HP Model: C1537A
Rev: L805 Type: Sequential-Access
ANSI SCSI revision: 02blk: queue ef0e4614, I/O
limit 4095Mb (mask 0xffffffff)Attached scsi tape st0 at
scsi0, channel 0, id 3, lun 0
磁带操作
装入磁带后,可执行如下操作:
倒带,将磁带卷至起始位置
mt -f /dev/st0 rewind
擦除,擦掉磁带上的内容
mt -f /dev/st0 erase
注意:擦除工作非常慢,并且对磁带有损伤,最好不要执行,
当数据写满后,可以继续写入数据并覆盖原有数据,无须执行
擦除动作。新磁带打开封装后立刻可以使用,不需要执行擦除
。
出带,将磁带卷至初始位置然后从磁带机内弹出
mt –f /dev/st0 offline
数据操作
基本操作如下:
1. 列目录操作tar tvf /dev/st0
假如磁带上没有任何文件,则列目录会报错,这个错误没有关
系,不影响磁带的使用。
[root@dev131 /root]# tar tvf /dev/st0tar: /dev/st0:
Cannot read: Input/output errortar: At beginning of
tape, quitting nowtar: Error is not recoverable:
exiting now[root@dev131 /root]#
2. 写入数据操作tar cvf /dev/st0 <要写入的文件名>
写入数据的方法有两种:不打包直接写入文件和打包压缩后写
入文件。二者各有优缺点。不打包直接写入文件的方法,看起
来效率低,操作复杂,但是可以提高数据的生存率。磁带是一
种线性存储的设备,所有数据紧挨着顺序写入。当磁带的某一
点损坏的时候,其余位置的磁带还可以继续读取,其中的文件
也都能读出。如果采用了打包压缩后写入的方法,则磁带上存
储的只有一个文件。当磁带有任何一个地方发生了故障无法读
取,则这个压缩文件将缺少一些细节,即使是一个bit的错误,
也将导致压缩文件报告CRC错误无法解压。所以,如果是存储大
量的数据,建议直接写入。如果是存取小文件,则最好打包并
给文件名加时间标记写入。
例如要将/root/test1.tar.gz写入到磁带并覆盖磁带的内容:
tar cvf /dev/st0 test1.tar.gz
磁带机的传输速度比较慢,对于不是很大的文件备份,稍等几
秒,写入即可完成。使用参数cvf将覆盖此带上的已有文件。
随后列出磁带上的文件:
[root@dev131 /root]# tar tvf /dev/st0-rw-r--r--
root/root 320 2006-12-01 09:29:02
test1.tar.gz[root@dev131 /root]#
可看到数据写入成功。
注意:这个命令只能在磁带是全新的时候写入,在第二次执行
的时候,就会覆盖掉磁带上原来的数据。另外,使用tar命令备
份,要求备份文件体积必须小于单盘磁带的容量,即一个文件
不能跨越两盘磁带。如果遇到这种情况,则不能使用tar命令备
份,需要换其他备份程序进行操作。
3. 继续写入数据tar rvf /dev/st0 <要写入的文件名>
磁带存储是线性存储,所有数据是依次写入的。为了不覆盖前
边的内容,在写入时候,要使用rvf参数写入内容。
tar rvf /dev/st0 test2.tar.gz
再执行一次rvf继续写入其他的文件:
tar rvf /dev/st0 test3.tar.gz
写入完成后,查看磁带上有哪些文件:
[root@dev131 /root]# tar tvf /dev/st0-rw-r--r--
root/root 320 2006-12-01 09:29:02
test1.tar.gz-rw-r--r-- root/root 320 2006-12-01
09:44:19 test2.tar.gz-rw-r--r-- root/root 320
2006-12-01 09:30:14 test3.tar.gz[root@dev131 /root]#
可以看到,新写入的文件和原文件都存储在了磁带上。
磁带的线性存储特性,使得磁带上可以写入两次相同的文件。
例如现在test3文件发生了文件大小的变化,再次写入到磁带:
tar rvf /dev/st0 test3.tar.gz
查看文件列表,可以看到磁带上有如下文件:
[root@dev131 /root]# tar tvf /dev/st0-rw-r--r--
root/root 320 2006-12-01 09:29:02
test1.tar.gz-rw-r--r-- root/root 320 2006-12-01
09:30:14 test2.tar.gz-rw-r--r-- root/root 320
2006-12-01 09:44:19 test3.tar.gz-rw-r--r-- root/root
67085 2006-12-01 09:44:19 test3.tar.gz[root@dev131
/root]#
这里可看到,磁带上有两个文件同名的文件写入。这个文件的
两次备份大小和时间可以相同,也可以不相同。
注意:在磁带上如果相同文件写入了多次,在恢复时候会比较
麻烦,需要先将磁带卷至文件所存储的地方,而后读取磁带当
前位置所存储的文件,操作较为复杂,速度也比较慢。所以不
建议在一盘磁带上写入相同文件名的文件。备份前,最好将备
份文件的文件名上加上时间标记,便于查找备份。例如要备份
的文件名是test-20061201-0930.tar.gz和test-20061201-0945
.tar.gz,则写入到一盘磁带上。如此在执行备份和恢复操作时
候,能够更加便利快捷的进行存取操作。
4. 读取数据tar xvf /dev/st0 <要读取的文件名>
读取数据前,首先查看磁带上的内容,获取要恢复的文件名。
例如查看后得到如下结果:
[root@dev131 /root]# tar tvf /dev/st0-rw-r--r--
root/root 320 2006-12-01 09:29:02
test1.tar.gz-rw-r--r-- root/root 320 2006-12-01
09:30:14 test2.tar.gz-rw-r--r-- root/root 320
2006-12-01 09:44:19 test3.tar.gz[root@dev131 /root]#
现在恢复其中的test3.tar.gz文件,执行如下命令:
tar xvf /dev/st0 test3.tar.gz
读取数据后。
[root@dev131 ~]# tar xvf /dev/st0
test3.tar.gztest3.tar.gz[root@dev131 ~]#
随后可以在当前的路径下找到从磁带中读取出来的文件:
[root@dev131 ~]# ls -l test3.tar.gz-rw-r--r-- 1
root root 320 Dec 1 11:12
test3.tar.gz[root@dev131 ~]#
至此恢复操作完成。
通过上文所介绍的tar命令,使用tvf/cvf/rvf/xvf参数,即可
实现对磁带的读取、写入操作。使用预先写好的复制数据脚本
,配合上磁带机操作命令,并且放置到/etc/crontab中,即可
实现自动备份。
=============================================================
/dev/st0 和/dev/nst0 的区别
在sles(SUSE Linux Enterprise Server)9里,常用磁带机设备有两组/dev/st[0-9]和/dev/nst[0-9],数字表示磁带机的数目,如果只有一个磁带机,那就是 /dev/st0和/dev/nst0。这个是一个非常重要的概念,只有清晰理解了这些不同名字的设备的区别,才能正确使用相关的命令。
假设我们的系统里面只有一个磁带机设备,那么就有两个设备文件:/dev/st0和/dev/nst0。这两个设备都是这台磁带机的设备名,/dev /st0是回卷设备,每次操作完成之后,磁带机都会自动回卷到磁带的开头。这时候如果进行备份操作则会覆盖磁带中的数据信息,而不是将新数据附在磁带数据结束处。/dev/nst0是非回卷设备,每次操作完成之后,磁带机的磁头都会停留在当前位置,随后的备份操作将被添加到上次备份结束以后的地方。但是用非回卷设备是无法自动回卷磁带的,如果要完成备份和恢复的操作还需要使用mt命令来对磁带进行操作。下面分别对两种设备的操作方法做简单的介绍。
一.回卷设备/dev/st0
由于回卷设备会自动回卷磁带,所以使用/dev/st0只能保存一个归档文件,任何新写入的文件都会覆盖原来的文件,但是这种设备的使用方法比较简单。磁带备份主要使用tar命令
1.备份文件到磁带
#tar cvf /dev/st0 filename1 filename2
例:备份/etc下的文件到磁带机
#tar cvf /dev/st0 /etc/*
2.查看磁带中备份文件
#tar tvf /dev/st0
3.恢复磁带中备份文件
#tar xvf /dev/st0
二.非回卷设备/dev/nst0
非回卷设备不会自动回卷磁带,所以使用/dev/nst0可以在磁带上保存多个归档文件,但是备份必须使用mt命令来控制磁带转动来结合tar命令使用,操作上相对比较复杂。
mt命令最重要的功能就是定位磁带,在使用非回卷设备的时候需要使用mt命令来定位磁带才能正常的使用tar命令进行备份和恢复。mt详细的用法可以参考man手册,下面介绍几个最常用的用法。mt的命令格式:
mt -f 设备名 操作
-f 参数后面跟着一个设备名,就是磁带设备的名字,例如/dev/nst0。
除了设备名这个参数外,mt有一个必须有的参数,就是操作,最常用的操作有:
status 检查磁带机状态
fsf n 前进n个文件
bsf n 后退n个文件
======================================
磁带机的简单使用
环境:Ubuntu 7.04 feisty, HP DAT-72 usb外置磁带机。
基本概念
- 磁带是线性存储设备,没有什么分区表的概念,磁头在哪里,就从哪里开始读。
- 磁带机好像只能用root用户操作。
- 磁带上可以划分存储空间,每个存储空间有一个file number,从0开始顺序排列。
- 磁头在存储空间中的位置用block number来表示,0代表开始,大于0的整数代表块,比如39代表磁头在本file number的第39块的位置,而-1则代表磁头位于本file number的结尾。
- 同样一部磁带机,用/dev/st0时是当自动回卷设备使用,每次操作完成之后,磁头都返回file number=0, block number=0, BOT的位置;而用/dev/nst0调用时,操作完成时磁头就停在那个位置,不会回到开头。
- 使用nst非回卷方式,用tar tvf列文件,只有当block number=0时才能出内容,并且列完之后block number为大于0的整数,注意这并不代表本段存储空间的结尾(-1)。
由于磁带机本身具有压缩功能,所以添加文件的时候不建议指定zip或者bz2压缩,因为如果一点点压缩后的数据损坏,会导致全部内容不可识别;如果的确需要压缩的话,可以压缩成本地文件再存储到磁带上,减少对其他文件的影响。
自动回卷的使用方式
这种方式比较简单,用tar直接操作即可,基本上和tar操作本地文件相同。
往新磁带上存储文件,注意如果磁带上已有文件,会被覆盖掉:
tar cvf /dev/st0 file_to_store
向磁带上添加文件:
tar rvf /dev/st0 file_to_store
更新磁带上的同名文件:
tar uvf /dev/st0 file_to_store
列出磁带上的现有文件:
tar tvf /dev/st0
删除磁带上的文件:
tar vf /dev/st0 --delete file_to_delete
但我使用这个命令的时候总是提示错误,文件倒是删掉了,可查看的时候也总有错误信息,难道是无法删除,或者只能全部xvf出来再存到磁带上?不过我们也应当养成一个好的习惯,每次向磁带机存储文件的时候一定要在文件名中带上日期标记。
非自动回卷的使用方式
一般这样使用,都是用到多个存储空间file number的时候;如果还是一个存储段,只是手工移动文件指针就没有什么意义了。
在操作上,文件的存储方式和自动回卷是基本相同的,不同之处在于要注意磁头的位置,并且手工进行必要的位移,以一个新磁带的操作为例来说明(status我只截取有用的部分显示):
# mt -f /dev/nst0 status
file number = 0
block number = 0
General status bits on (41010000):
BOT ONLINE IM_REP_EN
存入一个新的文件A:
# tar cvf /dev/nst0 A
A
# mt -f /dev/nst0 status
file number = 1
block number = 0
General status bits on (81010000):
EOF ONLINE IM_REP_EN
注意这时磁头已经移动到了第二段存储空间了,现在再存入一个新的文件B,当然B和A是不在一个存储空间中的:
# tar cvf /dev/nst0 B
B
# mt -f /dev/nst0 status
file number = 2
block number = 0
General status bits on (81010000):
EOF ONLINE IM_REP_EN
磁头又移动到第三段存储空间了,如果要查看刚才存的第二段存储空间中的内容,需要先移动磁头:
# mt -f /dev/nst0 bsf 2
# mt -f /dev/nst0 status
file number = 0
block number = -1
General status bits on (1010000):
ONLINE IM_REP_EN
# mt -f /dev/nst0 fsf 1
# mt -f /dev/nst0 status
file number = 1
block number = 0
General status bits on (81010000):
EOF ONLINE IM_REP_EN
由于有存储空间结束标记,所以这里采用退2进1的方式,详细的磁头移动方式可以看man mt。然后查看文件列表:
# tar tvf /dev/nst0
-rw-r--r-- root/root 21194792 2007-10-24 11:37 B
# mt -f /dev/nst0 status
file number = 1
block number = 2070
General status bits on (1010000):
ONLINE IM_REP_EN
列出文件列表之后,磁头停在了文件结束的位置,但不是存储空间的结尾。现在移动磁头到本段存储空间的开始,并且添加文件C:
# mt -f /dev/nst0 bsf 1
# mt -f /dev/nst0 status
file number = 0
block number = -1
General status bits on (1010000):
ONLINE IM_REP_EN
# mt -f /dev/nst0 fsf 1
# mt -f /dev/nst0 status
file number = 1
block number = 0
General status bits on (81010000):
EOF ONLINE IM_REP_EN
# tar rvf /dev/nst0 C
C
# mt -f /dev/nst0 status
file number = 2
block number = 0
General status bits on (81010000):
EOF ONLINE IM_REP_EN
首先还是要移动磁头,到这里基本上可以发现mt的fsf和bsf的规律了,fsf是磁头向前移动,并且总是停留在block number = 0的位置,而bsf是磁头向后移动,总是停留在 block number = -1的位置。添加完成文件之后,磁头又定位到了第三个存储空间(下一个)的开始。现在我们依然是移动磁头到第二段存储空间开始,并且用覆盖方式添加文件 D:
# mt -f /dev/nst0 bsf 2
# mt -f /dev/nst0 fsf 1
# mt -f /dev/nst0 status
file number = 1
block number = 0
General status bits on (81010000):
EOF ONLINE IM_REP_EN
# tar cvf /dev/nst0 D
D
# mt -f /dev/nst0 status
file number = 2
block number = 0
General status bits on (81010000):
EOF ONLINE IM_REP_EN
文件D是用覆盖方式添加的,所以刚才添加的文件B和C现在应该都消失了:
# mt -f /dev/nst0 bsf 2
# mt -f /dev/nst0 fsf 1
# mt -f /dev/nst0 status
file number = 1
block number = 0
General status bits on (81010000):
EOF ONLINE IM_REP_EN
# tar tvf /dev/nst0
-rw-r--r-- root/root 34201298 2007-10-24 11:57 D
# mt -f /dev/nst0 status
file number = 1
block number = 3341
General status bits on (1010000):
ONLINE IM_REP_EN
完成,回卷磁带,从开始一直tvf:
# mt -f /dev/nst0 rewind
# tar tvf /dev/nst0
-rw-r--r-- root/root 341054 2007-10-24 11:37 A
# tar tvf /dev/nst0
# tar tvf /dev/nst0
-rw-r--r-- root/root 34201298 2007-10-24 11:57 D
# tar tvf /dev/nst0
# tar tvf /dev/nst0
# tar tvf /dev/nst0
tar: /dev/nst0: Cannot read: Input/output error
tar: At beginning of tape, quitting now
tar: Error is not recoverable: exiting now
# mt -f /dev/nst0 status
file number = 2
block number = -1
General status bits on (9010000):
EOD ONLINE IM_REP_EN
现在,能看懂这个了么?我用空行隔开的位置正好是block number为0的位置。还有一些其他的操作就比较简单了:
出带,将磁带卷至初始位置然后从磁带机内弹出
# mt –f /dev/nst0 offline
清除磁带中的所有内容,特慢,还伤带,轻易不要用
# mt –f /dev/nst0 erase
我的几个疑问
- 如何删除file number?
- 既然磁带是线性存储,如果向前面一个file number中添加中间,存储空间不够怎么办?
- 如何查看磁带剩余空间?
小结
搞明白磁带机的存储方式和基本操作,用起来就简单了。个人感觉如果要存的文件数量不多,尤其是只需要存几个大文件的情况,直接用自动回卷方式,只使用一个存储空间就可以了,这样操作比较简单。如果一定要用磁带存储复杂结构的数据,可以考虑手工在各个存储空间之间来回切换的方式,原理都是一样,只是更高一点点的技巧和小心。