This commit is contained in:
gferg 2002-04-18 00:47:28 +00:00
parent 9855c097e5
commit 59f82a681d
4 changed files with 536 additions and 0 deletions

View File

@ -0,0 +1,66 @@
DOC=TimePrecision
PKG=timeprecision
STYLE=docbook-utils.dsl
#STYLE=ldp.dsl
# To be processed by xsltproc, found in libxslt package.
XSL_STYLE=titlepage.tpl
SHAREDSRC=$(STYLE) titlepage.xsl
MAINen=$(DOC).sgml
MAINpt=$(DOC).pt.sgml
.SUFFIXES: .sgml .html .pdf .ps .rtf .xsl
MAINSRC=$(MAIN) $(STYLE)
all: html
pdf: $(DOC).pdf
ps: $(DOC).ps
html: $(DOC).html
rtf: $(DOC).rtf
clean:
rm -rf *.html *.pdf *.ps *.rtf *.tex *.out *.log *.aux *.xsl
$(DOC).html: $(MAINen) $(SHAREDSRC)
titlepage.xsl: $(XSL_STYLE)
xsltproc -o $@ docbook/template/titlepage.xsl $(XSL_STYLE)
.sgml.html:
xsltproc -o $@ titlepage.xsl $<
.sgml.pdf:
jw -u -b pdf -d "$(STYLE)#print" $<
rm *html
.sgml.ps:
jw -u -b ps -d "$(STYLE)#print" $<
rm *html
.sgml.rtf:
jw -u -b rtf -d "$(STYLE)#print" $<
rm *html
dist: clean
if [ -z "$(ver)" ]; then \
echo "****** Need a version to be passed. Example: \"make ver=1.3 dist\"" >&2; \
else \
cd ..; \
find $(PKG) | cpio -H tar -o | gzip --best -c > $(PKG)-$(ver).tar.gz; \
fi
publish: all
if [ -z "$(out)" ]; then \
echo "****** Need an output directory to be passed. Example: \"make out=../out publish\"" >&2; \
else \
[ ! -d $(out) ] && mkdir -p $(out); \
cp -L $(DOC)*html *png $(out); \
cp -L -r docbook.css images/ $(out); \
fi

View File

@ -0,0 +1,470 @@
<?xml version="1.0"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
"http://docbook.org/xml/4.1.2/docbookx.dtd">
<article>
<articleinfo>
<title>Managing Accurate Date and Time HOWTO</title>
<copyright><year>2002</year><holder>Avi Alkalay</holder></copyright>
<authorgroup>
<author>
<firstname>Avi</firstname>
<surname>Alkalay</surname>
<affiliation>
<address>
<email>avi at br.ibm.com</email>
<email>avi at unix.sh</email>
</address>
<orgdiv>Senior IT and Software Architect :: OpenSource/Linux Solutions</orgdiv>
<orgname>IBM Linux Impact Team :: <ulink url="http://ibm.com/linux">ibm.com/linux</ulink></orgname>
</affiliation>
</author>
</authorgroup>
<pubdate>0.8 :: 2002/04/13</pubdate>
<revhistory>
<revision>
<revnumber>0.8</revnumber>
<date>14 Apr 2002</date>
<authorinitials>avi</authorinitials>
<revremark>Beter tunning of NTP graphic.</revremark>
</revision>
<revision>
<revnumber>0.76</revnumber>
<date>13 Apr 2002</date>
<authorinitials>avi</authorinitials>
<revremark>Inclusion of architecture graphic.</revremark>
</revision>
<revision>
<revnumber>0.75</revnumber>
<date>10 Apr 2002</date>
<authorinitials>avi</authorinitials>
<revremark>Spell checked. Using DocBook XSLT 1.50.</revremark>
</revision>
<revision>
<revnumber>0.65</revnumber>
<date>31 Mar 2002</date>
<authorinitials>avi</authorinitials>
<revremark>Upgraded to XML 4.1.2 DocBook format</revremark>
</revision>
<revision>
<revnumber>0.6</revnumber>
<date>29 Mar 2002</date>
<authorinitials>avi</authorinitials>
<revremark>Finished timezone mechanism on Linux. Created appendix. Now only drawings are needed.</revremark>
</revision>
<revision>
<revnumber>0.4</revnumber>
<date>24 Mar 2002</date>
<authorinitials>avi</authorinitials>
<revremark>All skeleton defined. All command examples written.</revremark>
</revision>
<revision>
<revnumber>0.2</revnumber>
<date>19 Mar 2002</date>
<authorinitials>avi</authorinitials>
<revremark>First DocBook version</revremark>
</revision>
</revhistory>
</articleinfo>
<section id="time"><title>Computer Global Date and Time Concept</title>
<para>To determine the current time for some planet region, a computer needs exactly this two informations:</para>
<orderedlist numeration="arabic">
<listitem><para>Correct <acronym>UTC</acronym> (universal time as in Greenwich, but not <acronym>GMT</acronym>) time</para></listitem>
<listitem><para>Region's current Time Zone</para></listitem>
</orderedlist>
<para>For computers, there is also the hardware clock, which is used as a base by the OS to set his time.</para>
<para>OS date and time (we'll use only date <emphasis>or</emphasis> time from now on) is set on boot, by some script that reads the hardware clock, makes Time Zone calculations (there is no time zone data stored in <acronym>BIOS</acronym>) and sets the OS. After this synchronization, <acronym>BIOS</acronym> and OS time are completely independent. So after a while they may have some seconds of difference. Which one is correct? If you don't make special configurations, none.</para>
<para>We'll discuss here how to make them both <emphasis>globally 100% accurate</emphasis>.</para>
</section>
<section id="tz"><title>What are Time Zones?</title>
<para>Time Zones are a geophysical world globe division of 15<superscript>o</superscript> each, starting at Greenwich, in England, created to help people know what time is it now in another part of the world.</para>
<para>Nowadays it is much more a political division then geophysical, because sometimes people needs to have the same time as other people in not-so-far locations. And for energy savings reasons, we have today the <link linkend="tz.dst">Daylight Savings Time</link>, that are also a Time Zone variation.</para>
<para>Time Zones are usually defined by your country government or some astronomical institute, and is represented by 3 or 4 letters. See <xref linkend="tz.examples"/> for examples.</para>
<para>If you want to know what time is it now in a different world region, you can use the <ulink url="http://www.timezoneconverter.com/">timezoneconverter.com</ulink> website.</para>
<section id="tz.dst"><title>Daylight Savings Time</title>
<para>For energy savings reasons, governments created the Daylight Savings Time. Our clocks are forwarded one hour, and this makes our days look longer. In fact, what really happens is only a Time Zone change. The primitive time (<acronym>UTC</acronym>) is still, and will allways be, the same.</para>
<para>Later we'll see how to enable and disable <acronym>DST</acronym> automatically in Linux.</para>
</section>
<section id="tz.examples"><title>Time Zones Examples</title>
<para>There is nothing better than examples:</para>
<table pgwide="0" id="tz.ex.br"><title>Brazilian Time Zones. Shifts relative to <acronym>UTC</acronym></title>
<tgroup cols="3">
<thead>
<row>
<entry>Name and Shift</entry>
<entry><link linkend="tz.dst"><acronym>DST</acronym></link> Name and Shift</entry>
<entry>Locations</entry>
</row>
</thead>
<tbody>
<row>
<entry>BREST -2:00</entry>
<entry>BREDT -1:00</entry>
<entry>Fernando de Noronha</entry>
</row>
<row>
<entry>BRST -3:00</entry>
<entry>BRDT -2:00</entry>
<entry>S&atilde;o Paulo, Rio, Brasilia, Minas Gerais, North East Region, South Region,etc</entry>
</row>
<row>
<entry>BRWST -4:00</entry>
<entry>BRWDT -3:00</entry>
<entry>West Region</entry>
</row>
<row>
<entry>BRAST -5:00</entry>
<entry>BRADT -4:00</entry>
<entry>Acre</entry>
</row>
</tbody>
</tgroup>
</table>
<para>Please send me contributions like this table for US Time Zone.</para>
</section>
<section id="tz.linux"><title>Time Zone Mechanism on Linux</title>
<para>Linux systems uses the GLIBC dynamic Time Zones, based on <filename>/etc/localtime</filename>. This file is a link to (or a copy of) a zone information file, usually located under <filename class="directory">/usr/share/zoneinfo</filename> directory.</para>
<para>From a geophysical perspective, there is only 360<superscript>o</superscript>/15<superscript>o</superscript>=24 Time Zones in the world. But to make things easy to people, and to accommodate all the political variations (like Daylight Savings Time), you'll find hundreds of zoneinfo files in <filename class="directory">/usr/share/zoneinfo</filename>, each for every world city, country, etc, and its not complete (it can never be).</para>
<para>Some countries, like Brazil, don't have a fixed day to start Daylight Savings Time. It is defined every year, a couple of months before summer, and you may end up in a situation you'll have to change your zoneinfo file, which was compiled by <command>zic</command> from a text file like this.</para>
<example><title>Brazilian Zone Info text file</title>
<programlisting>
# Brazil Time Zones
#
# Brazilian Time Zones are:
# BREST: East of Brasilia. Fernando de Noronha.
# BRST: Brasilia, S&atilde;o Paulo, Rio, Northeast, South etc
# BRWST: West of Brasilia. Mato Grosso, Manaus
# BRAST: Acre.
#
# In daylight saving time, letter 'S' changes to 'D'.
#
# To install, make:
#
# # zic Brazil.txt
#
# Zone files will be installed in /usr/share/zoneinfo (depends on your
# distribution). Then, make a symbolic link from your zone to /etc/localtime:
#
# # ln -sf /usr/share/zoneinfo/Brazil/Brasilia /etc/localtime
#
#
# If you have updates and new standards to this file please send to
#
# Avi Alkalay &lt;avi @ unix.sh&gt;
#
# Last update: 18 Nov 2000
# This file is available at http://avi.alkalay.net/linux/zoneinfo/
#
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
Rule Brazil 1931 1932 - Oct 3 0:00 1:00 D
Rule Brazil 1932 1933 - Mar 31 0:00 0 S
Rule Brazil 1949 only - Dec 1 0:00 1:00 D
Rule Brazil 1950 only - Apr 30 0:00 0 S
Rule Brazil 1950 1952 - Dec 1 0:00 1:00 D
Rule Brazil 1951 only - Apr 16 0:00 0 S
Rule Brazil 1952 only - Mar 31 0:00 0 S
Rule Brazil 1953 only - Feb 28 0:00 0 S
Rule Brazil 1963 only - Oct 23 0:00 1:00 D
Rule Brazil 1964 only - Mar 1 0:00 0 S
Rule Brazil 1965 only - Jan 31 0:00 1:00 D
Rule Brazil 1965 only - Mar 31 0:00 0 S
Rule Brazil 1965 only - Dec 1 0:00 1:00 D
Rule Brazil 1966 1968 - Mar 1 0:00 0 S
Rule Brazil 1966 1967 - Nov 1 0:00 1:00 D
Rule Brazil 1984 only - Nov 2 0:00 1:00 D
Rule Brazil 1985 only - Mar 15 0:00 0 S
Rule Brazil 1985 only - Nov 2 0:00 1:00 D
Rule Brazil 1986 only - Mar 15 0:00 0 S
Rule Brazil 1986 only - Oct 25 0:00 1:00 D
Rule Brazil 1987 only - Feb 14 0:00 0 S
Rule Brazil 1987 only - Oct 25 0:00 1:00 D
Rule Brazil 1988 only - Feb 7 0:00 0 S
Rule Brazil 1988 only - Oct 16 0:00 1:00 D
Rule Brazil 1989 only - Jan 29 0:00 0 S
Rule Brazil 1989 only - Oct 15 0:00 1:00 D
Rule Brazil 1990 only - Feb 11 0:00 0 S
Rule Brazil 1990 only - Oct 21 0:00 1:00 D
Rule Brazil 1991 only - Feb 17 0:00 0 S
Rule Brazil 1991 only - Oct 20 0:00 1:00 D
Rule Brazil 1992 only - Feb 9 0:00 0 S
Rule Brazil 1992 only - Oct 25 0:00 1:00 D
Rule Brazil 1993 only - Jan 31 0:00 0 S
Rule Brazil 1993 only - Oct 17 0:00 1:00 D
Rule Brazil 1994 only - Feb 20 0:00 0 S
Rule Brazil 1994 only - Oct 16 0:00 1:00 D
Rule Brazil 1995 only - Feb 19 0:00 0 S
Rule Brazil 1995 only - Oct 15 0:00 1:00 D
Rule Brazil 1996 only - Feb 11 0:00 0 S
Rule Brazil 1996 only - Oct 06 0:00 1:00 D
Rule Brazil 1997 only - Feb 16 0:00 0 S
Rule Brazil 1997 only - Oct 06 0:00 1:00 D
Rule Brazil 1998 only - Mar 01 0:00 0 S
Rule Brazil 1998 only - Oct 11 0:00 1:00 D
Rule Brazil 1999 only - Feb 21 0:00 0 S
Rule Brazil 1999 only - Oct 03 0:00 1:00 D
Rule Brazil 2000 only - Feb 27 0:00 0 S
Rule Brazil 2000 only - Oct 8 0:00 1:00 D
Rule Brazil 2001 only - Feb 18 0:00 0 S
# Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
Zone Brazil/DeNoronha -2:00 Brazil BRE%sT
Zone posix/Brazil/DeNoronha -2:00 Brazil BRE%sT
Zone right/Brazil/DeNoronha -2:00 Brazil BRE%sT
Zone Brazil/East -2:00 Brazil BRE%sT
Zone posix/Brazil/East -2:00 Brazil BRE%sT
Zone right/Brazil/East -2:00 Brazil BRE%sT
Zone America/Sao_Paulo -3:00 Brazil BR%sT
Zone America/Rio_de_Janeiro -3:00 Brazil BR%sT
Zone America/Brasilia -3:00 Brazil BR%sT
Zone posix/America/Sao_Paulo -3:00 Brazil BR%sT
Zone posix/America/Rio_de_Janeiro -3:00 Brazil BR%sT
Zone posix/America/Salvador -3:00 Brazil BR%sT
Zone posix/America/Brasilia -3:00 Brazil BR%sT
Zone posix/Brazil/Central -3:00 Brazil BR%sT
Zone posix/Brazil/Brasilia -3:00 Brazil BR%sT
Zone posix/Brazil/Sao_Paulo -3:00 Brazil BR%sT
Zone posix/Brazil/Salvador -3:00 Brazil BR%sT
Zone posix/Brazil/Rio_de_Janeiro -3:00 Brazil BR%sT
Zone right/America/Sao_Paulo -3:00 Brazil BR%sT
Zone right/America/Rio_de_Janeiro -3:00 Brazil BR%sT
Zone right/America/Salvador -3:00 Brazil BR%sT
Zone right/America/Brasilia -3:00 Brazil BR%sT
Zone right/Brazil/Central -3:00 Brazil BR%sT
Zone right/Brazil/Brasilia -3:00 Brazil BR%sT
Zone right/Brazil/Sao_Paulo -3:00 Brazil BR%sT
Zone right/Brazil/Salvador -3:00 Brazil BR%sT
Zone right/Brazil/Rio_de_Janeiro -3:00 Brazil BR%sT
Zone Brazil/Central -3:00 Brazil BR%sT
Zone Brazil/Brasilia -3:00 Brazil BR%sT
Zone Brazil/Sao_Paulo -3:00 Brazil BR%sT
Zone Brazil/Rio_de_Janeiro -3:00 Brazil BR%sT
Zone Brazil/Salvador -3:00 Brazil BR%sT
Zone Brazil/West -4:00 Brazil BRW%sT
Zone Brazil/Manaus -4:00 Brazil BRW%sT
Zone Brazil/Rondonia -4:00 Brazil BRW%sT
Zone Brazil/Roraima -4:00 Brazil BRW%sT
Zone Brazil/Mato_Grosso -4:00 Brazil BRW%sT
Zone posix/Brazil/Manaus -4:00 Brazil BRW%sT
Zone posix/Brazil/Mato_Grosso -4:00 Brazil BRW%sT
Zone right/Brazil/Manaus -4:00 Brazil BRW%sT
Zone right/Brazil/Mato_Grosso -4:00 Brazil BRW%sT
Zone posix/America/Manaus -4:00 Brazil BRW%sT
Zone right/America/Manaus -4:00 Brazil BRW%sT
Zone Brazil/Acre -5:00 Brazil BRA%sT
</programlisting>
</example>
<para>The <command>Rule</command> block defines the date and time we change the Time Zone, while in the <command>Zone</command> block we reference the <command>Rule</command> will manage it. Note that the <command>Zone</command> name is actually the file name under <filename class="directory">/usr/share/zoneinfo</filename> directory, and here we defined several different names for the same Time Zone, just to be easyer for people to find their zone.</para>
<para>This file's comments explains how to install these time zones, using the <command>zic</command> zoneinfo compiler (which already installs them also). To make it effective, you only have to link (or copy) the zoneinfo file to <filename>/etc/localtime</filename>. In some distributions, there is a higher level (and preferred) way to set the Time Zone, described in <xref linkend="set.tz"/>.</para>
<para>After making <filename>/etc/localtime</filename> pointing to the correct zoneinfo file, you are already under that zone rules and <acronym>DST</acronym> changes are automatic -- you don't have to change time manually.</para>
<para>The following commands sequence shows Linux Time Zone mechanics dynamism. Note they were all issued in less then one minute:</para>
<screen><prompt>bash$ </prompt><command>ls -al /etc/localtime</command>
lrwxrwxrwx 1 root root 35 May 22 2001 /etc/localtime -> <emphasis>/usr/share/zoneinfo/Brazil/Brasilia</emphasis>
<prompt>bash$ </prompt><command>date</command>
Fri Mar 29 20:13:38 <emphasis>BRST</emphasis> 2002
<prompt>bash# </prompt><command>ln -sf /usr/share/zoneinfo/GMT /etc/localtime</command>
<prompt>bash$ </prompt><command>date</command>
Fri Mar 29 23:13:47 <emphasis>GMT</emphasis> 2002
<prompt>bash# </prompt><command>ln -sf /usr/share/zoneinfo/Brazil/Brasilia /etc/localtime</command>
<prompt>bash$ </prompt><command>date</command>
Fri Mar 29 20:14:03 <emphasis>BRST</emphasis> 2002</screen>
<para>At 20:13, I was in my default brazilian Time Zone (BRST), then I switched to GMT and my system time changed to 23:13! When your Time Zone enters DST, you'll see a similar effect, but the rules are all inside your Time Zone (<filename>/etc/localtime</filename> link doesn't change like this example).</para>
<para>An application running in this machine (eg. web-server generating access logs) will feel this change, so it is very important for developers to remember that the full Time Concept is the current <emphasis>time</emphasis> plus current <emphasis>Time Zone</emphasis>, as described in <xref linkend="time"/>.</para>
<para>In the end, I switched back to my correct Time Zone.</para>
</section>
</section>
<section id="set"><title>The Correct Settings for Your Linux Box</title>
<para>For any OS installation, you must know your Time Zone. This is expressed in terms of a city, a state or a country. You must also decide how to set <acronym>BIOS</acronym> time, and we may follow two strategies here:</para>
<variablelist>
<varlistentry><term><emphasis>Linux Only Machine</emphasis></term>
<listitem>
<para>In this case you should set <acronym>BIOS</acronym> time to <acronym>UTC</acronym> time. <acronym>DST</acronym> changes will be dynamically managed by <link linkend="tz.linux">Time Zone configurations</link>.</para>
</listitem>
</varlistentry>
<varlistentry><term><emphasis>Dual Boot Linux and MS Windows Machine</emphasis></term>
<listitem>
<para>Windows handles time in a more primitive way than Linux. For Windows, <acronym>BIOS</acronym> time is allways your local time, so <acronym>DST</acronym> changes are more aggressive because they directly change hardware clock. And since both Linux and Windows initially get and set time from the hardware, when they are together, Linux must handle it in the same way. So set <acronym>BIOS</acronym> time to your localtime.</para>
</listitem>
</varlistentry>
</variablelist>
<section id="set.tz"><title>Setting Time Zone</title>
<para>On Red Hat Linux and derived systems, you can set the hardware clock strategy and Time Zone using the <command>timeconfig</command> command, that shows a user-friendly dialog. You can also use it non-interactively:</para>
<example><title>Time Configuration Tool</title>
<screen><prompt>bash# </prompt><command>timeconfig "Brasil/East"</command> # set HC to localtime, and TZ to "Brazil/East"
<prompt>bash# </prompt><command>timeconfig --utc "Brasil/East"</command> # set HC to UTC, and TZ to "Brazil/East"</screen>
</example>
<para>Anyway, it changes <filename>/etc/sysconfig/clock</filename> file that is read at boot time. You can edit it by hand, and that is how it looks:</para>
<example><title><filename>/etc/sysconfig/clock</filename> file</title>
<programlisting>
ZONE="Brazil/East"
UTC=true
ARC=false</programlisting>
</example>
</section>
<section id="set.hwclock"><title>Setting the Hardware Clock</title>
<para>I encourage you to only set your HC after understanding how to get accurate time, described on <xref linkend="ntp"/>.</para>
<para>The <command>hwclock</command> command reads and sets the HC, based on several options you give him, documented in its man page. But you don't have to use it if you have a modern Linux distribution. After defining your HC strategy and Time Zone, you can use the high level <command>setclock</command> command to correctly set your HC. You don't need to pass any parameters because <command>setclock</command> intelligently calls <command>hwclock</command> to set the <acronym>BIOS</acronym> based on your OS current date and time. <emphasis>So you should allways use the <command>setclock</command> command.</emphasis></para>
<para>But if you are a minimalist and prefer hard work, here are some <command>hwclock</command> examples:</para>
<example><title><command>setclock</command> and <command>hwclock</command> usage</title>
<screen><prompt>bash# </prompt><command>setclock</command> # The easy way to set HC
<prompt>bash# </prompt><command>hwclock</command> # reads HC
<prompt>bash# </prompt><command>hwclock --systohc --utc</command> # set HC with UTC time based on OS current time
<prompt>bash# </prompt><command>hwclock --systohc</command> # set HC with local time based on OS current time
<prompt>bash# </prompt><command>hwclock --set --date "22 Mar 2002 13:17"</command> # set HC with time specified on string</screen>
</example>
<para>Since the OS time is independent from the hardware clock, any <acronym>BIOS</acronym> change we make will take place in the next boot.</para>
<para>Another option to change HC is rebooting and accessing your computer <acronym>BIOS</acronym> screens. On <ulink url="http://ibm.com/servers/eserver/zseries/os/linux/">IBM e-server zSeries</ulink> platforms you'll have to do it on z/VM level, because Linux here runs on virtual machines created by z/VM.</para>
</section>
</section>
<section id="ntp"><title>Accurate Global Time Synchronization</title>
<para>To have accurate time in all your systems is as important as having a solid network security strategy (achieved by much more then simple firewall boxes). It is one of the primary components of a system administration based on good practices, which leads to organization and security. Specially when administering distributed applications, web-services, or even a distributed security monitoring tool, accurate time is a must.</para>
<section id="ntp.ntp"><title><acronym>NTP</acronym>: The Network Time Protocol</title>
<para>We'll not discuss here the protocol, but how this wonderfull invention, added to the pervasiveness of the Internet, can be usefull for us. You can find more about it at <ulink url="http://www.ntp.org/">www.ntp.org</ulink>.</para>
<para>Once your system is setup, <acronym>NTP</acronym> will manage to keep its time accurate, making very small adjustments to not impact the running applications.</para>
<para>People can get exact time using hardware based on atom's electrons frequency or cyclotrons. There is also a method based on <acronym>GPS</acronym> (Global Positioning System). The first is more accurate, but the second is pretty good also. Both require very special and expensive equipment, but their owners (usually universities and research labs) connects them to computers, that run an <acronym>NTP</acronym> daemon, that are connected to the Internet, that finally lets us access it for free. And this is how we'll synchronize our systems.</para>
</section>
<section id="ntp.arch"><title>Building a Simple Time Synchronization Architecture</title>
<para>You will need:</para>
<orderedlist numeration="arabic">
<listitem><para>A direct or indirect (through a firewall) connection to the Internet.</para></listitem>
<listitem><para>Choose some <acronym>NTP</acronym> servers. There is a list of <ulink url="http://www.eecis.udel.edu/~mills/ntp/servers.htm">public time servers</ulink> on <acronym>NTP</acronym> website. If you don't have an Internet access, your <acronym>WAN</acronym> administrator (must be a cleaver guy) can provide you some internal addresses.</para></listitem>
<listitem><para>Have the <acronym>NTP</acronym> package installed in all systems you want to synchronize. You can find RPMs in your favorite Linux distribution CD, or <ulink url="http://rpmfind.net/linux/rpm2html/search.php?query=ntp">make a search</ulink> on <ulink url="http://rpmfind.net/">rpmfind.net</ulink>.</para></listitem>
</orderedlist>
<para>Here is an example of good architecture:</para>
<figure><title>Local Relay Servers for NTP</title>
<graphic srccredit="ntp.prz (Lotus Freelance Graphics), Avi Alkalay, 2002" fileref="ntp.png" label="NTP Architecture" align="center"/>
</figure>
<para>If you have several machines to synchronize, <emphasis>do not</emphasis> make them all access the remote <acronym>NTP</acronym> servers you choosed. Only 2 of your server farm's machines must access remote <acronym>NTP</acronym> servers, and the other machines will sync with these 2. We will call them the <emphasis>Relay Servers</emphasis>.</para>
<para>Your Relay Servers can be any machine already available in your network. <acronym>NTP</acronym> consumes low memory and CPU. You don't need to have a dedicated machine for it.</para>
<tip><para>It is a good idea to create hostname aliases for your local Relay Servers like ntp1.mydomain.com and ntp2.maydomain.com, and use only these names when configuring the client machines. This way you can move the <acronym>NTP</acronym> functionality to a new Relay Server (with a different IP and hostname), without having to reconfigure the clients. Ask your <acronym>DNS</acronym> administrator to create this aliases.</para></tip>
</section>
<section id="ntp.configs"><title><acronym>NTP</acronym> Configurations</title>
<variablelist>
<varlistentry><term><emphasis>For Your Relay Servers</emphasis></term>
<listitem>
<para>Edit <filename>/etc/ntp.conf</filename> and add the remote servers you choosed:</para>
<example><title>Relay machines <filename>/etc/ntp.conf</filename></title>
<programlisting>
.
.
server otherntp.server.org # A stratum 1 server at server.org
server ntp.research.gov # A stratum 2 server at research.gov
.
.</programlisting>
</example>
</listitem>
</varlistentry>
<varlistentry><term><emphasis>For Your Clients</emphasis></term>
<listitem>
<para>Edit <filename>/etc/ntp.conf</filename> and add your Relay Servers with a standard name:</para>
<example><title>Client machines <filename>/etc/ntp.conf</filename></title>
<programlisting>
.
.
server ntp1.my.com # My first local relay
server ntp2.my.com # My second local relay
.
.</programlisting>
</example>
</listitem>
</varlistentry>
</variablelist>
<para>If your machine has a UTC time difference bigger then some minutes comparing to the <acronym>NTP</acronym> servers, <acronym>NTP</acronym> will not work. So you must do a first full sync, and I recommend you to do it in a non-production hour. You need to do it only when you are making the initial <acronym>NTP</acronym> setup. Never more:</para>
<example><title>First sync</title>
<screen><prompt>bash# </prompt><command>ntpdate otherntp.research.gov</command> <co id="sync1"/>
24 Mar 18:16:36 ntpdate[10254]: step time server 200.100.20.10 offset -15.266188 sec
<prompt>bash# </prompt><command>ntpdate otherntp.research.gov</command> <co id="sync2"/>
24 Mar 18:16:43 ntpdate[10255]: adjust time server 200.100.20.10 offset -0.000267 sec</screen>
<calloutlist>
<callout arearefs="sync1">
<para>First full sync. We were 15 seconds late.</para>
</callout>
<callout arearefs="sync2">
<para>Second full sync, just to be sure. Now we are virtually 0 seconds late, which is good.</para>
</callout>
</calloutlist>
</example>
<para>The last step is to start or restart the <acronym>NTP</acronym> daemons in each machine:</para>
<screen><prompt>bash# </prompt><command>service ntpd restart</command></screen>
</section>
<section id="ntp.watch"><title>Watching Your Box Synchronizing</title>
<para>Now you have everything setup. <acronym>NTP</acronym> will softly keep your machine time synchronized. You can watch this process using the <command>ntpdc</command> command:</para>
<example><title>A time synchronization status</title>
<screen>
<prompt>bash# </prompt><command>ntpdc -c peers</command>
remote local st poll reach delay offset disp
=======================================================================
=LOCAL(0) 127.0.0.1 7 64 377 0.00000 0.000000 0.43828
=ntp.server.org 200.218.38.134 2 64 377 0.44949 -0.023418 0.44000
=otherntp.resear 200.218.38.134 2 64 377 0.22252 -0.024405 0.93861</screen>
</example>
<variablelist><title>The meaning of each column</title>
<varlistentry><term><emphasis>remote</emphasis></term>
<listitem>
<para>Is the name of the remote <acronym>NTP</acronym> server. If you use the <option>-n</option> switch, you will see the IP addresses of these servers instead of their hostnames.</para>
</listitem>
</varlistentry>
<varlistentry><term><emphasis>local</emphasis></term>
<listitem>
<para>Your local IP address used to communicate with remote servers.</para>
</listitem>
</varlistentry>
<varlistentry><term><emphasis>st</emphasis></term>
<listitem>
<para><emphasis>Stratum</emphasis> is a number from 1 to 16, to indicate the remote server precision. 1 is the most accurate, 16 means server unreachable. Your Stratum will be equal to the less accurate remote server plus 1.</para>
</listitem>
</varlistentry>
<varlistentry><term><emphasis>poll</emphasis></term>
<listitem>
<para>??????????????????????????? Contribute !</para>
</listitem>
</varlistentry>
<varlistentry><term><emphasis>reach</emphasis></term>
<listitem>
<para>This is an octal representation of an array of 8 bits, representing the last 8 times the local machine tried to reach the server. The bit is set if the remote server was reached.</para>
</listitem>
</varlistentry>
<varlistentry><term><emphasis>delay</emphasis></term>
<listitem>
<para>The amount of time (seconds) needed to receive a response for a "what time is it" request.</para>
</listitem>
</varlistentry>
<varlistentry><term><emphasis>offset</emphasis></term>
<listitem>
<para>The most important value. The difference of time between the local and remote server. In the course of synchronization, the offset time lowers down, indicating that the local machine time is getting more accurate.</para>
</listitem>
</varlistentry>
<varlistentry><term><emphasis>disp</emphasis></term>
<listitem>
<para>??????????????????????????? Contribute !</para>
</listitem>
</varlistentry>
</variablelist>
</section>
<section id="ntp.boot"><title>Configure to Automatically Run <acronym>NTP</acronym> at Boot</title>
<para>You may want to have <acronym>NTP</acronym> running all the time even if you reboot your machine. On each machine, do the following:</para>
<screen><prompt>bash# </prompt><command>chkconfig --level 2345 ntpd on</command></screen>
<para>This will ensure autostart.</para>
<para>If your machine is up and running for a long time (months, years) without rebooting, you'll find a big discrepancy between the inaccurate hardware clock and the (now very accurate) system time. Modern Linux distributions copy OS time to the HC everytime the system is shutdown, using a <link linkend="set.hwclock">mechanism similar to the <command>setclock</command> command</link>. This way, in the next OS boot, you'll get date and time almost as accurate as it was when you shutdown.</para>
</section>
</section>
<appendix id="about"><title>About this Document</title>
<para>Copyright 2002, Avi Alkalay.</para>
<para>This document must be distributed under the terms of <ulink url="http://www.gnu.org/copyleft/fdl.html">GNU Free Documentation License</ulink>. Everybody in invited to contribute to his content and ideas.</para>
<para>The source SGML, other formats, and a nice rendered HTML style can be found at <ulink url="http://avi.alkalay.net/linux/docs/TimePrecision/">http://avi.alkalay.net/linux/docs/TimePrecision/</ulink>.</para>
</appendix>
</article>

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.