2038 년 1 월 19 일 3:14:08에 Linux 시계가 작동하지 않습니까?


23

나는 이것에 대해 조금 걱정하고 있습니다. 이것을 "2038 년 문제"라고합니다. 12.04 기준으로 Linux 커널 또는 Ubuntu가 아직 날짜를 처리 할 준비가 되셨습니까?


8
2038 년 1 월 19 일 3:14:07과 같이 시계를 설정해 보았습니까?
gertvdijk 12

2
이 문제가 존재하지만 아직 수정되지 않았다고 가정 해 봅시다. 12.04는 영원히 지원되지 않으므로이 기간이 지나기까지 귀하와 다른 모든 사람들은 업데이트가 배포 될 때까지 계속 배포 될 것입니다. 업데이트는 쉽습니다. 이러한 업데이트 중 하나에는 반드시 수정 사항이 포함됩니다. 따라서 걱정할 이유는 없지만 실제로 흥미로운 질문입니다.
verpfeilt

3
버그가 이미 수정되었습니다.
ThePiercingPrince 12

시스템 클럭은 그렇지 않습니다 (어쨌든 최근의 커널은 아닙니다). 일부 데이터 구조 (및이를 사용하는 프로그램)는 비정상적인 동작을 보일 수 있습니다. 내 생각에 이것은 임베디드 장치에 문제가 될 것입니다. 현재 코드를 실행할 가능성이 훨씬 적습니다.
Piskvor

1
@hmayag : 나는 "토스터기"를 "교통 신호등"이라고 생각하지 않았습니다. 이러한 것들은 소비자 용 전자 제품보다 조금 더 견고하며 수명을 쉽게 초과 할 수 있습니다 ( 부품 교체는 가능하지만 업그레이드는 불가능). IIRC, Y2K 직후 1980 년대 전자 제품에는 몇 가지 문제가있었습니다.
Piskvor

답변:


13

아니요, 실패하지 않습니다. 최악의 경우 프로그래머의 관점에서 예상대로 작동합니다. 1901-12-13 20:45:52로 재설정됩니다.

여기에 이미지 설명을 입력하십시오

이런 상황이 발생할 때까지 현재 배포를 업데이트하지 않을 경우에 대비합니다. " 업데이트는 쉽습니다. 이러한 업데이트 중 하나에는 반드시 수정 사항이 포함됩니다. "와 같이 chocobai 는 말했습니다.

나는 그것이 2000 이전의 16 비트 머신에서 똑같은 문제 / 질문 이었다는 것을 기억하고 결국에는 아무런 문제가 없었습니다.

Wikipedia의 솔루션 :

64 비트 하드웨어에서 실행되도록 설계된 대부분의 운영 체제는 이미 부호있는 64 비트 time_t정수를 사용합니다. 부호있는 64 비트 값을 사용하면 우주의 예상 연령보다 20 배 이상 큰 새로운 랩 어라운드 날짜가 도입됩니다. 292,277,026,596. 날짜 계산 기능은 다음과 같은 사실에 의해 제한됩니다.tm_year연도 1900에서 시작하는 부호있는 32 비트 int 값을 사용합니다. 이는 연도를 최대 2,147,485,547 (2,147,483,647 + 1900)으로 제한합니다. 이렇게하면 프로그램 실행 문제가 해결되지만 이진 데이터 파일 내에 날짜 값을 저장하는 문제는 해결되지 않으며, 대부분은 엄격한 저장소 형식을 사용합니다. 호환성 계층에서 실행되는 32 비트 프로그램의 경우 문제를 해결하지 않으며 시간 값을 다른 유형의 변수에 잘못 저장하는 프로그램의 경우 문제를 해결할 수 없습니다 time_t.

64 비트에서 Ubuntu 13.04를 사용하고 호기심으로 수동으로 시간을 2038-01-19 03:13:00으로 변경했습니다. 03:14:08 이후 아무 일도 일어나지 않았습니다 :

2038-01-19 전의 날짜와 시간 03:14:08 2038-01-19 이후 날짜 및 시간 03:14:08

따라서이 문제에 대해 걱정할 것이 없습니다.

추가 정보 :


9
다시 설정하면 "실패"로 인해 "작동하지 않거나 잘못 작동"한다는 의미이므로 실패합니다.
ThePiercingPrince

1
@LinuxDistance 이것은 여러분의 관점에서 발생합니다. 그러나 프로그래머의 관점에서 예상대로 작동 합니다. 재설정 됩니다. 그것은 마야 달력의 끝과 같았습니다. 이것 때문에 세계는 실패하지 않았습니다.
Radu Rădeanu

10
동의하지 않습니까? 이 때문에 프로그래머의 관점에서 시계가 리셋에 안되는 것이다 실패
Nanne

3
의견 에서이 토론은 의미가 없습니다. 문제는 "리눅스 커널이나 우분투가이 이후의 날짜를 처리 할 준비가 되었습니까?"입니다. 글쎄, 그것은 그러한 날짜를 처리 할 수 ​​없으므로이 질문의 맥락에서 실패합니다.
gertvdijk

2
@gertvdijk " 현재 / 실제 "이후에 리눅스 커널 또는 우분투가 날짜를 처리 할 준비가 되었습니까? "
Radu Rădeanu

7

다음 Perl 스크립트를 사용하여 컴퓨터 시간이 충돌하는지 확인할 수 있습니다.

#!/usr/bin/perl
use POSIX;
$ENV{'TZ'} = "GMT";
for ($clock = 2147483641; $clock < 2147483651; $clock++) {
    print ctime($clock);
}

컴퓨터가 괜찮다면 다음과 같이 얻을 수 있습니다.

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       <-- Last second in 32-bit Unix systems
Tue Jan 19 03:14:08 2038
Tue Jan 19 03:14:09 2038
Tue Jan 19 03:14:10 2038

컴퓨터가 내 것과 같은 경우 다음과 같이 둘러 쌉니다.

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

또한 이것을 할 수 있습니다 :

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

코어의 실제 운영 체제가 아닌 Perl을 테스트하고 있다고 생각합니다. 아니면 당신이 사용 ctime합니까?
gertvdijk

@gertvdijk 글쎄, 그것은 패치 컴퓨터에서 첫 번째 출력을 제공하고 내 우분투 랩톱은 두 번째를 제공하는 반면 세 번째는 내 데비안 서버에서 제공됩니다. 실제로 코드를 작성하지 않았으며 인터넷 전체에서 동일한 형식으로 작성되었습니다.
SkylarMT

2
확인했다. 64 비트 머신이 있다면 괜찮습니다. 게다가 ... 우리 중 누가 2038 년에 32 비트 전용 머신을 계속 운영 할 것인가?
jrg

1
나는 동료에게 2038 문제를 설명하기 위해 이것을 찾고 있었고 위의 의견을 말한 지 2 년 후에 2038 년에 32 비트 기계가 실패 할 것이라는 점은 거의 의심하지 않습니다. 아, 젊음의 낙관론.
jrg

@ 제임스, 아마 무심코. 당시에는 IoT 장치에 32 비트 Linux가 내장되어있을 것입니다. 세상의 끝? 아니요. 일부 지역에서 문제가 있습니까? 명확히.
Falken 교수는 Monica

3

나는 1996 년에 이것에 관한 짧은 논문을 쓰고 출판했다. 여기에는 그것을 보여주는 짧은 C 프로그램이 포함되어있다. 또한 NTP (Network Time Protocol)와 유사한 문제에 대해 David Mills와 이메일을 보냈습니다. 내 우분투 14.04 64 비트 랩톱에서 perl 코드는 한계를 나타내지 않았으므로 기본 64 비트 라이브러리가 수정되어야합니다.

그러나 오랜 테스트 코드를 실행하면 시간이 UNIX Epoch로 되돌아 간 것을 알 수 있습니다. 따라서 모든 것이 과거의 32 비트 코드와 잘 맞지는 않습니다.

나의 1996 년 논문, 유닉스 타임은 2038 년에 끝날 것입니다! 이 "UNIX Time"이라는 제목의 변형이 1998 년 "Y2K Millennium Computing을위한 2000 년 베스트 프랙티스"ISBN 0136465064에 출판되었습니다.


2

적어도 핵심 OS 인터페이스에 대해 이야기하고 있다면 64 비트 Linux가 준비되었습니다 (개별 응용 프로그램은 여전히 ​​망칠 수 있습니다). time_t는 일반적으로 64 비트 Linux에서 "long"및 "long"의 별칭으로 정의되며 64 비트입니다.

32 비트 Linux (및 64 비트 Linux의 32 비트 바이너리에 대한 호환성 계층)의 상황은 훨씬 덜 장미 빛입니다. 깨진 모든 기존 바이너리를 손상시키지 않고 그것을 고치는 것은 쉬운 일이 아닙니다. 전체 API는 time_t를 사용하며 많은 경우 데이터 구조의 일부로 임베드되므로 API를 복제해야 할뿐만 아니라 작업하는 데이터 구조도 동일해야합니다.

이전 버전과의 호환성이 어느 정도라도 새로운 64 비트 시간 인터페이스를 사용하려면 정확한 시간을 원하는 모든 바이너리를 다시 빌드해야합니다.

일부 작업이 수행되었지만 (예 : https://lwn.net/Articles/643234/http://www.sourceware.org/ml/libc-alpha/2015-10/msg00893.html 참조 ) 우리는 실패했습니다 여전히 완전한 솔루션에서 먼 길입니다. Y2K38에 안전한 범용 32 비트 배포판이 있는지는 확실하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.