Date: Thu, 15 Jan 1998 23:52:22 -0500 From: Michael Alwan <mjalwan@rma.edu> To: Sean-Paul Rees <magic@ulink.net> Cc: questions@FreeBSD.ORG Subject: Re: 3.0-CURRENT Branch, "config" failure. Message-ID: <3.0.3.32.19980115235222.00913e80@rma.edu> In-Reply-To: <Pine.LNX.3.95.980115190001.1895A-100000@bluefire>
next in thread | previous in thread | raw e-mail | index | archive | help
--=====================_884944342==_ Content-Type: text/plain; charset="us-ascii" At 07:02 PM 1/15/1998 -0800, you wrote: >Hewwo: > >Removing old directory ../../compile/rev1a-dragon.ulink.net: Done. >files.i386: i386/isa/npx.c must be optional or standard >Unknown % construct in generic makefile: %VERSREQ= 300003 >Kernel build directory is ../../compile/rev1a-dragon.ulink.net > > You need to rebuild config. The %VERSREQ parameter is in the makefile to ensure that you have the required version of config. If you rebuild config (or make world) before building the kernel, these messages will go away. Change files.i386 back to "mandatory" too. See attachment on keeping current--I have no idea if this FAQ is being maintained or upgraded. Been there in spades, Michael --=====================_884944342==_ Content-Type: text/plain; charset="us-ascii" Content-Disposition: attachment; filename="staying current with FreeBSD" Staying -current with FreeBSD r2 ====================================================================== Maintained by Mike Smith <msmith@freebsd.org> FreeBSD-current represents the bleeding edge of FreeBSD development. It's where all the new features, performance improvements and bugfixes are unleashed on the user community. If you are interested in developing for FreeBSD, or just want the heady thrill of getting all the latest stuff first, -current is what you want. FreeBSD-current changes daily, and like any new product it goes through patches of instability and unreliability. This is part and parcel of using -current; if you don't think you can deal with it, now is a good time to opt out. A -release or -stable version will still give you excellent service, and with greatly improved dependability. However, there are a lot of people that do run FreeBSD-current, and many use nothing else. If you are serious about contributing to ongoing FreeBSD development, you may need to run -current too. In order to help new -current users, and old ones with bad habits, this is a guide to getting along with FreeBSD-current. If you're having problems, check here first because if you don't, you may find your (quite valid) complaint ignored simply because there's not enough information for anyone to do anything about it, and you just might find the information you need to get you going again. Notes ----- If you're going to be running FreeBSD-current, it's assumed that you are reasonably familiar with FreeBSD. No attempt will be made here to explain basic operating procedure or commands; if this sounds too complicated then it probably is. Command examples here should work with any shell. Where there are potential differences, an example of each form will be given. Preparation ----------- If you are not subscribed to the FreeBSD-current mailing list, you should do this first. Running -current and not reading the mailing list is like driving at night with duct tape over your eyes and jellybeans in your ears; ie. not a good idea. Another mailing list worth subscribing to is the cvs-all list. Every change made to the FreeBSD source tree is accompanied by a mail message sent to this list. These messages contain the name(s) of the file(s) affected, the name of the person making the change, and a description of the change itself. Reading this list can provide you with valuable insight into the directions that -current is taking, as well as advance warning of possible problems or fixes. There are other cvs-* lists which may be more suitable, depending on your field of interest. Read the -current mailing list for a few days before starting with FreeBSD-current; it's possible that you might have picked a really bad time to start. If there are problems, people will be discussing them; wait for a resolution to be announced, or for other people to indicate that the problem has been solved. If you're not sure after a few days, post a short message asking whether people think that it's OK to go ahead. As you become more familiar with the atmosphere and the people on -current, you will learn to judge what constitutes "really bad" and what is merely "interesting". Remember that while FreeBSD-current is a development environment, the desired result is indeed a stable platform and if something is broken people will be working to fix it. Starting -------- Once you're subscribed to the -current mailing list, there are a couple of different ways to get FreeBSD-current onto your system. Which is best for you will depend on your circumstances. - FTP: You can install a FreeBSD-current snapshot via FTP just like a release version. FreeBSD-current snapshots are normally built daily and can be downloaded from ftp://current.freebsd.org/. When installing you can either start from scratch, or upgrade an existing system. - CDROM: Walnut Creek CDROM occasionally release a FreeBSD-current snapshot CDROM, and other vendors may too. These are generally a bargain, as they come with a copy of the CVS repository which can save you a lot of download time. You can install from a snapshot CDROM in exactly the same fashion as you would a release version. Be careful though; a snapshot more than a few months old may be just as tough to upgrade from as a previous release. - Bootstrap: If you have the FreeBSD CVS repository on your system you can checkout a copy of the -current source tree and bootstrap a previous release system. You can also get the -current source using CVSup or CTM (see below). Bootstrapping may take a little perseverance, but that's good practice for later. Note that bootstrapping from anything older than the most recent release is something best left to the truly adventurous. If you have problems bootstrapping and really can't get -current going any other way then you should post a concise message to the FreeBSD-current mailing list clearly detailing what you are trying to do, the release you are bootstrapping from and any error messages that you receive during the process. Keeping -current ---------------- Once you have a -current system up and running, congratulations, it's obsolete! FreeBSD-current changes daily, and part of running a -current system is keeping up to date. There are two parts to keeping your system -current; getting the source, and building it. You can obtain the source in two forms; either the raw source tree, or the CVS repository. The former requires around 200MB of disk space, the latter perhaps twice times that; expect these values to grow with time. The raw source tree is all that's required to build the source, however the CVS repository is useful if you are interested in tracking or becoming involved with development. In particular, the CVS repository can be invaluable if you are trying to locate a new problem. There are two distribution strategies in common use for keeping your source up to date, named after the tools used to perform the updating: CVSup and CTM. CVSup ''''' CVSup replaces an older tool, 'sup' (the Source Update Protocol), and is the preferred method for tracking the -current source tree. It requires an active network connection and provides guaranteed-accuracy updates of your CVS repository or checked-out source tree. CVSup can also repair a damaged or modified repository or tree. If you have a -stable or -current system up and running, sample control files for CVSup are located in /usr/share/examples/cvsup. You can get CVSup itself from the FreeBSD ports collection. CTM ''' CTM can be interpreted as 'CVS Thru eMail'; it provides updates for your CVS repository or source tree via email messages. CTM is ideal if your network connection is indirect, expensive or otherwise cannot support CVSup. Documentation for the CTM programs is included with the system, start with 'man ctm', and check the handbook for more details. Checking out with CVS ''''''''''''''''''''' If you are fetching the CVS repository there is one important step required before you can build anything. This is known as "checking out" the source; literally you will generate a complete copy of the -current source tree from the information in the repository. The source tree can be anywhere, but the intermediate files generated during the build will be placed under /usr/obj. If the filesystem containing /usr doesn't have ~150MB of free space, you will need to create a directory elsewhere and use a symbolic link. To check out the source tree, go to where the 'src' directory is to be located and set the CVSROOT environment variable to point to the location of your CVS repository. Using a csh-like shell: # setenv CVSROOT <path-to-repository> or with an sh-like shell: # export CVSROOT=<path-to-repository> Then issue the command: # cvs checkout src This will create a directory 'src' and populate it with the source tree. When the repository is updated by CVSup or CTM you can propagate the changes to this source tree by making the src directory your current directory and saying: # cvs update -Pd If you have been making changes to your source tree, CVS will try to merge these changes with any updates it makes. You should watch the output from the update command and note any merges; these should be checked before you go any further to make sure they won't cause any problems. Identifying these merges is easier if you make CVS run quieter, eg. # cvs -q update -Pd If in doubt, remove the file(s) in question and rerun the update, which will replace them with fresh copies. Building the World '''''''''''''''''' Once you have your source tree checked out, make sure the 'src' tree is reachable as /usr/src, become root and change to the /usr/src directory. Now is the time to select your build options. If you've built the FreeBSD tree before, you will be familiar with these. Options are set via environment variables, by editing /etc/make.conf, or by passing them on the commandline when you build the tree. We will use the last method here. To set an option when invoking 'make', specify its name as an argument to the '-D' option, ie. to set the option VARIABLE, you would add '-DVARIABLE' to the 'make' commandline. The common variables and their uses are: NOCLEAN Do not clean out the old build tree. This can save on build time, but may introduce subtle problems. NOSECURE Do not build the export-restricted modules. If you haven't downloaded the source for these, then you won't want to try to build them. This is a good option to use if you are not in the USA. NOGAMES Don't rebuild the games. If you don't have or want them installed, set this. NOSHARE Don't rebuild /usr/share. This can save some time, and if /usr/share (containing manpages, data files and examples) hasn't changed much it won't cause you any trouble. NOPROFILE Don't build the profiling libraries. If you're not doing any development involving profiling, this can save a considerable amount of time and space. If you don't know what profiling libraries are, you don't want them. Once your options are set, start the build. It's generally a good idea to keep a record of the build, in case there are problems and you want to look over it. There are two good ways to do this. The first uses the 'script' command, which arranges a transcript of a session. You would say: # script Script started, output file is typescript # make world When the build has finished, use 'exit' to close the script. The second method runs the build in the background, and watches it with the 'tail' command. The advantage of this method is that you can let the build run without having to watch it all the time; you can come back to check on it at your leisure. To do this, you would say: # make world >& makelog & # tail -f makelog You can hit ^C at any time to exit the 'tail' command, and then reissue it whenever you want to check on the build. A world build transcript generated like this will generally be around the 7 megabyte mark; you should make sure you have space for it. If you are unsure about whether the build will work, and would prefer to make sure it builds properly before allowing it to install over your running system, you can use the 'buildworld' rather than 'world' target. This will compile everything, but not install it. Once you are happy that the build has completed OK, you can invoke the 'installworld' target, which will install the built world. If your 'buildworld' is failing on something that you think is trivial you can add the '-k' option to the make command. This will cause make to continue after an error, rather than stopping the build. If you have built with '-k' you should examine the build log very carefully before proceeding to install, as it is possible to make an enormous mess like this. Building the Kernel ''''''''''''''''''' Changes in -current often require coordinated rebuilding of both the 'world' (userland) and the kernel. Normally you should build a new kernel after you have built the world, but before you reboot. There are a couple of important points to bear in mind regarding the kernel: - The 'config' program is closely tied to the kernel. It is normally built as part of userland, but it can also be built manually with # cd /usr/src/usr.sbin/config # make depend all install clean clendepend Using an outdated 'config' program can cause strange errors when configuring or building a kernel, althought 'config' does its best to determine whether it is out of date and complain accordingly. - The kernel and LKMs are closely related. Mismatches can cause fatal kernel errors or strange behaviour. LKMs are also built as part of userland, but can be regenerated and reinstalled with # cd /usr/src/lkm # make depend all install clean cleandepend Note that both of these examples assume that your source tree is under /usr/src; if you've put it elsewhere, adjust them accordingly. Changes to -current may require matching changes in your kernel configuration file. These are normally reflected in changes to the LINT or GENERIC files, and/or described in messages posted to the mailing list. Once the kernel has been built and installed, reboot the system. It is generally a good idea to do this at this point, in order to ensure that the running kernel and userland programs correspond. When Things go Wrong -------------------- Problems with FreeBSD-current can generally be divided into three groups: - It won't build. - It won't boot. - Something funny happens when... It won't Build '''''''''''''' If it won't build, and the reason isn't immediately obvious, there are several steps you should take. Always remember to go through these in order; skipping them may miss the problem. In some cases, the only remedy is to wait for someone to fix the problem before you can go on. - Completely remove the object tree and start again. You can do this with: # chflags -R noschg /usr/obj/ # rm -rf /usr/obj/* Normally the 'world' target will do this for you, unless you have NOCLEAN or one of the related non-cleaning options set. The 'chflags' command removes the system-immutable flag which is set on some of the intermediate files generated during the build process. This flag renders files unchangable (and undeletable) as a security and safety measure. Its use on intermediate files can be considered a 'feature'. - If you have a local copy of the CVS repository, completely remove the source tree, check out a new copy and try building it again. Make sure you make a backup of your kernel configuration files before doing this. - Update your local sources, either by waiting for the next CTM mail, or re-running CVSup. If you are using a local CVS repository don't forget to update the checked-out soruce tree with the 'cvs update' command described above. It is possible that your last update came in the middle of a compound change to the source tree, and that updating is all it will take to correct the problem. - Wait a day or two, and watch the mailing list for messages about your problem. If the problem is widespread (ie. not a result of local circumstances) then other people will have encountered it, and a fix is likely to be discussed rapidly. While you are waiting, try investigating the problem yourself. The build process isn't magic, and the error messages are emitted when it fails can often provide you with helpful clues. If you think you have found a problem, try fixing it yourself. If you are using a local CVS repository or CVSup and you make a mess of a file, just delete it and update again; the file will be magically replaced. You need to be a bit more careful if you are fetching the source tree directly with CTM. - If you cannot obtain a clean build after a couple of days of watching the list and updating your source tree, you should post a message to the -current list describing your problem. It is extremely important that you provide enough information to diagnose your problem; without this information your post is likely to be ignored because it represents a great deal of work. At the very least, your post should include: x The last update date of your source tree. If you are using CVSup, the time at which you last ran CVSup, and the server you updated from. If you are using CTM, the number of the last CTM delta that you have applied. x An excerpt from the the end of the build transcript above. Try to include the last few lines of commands before the "error 1" lines, as these will generally contain information needed to locate the problem. x A list of all the build options that were enabled. You may be asked for additional information, or to try various things; be prepared to become involved in solving your problem, and look to learn from the experience. In time, you may be able to apply the solutions you have discovered to someone else's problem, and in turn help them out. It Won't Boot ''''''''''''' Occasionally you will encounter a newly-built kernel that won't boot. "Won't boot" may mean that it produces a panic message, or a fatal trap while starting up, or the system may freeze up, or reboot spontaenously. There can be a number of reasons for these failures; the two most common are: - You have stale LKMs. - A new change to the kernel is broken. You should always check for an LKM problem before suspecting that the kernel is broken. It is easy to check whether you have such a problem: - Boot single-user (specify '-s' at the boot: prompt) - Mount the root filesystem read/write: # mount / - Move the LKM directory out of the way: # mv /lkm /lkm.bad - Continue to multi-user: # exit If this fixes your problem, then you should remove all of the old LKMs, and install a new set. This can be achieved with: # mv /lkm.bad /lkm # rm -rf /lkm/* # cd /usr/src/lkm # make depend all install clean cleandepend Note that both this technique and the one above for config may make temporary files in the source tree; this is dirty but expedient. If the kernel doesn't get to the single-user stage, or if it still fails, then it is likely that the kernel is broken. You should boot the backup kernel, which is a copy of the previous kernel which was made when you installed the new one. This is achieved by entering the name of the backup kernel at the 'boot:' prompt; it's normally called 'kernel.old'. If you are experimenting with new kernels, you will want to make another backup, as everytime you install a kernel the backup is overwritten with the current kernel; two bad kernels in a row would leave you unable to boot. You can copy the backup kernel over the newer kernel with the commands: # chflags noschg /kernel # cp /kernel.old /kerne # chflags schg /kernel Once you have your system up and running again in this fashion, you should again keep an eye on the FreeBSD-current mailing list. It's possible that your problem will already have been noticed, and a fix may have been made already. If your problem persists after several days and several rebuilds, you can participate in tracking it down as follows. It is important to provide a lot of information about kernel problems, as they can be very subtle. You should build a kernel with the debugger enabled, ie. with options DDB in the configuration file. Ideally, the kernel should be configured with the '-g' flag to config, and installed in this form. Be aware that this will result in a kernel that may be up to 10 megabytes in size, as it includes copious debugging information. When the system panics, or encounters a trap, it will print a message giving details of the panic or trap, and leave the system in the debugger at the 'ddb>' prompt. At this point, you should make a note of all of this information. It is important that you do this, as it identifies the basic nature of the problem, its location and the state of the system when the problem occurred. You should then issue the 'trace' command to ddb, and note all of its output. This provides more vital information as to the state of the system. Armed with this information, you are ready to post to the FreeBSD-current mailing list. You should include in your message: - The trap/panic message and 'trace' output. - The last update date/CTM number from which the kernel was built. - Your hardware configuration details. - The kernel configuration file from which the kernel was generated. - The activity which causes the problem (booting, heavy load, etc.) If your problem is due to a fault which is triggered by your system configuration or load profile you may be asked to try making changes to the source in order to locate a suitable fix. These changes are often provided in the form of patches, which are discussed below. There is a lot more that you can do with a debugging-enabled kernel; see the online handbook for more details on this. Something Funny happens When... ''''''''''''''''''''''''''''''' You may notice that the new kernel or userland doesn't behave 'quite right'. A command may behave differently, or the system may not respond as it did previously under some circumstances. In the worst case, you may find that the kernel may panic or encounter a fatal trap. Under these circumstances, it is important to characterise the nature of the fault. This means that you should attempt to establish, by trial and error, exactly what it is that is causing the problem to manifest. It may be a combination of arguments to a command; a particular sort of system load, or any of many other things. If the system is panicing or stopping on a trap, build and install a kernel with DDB and preferably debugging enabled as above. Otherwise, gather as much information about the problem and any identified causes for it, and watch the FreeBSD-current mailing list. If the problem isn't discussed after a couple of days, post your findings. As always, provide as much information as you believe may be relevant, and be prepared to become involved in finding the solution. How Often? ---------- Now you are running -current, how often should you update? This will depend on your personal schedule, the load and demand on your system, and the general health of -current. In general once a week is a good number if you are keen to keep up to date. Once a month is good if you want to avoid falling too far behind. Another alternative is to wait for a few days after a new major feature of interest is announced, to make sure it is stable and worthwhile. Wrapup ------ FreeBSD-current can be a rewarding and useful environment. Users of -current provide vital feedback to the developer community, who in turn depend on this feedback as a check on their work. -current users must be prepared to work with developers in the pursuit of a stable, reliable, high-performance system, and in turn developers must work with users towards the same goals. Using -current can be a lot more work than a release or -stable version, but the rewards: - Improved performance. - New features and fixes, sooner. - A sense of directly contributing to the ongoing development of FreeBSD. can be well worth the effort. Patching it Up (sidebar) -------------- When you are chasing a problem with your -current system, or if you want to try out something so new that it hasn't been added yet, you may encounter 'patch' or 'diff' files. Often someone will send you one saying "here, try this". These files contain information which allows you to make automated changes to your source tree. They are fed as input to the 'patch' program, usually as: # patch -p < <patchfile> It is important to be in the correct directory when applying a patch. If you can't establish this from the details at the top of the patch file, be sure to ask the author. You can check that a patch will apply by supplying the '-C' option to patch; if any parts are rejected, the patch will not apply cleanly. Note that if you apply a patch to your source tree, CTM will no longer be able to update the file(s) patched. The patch program makes a backup of patched files with the suffix '.orig'; after you have tested a patch you may wish to move these files back to their original names. If you are using a CVS repository, CVS will try to merge your patched changes with new changes to the repository. This can occasionally result in files that cannot be used to build from, as they contain merge comments. The easiest way to deal with such a file is to delete it and then say: # cvs update -Pd <filename> If you are using CVSup to update your source tree directly, it will replace any patched files with the current version when you update. --=====================_884944342==_ Content-Type: text/plain; charset="us-ascii" --=====================_884944342==_--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3.0.3.32.19980115235222.00913e80>