Linuxμμ μκ°μ΄ ννλλ λ°©μμΌλ‘ μΈν΄, λΆνΈν 32 λΉνΈ μ«μλ 2038λ 1μ 19μΌ 03:14:07 μ΄νμ μκ°μ μ§μν μ μλ€λ λ¬Έμ λ€.
Y2038, Y2K38, Y2.038K, Unix Millennium Bug λΌκ³ λ λΆλ¦°λ€.
μ΄ λ¬Έμ λ λλΆλΆμ C νλ‘κ·Έλ¨μ΄ time.h λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νκΈ° λλ¬Έμ λ°μνλ€.
#include <time.h>
time_t time(time_t *tloc);
μ΄ λΌμ΄λΈλ¬λ¦¬λ μκ° κ°μ μ μ₯νκΈ° μν νμ€ 4 λ°μ΄νΈ νμμ μ€μ νκ³
μκ° κ°μ λ³ν, νμ λ° κ³μ°νκΈ°μν μ¬λ¬ κΈ°λ₯μ μ 곡νλ€.
λΆνΈν 4 λ°μ΄νΈ μ μμ μ΅λ κ°μ 2,147,483,647λ‘, μ΄λ Y2K38 κ° λ°μνλ€.
λΆνΈν 4 λ°μ΄νΈ μ μκ° μμλ‘ λ‘€μ€λ²λκΈ° μ μ μ΅λ μκ° κ°μ 2,147,483,647μ΄λ©°,
μ΄λ GMT 2038λ
1μ 19μΌ 03:14:07 μ΄λ€.
μ΄ λ μ time.hλ₯Ό μ¬μ©νλ λͺ¨λ C νλ‘κ·Έλ¨μ λ μ§ κ³μ°μ λ¬Έμ κ° λ°μνλ€.
C νλ‘κ·Έλ¨μ λμ μ΄μμ±μΌλ‘ μΈν΄ μλ² λλ μννΈμ¨μ΄μμλ λ§μ΄ μ¬μ©λκΈ° λλ¬Έμ Y2K38 λ¬Έμ λ μ»΄ν¨ν°λΏλ§ μλλΌ λ§μ μλ² λλ μμ€ν μλ μν₯μ λ―ΈμΉλ€.
Y2K38 λ¬Έμ λ‘ μΈν΄ ν΄λΉ λ μ§ λλ κ·Έ μ΄μ μ μΌλΆ μ»΄ν¨ν° μννΈμ¨μ΄κ° μ€ν¨ ν μ μλ€. μμ€ν μκ°μ λΆνΈν 32λΉνΈ μ μλ‘ μ μ₯νλ©°, POSIX μκ° νκΈ°λ²μ λ°λ₯΄λ λͺ¨λ μννΈμ¨μ΄ λ° μμ€ν μ μν₯μ λ―ΈμΉλ€. ( POSIX μκ° νκΈ°λ²μ μκ°μ 1970λ 1μ 1μΌ μμ UTC μ΄ν κ²½κ³Όλ μ΄ μκ°μ μ΄μ©νμ¬ νννλ€.)
μμ κ°μ μν©μμ ννν μ μλ μ΅λ μκ°μ 2038λ 1μ 19μΌ 03:14:07 μ΄λ€.
μ΄ μ΄νμ μκ°μ μμλ‘ μ μ₯λμ΄ 2038λ μ΄ μλ 1901λ μ λ μ§λ‘ ν΄μλλ€.
λλΆλΆμ νλ‘κ·Έλ¨μ΄ 2038λ μ, λλ κ·Έμ κ·Όμ ν μκΈ°μ μν₯μ λ°κ² μ§λ§, λ―Έλ λ μ§λ₯Ό λ€λ£¨λ νλ‘κ·Έλ¨μ ν¨μ¬ 빨리 λ¬Έμ μ λΆλͺμΉ κ²μ΄λ€.
μλ₯Ό λ€μ΄, 20λ λ€μ μμΌμ κ³μ°νλ νλ‘κ·Έλ¨μ 2038λ λ³΄λ€ 20λ μ μΈ 2018λ μ΄μ μ μμ ν΄μΌ νλ€.
2006λ 5μμ λ°μν AOLserver μννΈμ¨μ΄μ λ¬Έμ λ μ΅μ΄λ‘ λνλ 2038λ λ¬Έμ μ μλ€.
AOL μλ² μμ€ν μ μ΄κΈ° μ€κ³μμλ λ¨μν μμμ μκ° μ΄κ³Ό λ μ§λ₯Ό μ§μ νμ¬ μ²λ¦¬νμΌλ©°, μλ²μ κΈ°λ³Έ ꡬμ±μ μμ²μ΄ 10μ΅ μ΄ νμ time outμ΄ λλλ‘ μ§μ νλ€.
μ΄λ 2006λ
5μ 12μΌ 21:27:28 λΆν° 10μ΅ μ΄ (μ½ 32 λ
) μ΄νμλ λ¬Έμ κ° λλ λ μ§λ₯Ό μ΄κ³Όνλ€.
λ°λΌμ time out κ³μ°μ΄ μ€λ²νλ‘μ°λκ³ κ³Όκ±°μ λ μ§κ° λ°νλμ΄ μννΈμ¨μ΄κ° μ€λ¨λμλ€.
λΉλΆνΈν 32 λΉνΈ time_t
λΆνΈν 32λΉνΈ μ μ ννμ λΉλΆνΈνμΌλ‘ λ³νν κ²½μ°, μ΅μμ λΉνΈλ₯Ό λΆνΈλ‘ ννν νμκ° μλ€. λ°λΌμ λΆνΈνμΌ λλ μ΅λ 2,147,483,647κΉμ§ νν κ°λ₯ν λ°λ©΄μ, λΉλΆνΈνμΌ λ μ΅λ 4,294,967,295κΉμ§ ννμ΄ κ°λ₯νλ€.
νμ§λ§ time_t
λ λ μ§μ μκ°μ μ μ₯νλ λ°λ§ μ¬μ©λλ κ²μ΄ μλλΌ λ§μ μμ©μμ μκ°/λ μ§ μ°¨μ΄λ₯Ό μ μ₯νλ λ°μλ μ¬μ©νκΈ° λλ¬Έμ, λ¬Έμ κ° λ°μν μ μμΌλ©°, 1970λ
μ΄μ λ μ§λ₯Ό λ€λ£¨λ μμ©μ μνν μ μλ€.
λ§μ½ λΉλΆνΈνμΌλ‘ λ°κΎΌλ€ ν΄λ, μ΄ λ¬Έμ λ 2106λ 2μ 7μΌ 06:23:15 λ‘ μ§μ°λ κ²μ΄λ€.
λΆνΈν 64 λΉνΈ time_t
64 λΉνΈ νλ‘κ·Έλ¨μμ time_t
λ λ μ§μ μκ°μ κΈ°μ ν 2,920μ΅κΉμ§ λνλΌ μ μμΌλ©°, μ΄λ νμ¬ μμ μ°μ£Ό λμ΄μ μ½ 20 λ°°λ€.
2038λ μ λͺ¨λ PCμ 64 λΉνΈ CPUκ° μλλΌλ νμ νΈνμ±μΌλ‘ μΈν΄ μ΄μ μ 32 λΉνΈ νλ‘κ·Έλ¨μ΄ λ§μ΄ μ€νλλ©° μ΄λ‘ μΈν΄ λ¬Έμ κ° λ°μν μ μλ€.
βμ μμ±λ νλ‘κ·Έλ¨βμ μλ‘μ΄ λ²μ μ λΌμ΄λΈλ¬λ¦¬λ‘ κ°λ¨ν μ¬ μ»΄νμΌ ν μ μλ€. μ΄λ μ 체 μκ°μ μ체μ μΈ μκ° type λ° functionμΌλ‘ μΊ‘μννκΈ° λλ¬Έμ κ°λ₯ν κ²μ΄λ€.
νμ§λ§ μλ² λλμ κ²½μ° μ΄λ¬ν μΉ©μ μ νν μ°Ύμλ΄κΈ° λ§€μ° μ΄λ ΅κ³ , λ°κ²¬νλλΌλ μμ± λ° κΈ°ν λ§μ μ°μ£Ό μ₯λΉμμ μ΄λ¬ν μΉ©μ μ κ±°νλ κ²μ λΉνμ€μ μ΄λ€.
time_t
λ°μ΄ν° νμμ μ μλ₯Ό 64 λΉνΈλ‘ λ³κ²½νλ©΄ μννΈμ¨μ΄ λ° λ°μ΄ν° μ μ₯μμ μ΄μ§ νΈνμ±μ΄ μμλ μ μκ³ . μ΄μ§ μκ° ννμ μ²λ¦¬νλ λͺ¨λ μ½λμ μν₯μ μ€ μ μλ€.
NetBSDμ ν΄κ²° λ°©μ
NetBSD 6.0 Release (October, 2012)λΆν° NetBSDλ 32 λΉνΈ λ° 64 λΉνΈ μν€ν
μ²μ λͺ¨λ 64 λΉνΈ time_t
λ₯Ό μ¬μ©νλ€. λν μ΄μ§ νΈνμ± κ³μΈ΅μ ν΅ν΄ μ΄μ NetBSD Release λ‘ μ»΄νμΌ λ μμ© νλ‘κ·Έλ¨μμ 32 λΉνΈ time_t
λ₯Ό μ§μν μ μλ€.
32 λΉνΈ ABI
time_t
(struct timespec
,struct timeval
κ³Ό κ°μ κ΄λ ¨ λ°μ΄ν° ꡬ쑰)λ₯Ό μ¬μ©νλ λμ , 64 λΉνΈμΈtimespec64
,ktime_t
λ₯Ό μ¬μ©νλλ‘ λ³κ²½νλ€.
struct timespec{
time_t tv_sec; /* seconds */
long tv_nsec; /* nanosecond */
};
struct timeval{
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
timespec
, timeval
ꡬ쑰, time_t
λ₯Ό μ¬μ©νμ¬ Y2K38 λ¬Έμ λ₯Ό κ²ͺλλ€.typedef __s64 time64_t;
struct timespec64{
time64_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
union ktime{
s64 tv64;
};
typedef union ktime ktime_t;
timespec64
, ktime_t
ꡬ쑰, 64-bit signed intνμ μ¬μ©νμ¬ Y2K38 λ¬Έμ λ₯Ό ν΄μν μ μλ€. time_t
λλ timespec
, timeval
λ± νμ λ°μ΄ν° ꡬ쑰λ₯Ό νλΌλ―Έν°λ‘ μ λ¬νλ System call (ioctl μ μΈ)μ΄ μλλ°, μ΄ time_t
λ₯Ό 64 λΉνΈλ‘ νμ₯νκΈ° μν΄μ μλ‘μ΄ System callλ‘ κ΅μ²΄νκ³ μ΄μ λ²μ κ³Όμ νΈνμ±μ μ μ§ν΄μΌ νλ€.
λ°λΌμ λͺ¨λ System callμ 64 λΉνΈλ‘ λ³κ²½νλ©΄μ, νΈνμ±μ μ μ§νκΈ° μν΄ CONFIG_COMPAT_TIMEλ₯Ό λμ νλ€.
CONFIG_COMPAT_TIMEμ 32 λΉνΈ νΈν λͺ¨λλ₯Ό κ°μ§ 64 λΉνΈ μν€ν
μ²μ μλ‘μ΄ System call μ μ 곡νλλ‘ νμ₯λ λͺ¨λ 32 λΉνΈ μν€ν
μ²μμ μΈν
λλ€.
3) Filesystem Timestamps
리λ
μ€ νμΌ μμ€ν
μΈ EXT4λ βextraβ λΉνΈλ₯Ό ν΅ν΄ timestampλ₯Ό νμ₯νλ€.
βextraβ 32 λΉνΈ λ΄μμ νμ 2 λΉνΈλ 32 λΉνΈ μ΄ νλλ₯Ό 34 λΉνΈλ‘ νμ₯νλλ° μ¬μ©νκ³ ,
μμ 30 λΉνΈλ λλ
Έ μ΄ timestampμ μ νλλ₯Ό μ 곡νλ λ° μ¬μ©νλ€.
λλ¬Έμ timestampλ 2446λ 5μκΉμ§ μ€λ²νλ‘μ° λμ§ μλλ€.
νμ§λ§, μλμ ν¨μμμ, Y2K38 λ¬Έμ λ‘λΆν° μμ νμ§ μμ CURRENT_TIME_SEC μ μ¬μ©μΌλ‘ μΈν΄ Y2K38 λ¬Έμ λ₯Ό κ²ͺκ² λλ€.
struct timespec ext4_current_time(struct inode *inode){
return (inode->i_sb->s_time_gran < NSEC_PER_SEC) ?
current_fs_time(inode->i_sb) : CURRENT_TIME_SEC;
}
ext4_current_time()
μ΄ μμ λκ³ current_time()
μ΄ λ체λμλ€. [12]4) Use Monotonic clock instead of Wall time
Monotonic clockμ μμ€ν μ΄ λΆν ν λ 0λΆν° μμνλ©° μ¦κ°νλ λ°λ©΄, Wall clockμ μ€μΈκ³ μκ°μ λνλΈλ€.
μ¬λΆν μμ΄ μμ€ν μ΄ 100λ λμ μ μ§λμ§λ μμ κ²μΌλ‘ μμνκΈ° λλ¬Έμ, Monotonic clock λ₯Ό μ¬μ©νμ¬ μ»μ μκ°μ μ€μ λ²μλ νμ 32 λΉνΈ κ° λ²μ μμ μλ€.
Y2K38 λ¬Έμ λ 32λΉνΈ μ»΄ν¨ν°λ₯Ό μ¬μ©νλ κ²½μ° λΏλ§ μλλΌ,
μμ€ν
λ΄μμ time νλκ° μ΄λ»κ² μ μ₯λλμ§μ λ¬λ € μλ€.
32 λΉνΈ timestampμ ν¨κ» 32 λΉνΈ μ λμ€ μμ€ν
μ μ¬μ©νλ κ²½μ°, Y2K38μ μν₯μ λ°λλ€.
μλλ 32 λΉνΈ μμ€ν
μμ 64 λΉνΈ μ λμ€ timestampλ₯Ό μ¬μ©νλ μμ λ€.
typedef long long time64_t;
time64_t mktime64 (struct tm *t);
struct tm *localtime64_r (const time64_t *t, struct tm *p);
OpenBSD 5.5μμλ 32λΉνΈ νλ«νΌμμλ 64λΉνΈλ‘ μκ° κ°μ μ²λ¦¬ν΄μ Y2K38μμ λ²μ΄λλλ‘ νλ€.
νμ§λ§ μ΄λ‘ μΈν΄ ABIκ° λ°λμ΄, OpenBSD 5.4μ μ€ν νμΌκ³Ό λΌμ΄λΈλ¬λ¦¬λ₯Ό μ€νμν¬ μ μλ€. λν μΌλΆ λ€νΈμν¬ νλ‘ν μ½, νμΌ νμμ λ΄λΆμ μΌλ‘ 32λΉνΈλ‘ μκ°μ μ μ₯νλλ°,
μ΄λ₯Ό λ¨μμΌ λ΄μ λͺ¨λ 64λΉνΈλ‘ μ νν μ μλ€λ 보μ₯μ΄ μλ€.
Linux Kernel 5.6 Release μμλ, λͺ¨λ time_t
μ μ μ λ€μ λ€μ κ²ν νμ¬ μ»€λμ΄ μ₯κΈ°μ μΌλ‘ μ μ§ κ΄λ¦¬ κ°λ₯ν μνμΈμ§ νμΈνκ³ , time_t
μ λν λͺ¨λ μ°Έμ‘°λ₯Ό μμ ν λμμΌλ‘ λ체νμ¬ Y2K38 λ¬Έμ λ₯Ό ν΄μνλ€.
Bergmannμ User Space μμ© νλ‘κ·Έλ¨μ μ΅μ Linux Kernel System callμ μ¬μ©ν΄μΌ νλ©°,
GNU C Library 2.32 λ° Musl libc 1.2λ₯Ό μ¬μ©νμ¬ 64 λΉνΈ time_tμ λν΄ User Spaceλ₯Ό λΉλν΄μΌ νλ€κ³ λ°ννλ€.
λ€μμ Y2K38 λ¬Έμ ν΄μλ₯Ό μν λͺ κ°μ§ μ£Όμ μ¬νμ΄λ€.
System call μΈν°νμ΄μ€λ₯Ό μ§μ μ¬μ©νλ μμ© νλ‘κ·Έλ¨μ κΈ°μ‘΄ System call λμ , Linux 5.1μ μΆκ°λ time64 System callμ μ¬μ©νλλ‘ ν¬ν ν΄μΌ νλ€.
Kernel uapi.hμ 볡μ¬λ³Έ λλ κ·Έ λ΄μ©μ μ¬μ©νλ μμ© νλ‘κ·Έλ¨, νΉν sound/asound.h, xfs/xfs_fs.h, linux/input.h, linux/elfcore.h, linux/sockios.h, linux/timex.h λ° linux/can/bcm.h μ κ²½μ°μλ Linux 5.6 λ²μ μΌλ‘ μ λ°μ΄νΈν΄μΌ νλ€.
λλ¨Έμ§ μΈν°νμ΄μ€ μ€ μΌλΆλ νΈνλμ§ μμ, 64 λΉνΈ time_tλ₯Ό μ λ¬ν μ μμΌλ―λ‘ CLOCK_MONOTONIC μκ° λλ λΉλΆνΈν 32 λΉνΈ timestampλ₯Ό μ¬μ©νλλ‘ κ΅¬μ±ν΄μΌ νλ€.
64 λΉνΈ μμ€ν
μ μ‘΄μ¬νλ λͺ¨λ y2K38 λ¬Έμ λ 32 λΉνΈ μμ€ν
μλ λκ°μ΄ μ μ©λλ©°. νΉν λΆνΈν 32 λΉνΈ timestampκ° μλ νμΌ μμ€ν
(ext4, ext2, xfs, ufs)μ μν₯μ λ―ΈμΉλ€.