Y2038 ``bug'' Linux, UNIX szemszögből

Címkék

Az Earthtimes.org foglalkozik egyik mostani cikkében a Y2038 buggal. Mi is ez a bug? A cikk szerint a legtöbb UNIX és UNIX-szerű operációs rendszeren 2038. január 19-én kedden 03:14:07-kor az idő át fog fordulni 1901. december 13. 20:45:52-re.Miért?

Mert a UNIX operációs rendszerek az időt nem a Gregorian naptár alapján, hanem egy másik időponttól kezdve számítják. Ez az időpont a UNIX EPOCH, azaz 1970. január 1. csütörtök 00:00:00. A standard UNIX idő tárolására egy 32 bites változót (32 bit signed time_t) használnak. Ennek a változónak a legnagyobb értéke 2**31-1 = 2.147.483.647 lehet, azaz az EPOCH után ennyi másodperccel fog bekövetkezni az átfordulás. Ez az időpont 2038 januárjára esik. Egyes rendszereken nem csak átfordul az idő, hanem ellenkező előjellel érvényesül (mert a változó utolsó bitje tárolja a pozitív/negatív előjelet), ezért nem 1970. január 1. csütörtök 00:00:00 lesz a dátum, hanem 1901. december 13. péntek 20:45:52 perc (EPOCH - 2**31 másodperc).

Vajon a mostani operációs rendszerek érintettek?

Egy egyszerű scripttel tesztelhetjük:


#!/usr/bin/perl

use POSIX;

$ENV{'TZ'} = "GMT";

for ($clock = 2147483641; $clock
{

print ctime($clock);

}


(1800MHz 49C) trey@alderaan:~ $ uname -a

Linux alderaan 2.6.12-rc1 #1 Sat Apr 2 11:19:17 CEST 2005 i686 GNU/Linux

(1500MHz 49C) trey@alderaan:~ $ ./foo.pl

Tue Jan 19 03:14:01 2038

Tue Jan 19 03:14:02 2038

Tue Jan 19 03:14:03 2038

Tue Jan 19 03:14:04 2038

Tue Jan 19 03:14:05 2038

Tue Jan 19 03:14:06 2038

Tue Jan 19 03:14:07 2038

Fri Dec 13 20:45:52 1901

Fri Dec 13 20:45:52 1901

Fri Dec 13 20:45:52 1901

trey@teszt$ uname -a

FreeBSD teszt.trey.hu 5.3-STABLE FreeBSD 5.3-STABLE #6: Mon Jan 31 22:17:17 CET 2005 root@teszt.trey.hu:/usr/obj/usr/src/sys/TESZT i386

trey@teszt$ ./foo.pl

Tue Jan 19 03:14:01 2038

Tue Jan 19 03:14:02 2038

Tue Jan 19 03:14:03 2038

Tue Jan 19 03:14:04 2038

Tue Jan 19 03:14:05 2038

Tue Jan 19 03:14:06 2038

Tue Jan 19 03:14:07 2038

Fri Dec 13 20:45:52 1901

Fri Dec 13 20:45:52 1901

Fri Dec 13 20:45:52 1901

trey@teszt$

A hiba úgy tűnik, hogy a legújabb UNIX-szerű rendszereket is érinti. Nagyon aggódni nem kell, mert valószínű, hogy 2038-ra ez a probléma megoldódik. Bár emlékezhetünk arra is, hogy 2000-ben mekkora (többnyire mű)balhé volt a 2000-es fordulókor... A megoldás a 64 bites vagy hosszabb változók bevezetése, némi kódfrissítés, és bizonyos programok újrafordítása...

Az Earthtimes.org cikke itt. Egy részletesebb elemzés a bugról itt.

Hozzászólások

Linux 2.4.30

testa@real1031:~$ perl timetest.pl

Tue Jan 19 03:14:01 2038

Tue Jan 19 03:14:02 2038

Tue Jan 19 03:14:03 2038

Tue Jan 19 03:14:04 2038

Tue Jan 19 03:14:05 2038

Tue Jan 19 03:14:06 2038

Tue Jan 19 03:14:07 2038

Fri Dec 13 20:45:52 1901

Fri Dec 13 20:45:52 1901

Fri Dec 13 20:45:52 1901

2 sor hozza adasa (kereses kb 14 perc, geppeles kb 2 perc) es egy kernel forgatas utan (7 perc kb)...

Osszesen 23 perc raforrditott ido...

esta@real1031:~$ perl timetest.pl

Tue Jan 19 03:14:01 2038

Tue Jan 19 03:14:02 2038

Tue Jan 19 03:14:03 2038

Tue Jan 19 03:14:04 2038

Tue Jan 19 03:14:05 2038

Tue Jan 19 03:14:06 2038

Tue Jan 19 03:14:07 2038

Tue Jan 19 03:14:08 2038

Tue Jan 19 03:14:09 2038

Tue Jan 19 03:14:10 2038

A problema egyszeruen kikuszobolheto ... Viszont nem sok ertelme van mert gyaniitom 2038 ba mar nem ezt a kernelt fogom hasznalni...

forumba iras 3 perc az osszesen 26 perc amig ti ezen ragodtatok az ennel joval tobb volt ...

sun ultra 10 (64 bites), linux-szal:

urbnet:~# uname -a

Linux urbnet 2.4.26-grsec #1 SMP Mon Jul 12 13:07:33 CEST 2004 sparc64 GNU/Linux

urbnet:~# perl ./epoch.pl

Tue Jan 19 03:14:01 2038

Tue Jan 19 03:14:02 2038

Tue Jan 19 03:14:03 2038

Tue Jan 19 03:14:04 2038

Tue Jan 19 03:14:05 2038

Tue Jan 19 03:14:06 2038

Tue Jan 19 03:14:07 2038

Tue Jan 19 03:14:07 2038

Tue Jan 19 03:14:07 2038

Tue Jan 19 03:14:07 2038

Annyira nem vészes a dolog. Mire teljesen elterjednek az asztali 64 bites processzorok, szerintem a Linux és a FreeBSD is váltani fog.

Utóbbi a 64 bites SPARC-oknál már meg is lépte:

$ date -r 2147483648

Tue Jan 19 04:14:08 CET 2038

$ uname -a

FreeBSD cache0.cache.xxx.hu 5.3-STABLE FreeBSD 5.3-STABLE #4: Mon Feb 21 10:07:42 CET 2005 root@cache0.cache.xxx.hu:/usr/obj/usr/src/sys/CACHE sparc64

" hanem nem másik időponttól kezdve számítják."

Ezt javítsd ki, hogy szép legyen az oldalad. :D


A 32 bites unsigned int nem 2szer akkora értéknél fordul át mint a 32bites signed int?

uh és ráadásul még péntek 13. is lesz..... :D

a számítási eredmények pillanatnyi állását lehet freezelni és áttérni az új architektúrára. Legfeljebb a kiesett időt megy /dev/null-ba nem ?

elméletileg :)

ja és ha valakinél a fenti '*****' feleslegessé vált akkor csak dobjon meg vele. csak ne szó szerint :)

Baromira don't care hogy hány bites a processzor. 32 bites rendszeren is röhögve meg lehetne csinálni a 64 bites időábrázolást (mint ahogy a fájlhosszra már működik, sőt az időt is nagyon gyakran 64 biten ábrázolják, ebből 32 a másodperc és 32 azon belüli a nanosec) és 64 bites procin is lehetne 32 bites az idő (bár az eléggé elkefélt dolog volna). Itt egy átállást gyerekjáték 2-3 év leforgása alatt teljesen, kompatibilitási problémák nélkül végigvinni. Szóval nem a processzoron fog állni vagy bukni az egész.

Ahol nagyon oda kell figyelni, azok a különféle kommunikációs és adattárolási formák. Időcímkék tárolása ext3, reiser, jfs, xfs, iso9660, ntfs, vfat, fat12 :-) stb. fájlrendszereken, különféle archiválási formátumukban (tar, cpio, zip, rar, arj...), speciális alkalmazások speciális formátumaiban (például naplóban), időcímkék továbbítása nfs, smb, rsync, ntp stb. protokollokon és biztos van még csomó ehhez hasonló terület. Itt félő hogy sokkalta cinkesebb lesz az átállás, hiszen valszeg új adatformátum- vagy protokollverzióra lesz szükség, ami jobb esetben megoldható a régivel kompatibilisebb módon, rosszabb esetben nem, és protokoll esetén azt mindkét végpontnak támogatnia kell.

Például a nanosec tárolását is több fájlrendszer még mindig nem támogatja, holott napjainkban sokkalta nagyobb gyakorlati szükség volna rá, mint arra hogy 33 év múlva is tudjuk ábrázolni a másodperceket.

Viszont az ilyen programokban van checkpoint/resumw (programallapot elmentes-betoltes) funkcio, hogy hardver hiba eseten ne kelljen az egesz szimulaciot ujrafuttatni. Ebben az esetben egyszeruen atpakoljak egy megfelelo gepre a futo szimulaciot, ami nem erintett a hibaban.

Tartok töle, hogy lesz még akkor 32 bite-s proceszorok , addigra nem, hogy 32 bites de meg 128 bites sem lessz . A 32 bites processzor addigra , olyan számba fog menni mint ma egy 4 bites. :)

Hát ha 4bitest talán nem is, de 8 bites processzorokat manapság igenis használnak, valszeg sokkal több van belőle, mint 32 és 64 bitesből együttvéve, és ez sokáig így is fog maradni. Ezek a mikrovezérlők, amik ma már gyakorlatilag minden háztartási gépben, ipari berendezésben stb. megtalálhatóak; van kb 8-10 lábuk (némelyiknek csak 3-4) és van olyan, amelyik csak annyit fogyaszt hogy egy gombelemről hónapokig is elmegy. Ezeknél nem kell nagy programmemória, nagy számítási teljesítmény és nagy számábrázolás; az a fontos kicsi legyen és olcsó, és bármilyen készülékbe könnyen beépíthető legyen. 2038-ra nem tudom, hogy hogyan fog változni a ré*****ányuk, talán akkor már többnyire 32 bitesek lesznek, de biztos vagyok benne hogy fognak használni még 8 biteseket is. Csak azt nem tudom, hogy hol. Talán emberi sejtek belsejében...

Fri Dec 13 20:45:52 1901

Fri Dec 13 20:45:52 1901

Fri Dec 13 20:45:52 1901

Érti valaki, hogy a túlcsordulás után miért nem nő a másodperc értéke?

Tue Jan 19 03:14:01 2038

Tue Jan 19 03:14:02 2038

Tue Jan 19 03:14:03 2038

Tue Jan 19 03:14:04 2038

Tue Jan 19 03:14:05 2038

Tue Jan 19 03:14:06 2038

Tue Jan 19 03:14:07 2038

Tue Jan 19 03:14:08 2038

Tue Jan 19 03:14:09 2038

Tue Jan 19 03:14:10 2038

Linux i13pc90 2.6.4-52-smp #1 SMP Wed Apr 7 01:58:54 UTC 2004 x86_64 x86_64 x86_64 GNU/Linux

Viszont a 64 bittel úgymond magától meg kellene oldódnia a problémának, mert:

/usr/include/linux/types.h:typedef __kernel_time_t time_t;

/usr/include/asm/posix_types.h:typedef long __kernel_time_t;

Szóval a 64 bites sparc-os eredmény az egyre érdekesebb (;

Jah, annyira nem. Viszont ha 32 bites rendszeren szimulaciokat vagy olyan szamitasokat vegeznek amit most inditanak, de a vege 2038 utan van akkor az talan gaz lehet.

Ez alatt mit is ertesz? Egy evtizedekig futo szimulaciot? Vagy olyan szimulaciot, ami az ido fuggvenyeben vizsgal valamit?

Ha az elobbit, azt enyhen szolva is nehez elkepzelni. Marmint hogy van olyan orult, aki evtizedekig akar futtatni valami programot. (l. Galaxis utikalauz..., 42 stb.).

Az utobbinal pedig teljesen lenyegtelen, hogy a UNIX hogyan szamolja az idot, es milyen valtozoban tarolja. Az ilyen szimulacioknal az ido egy fuggetlen valtozo az egyenletekben, egyenletrendszerekben, es semmi koze a rendszeridohoz.

b

> Ez alatt mit is ertesz? Egy evtizedekig futo szimulaciot?

Ha vegigolvastad rajohettel, hogy nem.

> Vagy olyan szimulaciot, ami az ido fuggvenyeben vizsgal valamit?

Igen, ezt a lehetoseget vetettem fel, mikozben fel szemmel a Jackie Chan filmet neztem.

> Az utobbinal pedig teljesen lenyegtelen, hogy a UNIX hogyan szamolja az idot, es milyen valtozoban tarolja. Az ilyen szimulacioknal az ido egy fuggetlen valtozo az egyenletekben, egyenletrendszerekben, es semmi koze a rendszeridohoz.

Ha ez igy all, akkor azt a lehetoseget kihuzhatjuk. Nagyszeru :-)

$ uname -svap

OpenBSD larva.portable.wooh.hu 3.7 GENERIC#110 i386 Genuine Intel(R) CPU 2.80GHz ("GenuineIntel" 686-class)

Tue Jan 19 03:14:01 2038

Tue Jan 19 03:14:02 2038

Tue Jan 19 03:14:03 2038

Tue Jan 19 03:14:04 2038

Tue Jan 19 03:14:05 2038

Tue Jan 19 03:14:06 2038

Tue Jan 19 03:14:07 2038

Fri Dec 13 20:45:52 1901

Fri Dec 13 20:45:52 1901

Fri Dec 13 20:45:52 1901

Funny. Gondolom addigra javitjak. :-)

Windows Vilag ban ez Y2099 lesz :)

mert utana at fordul 1980-ra :)))))))))))))))