นาฬิกา Linux จะล้มเหลวในวันที่ 19 มกราคม 2038 3:14:08 หรือไม่


23

ฉันกังวลเล็กน้อยเกี่ยวกับเรื่องนี้ มันเรียกว่า "ปัญหาปี 2038" เคอร์เนล Linux หรือ Ubuntu พร้อมที่จะจัดการกับวันที่หลังจากนี้หรือไม่ ณ วันที่ 12.04


8
คุณลองตั้งนาฬิกาของคุณเป็นอย่างเช่นวันที่ 19 มกราคม 2038 3:14:07 แล้วรอสักครู่?
gertvdijk

2
สมมติว่าปัญหานี้มีอยู่และยังไม่ได้รับการแก้ไข 12.04 จะไม่ได้รับการสนับสนุนตลอดไปดังนั้นคุณและคนอื่น ๆ ทั้งหมดจะได้รับการอัปเดตจนกว่าจะเกิดเหตุการณ์นี้เนื่องจากมีหลายปีระหว่าง การอัปเดตเป็นเรื่องง่าย หนึ่งในการอัปเดตเหล่านี้จะมีการแก้ไขอย่างแน่นอน ดังนั้นจึงไม่มีเหตุผลที่ต้องกังวล แต่นี่เป็นคำถามที่น่าสนใจ
verpfeilt

3
ข้อผิดพลาดได้รับการแก้ไขแล้ว
ThePiercingPrince

นาฬิการะบบจะไม่ (ไม่ใช่เคอร์เนลล่าสุดอย่างสมเหตุสมผล); โครงสร้างข้อมูลบางอย่าง (และโปรแกรมที่ใช้) อาจมีพฤติกรรมที่ผิดปกติ ในความคิดของฉันนี้จะมีปัญหากับอุปกรณ์ฝังตัว - เหล่านั้นมีโอกาสน้อยที่จะใช้รหัสปัจจุบัน
Piskvor

1
@hmayag: ฉันไม่ได้คิดว่า "เครื่องปิ้งขนมปัง" เหมือน "ตัวควบคุมสัญญาณไฟจราจร" สิ่งเหล่านี้มีความทนทานมากกว่าอุปกรณ์อิเล็กทรอนิกส์ระดับผู้บริโภคและอาจเกินอายุการใช้งานนั้น (ด้วยการเปลี่ยนชิ้นส่วนแต่อาจไม่มีการอัพเกรด) - IIRC มีปัญหาบางอย่างกับอุปกรณ์อิเล็กทรอนิกส์ยุค 1980 หลังจาก Y2K
Piskvor

คำตอบ:


13

ไม่มันจะไม่ล้มเหลว ในกรณีที่เลวร้ายที่สุดจากมุมมองของโปรแกรมเมอร์มันจะทำงานได้ตามที่คาดไว้: มันจะถูกเปลี่ยนเป็นวันที่ 1901-12-13 20:45:52:

ป้อนคำอธิบายรูปภาพที่นี่

ในกรณีนี้คุณจะไม่อัปเดตการแจกจ่ายปัจจุบันของคุณจนกว่าจะเกิดเหตุการณ์นี้ขึ้น "การอัปเดตเป็นเรื่องง่ายหนึ่งในการอัปเดตเหล่านี้จะมีการแก้ไข " เช่นเดียวกับchocobaiกล่าว

ฉันจำได้ว่ามันเป็นปัญหา / คำถามเดียวกันกับเครื่อง 16 บิตก่อนปี 2000 และในที่สุดก็ไม่มีปัญหาใด ๆ

ทางออกจาก Wikipedia:

ระบบปฏิบัติการส่วนใหญ่ออกแบบมาเพื่อทำงานบนฮาร์ดแวร์ 64 บิตแล้วใช้time_tจำนวนเต็ม64 บิตที่ลงชื่อแล้ว การใช้ค่า 64 บิตที่ได้รับการลงนามจะแนะนำวันที่ใหม่ซึ่งมีอายุมากกว่ายี่สิบเท่าของอายุโดยประมาณของจักรวาล: ประมาณ 292 พันล้านปีจากนี้ไปจนถึงเวลา 15:30:08 น. ในวันอาทิตย์ที่ 4 ธันวาคม 292,277,026,596 ความสามารถในการคำนวณในวันที่ถูก จำกัด ด้วยความจริงที่ว่าtm_yearใช้ค่า int 32 บิตที่ลงนามเริ่มต้นที่ 1900 สำหรับปี สิ่งนี้ จำกัด ปีสูงสุดที่ 2,147,485,547 (2,147,483,647 + 1900) แม้ว่าวิธีนี้จะช่วยแก้ปัญหาสำหรับการดำเนินการโปรแกรม แต่ก็ไม่ได้แก้ปัญหาการจัดเก็บค่าวันที่ในไฟล์ข้อมูลไบนารีซึ่งส่วนใหญ่ใช้รูปแบบการจัดเก็บข้อมูลที่เข้มงวด นอกจากนี้ยังไม่สามารถแก้ปัญหาสำหรับโปรแกรม 32 บิตที่ทำงานภายใต้ชั้นเข้ากันได้และไม่อาจแก้ปัญหาสำหรับโปรแกรมที่ไม่ถูกต้องในการจัดเก็บค่าของเวลาในตัวแปรประเภทอื่น ๆ time_tกว่า

ฉันใช้ Ubuntu 13.04 กับ 64 บิตและด้วยความอยากรู้อยากเห็นฉันเปลี่ยนเวลาเป็น 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
การสนทนาในความคิดเห็นนี้เป็น IMO ไม่มีจุดหมาย คำถามคือ "เคอร์เนล Linux หรือ Ubuntu พร้อมที่จะจัดการกับวันที่หลังจากนี้หรือไม่" มันไม่สามารถจัดการวันที่ดังกล่าวได้ดังนั้นจึงล้มเหลวในบริบทของคำถามนี้
gertvdijk

2
@gertvdijk " เคอร์เนล Linux " ปัจจุบัน / จริง "หรือ Ubuntu พร้อมที่จะจัดการกับวันที่หลังจากนี้หรือไม่?"
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 เอาล่ะมันให้ผลลัพธ์แรกในคอมพิวเตอร์ที่ได้รับการติดตั้งและแล็ปท็อป Ubuntu ของฉันให้ที่สองในขณะที่สามมาจากเซิร์ฟเวอร์ Debian ของฉัน ฉันไม่ได้เขียนรหัสจริง ๆ มันคือทั้งหมดที่อยู่ในอินเทอร์เน็ตในรูปแบบที่แน่นอน
SkylarMT

2
ได้รับการยืนยัน หากคุณมีเครื่อง 64 บิตสิ่งนี้จะใช้ได้ นอกจากนี้ ... ใครของเราจะมีเครื่อง 32 บิตเท่านั้นที่ยังคงทำงานในปี 2581?
jrg

1
ฉันไปหาสิ่งนี้เพื่อแสดงให้เห็นถึงปัญหาในปี 2038 กับเพื่อนร่วมงานและ 2 ปีหลังจากแสดงความคิดเห็นข้างต้นฉันมีข้อสงสัยเล็กน้อยว่าในปี 2038 เราจะมีเครื่อง 32 บิตที่จะล้มเหลว อามองโลกในแง่ดีอ่อนเยาว์
jrg

@James บางคนอาจไม่รู้ตัว อาจจะมีการฝังตัว Linux 32 บิตในอุปกรณ์ IoT ที่ไม่มีการแก้ไข จุดจบของโลก? ไม่ปัญหาในบางสถานที่? อย่างแน่นอน.
ศ. Falken สนับสนุน Monica

3

ฉันเขียนและตีพิมพ์บทความสั้น ๆ เกี่ยวกับเรื่องนี้ในปี 1996 ซึ่งรวมถึงโปรแกรม C สั้น ๆ เพื่อแสดงให้เห็น ฉันมีอีเมลกับ David Mills เกี่ยวกับปัญหาที่คล้ายกันกับ NTP - Network Time Protocol ใน Ubuntu 14.04 64- บิตแล็ปท็อปของฉันรหัส perl ไม่แสดงข้อ จำกัด ดังนั้น libs 64- บิตพื้นฐานจะต้องได้รับการแก้ไข

อย่างไรก็ตามการรันโค้ดทดสอบที่ผ่านมานานของฉันจะแสดงเวลาที่ย้อนกลับไปสู่ยุค UNIX ดังนั้นไม่ใช่ทั้งหมดที่ดีกับรหัส 32 บิตจากที่ผ่านมา

กระดาษ 1996 ของฉันเวลา UNIX จะหมดในปี 2038! อยู่ในเว็บไซต์ของฉันมาตั้งแต่ประมาณปี 2000 ตัวแปรของหัวข้อนี้ "เวลา UNIX" ได้รับการเผยแพร่ในปี 1998 ใน "วิธีปฏิบัติที่ดีที่สุดปี 2000 สำหรับคอมพิวเตอร์มิลเลนเนียม Y2K" ไอ 0136465064


2

64-bit Linux พร้อมอย่างน้อยถ้าคุณกำลังพูดถึงส่วนติดต่อหลักของระบบปฏิบัติการ (แน่นอนว่าแอพพลิเคชั่นแต่ละตัวยังสามารถขันได้) time_t ถูกกำหนดแบบดั้งเดิมเป็นนามแฝงสำหรับ "long" และ "long" บน 64-bit linux คือ 64- บิต

สถานการณ์สำหรับ Linux แบบ 32 บิต (และเลเยอร์ความเข้ากันได้สำหรับไบนารีแบบ 32 บิตบน Linux แบบ 64 บิต) นั้นเป็นสีดอกกุหลาบที่น้อยกว่ามาก มันหักและแก้ไขได้โดยไม่ทำลายไบนารีที่มีอยู่ทั้งหมดไม่ใช่เรื่องง่าย API จำนวนมากใช้ time_t และในหลาย ๆ กรณีมันถูกฝังไว้เป็นส่วนหนึ่งของโครงสร้างข้อมูลดังนั้น API จึงต้องไม่ซ้ำซ้อนกับโครงสร้างข้อมูลที่ทำงานด้วย

แม้ว่าจะมีบางระดับของความเข้ากันได้ย้อนหลังไบนารีทั้งหมดที่ต้องการรับเวลาที่ถูกต้องจะต้องถูกสร้างใหม่เพื่อใช้อินเตอร์เฟสเวลา 64 บิตใหม่

มีการทำงานบางอย่างเสร็จแล้ว (ดูตัวอย่างhttps://lwn.net/Articles/643234/และhttp://www.sourceware.org/ml/libc-alpha/2015-10/msg00893.html ) แต่เรายังไม่เข้าใจ ยังคงเป็นทางยาวจากโซลูชันที่สมบูรณ์ ยังไม่ชัดเจนว่าจะมีจุดประสงค์ทั่วไป 32- บิตที่ปลอดภัย Y2K38 หรือไม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.