add directory Linux-0.10

This commit is contained in:
gohigh
2024-02-19 00:21:00 -05:00
parent ee280d88f9
commit ca9fe7ce11
22 changed files with 1476 additions and 0 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -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.]

Binary file not shown.

Binary file not shown.

256
Linux-0.10/docs/FAQ Normal file
View File

@@ -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

265
Linux-0.10/docs/FAQv.txt Normal file
View File

@@ -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
@

View File

@@ -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 <unistd.h>
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

View File

@@ -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 :-)

View File

@@ -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 <stdio.h> /* fprintf */
+ #include <string.h>
#include <stdlib.h> /* contains exit */
#include <sys/types.h> /* unistd.h needs this */
+ #include <sys/stat.h>
+ #include <linux/fs.h>
#include <unistd.h> /* contains read/write */
#include <fcntl.h>
***************
*** 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<sizeof buf; i++) buf[i]=0;
if ((id=open(argv[1],O_RDONLY,0))<0)
die("Unable to open 'boot'");
--- 52,85 ----
{
int i,c,id;
char buf[1024];
+ char major_root, minor_root;
+ struct stat sb;
! if ((argc != 4) && (argc != 5))
usage();
+ if (argc == 5) {
+ if (strcmp(argv[4], "FLOPPY")) {
+ if (stat(argv[4], &sb)) {
+ perror(argv[4]);
+ die("Couldn't stat root device.");
+ }
+ major_root = MAJOR(sb.st_rdev);
+ minor_root = MINOR(sb.st_rdev);
+ } else {
+ major_root = 0;
+ minor_root = 0;
+ }
+ } else {
+ major_root = DEFAULT_MAJOR_ROOT;
+ minor_root = DEFAULT_MINOR_ROOT;
+ }
+ fprintf(stderr, "Root device is (%d, %d)\n", major_root, minor_root);
+ if ((major_root != 2) && (major_root != 3) &&
+ (major_root != 0)) {
+ fprintf(stderr, "Illegal root device (major = %d)\n",
+ major_root);
+ die("Bad root device --- major #");
+ }
for (i=0;i<sizeof buf; i++) buf[i]=0;
if ((id=open(argv[1],O_RDONLY,0))<0)
die("Unable to open 'boot'");
***************
*** 72,77 ****
--- 103,110 ----
die("Boot block must be exactly 512 bytes");
if ((*(unsigned short *)(buf+510)) != 0xAA55)
die("Boot block hasn't got boot flag (0xAA55)");
+ buf[508] = (char) minor_root;
+ buf[509] = (char) major_root;
i=write(1,buf,512);
if (i!=512)
die("Write call failed");

View File

@@ -0,0 +1,53 @@
/********************************************************/
/* Rootset.c - modify Linux bootdisk root device entry */
/* - quick Turbo C hack by Iain_Reid@ed.ac.uk */
/********************************************************/
#include <stdio.h
#include <conio.h>
#include <process.h>
#include <dos.h>
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 <Major> <Minor>\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);
}

View File

@@ -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 <stdio.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <ctype.h>
#include <stdlib.h>
#include <termios.h>
#include <sys/stat.h>
#include <linux/fs.h>
#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<name_depth)
printf("/%.14s",name_list[i++]);
}
int ask(const char * string,int def)
{
int c;
if (!repair) {
printf("\n");
return 0;
}
if (automatic) {
printf("\n");
return def;
}
printf(def?"%s (y/n)? ":"%s (n/y)? ",string);
for (;;) {
fflush(stdout);
if ((c=getchar())==EOF)
return def;
c=toupper(c);
if (c == 'Y') {
def = 1;
break;
} else if (c == 'N') {
def = 0;
break;
} else if (c == ' ' || c == '\n')
break;
}
if (def)
printf("y\n");
else
printf("n\n");
return def;
}
/*
* check_zone_nr checks to see that *nr is a valid zone nr. If it
* isn't, it will possibly be repaired. Check_zone_nr returns != 0
* if it changed the nr.
*/
int check_zone_nr(unsigned short * nr)
{
if (!*nr)
return 0;
if (*nr < FIRSTZONE)
printf("Zone nr < FIRSTZONE in file `");
else if (*nr >= 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<<ZONESIZE);
printf("Maxsize=%d\n\n",MAXSIZE);
}
}
struct d_inode * get_inode(unsigned int nr)
{
struct d_inode * inode;
if (!nr || nr > 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<INODES ; i++)
if (!inode_in_use(i))
free++;
printf("\n%6d inodes used (%d%%)\n",(INODES-free),
100*(INODES-free)/INODES);
for (i=FIRSTZONE,free=0 ; i<ZONES ; i++)
if (!zone_in_use(i))
free++;
printf("%6d zones used (%d%%)\n",(ZONES-free),
100*(ZONES-free)/ZONES);
printf("\n%6d regular files\n"
"%6d directories\n"
"%6d character device files\n"
"%6d block device files\n"
"%6d links\n"
"------\n"
"%6d files\n",
regular,directory,chardev,blockdev,
links-2*directory+1,total-2*directory+1);
}
if (changed) {
write_tables();
printf( "----------------------------\n"
"FILE SYSTEM HAS BEEN CHANGED\n"
"----------------------------\n");
}
if (repair && !automatic)
tcsetattr(0,TCSANOW,&termios);
return (0);
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.