2007年10月26日星期五

磁带机的简单使用

环境: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中添加中间,存储空间不够怎么办?
  • 如何查看磁带剩余空间?

小结

搞明白磁带机的存储方式和基本操作,用起来就简单了。个人感觉如果要存的文件数量不多,尤其是只需要存几个大文件的情况,直接用自动回卷方式,只使用一个存储空间就可以了,这样操作比较简单。如果一定要用磁带存储复杂结构的数据,可以考虑手工在各个存储空间之间来回切换的方式,原理都是一样,只是更高一点点的技巧和小心。

参考

Source: http://www.fwolf.com/blog/post/362