Bug di Linux 5.1 menyebabkan hilangnya data - tambalan koreksi telah dirilis

Beberapa minggu yang lalu, bug ditemukan di versi kernel Linux 5.1 yang menyebabkan hilangnya data pada SSD. Baru-baru ini, pengembang merilis patch patch Linux 5.1.5, yang mengisi "celah".

Kami membahas apa alasannya.


/ Unsplash / Glen Carrie

Apa bug


Pada awal tahun, pengembang membuat sejumlah perubahan pada kernel Linux 5.1. Setelah itu, pada sistem dengan SSD dari Samsung yang menggunakan enkripsi dm-crypt / LUKS dengan device-mapper / LVM, kesalahan mulai muncul , yang menyebabkan hilangnya data. Namun masalahnya baru diketahui pada pertengahan Mei - saat itu mereka mulai aktif mendiskusikannya di forum tematik .

Setidaknya dua orang yang mengetahui bug diketahui: anggota milis LKML Michael LaรŸ, yang pertama kali melaporkan masalah , dan pengguna ArchLinux.

Michael menjalankan perintah fstrim, yang memberi tahu drive blok data mana yang tidak lagi digunakan untuk volume btrf yang terpasang. Setelah dia menerima pesan sistem berikut:

attempt to access beyond end of device sda1: rw=16387, want=252755893, limit=250067632 BTRFS warning (device dm-5): failed to trim 1 device(s), last error -5 BTRFS warning (device dm-5): csum failed root 257 ino 16634085 off 21504884736 csum 0xd47cc2a2 expected csum 0xcebd791b mirror 1 

Setelah itu, ia menemukan bahwa volume btrf rusak dan volume logis yang tersisa pada perangkat fisik dihancurkan.

Dalam kasus pengguna ArchLinux, masalah mempengaruhi perlindungan kriptografi LUKS. Setelah mem-boot ulang sistem operasi dan menjalankan fstrim, header LUKS (yang digunakan untuk mencari volume) ternyata tidak dapat dibaca, yang tidak memungkinkan data terenkripsi yang didekripsi.

Apa alasannya


Masalahnya adalah subsistem device mapper (DM), yang tugasnya membuat perangkat blok virtual. Ini hanya digunakan untuk mengimplementasikan manajer volume logis LVM, perangkat lunak RAID, dan sistem enkripsi disk dm-crypt.

โ€œTim fstrim menandai terlalu banyak blok pada satu waktu tanpa memperhitungkan batas max_io_len_target_boundary. Akibatnya, segmen memori yang masih digunakan dibebaskan, โ€komentar Sergey Belkin, kepala departemen pengembangan 1cloud.ru . "Karena kesalahan itu terkait dengan device mapper, secara teori, kehilangan data dapat terjadi pada sistem file apa pun."

Tambalan


Pengembang kernel merilis tambalan untuk bug pada akhir Mei. Hanya empat baris dalam file driver / md / dm.c yang diubah . Perubahan yang sesuai juga dilakukan pada kernel Linux 5.2 yang akan datang (baris yang ditambahkan dan dihapus ditandai dengan โ€œ+โ€ dan โ€œ-โ€, masing-masing):

 @@ -1467,7 +1467,7 @@ static unsigned get_num_write_zeroes_bios(struct dm_target *ti) static int __send_changing_extent_only(struct clone_info *ci, struct dm_target *ti, unsigned num_bios) { - unsigned len = ci->sector_count; + unsigned len; @@ -1478,6 +1478,8 @@ static int __send_changing_extent_only(struct clone_info *ci, struct dm_target * if (!num_bios) return -EOPNOTSUPP; + len = min((sector_t)ci->sector_count, max_io_len_target_boundary(ci->sector, ti)); + __send_duplicate_bios(ci, ti, num_bios, &len); ci->sector += len; 

Patch sudah diterapkan oleh ArchLinux / Manjaro dan pengembang distribusi Fedora . Distribusi Ubuntu tidak memengaruhi kesalahan, karena tidak diterjemahkan ke versi kernel Linux 5.1.


/ Flickr / Andy Melton / CC BY-SA

Anda dapat menghilangkan situasi dengan kehilangan data tanpa menginstal tambalan. Cukup mematikan layanan fstrim.service / timer menggunakan perintah:

 systemctl disable fstrim.timer systemctl stop fstrim.timer 

Pilihan lain adalah mengganti nama fstrim yang dapat dieksekusi atau menghapus flag discard ketika memasang fstab. Anda juga dapat mematikan allow-discards di LUKS melalui dmsetup. Namun, semua metode ini tidak lebih dari sementara dan tidak menyelesaikan esensi masalah.

Bukan yang pertama kali


Ini bukan pertama kalinya komit di kernel Linux mengarah ke situasi kerusakan memori. Cerita serupa terjadi di Linux versi 4.19 - maka penjadwal I / O BLK-MQ yang harus disalahkan. Masalahnya terwujud ketika membangun kernel dengan opsi CONFIG_SCSI_MQ_DEFAULT = y, ditetapkan secara default. Dalam beberapa kasus, volume data rusak.

 sed: error while loading shared libraries: /lib/x86_64-linux-gnu/libattr.so.1: unexpected PLT reloc type 0x00000107 sed: error while loading shared libraries: /lib/x86_64-linux-gnu/libattr.so.1: unexpected PLT reloc type 0x00000107 

Paling sering, masalah memanifestasikan dirinya dengan EXT4, tetapi secara teori itu bisa mempengaruhi sistem file lainnya.

Kemudian salah satu pemelihara kernel menyiapkan perbaikan kecil yang memecahkan masalah. Namun, bug yang sama kemudian ditemukan di Linux 4.20 build. Akhirnya dimungkinkan untuk menyingkirkannya pada akhir Desember 2018 dengan pembaruan global baru.

Sumber daya dan sumber tambahan kami:

File cadangan: cara aman dari kehilangan data
Minimalisasi risiko: bagaimana tidak kehilangan data Anda
Backup & Recovery: streaming dan deduplikasi cerdas, snapshot, dan penyimpanan sekunder
Cara menghemat uang menggunakan antarmuka pemrograman aplikasi
DevOps dalam layanan cloud menggunakan 1cloud.ru sebagai contoh
Evolusi Arsitektur Awan Keras

Cara kami bekerja: intisari 1cloud
Potensi serangan pada HTTPS dan cara-cara untuk melindungi mereka

Source: https://habr.com/ru/post/id454978/


All Articles