Y2K38

Wikipediasta
Siirry navigaatioon Siirry hakuun
Miten päiväys nollaantuu 32-bittisellä etumerkillisellä kokonaisuluvulla esitettynä (19. tammikuuta 2038 klo 3.14.08 UTC).

Lyhenteellä Y2K38 tarkoitetaan Y2K-ongelmien kaltaista, 19. tammikuuta 2038 tapahtuvaa 32-bittisen kellon ympäripyörähtämistä ja sen aiheuttamia tietojenkäsittelyongelmia.

Unixin sukuisissa käyttöjärjestelmissä aikaa mitataan sekunteina Unix-ajan nollahetkestä (epookki), joka on 1. tammikuuta 1970 kello 0.00.00 UTC. Näissä käyttöjärjestelmissä ja niille tehdyissä sovelluksissa ajan esittämiseen käytetään C-kielen vakiokirjastossa määriteltyä time_t-sekuntilaskuria. time_t puolestaan on perinteisesti ollut 32-bittinen etumerkillinen luku. Suurin sillä ilmaistava sekuntimäärä vastaa hetkeä 3.14.07 UTC tiistaina 19. tammikuuta 2038.

64-bittisyyden mahdollistavalle suoritinarkkitehtuurille rakennetuissa Unixin sukuisissa käyttöjärjestelmissä (esimerkiksi Linux AMD64:lle) on siirrytty käyttämään 64-bittistä time_t:tä, jolla 32-bittisen luvun rajallisuuden aiheuttama ongelma siirtyy miljardien vuosien päähän. 64-bittiset järjestelmät saattavat palvelin- ja henkilökohtaisissa tietokoneissa syrjäyttää 32-bittiset ennen kriittistä ajankohtaa: niihin siirtyminen alkoi laajasti palvelimissa 1990-luvulla ja pöytäkoneissakin 2000-luvun alussa. Sen sijaan sulautetut järjestelmät ovat edelleen lähes täysin 16- tai 32-bittisiä, ja niiden käyttöikä voi olla vuosikymmeniä.[1] Ongelmiin saatetaan törmätä myös 32-bittisissä järjestelmissä jo paljon ennen varsinaista Y2K38-hetkeä: tietoturvayhtiö F-Securen mukaan esimerkiksi 25-vuotisen lainan koron laskeminen voi aiheuttaa ongelmia jo 19. tammikuuta 2013 jälkeen.[2]

Etumerkillinen 32-bittinen kokonaisuluku pyörähtää negatiiviseksi 2 147 483 647 sekunnin jälkeen ja etumerkittömän 32-bittisen luvun kanssa ympäripyörähtäminen tapahtuisi vuonna Y2106.[3][4] Network File System (NFS) protokollaan on tehty muutos, jolla se voi käyttää etumerkittömiä kokonaislukuja aikaleimoissa, jolloin ympäripyörähtäminen tapahtuu vuonna 2106.[5] GNU C Library on muuttanut eräissä tapauksissa käytetyt tietorakenteet käyttämään etumerkitöntä tyyppiä, joka riittää näissä vuoteen 2106 saakka.[6]

Tilapäisratkaisuna on esitetty 32-bittisen time_t:n muuttamista etumerkittömäksi ottamalla etumerkin bitti käyttöön ajan arvolle.[7] Etumerkin bitin käyttöön ottamalla siirtymälle saataisiin lisäaikaa, mutta toisaalta etumerkitön 32-bittinen time_t ei voi ilmaista ajankohtia ennen 1.1.1970 (epookki). Ongelmana on myös, että jos time_t:n tyyppiä muutetaan, sitä käyttävät ohjelmat – käytännössä lähes kaikki ohjelmat – on käännettävä uudelleen. Lisäksi sovellusten etumerkillistä time_t:tä käyttäneessä muodossa tallentamat tiedostot muuttuvat uuden käännöksen kanssa yhteensopimattomiksi.

Ytimen järjestelmäkutsuihin tehtyjen päivityksien lisäksi sovellusohjelmat on päivitettävä käyttämään 64-bittistä tietotyyppiä.[8] Linux-ytimen versiossa 5.6 on lisätty myös 32-bittisille alustoille tuki 64-bittiselle aikaleimalle ongelman ratkaisemiseksi: aiemmin 64-bittinen aikaleima oli vain 64-bittisillä alustoilla.[9] 64-bittinen aikaleima riittää 292 miljardiksi vuodeksi.[10]

Eräät käyttöjärjestelmien jakelut ovat päättäneet lopettaa tuen 32-bittisille järjestelmille ennen vuotta 2038, jolloin ne tukevat vain 64-bittisiä järjestelmiä ilman yhteensopivuusongelmia. Debian on päättänyt tukea 32-bittisiä järjestelmiä ja tekee päivityksiä 64-bittisen aikaleiman käyttämiseksi 32-bittisillä alustoilla.[11][12]

MySQL:n UNIX_TIMESTAMP()-funktio palauttaa arvon nolla 1.1.2038 jälkeen.[13]

  1. https://www.embedded.com/electronics-blogs/barr-code/4372183/Trends-in-embedded-software-design
  2. https://www.f-secure.com/weblog/archives/00002489.html
  3. Fixing the year 2038 problem (PDF) wookware.org. Viitattu 27.4.2024. (englanniksi)
  4. DRAFT: Y2038 Proofness Design sourceware.org. Viitattu 27.4.2024. (englanniksi)
  5. Files With Negative Times Will No Longer Be Supported Over an NFS Mount docs.oracle.com. 2010. Viitattu 28.4.2024. (englanniksi)
  6. Andreas K. Huettel: The GNU C Library version 2.40 is now available lists.gnu.org. 22.7.2024. Viitattu 29.8.2024. (englanniksi)
  7. S. Harshini & K. R. Kavyasri & P. Bhavishya & T. Sethukkarasi: Digital World Bug: Y2k38 an Integer Overflow Threat-Epoch (PDF) ijcseonline.org. 31.3.2017. Viitattu 16.9.2022. (englanniksi)
  8. Jonathan Corbet: Approaching the kernel year-2038 end game lwn.net. 11.1.2019. Viitattu 20.10.2020. (englanniksi) 
  9. Arnd Bergmann: y2038: core, driver and file system changes lkml.org. 29.1.2020. Viitattu 25.2.2021. (englanniksi) 
  10. Trond Endrestøl: When does the 64-bit Unix time_t really end? ximalas.info. 10.3.2015. Viitattu 24.9.2022. (englanniksi)
  11. Jonathan Corbet: 2038: only 21 years away lwn.net. 15.3.2017. Viitattu 28.4.2024. (englanniksi)
  12. ReleaseGoals 64bit-time wiki.debian.org. Viitattu 27.4.2024. (englanniksi)
  13. https://bugs.mysql.com/bug.php?id=12654