Decouple and remove the Updating chapter.

This commit is contained in:
Tom Rhodes 2008-12-23 18:59:03 +00:00
parent 71682c57b3
commit 98a057adfe
Notes: svn2git 2020-12-08 03:00:23 +00:00
svn path=/head/; revision=33508
7 changed files with 1 additions and 563 deletions
en_US.ISO8859-1/books/handbook

View file

@ -237,7 +237,6 @@ SRCS+= preface/preface.sgml
SRCS+= printing/chapter.sgml
SRCS+= security/chapter.sgml
SRCS+= serialcomms/chapter.sgml
SRCS+= updating/chapter.sgml
SRCS+= users/chapter.sgml
SRCS+= vinum/chapter.sgml
SRCS+= virtualization/chapter.sgml

View file

@ -50,7 +50,6 @@
<!ENTITY % chap.audit "IGNORE">
<!ENTITY % chap.filesystems "IGNORE">
<!ENTITY % chap.dtrace "IGNORE">
<!ENTITY % chap.updating "IGNORE">
<!ENTITY % pgpkeys SYSTEM "../../../share/pgpkeys/pgpkeys.ent"> %pgpkeys;
]>
@ -321,7 +320,6 @@
can begin using FreeBSD in a network environment.</para>
</partintro>
<![ %chap.updating; [ &chap.updating; ]]>
<![ %chap.serialcomms; [ &chap.serialcomms; ]]>
<![ %chap.ppp-and-slip; [ &chap.ppp-and-slip; ]]>
<![ %chap.mail; [ &chap.mail; ]]>

View file

@ -43,7 +43,6 @@
<!ENTITY chap.dtrace SYSTEM "dtrace/chapter.sgml">
<!-- Part four -->
<!ENTITY chap.updating SYSTEM "updating/chapter.sgml">
<!ENTITY chap.serialcomms SYSTEM "serialcomms/chapter.sgml">
<!ENTITY chap.ppp-and-slip SYSTEM "ppp-and-slip/chapter.sgml">
<!ENTITY chap.mail SYSTEM "mail/chapter.sgml">

View file

@ -720,7 +720,7 @@ docbook =
<screen>&prompt.root; <userinput>pkg_add -r portsnap</userinput></screen>
<para>Please refer to <link linkend="updating-portsnap">Using Portsnap</link>
<para>Please refer to <link linkend="updating-upgrading-portsnap">Using Portsnap</link>
for a detailed description of all <application>Portsnap</application>
features.</para>

View file

@ -474,15 +474,6 @@
<!-- Part IV - Network Communications -->
<varlistentry>
<term><emphasis><xref linkend="updating">, Updating &os;</emphasis></term>
<listitem>
<para>Describes the latest system utilities that may be used to
update a &os; system. These are &man.freebsd-update.8; for
the base system, and &man.portsnap.8; for the
Ports&nbsp;Collection.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis><xref linkend="serialcomms">, Serial Communications</emphasis></term>
<listitem>

View file

@ -1,15 +0,0 @@
#
# Build the Handbook with just the content from this chapter.
#
# $FreeBSD$
#
CHAPTERS= updating/chapter.sgml
VPATH= ..
MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
DOC_PREFIX?= ${.CURDIR}/../../../..
.include "../Makefile"

View file

@ -1,534 +0,0 @@
<!--
The FreeBSD Documentation Project
$FreeBSD$
-->
<chapter id="updating">
<chapterinfo>
<authorgroup>
<author>
<firstname>Tom</firstname>
<surname>Rhodes</surname>
<contrib>Written by </contrib>
</author>
</authorgroup>
<authorgroup>
<author>
<firstname>Colin</firstname>
<surname>Percival</surname>
<contrib>Based on notes provided by </contrib>
</author>
</authorgroup>
</chapterinfo>
<title>Updating &os;</title>
<sect1 id="updating-synopsis">
<title>Synopsis</title>
<indexterm><primary>Updating FreeBSD</primary></indexterm>
<indexterm>
<primary>freebsd-update</primary>
<see>Updating</see>
</indexterm>
<para>Over time, one primary aspect of the &os; operating system
has remained the same. This is the requirement to use
applications and utilities to obtain major and minor system
updates.</para>
<para>For many years, users wishing to upgrade their system,
collect security patches, and obtain port and package updates
without breaking the Ports Collection visioning methods were
forced to use the <application>CVSup</application> tool.</para>
<para>While use of <application>CVSup</application> is still
supported, and a true C-language version
was added to &os;, there are new methods to acquire system
updates.</para>
<para>Tools such as &man.portsnap.8;, and &man.freebsd-update.8;
have streamlined the upgrade process. These
new methods increase productivity while providing a more simple
interface for users. Some of the new tools may be run from
&man.cron.8; reducing the manual intervention of the systems
administrator; a benefit for those who monitor hundreds of &os;
machines.</para>
<para>This chapter will explain these new methods, and how users
and system administrators alike may benefit from their practical
and easy use.</para>
<para>After reading this chapter, you will know:</para>
<itemizedlist>
<listitem>
<para>What utilities may be used to update the system and
the Ports Collection.</para>
</listitem>
<listitem>
<para>How to use <command>freebsd-update</command> to apply
security patches and perform major and minor &os;
upgrades.</para>
</listitem>
<listitem>
<para>How to compare the state of an installed system against
a known pristine copy.</para>
</listitem>
</itemizedlist>
<para>Before reading this chapter, you should:</para>
<itemizedlist>
<listitem>
<para>Understand &unix; and &os; basics
(<xref linkend="basics">).</para>
</listitem>
<listitem>
<para>Be familiar with the basics of kernel
configuration/compilation
(<xref linkend="kernelconfig">).</para>
</listitem>
<listitem>
<para>Have some familiarity with the Ports Collection and
installing third party applications on &os;
(<xref linkend="ports">).</para>
</listitem>
<listitem>
<para>Be familiar with the various source components which make
up &os; and how to use the &man.mergemaster.8; tool
(<xref linkend="cutting-edge">).</para>
</listitem>
</itemizedlist>
</sect1>
<sect1 id="updating-freebsdupdate">
<title>FreeBSD Update</title>
<para>Applying security patches is an important part of maintaining
computer software, especially the operating system. For the
longest time on &os; this process was not an easy one. Patches
had to be applied to the source code, the code rebuilt into
binaries, and then the binaries had to be re-installed.</para>
<para>This is no longer the case as &os; now includes a utility
simply called <command>freebsd-update</command>. This utility
provides two separate functions. First, it allows for binary
security and errata updates to be applied to the &os; base system
without the build and install requirements. Second, the utility
supports minor and major release upgrades.</para>
<note>
<para>Binary updates are available for all architectures and
releases currently supported by the security team; however,
some features, such as the &os; operating system upgrades,
require the latest release of &man.freebsd-update.8; and
&os; 6.3. Before updating to a new release, the current
release announcements should be reviewed as they may contain
important information pertinent to the desired release. These
announcements may be viewed at the following link:
<ulink url="http://www.FreeBSD.org/releases/"></ulink>.</para>
</note>
<para>If a <command>crontab</command> utilizing the features
of <command>freebsd-update</command> exists, it must be
disabled before the following operation is started. The
latest version of <command>freebsd-update</command> may
be installed by downloading the <command>tar</command> and
<command>gzip</command>'d package from the above
<acronym>URL</acronym> and installed with the following
commands:</para>
<screen>&prompt.root; <userinput>gunzip -c freebsd-update-upgrade.tgz | tar xvf -</userinput>
&prompt.root; <userinput>mv freebsd-update.sh /usr/sbin/freebsd-update</userinput>
&prompt.root; <userinput>mv freebsd-update.conf /etc</userinput></screen>
<para>For all current releases, downloading the latest version
is not required.</para>
<sect2>
<title>The Configuration File</title>
<para>Some users may wish to tweak the configuration file,
allowing better control of the process. The options are
very well documented, but the following few may require a
bit more explanation:</para>
<programlisting># Components of the base system which should be kept updated.
Components src world kernel</programlisting>
<para>This parameter controls what parts of &os; will be kept
up to date. The default is to update the source code, the
entire base system, and the kernel. Components are the
same as those available during the install, for instance,
adding "world/games" here would allow game patches to be
applied. Using "src/bin" would allow the source code in
<filename class="directory">src/bin</filename> to be
updated.</para>
<para>The best option is to leave this at the default as
changing it to include specific items will require the user
to list every item they prefer to be updated. This could
have disastrous consequences as source code and binaries may
become out of sync.</para>
<programlisting># Paths which start with anything matching an entry in an IgnorePaths
# statement will be ignored.
IgnorePaths</programlisting>
<para>Add paths, such as
<filename class="directory">/bin</filename> or
<filename class="directory">/sbin</filename> to leave these
specific directories untouched during the update
process. This option may be used to prevent
<command>freebsd-update</command> from overwriting local
modifications.</para>
<programlisting># Paths which start with anything matching an entry in an UpdateIfUnmodified
# statement will only be updated if the contents of the file have not been
# modified by the user (unless changes are merged; see below).
UpdateIfUnmodified /etc/ /var/ /root/ /.cshrc /.profile</programlisting>
<para>Update configuration files in the specified directories
only if they have not been modified. Any changes made by the
user will invalidate the automatic updating of these files.
There is another option,
<literal>KeepModifiedMetadata</literal>, which will instruct
<command>freebsd-update</command> to save the changes during
the merge.</para>
<programlisting># When upgrading to a new &os; release, files which match MergeChanges
# will have any local changes merged into the version from the new release.
MergeChanges /etc/ /var/named/etc/</programlisting>
<para>List of directories with configuration files that
<command>freebsd-update</command> should attempt merges in.
The file merge process is a series of &man.diff.1; patches
similar to &man.mergemaster.8; with fewer options, the merges
are either accepted, open an editor, or
<command>freebsd-update</command> will abort. When in doubt,
backup <filename class="directory">/etc</filename> and just
accept the merges. See <xref linkend="cutting-edge"> for more
information about the <command>mergemaster</command>
command.</para>
<programlisting># Directory in which to store downloaded updates and temporary
# files used by &os; Update.
# WorkDir /var/db/freebsd-update</programlisting>
<para>This directory is where all patches and temporary
files will be placed. In cases where the user is doing
a version upgrade, this location should have a least a
gigabyte of disk space available.</para>
<programlisting># When upgrading between releases, should the list of Components be
# read strictly (StrictComponents yes) or merely as a list of components
# which *might* be installed of which &os; Update should figure out
# which actually are installed and upgrade those (StrictComponents no)?
# StrictComponents no</programlisting>
<para>When set to <literal>yes</literal>,
<command>freebsd-update</command> will assume that the
<literal>Components</literal> list is complete and will not
attempt to make changes outside of the list. Effectively,
<command>freebsd-update</command> will attempt to update
every file which belongs to the <literal>Components</literal>
list.</para>
</sect2>
<sect2>
<title>Security Patches</title>
<para>Security patches are stored on a remote machine and
may be downloaded and installed using the following
command:</para>
<screen>&prompt.root; <userinput>freebsd-update fetch</userinput>
&prompt.root; <userinput>freebsd-update install</userinput></screen>
<para>If any kernel patches have been applied the system will
need a reboot. If all went well the system should be patched
and <command>freebsd-update</command> may be ran as a nightly
&man.cron.8; job. An entry in <filename>/etc/crontab</filename>
would be sufficient to accomplish this task:</para>
<programlisting>@daily root freebsd-update cron</programlisting>
<para>This entry states that once every day, the
<command>freebsd-update</command> will be ran. In this way,
using the <option>cron</option> argument,
<command>freebsd-update</command> will only check if updates
exist. If patches exist, they will automatically be downloaded
to the local disk but not applied. The
<username>root</username> user will be sent an email so they
may install them manually.</para>
<para>If anything went wrong, <command>freebsd-update</command>
has the ability to roll back the last set of changes with
the following command:</para>
<screen>&prompt.root; <userinput>freebsd-update rollback</userinput></screen>
<para>Once complete, the system should be restarted if the kernel
or any kernel modules were modified. This will allow &os; to
load the new binaries into memory.</para>
<note>
<para>The <command>freebsd-update</command> only works with
the <filename>GENERIC</filename> kernel. If any changes have
been made to <filename>GENERIC</filename> or a custom kernel
has been installed, <command>freebsd-update</command> will
not complete&nbsp;&mdash; failing in the former case and
producing an error in the latter.</para>
</note>
</sect2>
<sect2>
<title>Major and Minor Upgrades</title>
<para>This process will remove old object files and
libraries which will break most third party applications.
It is recommended that all installed ports either be removed
and re-installed or upgraded later using the
<filename role="package">ports-mgmt/portupgrade</filename>
utility. Most users will want to run a test build using
the following command:</para>
<screen>&prompt.root; <userinput>portupgrade -af</userinput></screen>
<para>This will ensure everything will be re-installed
correctly. Note that setting the
<makevar>BATCH</makevar> environment variable to
<literal>yes</literal> will answer <literal>yes</literal> to
any prompts during this process, removing the need for
manual intervention during the build process.</para>
<para>Major and minor version updates may be performed by
providing <command>freebsd-update</command> with a release
version target, for example, the following command will
update to &os;&nbsp;6.3:</para>
<screen>&prompt.root; <userinput>freebsd-update -r 6.3-RELEASE upgrade</userinput></screen>
<para>After the command has been received,
<command>freebsd-update</command> will evaluate the
configuration file and current system in an attempt to gather
the information necessary to update the system. A screen
listing will display what components have been detected and
what components have not been detected. For example:</para>
<screen>Looking up update.FreeBSD.org mirrors... 1 mirrors found.
Fetching metadata signature for 6.3-BETA1 from update1.FreeBSD.org... done.
Fetching metadata index... done.
Inspecting system... done.
The following components of FreeBSD seem to be installed:
kernel/smp src/base src/bin src/contrib src/crypto src/etc src/games
src/gnu src/include src/krb5 src/lib src/libexec src/release src/rescue
src/sbin src/secure src/share src/sys src/tools src/ubin src/usbin
world/base world/info world/lib32 world/manpages
The following components of FreeBSD do not seem to be installed:
kernel/generic world/catpages world/dict world/doc world/games
world/proflibs
Does this look reasonable (y/n)? y</screen>
<para>At this point, <command>freebsd-update</command> will
attempt to download all files required for the upgrade. In
some cases, the user may be prompted with questions regarding
what to install or how to proceed.</para>
<para>After all patches have been downloaded to the local
system, they will then be applied. This process may take
a while depending on the speed and workload of the machine.
Configuration files will then be merged&nbsp;&mdash; this part
of the process requires some user intervention as a file may be
merged or an editor may appear on screen for a manual merge.
The results of every successful merge will be shown to the user
as the process continues. A failed or ignored merge will cause
the process to abort. Users may wish to make a backup of
<filename class="directory">/etc</filename> and manually merge
important files, such as <filename>master.passwd</filename>
or <filename>group</filename> at a later time.</para>
<note>
<para>The system is not being altered yet, all patching and
merging is happening in another directory. When all
patches have been applied successfully, all configuration
files have been merged and it seems the process will go
smoothly, the changes will need to be committed by the
user.</para>
</note>
<para>Once this process is complete, the upgrade may be committed
to disk using the following command.</para>
<screen>&prompt.root; <userinput>freebsd-update install</userinput></screen>
<para>The kernel and kernel modules will be patched first. At
this point the machine must be rebooted. The following
command may be issued to restart the machine so the new
kernel will be loaded into memory:</para>
<screen>&prompt.root; <userinput>shutdown -r now</userinput></screen>
<para>Once the system has come back online,
<command>freebsd-update</command> will need to be started
again. The state of the process has been saved and thus,
<command>freebsd-update</command> will not start from the
beginning, but will remove all old shared libraries and object
files. To continue to this stage, issue the following
command:</para>
<screen>&prompt.root; <userinput>freebsd-update install</userinput></screen>
<note>
<para>Depending on whether any libraries version numbers got
bumped, there may only be two install phases instead of
three.</para>
</note>
<para>All third party software will now need to be rebuilt and
re-installed. This is required as installed software may
depend on libraries which have been removed during the upgrade
process. The
<filename role="package">ports-mgmt/portupgrade</filename>
command may be used to automate this process. The following
commands may be used to begin this process:</para>
<screen>&prompt.root; <userinput>portupgrade -f ruby</userinput>
&prompt.root; <userinput>rm /var/db/pkg/pkgdb.db</userinput>
&prompt.root; <userinput>portupgrade -f ruby18-bdb</userinput>
&prompt.root; <userinput>rm /var/db/pkg/pkgdb.db /usr/ports/INDEX-*.db</userinput>
&prompt.root; <userinput>portupgrade -af</userinput></screen>
<para>Once this has completed, finish the upgrade process with a
final call to <command>freebsd-update</command>. Issue the
following command to tie up all loose ends in the upgrade
process:</para>
<screen>&prompt.root; <userinput>freebsd-update install</userinput></screen>
<para>Reboot the machine into the new &os; version. The process
is complete.</para>
</sect2>
<sect2>
<title>System State Comparison</title>
<para>The <command>freebsd-update</command> utility may be used
to test the state of the installed &os; version against a
known good copy. This option evaluates the current version
of system utilities, libraries, and configuration files.
To begin the comparison, issue the following command:</para>
<screen>&prompt.root; <userinput>freebsd-update IDS &gt;&gt; outfile.ids</userinput></screen>
<warning>
<para>While the command name is <acronym>IDS</acronym> it should
in no way be a replacement for an intrusion detection system
such as <filename role="package">security/snort</filename>.
As <command>freebsd-update</command> stores data on disk, the
possibility of tampering is evident. While this possibility
may be reduced by using the
<varname>kern.securelevel</varname> setting and storing the
<command>freebsd-update</command> data on a read only file
system when not in use, a better solution would be to
compare the system against a secure disk, such as a
<acronym>DVD</acronym> or securely stored external
<acronym>USB</acronym> disk device.</para>
</warning>
<para>The system will now be inspected, and a list of files
along with their &man.sha256.1; hash values, both the known value
in the release and the current installed value, will be printed. This is why
the output has been sent to the
<filename>outfile.ids</filename> file. It scrolls by too
quickly for eye comparisons, and soon it fills up the console
buffer.</para>
<para>These lines are also extremely long, but the output format
may be parsed quite easily. For instance, to obtain a list of
all files different from those in the release, issue the
following command:</para>
<screen>&prompt.root; <userinput>cat outfile.ids | awk '{ print $1 }' | more</userinput>
/etc/master.passwd
/etc/motd
/etc/passwd
/etc/pf.conf</screen>
<para>This output has been truncated, many more files exist.
Some of these files have natural modifications, the
<filename>/etc/passwd</filename> has been modified because
users have been added to the system. In some cases, there
may be other files, such as kernel modules, which differ
as <command>freebsd-update</command> may have updated them.
To exclude specific files or directories, add them to the
<literal>IDSIgnorePaths</literal> option in
<filename>/etc/freebsd-update.conf</filename>.</para>
<para>This system may be used as part of an elaborate upgrade
method, aside from the previously discussed version.</para>
</sect2>
</sect1>
<sect1 id="updating-portsnap">
<title>Portsnap: A Ports Collection Update Tool</title>
<para>The base system of &os; includes a utility for updating
the Ports Collection too: the &man.portsnap.8; utility. Upon
execution, it will connect to a remote site, verify the secure
key, and download a new copy of the Ports Collection. The key
is used to verify the integrity of all downloaded files, ensuring
they have not been modified in-flight. To download the latest
Ports Collection files, issue the following command:</para>
<screen>&prompt.root; <userinput>portsnap fetch</userinput>
Looking up portsnap.FreeBSD.org mirrors... 3 mirrors found.
Fetching snapshot tag from portsnap1.FreeBSD.org... done.
Fetching snapshot metadata... done.
Updating from Wed Aug 6 18:00:22 EDT 2008 to Sat Aug 30 20:24:11 EDT 2008.
Fetching 3 metadata patches.. done.
Applying metadata patches... done.
Fetching 3 metadata files... done.
Fetching 90 patches.....10....20....30....40....50....60....70....80....90. done.
Applying patches... done.
Fetching 133 new ports or files... done.</screen>
<para>What this example shows is that &man.portsnap.8;
has found and verified
several patches to the current ports data. This also indicates
that the utility was run previously, if it was a first time
run, the collection would have simply been downloaded.</para>
<para>When &man.portsnap.8; successfully completes
a <command>fetch</command> operation, the Ports Collection and
subsequent patches exist on the local system that have passed
verification. The updated files may be installed by
typing:</para>
<screen>&prompt.root; <userinput>portsnap extract</userinput>
/usr/ports/.cvsignore
/usr/ports/CHANGES
/usr/ports/COPYRIGHT
/usr/ports/GIDs
/usr/ports/KNOBS
/usr/ports/LEGAL
/usr/ports/MOVED
/usr/ports/Makefile
/usr/ports/Mk/bsd.apache.mk
/usr/ports/Mk/bsd.autotools.mk
/usr/ports/Mk/bsd.cmake.mk
<replaceable>...</replaceable></screen>
<para>The process is now complete, and applications may be
installed or upgraded using the updated Ports Collection.</para>
</sect1>
</chapter>