- Debian chính thức áp dụng
time_t 64 bit cho cả các kiến trúc 32 bit từ Debian 13 trở đi nhằm chặn trước vấn đề Y2K38 (Unix Epochalypse)
- Do giới hạn của
time_t 32 bit hiện tại, sau ngày 19 tháng 1 năm 2038 thời gian có thể bị quay ngược về năm 1900, nên dự án quyết định không tiếp tục để mặc vấn đề này
- Dù phần cứng 64 bit đã an toàn, Debian nhấn mạnh vẫn còn nhu cầu trên các thiết bị 32 bit nhạy cảm về chi phí như embedded, IoT, nên cần xử lý từ sớm
- Một nỗ lực quy mô lớn đang được triển khai để chuyển đồng thời kiểu
time_t phân bố trong toàn bộ 6.429 gói, chấp nhận một lần phá vỡ tương thích ABI
- Một số kiến trúc hỗ trợ cũ như i386, hurd-i386 sẽ được giữ làm ngoại lệ, đồng thời cũng đề cập khả năng đưa vào kiến trúc x86 (i686) mới dựa trên
time_t 64 bit
Debian ứng phó lỗi Y2K38: chuyển sang thời gian 64 bit
- Debian sẽ chuyển sang thời gian 64 bit trong mọi môi trường, ngoại trừ một phần phần cứng lâu đời nhất còn được hỗ trợ, để tránh vấn đề Y2K38 hay Unix Epochalypse sắp tới
- Việc này giúp ngăn lỗi giá trị thời gian sai do vượt phạm vi
signed int 32 bit dự kiến xảy ra vào ngày 19 tháng 1 năm 2038
Bối cảnh vấn đề Y2K38 và Unix Epochalypse
- Vấn đề Y2K38 là hiện tượng trong các hệ thống Unix biểu diễn số giây đã trôi qua kể từ ngày 1 tháng 1 năm 1970 bằng
signed int 32 bit; khi vượt qua mốc năm 2038 sẽ xảy ra tràn số, khiến thời gian bị quay sai về quá khứ như năm 1900
- Điều này bắt nguồn từ một quyết định kiến trúc chọn kiểu dữ liệu ngắn tương tự như Y2K trước đây (vấn đề năm 2000)
- Khi Y2K xảy ra, các nhà phát triển đã tránh được hỗn loạn lớn nhờ xử lý trước
- Phần mềm cho phần cứng 64 bit vốn đã an toàn, nhưng Debian vẫn được dùng rộng rãi trong các môi trường embedded, cấu hình thấp và legacy
Các biện pháp chính của Debian
- Từ bản phát hành Debian 13 "Trixie", Debian sẽ dùng
time_t 64 bit trên mọi kiến trúc chính làm mặc định
- Phần cứng 64 bit đã an toàn, nhưng vấn đề thường xuất hiện trên thiết bị embedded và phần cứng legacy dùng bộ xử lý 32 bit
- Những thiết bị này vẫn đang được dùng trong các lĩnh vực nhạy cảm về chi phí và xuất xưởng số lượng lớn như điều khiển ô tô, IoT, TV và router
- Nhiều thiết bị mới dùng Linux tự build như OpenEmbedded, Alpine, Android, Gentoo, nhưng việc sử dụng thiết bị embedded dựa trên Debian được dự báo vẫn tiếp tục trong vài năm tới
Triển khai và thay đổi
- Biến
time_t đang phân tán trong 6.429 gói, nên cần một nỗ lực quy mô lớn
- Thay đổi này có thể phá vỡ tương thích ABI (Application Binary Interface), vì vậy tất cả thư viện và gói liên quan được điều chỉnh đồng thời
- Theo nhóm bảo trì, công việc này đã hoàn tất và được kiểm thử đầy đủ
Ngoại lệ và kế hoạch tương lai
- Cổng i386 (x86 cũ) sẽ tiếp tục dùng
time_t 32 bit và được giữ lại nhằm duy trì khả năng chạy các binary hiện có
- Kiến trúc i686 có thể được thảo luận riêng để áp dụng thời gian 64 bit cùng ISA (kiến trúc tập lệnh) mới hơn
- Cổng hurd-i386 sẽ không được chuyển đổi do thiếu hỗ trợ từ kernel; thay vào đó, phương án chuyển sang hurd-amd64 đang được tiến hành
Ghi chú cho nhà phát triển
- Các nhà phát triển có thể kiểm tra xem phần mềm của mình có bị hỏng khi áp dụng biến thời gian 64 bit hay không bằng các hướng dẫn trên wiki Debian
- Thông tin chi tiết và tài liệu kỹ thuật có tại Debian wiki
1 bình luận
Ý kiến trên Hacker News
time_t64-bit tôi sẽ lại nhớ đến ông ấymm/yy) dùng năm 2 chữ số vì ngắn gọn và tiện viết, đủ cho vòng đời của thẻ nhưng đến năm 2100 có thể lại phát sinh vấn đề chuyển đổi, phần lớn Y2K bắt nguồn từ vấn đề UI (ô nhập văn bản 2 ký tự, hardcode+1900, v.v.), lỗi Y2K tôi từng trực tiếp gặp là một diễn đàn Internet nhảy từ 1999 sang 19100 (chỉ là lỗi hiển thị đơn giản), Y2K không phải chỉ là vấn đề của COBOLintđơn giản tính từ năm 1900 là 0 thì còn tiết kiệm được nhiều byte hơn nữa, với 3 byte có thể bao phủ từ năm 1900 đến khoảng 44.000 ngày sau, với 2 byte cũng đủ tới khoảng năm 2070time_t64-bit sẽ giải quyết Epochalypse, nhưng không phải mọi hệ thống đều chỉ đơn giản chuyển sang số giây 64-bit, ext4 đã đổi sang độ phân giải phần thập phân 30-bit (mức nano giây) và độ phân giải giây 34-bit, nhưng vài trăm năm nữa vấn đề vẫn sẽ quay lại, tôi đoán rồi một lúc nào đó mọi thứ sẽ ổn định ở dấu thời gian 128-bit gồm 64-bit giây + 64-bit phần lẻ, như vậy sẽ bao phủ toàn bộ tương lai có thể dự đoán trong lịch sử loài ngườitime64_ttrên mọi port 32-bit trừ i386, i386 là ngoại lệ duy nhất vì tương thích nhị phân cũ, còn lại tất cả kể cả m68k đều đã đổi, tôi đã tự mình chuyển đổi m68k, powerpc, sh4 và hppatime_tkhông phải biến (variable) mà là kiểu dữ liệutime_tthực sự xuất hiện khắp nơi. Trong 35.960 gói, nó xuất hiện trong mã nguồn của 6.429 gói. Những gói để lộ ABI của struct chứatime_tthì phải di trú toàn bộ ABI cùng lúc”, wiki giải thích rõ hơn bài báo khá nhiềuRLIMIT_STACK, ví dụulimit -s 4000là stack 4MB, muốn lớn hơn thì sửa/etc/security/limits.confrồi đăng nhập lạiMAX_ARG_STRLENrồi biên dịch lại kernel, hoặc dùng máy có kích thước trang lớn hơn (ví dụ kernel RHEL Arm với page size 64k), nhưng dùng pipe thay cho command buffer để truyền dữ liệu giữa các tiến trình thì dễ hơn nhiềutime_t64-bit để dùng