Discussion:
Время при загрузке
(слишком старое сообщение для ответа)
Victor Sudakov
2014-11-28 18:21:40 UTC
Permalink
Коллеги,

Откуда FreeBSD берет время при загрузке системы?

Поставил в BIOS 1999 год. Гружу FreeBSD 9, сетевой кабель не
подключен. В загруженной системе date показывает 2014 год, правда
почему-то июль.

Если не из CMOS clock, то откуда?

Кстати при shutdown FreeBSD подводит время в CMOS clock сообразно
ядерному. Я этого факта раньше не знал.
--
Victor Sudakov, VAS4-RIPE, VAS47-RIPN
2:5005/***@fidonet http://vas.tomsk.ru/
Valentin Davydov
2014-11-30 14:52:07 UTC
Permalink
Date: Fri, 28 Nov 2014 18:21:40 +0000 (UTC)
Откуда FreeBSD берет время при загрузке системы?
Из чмоса, либо из интернета, если выставлено ntpdate_enable="YES".
Поставил в BIOS 1999 год. Гружу FreeBSD 9, сетевой кабель не
подключен. В загруженной системе date показывает 2014 год, правда
почему-то июль.
Может, сохранить забыл? Вряд ли неестественный интеллект берёт время
откуда-нибудь с файловой системы.
Если не из CMOS clock, то откуда?
Кстати при shutdown FreeBSD подводит время в CMOS clock сообразно
ядерному. Я этого факта раньше не знал.
В этой же эхе обсуждалось несколько лет назад. Соотвентствующий сисколл
и когда он вызывается. Правда, с тех пор, если не путаю, добавили новый
алгоритм, который периодически (настраивается sysctlем, по умолчанию
каждые полчаса) сохраняет время в чмос не дожидаясь перезагрузки.

Вал. Дав.
Alex Korchmar
2014-12-01 08:45:50 UTC
Permalink
Valentin Davydov <***@m.davydov.spb.su> wrote:

VD> Может, сохранить забыл? Вряд ли неестественный интеллект берёт время
VD> откуда-нибудь с файловой системы.
в линупсе, кстати, вполне себе берет. Правда, предупреждает об этом явно.
Alex
Victor Sudakov
2014-12-01 09:17:54 UTC
Permalink
Post by Valentin Davydov
Post by Victor Sudakov
Откуда FreeBSD берет время при загрузке системы?
Из чмоса, либо из интернета, если выставлено ntpdate_enable="YES".
Сетевой кабель не подключен, какое там ntpdate.
Post by Valentin Davydov
Post by Victor Sudakov
Поставил в BIOS 1999 год. Гружу FreeBSD 9, сетевой кабель не
подключен. В загруженной системе date показывает 2014 год, правда
почему-то июль.
Может, сохранить забыл?
Исключено. Вот видео процесса, без монтажа:
ftp://ftp.sibptus.ru/pub/vas/VIDEO0005.3gp
Post by Valentin Davydov
Вряд ли неестественный интеллект берёт время
откуда-нибудь с файловой системы.
Я сам удивился.
Post by Valentin Davydov
Post by Victor Sudakov
Если не из CMOS clock, то откуда?
Кстати при shutdown FreeBSD подводит время в CMOS clock сообразно
ядерному. Я этого факта раньше не знал.
В этой же эхе обсуждалось несколько лет назад. Соотвентствующий сисколл
и когда он вызывается. Правда, с тех пор, если не путаю, добавили новый
алгоритм, который периодически (настраивается sysctlем, по умолчанию
каждые полчаса) сохраняет время в чмос не дожидаясь перезагрузки.
Hапомни pls, что за sysctl. А так конечно adjkerntz ночью по крону
должен подводить CMOS clock.
--
Victor Sudakov, VAS4-RIPE, VAS47-RIPN
2:5005/***@fidonet http://vas.tomsk.ru/
Serguei E. Leontiev
2014-12-01 16:42:40 UTC
Permalink
Привет Виктор,

От 1 декабря 2014 г., 12:17:54 в fido7.ru.unix.bsd ты писал:
??>>> Поставил в BIOS 1999 год. Гружу FreeBSD 9, сетевой
??>>> кабель не подключен. В загруженной системе date
??>>> показывает 2014 год, правда почему-то июль.
??>> Может, сохранить забыл?
VS> Исключено. Вот видео процесса, без монтажа:
VS> ftp://ftp.sibptus.ru/pub/vas/VIDEO0005.3gp

В этом видео тема изменения времени в BIOS не раскрыта.

Прямой эксперимент на виртуальной машине показал наличие проблемы
тысячелетия наоборот, т.е. если в CMOS установить 01-12-2001,
01-12-2013, 01-12-2014 или 01-12-2015, то FreeBSD 9.3 время
устанавливает из CMOS, а при установке 01-12-1999 - нет.

??>> Вряд ли неестественный интеллект берёт время
??>> откуда-нибудь с файловой системы.
VS> Я сам удивился.
??>>> Если не из CMOS clock, то откуда?

Предполагаю, что для RTC год '99' - интерпретируется как неправильное
время. В "микросхеме" RTC год кодируется только двумя BCD цифрами (а по
некоторым описаниям и они не могут быть любыми).

Так что надо рыться в документации/коде на предмет того, что происходит,
если в RTC села батарейка и у него нет корректного времени.

--
Успехов, Сергей Леонтьев. E-mail: ***@CryptoPro.ru
Victor Sudakov
2014-12-01 16:54:42 UTC
Permalink
Post by Serguei E. Leontiev
??>>> Поставил в BIOS 1999 год. Гружу FreeBSD 9, сетевой
??>>> кабель не подключен. В загруженной системе date
??>>> показывает 2014 год, правда почему-то июль.
??>> Может, сохранить забыл?
VS> ftp://ftp.sibptus.ru/pub/vas/VIDEO0005.3gp
В этом видео тема изменения времени в BIOS не раскрыта.
Как раскрыть?
Post by Serguei E. Leontiev
Прямой эксперимент на виртуальной машине показал наличие проблемы
тысячелетия наоборот, т.е. если в CMOS установить 01-12-2001,
01-12-2013, 01-12-2014 или 01-12-2015, то FreeBSD 9.3 время
устанавливает из CMOS, а при установке 01-12-1999 - нет.
Тогда откуда?
Post by Serguei E. Leontiev
??>> Вряд ли неестественный интеллект берёт время
??>> откуда-нибудь с файловой системы.
VS> Я сам удивился.
??>>> Если не из CMOS clock, то откуда?
Предполагаю, что для RTC год '99' - интерпретируется как неправильное
время. В "микросхеме" RTC год кодируется только двумя BCD цифрами (а по
некоторым описаниям и они не могут быть любыми).
Попробую завтра поставить 2012 г.
Post by Serguei E. Leontiev
Так что надо рыться в документации/коде на предмет того, что происходит,
если в RTC села батарейка и у него нет корректного времени.
Мне тоже интересно, какое время в этом случае берется и откуда.
--
Victor Sudakov, VAS4-RIPE, VAS47-RIPN
2:5005/***@fidonet http://vas.tomsk.ru/
Victor Sudakov
2014-12-02 03:54:22 UTC
Permalink
Post by Victor Sudakov
Post by Serguei E. Leontiev
??>>> Поставил в BIOS 1999 год. Гружу FreeBSD 9, сетевой
??>>> кабель не подключен. В загруженной системе date
??>>> показывает 2014 год, правда почему-то июль.
??>> Может, сохранить забыл?
VS> ftp://ftp.sibptus.ru/pub/vas/VIDEO0005.3gp
В этом видео тема изменения времени в BIOS не раскрыта.
Как раскрыть?
BTW наша переписка в Фидо не видна.

А sysctl, про который говорил Вал. Дав., это наверное
machdep.rtc_save_period и machdep.disable_rtc_set.
Post by Victor Sudakov
Post by Serguei E. Leontiev
Прямой эксперимент на виртуальной машине показал наличие проблемы
тысячелетия наоборот, т.е. если в CMOS установить 01-12-2001,
01-12-2013, 01-12-2014 или 01-12-2015, то FreeBSD 9.3 время
устанавливает из CMOS, а при установке 01-12-1999 - нет.
Тогда откуда?
Я подтверждаю, что если в CMOS поставить 2012 или 2002 год, то FreeBSD
при загрузке возьмет время из CMOS. А если в CMOS 1999 год, то FreeBSD
ставит время, очень похожее на время последнего шатдауна.

Откуда оно берется и каким образом, по-прежнему не знаю.
--
Victor Sudakov, VAS4-RIPE, VAS47-RIPN
2:5005/***@fidonet http://vas.tomsk.ru/
Serguei E. Leontiev
2014-12-02 11:47:47 UTC
Permalink
Виктор, привет,
Post by Victor Sudakov
BTW наша переписка в Фидо не видна.
Твоя правда, на 2:5020/1519 (ftn.su) следов от темы "Re: Время при
загрузке" RU.UNIX.BSD не заметно. Однако, все ответы, и твои, и мои, в теме
"Re: враньё" RU.CRYPT присутствуют. Хотя, погоди, ты там писал с 2:5005/49,
но я то, как обычно, с ***@sai.msu.ru.

К сожалению, как оказалось на 2:5020/1519 (ftn.su) нет конференции TESTING,
так что проверка не удалась. Попробую иным способом понять в чём выражается
сия проблема.

P.S.
Hе хотелось бы думать о грустном.
--
Успехов, Сергей Леонтьев, <http://www.cryptopro.ru> (NewsTap)
Serguei E. Leontiev
2014-12-04 12:23:42 UTC
Permalink
Виктор, привет,
Post by Serguei E. Leontiev
Твоя правда, на 2:5020/1519 (ftn.su) следов от темы "Re: Время при
загрузке" RU.UNIX.BSD не заметно. Однако, все ответы, и твои, и мои, в теме
"Re: враньё" RU.CRYPT присутствуют. Хотя, погоди, ты там писал с 2:5005/49,
Действительно RU.CRYPT и RU.LINUX функционируют нормально, а RU.UNIX.BSD и
RU.UNIX.SOLARIS нет.
Post by Serguei E. Leontiev
P.S.
Hе хотелось бы думать о грустном.
--
Успехов, Сергей Леонтьев, <http://www.cryptopro.ru> (NewsTap)
Valentin Nechayev
2014-12-15 22:12:28 UTC
Permalink
SEL> Действительно RU.CRYPT и RU.LINUX функционируют нормально, а RU.UNIX.BSD и
SEL> RU.UNIX.SOLARIS нет.

Последнее письмо в данной эхообласти через 2:5020/400 замечено на Fido
стороне аж 25 октября.

Официальное извещение о неуправляемости шлюза и о мерах по этому
поводу было 10 сентября в ru.moderator.

В противоположную сторону гейтование есть, при быстром взгляде потерь
не замечено.

Hа интерфейсе модератора никакого выключения гейтования не видно.
Post by Serguei E. Leontiev
P.S.
Hе хотелось бы думать о грустном.
Увы.
Я попытаюсь поискать концы...


--netch--
Serguei E. Leontiev
2014-12-18 11:15:44 UTC
Permalink
Привет Валентин,

От 16 декабря 2014 г., 1:12:28 в fido7.ru.unix.bsd ты писал:
??>>> P.S.
??>>> Hе хотелось бы думать о грустном.
VN> Увы.
VN> Я попытаюсь поискать концы...

Был бы премного благодарен.

--
Успехов, Сергей Леонтьев. E-mail: ***@CryptoPro.ru
Valentin Davydov
2014-12-04 11:02:34 UTC
Permalink
Date: Tue, 2 Dec 2014 03:54:22 +0000 (UTC)
Post by Victor Sudakov
Post by Serguei E. Leontiev
Прямой эксперимент на виртуальной машине показал наличие проблемы
тысячелетия наоборот, т.е. если в CMOS установить 01-12-2001,
01-12-2013, 01-12-2014 или 01-12-2015, то FreeBSD 9.3 время
устанавливает из CMOS, а при установке 01-12-1999 - нет.
Тогда откуда?
Я подтверждаю, что если в CMOS поставить 2012 или 2002 год, то FreeBSD
при загрузке возьмет время из CMOS. А если в CMOS 1999 год, то FreeBSD
ставит время, очень похожее на время последнего шатдауна.
Откуда оно берется и каким образом, по-прежнему не знаю.
Я не смог найти свободную железку с достаточно старым биосом, так что
протестируй, если не трудно, соответствующий патч у себя:

--- /usr/src/sys/x86/isa/atrtc.c 2014-08-14 06:33:26.168778002 +0000
+++ atrtc.c 2014-12-04 10:50:10.597250292 +0000
@@ -354,7 +354,7 @@
#ifdef USE_RTC_CENTURY
ct.year += readrtc(RTC_CENTURY) * 100;
#else
- ct.year += 2000;
+ ct.year += ( ct.year < 38 ? 2000 : 1900 );
#endif
critical_exit();
/* Set dow = -1 because some clocks don't set it correctly. */

Вал. Дав.

P.S. Бедня фря. Её заставляют поставить время 2099 год, но она не может
больше 2038 - и при этом не опускает руки, а ставит-таки ближайшее известное
ей время.
Serguei E. Leontiev
2014-12-04 12:15:11 UTC
Permalink
Валентин, привет,
Post by Valentin Davydov
- ct.year += 2000;
+ ct.year += ( ct.year < 38 ? 2000 : 1900 );
Логично сравнивать, либо с 84, т.к. до этого момента не было RTC, либо с 93
годом, когда появилось само FreeBSD.
Post by Valentin Davydov
P.S. Бедня фря. Её заставляют поставить время 2099 год, но она не может
больше 2038 - и при этом не опускает руки, а ставит-таки ближайшее известное
ей время.
Думаю, кто-нибудь когда-нибудь сможет протащить комплекс изменений из
NetBSD или OpenBSD для поддержки 64-битного времени в 32-бит ОС и
приложениях.

К стати, а разве 64-бит FreeBSD подвержена проблеме Y2038? Дойду до
виртуальных машин, проверю и твоё исправление, и подверженность проблеме
Y2038.
--
Успехов, Сергей Леонтьев, <http://www.cryptopro.ru> (NewsTap)
Valentin Davydov
2014-12-04 14:11:53 UTC
Permalink
Date: Thu, 4 Dec 2014 12:15:11 +0000 (UTC)
- ct.year += 2000;
+ ct.year += ( ct.year < 38 ? 2000 : 1900 );
Логично сравнивать, либо с 84, т.к. до этого момента не было RTC, либо с 93
годом, когда появилось само FreeBSD.
Вроде бы, в каком-то обсуждении проблемы Y2k промелькнула мысль сравнивать
с 50, по правилам десятичного огругления. Можно, кстати, и с 70 сравнивать,
тоже особая точка на шкале времени.
P.S. Бедня фря. Её заставляют поставить время 2099 год, но она не может
больше 2038 - и при этом не опускает руки, а ставит-таки ближайшее известное
ей время.
Думаю, кто-нибудь когда-нибудь сможет протащить комплекс изменений из
NetBSD или OpenBSD для поддержки 64-битного времени в 32-бит ОС и
приложениях.
К стати, а разве 64-бит FreeBSD подвержена проблеме Y2038?
date -j 999900000000
Mon Nov 30 00:00:00 UTC 9998

Вал. Дав.
Serguei E. Leontiev
2014-12-04 14:49:57 UTC
Permalink
Валентин, привет,
Post by Valentin Davydov
Post by Serguei E. Leontiev
- ct.year += 2000;
+ ct.year += ( ct.year < 38 ? 2000 : 1900 );
Логично сравнивать, либо с 84, т.к. до этого момента не было RTC, либо с 93
годом, когда появилось само FreeBSD.
Вроде бы, в каком-то обсуждении проблемы Y2k промелькнула мысль сравнивать
с 50, по правилам десятичного огругления. Можно, кстати, и с 70 сравнивать,
тоже особая точка на шкале времени.
Если интерпретировать эту проблему как ошибку, то имеем некоторый BIOS
может установить 1999, а некоторый пользователь тратит время и волнуется от
того, что FreeBSD работает не так, как BIOS. Поэтому я и предложил 84.
Post by Valentin Davydov
Post by Serguei E. Leontiev
P.S. Бедня фря. Её заставляют поставить время 2099 год, но она не может
больше 2038 - и при этом не опускает руки, а ставит-таки ближайшее известное
ей время.
К стати, а разве 64-бит FreeBSD подвержена проблеме Y2038?
date -j 999900000000
Mon Nov 30 00:00:00 UTC 9998
Я так понял, намекаешь что должно работать, а проблемы Y2038 у самой 64-бит
системы и приложений нет. Тогда получается, что в драйвере RTC есть ещё
одна ошибка. Так?
--
Успехов, Сергей Леонтьев, <http://www.cryptopro.ru> (NewsTap)
Valentin Davydov
2014-12-05 07:41:48 UTC
Permalink
Date: Thu, 4 Dec 2014 14:49:57 +0000 (UTC)
Post by Valentin Davydov
Post by Serguei E. Leontiev
- ct.year += 2000;
+ ct.year += ( ct.year < 38 ? 2000 : 1900 );
Логично сравнивать, либо с 84, т.к. до этого момента не было RTC, либо с 93
годом, когда появилось само FreeBSD.
Вроде бы, в каком-то обсуждении проблемы Y2k промелькнула мысль сравнивать
с 50, по правилам десятичного огругления. Можно, кстати, и с 70 сравнивать,
тоже особая точка на шкале времени.
Если интерпретировать эту проблему как ошибку, то имеем некоторый BIOS
может установить 1999, а некоторый пользователь тратит время и волнуется от
того, что FreeBSD работает не так, как BIOS. Поэтому я и предложил 84.
Я вот чего подумал. Ведь старые версии фри и в прошлом веке прекрасно
работали. Полез посмотреть - там всё в порядке, сравнивается с 70-м годом.
И ведь кто-то не поленился это сравнение убрать! Пойти, что ли, в svnweb,
найти его и устыдить?..
Post by Valentin Davydov
Post by Serguei E. Leontiev
P.S. Бедня фря. Её заставляют поставить время 2099 год, но она не может
больше 2038 - и при этом не опускает руки, а ставит-таки ближайшее известное
ей время.
К стати, а разве 64-бит FreeBSD подвержена проблеме Y2038?
date -j 999900000000
Mon Nov 30 00:00:00 UTC 9998
Я так понял, намекаешь что должно работать, а проблемы Y2038 у самой 64-бит
системы и приложений нет.
Работает криво. 999999999999 для неё, видите ли, инвалид формат,
а 999900000000 - валид!
Тогда получается, что в драйвере RTC есть ещё одна ошибка. Так?
Какая?

Вал. Дав.
Serguei E. Leontiev
2014-12-05 10:15:05 UTC
Permalink
Привет Валентин,

От 5 декабря 2014 г., 10:41:48 в fido7.ru.unix.bsd ты писал:
??>>>>> P.S. Бедня фря. Её заставляют поставить время
??>>>>> 2099 год, но она не может больше 2038 - и при
??>>>>> этом не опускает руки, а ставит-таки ближайшее
??>>>>> известное ей время.
??>>>> К стати, а разве 64-бит FreeBSD подвержена проблеме
??>>>> Y2038?
??>>> date -j 999900000000
??>>> Mon Nov 30 00:00:00 UTC 9998
??>> Я так понял, намекаешь что должно работать, а проблемы
??>> Y2038 у самой 64-бит системы и приложений нет.
VD> Работает криво. 999999999999 для неё, видите ли, инвалид
VD> формат, а 999900000000 - валид!

Хм. Hу это больше похоже уже на "проблему" Y10k (Y10000).

??>> Тогда получается, что в драйвере RTC есть ещё одна ошибка.
??>> Так?
VD> Какая?

Вероятно, что для случая sizeof(time_t) > 4 следующее выражение
некорректно и может получать отрицательное значение типа time_t:

kern/subr_clock.c:
clock_ct_to_ts(struct clocktime *ct, struct timespec *ts)
{
time_t secs;
int i, year, days;
...
secs = ((days * 24 + ct->hour) * 60 + ct->min) * 60 + ct->sec;

Если ограничиваться однострочной заплаткой, наверное его надо исправить,
как минимум, на что-то эквивалентное нижеследующему:

secs = ((days * (time_t)24 + ct->hour) * (time_t)60 + ct->min) *
(time_t)60 + ct->sec;

или изменить описание на:
time_t secs, days;
int i, year;

А честный 64-бит код подразумевает массированные исправления типа для
всех локальных переменных secs, days, year в файле kern/subr_clock.c:

#define day_of_week(days) ((((time_t)days) + 4) % 7)
...
leapyear(time_t year)
...
time_t secs, days, year;
int i;

--
Успехов, Сергей Леонтьев. E-mail: ***@CryptoPro.ru
Serguei E. Leontiev
2014-12-11 02:37:04 UTC
Permalink
Привет Валентин,

От 5 декабря 2014 г., 10:41:48 в fido7.ru.unix.bsd ты писал:
??>>>>> - ct.year += 2000;
??>>>>> + ct.year += ( ct.year < 38 ? 2000 :
??>>>>> 1900 );
??>>>> Логично сравнивать, либо с 84, т.к. до этого
??>>>> момента не было RTC, либо с 93 годом, когда
??>>>> появилось само FreeBSD.
??>>> Вроде бы, в каком-то обсуждении проблемы Y2k
??>>> промелькнула мысль сравнивать с 50, по правилам
??>>> десятичного огругления. Можно, кстати, и с 70
??>>> сравнивать, тоже особая точка на шкале времени.
??>> Если интерпретировать эту проблему как ошибку, то имеем
??>> некоторый BIOS может установить 1999, а некоторый
??>> пользователь тратит время и волнуется от того, что FreeBSD
??>> работает не так, как BIOS. Поэтому я и предложил 84.
VD> Я вот чего подумал. Ведь старые версии фри и в прошлом веке
VD> прекрасно работали. Полез посмотреть - там всё в порядке,
VD> сравнивается с 70-м годом. И ведь кто-то не поленился это
VD> сравнение убрать! Пойти, что ли, в svnweb, найти его и
VD> устыдить?..

По здравому размышлению пришёл к выводу, что для 64-бит систем это не
bug, но feature. Если бы у Виктора установился бы 2099 год, я думаю, у
него бы не возникло бы, ни вопросов, ни проблем.

Для 32-бит систем, это ошибка, но мне не известны пострадавшие, а я сам
не могу это проверить.

??>>>>> P.S. Бедня фря. Её заставляют поставить время
??>>>>> 2099 год, но она не может больше 2038 - и при
??>>>>> этом не опускает руки, а ставит-таки ближайшее
??>>>>> известное ей время.
...
??>> Тогда получается, что в драйвере RTC есть ещё одна ошибка.
??>> Так?
VD> Какая?

Если ты не захотел сделать сообщение об этой ошибке, я сам сделал PR#195868

Валентин, Виктор, если/когда будет возможность, прочитайте его:

https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=195868

И проверьте предлагаемое в нём исправление (CC и комментарии, тоже могут
быть полезны).

--
Успехов, Сергей Леонтьев. E-mail: ***@CryptoPro.ru
Serguei E. Leontiev
2014-12-04 20:20:31 UTC
Permalink
Привет Валентин,

От 4 декабря 2014 г., 17:11:53 в fido7.ru.unix.bsd ты писал:
??>>> - ct.year += 2000;
??>>> + ct.year += ( ct.year < 38 ? 2000 : 1900 );
??>> Логично сравнивать, либо с 84, т.к. до этого момента не
??>> было RTC, либо с 93 годом, когда появилось само FreeBSD.

Я применил твоё исправление, но с 84 годом.

VD> Вроде бы, в каком-то обсуждении проблемы Y2k промелькнула мысль
VD> сравнивать с 50, по правилам десятичного огругления. Можно,
VD> кстати, и с 70 сравнивать, тоже особая точка на шкале времени.
??>>> P.S. Бедня фря. Её заставляют поставить время 2099 год,
??>>> но она не может больше 2038 - и при этом не опускает
??>>> руки, а ставит-таки ближайшее известное ей время.

Докладываю, на FreeBSD 10.1 (amd64) под управлением Parallels Desktop
(OSX 10.10.02), при включенном debug.clocktime

1999 год работает:
Jan 2 02:57:09 vmfb10leom kernel: ct_to_ts([1999-01-01 23:57:03]) =
915235023.000000000

2038 год работает:
Jan 1 03:12:40 vmfb10leom kernel: ct_to_ts([2038-01-01 00:12:33]) =
2145917553.000000000

2040 и 2083 годы проверить не смог - вызывают ошибки у Parallels
Desktop, виртуальная машина не включается, загрузка не начинается.

Hо случай 64-бит времени (sizeof(time_t)==8) удалось проверить для
[2038-01-01 00:12:33], так что можно поставить 84 (или 93, или 50, по
вкусу).

--
Успехов, Сергей Леонтьев. E-mail: ***@CryptoPro.ru
Serguei E. Leontiev
2014-12-04 23:08:53 UTC
Permalink
P.S.
Post by Serguei E. Leontiev
Post by Valentin Davydov
Post by Serguei E. Leontiev
- ct.year += 2000;
+ ct.year += ( ct.year < 38 ? 2000 : 1900 );
Логично сравнивать, либо с 84, т.к. до этого момента не
было RTC, либо с 93 годом, когда появилось само FreeBSD.
Я применил твоё исправление, но с 84 годом.
Post by Valentin Davydov
Вроде бы, в каком-то обсуждении проблемы Y2k промелькнула мысль
сравнивать с 50, по правилам десятичного огругления. Можно,
кстати, и с 70 сравнивать, тоже особая точка на шкале времени.
...
Post by Serguei E. Leontiev
Hо случай 64-бит времени (sizeof(time_t)==8) удалось проверить для
[2038-01-01 00:12:33], так что можно поставить 84 (или 93, или 50, по
вкусу).
Есть ещё одно соображение, годы до 1970 устанавливать нехорошо. Кто его
знает как всё будет работать с отрицательным временем, вдруг при случайной
установке оно взорвётся? Так что 2038 и 2050 лучше не корректировать, и
пусть на текущих 32-бит системах в этом случае ct_to_ts() выдаёт EINVAL.

Так что выбор точки отсечения: 84 (предположительно не должно быть BIOS,
которые установят более раннюю дату), 93 или 70 (время должно быть, как
минимум, положительным, либо EINVAL).
--
Успехов, Сергей Леонтьев, <http://www.cryptopro.ru> (NewsTap)
Victor Sudakov
2014-12-05 06:21:39 UTC
Permalink
Post by Valentin Davydov
Post by Victor Sudakov
Post by Victor Sudakov
Post by Serguei E. Leontiev
Прямой эксперимент на виртуальной машине показал наличие проблемы
тысячелетия наоборот, т.е. если в CMOS установить 01-12-2001,
01-12-2013, 01-12-2014 или 01-12-2015, то FreeBSD 9.3 время
устанавливает из CMOS, а при установке 01-12-1999 - нет.
Тогда откуда?
Я подтверждаю, что если в CMOS поставить 2012 или 2002 год, то FreeBSD
при загрузке возьмет время из CMOS. А если в CMOS 1999 год, то FreeBSD
ставит время, очень похожее на время последнего шатдауна.
Откуда оно берется и каким образом, по-прежнему не знаю.
Я не смог найти свободную железку с достаточно старым биосом, так что
Пока сделал по-другому, поставил в CMOS 2099 год. Получил такое же
сообщение об ошибке "Invalid time in real time clock".
А время система взяла, похоже, откуда-то с файловой системы, по
крайней мере оно подозрительно совпадает с временем изменения корня.

Loading Image...
--
Victor Sudakov, VAS4-RIPE, VAS47-RIPN
2:5005/***@fidonet http://vas.tomsk.ru/
Serguei E. Leontiev
2014-12-04 20:27:33 UTC
Permalink
Привет Виктор,

От 2 декабря 2014 г., 6:54:22 в fido7.ru.unix.bsd ты писал:
??>> Тогда откуда?
VS> Я подтверждаю, что если в CMOS поставить 2012 или 2002 год, то
VS> FreeBSD при загрузке возьмет время из CMOS. А если в CMOS 1999
VS> год, то FreeBSD ставит время, очень похожее на время последнего
VS> шатдауна.
VS> Откуда оно берется и каким образом, по-прежнему не знаю.

В протоколы отладки:

Jan 1 03:08:03 vmfb10leom kernel: Root mount waiting for: usbus1
Jan 1 03:08:03 vmfb10leom kernel: ugen1.2: <Parallels> at usbus1
Jan 1 03:08:03 vmfb10leom kernel: Trying to mount root from
ufs:/dev/ada0p2 [rw,noatime]...
Jan 1 03:08:03 vmfb10leom kernel: ct_to_ts([2038-01-01 00:07:55]) =
2145917275.000000000
Jan 1 03:08:03 vmfb10leom kernel: debug.clocktime: 1 -> 1
Jan 1 03:08:03 vmfb10leom kernel: Setting hostuuid:
e45578a4-b6bc-1443-bc57-087657842ce5.

Содержат единственный вызов ct_to_ts(), сразу после монтирования
корневой ФС. Что наводит мысли об источнике времени, если его получение
из RTC завершается ошибкой.

--
Успехов, Сергей Леонтьев. E-mail: ***@CryptoPro.ru
Ivan Shmakov
2014-12-04 22:09:45 UTC
Permalink
[...]
Post by Serguei E. Leontiev
Jan 1 03:08:03 vmfb10leom kernel: Root mount waiting for: usbus1
Jan 1 03:08:03 vmfb10leom kernel: ugen1.2: <Parallels> at usbus1
Jan 1 03:08:03 vmfb10leom kernel: Trying to mount root from ufs:/dev/ada0p2 [rw,noatime]...
Jan 1 03:08:03 vmfb10leom kernel: ct_to_ts([2038-01-01 00:07:55]) = 2145917275.000000000
[...]

СЕЛ> Содержат единственный вызов ct_to_ts(), сразу после монтирования
СЕЛ> корневой ФС. Что наводит мысли об источнике времени, если его
СЕЛ> получение из RTC завершается ошибкой.

Может быть, снимается простой mtime с /?
--
FSF associate member #7257 http://boycottsystemd.org/ .. 3013 B6A0 230E 334A
Loading...