Проверяем текущее время и часовой пояс:
date '+%x %X %z %Z'
Получаем расписание перевода часов на 2014 год:
zdump -v /etc/localtime | grep 2014
Если видим две строки с корректировкой часового пояса 26 октября, значит, обновление не требуется.
/etc/localtime Sat Oct 25 19:59:59 2014 UTC = Sun Oct 26 01:59:59 2014 YEKT isdst=0 gmtoff=21600 /etc/localtime Sat Oct 25 20:00:00 2014 UTC = Sun Oct 26 01:00:00 2014 YEKT isdst=0 gmtoff=18000
Если вывод пуст, или отображается более двух строк, значит необходимо обновить базу часовых поясов.
Содержание
Обновление базы часовых поясов
Статья устарела. Если у вас остались системы со старыми часовыми поясами, вам следует выполнить апгрейд системы до актуальной версии. Читаем руководство пользователя: английский, русский, на русском возможно устарело. Я предпочитаю апгрейд с пересборкой мира, но если ранее обновлять FreeBSD не приходилось, то следует выбрать подходящий вам метод в виртуальной машине.
Для FreeBSD 8.4, 9.1, 9.2, 9.3 и 10.0 с ядром GENERIC используем FreeBSD Update.
Системы с модифицированным ядром обновляем из исходников или из коллекции портов.
Для устаревших систем обновляем базу часовых поясов вручную.
Обновление системы с использованием FreeBSD Update
Проверяем идентификатор ядра:
uname -i
Если видим значение отличное от GENERIC, выполняем установку из исходников или из коллекции портов. В случае бинарного обновления, модифицированное ядро будет заменено стандартным.
Загружаем обновления:
freebsd-update fetch
Устанавливаем обновления:
freebsd-update install
Обновляем текущий часовой пояс:
tzsetup -r
Переходим к верификации.
Обновление из исходников с пересборкой мира
Способ оптимален для тех, кто обновляет систему из исходников.
Устанавливаем патч FreeBSD-EN-14:10.tzdata.
Пересобираем мир.
Обновляем текущий часовой пояс:
tzsetup -r
Переходим к верификации.
Установка из коллекции портов
Внимание! Порт устанавливается в /usr/share/zoneinfo с заменой системных файлов. При удалении пакета zoneinfo удаляется системная база часовых поясов. Удаление пакета необходимо выполнить непосредственно перед установкой новой версии системы.
Обновляем коллекцию портов:
portsnap fetch && portsnap update || portsnap extract
Устанавливаем порт zoneinfo:
cd /usr/ports/misc/zoneinfo && make install clean
Обновляем текущий часовой пояс:
tzsetup -r
Переходим к верификации.
Установка базы часовых поясов вручную
Загружаем актуальную версию базы часовых поясов:
fetch ftp://ftp.iana.org/tz/tzdata-latest.tar.gz
Распаковываем архив:
mkdir tzdata cd tzdata tar xzf ../tzdata-latest.tar.gz
Компилируем данные для Европы, там же находится и азиатская часть России:
zic europe
Результат компиляции записывается непосредственно в папку назначения: /usr/share/zoneinfo. Проверяем, что файлы имеют текущую дату:
ls -l /usr/share/zoneinfo/Europe ls -lt /usr/share/zoneinfo/Asia | head
Обновляем текущий часовой пояс:
tzsetup -r
Переходим к верификации.
Замена часового пояса на GMT-x
В особо запущенных случаях, если не работает ни один вышеописанный способ.
Задаем временную зону GMT-x:
cp /usr/share/zoneinfo/Etc/GMT-5 /etc/localtime
Использовать команду zdump для верификации в этом случае бессмысленно, поскольку автоматического перевода часов в этих временных зонах не предусмотрено.
Верификация
Проверяем текущий часовой пояс:
date '+%x %X %z %Z'
Получаем расписание перевода часов на 2014 год:
zdump -v /etc/localtime | grep 2014
Если видим две строки с корректировкой часового пояса 26 октября, значит, база обновлена успешно.
/etc/localtime Sat Oct 25 19:59:59 2014 UTC = Sun Oct 26 01:59:59 2014 YEKT isdst=0 gmtoff=21600 /etc/localtime Sat Oct 25 20:00:00 2014 UTC = Sun Oct 26 01:00:00 2014 YEKT isdst=0 gmtoff=18000
Изменения вступают в силу для вновь запускаемых программ, чтобы применить изменения для служб, необходимо перезагрузить систему.
Обновление часовых поясов в PHP
PHP использует собственную базу часовых поясов, ее необходимо обновить отдельно.
Получаем текущее время и часовой пояс, регион необходимо указать свой:
php -r 'date_default_timezone_set("Asia/Yekaterinburg"); echo "\n".date ("d.m.Y H:i P")."\n\n";'
Если имеем некорректный часовой пояс, приступаем к обновлению.
При установке PHP из пакета:
pkg install pecl-timezonedb
При установке PHP из портов:
cd /usr/ports/misc/pecl-timezonedb/ make install clean
Проверяем часовой пояс.
Если PHP работает в качестве модуля Apache, перезагружаем веб-сервер чтобы применить изменения:
service apache24 restart
Сборка pecl-timezonedb вручную для устаревших систем
Метод проверен на FreeBSD 7.4.
Требуется наличие autoconf, иначе phpize завершится с ошибкой, и скрипт configure не будет создан.
Загружаем расширение:
fetch -o timezonedb.tgz http://pecl.php.net/get/timezonedb
Распаковываем:
tar -xvf timezonedb.tgz
Переходим в папку с исходниками:
cd timezonedb-2014.8
Собираем и устанавливаем:
phpize ./configure make install
Добавляем строку extension=timezonedb.so
в extensions.ini:
mkdir /usr/local/etc/php printf "\nextension=timezonedb.so\n" >>/usr/local/etc/php/extensions.ini cat /usr/local/etc/php/extensions.ini
Проверяем часовой пояс.
Ссылки
Перевод времени 26 октября 2014 года или ударим трудом по разгильдяйству: информация об изменении часовых поясов; обновление Windows XP, Windows 2003 Server, Outlook 2000-2007.
Если у вас остались системы со старыми часовыми поясами, вам следует выполнить апгрейд системы до актуальной версии.
Собрал и установил pear пакет для php
Вывод команды: php -i | grep "Timezone Database"
Должен быть следующим:
Timezone Database => external
Alternative Timezone Database => enabled
Timezone Database Version => 2014.7
Проверяем extensions.ini: cat /usr/local/etc/php/extensions.ini
Файл должен содержать строку: extension=timezonedb.so
Получаем путь к папке с расширениями: php -i | grep extension_dir
Проверяем содержимое папки с расширениями ls -l папка
В папке должен находиться файл timezonedb.so и иметь актуальную дату.
У нас все очень хреново.
Есть куча старых FreeBSD, 7.х и ранее, естественно, ничего не собирается.
Есть какие-нибудь дельные советы, кроме как посыпать пеплом голову, накрыться простыней и ползти в сторону кладбища?
Можно ли скопировать сами файлы зон с более современных версий (у нас и они есть)?
С PHP и прочим ПО будут проблемы. Здесь надо смотреть требуется ли работа с различными часовыми поясами, если часовой пояс один, забиваем в конфиг Etc/GMT-x и готово.
С утра начали работу по вашим рекомендациям, пока все ок.
- сохранить /etc/localtime и /usr/share/zoneinfo;
- скопировать обновлённый /etc/localtime из более современной версии;
- проверить работоспособность `date' и `zdump -v /etc/localtime';
- если всё хорошо, а в системе используется не только текущая часовая зона, то можно копировать файлы usr/share/zoneinfo
Для FreeBSD 8.4, 9.1, 9.2, 9.3 и 10.0
Смотри так же:https://www.freebsd.org/security/advisories/FreeBSD-EN-14:10.tzdata.asc
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=194173
Кроме того, не забыть обновить PHP, ruby, java, perl (как минимум, пакет p5-DateTime-TimeZone), если они присутствуют в системе.
Смотри так же:
http://fido7.ru.unix.bsd.narkive.com/i6T4t2Ed/zoneinfo-26.4
В таком случае проще вручную часовые зоны скомпилировать.
Часть контрольных сумм может и сойтись. А при условии, что пакеты я обычно чищу после апгрейда базовой системы, есть риск ее слегка покоцать.
Лучше сразу подобрать разложенные грабли, пока про них не забыл :)
Устанавливали из портов или вручную? Какая версия системы?
Выложите вывод команд:
ls -l /etc/localtime
ls -l /usr/share/zoneinfo/Europe/Moscow
$ ls -l /etc/localtime
-r--r--r-- 1 root wheel 1282 Oct 7 12:41 /etc/localtime
$ ls -la /usr/share/zoneinfo/Asia/Yekaterinburg
-rw-r--r-- 1 alex alex 1282 Oct 7 12:40 /usr/share/zoneinfo/Asia/Yekaterinburg
А вот это, когда отправил виртуалку в перезагрузку:
Oct 26 01:59:50 web-dmz date: date set by root
Oct 26 02:00:12 web-dmz reboot: rebooted by root
Oct 26 03:00:12 web-dmz syslogd: exiting on signal 15
Локальное время перевелось нас час вперед...
9.2-RELEASE FreeBSD
обновил timezone из портов
zdump -v /etc/localtime | grep 2014
/etc/localtime Sat Oct 25 21:59:59 2014 UTC = Sun Oct 26 01:59:59 2014 MSK isdst=0 gmtoff=14400
/etc/localtime Sat Oct 25 22:00:00 2014 UTC = Sun Oct 26 01:00:00 2014 MSK isdst=0 gmtoff=10800
date -j 201410010000 '+%z %Z' && date -j 201411010000 '+%z %Z'
+0400 MSK
+0300 MSK
вроде все ок, провожу эксперимент
date 1410260159
date
Sun Oct 26 01:59:00 MSK 2014
Наступает 02:00:00 часы продолжают тикать, время не переводится :(
Перезагружал, время не перевелось.
На OpenSuse то же самое.
Время переводится в 02:00 на час назад.
Команда date 1410260159 устанавливает время в новой часовой зоне: +0300 MSK.
Попробуйте:
date 1410260154
date '+%x %X %z %Z'
Пробовал date 1410260154, однако время в 02:00 не перевелось :(
Установил date 1410260100 - спустя 50 мин время перевелось!
Опытным путем и с вашей помощью, выяснилось что нужно выставлять время, которое сервер считает зоной +04, тогда в 02:00 осуществляется перевод.
Для меня это оказалось 1410260110, 1410260111 - уже +03 :) Почему - до сих пор не ясно :)
Резюме: после установки времени смотрим на пояс date '+%x %X %z %Z' , убеждаемся что у нас еще +04, ждем 02:00 - переводится.
Ссылку обновил, спасибо.