- เพื่อ ป้องกันปัญหา Y2K38 (Unix Epochalypse) ล่วงหน้า Debian ได้ประกาศอย่างเป็นทางการว่า ตั้งแต่ Debian 13 เป็นต้นไป จะใช้
time_t แบบ 64 บิตแม้กับสถาปัตยกรรม 32 บิต
- จาก ข้อจำกัดของ
time_t แบบ 32 บิตเดิม ที่อาจทำให้หลังวันที่ 19 มกราคม 2038 เวลาเด้งย้อนกลับไปเป็นปี 1900 ได้ จึงตัดสินใจว่าจะไม่ปล่อยปัญหานี้ค้างไว้อีกต่อไป
- แม้ฮาร์ดแวร์ 64 บิตจะปลอดภัยอยู่แล้ว แต่ก็ยังมี ความต้องการใช้ Debian ในอุปกรณ์ 32 บิตที่อ่อนไหวต่อด้านต้นทุน เช่น embedded และ IoT จึงจำเป็นต้องรับมือไว้ล่วงหน้า
- กำลังมีงานขนาดใหญ่เพื่อ เปลี่ยนชนิด
time_t ที่กระจายอยู่ในแพ็กเกจทั้งหมด 6,429 แพ็กเกจพร้อมกัน โดยยอมรับการแตกหักของความเข้ากันได้ระดับ ABI
- สถาปัตยกรรมรุ่นเก่าบางส่วน เช่น i386 และ hurd-i386 จะยังคงเป็นข้อยกเว้น แต่ก็มีการกล่าวถึงความเป็นไปได้ในการเพิ่มสถาปัตยกรรม x86 (i686) ที่ใช้
time_t แบบ 64 บิต
การรับมือบั๊ก Y2K38 ของ Debian: เปลี่ยนไปใช้เวลา 64 บิต
- Debian กำลังเปลี่ยนไปใช้ระบบเวลา 64 บิตในทุกสภาพแวดล้อม ยกเว้นฮาร์ดแวร์รุ่นเก่าที่สุดบางส่วนที่ยังรองรับอยู่ เพื่อหลีกเลี่ยงปัญหา Y2K38 หรือ Unix Epochalypse ที่กำลังจะมาถึง
- แนวทางนี้ช่วยป้องกัน ความผิดพลาดของค่าเวลาอันเกิดจากการเกินขอบเขตของ signed int 32 บิต ซึ่งมีกำหนดจะเกิดในวันที่ 19 มกราคม 2038
เบื้องหลังปัญหา Y2K38 และ Unix Epochalypse
- ปัญหา Y2K38 คือปรากฏการณ์ในระบบ Unix ที่เก็บ จำนวนวินาทีที่ผ่านไปนับจากวันที่ 1 มกราคม 1970 ด้วย signed int 32 บิต ซึ่งเมื่อเลยปี 2038 ไปแล้วจะเกิด overflow ทำให้เวลาเด้งย้อนกลับไปเป็นอดีต เช่น ปี 1900
- นี่มีที่มาจาก การตัดสินใจเชิงสถาปัตยกรรมที่เลือกใช้ชนิดข้อมูลแบบสั้น คล้ายกับกรณี Y2K ในอดีต
- ตอนเกิด Y2K สามารถหลีกเลี่ยงความโกลาหลครั้งใหญ่ได้ด้วยการรับมือล่วงหน้าของนักพัฒนา
- แม้ ซอฟต์แวร์สำหรับฮาร์ดแวร์ 64 บิตจะปลอดภัยอยู่แล้ว แต่ Debian ก็ยังถูกใช้อย่างกว้างขวางในสภาพแวดล้อมแบบ embedded, เครื่องสเปกต่ำ และระบบเก่า
การรับมือหลักของ Debian
- ตั้งแต่การออก Debian 13 "Trixie" เป็นต้นไป จะตั้งค่า
time_t แบบ 64 บิตเป็นค่าปริยายในทุกสถาปัตยกรรมหลัก
- ฮาร์ดแวร์ 64 บิตนั้นปลอดภัยอยู่แล้ว แต่ปัญหานี้มักพบใน อุปกรณ์ embedded และฮาร์ดแวร์รุ่นเก่าที่ใช้โปรเซสเซอร์ 32 บิต
- อุปกรณ์เหล่านี้ยังถูกใช้อยู่ใน งานที่อ่อนไหวด้านต้นทุนและมีการผลิตจำนวนมาก เช่น ระบบควบคุมรถยนต์, IoT, ทีวี และเราเตอร์
- แม้อุปกรณ์รุ่นใหม่จำนวนมากจะใช้ลินุกซ์แบบคอมไพล์เอง เช่น OpenEmbedded, Alpine, Android และ Gentoo แต่ การใช้งานอุปกรณ์ embedded ที่อิง Debian ก็คาดว่าจะยังมีต่อไปอีกหลายปี
การนำไปใช้และการเปลี่ยนแปลง
- ตัวแปร
time_t กระจายอยู่ในโค้ดที่ครอบคลุม 6,429 แพ็กเกจ จึงต้องใช้ความพยายามขนาดใหญ่
- การเปลี่ยนแปลงครั้งนี้อาจทำให้ ความเข้ากันได้ของ ABI (Application Binary Interface) แตกหัก จึงต้องปรับพร้อมกันในไลบรารีและแพ็กเกจที่เกี่ยวข้องทั้งหมด
- ตามข้อมูลจากทีมดูแล งานนี้เสร็จสิ้นแล้วและผ่านการทดสอบอย่างเพียงพอ
ข้อยกเว้นและแผนในอนาคต
- พอร์ต i386 (x86 เดิม) จะยังคงใช้
time_t แบบ 32 บิตต่อไป โดยคงไว้เพื่อ ความเข้ากันได้ในการรันไบนารีเดิม
- อาจมีการหารือแยกต่างหากเกี่ยวกับ สถาปัตยกรรม i686 ที่ใช้เวลา 64 บิตและ ISA (สถาปัตยกรรมชุดคำสั่ง) แบบใหม่
- พอร์ต hurd-i386 จะไม่ถูกเปลี่ยน เนื่องจากการรองรับจากเคอร์เนลยังไม่เพียงพอ และกำลังมีการผลักดันแนวทางย้ายไปยัง hurd-amd64 แทน
หมายเหตุสำหรับนักพัฒนา
- นักพัฒนาสามารถทดสอบได้ผ่านวิธีที่แนะนำใน Debian wiki ว่า ซอฟต์แวร์ของตนจะ ไม่พังเมื่อมีการใช้ตัวแปรเวลาแบบ 64 บิต
- รายละเอียดเพิ่มเติมและเอกสารทางเทคนิคดูได้ที่ Debian wiki
1 ความคิดเห็น
ความเห็นจาก Hacker News
time_tก็จะนึกถึงเขาmm/yy) เพราะเขียนสั้นและสะดวก จึงใช้การแทนปีแบบ 2 หลัก ซึ่งเพียงพอกับอายุการใช้งานของบัตร แต่พอถึงปี 2100 ก็อาจเกิดปัญหาในการแปลงค่าได้ ปัญหา Y2K ส่วนใหญ่เกิดจาก UI (ช่องข้อความ 2 ตัวอักษร, hardcode+1900ฯลฯ) บั๊ก Y2K ที่เคยเจอเองคือเว็บบอร์ดอินเทอร์เน็ตแสดงปีจาก 1999 เป็น 19100 (เป็นแค่ข้อผิดพลาดด้านการแสดงผล) และ Y2K ไม่ได้เป็นปัญหาของ COBOL อย่างเดียวintธรรมดาที่มีค่าเป็น 0 ในปี 1900 ก็จะประหยัดไบต์ได้มากกว่าอีก ใช้ 3 ไบต์เก็บได้ตั้งแต่ปี 1900 ถึงประมาณ 44,000 และใช้แค่ 2 ไบต์ก็ครอบคลุมได้ถึงราวปี 2070time_tจะแก้ปัญหา Epochalypse ได้ แต่ไม่ใช่ว่าทุกระบบจะไปใช้แค่จำนวนวินาทีแบบ 64 บิตตรง ๆ เช่น ext4 เปลี่ยนไปใช้ความละเอียดเศษส่วน 30 บิต (ระดับนาโนวินาที) และความละเอียดวินาที 34 บิตแล้ว แต่สุดท้ายอีกหลายร้อยปีก็จะเจอปัญหาอีกอยู่ดี คาดว่าสุดท้ายสักวันจะลงเอยที่ timestamp 128 บิตแบบ 64-bit วินาที + 64-bit เศษส่วน ซึ่งจะครอบคลุมอนาคตที่มนุษย์คาดการณ์ได้ทั้งหมดtime64_tแล้ว ยกเว้น i386 เท่านั้น ข้อยกเว้นนี้เกิดจากความเข้ากันได้กับไบนารีเดิม ส่วนที่เหลือรวมถึง m68k ก็เปลี่ยนหมดแล้ว โดยผู้แสดงความเห็นคนนี้เป็นคนทำ migration ให้ m68k, powerpc, sh4 และ hppa เองtime_tไม่ใช่ตัวแปร แต่เป็นชนิดข้อมูลtime_tปรากฏอยู่ทั่วไปจริง ๆ พบในซอร์สโค้ดของ 6,429 แพ็กเกจจากทั้งหมด 35,960 แพ็กเกจ แพ็กเกจที่เปิดเผย struct ที่มีtime_tอยู่ใน ABI จำเป็นต้องย้าย ABI ทั้งหมดพร้อมกัน” ซึ่ง wiki อธิบายได้ชัดกว่าบทความRLIMIT_STACKก็พอ เช่นulimit -s 4000คือ stack 4MB ถ้าจะให้มากกว่านี้ต้องแก้/etc/security/limits.confแล้วล็อกอินใหม่MAX_ARG_STRLENใหม่ก็ได้ หรือใช้เครื่องที่มี page size ใหญ่กว่า (เช่น RHEL Arm kernel ที่ใช้ page size 64k) แต่การใช้ pipe ส่งข้อมูลระหว่างโปรเซสแทน command buffer ง่ายกว่ามากtime_tแบบ 64 บิตเองแล้วใช้งานมัน