Aasta 2038 probleem: mis see on, miks tekib ja kuidas lahendada

Aasta 2038 probleem on ajahalduse viga, mis võib tekitada tõrkeid arvutites ja seadmetes, mis salvestavad aja 32-bitiste täisarvudena sekundite arvuna alates 1. jaanuarist 1970 (nn Unix-epohh). Sellist aega hoitakse tavaliselt tüübis time_t või sarnases formaat, kus kasutatakse märgitud (signed) 32-bitist arvu.

Miks see probleem tekib

32-bitine märgitud täisarv suudab salvestada väärtuseid vahemikus -2^31 kuni 2^31-1 ehk -2 147 483 648 kuni 2 147 483 647. Kui sekundite loendur jõuab maksimaalsele väärtusele 2 147 483 647, siis järgmisel sekundil toimub ületäitumine ja väärtus pöördub negatiivseks (kõige väiksemaks võimalikuks väärtuseks), mis tõlgitakse ajana 13. detsembril 1901. Seega viimane "õige" hetk, mida 32-bitine ajaesitus suudab esitada UTC-s, on 19. jaanuar 2038 kell 03:14:07 UTC. Pärast seda võib aeg näida valena või tagasi loendada.

Millised süsteemid on ohustatud

  • Vananenud 32-bitised operatsioonisüsteemid ja rakendused, mis kasutavad time_t või muud 32-bitist ajatüüpi.
  • Sisse ehitatud (embedded) seadmed: juhitavad seadmed, tööstusautomaatika, kodu- ja meditsiiniseadmed, routerid, printerid jne, mille firmvare pole uuendatud.
  • Andmebaasid, failisüsteemid ja logid, mis kasutavad 32-bitist ajavälja (näiteks mõned süsteemid, kus TIMESTAMP on piiratud 2038. aastaga).
  • Programmid ja keeled, mis sõltuvad platvormi C-teekide ajatüüpidest (nt vanemad C/C++ programmid, Python, PHP sõltuvalt platvormist).

Millised võivad olla tagajärjed

  • Vale kuupäevade kuvamine ja salvestamine logides, aruannetes ja failides.
  • Kellapõhiste ajastuste ja ajastatud ülesannete ebaõnnestumine (cron-järgsed tööd, piletisüsteemid, litsentside kehtivuse kontroll).
  • Turvasertifikaatide ja turvamehhanismide valesti hindamine (näiteks aegumiskuupäevad), mis võib põhjustada ühenduste katkestatust.
  • Andmebaasi- või rakendusevead, mis võivad viia vigaste andmete või süsteemi ebastabiilsuseni.

Kuidas probleemi lahendada

Peamised lahendused keskenduvad ajaesituse laiendamisele 64-bitisele või muule mittevajutavale vormingule:

  • Kasuta 64-bitist ajaesitust (nt 64-bitine time_t või int64_t sekundite loendur). 64-bitine loendur ei nulli miljoneid aastaid ning on kõige otsesem ja soovitatav lahendus.
  • Uuenda operatsioonisüsteemi ja firmvare — paljud kaasaegsed 64-bitised süsteemid juba kasutavad 64-bitist aega; vanemate 32-bitiste süsteemide tootjad ja Linux/BSD on avaldanud ajumuudatusi ja patch'e, mis võimaldavad 64-bitist aega ka 32-bitistel platvormidel.
  • Väldi 32-bitiseid ajavälju andmebaasides ja failiformaatides — näiteks mõnes andmebaasis on TIMESTAMP piiratud 2038. aastaga; parem on kasutada laiema ulatusega tüüpe (nt DATETIME või stringipõhised ISO 8601 vormingud, int64 sekunditega jne).
  • Kohanda ja rekodeeri tarkvara nii, et see kasutaks int64 tüüpe või standardseid ajaraamistikke (nt POSIX timespec, POSIX-laiendused), ja testi uuesti kompileerituna erinevatel platvormidel.
  • Hoolda ja uuenda sisse ehitatud seadmeid — paljud seadmestikud ei saa automaatselt tarkvara uuendada, seega on vajalik tootja uuendus või seadme välja vahetamine.

Praktiline kontroll ja testimine

  • Kaardista inventuur: tee nimekiri kõikidest süsteemidest ja seadmetest, mis võivad kasutada 32-bitist aega (vanad serverid, võrguseadmed, tööstusseadmed jne).
  • Kontrolli lähtekoodi ja sõltuvusi: otsi kasutust tüüpile time_t, time(), strftime jms ning vaata, kas need on 32- või 64-bitised antud platvormil.
  • Testi ajaloogeneraatoritega või asenda süsteemi kell ajaks enne ja pärast 2038 kuupäeva (või kasuta libfaketime‑rünnakut/testimise tööriistu), et näha, kuidas rakendused käituvad.
  • Kontrolli andmebaase: veendu, et kuupäeva- ja ajaväljad kasutaksid sobiva ulatusega tüüpe; MySQL-i puhul näiteks TIMESTAMP võib olla piiratud, DATETIME on laiema ulatusega.

Mida teha organisatsioonina — kiire kontrollnimekiri

  • 1) Tee inventuur seadmetest ja tarkvarast.
  • 2) Prioritreeri: esmalt kritilised süsteemid (pangandus, tervishoid, energeetika, side, turvasertifikaadid).
  • 3) Uuenda OS/firmvare ja vajalikud teegid, mis toovad 64-bitise aja toe.
  • 4) Rekodeeri ja kompileeri rakendused 64-bitise ajatoega, vajadusel uuenda andmebaasi skeeme.
  • 5) Testi uuendusi liivakastis ja planeeri tootmisse viimine.

Kas muretsemiseks on veel aega?

Paljud tänapäevased 64-bitised serverid ja opsüsteemid juba kasutavad 64-bitist aega, seetõttu on suur osa tööstusest ohust vabastatud. Samas on probleem reaalne vanemate 32-bitiste süsteemide ja paigaldatud seadmete puhul, mille eluiga võib ulatuda kaugele tulevikku (nt 10–20+ aastat). Seetõttu on nendega tegelemine vajalik nüüd, et vältida ootamatuid katkestusi ja kulukaid hädasid 2038. aastal.

Lühike tehniline märkus

32-bitise ajatesi maksimaalne väärtus 2 147 483 647 vastab täpselt kellaajale 2038-01-19 03:14:07 UTC. Järgmisel sekundil (2147483648) teeb signed-int ületäitumise ja tulemuseks on -2 147 483 648, mida tõlgitakse kompleksi kuuenda sajandi asemel varasema ajana (1901. aasta detsember).

Kui võimalik, kasuta 64-bitist komplekti (int64) ajaväljadel ning uuenda kõik kriitilised komponendid enne 2038. aastat. See on peamine ja püsiv lahendus.

Animatsioon, mis näitab, kuidas kuupäev nullistub, kujutatuna 32-bitise täisarvuna (kell 03:14:08 UTC 19. jaanuaril 2038).Zoom
Animatsioon, mis näitab, kuidas kuupäev nullistub, kujutatuna 32-bitise täisarvuna (kell 03:14:08 UTC 19. jaanuaril 2038).


AlegsaOnline.com - 2020 / 2025 - License CC3