точное управление временем и датой на Linux-системах

общие концепции даты и времени

Для определения текущего времени в некотором регионе планеты, компьютеру необходимо знать две вещи:
1. Правильное всеобщее скоординированное время (UTC, всеобщее время, такое же, как и в Гринвиче, но не GMT).
2. Часовой пояс текущего региона.
В компьютерах, кроме того, существуют аппаратные часы, которые используются для установки времени операционной системы.
Дата и время операционной системы (с этого момента мы будем пользоваться словами "дата" или "время") устанавливаются при загрузке специальным скриптом, который считывает значение аппаратных часов, производит вычисление часового пояса (в BIOS не хранится информация о часовом поясе) и устанавливает часы операционной системы. После этого, часы операционной системы и BIOS полностью независимы. Следовательно, через некоторое время между ними может быть разница в несколько секунд. Какие же часы содержат правильное время? Если вы не делали специальных настроек -- ни те, ни другие.
В этом документе мы обсудим, как сделать, чтобы время этих часов максимально точным.

что такое часовые пояса?

Часовые пояса -- это геофизическое деление земного шара на части по 15 градусов каждая, начиная с Гринвича, что в Англии. Это деление было введено затем, чтобы помочь людям узнать текущее время в других частях света. Идею часовых поясов предложил канадский инженер-связист С.Флемминг.

В наши дни это деление принимает и политическую окраску, так как иногда людям нужно, чтобы их время совпадало со временем в других, не очень отдаленных, местах. Более того, существует понятие летнего времени, которое позволяет более эффективно использовать световой день.

Часовой пояс обычно определяется правительством государства, либо неким астрономическим институтом, и представляется в виде аббревиатуры из трех или четырех букв.
Если вы хотите узнать текущее время в разных регионах нашей планеты, это можно сделать на странице timezoneconverter.com.

летнее время

По соображениям экономного использования энергии и максимального использования светового дня, правительства создали понятие летнего времени. Наши часы переводятся на час вперед, что позволяет людям эффективней использовать световой день. Фактически, это реализуется в пределах понятия часового пояса. Исходное время (UTC) остается неизменным.

Ниже мы узнаем, как автоматически включать и выключать летнее время в Linux.

примеры часовых поясов

Нет ничего лучше примеров.

Таблица 1. Бразильские часовые пояса. Сдвиг относительно UTC.



Название и сдвигНазвание летнего времени и сдвигМестоположение
BREST -2:00BREDT -1:00Fernando de Noronha
BRST -3:00BRDT -2:00Sao Paulo, Rio, Brasilia, Minas Gerais, North East Region, South Region, etc
BRWST -4:00BRWDT -3:00West Region
BRAST -5:00BRADT -4:00Acre


механизм часовых поясов в Linux

Системы Linux используют динамические часовые пояса GLIBC, основанные на /etc/localtime. Этот файл представляет собой ссылку на (или копию) информационный файл зоны, обычно расположенный в каталоге /usr/share/zoneinfo.

С геофизической точки зрения существуют 60°/15°=24 часовых пояса. Но для упрощения и учета различных политических вариаций (таких, как летнее время), в каталоге /usr/share/zoneinfo вы найдете сотни файлов для множества городов и стран, хотя, конечно, не для всех.
В некоторых странах, например, в Бразилии, нет фиксированной даты начала летнего времени. Она определяется каждый год, за несколько месяцев до начала лета, и вы можете оказаться в ситуации, когда придется изменять информационный файл зоны, созданный командой zic из текстового файла, пример которого приведен ниже.
/* А я считал, что это только у нас в стране [читающий выбирает свою страну] такой бардак. :) - прим. переводчика. */

Вот пример текстового информационного файла бразильских часовых поясов.

# Brazil Time Zones
#
# Brazilian Time Zones are:
# BREST: East of Brasilia. Fernando de Noronha.
# BRST: Brasilia, Sao 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
#
# Last update: 18 Nov 2000
# This file is available atсайт
#
# 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


Блок Rule определяет дату и время изменения часового пояса; в блоке Zone мы ссылаемся на Rule, которым будем руководствоваться. Обратите внимание, что имя записи Zone в действительности соответствует имени файла относительно каталога /usr/share/zoneinfo. В файле определено несколько различных имен для одного и того же часового пояса, просто для того, чтобы людям легче было найти их часовой пояс.

Комментарии в этом файле поясняют, как установить часовой пояс с помощью компилятора zic (который уже включает описания часовых поясов). Чтобы активизировать установленный часовой пояс, вам остается создать ссылку (или копию) на информационный файл зоны в /etc/localtime. В некоторых дистрибутивах применяется более высокоуровневый (и предпочтительный) подход к установке часового пояса.

После того, как файл /etc/localtime начнет ссылаться на верный информационный файл зоны, система сразу же начинает обрабатывать время в соответствии с правилами выбранного часового пояса, а переход на летнее время будет осуществляться автоматически -- вам ничего не нужно менять вручную.

Следующий набор команд демонстрирует гибкость механизма часовых поясов в Linux. Обратите внимание, что все команды были выполнены менее чем за одну минуту:

bash$ ls -al /etc/localtime
lrwxrwxrwx 1 root root 35 May 22 2001 /etc/localtime ->/usr/share/zoneinfo/Brazil/Brasilia
bash$ date
Fri Mar 29 20:13:38 BRST 2002
bash# ln -sf /usr/share/zoneinfo/GMT /etc/localtime
bash$ date
Fri Mar 29 23:13:47 GMT 2002
bash# ln -sf /usr/share/zoneinfo/Brazil/Brasilia /etc/localtime
bash$ date
Fri Mar 29 20:14:03 BRST 2002


В 20:13 я находился в своем бразильском часовом поясе (BRST). Я переключился в часовой пояс GMT и мое время изменилось на 23:13! Когда в вашем часовом поясе подходит дата перехода на летнее время, происходит нечто подобное, но без смены часового пояса (т.е. ссылка /etc/localtime не меняется, как в приведенном примере).

Приложения, запущенные на машине (например, веб-сервер, генерирующий журнал доступа) почувствует такое изменение, потому очень важно, чтобы разработчики помнили: концепция полного времени -- это текущее время, плюс текущий часовой пояс, как описано выше.
В конце примера я вернулся к своему часовому поясу.

корректная настройка вашей системы Linux

Для любой операционной системы вам нужно знать ваш часовой пояс. Он соответствует вашему городу или стране. Кроме того, вам нужно будет решить, как установить время в BIOS. Могу вам предложить две стратегии:
Машина только для Linux. В этом случае установите время в BIOS равным всеобщему скоординированному времени (UTC). Переходы на летнее время будут автоматически выполняться в соответствии с настройками часового пояса.
Машина с двумя ОС: Linux и MS Windows. Windows работает со временем более примитивно, чем Linux. Для Windows время в BIOS - это всегда ваше местное время, а переход на летнее время более агрессивный, поскольку при этом вносятся изменения в аппаратные часы. А поскольку как Linux, так и Windows при загрузке получают время из аппаратных часов, в случае двух ОС на одном компьютере Linux должен обрабатывать время таким же образом, как и Windows. Потому устанавливайте время в BIOS равным вашему местному времени.

установка часового пояса

В системе Red Hat Linux и ее производных установить часовой пояс можно с помощью утилиты timeconfig, которая имеет приятный пользовательский интерфейс. Но можно использовать утилиту и в пакетном режиме.
Устанавливаем время аппаратных часов равным местному, а часовой пояс -- "Brazil/East":

bash# timeconfig "Brasil/East"

Устанавливаем время аппаратных часов равным UTC, а часовой пояс -- "Brazil/East":

bash# timeconfig --utc "Brasil/East"

В любом варианте, утилита меняет файл /etc/sysconfig/clock, который считывается при загрузке. Его можно отредактировать и вручную, вот как он выглядит:

ZONE="Brazil/East"
UTC=true
ARC=false

установка аппаратных часов

Я советую вам устанавливать ваши аппаратные часы, только если вы понимаете, как настроить точное время.
Команда hwclock читает и устанавливает аппаратные часы на основании переданных ему параметров. Доступные параметры описаны в странице руководства команды. Но если вы используете современный дистрибутив, вам не нужно пользоваться этой командой. После того, как вы решите, какое время хранить в аппаратных часах и выберете часовой пояс, для установки аппаратных часов можно будет использовать высокоуровневую команду setclock. Вам не нужно передавать параметры команде setclock, она сама выбирает параметры, которые нужно передать hwclock на основании ваших установок в операционной системе. Так что всегда стоит проверять наличие команды setclock.

Но если вы минималист и любите тяжелый труд, вот несколько примеров использования hwclock:
/* Для усиления эффекта "тяжелого труда" рекомендуется отжаться 24 раза. По числу часовых поясов. ;)) - прим. переводчика. */
Считывание времени из аппаратных часов:

bash# hwclock

Установка времени аппаратных часов равным UTC на основании системного времени:

bash# hwclock --systohc –utc

Устанавливаем время аппаратных часов равным местному на основании системного времени:

bash# hwclock –systohc

Устанавливаем время аппаратных часов равным указанной строке:

bash# hwclock --set --date "22 Mar 2002 13:17"

Поскольку время ОС независимо от аппаратных часов, любые изменения в BIOS будут учтены при следующей загрузке.
Другой вариант изменения времени в аппаратных часах -- это доступ в BIOS при загрузке системы. Но, скажем, на платформах IBM e-server zSeries это нужно делать на уровне z/VM, потому что Linux работает в виртуальной машине, созданной z/VM.

точная мировая синхронизация времени

Точное время на всех ваших системах также важно, как и серьезная стратегия сетевой безопасности (для достижения которой нужно много больше простых файрволлов). Точное время является одним из главных компонентов системного администрирования, основанного на хорошей практике, которое ведет к организованности и безопасности. В администрировании распределенных приложений, веб-сервисов и наблюдении за безопасностью, точное время -- это необходимость.

NTP: сетевой протокол времени (Network Time Protocol)

Здесь мы не будем останавливаться на подробностях реализации этого протокола, а сосредоточимся на том, как это замечательное изобретение, соединенное со всепроникаемостью Интернета, может быть нам полезно. За дополнительной информацией обращайтесь на сайт www.ntp.org.
После настройки NTP будет поддерживать точность времени, выполняя очень маленькие корректировки часов, такие маленькие, что они никак не будут влиять на работающие приложения.

Точное время можно получить с помощью специальной аппаратуры, основанной на частоте электронов атома или циклотронах. Также существует метод, основанный на GPS (Global Positioning System, глобальной системе позиционирования). Первый способ более точный, но и второй весьма неплох. Оба способа требуют специализированного и дорогого оборудования, но их владельцы (обычно университеты и исследовательские лаборатории) подключают это оборудование к компьютерам, на которых запущен демон NTP. Зачастую эти же машины подключены к Интернету, что в конечном итоге дает нам возможность бесплатно узнавать точное время.

построение простой архитектуры синхронизации времени

Вам нужно:
1. Прямое или непрямое (через файрволл) соединение с Internet.
2. Выбрать несколько NTP-серверов. Можно использовать общедоступный сервер pool.ntp.org, либо выбрать несколько серверов из списка серверов времени второго уровня на сайте NTP. Если у вас нет доступа к Internet, ваш администратор WAN (должен быть толковым парнем) сможет сообщить вам какой-то внутренний адрес.
3. На всех системах, которые вы хотите синхронизировать, должен быть установлен пакет NTP. Пакет RPM можно найти на компакте вашего любимого дистрибутива, или же поищите на сайте rpmfind.net. /* Не RPM'ом единым жив Linux - прим. переводчика. */
Пример хорошей архитектуры смотри на рис. 1.



Рисунок 1. Локальные релейные серверы для NTP.

Если вам нужно синхронизировать время на нескольких машинах, не задавайте им всем в качестве сервера выбранные NTP-серверы. Только лишь две машины должны иметь доступ к удаленным NTP-серверам, остальные машины будут синхронизироваться с этими двумя. Мы будем их называть релейными серверами.

Релейными серверами может стать любая из машин в вашей сети. NTP занимает мало памяти и процессорного времени. Вам не нужно иметь выделенную машину.
Tip: Хорошая мысль создать псевдонимы для ваших локальных релейных серверов, например ntp1.my.com и ntp2.my.com, а на клиентах использовать только эти имена. Тогда вы сможете при необходимости легко перенести функции релейного сервера на другую машину (с другим IP-адресом и именем) без переконфигурации клиентов. Попросите вашего администратора DNS создать такие псевдонимы.

конфигурации NTP

для ваших релейных серверов

Отредактируйте файл /etc/ntp.conf и добавьте выбранные серверы:

server otherntp.server.org # сервер первого уровня в домене server.org
server ntp.research.gov # сервер второго уровня в домене research.gov

Опять таки, можно использовать сервер pool.ntp.org или любой из списка общедоступных серверов времени на сайте NTP.

для ваших клиентов

Отредактируйте файл /etc/ntp.conf и добавьте свои релейные серверы:

server ntp1.my.com # первый локальный релей
server ntp2.my.com # второй локальный релей

Если UTC-время вашей машины отличается от времени на NTP-сервере больше чем на минуту, NTP работать не будет. Так что, вам нужно будет выполнить полную синхронизацию времени. Я рекомендую это делать в нерабочее время. Эта процедура выполняется только один раз, при настройке NTP. Ничего более:

bash# ntpdate otherntp.research.gov
24 Mar 18:16:36 ntpdate[10254]: step time server 200.100.20.10 offset -15.266188 sec
bash# ntpdate otherntp.research.gov
24 Mar 18:16:43 ntpdate[10255]: adjust time server 200.100.20.10 offset -0.000267 sec

Сначала мы выполнили первую полную синхронизацию. Мы опаздывали на 15 секунд.

Затем последовала вторая полная синхронизация, для уверенности. Теперь мы фактически не отстаем, что очень хорошо.

Последнее, что нужно сделать -- это запустить или перезапустить демоны NTP на всех машинах:

bash# service ntpd restart

наблюдение за синхронизацией

Теперь у вас все настроено. NTP будет держать время в синхронизации. Этот процесс можно наблюдать при помощи команды NTP Query (ntpq):

bash# ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
-jj.cs.umb.edu gandalf.sigmaso 3 u 95 1024 377 31.681 -18.549 1.572
milo.mcs.anl.go ntp0.mcs.anl.go 2 u 818 1024 125 41.993 -15.264 1.392
-mailer1.psc.edu ntp1.usno.navy. 2 u 972 1024 377 38.206 19.589 28.028
-dr-zaius.cs.wis ben.cs.wisc.edu 2 u 502 1024 357 55.098 3.979 0.333
+taylor.cs.wisc. ben.cs.wisc.edu 2 u 454 1024 347 54.127 3.379 0.047
-ntp0.cis.strath harris.cc.strat 3 u 507 1024 377 115.274 -5.025 1.642
*clock.via.net .GPS. 1 u 426 1024 377 107.424 -3.018 2.534
ntp1.conectiv.c 0.0.0.0 16 u - 1024 0 0.000 0.000 4000.00
+bonehed.lcs.mit .GPS. 1 u 984 1024 377 25.126 0.131 30.939
-world.std.com 204.34.198.40 2 u 119 1024 377 24.229 -6.884 0.421

Значения каждой колонки:
remote - имя удаленного NTP-сервера. Если указать ключ -n, вы получите IP-адреса серверов вместо имен.
refid - указывает, откуда каждый сервер получает время в данный момент. Это может быть имя хоста или что-то вроде .GPS., указывающее на источник глобальной системы позиционирования (Global Positioning System).
st - stratum (уровень) - это число от 1 до 16, указывающее на точность сервера. Единица означает максимальную точность, 16 - сервер недоступен. Ваш уровень будет равен уровню наименее точного удаленного сервера плюс 1.
poll - интервал между опросами (в секундах). Значение будет изменяться между минимальной и максимальной частотой опросов. В начале интервал будет маленьким, чтобы синхронизация происходила быстро. После того, как часы синхронизируются, интервал начинает увеличиваться, чтобы уменьшить трафик и нагрузку на популярные серверы времени.
reach - восьмеричное представление массива из 8 бит, отражающего результаты последних восьми попыток соединения с сервером. Бит выставлен, если удаленный сервер ответил.
delay - количество времени (в секундах) необходимое для получения ответа на запрос "который час?".
offset - наиболее важное поле. Разница между временем локального и удаленного серверов. В ходе синхронизации это значение должно понижаться, указывая на то, что часы локальной машины идут все точнее.
jitter - дисперсия - это мера статистических отклонений от значения смещения (поле offset) по нескольким успешным парам запрос-ответ. Меньшее значение дисперсии предпочтительнее, поскольку позволяет точнее синхронизировать время.

Значение знаков перед именами серверов:
«-» означает, что локальный сервис NTP не предпочитает этот сервер.
«+» означает, что локальный сервис NTP предпочитает этот сервер.
«x» отмечает плохой хост.
«*» указывает на текущий наиболее предпочтительный сервер.

Ну вот почти и закончили. Все, что осталось – заставить ntpd запускаться при загрузке. Как вы это сделаете – зависит от ваших предпочтений и доступного в вашем дистрибутиве инструментария.
Если ваша машина работает длительное время (месяцы, года) работает без перезагрузок, вы обнаружите значительное расхождение между аппаратными и (теперь очень точными) системными часами. Современные дистрибутивы Linux копируют системное время в аппаратные часы каждый раз при останове системы, с помощью механизма, аналогичного команде setclock. Таким образом, при следующей загрузке системное время будет практически точным, как в момент останова системы.

Avi Alkalay, консультант по Linux и открытым стандартам, старший разработчик по ИТ и ПО IBM Linux Impact Team.
Дополнения и замечания - Brad Knowles, Kent Borg, Yura Moron.
Перевод Ивана Песина.




Avi Alkalay, консультант по Linux и открытым стандартам, старший разработчик по ИТ и ПО IBM Linux Impact Team.¶


Сетевые решения. Статья была опубликована в номере 05 за 2005 год в рубрике sysadmin

©1999-2024 Сетевые решения