This is a followup to the quoted message below, which I'd sent to the redhat-list 12 
days
ago.

Apart from an encouraging note from listmember Sid Cowles, who had privately and 
graciously
offered to read my tapes on his SGI box (which I declined with thanks), I was 
surprised that no one
on this list had anything to say on the matter.

So, I did some digging around, starting first with the reference anyone serious about 
sysadmin
should consult right away:

Unix System Administration Handbook, 3rd Edition
http://www.amazon.com/exec/obidos/ASIN/0130206016/survivalarts-20

I then consulted the Linux edition by the same core writers:

Linux Administration Handbook
http://www.amazon.com/exec/obidos/ASIN/0130084662/survivalarts-20

After that, I finally consulted the book which seems to have given me the critical
clues I needed (those clues being "IRG [interrecord gap]" and "reading past the IRG to
determine block size"):

UNIX Backup and Recovery (O'Reilly & Associates)
http://www.amazon.com/exec/obidos/ASIN/1565926420/survivalarts-20

The sharp-eyed will note that I have indeed tagged those URLs with merchant
IDs (mine).  If you find this writeup to be useful, please use those URLs to visit 
Amazon
and *buy those books* if you haven't already.

OK, here's what I did...

I have 3 classes of tapes written 9 years ago with tar, cpio, and bru.  First, those 
tapes
I'd originally written with 'tar cvBf /dev/tape' on my Irix boxes:

1.) Check status of tape:

[localhost]# mt -f /dev/st0 status
SCSI 2 tape drive:
File number=0, block number=0, partition=0.
Tape block size 512 bytes. Density code 0x13 (DDS (61000 bpi)).
Soft error count since last status=0
General status bits on (45010000):
 BOT WR_PROT ONLINE IM_REP_EN

2.) Set block size of tape to "0", which really means "variable":

[localhost]# mt -f /dev/st0 setblk 0
[localhost]# mt -f /dev/st0 status
SCSI 2 tape drive:
File number=0, block number=0, partition=0.
Tape block size 0 bytes. Density code 0x13 (DDS (61000 bpi)).
Soft error count since last status=0
General status bits on (45010000):
 BOT WR_PROT ONLINE IM_REP_EN

3.) Find actual blocksize of tape.  Start by feeding 'dd' a blocksize you think is 
larger than the
blocksize of the tape, and try to read that length of data off the tape.  'dd' will 
read - and this
is the important part - until it reaches the first IRG (interrecord gap) and then will 
stop
reading to disk.

[EMAIL PROTECTED] test]# dd if=/dev/st0 of=testfile ibs=64k count=1
dd: reading `/dev/st0': Cannot allocate memory
0+0 records in
0+0 records out

That's a strangely worded failure.  After a lot of Googling, I determined that
the "Cannot allocate memory" message, in this instance, is associated simply with my
having selected a blocksize too small: I needed to specify a larger blocksize.  So:

[localhost]# dd if=/dev/st0 of=testfile ibs=128k count=1
dd: reading `/dev/st0': Cannot allocate memory
0+0 records in
0+0 records out

Still no joy.  Double it, then:

[localhost]# dd if=/dev/st0 of=testfile ibs=256k count=1
1+0 records in
512+0 records out

Apparent success!  Let's see:

[localhost]# ls -l testfile
-rw-r--r--    1 root     root       262144 Sep 28 15:01 testfile

OK, file's there.  Let's see if I could have used the next smallest blocksize and still
have been successful:

[localhost]# dd if=/dev/st0 of=testfile2 ibs=255k count=1
dd: reading `/dev/st0': Cannot allocate memory
0+0 records in
0+0 records out

No.  So, it looks like 256k was exactly the right number. 

Let's confirm that what I wrote 9 years ago on the tape's paper label is true
(i.e. that I'm looking at a 'tar' archive):

[localhost]# file testfile
testfile: POSIX tar archive

Cool.  Knowing what type of archive I have, and what its blocksize is, I try this:

[localhost] # tar -b 512 -xvf /dev/st0

... and it works!  The argument "-b 512" means "using a blocksize of 512 x 512bytes".

Now for the tapes I had written with 'cpio -ovBc -O /dev/tape', also about 9 years ago:

After ejecting the old tape, putting in the 'cpio' archive tape and confirming that the
device is at BOT (beginning of tape) and still set to variable block size ("0"):

[localhost]# mt -f /dev/st0 status
SCSI 2 tape drive:
File number=0, block number=0, partition=0.
Tape block size 0 bytes. Density code 0x13 (DDS (61000 bpi)).
Soft error count since last status=0
General status bits on (45010000):
 BOT WR_PROT ONLINE IM_REP_EN

As a shortcut to determining blocksize for this tape - on the assumption that I didn't 
trust
the "B" argument I'd passed to 'cpio' 9 years ago on my Irix desktop, I tried the 'dd' 
command which
had worked to read the first block off the 'tar' tape:

[localhost]# dd if=/dev/st0 of=testfile ibs=256k count=1
0+1 records in
10+0 records out

[localhost]# ls -l testfile
-rw-r--r--    1 root     root         5120 Sep 28 15:11 testfile

Looks like the 256k blocksize was overkill, but doubly gratifying to see 'dd' working 
as
advertised: it stopped reading at the first IRG.  Cool.

Another check to confirm that my tape's paper label was correct:

[localhost]# file testfile
testfile: ASCII cpio archive (SVR4 with no CRC)

Great!  OK, a little reading of the 'cpio' man page, a couple of trials, and I find 
this
incantation is the one required to recover archives from that tape:

[localhost] # cpio -ivBc -I /dev/st0

... which makes me especially glad that when I made the archive 9 years ago, I assumed 
that
I *just might* have to read the tape on a non-Irix system, so I had _made sure_ to 
*create* the
cpio archives with the "B" blocking option.

I mentioned earlier that I had made backups to 4mm tape using tar, cpio, and bru 
("Backup and Recovery
Utility", peculiar to Irix).  What I didn't mention is that each of those was a copy 
of the same
filesystem.  I wasn't sure which of those tapes I would be able to read years down the 
line (now!)
and which I wouldn't be able to read.  Turns out that 'tar' and 'cpio' were the big 
winners, and 'bru'
was the loser.  So, I still had duplicate and complete copies of my old filesystem.  
Belt and
suspenders approach sometimes pays off, folks.

It's interesting to note that I had found a couple of *unlabled* 4mm tapes which I 
couldn't
tell were blank or not.  Using 'dd' and 'file' as above, I was shocked to find that 
although one
was blank, the other actually had a 'tar' archive!  Reading out the contents, I 
determined that
it was actually a test tape, which I'd apparently made at some point in preparation 
for backup,
and hence no there was no data worth recovering, but it was still gratifying to see 
that a bit of
detective work is always worth the extra effort.

For the sake of completeness, I should mention that the issue of byteswapping never
came up.  I tested for it, but it turns out not to have been a factor.

I hope someone else in a similar predicament finds this account useful.

Russell Whitaker


>Date: Tue, 16 Sep 2003 16:48:13 -0700
>To: [EMAIL PROTECTED]
>From: Russell Whitaker <[EMAIL PROTECTED]>
>Subject: Reading Irix DAT tapes under RH9
>
>
>-- 
> 
>Hello,
>
>I have a number of tapes I wrote - and verified - a few years ago on various SGI 
>(Silicon Graphics) workstations running Irix 5.2 and Irix 6.2.  The tapes are Maxell 
>HS-4/60s 2GB DAT tapes.  I  have a Red Hat 9 workstation in which I installed an old 
>Python DAT drive, which seems to have installed perfectly (output of dmesg):
>
>scsi0 : Adaptec AIC7XXX EISA/VLB/PCI SCSI HBA DRIVER, Rev 6.2.8
>        <Adaptec 2930CU SCSI adapter>
>        aic7860: Ultra Single Channel A, SCSI Id=7, 3/253 SCBs
>
>blk: queue c365cc14, I/O limit 4095Mb (mask 0xffffffff)
>  Vendor: ARCHIVE   Model: Python 27871-XXX  Rev: 1214
>  Type:   Sequential-Access                  ANSI SCSI revision: 02
>blk: queue c365ce14, I/O limit 4095Mb (mask 0xffffffff)
>
>Version of kernel:
>
># uname -r
>2.4.20-8
>
>Tape status:
>
># mt -f /dev/st0 status
>SCSI 2 tape drive:
>File number=0, block number=0, partition=0.
>Tape block size 512 bytes. Density code 0x13 (DDS (61000 bpi)).
>Soft error count since last status=0
>General status bits on (45010000):
> BOT WR_PROT ONLINE IM_REP_EN
>
>Several of the tapes were written with cpio (using "cpio -ovBc -O /dev/tape" under 
>Irix), and some were written using tar and Backup (a wrapper to 'bru').  I can't read 
>any of these tapes; I can't even use 'dd' to attempt to dump the tape contents:
>
>[EMAIL PROTECTED] tape1]# dd if=/dev/st0 of=archive1
>dd: reading `/dev/st0': Input/output error
>0+0 records in
>0+0 records out
>
>Do I need to set another blocksize?  Do I need to swap bytes?  I've been Googling for 
>hours on this problem to no avail.  Anyone dealt with this before?  I can't tell the 
>blocksize of the tapes: there doesn't seem to exist the "blksize" option ('mt -f 
>/dev/st0 blksize') in Red Hat's 'mt'.
>
>I'm pretty sure that the Python drive works well and the tapes are OK: I sacrificed 
>the data on a couple of tapes , successfully reading and writing from them; tar, 
>cpio, and dd all worked as they should. 
>
>So, I'm sure the answer lies somewhere in the world of blocksizes and byte orders.  
>Can anyone help?
>
>Thanks in advance,
>Russell
>


-- 
Russell Whitaker
http://www.survivalarts.com/


-- 
redhat-list mailing list
unsubscribe mailto:[EMAIL PROTECTED]
https://www.redhat.com/mailman/listinfo/redhat-list

Reply via email to