im rem1x.

我又挪地方了。

Linux下使用tar操作磁带机的基本方法

without comments

这是资料整理帖,所有内容来自互联网不同站点的没良心转载(出处无法确定…),对原作者表示感谢。

我现在可以玩弄一款 IBM 8767-HNX的外置磁带机,在RHEL 4中被认成/dev/st0 (还有一个/dev/nst0),来看一下dmesg输出

# dmesg

…………

Attached scsi tape st0 at scsi1, channel 0, id 0, lun 0

st0: try direct i/o: yes (alignment 512 B), max page reachable by HBA 4503599627370495

Attached scsi generic sg0 at scsi0, channel 0, id 1, lun 0,  type 0

Attached scsi generic sg1 at scsi0, channel 0, id 4, lun 0,  type 13

Attached scsi generic sg2 at scsi1, channel 0, id 0, lun 0,  type 1

Attached scsi generic sg3 at scsi4, channel 0, id 0, lun 0,  type 0

Attached scsi generic sg4 at scsi4, channel 0, id 0, lun 1,  type 0

Attached scsi generic sg5 at scsi4, channel 0, id 0, lun 31,  type 0

st0: Block limits 1 – 16777215 bytes.

…………

在Linux和UNIX下最常用的磁带机操作命令便是tar,它可以对磁带进行读写、列目录、倒带、擦除等操作,接下来一一介绍。

列出目录:tar cvf /dev/st0

如若磁带上还没有任何文件,运行上面的命令会出错,不过这个错误可以忽略,并不影响使用。

错误信息如下:

英文版:

#tar cvf /dev/st0

tar: /dev/st0: Cannot read: Input/output error

tar: At beginning of tape, quitting now

tar: Error is not recoverable: exiting now

中文版:

#tar tvf /dev/st0

tar: /dev/st0:无法 read: 输入/输出错误

tar: 处于磁带的起点,现在退出

tar: 错误是不可恢复的:现在退出

—————————————–分割线——————————————–

写入数据:tar cvf /dev/st0 <要写入的文件名>

注:以下文字原封不动copy from internet

写入数据的方法有两种:

不打包直接写入文件和打包压缩后写入文件。

二者各有优缺点。不打包直接写入文件的方法,看起来效率低,操作复杂,但是可以提高数据的生存率。磁带是一种线性存储的设备,所有数据紧挨着顺序写入。当磁带的某一点损坏的时候,其余位置的磁带还可以继续读取,其中的文件也都能读出。如果采用了打包压缩后写入的方法,则磁带上存储的只有一个文件。当磁带有任何一个地方发生了故障无法读取,则这个压缩文件将缺少一些细节,即使是一个bit的错误,也将导致压缩文件报告CRC错误无法解压。所以,如果是存储大量的数据,建议直接写入。如果是存取小文件,则最好打包并给文件名加时间标记写入。

示例:

# ls -lh tape_test.tar

-rw-r–r–  1 root root 50K  8月  6 15:02 tape_test.tar

# time tar cvf /dev/st0 tape_test.tar

tape_test.tar

real    0m3.936s

user    0m0.000s

sys     0m0.002s

# tar tvf /dev/st0

-rw-r–r– root/root     51200 2010-08-06 15:02:21 tape_test.tar

现在,通过 tar tvf /dev/st0 列目录时不再报错,并看到了刚才写入的tape_test.tar文件。

还可以注意到,写入一个50k大小的文件居然要3.9秒,可见磁带机的写入速度是比较慢的,这也意味着一般的数据备份工作放在后半夜比较合适。

续写数据:tar rvf /dev/st0 <要写入的文件名>

磁带存储是线性存储的,所有数据依次写入。为了不覆盖前边的内容,在写入时要使用rvf参数。

如果你仍旧使用cvf参数来写入数据,那么之前的数据将会被覆盖:

# time tar cvf /dev/st0 tape_test2.tar

tape_test2.tar

real    0m3.945s

user    0m0.000s

sys     0m0.002s

# tar tvf /dev/st0

-rw-r–r– root/root     51200 2010-08-06 15:09:50 tape_test2.tar

可以看到,tape_test.tar已经被tape_test2.tar文件所覆盖了。

使用rvf参数的示例:

# time tar rvf /dev/st0 tape_test3.tar

tape_test3.tar

real    0m3.979s

user    0m0.000s

sys     0m0.002s

# tar tvf /dev/st0

-rw-r–r– root/root     51200 2010-08-06 15:09:50 tape_test2.tar

-rw-r–r– root/root     51200 2010-08-06 15:10:49 tape_test3.tar

新增加的tape_test3.tar和之前写入的tape_test2.tar都存在了。

注意:
在磁带上如果相同文件写入了多次,在恢复时候会比较麻烦,需要先将磁带卷至文件所存储的地方,而后读取磁带当前位置所存储的文件,操作较为复杂,速度也比较慢。所以不建议在一盘磁带上写入相同文件名的文件。备份前,最好将备份文件的文件名加上时间标记,便于查找备份。例如要备份的文件有test-20100806-1510.tar和test-20100806-1530.tar,写入到磁带上。如此在执行备份和恢复操作的时候,能够更加便利快捷的进行存取操作。
读取数据:tar xvf /dev/st0 <要读取的文件名>
在读取数据之前,得先查看当前磁带中的内容,获取要恢复的文件名。

# tar tvf /dev/st0

-rw-r–r– root/root     51200 2010-08-06 15:09:50 tape_test2.tar

-rw-r–r– root/root     51200 2010-08-06 15:10:49 tape_test3.tar

恢复tape_test2.tar文件:

# time tar xvf /dev/st0 tape_test2.tar

tape_test2.tar

real    0m0.024s

user    0m0.001s

sys     0m0.001s

# ls -lh tape_test2.tar

-rw-r–r–  1 root root 50K  8月  6 15:09 tape_test2.tar

————————————结束分割线—————————————

使用tar命令的tvf/cvf/rvf/xvf参数,分别可以实现对磁带机的各种不同操作。
接下来,就可以自己写shell脚本,然后扔到crontab里,开始做自动备份吧。

参考资料:
http://zengmin.blog.51cto.com/406650/324383

Written by rem1x

八月 6th, 2010 at 3:35 下午

Posted in linux

Tagged with , ,

Leave a Reply