diff --git a/en_US.ISO8859-1/articles/fonts/article.sgml b/en_US.ISO8859-1/articles/fonts/article.sgml
index d51ac5b7d1..b1629c70c7 100644
--- a/en_US.ISO8859-1/articles/fonts/article.sgml
+++ b/en_US.ISO8859-1/articles/fonts/article.sgml
@@ -1,980 +1,980 @@
-
+
%man;
]>
Fonts and FreeBSDA TutorialDaveBodenstabimdave@synet.netWed Aug 7, 1996This document contains a description of the various font
files that may be used with FreeBSD and the syscons driver,
X11, Ghostscript and Groff. Cookbook examples are provided
for switching the syscons display to 80x60 mode, and for using
type 1 fonts with the above application programs.IntroductionThere are many sources of fonts available, and one might ask
how they might be used with FreeBSD. The answer can be found by
carefully searching the documentation for the component that one
would like to use. This is very time consuming, so this
tutorial is an attempt to provide a shortcut for others who
might be interested.Basic terminologyThere are many different font formats and associated font
file suffixes. A few that will be addressed here are:
- .pfa>, .pfb>
+ .pfa, .pfbPostscript type 1 fonts. The
.pfa is the
Ascii form and
.pfb the Binary
form.
- .afm>
+ .afmThe font metrics associated with a type 1 font.
- .pfm>
+ .pfmThe printer font metrics associated with a type 1
font.
- .ttf>
+ .ttfA TrueType font
- .fot>
+ .fotAn indirect reference to a TrueType font (not an
actual font)
- .fon>, .fnt>
+ .fon, .fntBitmapped screen fontsThe .fot file is used by Windows as
sort of a symbolic link to the actual TrueType font
(.ttf) file. The .fon
font files are also used by Windows. I know of no way to use
this font format with FreeBSD.What font formats can I use?Which font file format is useful depends on the application
being used. FreeBSD by itself uses no fonts. Application
programs and/or drivers may make use of the font files. Here is
a small cross reference of application/driver to the font type
suffixes:Driversyscons
- .fnt>
+ .fntApplicationGhostscript.pfa,
.pfb,
.ttfX11.pfa,
.pfbGroff.pfa,
.afmPovray.ttfThe .fnt suffix is used quite
frequently. I suspect that whenever someone wanted to create a
specialized font file for their application, more often than not
they chose this suffix. Therefore, it is likely that files with
this suffix are not all the same format; specifically, the
.fnt files used by syscons under FreeBSD
may not be the same format as a .fnt file
one encounters in the MSDOS/Windows environment. I have not
made any attempt at using other .fnt files
other than those provided with FreeBSD.Setting a virtual console to 80x60 line modeFirst, an 8x8 font must be loaded. To do this,
/etc/rc.conf should contain the
line (change the font name to an appropriate one for
your locale):font8x8="iso-8x8" # font 8x8 from /usr/share/syscons/fonts/* (or NO).
The command to actually switch the mode is
&man.vidcontrol.1:bash$ vidcontrol VGA_80x60Various screen orientated programs, such as &man.vi.1, must
be able to determine the current screen dimensions. As this is
achieved this through ioctl calls to the console
driver (such as &man.syscons.4) they will correctly determine the new
screen dimensions.To make this more seamless, one can embed these commands in
the startup scripts so it takes place when the system boots.
To do this is add this line to /etc/rc.confallscreens_flags="VGA_80x60" # Set this vidcontrol mode for all virtual screens
References: &man.rc.conf.5;, &man.vidcontrol.1;.Using type 1 fonts with X11X11 can use either the .pfa or the
.pfb format fonts. The X11 fonts are
located in various subdirectories under
/usr/X11R6/lib/X11/fonts. Each font file
is cross referenced to its X11 name by the contents of the
fonts.dir file in each directory.
- There is already a directory named Type1>. The
+ There is already a directory named Type1. The
most straight forward way to add a new font is to put it into
this directory. A better way is to keep all new fonts in a
separate directory and use a symbolic link to the additional
font. This allows one to more easily keep track of ones fonts
without confusing them with the fonts that were originally
provided. For example:Create a directory to contain the font files>
bash$ mkdir -p /usr/local/share/fonts/type1>
bash$ cd /usr/local/share/fonts/type1>
Place the .pfa, .pfb and .afm files here>
One might want to keep readme files, and other documentation>
for the fonts here also>
bash$ cp /cdrom/fonts/atm/showboat/showboat.pfb .>
bash$ cp /cdrom/fonts/atm/showboat/showboat.afm .>
Maintain an index to cross reference the fonts>
bash$ echo showboat - InfoMagic CICA, Dec 1994, /fonts/atm/showboat >>INDEX>
Now, to use a new font with X11, one must make the font file
available and update the font name files. The X11 font names
look like:-bitstream-charter-medium-r-normal-xxx-0-0-0-0-p-0-iso8859-1
| | | | | | | | | | | | \ \
| | | | | \ \ \ \ \ \ \ +----+- character set
| | | | \ \ \ \ \ \ \ +- average width
| | | | \ \ \ \ \ \ +- spacing
| | | \ \ \ \ \ \ +- vertical res.
| | | \ \ \ \ \ +- horizontal res.
| | | \ \ \ \ +- points
| | | \ \ \ +- pixels
| | | \ \ \
foundry family weight slant width additional style
A new name needs to be created for each new font. If you
have some information from the documentation that accompanied
the font, then it could serve as the basis for creating the
name. If there is no information, then you can get some idea by
using &man.strings.1; on the font file. For example:bash$ strings showboat.pfb | more>
%!FontType1-1.0: Showboat 001.001
%%CreationDate: 1/15/91 5:16:03 PM
%%VMusage: 1024 45747
% Generated by Fontographer 3.1
% Showboat
1991 by David Rakowski. Alle Rechte Vorbehalten.
FontDirectory/Showboat known{/Showboat findfont dup/UniqueID known{dup
/UniqueID get 4962377 eq exch/FontType get 1 eq and}{pop false}ifelse
{save true}{false}ifelse}{false}ifelse
12 dict begin
/FontInfo 9 dict dup begin
/version (001.001) readonly def
/FullName (Showboat) readonly def
/FamilyName (Showboat) readonly def
/Weight (Medium) readonly def
/ItalicAngle 0 def
/isFixedPitch false def
/UnderlinePosition -106 def
/UnderlineThickness 16 def
/Notice (Showboat
1991 by David Rakowski. Alle Rechte Vorbehalten.) readonly def
end readonly def
/FontName /Showboat def
--stdin--
Using this information, a possible name might be:-type1-Showboat-medium-r-normal-decorative-0-0-0-0-p-0-iso8859-1
The components of our name are:FoundryLets just name all the new fonts
- type1>.
+ type1.FamilyThe name of the font.WeightNormal, bold, medium, semibold, etc. From the
- strings>1>>
+ strings1
output above, it appears that this font has a weight of
medium.Slantroman, italic, oblique, etc. Since the
ItalicAngle is zero,
roman will be used.WidthNormal, wide, condensed, extended, etc. Until it can
be examined, the assumption will be
normal.Additional styleUsually omitted, but this will indicate that the font
contains decorative capital letters.Spacingproportional or monospaced.
Proportional is used since
isFixedPitch is false.All of these names are arbitrary, but one should strive to
be compatible with the existing conventions. A font is
referenced by name with possible wild cards by an X11 program,
so the name chosen should make some sense. One might begin by
simply using
…-normal-r-normal-…-p-…
as the name, and then use
- xfontsel>1>> to
+ xfontsel1 to
examine it and adjust the name based on the appearance of the
font.So, to complete our example:Make the font accessible to X11>
bash$ cd /usr/X11R6/lib/X11/fonts/Type1>
bash$ ln -s /usr/local/share/fonts/type1/showboat.pfb .>
Edit fonts.dir and fonts.scale, adding the line describing the font
and incrementing the number of fonts which is found on the first line.>
bash$ ex fonts.dir
:1p
25
:1c
26
.
:$a
showboat.pfb -type1-showboat-medium-r-normal-decorative-0-0-0-0-p-0-iso8859-1
.
:wq>
fonts.scale> seems to be identical to fonts.dir>…>
bash$ cp fonts.dir fonts.scale>
Tell X11 that things have changed>
bash$ xset fp rehash>
Examine the new font>
bash$ xfontsel -pattern -type1-*>
References: &man.xfontsel.1;, &man.xset.1;, The X
- Windows System in a Nutshell>, , O'Reilly &
Associates.Using type 1 fonts with Ghostscript
- Ghostscript references a font via its Fontmap>
+ Ghostscript references a font via its Fontmap
file. This must be modified in a similar way to the X11
fonts.dir file. Ghostscript can use either
the .pfa or the .pfb
format fonts. Using the font from the previous example, here is
how to use it with Ghostscript:Put the font in Ghostscript's font directory>
bash$ cd /usr/local/share/ghostscript/fonts>
bash$ ln -s /usr/local/share/fonts/type1/showboat.pfb .>
Edit Fontmap so Ghostscript knows about the font>
bash$ cd /usr/local/share/ghostscript/4.01>
bash$ ex Fontmap
:$a
/Showboat (showboat.pfb) ; % From CICA /fonts/atm/showboat
.
:wq>
Use Ghostscript to examine the font>
bash$ gs prfont.ps>
Aladdin Ghostscript 4.01 (1996-7-10)
Copyright (C) 1996 Aladdin Enterprises, Menlo Park, CA. All rights
reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Loading Times-Roman font from /usr/local/share/ghostscript/fonts/tir_____.pfb...
/1899520 581354 1300084 13826 0 done.
GS>Showboat DoFont>
Loading Showboat font from /usr/local/share/ghostscript/fonts/showboat.pfb...
1939688 565415 1300084 16901 0 done.
>>showpage, press <return> to continue<<
>>showpage, press <return> to continue<<
>>showpage, press <return> to continue<<
GS>quit>
References: fonts.txt in the
Ghostscript 4.01 distributionUsing type 1 fonts with GroffNow that the new font can be used by both X11 and
Ghostscript, how can one use the new font with groff? First of
all, since we are dealing with type 1 postscript fonts, the
groff device that is applicable is the ps
device. A font file must be created for each font that groff
can use. A groff font name is just a file in
/usr/share/groff_font/devps. With our
example, the font file could be
/usr/share/groff_font/devps/SHOWBOAT. The
file must be created using tools provided by groff.
- The first tool is afmtodit>. This is not
+ The first tool is afmtodit. This is not
normally installed, so it must be retrieved from the source
distribution. I found I had to change the first line of the
file, so I did:bash$ cp /usr/src/gnu/usr.bin/groff/afmtodit/afmtodit.pl /tmp>
bash$ ex /tmp/afmtodit.pl
:1c
#!/usr/bin/perl -P-
.
:wq>
This tool will create the groff font file from the metrics
file (.afm suffix.) Continuing with our
example:Many .afm> files are in Mac format&hellip ^M delimited lines
We need to convert them to unix style ^J delimited lines>
bash$ cd /tmp>
bash$ cat /usr/local/share/fonts/type1/showboat.afm |
tr '\015' '\012' >showboat.afm>
Now create the groff font file>
bash$ cd /usr/share/groff_font/devps>
bash$ /tmp/afmtodit.pl -d DESC -e text.enc /tmp/showboat.afm generate/textmap SHOWBOAT>
The font can now be referenced with the name
SHOWBOAT.If ghostscript is used to drive the printers on the system,
then nothing more needs to be done. However, if true postscript
printers are used, then the font must be down loaded to the
printer in order for the font to be used (unless the printer
happens to have the showboat font built in or on an accessible
font disk.) The final step is to create a down loadable font.
- The pfbtops> tool is used to create the
+ The pfbtops tool is used to create the
.pfa format of the font, and the
- download> file is modified to reference the new
- font. The download> file must reference the
+ download file is modified to reference the new
+ font. The download file must reference the
internal name of the font. This can easily be determined from
the groff font file as illustrated:Create the .pfa> font file>
bash$ pfbtops /usr/local/share/fonts/type1/showboat.pfb >showboat.pfa>
Of course, if the .pfa file is already
available, just use a symbolic link to reference it.Get the internal font name>
bash$ fgrep internalname SHOWBOAT>
internalname Showboat
Tell groff that the font must be down loaded>
bash$ ex download
:$a
Showboat showboat.pfa
.
:wq>
To test the font:bash$ cd /tmp>
bash$ cat >example.t <<EOF
.sp 5
.ps 16
This is an example of the Showboat font:
.br
.ps 48
.vs (\n(.s+2)p
.sp
.ft SHOWBOAT
ABCDEFGHI
.br
JKLMNOPQR
.br
STUVWXYZ
.sp
.ps 16
.vs (\n(.s+2)p
.fp 5 SHOWBOAT
.ft R
To use it for the first letter of a paragraph, it will look like:
.sp 50p
\s(48\f5H\s0\fRere is the first sentence of a paragraph that uses the
showboat font as its first letter.
Additional vertical space must be used to allow room for the larger
letter.
EOF>
bash$ groff -Tps example.t >example.ps>
To use ghostscript/ghostview>
bash$ ghostview example.ps>
To print it>
bash$ lpr -Ppostscript example.ps>
References:
/usr/src/gnu/usr.bin/groff/afmtodit/afmtodit.man,
&man.groff.font.5;, &man.groff.char.7;, &man.pfbtops.1;.Converting TrueType fonts to a groff/postscript format for
groffThis potentially requires a bit of work, simply because it
depends on some utilities that are not installed as part of the
base system. They are:ttf2pfTrueType to postscript convertsion utilities. This
allows conversion of a TrueType font to an ascii font
metric (.afm) file.Currently available at http://sunsite.icm.edu.pl/pub/GUST/contrib/BachoTeX98/ttf2pf.
Note: These files are postscript programs and must be
downloaded to disk by holding down the
Shift key when clicking on the link.
Otherwise, your browser may try to launch
ghostview to view them.The files of interest are:
- GS_TTF.PSGS_TTF.PSPF2AFM.PSttf2pf.psThe funny upper/lower case is due to their being
intended also for DOS shells.
ttf2pf.ps makes use of the others as
upper case, so any renaming must be consistent with this.
(Actually, GS_TTF.PS and
PFS2AFM.PS are supposedly part of the
ghostscript distribution, but it's just as easy to use
these as an isolated utility. FreeBSD doesn't seem to
include the latter.) You also may want to have these
installed to
/usr/local/share/groff_font/devps(?).afmtoditCreates font files for use with groff from ascii font
metrics file. This usually resides in the directory,
/usr/src/contrib/groff/afmtodit, and
requires some work to get going. If you're paranoid about working in the
/usr/src tree, simply copy the
contents of the above directory to a work
location.In the work area, you'll need to make the utility.
Just type:#make -f Makefile.sub afmtoditYou may also need to copy
/usr/contrib/groff/devps/generate/textmap
to
/usr/share/groff_font/devps/generate
if it doesn't already exist.Once all these utilities are in place, you're ready to
commence:Create the .afm file by
typing:%gs -dNODISPLAY-q -- ttf2pf.ps TTF_namePS_font_nameAFM_nameWhere, TTF_name is your
TrueType font file, PS_font_name
is the file name for the .pfa file,
AFM_name is the name you wish for
the .afm file. If you do not specify
output file names for the .pfa or
.afm files, then default names will be
generated from the TrueType font file name.This also produces a .pfa file, the
ascii postscript font metrics file
(.pfb is for the binrary form). This
won't be needed, but could (I think) be useful for a
fontserver.For example, to convert the 30f9 Barcode font using the
default file names, use the following command:%gs -dNODISPLAY -- ttf2pf.ps 3of9.ttf
Aladdin Ghostscript 5.10 (1997-11-23)
Copyright (C) 1997 Aladdin Enterprises, Menlo Park, CA. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Converting 3of9.ttf to 3of9.pfa and 3of9.afm.
If you want the converted fonts to be stored in
A.pfa and B.afm,
then use this command:%gs -dNODISPLAY -- ttf2pf.ps 3of9.ttf A B
Aladdin Ghostscript 5.10 (1997-11-23)
Copyright (C) 1997 Aladdin Enterprises, Menlo Park, CA. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Converting 3of9.ttf to A.pfa and B.afm.
Create the groff postscript file:Change directories to
/usr/share/groff_font/devps so as to
make the following command easier to execute. You'll
probably need root priviledges for this. (Or, if you're
paranoid about working there, make sure you reference the
files DESC,
text.enc and
generate/textmap as being in this
directory.)%afmtodit -d DESC -e text.enc file.afm \
generate/textmap PS_font_nameWhere, file.afm is the
AFM_name created by
ttf2pf.ps above, and
PS_font_name is the font name
used from that command, as well as the name that
&man.groff.1; will use for references to this font. For
example, assuming you used the first
tiff2pf.ps command above, then the 3of9
Barcode font can be created using the command:%afmtodit -d DESC -e text.enc 3of9.afm \
generate/textmap 3of9Ensure that the resulting
PS_font_name file (e.g.,
3of9 in the example above) is located
in the directory
/usr/share/groff_font/devps by copying
or moving it there.Note that if ttf2pf.ps assigns a
font name using the one it finds in the TrueType font file
and you want to use a different name, you must edit the
.afm file prior to running
afmtodit. This name must also match the
one used in the Fontmap file if you wish to pipe
&man.groff.1; into &man.gs.1;.Can TrueType fonts be used with other programs?The TrueType font format is used by Windows, Windows 95, and
Mac's. It is quite popular and there are a great number of
fonts available in this format.Unfortunately, there are few applications that I am aware of
that can use this format: Ghostscript and Povray come to mind.
Ghostscript's support, according to the documentation, is
rudimentary and the results are likely to be inferior to type 1
fonts. Povray version 3 also has the ability to use TrueType
fonts, but I rather doubt many people will be creating documents
as a series of raytraced pages :-).This rather dismal situation may soon change. The FreeType Project is
currently developing a useful set of FreeType tools:The xfsft font server for X11 can
serve TrueType fonts in addition to regular fonts. Though
currently in beta, it is said to be quite useable. See
Juliusz
Chroboczek's page for further information.
Porting instructions for FreeBSD can be found at Stephen
Montgomery's software page.xfstt is another font server for X11,
available under
ftp://sunsite.unc.edu/pub/Linux/X11/fonts.A program called ttf2bdf can produce
BDF files suitable for use in an X environment from TrueType
files. Linux binaries are said to be available from ftp://crl.nmsu.edu/CLR/multiling/General/.For people requiring the use of Asian TrueType fonts,
the XTT font server may be worth a look.
Information about XTT can be found at
URL: http://hawk.ise.chuo-u.ac.jp/student/person/tshiozak/study/freebsd-at-random/x-tt/index-en.html.and others …The FreeType Projects
page is a good starting point for information on
these and other free TrueType projects.Where can additional fonts be obtained?Many fonts are available on the Internet. They are either
entirely free, or are share-ware. In addition, there are many
inexpensive CDROMs available that contain many fonts. Some
Internet locations (as of August 1996) are:ftp://ftp.winsite.com
(Formerly CICA)http://www.simtel.net/simcgi-bin/dosfind.cgiftp://ftp.coast.net/http://af-pc-plloyd.ecel.uwa.edu.au/fonts/index.htmlhttp://www.esselte.com/letraset/index.htmlhttp://www.inil.com/users/elfring/esf.htmAdditional questionsWhat use are the .pfm files?Can one generate the .afm file from
a .pfa or
.pfb?How to generate the groff character mapping files for
postscript fonts with non-standard character names?Can xditview and devX?? devices be setup to access all
the new fonts?It would be good to have examples of using TrueType
fonts with povray and ghostscript.
diff --git a/en_US.ISO8859-1/articles/formatting-media/article.sgml b/en_US.ISO8859-1/articles/formatting-media/article.sgml
index 0adc30c341..6708d35396 100644
--- a/en_US.ISO8859-1/articles/formatting-media/article.sgml
+++ b/en_US.ISO8859-1/articles/formatting-media/article.sgml
@@ -1,603 +1,603 @@
%man;
]>
-
+
Formatting Media For Use With FreeBSD 2.2-RELEASEA TutorialDougWhitedwhite@resnet.uoregon.eduMarch 1997This document describes how to slice, partition, and
format hard disk drives and similar media for use with
FreeBSD. The examples given have been tested under FreeBSD
2.2-GAMMA and may work for other releases.Introduction & DefinitionsOverviewSuccessfully adding disks to an existing system is the
mark of an experienced system administrator. Slicing,
partitioning, and adding disks requires a careful dance of
proper command and name syntax. One slipped finger and an
entire disk could disappear in seconds. This document is
written in an attempt to simplify this process and avoid
accidents. Thankfully, enhancements to existing tools
(notably sysinstall) have greatly improved this process in
recent releases of FreeBSD.There are two possible modes of disk formatting:compatibility mode: Arranging a
disk so that it has a slice table for use with other
operating systems.dangerously dedicated mode:
Formatting a disk with no slice table. This makes the
process of adding disks easier, however non-FreeBSD
operating systems may not accept the disk.For most cases, dedicated mode is the easiest to set up
and use in existing systems, as a new disk is usually
dedicated entirely to FreeBSD. However, compatibility mode
insures optimum interoperability with future installations at
a cost of increased complexity.In addition to selecting the mode, two methods of slicing
the disk are available. One is using the system installation
tool /stand/sysinstall. 2.1.7-RELEASE and
later versions of sysinstall contain code
to ease setup of disks during normal system operation, mainly
allowing access to the Label and Partition editors and a Write
feature which will update just the selected disk and slice
without affecting other disks. The other method is running
the tools manually from a root command line. For dangerously
dedicated mode, only three or four commands are involved while
sysinstall requires some
manipulation.DefinitionsUNIX disk management over the centuries has invented many
new definitions for old words. The following glossary covers
the definitions used in this document and (hopefully) for
FreeBSD in general.compatibility mode: Arranging a disk so that it has a
slice table for use with other operating systems. Oppose
dangerously dedicated mode.dangerously dedicated mode: Formatting a disk with no
slice table. This makes the process of adding disks
easier, however non-FreeBSD operating systems may not
accept the disk. Oppose compatibility mode.disk: A circular disc, covered with magnetic or
similarly manipulable material, spun by a motor under a
head. Data is stored on the disk by changing the pattern
of magnetism on the disc, which can be later read. Hard
disks, CD-ROMs, Magneto-optical,and Zip/Jaz removables are
examples of disks.slice: A division of a disk. Up to four slices are
permitted on one disk in the PC standard. Slices are
composed of contiguous sectors. Slices are recorded in a
slice table used by the system BIOS to
locate bootable partitions. The slice table is usually
called the Partition Table in DOS parlance. Maintained by
the fdisk utility.partition: A division of a slice. Usually used in
reference to divisions of the FreeBSD slice of a disk.
Each filesystem and swap area on a disk resides in a
partition. Maintained using the disklabel utility.sector: Smallest subdivision of a disk. One sector
usually represents 512 bytes of data.Warnings & PitfallsBuilding disks is not something to take lightly. It is
quite possible to destroy the contents of other disks in your
system if the proper precautions are not taken.
- Check your work carefully.> It is very simple
+ Check your work carefully. It is very simple
to destroy the incorrect disk when working with these
commands. When in doubt consult the kernel boot output for
the proper device.Needless to say, we are not responsible for any damage to
any data or hardware that you may experience. You work at
your own risk!Zip, Jaz, and Other RemovablesRemovable disks can be formatted in the same way as normal
hard disks. It is essential to have the disk drive connected
to the system and a disk placed in the drive during startup,
so the kernel can determine the drive's geometry. Check the
dmesg output and make sure your device and
the disk's size is listed. If the kernel reports
Can't get the size
then the disk was not in the drive. In this case, you will
need to restart the machine before attempting to format
disks.Formatting Disks in Dedicated ModeIntroductionThis section details how to make disks that are totally
dedicated to FreeBSD. Remember, dedicated mode disks cannot
be booted by the PC architecture.Making Dedicated Mode Disks using Sysinstall/stand/sysinstall, the system
installation utility, has been expanded in recent versions to
make the process of dividing disks properly a less tiring
affair. The fdisk and disklabel editors built into sysinstall
are GUI tools that remove much of the confusion from slicing
disks. For FreeBSD versions 2.1.7 and later, this is perhaps
the simplest way to slice disks.Start sysinstall as root by typing
&prompt.root; /stand/sysinstall
from the command prompt.Select Index.Select Partition.Select the disk to edit with arrow keys and
SPACE.If you are using this entire disk for FreeBSD, select
A.When asked:
Do you want to do this with a true partition entry so as to remain
cooperative with any future possible operating systems on the
drive(s)?
answer No.When asked if you still want to do this, answer
Yes.Select Write.When warned about Writing on installed systems, answer
Yes.Quitthe FDISK Editor and
ESCAPE back to the Index menu.Select Label from the Index
menu.Label as desired. For a single partition, enter
C to Create a partition, accept the
default size, partition type Filesystem, and a mountpoint
(which isn't used).Enter W when done and confirm to
continue. The filesystem will be newfs'd for you, unless
you select otherwise (for news partitions you'll want to
do this!). You'll get the error:
Error mounting /mnt/dev/wd2s1e on /mnt/blah : No such file or directory
Ignore.Exit out by repeatedly pressing
ESCAPE.Making Dedicated Mode Disks Using the Command LineExecute the following commands, replacing wd2 with the
disk name.&prompt.root; dd if=/dev/zero of=/dev/rwd2 count=2
&prompt.root; disklabel /dev/rwd2 | disklabel -B -R -r wd2 /dev/stdinWe only want one partition, so using slice 'c' should be fine:
&prompt.root; newfs /dev/rwd2cIf you need to edit the disklabel to create multiple
partitions (such as swap), use the following: &prompt.root; dd if=/dev/zero of=/dev/rwd2 count=2
&prompt.root; disklabel /dev/r$d > /tmp/labelEdit disklabel to add partitions:
&prompt.root; vi /tmp/label
&prompt.root; disklabel -B -R -r wd2 /tmp/labelnewfs partitions appropriatelyYour disk is now ready for use.Making Compatibility Mode DisksIntroductionThe command line is the easiest way to make dedicated
disks, and the worst way to make compatibility disks. The
command-line fdisk utility requires higher math skills and an
in-depth understanding of the slice table, which is more than
most people want to deal with. Use sysinstall for
compatibility disks, as described below.Making Compatibility Mode Disks Using SysinstallStart sysinstall as root by typing
&prompt.root; /stand/sysinstall>
from the command prompt.Select Index.Select Partition.Select the disk to edit with arrow keys and
SPACE.If you are using this entire disk for FreeBSD, select
A.When asked:
Do you want to do this with a true partition entry so as to remain
cooperative with any future possible operating systems on the
drive(s)?
answer yes.Select Write.When asked to install the boot manager, select None
with SPACE then hit
ENTER for OK.Quit the FDISK Editor.You'll be asked about the boot manager, select
None again. Select Label from the Index
menu.Label as desired. For a single partition, accept the
default size, type filesystem, and a mountpoint (which
isn't used).The filesystem will be newfs'd for you, unless you
select otherwise (for news partitions you'll want to do
this!). You'll get the error:
Error mounting /mnt/dev/wd2s1e on /mnt/blah : No such file or directory
Ignore.Exit out by repeatedly pressing
ESCAPE.Your new disk is now ready for use.Other Disk OperationsAdding Swap SpaceAs a system grows, it's need for swap space can also grow.
Although adding swap space to existing disks is very
difficult, a new disk can be partitioned with additional swap
space.To add swap space when adding a disk to a system:When partitioning the disk, edit the disklabel and
allocate the amount of swap space to add in partition `b'
and the remainder in another partition, such as `a' or
`e'. The size is given in 512 byte blocks.When newfsing the drive, do NOT newfs the `c'
partition. Instead, newfs the partition where the
non-swap space lies.Add an entry to /etc/fstab as
follows:/dev/wd0b none swap sw 0 0
Change /dev/wd0b to the device of the newly added
space.To make the new space immediately available, use the
swapon command.
&prompt.root; swapon /dev/sd0b
swapon: added /dev/sd0b as swap space
Copying the Contents of DisksSubmitted By: Renaud Waldura
(renaud@softway.com) To move file from your original base disk to the fresh new
one, do:
&prompt.root; mount /dev/wd2 /mnt
&prompt.root; pax -r -w -p e /usr/home /mnt
&prompt.root; umount /mnt
&prompt.root; rm -rf /usr/home/*
&prompt.root; mount /dev/wd2 /usr/homeCreating Striped Disks using CCDCommands Submitted By: Stan Brown
(stanb@awod.com) The Concatenated Disk Driver, or CCD, allows you to treat
several identical disks as a single disk. Striping can result
in increased disk performance by distributing reads and writes
across the disks. See the &man.ccd.4; and &man.ccdconfig.8;
man pages or the CCD
Homepage for further details.To create a new CCD, execute the following commands. This
describes how to add three disks together; simply add or
remove devices as necessary. Remember that the disks to be
- striped must be identical.>
+ striped must be identical.Before executing these commands, make sure you add the line
pseudo-device ccd 4
to your kernel.&prompt.root; cd /dev ; sh MAKDEV ccd0
&prompt.root; disklabel -r -w sd0 auto
&prompt.root; disklabel -r -w sd1 auto
&prompt.root; disklabel -r -w sd2 auto
&prompt.root; disklabel -e sd0cchange type to 4.2BSD
&prompt.root; disklabel -e sd1cchange type to 4.2BSD
&prompt.root; disklabel -e sd2cchange type to 4.2BSD
&prompt.root; ccdconfig ccd0 32 0 /dev/sd0c /dev/sd1c /dev/sd2c
&prompt.root; newfs /dev/rccd0cNow you can mount and use your CCD by referencing device
/dev/ccd0c.CreditsThe author would like to thank the following individuals for
their contributions to this project:Darryl Okahata
(darrylo@hpnmhjw.sr.hp.com) for his simple
dedicated mode setup documentation which I have used
repeatedly on freebsd-questions.Jordan Hubbard (jkh@FreeBSD.org) for
making sysinstall useful for this type of task.John Fieber (jfieber@indiana.edu) for
making information and examples of the DocBook DTD on which
this document is based.Greg Lehey (grog@FreeBSD.org) for
checking my work and pointing out inaccuracies, as well as
miscellaneous support.
diff --git a/en_US.ISO8859-1/articles/mh/article.sgml b/en_US.ISO8859-1/articles/mh/article.sgml
index 9dfa488f0e..fef11739c2 100644
--- a/en_US.ISO8859-1/articles/mh/article.sgml
+++ b/en_US.ISO8859-1/articles/mh/article.sgml
@@ -1,782 +1,782 @@
-
+
An MH PrimerMattMidboematt@garply.comv1.0, 16 January 1996This document contains an introduction to using MH on
FreeBSDIntroductionMH started back in 1977 at the RAND Corporation, where the
initial philosophies behind MH were developed. MH isn't so much
a monolithic email program but a philosophy about how best to
develop tools for reading email. The MH developers have done a
- great job adhering to the KISS> principle: Keep It
+ great job adhering to the KISS principle: Keep It
Simple Stupid. Rather than have one large program for reading,
sending and handling email they have written specialized
programs for each part of your email life. One might liken MH to
the specialization that one finds in insects and nature. Each
tool in MH does one thing, and does it very well.Beyond just the various tools that one uses to handle their
email MH has done an excellent job keeping the configuration of
each of these tools consistent and uniform. In fact, if you are
not quite sure how something is supposed to work or what the
arguments for some command are supposed to be then you can
generally guess and be right. Each MH command is consistent
about how it handles reading the configuration files and how it
takes arguments on the command line. One useful thing to
remember is that you can always add a to
the command to have it display the options for that
command.The first thing that you need to do is to make sure that you
have installed the MH package on your FreeBSD machine. If you
installed from CDROM you should be able to execute the following
to load mh:
&prompt.root; pkg_add /cdrom/packages/mh-6.8.3.tgz>
- You will notice that it created a /usr/local/lib/mh>
+ You will notice that it created a /usr/local/lib/mh
directory for you as well as adding several binaries to the
- /usr/local/bin> directory. If you would prefer to
+ /usr/local/bin directory. If you would prefer to
compile it yourself then you can anonymous ftp it from ftp.ics.uci.edu or louie.udel.edu.This primer is not a full comprehensive explanation of how
MH works. This is just intended to get you started on the road
to happier, faster mail reading. You should read the man pages
for the various commands. Also you might want to read the comp.mail.mh newsgroup. Also
you can read the FAQ
for MH. The best resource for MH is the O'Reilly and
Associates book written by Jerry Peek.Reading Mail
- This section covers how to use inc>,
- show>, scan>, next>,
- prev>, rmm>, rmf>, and
- msgchk>. One of the best things about MH is the
+ This section covers how to use inc,
+ show, scan, next,
+ prev, rmm, rmf, and
+ msgchk. One of the best things about MH is the
consistent interface between programs. A few things to keep in
mind when using these commands is how to specify message lists.
- In the case of inc> this doesn't really make any
- sense but with commands like show> it is useful to
+ In the case of inc this doesn't really make any
+ sense but with commands like show it is useful to
know. A message list can consist of something like 23
- 20 16> which will act on messages 23, 20 and 16. This is
+ 20 16 which will act on messages 23, 20 and 16. This is
fairly simple but you can do more useful things like
- 23-30> which will act on all the messages between
+ 23-30 which will act on all the messages between
23 and 30. You can also specify something like
- cur:10> which will act on the current message and
- the next 9 messages. The cur>, last>,
- and first> messages are special messages that refer
+ cur:10 which will act on the current message and
+ the next 9 messages. The cur, last,
+ and first messages are special messages that refer
to the current, last or first message in the folder.
- inc>, msgchk>—read in your
+ inc, msgchk—read in your
new email or check it
- If you just type in inc> and hit
- return> you will be well on your way to getting
- started with MH. The first time you run inc> it
+ If you just type in inc and hit
+ return you will be well on your way to getting
+ started with MH. The first time you run inc it
will setup your account to use all the MH defaults and ask you
about creating a Mail directory. If you have mail waiting to
be downloaded you will see something that looks like: 29 01/15 Doug White Re: Another Failed to boot problem<<On Mon, 15 J
30 01/16 "Jordan K. Hubbar Re: FBSD 2.1<<> Do you want a library instead of
31 01/16 Bruce Evans Re: location of bad144 table<<>> >It would appea
32 01/16 "Jordan K. Hubbar Re: video is up<<> Anyway, mrouted won't run, ev
33 01/16 Michael Smith Re: FBSD 2.1<<Nate Williams stands accused of sa
This is the same thing you will see from a
- scan> (see ). If you just run
- inc> with no arguments it will look on your
+ scan (see ). If you just run
+ inc with no arguments it will look on your
computer for email that is supposed to be coming to
you.A lot of people like to use POP for grabbing their email.
MH can do POP to grab your email. You will need to give
- inc> a few command line arguments.
+ inc a few command line arguments.&prompt.user; inc -host mail.pop.org -user username> -norpop>
- That tells inc> to go to
- mail.pop.org> to download your email, and that
- your username on their system is username>. The
- option tells inc> to use
+ That tells inc to go to
+ mail.pop.org to download your email, and that
+ your username on their system is username. The
+ option tells inc to use
plain POP3 for downloading your email. MH has support for a
few different dialects of POP. More than likely you will never
ever need to use them though. While you can do more complex
things with inc such as audit files and scan format files this
will get you going.
- The msgchk> command is used to get information
- on whether or not you have new email. msgchk> takes
+ The msgchk command is used to get information
+ on whether or not you have new email. msgchk takes
the same and
- options that inc> takes.
+ options that inc takes.
- show>, next> and
- prev>—displaying and moving through
+ show, next and
+ prev—displaying and moving through
email
- show> is to show a letter in your current
- folder. Like inc>, show> is a fairly
- straightforward command. If you just type show>
- and hit return> then it displays the current
+ show is to show a letter in your current
+ folder. Like inc, show is a fairly
+ straightforward command. If you just type show
+ and hit return then it displays the current
message. You can also give specific message numbers to
show:&prompt.user; show 32 45 56>
This would display message numbers 32, 45 and 56 right
after each other. Unless you change the default behavior
- show> basically just does a more> on the
+ show basically just does a more on the
email message.
- next> is used to move onto the next message and
- prev> will go to the previous message. Both
- commands have an implied show> command so that when
+ next is used to move onto the next message and
+ prev will go to the previous message. Both
+ commands have an implied show command so that when
you go to the next message it automatically displays
it.
- scan>—shows you a scan of your
+ scan—shows you a scan of your
messages
- scan> will display a brief listing of the
+ scan will display a brief listing of the
messages in your current folder. This is an example of what
- the scan> command will give you.
+ the scan command will give you. 30+ 01/16 "Jordan K. Hubbar Re: FBSD 2.1<<> Do you want a library instead of
31 01/16 Bruce Evans Re: location of bad144 table<<>> >It would appea
32 01/16 "Jordan K. Hubbar Re: video is up<<> Anyway, mrouted won't run, ev
33 01/16 Michael Smith Re: FBSD 2.1<<Nate Williams stands accused of sa
Like just about everything in MH this display is very
configurable. This is the typical default display. It gives
you the message number, the date on the email, the sender, the
subject line, and a sentence fragment from the very beginning
- of the email if it can fit it. The +> means that
+ of the email if it can fit it. The + means that
message is the current message, so if you do a
- show> it will display that message.
+ show it will display that message.One useful option for scan is the
option. This will list your messages
with the highest message number first and lowest message
- number last. Another useful option with scan> is to
+ number last. Another useful option with scan is to
have it read from a file. If you want to scan your incoming
- mailbox on FreeBSD without having to inc> it you
+ mailbox on FreeBSD without having to inc it you
can do scan -file
- /var/mail/username>. This can be used
- with any file that is in the mbox> format.
+ /var/mail/username. This can be used
+ with any file that is in the mbox format.
- rmm> and rmf>—remove the
+ rmm and rmf—remove the
current message or folder
- rmm> is used to remove a mail message. The
+ rmm is used to remove a mail message. The
default is typically to not actually remove the message but to
rename the file to one that is ignored by the MH commands. You
will need to through periodically and physically delete the
- removed> messages.
+ removed messages.
- The rmf> command is used to remove folders.
+ The rmf command is used to remove folders.
This doesn't just rename the files but actually removes the
from the hard drive so you should be careful when you use this
command.A typical session of reading with MHThe first thing that you will want to do is
- inc> your new mail. So at a shell prompt just type
- in inc> and hit return>.
+ inc your new mail. So at a shell prompt just type
+ in inc and hit return.
&prompt.user; inc>
Incorporating new mail into inbox...
36+ 01/19 "Stephen L. Lange Request...<<Please remove me as contact for pind
37 01/19 Matt Thomas Re: kern/950: Two PCI bridge chips fail (multipl
38 01/19 "Amancio Hasty Jr Re: FreeBSD and VAT<<>>> Bill Fenner said: > In
&prompt.user;
This shows you the new email that has been added to your
- mailbox. So the next thing to do is show> the email
+ mailbox. So the next thing to do is show the email
and move around.&prompt.user; show>
Received: by sashimi.wwa.com (Smail3.1.29.1 #2)
id m0tdMZ2-001W2UC; Fri, 19 Jan 96 13:33 CST
Date: Fri, 19 Jan 1996 13:33:31 -0600 (CST)
From: "Stephen L. Lange" <stvlange@wwa.com>
To: matt@garply.com
Subject: Request...
Message-Id: <Pine.BSD.3.91.960119133211.824A-100000@sashimi.wwa.com>
Mime-Version: 1.0
Content-Type: TEXT/PLAIN; charset=US-ASCII
Please remove me as contact for pindat.com
&prompt.user; rmm>
&prompt.user; next>
Received: from localhost (localhost [127.0.0.1]) by whydos.lkg.dec.com (8.6.11/8
.6.9) with SMTP id RAA24416; Fri, 19 Jan 1996 17:56:48 GMT
Message-Id: <199601191756.RAA24416@whydos.lkg.dec.com>
X-Authentication-Warning: whydos.lkg.dec.com: Host localhost didn't use HELO pro
tocol
To: hsu@clinet.fi
Cc: hackers@FreeBSD.org
Subject: Re: kern/950: Two PCI bridge chips fail (multiple multiport ethernet
boards)
In-Reply-To: Your message of "Fri, 19 Jan 1996 00:18:36 +0100."
<199601182318.AA11772@Sysiphos>
X-Mailer: exmh version 1.5omega 10/6/94
Date: Fri, 19 Jan 1996 17:56:40 +0000
From: Matt Thomas <matt@lkg.dec.com>
Sender: owner-hackers@FreeBSD.org
Precedence: bulk
This is due to a typo in pcireg.h (to
which I am probably the guilty party).
- The rmm> removed the current message and the
- next> command moved me on to the next message. Now
+ The rmm removed the current message and the
+ next command moved me on to the next message. Now
if I wanted to look at ten most recent messages so I could
read one of them here is what I would do:&prompt.user; scan last:10>
26 01/16 maddy Re: Testing some stuff<<yeah, well, Trinity has
27 01/17 Automatic digest NET-HAPPENINGS Digest - 16 Jan 1996 to 17 Jan 19
28 01/17 Evans A Criswell Re: Hey dude<<>From matt@tempest.garply.com Tue
29 01/16 Karl Heuer need configure/make volunteers<<The FSF is looki
30 01/18 Paul Stephanouk Re: [alt.religion.scientology] Raw Meat (humor)<
31 01/18 Bill Lenherr Re: Linux NIS Solaris<<--- On Thu, 18 Jan 1996 1
34 01/19 John Fieber Re: Stuff for the email section?<<On Fri, 19 Jan
35 01/19 support@foo.garpl [garply.com #1138] parlor<<Hello. This is the Ne
37+ 01/19 Matt Thomas Re: kern/950: Two PCI bridge chips fail (multipl
38 01/19 "Amancio Hasty Jr Re: FreeBSD and VAT<<>>> Bill Fenner said: > In
&prompt.user;
Then if I wanted to read message number 27 I would do a
- show 27> and it would be displayed. As you can
+ show 27 and it would be displayed. As you can
probably tell from this sample session MH is pretty easy to
use and looking through emails and displaying them is fairly
intuitive and easy.Folders and Mail SearchingAnybody who gets lots of email definitely wants to be able
to prioritize, stamp, brief, de-brief, and number their emails
in a variety of different ways. MH can do this better than just
about anything. One thing that we haven't really talked about is
the concept of folders. You have undoubtedly come across the
folders concept using other email programs. MH has folders too.
MH can even do sub-folders of a folder. One thing you should
- keep in mind with MH is that when you ran inc> for
+ keep in mind with MH is that when you ran inc for
the first time and it asked you if it could create a
- Mail> directory it began storing everything in that
+ Mail directory it began storing everything in that
directory. If you look at that directory you will find a
- directory named inbox>. The inbox>
+ directory named inbox. The inbox
directory houses all of your incoming mail that hasn't been
thrown anywhere else.Whenever you create a new folder a new directory is going to
- be created underneath your MH Mail> directory, and
+ be created underneath your MH Mail directory, and
messages in that folder are going to be stored in that
directory. When new email comes in that new email is thrown
- into your inbox> directory with a file name that is
+ into your inbox directory with a file name that is
equivalent to the message number. So even if you didn't have
any of the MH tools to read your email you could still use
standard UNIX commands to munge around in those directories and
just more your files. It's this simplicity that really gives you
a lot of power with what you can do with your email.Just as you can use message lists like 23 16
- 42> with most MH commands there is a folder option you can
+ 42 with most MH commands there is a folder option you can
specify with just about every MH command. If you do a
- scan +freebsd> it will scan your freebsd>
+ scan +freebsd it will scan your freebsd
folder, and your current folder will be changed to
- freebsd>. If you do a show +freebsd 23 16
- 42>, show> is going to switch to your
- freebsd> folder and display messages 23, 16 and 42.
- So remember that
+ left it as inbox.
- pick>—search email that matches certain
+ pick—search email that matches certain
criteria
- pick> is one of the more complex commands in
+ pick is one of the more complex commands in
the MH system. So you might want to read the
- pick>1>> man
+ pick1 man
page for a more thorough understanding. At its simplest level
you can do something like&prompt.user; pick -search pci>
15
42
55
56
57
- This will tell pick> to look through every
+ This will tell pick to look through every
single line in every message in your current folder and tell
- you which message numbers it found the word pci>
- in. You can then show> those messages and read them
- if you wish or rmm> them. You would have to specify
- something like show 15 42 55-57> to display them
+ you which message numbers it found the word pci
+ in. You can then show those messages and read them
+ if you wish or rmm them. You would have to specify
+ something like show 15 42 55-57 to display them
though. A slightly more useful thing to do is this:&prompt.user; pick -search pci -seq pick>
5 hits
&prompt.user; show pick>
This will show you the same messages you just didn't have
to work as hard to do it. The
-seq
option is
really an abbreviation of
-sequence
and
- pick> is just a sequence which contains the message
+ pick is just a sequence which contains the message
numbers that matched. You can use sequences with just about
- any MH command. So you could have done an rmm pick>
+ any MH command. So you could have done an rmm pick
and all those messages would be removed instead. You sequence
can be named anything. If you run pick again it will overwrite
the old sequence if you use the same name.Doing a pick -search can be a bit more
time consuming than just searching for message from someone,
- or to someone. So pick> allows you to use the
+ or to someone. So pick allows you to use the
following predefined search criteria:
-to
search based upon who the message is to
-cc
search based on who is in the cc list
-from
search for who sent the message
-subject
search for emails with this subject
-date
find emails with a matching dat
--component
search for any other component in the header. (i.e.
-
--reply-to> to find all emails with a certain
+
--reply-to
to find all emails with a certain
reply-to in the header)This allows you to do things like
&prompt.user; pick -to freebsd-hackers@FreeBSD.org -seq hackers>
to get a list of all the email send to the FreeBSD hackers
- mailing list. pick> also allows you to group these
+ mailing list. pick also allows you to group these
criteria in different ways using the following options:…
-and
……
-or
&hellip
-not
…
-lbrace
…
-rbrace
These commands allow you to do things like&prompt.user; pick -to freebsd-hackers -and -cc freebsd-hackers>
That will grab all the email in your inbox that was sent
to freebsd-hackers or cc'd to that list. The brace options
allow you to group search criteria together. This is sometimes
very necessary as in the following example&prompt.user; pick -lbrace -to freebsd-hackers -and
-not -cc freebsd-questions -rbrace -and -subject pci>
Basically this says pick (to freebsd-hackers and
not cc'd on freebsd-questions) and the subject is
pci. It should look through your folder and find
all messages sent to the freebsd-hackers list that aren't cc'd
to the freebsd-questions list that contain something on pci in
the subject line. Ordinarily you might have to worry about
something called operator precedence. Remember in math how you
evaluate from left to right and you do multiplication and
division first and addition and subtraction second? MH has the
- same type of rules for pick>. It's fairly complex
+ same type of rules for pick. It's fairly complex
so you might want to study the man page. This document is just
to help you get acquainted with MH.
- folder>, folders>,
- refile>—three useful programs for folder
+ folder, folders,
+ refile—three useful programs for folder
maintenanceThere are three programs which are primarily just for
- manipulating your folders. The folder> program is
+ manipulating your folders. The folder program is
used to switch between folders, pack them, and list them. At
its simplest level you can do a folder
- +newfolder>> and you will be switched into
- newfolder>. From there on out all your MH
- commands like comp>, repl>,
- scan>, and show> will act on that
- newfolder> folder.
+ +newfolder and you will be switched into
+ newfolder. From there on out all your MH
+ commands like comp, repl,
+ scan, and show will act on that
+ newfolder folder.
Sometimes when you are reading and deleting messages you
- will develop holes> in your folders. If you do a
- scan> you might just see messages 34, 35, 36, 43,
+ will develop holes in your folders. If you do a
+ scan you might just see messages 34, 35, 36, 43,
55, 56, 57, 80. If you do a folder -pack
this will renumber all your messages so that there are no
holes. It doesn't actually delete any messages though. So you
may need to periodically go through and physically delete
- rmm>'d messages.
+ rmm'd messages.
If you need statistics on your folders you can do a
- folders> or folder -all to list
+ folders or folder -all to list
all your folders, how many messages they have, what the
current message is in each one and so on. This line of stats
it displays for all your folders is the same one you get when
- you change to a folder with folder +foldername>. A
- folders> command looks like this:
+ you change to a folder with folder +foldername. A
+ folders command looks like this:
Folder # of messages ( range ); cur msg (other files)
announce has 1 message ( 1- 1).
drafts has no messages.
f-hackers has 43 messages ( 1- 43).
f-questions has 16 messages ( 1- 16).
inbox+ has 35 messages ( 1- 38); cur= 37.
lists has 8 messages ( 1- 8).
netfuture has 1 message ( 1- 1).
out has 31 messages ( 1- 31).
personal has 6 messages ( 1- 6).
todo has 58 messages ( 1- 58); cur= 1.
TOTAL= 199 messages in 13 folders.
- The refile> command is what you use to move
+ The refile command is what you use to move
messages between folders. When you do something like
- refile 23 +netfuture> message number 23 is moved
- into the netfuture> folder. You could also do
- something like refile 23 +netfuture/latest> which
+ refile 23 +netfuture message number 23 is moved
+ into the netfuture folder. You could also do
+ something like refile 23 +netfuture/latest which
would put message number 23 in a subfolder called
- latest> under the netfuture> folder.
+ latest under the netfuture folder.
If you want to keep a message in the current folder and link
it you can do a refile -link 23 +netfuture
- which would keep 23 in your current inbox> but
- also list in your netfuture> folder. You are
+ which would keep 23 in your current inbox but
+ also list in your netfuture folder. You are
probably beginning to realize some of the really powerful
things you can do with MH.Sending MailEmail is a two way street for most people so you want to be
able to send something back. The way MH handles sending mail can
be a bit difficult to follow at first, but it allows for
incredible flexibility. The first thing MH does is to copy a
components file into your outgoing email. A components file is
basically a skeleton email letter with stuff like the To: and
Subject: headers already in it. You are then sent into your
editor where you fill in the header information and then type
the body of your message below the dashed lines in the message.
- Then to the whatnow> program. When you are at the
+ Then to the whatnow program. When you are at the
What now? prompt you can tell it to
- send>, list>, edit>,
- edit>, push>, and quit>. Most
+ send, list, edit,
+ edit, push, and quit. Most
of these commands are self-explanatory. So the message sending
process involves copying a component file, editing your email,
- and then telling the whatnow> program what to do with
+ and then telling the whatnow program what to do with
your email.
- comp>, forw>,
- reply>—compose, forward or reply to a message
+ comp, forw,
+ reply—compose, forward or reply to a message
to someone
- The comp> program has a few useful command line
+ The comp program has a few useful command line
options. The most important one to know right now is the
-editor
option. When MH is installed the
default editor is usually a program called
- prompter> which comes with MH. It's not a very
+ prompter which comes with MH. It's not a very
exciting editor and basically just gets the job done. So when
you go to compose a message to someone you might want to use
- comp -editor /usr/bin/vi/> or comp -editor
- /usr/local/bin/pico/> instead. Once you have run
+ comp -editor /usr/bin/vi/ or comp -editor
+ /usr/local/bin/pico/ instead. Once you have run
comp you are in your editor and you see
something that looks like this:To:
cc:
Subject:
--------
You need to put the person you are sending the mail to
- after the To:> line. It works the same way for the
+ after the To: line. It works the same way for the
other headers also, so you would need to put your subject
- after the Subject:> line. Then you would just put
+ after the Subject: line. Then you would just put
the body of your message after the dashed lines. It may seem a
bit simplistic since a lot of email programs have special
requesters that ask you for this information but there really
isn't any point to that. Plus this really gives you excellent
flexibility.To:freebsd-rave@FreeBSD.org>
cc:
Subject:And on the 8th day God created the FreeBSD core team>
--------
Wow this is an amazing operating system. Thanks!>
You can now save this message and exit your editor. You
- will see the What now?> prompt and you can type in
- send> or s> and hit
- return>. Then the FreeBSD core team will receive
+ will see the What now? prompt and you can type in
+ send or s and hit
+ return. Then the FreeBSD core team will receive
their just rewards. As I mentioned earlier you can also use
- other commands, for example quit> if you don't want
+ other commands, for example quit if you don't want
to send the message.
- The forw> command is stunningly similar. The
+ The forw command is stunningly similar. The
big difference being that the message you are forwarding is
automatically included in the outgoing message. When you run
- forw> it will forward your current message. You can
+ forw it will forward your current message. You can
always tell it to forward something else by doing something
- like forw 23> and then message number 23 will be
+ like forw 23 and then message number 23 will be
put in your outgoing message instead of the current message.
- Beyond those small differences forw> functions
- exactly the same as comp>. You go through the exact
+ Beyond those small differences forw functions
+ exactly the same as comp. You go through the exact
same message sending process.
- The repl> command will reply to whatever your
+ The repl command will reply to whatever your
current message is, unless you give it a different message to
- reply to. repl> will do its best to go ahead and
+ reply to. repl will do its best to go ahead and
fill in some of the email headers already. So you will notice
- that the To:> header already has the address of the
- recipient in there. Also the Subject:> line will
+ that the To: header already has the address of the
+ recipient in there. Also the Subject: line will
already be filled in. You then go about the normal message
composition process and you are done. One useful command line
option to know here is the
-cc
option. You
- can use all>, to>, cc>,
- me> after the
-cc
option to have
- repl> automatically add the various addresses to
+ can use all, to, cc,
+ me after the
-cc
option to have
+ repl automatically add the various addresses to
the cc list in the message. You have probably noticed that the
original message isn't included. This is because most MH
setups are configured to do this from the start.
- components>, and
- replcomps>—components files for
- comp> and repl>
+ components, and
+ replcomps—components files for
+ comp and repl
- The components> file is usually in
+ The components file is usually in
/usr/local/lib/mh. You can copy that file
into your MH Mail directory and edit to contain what you want
it to contain. It is a fairly basic file. You have various
email headers at the top, a dashed line and then nothing. The
comp command just copies this
- components> file and then edits it. You can add
+ components file and then edits it. You can add
any kind of valid RFC822 header you want. For instance you
- could have something like this in your components>
+ could have something like this in your components
file:To:
Fcc: out
Subject:
X-Mailer: MH 6.8.3
X-Home-Page: http://www.FreeBSD.org/
-------
MH would then copy this components file and throw you into
- your editor. The components> file is fairly
+ your editor. The components file is fairly
simple. If you wanted to have a signature on those messages
you would just put your signature in that
- components> file.
+ components file.
- The replcomps> file is a bit more complex. The
- default replcomps> looks like this:
+ The replcomps file is a bit more complex. The
+ default replcomps looks like this:%(lit)%(formataddr %<{reply-to}%?{from}%?{sender}%?{return-path}%>)\
%<(nonnull)%(void(width))%(putaddr To: )\n%>\
%(lit)%(formataddr{to})%(formataddr{cc})%(formataddr(me))\
%<(nonnull)%(void(width))%(putaddr cc: )\n%>\
%<{fcc}Fcc: %{fcc}\n%>\
%<{subject}Subject: Re: %{subject}\n%>\
%<{date}In-reply-to: Your message of "\
%<(nodate{date})%{date}%|%(pretty{date})%>."%<{message-id}
%{message-id}%>\n%>\
--------
It's in the same basic format as the
- components> file but it contains quite a few extra
- formatting codes. The %(lit)> command makes room
- for the address. The %(formataddr> is a function
+ components file but it contains quite a few extra
+ formatting codes. The %(lit) command makes room
+ for the address. The %(formataddr is a function
that returns a proper email address. The next part is
%< which means if and the
- {reply-to}> means the reply-to field in the
+ {reply-to} means the reply-to field in the
original message. So that might be translated this way:%<if {reply-to} the original message has a reply-to
then give that to formataddr, %? else {from} take the
from address, %? else {sender} take the sender address, %?
else {return-path} take the return-path from the original
message, %> endif.
As you can tell MH formatting can get rather involved. You
can probably decipher what most of the other functions and
variables mean. All of the information on writing these format
strings is in the MH-Format man page. The really nice thing is
that once you have built your customized
- replcomps> file you won't need to touch it again.
+ replcomps file you won't need to touch it again.
No other email program really gives you the power and
flexibility that MH gives you.
diff --git a/en_US.ISO8859-1/articles/multi-os/article.sgml b/en_US.ISO8859-1/articles/multi-os/article.sgml
index 4dd680f3a5..f7ee999f88 100644
--- a/en_US.ISO8859-1/articles/multi-os/article.sgml
+++ b/en_US.ISO8859-1/articles/multi-os/article.sgml
@@ -1,743 +1,743 @@
-
+
Installing and Using FreeBSD With Other Operating SystemsJayRichmondjayrich@sysc.com6 August 1996This document discusses how to make FreeBSD coexist nicely
with other popular operating systems such as Linux, MS-DOS,
OS/2, and Windows 95. Special thanks to: Annelise Anderson
andrsn@stanford.edu, Randall Hopper
rhh@ct.picker.com, and Jordan K. Hubbard
jkh@time.cdrom.comOverviewMost people can't fit these operating systems together
comfortably without having a larger hard disk, so special
information on large EIDE drives is included. Because there are
so many combinations of possible operating systems and hard disk
configurations, the section may be of the
most use to you. It contains descriptions of specific working
computer setups that use multiple operating systems.This document assumes that you have already made room on
your hard disk for an additional operating system. Any time you
repartition your hard drive, you run the risk of destroying the
data on the original partitions. However, if your hard drive is
completely occupied by DOS, you might find the FIPS utility
(included on the FreeBSD CD-ROM in the
\TOOLS directory or via ftp)
useful. It lets you repartition your hard disk without
destroying the data already on it. There is also a commercial
program available called Partition Magic, which lets you size
and delete partitions without consequence.Overview of Boot ManagersThese are just brief descriptions of some of the different
boot managers you may encounter. Depending on your computer
setup, you may find it useful to use more than one of them on
the same system.Boot EasyThis is the default boot manager used with FreeBSD.
It has the ability to boot most anything, including BSD,
OS/2 (HPFS), Windows 95 (FAT and FAT32), and Linux.
Partitions are selected with the function keys.OS/2 Boot ManagerThis will boot FAT, HPFS, FFS (FreeBSD), and EXT2
(Linux). It will also boot FAT32 partitions. Partitions
are selected using arrow keys. The OS/2 Boot Manager is
the only one to use its own separate partition, unlike the
others which use the master boot record (MBR). Therefore,
it must be installed below the 1024th cylinder to avoid
booting problems. It can boot Linux using LILO when it is
part of the boot sector, not the MBR. Go to Linux
HOWTOs on the World Wide Web for more
information on booting Linux with OS/2's boot
manager.OS-BSThis is an alternative to Boot Easy. It gives you more
control over the booting process, with the ability to set
the default partition to boot and the booting timeout.
The beta version of this programs allows you to boot by
selecting the OS with your arrow keys. It is included on
the FreeBSD CD in the \TOOLS
directory, and via ftp.LILO, or LInux LOaderThis is a limited boot manager. It will boot FreeBSD,
though some customization work is required in the LILO
configuration file.About FAT32FAT32 is the replacement to the FAT filesystem included in
Microsoft's OEM SR2 Beta release, which is expected to be
utilitized on computers pre-loaded with Windows 95 towards the
end of 1996. It converts the normal FAT file system and
allows you to use smaller cluster sizes for larger hard
drives. FAT32 also modifies the traditional FAT boot sector
and allocation table, making it incompatible with some boot
managers.A Typical InstallationLet's say I have two large EIDE hard drives, and I want to
install FreeBSD, Linux, and Windows 95 on them.Here's how I might do it using these hard disks:
- /dev/wd0> (first physical hard disk)
+ /dev/wd0 (first physical hard disk)
- /dev/wd1> (second hard disk)
+ /dev/wd1 (second hard disk)Both disks have 1416 cylinders.I boot from a MS-DOS or Windows 95 boot disk that
- contains the FDISK.EXE> utility and make a small
+ contains the FDISK.EXE utility and make a small
50 meg primary partition (35-40 for Windows 95, plus a
little breathing room) on the first disk. Also create a
larger partition on the second hard disk for my Windows
applications and data.I reboot and install Windows 95 (easier said than done)
- on the C:> partition.
+ on the C: partition.
The next thing I do is install Linux. I'm not sure
about all the distributions of Linux, but slackware includes
LILO (see ). When I am partitioning out
my hard disk with Linux fdisk, I would
put all of Linux on the first drive (maybe 300 megs for a
nice root partition and some swap space).After I install Linux, and are prompted about installing
LILO, make SURE that I install it on the boot sector of my
root Linux partition, not in the MBR (master boot
record).The remaining hard disk space can go to FreeBSD. I also
make sure that my FreeBSD root slice does not go beyond the
1024th cylinder. (The 1024th cylinder is 528 megs into the
disk with our hypothetical 720MB disks). I will use the
rest of the hard drive (about 270 megs) for the
- /usr> and /> slices if I wish. The
+ /usr and / slices if I wish. The
rest of the second hard disk (size depends on the amount of
my Windows application/data partition that I created in step
- 1 can go to the /usr/src> slice and swap
+ 1 can go to the /usr/src slice and swap
space.
- When viewed with the Windows 95 fdisk>
+ When viewed with the Windows 95 fdisk
utility, my hard drives should now look something like this:
---------------------------------------------------------------------
Display Partition Information
Current fixed disk drive: 1
Partition Status Type Volume_Label Mbytes System Usage
C: 1 A PRI DOS 50 FAT** 7%
2 A Non-DOS (Linux) 300 43%
Total disk space is 696 Mbytes (1 Mbyte = 1048576 bytes)
Press Esc to continue
---------------------------------------------------------------------
Display Partition Information
Current fixed disk drive: 2
Partition Status Type Volume_Label Mbytes System Usage
D: 1 A PRI DOS 420 FAT** 60%
Total disk space is 696 Mbytes (1 Mbyte = 1048576 bytes)
Press Esc to continue
---------------------------------------------------------------------
** May say FAT16 or FAT32 if you are using the OEM SR2
update. See ).Install FreeBSD. I make sure to boot with my first hard
- disk set at NORMAL> in the BIOS. If it is not,
+ disk set at NORMAL in the BIOS. If it is not,
I'll have the enter my true disk geometry at boot time (to
get this, boot Windows 95 and consult Microsoft Diagnostics
- (MSD.EXE>), or check your BIOS) with the
- parameter hd0=1416,16,63> where
- 1416> is the number of cylinders on my hard
- disk, 16> is the number of heads per track,
- and 63> is the number of sectors per track on
+ (MSD.EXE), or check your BIOS) with the
+ parameter hd0=1416,16,63 where
+ 1416 is the number of cylinders on my hard
+ disk, 16 is the number of heads per track,
+ and 63 is the number of sectors per track on
the drive.When partitioning out the hard disk, I make sure to
install Boot Easy on the first disk. I don't worry about
the second disk, nothing is booting off of it.When I reboot, Boot Easy should recognize my three
bootable partitions as DOS (Windows 95), Linux, and BSD
(FreeBSD).Special ConsiderationsMost operating systems are very picky about where and how
they are placed on the hard disk. Windows 95 and DOS need to be
on the first primary partitiin on the first hard disk. OS/2 is
the exception. It can be installed on the first or second disk
in a primary or extended partition. If you are not sure, keep
the beginning of the bootable partitions below the 1024th
cylinder.If you install Windows 95 on an existing BSD system, it will
- destroy> the MBR, and you will have to reinstall your
+ destroy the MBR, and you will have to reinstall your
previous boot manager. Boot Easy can be reinstalled by using
the BOOTINST.EXE utility included in the \TOOLS directory on the
CD-ROM, and via ftp.
You can also re-start the installation process and go to the
partition editor. From there, mark the FreeBSD partition as
bootable, select Boot Manager, and then type W to (W)rite out
the information to the MBR. You can now reboot, and Boot Easy
should then recognize Windows 95 as DOS.Please keep in mind that OS/2 can read FAT and HPFS
partitions, but not FFS (FreeBSD) or EXT2 (Linux) partitions.
Likewise, Windows 95 can only read and write to FAT and FAT32
(see ) partitions. FreeBSD can read most
file systems, but currently cannot read HPFS partitions. Linux
can read HPFS partitions, but can't write to them. Recent
versions of the Linux kernel (2.x) can read and write to Windows
95 VFAT partitions (VFAT is what gives Windows 95 long file
names - it's pretty much the same as FAT). Linux can read and
write to most file systems. Got that? I hope so.Examples(section needs work, please send your example to
jayrich@sysc.com).FreeBSD+Win95: If you installed FreeBSD after Windows 95,
- you should see DOS> on the Boot Easy menu. This is
+ you should see DOS on the Boot Easy menu. This is
Windows 95. If you installed Windows 95 after FreeBSD, read
above. As long as your hard disk does not
have 1024 cylinders you should not have a problem booting. If
one of your partitions goes beyond the 1024th cylinder however,
- and you get messages like invalid system disk>
+ and you get messages like invalid system disk
under DOS (Windows 95) and FreeBSD will not boot, try looking
for a setting in your BIOS called > 1024 cylinder
- support> or NORMAL/LBA> mode. DOS may need LBA
+ support or NORMAL/LBA mode. DOS may need LBA
(Logical Block Addressing) in order to boot correctly. If the
idea of switching BIOS settings every time you boot up doesn't
appeal to you, you can boot FreeBSD through DOS via the
- FBSDBOOT.EXE> utility on the CD (It should find your
+ FBSDBOOT.EXE utility on the CD (It should find your
FreeBSD partition and boot it.)FreeBSD+OS/2+Win95: Nothing new here. OS/2's boot manger
can boot all of these operating systems, so that shouldn't be a
problem.FreeBSD+Linux: You can also use Boot Easy to boot both
operating systems.FreeBSD+Linux+Win95: (see )Other Sources of HelpThere are many Linux
HOW-TOs that deal with multiple operating systems on
the same hard disk.The Linux+DOS+Win95+OS2
mini-HOWTO offers help on configuring the OS/2 boot
manager, and the Linux+FreeBSD
mini-HOWTO might be interesting as well. The Linux-HOWTO
is also helpful.The NT
Loader Hacking Guide provides good information on
multibooting Windows NT, '95, and DOS with other operating
systems.And Hale Landis's "How It Works" document pack contains some
good info on all sorts of disk geometry and booting related
topics. You can find it at
ftp://fission.dt.wdc.com/pub/otherdocs/pc_systems/how_it_works/allhiw.zip.Finally, don't overlook FreeBSD's kernel documentation on
the booting procedure, available in the kernel source
distribution (it unpacks to file:/usr/src/sys/i386/boot/biosboot/README.386BSD.Technical Details(Contributed by Randall Hopper,
rhh@ct.picker.com)This section attempts to give you enough basic information
about your hard disks and the disk booting process so that you
can troubleshoot most problems you might encounter when getting
set up to boot several operating systems. It starts in pretty
basic terms, so you may want to skim down in this section until
it begins to look unfamiliar and then start reading.Disk PrimerThree fundamental terms are used to describe the location
of data on your hard disk: Cylinders, Heads, and Sectors.
It's not particularly important to know what these terms
relate to except to know that, together, they identify where
data is physically on your disk.Your disk has a particular number of cylinders, number of
heads, and number of sectors per cylinder-head (a
cylinder-head also known nown as a track). Collectively this
information defines the "physical disk geometry" for your hard
disk. There are typically 512 bytes per sector, and 63
sectors per track, with the number of cylinders and heads
varying widely from disk to disk. Thus you can figure the
number of bytes of data that'll fit on your own disk by
calculating:(# of cylinders) × (# heads) × (63
- sectors/track) × (512 bytes/sect)>
+ sectors/track) × (512 bytes/sect)For example, on my 1.6 Gig Western Digital AC31600 EIDE hard
disk,that's:(3148 cyl) × (16 heads) × (63
sectors/track) × (512 bytes/sect)which is 1,624,670,208 bytes, or around 1.6 Gig.You can find out the physical disk geometry (number of
cylinders, heads, and sectors/track counts) for your hard
disks using ATAID or other programs off the net. Your hard
disk probably came with this information as well. Be careful
though: if you're using BIOS LBA (see ), you can't use just any program to get
the physical geometry. This is because many programs (e.g.
- MSD.EXE> or FreeBSD fdisk) don't identify the
+ MSD.EXE or FreeBSD fdisk) don't identify the
physical disk geometry; they instead report the
- translated geometry> (virtual numbers from using
+ translated geometry (virtual numbers from using
LBA). Stay tuned for what that means.One other useful thing about these terms. Given 3
numbers—a cylinder number, a head number, and a
sector-within-track number—you identify a specific
absolute sector (a 512 byte block of data) on your disk.
Cylinders and Heads are numbered up from 0, and Sectors are
numbered up from 1.For those that are interested in more technical details,
information on disk geometry, boot sectors, BIOSes, etc. can
be found all over the net. Query Lycos, Yahoo, etc. for
- boot sector> or master boot record>.
+ boot sector or master boot record.
Among the useful info you'll find are Hale Landis's
- How It Works> document pack. See the How It Works document pack. See the section for a few pointers to this
pack.Ok, enough terminology. We're talking about booting
here.The Booting ProcessOn the first sector of your disk (Cyl 0, Head 0, Sector 1)
lives the Master Boot Record (MBR). It contains a map of your
- disk. It identifies up to 4 partitions>, each of
+ disk. It identifies up to 4 partitions, each of
which is a contiguous chunk of that disk. FreeBSD calls
- partitions slices> to avoid confusion with it's
+ partitions slices to avoid confusion with it's
own partitions, but we won't do that here. Each partition can
contain its own operating system.Each partition entry in the MBR has a Partition
- ID>, a Start Cylinder/Head/Sector>, and an
- End Cylinder/Head/Sector>. The Partition ID
+ ID, a Start Cylinder/Head/Sector, and an
+ End Cylinder/Head/Sector. The Partition ID
tells what type of partition it is (what OS) and the Start/End
tells where it is. lists a
smattering of some common Partition IDs.
Note that not all partitions are bootable (e.g. Extended
DOS). Some are—some aren't. What makes a partition
bootable is the configuration of the Partition Boot
- Sector> that exists at the beginning of each
+ Sector that exists at the beginning of each
partition.When you configure your favorite boot manager, it looks up
the entries in the MBR partition tables of all your hard disks
and lets you name the entries in that list. Then when you
boot, the boot manager is invoked by special code in the
Master Boot Sector of the first probed hard disk on your
system. It looks at the MBR partition table entry
corresponding to the partition choice you made, uses the Start
Cylinder/Head/Sector information for that partition, loads up
the Partition Boot Sector for that partition, and gives it
control. That Boot Sector for the partition itself contains
enough information to start loading the operating system on
that partition.One thing we just brushed past that's important to know.
All of your hard disks have MBRs. However, the one that's
important is the one on the disk that's first probed by the
BIOS. If you have only IDE hard disks, its the first IDE disk
(e.g. primary disk on first controller). Similarly for SCSI
only systems. If you have both IDE and SCSI hard disks
though, the IDE disk is typically probed first by the BIOS, so
the first IDE disk is the first probed disk. The boot manager
you will install will be hooked into the MBR on this first
probed hard disk that we've just described.Booting Limitations and WarningsNow the interesting stuff that you need to watch out
for.The dreaded 1024 cylinder limit and how BIOS LBA helpsThe first part of the booting process is all done
through the BIOS, (if that's a new term to you, the BIOS is
a software chip on your system motherboard which provides
startup code for your computer). As such, this first part
of the process is subject to the limitations of the BIOS
interface.The BIOS interface used to read the hard disk during
this period (INT 13H, Subfunction 2) allocates 10 bits to
the Cylinder Number, 8 bits to the Head Number, and 6 bits
to the Sector Number. This restricts users of this
interface (i.e. boot managers hooked into your disk's MBR as
well as OS loaders hooked into the Boot Sectors) to the
following limits:1024 cylinders, max256 heads, max
- 64 sectors/track, max (actually 63, 0>
+ 64 sectors/track, max (actually 63, 0
isn't available)Now big hard disks have lots of cylinders but not a lot
of heads, so invariably with big hard disks the number of
cylinders is greater than 1024. Given this and the BIOS
interface as is, you can't boot off just anywhere on your
hard disk. The boot code (the boot manager and the OS
loader hooked into all bootable partitions' Boot Sectors)
has to reside below cylinder 1024. In fact, if your hard
disk is typical and has 16 heads, this equates to:1024 cyl/disk × 16 heads/disk × 63
sect/(cyl-head) × 512 bytes/sectorwhich is around the often-mentioned 528MB limit.This is where BIOS LBA (Logical Block Addressing) comes
in. BIOS LBA gives the user of the BIOS API calls access to
physical cylinders above 1024 though the BIOS interfaces by
redefining a cylinder. That is, it remaps your cylinders
and heads, making it appear through the BIOS as though the
disk has fewer cylinders and more heads than it actually
does. In other words, it takes advantage of the fact that
hard disks have relatively few heads and lots of cylinders
by shifting the balance between number of cylinders and
number of heads so that both numbers lie below the
above-mentioned limits (1024 cylinders, 256 heads).With BIOS LBA, the hard disk size limitation is
virtually removed (well, pushed up to 8 Gigabytes anyway).
If you have an LBA BIOS, you can put FreeBSD or any OS
anywhere you want and not hit the 1024 cylinder
limit.To use my 1.6 Gig Western Digital as an example again,
it's physical geometry is:(3148 cyl, 16 heads, 63 sectors/track, 512
bytes/sector)However, my BIOS LBA remaps this to:(787 cyl, 64 heads, 63 sectors/track, 512
bytes/sector)giving the same effective size disk, but with cylinder
and head counts within the BIOS API's range (Incidentally, I
have both Linux and FreeBSD existing on one of my hard disks
above the 1024th physical cylinder, and both operating
systems boot fine, thanks to BIOS LBA).Boot Managers and Disk AllocationAnother gotcha to watch out when installing boot
managers is allocating space for your boot manager. It's
best to be aware of this issue up front to save yourself
from having to reinstall one or more of your OSs.If you followed the discussion in about the Master Boot Sector (where the
MBR is), Partition Boot Sectors, and the booting process,
you may have been wondering just exactly where on your hard
disk that nifty boot manager is going to live. Well, some
boot managers are small enough to fit entirely within the
Master Boot Sector (Cylinder 0, Head 0, Sector 0) along with
the partition table. Others need a bit more room and
actually extend a few sectors past the Master Boot Sector in
the Cylinder 0 Head 0 track, since that's typically
free…typically.That's the catch. Some operating systems (FreeBSD
included) let you start their partitions right after the
Master Boot Sector at Cylinder 0, Head 0, Sector 2 if you
want. In fact, if you give FreeBSD's sysinstall a disk with
an empty chunk up front or the whole disk empty, that's
where it'll start the FreeBSD partition by default (at least
it did when I fell into this trap). Then when you go to
install your boot manager, if it's one that occupies a few
extra sectors after the MBR, it'll overwrite the front of
the first partition's data. In the case of FreeBSD, this
overwrites the disk label, and renders your FreeBSD
partition unbootable.The easy way to avoid this problem (and leave yourself
the flexibility to try different boot managers later) is
just to always leave the first full track on your disk
unallocated when you partition your disk. That is, leave
the space from Cylinder 0, Head 0, Sector 2 through Cylinder
0, Head 0, Sector 63 unallocated, and start your first
partition at Cylinder 0, Head 1, Sector 1. For what it's
worth, when you create a DOS partition at the front of your
disk, DOS leaves this space open by default (this is why
some boot managers assume it's free). So creating a DOS
partition up at the front of your disk avoids this problem
altogether. I like to do this myself, creating 1 Meg DOS
partition up front, because it also avoids my primary DOS
drive letters shifting later when I repartition.For reference, the following boot managers use the
Master Boot Sector to store their code and data:OS-BS 1.35Boot EasyLILOThese boot managers use a few additional sectors after
the Master Boot Sector:OS-BS 2.0 Beta 8 (sectors 2-5)OS/2's boot managerWhat if your machine won't boot?At some point when installing boot managers, you might
leave the MBR in a state such that your machine won't boot.
This is unlikely, but possible when re-FDISKing underneath
an already-installed boot manager.If you have a bootable DOS partition on your disk, you
can boot off a DOS floppy, and run:A:\> FDISK /MBR>
to put the original, simple DOS boot code back into the
system. You can then boot DOS (and DOS only) off the hard
drive. Alternatively, just re-run your boot manager
installation program off a bootable floppy.
diff --git a/en_US.ISO8859-1/articles/new-users/article.sgml b/en_US.ISO8859-1/articles/new-users/article.sgml
index 81b19eee0d..ba5ae93dad 100644
--- a/en_US.ISO8859-1/articles/new-users/article.sgml
+++ b/en_US.ISO8859-1/articles/new-users/article.sgml
@@ -1,1054 +1,1054 @@
-
+
For People New to Both FreeBSD and UnixAnneliseAndersonandrsn@andrsn.stanford.eduAugust 15, 1997Congratulations on installing FreeBSD! This introduction
is for people new to both FreeBSD and
Un*x—so it starts with basics. It assumes you're using
version 2.0.5 or later of FreeBSD as distributed by Walnut
Creek or FreeBSD.org, your system (for now) has a single user
(you)—and you're probably pretty good with DOS/Windows
or OS/2.Logging in and Getting OutLog in (when you see login:) as a user you created during
installation or as root. (Your FreeBSD
installation will already have an account for root; root can go
anywhere and do anything, including deleting essential files, so
be careful!) The symbols &prompt.user; and &prompt.root; in the following stand for the
prompt (yours may be different), with &prompt.user; indicating an ordinary
user and &prompt.root; indicating root.To log out (and get a new login: prompt) type&prompt.root; exitas often as necessary. Yes, press enter
after commands, and remember that Unix is
case-sensitive—exit, not
EXIT.To shut down the machine type&prompt.root; /sbin/shutdown -h nowOr to reboot type&prompt.root; /sbin/shutdown -r nowor&prompt.root; /sbin/rebootYou can also reboot with
CtrlAltDelete.
Give it a little time to do its work. This is equivalent to
/sbin/reboot in recent releases of FreeBSD
and is much, much better than hitting the reset button. You
don't want to have to reinstall this thing, do you?Adding A User with Root PrivilegesIf you didn't create any users when you installed the system
and are thus logged in as root, you should probably create a
user now with&prompt.root; adduserThe first time you use adduser, it might ask for some
defaults to save. You might want to make the default shell csh
instead of sh, if it suggests sh as the default. Otherwise just
press enter to accept each default. These defaults are saved in
/etc/adduser.conf, an editable file.Suppose you create a user jack with
full name Jack Benimble. Give jack a
password if security (even kids around who might pound on the
keyboard) is an issue. When it asks you if you want to invite
jack into other groups, type wheelLogin group is ``jack''. Invite jack into other groups: wheelThis will make it possible to log in as
jack and use the su
command to become root. Then you won't get scolded any more for
logging in as root.You can quit adduser any time by typing
CtrlC,
and at the end you'll have a chance to approve your new user or
simply type n for no. You might want to create
a second new user (jill?) so that when you edit jack's login
files, you'll have a hot spare in case something goes
wrong.Once you've done this, use exit to get
back to a login prompt and log in as jack.
In general, it's a good idea to do as much work as possible as
an ordinary user who doesn't have the power—and
risk—of root.If you already created a user and you want the user to be
able to su to root, you can log in as root
and edit the file /etc/group, adding jack
to the first line (the group wheel). But first you need to
practice vi, the text editor--or use the
simpler text editor, ee, installed on recent
version of FreeBSD.To delete a user, use the rmuser
command.Looking AroundLogged in as an ordinary user, look around and try out some
commands that will access the sources of help and information
within FreeBSD.Here are some commands and what they do:idTells you who you are!pwdShows you where you are—the current working
directory.lsLists the files in the current directory.ls
-F
Lists the files in the current directory with a
* after executables, a
/ after directories, and an
@ after symbolic links.ls
-l
Lists the files in long format—size, date,
permissions.ls
-a
Lists hidden dot files with the others.
If you're root, the dot files show up
without the
-a
switch.cdChanges directories. cd
.. backs up one level;
note the space after cd. cd
/usr/local goes there.
cd ~ goes to
the home directory of the person logged in—e.g.,
/usr/home/jack. Try cd
/cdrom, and then
ls, to find out if your CDROM is
mounted and working.view
filenameLets you look at a file (named
filename) without changing it.
Try view
/etc/fstab.
:q to quit.cat
filenameDisplays filename on
screen. If it's too long and you can see only the end of
it, press ScrollLock and use the
up-arrow to move backward; you can use
ScrollLock with man pages too. Press
ScrollLock again to quit scrolling. You
might want to try cat on some of the
dot files in your home directory—cat
.cshrc, cat
.login, cat
.profile.You'll notice aliases in .cshrc for
some of the ls commands (they're very
convenient). You can create other aliases by editing
.cshrc. You can make these aliases
available to all users on the system by putting them in the
system-wide csh configuration file,
/etc/csh.cshrc.Getting Help and InformationHere are some useful sources of help.
Text stands for something of your
choice that you type in—usually a command or
filename.apropos
textEverything containing string
text in the whatis
database.man
textThe man page for text. The
major source of documentation for Un*x systems.
man ls will tell
you all the ways to use the ls command.
Press Enter to move through text,
Ctrlb
to go back a page,
Ctrlf
to go forward, q or
Ctrlc
to quit.which
textTells you where in the user's path the command
text is found.locate
textAll the paths where the string
text is found.whatis
textTells you what the command
text does and its man page.
Typing whatis * will tell you about all
the binaries in the current directory.whereis
textFinds the file text, giving
its full path.You might want to try using whatis on
some common useful commands like cat,
more, grep,
mv, find,
tar, chmod,
chown, date, and
script. more lets you
read a page at a time as it does in DOS, e.g., ls -l |
more or more
filename. The
* works as a wildcard—e.g., ls
w* will show you files beginning with
w.Are some of these not working very well? Both
locate and whatis depend
on a database that's rebuilt weekly. If your machine isn't
going to be left on over the weekend (and running FreeBSD), you
might want to run the commands for daily, weekly, and monthly
maintenance now and then. Run them as root and give each one
time to finish before you start the next one, for now.&prompt.root; periodic dailyoutput omitted
&prompt.root; periodic weeklyoutput omitted
&prompt.root; periodic monthlyoutput omittedIf you get tired of waiting, press
AltF2 to
get another virtual console, and log in
again. After all, it's a multi-user, multi-tasking system.
Nevertheless these commands will probably flash messages on your
screen while they're running; you can type
clear at the prompt to clear the screen.
Once they've run, you might want to look at
/var/mail/root and
/var/log/messages.Running such commands is part of system
administration—and as a single user of a Unix system,
you're your own system administrator. Virtually everything you
need to be root to do is system administration. Such
responsibilities aren't covered very well even in those big fat
books on Unix, which seem to devote a lot of space to pulling
down menus in windows managers. You might want to get one of
the two leading books on systems administration, either Evi
Nemeth et.al.'s UNIX System Administration
Handbook (Prentice-Hall, 1995, ISBN
0-13-15051-7)—the second edition with the red cover; or
Æleen Frisch's Essential System
Administration (O'Reilly & Associates, 1993,
ISBN 0-937175-80-3). I used Nemeth.Editing TextTo configure your system, you need to edit text files. Most
of them will be in the /etc directory; and
you'll need to su to root to be able to
change them. You can use the easy ee, but in
the long run the text editor vi is worth
learning. There's an excellent tutorial on vi in
/usr/src/contrib/nvi/docs/tutorial if you
have that installed; otherwise you can get it by ftp to
ftp.cdrom.com in the directory
FreeBSD/FreeBSD-current/src/contrib/nvi/docs/tutorial.Before you edit a file, you should probably back it up.
Suppose you want to edit /etc/rc.conf. You
could just use cd /etc to get to the
/etc directory and do:&prompt.root; cp rc.conf rc.conf.origThis would copy rc.conf to
rc.conf.orig, and you could later copy
rc.conf.orig to
rc.conf to recover the original. But even
better would be moving (renaming) and then copying back:&prompt.root; mv rc.conf rc.conf.orig
&prompt.root; cp rc.conf.orig rc.confbecause the mv command preserves the
original date and owner of the file. You can now edit
rc.conf. If you want the original back,
you'd then mv rc.conf rc.conf.myedit
(assuming you want to preserve your edited version) and
then&prompt.root; mv rc.conf.orig rc.confto put things back the way they were.To edit a file, type&prompt.root; vi filenameMove through the text with the arrow keys.
Esc (the escape key) puts vi
in command mode. Here are some commands:xdelete letter the cursor is ondddelete the entire line (even if it wraps on the
screen)iinsert text at the cursorainsert text after the cursorOnce you type i or a,
you can enter text. Esc puts you back in
command mode where you can type:wto write your changes to disk and continue
editing:wqto write and quit:q!to quit without saving changes/textto move the cursor to text;
/Enter (the enter key)
to find the next instance of
text.Gto go to the end of the filenGto go to line n in the
file, where n is a
number
- Ctrl>L>
+ CtrlLto redraw the screen
- Ctrl>b>> and
- Ctrl>f>>
+ Ctrlb and
+ Ctrlfgo back and forward a screen, as they do with
- more> and view>.
+ more and view.
- Practice with vi> in your home directory by
- creating a new file with vi filename>>
+ Practice with vi in your home directory by
+ creating a new file with vi filename
and adding and deleting text, saving the file, and calling it up
- again. vi> delivers some surprises because it's
+ again. vi delivers some surprises because it's
really quite complex, and sometimes you'll inadvertently issue a
command that will do something you don't expect. (Some people
- actually like vi>—it's more powerful than DOS
- EDIT—find out about the :r> command.) Use
- Esc> one or more times to be sure you're in command
+ actually like vi—it's more powerful than DOS
+ EDIT—find out about the :r command.) Use
+ Esc one or more times to be sure you're in command
mode and proceed from there when it gives you trouble, save
- often with :w>, and use :q!> to get out
- and start over (from your last :w>) when you need
+ often with :w, and use :q! to get out
+ and start over (from your last :w) when you need
to.
- Now you can cd> to /etc,
- su> to root, use vi> to edit the file
+ Now you can cd to /etc,
+ su to root, use vi to edit the file
/etc/group, and add a user to wheel so the
user has root privileges. Just add a comma and the user's login
name to the end of the first line in the file, press
- Esc>, and use :wq> to write the file to
+ Esc, and use :wq to write the file to
disk and quit. Instantly effective. (You didn't put a space
after the comma, did you?)Printing Files from DOSAt this point you probably don't have the printer working,
so here's a way to create a file from a man page, move it to a
floppy, and then print it from DOS. Suppose you want to read
carefully about changing permissions on files (pretty
important). You can use the command man chmod to read about it.
The command&prompt.user; man chmod | col -b > chmod.txt>
will remove formatting codes and send the man page to the
chmod.txt file instead of showing it on
your screen. Now put a dos-formatted diskette in your floppy
- drive a, su> to root, and type
+ drive a, su to root, and type
&prompt.root; /sbin/mount -t msdos /dev/fd0 /mnt>
to mount the floppy drive on
/mnt.Now (you no longer need to be root, and you can type
- exit> to get back to being user jack) you can go to
+ exit to get back to being user jack) you can go to
the directory where you created chmod.txt and copy the file to
the floppy with:&prompt.user; cp chmod.txt /mnt>
and use ls /mnt to get a directory
listing of /mnt, which should show the file
chmod.txt.You might especially want to make a file from
/sbin/dmesg by typing&prompt.user; /sbin/dmesg > dmesg.txt>
and copying dmesg.txt to the floppy.
/sbin/dmesg is the boot log record, and it's
useful to understand it because it shows what FreeBSD found when
it booted up. If you ask questions on
- freebsd-questions@FreeBSD.org> or on a USENET
+ freebsd-questions@FreeBSD.org or on a USENET
group—like FreeBSD isn't finding my tape drive,
what do I do?—people will want to know what
- dmesg> has to say.
+ dmesg has to say.
You can now dismount the floppy drive (as root) to get the
disk out with&prompt.root; /sbin/umount /mnt>
and reboot to go to DOS. Copy these files to a DOS
directory, call them up with DOS EDIT, Windows Notepad or
Wordpad, or a word processor, make a minor change so the file
has to be saved, and print as you normally would from DOS or
Windows. Hope it works! man pages come out best if printed
- with the dos print> command. (Copying files from
+ with the dos print command. (Copying files from
FreeBSD to a mounted dos partition is in some cases still a
little risky.)Getting the printer printing from FreeBSD involves creating
an appropriate entry in /etc/printcap and
creating a matching spool directory in
/var/spool/output. If your printer is on
- lpt0> (what dos calls LPT1>), you may
+ lpt0 (what dos calls LPT1), you may
only need to go to /var/spool/output and
- (as root) create the directory lpd> by typing:
+ (as root) create the directory lpd by typing:
mkdir lpd, if it doesn't already exist.
Then the printer should respond if it's turned on when the
system is booted, and lp or lpr should send a file to the
printer. Whether or not the file actually prints depends on
configuring it, which is covered in the FreeBSD handbook.>
+ URL="../../handbook/handbook.html">FreeBSD handbook.
Other Useful Commands
- df>
+ dfshows file space and mounted systems.
- ps aux>
+ ps aux
- shows processes running. ps ax> is a
+ shows processes running. ps ax is a
narrower form.
- rm filename>>
+ rm filename
- remove filename>.
+ remove filename.
- rm -R dir>>
+ rm -R dir
- removes a directory dir> and all
+ removes a directory dir and all
subdirectories—careful!ls -Rlists files in the current directory and all
subdirectories; I used a variant, ls -AFR >
where.txt, to get a list of all the files in
/ and (separately)
/usr before I found better ways to
find files.
- passwd>
+ passwdto change user's password (or root's password)
- man hier>
+ man hierman page on the Unix file system
- Use find> to locate filename in
+ Use find to locate filename in
/usr or any of its subdirectories
with&prompt.user; find /usr -name "filename>">
You can use * as a wildcard in
- "filename>"> (which should be in
+ "filename" (which should be in
quotes). If you tell find to search in /
instead of /usr it will look for the
file(s) on all mounted file systems, including the CDROM and the
dos partition.An excellent book that explains Unix commands and utilities
is Abrahams & Larson, Unix for the
Impatient (2nd ed., Addison-Wesley, 1996).
There's also a lot of Unix information on the Internet. Try the
Unix Reference
Desk.Next StepsYou should now have the tools you need to get around and
edit files, so you can get everything up and running. There is
a great deal of information in the FreeBSD handbook (which is
probably on your hard drive) and FreeBSD's web site. A
wide variety of packages and ports are on the Walnut Creek CDROM as well
as the web site. The handbook tells you more about how to use
them (get the package if it exists, with pkg_add
- /cdrom/packages/All/packagename>>, where
+ /cdrom/packages/All/packagename, where
packagename is the filename of the
package). The cdrom has lists of the packages and ports with
brief descriptions in cdrom/packages/index,
cdrom/packages/index.txt, and
cdrom/ports/index, with fuller descriptions
in /cdrom/ports/*/*/pkg/DESCR, where the
*s represent subdirectories of kinds of
programs and program names respectively.If you find the handbook too sophisticated (what with
- lndir> and all) on installing ports from the cdrom,
+ lndir and all) on installing ports from the cdrom,
here's what usually works:
- Find the port you want, say kermit>. There will
+ Find the port you want, say kermit. There will
be a directory for it on the cdrom. Copy the subdirectory to
/usr/local (a good place for software you
add that should be available to all users) with:&prompt.root; cp -R /cdrom/ports/comm/kermit /usr/local>
This should result in a
/usr/local/kermit subdirectory that has all
the files that the kermit subdirectory on the
CDROM has.Next, create the directory
/usr/ports/distfiles if it doesn't already
- exist using mkdir>. Now check check
+ exist using mkdir. Now check check
/cdrom/ports/distfiles for a file with a
name that indicates it's the port you want. Copy that file to
/usr/ports/distfiles; in recent versions
you can skip this step, as FreeBSD will do it for you. In the
- case of kermit>, there is no distfile.
+ case of kermit, there is no distfile.
- Then cd> to the subdirectory of
+ Then cd to the subdirectory of
/usr/local/kermit that has the file
- Makefile>. Type
+ Makefile. Type&prompt.root; make all install>
During this process the port will ftp to get any compressed
files it needs that it didn't find on the cdrom or in
/usr/ports/distfiles. If you don't have
your network running yet and there was no file for the port in
/cdrom/ports/distfiles, you will have to
get the distfile using another machine and copy it to
/usr/ports/distfiles from a floppy or your
- dos partition. Read Makefile> (with cat>
- or more> or view>) to find out where to go
+ dos partition. Read Makefile (with cat
+ or more or view) to find out where to go
(the master distribution site) to get the file and what its name
is. Its name will be truncated when downloaded to DOS, and
after you get it into /usr/ports/distfiles
- you'll have to rename it (with the mv> command) to
+ you'll have to rename it (with the mv command) to
its original name so it can be found. (Use binary file
transfers!) Then go back to
/usr/local/kermit, find the directory with
- Makefile>, and type make all
- install>.
+ Makefile, and type make all
+ install.
The other thing that happens when installing ports or
packages is that some other program is needed. If the
installation stops with a message can't find
unzip or whatever, you might need to install the
package or port for unzip before you continue.
- Once it's installed type rehash> to make FreeBSD
+ Once it's installed type rehash to make FreeBSD
reread the files in the path so it knows what's there. (If you
- get a lot of path not found> messages when you use
- whereis> or which, you might want to make additions
+ get a lot of path not found messages when you use
+ whereis or which, you might want to make additions
to the list of directories in the path statement in
.cshrc in your home directory. The path
statement in Unix does the same kind of work it does in DOS,
except the current directory is not (by default) in the path for
security reasons; if the command you want is in the directory
you're in, you need to type ./ before the
command to make it work; no space after the slash.)You might want to get the most recent version of Netscape
from their ftp site.
(Netscape requires the X Window System.) There's now a FreeBSD
version, so look around carefully. Just use gunzip
- filename>> and tar xvf
- filename>> on it, move the binary to
+ filename and tar xvf
+ filename on it, move the binary to
/usr/local/bin or some other place binaries
- are kept, rehash>, and then put the following lines
+ are kept, rehash, and then put the following lines
in .cshrc in each user's home directory or
(easier) in /etc/csh.cshrc, the
system-wide csh start-up file:setenv XKEYSYMDB /usr/X11R6/lib/X11/XKeysymDB
setenv XNLSPATH /usr/X11R6/lib/X11/nls
- >
+
- This assumes that the file XKeysymDB> and the
- directory nls> are in
+ This assumes that the file XKeysymDB and the
+ directory nls are in
/usr/X11R6/lib/X11; if they're not, find
them and put them there.If you originally got Netscape as a port using the CDROM (or
ftp), don't replace /usr/local/bin/netscape
with the new netscape binary; this is just a shell script that
sets up the environment variables for you. Instead rename the
new binary to netscape.bin and replace the
old binary, which is
/usr/local/netscape/netscape.Your Working EnvironmentYour shell is the most important part of your working
environment. In DOS, the usual shell is command.com. The shell
is what interprets the commands you type on the command line,
and thus communicates with the rest of the operating system.
You can also write shell scripts, which are like DOS batch
files: a series of commands to be run without your
intervention.Two shells come installed with FreeBSD: csh and sh. csh is
good for command-line work, but scripts should be written with
sh (or bash). You can find out what shell you have by typing
echo $SHELL.The csh shell is okay, but tcsh does everything csh does and
more. It It allows you to recall commands with the arrow keys
and edit them. It has tab-key completion of filenames (csh uses
the escape key), and it lets you switch to the directory you
were last in with cd -. It's also much
easier to alter your prompt with tcsh. It makes life a lot
easier.Here are the three steps for installing a new shell:Install the shell as a port or a package, just as you
would any other port or package. Use
rehash and which tcsh
(assuming you're installing tcsh) to make sure it got
installed.As root, edit /etc/shells, adding a
line in the file for the new shell, in this case
/usr/local/bin/tcsh, and save the file. (Some ports may do
this for you.)Use the chsh command to change your
shell to tcsh permanently, or type tcsh
at the prompt to change your shell without logging in
again.It can be dangerous to change root's shell to something
other than sh or csh on early versions of FreeBSD and many
other versions of Unix; you may not have a working shell when
the system puts you into single user mode. The solution is to
use su -m to become root, which will give
you the tcsh as root, because the shell is part of the
environment. You can make this permanent by adding it to your
.tcshrc file as an alias with
- alias su su -m.>
+ alias su su -m.When tcsh starts up, it will read the
/etc/csh.cshrc and
/etc/csh.login files, as does csh. It will
also read the .login file in your home
directory and the .cshrc file as well,
unless you provide a .tcshrc file. This
you can do by simply copying .cshrc to
.tcshrc.Now that you've installed tcsh, you can adjust your prompt.
You can find the details in the manual page for tcsh, but here
is a line to put in your .tcshrc that will
tell you how many commands you have typed, what time it is, and
what directory you are in. It also produces a
> if you're an ordinary user and a
# if you're root, but tsch will do that in
any case:set prompt = "%h %t %~ %# "This should go in the same place as the existing set prompt
line if there is one, or under "if($?prompt) then" if not.
Comment out the old line; you can always switch back to it if
you prefer it. Don't forget the spaces and quotes. You can get
the .tcshrc reread by typing
source .tcshrc.You can get a listing of other environmental variables that
have been set by typing env at the prompt.
The result will show you your default editor, pager, and
terminal type, among possibly many others. A useful command if
you log in from a remote location and can't run a program
because the terminal isn't capable is setenv TERM
vt100.OtherAs root, you can dismount the CDROM with
- /sbin/umount /cdrom>, take it out of the drive,
+ /sbin/umount /cdrom, take it out of the drive,
insert another one, and mount it with
- /sbin/mount_cd9660 /dev/cd0a /cdrom> assuming
- cd0a> is the device name for your CDROM drive. The
+ /sbin/mount_cd9660 /dev/cd0a /cdrom assuming
+ cd0a is the device name for your CDROM drive. The
most recent versions of FreeBSD let you mount the cdrom with
just /sbin/mount /cdrom.Using the live file system—the second of FreeBSD's
CDROM disks—is useful if you've got limited space. What
is on the live file system varies from release to release. You
might try playing games from the cdrom. This involves using
- lndir>, which gets installed with the X Window
+ lndir, which gets installed with the X Window
System, to tell the program(s) where to find the necessary
files, because they're in the /cdrom file
system instead of in /usr and its
subdirectories, which is where they're expected to be. Read
- man lndir>.
+ man lndir.
Comments WelcomeIf you use this guide I'd be interested in knowing where it
was unclear and what was left out that you think should be
included, and if it was helpful. My thanks to Eugene W. Stark,
professor of computer science at SUNY-Stony Brook, and John
Fieber for helpful comments.Annelise Anderson,
- andrsn@andrsn.stanford.edu>
+ andrsn@andrsn.stanford.edu
diff --git a/en_US.ISO8859-1/articles/programming-tools/article.sgml b/en_US.ISO8859-1/articles/programming-tools/article.sgml
index 63883a1268..aeb6389e91 100644
--- a/en_US.ISO8859-1/articles/programming-tools/article.sgml
+++ b/en_US.ISO8859-1/articles/programming-tools/article.sgml
@@ -1,2264 +1,2264 @@
-
+
A User's Guide to FreeBSD Programming ToolsJamesRaynardjraynard@FreeBSD.orgAugust 17, 19971997James RaynardThis document is an introduction to using some of the
programming tools supplied with FreeBSD, although much of it
will be applicable to many other versions of Unix. It does
not attempt to describe coding in any
detail. Most of the document assumes little or no previous
programming knowledge, although it is hoped that most
programmers will find something of value in itIntroductionFreeBSD offers an excellent development environment.
Compilers for C, C++, and Fortran and an assembler come with the
basic system, not to mention a Perl interpreter and classic Unix
- tools such as sed> and awk>. If that is
+ tools such as sed and awk. If that is
not enough, there are many more compilers and interpreters in
the Ports collection. FreeBSD is very compatible with standards
- such as POSIX> and ANSI> C, as well with
+ such as POSIX and ANSI C, as well with
its own BSD heritage, so it is possible to write applications
that will compile and run with little or no modification on a
wide range of platforms.However, all this power can be rather overwhelming at first
if you've never written programs on a Unix platform before.
This document aims to help you get up and running, without
getting too deeply into more advanced topics. The intention is
that this document should give you enough of the basics to be
able to make some sense of the documentation.Most of the document requires little or no knowledge of
programming, although it does assume a basic competence with
using Unix and a willingness to learn!Introduction to ProgrammingA program is a set of instructions that tell the computer to
do various things; sometimes the instruction it has to perform
depends on what happened when it performed a previous
instruction. This section gives an overview of the two main
ways in which you can give these instructions, or
commands as they are usually called. One way
- uses an interpreter>, the other a
- compiler>. As human languages are too difficult for
+ uses an interpreter, the other a
+ compiler. As human languages are too difficult for
a computer to understand in an unambiguous way, commands are
usually written in one or other languages specially designed for
the purpose.InterpretersWith an interpreter, the language comes as an environment,
where you type in commands at a prompt and the environment
executes them for you. For more complicated programs, you can
type the commands into a file and get the interpreter to load
the file and execute the commands in it. If anything goes
wrong, many interpreters will drop you into a debugger to help
you track down the problem.The advantage of this is that you can see the results of
your commands immediately, and mistakes can be corrected
readily. The biggest disadvantage comes when you want to
share your programs with someone. They must have the same
interpreter, or you must have some way of giving it to them,
and they need to understand how to use it. Also users may not
appreciate being thrown into a debugger if they press the
wrong key! From a performance point of view, interpreters can
use up a lot of memory, and generally do not generate code as
efficiently as compilers.In my opinion, interpreted languages are the best way to
start if you have not done any programming before. This kind
of environment is typically found with languages like Lisp,
Smalltalk, Perl and Basic. It could also be argued that the
- Unix shell (sh>, csh>) is itself an
+ Unix shell (sh, csh) is itself an
interpreter, and many people do in fact write shell
scripts to help with various
- housekeeping> tasks on their machine. Indeed, part
+ housekeeping tasks on their machine. Indeed, part
of the original Unix philosophy was to provide lots of small
utility programs that could be linked together in shell
scripts to perform useful tasks.Interpreters available with FreeBSDHere is a list of interpreters that are available as
FreeBSD
packages, with a brief discussion of some of the
more popular interpreted languages.To get one of these packages, all you need to do is to
click on the hotlink for the package, then run&prompt.root; pkg_add package name>as root. Obviously, you will need to have a fully
functional FreeBSD 2.1.0 or later system for the package to
work!
- BASIC>
+ BASICShort for Beginner's All-purpose Symbolic
Instruction Code. Developed in the 1950s for teaching
University students to program and provided with every
self-respecting personal computer in the 1980s,
- BASIC> has been the first programming
+ BASIC has been the first programming
language for many programmers. It's also the foundation
- for Visual Basic>.
+ for Visual Basic.
The Bywater
Basic Interpreter and the Phil
Cockroft's Basic Interpreter (formerly Rabbit
Basic) are available as FreeBSD FreeBSD
packagesLispA language that was developed in the late 1950s as
an alternative to the number-crunching
languages that were popular at the time. Instead of
being based on numbers, Lisp is based on lists; in fact
the name is short for List Processing.
Very popular in AI (Artificial Intelligence)
circles.Lisp is an extremely powerful and sophisticated
language, but can be rather large and unwieldy.FreeBSD has GNU
Common Lisp available as a package.PerlVery popular with system administrators for writing
scripts; also often used on World Wide Web servers for
- writing CGI> scripts.
+ writing CGI scripts.
The latest version (version 5) comes with FreeBSD.SchemeA dialect of Lisp that is rather more compact and
cleaner than Common Lisp. Popular in Universities as it
is simple enough to teach to undergraduates as a first
language, while it has a high enough level of
abstraction to be used in research work.FreeBSD has packages of the Elk
Scheme Interpreter, the MIT
Scheme Interpreter and the SCM
Scheme Interpreter.IconThe
Icon Programming Language.LogoBrian
Harvey's LOGO Interpreter.PythonThe
Python Object-Oriented Programming
LanguageCompilersCompilers are rather different. First of all, you write
your code in a file (or files) using an editor. You then run
the compiler and see if it accepts your program. If it did
not compile, grit your teeth and go back to the editor; if it
did compile and gave you a program, you can run it either at a
shell command prompt or in a debugger to see if it works
properly.
If you run it in the shell, you may get a core
dump.Obviously, this is not quite as direct as using an
interpreter. However it allows you to do a lot of things
which are very difficult or even impossible with an
interpreter, such as writing code which interacts closely with
the operating system—or even writing your own operating
system! It's also useful if you need to write very efficient
code, as the compiler can take its time and optimise the code,
which would not be acceptable in an interpreter. And
distributing a program written for a compiler is usually more
straightforward than one written for an interpreter—you
can just give them a copy of the executable, assuming they
have the same operating system as you.Compiled languages include Pascal, C and C++. C and C++
are rather unforgiving languages, and best suited to more
experienced programmers; Pascal, on the other hand, was
designed as an educational language, and is quite a good
language to start with. Unfortunately, FreeBSD doesn't have
any Pascal support, except for a Pascal-to-C converter in the
ports.As the edit-compile-run-debug cycle is rather tedious when
using separate programs, many commercial compiler makers have
produced Integrated Development Environments
(IDEs for short). FreeBSD does not have an
- IDE> as such; however it is possible to use Emacs
+ IDE as such; however it is possible to use Emacs
for this purpose. This is discussed in .Compiling with ccThis section deals only with the GNU compiler for C and C++,
since that comes with the base FreeBSD system. It can be
- invoked by either cc> or gcc>. The
+ invoked by either cc or gcc. The
details of producing a program with an interpreter vary
considerably between interpreters, and are usually well covered
in the documentation and on-line help for the
interpreter.Once you've written your masterpiece, the next step is to
convert it into something that will (hopefully!) run on FreeBSD.
This usually involves several steps, each of which is done by a
separate program.Pre-process your source code to remove comments and do
other tricks like expanding macros in C.Check the syntax of your code to see if you have obeyed
the rules of the language. If you have not, it will
complain!Convert the source code into assembly
language—this is very close to machine code, but still
understandable by humans. Allegedly.
- To be strictly accurate, cc> converts the
+ To be strictly accurate, cc converts the
source code into its own, machine-independent
- p-code> instead of assembly language at
+ p-code instead of assembly language at
this stage.Convert the assembly language into machine
code—yep, we are talking bits and bytes, ones and
zeros here.Check that you have used things like functions and
global variables in a consistent way. For example, if you
have called a non-existent function, it will
complain.If you are trying to produce an executable from several
source code files, work out how to fit them all
together.Work out how to produce something that the system's
run-time loader will be able to load into memory and
run.Finally, write the executable on the file system.
- The word compiling> is often used to refer to
+ The word compiling is often used to refer to
just steps 1 to 4—the others are referred to as
- linking>. Sometimes step 1 is referred to as
- pre-processing> and steps 3-4 as
- assembling>.
+ linking. Sometimes step 1 is referred to as
+ pre-processing and steps 3-4 as
+ assembling.Fortunately, almost all this detail is hidden from you, as
- cc> is a front end that manages calling all these
+ cc is a front end that manages calling all these
programs with the right arguments for you; simply typing&prompt.user; cc foobar.c>
- will cause foobar.c> to be compiled by all the
+ will cause foobar.c to be compiled by all the
steps above. If you have more than one file to compile, just do
something like&prompt.user; cc foo.c bar.c>
Note that the syntax checking is just that—checking
the syntax. It will not check for any logical mistakes you may
have made, like putting the program into an infinite loop, or
using a bubble sort when you meant to use a binary
sort.
In case you didn't know, a binary sort is an efficient
way of sorting things into order and a bubble sort
isn't.
- There are lots and lots of options for cc>, which
+ There are lots and lots of options for cc, which
are all in the man page. Here are a few of the most important
ones, with examples of how to use them.
-
-o filename>
+
-o filename
The output name of the file. If you do not use this
- option, cc> will produce an executable called
- a.out>.
+ option, cc will produce an executable called
+ a.out.
The reasons for this are buried in the mists of
history.&prompt.user; cc foobar.c> executable is a.out>>
&prompt.user; cc -o foobar foobar.c> executable is foobar>>
-c
Just compile the file, do not link it. Useful for toy
programs where you just want to check the syntax, or if
you are using a Makefile.&prompt.user; cc -c foobar.c
- This will produce an object file> (not an
+ This will produce an object file (not an
executable) called foobar.o. This
can be linked together with other object files into an
executable.
-g
Create a debug version of the executable. This makes
the compiler put information into the executable about
which line of which source file corresponds to which
function call. A debugger can use this information to show
the source code as you step through the program, which is
very useful; the disadvantage is that
all this extra information makes the program much bigger.
Normally, you compile with
-g
while you
are developing a program and then compile a release
version without
-g
when you're
satisfied it works properly.&prompt.user; cc -g foobar.cThis will produce a debug version of the
program.
Note, we didn't use the
-o
flag
to specify the executable name, so we will get an
executable called a.out.
Producing a debug version called
foobar is left as an exercise for
the reader!
-O
Create an optimised version of the executable. The
compiler performs various clever tricks to try and produce
an executable that runs faster than normal. You can add a
number after the
-O
to specify a higher
level of optimisation, but this often exposes bugs in the
compiler's optimiser. For instance, the version of
cc that comes with the 2.1.0 release of
FreeBSD is known to produce bad code with the
-O2
option in some circumstances.Optimisation is usually only turned on when compiling
a release version.&prompt.user; cc -O -o foobar foobar.cThis will produce an optimised version of
foobar.The following three flags will force cc
to check that your code complies to the relevant international
standard, often referred to as the ANSI
standard, though strictly speaking it is an
ISO standard.
-Wall
Enable all the warnings which the authors of
cc believe are worthwhile. Despite the
name, it will not enable all the warnings
cc is capable of.
-ansi
Turn off most, but not all, of the
- non-ANSI> C features provided by
+ non-ANSI C features provided by
cc. Despite the name, it does not
guarantee strictly that your code will comply to the
standard.
-pedantic
Turn off all
- cc's non-ANSI> C
+ cc's non-ANSI C
features.Without these flags, cc will allow you to
use some of its non-standard extensions to the standard. Some
of these are very useful, but will not work with other
compilers—in fact, one of the main aims of the standard is
to allow people to write code that will work with any compiler
on any system. This is known as portable
code.Generally, you should try to make your code as portable as
possible, as otherwise you may have to completely re-write the
program later to get it to work somewhere else—and who
knows what you may be using in a few years time?&prompt.user; cc -Wall -ansi -pedantic -o foobar foobar.cThis will produce an executable foobar
after checking foobar.c for standard
compliance.
-llibrary
Specify a function library to be used during when
linking.The most common example of this is when compiling a
program that uses some of the mathematical functions in C.
Unlike most other platforms, these are in a separate
library from the standard C one and you have to tell the
compiler to add it.The rule is that if the library is called
libsomething.a,
you give cc the argument
-lsomething
.
For example, the math library is
libm.a, so you give
cc the argument
-lm
.
A common gotcha with the math library is
that it has to be the last library on the command
line.&prompt.user; cc -o foobar foobar.c -lmThis will link the math library functions into
foobar.If you are compiling C++ code, you need to add
-lg++
, or
-lstdc++
if
you are using FreeBSD 2.2 or later, to the command line
argument to link the C++ library functions.
Alternatively, you can run c++ instead
of cc, which does this for you.
c++ can also be invoked as
g++ on FreeBSD.&prompt.user; cc -o foobar foobar.cc -lg++For FreeBSD 2.1.6 and earlier>
&prompt.user; cc -o foobar foobar.cc -lstdc++For FreeBSD 2.2 and later>
&prompt.user; c++ -o foobar foobar.ccEach of these will both produce an executable
foobar from the C++ source file
foobar.cc. Note that, on Unix
systems, C++ source files traditionally end in
.C, .cxx or
.cc, rather than the
MS-DOS style
.cpp (which was already used for
something else). gcc used to rely on
this to work out what kind of compiler to use on the
source file; however, this restriction no longer applies,
so you may now call your C++ files
.cpp with impunity!Common cc Queries and ProblemsI am trying to write a program which uses the
sin() function and I get an error
like this. What does it mean?/var/tmp/cc0143941.o: Undefined symbol `_sin' referenced from text segment
When using mathematical functions like
sin(), you have to tell
cc to link in the math library, like
so:&prompt.user; cc -o foobar foobar.c -lmAll right, I wrote this simple program to practice
using
-lm
. All it does is raise 2.1 to
the power of 6.#include <stdio.h>
int main() {
float f;
f = pow(2.1, 6);
printf("2.1 ^ 6 = %f\n", f);
return 0;
}
and I compiled it as:&prompt.user; cc temp.c -lmlike you said I should, but I get this when I run
it:&prompt.user; ./a.out
2.1 ^ 6 = 1023.000000
This is not the right answer!
What is going on?When the compiler sees you call a function, it
checks if it has already seen a prototype for it. If it
has not, it assumes the function returns an
int, which is definitely not what you want
here.So how do I fix this?The prototypes for the mathematical functions are in
math.h. If you include this file,
the compiler will be able to find the prototype and it
will stop doing strange things to your
calculation!#include <math.h>
#include <stdio.h>
int main() {
...
After recompiling it as you did before, run
it:&prompt.user; ./a.out
2.1 ^ 6 = 85.766121
If you are using any of the mathematical functions,
always include
math.h and remember to link in the
math library.I compiled a file called
foobar.c and I cannot find an
executable called foobar. Where's
it gone?Remember, cc will call the
executable a.out unless you tell it
differently. Use the
-o filename
option:&prompt.user; cc -o foobar foobar.cOK, I have an executable called
foobar, I can see it when I run
ls, but when I type in
foobar at the command prompt it tells
me there is no such file. Why can it not find
it?Unlike MS-DOS, Unix does not
look in the current directory when it is trying to find
out which executable you want it to run, unless you tell
it to. Either type ./foobar, which
means run the file called
foobar in the current
directory, or change your PATH environment
variable so that it looks something likebin:/usr/bin:/usr/local/bin:.
The dot at the end means look in the current
directory if it is not in any of the
others.I called my executable test,
but nothing happens when I run it. What is going
on?Most Unix systems have a program called
test in /usr/bin
and the shell is picking that one up before it gets to
checking the current directory. Either type:&prompt.user; ./testor choose a better name for your program!I compiled my program and it seemed to run all right
at first, then there was an error and it said something
about core dumped. What does that
mean?The name core dump dates back
to the very early days of Unix, when the machines used
core memory for storing data. Basically, if the program
failed under certain conditions, the system would write
the contents of core memory to disk in a file called
core, which the programmer could
then pore over to find out what went wrong.Fascinating stuff, but what I am supposed to do
now?Use gdb to analyse the core (see
).When my program dumped core, it said something about
a segmentation fault. What's
that?This basically means that your program tried to
perform some sort of illegal operation on memory; Unix
is designed to protect the operating system and other
programs from rogue programs.Common causes for this are:Trying to write to a NULL
pointer, egchar *foo = NULL;
strcpy(foo, "bang!");
Using a pointer that hasn't been initialised,
egchar *foo;
strcpy(foo, "bang!");
The pointer will have some random value that,
with luck, will point into an area of memory that
isn't available to your program and the kernel will
kill your program before it can do any damage. If
you're unlucky, it'll point somewhere inside your
own program and corrupt one of your data structures,
causing the program to fail mysteriously.Trying to access past the end of an array,
egint bar[20];
bar[27] = 6;
Trying to store something in read-only memory,
egchar *foo = "My string";
strcpy(foo, "bang!");
Unix compilers often put string literals like
"My string" into read-only areas
of memory.Doing naughty things with
malloc() and
free(), egchar bar[80];
free(bar);
orchar *foo = malloc(27);
free(foo);
free(foo);
Making one of these mistakes will not always lead to
an error, but they are always bad practice. Some
systems and compilers are more tolerant than others,
which is why programs that ran well on one system can
crash when you try them on an another.Sometimes when I get a core dump it says
bus error. It says in my Unix
book that this means a hardware problem, but the
computer still seems to be working. Is this
true?No, fortunately not (unless of course you really do
have a hardware problem…). This is usually
another way of saying that you accessed memory in a way
you shouldn't have.This dumping core business sounds as though it could
be quite useful, if I can make it happen when I want to.
Can I do this, or do I have to wait until there's an
error?Yes, just go to another console or xterm, do&prompt.user; psto find out the process ID of your program, and
do&prompt.user; kill -ABRT pidwhere
pid is
the process ID you looked up.This is useful if your program has got stuck in an
infinite loop, for instance. If your program happens to
trap SIGABRT, there are several other
signals which have a similar effect.MakeWhat is make?When you're working on a simple program with only one or
two source files, typing in&prompt.user; cc file1.c file2.cis not too bad, but it quickly becomes very tedious when
there are several files—and it can take a while to
compile, too.One way to get around this is to use object files and only
recompile the source file if the source code has changed. So
we could have something like:&prompt.user; cc file1.o file2.o … file37.c &hellip
if we'd changed file37.c, but not any
of the others, since the last time we compiled. This may
speed up the compilation quite a bit, but doesn't solve the
typing problem.Or we could write a shell script to solve the typing
problem, but it would have to re-compile everything, making it
very inefficient on a large project.What happens if we have hundreds of source files lying
about? What if we're working in a team with other people who
forget to tell us when they've changed one of their source
files that we use?Perhaps we could put the two solutions together and write
something like a shell script that would contain some kind of
magic rule saying when a source file needs compiling. Now all
we need now is a program that can understand these rules, as
it's a bit too complicated for the shell.This program is called make. It reads
in a file, called a makefile, that
tells it how different files depend on each other, and works
out which files need to be re-compiled and which ones don't.
For example, a rule could say something like if
fromboz.o is older than
fromboz.c, that means someone must have
changed fromboz.c, so it needs to be
re-compiled. The makefile also has rules telling
make how to re-compile the source file,
making it a much more powerful tool.Makefiles are typically kept in the same directory as the
source they apply to, and can be called
makefile, Makefile
or MAKEFILE. Most programmers use the
name Makefile, as this puts it near the
top of a directory listing, where it can easily be
seen.
They don't use the MAKEFILE form
as block capitals are often used for documentation files
like README.Example of using makeHere's a very simple make file:foo: foo.c
cc -o foo foo.c
It consists of two lines, a dependency line and a creation
line.The dependency line here consists of the name of the
program (known as the target), followed
by a colon, then whitespace, then the name of the source file.
When make reads this line, it looks to see
if foo exists; if it exists, it compares
the time foo was last modified to the
time foo.c was last modified. If
foo does not exist, or is older than
foo.c, it then looks at the creation line
to find out what to do. In other words, this is the rule for
working out when foo.c needs to be
re-compiled.The creation line starts with a tab (press
the tab key) and then the command you would
type to create foo if you were doing it
at a command prompt. If foo is out of
date, or does not exist, make then executes
this command to create it. In other words, this is the rule
which tells make how to re-compile
foo.c.So, when you type make, it will
make sure that foo is up to date with
respect to your latest changes to foo.c.
This principle can be extended to
Makefiles with hundreds of
targets—in fact, on FreeBSD, it is possible to compile
the entire operating system just by typing make
world in the appropriate directory!Another useful property of makefiles is that the targets
don't have to be programs. For instance, we could have a make
file that looks like this:foo: foo.c
cc -o foo foo.c
install:
cp foo /home/me
We can tell make which target we want to make by
typing:&prompt.user; make targetmake will then only look at that target
and ignore any others. For example, if we type
make foo with the makefile above, make
will ignore the install target.If we just type make on its own,
make will always look at the first target and then stop
without looking at any others. So if we typed
make here, it will just go to the
foo target, re-compile
foo if necessary, and then stop without
going on to the install target.Notice that the install target doesn't
actually depend on anything! This means that the command on
the following line is always executed when we try to make that
target by typing make install. In this
case, it will copy foo into the user's
home directory. This is often used by application makefiles,
so that the application can be installed in the correct
directory when it has been correctly compiled.This is a slightly confusing subject to try and explain.
If you don't quite understand how make
works, the best thing to do is to write a simple program like
hello world and a make file like the one above
and experiment. Then progress to using more than one source
file, or having the source file include a header file. The
touch command is very useful here—it
changes the date on a file without you having to edit
it.FreeBSD MakefilesMakefiles can be rather complicated to write. Fortunately,
BSD-based systems like FreeBSD come with some very powerful
ones as part of the system. One very good example of this is
the FreeBSD ports system. Here's the essential part of a
typical ports Makefile:MASTER_SITES= ftp://freefall.cdrom.com/pub/FreeBSD/LOCAL_PORTS/
DISTFILES= scheme-microcode+dist-7.3-freebsd.tgz
.include <bsd.port.mk>
Now, if we go to the directory for this port and type
make, the following happens:A check is made to see if the source code for this
port is already on the system.If it isn't, an FTP connection to the URL in
MASTER_SITES is set up to download the
source.The checksum for the source is calculated and compared
it with one for a known, good, copy of the source. This
is to make sure that the source was not corrupted while in
transit.Any changes required to make the source work on
FreeBSD are applied—this is known as
patching.Any special configuration needed for the source is
done. (Many Unix program distributions try to work out
which version of Unix they are being compiled on and which
optional Unix features are present—this is where
they are given the information in the FreeBSD ports
scenario).The source code for the program is compiled. In
effect, we change to the directory where the source was
unpacked and do make—the
program's own make file has the necessary information to
build the program.We now have a compiled version of the program. If we
wish, we can test it now; when we feel confident about the
program, we can type make install.
This will cause the program and any supporting files it
needs to be copied into the correct location; an entry is
also made into a package database, so
that the port can easily be uninstalled later if we change
our mind about it.Now I think you'll agree that's rather impressive for a
four line script!The secret lies in the last line, which tells
make to look in the system makefile called
bsd.port.mk. It's easy to overlook this
line, but this is where all the clever stuff comes
from—someone has written a makefile that tells
make to do all the things above (plus a
couple of other things I didn't mention, including handling
any errors that may occur) and anyone can get access to that
just by putting a single line in their own make file!If you want to have a look at these system makefiles,
they're in /usr/share/mk, but it's
probably best to wait until you've had a bit of practice with
makefiles, as they are very complicated (and if you do look at
them, make sure you have a flask of strong coffee
handy!)More advanced uses of makeMake is a very powerful tool, and can
do much more than the simple example above shows.
Unfortunately, there are several different versions of
make, and they all differ considerably.
The best way to learn what they can do is probably to read the
documentation—hopefully this introduction will have
given you a base from which you can do this.The version of make that comes with FreeBSD is the
Berkeley make; there is a tutorial
for it in /usr/share/doc/psd/12.make. To
view it, do&prompt.user; zmore paper.ascii.gzin that directory.Many applications in the ports use GNU
make, which has a very good set of
info pages. If you have installed any of these
ports, GNU make will automatically
have been installed as gmake. It's also
available as a port and package in its own right.To view the info pages for GNU
make, you will have to edit the
dir file in the
/usr/local/info directory to add an entry
for it. This involves adding a line like * Make: (make). The GNU Make utility.
to the file. Once you have done this, you can type
info and then select
make from the menu (or in
Emacs, do C-h
i).DebuggingThe DebuggerThe debugger that comes with FreeBSD is called
gdb (GNU
debugger). You start it up by typing&prompt.user; gdb prognamealthough most people prefer to run it inside
Emacs. You can do this by:M-x gdb RET progname RETUsing a debugger allows you to run the program under more
controlled circumstances. Typically, you can step through the
program a line at a time, inspect the value of variables,
change them, tell the debugger to run up to a certain point
and then stop, and so on. You can even attach to a program
that's already running, or load a core file to investigate why
the program crashed. It's even possible to debug the kernel,
though that's a little trickier than the user applications
we'll be discussing in this section.gdb has quite good on-line help, as
well as a set of info pages, so this section will concentrate
on a few of the basic commands.Finally, if you find its text-based command-prompt style
off-putting, there's a graphical front-end for it xxgdb in the ports
collection.This section is intended to be an introduction to using
gdb and does not cover specialised topics
such as debugging the kernel.Running a program in the debuggerYou'll need to have compiled the program with the
-g
option to get the most out of using
gdb. It will work without, but you'll only
see the name of the function you're in, instead of the source
code. If you see a line like:… (no debugging symbols found) …
when gdb starts up, you'll know that
the program wasn't compiled with the
-g
option.At the gdb prompt, type
break main. This will tell the
debugger to skip over the preliminary set-up code in the
program and start at the beginning of your code. Now type
run to start the program—it will
start at the beginning of the set-up code and then get stopped
by the debugger when it calls main().
(If you've ever wondered where main()
gets called from, now you know!).You can now step through the program, a line at a time, by
pressing n. If you get to a function call,
you can step into it by pressing s. Once
you're in a function call, you can return from stepping into a
function call by pressing f. You can also
use up and down to take
a quick look at the caller.Here's a simple example of how to spot a mistake in a
program with gdb. This is our program
(with a deliberate mistake):#include <stdio.h>
int bazz(int anint);
main() {
int i;
printf("This is my program\n");
bazz(i);
return 0;
}
int bazz(int anint) {
printf("You gave me %d\n", anint);
return anint;
}
This program sets i to be
5 and passes it to a function
bazz() which prints out the number we
gave it.When we compile and run the program we get&prompt.user; cc -g -o temp temp.c
&prompt.user; ./temp
This is my program
anint = 4231
That wasn't what we expected! Time to see what's going
on!&prompt.user; gdb temp
GDB is free software and you are welcome to distribute copies of it
under certain conditions; type "show copying" to see the conditions.
There is absolutely no warranty for GDB; type "show warranty" for details.
GDB 4.13 (i386-unknown-freebsd), Copyright 1994 Free Software Foundation, Inc.
(gdb) break main> Skip the set-up code>
Breakpoint 1 at 0x160f: file temp.c, line 9. gdb puts breakpoint at main()>>
(gdb) run> Run as far as main()>>
Starting program: /home/james/tmp/temp Program starts running>
Breakpoint 1, main () at temp.c:9 gdb stops at main()>>
(gdb) n> Go to next line>
This is my program Program prints out>
(gdb) s> step into bazz()>>
bazz (anint=4231) at temp.c:17 gdb displays stack frame>
(gdb)
Hang on a minute! How did anint get to be
4231? Didn't we set it to be
5 in main()? Let's
move up to main() and have a look.(gdb) up> Move up call stack>
#1 0x1625 in main () at temp.c:11 gdb displays stack frame>
(gdb) p i> Show us the value of i>>
$1 = 4231 gdb displays 4231>>
Oh dear! Looking at the code, we forgot to initialise
i. We meant to put…>
main() {
int i;
i = 5;
printf("This is my program\n");
&hellip>
but we left the i=5; line out. As we
didn't initialise i, it had whatever number
happened to be in that area of memory when the program ran,
which in this case happened to be
4231.gdb displays the stack frame every
time we go into or out of a function, even if we're using
up and down to move
around the call stack. This shows the name of the function
and the values of its arguments, which helps us keep track
of where we are and what's going on. (The stack is a
storage area where the program stores information about the
arguments passed to functions and where to go when it
returns from a function call).Examining a core fileA core file is basically a file which contains the
complete state of the process when it crashed. In the
good old days, programmers had to print out hex
listings of core files and sweat over machine code manuals,
but now life is a bit easier. Incidentally, under FreeBSD and
other 4.4BSD systems, a core file is called
- progname>.core> instead of just
+ progname.core instead of just
core, to make it clearer which program a
core file belongs to.To examine a core file, start up gdb in
the usual way. Instead of typing break or
run, type(gdb) core progname.coreIf you're not in the same directory as the core file,
you'll have to do dir
/path/to/core/file first.You should see something like this:&prompt.user; gdb a.out
GDB is free software and you are welcome to distribute copies of it
under certain conditions; type "show copying" to see the conditions.
There is absolutely no warranty for GDB; type "show warranty" for details.
GDB 4.13 (i386-unknown-freebsd), Copyright 1994 Free Software Foundation, Inc.
(gdb) core a.out.core
Core was generated by `a.out'.
Program terminated with signal 11, Segmentation fault.
Cannot access memory at address 0x7020796d.
#0 0x164a in bazz (anint=0x5) at temp.c:17
(gdb)
In this case, the program was called
a.out, so the core file is called
a.out.core. We can see that the program
crashed due to trying to access an area in memory that was not
available to it in a function called
bazz.Sometimes it's useful to be able to see how a function was
called, as the problem could have occurred a long way up the
call stack in a complex program. The bt
command causes gdb to print out a
back-trace of the call stack:(gdb) bt
#0 0x164a in bazz (anint=0x5) at temp.c:17
#1 0xefbfd888 in end ()
#2 0x162c in main () at temp.c:11
(gdb)
The end() function is called when a
program crashes; in this case, the bazz()
function was called from main().Attaching to a running programOne of the neatest features about gdb
is that it can attach to a program that's already running. Of
course, that assumes you have sufficient permissions to do so.
A common problem is when you are stepping through a program
that forks, and you want to trace the child, but the debugger
will only let you trace the parent.What you do is start up another gdb,
use ps to find the process ID for the
child, and do(gdb) attach pidin gdb, and then debug as usual.That's all very well, you're probably
thinking, but by the time I've done that, the child
process will be over the hill and far away. Fear
not, gentle reader, here's how to do it (courtesy of the
gdb info pages):&hellip
if ((pid = fork()) < 0) /* _Always_ check this */
error();
else if (pid == 0) { /* child */
int PauseMode = 1;
while (PauseMode)
sleep(10); /* Wait until someone attaches to us */
&hellip
} else { /* parent */
&hellipNow all you have to do is attach to the child, set
PauseMode to 0, and wait
for the sleep() call to return!Using Emacs as a Development EnvironmentEmacsUnfortunately, Unix systems don't come with the kind of
everything-you-ever-wanted-and-lots-more-you-didn't-in-one-gigantic-package
integrated development environments that other systems
have.
At least, not unless you pay out very large sums of
money.
However, it is possible to set up your own environment. It
may not be as pretty, and it may not be quite as integrated,
but you can set it up the way you want it. And it's free.
And you have the source to it.The key to it all is Emacs. Now there are some people who
loathe it, but many who love it. If you're one of the former,
I'm afraid this section will hold little of interest to you.
Also, you'll need a fair amount of memory to run it—I'd
recommend 8MB in text mode and 16MB in X as the bare minimum
to get reasonable performance.Emacs is basically a highly customisable
editor—indeed, it has been customised to the point where
it's more like an operating system than an editor! Many
developers and sysadmins do in fact spend practically all
their time working inside Emacs, leaving it only to log
out.It's impossible even to summarise everything Emacs can do
here, but here are some of the features of interest to
developers:Very powerful editor, allowing search-and-replace on
both strings and regular expressions (patterns), jumping
to start/end of block expression, etc, etc.Pull-down menus and online help.Language-dependent syntax highlighting and
indentation.Completely customisable.You can compile and debug programs within
Emacs.On a compilation error, you can jump to the offending
line of source code.Friendly-ish front-end to the info
program used for reading GNU hypertext documentation,
including the documentation on Emacs itself.Friendly front-end to gdb, allowing
you to look at the source code as you step through your
program.You can read Usenet news and mail while your program
is compiling.And doubtless many more that I've overlooked.Emacs can be installed on FreeBSD using the Emacs
port.Once it's installed, start it up and do C-h
t to read an Emacs tutorial—that means
hold down the control key, press
h, let go of the control
key, and then press t. (Alternatively, you
can you use the mouse to select Emacs
Tutorial from the Help
menu).Although Emacs does have menus, it's well worth learning
the key bindings, as it's much quicker when you're editing
something to press a couple of keys than to try and find the
mouse and then click on the right place. And, when you're
talking to seasoned Emacs users, you'll find they often
casually throw around expressions like M-x
replace-s RET foo RET bar RET so it's
useful to know what they mean. And in any case, Emacs has far
too many useful functions for them to all fit on the menu
bars.Fortunately, it's quite easy to pick up the key-bindings,
as they're displayed next to the menu item. My advice is to
use the menu item for, say, opening a file until you
understand how it works and feel confident with it, then try
doing C-x C-f. When you're happy with that, move on to
another menu command.If you can't remember what a particular combination of
keys does, select Describe Key from
the Help menu and type it in—Emacs
will tell you what it does. You can also use the
Command Apropos menu item to find
out all the commands which contain a particular word in them,
with the key binding next to it.By the way, the expression above means hold down the
Meta key, press x, release
the Meta key, type
replace-s (short for
replace-string—another feature of
Emacs is that you can abbreviate commands), press the
return key, type foo
(the string you want replaced), press the
return key, type bar (the string you want to
replace foo with) and press
return again. Emacs will then do the
search-and-replace operation you've just requested.If you're wondering what on earth the
Meta key is, it's a special key that many
Unix workstations have. Unfortunately, PC's don't have one,
so it's usually the alt key (or if you're
unlucky, the escape key).Oh, and to get out of Emacs, do C-x C-c
(that means hold down the control key, press
x, press c and release the
control key). If you have any unsaved files
open, Emacs will ask you if you want to save them. (Ignore
the bit in the documentation where it says
C-z is the usual way to leave
Emacs—that leaves Emacs hanging around in the
background, and is only really useful if you're on a system
which doesn't have virtual terminals).Configuring EmacsEmacs does many wonderful things; some of them are built
in, some of them need to be configured.Instead of using a proprietary macro language for
configuration, Emacs uses a version of Lisp specially adapted
for editors, known as Emacs Lisp. This can be quite useful if
you want to go on and learn something like Common Lisp, as
it's considerably smaller than Common Lisp (although still
quite big!).The best way to learn Emacs Lisp is to download the Emacs
TutorialHowever, there's no need to actually know any Lisp to get
started with configuring Emacs, as I've included a sample
.emacs file, which should be enough to
get you started. Just copy it into your home directory and
restart Emacs if it's already running; it will read the
commands from the file and (hopefully) give you a useful basic
setup.A sample .emacs fileUnfortunately, there's far too much here to explain it in
detail; however there are one or two points worth
mentioning.
- Everything beginning with a ;> is a comment
+ Everything beginning with a ; is a comment
and is ignored by Emacs.In the first line, the
-*- Emacs-Lisp -*- is so that
we can edit the .emacs file itself
within Emacs and get all the fancy features for editing
Emacs Lisp. Emacs usually tries to guess this based on
the filename, and may not get it right for
.emacs.The tab key is bound to an
indentation function in some modes, so when you press the
tab key, it will indent the current line of code. If you
want to put a tab character in whatever
you're writing, hold the control key down
while you're pressing the tab key.This file supports syntax highlighting for C, C++,
Perl, Lisp and Scheme, by guessing the language from the
filename.Emacs already has a pre-defined function called
next-error. In a compilation output
window, this allows you to move from one compilation error
to the next by doing M-n; we define a
complementary function,
previous-error, that allows you to go
to a previous error by doing M-p. The
nicest feature of all is that C-c C-c
will open up the source file in which the error occurred
and jump to the appropriate line.We enable Emacs's ability to act as a server, so that
if you're doing something outside Emacs and you want to
edit a file, you can just type in&prompt.user; emacsclient filenameand then you can edit the file in your
Emacs!
Many Emacs users set their EDITOR environment to
emacsclient so this happens every
time they need to edit a file.A sample .emacs file;; -*-Emacs-Lisp-*-
;; This file is designed to be re-evaled; use the variable first-time
;; to avoid any problems with this.
(defvar first-time t
"Flag signifying this is the first time that .emacs has been evaled")
;; Meta
(global-set-key "\M- " 'set-mark-command)
(global-set-key "\M-\C-h" 'backward-kill-word)
(global-set-key "\M-\C-r" 'query-replace)
(global-set-key "\M-r" 'replace-string)
(global-set-key "\M-g" 'goto-line)
(global-set-key "\M-h" 'help-command)
;; Function keys
(global-set-key [f1] 'manual-entry)
(global-set-key [f2] 'info)
(global-set-key [f3] 'repeat-complex-command)
(global-set-key [f4] 'advertised-undo)
(global-set-key [f5] 'eval-current-buffer)
(global-set-key [f6] 'buffer-menu)
(global-set-key [f7] 'other-window)
(global-set-key [f8] 'find-file)
(global-set-key [f9] 'save-buffer)
(global-set-key [f10] 'next-error)
(global-set-key [f11] 'compile)
(global-set-key [f12] 'grep)
(global-set-key [C-f1] 'compile)
(global-set-key [C-f2] 'grep)
(global-set-key [C-f3] 'next-error)
(global-set-key [C-f4] 'previous-error)
(global-set-key [C-f5] 'display-faces)
(global-set-key [C-f8] 'dired)
(global-set-key [C-f10] 'kill-compilation)
;; Keypad bindings
(global-set-key [up] "\C-p")
(global-set-key [down] "\C-n")
(global-set-key [left] "\C-b")
(global-set-key [right] "\C-f")
(global-set-key [home] "\C-a")
(global-set-key [end] "\C-e")
(global-set-key [prior] "\M-v")
(global-set-key [next] "\C-v")
(global-set-key [C-up] "\M-\C-b")
(global-set-key [C-down] "\M-\C-f")
(global-set-key [C-left] "\M-b")
(global-set-key [C-right] "\M-f")
(global-set-key [C-home] "\M-<")
(global-set-key [C-end] "\M->")
(global-set-key [C-prior] "\M-<")
(global-set-key [C-next] "\M->")
;; Mouse
(global-set-key [mouse-3] 'imenu)
;; Misc
(global-set-key [C-tab] "\C-q\t") ; Control tab quotes a tab.
(setq backup-by-copying-when-mismatch t)
;; Treat 'y' or <CR> as yes, 'n' as no.
(fset 'yes-or-no-p 'y-or-n-p)
(define-key query-replace-map [return] 'act)
(define-key query-replace-map [?\C-m] 'act)
;; Load packages
(require 'desktop)
(require 'tar-mode)
;; Pretty diff mode
(autoload 'ediff-buffers "ediff" "Intelligent Emacs interface to diff" t)
(autoload 'ediff-files "ediff" "Intelligent Emacs interface to diff" t)
(autoload 'ediff-files-remote "ediff"
"Intelligent Emacs interface to diff")
(if first-time
(setq auto-mode-alist
(append '(("\\.cpp$" . c++-mode)
("\\.hpp$" . c++-mode)
("\\.lsp$" . lisp-mode)
("\\.scm$" . scheme-mode)
("\\.pl$" . perl-mode)
) auto-mode-alist)))
;; Auto font lock mode
(defvar font-lock-auto-mode-list
(list 'c-mode 'c++-mode 'c++-c-mode 'emacs-lisp-mode 'lisp-mode 'perl-mode 'scheme-mode)
"List of modes to always start in font-lock-mode")
(defvar font-lock-mode-keyword-alist
'((c++-c-mode . c-font-lock-keywords)
(perl-mode . perl-font-lock-keywords))
"Associations between modes and keywords")
(defun font-lock-auto-mode-select ()
"Automatically select font-lock-mode if the current major mode is
in font-lock-auto-mode-list"
(if (memq major-mode font-lock-auto-mode-list)
(progn
(font-lock-mode t))
)
)
(global-set-key [M-f1] 'font-lock-fontify-buffer)
;; New dabbrev stuff
;(require 'new-dabbrev)
(setq dabbrev-always-check-other-buffers t)
(setq dabbrev-abbrev-char-regexp "\\sw\\|\\s_")
(add-hook 'emacs-lisp-mode-hook
'(lambda ()
(set (make-local-variable 'dabbrev-case-fold-search) nil)
(set (make-local-variable 'dabbrev-case-replace) nil)))
(add-hook 'c-mode-hook
'(lambda ()
(set (make-local-variable 'dabbrev-case-fold-search) nil)
(set (make-local-variable 'dabbrev-case-replace) nil)))
(add-hook 'text-mode-hook
'(lambda ()
(set (make-local-variable 'dabbrev-case-fold-search) t)
(set (make-local-variable 'dabbrev-case-replace) t)))
;; C++ and C mode...
(defun my-c++-mode-hook ()
(setq tab-width 4)
(define-key c++-mode-map "\C-m" 'reindent-then-newline-and-indent)
(define-key c++-mode-map "\C-ce" 'c-comment-edit)
(setq c++-auto-hungry-initial-state 'none)
(setq c++-delete-function 'backward-delete-char)
(setq c++-tab-always-indent t)
(setq c-indent-level 4)
(setq c-continued-statement-offset 4)
(setq c++-empty-arglist-indent 4))
(defun my-c-mode-hook ()
(setq tab-width 4)
(define-key c-mode-map "\C-m" 'reindent-then-newline-and-indent)
(define-key c-mode-map "\C-ce" 'c-comment-edit)
(setq c-auto-hungry-initial-state 'none)
(setq c-delete-function 'backward-delete-char)
(setq c-tab-always-indent t)
;; BSD-ish indentation style
(setq c-indent-level 4)
(setq c-continued-statement-offset 4)
(setq c-brace-offset -4)
(setq c-argdecl-indent 0)
(setq c-label-offset -4))
;; Perl mode
(defun my-perl-mode-hook ()
(setq tab-width 4)
(define-key c++-mode-map "\C-m" 'reindent-then-newline-and-indent)
(setq perl-indent-level 4)
(setq perl-continued-statement-offset 4))
;; Scheme mode...
(defun my-scheme-mode-hook ()
(define-key scheme-mode-map "\C-m" 'reindent-then-newline-and-indent))
;; Emacs-Lisp mode...
(defun my-lisp-mode-hook ()
(define-key lisp-mode-map "\C-m" 'reindent-then-newline-and-indent)
(define-key lisp-mode-map "\C-i" 'lisp-indent-line)
(define-key lisp-mode-map "\C-j" 'eval-print-last-sexp))
;; Add all of the hooks...
(add-hook 'c++-mode-hook 'my-c++-mode-hook)
(add-hook 'c-mode-hook 'my-c-mode-hook)
(add-hook 'scheme-mode-hook 'my-scheme-mode-hook)
(add-hook 'emacs-lisp-mode-hook 'my-lisp-mode-hook)
(add-hook 'lisp-mode-hook 'my-lisp-mode-hook)
(add-hook 'perl-mode-hook 'my-perl-mode-hook)
;; Complement to next-error
(defun previous-error (n)
"Visit previous compilation error message and corresponding source code."
(interactive "p")
(next-error (- n)))
;; Misc...
(transient-mark-mode 1)
(setq mark-even-if-inactive t)
(setq visible-bell nil)
(setq next-line-add-newlines nil)
(setq compile-command "make")
(setq suggest-key-bindings nil)
(put 'eval-expression 'disabled nil)
(put 'narrow-to-region 'disabled nil)
(put 'set-goal-column 'disabled nil)
;; Elisp archive searching
(autoload 'format-lisp-code-directory "lispdir" nil t)
(autoload 'lisp-dir-apropos "lispdir" nil t)
(autoload 'lisp-dir-retrieve "lispdir" nil t)
(autoload 'lisp-dir-verify "lispdir" nil t)
;; Font lock mode
(defun my-make-face (face colour &optional bold)
"Create a face from a colour and optionally make it bold"
(make-face face)
(copy-face 'default face)
(set-face-foreground face colour)
(if bold (make-face-bold face))
)
(if (eq window-system 'x)
(progn
(my-make-face 'blue "blue")
(my-make-face 'red "red")
(my-make-face 'green "dark green")
(setq font-lock-comment-face 'blue)
(setq font-lock-string-face 'bold)
(setq font-lock-type-face 'bold)
(setq font-lock-keyword-face 'bold)
(setq font-lock-function-name-face 'red)
(setq font-lock-doc-string-face 'green)
(add-hook 'find-file-hooks 'font-lock-auto-mode-select)
(setq baud-rate 1000000)
(global-set-key "\C-cmm" 'menu-bar-mode)
(global-set-key "\C-cms" 'scroll-bar-mode)
(global-set-key [backspace] 'backward-delete-char)
; (global-set-key [delete] 'delete-char)
(standard-display-european t)
(load-library "iso-transl")))
;; X11 or PC using direct screen writes
(if window-system
(progn
;; (global-set-key [M-f1] 'hilit-repaint-command)
;; (global-set-key [M-f2] [?\C-u M-f1])
(setq hilit-mode-enable-list
'(not text-mode c-mode c++-mode emacs-lisp-mode lisp-mode
scheme-mode)
hilit-auto-highlight nil
hilit-auto-rehighlight 'visible
hilit-inhibit-hooks nil
hilit-inhibit-rebinding t)
(require 'hilit19)
(require 'paren))
(setq baud-rate 2400) ; For slow serial connections
)
;; TTY type terminal
(if (and (not window-system)
(not (equal system-type 'ms-dos)))
(progn
(if first-time
(progn
(keyboard-translate ?\C-h ?\C-?)
(keyboard-translate ?\C-? ?\C-h)))))
;; Under UNIX
(if (not (equal system-type 'ms-dos))
(progn
(if first-time
(server-start))))
;; Add any face changes here
(add-hook 'term-setup-hook 'my-term-setup-hook)
(defun my-term-setup-hook ()
(if (eq window-system 'pc)
(progn
;; (set-face-background 'default "red")
)))
;; Restore the "desktop" - do this as late as possible
(if first-time
(progn
(desktop-load-default)
(desktop-read)))
;; Indicate that this file has been read at least once
(setq first-time nil)
;; No need to debug anything now
(setq debug-on-error nil)
;; All done
(message "All done, %s%s" (user-login-name) ".")
Extending the Range of Languages Emacs UnderstandsNow, this is all very well if you only want to program in
the languages already catered for in the
.emacs file (C, C++, Perl, Lisp and
Scheme), but what happens if a new language called
whizbang comes out, full of exciting
features?The first thing to do is find out if whizbang comes with
any files that tell Emacs about the language. These usually
end in .el, short for Emacs
Lisp. For example, if whizbang is a FreeBSD port, we
can locate these files by doing&prompt.user; find /usr/ports/lang/whizbang -name "*.el" -printand install them by copying them into the Emacs site Lisp
directory. On FreeBSD 2.1.0-RELEASE, this is
/usr/local/share/emacs/site-lisp.So for example, if the output from the find command
was/usr/ports/lang/whizbang/work/misc/whizbang.el
we would do&prompt.root; cp /usr/ports/lang/whizbang/work/misc/whizbang.el /usr/local/share/emacs/site-lispNext, we need to decide what extension whizbang source
files have. Let's say for the sake of argument that they all
end in .wiz. We need to add an entry to
our .emacs file to make sure Emacs will
be able to use the information in
whizbang.el.Find the auto-mode-alist entry in
.emacs and add a line for whizbang, such
as:…>
("\\.lsp$" . lisp-mode)
("\\.wiz$" . whizbang-mode)
("\\.scm$" . scheme-mode)
…>
This means that Emacs will automatically go into
whizbang-mode when you edit a file ending
in .wiz.Just below this, you'll find the
font-lock-auto-mode-list entry. Add
whizbang-mode to it like so:;; Auto font lock mode
(defvar font-lock-auto-mode-list
(list 'c-mode 'c++-mode 'c++-c-mode 'emacs-lisp-mode 'whizbang-mode 'lisp-mode 'perl-mode 'scheme-mode)
"List of modes to always start in font-lock-mode")
This means that Emacs will always enable
font-lock-mode (ie syntax highlighting)
when editing a .wiz file.And that's all that's needed. If there's anything else
you want done automatically when you open up a
.wiz file, you can add a
whizbang-mode hook (see
my-scheme-mode-hook for a simple example
that adds auto-indent).Further ReadingBrian Harvey and Matthew Wright
Simply Scheme
MIT 1994.
ISBN 0-262-08226-8Randall Schwartz
Learning Perl
O'Reilly 1993
ISBN 1-56592-042-2Patrick Henry Winston and Berthold Klaus Paul Horn
Lisp (3rd Edition)
Addison-Wesley 1989
ISBN 0-201-08319-1Brian W. Kernighan and Rob Pike
The Unix Programming Environment
Prentice-Hall 1984
ISBN 0-13-937681-XBrian W. Kernighan and Dennis M. Ritchie
The C Programming Language (2nd Edition)
Prentice-Hall 1988
ISBN 0-13-110362-8Bjarne Stroustrup
The C++ Programming Language
Addison-Wesley 1991
ISBN 0-201-53992-6W. Richard Stevens
Advanced Programming in the Unix Environment
Addison-Wesley 1992
ISBN 0-201-56317-7W. Richard Stevens
Unix Network Programming
Prentice-Hall 1990
ISBN 0-13-949876-1
diff --git a/en_US.ISO_8859-1/articles/fonts/article.sgml b/en_US.ISO_8859-1/articles/fonts/article.sgml
index d51ac5b7d1..b1629c70c7 100644
--- a/en_US.ISO_8859-1/articles/fonts/article.sgml
+++ b/en_US.ISO_8859-1/articles/fonts/article.sgml
@@ -1,980 +1,980 @@
-
+
%man;
]>
Fonts and FreeBSDA TutorialDaveBodenstabimdave@synet.netWed Aug 7, 1996This document contains a description of the various font
files that may be used with FreeBSD and the syscons driver,
X11, Ghostscript and Groff. Cookbook examples are provided
for switching the syscons display to 80x60 mode, and for using
type 1 fonts with the above application programs.IntroductionThere are many sources of fonts available, and one might ask
how they might be used with FreeBSD. The answer can be found by
carefully searching the documentation for the component that one
would like to use. This is very time consuming, so this
tutorial is an attempt to provide a shortcut for others who
might be interested.Basic terminologyThere are many different font formats and associated font
file suffixes. A few that will be addressed here are:
- .pfa>, .pfb>
+ .pfa, .pfbPostscript type 1 fonts. The
.pfa is the
Ascii form and
.pfb the Binary
form.
- .afm>
+ .afmThe font metrics associated with a type 1 font.
- .pfm>
+ .pfmThe printer font metrics associated with a type 1
font.
- .ttf>
+ .ttfA TrueType font
- .fot>
+ .fotAn indirect reference to a TrueType font (not an
actual font)
- .fon>, .fnt>
+ .fon, .fntBitmapped screen fontsThe .fot file is used by Windows as
sort of a symbolic link to the actual TrueType font
(.ttf) file. The .fon
font files are also used by Windows. I know of no way to use
this font format with FreeBSD.What font formats can I use?Which font file format is useful depends on the application
being used. FreeBSD by itself uses no fonts. Application
programs and/or drivers may make use of the font files. Here is
a small cross reference of application/driver to the font type
suffixes:Driversyscons
- .fnt>
+ .fntApplicationGhostscript.pfa,
.pfb,
.ttfX11.pfa,
.pfbGroff.pfa,
.afmPovray.ttfThe .fnt suffix is used quite
frequently. I suspect that whenever someone wanted to create a
specialized font file for their application, more often than not
they chose this suffix. Therefore, it is likely that files with
this suffix are not all the same format; specifically, the
.fnt files used by syscons under FreeBSD
may not be the same format as a .fnt file
one encounters in the MSDOS/Windows environment. I have not
made any attempt at using other .fnt files
other than those provided with FreeBSD.Setting a virtual console to 80x60 line modeFirst, an 8x8 font must be loaded. To do this,
/etc/rc.conf should contain the
line (change the font name to an appropriate one for
your locale):font8x8="iso-8x8" # font 8x8 from /usr/share/syscons/fonts/* (or NO).
The command to actually switch the mode is
&man.vidcontrol.1:bash$ vidcontrol VGA_80x60Various screen orientated programs, such as &man.vi.1, must
be able to determine the current screen dimensions. As this is
achieved this through ioctl calls to the console
driver (such as &man.syscons.4) they will correctly determine the new
screen dimensions.To make this more seamless, one can embed these commands in
the startup scripts so it takes place when the system boots.
To do this is add this line to /etc/rc.confallscreens_flags="VGA_80x60" # Set this vidcontrol mode for all virtual screens
References: &man.rc.conf.5;, &man.vidcontrol.1;.Using type 1 fonts with X11X11 can use either the .pfa or the
.pfb format fonts. The X11 fonts are
located in various subdirectories under
/usr/X11R6/lib/X11/fonts. Each font file
is cross referenced to its X11 name by the contents of the
fonts.dir file in each directory.
- There is already a directory named Type1>. The
+ There is already a directory named Type1. The
most straight forward way to add a new font is to put it into
this directory. A better way is to keep all new fonts in a
separate directory and use a symbolic link to the additional
font. This allows one to more easily keep track of ones fonts
without confusing them with the fonts that were originally
provided. For example:Create a directory to contain the font files>
bash$ mkdir -p /usr/local/share/fonts/type1>
bash$ cd /usr/local/share/fonts/type1>
Place the .pfa, .pfb and .afm files here>
One might want to keep readme files, and other documentation>
for the fonts here also>
bash$ cp /cdrom/fonts/atm/showboat/showboat.pfb .>
bash$ cp /cdrom/fonts/atm/showboat/showboat.afm .>
Maintain an index to cross reference the fonts>
bash$ echo showboat - InfoMagic CICA, Dec 1994, /fonts/atm/showboat >>INDEX>
Now, to use a new font with X11, one must make the font file
available and update the font name files. The X11 font names
look like:-bitstream-charter-medium-r-normal-xxx-0-0-0-0-p-0-iso8859-1
| | | | | | | | | | | | \ \
| | | | | \ \ \ \ \ \ \ +----+- character set
| | | | \ \ \ \ \ \ \ +- average width
| | | | \ \ \ \ \ \ +- spacing
| | | \ \ \ \ \ \ +- vertical res.
| | | \ \ \ \ \ +- horizontal res.
| | | \ \ \ \ +- points
| | | \ \ \ +- pixels
| | | \ \ \
foundry family weight slant width additional style
A new name needs to be created for each new font. If you
have some information from the documentation that accompanied
the font, then it could serve as the basis for creating the
name. If there is no information, then you can get some idea by
using &man.strings.1; on the font file. For example:bash$ strings showboat.pfb | more>
%!FontType1-1.0: Showboat 001.001
%%CreationDate: 1/15/91 5:16:03 PM
%%VMusage: 1024 45747
% Generated by Fontographer 3.1
% Showboat
1991 by David Rakowski. Alle Rechte Vorbehalten.
FontDirectory/Showboat known{/Showboat findfont dup/UniqueID known{dup
/UniqueID get 4962377 eq exch/FontType get 1 eq and}{pop false}ifelse
{save true}{false}ifelse}{false}ifelse
12 dict begin
/FontInfo 9 dict dup begin
/version (001.001) readonly def
/FullName (Showboat) readonly def
/FamilyName (Showboat) readonly def
/Weight (Medium) readonly def
/ItalicAngle 0 def
/isFixedPitch false def
/UnderlinePosition -106 def
/UnderlineThickness 16 def
/Notice (Showboat
1991 by David Rakowski. Alle Rechte Vorbehalten.) readonly def
end readonly def
/FontName /Showboat def
--stdin--
Using this information, a possible name might be:-type1-Showboat-medium-r-normal-decorative-0-0-0-0-p-0-iso8859-1
The components of our name are:FoundryLets just name all the new fonts
- type1>.
+ type1.FamilyThe name of the font.WeightNormal, bold, medium, semibold, etc. From the
- strings>1>>
+ strings1
output above, it appears that this font has a weight of
medium.Slantroman, italic, oblique, etc. Since the
ItalicAngle is zero,
roman will be used.WidthNormal, wide, condensed, extended, etc. Until it can
be examined, the assumption will be
normal.Additional styleUsually omitted, but this will indicate that the font
contains decorative capital letters.Spacingproportional or monospaced.
Proportional is used since
isFixedPitch is false.All of these names are arbitrary, but one should strive to
be compatible with the existing conventions. A font is
referenced by name with possible wild cards by an X11 program,
so the name chosen should make some sense. One might begin by
simply using
…-normal-r-normal-…-p-…
as the name, and then use
- xfontsel>1>> to
+ xfontsel1 to
examine it and adjust the name based on the appearance of the
font.So, to complete our example:Make the font accessible to X11>
bash$ cd /usr/X11R6/lib/X11/fonts/Type1>
bash$ ln -s /usr/local/share/fonts/type1/showboat.pfb .>
Edit fonts.dir and fonts.scale, adding the line describing the font
and incrementing the number of fonts which is found on the first line.>
bash$ ex fonts.dir
:1p
25
:1c
26
.
:$a
showboat.pfb -type1-showboat-medium-r-normal-decorative-0-0-0-0-p-0-iso8859-1
.
:wq>
fonts.scale> seems to be identical to fonts.dir>…>
bash$ cp fonts.dir fonts.scale>
Tell X11 that things have changed>
bash$ xset fp rehash>
Examine the new font>
bash$ xfontsel -pattern -type1-*>
References: &man.xfontsel.1;, &man.xset.1;, The X
- Windows System in a Nutshell>, , O'Reilly &
Associates.Using type 1 fonts with Ghostscript
- Ghostscript references a font via its Fontmap>
+ Ghostscript references a font via its Fontmap
file. This must be modified in a similar way to the X11
fonts.dir file. Ghostscript can use either
the .pfa or the .pfb
format fonts. Using the font from the previous example, here is
how to use it with Ghostscript:Put the font in Ghostscript's font directory>
bash$ cd /usr/local/share/ghostscript/fonts>
bash$ ln -s /usr/local/share/fonts/type1/showboat.pfb .>
Edit Fontmap so Ghostscript knows about the font>
bash$ cd /usr/local/share/ghostscript/4.01>
bash$ ex Fontmap
:$a
/Showboat (showboat.pfb) ; % From CICA /fonts/atm/showboat
.
:wq>
Use Ghostscript to examine the font>
bash$ gs prfont.ps>
Aladdin Ghostscript 4.01 (1996-7-10)
Copyright (C) 1996 Aladdin Enterprises, Menlo Park, CA. All rights
reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Loading Times-Roman font from /usr/local/share/ghostscript/fonts/tir_____.pfb...
/1899520 581354 1300084 13826 0 done.
GS>Showboat DoFont>
Loading Showboat font from /usr/local/share/ghostscript/fonts/showboat.pfb...
1939688 565415 1300084 16901 0 done.
>>showpage, press <return> to continue<<
>>showpage, press <return> to continue<<
>>showpage, press <return> to continue<<
GS>quit>
References: fonts.txt in the
Ghostscript 4.01 distributionUsing type 1 fonts with GroffNow that the new font can be used by both X11 and
Ghostscript, how can one use the new font with groff? First of
all, since we are dealing with type 1 postscript fonts, the
groff device that is applicable is the ps
device. A font file must be created for each font that groff
can use. A groff font name is just a file in
/usr/share/groff_font/devps. With our
example, the font file could be
/usr/share/groff_font/devps/SHOWBOAT. The
file must be created using tools provided by groff.
- The first tool is afmtodit>. This is not
+ The first tool is afmtodit. This is not
normally installed, so it must be retrieved from the source
distribution. I found I had to change the first line of the
file, so I did:bash$ cp /usr/src/gnu/usr.bin/groff/afmtodit/afmtodit.pl /tmp>
bash$ ex /tmp/afmtodit.pl
:1c
#!/usr/bin/perl -P-
.
:wq>
This tool will create the groff font file from the metrics
file (.afm suffix.) Continuing with our
example:Many .afm> files are in Mac format&hellip ^M delimited lines
We need to convert them to unix style ^J delimited lines>
bash$ cd /tmp>
bash$ cat /usr/local/share/fonts/type1/showboat.afm |
tr '\015' '\012' >showboat.afm>
Now create the groff font file>
bash$ cd /usr/share/groff_font/devps>
bash$ /tmp/afmtodit.pl -d DESC -e text.enc /tmp/showboat.afm generate/textmap SHOWBOAT>
The font can now be referenced with the name
SHOWBOAT.If ghostscript is used to drive the printers on the system,
then nothing more needs to be done. However, if true postscript
printers are used, then the font must be down loaded to the
printer in order for the font to be used (unless the printer
happens to have the showboat font built in or on an accessible
font disk.) The final step is to create a down loadable font.
- The pfbtops> tool is used to create the
+ The pfbtops tool is used to create the
.pfa format of the font, and the
- download> file is modified to reference the new
- font. The download> file must reference the
+ download file is modified to reference the new
+ font. The download file must reference the
internal name of the font. This can easily be determined from
the groff font file as illustrated:Create the .pfa> font file>
bash$ pfbtops /usr/local/share/fonts/type1/showboat.pfb >showboat.pfa>
Of course, if the .pfa file is already
available, just use a symbolic link to reference it.Get the internal font name>
bash$ fgrep internalname SHOWBOAT>
internalname Showboat
Tell groff that the font must be down loaded>
bash$ ex download
:$a
Showboat showboat.pfa
.
:wq>
To test the font:bash$ cd /tmp>
bash$ cat >example.t <<EOF
.sp 5
.ps 16
This is an example of the Showboat font:
.br
.ps 48
.vs (\n(.s+2)p
.sp
.ft SHOWBOAT
ABCDEFGHI
.br
JKLMNOPQR
.br
STUVWXYZ
.sp
.ps 16
.vs (\n(.s+2)p
.fp 5 SHOWBOAT
.ft R
To use it for the first letter of a paragraph, it will look like:
.sp 50p
\s(48\f5H\s0\fRere is the first sentence of a paragraph that uses the
showboat font as its first letter.
Additional vertical space must be used to allow room for the larger
letter.
EOF>
bash$ groff -Tps example.t >example.ps>
To use ghostscript/ghostview>
bash$ ghostview example.ps>
To print it>
bash$ lpr -Ppostscript example.ps>
References:
/usr/src/gnu/usr.bin/groff/afmtodit/afmtodit.man,
&man.groff.font.5;, &man.groff.char.7;, &man.pfbtops.1;.Converting TrueType fonts to a groff/postscript format for
groffThis potentially requires a bit of work, simply because it
depends on some utilities that are not installed as part of the
base system. They are:ttf2pfTrueType to postscript convertsion utilities. This
allows conversion of a TrueType font to an ascii font
metric (.afm) file.Currently available at http://sunsite.icm.edu.pl/pub/GUST/contrib/BachoTeX98/ttf2pf.
Note: These files are postscript programs and must be
downloaded to disk by holding down the
Shift key when clicking on the link.
Otherwise, your browser may try to launch
ghostview to view them.The files of interest are:
- GS_TTF.PSGS_TTF.PSPF2AFM.PSttf2pf.psThe funny upper/lower case is due to their being
intended also for DOS shells.
ttf2pf.ps makes use of the others as
upper case, so any renaming must be consistent with this.
(Actually, GS_TTF.PS and
PFS2AFM.PS are supposedly part of the
ghostscript distribution, but it's just as easy to use
these as an isolated utility. FreeBSD doesn't seem to
include the latter.) You also may want to have these
installed to
/usr/local/share/groff_font/devps(?).afmtoditCreates font files for use with groff from ascii font
metrics file. This usually resides in the directory,
/usr/src/contrib/groff/afmtodit, and
requires some work to get going. If you're paranoid about working in the
/usr/src tree, simply copy the
contents of the above directory to a work
location.In the work area, you'll need to make the utility.
Just type:#make -f Makefile.sub afmtoditYou may also need to copy
/usr/contrib/groff/devps/generate/textmap
to
/usr/share/groff_font/devps/generate
if it doesn't already exist.Once all these utilities are in place, you're ready to
commence:Create the .afm file by
typing:%gs -dNODISPLAY-q -- ttf2pf.ps TTF_namePS_font_nameAFM_nameWhere, TTF_name is your
TrueType font file, PS_font_name
is the file name for the .pfa file,
AFM_name is the name you wish for
the .afm file. If you do not specify
output file names for the .pfa or
.afm files, then default names will be
generated from the TrueType font file name.This also produces a .pfa file, the
ascii postscript font metrics file
(.pfb is for the binrary form). This
won't be needed, but could (I think) be useful for a
fontserver.For example, to convert the 30f9 Barcode font using the
default file names, use the following command:%gs -dNODISPLAY -- ttf2pf.ps 3of9.ttf
Aladdin Ghostscript 5.10 (1997-11-23)
Copyright (C) 1997 Aladdin Enterprises, Menlo Park, CA. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Converting 3of9.ttf to 3of9.pfa and 3of9.afm.
If you want the converted fonts to be stored in
A.pfa and B.afm,
then use this command:%gs -dNODISPLAY -- ttf2pf.ps 3of9.ttf A B
Aladdin Ghostscript 5.10 (1997-11-23)
Copyright (C) 1997 Aladdin Enterprises, Menlo Park, CA. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Converting 3of9.ttf to A.pfa and B.afm.
Create the groff postscript file:Change directories to
/usr/share/groff_font/devps so as to
make the following command easier to execute. You'll
probably need root priviledges for this. (Or, if you're
paranoid about working there, make sure you reference the
files DESC,
text.enc and
generate/textmap as being in this
directory.)%afmtodit -d DESC -e text.enc file.afm \
generate/textmap PS_font_nameWhere, file.afm is the
AFM_name created by
ttf2pf.ps above, and
PS_font_name is the font name
used from that command, as well as the name that
&man.groff.1; will use for references to this font. For
example, assuming you used the first
tiff2pf.ps command above, then the 3of9
Barcode font can be created using the command:%afmtodit -d DESC -e text.enc 3of9.afm \
generate/textmap 3of9Ensure that the resulting
PS_font_name file (e.g.,
3of9 in the example above) is located
in the directory
/usr/share/groff_font/devps by copying
or moving it there.Note that if ttf2pf.ps assigns a
font name using the one it finds in the TrueType font file
and you want to use a different name, you must edit the
.afm file prior to running
afmtodit. This name must also match the
one used in the Fontmap file if you wish to pipe
&man.groff.1; into &man.gs.1;.Can TrueType fonts be used with other programs?The TrueType font format is used by Windows, Windows 95, and
Mac's. It is quite popular and there are a great number of
fonts available in this format.Unfortunately, there are few applications that I am aware of
that can use this format: Ghostscript and Povray come to mind.
Ghostscript's support, according to the documentation, is
rudimentary and the results are likely to be inferior to type 1
fonts. Povray version 3 also has the ability to use TrueType
fonts, but I rather doubt many people will be creating documents
as a series of raytraced pages :-).This rather dismal situation may soon change. The FreeType Project is
currently developing a useful set of FreeType tools:The xfsft font server for X11 can
serve TrueType fonts in addition to regular fonts. Though
currently in beta, it is said to be quite useable. See
Juliusz
Chroboczek's page for further information.
Porting instructions for FreeBSD can be found at Stephen
Montgomery's software page.xfstt is another font server for X11,
available under
ftp://sunsite.unc.edu/pub/Linux/X11/fonts.A program called ttf2bdf can produce
BDF files suitable for use in an X environment from TrueType
files. Linux binaries are said to be available from ftp://crl.nmsu.edu/CLR/multiling/General/.For people requiring the use of Asian TrueType fonts,
the XTT font server may be worth a look.
Information about XTT can be found at
URL: http://hawk.ise.chuo-u.ac.jp/student/person/tshiozak/study/freebsd-at-random/x-tt/index-en.html.and others …The FreeType Projects
page is a good starting point for information on
these and other free TrueType projects.Where can additional fonts be obtained?Many fonts are available on the Internet. They are either
entirely free, or are share-ware. In addition, there are many
inexpensive CDROMs available that contain many fonts. Some
Internet locations (as of August 1996) are:ftp://ftp.winsite.com
(Formerly CICA)http://www.simtel.net/simcgi-bin/dosfind.cgiftp://ftp.coast.net/http://af-pc-plloyd.ecel.uwa.edu.au/fonts/index.htmlhttp://www.esselte.com/letraset/index.htmlhttp://www.inil.com/users/elfring/esf.htmAdditional questionsWhat use are the .pfm files?Can one generate the .afm file from
a .pfa or
.pfb?How to generate the groff character mapping files for
postscript fonts with non-standard character names?Can xditview and devX?? devices be setup to access all
the new fonts?It would be good to have examples of using TrueType
fonts with povray and ghostscript.
diff --git a/en_US.ISO_8859-1/articles/formatting-media/article.sgml b/en_US.ISO_8859-1/articles/formatting-media/article.sgml
index 0adc30c341..6708d35396 100644
--- a/en_US.ISO_8859-1/articles/formatting-media/article.sgml
+++ b/en_US.ISO_8859-1/articles/formatting-media/article.sgml
@@ -1,603 +1,603 @@
%man;
]>
-
+
Formatting Media For Use With FreeBSD 2.2-RELEASEA TutorialDougWhitedwhite@resnet.uoregon.eduMarch 1997This document describes how to slice, partition, and
format hard disk drives and similar media for use with
FreeBSD. The examples given have been tested under FreeBSD
2.2-GAMMA and may work for other releases.Introduction & DefinitionsOverviewSuccessfully adding disks to an existing system is the
mark of an experienced system administrator. Slicing,
partitioning, and adding disks requires a careful dance of
proper command and name syntax. One slipped finger and an
entire disk could disappear in seconds. This document is
written in an attempt to simplify this process and avoid
accidents. Thankfully, enhancements to existing tools
(notably sysinstall) have greatly improved this process in
recent releases of FreeBSD.There are two possible modes of disk formatting:compatibility mode: Arranging a
disk so that it has a slice table for use with other
operating systems.dangerously dedicated mode:
Formatting a disk with no slice table. This makes the
process of adding disks easier, however non-FreeBSD
operating systems may not accept the disk.For most cases, dedicated mode is the easiest to set up
and use in existing systems, as a new disk is usually
dedicated entirely to FreeBSD. However, compatibility mode
insures optimum interoperability with future installations at
a cost of increased complexity.In addition to selecting the mode, two methods of slicing
the disk are available. One is using the system installation
tool /stand/sysinstall. 2.1.7-RELEASE and
later versions of sysinstall contain code
to ease setup of disks during normal system operation, mainly
allowing access to the Label and Partition editors and a Write
feature which will update just the selected disk and slice
without affecting other disks. The other method is running
the tools manually from a root command line. For dangerously
dedicated mode, only three or four commands are involved while
sysinstall requires some
manipulation.DefinitionsUNIX disk management over the centuries has invented many
new definitions for old words. The following glossary covers
the definitions used in this document and (hopefully) for
FreeBSD in general.compatibility mode: Arranging a disk so that it has a
slice table for use with other operating systems. Oppose
dangerously dedicated mode.dangerously dedicated mode: Formatting a disk with no
slice table. This makes the process of adding disks
easier, however non-FreeBSD operating systems may not
accept the disk. Oppose compatibility mode.disk: A circular disc, covered with magnetic or
similarly manipulable material, spun by a motor under a
head. Data is stored on the disk by changing the pattern
of magnetism on the disc, which can be later read. Hard
disks, CD-ROMs, Magneto-optical,and Zip/Jaz removables are
examples of disks.slice: A division of a disk. Up to four slices are
permitted on one disk in the PC standard. Slices are
composed of contiguous sectors. Slices are recorded in a
slice table used by the system BIOS to
locate bootable partitions. The slice table is usually
called the Partition Table in DOS parlance. Maintained by
the fdisk utility.partition: A division of a slice. Usually used in
reference to divisions of the FreeBSD slice of a disk.
Each filesystem and swap area on a disk resides in a
partition. Maintained using the disklabel utility.sector: Smallest subdivision of a disk. One sector
usually represents 512 bytes of data.Warnings & PitfallsBuilding disks is not something to take lightly. It is
quite possible to destroy the contents of other disks in your
system if the proper precautions are not taken.
- Check your work carefully.> It is very simple
+ Check your work carefully. It is very simple
to destroy the incorrect disk when working with these
commands. When in doubt consult the kernel boot output for
the proper device.Needless to say, we are not responsible for any damage to
any data or hardware that you may experience. You work at
your own risk!Zip, Jaz, and Other RemovablesRemovable disks can be formatted in the same way as normal
hard disks. It is essential to have the disk drive connected
to the system and a disk placed in the drive during startup,
so the kernel can determine the drive's geometry. Check the
dmesg output and make sure your device and
the disk's size is listed. If the kernel reports
Can't get the size
then the disk was not in the drive. In this case, you will
need to restart the machine before attempting to format
disks.Formatting Disks in Dedicated ModeIntroductionThis section details how to make disks that are totally
dedicated to FreeBSD. Remember, dedicated mode disks cannot
be booted by the PC architecture.Making Dedicated Mode Disks using Sysinstall/stand/sysinstall, the system
installation utility, has been expanded in recent versions to
make the process of dividing disks properly a less tiring
affair. The fdisk and disklabel editors built into sysinstall
are GUI tools that remove much of the confusion from slicing
disks. For FreeBSD versions 2.1.7 and later, this is perhaps
the simplest way to slice disks.Start sysinstall as root by typing
&prompt.root; /stand/sysinstall
from the command prompt.Select Index.Select Partition.Select the disk to edit with arrow keys and
SPACE.If you are using this entire disk for FreeBSD, select
A.When asked:
Do you want to do this with a true partition entry so as to remain
cooperative with any future possible operating systems on the
drive(s)?
answer No.When asked if you still want to do this, answer
Yes.Select Write.When warned about Writing on installed systems, answer
Yes.Quitthe FDISK Editor and
ESCAPE back to the Index menu.Select Label from the Index
menu.Label as desired. For a single partition, enter
C to Create a partition, accept the
default size, partition type Filesystem, and a mountpoint
(which isn't used).Enter W when done and confirm to
continue. The filesystem will be newfs'd for you, unless
you select otherwise (for news partitions you'll want to
do this!). You'll get the error:
Error mounting /mnt/dev/wd2s1e on /mnt/blah : No such file or directory
Ignore.Exit out by repeatedly pressing
ESCAPE.Making Dedicated Mode Disks Using the Command LineExecute the following commands, replacing wd2 with the
disk name.&prompt.root; dd if=/dev/zero of=/dev/rwd2 count=2
&prompt.root; disklabel /dev/rwd2 | disklabel -B -R -r wd2 /dev/stdinWe only want one partition, so using slice 'c' should be fine:
&prompt.root; newfs /dev/rwd2cIf you need to edit the disklabel to create multiple
partitions (such as swap), use the following: &prompt.root; dd if=/dev/zero of=/dev/rwd2 count=2
&prompt.root; disklabel /dev/r$d > /tmp/labelEdit disklabel to add partitions:
&prompt.root; vi /tmp/label
&prompt.root; disklabel -B -R -r wd2 /tmp/labelnewfs partitions appropriatelyYour disk is now ready for use.Making Compatibility Mode DisksIntroductionThe command line is the easiest way to make dedicated
disks, and the worst way to make compatibility disks. The
command-line fdisk utility requires higher math skills and an
in-depth understanding of the slice table, which is more than
most people want to deal with. Use sysinstall for
compatibility disks, as described below.Making Compatibility Mode Disks Using SysinstallStart sysinstall as root by typing
&prompt.root; /stand/sysinstall>
from the command prompt.Select Index.Select Partition.Select the disk to edit with arrow keys and
SPACE.If you are using this entire disk for FreeBSD, select
A.When asked:
Do you want to do this with a true partition entry so as to remain
cooperative with any future possible operating systems on the
drive(s)?
answer yes.Select Write.When asked to install the boot manager, select None
with SPACE then hit
ENTER for OK.Quit the FDISK Editor.You'll be asked about the boot manager, select
None again. Select Label from the Index
menu.Label as desired. For a single partition, accept the
default size, type filesystem, and a mountpoint (which
isn't used).The filesystem will be newfs'd for you, unless you
select otherwise (for news partitions you'll want to do
this!). You'll get the error:
Error mounting /mnt/dev/wd2s1e on /mnt/blah : No such file or directory
Ignore.Exit out by repeatedly pressing
ESCAPE.Your new disk is now ready for use.Other Disk OperationsAdding Swap SpaceAs a system grows, it's need for swap space can also grow.
Although adding swap space to existing disks is very
difficult, a new disk can be partitioned with additional swap
space.To add swap space when adding a disk to a system:When partitioning the disk, edit the disklabel and
allocate the amount of swap space to add in partition `b'
and the remainder in another partition, such as `a' or
`e'. The size is given in 512 byte blocks.When newfsing the drive, do NOT newfs the `c'
partition. Instead, newfs the partition where the
non-swap space lies.Add an entry to /etc/fstab as
follows:/dev/wd0b none swap sw 0 0
Change /dev/wd0b to the device of the newly added
space.To make the new space immediately available, use the
swapon command.
&prompt.root; swapon /dev/sd0b
swapon: added /dev/sd0b as swap space
Copying the Contents of DisksSubmitted By: Renaud Waldura
(renaud@softway.com) To move file from your original base disk to the fresh new
one, do:
&prompt.root; mount /dev/wd2 /mnt
&prompt.root; pax -r -w -p e /usr/home /mnt
&prompt.root; umount /mnt
&prompt.root; rm -rf /usr/home/*
&prompt.root; mount /dev/wd2 /usr/homeCreating Striped Disks using CCDCommands Submitted By: Stan Brown
(stanb@awod.com) The Concatenated Disk Driver, or CCD, allows you to treat
several identical disks as a single disk. Striping can result
in increased disk performance by distributing reads and writes
across the disks. See the &man.ccd.4; and &man.ccdconfig.8;
man pages or the CCD
Homepage for further details.To create a new CCD, execute the following commands. This
describes how to add three disks together; simply add or
remove devices as necessary. Remember that the disks to be
- striped must be identical.>
+ striped must be identical.Before executing these commands, make sure you add the line
pseudo-device ccd 4
to your kernel.&prompt.root; cd /dev ; sh MAKDEV ccd0
&prompt.root; disklabel -r -w sd0 auto
&prompt.root; disklabel -r -w sd1 auto
&prompt.root; disklabel -r -w sd2 auto
&prompt.root; disklabel -e sd0cchange type to 4.2BSD
&prompt.root; disklabel -e sd1cchange type to 4.2BSD
&prompt.root; disklabel -e sd2cchange type to 4.2BSD
&prompt.root; ccdconfig ccd0 32 0 /dev/sd0c /dev/sd1c /dev/sd2c
&prompt.root; newfs /dev/rccd0cNow you can mount and use your CCD by referencing device
/dev/ccd0c.CreditsThe author would like to thank the following individuals for
their contributions to this project:Darryl Okahata
(darrylo@hpnmhjw.sr.hp.com) for his simple
dedicated mode setup documentation which I have used
repeatedly on freebsd-questions.Jordan Hubbard (jkh@FreeBSD.org) for
making sysinstall useful for this type of task.John Fieber (jfieber@indiana.edu) for
making information and examples of the DocBook DTD on which
this document is based.Greg Lehey (grog@FreeBSD.org) for
checking my work and pointing out inaccuracies, as well as
miscellaneous support.
diff --git a/en_US.ISO_8859-1/articles/mh/article.sgml b/en_US.ISO_8859-1/articles/mh/article.sgml
index 9dfa488f0e..fef11739c2 100644
--- a/en_US.ISO_8859-1/articles/mh/article.sgml
+++ b/en_US.ISO_8859-1/articles/mh/article.sgml
@@ -1,782 +1,782 @@
-
+
An MH PrimerMattMidboematt@garply.comv1.0, 16 January 1996This document contains an introduction to using MH on
FreeBSDIntroductionMH started back in 1977 at the RAND Corporation, where the
initial philosophies behind MH were developed. MH isn't so much
a monolithic email program but a philosophy about how best to
develop tools for reading email. The MH developers have done a
- great job adhering to the KISS> principle: Keep It
+ great job adhering to the KISS principle: Keep It
Simple Stupid. Rather than have one large program for reading,
sending and handling email they have written specialized
programs for each part of your email life. One might liken MH to
the specialization that one finds in insects and nature. Each
tool in MH does one thing, and does it very well.Beyond just the various tools that one uses to handle their
email MH has done an excellent job keeping the configuration of
each of these tools consistent and uniform. In fact, if you are
not quite sure how something is supposed to work or what the
arguments for some command are supposed to be then you can
generally guess and be right. Each MH command is consistent
about how it handles reading the configuration files and how it
takes arguments on the command line. One useful thing to
remember is that you can always add a
-help
to
the command to have it display the options for that
command.The first thing that you need to do is to make sure that you
have installed the MH package on your FreeBSD machine. If you
installed from CDROM you should be able to execute the following
to load mh:
&prompt.root; pkg_add /cdrom/packages/mh-6.8.3.tgz>
- You will notice that it created a /usr/local/lib/mh>
+ You will notice that it created a /usr/local/lib/mh
directory for you as well as adding several binaries to the
- /usr/local/bin> directory. If you would prefer to
+ /usr/local/bin directory. If you would prefer to
compile it yourself then you can anonymous ftp it from ftp.ics.uci.edu or louie.udel.edu.This primer is not a full comprehensive explanation of how
MH works. This is just intended to get you started on the road
to happier, faster mail reading. You should read the man pages
for the various commands. Also you might want to read the comp.mail.mh newsgroup. Also
you can read the FAQ
for MH. The best resource for MH is the O'Reilly and
Associates book written by Jerry Peek.Reading Mail
- This section covers how to use inc>,
- show>, scan>, next>,
- prev>, rmm>, rmf>, and
- msgchk>. One of the best things about MH is the
+ This section covers how to use inc,
+ show, scan, next,
+ prev, rmm, rmf, and
+ msgchk. One of the best things about MH is the
consistent interface between programs. A few things to keep in
mind when using these commands is how to specify message lists.
- In the case of inc> this doesn't really make any
- sense but with commands like show> it is useful to
+ In the case of inc this doesn't really make any
+ sense but with commands like show it is useful to
know. A message list can consist of something like 23
- 20 16> which will act on messages 23, 20 and 16. This is
+ 20 16 which will act on messages 23, 20 and 16. This is
fairly simple but you can do more useful things like
- 23-30> which will act on all the messages between
+ 23-30 which will act on all the messages between
23 and 30. You can also specify something like
- cur:10> which will act on the current message and
- the next 9 messages. The cur>, last>,
- and first> messages are special messages that refer
+ cur:10 which will act on the current message and
+ the next 9 messages. The cur, last,
+ and first messages are special messages that refer
to the current, last or first message in the folder.
- inc>, msgchk>—read in your
+ inc, msgchk—read in your
new email or check it
- If you just type in inc> and hit
- return> you will be well on your way to getting
- started with MH. The first time you run inc> it
+ If you just type in inc and hit
+ return you will be well on your way to getting
+ started with MH. The first time you run inc it
will setup your account to use all the MH defaults and ask you
about creating a Mail directory. If you have mail waiting to
be downloaded you will see something that looks like: 29 01/15 Doug White Re: Another Failed to boot problem<<On Mon, 15 J
30 01/16 "Jordan K. Hubbar Re: FBSD 2.1<<> Do you want a library instead of
31 01/16 Bruce Evans Re: location of bad144 table<<>> >It would appea
32 01/16 "Jordan K. Hubbar Re: video is up<<> Anyway, mrouted won't run, ev
33 01/16 Michael Smith Re: FBSD 2.1<<Nate Williams stands accused of sa
This is the same thing you will see from a
- scan> (see ). If you just run
- inc> with no arguments it will look on your
+ scan (see ). If you just run
+ inc with no arguments it will look on your
computer for email that is supposed to be coming to
you.A lot of people like to use POP for grabbing their email.
MH can do POP to grab your email. You will need to give
- inc> a few command line arguments.
+ inc a few command line arguments.&prompt.user; inc -host mail.pop.org -user username> -norpop>
- That tells inc> to go to
- mail.pop.org> to download your email, and that
- your username on their system is username>. The
-
-norpop
option tells inc> to use
+ That tells inc to go to
+ mail.pop.org to download your email, and that
+ your username on their system is username. The
+
-norpop
option tells inc to use
plain POP3 for downloading your email. MH has support for a
few different dialects of POP. More than likely you will never
ever need to use them though. While you can do more complex
things with inc such as audit files and scan format files this
will get you going.
- The msgchk> command is used to get information
- on whether or not you have new email. msgchk> takes
+ The msgchk command is used to get information
+ on whether or not you have new email. msgchk takes
the same
-host
and
-user
- options that inc> takes.
+ options that inc takes.
- show>, next> and
- prev>—displaying and moving through
+ show, next and
+ prev—displaying and moving through
email
- show> is to show a letter in your current
- folder. Like inc>, show> is a fairly
- straightforward command. If you just type show>
- and hit return> then it displays the current
+ show is to show a letter in your current
+ folder. Like inc, show is a fairly
+ straightforward command. If you just type show
+ and hit return then it displays the current
message. You can also give specific message numbers to
show:&prompt.user; show 32 45 56>
This would display message numbers 32, 45 and 56 right
after each other. Unless you change the default behavior
- show> basically just does a more> on the
+ show basically just does a more on the
email message.
- next> is used to move onto the next message and
- prev> will go to the previous message. Both
- commands have an implied show> command so that when
+ next is used to move onto the next message and
+ prev will go to the previous message. Both
+ commands have an implied show command so that when
you go to the next message it automatically displays
it.
- scan>—shows you a scan of your
+ scan—shows you a scan of your
messages
- scan> will display a brief listing of the
+ scan will display a brief listing of the
messages in your current folder. This is an example of what
- the scan> command will give you.
+ the scan command will give you. 30+ 01/16 "Jordan K. Hubbar Re: FBSD 2.1<<> Do you want a library instead of
31 01/16 Bruce Evans Re: location of bad144 table<<>> >It would appea
32 01/16 "Jordan K. Hubbar Re: video is up<<> Anyway, mrouted won't run, ev
33 01/16 Michael Smith Re: FBSD 2.1<<Nate Williams stands accused of sa
Like just about everything in MH this display is very
configurable. This is the typical default display. It gives
you the message number, the date on the email, the sender, the
subject line, and a sentence fragment from the very beginning
- of the email if it can fit it. The +> means that
+ of the email if it can fit it. The + means that
message is the current message, so if you do a
- show> it will display that message.
+ show it will display that message.One useful option for scan is the
-reverse
option. This will list your messages
with the highest message number first and lowest message
- number last. Another useful option with scan> is to
+ number last. Another useful option with scan is to
have it read from a file. If you want to scan your incoming
- mailbox on FreeBSD without having to inc> it you
+ mailbox on FreeBSD without having to inc it you
can do scan -file
- /var/mail/username>. This can be used
- with any file that is in the mbox> format.
+ /var/mail/username. This can be used
+ with any file that is in the mbox format.
- rmm> and rmf>—remove the
+ rmm and rmf—remove the
current message or folder
- rmm> is used to remove a mail message. The
+ rmm is used to remove a mail message. The
default is typically to not actually remove the message but to
rename the file to one that is ignored by the MH commands. You
will need to through periodically and physically delete the
- removed> messages.
+ removed messages.
- The rmf> command is used to remove folders.
+ The rmf command is used to remove folders.
This doesn't just rename the files but actually removes the
from the hard drive so you should be careful when you use this
command.A typical session of reading with MHThe first thing that you will want to do is
- inc> your new mail. So at a shell prompt just type
- in inc> and hit return>.
+ inc your new mail. So at a shell prompt just type
+ in inc and hit return.
&prompt.user; inc>
Incorporating new mail into inbox...
36+ 01/19 "Stephen L. Lange Request...<<Please remove me as contact for pind
37 01/19 Matt Thomas Re: kern/950: Two PCI bridge chips fail (multipl
38 01/19 "Amancio Hasty Jr Re: FreeBSD and VAT<<>>> Bill Fenner said: > In
&prompt.user;
This shows you the new email that has been added to your
- mailbox. So the next thing to do is show> the email
+ mailbox. So the next thing to do is show the email
and move around.&prompt.user; show>
Received: by sashimi.wwa.com (Smail3.1.29.1 #2)
id m0tdMZ2-001W2UC; Fri, 19 Jan 96 13:33 CST
Date: Fri, 19 Jan 1996 13:33:31 -0600 (CST)
From: "Stephen L. Lange" <stvlange@wwa.com>
To: matt@garply.com
Subject: Request...
Message-Id: <Pine.BSD.3.91.960119133211.824A-100000@sashimi.wwa.com>
Mime-Version: 1.0
Content-Type: TEXT/PLAIN; charset=US-ASCII
Please remove me as contact for pindat.com
&prompt.user; rmm>
&prompt.user; next>
Received: from localhost (localhost [127.0.0.1]) by whydos.lkg.dec.com (8.6.11/8
.6.9) with SMTP id RAA24416; Fri, 19 Jan 1996 17:56:48 GMT
Message-Id: <199601191756.RAA24416@whydos.lkg.dec.com>
X-Authentication-Warning: whydos.lkg.dec.com: Host localhost didn't use HELO pro
tocol
To: hsu@clinet.fi
Cc: hackers@FreeBSD.org
Subject: Re: kern/950: Two PCI bridge chips fail (multiple multiport ethernet
boards)
In-Reply-To: Your message of "Fri, 19 Jan 1996 00:18:36 +0100."
<199601182318.AA11772@Sysiphos>
X-Mailer: exmh version 1.5omega 10/6/94
Date: Fri, 19 Jan 1996 17:56:40 +0000
From: Matt Thomas <matt@lkg.dec.com>
Sender: owner-hackers@FreeBSD.org
Precedence: bulk
This is due to a typo in pcireg.h (to
which I am probably the guilty party).
- The rmm> removed the current message and the
- next> command moved me on to the next message. Now
+ The rmm removed the current message and the
+ next command moved me on to the next message. Now
if I wanted to look at ten most recent messages so I could
read one of them here is what I would do:&prompt.user; scan last:10>
26 01/16 maddy Re: Testing some stuff<<yeah, well, Trinity has
27 01/17 Automatic digest NET-HAPPENINGS Digest - 16 Jan 1996 to 17 Jan 19
28 01/17 Evans A Criswell Re: Hey dude<<>From matt@tempest.garply.com Tue
29 01/16 Karl Heuer need configure/make volunteers<<The FSF is looki
30 01/18 Paul Stephanouk Re: [alt.religion.scientology] Raw Meat (humor)<
31 01/18 Bill Lenherr Re: Linux NIS Solaris<<--- On Thu, 18 Jan 1996 1
34 01/19 John Fieber Re: Stuff for the email section?<<On Fri, 19 Jan
35 01/19 support@foo.garpl [garply.com #1138] parlor<<Hello. This is the Ne
37+ 01/19 Matt Thomas Re: kern/950: Two PCI bridge chips fail (multipl
38 01/19 "Amancio Hasty Jr Re: FreeBSD and VAT<<>>> Bill Fenner said: > In
&prompt.user;
Then if I wanted to read message number 27 I would do a
- show 27> and it would be displayed. As you can
+ show 27 and it would be displayed. As you can
probably tell from this sample session MH is pretty easy to
use and looking through emails and displaying them is fairly
intuitive and easy.Folders and Mail SearchingAnybody who gets lots of email definitely wants to be able
to prioritize, stamp, brief, de-brief, and number their emails
in a variety of different ways. MH can do this better than just
about anything. One thing that we haven't really talked about is
the concept of folders. You have undoubtedly come across the
folders concept using other email programs. MH has folders too.
MH can even do sub-folders of a folder. One thing you should
- keep in mind with MH is that when you ran inc> for
+ keep in mind with MH is that when you ran inc for
the first time and it asked you if it could create a
- Mail> directory it began storing everything in that
+ Mail directory it began storing everything in that
directory. If you look at that directory you will find a
- directory named inbox>. The inbox>
+ directory named inbox. The inbox
directory houses all of your incoming mail that hasn't been
thrown anywhere else.Whenever you create a new folder a new directory is going to
- be created underneath your MH Mail> directory, and
+ be created underneath your MH Mail directory, and
messages in that folder are going to be stored in that
directory. When new email comes in that new email is thrown
- into your inbox> directory with a file name that is
+ into your inbox directory with a file name that is
equivalent to the message number. So even if you didn't have
any of the MH tools to read your email you could still use
standard UNIX commands to munge around in those directories and
just more your files. It's this simplicity that really gives you
a lot of power with what you can do with your email.Just as you can use message lists like 23 16
- 42> with most MH commands there is a folder option you can
+ 42 with most MH commands there is a folder option you can
specify with just about every MH command. If you do a
- scan +freebsd> it will scan your freebsd>
+ scan +freebsd it will scan your freebsd
folder, and your current folder will be changed to
- freebsd>. If you do a show +freebsd 23 16
- 42>, show> is going to switch to your
- freebsd> folder and display messages 23, 16 and 42.
- So remember that
+folder>> syntax. You
+ freebsd. If you do a show +freebsd 23 16
+ 42, show is going to switch to your
+ freebsd folder and display messages 23, 16 and 42.
+ So remember that
+folder
syntax. You
will need to make sure you use it to make commands process
different folders. Remember you default folder for mail is
- inbox> so doing a folder +inbox> should
+ inbox so doing a folder +inbox should
always get you back to your mail. Of course, in MH's infinite
flexibility this can be changed but most places have probably
- left it as inbox>.
+ left it as inbox.
- pick>—search email that matches certain
+ pick—search email that matches certain
criteria
- pick> is one of the more complex commands in
+ pick is one of the more complex commands in
the MH system. So you might want to read the
- pick>1>> man
+ pick1 man
page for a more thorough understanding. At its simplest level
you can do something like&prompt.user; pick -search pci>
15
42
55
56
57
- This will tell pick> to look through every
+ This will tell pick to look through every
single line in every message in your current folder and tell
- you which message numbers it found the word pci>
- in. You can then show> those messages and read them
- if you wish or rmm> them. You would have to specify
- something like show 15 42 55-57> to display them
+ you which message numbers it found the word pci
+ in. You can then show those messages and read them
+ if you wish or rmm them. You would have to specify
+ something like show 15 42 55-57 to display them
though. A slightly more useful thing to do is this:&prompt.user; pick -search pci -seq pick>
5 hits
&prompt.user; show pick>
This will show you the same messages you just didn't have
to work as hard to do it. The
-seq
option is
really an abbreviation of
-sequence
and
- pick> is just a sequence which contains the message
+ pick is just a sequence which contains the message
numbers that matched. You can use sequences with just about
- any MH command. So you could have done an rmm pick>
+ any MH command. So you could have done an rmm pick
and all those messages would be removed instead. You sequence
can be named anything. If you run pick again it will overwrite
the old sequence if you use the same name.Doing a pick -search can be a bit more
time consuming than just searching for message from someone,
- or to someone. So pick> allows you to use the
+ or to someone. So pick allows you to use the
following predefined search criteria:
-to
search based upon who the message is to
-cc
search based on who is in the cc list
-from
search for who sent the message
-subject
search for emails with this subject
-date
find emails with a matching dat
--component
search for any other component in the header. (i.e.
-
--reply-to> to find all emails with a certain
+
--reply-to
to find all emails with a certain
reply-to in the header)This allows you to do things like
&prompt.user; pick -to freebsd-hackers@FreeBSD.org -seq hackers>
to get a list of all the email send to the FreeBSD hackers
- mailing list. pick> also allows you to group these
+ mailing list. pick also allows you to group these
criteria in different ways using the following options:…
-and
……
-or
&hellip
-not
…
-lbrace
…
-rbrace
These commands allow you to do things like&prompt.user; pick -to freebsd-hackers -and -cc freebsd-hackers>
That will grab all the email in your inbox that was sent
to freebsd-hackers or cc'd to that list. The brace options
allow you to group search criteria together. This is sometimes
very necessary as in the following example&prompt.user; pick -lbrace -to freebsd-hackers -and
-not -cc freebsd-questions -rbrace -and -subject pci>
Basically this says pick (to freebsd-hackers and
not cc'd on freebsd-questions) and the subject is
pci. It should look through your folder and find
all messages sent to the freebsd-hackers list that aren't cc'd
to the freebsd-questions list that contain something on pci in
the subject line. Ordinarily you might have to worry about
something called operator precedence. Remember in math how you
evaluate from left to right and you do multiplication and
division first and addition and subtraction second? MH has the
- same type of rules for pick>. It's fairly complex
+ same type of rules for pick. It's fairly complex
so you might want to study the man page. This document is just
to help you get acquainted with MH.
- folder>, folders>,
- refile>—three useful programs for folder
+ folder, folders,
+ refile—three useful programs for folder
maintenanceThere are three programs which are primarily just for
- manipulating your folders. The folder> program is
+ manipulating your folders. The folder program is
used to switch between folders, pack them, and list them. At
its simplest level you can do a folder
- +newfolder>> and you will be switched into
- newfolder>. From there on out all your MH
- commands like comp>, repl>,
- scan>, and show> will act on that
- newfolder> folder.
+ +newfolder and you will be switched into
+ newfolder. From there on out all your MH
+ commands like comp, repl,
+ scan, and show will act on that
+ newfolder folder.
Sometimes when you are reading and deleting messages you
- will develop holes> in your folders. If you do a
- scan> you might just see messages 34, 35, 36, 43,
+ will develop holes in your folders. If you do a
+ scan you might just see messages 34, 35, 36, 43,
55, 56, 57, 80. If you do a folder -pack
this will renumber all your messages so that there are no
holes. It doesn't actually delete any messages though. So you
may need to periodically go through and physically delete
- rmm>'d messages.
+ rmm'd messages.
If you need statistics on your folders you can do a
- folders> or folder -all to list
+ folders or folder -all to list
all your folders, how many messages they have, what the
current message is in each one and so on. This line of stats
it displays for all your folders is the same one you get when
- you change to a folder with folder +foldername>. A
- folders> command looks like this:
+ you change to a folder with folder +foldername. A
+ folders command looks like this:
Folder # of messages ( range ); cur msg (other files)
announce has 1 message ( 1- 1).
drafts has no messages.
f-hackers has 43 messages ( 1- 43).
f-questions has 16 messages ( 1- 16).
inbox+ has 35 messages ( 1- 38); cur= 37.
lists has 8 messages ( 1- 8).
netfuture has 1 message ( 1- 1).
out has 31 messages ( 1- 31).
personal has 6 messages ( 1- 6).
todo has 58 messages ( 1- 58); cur= 1.
TOTAL= 199 messages in 13 folders.
- The refile> command is what you use to move
+ The refile command is what you use to move
messages between folders. When you do something like
- refile 23 +netfuture> message number 23 is moved
- into the netfuture> folder. You could also do
- something like refile 23 +netfuture/latest> which
+ refile 23 +netfuture message number 23 is moved
+ into the netfuture folder. You could also do
+ something like refile 23 +netfuture/latest which
would put message number 23 in a subfolder called
- latest> under the netfuture> folder.
+ latest under the netfuture folder.
If you want to keep a message in the current folder and link
it you can do a refile -link 23 +netfuture
- which would keep 23 in your current inbox> but
- also list in your netfuture> folder. You are
+ which would keep 23 in your current inbox but
+ also list in your netfuture folder. You are
probably beginning to realize some of the really powerful
things you can do with MH.Sending MailEmail is a two way street for most people so you want to be
able to send something back. The way MH handles sending mail can
be a bit difficult to follow at first, but it allows for
incredible flexibility. The first thing MH does is to copy a
components file into your outgoing email. A components file is
basically a skeleton email letter with stuff like the To: and
Subject: headers already in it. You are then sent into your
editor where you fill in the header information and then type
the body of your message below the dashed lines in the message.
- Then to the whatnow> program. When you are at the
+ Then to the whatnow program. When you are at the
What now? prompt you can tell it to
- send>, list>, edit>,
- edit>, push>, and quit>. Most
+ send, list, edit,
+ edit, push, and quit. Most
of these commands are self-explanatory. So the message sending
process involves copying a component file, editing your email,
- and then telling the whatnow> program what to do with
+ and then telling the whatnow program what to do with
your email.
- comp>, forw>,
- reply>—compose, forward or reply to a message
+ comp, forw,
+ reply—compose, forward or reply to a message
to someone
- The comp> program has a few useful command line
+ The comp program has a few useful command line
options. The most important one to know right now is the
-editor
option. When MH is installed the
default editor is usually a program called
- prompter> which comes with MH. It's not a very
+ prompter which comes with MH. It's not a very
exciting editor and basically just gets the job done. So when
you go to compose a message to someone you might want to use
- comp -editor /usr/bin/vi/> or comp -editor
- /usr/local/bin/pico/> instead. Once you have run
+ comp -editor /usr/bin/vi/ or comp -editor
+ /usr/local/bin/pico/ instead. Once you have run
comp you are in your editor and you see
something that looks like this:To:
cc:
Subject:
--------
You need to put the person you are sending the mail to
- after the To:> line. It works the same way for the
+ after the To: line. It works the same way for the
other headers also, so you would need to put your subject
- after the Subject:> line. Then you would just put
+ after the Subject: line. Then you would just put
the body of your message after the dashed lines. It may seem a
bit simplistic since a lot of email programs have special
requesters that ask you for this information but there really
isn't any point to that. Plus this really gives you excellent
flexibility.To:freebsd-rave@FreeBSD.org>
cc:
Subject:And on the 8th day God created the FreeBSD core team>
--------
Wow this is an amazing operating system. Thanks!>
You can now save this message and exit your editor. You
- will see the What now?> prompt and you can type in
- send> or s> and hit
- return>. Then the FreeBSD core team will receive
+ will see the What now? prompt and you can type in
+ send or s and hit
+ return. Then the FreeBSD core team will receive
their just rewards. As I mentioned earlier you can also use
- other commands, for example quit> if you don't want
+ other commands, for example quit if you don't want
to send the message.
- The forw> command is stunningly similar. The
+ The forw command is stunningly similar. The
big difference being that the message you are forwarding is
automatically included in the outgoing message. When you run
- forw> it will forward your current message. You can
+ forw it will forward your current message. You can
always tell it to forward something else by doing something
- like forw 23> and then message number 23 will be
+ like forw 23 and then message number 23 will be
put in your outgoing message instead of the current message.
- Beyond those small differences forw> functions
- exactly the same as comp>. You go through the exact
+ Beyond those small differences forw functions
+ exactly the same as comp. You go through the exact
same message sending process.
- The repl> command will reply to whatever your
+ The repl command will reply to whatever your
current message is, unless you give it a different message to
- reply to. repl> will do its best to go ahead and
+ reply to. repl will do its best to go ahead and
fill in some of the email headers already. So you will notice
- that the To:> header already has the address of the
- recipient in there. Also the Subject:> line will
+ that the To: header already has the address of the
+ recipient in there. Also the Subject: line will
already be filled in. You then go about the normal message
composition process and you are done. One useful command line
option to know here is the
-cc
option. You
- can use all>, to>, cc>,
- me> after the
-cc
option to have
- repl> automatically add the various addresses to
+ can use all, to, cc,
+ me after the
-cc
option to have
+ repl automatically add the various addresses to
the cc list in the message. You have probably noticed that the
original message isn't included. This is because most MH
setups are configured to do this from the start.
- components>, and
- replcomps>—components files for
- comp> and repl>
+ components, and
+ replcomps—components files for
+ comp and repl
- The components> file is usually in
+ The components file is usually in
/usr/local/lib/mh. You can copy that file
into your MH Mail directory and edit to contain what you want
it to contain. It is a fairly basic file. You have various
email headers at the top, a dashed line and then nothing. The
comp command just copies this
- components> file and then edits it. You can add
+ components file and then edits it. You can add
any kind of valid RFC822 header you want. For instance you
- could have something like this in your components>
+ could have something like this in your components
file:To:
Fcc: out
Subject:
X-Mailer: MH 6.8.3
X-Home-Page: http://www.FreeBSD.org/
-------
MH would then copy this components file and throw you into
- your editor. The components> file is fairly
+ your editor. The components file is fairly
simple. If you wanted to have a signature on those messages
you would just put your signature in that
- components> file.
+ components file.
- The replcomps> file is a bit more complex. The
- default replcomps> looks like this:
+ The replcomps file is a bit more complex. The
+ default replcomps looks like this:%(lit)%(formataddr %<{reply-to}%?{from}%?{sender}%?{return-path}%>)\
%<(nonnull)%(void(width))%(putaddr To: )\n%>\
%(lit)%(formataddr{to})%(formataddr{cc})%(formataddr(me))\
%<(nonnull)%(void(width))%(putaddr cc: )\n%>\
%<{fcc}Fcc: %{fcc}\n%>\
%<{subject}Subject: Re: %{subject}\n%>\
%<{date}In-reply-to: Your message of "\
%<(nodate{date})%{date}%|%(pretty{date})%>."%<{message-id}
%{message-id}%>\n%>\
--------
It's in the same basic format as the
- components> file but it contains quite a few extra
- formatting codes. The %(lit)> command makes room
- for the address. The %(formataddr> is a function
+ components file but it contains quite a few extra
+ formatting codes. The %(lit) command makes room
+ for the address. The %(formataddr is a function
that returns a proper email address. The next part is
%< which means if and the
- {reply-to}> means the reply-to field in the
+ {reply-to} means the reply-to field in the
original message. So that might be translated this way:%<if {reply-to} the original message has a reply-to
then give that to formataddr, %? else {from} take the
from address, %? else {sender} take the sender address, %?
else {return-path} take the return-path from the original
message, %> endif.
As you can tell MH formatting can get rather involved. You
can probably decipher what most of the other functions and
variables mean. All of the information on writing these format
strings is in the MH-Format man page. The really nice thing is
that once you have built your customized
- replcomps> file you won't need to touch it again.
+ replcomps file you won't need to touch it again.
No other email program really gives you the power and
flexibility that MH gives you.
diff --git a/en_US.ISO_8859-1/articles/multi-os/article.sgml b/en_US.ISO_8859-1/articles/multi-os/article.sgml
index 4dd680f3a5..f7ee999f88 100644
--- a/en_US.ISO_8859-1/articles/multi-os/article.sgml
+++ b/en_US.ISO_8859-1/articles/multi-os/article.sgml
@@ -1,743 +1,743 @@
-
+
Installing and Using FreeBSD With Other Operating SystemsJayRichmondjayrich@sysc.com6 August 1996This document discusses how to make FreeBSD coexist nicely
with other popular operating systems such as Linux, MS-DOS,
OS/2, and Windows 95. Special thanks to: Annelise Anderson
andrsn@stanford.edu, Randall Hopper
rhh@ct.picker.com, and Jordan K. Hubbard
jkh@time.cdrom.comOverviewMost people can't fit these operating systems together
comfortably without having a larger hard disk, so special
information on large EIDE drives is included. Because there are
so many combinations of possible operating systems and hard disk
configurations, the section may be of the
most use to you. It contains descriptions of specific working
computer setups that use multiple operating systems.This document assumes that you have already made room on
your hard disk for an additional operating system. Any time you
repartition your hard drive, you run the risk of destroying the
data on the original partitions. However, if your hard drive is
completely occupied by DOS, you might find the FIPS utility
(included on the FreeBSD CD-ROM in the
\TOOLS directory or via ftp)
useful. It lets you repartition your hard disk without
destroying the data already on it. There is also a commercial
program available called Partition Magic, which lets you size
and delete partitions without consequence.Overview of Boot ManagersThese are just brief descriptions of some of the different
boot managers you may encounter. Depending on your computer
setup, you may find it useful to use more than one of them on
the same system.Boot EasyThis is the default boot manager used with FreeBSD.
It has the ability to boot most anything, including BSD,
OS/2 (HPFS), Windows 95 (FAT and FAT32), and Linux.
Partitions are selected with the function keys.OS/2 Boot ManagerThis will boot FAT, HPFS, FFS (FreeBSD), and EXT2
(Linux). It will also boot FAT32 partitions. Partitions
are selected using arrow keys. The OS/2 Boot Manager is
the only one to use its own separate partition, unlike the
others which use the master boot record (MBR). Therefore,
it must be installed below the 1024th cylinder to avoid
booting problems. It can boot Linux using LILO when it is
part of the boot sector, not the MBR. Go to Linux
HOWTOs on the World Wide Web for more
information on booting Linux with OS/2's boot
manager.OS-BSThis is an alternative to Boot Easy. It gives you more
control over the booting process, with the ability to set
the default partition to boot and the booting timeout.
The beta version of this programs allows you to boot by
selecting the OS with your arrow keys. It is included on
the FreeBSD CD in the \TOOLS
directory, and via ftp.LILO, or LInux LOaderThis is a limited boot manager. It will boot FreeBSD,
though some customization work is required in the LILO
configuration file.About FAT32FAT32 is the replacement to the FAT filesystem included in
Microsoft's OEM SR2 Beta release, which is expected to be
utilitized on computers pre-loaded with Windows 95 towards the
end of 1996. It converts the normal FAT file system and
allows you to use smaller cluster sizes for larger hard
drives. FAT32 also modifies the traditional FAT boot sector
and allocation table, making it incompatible with some boot
managers.A Typical InstallationLet's say I have two large EIDE hard drives, and I want to
install FreeBSD, Linux, and Windows 95 on them.Here's how I might do it using these hard disks:
- /dev/wd0> (first physical hard disk)
+ /dev/wd0 (first physical hard disk)
- /dev/wd1> (second hard disk)
+ /dev/wd1 (second hard disk)Both disks have 1416 cylinders.I boot from a MS-DOS or Windows 95 boot disk that
- contains the FDISK.EXE> utility and make a small
+ contains the FDISK.EXE utility and make a small
50 meg primary partition (35-40 for Windows 95, plus a
little breathing room) on the first disk. Also create a
larger partition on the second hard disk for my Windows
applications and data.I reboot and install Windows 95 (easier said than done)
- on the C:> partition.
+ on the C: partition.
The next thing I do is install Linux. I'm not sure
about all the distributions of Linux, but slackware includes
LILO (see ). When I am partitioning out
my hard disk with Linux fdisk, I would
put all of Linux on the first drive (maybe 300 megs for a
nice root partition and some swap space).After I install Linux, and are prompted about installing
LILO, make SURE that I install it on the boot sector of my
root Linux partition, not in the MBR (master boot
record).The remaining hard disk space can go to FreeBSD. I also
make sure that my FreeBSD root slice does not go beyond the
1024th cylinder. (The 1024th cylinder is 528 megs into the
disk with our hypothetical 720MB disks). I will use the
rest of the hard drive (about 270 megs) for the
- /usr> and /> slices if I wish. The
+ /usr and / slices if I wish. The
rest of the second hard disk (size depends on the amount of
my Windows application/data partition that I created in step
- 1 can go to the /usr/src> slice and swap
+ 1 can go to the /usr/src slice and swap
space.
- When viewed with the Windows 95 fdisk>
+ When viewed with the Windows 95 fdisk
utility, my hard drives should now look something like this:
---------------------------------------------------------------------
Display Partition Information
Current fixed disk drive: 1
Partition Status Type Volume_Label Mbytes System Usage
C: 1 A PRI DOS 50 FAT** 7%
2 A Non-DOS (Linux) 300 43%
Total disk space is 696 Mbytes (1 Mbyte = 1048576 bytes)
Press Esc to continue
---------------------------------------------------------------------
Display Partition Information
Current fixed disk drive: 2
Partition Status Type Volume_Label Mbytes System Usage
D: 1 A PRI DOS 420 FAT** 60%
Total disk space is 696 Mbytes (1 Mbyte = 1048576 bytes)
Press Esc to continue
---------------------------------------------------------------------
** May say FAT16 or FAT32 if you are using the OEM SR2
update. See ).Install FreeBSD. I make sure to boot with my first hard
- disk set at NORMAL> in the BIOS. If it is not,
+ disk set at NORMAL in the BIOS. If it is not,
I'll have the enter my true disk geometry at boot time (to
get this, boot Windows 95 and consult Microsoft Diagnostics
- (MSD.EXE>), or check your BIOS) with the
- parameter hd0=1416,16,63> where
- 1416> is the number of cylinders on my hard
- disk, 16> is the number of heads per track,
- and 63> is the number of sectors per track on
+ (MSD.EXE), or check your BIOS) with the
+ parameter hd0=1416,16,63 where
+ 1416 is the number of cylinders on my hard
+ disk, 16 is the number of heads per track,
+ and 63 is the number of sectors per track on
the drive.When partitioning out the hard disk, I make sure to
install Boot Easy on the first disk. I don't worry about
the second disk, nothing is booting off of it.When I reboot, Boot Easy should recognize my three
bootable partitions as DOS (Windows 95), Linux, and BSD
(FreeBSD).Special ConsiderationsMost operating systems are very picky about where and how
they are placed on the hard disk. Windows 95 and DOS need to be
on the first primary partitiin on the first hard disk. OS/2 is
the exception. It can be installed on the first or second disk
in a primary or extended partition. If you are not sure, keep
the beginning of the bootable partitions below the 1024th
cylinder.If you install Windows 95 on an existing BSD system, it will
- destroy> the MBR, and you will have to reinstall your
+ destroy the MBR, and you will have to reinstall your
previous boot manager. Boot Easy can be reinstalled by using
the BOOTINST.EXE utility included in the \TOOLS directory on the
CD-ROM, and via ftp.
You can also re-start the installation process and go to the
partition editor. From there, mark the FreeBSD partition as
bootable, select Boot Manager, and then type W to (W)rite out
the information to the MBR. You can now reboot, and Boot Easy
should then recognize Windows 95 as DOS.Please keep in mind that OS/2 can read FAT and HPFS
partitions, but not FFS (FreeBSD) or EXT2 (Linux) partitions.
Likewise, Windows 95 can only read and write to FAT and FAT32
(see ) partitions. FreeBSD can read most
file systems, but currently cannot read HPFS partitions. Linux
can read HPFS partitions, but can't write to them. Recent
versions of the Linux kernel (2.x) can read and write to Windows
95 VFAT partitions (VFAT is what gives Windows 95 long file
names - it's pretty much the same as FAT). Linux can read and
write to most file systems. Got that? I hope so.Examples(section needs work, please send your example to
jayrich@sysc.com).FreeBSD+Win95: If you installed FreeBSD after Windows 95,
- you should see DOS> on the Boot Easy menu. This is
+ you should see DOS on the Boot Easy menu. This is
Windows 95. If you installed Windows 95 after FreeBSD, read
above. As long as your hard disk does not
have 1024 cylinders you should not have a problem booting. If
one of your partitions goes beyond the 1024th cylinder however,
- and you get messages like invalid system disk>
+ and you get messages like invalid system disk
under DOS (Windows 95) and FreeBSD will not boot, try looking
for a setting in your BIOS called > 1024 cylinder
- support> or NORMAL/LBA> mode. DOS may need LBA
+ support or NORMAL/LBA mode. DOS may need LBA
(Logical Block Addressing) in order to boot correctly. If the
idea of switching BIOS settings every time you boot up doesn't
appeal to you, you can boot FreeBSD through DOS via the
- FBSDBOOT.EXE> utility on the CD (It should find your
+ FBSDBOOT.EXE utility on the CD (It should find your
FreeBSD partition and boot it.)FreeBSD+OS/2+Win95: Nothing new here. OS/2's boot manger
can boot all of these operating systems, so that shouldn't be a
problem.FreeBSD+Linux: You can also use Boot Easy to boot both
operating systems.FreeBSD+Linux+Win95: (see )Other Sources of HelpThere are many Linux
HOW-TOs that deal with multiple operating systems on
the same hard disk.The Linux+DOS+Win95+OS2
mini-HOWTO offers help on configuring the OS/2 boot
manager, and the Linux+FreeBSD
mini-HOWTO might be interesting as well. The Linux-HOWTO
is also helpful.The NT
Loader Hacking Guide provides good information on
multibooting Windows NT, '95, and DOS with other operating
systems.And Hale Landis's "How It Works" document pack contains some
good info on all sorts of disk geometry and booting related
topics. You can find it at
ftp://fission.dt.wdc.com/pub/otherdocs/pc_systems/how_it_works/allhiw.zip.Finally, don't overlook FreeBSD's kernel documentation on
the booting procedure, available in the kernel source
distribution (it unpacks to file:/usr/src/sys/i386/boot/biosboot/README.386BSD.Technical Details(Contributed by Randall Hopper,
rhh@ct.picker.com)This section attempts to give you enough basic information
about your hard disks and the disk booting process so that you
can troubleshoot most problems you might encounter when getting
set up to boot several operating systems. It starts in pretty
basic terms, so you may want to skim down in this section until
it begins to look unfamiliar and then start reading.Disk PrimerThree fundamental terms are used to describe the location
of data on your hard disk: Cylinders, Heads, and Sectors.
It's not particularly important to know what these terms
relate to except to know that, together, they identify where
data is physically on your disk.Your disk has a particular number of cylinders, number of
heads, and number of sectors per cylinder-head (a
cylinder-head also known nown as a track). Collectively this
information defines the "physical disk geometry" for your hard
disk. There are typically 512 bytes per sector, and 63
sectors per track, with the number of cylinders and heads
varying widely from disk to disk. Thus you can figure the
number of bytes of data that'll fit on your own disk by
calculating:(# of cylinders) × (# heads) × (63
- sectors/track) × (512 bytes/sect)>
+ sectors/track) × (512 bytes/sect)For example, on my 1.6 Gig Western Digital AC31600 EIDE hard
disk,that's:(3148 cyl) × (16 heads) × (63
sectors/track) × (512 bytes/sect)which is 1,624,670,208 bytes, or around 1.6 Gig.You can find out the physical disk geometry (number of
cylinders, heads, and sectors/track counts) for your hard
disks using ATAID or other programs off the net. Your hard
disk probably came with this information as well. Be careful
though: if you're using BIOS LBA (see ), you can't use just any program to get
the physical geometry. This is because many programs (e.g.
- MSD.EXE> or FreeBSD fdisk) don't identify the
+ MSD.EXE or FreeBSD fdisk) don't identify the
physical disk geometry; they instead report the
- translated geometry> (virtual numbers from using
+ translated geometry (virtual numbers from using
LBA). Stay tuned for what that means.One other useful thing about these terms. Given 3
numbers—a cylinder number, a head number, and a
sector-within-track number—you identify a specific
absolute sector (a 512 byte block of data) on your disk.
Cylinders and Heads are numbered up from 0, and Sectors are
numbered up from 1.For those that are interested in more technical details,
information on disk geometry, boot sectors, BIOSes, etc. can
be found all over the net. Query Lycos, Yahoo, etc. for
- boot sector> or master boot record>.
+ boot sector or master boot record.
Among the useful info you'll find are Hale Landis's
- How It Works> document pack. See the How It Works document pack. See the section for a few pointers to this
pack.Ok, enough terminology. We're talking about booting
here.The Booting ProcessOn the first sector of your disk (Cyl 0, Head 0, Sector 1)
lives the Master Boot Record (MBR). It contains a map of your
- disk. It identifies up to 4 partitions>, each of
+ disk. It identifies up to 4 partitions, each of
which is a contiguous chunk of that disk. FreeBSD calls
- partitions slices> to avoid confusion with it's
+ partitions slices to avoid confusion with it's
own partitions, but we won't do that here. Each partition can
contain its own operating system.Each partition entry in the MBR has a Partition
- ID>, a Start Cylinder/Head/Sector>, and an
- End Cylinder/Head/Sector>. The Partition ID
+ ID, a Start Cylinder/Head/Sector, and an
+ End Cylinder/Head/Sector. The Partition ID
tells what type of partition it is (what OS) and the Start/End
tells where it is. lists a
smattering of some common Partition IDs.
Note that not all partitions are bootable (e.g. Extended
DOS). Some are—some aren't. What makes a partition
bootable is the configuration of the Partition Boot
- Sector> that exists at the beginning of each
+ Sector that exists at the beginning of each
partition.When you configure your favorite boot manager, it looks up
the entries in the MBR partition tables of all your hard disks
and lets you name the entries in that list. Then when you
boot, the boot manager is invoked by special code in the
Master Boot Sector of the first probed hard disk on your
system. It looks at the MBR partition table entry
corresponding to the partition choice you made, uses the Start
Cylinder/Head/Sector information for that partition, loads up
the Partition Boot Sector for that partition, and gives it
control. That Boot Sector for the partition itself contains
enough information to start loading the operating system on
that partition.One thing we just brushed past that's important to know.
All of your hard disks have MBRs. However, the one that's
important is the one on the disk that's first probed by the
BIOS. If you have only IDE hard disks, its the first IDE disk
(e.g. primary disk on first controller). Similarly for SCSI
only systems. If you have both IDE and SCSI hard disks
though, the IDE disk is typically probed first by the BIOS, so
the first IDE disk is the first probed disk. The boot manager
you will install will be hooked into the MBR on this first
probed hard disk that we've just described.Booting Limitations and WarningsNow the interesting stuff that you need to watch out
for.The dreaded 1024 cylinder limit and how BIOS LBA helpsThe first part of the booting process is all done
through the BIOS, (if that's a new term to you, the BIOS is
a software chip on your system motherboard which provides
startup code for your computer). As such, this first part
of the process is subject to the limitations of the BIOS
interface.The BIOS interface used to read the hard disk during
this period (INT 13H, Subfunction 2) allocates 10 bits to
the Cylinder Number, 8 bits to the Head Number, and 6 bits
to the Sector Number. This restricts users of this
interface (i.e. boot managers hooked into your disk's MBR as
well as OS loaders hooked into the Boot Sectors) to the
following limits:1024 cylinders, max256 heads, max
- 64 sectors/track, max (actually 63, 0>
+ 64 sectors/track, max (actually 63, 0
isn't available)Now big hard disks have lots of cylinders but not a lot
of heads, so invariably with big hard disks the number of
cylinders is greater than 1024. Given this and the BIOS
interface as is, you can't boot off just anywhere on your
hard disk. The boot code (the boot manager and the OS
loader hooked into all bootable partitions' Boot Sectors)
has to reside below cylinder 1024. In fact, if your hard
disk is typical and has 16 heads, this equates to:1024 cyl/disk × 16 heads/disk × 63
sect/(cyl-head) × 512 bytes/sectorwhich is around the often-mentioned 528MB limit.This is where BIOS LBA (Logical Block Addressing) comes
in. BIOS LBA gives the user of the BIOS API calls access to
physical cylinders above 1024 though the BIOS interfaces by
redefining a cylinder. That is, it remaps your cylinders
and heads, making it appear through the BIOS as though the
disk has fewer cylinders and more heads than it actually
does. In other words, it takes advantage of the fact that
hard disks have relatively few heads and lots of cylinders
by shifting the balance between number of cylinders and
number of heads so that both numbers lie below the
above-mentioned limits (1024 cylinders, 256 heads).With BIOS LBA, the hard disk size limitation is
virtually removed (well, pushed up to 8 Gigabytes anyway).
If you have an LBA BIOS, you can put FreeBSD or any OS
anywhere you want and not hit the 1024 cylinder
limit.To use my 1.6 Gig Western Digital as an example again,
it's physical geometry is:(3148 cyl, 16 heads, 63 sectors/track, 512
bytes/sector)However, my BIOS LBA remaps this to:(787 cyl, 64 heads, 63 sectors/track, 512
bytes/sector)giving the same effective size disk, but with cylinder
and head counts within the BIOS API's range (Incidentally, I
have both Linux and FreeBSD existing on one of my hard disks
above the 1024th physical cylinder, and both operating
systems boot fine, thanks to BIOS LBA).Boot Managers and Disk AllocationAnother gotcha to watch out when installing boot
managers is allocating space for your boot manager. It's
best to be aware of this issue up front to save yourself
from having to reinstall one or more of your OSs.If you followed the discussion in about the Master Boot Sector (where the
MBR is), Partition Boot Sectors, and the booting process,
you may have been wondering just exactly where on your hard
disk that nifty boot manager is going to live. Well, some
boot managers are small enough to fit entirely within the
Master Boot Sector (Cylinder 0, Head 0, Sector 0) along with
the partition table. Others need a bit more room and
actually extend a few sectors past the Master Boot Sector in
the Cylinder 0 Head 0 track, since that's typically
free…typically.That's the catch. Some operating systems (FreeBSD
included) let you start their partitions right after the
Master Boot Sector at Cylinder 0, Head 0, Sector 2 if you
want. In fact, if you give FreeBSD's sysinstall a disk with
an empty chunk up front or the whole disk empty, that's
where it'll start the FreeBSD partition by default (at least
it did when I fell into this trap). Then when you go to
install your boot manager, if it's one that occupies a few
extra sectors after the MBR, it'll overwrite the front of
the first partition's data. In the case of FreeBSD, this
overwrites the disk label, and renders your FreeBSD
partition unbootable.The easy way to avoid this problem (and leave yourself
the flexibility to try different boot managers later) is
just to always leave the first full track on your disk
unallocated when you partition your disk. That is, leave
the space from Cylinder 0, Head 0, Sector 2 through Cylinder
0, Head 0, Sector 63 unallocated, and start your first
partition at Cylinder 0, Head 1, Sector 1. For what it's
worth, when you create a DOS partition at the front of your
disk, DOS leaves this space open by default (this is why
some boot managers assume it's free). So creating a DOS
partition up at the front of your disk avoids this problem
altogether. I like to do this myself, creating 1 Meg DOS
partition up front, because it also avoids my primary DOS
drive letters shifting later when I repartition.For reference, the following boot managers use the
Master Boot Sector to store their code and data:OS-BS 1.35Boot EasyLILOThese boot managers use a few additional sectors after
the Master Boot Sector:OS-BS 2.0 Beta 8 (sectors 2-5)OS/2's boot managerWhat if your machine won't boot?At some point when installing boot managers, you might
leave the MBR in a state such that your machine won't boot.
This is unlikely, but possible when re-FDISKing underneath
an already-installed boot manager.If you have a bootable DOS partition on your disk, you
can boot off a DOS floppy, and run:A:\> FDISK /MBR>
to put the original, simple DOS boot code back into the
system. You can then boot DOS (and DOS only) off the hard
drive. Alternatively, just re-run your boot manager
installation program off a bootable floppy.
diff --git a/en_US.ISO_8859-1/articles/new-users/article.sgml b/en_US.ISO_8859-1/articles/new-users/article.sgml
index 81b19eee0d..ba5ae93dad 100644
--- a/en_US.ISO_8859-1/articles/new-users/article.sgml
+++ b/en_US.ISO_8859-1/articles/new-users/article.sgml
@@ -1,1054 +1,1054 @@
-
+
For People New to Both FreeBSD and UnixAnneliseAndersonandrsn@andrsn.stanford.eduAugust 15, 1997Congratulations on installing FreeBSD! This introduction
is for people new to both FreeBSD and
Un*x—so it starts with basics. It assumes you're using
version 2.0.5 or later of FreeBSD as distributed by Walnut
Creek or FreeBSD.org, your system (for now) has a single user
(you)—and you're probably pretty good with DOS/Windows
or OS/2.Logging in and Getting OutLog in (when you see login:) as a user you created during
installation or as root. (Your FreeBSD
installation will already have an account for root; root can go
anywhere and do anything, including deleting essential files, so
be careful!) The symbols &prompt.user; and &prompt.root; in the following stand for the
prompt (yours may be different), with &prompt.user; indicating an ordinary
user and &prompt.root; indicating root.To log out (and get a new login: prompt) type&prompt.root; exitas often as necessary. Yes, press enter
after commands, and remember that Unix is
case-sensitive—exit, not
EXIT.To shut down the machine type&prompt.root; /sbin/shutdown -h nowOr to reboot type&prompt.root; /sbin/shutdown -r nowor&prompt.root; /sbin/rebootYou can also reboot with
CtrlAltDelete.
Give it a little time to do its work. This is equivalent to
/sbin/reboot in recent releases of FreeBSD
and is much, much better than hitting the reset button. You
don't want to have to reinstall this thing, do you?Adding A User with Root PrivilegesIf you didn't create any users when you installed the system
and are thus logged in as root, you should probably create a
user now with&prompt.root; adduserThe first time you use adduser, it might ask for some
defaults to save. You might want to make the default shell csh
instead of sh, if it suggests sh as the default. Otherwise just
press enter to accept each default. These defaults are saved in
/etc/adduser.conf, an editable file.Suppose you create a user jack with
full name Jack Benimble. Give jack a
password if security (even kids around who might pound on the
keyboard) is an issue. When it asks you if you want to invite
jack into other groups, type wheelLogin group is ``jack''. Invite jack into other groups: wheelThis will make it possible to log in as
jack and use the su
command to become root. Then you won't get scolded any more for
logging in as root.You can quit adduser any time by typing
CtrlC,
and at the end you'll have a chance to approve your new user or
simply type n for no. You might want to create
a second new user (jill?) so that when you edit jack's login
files, you'll have a hot spare in case something goes
wrong.Once you've done this, use exit to get
back to a login prompt and log in as jack.
In general, it's a good idea to do as much work as possible as
an ordinary user who doesn't have the power—and
risk—of root.If you already created a user and you want the user to be
able to su to root, you can log in as root
and edit the file /etc/group, adding jack
to the first line (the group wheel). But first you need to
practice vi, the text editor--or use the
simpler text editor, ee, installed on recent
version of FreeBSD.To delete a user, use the rmuser
command.Looking AroundLogged in as an ordinary user, look around and try out some
commands that will access the sources of help and information
within FreeBSD.Here are some commands and what they do:idTells you who you are!pwdShows you where you are—the current working
directory.lsLists the files in the current directory.ls
-F
Lists the files in the current directory with a
* after executables, a
/ after directories, and an
@ after symbolic links.ls
-l
Lists the files in long format—size, date,
permissions.ls
-a
Lists hidden dot files with the others.
If you're root, the dot files show up
without the
-a
switch.cdChanges directories. cd
.. backs up one level;
note the space after cd. cd
/usr/local goes there.
cd ~ goes to
the home directory of the person logged in—e.g.,
/usr/home/jack. Try cd
/cdrom, and then
ls, to find out if your CDROM is
mounted and working.view
filenameLets you look at a file (named
filename) without changing it.
Try view
/etc/fstab.
:q to quit.cat
filenameDisplays filename on
screen. If it's too long and you can see only the end of
it, press ScrollLock and use the
up-arrow to move backward; you can use
ScrollLock with man pages too. Press
ScrollLock again to quit scrolling. You
might want to try cat on some of the
dot files in your home directory—cat
.cshrc, cat
.login, cat
.profile.You'll notice aliases in .cshrc for
some of the ls commands (they're very
convenient). You can create other aliases by editing
.cshrc. You can make these aliases
available to all users on the system by putting them in the
system-wide csh configuration file,
/etc/csh.cshrc.Getting Help and InformationHere are some useful sources of help.
Text stands for something of your
choice that you type in—usually a command or
filename.apropos
textEverything containing string
text in the whatis
database.man
textThe man page for text. The
major source of documentation for Un*x systems.
man ls will tell
you all the ways to use the ls command.
Press Enter to move through text,
Ctrlb
to go back a page,
Ctrlf
to go forward, q or
Ctrlc
to quit.which
textTells you where in the user's path the command
text is found.locate
textAll the paths where the string
text is found.whatis
textTells you what the command
text does and its man page.
Typing whatis * will tell you about all
the binaries in the current directory.whereis
textFinds the file text, giving
its full path.You might want to try using whatis on
some common useful commands like cat,
more, grep,
mv, find,
tar, chmod,
chown, date, and
script. more lets you
read a page at a time as it does in DOS, e.g., ls -l |
more or more
filename. The
* works as a wildcard—e.g., ls
w* will show you files beginning with
w.Are some of these not working very well? Both
locate and whatis depend
on a database that's rebuilt weekly. If your machine isn't
going to be left on over the weekend (and running FreeBSD), you
might want to run the commands for daily, weekly, and monthly
maintenance now and then. Run them as root and give each one
time to finish before you start the next one, for now.&prompt.root; periodic dailyoutput omitted
&prompt.root; periodic weeklyoutput omitted
&prompt.root; periodic monthlyoutput omittedIf you get tired of waiting, press
AltF2 to
get another virtual console, and log in
again. After all, it's a multi-user, multi-tasking system.
Nevertheless these commands will probably flash messages on your
screen while they're running; you can type
clear at the prompt to clear the screen.
Once they've run, you might want to look at
/var/mail/root and
/var/log/messages.Running such commands is part of system
administration—and as a single user of a Unix system,
you're your own system administrator. Virtually everything you
need to be root to do is system administration. Such
responsibilities aren't covered very well even in those big fat
books on Unix, which seem to devote a lot of space to pulling
down menus in windows managers. You might want to get one of
the two leading books on systems administration, either Evi
Nemeth et.al.'s UNIX System Administration
Handbook (Prentice-Hall, 1995, ISBN
0-13-15051-7)—the second edition with the red cover; or
Æleen Frisch's Essential System
Administration (O'Reilly & Associates, 1993,
ISBN 0-937175-80-3). I used Nemeth.Editing TextTo configure your system, you need to edit text files. Most
of them will be in the /etc directory; and
you'll need to su to root to be able to
change them. You can use the easy ee, but in
the long run the text editor vi is worth
learning. There's an excellent tutorial on vi in
/usr/src/contrib/nvi/docs/tutorial if you
have that installed; otherwise you can get it by ftp to
ftp.cdrom.com in the directory
FreeBSD/FreeBSD-current/src/contrib/nvi/docs/tutorial.Before you edit a file, you should probably back it up.
Suppose you want to edit /etc/rc.conf. You
could just use cd /etc to get to the
/etc directory and do:&prompt.root; cp rc.conf rc.conf.origThis would copy rc.conf to
rc.conf.orig, and you could later copy
rc.conf.orig to
rc.conf to recover the original. But even
better would be moving (renaming) and then copying back:&prompt.root; mv rc.conf rc.conf.orig
&prompt.root; cp rc.conf.orig rc.confbecause the mv command preserves the
original date and owner of the file. You can now edit
rc.conf. If you want the original back,
you'd then mv rc.conf rc.conf.myedit
(assuming you want to preserve your edited version) and
then&prompt.root; mv rc.conf.orig rc.confto put things back the way they were.To edit a file, type&prompt.root; vi filenameMove through the text with the arrow keys.
Esc (the escape key) puts vi
in command mode. Here are some commands:xdelete letter the cursor is ondddelete the entire line (even if it wraps on the
screen)iinsert text at the cursorainsert text after the cursorOnce you type i or a,
you can enter text. Esc puts you back in
command mode where you can type:wto write your changes to disk and continue
editing:wqto write and quit:q!to quit without saving changes/textto move the cursor to text;
/Enter (the enter key)
to find the next instance of
text.Gto go to the end of the filenGto go to line n in the
file, where n is a
number
- Ctrl>L>
+ CtrlLto redraw the screen
- Ctrl>b>> and
- Ctrl>f>>
+ Ctrlb and
+ Ctrlfgo back and forward a screen, as they do with
- more> and view>.
+ more and view.
- Practice with vi> in your home directory by
- creating a new file with vi filename>>
+ Practice with vi in your home directory by
+ creating a new file with vi filename
and adding and deleting text, saving the file, and calling it up
- again. vi> delivers some surprises because it's
+ again. vi delivers some surprises because it's
really quite complex, and sometimes you'll inadvertently issue a
command that will do something you don't expect. (Some people
- actually like vi>—it's more powerful than DOS
- EDIT—find out about the :r> command.) Use
- Esc> one or more times to be sure you're in command
+ actually like vi—it's more powerful than DOS
+ EDIT—find out about the :r command.) Use
+ Esc one or more times to be sure you're in command
mode and proceed from there when it gives you trouble, save
- often with :w>, and use :q!> to get out
- and start over (from your last :w>) when you need
+ often with :w, and use :q! to get out
+ and start over (from your last :w) when you need
to.
- Now you can cd> to /etc,
- su> to root, use vi> to edit the file
+ Now you can cd to /etc,
+ su to root, use vi to edit the file
/etc/group, and add a user to wheel so the
user has root privileges. Just add a comma and the user's login
name to the end of the first line in the file, press
- Esc>, and use :wq> to write the file to
+ Esc, and use :wq to write the file to
disk and quit. Instantly effective. (You didn't put a space
after the comma, did you?)Printing Files from DOSAt this point you probably don't have the printer working,
so here's a way to create a file from a man page, move it to a
floppy, and then print it from DOS. Suppose you want to read
carefully about changing permissions on files (pretty
important). You can use the command man chmod to read about it.
The command&prompt.user; man chmod | col -b > chmod.txt>
will remove formatting codes and send the man page to the
chmod.txt file instead of showing it on
your screen. Now put a dos-formatted diskette in your floppy
- drive a, su> to root, and type
+ drive a, su to root, and type
&prompt.root; /sbin/mount -t msdos /dev/fd0 /mnt>
to mount the floppy drive on
/mnt.Now (you no longer need to be root, and you can type
- exit> to get back to being user jack) you can go to
+ exit to get back to being user jack) you can go to
the directory where you created chmod.txt and copy the file to
the floppy with:&prompt.user; cp chmod.txt /mnt>
and use ls /mnt to get a directory
listing of /mnt, which should show the file
chmod.txt.You might especially want to make a file from
/sbin/dmesg by typing&prompt.user; /sbin/dmesg > dmesg.txt>
and copying dmesg.txt to the floppy.
/sbin/dmesg is the boot log record, and it's
useful to understand it because it shows what FreeBSD found when
it booted up. If you ask questions on
- freebsd-questions@FreeBSD.org> or on a USENET
+ freebsd-questions@FreeBSD.org or on a USENET
group—like FreeBSD isn't finding my tape drive,
what do I do?—people will want to know what
- dmesg> has to say.
+ dmesg has to say.
You can now dismount the floppy drive (as root) to get the
disk out with&prompt.root; /sbin/umount /mnt>
and reboot to go to DOS. Copy these files to a DOS
directory, call them up with DOS EDIT, Windows Notepad or
Wordpad, or a word processor, make a minor change so the file
has to be saved, and print as you normally would from DOS or
Windows. Hope it works! man pages come out best if printed
- with the dos print> command. (Copying files from
+ with the dos print command. (Copying files from
FreeBSD to a mounted dos partition is in some cases still a
little risky.)Getting the printer printing from FreeBSD involves creating
an appropriate entry in /etc/printcap and
creating a matching spool directory in
/var/spool/output. If your printer is on
- lpt0> (what dos calls LPT1>), you may
+ lpt0 (what dos calls LPT1), you may
only need to go to /var/spool/output and
- (as root) create the directory lpd> by typing:
+ (as root) create the directory lpd by typing:
mkdir lpd, if it doesn't already exist.
Then the printer should respond if it's turned on when the
system is booted, and lp or lpr should send a file to the
printer. Whether or not the file actually prints depends on
configuring it, which is covered in the FreeBSD handbook.>
+ URL="../../handbook/handbook.html">FreeBSD handbook.
Other Useful Commands
- df>
+ dfshows file space and mounted systems.
- ps aux>
+ ps aux
- shows processes running. ps ax> is a
+ shows processes running. ps ax is a
narrower form.
- rm filename>>
+ rm filename
- remove filename>.
+ remove filename.
- rm -R dir>>
+ rm -R dir
- removes a directory dir> and all
+ removes a directory dir and all
subdirectories—careful!ls -Rlists files in the current directory and all
subdirectories; I used a variant, ls -AFR >
where.txt, to get a list of all the files in
/ and (separately)
/usr before I found better ways to
find files.
- passwd>
+ passwdto change user's password (or root's password)
- man hier>
+ man hierman page on the Unix file system
- Use find> to locate filename in
+ Use find to locate filename in
/usr or any of its subdirectories
with&prompt.user; find /usr -name "filename>">
You can use * as a wildcard in
- "filename>"> (which should be in
+ "filename" (which should be in
quotes). If you tell find to search in /
instead of /usr it will look for the
file(s) on all mounted file systems, including the CDROM and the
dos partition.An excellent book that explains Unix commands and utilities
is Abrahams & Larson, Unix for the
Impatient (2nd ed., Addison-Wesley, 1996).
There's also a lot of Unix information on the Internet. Try the
Unix Reference
Desk.Next StepsYou should now have the tools you need to get around and
edit files, so you can get everything up and running. There is
a great deal of information in the FreeBSD handbook (which is
probably on your hard drive) and FreeBSD's web site. A
wide variety of packages and ports are on the Walnut Creek CDROM as well
as the web site. The handbook tells you more about how to use
them (get the package if it exists, with pkg_add
- /cdrom/packages/All/packagename>>, where
+ /cdrom/packages/All/packagename, where
packagename is the filename of the
package). The cdrom has lists of the packages and ports with
brief descriptions in cdrom/packages/index,
cdrom/packages/index.txt, and
cdrom/ports/index, with fuller descriptions
in /cdrom/ports/*/*/pkg/DESCR, where the
*s represent subdirectories of kinds of
programs and program names respectively.If you find the handbook too sophisticated (what with
- lndir> and all) on installing ports from the cdrom,
+ lndir and all) on installing ports from the cdrom,
here's what usually works:
- Find the port you want, say kermit>. There will
+ Find the port you want, say kermit. There will
be a directory for it on the cdrom. Copy the subdirectory to
/usr/local (a good place for software you
add that should be available to all users) with:&prompt.root; cp -R /cdrom/ports/comm/kermit /usr/local>
This should result in a
/usr/local/kermit subdirectory that has all
the files that the kermit subdirectory on the
CDROM has.Next, create the directory
/usr/ports/distfiles if it doesn't already
- exist using mkdir>. Now check check
+ exist using mkdir. Now check check
/cdrom/ports/distfiles for a file with a
name that indicates it's the port you want. Copy that file to
/usr/ports/distfiles; in recent versions
you can skip this step, as FreeBSD will do it for you. In the
- case of kermit>, there is no distfile.
+ case of kermit, there is no distfile.
- Then cd> to the subdirectory of
+ Then cd to the subdirectory of
/usr/local/kermit that has the file
- Makefile>. Type
+ Makefile. Type&prompt.root; make all install>
During this process the port will ftp to get any compressed
files it needs that it didn't find on the cdrom or in
/usr/ports/distfiles. If you don't have
your network running yet and there was no file for the port in
/cdrom/ports/distfiles, you will have to
get the distfile using another machine and copy it to
/usr/ports/distfiles from a floppy or your
- dos partition. Read Makefile> (with cat>
- or more> or view>) to find out where to go
+ dos partition. Read Makefile (with cat
+ or more or view) to find out where to go
(the master distribution site) to get the file and what its name
is. Its name will be truncated when downloaded to DOS, and
after you get it into /usr/ports/distfiles
- you'll have to rename it (with the mv> command) to
+ you'll have to rename it (with the mv command) to
its original name so it can be found. (Use binary file
transfers!) Then go back to
/usr/local/kermit, find the directory with
- Makefile>, and type make all
- install>.
+ Makefile, and type make all
+ install.
The other thing that happens when installing ports or
packages is that some other program is needed. If the
installation stops with a message can't find
unzip or whatever, you might need to install the
package or port for unzip before you continue.
- Once it's installed type rehash> to make FreeBSD
+ Once it's installed type rehash to make FreeBSD
reread the files in the path so it knows what's there. (If you
- get a lot of path not found> messages when you use
- whereis> or which, you might want to make additions
+ get a lot of path not found messages when you use
+ whereis or which, you might want to make additions
to the list of directories in the path statement in
.cshrc in your home directory. The path
statement in Unix does the same kind of work it does in DOS,
except the current directory is not (by default) in the path for
security reasons; if the command you want is in the directory
you're in, you need to type ./ before the
command to make it work; no space after the slash.)You might want to get the most recent version of Netscape
from their ftp site.
(Netscape requires the X Window System.) There's now a FreeBSD
version, so look around carefully. Just use gunzip
- filename>> and tar xvf
- filename>> on it, move the binary to
+ filename and tar xvf
+ filename on it, move the binary to
/usr/local/bin or some other place binaries
- are kept, rehash>, and then put the following lines
+ are kept, rehash, and then put the following lines
in .cshrc in each user's home directory or
(easier) in /etc/csh.cshrc, the
system-wide csh start-up file:setenv XKEYSYMDB /usr/X11R6/lib/X11/XKeysymDB
setenv XNLSPATH /usr/X11R6/lib/X11/nls
- >
+
- This assumes that the file XKeysymDB> and the
- directory nls> are in
+ This assumes that the file XKeysymDB and the
+ directory nls are in
/usr/X11R6/lib/X11; if they're not, find
them and put them there.If you originally got Netscape as a port using the CDROM (or
ftp), don't replace /usr/local/bin/netscape
with the new netscape binary; this is just a shell script that
sets up the environment variables for you. Instead rename the
new binary to netscape.bin and replace the
old binary, which is
/usr/local/netscape/netscape.Your Working EnvironmentYour shell is the most important part of your working
environment. In DOS, the usual shell is command.com. The shell
is what interprets the commands you type on the command line,
and thus communicates with the rest of the operating system.
You can also write shell scripts, which are like DOS batch
files: a series of commands to be run without your
intervention.Two shells come installed with FreeBSD: csh and sh. csh is
good for command-line work, but scripts should be written with
sh (or bash). You can find out what shell you have by typing
echo $SHELL.The csh shell is okay, but tcsh does everything csh does and
more. It It allows you to recall commands with the arrow keys
and edit them. It has tab-key completion of filenames (csh uses
the escape key), and it lets you switch to the directory you
were last in with cd -. It's also much
easier to alter your prompt with tcsh. It makes life a lot
easier.Here are the three steps for installing a new shell:Install the shell as a port or a package, just as you
would any other port or package. Use
rehash and which tcsh
(assuming you're installing tcsh) to make sure it got
installed.As root, edit /etc/shells, adding a
line in the file for the new shell, in this case
/usr/local/bin/tcsh, and save the file. (Some ports may do
this for you.)Use the chsh command to change your
shell to tcsh permanently, or type tcsh
at the prompt to change your shell without logging in
again.It can be dangerous to change root's shell to something
other than sh or csh on early versions of FreeBSD and many
other versions of Unix; you may not have a working shell when
the system puts you into single user mode. The solution is to
use su -m to become root, which will give
you the tcsh as root, because the shell is part of the
environment. You can make this permanent by adding it to your
.tcshrc file as an alias with
- alias su su -m.>
+ alias su su -m.When tcsh starts up, it will read the
/etc/csh.cshrc and
/etc/csh.login files, as does csh. It will
also read the .login file in your home
directory and the .cshrc file as well,
unless you provide a .tcshrc file. This
you can do by simply copying .cshrc to
.tcshrc.Now that you've installed tcsh, you can adjust your prompt.
You can find the details in the manual page for tcsh, but here
is a line to put in your .tcshrc that will
tell you how many commands you have typed, what time it is, and
what directory you are in. It also produces a
> if you're an ordinary user and a
# if you're root, but tsch will do that in
any case:set prompt = "%h %t %~ %# "This should go in the same place as the existing set prompt
line if there is one, or under "if($?prompt) then" if not.
Comment out the old line; you can always switch back to it if
you prefer it. Don't forget the spaces and quotes. You can get
the .tcshrc reread by typing
source .tcshrc.You can get a listing of other environmental variables that
have been set by typing env at the prompt.
The result will show you your default editor, pager, and
terminal type, among possibly many others. A useful command if
you log in from a remote location and can't run a program
because the terminal isn't capable is setenv TERM
vt100.OtherAs root, you can dismount the CDROM with
- /sbin/umount /cdrom>, take it out of the drive,
+ /sbin/umount /cdrom, take it out of the drive,
insert another one, and mount it with
- /sbin/mount_cd9660 /dev/cd0a /cdrom> assuming
- cd0a> is the device name for your CDROM drive. The
+ /sbin/mount_cd9660 /dev/cd0a /cdrom assuming
+ cd0a is the device name for your CDROM drive. The
most recent versions of FreeBSD let you mount the cdrom with
just /sbin/mount /cdrom.Using the live file system—the second of FreeBSD's
CDROM disks—is useful if you've got limited space. What
is on the live file system varies from release to release. You
might try playing games from the cdrom. This involves using
- lndir>, which gets installed with the X Window
+ lndir, which gets installed with the X Window
System, to tell the program(s) where to find the necessary
files, because they're in the /cdrom file
system instead of in /usr and its
subdirectories, which is where they're expected to be. Read
- man lndir>.
+ man lndir.
Comments WelcomeIf you use this guide I'd be interested in knowing where it
was unclear and what was left out that you think should be
included, and if it was helpful. My thanks to Eugene W. Stark,
professor of computer science at SUNY-Stony Brook, and John
Fieber for helpful comments.Annelise Anderson,
- andrsn@andrsn.stanford.edu>
+ andrsn@andrsn.stanford.edu
diff --git a/en_US.ISO_8859-1/articles/programming-tools/article.sgml b/en_US.ISO_8859-1/articles/programming-tools/article.sgml
index 63883a1268..aeb6389e91 100644
--- a/en_US.ISO_8859-1/articles/programming-tools/article.sgml
+++ b/en_US.ISO_8859-1/articles/programming-tools/article.sgml
@@ -1,2264 +1,2264 @@
-
+
A User's Guide to FreeBSD Programming ToolsJamesRaynardjraynard@FreeBSD.orgAugust 17, 19971997James RaynardThis document is an introduction to using some of the
programming tools supplied with FreeBSD, although much of it
will be applicable to many other versions of Unix. It does
not attempt to describe coding in any
detail. Most of the document assumes little or no previous
programming knowledge, although it is hoped that most
programmers will find something of value in itIntroductionFreeBSD offers an excellent development environment.
Compilers for C, C++, and Fortran and an assembler come with the
basic system, not to mention a Perl interpreter and classic Unix
- tools such as sed> and awk>. If that is
+ tools such as sed and awk. If that is
not enough, there are many more compilers and interpreters in
the Ports collection. FreeBSD is very compatible with standards
- such as POSIX> and ANSI> C, as well with
+ such as POSIX and ANSI C, as well with
its own BSD heritage, so it is possible to write applications
that will compile and run with little or no modification on a
wide range of platforms.However, all this power can be rather overwhelming at first
if you've never written programs on a Unix platform before.
This document aims to help you get up and running, without
getting too deeply into more advanced topics. The intention is
that this document should give you enough of the basics to be
able to make some sense of the documentation.Most of the document requires little or no knowledge of
programming, although it does assume a basic competence with
using Unix and a willingness to learn!Introduction to ProgrammingA program is a set of instructions that tell the computer to
do various things; sometimes the instruction it has to perform
depends on what happened when it performed a previous
instruction. This section gives an overview of the two main
ways in which you can give these instructions, or
commands as they are usually called. One way
- uses an interpreter>, the other a
- compiler>. As human languages are too difficult for
+ uses an interpreter, the other a
+ compiler. As human languages are too difficult for
a computer to understand in an unambiguous way, commands are
usually written in one or other languages specially designed for
the purpose.InterpretersWith an interpreter, the language comes as an environment,
where you type in commands at a prompt and the environment
executes them for you. For more complicated programs, you can
type the commands into a file and get the interpreter to load
the file and execute the commands in it. If anything goes
wrong, many interpreters will drop you into a debugger to help
you track down the problem.The advantage of this is that you can see the results of
your commands immediately, and mistakes can be corrected
readily. The biggest disadvantage comes when you want to
share your programs with someone. They must have the same
interpreter, or you must have some way of giving it to them,
and they need to understand how to use it. Also users may not
appreciate being thrown into a debugger if they press the
wrong key! From a performance point of view, interpreters can
use up a lot of memory, and generally do not generate code as
efficiently as compilers.In my opinion, interpreted languages are the best way to
start if you have not done any programming before. This kind
of environment is typically found with languages like Lisp,
Smalltalk, Perl and Basic. It could also be argued that the
- Unix shell (sh>, csh>) is itself an
+ Unix shell (sh, csh) is itself an
interpreter, and many people do in fact write shell
scripts to help with various
- housekeeping> tasks on their machine. Indeed, part
+ housekeeping tasks on their machine. Indeed, part
of the original Unix philosophy was to provide lots of small
utility programs that could be linked together in shell
scripts to perform useful tasks.Interpreters available with FreeBSDHere is a list of interpreters that are available as
FreeBSD
packages, with a brief discussion of some of the
more popular interpreted languages.To get one of these packages, all you need to do is to
click on the hotlink for the package, then run&prompt.root; pkg_add package name>as root. Obviously, you will need to have a fully
functional FreeBSD 2.1.0 or later system for the package to
work!
- BASIC>
+ BASICShort for Beginner's All-purpose Symbolic
Instruction Code. Developed in the 1950s for teaching
University students to program and provided with every
self-respecting personal computer in the 1980s,
- BASIC> has been the first programming
+ BASIC has been the first programming
language for many programmers. It's also the foundation
- for Visual Basic>.
+ for Visual Basic.
The Bywater
Basic Interpreter and the Phil
Cockroft's Basic Interpreter (formerly Rabbit
Basic) are available as FreeBSD FreeBSD
packagesLispA language that was developed in the late 1950s as
an alternative to the number-crunching
languages that were popular at the time. Instead of
being based on numbers, Lisp is based on lists; in fact
the name is short for List Processing.
Very popular in AI (Artificial Intelligence)
circles.Lisp is an extremely powerful and sophisticated
language, but can be rather large and unwieldy.FreeBSD has GNU
Common Lisp available as a package.PerlVery popular with system administrators for writing
scripts; also often used on World Wide Web servers for
- writing CGI> scripts.
+ writing CGI scripts.
The latest version (version 5) comes with FreeBSD.SchemeA dialect of Lisp that is rather more compact and
cleaner than Common Lisp. Popular in Universities as it
is simple enough to teach to undergraduates as a first
language, while it has a high enough level of
abstraction to be used in research work.FreeBSD has packages of the Elk
Scheme Interpreter, the MIT
Scheme Interpreter and the SCM
Scheme Interpreter.IconThe
Icon Programming Language.LogoBrian
Harvey's LOGO Interpreter.PythonThe
Python Object-Oriented Programming
LanguageCompilersCompilers are rather different. First of all, you write
your code in a file (or files) using an editor. You then run
the compiler and see if it accepts your program. If it did
not compile, grit your teeth and go back to the editor; if it
did compile and gave you a program, you can run it either at a
shell command prompt or in a debugger to see if it works
properly.
If you run it in the shell, you may get a core
dump.Obviously, this is not quite as direct as using an
interpreter. However it allows you to do a lot of things
which are very difficult or even impossible with an
interpreter, such as writing code which interacts closely with
the operating system—or even writing your own operating
system! It's also useful if you need to write very efficient
code, as the compiler can take its time and optimise the code,
which would not be acceptable in an interpreter. And
distributing a program written for a compiler is usually more
straightforward than one written for an interpreter—you
can just give them a copy of the executable, assuming they
have the same operating system as you.Compiled languages include Pascal, C and C++. C and C++
are rather unforgiving languages, and best suited to more
experienced programmers; Pascal, on the other hand, was
designed as an educational language, and is quite a good
language to start with. Unfortunately, FreeBSD doesn't have
any Pascal support, except for a Pascal-to-C converter in the
ports.As the edit-compile-run-debug cycle is rather tedious when
using separate programs, many commercial compiler makers have
produced Integrated Development Environments
(IDEs for short). FreeBSD does not have an
- IDE> as such; however it is possible to use Emacs
+ IDE as such; however it is possible to use Emacs
for this purpose. This is discussed in .Compiling with ccThis section deals only with the GNU compiler for C and C++,
since that comes with the base FreeBSD system. It can be
- invoked by either cc> or gcc>. The
+ invoked by either cc or gcc. The
details of producing a program with an interpreter vary
considerably between interpreters, and are usually well covered
in the documentation and on-line help for the
interpreter.Once you've written your masterpiece, the next step is to
convert it into something that will (hopefully!) run on FreeBSD.
This usually involves several steps, each of which is done by a
separate program.Pre-process your source code to remove comments and do
other tricks like expanding macros in C.Check the syntax of your code to see if you have obeyed
the rules of the language. If you have not, it will
complain!Convert the source code into assembly
language—this is very close to machine code, but still
understandable by humans. Allegedly.
- To be strictly accurate, cc> converts the
+ To be strictly accurate, cc converts the
source code into its own, machine-independent
- p-code> instead of assembly language at
+ p-code instead of assembly language at
this stage.Convert the assembly language into machine
code—yep, we are talking bits and bytes, ones and
zeros here.Check that you have used things like functions and
global variables in a consistent way. For example, if you
have called a non-existent function, it will
complain.If you are trying to produce an executable from several
source code files, work out how to fit them all
together.Work out how to produce something that the system's
run-time loader will be able to load into memory and
run.Finally, write the executable on the file system.
- The word compiling> is often used to refer to
+ The word compiling is often used to refer to
just steps 1 to 4—the others are referred to as
- linking>. Sometimes step 1 is referred to as
- pre-processing> and steps 3-4 as
- assembling>.
+ linking. Sometimes step 1 is referred to as
+ pre-processing and steps 3-4 as
+ assembling.Fortunately, almost all this detail is hidden from you, as
- cc> is a front end that manages calling all these
+ cc is a front end that manages calling all these
programs with the right arguments for you; simply typing&prompt.user; cc foobar.c>
- will cause foobar.c> to be compiled by all the
+ will cause foobar.c to be compiled by all the
steps above. If you have more than one file to compile, just do
something like&prompt.user; cc foo.c bar.c>
Note that the syntax checking is just that—checking
the syntax. It will not check for any logical mistakes you may
have made, like putting the program into an infinite loop, or
using a bubble sort when you meant to use a binary
sort.
In case you didn't know, a binary sort is an efficient
way of sorting things into order and a bubble sort
isn't.
- There are lots and lots of options for cc>, which
+ There are lots and lots of options for cc, which
are all in the man page. Here are a few of the most important
ones, with examples of how to use them.
-
-o filename>
+
-o filename
The output name of the file. If you do not use this
- option, cc> will produce an executable called
- a.out>.
+ option, cc will produce an executable called
+ a.out.
The reasons for this are buried in the mists of
history.&prompt.user; cc foobar.c> executable is a.out>>
&prompt.user; cc -o foobar foobar.c> executable is foobar>>
-c
Just compile the file, do not link it. Useful for toy
programs where you just want to check the syntax, or if
you are using a Makefile.&prompt.user; cc -c foobar.c
- This will produce an object file> (not an
+ This will produce an object file (not an
executable) called foobar.o. This
can be linked together with other object files into an
executable.
-g
Create a debug version of the executable. This makes
the compiler put information into the executable about
which line of which source file corresponds to which
function call. A debugger can use this information to show
the source code as you step through the program, which is
very useful; the disadvantage is that
all this extra information makes the program much bigger.
Normally, you compile with
-g
while you
are developing a program and then compile a release
version without
-g
when you're
satisfied it works properly.&prompt.user; cc -g foobar.cThis will produce a debug version of the
program.
Note, we didn't use the
-o
flag
to specify the executable name, so we will get an
executable called a.out.
Producing a debug version called
foobar is left as an exercise for
the reader!
-O
Create an optimised version of the executable. The
compiler performs various clever tricks to try and produce
an executable that runs faster than normal. You can add a
number after the
-O
to specify a higher
level of optimisation, but this often exposes bugs in the
compiler's optimiser. For instance, the version of
cc that comes with the 2.1.0 release of
FreeBSD is known to produce bad code with the
-O2
option in some circumstances.Optimisation is usually only turned on when compiling
a release version.&prompt.user; cc -O -o foobar foobar.cThis will produce an optimised version of
foobar.The following three flags will force cc
to check that your code complies to the relevant international
standard, often referred to as the ANSI
standard, though strictly speaking it is an
ISO standard.
-Wall
Enable all the warnings which the authors of
cc believe are worthwhile. Despite the
name, it will not enable all the warnings
cc is capable of.
-ansi
Turn off most, but not all, of the
- non-ANSI> C features provided by
+ non-ANSI C features provided by
cc. Despite the name, it does not
guarantee strictly that your code will comply to the
standard.
-pedantic
Turn off all
- cc's non-ANSI> C
+ cc's non-ANSI C
features.Without these flags, cc will allow you to
use some of its non-standard extensions to the standard. Some
of these are very useful, but will not work with other
compilers—in fact, one of the main aims of the standard is
to allow people to write code that will work with any compiler
on any system. This is known as portable
code.Generally, you should try to make your code as portable as
possible, as otherwise you may have to completely re-write the
program later to get it to work somewhere else—and who
knows what you may be using in a few years time?&prompt.user; cc -Wall -ansi -pedantic -o foobar foobar.cThis will produce an executable foobar
after checking foobar.c for standard
compliance.
-llibrary
Specify a function library to be used during when
linking.The most common example of this is when compiling a
program that uses some of the mathematical functions in C.
Unlike most other platforms, these are in a separate
library from the standard C one and you have to tell the
compiler to add it.The rule is that if the library is called
libsomething.a,
you give cc the argument
-lsomething
.
For example, the math library is
libm.a, so you give
cc the argument
-lm
.
A common gotcha with the math library is
that it has to be the last library on the command
line.&prompt.user; cc -o foobar foobar.c -lmThis will link the math library functions into
foobar.If you are compiling C++ code, you need to add
-lg++
, or
-lstdc++
if
you are using FreeBSD 2.2 or later, to the command line
argument to link the C++ library functions.
Alternatively, you can run c++ instead
of cc, which does this for you.
c++ can also be invoked as
g++ on FreeBSD.&prompt.user; cc -o foobar foobar.cc -lg++For FreeBSD 2.1.6 and earlier>
&prompt.user; cc -o foobar foobar.cc -lstdc++For FreeBSD 2.2 and later>
&prompt.user; c++ -o foobar foobar.ccEach of these will both produce an executable
foobar from the C++ source file
foobar.cc. Note that, on Unix
systems, C++ source files traditionally end in
.C, .cxx or
.cc, rather than the
MS-DOS style
.cpp (which was already used for
something else). gcc used to rely on
this to work out what kind of compiler to use on the
source file; however, this restriction no longer applies,
so you may now call your C++ files
.cpp with impunity!Common cc Queries and ProblemsI am trying to write a program which uses the
sin() function and I get an error
like this. What does it mean?/var/tmp/cc0143941.o: Undefined symbol `_sin' referenced from text segment
When using mathematical functions like
sin(), you have to tell
cc to link in the math library, like
so:&prompt.user; cc -o foobar foobar.c -lmAll right, I wrote this simple program to practice
using
-lm
. All it does is raise 2.1 to
the power of 6.#include <stdio.h>
int main() {
float f;
f = pow(2.1, 6);
printf("2.1 ^ 6 = %f\n", f);
return 0;
}
and I compiled it as:&prompt.user; cc temp.c -lmlike you said I should, but I get this when I run
it:&prompt.user; ./a.out
2.1 ^ 6 = 1023.000000
This is not the right answer!
What is going on?When the compiler sees you call a function, it
checks if it has already seen a prototype for it. If it
has not, it assumes the function returns an
int, which is definitely not what you want
here.So how do I fix this?The prototypes for the mathematical functions are in
math.h. If you include this file,
the compiler will be able to find the prototype and it
will stop doing strange things to your
calculation!#include <math.h>
#include <stdio.h>
int main() {
...
After recompiling it as you did before, run
it:&prompt.user; ./a.out
2.1 ^ 6 = 85.766121
If you are using any of the mathematical functions,
always include
math.h and remember to link in the
math library.I compiled a file called
foobar.c and I cannot find an
executable called foobar. Where's
it gone?Remember, cc will call the
executable a.out unless you tell it
differently. Use the
-o filename
option:&prompt.user; cc -o foobar foobar.cOK, I have an executable called
foobar, I can see it when I run
ls, but when I type in
foobar at the command prompt it tells
me there is no such file. Why can it not find
it?Unlike MS-DOS, Unix does not
look in the current directory when it is trying to find
out which executable you want it to run, unless you tell
it to. Either type ./foobar, which
means run the file called
foobar in the current
directory, or change your PATH environment
variable so that it looks something likebin:/usr/bin:/usr/local/bin:.
The dot at the end means look in the current
directory if it is not in any of the
others.I called my executable test,
but nothing happens when I run it. What is going
on?Most Unix systems have a program called
test in /usr/bin
and the shell is picking that one up before it gets to
checking the current directory. Either type:&prompt.user; ./testor choose a better name for your program!I compiled my program and it seemed to run all right
at first, then there was an error and it said something
about core dumped. What does that
mean?The name core dump dates back
to the very early days of Unix, when the machines used
core memory for storing data. Basically, if the program
failed under certain conditions, the system would write
the contents of core memory to disk in a file called
core, which the programmer could
then pore over to find out what went wrong.Fascinating stuff, but what I am supposed to do
now?Use gdb to analyse the core (see
).When my program dumped core, it said something about
a segmentation fault. What's
that?This basically means that your program tried to
perform some sort of illegal operation on memory; Unix
is designed to protect the operating system and other
programs from rogue programs.Common causes for this are:Trying to write to a NULL
pointer, egchar *foo = NULL;
strcpy(foo, "bang!");
Using a pointer that hasn't been initialised,
egchar *foo;
strcpy(foo, "bang!");
The pointer will have some random value that,
with luck, will point into an area of memory that
isn't available to your program and the kernel will
kill your program before it can do any damage. If
you're unlucky, it'll point somewhere inside your
own program and corrupt one of your data structures,
causing the program to fail mysteriously.Trying to access past the end of an array,
egint bar[20];
bar[27] = 6;
Trying to store something in read-only memory,
egchar *foo = "My string";
strcpy(foo, "bang!");
Unix compilers often put string literals like
"My string" into read-only areas
of memory.Doing naughty things with
malloc() and
free(), egchar bar[80];
free(bar);
orchar *foo = malloc(27);
free(foo);
free(foo);
Making one of these mistakes will not always lead to
an error, but they are always bad practice. Some
systems and compilers are more tolerant than others,
which is why programs that ran well on one system can
crash when you try them on an another.Sometimes when I get a core dump it says
bus error. It says in my Unix
book that this means a hardware problem, but the
computer still seems to be working. Is this
true?No, fortunately not (unless of course you really do
have a hardware problem…). This is usually
another way of saying that you accessed memory in a way
you shouldn't have.This dumping core business sounds as though it could
be quite useful, if I can make it happen when I want to.
Can I do this, or do I have to wait until there's an
error?Yes, just go to another console or xterm, do&prompt.user; psto find out the process ID of your program, and
do&prompt.user; kill -ABRT pidwhere
pid is
the process ID you looked up.This is useful if your program has got stuck in an
infinite loop, for instance. If your program happens to
trap SIGABRT, there are several other
signals which have a similar effect.MakeWhat is make?When you're working on a simple program with only one or
two source files, typing in&prompt.user; cc file1.c file2.cis not too bad, but it quickly becomes very tedious when
there are several files—and it can take a while to
compile, too.One way to get around this is to use object files and only
recompile the source file if the source code has changed. So
we could have something like:&prompt.user; cc file1.o file2.o … file37.c &hellip
if we'd changed file37.c, but not any
of the others, since the last time we compiled. This may
speed up the compilation quite a bit, but doesn't solve the
typing problem.Or we could write a shell script to solve the typing
problem, but it would have to re-compile everything, making it
very inefficient on a large project.What happens if we have hundreds of source files lying
about? What if we're working in a team with other people who
forget to tell us when they've changed one of their source
files that we use?Perhaps we could put the two solutions together and write
something like a shell script that would contain some kind of
magic rule saying when a source file needs compiling. Now all
we need now is a program that can understand these rules, as
it's a bit too complicated for the shell.This program is called make. It reads
in a file, called a makefile, that
tells it how different files depend on each other, and works
out which files need to be re-compiled and which ones don't.
For example, a rule could say something like if
fromboz.o is older than
fromboz.c, that means someone must have
changed fromboz.c, so it needs to be
re-compiled. The makefile also has rules telling
make how to re-compile the source file,
making it a much more powerful tool.Makefiles are typically kept in the same directory as the
source they apply to, and can be called
makefile, Makefile
or MAKEFILE. Most programmers use the
name Makefile, as this puts it near the
top of a directory listing, where it can easily be
seen.
They don't use the MAKEFILE form
as block capitals are often used for documentation files
like README.Example of using makeHere's a very simple make file:foo: foo.c
cc -o foo foo.c
It consists of two lines, a dependency line and a creation
line.The dependency line here consists of the name of the
program (known as the target), followed
by a colon, then whitespace, then the name of the source file.
When make reads this line, it looks to see
if foo exists; if it exists, it compares
the time foo was last modified to the
time foo.c was last modified. If
foo does not exist, or is older than
foo.c, it then looks at the creation line
to find out what to do. In other words, this is the rule for
working out when foo.c needs to be
re-compiled.The creation line starts with a tab (press
the tab key) and then the command you would
type to create foo if you were doing it
at a command prompt. If foo is out of
date, or does not exist, make then executes
this command to create it. In other words, this is the rule
which tells make how to re-compile
foo.c.So, when you type make, it will
make sure that foo is up to date with
respect to your latest changes to foo.c.
This principle can be extended to
Makefiles with hundreds of
targets—in fact, on FreeBSD, it is possible to compile
the entire operating system just by typing make
world in the appropriate directory!Another useful property of makefiles is that the targets
don't have to be programs. For instance, we could have a make
file that looks like this:foo: foo.c
cc -o foo foo.c
install:
cp foo /home/me
We can tell make which target we want to make by
typing:&prompt.user; make targetmake will then only look at that target
and ignore any others. For example, if we type
make foo with the makefile above, make
will ignore the install target.If we just type make on its own,
make will always look at the first target and then stop
without looking at any others. So if we typed
make here, it will just go to the
foo target, re-compile
foo if necessary, and then stop without
going on to the install target.Notice that the install target doesn't
actually depend on anything! This means that the command on
the following line is always executed when we try to make that
target by typing make install. In this
case, it will copy foo into the user's
home directory. This is often used by application makefiles,
so that the application can be installed in the correct
directory when it has been correctly compiled.This is a slightly confusing subject to try and explain.
If you don't quite understand how make
works, the best thing to do is to write a simple program like
hello world and a make file like the one above
and experiment. Then progress to using more than one source
file, or having the source file include a header file. The
touch command is very useful here—it
changes the date on a file without you having to edit
it.FreeBSD MakefilesMakefiles can be rather complicated to write. Fortunately,
BSD-based systems like FreeBSD come with some very powerful
ones as part of the system. One very good example of this is
the FreeBSD ports system. Here's the essential part of a
typical ports Makefile:MASTER_SITES= ftp://freefall.cdrom.com/pub/FreeBSD/LOCAL_PORTS/
DISTFILES= scheme-microcode+dist-7.3-freebsd.tgz
.include <bsd.port.mk>
Now, if we go to the directory for this port and type
make, the following happens:A check is made to see if the source code for this
port is already on the system.If it isn't, an FTP connection to the URL in
MASTER_SITES is set up to download the
source.The checksum for the source is calculated and compared
it with one for a known, good, copy of the source. This
is to make sure that the source was not corrupted while in
transit.Any changes required to make the source work on
FreeBSD are applied—this is known as
patching.Any special configuration needed for the source is
done. (Many Unix program distributions try to work out
which version of Unix they are being compiled on and which
optional Unix features are present—this is where
they are given the information in the FreeBSD ports
scenario).The source code for the program is compiled. In
effect, we change to the directory where the source was
unpacked and do make—the
program's own make file has the necessary information to
build the program.We now have a compiled version of the program. If we
wish, we can test it now; when we feel confident about the
program, we can type make install.
This will cause the program and any supporting files it
needs to be copied into the correct location; an entry is
also made into a package database, so
that the port can easily be uninstalled later if we change
our mind about it.Now I think you'll agree that's rather impressive for a
four line script!The secret lies in the last line, which tells
make to look in the system makefile called
bsd.port.mk. It's easy to overlook this
line, but this is where all the clever stuff comes
from—someone has written a makefile that tells
make to do all the things above (plus a
couple of other things I didn't mention, including handling
any errors that may occur) and anyone can get access to that
just by putting a single line in their own make file!If you want to have a look at these system makefiles,
they're in /usr/share/mk, but it's
probably best to wait until you've had a bit of practice with
makefiles, as they are very complicated (and if you do look at
them, make sure you have a flask of strong coffee
handy!)More advanced uses of makeMake is a very powerful tool, and can
do much more than the simple example above shows.
Unfortunately, there are several different versions of
make, and they all differ considerably.
The best way to learn what they can do is probably to read the
documentation—hopefully this introduction will have
given you a base from which you can do this.The version of make that comes with FreeBSD is the
Berkeley make; there is a tutorial
for it in /usr/share/doc/psd/12.make. To
view it, do&prompt.user; zmore paper.ascii.gzin that directory.Many applications in the ports use GNU
make, which has a very good set of
info pages. If you have installed any of these
ports, GNU make will automatically
have been installed as gmake. It's also
available as a port and package in its own right.To view the info pages for GNU
make, you will have to edit the
dir file in the
/usr/local/info directory to add an entry
for it. This involves adding a line like * Make: (make). The GNU Make utility.
to the file. Once you have done this, you can type
info and then select
make from the menu (or in
Emacs, do C-h
i).DebuggingThe DebuggerThe debugger that comes with FreeBSD is called
gdb (GNU
debugger). You start it up by typing&prompt.user; gdb prognamealthough most people prefer to run it inside
Emacs. You can do this by:M-x gdb RET progname RETUsing a debugger allows you to run the program under more
controlled circumstances. Typically, you can step through the
program a line at a time, inspect the value of variables,
change them, tell the debugger to run up to a certain point
and then stop, and so on. You can even attach to a program
that's already running, or load a core file to investigate why
the program crashed. It's even possible to debug the kernel,
though that's a little trickier than the user applications
we'll be discussing in this section.gdb has quite good on-line help, as
well as a set of info pages, so this section will concentrate
on a few of the basic commands.Finally, if you find its text-based command-prompt style
off-putting, there's a graphical front-end for it xxgdb in the ports
collection.This section is intended to be an introduction to using
gdb and does not cover specialised topics
such as debugging the kernel.Running a program in the debuggerYou'll need to have compiled the program with the
-g
option to get the most out of using
gdb. It will work without, but you'll only
see the name of the function you're in, instead of the source
code. If you see a line like:… (no debugging symbols found) …
when gdb starts up, you'll know that
the program wasn't compiled with the
-g
option.At the gdb prompt, type
break main. This will tell the
debugger to skip over the preliminary set-up code in the
program and start at the beginning of your code. Now type
run to start the program—it will
start at the beginning of the set-up code and then get stopped
by the debugger when it calls main().
(If you've ever wondered where main()
gets called from, now you know!).You can now step through the program, a line at a time, by
pressing n. If you get to a function call,
you can step into it by pressing s. Once
you're in a function call, you can return from stepping into a
function call by pressing f. You can also
use up and down to take
a quick look at the caller.Here's a simple example of how to spot a mistake in a
program with gdb. This is our program
(with a deliberate mistake):#include <stdio.h>
int bazz(int anint);
main() {
int i;
printf("This is my program\n");
bazz(i);
return 0;
}
int bazz(int anint) {
printf("You gave me %d\n", anint);
return anint;
}
This program sets i to be
5 and passes it to a function
bazz() which prints out the number we
gave it.When we compile and run the program we get&prompt.user; cc -g -o temp temp.c
&prompt.user; ./temp
This is my program
anint = 4231
That wasn't what we expected! Time to see what's going
on!&prompt.user; gdb temp
GDB is free software and you are welcome to distribute copies of it
under certain conditions; type "show copying" to see the conditions.
There is absolutely no warranty for GDB; type "show warranty" for details.
GDB 4.13 (i386-unknown-freebsd), Copyright 1994 Free Software Foundation, Inc.
(gdb) break main> Skip the set-up code>
Breakpoint 1 at 0x160f: file temp.c, line 9. gdb puts breakpoint at main()>>
(gdb) run> Run as far as main()>>
Starting program: /home/james/tmp/temp Program starts running>
Breakpoint 1, main () at temp.c:9 gdb stops at main()>>
(gdb) n> Go to next line>
This is my program Program prints out>
(gdb) s> step into bazz()>>
bazz (anint=4231) at temp.c:17 gdb displays stack frame>
(gdb)
Hang on a minute! How did anint get to be
4231? Didn't we set it to be
5 in main()? Let's
move up to main() and have a look.(gdb) up> Move up call stack>
#1 0x1625 in main () at temp.c:11 gdb displays stack frame>
(gdb) p i> Show us the value of i>>
$1 = 4231 gdb displays 4231>>
Oh dear! Looking at the code, we forgot to initialise
i. We meant to put…>
main() {
int i;
i = 5;
printf("This is my program\n");
&hellip>
but we left the i=5; line out. As we
didn't initialise i, it had whatever number
happened to be in that area of memory when the program ran,
which in this case happened to be
4231.gdb displays the stack frame every
time we go into or out of a function, even if we're using
up and down to move
around the call stack. This shows the name of the function
and the values of its arguments, which helps us keep track
of where we are and what's going on. (The stack is a
storage area where the program stores information about the
arguments passed to functions and where to go when it
returns from a function call).Examining a core fileA core file is basically a file which contains the
complete state of the process when it crashed. In the
good old days, programmers had to print out hex
listings of core files and sweat over machine code manuals,
but now life is a bit easier. Incidentally, under FreeBSD and
other 4.4BSD systems, a core file is called
- progname>.core> instead of just
+ progname.core instead of just
core, to make it clearer which program a
core file belongs to.To examine a core file, start up gdb in
the usual way. Instead of typing break or
run, type(gdb) core progname.coreIf you're not in the same directory as the core file,
you'll have to do dir
/path/to/core/file first.You should see something like this:&prompt.user; gdb a.out
GDB is free software and you are welcome to distribute copies of it
under certain conditions; type "show copying" to see the conditions.
There is absolutely no warranty for GDB; type "show warranty" for details.
GDB 4.13 (i386-unknown-freebsd), Copyright 1994 Free Software Foundation, Inc.
(gdb) core a.out.core
Core was generated by `a.out'.
Program terminated with signal 11, Segmentation fault.
Cannot access memory at address 0x7020796d.
#0 0x164a in bazz (anint=0x5) at temp.c:17
(gdb)
In this case, the program was called
a.out, so the core file is called
a.out.core. We can see that the program
crashed due to trying to access an area in memory that was not
available to it in a function called
bazz.Sometimes it's useful to be able to see how a function was
called, as the problem could have occurred a long way up the
call stack in a complex program. The bt
command causes gdb to print out a
back-trace of the call stack:(gdb) bt
#0 0x164a in bazz (anint=0x5) at temp.c:17
#1 0xefbfd888 in end ()
#2 0x162c in main () at temp.c:11
(gdb)
The end() function is called when a
program crashes; in this case, the bazz()
function was called from main().Attaching to a running programOne of the neatest features about gdb
is that it can attach to a program that's already running. Of
course, that assumes you have sufficient permissions to do so.
A common problem is when you are stepping through a program
that forks, and you want to trace the child, but the debugger
will only let you trace the parent.What you do is start up another gdb,
use ps to find the process ID for the
child, and do(gdb) attach pidin gdb, and then debug as usual.That's all very well, you're probably
thinking, but by the time I've done that, the child
process will be over the hill and far away. Fear
not, gentle reader, here's how to do it (courtesy of the
gdb info pages):&hellip
if ((pid = fork()) < 0) /* _Always_ check this */
error();
else if (pid == 0) { /* child */
int PauseMode = 1;
while (PauseMode)
sleep(10); /* Wait until someone attaches to us */
&hellip
} else { /* parent */
&hellipNow all you have to do is attach to the child, set
PauseMode to 0, and wait
for the sleep() call to return!Using Emacs as a Development EnvironmentEmacsUnfortunately, Unix systems don't come with the kind of
everything-you-ever-wanted-and-lots-more-you-didn't-in-one-gigantic-package
integrated development environments that other systems
have.
At least, not unless you pay out very large sums of
money.
However, it is possible to set up your own environment. It
may not be as pretty, and it may not be quite as integrated,
but you can set it up the way you want it. And it's free.
And you have the source to it.The key to it all is Emacs. Now there are some people who
loathe it, but many who love it. If you're one of the former,
I'm afraid this section will hold little of interest to you.
Also, you'll need a fair amount of memory to run it—I'd
recommend 8MB in text mode and 16MB in X as the bare minimum
to get reasonable performance.Emacs is basically a highly customisable
editor—indeed, it has been customised to the point where
it's more like an operating system than an editor! Many
developers and sysadmins do in fact spend practically all
their time working inside Emacs, leaving it only to log
out.It's impossible even to summarise everything Emacs can do
here, but here are some of the features of interest to
developers:Very powerful editor, allowing search-and-replace on
both strings and regular expressions (patterns), jumping
to start/end of block expression, etc, etc.Pull-down menus and online help.Language-dependent syntax highlighting and
indentation.Completely customisable.You can compile and debug programs within
Emacs.On a compilation error, you can jump to the offending
line of source code.Friendly-ish front-end to the info
program used for reading GNU hypertext documentation,
including the documentation on Emacs itself.Friendly front-end to gdb, allowing
you to look at the source code as you step through your
program.You can read Usenet news and mail while your program
is compiling.And doubtless many more that I've overlooked.Emacs can be installed on FreeBSD using the Emacs
port.Once it's installed, start it up and do C-h
t to read an Emacs tutorial—that means
hold down the control key, press
h, let go of the control
key, and then press t. (Alternatively, you
can you use the mouse to select Emacs
Tutorial from the Help
menu).Although Emacs does have menus, it's well worth learning
the key bindings, as it's much quicker when you're editing
something to press a couple of keys than to try and find the
mouse and then click on the right place. And, when you're
talking to seasoned Emacs users, you'll find they often
casually throw around expressions like M-x
replace-s RET foo RET bar RET so it's
useful to know what they mean. And in any case, Emacs has far
too many useful functions for them to all fit on the menu
bars.Fortunately, it's quite easy to pick up the key-bindings,
as they're displayed next to the menu item. My advice is to
use the menu item for, say, opening a file until you
understand how it works and feel confident with it, then try
doing C-x C-f. When you're happy with that, move on to
another menu command.If you can't remember what a particular combination of
keys does, select Describe Key from
the Help menu and type it in—Emacs
will tell you what it does. You can also use the
Command Apropos menu item to find
out all the commands which contain a particular word in them,
with the key binding next to it.By the way, the expression above means hold down the
Meta key, press x, release
the Meta key, type
replace-s (short for
replace-string—another feature of
Emacs is that you can abbreviate commands), press the
return key, type foo
(the string you want replaced), press the
return key, type bar (the string you want to
replace foo with) and press
return again. Emacs will then do the
search-and-replace operation you've just requested.If you're wondering what on earth the
Meta key is, it's a special key that many
Unix workstations have. Unfortunately, PC's don't have one,
so it's usually the alt key (or if you're
unlucky, the escape key).Oh, and to get out of Emacs, do C-x C-c
(that means hold down the control key, press
x, press c and release the
control key). If you have any unsaved files
open, Emacs will ask you if you want to save them. (Ignore
the bit in the documentation where it says
C-z is the usual way to leave
Emacs—that leaves Emacs hanging around in the
background, and is only really useful if you're on a system
which doesn't have virtual terminals).Configuring EmacsEmacs does many wonderful things; some of them are built
in, some of them need to be configured.Instead of using a proprietary macro language for
configuration, Emacs uses a version of Lisp specially adapted
for editors, known as Emacs Lisp. This can be quite useful if
you want to go on and learn something like Common Lisp, as
it's considerably smaller than Common Lisp (although still
quite big!).The best way to learn Emacs Lisp is to download the Emacs
TutorialHowever, there's no need to actually know any Lisp to get
started with configuring Emacs, as I've included a sample
.emacs file, which should be enough to
get you started. Just copy it into your home directory and
restart Emacs if it's already running; it will read the
commands from the file and (hopefully) give you a useful basic
setup.A sample .emacs fileUnfortunately, there's far too much here to explain it in
detail; however there are one or two points worth
mentioning.
- Everything beginning with a ;> is a comment
+ Everything beginning with a ; is a comment
and is ignored by Emacs.In the first line, the
-*- Emacs-Lisp -*- is so that
we can edit the .emacs file itself
within Emacs and get all the fancy features for editing
Emacs Lisp. Emacs usually tries to guess this based on
the filename, and may not get it right for
.emacs.The tab key is bound to an
indentation function in some modes, so when you press the
tab key, it will indent the current line of code. If you
want to put a tab character in whatever
you're writing, hold the control key down
while you're pressing the tab key.This file supports syntax highlighting for C, C++,
Perl, Lisp and Scheme, by guessing the language from the
filename.Emacs already has a pre-defined function called
next-error. In a compilation output
window, this allows you to move from one compilation error
to the next by doing M-n; we define a
complementary function,
previous-error, that allows you to go
to a previous error by doing M-p. The
nicest feature of all is that C-c C-c
will open up the source file in which the error occurred
and jump to the appropriate line.We enable Emacs's ability to act as a server, so that
if you're doing something outside Emacs and you want to
edit a file, you can just type in&prompt.user; emacsclient filenameand then you can edit the file in your
Emacs!
Many Emacs users set their EDITOR environment to
emacsclient so this happens every
time they need to edit a file.A sample .emacs file;; -*-Emacs-Lisp-*-
;; This file is designed to be re-evaled; use the variable first-time
;; to avoid any problems with this.
(defvar first-time t
"Flag signifying this is the first time that .emacs has been evaled")
;; Meta
(global-set-key "\M- " 'set-mark-command)
(global-set-key "\M-\C-h" 'backward-kill-word)
(global-set-key "\M-\C-r" 'query-replace)
(global-set-key "\M-r" 'replace-string)
(global-set-key "\M-g" 'goto-line)
(global-set-key "\M-h" 'help-command)
;; Function keys
(global-set-key [f1] 'manual-entry)
(global-set-key [f2] 'info)
(global-set-key [f3] 'repeat-complex-command)
(global-set-key [f4] 'advertised-undo)
(global-set-key [f5] 'eval-current-buffer)
(global-set-key [f6] 'buffer-menu)
(global-set-key [f7] 'other-window)
(global-set-key [f8] 'find-file)
(global-set-key [f9] 'save-buffer)
(global-set-key [f10] 'next-error)
(global-set-key [f11] 'compile)
(global-set-key [f12] 'grep)
(global-set-key [C-f1] 'compile)
(global-set-key [C-f2] 'grep)
(global-set-key [C-f3] 'next-error)
(global-set-key [C-f4] 'previous-error)
(global-set-key [C-f5] 'display-faces)
(global-set-key [C-f8] 'dired)
(global-set-key [C-f10] 'kill-compilation)
;; Keypad bindings
(global-set-key [up] "\C-p")
(global-set-key [down] "\C-n")
(global-set-key [left] "\C-b")
(global-set-key [right] "\C-f")
(global-set-key [home] "\C-a")
(global-set-key [end] "\C-e")
(global-set-key [prior] "\M-v")
(global-set-key [next] "\C-v")
(global-set-key [C-up] "\M-\C-b")
(global-set-key [C-down] "\M-\C-f")
(global-set-key [C-left] "\M-b")
(global-set-key [C-right] "\M-f")
(global-set-key [C-home] "\M-<")
(global-set-key [C-end] "\M->")
(global-set-key [C-prior] "\M-<")
(global-set-key [C-next] "\M->")
;; Mouse
(global-set-key [mouse-3] 'imenu)
;; Misc
(global-set-key [C-tab] "\C-q\t") ; Control tab quotes a tab.
(setq backup-by-copying-when-mismatch t)
;; Treat 'y' or <CR> as yes, 'n' as no.
(fset 'yes-or-no-p 'y-or-n-p)
(define-key query-replace-map [return] 'act)
(define-key query-replace-map [?\C-m] 'act)
;; Load packages
(require 'desktop)
(require 'tar-mode)
;; Pretty diff mode
(autoload 'ediff-buffers "ediff" "Intelligent Emacs interface to diff" t)
(autoload 'ediff-files "ediff" "Intelligent Emacs interface to diff" t)
(autoload 'ediff-files-remote "ediff"
"Intelligent Emacs interface to diff")
(if first-time
(setq auto-mode-alist
(append '(("\\.cpp$" . c++-mode)
("\\.hpp$" . c++-mode)
("\\.lsp$" . lisp-mode)
("\\.scm$" . scheme-mode)
("\\.pl$" . perl-mode)
) auto-mode-alist)))
;; Auto font lock mode
(defvar font-lock-auto-mode-list
(list 'c-mode 'c++-mode 'c++-c-mode 'emacs-lisp-mode 'lisp-mode 'perl-mode 'scheme-mode)
"List of modes to always start in font-lock-mode")
(defvar font-lock-mode-keyword-alist
'((c++-c-mode . c-font-lock-keywords)
(perl-mode . perl-font-lock-keywords))
"Associations between modes and keywords")
(defun font-lock-auto-mode-select ()
"Automatically select font-lock-mode if the current major mode is
in font-lock-auto-mode-list"
(if (memq major-mode font-lock-auto-mode-list)
(progn
(font-lock-mode t))
)
)
(global-set-key [M-f1] 'font-lock-fontify-buffer)
;; New dabbrev stuff
;(require 'new-dabbrev)
(setq dabbrev-always-check-other-buffers t)
(setq dabbrev-abbrev-char-regexp "\\sw\\|\\s_")
(add-hook 'emacs-lisp-mode-hook
'(lambda ()
(set (make-local-variable 'dabbrev-case-fold-search) nil)
(set (make-local-variable 'dabbrev-case-replace) nil)))
(add-hook 'c-mode-hook
'(lambda ()
(set (make-local-variable 'dabbrev-case-fold-search) nil)
(set (make-local-variable 'dabbrev-case-replace) nil)))
(add-hook 'text-mode-hook
'(lambda ()
(set (make-local-variable 'dabbrev-case-fold-search) t)
(set (make-local-variable 'dabbrev-case-replace) t)))
;; C++ and C mode...
(defun my-c++-mode-hook ()
(setq tab-width 4)
(define-key c++-mode-map "\C-m" 'reindent-then-newline-and-indent)
(define-key c++-mode-map "\C-ce" 'c-comment-edit)
(setq c++-auto-hungry-initial-state 'none)
(setq c++-delete-function 'backward-delete-char)
(setq c++-tab-always-indent t)
(setq c-indent-level 4)
(setq c-continued-statement-offset 4)
(setq c++-empty-arglist-indent 4))
(defun my-c-mode-hook ()
(setq tab-width 4)
(define-key c-mode-map "\C-m" 'reindent-then-newline-and-indent)
(define-key c-mode-map "\C-ce" 'c-comment-edit)
(setq c-auto-hungry-initial-state 'none)
(setq c-delete-function 'backward-delete-char)
(setq c-tab-always-indent t)
;; BSD-ish indentation style
(setq c-indent-level 4)
(setq c-continued-statement-offset 4)
(setq c-brace-offset -4)
(setq c-argdecl-indent 0)
(setq c-label-offset -4))
;; Perl mode
(defun my-perl-mode-hook ()
(setq tab-width 4)
(define-key c++-mode-map "\C-m" 'reindent-then-newline-and-indent)
(setq perl-indent-level 4)
(setq perl-continued-statement-offset 4))
;; Scheme mode...
(defun my-scheme-mode-hook ()
(define-key scheme-mode-map "\C-m" 'reindent-then-newline-and-indent))
;; Emacs-Lisp mode...
(defun my-lisp-mode-hook ()
(define-key lisp-mode-map "\C-m" 'reindent-then-newline-and-indent)
(define-key lisp-mode-map "\C-i" 'lisp-indent-line)
(define-key lisp-mode-map "\C-j" 'eval-print-last-sexp))
;; Add all of the hooks...
(add-hook 'c++-mode-hook 'my-c++-mode-hook)
(add-hook 'c-mode-hook 'my-c-mode-hook)
(add-hook 'scheme-mode-hook 'my-scheme-mode-hook)
(add-hook 'emacs-lisp-mode-hook 'my-lisp-mode-hook)
(add-hook 'lisp-mode-hook 'my-lisp-mode-hook)
(add-hook 'perl-mode-hook 'my-perl-mode-hook)
;; Complement to next-error
(defun previous-error (n)
"Visit previous compilation error message and corresponding source code."
(interactive "p")
(next-error (- n)))
;; Misc...
(transient-mark-mode 1)
(setq mark-even-if-inactive t)
(setq visible-bell nil)
(setq next-line-add-newlines nil)
(setq compile-command "make")
(setq suggest-key-bindings nil)
(put 'eval-expression 'disabled nil)
(put 'narrow-to-region 'disabled nil)
(put 'set-goal-column 'disabled nil)
;; Elisp archive searching
(autoload 'format-lisp-code-directory "lispdir" nil t)
(autoload 'lisp-dir-apropos "lispdir" nil t)
(autoload 'lisp-dir-retrieve "lispdir" nil t)
(autoload 'lisp-dir-verify "lispdir" nil t)
;; Font lock mode
(defun my-make-face (face colour &optional bold)
"Create a face from a colour and optionally make it bold"
(make-face face)
(copy-face 'default face)
(set-face-foreground face colour)
(if bold (make-face-bold face))
)
(if (eq window-system 'x)
(progn
(my-make-face 'blue "blue")
(my-make-face 'red "red")
(my-make-face 'green "dark green")
(setq font-lock-comment-face 'blue)
(setq font-lock-string-face 'bold)
(setq font-lock-type-face 'bold)
(setq font-lock-keyword-face 'bold)
(setq font-lock-function-name-face 'red)
(setq font-lock-doc-string-face 'green)
(add-hook 'find-file-hooks 'font-lock-auto-mode-select)
(setq baud-rate 1000000)
(global-set-key "\C-cmm" 'menu-bar-mode)
(global-set-key "\C-cms" 'scroll-bar-mode)
(global-set-key [backspace] 'backward-delete-char)
; (global-set-key [delete] 'delete-char)
(standard-display-european t)
(load-library "iso-transl")))
;; X11 or PC using direct screen writes
(if window-system
(progn
;; (global-set-key [M-f1] 'hilit-repaint-command)
;; (global-set-key [M-f2] [?\C-u M-f1])
(setq hilit-mode-enable-list
'(not text-mode c-mode c++-mode emacs-lisp-mode lisp-mode
scheme-mode)
hilit-auto-highlight nil
hilit-auto-rehighlight 'visible
hilit-inhibit-hooks nil
hilit-inhibit-rebinding t)
(require 'hilit19)
(require 'paren))
(setq baud-rate 2400) ; For slow serial connections
)
;; TTY type terminal
(if (and (not window-system)
(not (equal system-type 'ms-dos)))
(progn
(if first-time
(progn
(keyboard-translate ?\C-h ?\C-?)
(keyboard-translate ?\C-? ?\C-h)))))
;; Under UNIX
(if (not (equal system-type 'ms-dos))
(progn
(if first-time
(server-start))))
;; Add any face changes here
(add-hook 'term-setup-hook 'my-term-setup-hook)
(defun my-term-setup-hook ()
(if (eq window-system 'pc)
(progn
;; (set-face-background 'default "red")
)))
;; Restore the "desktop" - do this as late as possible
(if first-time
(progn
(desktop-load-default)
(desktop-read)))
;; Indicate that this file has been read at least once
(setq first-time nil)
;; No need to debug anything now
(setq debug-on-error nil)
;; All done
(message "All done, %s%s" (user-login-name) ".")
Extending the Range of Languages Emacs UnderstandsNow, this is all very well if you only want to program in
the languages already catered for in the
.emacs file (C, C++, Perl, Lisp and
Scheme), but what happens if a new language called
whizbang comes out, full of exciting
features?The first thing to do is find out if whizbang comes with
any files that tell Emacs about the language. These usually
end in .el, short for Emacs
Lisp. For example, if whizbang is a FreeBSD port, we
can locate these files by doing&prompt.user; find /usr/ports/lang/whizbang -name "*.el" -printand install them by copying them into the Emacs site Lisp
directory. On FreeBSD 2.1.0-RELEASE, this is
/usr/local/share/emacs/site-lisp.So for example, if the output from the find command
was/usr/ports/lang/whizbang/work/misc/whizbang.el
we would do&prompt.root; cp /usr/ports/lang/whizbang/work/misc/whizbang.el /usr/local/share/emacs/site-lispNext, we need to decide what extension whizbang source
files have. Let's say for the sake of argument that they all
end in .wiz. We need to add an entry to
our .emacs file to make sure Emacs will
be able to use the information in
whizbang.el.Find the auto-mode-alist entry in
.emacs and add a line for whizbang, such
as:…>
("\\.lsp$" . lisp-mode)
("\\.wiz$" . whizbang-mode)
("\\.scm$" . scheme-mode)
…>
This means that Emacs will automatically go into
whizbang-mode when you edit a file ending
in .wiz.Just below this, you'll find the
font-lock-auto-mode-list entry. Add
whizbang-mode to it like so:;; Auto font lock mode
(defvar font-lock-auto-mode-list
(list 'c-mode 'c++-mode 'c++-c-mode 'emacs-lisp-mode 'whizbang-mode 'lisp-mode 'perl-mode 'scheme-mode)
"List of modes to always start in font-lock-mode")
This means that Emacs will always enable
font-lock-mode (ie syntax highlighting)
when editing a .wiz file.And that's all that's needed. If there's anything else
you want done automatically when you open up a
.wiz file, you can add a
whizbang-mode hook (see
my-scheme-mode-hook for a simple example
that adds auto-indent).Further ReadingBrian Harvey and Matthew Wright
Simply Scheme
MIT 1994.
ISBN 0-262-08226-8Randall Schwartz
Learning Perl
O'Reilly 1993
ISBN 1-56592-042-2Patrick Henry Winston and Berthold Klaus Paul Horn
Lisp (3rd Edition)
Addison-Wesley 1989
ISBN 0-201-08319-1Brian W. Kernighan and Rob Pike
The Unix Programming Environment
Prentice-Hall 1984
ISBN 0-13-937681-XBrian W. Kernighan and Dennis M. Ritchie
The C Programming Language (2nd Edition)
Prentice-Hall 1988
ISBN 0-13-110362-8Bjarne Stroustrup
The C++ Programming Language
Addison-Wesley 1991
ISBN 0-201-53992-6W. Richard Stevens
Advanced Programming in the Unix Environment
Addison-Wesley 1992
ISBN 0-201-56317-7W. Richard Stevens
Unix Network Programming
Prentice-Hall 1990
ISBN 0-13-949876-1