GNU/Linux >> Belajar Linux >  >> Linux

Memecahkan masalah Tahun 2038 di kernel Linux

Karena cara waktu diwakili di Linux, nomor 32-bit yang ditandatangani tidak dapat mendukung waktu di luar 19 Januari 2038 setelah 3:14:07 UTC. Masalah Tahun 2038 (Y2038 atau Y2K38) ini adalah tentang representasi tipe data waktu. Solusinya adalah dengan menggunakan stempel waktu 64-bit.

Saya mulai mengatasi masalah saat bekerja sebagai pekerja magang Outreachy untuk pengembang kernel Arnd Bergmann. Outreachy adalah program baik hati yang membantu programmer baru masuk ke pengembangan open source. Mentor untuk proyek kernel biasanya adalah pengembang kernel berpengalaman seperti Arnd.

Saya memilih untuk mengerjakan masalah Y2038 karena memungkinkan saya menyentuh semua subsistem di kernel—dan bahkan lebih dari itu. Masalahnya juga melibatkan ruang pengguna, pustaka C, POSIX, dan standar C. Saya menemukan bahwa masalahnya sebenarnya tentang antarmuka antar lapisan.

Lebih banyak sumber daya Linux

  • Lembar contekan perintah Linux
  • Lembar contekan perintah Linux tingkat lanjut
  • Kursus online gratis:Ikhtisar Teknis RHEL
  • Lembar contekan jaringan Linux
  • Lembar contekan SELinux
  • Lembar contekan perintah umum Linux
  • Apa itu container Linux?
  • Artikel Linux terbaru kami

Memecahkan satu masalah di kernel jarang melibatkan hanya satu hal; itu juga melibatkan kompleksitas hal-hal yang saling terkait di dalam kernel (selalu ada satu pembersihan lagi yang diperlukan sebelum perubahan) dan interaksi dengan komunitas (terutama sebagai pendatang baru).

Salah satu area yang kami tangani adalah sistem file virtual (VFS). VFS adalah lapisan abstraksi sistem file. Jadi, bahkan jika beberapa sistem file, seperti ext4, dapat mewakili cap waktu di luar tahun 2038 pada sistem 32-bit, mereka tidak dapat melakukannya tanpa lapisan VFS yang mendukungnya.

Perubahan ke VFS adalah salah satu seri patch yang membutuhkan waktu paling lama untuk mendapatkan konsensus dan bergabung.

Mengusulkan solusi

Masalahnya: Representasi in-kernel dari inode timestamps berada di struct timespec , yang tidak aman bagi Y2038. Solusi yang diusulkan: Ubah representasi menjadi struct timespec64 , yang Y2038 aman.

Versi pertama dari seri ini diposting oleh Arnd pada tahun 2014. Saat itu, ada beberapa masalah terbuka dan beberapa masukan tentang penambahan pemeriksaan rentang stempel waktu.

Pada Januari 2016, saya memposting permintaan komentar (RFC) pertama untuk ini, menanyakan apakah ada penentangan terhadap pendekatan yang dijelaskan di atas. Ini bukan RFC khas untuk komunitas kernel. Surat pengantar seri menjelaskan perubahan yang diusulkan dan memberikan beberapa contoh bagaimana perubahan akan dilakukan. Ada beberapa kebingungan tentang apa yang kami coba sampaikan dalam serial ini.

Saya memposting seri lain (sebenarnya tiga) untuk menyelesaikan masalah dalam tiga cara terpisah. Ini adalah versi pengupas dari seri sebelumnya yang hanya membahas masalah inti. Ini juga tidak biasa. Pengembang kernel Thomas Gleixner mengatakan dia sedikit lebih suka salah satu pendekatan untuk memecahkan masalah, jadi kami telah menyelesaikan semua patch dengan cara ini.

Tetapi kami harus menyingkirkan beberapa antarmuka lama sebelum kami dapat melakukan perubahan. Ketika saya memposting serangkaian ini, Linus Torvalds tidak menyukai salah satu antarmuka (current_fs_time(sb) ) karena menggunakan superblok sebagai argumen untuk mengakses granularitas stempel waktu. Tetapi cap waktu benar-benar merupakan fitur inode, bukan superblok. Jadi, kami menyingkirkan API ini.

Sekarang seri aslinya harus diulang lagi. Melakukan patch hari bendera tampak seperti pendekatan kasar untuk masalah tersebut. Tapi kami akhirnya melakukan hal itu. Kami bahkan melangkah lebih jauh dengan menggunakan skrip Coccinelle. Ini mengubah lebih dari 80 file. Tantangannya adalah membuat perubahan yang belum sempurna untuk menghindari regresi. Kami akhirnya menggabungkan patch pada Juni 2018 dan belum mendengar adanya kemunduran dari perubahan tersebut.

Pada akhir seluruh latihan ini, kami menyingkirkan tiga API dalam kernel, mengatur ulang beberapa penanganan stempel waktu sistem file, menangani format cetak untuk mendukung stempel waktu yang lebih besar, menganalisis dump objek arsitektur 32-bit, dan menulis ulang setidaknya lima versi seri dari awal. Dan ini hanyalah salah satu masalah yang kami pecahkan untuk kernel. Tapi Y2038 telah menjadi salah satu proyek favorit saya.

Deepa Dinamani akan mempresentasikan Bagaimana pencarian untuk mencegah waktu habis telah membawa saya ke semua sudut kernel Linux di linux.conf.au, 21-25 Januari di Christchurch, Selandia Baru.


Linux
  1. Linux – Berpartisipasi Di Milis Kernel?

  2. Linux – Mengapa Kernel Tidak Dapat Menjalankan Init?

  3. Linux – Bagian Kernel yang Dimiliki Atau Tertutup?

  1. Selamat ulang tahun kernel Linux:Apa rilis favorit Anda?

  2. Kernel Linux:5 inovasi teratas

  3. Men-debug latensi I/O Linux

  1. Membangun kepercayaan di komunitas Linux

  2. Siklus hidup pengujian kernel Linux

  3. Pengujian integrasi berkelanjutan untuk kernel Linux