(以下這段是由 Mike Miller 先生所著)
有時候您可能需要讀由 VMS 做出來的磁帶(或是為了讓 VMS 的機器和 *nix 系統可以讀取的磁帶)﹐ 大致上﹐對 DECFILES11A 磁帶並不會太難。
或許您曾讀過 Linux 的 mini-HOWTO, 但是﹐我相信﹐我在這裡提及的一些觀念也是和任何一種 *nix 系統。 我曾經在 Linux, HP, Sun and DEC *nix 等系統中試過。比較不一樣的地方是﹐每種作業系統對裝置名稱(device names)可能會有所不同﹐ 而 mt 在指明裝置名稱(device name)的時候﹐其選項(options)也可能因作業系統而異。 例如:在 Linux 上是 mt -f ﹐但是在 HPUX 9 上卻是 mt -t。
注意 - 我只以 Exabyte 8mm SCSI tape drives 實作過﹐如果您已經讀過其他的格式﹐ 請讓我知道﹐我將會把她增加到這份 Note 中。
當讀取 VMS 由 ``copy'' 指令作成的磁帶時﹐(或是看起來像是由 copy 指令作成的磁帶)﹐ 您必須要知道﹐每個實際的檔案將會分成三的檔案存放在磁帶上﹐分別是“檔頭(header)”, “資料(data)”, 和“檔尾(trailer)”。 其中檔頭(header) 和 檔尾(trailer)存放著檔案的訊息﹐和在 VMS 上的位置。而資料(data)當然就是存放原來的資料啦! 這些檔案都可以由 dd 這個指令從磁帶(tape)上萃取出來。 由 mt 指令﹐可以將磁帶轉到所需要的位置。
範例:我有一個連續存放著檔案的磁帶。最前面兩個在 VMS 上的檔名為 ce66-2.evt 和 ce66-3.evt 磁帶的標籤(label)是 c66a2。
如果我執行下列指令:
> dd if=$TAPE bs=16k of=header1
> dd if=$TAPE bs=16k of=data1
> dd if=$TAPE bs=16k of=trailer1
> dd if=$TAPE bs=16k of=header2
> dd if=$TAPE bs=16k of=data2
> dd if=$TAPE bs=16k of=trailer2
我 dd 了六個檔案:header1, data1, trailer1, header2, data2 和 trailer2. 使用語法如下:if="input file", bs="block size" 和 of="output file". TAPE 這個便是須視您的機器上的裝置名稱而定﹐例如:如果您在 Linux 上使用 SCSI 的磁帶裝置﹐ 您的裝置名稱可能是 /dev/nts0 。
如果您想要讀第二個檔案﹐不是第一個。您不在意檔頭(header)﹐而且您想要使用原來的檔名﹐您可以這麼作:
> mt -f $TAPE fsf 4
> dd if=$TAPE bs=16k of=ce66-2.evt
> mt -f $TAPE fsf 1
注意 “4” - 跳過第一個檔案所附屬的三個檔案﹐所以下一比(第二筆)的檔頭將會是從第四筆開始。 第二個 mt 為跳過第二筆檔案的檔尾(tailer)並且指到下一筆檔案(第三筆資料的檔頭)。 當然﹐您也可以使用 mt 使磁帶快轉(bsf), 倒轉(rewind)﹐或是 磁頭歸位(offline, rewoffl).
檔頭(header) 和 檔尾(trailer) 包含了給 VMS 儲存檔案的一些訊息﹐例如區塊大小(block size)。 同時她們也包含了檔案名稱﹐方便您建立 Script 檔來自動讀取檔案或是搜尋特定的檔案。 然而﹐在磁帶上的第一個檔頭檔(header file)﹐和其他磁帶上的檔頭檔有些許的差異。
對於在磁帶上的第一個檔案(假設為 header1)﹐最前面的四個字元將會是 "VOL1" ﹐其後伴隨著版本名稱(volume name)。 本例中﹐header1 的最初內容應該是 "VOL1C66A2"。隨後是一個字串"HDR1" ﹐表示這是一個檔頭檔(header file)。 然後才是檔案名稱(file name)。本例中﹐她會是 "HDR1CE66-2.EVT"。下一個欄位又是版本名稱(volume name)。
對於其他的不是磁帶上第一個檔頭檔的檔頭檔﹐最初的 VOL1 欄位將不會存在。 其他的欄位就和前面所介紹的第一個檔頭檔的結構一模一樣。另一個比較有用的欄位是第七個欄位。 她是以 "DECFILES11A" 為結尾。她必須存在﹐用還確認 DEC Files11A standard.
field initial header subsequent headers
===== ============= ==================
1 VOL1 + volume name HDR1 + file name
2 3HDR1 + file name volume name
3 volume name
6 ...DECFILES11A
7 ...DECFILES11A
其他更詳細的檔頭和檔尾的結構﹐請參考 DEC FILES11A 的說明文件。 (on the orange/grey wall - ask your local VMS folks :-).
在例子中﹐我使用的區塊大小是 16K。在 *nix 系統上﹐磁碟上的檔案並沒有和區塊大小有關連﹐ 然而﹐在 VMS 上﹐每一個檔案都有一個明確的區塊大小(block size)。也就是說﹐在 Linux 端﹐ 區塊大小並沒多太大的關係﹐除非當不容易從磁帶中讀出檔案的時候。如果您找不到區塊大小(block size)﹐ 您可以試著在磁碟裝置上﹐用 `mt -f $TAPE setblk 0' 來設定硬體的區塊大小。 用 setblk 選項的萃取的形式可能會隨著 mt 的版本不同而有所不一樣﹐ 您的磁帶裝置的硬體界面﹐還有您喜愛的 *nix 系統也想相當的關係。
(感謝 Wojtek Skulski ( skulski@nsrlc6.nsrl.rochester.edu) 提出 setblk 相關部份.)