add directory Linux-0.10
This commit is contained in:
BIN
Linux-0.10/binaries/compilers/gccbin.tar.Z
Normal file
BIN
Linux-0.10/binaries/compilers/gccbin.tar.Z
Normal file
Binary file not shown.
BIN
Linux-0.10/binaries/sbin/update.Z
Normal file
BIN
Linux-0.10/binaries/sbin/update.Z
Normal file
Binary file not shown.
BIN
Linux-0.10/binaries/usr.bin/diffbin.tar.Z
Normal file
BIN
Linux-0.10/binaries/usr.bin/diffbin.tar.Z
Normal file
Binary file not shown.
BIN
Linux-0.10/binaries/usr.bin/grep-1.5.bin.tar.Z
Normal file
BIN
Linux-0.10/binaries/usr.bin/grep-1.5.bin.tar.Z
Normal file
Binary file not shown.
BIN
Linux-0.10/binaries/usr.bin/patch.Z
Normal file
BIN
Linux-0.10/binaries/usr.bin/patch.Z
Normal file
Binary file not shown.
BIN
Linux-0.10/binaries/usr.bin/pmake/pm_supp.tar.Z
Normal file
BIN
Linux-0.10/binaries/usr.bin/pmake/pm_supp.tar.Z
Normal file
Binary file not shown.
11
Linux-0.10/binaries/usr.bin/pmake/pmake.README
Normal file
11
Linux-0.10/binaries/usr.bin/pmake/pmake.README
Normal 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.]
|
||||
BIN
Linux-0.10/binaries/usr.bin/pmake/pmake.Z
Normal file
BIN
Linux-0.10/binaries/usr.bin/pmake/pmake.Z
Normal file
Binary file not shown.
BIN
Linux-0.10/binaries/usr.bin/sed.Z
Normal file
BIN
Linux-0.10/binaries/usr.bin/sed.Z
Normal file
Binary file not shown.
256
Linux-0.10/docs/FAQ
Normal file
256
Linux-0.10/docs/FAQ
Normal 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
265
Linux-0.10/docs/FAQv.txt
Normal 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
|
||||
@
|
||||
145
Linux-0.10/docs/INSTALL-0.10
Normal file
145
Linux-0.10/docs/INSTALL-0.10
Normal 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
|
||||
12
Linux-0.10/docs/README.images
Normal file
12
Linux-0.10/docs/README.images
Normal 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 :-)
|
||||
89
Linux-0.10/patchs/build.c.patch
Normal file
89
Linux-0.10/patchs/build.c.patch
Normal 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");
|
||||
|
||||
|
||||
|
||||
|
||||
53
Linux-0.10/sources/sbin/bootset.c
Normal file
53
Linux-0.10/sources/sbin/bootset.c
Normal 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);
|
||||
}
|
||||
645
Linux-0.10/sources/sbin/fsck.c
Normal file
645
Linux-0.10/sources/sbin/fsck.c
Normal 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);
|
||||
}
|
||||
BIN
Linux-0.10/sources/sbin/rc.src.tar.Z
Normal file
BIN
Linux-0.10/sources/sbin/rc.src.tar.Z
Normal file
Binary file not shown.
BIN
Linux-0.10/sources/system/bin16.tar.Z
Normal file
BIN
Linux-0.10/sources/system/bin16.tar.Z
Normal file
Binary file not shown.
BIN
Linux-0.10/sources/system/linux-0.10.tar.Z
Normal file
BIN
Linux-0.10/sources/system/linux-0.10.tar.Z
Normal file
Binary file not shown.
BIN
Linux-0.10/sources/system/unistd.tar.Z
Normal file
BIN
Linux-0.10/sources/system/unistd.tar.Z
Normal file
Binary file not shown.
BIN
Linux-0.10/sources/usr.bin/diff-1.15.tar.Z
Normal file
BIN
Linux-0.10/sources/usr.bin/diff-1.15.tar.Z
Normal file
Binary file not shown.
BIN
Linux-0.10/sources/usr.bin/grep-1.5.tar.Z
Normal file
BIN
Linux-0.10/sources/usr.bin/grep-1.5.tar.Z
Normal file
Binary file not shown.
Reference in New Issue
Block a user