diff --git a/Linux-0.10/binaries/compilers/gccbin.tar.Z b/Linux-0.10/binaries/compilers/gccbin.tar.Z new file mode 100644 index 00000000..078fa263 Binary files /dev/null and b/Linux-0.10/binaries/compilers/gccbin.tar.Z differ diff --git a/Linux-0.10/binaries/sbin/update.Z b/Linux-0.10/binaries/sbin/update.Z new file mode 100644 index 00000000..e18ec7af Binary files /dev/null and b/Linux-0.10/binaries/sbin/update.Z differ diff --git a/Linux-0.10/binaries/usr.bin/diffbin.tar.Z b/Linux-0.10/binaries/usr.bin/diffbin.tar.Z new file mode 100644 index 00000000..803976fa Binary files /dev/null and b/Linux-0.10/binaries/usr.bin/diffbin.tar.Z differ diff --git a/Linux-0.10/binaries/usr.bin/grep-1.5.bin.tar.Z b/Linux-0.10/binaries/usr.bin/grep-1.5.bin.tar.Z new file mode 100644 index 00000000..a4bbf731 Binary files /dev/null and b/Linux-0.10/binaries/usr.bin/grep-1.5.bin.tar.Z differ diff --git a/Linux-0.10/binaries/usr.bin/patch.Z b/Linux-0.10/binaries/usr.bin/patch.Z new file mode 100644 index 00000000..d6f34330 Binary files /dev/null and b/Linux-0.10/binaries/usr.bin/patch.Z differ diff --git a/Linux-0.10/binaries/usr.bin/pmake/pm_supp.tar.Z b/Linux-0.10/binaries/usr.bin/pmake/pm_supp.tar.Z new file mode 100644 index 00000000..8d3d455c Binary files /dev/null and b/Linux-0.10/binaries/usr.bin/pmake/pm_supp.tar.Z differ diff --git a/Linux-0.10/binaries/usr.bin/pmake/pmake.README b/Linux-0.10/binaries/usr.bin/pmake/pmake.README new file mode 100644 index 00000000..5eef34e5 --- /dev/null +++ b/Linux-0.10/binaries/usr.bin/pmake/pmake.README @@ -0,0 +1,11 @@ +pmake.Z is the make from the bsd net release #2. +pm_supp.tar.Z is a tar file of some support "include" files used +by that version of make. + +It may not completely correctly handle error conditions from children, +since I had to guess a bit on how to recode its abuse of the old +union wait. + +John Kohl +jtkohl@cs.berkeley.edu +[sources on request; that's another kermit, though.] diff --git a/Linux-0.10/binaries/usr.bin/pmake/pmake.Z b/Linux-0.10/binaries/usr.bin/pmake/pmake.Z new file mode 100644 index 00000000..26d480f3 Binary files /dev/null and b/Linux-0.10/binaries/usr.bin/pmake/pmake.Z differ diff --git a/Linux-0.10/binaries/usr.bin/sed.Z b/Linux-0.10/binaries/usr.bin/sed.Z new file mode 100644 index 00000000..d7e7c43d Binary files /dev/null and b/Linux-0.10/binaries/usr.bin/sed.Z differ diff --git a/Linux-0.10/docs/FAQ b/Linux-0.10/docs/FAQ new file mode 100644 index 00000000..422c41e9 --- /dev/null +++ b/Linux-0.10/docs/FAQ @@ -0,0 +1,256 @@ + +daemon@ATHENA.MIT.EDU (Robert Blum) Linux_Activists 12/19/91 01:39 (253 lines) +Subject: A FAQ is coming... +Date: Thu, 19 Dec 91 07:29:21 +0100 +From: blum@cip-s01.informatik.rwth-aachen.de (Robert Blum) +To: linux-activists@joker.cs.hut.fi + +Hi Linuxers! + +Following is a FAQ-compilation (most credits to Linus) for Linux. +Mail me, if you like it, and mail me, if you dislike it or have +any ideas on changing this. + +Thanks in advance, + Robert Blum + + +QUESTION: What is linux? + +ANSWER: Linux is a small unix for 386-AT computers, that has the added +advantage of being free. It is still in beta-testing, but is slowly +getting useful even for somewhat real developement. + + +QUESTION: Does it run on my computer? + +ANSWER: Linux has been written on a clone-386, with IDE drives and a VGA +screen. It should work on most similar setups. The harddisk should be +AT-standard (ie not SCSI, ESDI), and the system must be ISA. Otherwise +the requirements seem relatively small: a 386 (SX, DX or any 486). The +current version (0.10) needs a colour screen adapter, but this is not +the case with the next version. + +It needs at least 2M to run, and 4M is definitely a plus. It can happily +use up to 16M (and more if you change some things). + + +QUESTION: Will linux run on a PC or 286-AT? If not, why? + +ANSWER: Linux uses the 386 chip protected mode functions extensively, +and is a true 32-bit operating system. Thus x86 chips, x<3, will simply +not run it. + + +QUESTION: Does linux do paging? Can I have virtual memory on my small +machine? + +ANSWER: Linux does use the 386 paging unit, but currently only for +memory management. No use of disks as expansion RAM. This is one of the +things that will be implemented sometime in the (far?) future. Linux +also uses the paging unit to share pages between several processes after +a fork: thus it needs less memory. However, almost all the user programs +available for linux are GNU software, which want gobs and gobs of +memory. This is the reason at least 4M is recommended: GNU cc (gcc) +simply won't run in less. + + +QUESTION: Can I have tasks spanning the full 4GB of addressable 386 +memory? No more 64kB limits like in coherent or standard minix? + +ANSWER: Linux does limit the task-size, but at a much more reasonable +64MB (MEGA-byte, not kilos), so bigger programs are no problem. + + +QUESTION: Does the bigger program sizes mean I can run X? + +ANSWER: X is not ported to linux, and though I hope it will be some day, +I cannot guarantee it. It's big, and wants a lot from the system. + + +QUESTION: Where can I get linux? Is there a mailserver? + +ANSWER: Linux can be gotten by anonymous ftp from + nic.funet.fi (128.214.6.100): + directory /pub/OS/Linux + Tupac-Amaru.Informatik.RWTH-Aachen.DE (137.226.112.31): + directory /pub/msdos/replace + tsx-11.mit.edu (18.172.1.2): + directory /pub/linux + ftp.eecs.umich.edu (141.212.99.7): + directory linux +You might want to check out which of these is the most up-to-date. + +If you don't have ftp-capability, you are in trouble. You might try +mailing "mailserver@nic.funet.fi" with "help" in the body of the mail. + + +QUESTION: Is there a newsgroup or mailing-list about linux? Where can I +get my questions answered? How about bug-reports? + +ANSWER: There is a mailing list set up at the address +'Linux-activists@niksula.hut.fi'. To join, mail a request to +'Linux-activists-request@niksula.hut.fi'. DO NOT mail "I want to +[un]subscribe" to the mailing-list, use the request-address. + +Questions and bug-reports can be sent either to the mailing-list or to +"torvalds@kruuna.helsinki.fi", depending on which you find more +appropriate. + + +QUESTION: I got the minix-demo, but it won't boot. Linux boots from +floppy. What's wrong? + +ANSWER: You probably wrote the minix demo to a 1.44M disk, which (for +some unfathomable reason) doesn't work. The minix demo wants a 720kB or +1.2M disk. + + +QUESTION: The minix-demo boots all right, but doesn't seem to recognize +my second harddisk. What's up? + +ANSWER: The minix-demo does support a second harddisk, but there are no +special files made for it, and the minix demo doesn't include the +"mknod" command. Mount the linux root-floppy, and use the devices on +that. + + +QUESTION: How can I be sure I won't be writing over anything important? +I have to use DOS in on my machine, and I don't want to lose any files. + +ANSWER: Back up everything. Just in case. Then, write some easily +recognizable pattern to the partition you have reserved for linux, using +some DOS tool. You can then use "cat /dev/hdX" under minix to examine +which of the partitions you used. + + +QUESTION: Minix mkfs doesn't accept the size I give the device, although +I double-checked with fdisk, and it's correct. + +ANSWER: Be sure you give the size in BLOCKS, ie 1024 bytes, not sectors. +Also, make doubly certain that you have the correct partition. + + +QUESTION: I used the minix mkfs to make a filesystem on /dev/hd3 after +having checked that this was indeed the partition I had reserved. Minix +mounts the new partition ok, but linux doesn't. What gives? + +ANSWER: In some cases partitions are numbered differently under minix +and linux. This seems to correlate to the FDISK version you have used. +/dev/hd3 under minix may be /dev/hd2 under linux etc. + +There are a few rules about this: /dev/hd0 and /dev/hd5 are always the +same under linux and minix. DO NOT USE THEM, they are the whole raw +disk, not partitions. Also if a partition is on drive 1 under minix (ie +/dev/hd1-4), it is drive 1 under linux as well. + + +QUESTION: I mounted the linux filesystem, and copied the files from the +root-disk to the harddisk. Now I cannot find them any more, and +somethimes linux dies with a "panic: trying to free unused inode". + +ANSWER: You have probably forgot to sync before rebooting. Linux, like +all unices, use a "buffer cache" to speed up reads and writes to disk. +On a machine that has enough memory, this buffer-cache is 1.5MB, and if +you forget to sync before exiting, it may not be fully written out to +disk. Re-mkfs and re-install (or try to use the preliminary fsck, but +remeber that although fsck tries to correct the faults it finds, it may +fail.) + + +QUESTION: the mtools package on the root-disk won't work. I get an +ENOENT error message for all devices. + +ANSWER: mtools needs to be told which device to look for. Use 'ln' or +'mknod' to create a sepcial file called "/dev/dosX", where X is A, B or +C. This file should point to the device you want to read. + + +QUESTION: Turbo (Microsoft) Assembler won't compile the Linux boot code. +In fact, some of the opcodes in these files look completely unfamiliar. Why? + +ANSWER: The Linux boot codes are written in Bruce Evans' minix assembler, +which has the same opcodes as the original minix assembler. There are a few +differences between these and normal DOS assemblers: + + - No segments - everything is in the same segment (at least in the + bootsectors and setup, as they don't use the .data segments) + + - mov[b|w|l] are shorter versions of mov ax,[byte|word|long] ptr [XXX]. + This is how unix assemblers normally give the size (byte, word or long). + Gas has similar constructs. + + - There is no "jmp short", the opcodes are "j" for a short jump and + "jmp" for a long one. + + - "jmpi" is a jump with a segment:offset pair. I don't know how this is + written in DOS assembly. + + +QUESTION: While running du I get "Kernel panic: free_inode: bit already +cleared". Also, du produces a ENOENT error for all the files in certain +of my directories. What's going on? + +ANSWER: These are both consistent with a bad file-system. That's relatively +easy to produce by not syncing before rebooting, as linux usually has 1.5MB +of buffer space held in memory (unless you have <=4M RAM, in which case +the buffers are only about 0.5MB). Also linux doesn't do anything +special about the bit-map blocks, and as they are used often, those are +the thing most likely to be in memory. If you reboot, and they haven't +been written to disk ... + +I'm afraid that as long as there is no fsck for linux there is no way to +correct the matter (unless you have minix and can run minix fsck), and +the only thing to do is to reinstall the filesystem from scratch (ie do +a mkfs from the minix demodisk and reboot from the original +linux-floppy). + +A sync is done only every 30 seconds normally (standard unix practice), +so do one by hand (some people think you should do 3 syncs after each +other, but that's superstition), or by logging out from the +startup-shell, which automatically syncs the system. Unmounting a +filesystem also syncs it (but of course you can never unmount root). + +Another (sad) possibility is that you have bad blocks on your disk. Not +very probable, as they would have to be in the inode-tables, just a +couple of blocks in size. Again there aren't programs available to read +a disk for bad sectors and put them in some kind of "bad-sector-file". +On IDE drives this is no problem (bad sectors are automatically mapped +away). + + +QUESTION: What is the "em" binary? + +ANSWER: Em is micro-EMacs (probably version 3.10). + +QUESTION: I seem to be unable to compile anythong with gcc. Why? + +ANSWER: If you have only 2 MB RAM, gcc will die silently without compiling + anything. You must have at least 4 MB to do compilations + + +QUESTION: I'm using a program that uses signal handlers which are installed +using sigaction() with the SA_NOMASK, and they get a general protection +error right after the signal handler tries to return. What's going +wrong? + +ANSWER: You are using a libc.a that has an out-of-date signal.o and +sig_restore.o file, and they don't know how to deal with SA_NOMASK. +(The one in gccbin.tar.Z is out-of-date.) You can obtain the newer +signal.c from the unistd.tar.Z file, but don't use the associated +sig_restore.c from there; the FTP sites should have a separate +sig_restore.c which is up to date. While you're at it, you should also +get an updated crt0.c file as well, and install your new crt0.o and +libc.a in /usr/lib. + +(This answer will likely change in the near future, since there are +plans to change the format of the signal trampoline code yet again.... +but for now, this should be an accurate description of how things stand +now.) + + +QUESTION: gcc complains about not finding crt0.o and the system include files +What am i doing wrong ? + +ANSWER: The include files normal place is in /usr/include. libc.a and *.a +should be in /usr/lib diff --git a/Linux-0.10/docs/FAQv.txt b/Linux-0.10/docs/FAQv.txt new file mode 100644 index 00000000..c6b742f3 --- /dev/null +++ b/Linux-0.10/docs/FAQv.txt @@ -0,0 +1,265 @@ +head 1.1; +branch ; +access ; +symbols ; +locks tytso:1.1; strict; +comment @# @; + + +1.1 +date 91.12.19.11.59.54; author tytso; state Exp; +branches ; +next ; + + +desc +@@ + + + +1.1 +log +@Initial revision +@ +text +@ +QUESTION: What is linux? + +ANSWER: Linux is a small unix for 386-AT computers, that has the added +advantage of being free. It is still in beta-testing, but is slowly +getting useful even for somewhat real developement. + + +QUESTION: Does it run on my computer? + +ANSWER: Linux has been written on a clone-386, with IDE drives and a VGA +screen. It should work on most similar setups. The harddisk should be +AT-standard (ie not SCSI, ESDI), and the system must be ISA. Otherwise +the requirements seem relatively small: a 386 (SX, DX or any 486). The +current version (0.10) needs a colour screen adapter, but this is not +the case with the next version. + +It needs at least 2M to run, and 4M is definitely a plus. It can happily +use up to 16M (and more if you change some things). + + +QUESTION: Will linux run on a PC or 286-AT? If not, why? + +ANSWER: Linux uses the 386 chip protected mode functions extensively, +and is a true 32-bit operating system. Thus x86 chips, x<3, will simply +not run it. + + +QUESTION: Does linux do paging? Can I have virtual memory on my small +machine? + +ANSWER: Linux does use the 386 paging unit, but currently only for +memory management. No use of disks as expansion RAM. This is one of the +things that will be implemented sometime in the (far?) future. Linux +also uses the paging unit to share pages between several processes after +a fork: thus it needs less memory. However, almost all the user programs +available for linux are GNU software, which want gobs and gobs of +memory. This is the reason at least 4M is recommended: GNU cc (gcc) +simply won't run in less. + + +QUESTION: Can I have tasks spanning the full 4GB of addressable 386 +memory? No more 64kB limits like in coherent or standard minix? + +ANSWER: Linux does limit the task-size, but at a much more reasonable +64MB (MEGA-byte, not kilos), so bigger programs are no problem. + + +QUESTION: Does the bigger program sizes mean I can run X? + +ANSWER: X is not ported to linux, and though I hope it will be some day, +I cannot guarantee it. It's big, and wants a lot from the system. + + +QUESTION: Where can I get linux? Is there a mailserver? + +ANSWER: Linux can be gotten by anonymous ftp from + nic.funet.fi (128.214.6.100): + directory /pub/OS/Linux + Tupac-Amaru.Informatik.RWTH-Aachen.DE (137.226.112.31): + directory /pub/msdos/replace + tsx-11.mit.edu (18.172.1.2): + directory /pub/linux + ftp.eecs.umich.edu (141.212.99.7): + directory linux +You might want to check out which of these is the most up-to-date. + +If you don't have ftp-capability, you are in trouble. You might try +mailing "mailserver@@nic.funet.fi" with "help" in the body of the mail. + + +QUESTION: Is there a newsgroup or mailing-list about linux? Where can I +get my questions answered? How about bug-reports? + +ANSWER: There is a mailing list set up at the address +'Linux-activists@@niksula.hut.fi'. To join, mail a request to +'Linux-activists-request@@niksula.hut.fi'. DO NOT mail "I want to +[un]subscribe" to the mailing-list, use the request-address. + +Questions and bug-reports can be sent either to the mailing-list or to +"torvalds@@kruuna.helsinki.fi", depending on which you find more +appropriate. + + +QUESTION: I got the minix-demo, but it won't boot. Linux boots from +floppy. What's wrong? + +ANSWER: You probably wrote the minix demo to a 1.44M disk, which (for +some unfathomable reason) doesn't work. The minix demo wants a 720kB or +1.2M disk. + + +QUESTION: The minix-demo boots all right, but doesn't seem to recognize +my second harddisk. What's up? + +ANSWER: The minix-demo does support a second harddisk, but there are no +special files made for it, and the minix demo doesn't include the +"mknod" command. Mount the linux root-floppy, and use the devices on +that. + + +QUESTION: How can I be sure I won't be writing over anything important? +I have to use DOS in on my machine, and I don't want to lose any files. + +ANSWER: Back up everything. Just in case. Then, write some easily +recognizable pattern to the partition you have reserved for linux, using +some DOS tool. You can then use "cat /dev/hdX" under minix to examine +which of the partitions you used. + + +QUESTION: Minix mkfs doesn't accept the size I give the device, although +I double-checked with fdisk, and it's correct. + +ANSWER: Be sure you give the size in BLOCKS, ie 1024 bytes, not sectors. +Also, make doubly certain that you have the correct partition. + + +QUESTION: I used the minix mkfs to make a filesystem on /dev/hd3 after +having checked that this was indeed the partition I had reserved. Minix +mounts the new partition ok, but linux doesn't. What gives? + +ANSWER: In some cases partitions are numbered differently under minix +and linux. This seems to correlate to the FDISK version you have used. +/dev/hd3 under minix may be /dev/hd2 under linux etc. + +There are a few rules about this: /dev/hd0 and /dev/hd5 are always the +same under linux and minix. DO NOT USE THEM, they are the whole raw +disk, not partitions. Also if a partition is on drive 1 under minix (ie +/dev/hd1-4), it is drive 1 under linux as well. + + +QUESTION: I mounted the linux filesystem, and copied the files from the +root-disk to the harddisk. Now I cannot find them any more, and +somethimes linux dies with a "panic: trying to free unused inode". + +ANSWER: You have probably forgot to sync before rebooting. Linux, like +all unices, use a "buffer cache" to speed up reads and writes to disk. +On a machine that has enough memory, this buffer-cache is 1.5MB, and if +you forget to sync before exiting, it may not be fully written out to +disk. Re-mkfs and re-install (or try to use the preliminary fsck, but +remeber that although fsck tries to correct the faults it finds, it may +fail.) + + +QUESTION: the mtools package on the root-disk won't work. I get an +ENOENT error message for all devices. + +ANSWER: mtools needs to be told which device to look for. Use 'ln' or +'mknod' to create a sepcial file called "/dev/dosX", where X is A, B or +C. This file should point to the device you want to read. + + +QUESTION: Turbo (Microsoft) Assembler won't compile the Linux boot code. +In fact, some of the opcodes in these files look completely unfamiliar. Why? + +ANSWER: The Linux boot codes are written in Bruce Evans' minix assembler, +which has the same opcodes as the original minix assembler. There are a few +differences between these and normal DOS assemblers: + + - No segments - everything is in the same segment (at least in the + bootsectors and setup, as they don't use the .data segments) + + - mov[b|w|l] are shorter versions of mov ax,[byte|word|long] ptr [XXX]. + This is how unix assemblers normally give the size (byte, word or long). + Gas has similar constructs. + + - There is no "jmp short", the opcodes are "j" for a short jump and + "jmp" for a long one. + + - "jmpi" is a jump with a segment:offset pair. I don't know how this is + written in DOS assembly. + + +QUESTION: While running du I get "Kernel panic: free_inode: bit already +cleared". Also, du produces a ENOENT error for all the files in certain +of my directories. What's going on? + +ANSWER: These are both consistent with a bad file-system. That's relatively +easy to produce by not syncing before rebooting, as linux usually has 1.5MB +of buffer space held in memory (unless you have <=4M RAM, in which case +the buffers are only about 0.5MB). Also linux doesn't do anything +special about the bit-map blocks, and as they are used often, those are +the thing most likely to be in memory. If you reboot, and they haven't +been written to disk ... + +I'm afraid that as long as there is no fsck for linux there is no way to +correct the matter (unless you have minix and can run minix fsck), and +the only thing to do is to reinstall the filesystem from scratch (ie do +a mkfs from the minix demodisk and reboot from the original +linux-floppy). + +A sync is done only every 30 seconds normally (standard unix practice), +so do one by hand (some people think you should do 3 syncs after each +other, but that's superstition), or by logging out from the +startup-shell, which automatically syncs the system. Unmounting a +filesystem also syncs it (but of course you can never unmount root). + +Another (sad) possibility is that you have bad blocks on your disk. Not +very probable, as they would have to be in the inode-tables, just a +couple of blocks in size. Again there aren't programs available to read +a disk for bad sectors and put them in some kind of "bad-sector-file". +On IDE drives this is no problem (bad sectors are automatically mapped +away). + + +QUESTION: What is the "em" binary? + +ANSWER: Em is micro-EMacs (probably version 3.10). + +QUESTION: I seem to be unable to compile anythong with gcc. Why? + +ANSWER: If you have only 2 MB RAM, gcc will die silently without compiling + anything. You must have at least 4 MB to do compilations + + +QUESTION: I'm using a program that uses signal handlers which are installed +using sigaction() with the SA_NOMASK, and they get a general protection +error right after the signal handler tries to return. What's going +wrong? + +ANSWER: You are using a libc.a that has an out-of-date signal.o and +sig_restore.o file, and they don't know how to deal with SA_NOMASK. +(The one in gccbin.tar.Z is out-of-date.) You can obtain the newer +signal.c from the unistd.tar.Z file, but don't use the associated +sig_restore.c from there; the FTP sites should have a separate +sig_restore.c which is up to date. While you're at it, you should also +get an updated crt0.c file as well, and install your new crt0.o and +libc.a in /usr/lib. + +(This answer will likely change in the near future, since there are +plans to change the format of the signal trampoline code yet again.... +but for now, this should be an accurate description of how things stand +now.) + + +QUESTION: gcc complains about not finding crt0.o and the system include files +What am i doing wrong ? + +ANSWER: The include files normal place is in /usr/include. libc.a and *.a +should be in /usr/lib +@ diff --git a/Linux-0.10/docs/INSTALL-0.10 b/Linux-0.10/docs/INSTALL-0.10 new file mode 100644 index 00000000..1a0f16a3 --- /dev/null +++ b/Linux-0.10/docs/INSTALL-0.10 @@ -0,0 +1,145 @@ +Warning: I have personally not done this the hard way, so I don't know +what problems could surface. In general, this version is still meant +for people with minix: they are more used to the system, and can do some +things that DOS-based persons cannot. If you have only DOS, expect some +troubles. As the version number suggests, this is still not the final +product. + +This is a "fast hack", meant as a minimal guide to what you must do. +I'll expand this as soon as people tell me what they have problems with +etc etc. If somebody who has successfully installed the system wants to +write something better, I'd be delighted. This guide stinks to high +heaven. + + + Installing Linux-0.10 on your system + + +There are 5 major steps in installing linux on your system: + +1 - BACK UP ANY IMPORTANT DATA. Linux accesses your hardware directly, +and if your hardware differs from mine, you could be in for a nasty +surprise. Doublecheck that your hardware is compatible: AT style +harddisk, VGA controller. (If somebody has EGA, please tell me if the +screen driver should happen to work) + + +2 - Make a file-system on your harddisk. This is easy if you have +minix, but if you haven't got minix, you'll have to get the minix +demo-disk from somewhere (plains.nodak.edu is one place), and use that. +There should be a manual accompanying the demo-disk, and you had better +read that carefully. Although this version of linux will boot up +without minix, a knowledge of minix would help. Especially if you have +never done any unix work, you'll be very confused. + +Making a filesystem means getting a empty partition (with DOS fdisk or +similar), and using the 'mkfs /dev/hdX nnn' command to write out a empty +file-system. + + +3 - copy the diskimages to two floppies. Again, under minix (or any +unix), this is easy, as you can just do a simple 'dd' to a floppy, but +from within MS-DOS this might be a bit trickier. 'debug' should be able +to write diskettes directly, or you could get the sources to "raw-write" +from the same place as you got the minix demo disk, and modify them to +write out any disk image (or do they do that already?). + +NOTE! The floppies MUST be of the same type: even though the boot-image +will fit nicely on a 360kB floppy, you have to write it to the same type +of floppy as the root-image. That means a 1.2M or 1.44M floppy. The +reason is that the floppy-type is determined at boot-time from the +boot-floppy. Thus the same binary works on both 3.5" and 5.25" drives. + + +4 - boot up from floppy. This should be obvious. Having a floppy as +root-device isn't very fast (especially on a machine with less than 6MB +total ram -> small buffer cache), but it works (I hope). Test the +programs on the root-floppy (cat mkdir etc). + + +5 - Mount the harddisk partition (I do it on /user: ie +'mount /dev/hdX /user'), and copy the file system over to the new +partition. The following is a example of how to do this: + +$ cd /user +$ mkdir usr +$ for i in bin etc usr/bin usr/root mtools +> do +> mkdir $i +> cp `ls -A /$i` $i +> done +$ mkdir dev +$ cd dev +$ for i in 0 1 2 3 4 5 6 7 8 9 +> do +> mknod 'hd'$i b 3 $i +> done +$ mknod tty c 5 0 +$ mknod tty0 c 4 0 +$ mknod tty1 c 4 1 +$ mknod tty2 c 4 2 + +You should now have a filesystem you could boot from. Play around a bit, +try to get aquainted with the new system. Log out when you've had +enough. + + +6 - Changing the boot-diskette use your new harddisk partition as root. +The root device to be used for linux is encoded in a word at offset 508 +in the boot image. Normally this is 0, meaning that the root is to be +the same type of floppy as was used in the boot process. This can be +changed to whatever you like. + +Use a short program like the one at the end to change the word (I assume +everybody has access to some kind of C compiler, be it under dos or +unix). You can then write out the new bootdisk, and boot from it, now +using the harddisk as root (much faster). Once you have successfully +done that you might want to install additional programs (gcc etc) by +reading them from a dos-floppy with 'mcopy'. + + + Linus (torvalds@kruuna.helsinki.fi) + + +------ example program: use 'a.out < oldboot > newboot' ---- +#include +char tmp[512]; + +void main(void) +{ + int i; + + if (512 != read(0,tmp,512)) + exit(1); + if (0xAA55 != *((unsigned short *)(tmp+510))) + exit(2); + *((unsigned short *)(tmp+508)) = NEW_DEV; + if (512 != write(1,tmp,512)) + exit(3); + while ((i=read(0,tmp,512)) > 0) + if (i != write(1,tmp,i)) + exit(4); + exit(0); +} +------- + + Devices: + +Harddisks: +0x301 - /dev/hd1 - first partition on first drive +... +0x304 - /dev/hd2 - fourth partition on first drive + +0x306 - /dev/hd1 - first partition on second drive +... +0x309 - /dev/hd2 - fourth partition on second drive + +0x300 - /dev/hd0 - the whole first drive. BE CAREFUL +0x305 - /dev/hd5 - the whole second drive. BE CAREFUL + + +Floppies: +0x208 - 1.2M in A +0x209 - 1.2M in B +0x21C - 1.44M in A +0x21D - 1.44M in B diff --git a/Linux-0.10/docs/README.images b/Linux-0.10/docs/README.images new file mode 100644 index 00000000..e51fede2 --- /dev/null +++ b/Linux-0.10/docs/README.images @@ -0,0 +1,12 @@ +This tar file contains new disk images for Linux 0.10 boot floppies + +bootimage.Z Contains the Linux 0.10 boot floppy image, with the + patch to buffers.c included to avoid disk corruption + problems when two processes are thrashing the buffer + cache. + +bootimage-ncaps.Z + As above, except it also includes a patch to keyboard.S + so that the caps lock key acts as a control key. + (You never need a caps lock key when you're using Unix + anyway :-) diff --git a/Linux-0.10/patchs/build.c.patch b/Linux-0.10/patchs/build.c.patch new file mode 100644 index 00000000..d5bb1a1c --- /dev/null +++ b/Linux-0.10/patchs/build.c.patch @@ -0,0 +1,89 @@ +*** build.c.orig Sat Nov 9 21:50:51 1991 +--- build.c Sat Nov 9 22:23:13 1991 +*************** +*** 17,24 **** +--- 17,27 ---- + */ + + #include /* fprintf */ ++ #include + #include /* contains exit */ + #include /* unistd.h needs this */ ++ #include ++ #include + #include /* contains read/write */ + #include + +*************** +*** 25,30 **** +--- 28,36 ---- + #define MINIX_HEADER 32 + #define GCC_HEADER 1024 + ++ #define DEFAULT_MAJOR_ROOT 3 ++ #define DEFAULT_MINOR_ROOT 6 ++ + /* max nr of sectors of setup: don't change unless you also change + * bootsect etc */ + #define SETUP_SECTS 4 +*************** +*** 46,54 **** + { + int i,c,id; + char buf[1024]; + +! if (argc != 4) + usage(); + for (i=0;i +#include +#include + +void main(int ac, char **av) +{ + char buf[512]; + + + if (ac != 3) { + fprintf (stderr, "%s: update Linux bootimage root device details.\n", + av[0]); + fprintf (stderr, "Usage: %s \n", av[0]); + exit (-1); + } + + /**************************************************************/ + /* Don't remove this keypress bit 'cos it gives you a chance */ + /* to run this program from your dos boot floppy, remove that */ + /* disk, put your linux boot disk into the same drive, patch */ + /* in the new root device details and save them. No HD or */ + /* rawrite required! (v. handy if DOS is dead) */ + /**************************************************************/ + + printf ("Insert Linux boot disk into drive A and press any key\n"); + getch(); + + if (absread (0, 1, 0, &buf) != 0) { + perror ("Disk reading problem"); + exit (-1); + } + + printf ("Current rootdevice: Major %d Minor: %d\n", buf[509], buf[508]); + + buf[508] = atoi (av[2]); + buf[509] = atoi (av[1]); + + if (abswrite (0, 1, 0, &buf) != 0) + { + perror ("Disk writing problem"); + exit (-1); + } + printf ("New rootdevice: Major %d Minor: %d\n", buf[509], buf[508]); + + exit(0); +} diff --git a/Linux-0.10/sources/sbin/fsck.c b/Linux-0.10/sources/sbin/fsck.c new file mode 100644 index 00000000..3d7f4e8a --- /dev/null +++ b/Linux-0.10/sources/sbin/fsck.c @@ -0,0 +1,645 @@ +/* + * fsck.c - a file system consistency checker for Linux. + * + * (C) 1991 Linus Torvalds. This file may be redistributed as per + * the Linux copyright. + */ + +/* + * 09.11.91 - made the first rudimetary functions + * + * 10.11.91 - updated, does checking, no repairs yet. + * Sent out to the mailing-list for testing. + * + * 14.11.91 - Testing seems to have gone well. Added some + * correction-code, and changed some functions. + * + * 15.11.91 - More correction code. Hopefully it notices most + * cases now, and tries to do something about them. + * + * 16.11.91 - More corrections (thanks to Matti Jalava). Most + * things seem to work now. + * + * I've had no time to add comments - hopefully the function names + * are comments enough. As with all file system checkers, this assumes + * the file system is quiescent - don't use it on a mounted device + * unless you can be sure nobody is writing to it (and remember that the + * kernel can write to it when it searches for files). + * + * Usuage: fsck [-larvsm] device + * -l for a listing of all the filenames + * -a for automatic repairs (not implemented) + * -r for repairs (interactive) (not implemented) + * -v for verbose (tells how many files) + * -s for super-block info + * -m for minix-like "mode not cleared" warnings + * + * The device may be a block device or a image of one, but this isn't + * enforced (but it's not much fun on a character device :-). + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#ifndef __GNUC__ +#error "needs gcc for the bitop-__asm__'s" +#endif + +#ifndef __linux__ +#define volatile +#endif + +#define ROOT_INO 1 + +#define UPPER(size,n) ((size+((n)-1))/(n)) +#define INODE_SIZE (sizeof(struct d_inode)) +#define INODE_BLOCKS UPPER(INODES,INODES_PER_BLOCK) +#define INODE_BUFFER_SIZE (INODE_BLOCKS * BLOCK_SIZE) + +#define BITS_PER_BLOCK (BLOCK_SIZE<<3) + +static char * program_name = "fsck"; +static char * device_name = NULL; +static int IN; +static int repair=0, automatic=0, verbose=0, list=0, show=0, warn_mode=0; +static int directory=0, regular=0, blockdev=0, chardev=0, links=0, total=0; + +/* this is used to implement the (coming) two-pass zone checking. */ +static int trust_zone_bit_map=0; + +static int changed = 0; /* flags if the filesystem has been changed */ + +/* File-name data */ +#define MAX_DEPTH 50 +static int name_depth = 0; +static char name_list[MAX_DEPTH][NAME_LEN+1]; + +static char * inode_buffer = NULL; +#define Inode (((struct d_inode *) inode_buffer)-1) +static char super_block_buffer[BLOCK_SIZE]; +#define Super (*(struct super_block *)super_block_buffer) +#define INODES ((unsigned long)Super.s_ninodes) +#define ZONES ((unsigned long)Super.s_nzones) +#define IMAPS ((unsigned long)Super.s_imap_blocks) +#define ZMAPS ((unsigned long)Super.s_zmap_blocks) +#define FIRSTZONE ((unsigned long)Super.s_firstdatazone) +#define ZONESIZE ((unsigned long)Super.s_log_zone_size) +#define MAXSIZE ((unsigned long)Super.s_max_size) +#define MAGIC (Super.s_magic) +#define NORM_FIRSTZONE (2+IMAPS+ZMAPS+INODE_BLOCKS) + +static char inode_map[BLOCK_SIZE * I_MAP_SLOTS]; +static char zone_map[BLOCK_SIZE * Z_MAP_SLOTS]; + +static unsigned char * inode_count = NULL; +static unsigned char * zone_count = NULL; + +void recursive_check(unsigned int ino); + +#define bitop(name,op) \ +static inline int name(char * addr,unsigned int nr) \ +{ \ +int __res; \ +__asm__("bt" op " %1,%2; adcl $0,%0" \ +:"=g" (__res) \ +:"r" (nr),"m" (*(addr)),"0" (0)); \ +return __res; \ +} + +bitop(bit,"") +bitop(setbit,"s") +bitop(clrbit,"c") + +#define inode_in_use(x) (bit(inode_map,(x))) +#define zone_in_use(x) (bit(zone_map,(x)-FIRSTZONE+1)) + +#define mark_inode(x) (setbit(inode_map,(x)),changed=1) +#define unmark_inode(x) (clrbit(inode_map,(x)),changed=1) + +#define mark_zone(x) (setbit(zone_map,(x)-FIRSTZONE+1),changed=1) +#define unmark_zone(x) (clrbit(zone_map,(x)-FIRSTZONE+1),changed=1) + +/* + * Volatile to let gcc know that this doesn't return. When trying + * to compile this under minix, volatile gives a warning, as + * exit() isn't defined as volatile under minix. + */ +volatile void fatal_error(const char * fmt_string) +{ + fprintf(stderr,fmt_string,program_name,device_name); + exit(1); +} + +#define usage() fatal_error("Usage: %s [-larvsm] /dev/name\n") +#define die(str) fatal_error("%s: " str "\n") + +/* + * This simply goes through the file-name data and prints out the + * current file. + */ +void print_current_name(void) +{ + int i=0; + + while (i= ZONES) + printf("Zone nr > ZONES in file `"); + else + return 0; + print_current_name(); + printf("'."); + if (ask("Remove block",1)) { + *nr=0; + changed = 1; + return 1; + } + return 0; +} + +/* + * read-block reads block *nr into the buffer at addr. It returns + * 0 if the *nr is unchanged, 1 if it was changed. + */ +int read_block(unsigned short * nr, char * addr) +{ + int blk_chg = check_zone_nr(nr); + + if (!*nr || *nr >= ZONES) { + memset(addr,0,BLOCK_SIZE); + return changed; + } + if (BLOCK_SIZE*(*nr) != lseek(IN, BLOCK_SIZE*(*nr), SEEK_SET)) + die("seek failed in read_block"); + if (BLOCK_SIZE != read(IN, addr, BLOCK_SIZE)) { + printf("Read error: bad block in file '"); + print_current_name(); + printf("'\n"); + memset(addr,0,BLOCK_SIZE); + } + return blk_chg; +} + +/* + * write_block writes block nr to disk. + */ +inline void write_block(unsigned int nr, char * addr) +{ + if (!nr) + return; + if (nr < FIRSTZONE || nr >= ZONES) { + printf("Internal error: trying to write bad block\n" + "Write request ignored\n"); + return; + } + if (BLOCK_SIZE*nr != lseek(IN, BLOCK_SIZE*nr, SEEK_SET)) + die("seek failed in write_block"); + if (BLOCK_SIZE != write(IN, addr, BLOCK_SIZE)) { + printf("Write error: bad block in file '"); + print_current_name(); + printf("'\n"); + } +} + +/* + * mapped-read-block reads block nr blknr from the specified file. + * it returns 1 if the inode has been changed due to bad zone nrs + */ +inline int mapped_read_block(struct d_inode * inode, + unsigned int blknr, char * addr) +{ + unsigned short ind[BLOCK_SIZE>>1]; + unsigned short dind[BLOCK_SIZE>>1]; + int result; + + if (blknr<7) + return read_block(blknr + inode->i_zone,addr); + blknr -= 7; + if (blknr<512) { + result = read_block(7 + inode->i_zone, (char *) ind); + if (read_block(blknr + ind,addr)) + write_block(inode->i_zone[7], (char *) ind); + return result; + } + blknr -= 512; + result = read_block(8 + inode->i_zone, (char *) dind); + if (read_block(blknr/512 + dind, (char *) ind)) + write_block(inode->i_zone[8], (char *) dind); + if (read_block(blknr%512 + ind,addr)) + write_block(dind[blknr/512], (char *) ind); + return result; +} + +void write_tables(void) +{ + if (BLOCK_SIZE != lseek(IN, BLOCK_SIZE, SEEK_SET)) + die("seek failed in write_tables"); + if (BLOCK_SIZE != write(IN, super_block_buffer, BLOCK_SIZE)) + die("unable to write super-block"); + if (IMAPS*BLOCK_SIZE != write(IN,inode_map,IMAPS*BLOCK_SIZE)) + die("Unable to write inode map"); + if (ZMAPS*BLOCK_SIZE != write(IN,zone_map,ZMAPS*BLOCK_SIZE)) + die("Unable to write zone map"); + if (INODE_BUFFER_SIZE != write(IN,inode_buffer,INODE_BUFFER_SIZE)) + die("Unable to write inodes"); +} + +void read_tables(void) +{ + memset(inode_map,0,sizeof(inode_map)); + memset(zone_map,0,sizeof(zone_map)); + if (BLOCK_SIZE != lseek(IN, BLOCK_SIZE, SEEK_SET)) + die("seek failed"); + if (BLOCK_SIZE != read(IN, super_block_buffer, BLOCK_SIZE)) + die("unable to read super block"); + if (MAGIC != SUPER_MAGIC) + die("bad magic number in super-block"); + if (ZONESIZE != 0 || BLOCK_SIZE != 1024) + die("Only 1k blocks/zones supported"); + if (!IMAPS || IMAPS > I_MAP_SLOTS) + die("bad s_imap_blocks field in super-block"); + if (!ZMAPS || ZMAPS > Z_MAP_SLOTS) + die("bad s_zmap_blocks field in super-block"); + inode_buffer = malloc(INODE_BUFFER_SIZE); + if (!inode_buffer) + die("Unable to allocate buffer for inodes"); + inode_count = malloc(INODES); + if (!inode_count) + die("Unable to allocate buffer for inode count"); + zone_count = malloc(ZONES); + if (!zone_count) + die("Unable to allocate buffer for zone count"); + if (IMAPS*BLOCK_SIZE != read(IN,inode_map,IMAPS*BLOCK_SIZE)) + die("Unable to read inode map"); + if (ZMAPS*BLOCK_SIZE != read(IN,zone_map,ZMAPS*BLOCK_SIZE)) + die("Unable to read zone map"); + if (INODE_BUFFER_SIZE != read(IN,inode_buffer,INODE_BUFFER_SIZE)) + die("Unable to read inodes"); + if (NORM_FIRSTZONE != FIRSTZONE) + printf("Warning: Firstzone != Norm_firstzone\n"); + if (show) { + printf("%d inodes\n",INODES); + printf("%d blocks\n",ZONES); + printf("Firstdatazone=%d (%d)\n",FIRSTZONE,NORM_FIRSTZONE); + printf("Zonesize=%d\n",BLOCK_SIZE< INODES) + return NULL; + total++; + inode = Inode + nr; + if (!inode_count[nr]) { + if (!inode_in_use(nr)) { + printf("Inode %d marked not used, but used for file '", + nr); + print_current_name(); + printf("'\n"); + if (repair) + if (ask("Mark in use",1)) + mark_inode(nr); + } + if (S_ISDIR(inode->i_mode)) + directory++; + else if (S_ISREG(inode->i_mode)) + regular++; + else if (S_ISCHR(inode->i_mode)) + chardev++; + else if (S_ISBLK(inode->i_mode)) + blockdev++; + } else + links++; + if (!++inode_count[nr]) { + printf("Warning: inode count too big.\n"); + inode_count[nr]--; + } + return inode; +} + +void check_root(void) +{ + struct d_inode * inode = Inode + ROOT_INO; + + if (!inode || !S_ISDIR(inode->i_mode)) + die("root inode isn't a directory"); +} + +static int add_zone(unsigned short * znr) +{ + int result; + + result=check_zone_nr(znr); + if (!*znr || *znr >= ZONES) + return result; + if (zone_count[*znr]) { + printf("Block has been used before. Now in file `"); + print_current_name(); + printf("'."); + if (ask("Clear",1)) { + *znr = 0; + changed = 1; + } + } + if (!*znr || *znr >= ZONES) + return result; + if (!zone_in_use(*znr)) { + printf("Block %d in file `",*znr); + print_current_name(); + printf("' is marked not in use."); + if (ask("Correct",1)) + mark_zone(*znr); + } + if (!++zone_count[*znr]) + zone_count[*znr]--; + return result; +} + +static int add_zone_ind(unsigned short * znr) +{ + static char blk[BLOCK_SIZE]; + int i, result, chg_blk=0; + + result = add_zone(znr); + if (!*znr || *znr>=ZONES) + return result; + read_block(znr,blk); + for (i=0 ; i < (BLOCK_SIZE>>1) ; i++) + chg_blk |= add_zone(i + (unsigned short *) blk); + if (chg_blk) + write_block(*znr,blk); + return result; +} + +static int add_zone_dind(unsigned short * znr) +{ + static char blk[BLOCK_SIZE]; + int i, result, blk_chg=0; + + result = add_zone(znr); + if (!*znr || *znr >= ZONES) + return result; + read_block(znr,blk); + for (i=0 ; i < (BLOCK_SIZE>>1) ; i++) + blk_chg |= add_zone_ind(i + (unsigned short *) blk); + if (blk_chg) + write_block(*znr,blk); + return result; +} + +void check_zones(unsigned int i) +{ + struct d_inode * inode; + + if (!i || i >= INODES) + return; + if (inode_count[i] > 1) /* have we counted this file already? */ + return; + inode = Inode + i; + if (!S_ISDIR(inode->i_mode) && !S_ISREG(inode->i_mode)) + return; + for (i=0 ; i<7 ; i++) + add_zone(i + inode->i_zone); + add_zone_ind(7 + inode->i_zone); + add_zone_dind(8 + inode->i_zone); +} + +void check_file(struct d_inode * dir, unsigned int offset) +{ + static char blk[BLOCK_SIZE]; + struct d_inode * inode; + int ino; + char * name; + + changed |= mapped_read_block(dir,offset/BLOCK_SIZE,blk); + name = blk + (offset % BLOCK_SIZE) + 2; + ino = * (unsigned short *) (name-2); + inode = get_inode(ino); + if (!offset) + if (!inode || strcmp(".",name)) { + print_current_name(); + printf(": bad directory: '.' isn't first\n"); + } else return; + if (offset == 16) + if (!inode || strcmp("..",name)) { + print_current_name(); + printf(": bad directory: '..' isn't second\n"); + } else return; + if (!inode) + return; + if (name_depth < MAX_DEPTH) + strncpy(name_list[name_depth],name,14); + name_depth++; + if (list) { + if (verbose) + printf("%6d %07o ",ino,inode->i_mode); + print_current_name(); + if (S_ISDIR(inode->i_mode)) + printf(":\n"); + else + printf("\n"); + } + check_zones(ino); + if (inode && S_ISDIR(inode->i_mode)) + recursive_check(ino); + name_depth--; + return; +} + +void recursive_check(unsigned int ino) +{ + struct d_inode * dir; + unsigned int offset; + + dir = Inode + ino; + if (!S_ISDIR(dir->i_mode)) + die("internal error"); + for (offset = 0 ; offset < dir->i_size ; offset += 16) + check_file(dir,offset); +} + +void check_counts(void) +{ + int i; + + for (i=1 ; i < INODES ; i++) { + if (!inode_in_use(i) && Inode[i].i_mode && warn_mode) { + printf("Inode %d mode not cleared.",i); + if (ask("Clear",1)) { + Inode[i].i_mode = 0; + changed = 1; + } + } + if (inode_in_use(i)*Inode[i].i_nlinks == inode_count[i]) + continue; + if (!inode_count[i]) { + printf("Inode %d not used, marked used in the bitmap.", + i); + if (ask("Clear",1)) + unmark_inode(i); + } else if (!inode_in_use(i)) { + printf("Inode %d used, marked unused in the bitmap.", + i); + if (ask("Set",1)) + mark_inode(i); + } + if (inode_in_use(i) && Inode[i].i_nlinks != inode_count[i]) { + printf("Inode %d, i_nlinks=%d, counted=%d.", + i,Inode[i].i_nlinks,inode_count[i]); + if (ask("Set i_nlinks to count",1)) { + Inode[i].i_nlinks=inode_count[i]; + changed=1; + } + } + } + for (i=FIRSTZONE ; i < ZONES ; i++) { + if (zone_in_use(i) == zone_count[i]) + continue; + printf("Zone %d: %s in use, counted=%d\n", + i,zone_in_use(i)?"":"not",zone_count[i]); + } +} + +void check(void) +{ + memset(inode_count,0,INODES*sizeof(*inode_count)); + memset(zone_count,0,ZONES*sizeof(*zone_count)); + check_zones(ROOT_INO); + recursive_check(ROOT_INO); + check_counts(); +} + +int main(int argc, char ** argv) +{ + struct termios termios,tmp; + + if (argc && *argv) + program_name = *argv; + if (INODE_SIZE * INODES_PER_BLOCK != BLOCK_SIZE) + die("bad inode size"); + while (argc-- > 1) { + argv++; + if (argv[0][0] != '-') + if (device_name) + usage(); + else + device_name = argv[0]; + else while (*++argv[0]) + switch (argv[0][0]) { + case 'l': list=1; break; + case 'a': automatic=1; repair=1; break; + case 'r': automatic=0; repair=1; break; + case 'v': verbose=1; break; + case 's': show=1; break; + case 'm': warn_mode=1; break; + default: usage(); + } + } + if (!device_name) + usage(); + if (repair && !automatic) { + if (!isatty(0) || !isatty(1)) + die("need terminal for interactive repairs"); + tcgetattr(0,&termios); + tmp = termios; + tmp.c_lflag &= ~(ICANON|ECHO); + tcsetattr(0,TCSANOW,&tmp); + } + IN = open(device_name,repair?O_RDWR:O_RDONLY); + if (IN < 0) + die("unable to open '%s'"); + read_tables(); + check_root(); + check(); + if (verbose) { + int i, free; + + for (i=1,free=0 ; i