.ds m \f2U\s-1NIX\s+1 User's Manual\^\fP .ds u \s-1UNIX\s+1 .ds Y \s-1PDP\s+1-11 .ds Z \s-1VAX\s+1 .ds :? Setting Up UNIX .PH "" .OH "'\s9\f2\*(:?\fP''\\\\nP\s0'" .EH "'\s9\\\\nP''\f2\*(:?\^\fP\s0'" .tr ~ .nr Hb 3 .nr Hs 3 .nr Hu 4 .ds HF 3 3 2 3 2 .bd S B 3 .de Ds .DS 1 .br .lg 0 \!.lg 0 .ss 18 \!.ss 18 .br .. .de De .br \!.ss 12 .ss 12 .lg \!.lg .br .DE .. .TL Setting Up U\s-2NIX\s+2 .AU "R. C. Haight" RCH MH .AU "T. J. Kowalski" TJK MH .AU "M. J. Petrella" MJP MH .AU "L. A. Wehr" LAW MH .MT 4 .H 1 INTRODUCTION .H 2 Prerequisites Before attempting to generate a \s-1UNIX\s+1\(dg .FS \(dg UNIX is a Trademark of Bell Laboratories. .FE system, you should understand that a considerable knowledge of the related documentation is required and assumed. In particular, you should be very familiar with the following documents: .BL 5 compact .LI .I "The U\s-1NIX\s+1 Time-Sharing System\^" .LI \*m .LI .I "C Reference Manual\^" .LI .I "Administrative Advice for U\s-1NIX\s+1\^" .LE .P A complete set of pertinent documentation is contained in .I "Documents for U\s-1NIX\s+1" . Throughout this document, each reference of the form .I name (N), where N is a Arabic number, refers to entry .I name\^ in Section~N of the \*m. .P You must have a basic understanding of the operation of the hardware. This includes the console panel, the tape drives, and the disk drives, all of which are assumed to have standard \*u addresses and interrupt vectors. It is also assumed that the hardware works and has been completely installed. All appropriate \s-1DEC\s+1 diagnostics and the Equipment Test Package should have been run to test the configuration, and you must have a detailed description of the hardware, including device addresses, interrupt vectors, and bus levels. This information is necessary to generate the \*u system. .P See Attachment 1 for a list of supported \s-1CPU\s+1s and devices. .H 2 Procedure \*u is distributed on a single, multi-file magnetic tape, recorded in \%9-track format at 800~bpi. Distribution tapes will be marked either ``\*Y'' or ``\*Z''; be sure you have the correct tape for your machine. .P The initial load program will copy a file system from tape (\*Z: \s-1TE\s+116; \*Y: either a \s-1TU\s+110 or a \s-1TU\s+116) to disk (\*Z: \s-1RP\s+106; \*Y: either an \s-1RP\s+103, an \s-1RK\s+105, an \s-1RL\s+101, or an \s-1RP\s+106). In this document, we consider \s-1RP\s+104 and \s-1RP\s+105 drives to be equivalent to \s-1RP\s+106 drives; any differences will be noted explicitly. Once the .I root\^ file system has been successfully loaded to disk, \*u may be booted and the available utility programs may then be used to complete the installation. .P The remaining files on the tape contain source text and supplemental commands. These files contain essential information to generate a new system that will match your particular hardware and software environment. .P In order for any of the update procedures to work correctly, you .I must\^ be .I running\^ \s-1UNIX/TS\s+1 or \s-1PWB/UNIX\s+1 Edition~2.0. Older versions of \*u cannot be correctly .I updated\^ with a \*u system. The .I cpio (1) program will not replace any file if its replacement has a modification time that is less than (i.e., earlier than) the modification time of the original file. This can be due to local modifications. Furthermore, certain administrative files (e.g., \f2/etc/passwd\^\fP, \f2/usr/lib/crontab\^\fP) are sent with a modification time of January 1, 1970 to ensure that they do not replace their counterparts during updates. Any file not copied will cause .I cpio (1) to print a message to that effect. These messages should always be investigated to ensure that any files not copied were of that type. However, note that, depending on respective modification times, a locally-modified file may get updated, thus destroying the local modifications. .P There are several difficulties that can arise when installing a \*u system. One of the most common problems is running out of disk space when performing an update. Should this occur, the original contents of the file system should be restored from a backup copy and the contents of the update tape should be read into a spare file system using the .I cpio (1) program. Unwanted material can then be removed and the original file system can be updated from this new file system using the .I \-p\^ option of .I cpio (1). Modification times of files should also be preserved using the .I \-m\^ option of .I cpio (1). .P This document is not strictly linear. Read it thoroughly, from start to finish, and then read it again. Also, remove the write-protect ring, if present, from the distribution tape to guard against accidental erasure. .H 1 "LOAD PROCEDURES" .H 2 "Distribution Tape Format" The eight files are: a loader, a physical copy of the .I root\^ file system, the .I cpio (1) program, a .I cpio (1) structured copy of the .I root\^ file system, and three files (\f2cpio\^\fP) that make up .I /usr . .I Root\^ refers to the directory ``/'', which is the root of all the directory trees. The format of this tape is as follows: .VL 22 \n(Si compact .LI "record~0:" Tape boot loader\-512-bytes; .LI "record~1:" Tape boot loader\-512-bytes; .LI "remainder of file 1:" Initial load program\-several 512-byte records; .LI "~~~~~~\f2end-of-file\fP" .sp .5v .LI "file~2:" \f2root\^\fP file system (physical)\-several 5,120-byte records (blocking factor 10); .LI "~~~~~~\f2end-of-file\fP" .sp .5v .LI "file~3:" \f2cpio\^\fP program (latest version)\-several 512-byte records; .LI "~~~~~~\f2end-of-file\fP" .sp .5v .LI "file~4:" \f2root\^\fP file system (structured in \f2cpio\^\fP format)\-several 5,120-byte records (to be used .I only\^ for updating an earlier \*u); .LI "~~~~~~\f2end-of-file\fP" .LI "file~5:" .I /usr\^ file system except .I src\^ and .I man\^ .RI ( cpio ). .LI "~~~~~~\f2end-of-file\fP" .LI "file~6:" .I /usr/src\^ part 1. .LI "~~~~~~\f2end-of-file\fP" .LI "file 7:" .I /usr/src\^ part 2. .LI "~~~~~~\f2end-of-file\fP" .LI "file 8:" .I /usr/man . .LI "~~~~~~\f2end-of-file\fP" .LE .P The .I root\^ (/) file system contains the following directories: .VL 18 \n(Si compact .LI bck: Directory used to mount a backup file system for file restoring. .LI bin: Public commands; most of what is described in Section~1 of the \*m. .LI dev: Special files, all the devices on the system. .LI etc: Administrative programs and tables. .LI lib: Public libraries, parts of the assembler, C compiler. .LI mnt: Directory used to mount a file system. .LI lost+found: Directory used by .I fsck (1M) for disconnected files. .LI stand: Stand-alone programs. .LI tmp: Directory used for temporary files; should be cleaned at reboot. .LI usr: Directory used to mount the .I /usr\^ file system; user directories often kept here also. .LE .H 2 "Initial Load of root" Mount the distribution tape on drive~0 and position it at the load point. .H 3 "\*Y" Bootstrap the tape by reading either record~0 or record~1 into memory starting at address~0 and start execution at address~0. This may be accomplished by using a standard \s-1DEC\s+1 \s-1ROM\s+1 bootstrap loader, a special \s-1ROM\s+1, or some manual procedure; see .I romboot (8), .I tapeboot (8), and .I 70boot (8). .H 3 "\*Z" See ``Installation Boot Procedures'' under .I vaxops (8). This \*m entry describes initial tape booting, and modification of the console floppy disk to simplify \*u administration. .H 2 "Common to \*Y and \*Z" The tape boot loader will then type ``\*u tape boot loader'' on the console terminal and read in and execute the initial load program. The program will then type detailed instructions about the operation of the program on the console terminal. First, it will ask what type of \s-1CPU\s+1 you have. Second, the program will ask what type of disk drive you have and which drive you plan to use for the copy. The disk controller used must be at the standard \s-1DEC\s+1 address indicated by the program. However, other disk controllers on your system may be at non-standard addresses. You must mount a formatted, \s-1ECC\s+1 flag-free pack on the drive you have indicated. If necessary, use the appropriate \s-1DEC\s+1 diagnostic program to format the pack. Note that the pack will be written on. Third, the program will ask what type of tape drive you have and which drive contains the tape. Normally, this will be drive~0, but the program will work with other drives. Note that the tape is currently positioned correctly after the end-of-file between the initial load program and the .I root\^ file system. When everything is ready, the program will copy the file system from the tape to disk and give instructions for booting \*u. After the copy is complete and you have booted the basic version of \*u, check (using \f2fsck\^\fP(1M)) the .I root\^ file system and browse through it. .H 3 "\*Y/70 Only" The file .I /stand/mmtest\^ is a stand-alone memory mapping diagnostic program for the \*Y/70. It should be booted and run (20 minutes) if you are not .I absolutely\^ sure that \s-1DEC\s+1 \s-1FCO\s+1 (field change order) M8140-R002 has been applied to your \*Y/70 \s-1CPU\s+1. .H 2 "Update of root" It is very important that the system be running in .I single-user\^ mode during the update phase. To update an already existing .I root\^ file system, files three and four will be used. It is necessary to first make a copy of your .I root\^ file system using .I volcopy (1M) and then update this copy. The copy should be made on a separate disk pack using the same section number as your .I root\^ file system (always section~0). Also, after the update is completed, check if any of your local administrative files in the directory .I /etc\^ need modification. Most of these are mentioned in Section 4 below. .P Mount the tape on drive~0 and position it at the load point. We assume that disk drive~1 is available for making the copy, and that the .I root\^ file system is on .I /dev/rp0 . This shell procedure will be different for \s-1RK\s+105 and \s-1RL\s+101 disk drives. The following procedure will first make a copy of the .I root\^ file system, and then update this copy. Note that .I /dev/mt4\^ refers to tape drive~0 but has the side effect of spacing forward to the next end-of-file (no rewind option). The .I B\^ option of .I cpio\^ specifies that input is in 5,120-byte records: .Ds volcopy root /dev/rrp0 \f2pkname1\^\fP /dev/rrp10 \f2pkname2\^\fP mount /dev/rp10 /bck \f3#\fP~~~The 2 echoes will move the tape to file 3 echo </dev/mt4 echo </dev/mt4 cp /dev/mt4 /bck/bin/cpio chmod 755 /bck/bin/cpio chown bin /bck/bin/cpio cd /bck /bck/bin/cpio \-idmB </dev/rmt0 cd / umount /dev/rp10 .De \f2Pkname1\^\fP and \f2pkname2\^\fP are the volume names of the source and destination disk packs, respectively. If the new copy is satisfactory, shut down and halt the system, change disk packs, and reboot the system using the new .I root . .P .H 2 "Files 5, 6, 7, and 8 (/usr) Format" File~5 contains the .I /usr\^ file system in .I cpio (1) format (5,120-byte records). The .I /usr\^ file system contains commands and files that must be available (mounted) when the system is in .I multi-user\^ mode. The tape contains the following directories: .VL 18 \n(Si compact .nh .na .LI adm: Miscellaneous administrative command and data files, including the connect-time accounting file .I wtmp\^ and the process accounting file .I pacct . .LI bin: Public commands; an overflow for .I /bin . .LI dict: Dictionaries for word processing programs. .LI games: Various demonstration and instructional programs. .LI include: Public C language .I #include\^ files. .LI lib: Archive libraries, including the text processing macros; also contains data files for various programs, such as .I spell (1) and .I cron (1M). .LI mail: Mail directory. .LI man: Source for the \*m; see .I man (1). .LI lost+found: Directory used by .I fsck (1M) for disconnected files. .LI news: Place for all the various system news. .LI pub: Handy public information, e.g., table of \s-1ASCII\s+1 characters. .LI spool: Spool directory for daemons. .LI src: Source for commands, libraries, the system, etc. .LI tmp: Directory for temporary files; should be cleaned at reboot. .LE .hy 14 .ad .P A table of contents of this tape may be obtained by using the .I cpio (1) options .I \-itB . Also, after installation, files and directories deemed useless by the local administrator may be easily removed. Alternately, only parts of the tape may be extracted using the pattern matching capabilities of .I cpio (1). .H 2 "Initial Load of /usr" Mount a file system (device) as .I /usr . The ultimate size and location of this file system on a device is an administrative decision; initially, the following procedure will suffice: .Ds \f3#\fP~~~The 4 echoes will move the tape to file 5 \f3#\fP~~~(mt4 is the no-rewind device) echo </dev/mt4 echo </dev/mt4 echo </dev/mt4 echo </dev/mt4 cd / mkfs /dev/rrp1 35000 7 418 \f3#\fP~~~The magic numbers "7 418" above refer to free-list ordering: \f3#\fP~~~(rotational angle of 7 and 418 blocks/cylinder for \s-1RP\s+104/5/6/s) \f3#\fP~~~If you have \s-1RL\s+101 drives, use mkfs /dev/rrl1 10240 13 20 \f3#\fP~~~If you have \s-1RK\s+105 drives, use mkfs /dev/rrk1 4872 3 24 labelit /dev/rrp1 usr \f2pkname\^\fP mount /dev/rp1 /usr cd /usr cpio \-idmB </dev/rmt4 ~\f3#\fP~ file 5: /usr except /src and /man cd /usr/src cpio \-idmB </dev/rmt4 ~\f3#\fP~ file 6: 1st part of /usr/src cpio \-idmB </dev/rmt4 ~\f3#\fP~ file 7: last of /usr/src cd /usr/man cpio \-idmB </dev/rmt0 ~\f3#\fP~ file 8: /usr/man \f3#\fP~~~If you have \s-1RL\s+101 or \s-1RK\s+105 drives, you will have to use separate \f3#\fP~~~packs for files 5-8. .De .I Pkname\^ is the volume name of the pack (e.g., ``p0001''). .P Because .I /usr\^ must be mounted when the system is in .I multi-user\^ mode, the file .I /etc/rc\^ must be changed to include the command lines to mount and unmount the file systems in .I single-user\^ and .I multi-user\^ mode. These lines must be inserted at the appropriate places in .I /etc/rc , as indicated by comments in the prototype file. Next the file .I /etc/checklist\^ should be changed to include .I /dev/rrp1 , .I /dev/rrl1 , or .I /dev/rrk1 ; see also .I fsck (1M), .I labelit (1M), .I mkfs (1M), .I mount (1M), and .I checklist (5). .H 2 "Update of /usr" It is advisable that the system be running in .I single-user\^ mode during the update phase. It is also wise to first make a copy of your .I /usr\^ file system for backup purposes. Next, mount the distribution tape on drive~0 and position it at file~5. The .I /usr\^ file system .I must\^ also be mounted. The following procedure will perform the update: .Ds cd /usr cpio \-idmB </dev/rmt4 cpio \-idmB </dev/rmt4 cpio \-idmB </dev/rmt4 cpio \-idmB </dev/rmt0 .De .H 1 "CONFIGURATION PLANNING" .H 2 "UNIX Configuration" .P The basic \*u operating system supplied supports only the console, a disk controller (disk drive~0), and a tape controller (tape drive~0). The actual configuration of your system must be described by you. All of the \*u operating system source code and object libraries are in .I /usr/src/uts . All of the configuration information is kept in the directory .I /usr/src/uts/\(**/cf . There are only two files that must be changed to reflect your system configuration, \f2low\^\fP\f3.\fP\f2s\^\fP and \f2conf\^\fP\f3.\fP\f2c\^\fP; the program .I config (1M) should be used to make these changes. .P .I Config\^ requires a .I "system description file\^" and produces the two needed files. The first part of the system description file lists all of the hardware devices on your system. Next, various system information is listed. A brief explanation of this information follows; for more details of syntax and structure, see .I config (1M) and the associated .I master (5); \s-1TABLE\s+1 I lists the values and sizes of the various parameters for the different \s-1CPU\s+1s. .DF .ce \f3TABLE I. \|UNIX Configuration Parameters\fP .sp 3p .TS center expand box ; cI | c s | c s | c s ^ | cI | cI | cI | cI | cI | cI l | n | n | n | n | n | n . Item PDP-11/34, /23 PDP-11/45, /70 VAX-11/780 _ Value Size Value Size Value Size = nswap 1000 \- 3000 \- 9000 \- buffers 15-20 26\(dg 25-60 26\(dg 50-120\(dd 560 sabufs 4-6 538 10-15 538 \- \- inodes 30-50 74 100-250 74 100-250 76 files 30-50 8 100-250 8 100-250 12 mounts 3-5 8 8-16 8 8-16 16 coremap 50-100 4 50-100 4 \- \- swapmap 50-100 4 50-100 4 50-100 4 calls 15-30 6 30-60 6 30-60 12 procs 30-50 30 50-200 30 50-200 52 texts 10-15 12 25-50 12 25-50 16 clists 10-20 28 100-300 28 100-300 32 maxup 15 \- 15 \- 25 \- .TE \(dg Plus 512 bytes outside system space. \(dd 127 buffers is the system maximum. .De .BL "" compact .LI .I root \-Specifies the device where the .I root\^ file system is to be found. The device must be a block device with read/write capability because this device will be mounted read/write as ``/''. Thus, a tape can not be mounted as the .I root , but can be mounted as some read-only file system. Normally, .I root\^ is disk drive~0, section~0. .LI .I pipe \-Specifies where pipes are to be allocated (must be a file system\-the root file system is normally used). .LI .I dump \-Specifies the device to be used to dump memory after a system crash. Currently only the \s-1TU\s+110 and \s-1TU\s+116/\s-1TE\s+116 tape drives are supported for this purpose. .LI .I swap \-Specifies the device and blocks that will be used for .I swapping . .I Swplo\^ is the first block number used and .I nswap\^ indicates how many blocks, starting at .I swplo , to use. Care must be taken that the swap area specified does not overlap any file system. For example, if section~0 is 8,000 blocks long, the .I root\^ file system could occupy the first 6,000 blocks and .I swap\^ the remaining 2,000 by specifying: .Ds root rp06 0 swap rp06 0 6000 2000 .De The \*Z release is set up for a .I root\^ of 7,000 blocks and a .I swap\^ of 9,000 blocks. .LI .I buffers \-Specifies how many .I "system buffers\^" to allocate. Real time response improves as more buffers are allocated. U\s-1NIX\s+1 buffers form a ``data cache''. Improvement in the hit rate of this cache tends to fall as the number of buffers is increased. .LI .I sabufs "\-\*Y only: specifies" how many .I "system addressable\^" buffers to allocate. One buffer is needed for every mounted file system. Certain \s-1I/O\s+1 drivers need such buffers. .LI .I inodes \-Specifies how many .I "inode table\^" entries to allocate. Each entry represents a unique open inode. When the table overflows, the warning message ``Inode table overflow'' will be printed on the console. The table size should be increased if this happens regularly. The number of entries used depends on the number of active processes, texts, and mounts. .LI .I files \-Specifies how many .I "open-file table\^" entries to allocate. Each entry represents an open file. When the table overflows, the warning message ``no file'' will be printed on the console. The table size should be increased if this happens regularly. .LI .I mounts \-Specifies how many .I "mount table\^" entries to allocate. Each entry represents a mounted file system. The .I root\^ (/) will always be the first entry. When full, the .I mount (2) system call will return the error \s-1EBUSY\s+1. .LI .I coremap "\-\*Y only: specifies" how many entries to allocate to the .I "list of free memory" . Each entry represents a contiguous group of 64-byte blocks of free memory. When the list overflows, due to excessive fragmentation, the system will undoubtedly crash in an unpredictable manner. The number of entries used depends on the number of processes active, their sizes, and the amount of memory available. .LI .I swapmap \-Specifies how many entries to allocate to the .I "list of free swap blocks" . Exactly like the .I coremap , except it represents free blocks in the swap area, in 512-byte units. .LI .I calls \-Specifies how many .I "call-out table\^" entries to allocate. Each entry represents a function to be invoked at a later time by the clock handler. The time unit is 1/60 of a second. The call-out table is used by the terminal handlers to provide terminal delays and by various other \s-1I/O\s+1 handlers. When the table overflows, the system will crash and print the panic message ``Timeout table overflow'' on the console. .LI .I procs \-Specifies how many .I "process table\^" entries to allocate. Each entry represents an active process. The scheduler is always the first entry and .I init (8) is always the second entry. The number of entries depends on the number of terminal lines available and the number of processes spawned by each user. The average number of processes per user is in the range of 2-5. When full, the .I fork (2) system call will return the error \s-1EAGAIN\s+1. .LI .I texts \-Specifies how many .I "text table\^" entries to allocate. Each entry represents an active read-only text segment. Such programs are created by using the .I \-i\^ or .I \-n\^ option of the loader .I ld (1). When the table overflows, the warning message ``out of text'' is printed on the console. .LI .I clists \-Specifies how many .I "character list buffers\^" to allocate. Each buffer contains up to 24 bytes. The buffers are dynamically linked together to form input and output queues for the terminal lines and various other slow-speed devices. The average number of buffers needed per terminal line is in the range of 5-10. When full, input characters from terminals will be lost and not echoed. .LI .I maxup \-Specifies how many concurrent processes a user is allowed to run. .LI .I power \-Specifies whether to attempt restart after a power failure. A value 0 (default) indicates no restart, a value of 1 attempts power-fail restart. On restart, device drivers are called and process 1 (i.e., .I init \^) is sent a hangup signal; see .I init (8). V\s-1AX\s+1 power-fail is provided for experimental use only in \s-1UNIX\s+1~3.0. .LE .H 2 "UNIX Generation" To generate a new \*u operating system, make sure that the directories under .I /usr/src/uts\^ are up-to-date. Follow the procedure below: .Ds cd /usr/src/uts ed \f2dfile\^\fP a ~~~[\f2information as described above\^\fP] \&\f3.\fP w q make \-f uts\f3.\fPmk VER=\f2ver\^\fP SYS=\f2sys\^\fP CONFIG=\f2dfile\^\fP TYPE=\f2type\^\fP NODE=\f2uucpname\^\fP .De .I Dfile\^ is the complete path name or the path name relative to .I /usr/src/uts/\(**/cf\^ of the file containing the configuration information, .I sys\^ is a system name, .I ver\^ is normally .I mmdd\^ (month and day). The resulting operating system executable file name is the result of concatenating .I sys\^ and .I ver\^ (i.e., ``utsa0513''). The .I uucpname\^ is for network identification. .I Type\^ is the \s-1CPU\s+1 type: \f3i\fP is used for \*Y/23 and /34, \f3vax\fP is used for \s-1VAX\s+1, and \f3id\fP is used for other \s-1CPU\s+1s. The procedure will compile \f2low\^\fP\f3.\fP\f2s\^\fP (\f2univec\^\fP\f3.\fP\f2c\^\fP on the \*Z) and \f2conf\^\fP\f3.\fP\f2c\^\fP, and load them together with the object libraries into a file called .I name . .P The \*Y system has a relatively small address space, so that if table sizes or the number of device types are too large, various error messages will result and the above procedure will only create an \f2a\^\fP\f3.\fP\f2out\^\fP file. In particular, the maximum available data space is 49,152 bytes (57,344 bytes on the \*Y/23 and the /34). The actual data space requested can be found by using .I size (1) on \f2a\^\fP\f3.\fP\f2out\^\fP and adding the .I data\^ , .I bss\^ , and, for \*Y/23 and /34, text segment sizes. One then reduces the specified values for the various system entries until it all fits. The amount of space in the .I bss\^ segment used for each entry is indicated in Section 3.1 above. .P When you are satisfied with the new system, you can test it by the following procedure: .Ds cd /usr/src/uts cp \f2sysver\^\fP / # \f2sysver\^\fP as above cd / rm /unix ln /\f2sysver\^\fP /unix sync .De .P Then halt the processor and reboot the system. Note that this procedure results in two names for the operating system object, the generic .I /unix , and the actual name, say .I /utsa0501 . An old system may be booted by referring to the actual name, but remember that many programs use the generic name .I /unix\^ to obtain the .I name-list\^ of the system. .P If the new system does not work, verify that the correct device addresses and interrupt vectors have been specified. If the .I wrong\^ interrupt vector and the .I correct\^ device address have been specified for a device, the operating system will print the error message ``stray interrupt at \s-1XXX\s+1'' when the device is accessed, where \s-1XXX\s+1 is the correct interrupt vector. If the .I wrong\^ device address is specified, the system will crash with a panic trap of type 0 (indicating a timeout) when the device is accessed. .H 2 "Special Files" A special file must be made for every device on your system. Normally, all special files are located in the directory .I /dev . Initially, this directory will contain: .Ds .ta 20n console console terminal error see \f2err\^\fP(4) mem, kmem, null see \f2mem\^\fP(4) tty see \f2tty\^\fP(4) rp[0-7], rrp[0-7] disk drive 0, sections 0-7 rl[0-1], rrl[0-1] disk drives 0 and 1 rk[0-1], rrk[0-1] disk drives 0 and 1 mt0, rmt0 tape drive 0 (800 bpi) mt4, rmt4 tape drive 0 (800 bpi, no rewind). .ta .5i 1i 1.5i 2i 2.5i 3i 3.5i 4i 4.5i 5i 5.5i 6i 6.5i .De .P There are two types of special files, block and character. This is indicated by the character .I b\^ or .I c\^ in the listing produced by .I ls (1) with the \f2\-l\^\fP flag. .P In addition, each special file has a major device number and a minor device number. The major device number refers to the device type and is used as an index into either the .I bdevsw\^ or .I cdevsw\^ table in the configuration file \f2conf\^\fP\f3.\fP\f2c\^\fP. The minor device number refers to a particular unit of the device type and is used only by the driver for that type. The .I config\^ program with the .B \-t option will list major device numbers. .P The program .I mknod (1M) creates special files. For example, the following would create .I part\^ of the initially-supplied .I /dev\^ directory: .Ds cd /dev mknod console c 0 0 mknod error c 20 0 mknod mem c 2 0\f3;\fP mknod kmem c 2 1\f3;\fP mknod null c 2 2 mknod tty c 13 0 mknod rp0 b 0 0\f3;\fP mknod rrp0 c 7 0 mknod mt0 b 1 0\f3;\fP mknod rmt0 c 6 0 mknod mt4 b 1 4\f3;\fP mknod rmt4 c 6 4 .De After the special files have been made, their access modes should be changed to appropriate values by .I chmod (1). For example: .Ds cd /dev chmod 622 console chmod 444 error chmod 644 mem kmem chmod 666 null chmod 666 tty chmod 400 rp0 rrp0 chmod 666 mt0 rmt0 chmod 666 mt4 rmt4 .De .P Note that file names have no meaning to the .I "operating system\^" itself; only the major and minor device numbers are important. However, many .I programs\^ expect that a particular file is a certain device. Thus, by convention, special files are named as follows: .Ds .ta 26n 36n \f2block device conf\^\fP\f3.\fP\f2c /dev\^\fP \s-1RP\s+103 disk rp rp\(** \s-1RP\s+104/5/6 disk hp rp\(** \s-1RS\s+103/4 fixed head disk hs rs\(** \s-1RK\s+105 disk rk rk\(** \s-1RL\s+101 disk rl rl\(** \s-1TU\s+110 tape tm mt\(** \s-1TE/TU\s+116 tape ht mt\(** .ta .5i 1i 1.5i 2i 2.5i 3i 3.5i 4i 4.5i 5i 5.5i 6i 6.5i .De .Ds .ta 26n 36n \f2character device conf\^\fP\f3.\fP\f2c /dev\^\fP \s-1DL\s+111 asynch. line kl tty\(**, console \s-1DH\s+111 asynch. line mux dh tty\(** \s-1DMC\s+111 sync. unit dmc dmc\(** \s-1DZ\s+111 asynch. line mux dz tty\(** \s-1DN\s+111 auto call unit dn dn\(** \s-1DU\s+111 synch. line du du\(** \s-1KMC\s+111 micro kmc kmc\(** \s-1DZ\s+111/KMC11 assist dza,dzb tty\(** \s-1LP\s+111 line printer lp lp\(** \s-1RP\s+103 disk rp rrp\(** \s-1RP\s+104/5/6 disk hp rrp\(** \s-1RS\s+103/4 fixed head disk hs rrs\(** \s-1TU\s+110 tape tm rmt\(** \s-1TE/TU\s+116 tape ht rmt\(** error err error memory mm mem, kmem, null terminal sy tty .ta .5i 1i 1.5i 2i 2.5i 3i 3.5i 4i 4.5i 5i 5.5i 6i 6.5i .De .P For those devices with a .I /dev\^ name ending in \(**, this character is replaced by a string of digits representing the .I minor \^ device number. For example: .Ds mknod /dev/mt1 b 1 1 mknod /dev/rp24 b 0 024 .De Note that for disks, an octal number scheme is maintained because each drive is split eight ways. Thus, .I /dev/rp24\^ refers to section~4 of physical drive~2. There is also a special file, .I /dev/swap , that is used by the program .I ps (1). This file must reflect what device is used for swapping and must be readable. For example: .Ds rm /dev/swap mknod /dev/swap b 0 0 chmod 440 /dev/swap .De .H 2 "File Systems" Each physical pack is split into eight logical sections. This split is defined in the operating system by a table with eight entries. Each table entry is two words long. The first specifies how many blocks are in the section, the second specifies the starting cylinder; see .I hp (4) (\s-1RP\s+104/5/6) and .I rp (4) (\s-1RP\s+103) for default cylinder and block assignments. .P These values are described to the system in the header file \f2/usr/include/sys/io\^\fP\f3.\fP\f2h\^\fP which may be changed by using the editor .I ed (1). After such a change, the system must be made again (see Section 3.2 above). .P A file system starts at block~0 of a section of the disk and may be as large as the size of that section; if it is smaller than the size of a section, the remainder of that section is unused. Note that the sections themselves may overlap physical areas of the pack, but the file systems must .I never\^ overlap. .P The program .I mkfs (1M) is used to initialize a section of the disk to be a file system. Next, the program .I labelit (1M) is used to label the file system with its name and the name of the pack. Finally, the file system may be checked for consistency by using .I fsck (1M). The file system may then be mounted using .I mount (1M). .H 2 "DZ11 software with KMC11 assist" \s-1KMC\s+1 microprocessors may be used to control \s-1DZ\s+111 asynchronous multiplexers, thus off-loading terminal-oriented functions from the main \s-1CPU\s+1. The software is distributed in two forms. The \s-1KMC\s+111-A version does \s-1DMA\s+1 output of data, character translations, tab expansions, etc. The \s-1KMC\s+111-B version does these output functions in addition to doing \s-1DMA\s+1 input of data. Each \s-1KMC\s+111 can control up to four \s-1DZ\s+111 multiplexers for a total of thirty-two asynchronous lines. Each system can support up to four \s-1KMC\s+111 microprocessors. Up to sixty-four \s-1DZ\s+111 lines can be controlled by \s-1KMC\s+111 microprocessors. .H 3 Installation .AL 1 .LI Generate a system (see Section 3.2 above) by including each \s-1DZ\s+111 to be controlled by a \s-1KMC\s+111 in the configuration file. For example: .Ds \f3#\fP~~~For the \s-1KMC\s+111-A dza X Y Z .sp .5v \f3#\fP~~~For the \s-1KMC\s+111-B dzb X Y Z .De where X is the vector address, Y is the \s-1UNIBUS\s+1 address, and Z is the bus request priority. Also include the \s-1KMC\s+111 microprocessors in the configuration file: .Ds kmc X Y Z .De .LI Install the \s-1KMC\s+111 microcode in .I /lib\^ : .Ds \f3#\fP~~~For the \s-1KMC\s+111-A cd /usr/src/uts/*/up/dza/dzkload /lib/cpp dza.s \(bv kas \-o /lib/dzkmc.o .sp .5v \f3#\fP~~~For the \s-1KMC\s+111-B cd /usr/src/uts/*/up/dzb/dzkload /lib/cpp main.s \(bv kasb \-o /lib/dzkmc.o .De .LI Copy .I dzkload " into " /etc : .Ds \f3#\fP~~~For the \s-1KMC\s+111-A cp /usr/src/uts/*/up/dza/dzkload /etc .sp .5v \f3#\fP~~~For the \s-1KMC\s+111-B cp /usr/src/uts/*/up/dzb/dzkload /etc .De .LI Update .I /etc/rc\^ to execute .I dzkload\^ for multi-user and power-fail .I init\^ states. Each \s-1KMC\s+111 used to control a \s-1DZ\s+111 must be loaded with microcode. For each \s-1KMC\s+111 used to control a \s-1DZ\s+111 include: .Ds /etc/dzkload /dev/kmc? .De where .B ? is the minor device number of that \s-1KMC\s+111. .LI Special files (see Section 3.3 above) must be created for each \s-1KMC\s+111 and \s-1DZ\s+111 line: .Ds \f3#\fP~~~Example /etc/mknod /dev/kmc? c X ? /etc/mknod /dev/tty?? c Y Z .De X is the major device number of the \s-1KMC\s+111 and .B ? is the minor device number of the \s-1KMC\s+111 controlling the \s-1DZ\s+111 multiplexers, i.e., the \s-1KMC\s+111 loaded with microcode in step 4. Y is the major device number of the .I dza/dzb\^ device as is supplied by .I config (1M). Z is the minor device number for a particular line on a \s-1DZ\s+111. This number is composed of three fields. The low-order three bits are the line number relative to a \s-1DZ\s+111. The next three bits contain the minor device number of the \s-1DZ\s+111 controlling these lines. Note that this number is the absolute \s-1DZ\s+111 number, not the number relative to the \s-1KMC\s+111. The high-order two bits are the minor device number of the \s-1KMC\s+111 controlling this \s-1DZ\s+111. For example: .Ds mknod /dev/tty?? c Y 0241 .De specifies the second line (0 through 7) on the fifth \s-1DZ\s+111 to be controlled by the \s-1KMC\s+111 with minor device number 2. The \s-1DZ\s+111 number is specified by the order of appearance in the configuration file. The first four \s-1DZ\s+111 multiplexers must be associated with one \s-1KMC\s+111 and the next four must be associated with another \s-1KMC\s+111. The order in which the \s-1KMC\s+111 microprocessors are specified is not significant. .LE 1 .H 1 "ADMINISTRATIVE FILES" .H 2 /etc/motd This file contains the .I "message-of-the-day" . It is printed by .I /etc/profile\^ after every successful .I login . .H 2 /etc/rc On the transition between init states, .I /etc/init\^ invokes .I /bin/sh\^ to run .I /etc/rc\^ (must have executable modes). So that .I /etc/rc\^ can properly handle the removal of temporary files and the mounting and unmounting of file systems, it is invoked with three arguments: new state, number of times this state has been entered, previous state. When the system is initially booted, .I /etc/rc\^ is invoked with arguments ``1 0 1''; when state two(multi-user) is subsequently entered, the arguments are ``2 0 1''. .P Daemons may be invoked either by .I /etc/rc\^ or by including lines for them in .I /etc/inittab . .P The .I /etc/rc\^ file is also used to initialize \s-1KMC\s+111 microprocessors (see .I /etc/dzkload\^ .RI and /etc/vpmload\^ below). .P This file must be edited to suit local conditions; see .I init (8). .H 2 /etc/inittab This file indicates to .I /etc/init\^ which processes to create in each init state. By convention, state 1 is .I single-user\^ and state 2 is .I multi-user . For example, the following line creates the single-user environment: .Ds 1\f3:\fPco\f3:\fPc\f3:\fPenv HOME=/ PATH=/bin\f3:\fP/etc\f3:\fP/usr/bin /bin/sh </dev/console\e >/dev/console 2>/dev/console 1\f3:\fPxx\f3:\fPk\f3:\fP/etc/getty console ! 0 .De This indicates that for state 1 a process with the arbitrary unique identifier .I co\^ should be created. The program invoked for this process should be the shell and when it exits it should be reinvoked (\f2c\^\fP flag). .P To attach a .I login\^ process to the console in the multi-user state, add the line: .Ds 2\f3:\fPco\f3:\fPc\f3:\fP/etc/getty console 4 .De and for line .I /dev/tty00\^ for use by 300/150/110 baud terminals, add the following line: .Ds 2\f3:\fP00\f3:\fPc\f3:\fP/etc/getty tty00 0 60 .De The arguments to .I getty\^ are the device, speed table, and number of seconds to allow before hanging up the line. .P Again, this file must be edited for local conditions; see .I getty (8), .I init (8), and .I inittab (5). .H 2 /etc/dzkload This file is invoked as a command by .I /etc/rc . It contains instructions for initializing a \s-1KMC\s+111 microprocessor which is to function as a controller for one or more \s-1DZ\s+111 communications multiplexers (see Section 3.5 above). This file must be edited to suit the configuration. .H 2 /etc/passwd This file is used to describe each .I user\^ to the system. You must add a new line for each new user. Each line has seven fields separated by colons: .AL 1 "" compact .LI Login name: normally 1-6 characters, first character alphabetic, the remainder alphanumeric, no upper-case characters. .LI Encrypted password: initially null, filled in by .I passwd (1). The encrypted password contains 13 bytes, while the actual password is limited to a maximum of 8 bytes. The encrypted password may be followed by a comma and up to 4 more bytes of password ``age'' information. .LI User \s-1ID\s+1: a number between 0 and 65,535; 0 indicates the super-user. These other \s-1ID\s+1s are reserved: .Ds bin\f3::\fP2\f3:\fP software administration; sys\f3::\fP3\f3:\fP system operation; adm\f3::\fP4\f3:\fP system administration; uucp\f3::\fP5\f3:\fP \*u-to-\*u file copy; rje\f3::\fP68\f3:\fP remote job entry administration; games\f3::\fP196\f3:\fP miscellaneous; never a real user. .De .LI Group \s-1ID\s+1: the default is group 1 (one). .LI Accounting information: this field is used by various accounting programs. It usually contains the user name, department number, and account number. .LI Login directory: full path-name (keep them reasonably short). .LI Program name: if null, .I /bin/sh\^ is invoked after a successful login. If present, the named program is invoked in place of .I /bin/sh . .LE .P For example: .Ds ghh\f3::\fP38\f3:\fP1\f3:\fP6824-G.H.Hurtz(4357)\f3:\fP/usr/ghh\f3:\fP grk\f3::\fP44\f3:\fP1\f3:\fP6510-S.P.LeName(4466)\f3:\fP/usr/grk\f3:\fP/bin/rsh .De See also .I passwd (5), .I login (1), .I passwd (1). .H 2 /etc/group This file is used to describe each .I group\^ to the system. You must add a new line for each new group. Each line has four fields separated by colons: .AL 1 "" compact .LI Group name: normally 1-6 characters, first character alphabetic, rest alphanumeric, no upper-case characters. .LI Encrypted password: initially null, filled in by .I passwd (1). The encrypted password contains 13 bytes, while the actual password is limited to a maximum of 8 bytes. .LI Group \s-1ID\s+1: a number between 0 and 65,535. .LI Login names: list of all .I login\^ names in the group, separated by commas. .LE .P We strongly discourage group passwords. See also .I group (5). .H 2 /etc/profile When the shell is executed and is the leader of a process group, as is the case when it is invoked by .I login , it will read and execute the commands in .I /etc/profile\^ before executing commands in the user's \f3.\fP\f2profile\^\fP file. This allows the system administrator to set up a standard environment for all users (e.g., executing .I umask , setting shell variables, etc.) and take care of other housekeeping details (such as .I "news \-n" ). .H 2 /etc/checklist This file contains a list of default devices to be checked for consistency by the .I fsck (1M) program. The devices normally correspond to those mounted when the system is in .I multi-user\^ mode. For example, a sample checklist would be: .Ds /dev/rp0 /dev/rrp1 .De .H 2 /etc/shutdown This file contains procedures to gracefully shut down the system in preparation for file-save or scheduled down-time. .H 2 /etc/filesave.? This file contains the detailed procedures for the local file-save. .H 2 /usr/adm/pacct This file contains the process accounting information; see .I acct (1M). .H 2 /usr/adm/wtmp This file is the log of login processes. .H 1 "REGENERATING SYSTEM SOFTWARE" System source is issued under the directory .I /usr/src . The sub-directories are named .I cmd\^ (commands), .I lib\^ (libraries), .I uts\^ (the operating system), .I head\^ (header files), and .I util\^ (utilities); see .I mk (8) for details on how to remake system software. .P A couple of anomalies: the accounting routine that deals with holidays and the prime/non-prime time split must be recompiled at the end of each year (it is currently correct for \s-1BTL\s+1-Murray Hill in 1980). The file is \f2/usr/src/cmd/acct/lib/pnpsplit\^\fP\f3.\fP\f2c\^\fP. A reminder is sent to .I /usr/adm/acct/nite/log , the standard place for such messages, starting a week before year-end and continuing until \f2pnpsplit\^\fP\f3.\fP\f2c\^\fP is recompiled. .H 2 "PDP-11 Command Regeneration" The distributed object code has been compiled for machines without separate ``I/D'' space and without floating-point hardware. If your system has separate I/D space (i.e., is a \*Y/70 or \*Y/45), you should .I mkcmd\^ adb, awk, bs, cc, cpio, dc, du, dump, efl, f77, fgrep, find, fsck, lex, make, mkfs, nm, pcat, restor, spell, spline, tbl, tplot, troff, units, unpack, uucp, volcopy, and yacc. If your configuration has an \s-1FP\s+111-[\s-1ABC\s+1] floating-point processor (or the compatible 11/23 chip), you should .I mkcmd\^ acct, adb, awk, bs, cc, pack, spline, tplot, typo, and units. If your configuration has both separate I/D space and floating point, you should .I mkcmd\^ acct, adb, awk, bs, cc, cpio, dc, du, dump, efl, f77, fgrep, find, fsck, lex, make, mkfs, nm, pack, pcat, restor, spell, spline, tbl, tplot, troff, typo, units, unpack, uucp, volcopy, and yacc. .H 1 "FILE SYSTEM CONVERSION TO UNIX (VAX)" Procedures have been developed for converting \*u file systems from \*Y/\*u (including \s-1UNIX/TS\s+1, \s-1PWB\s+1 Edition~2.0, and Research Version~7) to \*Z \s-1UNIX\s+1. Direct conversion from other systems (i.e., Version 6-based or \s-1UNIX/RT\s+1) is also possible, but the administrator should get help. .P The following \*u commands are referenced in this section: .I cpio (1), .I find (1), .I fsck (1M), .I fscv (1M), .I mkdir (1), .I mkfs (1M), .I mount (1M), and .I umount (1M). The reader is assumed to be familiar with them. .P Unless you have repealed Murphy's Law, you should allow plenty of time for the conversion. As a lower bound, it takes about two hours to convert each 65K of file system space. .H 2 "Preliminaries" Obviously, the new system should be generated and decently tested before conversion is attempted. Source for local commands and libraries should be moved to the \*Z and compiled and tested. Your users may also reasonably require time to develop conversion programs for data files that contain binary information. .H 3 "The Old System" The file systems should be pruned of marginal files. The following shell sequence will get rid of all executables: .Ds \f3#\fP~~~For each user file system: find /usr\-fs\-list \-type f \-print \(bv xargs file \(bv \e ~~~~~sed \-n \-e \(fms/\e([^:]*\e):\f3.\fP*executable/\e1/p\(fm >/usr/tmp/exfiles \f3#\fP~~~You may want to look this file over before the next step. xargs rm \-f</usr/tmp/exfiles rm /usr/tmp/exfiles .De .H 3 "Spare Packs" Do not convert without spare packs\-that is courting disaster. It is best to keep the old packs for several days, and to make backup tapes as well. .H 2 "Converting the Hard Way" Using .I find\^ and .I cpio\^ takes much longer, but you will have optimized converted user file systems when you are finished (compacted .I inodes\^ and directories, file and free-list blocks arranged for fastest access). .H 3 "Copying from the Old System" The following steps should be executed by the super-user on an idle, stand-alone (old) system: .Ds \f3#\fP~~~For each user file system: cd /file-system-name find \f3.\fP \-cpio /dev/rmt1 .De The .I \-cpio\^ option of .I find\^ produces ten-block records on physical tape in .I cpio\^ format. Unless there are a great many linked files, a 1,600-bpi, 2,400-foot reel should hold about 65K file system blocks. If you have larger file systems, the easiest (fastest, safest) thing to do is to use a raw disk pack in place of the tape (i.e., .B /dev/rrp?? in place of the .B /dev/rmt1 above). In our tests, multi-reel .I find/cpio\^ tapes have worked. .I Find\^ can also be used to pick up .I parts\^ of file systems that can be combined later as described below. .H 3 "Under the New System" Re-create each file system as follows: .Ds mkdir /file-system-name mkfs /dev/rrp? \f2blocks\^\fP\f3:\fP\f2inodes\^\fP 7 418 \f3#\fP~~~The magic numbers "7 418" above refer to free-list ordering: \f3#\fP~~~(rotational angle of 7 and 418 blocks/cylinder for \s-1RP\s+104/5/6s) labelit /dev/rrp? file-system-name pack-num mount /dev/rp? /file-system-name cd /file-system-name \f3#\fP~~~Mount tape created during step 3 cpio \-idmB </dev/rmt1 \f3#\fP~~~If you are combining the smaller file systems, \f3#\fP~~~you may copy-in more than one tape per new file system \f3#\fP~~~(but make sure that first-level directory names are unique) .De After the tapes have been copied in, the new file systems should be unmounted and checked (using .I fsck (1M)). .H 2 "Converting the Easy Way" The .I fscv (1M) command has been provided for fast conversion between \*Y and \*Z file systems. .P Note that .I fscv\^ will not convert ``special files'' (user file systems only). .I Fscv\^ source will compile and run on either system. It was designed primarily for use in computer labs where there are a mixture of \*Y and \*Z systems. .br .ne 6v .P Example 1: .Ds \f3#\fP~~~Converting \*Y to \*Z: \f3#\fP~~~Make sure that file system cylinder boundaries agree! fscv \-v /dev/rrp21 /dev/rrp31 .De .br .ne 6v Example 2: .Ds \f3#\fP~~~Converting ``in place'' to the \*Y: \f3#\fP~~~Anyone who does this without making a copy first deserves \f3#\fP~~~whatever bad (plenty) that can happen! fscv \-p /dev/rrp12 /dev/rrp12 .De See the .I fscv (1M) manual entry. .H 2 "A Final Precaution" It is only sensible to do another complete file system backup under the new operating system (using another set of tapes or packs). .bp .ce 2 \s+1\f2ATTACHMENT \|1\fP\s-1 .sp .5v \f3Processors and Peripherals Supported by \*u\fP .P The following table summarizes the hardware configurations supported by UNIX: .DS .TS center box ; l | c | c | c | c | c . \s-1CPU\s+1 with \f2floating point\fP \s-1PDP\s+1-11/23 \s-1PDP\s+1-11/34 \s-1PDP\s+1-11/45 \s-1PDP\s+1-11/70 \s-1VAX\s+1-11/780 _ _ Memory 256\s-1KB\s+1 256\s-1KB\s+1 256\s-1KB\s+1 0.5-1\s-1MB\s+1 1-4\s-1MB\s+1 \s-1ECC\s+1 \s-1MOS\s+1 \s-1ECC\s+1 \s-1MOS\s+1 \s-1ECC\s+1 \s-1MOS\s+1 \s-1ECC\s+1 \s-1MOS\s+1 \s-1ECC\s+1 \s-1MOS\s+1 or core or core _ Disk drives: ~~~\s-1RL\s+101 (2 required) F F S N \- ~~~\s-1RK\s+105 (2 required) \- O O \- \- ~~~\s-1RP\s+103 \- \- O \- \- ~~~\s-1RP\s+104 \- O O O \- (\s-1UNIBUS\s+1) (\s-1UNIBUS\s+1) (\s-1MASSBUS\s+1) ~~~\s-1RP\s+106 \- S F F F (\s-1UNIBUS\s+1) (\s-1UNIBUS\s+1) (\s-1MASSBUS\s+1) (\s-1MASSBUS\s+1) _ Fixed-head disks: ~~~\s-1RF\s+111 \- \- O \- \- ~~~\s-1RS\s+103,4 \- \- N N \- (\s-1UNIBUS\s+1) (\s-1MASSBUS\s+1) _ Tape drives: ~~~\s-1TU\s+110 \- O O \- \- ~~~\s-1TU\s+116 \- O O O \- ~~~\s-1TE\s+116 \- F F F F ~~~\s-1TU\s+145 \- \- \- S S _ Line printer: ~~~\s-1LP\s+111\(dg \- N N N N _ Asynch. interfaces: ~~~\s-1DLV\s+111 S \- \- \- \- ~~~\s-1DL\s+111-\s-1E\s+1 \- S S S \- ~~~\s-1DZ\s+111 \- S S S S ~~~\s-1KMC\s+111B/\s-1DZ\s+111\(dd \- F F F F ~~~\s-1DH\s+111 \- O O O \- _ Synch. interfaces: ~~~\s-1KMC\s+111\s-1B/DMC\s+1 line unit \- S S S S ~~~\s-1DMC\s+111 \- S S S S ~~~\s-1DU\s+111 \- O O O \- ~~~\s-1DQS\s+111B \- \- O O \- _ Auto-call unit: ~~~\s-1DN\s+111\s-1AA/DA\s+1 \- S S S S _ Parallel interface: ~~~\s-1DRV\s+111 S \- \- \- \- ~~~\s-1DR\s+111C \- S S S \- ~~~\s-1DR\s+111B \- S S S \- ~~~\s-1DA\s+111B (use \s-1DMC\s+1s) \- S S S \- .TE .nf .ta .5i .5i+\w'N\| 'u Key: F \(->\| First choice. S \(->\| Supported. O \(->\| Driver provided, but device is obsolete. N \(->\| Driver provided, but device is not recommended. \- \(->\| No support. \(dg Use a printer on an \s-1RS\s+1232 interface. \(dd 4 \s-1DZ\s+111s (32 lines) per \s-1KMC\s+1. .fi .ta .5i 1i 1.5i 2i 2.5i 3i 3.5i 4i 4.5i 5i 5.5i 6i 6.5i .DE .pl +1v .sp .5v .I "June 1980" .br .pl -1v