Cover V04, I03
Listing 1
Table 1
Table 2


Making Tape-to-Tape Copies

Packey P. Velleca

Quarter Inch Cartridge (QIC) tapes have many formats, ranging, among others, from QIC-24 to QIC-525. These formats specify a standard for recording data on tape with a fixed block size, generally 512 bytes. QIC formats differs in this regard from 8mm or 9-track formats, which are variable record length (block size) recording devices. This article discusses some of the details involved in copying fixed block (specifically, QIC) tapes, and presents a program capable of copying one QIC tape to another.

Why a Tape-to-Tape Copy?

Tape copying is useful for several purposes. Many vendors deliver software on QIC tape, and making backups of these is a very good idea. If you use the vendor copy to load machines, eventually the tape will fail, and you will be forced to wait for the vendor to send another. Another use is in a software production environment, where engineering can cut one tape of a product, and another organization can use that tape as the master for generating multiple distribution copies.

A third use for tape copying is to convert the tape format or distribution medium. Vendor software is often supplied in a slow, low-density format, such as QIC-24 or QIC-150. If your tape drives support higher densities, you can make your working copy of the software on a high-density tape. (Typically, QIC-320 tapes load twice as fast as QIC-150 tapes!) Also, your vendor may supply software in one medium (e.g., DEC CompacTape TK-50), while you prefer to load your machines with another medium (e.g., QIC), perhaps to decrease load time. It is easy to use tape procedures to copy from one type of media to another.

A common alternative to tape-to-tape copying is to copy data from tape to another device, such as a large hard disk, and then copy the data from the drive to another tape. While a tape-disk-tape copy will do in a pinch, it does not make good use of your system resources. It is twice as slow as tape-to-tape copy (tape to disk, then disk to tape), and can require significant disk space. A tape-to-tape procedure minimizes time and resource usage. The only requirement is for a system with two or more tape drives.

Tape-to-Tape Copy Issues

With fixed block size devices, all tape operations are in multiples of the block size. A file that is smaller than the block size or a block size multiple must be padded out, usually with null characters. For example, to write a 300-byte file to a QIC-150 tape, you must pad the file to 512 bytes. File padding is normally transparent, however, as it is usually done by the application program, as, for example, tar(1), cpio(1) and dump(8). It is only with programs like dd(1) that you must be careful about padding when writing files directly to tape. Table 1 presents a list of commonly used formats and their capacities.

Padding is not an issue when you are writing files from one fixed block device to another, because you can assume the data on the source tape has been written correctly (i.e., padded if necessary). The files on the source tape can be of any format -- tar(1), cpio(1), dump(8) or dd(1) for example -- and copying from one tape to another is a simple matter of transferring bits from one device to another. The remaining concerns related to tape copying have to do with ensuring that the drives stream for best performance, specifying the read/write format, and determining the number of files on a tape.

Streaming on a tape drive signifies that the device is never waiting for data to read or write. Streaming optimizes device use and reduces waiting time. The buffering provided by dd(1) makes it easy to set up tape streaming when performing a tape-to-tape copy. By setting dd's bs argument to some large multiple of the device block size, you can make the drives stream. I have found that bs=10k (or more) will allow most QIC drives to stream.

In tape-to-tape copying you must read the source tape in some format, A, and write that data to a destination tape in some format, B, where A and B do not necessarily have to be the same. It is possible to copy a QIC-24 tape to a QIC-320 tape (assuming your tape drive can support QIC-320) to allow faster (about twice as fast) data transfer rates. Generally, though, tape-to-tape copy involves reading and writing in the same format, and this can simplify matters for the uninitiated. In this instance, the copy is only a matter of reading the source tape format -- a feature performed automatically by almost all tape drives.

Determining the destination tape write format is not necessarily so automatic, because the device assumes you know which format you want to write, and because it is possible to write many formats on many tape types.

You can determine the number of files on a tape automatically by successively reading files until an EOT marker or the last EOF marker is reached. In either case, the device will return a read-fail status.

Description of the Script

The ksh(1) script in Listing 1 (tape2tape) copies one QIC tape to another, with no operator intervention. The program assumes the platform is configured with at least two tape drives. The drives do not have to be the same device type -- one might be a QIC-320 drive, for example, and the other a TK-50.

When you execute the script, it will assert its default settings for input device, output device, number of files to copy, checksums, and block size, and prompt you to change them. When that is done, it will check the status of the tapes (e.g., ONLINE, WRITE PROTECT, etc.), rewind them, and begin the copy.

If you invoked the script with no arguments, then it assumes the number of files on the source tape is unknown and copies files until it encounters End Of Tape (EOT). At this point, if checksums are to be performed, it rewinds both tapes, and performs a file-for-file, tape-for-tape checksum comparison. Otherwise, it simply rewinds the tapes and terminates. If you know the number of files, you can specify the number on the command line as an option. You can also use this option to copy, say, only the first of many files on a tape.

The script automatically determines tape formats. It finds the source tape format via the device driver upon reading. It finds the destination tape format by making writes, at successively lower capacity formats, to the destination tape. The first successful write is the default write format.

The default device files for this script are /dev/nrmt0h and /dev/nrmt1h (if your system uses different device file names, then change them at line 38). dd(1) uses these arguments as input and output files. On most systems, the special file for the tape drive denotes the format of the tape operation. For example, with DEC Ultrix, /dev/rmt0h is QIC-320, rmt0m is QIC-150, rmt0l is QIC-120, and rmt0a is QIC-24. Consult your system manual for the file names for the supported formats of your tape drives. See Table 2 for other tape characteristics.

The default block size is 10k as denoted on line 306. dd(1) also uses this argument to specify input and output block size. As I noted earlier, 10k should work well if your device supports it. If not, try 8k instead. Just remember to keep the number large in order to keep the drives streaming.

If you invoke the program with the -c option, it will toggle its default checksum setting. For example, if the default checksum is TRUE, the -c will not perform checksums. The default checksum setting is configurable on line 45.

About the Author

Packey Velleca currently works with a group of administrators for a small system of real-time computers with UNIX-based operator workstations. He graduated from Florida Institute of Technology in Melbourne, FL, with a BSEE in 1988. He has published several articles in Sys Admin. He may be contacted as