|
|
1.1 root 1: .\" Copyright (c) 1988 The Regents of the University of California.
2: .\" All rights reserved.
3: .\"
4: .\" Redistribution and use in source and binary forms are permitted
5: .\" provided that the above copyright notice and this paragraph are
6: .\" duplicated in all such forms and that any documentation,
7: .\" advertising materials, and other materials related to such
8: .\" distribution and use acknowledge that the software was developed
9: .\" by the University of California, Berkeley. The name of the
10: .\" University may not be used to endorse or promote products derived
11: .\" from this software without specific prior written permission.
12: .\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
13: .\" IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
14: .\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
15: .\"
16: .\" @(#)2.t 1.6 (Berkeley) 3/7/89
17: .\"
18: .ds lq ``
19: .ds rq ''
20: .ds LH "Installing/Operating \*(4B
21: .ds RH Bootstrapping
22: .ds CF \*(DY
23: .bp
24: .nr H1 2
25: .nr H2 0
26: .bp
27: .LG
28: .B
29: .ce
30: 2. BOOTSTRAP PROCEDURE
31: .sp 2
32: .R
33: .NL
34: .PP
35: This section explains the bootstrap procedure that can be used
36: to get the kernel supplied with this distribution running on your machine.
37: If you are not currently running 4.2BSD you will
38: have to do a full bootstrap.
39: Chapter 3 describes how to upgrade a 4.2BSD system.
40: An understanding of the operations used in a full bootstrap
41: is very helpful in performing an upgrade as well.
42: In either case, it is highly desirable to read and understand
43: the remainder of this document before proceeding.
44: .NH 2
45: Booting from tape
46: .PP
47: The tape bootstrap procedure used to create a
48: working system involves the following major
49: steps:
50: .IP 1)
51: Format a disk pack with the \fIvdformat\fP program, if necessary.
52: .IP 2)
53: Copy a ``mini root'' file system from the
54: tape onto the swap area of the disk.
55: .IP 3)
56: Boot the UNIX system on the ``mini root.''
57: .IP 4)
58: Restore the full root file system using \fIrestore\fP\|(8).
59: .IP 5)
60: Reboot the completed root file system.
61: .IP 6)
62: Label the disks with the \fIdisklabel\fP\|(8) program.
63: .IP 7)
64: Build and restore the /usr file system from tape
65: with \fItar\fP\|(1).
66: .IP 8)
67: Extract the system and utility files and contributed software
68: as desired.
69: .PP
70: The following sections describe the above steps in detail. In these
71: sections references to disk drives are of the form \fIxx\fP\|(\fId\fP,
72: \fIp\fP) and references to files on tape drives are of the form
73: \fIxx\fP\|(\fIc\fP,\fId\fP, \fIp\fP)
74: where \fIxx\fP are device types described in section 1.4,
75: \fIc\fP is the (optional) controller unit number,
76: \fId\fP is the drive unit number, and \fIp\fP is a disk partition
77: or tape file offset numbers as described in section 1.4.
78: For the sake of simplicity, all disk examples will use the disk type
79: ``dk'' and all tape examples will similarly use ``cy'';
80: the examples assume drive 0, partition 0.
81: Commands you
82: are expected to type are shown in italics, while that information
83: printed by the system is shown emboldened.
84: .PP
85: If you encounter problems while following the instructions in
86: this part of the document, refer to Appendix B for help in
87: troubleshooting.
88: .NH 3
89: Step 1: formatting the disk
90: .PP
91: All disks used with \*(4B should be formatted to insure
92: the proper handling of physically corrupted disk sectors.
93: The
94: .I vdformat
95: program included in the distribution, or a vendor supplied
96: formatting program, may be used to format disks if this has not
97: already been done. The \fIvdformat\fP program is capable of formatting
98: any of the disk drives listed in section 1.1, when booting from tape;
99: when booting from disk, it supports any drive listed in
100: \fI/etc/disktab\fP.
101: .PP
102: To load the \fIvdformat\fP program, perform the following steps.
103: .DS
104: .TS
105: lw(2i) l.
106: (machine powered up)
107: \fBMIB POC\fP
108: \fBType '#' to cancel boot\fP
109: \fI#\fP (cancel automatic reboot)
110: \fBCP [a10.h0]#>\fP\fI\|h\fP (halt the cpu)
111: \fB#>\|\fP\fIy.\fP (initialize the machine)
112: \fB#>\|\fP\fIfd cyp(0,0)\fP (make cypher default device)
113: \fB#>\|\fP\fIp23 3.\fP \fB00000000\fP (set boot flags)
114: \fB#>\|\fP\fIfb\fP (boot machine)
115: \fBcyp(0,0)/etc/fstab\fP
116: \fBCP cold boot\fP
117: \fB4 way interleave set\fP
118: \fBCPU memory test\fP
119: \fBECC CPU memory test\fP
120: \fBcyp(0,0)/.\fP
121: \fBCPU POC1\fP
122: \fBcyp(0,0)/poc1\fP
123: \fBCPU POC2\fP
124: \fBcyp(0,0)/poc2\fP
125: \fBFPP POC\fR (only if floating point processor present)
126: \fBcyp(0,0)/fppoc\fP
127: \fBFPP WCS\fR (only if floating point processor present)
128: \fBcyp(0,0)/fppwcs\fP
129: \fBBOOT SYSTEM cyp(0,0)/boot\fP
130:
131: \fBBoot\fP
132: \fB:\fIcy(0,0)stand/vdformat\fR (load and run from first tape file)
133: \fB52224+17408+1177716 start 0x1000\fP
134: \fBVDFORMAT Berkeley Version 1.6\fP
135: .TE
136:
137: \fBcontroller 0: smd\fP
138: \fBcontroller 1: smd-e\fP
139:
140: \fBType `Help' for help, `Start' to execute operations.\fP
141:
142: \fBvdformat>\fP
143: .DE
144: .PP
145: The \fIvdformat\fP program should now be running and awaiting your input.
146: If you made a mistake loading the program off the tape
147: you should get either the ``:'' prompt again (from the
148: boot program) or the ``#>'' prompt from the console
149: processor. In either case you can retype the appropriate
150: command to try again.
151: If something else happened, you may have a bad distribution
152: tape, or your hardware may be broken; refer to
153: Appendix B for help in troubleshooting.
154: .PP
155: \fIVdformat\fP will create sector headers and verify
156: the integrity of each sector formatted.
157: The program starts up by identifying the disk controllers
158: installed in the machine. Old VDDC controllers which
159: support only SMD drives are indicated
160: as ``smd'' while newer controllers capable of supporting both
161: SMD and extended-SMD drives are tagged as ``smd-e''.
162: \fIVdformat\fP
163: will prompt for the information required as shown below.
164: If you err in answering questions,
165: ``Delete'' or backspace erase the last character typed, and ``^U'' erases
166: the current input line. At any point you can ask for
167: assistance by typing ``help''; \fIvdformat\fP will list
168: the possible answers to the current question.
169: .DS
170: \fBvdformat>\fP\|\fIformat\fP
171: \fBFormat on which controllers?\fP\|\fI1\fP
172: \fBDrives on controller 1?\fP\|\fI0\fP
173: \fBNumber of patterns to use while verifying?\fP\|\fI1\fP
174: \fBDrive type for controller 1, drive 0?\fP\|\fIegl\fP
175: \fBModule serial number for controller 1, drive 0?\fP\|\fI1\fP
176: \fBvdformat>\fP\|\fIlist\fP
177: \fBThe following operations will occur when Start is issued:\fP
178: \fBFormat: Controller 1, drive 0, type EGL.\fP
179: \fBvdformat>\fP\|\fIstart\fP
180: \fBStarting format on controller 1, drive 0, type EGL.\fP
181: (\fIbad sectors will be indicated\fP)
182: \fBvdformat>\fP
183: .DE
184: Once the root device has been formatted, \fIvdformat\fP
185: will prompt for another command.
186: Return to the bootstrap by typing
187: .DS
188: \fBvdformat>\fP\|\fIexit\fP
189: .DE
190: or halt the machine by
191: typing ``~h''.
192: .DS
193: \fBvdformat>\fP \fI~h\fP
194: \fB#>\|\fP
195: .DE
196: .PP
197: It may be necessary to format other drives before constructing
198: file systems on them; this can be done at a later time with the
199: steps just performed, or \fIvdformat\fP may be brought in
200: off a disk drive as described in \(sc6.1.
201: .NH 3
202: Step 2: copying the mini-root file system
203: .PP
204: The second step is to run a simple program, \fIcopy\fP, to copy a
205: small root file system into the \fBsecond\fP partition of the disk. (Note
206: that the disk partitions used by \*(4B may not correspond to those
207: used by vendor supplied software.) This file system will serve as the
208: base for creating the actual root file system to be restored. The
209: generic version of the operating system maintained on the ``mini-root''
210: file system understands that it should not swap on top of itself, thereby
211: allowing double use of the disk partition. Disk 0 is normally used for
212: this operation; this is reflected in the example procedure. Another disk
213: may be substituted if necessary, although several modifications will
214: be necessary to create special files for the alternate disk. \fICopy\fP
215: is loaded just as the \fIvdformat\fP program was loaded; if you don't
216: have the bootstrap running, repeat the previous instructions until you
217: see the prompt from boot (a colon), and then:
218: .DS
219: .TS
220: lw(2i) l.
221: \fB:\|\fP\fIcy(0,0)copy\fP (load and run copy program)
222: \fBFrom:\fP \fIcy(0,1)\fP (tape drive unit 0, second tape file)
223: \fBTo:\fP \fIdk(0,1)\fP (disk drive unit 0, second disk partition)
224: \fBCopy completed: 205 records copied\fP
225: \fBBoot\fP
226: \fB:\fP
227: .TE
228: .DE
229: As before, `delete' or backspace erase characters and `^U' erases lines.
230: .NH 3
231: Step 3: booting from the mini-root file system
232: .PP
233: You now have the minimal set of tools necessary to create a
234: root file system and restore the file system contents from tape.
235: To access this file system load the bootstrap program
236: and boot the version of unix that has been placed in the
237: ``mini-root.''
238: As before, load the bootstrap if you do not already have
239: it running. At the colon prompt:
240: .DS
241: .TS
242: lw(2i) l.
243: \fB: \fP\fIdk(0,1)vmunix\fP (get \fIvmunix\fP from disk drive 0, second partition)
244: .TE
245: .DE
246: The standalone boot program should then read the system from
247: the mini root file system you just created, and the system should boot:
248: .DS
249: .B
250: 271944+78848+92812 start 0x12e8
251: 4.3 BSD #1: Sat Jun 4 17:11:42 PDT 1988
252: ([email protected]:/usr/src/sys/GENERIC)
253: real mem = xxx
254: avail mem = ###
255: using ### buffers containing ### bytes of memory
256: (... information about available devices ...)
257: root device?
258: .R
259: .DE
260: .PP
261: The first three numbers are printed out by the bootstrap programs and
262: are the sizes of different parts of the system (text, initialized and
263: uninitialized data). The system also allocates several system data
264: structures after it starts running. The sizes of these structures are
265: based on the amount of available memory and the maximum count of active
266: users expected, as declared in a system configuration description. This
267: will be discussed later.
268: .PP
269: UNIX itself then runs for the first time and begins by printing out a banner
270: identifying the release and
271: version of the system that is in use and the date that it was compiled.
272: .PP
273: Next the
274: .I mem
275: messages give the
276: amount of real (physical) memory and the
277: memory available to user programs
278: in bytes.
279: For example, if your machine has 16Mb bytes of memory, then
280: \fBxxx\fP will be 16777216.
281: .PP
282: The messages that come out next show what devices were found on
283: the current processor. These messages are described in
284: \fIautoconf\fP\|(4).
285: The distributed system may not have
286: found all the communications devices you have (VIOC's or MPCC's),
287: or all the mass storage peripherals you have, especially
288: if you have more than
289: two of anything. You will correct this when you create
290: a description of your machine from which to configure a site-dependent
291: version of UNIX.
292: The messages printed at boot here contain much of the information
293: that will be used in creating the configuration.
294: In a correctly configured system most of the information
295: present in the configuration description
296: is printed out at boot time as the system verifies that each device
297: is present.
298: .PP
299: The \*(lqroot device?\*(rq prompt was printed by the system
300: to ask you for the name of the root file system to use.
301: This happens because the distribution system is a \fIgeneric\fP
302: system, i.e. it can be bootstrapped on a Tahoe cpu with its root device
303: and paging area on any available disk drive. You should respond to the
304: root device question with ``dk0*''. This response supplies two pieces
305: of information: first, ``dk0'' shows that the disk it is running on is
306: drive 0 of type ``dk'', and, secondly, the \*(lq*\*(rq shows that the
307: system is running \*(lqatop\*(rq the paging area. The latter is
308: extremely important, otherwise the system will attempt to page on top
309: of itself and chaos will ensue. You will later build a system tailored
310: to your configuration that will not ask this question when it is
311: bootstrapped.
312: .DS
313: \fBroot device?\fP \fIdk0*\fP
314: WARNING: preposterous time in file system \-\- CHECK AND RESET THE DATE!
315: \fBerase ^?, kill ^U, intr ^C\fP
316: \fB#\fP
317: .DE
318: .PP
319: The \*(lqerase ...\*(rq message is part of the /.profile
320: that was executed by the root shell when it started. This message
321: is present to inform you as to what values the character erase,
322: line erase, and interrupt characters have been set.
323: .NH 3
324: Step 4: restoring the root file system
325: .PP
326: UNIX is now running,
327: and the \fIUNIX Programmer's manual\fP applies. The ``#'' is the prompt
328: from the Bourne shell, and lets you know that you are the super-user,
329: whose login name is \*(lqroot\*(rq.
330: .PP
331: To complete installation of the bootstrap system one step remains: the
332: root file system must be created. If the root file system is to reside
333: on a disk other than unit 0, you will have to create the necessary special
334: files in /dev and use the appropriate value in the following example
335: procedures.
336: .PP
337: For example, if the root must be placed on dk1, you should
338: create /dev/rdk1a and /dev/dk1a using the MAKEDEV script in /dev
339: as follows:
340: .DS
341: \fB#\fP\|\fIcd /dev; MAKEDEV dk1\fP
342: .DE
343: .PP
344: To actually create the root file system the shell script \*(lqxtr\*(rq
345: should be run:
346: .DS
347: \fB#\fP\|\fIdisk=dk0 tape=cy xtr\fP
348: (Note, ``dk0'' specifies both the disk type and the unit number. Modify
349: as necessary.)
350: .DE
351: .PP
352: This will generate many messages regarding the construction
353: of the file system and the restoration of the tape contents,
354: but should eventually stop with the message:
355: .DS
356: ...
357: \fBRoot filesystem extracted\fP
358: \fB#\fP
359: .DE
360: .NH 3
361: Step 5: rebooting the completed root file system
362: .PP
363: With the above work completed, all that is left is to reboot:
364: .DS
365: .ta 3.5i
366: \fB#\|\fP\fIsync\fP (synchronize file system state)
367: \fB#\|\fP\fI~h\fP (halt cpu)
368: \fB#>\|\fP\fIy.\fP (initialize machine)
369: \fB#>\|\fP\fIp23 2.\fP (set boot flags)
370: \fB#>\|\fP\fIfr boot\fP
371: \fB\&...(boot program is eventually loaded)...\fP
372: \fBBoot\fP
373: \fB:\fP \fIdk(0,0)vmunix\fP (\fIvmunix\fP from disk drive 0, partition 0)
374: (Modify unit number as necessary.)
375: .B
376: .nf
377: 271944+78848+92812 start 0x12e8
378: 4.3 BSD #1: Sat Jun 4 17:11:42 PDT 1988
379: ([email protected]:/usr/src/sys/GENERIC)
380: real mem = ###
381: avail mem = ###
382: using ### buffers containing ### bytes of memory
383: (... information about available devices ...)
384: root on dk0
385: WARNING: preposterous time in file system -- CHECK AND RESET THE DATE!
386: erase ^?, kill ^U, intr ^C
387: #
388: .fi
389: .DE
390: .R
391: .PP
392: If the root device selected by the kernel is not correct, it is necessary
393: to reboot again using the option to ask for the root device. On the Tahoe
394: use ``\fIp23 3.\fP''. At the prompt from the bootstrap, use the same
395: disk driver unit specification as used above: ``\fIdk(0,0)vmunix\fP''.
396: Then, to the question ``root device?,'' respond with ``\fIdk0\fP''.
397: See section 6.1 and appendix C if the system does not reboot properly.
398: .PP
399: The system is now running single user on the installed root file system.
400: The next section tells how to complete the installation of distributed
401: software on the /usr file system.
402: .NH 3
403: Step 6: placing labels on the disks
404: .PP
405: \*(4B uses disk labels in the first sector of each disk to contain
406: information about the geometry of the drive and the partition layout.
407: This information is written with \fIdisklabel\fP\|(8).
408: Note that recent CCI releases, and apparently Harris releases,
409: may use a different form of disk label, also in the first sector.
410: As the formats of these labels are incompatible,
411: skip this step if your machine is using disk labels already.
412: Recent firmware for the console processor (CP) may use these labels,
413: and thus the labels must be retained.
414: Eventually, it will be possible to use both formats simultaneously.
415: You may wish to experiment on a spare disk once the system is running.
416: .PP
417: For each disk that you wish to label, run the following command:
418: .DS
419: \fB#\|\fP\fIdisklabel -rw dk\fP\fB#\fP \fBtype\fP \fI"optional_pack_name"\fP
420: .DE
421: The \fB#\fP is the unit number; the \fBtype\fP is the CCI disk device
422: name as listed in section 1.4 or any other name listed in /etc/disktab.
423: The optional information may contain any descriptive name for the
424: contents of a disk, and may be up to 16 characters long. This procedure
425: will place the label on the disk using the information found in /etc/disktab
426: for the disk type named. The default disk partitions in \*(4B are the mostly
427: the same as those in the CCI 1.21 release, except for CDC 340Mb xfd drives;
428: see section 4.2 for details. If you have changed the disk partition sizes,
429: you may wish to add entries for the modified configuration in /etc/disktab
430: before labeling the affected disks.
431: .PP
432: Note that the partition sizes and sectors per track in /etc/disktab
433: are now specified in sectors, not units of kilobytes as in the vendors'
434: 4.2BSD and System V systems.
435: For SMD disks, the sector size is 512 bytes, and is listed explicitly.
436: .NH 3
437: Step 7: setting up the /usr file system
438: .PP
439: The next thing to do is to extract the rest of the data from
440: the tape.
441: You might wish to review the disk configuration information in section
442: 4.2 before continuing; the partitions used below are those most appropriate
443: in size.
444: .PP
445: For the Cypher tape drive, execute the following commands:
446: .DS
447: \fB#\fP \fIcd /dev; MAKEDEV cy0\fP
448: .DE
449: Then perform the following:
450: .br
451: .ne 5
452: .sp
453: .DS
454: .TS
455: lw(2i) l.
456: \fB#\fP \fIdate yymmddhhmm\fP (set date, see \fIdate\fP\|(1))
457: \&....
458: \fB#\fP \fIpasswd root\fP (set password for super-user)
459: \fBNew password:\fP (password will not echo)
460: \fBRetype new password:\fP
461: \fB#\fP \fIhostname mysitename\fP (set your hostname)
462: \fB#\fP \fInewfs dk#c\fP (create empty user file system)
463: (\fIdk\fP is the disk type, \fI#\fP is the unit number, \fIc\fP
464: is the partition; this takes a few minutes)
465: \fB#\fP \fImount /dev/dk#c /usr\fP (mount the usr file system)
466: \fB#\fP \fIcd /usr\fP (make /usr the current directory)
467: \fB#\fP \fImt -t /dev/rmt12 fsf\fP (space to end of previous tape file)
468: \fB#\fP \fItar xbpf 40 /dev/rmt12\fP (extract all of usr except usr/src)
469: (this takes about 15-20 minutes)
470: .TE
471: .DE
472: If no disk label has been installed on the disk, the \fInewfs\fP
473: command will require a third argument to specify the disk type,
474: using one of the names in /etc/disktab.
475: If the tape had been rewound or positioned incorrectly before the \fItar\fP,
476: it may be repositioned by the following commands.
477: .DS
478: \fB#\fP \fImt -t /dev/rmt12 rew\fP
479: \fB#\fP \fImt -t /dev/rmt12 fsf 3\fP
480: .DE
481: The data on the fourth tape file has now been extracted.
482: If you are using 1600bpi tapes, the first reel of the
483: distribution is no longer needed; you should now mount the second
484: reel instead. The installation procedure continues from this
485: point on the 6250bpi tape.
486: .DS
487: .TS
488: lw(2i) l.
489: \fB#\fP \fImkdir src\fP (make directory for source)
490: \fB#\fP \fIcd src\fP (make source directory the current directory)
491: \fB#\fP \fImt -t /dev/rmt12 fsf\fP (space to end of previous tape file)
492: \fB#\fP \fItar xpbf 40 /dev/rmt12\fP (extract the system source)
493: (this takes about 5-10 minutes)
494: \fB#\fP \fIcd /\fP (change directory, back to the root)
495: \fB#\fP \fIchmod 755 /usr/src\fP
496: \fB#\fP \fIumount /dev/dk#c\fP (unmount /usr)
497: .TE
498: .DE
499: .PP
500: You can check the consistency of the /usr file system by doing
501: .DS
502: \fB#\fP \fIfsck /dev/rdk#c\fP
503: .DE
504: The output from
505: .I fsck
506: should look something like:
507: .DS
508: .B
509: ** /dev/rdk#c
510: ** Last Mounted on /usr
511: ** Phase 1 - Check Blocks and Sizes
512: ** Phase 2 - Check Pathnames
513: ** Phase 3 - Check Connectivity
514: ** Phase 4 - Check Reference Counts
515: ** Phase 5 - Check Cyl groups
516: 671 files, 3497 used, 137067 free (75 frags, 34248 blocks)
517: .R
518: .DE
519: .PP
520: If there are inconsistencies in the file system, you may be prompted
521: to apply corrective action; see the \fIfsck\fP(8) or \fIFsck -- The UNIX
522: File System Check Program\fP for more details.
523: .PP
524: To use the /usr file system, you should now remount it with:
525: .DS
526: \fB#\fP \fI/etc/mount /dev/dk#c /usr\fP
527: .DE
528: .PP
529: If you are using 1600bpi tapes, the second reel of the
530: distribution is no longer needed; you should now mount the third
531: reel instead. The installation procedure continues from this
532: point on the 6250bpi tape.
533: .DS
534: \fB#\fP \fImkdir /usr/src/sys\fP
535: \fB#\fP \fIchmod 755 /usr/src/sys\fP
536: \fB#\fP \fIcd /usr/src/sys\fP
537: \fB#\fP \fImt -t /dev/rmt12 fsf\fP
538: \fB#\fP \fItar xpbf 40 /dev/rmt12\fP
539: .DE
540: .PP
541: There is one additional tape file on the distribution tape(s)
542: which has not been installed to this point; it contains user
543: contributed software in \fItar\fP\|(1) format. As distributed,
544: the user contributed software should be placed in /usr/src/new.
545: .DS
546: \fB#\fP \fImkdir /usr/src/new\fP
547: \fB#\fP \fIchmod 755 /usr/src/new\fP
548: \fB#\fP \fIcd /usr/src/new\fP
549: \fB#\fP \fImt -t /dev/rmt12 fsf\fP
550: \fB#\fP \fItar xpbf 40 /dev/rmt12\fP
551: .DE
552: Several of the directories for large contributed software subsystems
553: have been placed in a single archive file and compressed due to space
554: constraints within the distribution.
555: .NH 2
556: Additional conversion information
557: .PP
558: After setting up the new \*(4B filesystems, you may restore the user
559: files that were saved on tape before beginning the conversion.
560: Note that the \*(4B \fIrestore\fP program does its work on a mounted
561: file system using normal system operations. This means that file
562: system dumps may be restored even if the characteristics of the file
563: system changed. To restore a dump tape for, say, the /a file system
564: something like the following would be used:
565: .DS
566: \fB#\fP \fImkdir /a\fP
567: \fB#\fP \fInewfs dk#c\fI
568: \fB#\fP \fImount /dev/dk#c /a\fP
569: \fB#\fP \fIcd /a\fP
570: \fB#\fP \fIrestore r\fP
571: .DE
572: .PP
573: If \fItar\fP images were written instead of doing a dump, you should
574: be sure to use its `-p' option when reading the files back. No matter
575: how you restore a file system, be sure to unmount it and and check its
576: integrity with \fIfsck\fP(8) when the job is complete.
577:
578:
579:
580:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.