Topik ini menjelaskan cara mengatasi pengecualian Oops yang terjadi saat Anda melakukan hot-unplug perangkat virtio dari Instance ECS yang menjalankan versi kernel terbaru.
Gejala
Melakukan hot-unplug perangkat virtio, seperti disk atau NIC, dari Instance ECS yang menjalankan versi kernel terbaru tertentu dapat menyebabkan pengecualian Oops, yang mengakibatkan salah satu kondisi berikut:
-
Jika instans dikonfigurasi dengan
kernel.panic_on_oops = 1, terjadi kernel panic. -
Jika instans dikonfigurasi dengan
kernel.panic_on_oops = 0, kernel menjadi tidak responsif.
kernel.panic_on_oops adalah parameter kernel yang mengatur perilaku kernel saat menghadapi pengecualian Oops (kesalahan kernel).
-
Kernel panic: Sistem menghentikan tugas saat ini, menyimpan informasi debugging, lalu melakukan reboot atau shutdown. Hal ini memungkinkan respons cepat terhadap masalah dan meminimalkan potensi kerusakan.
-
Ketidakresponsifan kernel: Kernel mencoba terus berjalan. Hal ini tidak disarankan di lingkungan produksi karena dapat menyebabkan korupsi data atau masalah kritis lainnya.
Penyebab
Komunitas hulu Linux memperkenalkan isu ini dalam commit ini, yang menambahkan dukungan untuk admin virtqueue pada perangkat virtio.
Commit tersebut memperkenalkan perubahan berikut:
-
Pointer fungsi
is_avqditambahkan ke definisivirtio_pci_deviceuntuk memeriksa keberadaan admin virtqueue. -
Fungsi
virtio_pci_modern_probe, yang bertanggung jawab atas inisialisasi perangkat virtio modern, menginisialisasi pointer fungsiis_avq.@@ -588,6 +658,7 @@ int virtio_pci_modern_probe(struct virtio_pci_device *vp_dev) vp_dev->config_vector = vp_config_vector; vp_dev->setup_vq = setup_vq; vp_dev->del_vq = del_vq; + vp_dev->is_avq = vp_is_avq; vp_dev->isr = mdev->isr; vp_dev->vdev.id = mdev->id; -
Saat perangkat virtio dilakukan hot-unplug, kode memeriksa apakah antrian saat ini merupakan admin virtqueue.
@@ -236,6 +236,9 @@ void vp_del_vqs(struct virtio_device *vdev) int i; list_for_entry_safe(vq, n, &vdev->vqs, list) { + if (vp_dev->is_avq(vdev, vq->index)) + continue; + if (vp_dev->per_vq_vectors) { int v = vp_dev->vqs[vq->index]->msix_vector; } }
Namun, pada perangkat virtio legacy, pointer fungsi is_avq tidak diinisialisasi dan tetap sebagai pointer null. Akibatnya, saat Anda melakukan hot-unplug perangkat virtio legacy, pemanggilan if (vp_dev->is_avq(vdev, vq->index)) mencoba melakukan dereferensi pointer null, yang memicu pengecualian dan dapat menyebabkan crash sistem.
Cakupan yang Terdampak
-
Komunitas hulu Linux
Komunitas hulu telah menyelesaikan isu ini dalam commit ini. Perbaikan tersebut menambahkan pemeriksaan null pada pointer fungsi
is_avqsebelum memanggilnya. -
Sistem operasi
-
Ubuntu 24
-
Sistem operasi lain dengan versi kernel sekitar 6.8 yang telah mengadopsi dukungan admin virtqueue tetapi belum memiliki patch pemeriksaan null is_avq.
CatatanAnda dapat menjalankan perintah
uname -runtuk memeriksa versi kernel.
-
-
Perangkat virtio
Isu ini memengaruhi perangkat virtio legacy saat dilakukan hot-unplug dari Instance ECS.
Solusi
-
Solusi 1: Beralih ke keluarga instans yang menggunakan perangkat virtio modern, seperti keluarga instans generasi ke-8 atau yang lebih baru. Keluarga instans ini tidak terdampak oleh isu ini. Untuk informasi selengkapnya, lihat Ubah tipe instans. Untuk mempelajari lebih lanjut tentang keluarga instans, lihat Keluarga instans.
-
Solusi 2:
-
Upgrade ke paket kernel terbaru dan pastikan paket tersebut mencakup patch virtio-pci: Periksa apakah is_avq bernilai NULL.
-
(Diperlukan secara kondisional) Jika kernel terbaru tidak mencakup patch tersebut, Anda harus menerapkannya secara manual.
-
Lampiran: Istilah
Bagian ini menjelaskan istilah kunci yang digunakan dalam topik ini, seperti perangkat virtio, admin virtqueue, dan virtio_pci_device.
|
Istilah |
Deskripsi |
|
virtio device |
Virtio adalah framework standar untuk virtualisasi I/O yang memungkinkan mesin virtual berinteraksi secara efisien dengan perangkat keras virtual host. Perangkat virtio, seperti disk atau NIC, adalah perangkat emulasi dalam lingkungan tervirtualisasi. Perangkat ini diklasifikasikan sebagai legacy atau modern, yang dibedakan terutama berdasarkan antarmuka konfigurasi yang digunakan. |
|
admin virtqueue |
Admin virtqueue adalah antrian khusus yang digunakan untuk operasi manajemen perangkat, seperti menanyakan status perangkat atau menerapkan perubahan konfigurasi. Tidak semua perangkat virtio mendukung admin virtqueue. |
|
virtio_pci_device |
Ini adalah struktur data dalam kernel yang merepresentasikan perangkat virtio PCI. Struktur ini berisi pointer ke berbagai fungsi, termasuk pointer fungsi |
|
is_avq |
Pointer fungsi yang, jika diberi nilai, menunjuk ke fungsi yang memeriksa apakah antrian virtio tertentu merupakan admin virtqueue. |
|
virtio_pci_modern_probe |
Fungsi ini bertanggung jawab mendeteksi dan menginisialisasi perangkat virtio PCI. Setelah sistem menemukan perangkat, fungsi ini dipanggil untuk menyelesaikan proses penyiapan, termasuk membaca ruang konfigurasi, mendeteksi fitur perangkat, dan mengalokasikan sumber daya yang diperlukan. |
|
RIP |
Register RIP (Instruction Pointer) pada CPU x86 menyimpan alamat instruksi berikutnya yang akan dieksekusi. Saat terjadi pengecualian, seperti upaya dereferensi pointer null, RIP menunjuk ke alamat instruksi yang gagal. |