IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    rem1x发表于 2010-08-06 07:35:43
    love 0

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

    我现在可以玩弄一款 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



沪ICP备19023445号-2号
友情链接