Administracja czasem w Debianie
Wstęp
Ten artykuł jest tłumaczeniem rozdziału ''Czas'' pochodzącego z ''Podręcznika Administratora Systemu Debian''. Autorem rozdziału jest Tapio Lehtonen. Opisano w nim takie zagadnienia jak czas sprzętowy i systemowy, czas lokalny i UTC, ustawianie i synchronizacja czasu.
Prawa autorskie
Copyright © 1998 Tapio Lehtonen
Copyright © polskiego tłumaczenia 2001 Paweł Tęcza
Ten dokument może być rozprowadzany jedynie na warunkach określonych w licencji GNU GPL (ang. General Public License), wersja 2. lub późniejsza (według własnego uznania).
Spis treści
1. Czas
Komputery używają zegara do odmierzania czasu. Zwykle jest to zegar sprzętowy z baterią, która podtrzymuje odmierzanie czasu, gdy komputer jest wyłączony. System operacyjny (na przykład Linux) uruchamia także swój własny zegar, który jest pokazywany przez takie komendy jak date w Linuxie czy time w DOS-ie.
Zegar sprzętowy jest zwykle wystarczająco dokładny, pod warunkiem, że bateria się nie wyczerpała. Jeśli czas pokazywany przez komputer w momencie jego włączenia różni się od prawidłowego o kilka miesięcy lub lat, to warto sprawdzić czy bateria nadaje się jeszcze do użycia.
Czas odmierzany przez zegar systemowy zwykle ulega pewnym wahaniom, stałym lub przypadkowym, na przykład zegar chodzi zbyt szybko lub zbyt wolno. Z tego też powodu, jeśli potrzebny jest nam dokładny czas, to zachodzi konieczność używania innego, dokładniejszego zegara do synchronizacji zegara systemowego.
Aby zobaczyć czas w systemie Debian GNU/Linux, użyj komendy date. Na przykład
$ date
Fri Oct 23 04:45:51 EEST 1998
Powyższa komenda wyświetla dzień tygodnia, miesiąc, dzień miesiąca, czas, strefę czasową i rok. Strefa czasowa pokazuje także czy używany jest czas letni. W tym przykładzie, strefą czasową jest EET (ang. Eastern European Time - czas wschodnioeuropejski), zaś dodatkowa litera 'S' oznacza czas letni.
W systemie Debian GNU/Linux i innych Unixach, komenda time nie pokazuje wcale czasu, lecz jest używana do sprawdzania czasu wykonywania danego polecenia. Jeśli masz jakąś komendę, której wykonanie zabiera sporą ilość czasu i nie masz ochoty mierzyć go ze stoperem w ręku, to możesz sprawdzić czas wykonywania tej komendy, podając jej nazwę jako parametr polecenia time. Poniższy przykład powinien wszystko wyjaśnić:
$ time sleep 60
real 1m0.045s
user 0m0.000s
sys 0m0.000s
Jeśli masz uprawnienia roota, to możesz zmienić czas również za pomocą komendy date (zobacz stronę podręcznika date(1)). Jeśli zaś jesteś podłączony do Internetu lub masz w swojej sieci LAN inne komputer pracujące pod kontrolą systemu Unix, to spójrz na sekcję ''Synchronizacja czasu, program rdate i NTP'', w której pokazano łatwiejsze sposoby ustawiania czasu.
Ustawianie czasu ręcznie, zwłaszcza podawanie łańcucha z czasem może być trochę kłopotliwe, gdyż komenda date --set akceptuje datę i czas w wielu formatach. Więcej o akceptowalnych formatach możesz przeczytać w dokumencie na temat pakietu sh-utils (info sh-utils). Możesz też wykorzystać poniższy przykładu. W przykładzie tym data jest podana w formacie RRRR-MM-DD (Rok-Miesiąc-DzieńMiesiąca) zgodnym ze standardem ISO 8601, a czas w formacie 24-godzinnym. Cyfry 0 na początku są wymagane.
date --set 1998-11-02
date --set 21:08:00
Powyższe dwie komendy ustawiają date na 2 grudzień 1998 roku, a czas na 8 minut po godzinie 21.
Aby zobaczyć czas w formacie UTC (ang. Universal Time Coordinated - czas uniwersalny, skoordynowany z czasem w Greenwich), użyj komendy date -u.
Jeśli używasz systemu X Window, to możesz mieć wyświetlacz zegara w dowolnym miejscu ekranu. Uzyskasz go, na przykład uruchamiając komendę xclock, która jest częścią pakietu xbase. Domyślnie xclock wyświetla czas w postaci analogowej (ze wskazówką minutową, godzinową i opcjonalnie sekundową). Możesz też wyświetlać czas w postaci cyfrowej (za pomocą komendy xclock -digital). Więcej informacji znajdziesz na stronie podręcznika xclock(1).
2. Ustawianie czasu, stref czasowych i czasu letniego
Gdy już zainstalowałeś podstawowy system Debian GNU/Linux, to ustaw strefę czasową. Możesz sprawdzić jaka strefa czasowa jest ustawiona patrząc na plik /etc/timezone. Informacje na temat zmiany konfiguracji strefy czasowej znajdziesz w sekcji ''Zmiana strefy czasowej już po instalacji''.
$ cat /etc/timezone
Europe/Helsinki
Od tłumacza: w przypadku polskich użytkowników Debiana plik /etc/timezone powinien zawiarać strefę czasową Europe/Warsaw.
Strefa czasowa jest potrzebna, gdyż komputery pracujące pod kontrolą systemu Unix odmierzają czas uniwersalny (UTC), zaś czas lokalny jest obliczany na podstawie czasu uniwersalnego. UTC jest czasem słonecznym na południku 0. Poprzednio był nazywany czasem GMT (ang. Greenwich Mean Time), ponieważ południk 0 przechodzi przez stare Królewskie Obserwatorium Astronomiczne w Greenwich, które jest częścią Londynu w Anglii.
Czas UTC jest stały i nie podlega zmianom na czas letni ani żadne inne. Dzięki temu znakomicie nadaje się do synchronizacji komputerów. Tak długo jak czasem bazowym będzie UTC, komputery na całym świecie mogą być zsynchronizowane i utrzymywać własny czas lokalny.
Jeśli ustawisz swój komputer z systemem Debian GNU/Linux tak, aby używał czasu lokalnego, bez wykorzystania strefy czasowej, to stracisz korzyść automatycznego przejścia na czas letni. Nie polecamy Ci tego! Jednakże zdarzają się sytuacje, w których zachodzi konieczność ustawienia Twojego zegara sprzętowego tak, aby odmierzał czas lokalny (spójrz na sekcję ''Uruchamianie systemów operacyjnych, które nie rozumieją strefy czasowej''). W tym dokumencie zakładamy, że ustawiłeś swój komputer na czas UTC.
Jeśli strefa czasowa jest poprawnie ustawiona i jej pliki konfiguracyjne są w miare aktualne, to lokalny czas pokazywany przez system operacyjny zmieni się na czas letni i powróci automatycznie do normalnego czasu w odpowiednim momencie. Jeśli Twoje pliki strefy czasowej są stare, to możesz mieć problem, gdyż data przejścia na czas letni i powrotu z niego nie jest określona przez żadne fizyczne zjawisko, lecz wybierana przez narodowe instytucje. Czasami daty te są zmieniane, na przykład w 1995 roku Unia Europejska zmieniła datę zakończenia czasu letniego z ostatniej soboty we wrześniu na ostatnią niedzielę października.
Z tego też powodu, powinieneś upewnić się czy Twój pakiet libc6 jest w miarę aktualny, gdyż zawiera on dane związane ze strefą czasową od wydania systemu Debian GNU/Linux 2.2 (włącznie).
2.1. Zmiana strefy czasowej już po instalacji
Jeśli strefa czasowa nie jest ustawiona lub jest ustawiona niepoprawnie, to administrator systemu może uruchomić program tzconfig w celu skonfigurowania strefy czasowej już po instalacji systemu (zobacz stronę podręcznika tzconfig(8)).
Jeśli z komputera tego korzystają także inni użytkownicy, to dobrze jest poinformować ich, że strefa czasowa została zmieniona.
2.2. Ustawianie zmiennej środowiskowej TZ
Jeśli nie masz uprawnień roota lub chcesz ustawić dla siebie inną strefę czasową niż ta ustawiona w systemie, to możesz do tego celu wykorzystać zmienną środowiskową TZ. Użyj komendy tzselect, aby zobaczyć jaką wartość ma zmienna TZ.
Przykład użycia zmiennej TZ:
$ date
Sun Nov 1 19:49:38 EET 1998
$ export TZ=PST
$ date
Sun Nov 1 17:49:59 PST 1998
Jak widzisz, dla tego użytkownika komenda date pokazuje inny czas. Zdaje się jednak, że nie jest on poprawny, gdyż czas PST (ang. Pacific Standard Time) powinien być 09:49:59??? Co się dzieje???
3. Ustawianie i wyświetlanie zegara sprzętowego
Komendą, która pokazuje czas zegara sprzętowego jest hwclock. (Nie było jej w Debianie przed wydaniem 2.0. Wcześniejsze wydania systemu posiadały komendę clock).
Jeśli używasz komendy date do zmiany czasu, to warto też ustawić poprawny czas na zegarze sprzętowym. W przeciwnym przypadku, czas będzie nieprawidłowy po następnym restarcie komputera, ponieważ zegar sprzętowy podtrzymuje odmierzanie czasu, gdy zasilanie jest wyłączone. Jeśli zegar systemowy jest odmierzany poprawnie, to ustaw zegar sprzętowy w następujący sposób:
dilbert# date
Sun Nov 1 18:56:50 EET 1998
dilbert# hwclock --systohc --utc
dilbert#
Pamiętaj o dodaniu opcji --utc jeśli zegar sprzętowy ma być ustawiony na czas UTC!
Więcej informacji na temat komendy hwclock znajdziesz na stronie podręcznika hwclock(8).
Co najmniej od wersji 2.2 Debiana (włącznie), system automatycznie zapisuje czas systemowy do zegara sprzętowego w trakcie wyłączania komputera i ustawia czas systemowy na podstawie zegara sprzętowego, gdy Debian jest uruchamiany. Czynności te wykonuje skrypt /etc/init.d/hwclock.sh.
4. Uruchamianie systemów operacyjnych, które nie rozumieją strefy czasowej
Jeśli na swoim komputerze masz zainstalowane także inne systemy operacyjne i w czasie uruchamiania komputera wybierasz system, który ma być wystartowany, to możesz mieć problemy z uzyskaniem prawidłowego czasu. Jeśli inne systemy operacyjne nie rozumieją stref czasowych, to myślą one, że czas UTC jest czasem lokalnym i pokazują nieprawidłowy czas (chyba, że mieszkasz w Londynie, w Anglii lub innym miejscu, w którym obowiązuje taka sama strefa czasowa).
Systemy operacyjne DOS, OS/2 i Windows (z wyjątkiem NT) nie używają stref czasowych. Jeśli potrzebujesz mieć poprawny czas lokalny w tych systemach, to musisz ustawić zegar na czas lokalny. System Debian GNU/Linux może oczywiście również działać z takim czasem, ale jeśli Twoje główne systemy operacyjne rozumieją strefy czasowe, to używaj ich.
5. Synchronizacja czasu, program rdate i protokół NTP
Jeśli masz jeszcze inny komputer z Unixem, który prawidłowo odmierza czas i posiadasz uprawnienia roota, to możesz ustawić czas także przy użyciu programu rdate. Na przykład:
rdate jakaś_stacja.domena.com
Nawet jeśli nie masz dokładnego źródła czasu, to dobrym pomysłem jest ustawienie takiego samego czasu na wszystkich Twoich komputerach, choćny po to, aby móc porównać czasy ostatniej modyfikacji plików pomiędzy stacjami. Do synchronizacji zegarów na Twoich komputerach możesz raz dzienne uruchamiać program rdate przy pomocy crona.
5.1. Ustawianie czasu w trakcie startu systemu
Nawet jeśli zegar sprzętowy nie pokazuje prawidłowego czasu, to istnieje sposób ustawienia poprawnego czasu w trakcie uruchamiania systemu operacyjnego. Do tego celu jest jednak potrzebny inny komputer w Twojej sieci LAN, z którego można pobrać czas. Poniżej pokazano przykład:
Stwórz plik /etc/init.d/rdate na podobieństwo poniższego
$ cat rdate
#! /bin/sh
#
# rdate Wykonaj komendę rdate.
#
# Wersja: 1998-11-01 tapio.lehtonen@iki.fi
#
PATH=/sbin:/bin:/usr/sbin:/usr/bin
HOST=dilbert
# Ustaw czas systemowy z innej stacji w sieci LAN.
if [ -x /usr/sbin/rdate ]
then
/usr/sbin/rdate $HOST
fi
Ustaw prawa do wykonywania pliku
chmod a+rx /etc/init.d/rdate
W katalogu /etc/rc2.d stwórz dowiązanie symboliczne do tego pliku (od tłumacza: dowiązanie do pliku /etc/init.d/rdate powinno być utworzone w katalogu /etc/rc?.d, gdzie ? oznacza tzw. runlevel ustawiony w pliku /etc/inittab).
cd /etc/rc2.d
ln -s ../init.d/rdate S19rdate
Po następnym restarcie komputera, powinieneś zobaczyć już ustawiony czas.
Pamiętaj o ustawieniu praw do wykonywania pliku /etc/init.d/rdate. W nazwie dowiązania nieprzypadkowo pojawił się ciąg "S19". Dzięki niemu skrypt rdate zostanie wykonany po skrypcie netbase, który uruchamia sieć, a przed skryptem xntp3 i innymi procesami, do których działania potrzebny jest ustawiony czas.
5.2. Ustawianie czasu przy pomocy protokołu NTP
Jeśli jesteś podłączony do Internetu, to możesz zainstalować klienta NTP, na przykład pakiet ntp lub xntp3, które można znaleźć w Debianie 2.1 lub późniejszych wydaniach. Używają one protokołu NTP (ang. Network Time Protocol) opisanego w dokumencie RFC 1305 do synchronizacji zegarów z dokładnością kilku dziesiątych milisekundy. Jeśli potrzebujesz takiej precyzji zegara lub nawet większej, to spójrz na sekcję ''Zegary radiowe''.
Doskonałą dokumentację do pakietu ntp znajdziesz w pakiecie ntp-doc. Jest ona bardzo dokładna i dlatego długa. Jeśli uważasz, że czytanie dokumentów jest stratą czasu, to poproś swojego dostawcę Internetu lub administratora systemu o podanie nazw serwerów NTP. Możesz też spojrzeć na "Listę Publicznych Serwerów NTP", która jest dostępna na stronie http://www.eecis.udel.edu/~mills/ntp/servers.html. Gdy zaczniesz używać serwera NTP, to wypadałoby poinformować administratora systemu o tym fakcie.
Nie konfiguruj Twojego systemu z serwerami NTP z pierwszego poziomu zapytań! Jeśli myślisz, że powinieneś tak zrobić, to prawie na pewno się mylisz!
Gdy znasz już serwer NTP, wyedytuj plik /etc/ntp.conf i dodaj do niego przynajmniej jeden serwer. Poniżej znajduje się przykład:
# /etc/ntp.conf, konfiguracja dla xntpd
logfile /var/log/xntpd
driftfile /var/lib/ntp/ntp.drift
statsdir /var/log/ntpstats/
statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable
server ntp.jakaś_domena.coś_tam
server ntp.coś.innego
Zwróć uwagę, że w powyższym przykładzie zmieniłem aktualną nazwę serwera. Zrobiłem tak, aby zapobiec ślepemu używaniu tego samego serwera NTP przez wszystkich użytkowników systemu Debian GNU/Linux. Wszystkie pozostałe linie nie uległy zmianie po instalacji pakietu xntp3.
Jeśli nie masz stałego połączenia z Internetem, to uruchamianie klienta NTP nie jest dobrym pomysłem. Klient NTP synchronizuje czas dosyć często i potrzebuje do tego stałego podłączenia do Internetu. Jeśli łączysz się z Internetem przez modem, to możesz uruchamiać komendę ntpdate (również znajduje się w pakiecie ntp), aby synchronizować czas przy każdym połączeniu z Siecią.
Inną możliwością jest takie ustawienie demona cron, aby raz dzienne uruchamiał program ntpdate. Zapewni to wystarczająco dobrą dokładność dla większości użytkowników. Poniżej pokazano przykład skryptu, który wykonywany przez crona będzie uruchamiać program ntpdate. Skrypt ten zakłada, że plik /etc/ntp.conf jest poprawnie ustawiony, ponieważ to z tego własnie pliku pobiera nazwy serwerów NTP.
dilbert# cat /etc/cron.nightly/ntpdate
#!/bin/sh
#
# Ostatnia modyfikacja: Sat Aug 8 05:27:07 EEST 1998
# ntpdate uruchamiany przez crona co noc
NTPDATE=/usr/sbin/ntpdate
LOGFILE=/var/log/xntpd
NTPCONFFILE=/etc/ntp.conf
NTPSERVERS=
GREP=/usr/bin/grep
CUT=/usr/bin/cut
if [ -f $NTPCONFFILE ] ; then
echo "===========================" >> $LOGFILE
echo "<<< `date` " >> $LOGFILE
for i in `grep ^server $NTPCONFFILE | $CUT --fields 2 --delimiter \ `
do
NTPSERVERS="$NTPSERVERS $i"
done
$NTPDATE $NTPSERVERS >> $LOGFILE
###echo $NTPDATE $NTPSERVERS $LOGFILE
echo ">>> `date` " >> $LOGFILE
fi
exit 0
dilbert#
5.3. Inne metody
Debian GNU/Linux posiada także komendę netdate (więcej na jej temat znajdziesz na stronie podręcznika netdate(8L)), która używa protokołu zdefiniowanego w dokumencie RFC 868.
6. Ustawianie serwera NTP
Jeśli masz kilka maszyn, które chcesz zsynchronizować, to nie powinieneś synchronizowac ich oddzielnie przy pomocy zewnętrznego serwera NTP. Taki sposób niepotrzebnie obciąży serwer NTP. Jeśli jest to publiczna lub bezpłatna usługa, to ludzie mogą przestać Cię lubić! Przynajmniej zapytaj aministratora serwera NTP czy możesz tak synchronizować swoje wszystkie komputery.
Lepszym pomysłem jest synchronizować jedną z Twoich stacji z zewnętrznym serwerem NTP, a resztę za pomocą Twojego własnego serwera NTP. Odpowiedni serwer zawiera również pakiet ntp. Musisz tylko skonfigurować go. Nie jest to szczególnie trudne, ale powinieneś przeczytać najpierw dokumentację raz zrozumieć koncepcję i hierarchię warstw.
7. Zegary radiowe
Jeśli potrzebujesz większej dokładności lub nie możesz synchronizować swojego zegara przy pomocy podłączonego do Internetu serwera NTP, to możesz nabyć zegar radiowy. Pobiera on czas z bardzo dokładnych serwerów czasu, które emitują sygnały czasowe przy pomocy fal radiowych.
Istnieją zegary radiowe, które potrzebują naziemnych przekaźników w pobliżu, aby odbierać sygnały. Jeśli posiadasz taki zegar, to upewnij się, że możesz odbierać sygnały w miejscu, w którym zamierzasz go użyć. Pamiętaj, że przekaźniki są naziemne, a więc nie mogą pracować na całym świecie.
Inny rodzaj zegarów radiowych używa systemu GPS (ang. Global Positioning System). Satelity GPS krążą wokół Ziemi na niskich orbitach i zawsze co najmniej cztery z nich powinny znajdować się nad horyzontem. Satelity te są głównie używane do navigacji, ale z zasady pracują w oparciu o wysyłanie sygnałów czasowych. Do synchronizacji czasu wystarczy pobrać sygnał z jednego satelity, lecz zwykle konieczne jest zainstalowanie anteny GPS na zewnątrz budynku dla lepszego odbioru.
8. Czas ostatniej modyfikacji pliku
Czas ostatniego zapisu do pliku jest przechowywany w postaci czasu UTC. Komenda ls -l pokazuje czas ostatniej modyfikacji z uwzględnieniem strefy czasowej. Ponieważ czasy ostatniego zapisu są czasami UTC, to mogą być porównywane pomiędzy różnymi komputerami. Jeśli zegary na nich nie są zsynchronizowane, to może to prowadzić do problemów.
Rozważmy taką systuację: logujesz się do stacji B, na której NFS ładuje Twój katalog domowy z serwera NFS na stacji A. Następnie edytujesz jakiś plik, zapisujesz go i uruchamiasz komendę make. Jeśli zegary na stacji A i B nie są ze sobą zsynchronizowane, to program make może zgłosić błąd, że plik był ostatnio modyfikowany w przyszłości lub może nie skompilować go, ponieważ wynikowy obiekt jest nowszy.
9. Czas w cronie
Demon cron używa do swojej pracy czasu lokalnego. Oznacza to, że jeśli tak skonfigurujesz crona, aby uruchamiał jakiś program o godzinie 7 rano, to będzie to godzina 7 rano czasu lokalnego obliczanego na podstawie strefy czasowej systemu.
O ból głowy mogą przyprawiać sytuacje, w których strefa czasowa systemu nie jest taka sama jak strefa ustawiona przy pomocy zmiennej środowiskowej TZ lub gdy masz dwie stacje w innych strefach czasowych i na obu stacjach coś musi być uruchamiane w tym samym czasie.
Copyleft
Pafcio. All rights reversed.
Ostatnia modyfikacja: Nd 16-12-2001 20:10:55