Subject: Looking for a FAQ
Date: Fri, 8 Nov 1991 19:25:43 +0200
From: Linus Benedict Torvalds <>

Right ho, the subject says it all ... Linux could definitely do with a
FAQ (Frequently Asked Questions for all you who haven't been on the net
all your life :-). And as I'm sure anybody who has read my "help-files"
would agree, I'm not the best possible person to write it. Thus a new
project: getting a FAQ done with help from the linux-activists.

I've talked (yes, you can try to talk with me if I'm logged in) with
Robert Blum, and he's promised to help. Our idea was to get as many of
the linux users/would be users to ask questions they think ought to be
in the FAQ, and hopefully you could try to answer them too (and don't be
shy just because you aren't certain you get it right - I'll go through
the FAQ for techical soundness anyway, but your answers will make
editing much easier).

I'm especially interested in some tutorials/"true stories" from people
who installed linux without the help of minix. Not only will they help
make the FAQ, but I could try to make things easier for the next
version. The FAQ should also contain some pointer to what people are
doing, and what has been done (like init/login, the bison port, g++,

I guess the easiest way to organize this thing is to mail me with a
subject containing "FAQ". I'll then compile it to one big thing and
send it out to whoever wants to edit on it. If you want to be one of
the people working on it, please mail and say so. I'll be happier the
less I have to do with this thing :-), and even if you just think you
could try to check for things you find incomprehensible, mail me and
tell me you'd like to help with it. Alternatively, you can mail Robert
Blum (whom I happily let take over the main responsibility for this
thing if he wants it) at "".

If you can get your grubby little hands on the minix FAQ, you could try
to make a skeleton one for linux, trying to answer the questions
yourself first, and adding/removing questions of your own. Also, please
resend the questions you've already asked (and hopefully got answered),
as I really cannot sift through all my mail looking for questions, and
rewriting the answers (my mailbox is about 400kB - most of it on linux).
Editing the whole thing would probably be easier if you did some
pre-editing yourself: trying to get the thing to look like part of a

After we have gotten something that looks like a real FAQ (possibly
divided it into several parts: one general FAQ, one on installation
etc), I (or Blum) will post it to the mailing-list and set it up for
ftp. It will take some time: waiting for questions, then editing them,
mailing the new versions to the persons interested in this project,
revising them again after comments ... But hopefully we'll have a
better FAQ after that. I hope enough people mail questions/interest,
that I personally can get on to write the system programs.

I'd suggest a simple form for all the questions/answers: Something that
can easily be (semi-)automatically edited into something more

<empty line>
QUESTION: Xxx xx x x x xxx xxx xx xxx?
<empty line>
ANSWER: try to have some kind of skeleton answer here.
<empty line>

If you honestly haven't got a clue about the answer, please still ask
the question - nobody will flame you (sure, sure).

                Linus (

PS. It seems most people who had problems have got it working now. To
summarize: It works on SX's and with only 2M of memory. It also "works"
with a monochrome card, but you won't be able to see anything. Mtools
doesn't understand DOS 5.0 (big partitions at least), but Linux seems to
boot ok anyway. Anybody who simply cannot get it to boot out there?

PPS. I wrote over my minix-partition yesterday (don't even ask why -
some things are better forgotten :-), and although I got minix-386 up
and running again, it's kind of limping now (no bash, no make). It seems
I'll have to write fdisk/mkfs/fsck for linux just so that I wouldn't
need minix any more. Something good came out of it.

PPPS. As there still isn't a fsck-program for linux, be very careful
about rebooting the computer without syncing. The buffer cache is /at
least/ 500kB, and 1.5M buffer-cache is normal for machines with more
memory, so if you don't sync, there could be A LOT of buffers that
aren't written out to disk.

Original post in KCLUG archives

Subject: Re: Looking for a FAQ
Date: Fri, 8 Nov 1991 15:43:20 -0500
From: tytso@Athena.MIT.EDU (Theodore Ts'o)

I, too, I have managed to bring up Linux without the need of Minux. I
have a 40 MhZ AMD 386 with a 200 Meg clone. A couple of notes:

N1) The Minix demo disk which you can get from only
works for 5.25" disks --- this isn't documented anywhere, but I spent a
lot of time trying to get it to boot on my 3.5" A drive. It would print
the first message about "loading Minix system", but it would hang before
printing the menu. I finally had to give up, recable my drives so that
my 5" drive was my A drive to get Minix to come up.

N2) The numbering convestion for partition in Minix and Linux are
different!!! The way I dealt with it is to use a disk editor to write a
message "This is the Linux parittion" in the first sector of the
partition, and then use "head -3 /dev/hd[014]" to find the right
partition number on both Minix and Linux.

N3) I have MS-DOS 5.0, and the mtools worked just fine on my hard disk.
All of my partitions are less than 32 MEG, so I'm still using the FAT-16
filesystem. It would be nice if Linux understood the DOS extended
partitions, though. This would allow mtools could read my other DOS
partitions. In addition, it would mean that I could use one of the DOS
extended partitions as Linux partitions, so I could avoid chewing up
the 4 primary partitions available on my 200 meg drive.

[ Note: whoever decided that IBM hard disks only needed 4 partitions
should be condemned to recabling machine room floors; CP/M on
Heath/Zenith machines had 8 partitions available, and much more friendly
tools to modify said table! ]

N4) I have also experienced the panic which Patrick L. McGillan has
described. I suspect DOS setting some cruft which isn't getting cleaned
up. The panic happens happens right after the "Loading system" and
before the system has a chance to print the "Partition tables ok" message.

N5) I have managed to build the Linux kernel under Linux, using the 16
bit binaries which Linus provided. One little gotcha is that it is
necessary to rename the binaries provided in gccbin.tar.Z to the names
which the Makefile is expecting. Other than that, though, things went
very smoothly.

N6) It wasn't obvious that the "em" program in utilbin.tar.Z was
actually MicroEmacs. I was really happy once I found it, though!
Perhaps there should be a quick note mentioning this fact somewhere. At
the moment, the programs which I seem to be missing the most are 1)
more, 2) gdb, and 3) fsck. The first should be a lot easier to get
working than the last. :-)

And now, for some questions:

Q1) On, I found sources to shoelace, which seems to be a
way to boot Minix without needing a floppy boot disk. Is anyone working
on something similar for Linux? The other interesting thing about
shoelace is that it came with a file "shoefsck.c" which seems to contain
the necessary code filesystem checking for Minix. However, there's no
copyright notice on that file, and no email address for the author,
either. Does anyone know what the status of that code is? I was
considering trying to use that code to make a fsck for Minix.

Q2) Similarily, there are sources on for a fsck program for
Minix. It looks like it was derived from the Minix fsck, but since it
is available for anonymous FTP with no notices saying "don't touch
this", I wonder if would be consider fair play to base a fsck for Linux
on the code, and either distribute the code or patches to the code with
a note that you can get the rest of the program from

Q3) Linus, can you provide the configuration files for gcc and friends?
It would be interesting to see what's necessary to actually compile
one's own version of gcc/gas/etc.

Thanks to everyone on the list! I don't think I would have managed to
get Linux up and running with out a lot of helpful hints which were
posted on the list --- and I've only been on the list for a couple of

                                                - Ted

Original post in KCLUG archives

Subject: Linux fsck.c V0.10
Date: Sun, 10 Nov 1991 12:07:44 +0200
From: Linus Benedict Torvalds <>

Ok, This is version 0.10 of the fsck program for linux. Everyone is
encouraged to use the (old) minix fsck program available on nic if they
want to, but as it isn't clear what the status of it is, I would rather
have one especially made for linux. This is it.

It's a fast hack (2 days), but it seems to work relatively well. It
doesn't repair a destroyed file-system, but it should tell you about
problems. Repair is on the way...

The reason I'm posting this is that I would like to get all the bugs
ironed out before it starts writing to a disk. Now it just reads, so
this version will not f**k anything up, even if it has bugs (and
hopefully there aren't any). Although it isn't commented, it might give
you an idea of what the file-system looks like.

This is NOT a standalone version to be used at bootup. It is meant to be
compiled and used under linux, on filesystems that aren't mounted. You
can use it on root, assuming there is nothing writing to the disk (and
this includes fsck itself: don't use "fsck -l rootdev > tmp" or
similar). This isn't recommended though (you might have two boot-disks,
one which boots from floppy just to use fsck on the normal

--------- snip snip -----------------------------------------
begin 644 fsck.c.Z
M'YV0+U0H *$"A)DY8]:X& .B!8@P!M.P*0-B3IXY=,JT 3'FC9LY:3"6<3,F
M#T<T91*6D6/P#4LF:=S4P>-BH$""(% ,20$B1HX<,4# E#D'!!67=L*P(3/'
M#9V:!%\H4! P+8P<+F+$< $41$/#5<E07$O13!HY&$'(J<.U31DZ8>28-%.'
M))TT'N?83!L#1N#!A0^#J .'3)BQ+$"0>5.FZ!B4"6.>B>WFC>0R<,(\+IKG
M74X%4=0=::SUD']246212!O=EM(:*\T1VUI1A3''''4DF%: $GEX448;115'
M&UTT^624!"6 74LL091=FLZ9L:&?,$YTH(NIM@"1HP^)]495GS&D57##Y=1;
M<^W!,=&#6Z5@DZJ/<C>L<)#E%%-&<H0QQF?F\83"L2 DNRQSS3[;@AVL@F">
M=FF0"(((22H&9G-C3,0@&2* <$=F;NBFX$T%4<&68J=25-55%$$D,,&=H@PE
M29EIBZVI,X.@0PN2@F"37@J,$%/&E%'$ T9<O>$"&CZ4?38;:8/ 0V==D?%V
M3'B\<-#F(RCF&)\@2/'$$U1\D8033_2T5^G\Q411%5! 4804*("D!\]N>-M[
M&<H[7SOJTE/_A1!,/#'$$E. @+ONO+=?Q!0LZ#_%%_A[7_SFYRS:G8XB^GM?
M%8Q@A-U9#WO:0T$"X2<_^N&$@O-[8/:<I;X#@D (2:#"_P*(P27DI(0:+ (/
M># ##F8N6%AC24'@((<WG"%;;?C"K2C2@XD=)"$BV($"7@BE&.)$9CO2(8)X
M" (G5($)3! B$1ERK>@Y08J8@6$5I_68'L @-F'P%;"@Y,78K*M=92@C"%ZE
M+ZXQ)FN8@QKI\ ;,L,&+0NP@])H0!"Q\@7I0H (20% #& PQBWFTCX&6^ 7%
MQ'R*^4)8S&"&E8"@ATZ$HA -"+TD],9B* @G1B:S+=F4[YL440%/H%D&:=:!
MFBM) ?*<U4Q;=NE?TAQ80MP)3SEL 877R]XR-8FZ*;#&FBA0 ?C(V1Q_K22?
M,"-("APJ!XCN<YK5E$,!G\<^V%&O?N'L#$C.P">R# P\*3#HOUPP!QVR,U\$
MI8@6GN"$_>4$!2)- TF9=-(SI/2@<F"I#O6P,YARDWV<A )(<?H1G99TC1[Q
M36_ZU:?V=*Q4;:EC($,'UV"&J'S2J@?ENC\(TK6I8(4J2J<:U)8.[ Q? &P[
MT-:WQI6F$93!"I+0U15HH;<3'"#]7(C*6J*')>R<8QC@\$_AIA G2?A"4JT7
MB"%#<?G6$ED0%YYPX;Y4=,/GB*3*':*@O? A@QQ8D%^#-<<-&@7!A_<@8P54
M\0M?T,H<=E!C'*LHAU] @0C$0(>.Q65B("A!#%A0 AGP.#T9 P$)OE@"&'3L
MPSH000_.T#$4X%C''E9 EN7091BG@ 44Z[)"TZ-BY:'9RCF!@?)X_&&MT,%+
M!?IR;>BL@#[LY<*4A(/2,H1F$3@+T!D>$AT C>8Y&%H!B!9TQMA%:!&,X=$V
M%C'T(OS>F'Q!2&5P<&*K:&8%[$$!"; SGD$ :!0D]ZPL,+,0_9SI$;M8NSL[
MSE!P;3(XZ]0), ,-K_4]MJUDQ2*H%,XT58*B?(J0<A 5J4#P I0Q;XE<<(,(
M6$!#&^)0B9:!=@+*@ =C)V_6TJ9VC-1%8+)P)=0H'J=NOHUJ<7_%/N7NZ[G1
MW&Y-[;O?-T00P-$GQ'"/&^/@4XP<5BQQ\+ B>W<H< M3NZ4;UP$^39TR0EN
M<&C3.B:V[O9OTH/57D.XQ"MV9HJ!#>XTR H%(8 Q"/C !P.QQ <]).P4> +N
M!,1)T6V*SXJ_Z-T-ECS5E\%SR?V< *>?T+F858'40]!#-@RI# U^76S*7@2Y
M\/ )2+P(.A,&@0WJ\JS6YQH@_W--HT[H9ST+^;1"]+0N5'SF9"=.V,D"5+>X
MB@); XQC@V(V,QW5]@Q^<RN80O2V_>G!AS$/;L!U5*.]]JIW-3I;X(,T1'9G
M6XB^'+K N,+'.UWWM/:42W^AO3P!B67O/AY4(,8R*#ZR:$]^6S/3NY[7[);
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
M6H+)6KP_( )9EF6AR'8,++@D.)*ZU[NG.*;&*KW$BSZLK&&6T4K H2$\ *\
M]$E%$$I(T*?C1!)R8<[MI$OUF\YH0'[,C,SGE\^OA :!BG9C@&!IH& ,O,UG
M3*S@3*5[E*;%6YG7LA('XB?GYA*A&+*!'$LN&\CKW-)ZRCT[#=) O *#C(S9
M_, H(,-"392J^K?9/)13V&U62+6,&[)IT -!8;;K[#_.NP+E')2=Y@:[=L4\
M!FJNE@(J<-9IO=8Z5*E%T0,]E+EIW:<=81]N4<(-2M=V?9WL%C0% FJ\P=@&
MR)V3JP)>^#TJD+EP:-]GV-Q#N=]:Y]]K^(4J<*]PF,W4B *\VCK2TX,%/=$(
MS6 2OCH4#CL"]]0Y.87DFVG-414QH7W-D1EG, ;$MU\%H>)V,-5/I^(,X<TJ
M ./XZV\BI\-)#.-9G$!T6!#^ T .5$*FR'>5V8XD7!%K&(KQ.Q5M(@<K3JJ<
M.YTP/M"2!^-; / Q.6F> (M< )]*GDP-W)]F@!"LFWG-W"2*M>AYR0S,W)7
MJ>5<_J6B_.04D5 ]2N?UFAPFBB%T,#51?@9VL.5=WJ1=[.9CH"(4<0)L< *:
MPD9 RVJTMP9GEQR+[BXG$ :0WBN4-$9C@-4\QD5R(.J4'H*6KNB,#@(G( >=
MD-1PGD3,3.H_\ 1?( 5$< 52H /R3N\TQ019P)E.<+)RMJRCUYKOH>ZLWFXG
M_,8Y$O(CS_$QI#76!',@GW,K7_)IQ34[$O/Z-O,F!4DJGQPB0*I WP(R[_,L
M_\ A?]MHY_&9\7(G7ZTL\*=.<L,P@S)(S]A0K )N7*W)Q ([JA17G_5^]&RE

Original post in KCLUG archives

Subject: corrected buffer.c
Date: Tue, 12 Nov 1991 21:47:49 +0200
From: Linus Benedict Torvalds <>

Ok, here's the new buffer.c-file, hopefully correcting the bug which
caused file system inconsistencies.

NOTE! This file is NOT official, and won't be used as a starting point
for future kernel cdiffs. Thus save the old buffer.c before using this.
It's just a temporary bug fix before a real release (which should come
out in December). Hopefully these kind of rather urgent bug-fixes won't
be too usual.

The changes are mostly to "getblk()", and are not final: it's a bug-fix,
and I'll have to tweak it a bit more for the real version. The current
version works fine, but it's a bit overzealous in trying to avoid
reclaiming dirty blocks: with this kernel patch the buffer-cache VERY
easily fills up with dirty blocks, at the expense of ordinary ones.
Thus "sync"ing is even more important with this fix: the dirty blocks
are kept around longer (too long in my opinion) with this routine.

                Linus (

PS: Re: Math libraries. There aren't any. When I talk about gcc
soft-float, I'm just talking about the general idea - I haven't
implemented (or ported) any real math functions. The only floating
point math that gcc currently knows about is add/sub/neg/mul/div (and
only for doubles, not floats). Gcc in the original 1.40-version cannot
handle soft-floats correctly: linux gcc has this corrected (thanks
mainly to bruce evans), but not used very much.

There might be stubs for sin/ln etc in the library: they should just
return 0.0, and are there (if they are) to get gawk to compile (and yes,
it works - kind of). If you do find routines for floats you can use
(and they are available out there), you can add them to the library with
"gar d libc.a stubs.o" (remove old routines)
"gar rs libc.a sin.o ln.o ..."
------ snip snip ------------------------
begin 644 buffer.c.Z
M'YV0+U0H *$"! @V:=S4P?/"S)P78NJ8,5-&CHLQ P42-(AB2 H0,7+DB&&0
M2<(Z<T!0>2/'3A@V9.9D?*% 0<",!D]$G%CQX@D0:=K 85.F31DW=%+205,&
M)5$Y(,B\ 4HGK),G5(J$ !$D94+><AQ#EKEQJAL0=\*L:?I8\50VQUG/>6-4
M,L(6N]. H!VGSM'/*</(:>IF;MZ]="Q751ECK"&:'#C-011H+7@EE7%@J<04
M4_L!E9)73:$UQQ@LH884"&Z\P=N*%96A@V1,%2C<56R\ 0<<:921DADLX>2C
MEV?H!:64<.31PI8/#@@6C J,D- 8;-21%P@\[(::'&>X@(8/ S7Z:*23\H"0
M0@P!Z889:62ZJ:=:@=J4J"<Q]"-39&C*J:.M2OKJJ N],)X<_;%A*ZN0ZDKI
MG&V\,$<>NQ4U+*[%AHKL"UT-J\"&%7UW'0A'D;&# KLYMA5F/,GQ!5.^;;2;
M%%\@$<042'3QKVI<C3$?A_5&=B_!Z19DQGYE?('0;A>G)N+&XD:FVAQK? %P
M9 5]'-Z9\CI1!1-,?+OMPU\(48411@@V1;P@P/ MN!BOG-"H3=EQUUXWM^N5
MNP++@<+,Y$(%LL%BH)&" GLHD "D::"0PK<)D)D&49N%W8(/8IC\1H%C)Y"
M1F$OO;?D8WR1T!MYS:&XW@&!)T=:3<666Y&I+Q9@UQ6EI )-"82-]+IRM'LO
MVU@BAT(:/< P@Y \0"TT$0;O3Q0*ZS 0MC5?X1YVV&D];<;6)>+0MB'ZYW&
M:^.C,7?=: 6?M][H?2'''>Y&62 *5TB11'37B\TVXPG8#QUD\QVE*8!Q"G <
MZ;Z0%SL<;T@-O)S9-,<YC@6L7%\#'1I$YSMY 4]X62/>:(Z7O.FEP7D0@U[1
MI' TYJ6A>OW+'@BV=[ZXJ8]P#01!".050;/IS52'L0_;N.>]J]TK?>7+'/H&
MQ[XRV"%>/'0B"$Q@ J?<D'UI<)\/$Q"_^=7O;FO G_[X1[[_(6Z!ITN=XLS6
M,@RQ:M^#8T60.$1!,K&03^Q!%)](12L2LGUT4&07Z<<P,(IQ?T7H7_D *$ "
M)FUQ,=)(0<"4$CG(+B%-&5"!QL24TB#G,F:(TI3ZTA8US>4[@-*+G-Q !CVY
M@4]X28V5ZH(>W$5E*@-JP5$X5"7K?&<IJ2D.;;Z$AC#I*3\@V \;5/:6#\TG
M7G'G8[RBF!.T(39(^<EH3B"EHYR G.;<2)A(8Y4U128\?7$-;-H@AH B9CXM
M$A1E]E('KB"$#GEH$TGA]**-0*$,4H(;H)ZTI<+PQILD;0I R4 &N*F4,JUI
MD1Q41M'45>0M.+E=E-Y (1VT8&P$P0F-I$,=-I2H#B>2C&SV@Q1WODE,K7&#
MP9HH<3--"((2GB %%$10A_*2P?M:"2RV-; '34C"<[K[W2K" \PF,$.$M Z
MMU6EKH5J:%I^0!#>"3($LATF<MM2&>\F<KR%(:!YI<@'>;U7!C P8 +H2L(Z
M-@]H4Z@"% 1CPNP%$GU;>\S &KN&+:2A"RZ 7 [=BX>)Q#<%FNRAWA( AYK*
M3,1:FP..OU@@$Z-8Q8ED6QL_*$DYR'$S=#3A'54H/1?"T(^ -!^(+[GBI+78
M#"\&+R+MH$@@GL21/H2D$;-&R0]O9I XE"*+73R#CVARRXJ\Y&,"Y*>FR(O*
M68R,@\V(P!'D!57] <&Y$&8&-QC8#M>SWQH^@H)&9\6@9^@/&5)P:"^0. 4I
M* '0)$:QL?FY#(#&)\(.G6@P?J28"5M8PP9MIT*3^M)=J,FZ,K88J(%@N(>]
MZ%N^,#+V?*$^9;"/ZCHGW<]15X*MZU!BF]+K-AS,3BT MGWZ.\$E7O$+_<%#
M2>P&.;CYSF+SX;VI[,3^$9+?_I;WM;W]K60C5I_-O@K)#A(FFOD7?2' ]Q?6
MS6N2?80/?-"AQKW=\;E@VH=PH(R(4" "(TR<Q!3?#6RR,V>]B*!\E^3XR.8"
M$#WF%F?CT;7-='EEO>)"=O?3_VYXDE%]-TZW ]3-=GC(EWOI22?<T"<.<.(Y
M:(!@)R,%<05HT!<(,1X[-0<ZA2[(D0>Q,1]AD <N,(,2TA3[,2<4-5)3]1EF
MP4QIT15? 5S4,28]XA6K=1!@9$TI@0)9011S0(1UD2,WB!9#4AIM@%?A%":V
MD2#L41CE]%( =2*1T1930A>W<R9N S?W]$Y]@V26<5B^H4W9D24;,5G55#R?
MP5!BX!LI %(I82<70@:J%1DWB![$% 9EB$QKM4T?<ALUU5>YA#IF4DL%(X,P
M@GY>HWZ!TBZHIC!AL%CN%WVVXQ2*)D%[(W>>4S :M'\CM ,[$&77A0(9%S8]
M &ADT'X!6(HGIX$)!BQ^$7Q#=$E ,EK5\TC=8S7@<T1E9&8:ET-OMF)5E'U@
MU&]6EX'(UXO?$3KM1DC#B!0MT )\%DLX\01QDH(-M8D,4XZ?=29A,HBW5A%]
M 2F](0=R<@;=\TW+\85Y@2 ;L8-E82J#!801T@1<%1DJ11Q ,BDC11LPP1Z6
M11MDP!K'8X.@T1N'<09;J"[+<2: B"=[(1<@T ;U@B(7E2.@ABJ]M4V@I2V1
ML55KL"AAM1$W8AEL< 8LD1;.-E+)1 9+(A>&41'+M!=050:18E#Z%!&)H6QO
M42L9H3=,( 14 !(QX (Q,)4C 2.?%FH@( 1!0 1_,053@$1GAD2?E&<\P ,Q
MD (K0):$4XI,8W^I&#(@@(YL$$;;$GWQYY:8@XD#@W]"P1K4M33[T2*IH0/#
MESY(LXFLEFJ?2!2OIHL^M(':F $V'AS\7AT8%[+04/H4X'(A5';-F->IA!%
M%XO%AR(@MY5=^95AV7\IP -<Z95% )9(!(M&IX =.&/_%9NLB0*NJ4B]<X-K
M,$0 U ?@44YPTVB5R8%P\'T_]Q&'5'FA%'6R2#XSY$-\ QK?$S@V<XQ)9).W
MTQ=$22%AB :!USHO,86'J$^")2@B\%8B0(I)>#L(215,$1;%Q5#!%8NVB(O8
M!YEZ4Z#OB:"M\P1+P!I&H%Y!P#-9 !Y-T5IO\%I^98[WTE#$$5$I%6@JE18G
MD!)KD! 126TDRDR@E1MTD*66I1 0&3>?.5K)8QMEJFB",CYV4R!K&I3NT1O?
M<:,"BA0]$ /+AT7!DSQ]^@5SACK2!*@>^' ETVQN%VQ64F:X!X$]T$"!>H$D
MEHQDYJK4.8L2P8V@^8V[2&,J-P8L1P5RD =/<CM_]W?W<G/Q*1XE\QC<*5V&
MB(TI88! \1K$ 7/AD1)9,86-60; 11-\B2^I2JT%$XH%EY>F9G>G>*KI%[#:
M>)BSB 8]0)=AE(NFUJLIYP8K)P*C6C!+(K&'!:N2]HL\PP5NH*R'*6>00:B\
M,B=*BAYA401@2ASZ<09U8!1#HG7@D18H<AG]88]<@54;H1 LU1.7B(JH*I<;
MZQMA0+"(MBVH,AMTP!HSZ *FZ!*8&85G, <5I+"9R+!H )C])SJ2^T$H\+8J
MN+B[43[_E3X16QCI2&JD&TH6^ZLL5[@\.9>J6Y<?2T""8H D:[*FB;)T)DWO
M89O_Y9D]"[Q;Q$5L(#^DI&C$.[-$$ 0UNT6>V8W?!HX^5)QF([G=XKR56SZS
M>IX FI[7-KXK&YE&&[2D6@:.NH$H8("'$ZIG]S$!10<H$"4O]3'=8HK_2G<H
MXD&JH7;#<[]G5S.6FANB8TG2Q7=O%@-G"6'O(P9(0SDAS&@V0 ,PH (Q ,R
M0 /E\Z%PH3<N+"\PC!<$\1$6S$SQB9SS&3<@T +R(@1,\ 1#L 1?, 5)H 5%
M\!'3>V:XMB^;@08KD)8? 8O0)WZO)'!E&3Q((V$)<&WRF\9#=&W?NF=F3#@"
M#'1J?&U5 WR\-\="UWPY XQ\O''BIL?"IS?0EQJ7 <23@1Q<+ 9O''J,MR(M
MP*>!O'ESX7Q?_,;%Z$//DT=&L\E2IL1O%L3Z\A'O=<,1%F%Q]L);;,IX$ 2I
M+&$ I#[T.V&?5W4<_$8?;,N7"7KA)WF17%UK[)R1+)U'5F$[<$*;-C%(D,P>
09L@(XXF+Y6,] (('E * ,N7

Original post in KCLUG archives

Subject: mtools, demand-loading, paging
Date: Thu, 14 Nov 1991 13:22:37 +0200
From: Linus Benedict Torvalds <>

Hi again. Several people have inquired about mtools. The sources I
used are available on pub/unix/386ix/isc/source/mtools*.
I don't know if this is the most recent version. And no - linux
probably cannot read partitions >64MB. The reason is (partly) the minix
file system. See later.

Paging to disk has also come up: It will certainly be implemented (in
fact one of the bigger changes in the 0.10 fs was due to making ready
for this). There are no obvious problems with this, but unless somebody
else wants to try to implement it, it will take some time (I'm talking
March-92 at the earliest, probably not until summer). One of my problems
is (will be) lack of disk-space to try it out on.

As for demand-loaded executables... hmm. There are a couple of problems
with this: the minix filesystem wasn't meant for it, and it would be
MUCH easier to implement if BLOCK_SIZE was 4096 (= one page) instead of
the current 1024. This of course means waste of disk-space. The problem
with the minix filesystem isn't that serious: I'll have to move on to
something else anyway - 64M partitions can be limiting for those who have
disks big enough to hold them (and the afore-mentioned 64Mb limit even
for direct read/writes.. This I can try to do something about).

The more serious problem about demand-loading is that the fs isn't
really designed for it - I doubt the locking mechanism used currently
will suffice. If people would accept a non-locking demand-loading (ie
you could write to the file while it's in use etc...) I could possibly
try to implement it. Again - not until well into -92.

And a little small sad note: I know I said symlinks would probably be in
the next version, but unless I can get the higher priorities completed,
this will be left for later. The things now relatively certain (barring
acts of God etc) are: fsck, mkfs, badblocks, fdisk, non-VGA video and
finally the correction to the serial drivers to change speed by the
ioctl call. I'll look into extended partitions (fdisk will probably
report them), but I doubt they will be accepted by the kernel proper
until later.


PS. I try to answer all mail as soon as I get it, but I get MUCH mail.
If you think the mailing-list has been active: think again :-). If you
don't hear from me, I've probably forgotten to answer at once, and once
your mail is in my mailbox, it's likely to be lost among the multitude.
Re-mail your question, and make me feel guilty about not replying the
first time: that's the ticket.

Original post in KCLUG archives

Subject: newest mkfs for linux
Date: Tue, 26 Nov 1991 05:22:04 +0200
From: Linus Benedict Torvalds <>

Ok, here's a mkfs for those that want to try it out. It works on my
system (limited testing), and hopefully we can get possible bugs ironed
out in time for 0.11 (and currently I'm hoping to release that December
8th or something).

This mkfs has two modes: checking and reckless. On a disk that you know
has no problems, you just write "mkfs /dev/hdx size", and you should
have a new system (DON'T do this on a mounted drive: unlike fsck there
is NO way that will work, and you'll probably mess it up completely.)

On a disk with possible read-errors, use "mkfs -c /dev/hdx size", which
will read all the blocks and mark those unreable into a special file
"/.badblocks". I'm not making any guarantees. This is a fast hack
(mainly yesterday and today), and I have tested only on small
filesystems, faking errors by telling mkfs that the filesystem is bigger
than it actually is. If you think the algorithm for marking bad blocks
is weird: you're right.


PS. Using -c on a big harddisk or on floppies is slow, even though I try
to speed it up by reading 32kB at a time. Also, the current linux kernel
will print out error messages for all the IO errors - that's normal, and
that's what this mkfs should map out.
---------------- snip snip ----------
 * mkfs.c - make a linux (minix) file-system.
 * (C) 1991 Linus Torvalds. This file may be redistributed as per
 * the Linux copyright.

 * 24.11.91 - time began. Used the fsck sources to get started.
 * 25.11.91 - corrected some bugs. Added support for ".badblocks"
 * The algorithm for ".badblocks" is a bit weird, but
 * it should work. Oh, well.
 * Usuage: mkfs [-c] device size-in-blocks
 * -c for readablility checking (SLOW!)
 * 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"

#ifndef __linux__
#define volatile

#define ROOT_INO 1
#define BAD_INO 2

#define MAX_GOOD_BLOCKS 512

#define UPPER(size,n) ((size+((n)-1))/(n))
#define INODE_SIZE (sizeof(struct d_inode))


static char * program_name = "mkfs";
static char * device_name = NULL;
static int DEV = -1;
static long BLOCKS = 0;
static int check = 0;
static int badblocks = 0;

#define ROOT_INO_STRING "\001\000"
#define BAD_INO_STRING "\002\000"

static char root_block[BLOCK_SIZE] =
ROOT_INO_STRING ".\0\0\0\0\0\0\0\0\0\0\0\0\0"
ROOT_INO_STRING "..\0\0\0\0\0\0\0\0\0\0\0\0"
BAD_INO_STRING ".badblocks\0\0\0\0";

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)

static char inode_map[BLOCK_SIZE * I_MAP_SLOTS];
static char zone_map[BLOCK_SIZE * Z_MAP_SLOTS];

static unsigned short good_blocks_table[MAX_GOOD_BLOCKS];
static int used_good_blocks = 0;

#define bitop(name,op) \
static inline int name(char * addr,unsigned int nr) \
{ \
int __res; \
__asm__ __volatile__("bt" op " %1,%2; adcl $0,%0" \
:"=g" (__res) \
:"r" (nr),"m" (*(addr)),"0" (0)); \
return __res; \


#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)))
#define unmark_inode(x) (clrbit(inode_map,(x)))

#define mark_zone(x) (setbit(zone_map,(x)-FIRSTZONE+1))
#define unmark_zone(x) (clrbit(zone_map,(x)-FIRSTZONE+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)

#define usage() fatal_error("Usage: %s [-c] /dev/name blocks\n")
#define die(str) fatal_error("%s: " str "\n")

void write_tables(void)
        if (BLOCK_SIZE != lseek(DEV, BLOCK_SIZE, SEEK_SET))
                die("seek failed in write_tables");
        if (BLOCK_SIZE != write(DEV, super_block_buffer, BLOCK_SIZE))
                die("unable to write super-block");
        if (IMAPS*BLOCK_SIZE != write(DEV,inode_map,IMAPS*BLOCK_SIZE))
                die("Unable to write inode map");
        if (ZMAPS*BLOCK_SIZE != write(DEV,zone_map,ZMAPS*BLOCK_SIZE))
                die("Unable to write zone map");
        if (INODE_BUFFER_SIZE != write(DEV,inode_buffer,INODE_BUFFER_SIZE))
                die("Unable to write inodes");

void write_block(int blk, char * buffer)
        if (blk*BLOCK_SIZE != lseek(DEV, blk*BLOCK_SIZE, SEEK_SET))
                die("seek failed in write_block");
        if (BLOCK_SIZE != write(DEV, buffer, BLOCK_SIZE))
                die("write failed in write_block");

int get_free_block(void)
        int blk;

        if (used_good_blocks+1 >= MAX_GOOD_BLOCKS)
                die("too many bad blocks");
        if (used_good_blocks)
                blk = good_blocks_table[used_good_blocks-1]+1;
                blk = FIRSTZONE;
        while (blk < ZONES && zone_in_use(blk))
        if (blk >= ZONES)
                die("not enough good blocks");
        good_blocks_table[used_good_blocks] = blk;
        return blk;

void mark_good_blocks(void)
        int blk;

        for (blk=0 ; blk < used_good_blocks ; blk++)

inline int next(int zone)
        if (!zone)
                zone = FIRSTZONE-1;
        while (++zone < ZONES)
                if (zone_in_use(zone))
                        return zone;
        return 0;

void make_bad_inode(void)
        struct d_inode * inode = &Inode[BAD_INO];
        int i,j,zone;
        int ind=0,dind=0;
        unsigned short ind_block[BLOCK_SIZE>>1];
        unsigned short dind_block[BLOCK_SIZE>>1];

#define NEXT_BAD (zone = next(zone))

        if (!badblocks)
        inode->i_nlinks = 1;
        inode->i_time = time(NULL);
        inode->i_mode = S_IFREG + 0000;
        inode->i_size = badblocks*BLOCK_SIZE;
        zone = next(0);
        for (i=0 ; i<7 ; i++) {
                inode->i_zone[i] = zone;
                if (!NEXT_BAD)
                        goto end_bad;
        inode->i_zone[7] = ind = get_free_block();
        for (i=0 ; i<512 ; i++) {
                ind_block[i] = zone;
                if (!NEXT_BAD)
                        goto end_bad;
        inode->i_zone[8] = dind = get_free_block();
        for (i=0 ; i<512 ; i++) {
                write_block(ind,(char *) ind_block);
                dind_block[i] = ind = get_free_block();
                for (j=0 ; j<512 ; j++) {
                        ind_block[j] = zone;
                        if (!NEXT_BAD)
                                goto end_bad;
        die("too many bad blocks");
        if (ind)
                write_block(ind, (char *) ind_block);
        if (dind)
                write_block(dind, (char *) dind_block);

void make_root_inode(void)
        struct d_inode * inode = &Inode[ROOT_INO];

        inode->i_zone[0] = get_free_block();
        inode->i_nlinks = 2;
        inode->i_time = time(NULL);
        if (badblocks)
                inode->i_size = 48;
                inode->i_size = 32;
        inode->i_mode = S_IFDIR + 0755;

void setup_tables(void)
        int i;

        ZONESIZE = 0;
        MAXSIZE = (7+512+512*512)*1024;
        ZONES = BLOCKS;
/* some magic nrs: 1 inode / 3 blocks */
        INODES = BLOCKS/3;
/* I don't want some off-by-one errors, so this hack... */
        if ((INODES & 8191) > 8188)
                INODES -= 5;
        if ((INODES & 8191) < 10)
                INODES -= 20;
        ZMAPS = 0;
        for (i = FIRSTZONE ; i<ZONES ; i++)
        for (i = ROOT_INO ; i<INODES ; i++)
        inode_buffer = malloc(INODE_BUFFER_SIZE);
        if (!inode_buffer)
                die("Unable to allocate buffer for inodes");
        printf("%d inodes\n",INODES);
        printf("%d blocks\n",ZONES);
        printf("Firstdatazone=%d (%d)\n",FIRSTZONE,NORM_FIRSTZONE);

void check_blocks(void)
        unsigned int current_block=0;
        int try,got;
        static char buffer[BLOCK_SIZE * TEST_BUFFER_BLOCKS];

        while (current_block < ZONES) {
                if (lseek(DEV,current_block*BLOCK_SIZE,SEEK_SET) !=
                        die("seek failed in check_blocks");
                try = TEST_BUFFER_BLOCKS;
                if (current_block + try > ZONES)
                        try = ZONES-current_block;
                got = read(DEV, buffer, try * BLOCK_SIZE);
                if (got<0)
                        got = 0;
                if (got & (BLOCK_SIZE-1))
                        printf("Weird values in check_blocks: probably bugs\n");
                got /= BLOCK_SIZE;
                current_block += got;
                if (got == try)
                if (current_block < FIRSTZONE)
                        die("bad blocks before data-area: cannot make fs");
        if (badblocks)
                printf("%d bad block%s\n",badblocks,(badblocks>1)?"s":"");

int main(int argc, char ** argv)
        char * tmp;
        struct stat statbuf;

        if (argc && *argv)
                program_name = *argv;
                die("bad inode size");
        while (argc-- > 1) {
                if (argv[0][0] != '-')
                        if (device_name) {
                                BLOCKS = strtol(argv[0],&tmp,0);
                                if (*tmp)
                        } else
                                device_name = argv[0];
                else while (*++argv[0])
                        switch (argv[0][0]) {
                                case 'c': check=1; break;
                                default: usage();
        if (!device_name || BLOCKS<10 || BLOCKS > 65536)
        DEV = open(device_name,O_RDWR);
        if (DEV<0)
                die("unable to open %s");
        if (fstat(DEV,&statbuf)<0)
                die("unable to stat %s");
        if (!S_ISBLK(statbuf.st_mode))
        else if (statbuf.st_rdev == 0x0300 || statbuf.st_rdev == 0x0305)
                die("Will not try to make filesystem on '%s'");
        if (check)
        return 0;

Original post in KCLUG archives

Subject: weekly (?) answers, bugreports etc
Date: Sat, 30 Nov 1991 04:46:48 +0200
From: Linus Benedict Torvalds <> (Nicholas Yue):
> G'day,
> How do I mount the 2nd hard-disk (automagically ;-). The boot floppy can
> be configured to mount the root file system form /dev/hdX

Minix does this in /etc/rc, but as linux currently ignores that, the
best way is to do it in your .profile (or /etc/.profile). You migh want
to use 'mount /dev/hdX /home &> /dev/null' so that eventual multiple
mounts won't print error messages. Likewise you can unmount in .logout,
but unmounting isn't really necessary (but do remeber to sync).

> kermit works, but dies due to ^C. What's wrong? It also complains
> about not being able to lock the line.

This /seems/ to be standard behaviour of unix-kermit, and it is
certainly not of my doing. It's a nuisance. Line-locking is done by
creating a file in the directory /usr/spool/uucp/LCK, and unless that
directory exists, kermit isn't able to lock it.

Then to bug-reports and updates:

hd.c is buggy, and I'm investigating it. When read-errors occur, weird
things can happen, including writing to the disk. This might be the
cause of some peoples problems: there is no problem if you have a
sector-translating controller (eg IDE etc) that never returns errors. I
think I've gotten it working, and hopefully the 0.11 version (due out in
about a week) will be correct.

0.11 will also finally be totally self-sustaining: I have gotten the
source to bruce evans' assembler and linker, and at least I haven't
heard of many problems with mkfs and fsck. I didn't have time to
implement symlinks, so there are no real new features: just bug-fixes
and enhancements. Thanks to everybody who sent diffs etc. You know who
you are, and I've tried to accnowledge everyone in the source. Wolfgang
XXXX, who made the German keyboard patch, please mail me your last name.

Known bugs still unresolved: at least one machine has trouble reading
the floppy, and one 486 seems to have problems with the harddisk even
with my new patches. Another machine seems to get divide by zero
errors, and I have absolutely no idea why this happens. As it looks
now, these won't be corrected in 0.11 unless I can find the reason for
them within the week :-(


Original post in KCLUG archives

Subject: last call for diffs for 0.11
Date: Tue, 3 Dec 1991 13:57:58 +0200
From: Linus Benedict Torvalds <>

 as the subject says, this is the last call for diffs for the 0.11
kernel. If you have bug-fixes or enhancements, I'll have to get them
before friday (6.12.91) in order for them to find their way into the new
kernel. I'll do the "last rites" for the new kernel during the weekend,
and put it out for ftp after that.

Changes between 0.10 and 0.11:

- fixed bugs in block-device drivers: floppies still have problems when
accessing 2 floppies at the same time, but otherwise everything seems to

- german keyboard (thiel)

- console beeping (jtkohl).

- corrected owner checks, #!-recognition in execve (tytso)

- sticky directories (both me and tytso)

- demand-loading

- page-sharing between all processes.

I doubt demand-loading makes anything any faster, but it made
page-sharing possible, so it was "a good thing". Page sharing means that
when executing a new image, the pages aren't loaded from disk if some
other process has them. Especially on a multi-user setup (when we get
the init/login), this will speed things up and save memory.

I'll also release the bruce evans 86-assembler binaries at about the
same time as 0.11, as well as a new root-disk with the new system
binaries (mkfs, fsck and fdisk). Fdisk doesn't do anything, it just
checks the partition table and prints out the partitions.


Original post in KCLUG archives

Subject: linux-0.11 available
Date: Sun, 8 Dec 1991 17:51:24 +0200
From: Linus Benedict Torvalds <>

The subject says it all: I have uploaded linux version 0.11 to and tupac-amaru. They won't show up for a while on nic,
but are already visible in pub/msdos/replace/incoming at amaru. rtx-11
is so slow to use from here that I didn't upload them there: I guess
they'll show up within a couple of days (tytso?).

The files uploaded were:
        bootimage.Z - US keyboard compressed bootimage
        rootimage.Z - 1200kB compressed root image
        linux-0.11.tar.Z - sources
        as86.tar.Z - linux binaries for bruce evans'
                                  16-bit assembler and loader.
        INSTALL-0.11 - updated install-info

This version has a lot of corrections, and is stable at least on my
machine. I /hope/ every known bug is fixed, but no promises (and all
unknown bugs are still there, probably with reinforcements ;-). Those
who like to use caps lock as a ctrl-key, you'll have to re-patch the
kernel. It's not implemented in the standard version.


PS. I'll be a bit busy with the #"$/% physics-course I'm taking, so I
might not be as active on the net this coming week as I would like to.

PPS. corsini: the problem you have with the recompiled uemacs sounds
like it isn't resetting the ISIG bit in c_lflags when moving to raw
mode. Search for c_lflags in the source: it should effectively be set to
zero (I think) - no signals, no canonical mode etc.

Original post in KCLUG archives

Subject: VM, version 0.12
Date: Thu, 19 Dec 1991 19:51:45 +0200
From: Linus Benedict Torvalds <>

                  / \
                 / \
                 / \ Seasons Greetings
                 / \

Ho, ho ho, and a happy X-mas/chanukah/whatever to you all. I'm probably
mailing to a lot of non-listening mail-boxes, but who cares.

This is a warning for all you out there making changes to the linux
kernel: if you want your changes to be in 0.12, I want them by early
January (5th-10th ta the latest). As it looks now, 0.12 will be out
about 15th of January, and will contain at least these new things:

- POSIX job control (by tytso, alpha-release available already)
- VM (by me - I'll probably make alphas available after X-mas)
- Various small corrections (by me, tytso, jtkohl, drew etc)
- Anything else people send me.

I got VM working today (not bad in two days if I may say so :-), but
haven't really tested extensively. I tried some compilations (I remade
uemacs) on a 2M machine (or rather a 8M machine, of which Linux sees
only 2M), and it worked (gcc, make, bash etc in memory ar the same
time), albeit slowly. There are probably still problems, but it seems
VM will definitely be in 0.12.

Note that the earlier I get your fixes, the easier it will be to
implement them all: if I get many fixes 0.12 may be a little late, so
the January 15th date isn't really fixed. Also, after releasing 0.12
I'll probably have to study a bit harder than I did this autumn (which
isn't hard per se :-), which may mean that the new releases won't be
coming once per month or so any more. Hopefully 0.12 will be good
enough to use.

        Linus "Ugly X-mas trees are my speciality" Torvalds

Original post in KCLUG archives

Subject: virtual consoles working.
Date: Mon, 23 Dec 1991 17:00:15 PST
From: pmacdona@sol.UVic.CA (Peter MacDonald)

Hi and merry Xmas.

This note is coming to you from the virtual console of Linux.
Yep. I have virtual consoles working under linux.

Although this is based upon Gordon Irlams minix patches, virtually
no code from there was actually used. This is more a product of
minix's message passing kernel being so different from Linux's
unified approach than by design. But I am trying to adapt
as much of his setterm program as possible, so that a user interface
for setting colors and the like is available. To get around the
problem of no init/login I am using the "doshell" program
posted here earlier. Actually, for standalone machines I
think I prefer it over getty/login.

I will post the patches to 0.11 as soon as I have tested a little
more, and had a chance to bundle it up.

I also have done all of the design and coding, but none of the
testing on a select call, adapted from Mathius Lauttiners design.
But as Proven has requested, I will probably wait until after 0.12
is out before going any further with that. Getting a peek at your
VFS patches early, thought might help.

It's funny how things work out. I was working on select, started
eyeing how they might interact with pty's, and realized that
virtual consoles would probably still be desirable after ptys,
as well as being easier to do.

Anyways, have a good christmas all. I am heading to the ski slopes
so I know I'll have fun. Hope you do to.

Original post in KCLUG archives