荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: jdli (无敌), 信区: Linux
标 题: Proxy Server的源码
发信站: BBS 荔园晨风站 (Fri Dec 10 13:27:20 1999), 转信
【 以下文字转载自 jdli 的信箱 】
【 原文由 zzt.bbs@bbs.zd.dhs.org 所发表 】
作者: fuse@bbs.zd.dhs.org (fuse)
标题: 来自 fuse@bbs.zd.dhs.org (fuse)
时间: Fri May 21 00:17:52 1999
``Making the world'' your own
By Nik Clayton
Email: Nik.Clayton@nothing-going-on.demon.co.uk
$Id: make-world.sgml,v 1.40 1998/12/13 11:35:19 nik Exp $
Contents
1 Check /etc/make.conf
2 Update /etc/group
3 Drop to single user mode
4 Remove /usr/obj
5 Recompile the source and install the new system
5.1 All versions
5.2 Saving the output
5.3 Version 2.2.2 and below
5.4 Version 2.2.5 and above
5.5 -current and above
5.6 Timings
6 Update /etc
7 Update /dev
8 Update /stand
9 Compile and install a new kernel
10 Rebooting
11 Finished
12 Questions?
12.1 Do I need to re-make the world for every change?
12.2 My compile failed with lots of signal 12 (or other
signal number) errors
12.3 Can I remove /usr/obj when I have finished?
12.4 Can interrupted builds be resumed?
12.5 Can I use one machine as a master to upgrade lots
of machines (NFS)?
12.5.1 Version 2.1.7 and below
12.5.2 Version 2.2.0 and above
12.5.3 Version 2.2.5 and above
12.6 How can I speed up making the world?
13 Translations
13.1 Japanese
14 Contributors
This document assumes that you have downloaded a version of the
FreeBSD source code and placed it in /usr/src. This might be the
latest version from the -current development branch, or perhaps you
are just tracking -stable. You might have downloaded the most recent
snapshot, or you are keeping track with a mechanism such as CVSup or
CTM.
Either way, you have the source code and now need to update your
system.
There are a number of steps to perform to do this, and a few pitfalls
to avoid along the way. This document takes you through those
necessary steps one by one.
This tutorial has been translated into other languages.
Take a backup:
I cannot stress highly enough how important it is to take a backup of
your system before you do this. While remaking the world is (as long
as you follow these instructions) an easy task to do, there will
inevitably be times when you make mistakes, or when mistakes made by
others in the source tree render your system unbootable.
Make sure you have taken a backup. And have a fixit floppy to hand. I
have never needed to use them, and, touch wood, I never will, but it
is always better to be safe than sorry.
Subscribe to the right mailing list:
The -stable and -current FreeBSD code branches are, by their nature,
in development. People that contribute to FreeBSD are human, and
mistakes occasionally happen.
Sometimes these mistakes can be quite harmless, just causing your
system to print a new diagnostic warning. Or the change may be
catastrophic, and render your system unbootable or destroy your
filesystems (or worse).
If problems like these occur, a ``heads up'' is posted to the
appropriate mailing list, explaining the nature of the problem and
which systems it affects. And an ``all clear'' announcement is posted
when the problem has been solved.
If you try and track -stable or -current and do not read
FreeBSD-stable@FreeBSD.ORG or FreeBSD-current@FreeBSD.ORG then you
are asking for trouble.
IMPORTANT:
Please do not ask me questions that should be sent to the -questions,
-current, or -stable mailing lists. I don't have the time or the test
environment to diagnose individual problems, and I probably don't know
the answer. The members of those mailing lists are, by and large,
experienced and helpful, so post your questions there. However,
comments, answers, and corrections should be sent to me. If you do get
in touch with me about this tutorial, please quote the version number
at the head of the page so I know which copy you are referring to.
This tutorial is a community effort. Many people have helped
contribute to it, and they are acknowledged at the end.
Copyright (c) 1997, 1998 Nik Clayton, All rights reserved.
Redistribution and use in source (SGML DocBook) and 'compiled' forms
(SGML HTML, PDF, PostScript, RTF and so forth) with or without
modification, are permitted provided that the following condition is
met:
* Redistributions must retain the above copyright notice, this list
of conditions and the following disclaimer before the main body of
the tutorial.
THIS TUTORIAL IS PROVIDED BY NIK CLAYTON "AS IS" AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL NIK CLAYTON BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
IN ANY WAY OUT OF THE USE OF THIS TUTORIAL, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
1 Check /etc/make.conf
Examine the file /etc/make.conf. This contains some default defines
for make, which will be used when you rebuild the source. They are
also used every time you use make, so it is a good idea to make sure
they are set to something sensible for your system.
Everything is, by default, commented out. Uncomment those entries that
look useful. For a typical user (not a developer), you will probably
want to uncomment the CFLAGS and NOPROFILE definitions.
Version 2.1.7 and below:
If your machine has a floating point unit (386DX, 486DX, Pentium and
up class machines) then you can also uncomment the HAVE_FPU line.
This definition was removed for version 2.2.2 and up of FreeBSD.
Examine the other definitions (COPTFLAGS, NOPORTDOCS and so on) and
decide if they are relevant to you.
2 Update /etc/group
The /etc directory contains a large part of your system's
configuration information, as well as scripts that are run at system
startup. Some of these scripts change from version to version of
FreeBSD.
Some of the configuration files are also used in the day to day
running of the system. In particular, /etc/group.
There have been occasions when the installation part of ``make world''
has expected certain usernames or groups to exist. When performing an
upgrade it is likely that these groups did not exist. This caused
problems when upgrading.
The most recent example of this is when the ``ppp'' group (later
renamed ``network'') was added. Users had the installation process
fail for them when parts of the ppp subsystem were installed using a
non-existent (for them) group name.
The solution is to examine /usr/src/etc/group and compare its list of
groups with your own. If they are any groups in the new file that are
not in your file then copy them over. Similarly, you should rename any
groups in /etc/group which have the same GID but a different name to
those in /usr/src/etc/group.
TIP:
If you are feeling particularly paranoid, you can check your system to
see which files are owned by the group you are renaming or deleting. A
command such as
# find / -group GID -print
will show all files owned by group GID (which can be either a group
name or a numeric group ID).
3 Drop to single user mode
You may want to compile the system in single user mode. Apart from the
obvious benefit of making things go slightly faster, reinstalling the
system will touch a lot of important system files, all the standard
system binaries, libraries, include files and so on. Changing these on
a running system (particularly if you have active users on their at
the time) is asking for trouble.
That said, if you are confident, you can omit this step.
Version 2.2.5 and above:
As described in more detail below, versions 2.2.5 and above of FreeBSD
have separated the building process from the installing process. You
can therefore build the new system in multi user mode, and then drop
to single user mode to do the installation.
As the superuser, you can execute
# shutdown now
from a running system, which will drop it to single user mode.
Alternatively, reboot the system, and at the boot prompt, enter the -s
flag. The system will then boot single user. At the shell prompt you
should then run
# fsck -p
# mount -u /
# mount -a -t ufs
# swapon -a
which checks the filesystems, remounts / read/write, mounts all the
other UFS filesystems referenced in /etc/fstab and then turns swapping
on.
4 Remove /usr/obj
As parts of the system are rebuilt they are placed in directories
which (by default) go under /usr/obj. The directories shadow those
under /usr/src.
You can speed up the ``make world'' process, and possibly save
yourself some dependency headaches by removing this directory as well.
Some files below /usr/obj will have the immutable flag set (see
chflags(1) for more information) which must be removed first.
# cd /usr/obj
# chflags -R noschg *
# rm -rf *
5 Recompile the source and install the new system
5.1 All versions
You must be in the /usr/src directory, so
# cd /usr/src
(unless, of course, your source code is elsewhere, in which case
change to that directory instead).
To rebuild the world you use the make(1) command. This command reads
instructions from the Makefile which describes how the programs that
comprise FreeBSD should be rebuilt, the order they should be built in,
and so on.
The general format of the command line you will type is as follows;
# make -x -DVARIABLE target
In this example, -x is an option that you would pass to make(1). See
the manual page for an example of the options you can pass.
-DVARIABLE passes a variable to the Makefile. The behaviour of the
Makefile is controlled by these variables. These are the same
variables as are set in /etc/make.conf, and this provides another way
of setting them.
For example,
# make -DNOPROFILE=true target
is another way of specifying that profiled libaries should not be
built, and corresponds with the
NOPROFILE= true
# Avoid compiling profiled libraries
lines in /etc/make.conf.
target tells make(1) what you want to do. Each Makefile defines a
number of different ``targets'', and your choice of target determines
what happens.
Some targets are listed in the Makefile, but are not meant for you to
run. Instead, they are used by the build process to break out the
steps necessary to rebuild the system into a number of sub-steps.
Most of the time you won't need to pass any parameters to make(1), and
so your command like will look like
# make target
5.2 Saving the output
It's a good idea to save the output you get from running make(1) to
another file. If something goes wrong you will have a copy of the
error message, and a complete list of where the process had got to.
While this might not help you in diagnosing what has gone wrong, it
can help others if you post your problem to one of the FreeBSD mailing
lists.
The easiest way to do this is to use the script(1) command, with a
parameter that specifies the name of the file to save all output to.
You would do this immediately before remaking the world, and then type
exit when the process has finished.
# script /var/tmp/mw.out
Script started, output file is /var/tmp/mw.out
# make world
... compile, compile, compile ...
# exit
Script done, ...
If you do this, do not save the output in /tmp. This directory may be
cleared next time you reboot. A better place to store it is in
/var/tmp (as in the example above) or in root's home directory.
5.3 Version 2.2.2 and below
/usr/src/Makefile contains the ``world'' target, which will rebuild
the entire system and then install it.
Use it like so,
# make world
5.4 Version 2.2.5 and above
Beginning with version 2.2.5 of FreeBSD (actually, it was first
created on the -current branch, and then retrofitted to -stable midway
between 2.2.2 and 2.2.5) the ``world'' target has been split in two.
``buildworld'' and ``installworld''.
As the names imply, ``buildworld'' builds a complete new tree under
/usr/obj, and ``installworld'' installs this tree on the current
machine.
This is very useful for 2 reasons. First, it allows you to do the
building safe in the knowledge that no components of your running
system will be affected. The build is ``self hosted''. Because of
this, you can safely run ``buildworld'' on a machine running in
multi-user mode with no fear of ill-effects. I still recommend you run
the ``installworld'' part in single user mode though.
Secondly, it allows you to use NFS mounts to upgrade multiple machines
on your network. If you have three machines, A, B and C that you want
to upgrade, run make buildworld and make installworld on A. B and C
should then NFS mount /usr/src and /usr/obj from A, and you can then
run make installworld to install the results of the build on B and C.
The ``world'' target still exists, and you can use it exactly as shown
for version 2.2.2. make world runs make buildworld followed by make
installworld.
NOTE:
If you do the make buildworld and make installworld commands
separately, you must pass the same parameters to make(1) each time.
For example, if you run
# make -DNOPROFILE=true buildworld
you must install the results with
# make -DNOPROFILE=true installworld
otherwise it would try and install profiled libraries that had not
been built during the make buildworld phase.
5.5 -current and above
If you are tracking -current you can also pass the -j option to make.
This lets make spawn several simultaneous processes.
This is most useful on true multi-CPU machines. However, since much of
the compiling process is IO bound rather than CPU bound it is also
useful on single CPU machines.
On a typical single-CPU machine you would run
# make -j4 target
make(1) to have up to 4 processes running at any one time. Empirical
evidence posted to the mailing lists shows this generally gives the
best performance benefit.
If you have a multi-CPU machine and you are using an SMP configured
kernel try values between 6 and 10 and see how they speed things up.
Be aware that (at the time of writing) this is still experimental, and
commits to the source tree may occasionally break this feature. If the
world fails to compile using this parameter try again without it
before you report any problems.
5.6 Timings
Assuming everything goes well you have anywhere between an hour and a
half and a day or so to wait.
As a general rule of thumb, a 200MHz P6 with more than 32MB of RAM and
reasonable SCSI disks will complete make world in about an hour and a
half. A 32MB P133 will take 5 or 6 hours. Revise these figures down if
your machines are slower...
6 Update /etc
Remaking the world will not update certain directories (in particular,
/etc, /var and /usr) with new or changed configuration files. This is
something you have to do by hand, eyeball, and judicious use of the
diff command.
You cannot just copy over the files from /usr/src/etc to /etc and have
it work. Some of these files must be ``installed'' first. This is
because the /usr/src/etc directory is not a copy of what your /etc
directory should look like. In addition, there are files that should
be in /etc that are not in /usr/src/etc.
The simplest way to do this is to install the files into a new
directory, and then work through them looking for differences.
Backup your existing /etc:
Although, in theory, nothing is going to touch this directory
automatically, it is always better to be sure. So copy your existing
/etc directory somewhere safe. Something like
# cp -Rp /etc /etc.old
will do the trick (-R does a recursive copy, -p preserves times,
ownerships on files and suchlike).
You need to build a dummy set of directories to install the new /etc
and other files into. I generally choose to put this dummy directory
in /var/tmp/root, and there are a number of subdirectories required
under this as well. To do this, run
# mkdir /var/tmp/root
# cd /usr/src/etc
# make DESTDIR=/var/tmp/root distrib-dirs distribution
which will build the necessary directory structure and install the
files. A lot of the subdirectories that have been created under
/var/tmp/root are empty and should be deleted. The simplest way to do
this is to
# cd /var/tmp/root
# find -d . -type d | /usr/bin/perl -lne \
'opendir(D,$_);@f=readdir(D);rmdir if $#f == 1;closedir(D);'
which does a depth first search, examines each directory, and if the
number of files in that directory is 2 (``1'' is not a typo in the
script) i.e., ``.'' and ``..'' then it removes the directory.
/var/tmp/root now contains all the files that should be placed in
appropriate locations below /. You now have to go through each of
these files, determining how they differ with your existing files.
Note that some of the files that will have been installed in
/var/tmp/root have a leading ``.''. At the time of writing the only
files like this are shell startup files in /var/tmp/root/ and
/var/tmp/root/root/, although there may be others (depending on when
you are reading this. Make sure you use ls -a to catch them.
The simplest way to do this is to use the diff command to compare the
two files.
For example,
# diff /etc/shells /var/tmp/root/etc/shells
will show you the differences between your /etc/shells file and the
new /etc/shells file. Use these to decide whether to merge in changes
that you have made or whether to copy over your old file.
dircmp.pl is a small Perl script (Perl 4.036, which is installed by
default on FreeBSD versions 2.0 and above) which will compare the
files in two directories (/etc and /var/tmp/root/etc by default)
reporting which files do not exist and which files are different in
the two directories.
Name the new root directory (/var/tmp/root)with a timestamp, so you
can easily compare differences between versions:
Frequently remaking the world means that you have to update /etc
frequently as well, which can be a bit of a chore.
You can speed this process up by keeping a copy of the last set of
changed files that you merged into /etc. The following procedure gives
one idea of how to do this.
1. Make the world as normal. When you want to update /etc and the
other directories, give the target directory a name based on the
current date. If you were doing this on the 14th of February 1998
you could do the following.
# mkdir /var/tmp/root-980214
# cd /usr/src/etc
# make DESTDIR=/var/tmp/root-980214 \
distrib-dirs distribution
2. Merge in the changes from this directory as outlined above.
Do not remove the /var/tmp/root-980214 directory when you have
finished.
3. When you have downloaded the latest version of the source and
remade it, follow step 1. This will give you a new directory,
which might be called /var/tmp/root-980221 (if you wait a week
between doing updates).
4. You can now see the differences that have been made in the
intervening week by doing something like
# cd /var/tmp
# diff -r root-980214 root-980221
which shows the differences between all the files in the two
directories.
Typically, this will be a much smaller set of differences than
those between /var/tmp/root-980221/etc and /etc. Because the set
of differences is smaller, it is easier to migrate those changes
across into your /etc directory.
5. You can now remove the older of the two /var/tmp/root-*
directories,
# rm -rf /var/tmp/root-980214
6. Repeat this process every time you need to merge in changes to
/etc.
You can use the date(1) command to automate the generation of the
directory names. For example,
# mkdir /var/tmp/root-`date "+%y%m%d"`
will create a directory name based on the current year, month, and
day.
7 Update /dev
DEVFS:
If you are using DEVFS then this is probably unnecessary.
For safety's sake, this is a multistep process.
First, copy /var/tmp/root/dev/MAKEDEV to /dev.
# cp /var/tmp/root/dev/MAKEDEV /dev
Now, take a snapshot of your current /dev. This snapshot needs to
contain the permissions, ownerships, major and minor numbers of each
filename, but it should not contain the timestamps. The easiest way to
do this is to use awk to strip out some of the information.
# cd /dev
# ls -l | awk '{print $1, $2, $3, $4, $5, $6, $NF}' > /var/tmp/dev.out
Then, remake all the devices.
# sh MAKEDEV all
Write another snapshot of the directory, this time to
/var/tmp/dev2.out. Now look through these two files for any devices
that you missed creating. There should not be any, but it is better to
be safe than sorry.
# diff /var/tmp/dev.out /var/tmp/dev2.out
You are most likely to notice disk slice discrepancies which will
involve commands such as
# sh MAKEDEV sd0s1
to recreate the slice entries. Your precise circumstances may vary.
8 Update /stand
NOTE:
This step is included only for completeness, it can safely be omitted.
For completenesses sake you may want to update the files in /stand as
well. These files consist of hard links to the /stand/sysinstall
binary. This binary should be statically linked, so that it can work
when no other filesystems (and in particular /usr) have been mounted.
# cd /usr/src/release/sysinstall
# make all install
Source older than 2 April 1998:
If your source code is older than 2nd April 1998, or the Makefile
version is not 1.68 or higher (for FreeBSD current and 3.x systems) or
1.48.2.21 or higher (for 2.2.x systems) you will need to add the
NOSHARED=yes option, like so;
# make NOSHARED=yes all install
9 Compile and install a new kernel
To take full advantage of your new system you should recompile the
kernel. This is practically a necessity, as certain memory structures
may have changed, and programs like ps and top will fail to work until
the kernel and source code versions are the same.
Follow the handbook instructions for compiling a new kernel. If you
have previously built a custom kernel then carefully examine the LINT
config file to see if there are any new options which you should take
advantage of.
A previous version of this document suggested rebooting before
rebuilding the kernel. This is wrong because:
* Commands like ps, ifconfig and sysctl may fail. This could leave
your machine unable to connect to the network.
* Basic utilities like mount could fail, making it impossible to
mount /, /usr and so on. This is unlikely if you are tracking a
-stable candidate, but more likely if you are tracking -current
during a large merge.
* LKMs built as part of the ``world'' may crash an older kernel.
For these reasons, it is always best to rebuild and install a new
kernel before rebooting.
You should build your new kernel after you have completed make world
(or make installworld). If you do not want to do this (perhaps you
want to confirm that the kernel builds before updating your system)
you may have problems. These may be because your config command is out
of date with respect to your kernel sources.
In this case you could run
# /usr/obj/usr/src/usr.sbin/config/config KERNELNAME
to build your kernel with the new version of config. This may not work
in all cases. It is recommended that you complete make world (or make
installworld) before compiling a new kernel.
10 Rebooting
You are now done. After you have verified that everything appears to
be in the right place you can reboot the system. A simple fastboot(8)
should do it.
# fastboot
11 Finished
You should now have successfully upgraded your FreeBSD system.
Congratulations.
You may notice small problems due to things that you have missed. For
example, I once deleted /etc/magic as part of the upgrade and merge to
/etc, and the file command stopped working. A moment's thought meant
that
# cd /usr/src/usr.bin/file
# make all install
was sufficient to fix that one.
12 Questions?
12.1 Do I need to re-make the world for every change?
There is no easy answer to this one, as it depends on the nature of
the change. For example, I have just run CVSup, and it has shown the
following files as being updated since I last ran it;
src/games/cribbage/instr.c
src/games/sail/pl_main.c
src/release/sysinstall/config.c
src/release/sysinstall/media.c
src/share/mk/bsd.port.mk
There is nothing in there that I would re-make the world for. I would
go to the appropriate sub-directories and make all install, and that's
about it. But if something major changed, for example
src/lib/libc/stdlib then I would either re-make the world, or at least
those parts of it that are statically linked (as well as anything else
I might have added that is statically linked).
At the end of the day, it is your call. You might be happy re-making
the world every fortnight say, and let changes accumulate over that
fortnight. Or you might want to re-make just those things that have
changed, and are confident you can spot all the dependencies.
And, of course, this all depends on how often you want to upgrade, and
whether you are tracking -stable or -current.
12.2 My compile failed with lots of signal 12 (or other signal number)
errors
This is normally indicative of hardware problems. (Re)making the world
is an effective way to stress test your hardware, and will frequently
throw up memory problems. These normally manifest themselves as the
compiler mysteriously dying on receipt of strange signals.
A sure indicator of this is if you can restart the make and it dies at
a different point in the process.
In this instance there is little you can do except start swapping
around the components in your machine to determine which one is
failing.
12.3 Can I remove /usr/obj when I have finished?
That depends on how you want to make the world on future occasions.
/usr/obj contains all the object files that were produced during the
compilation phase. Normally, one of the first steps in the ``make
world'' process is to remove this directory and start afresh. In this
case, keeping /usr/obj around after you have finished makes little
sense, and will free up a large chunk of disk space (currently about
150MB).
However, if you know what you are doing you can have ``make world''
skip this step. This will make subsequent builds run much faster,
since most of sources will not need to be recompiled. The flip side of
this is that subtle dependency problems can creep in, causing your
build to fail in odd ways. This frequently generates noise on the
FreeBSD mailing lists, when one person complains that their build has
failed, not realising that it is because they have tried to cut
corners.
If you want to live dangerously then make the world, passing the
``NOCLEAN'' definition to make, like this;
# make -DNOCLEAN world
12.4 Can interrupted builds be resumed?
This depends on how far through the process you got before you found a
problem.
In general (and this is not a hard and fast rule) the ``make world''
process builds new copies of essential tools (such as gcc, and make)
and the system libraries. These tools and libraries are then
installed. The new tools and libraries are then used to rebuild
themselves, and are installed again. The entire system (now including
regular user programs, such as ls or grep) is then rebuilt with the
new system files.
If you are at the last state, and you know it (because you have looked
through the output that you were storing) then you can (fairly safely)
do
... fix the problem ...
# cd /usr/src
# make -DNOCLEAN all
which will not undo the work of the previous ``make world''.
If you see the message
--------------------------------------------------------------
Building everything..
--------------------------------------------------------------
in the ``make world'' output then it is probably fairly safe to do so.
If you do not see that message, or you are not sure, then it is always
better to be safe than sorry, and restart the build from scratch.
12.5 Can I use one machine as a master to upgrade lots of machines (NFS)?
People often ask on the FreeBSD mailing lists whether they can do all
the compiling on one machine, and then use the results of that compile
to make install on to other machines around the network.
This is not something I have done, so the suggestions below are either
from other people, or deduced from the Makefiles.
The precise approach to take depends on your version of FreeBSD
NOTE:
You must still upgrade /etc and /dev on the target machines after
doing this.
12.5.1 Version 2.1.7 and below
In a message to questions@freebsd.org, Antonio Bemfica suggested the
following approach:
Date: Thu, 20 Feb 1997 14:05:01 -0400 (AST)
From: Antonio Bemfica <bemfica@militzer.me.tuns.ca>
To: freebsd-questions@freebsd.org
Message-ID: <Pine.BSI.3.94.970220135725.245C-100000@militzer.me.tuns.ca>
Josef Karthauser asked:
> Has anybody got a good method for upgrading machines on a network
First make world, etc. on your main machine
Second, mount / and /usr from the remote machine:
main_machine% mount remote_machine:/ /mnt
main_machine% mount remote_machine:/usr /mnt/usr
Third, do a 'make install' with /mnt as the destination:
main_machine% make install DESTDIR=/mnt
Repeat for every other remote machine on your network. It works fine
for me.
Antonio
This mechanism will only work (to the best of my knowledge) if you can
write to /usr/src on the NFS server, as the ``install'' target in
2.1.7 and below needed to do this.
12.5.2 Version 2.2.0 and above
Midway between 2.1.7 and 2.2.0 the ``reinstall'' target was committed.
You can use the approach exactly as outlined above for 2.1.7, but use
``reinstall'' instead of ``install''.
This approach does not require write access to the /usr/src directory
on the NFS server.
WARNING:
There was a bug introduced in this target between versions 1.68 and
1.107 of the Makefile, which meant that write access to the NFS server
was required. This bug was fixed before version 2.2.0 of FreeBSD was
released, but may be an issue of you have an old server still running
-stable from this era.
12.5.3 Version 2.2.5 and above
As outlined earlier, the ``buildworld'' and ``installworld'' targets
can be used to build a source tree on one machine, and then NFS mount
/usr/src and /usr/obj on the remote machine and install it there.
12.6 How can I speed up making the world?
* Run in single user mode.
* Put the /usr/src and /usr/obj directories on separate filesystems
held on separate disks. If possible, put these disks on separate
disk controllers.
* Better still, put these filesystems across separate disks using
the ``ccd'' (concatenated disk driver) device.
* Turn off profiling (set ``NOPROFILE=true'' in /etc/make.conf). You
almost certainly do not need it.
* Also in /etc/make.conf, set ``CFLAGS'' to something like ``-O
-pipe''. The optimisation ``-O2'' is much slower, and the
optimisation difference between ``-O'' and ``-O2'' is normally
negligible. ``-pipe'' lets the compiler use pipes rather than
temporary files for communication, which saves disk access (at the
expense of memory).
* Pass the -j<n> option to make (if you are running a sufficiently
recent version of FreeBSD) to run multiple processes in parallel.
This helps regardless of whether you have a single or a multi
processor machine.
* The filesystem holding /usr/src can be mounted (or remounted) with
the ``noatime'' option. This stops the time files in the
filesystem were last accessed from being written to the disk. You
probably do not need this information anyway.
NOTE:
``noatime'' is in version 2.2.0 and above.
# mount -u -o noatime /usr/src
WARNING:
The example assumes /usr/src is on its own filesystem. If it is not
(if it is a part of /usr for example) then you will need to use that
filesystem mount point, and not /usr/src.
* The filesystem holding /usr/obj can be mounted (or remounted) with
the ``async'' option. This causes disk writes to happen
asynchronously. In other words, the write completes immediately,
and the data is written to the disk a few seconds later. This
allows writes to be clustered together, and can be a dramatic
performance boost.
WARNING:
Keep in mind that this option makes your filesystem more fragile. With
this option there is an increased chance that, should power fail, the
filesystem will be in an unrecoverable state when the machine
restarts.
If /usr/obj is the only thing on this filesystem then it is not a
problem. If you have other, valuable data on the same filesystem then
ensure your backups are fresh before you enable this option.
# mount -u -o async /usr/obj
WARNING:
As above, if /usr/obj is not on its own filesystem, replace it in the
example with the name of the appropriate mount point.
13 Translations
13.1 Japanese
MAEKAWA Masahide has graciously translated this tutorial into
Japanese. The translation is available at
<URL:http://www.rr.iij4u.or.jp/%7ebishop/>.
14 Contributors
The following people have contributed to this document in some form or
another. Either by directly suggesting alterations and improvements,
pointing out errors, or by their messages to the FreeBSD mailing
lists, from which I have shamelessly cribbed information. My thanks to
them.
* Antonio Bemfica, <bemfica@militzer.me.tuns.ca>
* Sue Blake, <sue@welearn.com.au>
* Brian Haskin, <haskin@ptway.com>
* Kees Jan Koster, <kjk1@ukc.ac.uk>
* A Joseph Kosy, <koshy@india.hp.com>
* Greg Lehey, <grog@lemis.com>
* Wes Peters, <softweyr@xmission.com>
* Joseph Stein, <joes@wstein.com>
* Studded, <studded@dal.net>
* Axel Thimm <Axel.Thimm@physik.fu-berlin.de>
* Matthew Thyer <Matthew.Thyer@dsto.defence.gov.au>
--
※ 转载:·BBS 荔园晨风站 bbs.szu.edu.cn·[FROM: 192.168.1.143]
[回到开始]
[上一篇][下一篇]
荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店