Bagaimana pengembang kernel Linux menguji kode mereka secara lokal dan setelah mereka berkomitmen? Apakah mereka menggunakan semacam unit test, automation build? rencana pengujian?
linux
linux-kernel
Ashkan Kh. Nazary
sumber
sumber
Jawaban:
Kernel linux memiliki penekanan besar pada pengujian komunitas.
Biasanya setiap pengembang akan menguji kode mereka sendiri sebelum mengirimkan, dan cukup sering mereka akan menggunakan versi pengembangan dari kernel dari Linus, atau salah satu pohon pengembangan / tidak stabil lainnya untuk proyek yang relevan dengan pekerjaan mereka. Ini berarti mereka sering menguji baik perubahan mereka maupun perubahan orang lain.
Biasanya tidak ada banyak rencana pengujian formal, tetapi pengujian tambahan mungkin diminta sebelum fitur digabungkan ke dalam pohon hulu.
Seperti yang ditunjukkan oleh Dean, ada juga beberapa pengujian otomatis, proyek pengujian linux dan kernel autotest ( gambaran bagus ).
Pengembang akan sering juga menulis tes otomatis yang ditargetkan untuk menguji perubahan mereka, tetapi saya tidak yakin ada mekanisme (yang sering digunakan) untuk secara terpusat mengumpulkan tes adhoc ini.
Itu sangat tergantung pada area kernel mana yang sedang diubah tentunya - pengujian yang akan Anda lakukan untuk driver jaringan baru sangat berbeda dengan pengujian yang akan Anda lakukan ketika mengganti algoritma penjadwalan inti.
sumber
Secara alami, kernel itu sendiri dan bagian-bagiannya diuji sebelum rilis, tetapi tes ini hanya mencakup fungsionalitas dasar. Ada beberapa sistem pengujian yang melakukan pengujian Linux Kernel:
Linux Test Project (LTP) memberikan suite pengujian kepada komunitas open source yang memvalidasi keandalan dan stabilitas Linux. Rangkaian uji LTP berisi kumpulan alat untuk menguji kernel Linux dan fitur terkait. https://github.com/linux-test-project/ltp
Autotest - kerangka kerja untuk pengujian sepenuhnya otomatis. Ini dirancang terutama untuk menguji kernel Linux, meskipun berguna untuk banyak tujuan lain seperti kualifikasi perangkat keras baru, pengujian virtualisasi, dan pengujian program ruang pengguna umum lainnya di bawah platform Linux. Ini adalah proyek open-source di bawah GPL dan digunakan dan dikembangkan oleh sejumlah organisasi, termasuk Google, IBM, Red Hat, dan banyak lainnya. http://autotest.github.io/
Juga ada sistem sertifikasi yang dikembangkan oleh beberapa perusahaan distribusi utama GNU / Linux. Sistem ini biasanya memeriksa distribusi GNU / Linux lengkap untuk kompatibilitas dengan perangkat keras. Ada sistem sertifikasi yang dikembangkan oleh Novell, Red Hat, Oracle, Canonical, Google .
Ada juga sistem untuk analisis dinamis dari kernel Linux:
Kmemleak adalah detektor kebocoran memori yang termasuk dalam kernel Linux. Ini menyediakan cara untuk mendeteksi kemungkinan kebocoran memori kernel dengan cara yang mirip dengan melacak pengumpul sampah dengan perbedaan bahwa objek yatim tidak dibebaskan tetapi hanya dilaporkan melalui / sys / kernel / debug / kmemleak.
Kmemcheck memerangkap setiap membaca dan menulis ke memori yang dialokasikan secara dinamis (yaitu dengan kmalloc ()). Jika alamat memori sudah dibaca yang belum pernah ditulis sebelumnya, sebuah pesan dicetak ke log kernel. Juga merupakan bagian dari Kernel Linux
Kerangka Injeksi Kesalahan (termasuk dalam kernel Linux) memungkinkan untuk memasukkan kesalahan dan pengecualian ke dalam logika aplikasi untuk mencapai cakupan yang lebih tinggi dan toleransi kesalahan sistem.
sumber
Dalam arti kata klasik, tidak.
E. g. Ingo Molnar menjalankan beban kerja berikut: 1. membangun kernel baru dengan opsi konfigurasi set acak 2. boot ke dalamnya 3. goto 1
Setiap build gagal, boot gagal, BUG atau peringatan runtime ditangani. 24/7. Kalikan dengan beberapa kotak, dan satu dapat mengungkap cukup banyak masalah.
Tidak.
Mungkin ada kesalahpahaman bahwa ada fasilitas pengujian pusat, tidak ada. Setiap orang melakukan apa yang diinginkannya.
sumber
Alat di dalam pohon
Cara yang baik untuk menemukan alat uji di kernel adalah dengan:
make help
dan baca semua targetDi v4.0, ini mengarahkan saya ke:
kselftest dalam alat / pengujian / selftests . Jalankan dengan
make kselftest
. Harus sudah menjalankan kernel yang dibangun. Lihat juga: Dokumentasi / kselftest.txt , https://kselftest.wiki.kernel.org/ktest di bawah alat / pengujian / ktest . Lihat juga: http://elinux.org/Ktest , http://www.slideshare.net/satorutakeuchi18/kernel-auto-testbyktest
Bagian analisis statis
make help
, yang berisi target seperti:checkstack
: Perl: apa yang dilakukan checkstack.pl di sumber linux?coccicheck
untuk Coccinelle (disebutkan oleh askb )Kernel CI
https://kernelci.org/ adalah proyek yang bertujuan untuk membuat pengujian kernel lebih otomatis dan terlihat.
Tampaknya hanya melakukan pengujian build dan boot (TODO cara menguji secara otomatis bahwa boot source bekerja harus di https://github.com/kernelci/ ).
Linaro tampaknya menjadi pengelola utama proyek ini, dengan kontribusi dari banyak perusahaan besar: https://kernelci.org/sponsors/
Linaro Lava
http://www.linaro.org/initiatives/lava/ terlihat seperti sistem CI dengan fokus pada pengembangan papan pengembangan dan kernel Linux.
LISA LENGAN
https://github.com/ARM-software/lisa
Tidak yakin apa yang dikerjakannya secara detail, tetapi oleh ARM dan Apache Licensed, jadi sepertinya layak untuk dilihat.
Demo: https://www.youtube.com/watch?v=yXZzzUEngiU
Langkah debuggers
Tidak benar-benar unit testing, tetapi dapat membantu setelah tes Anda mulai gagal:
Pengaturan QEMU + Buildroot + Python saya sendiri
Saya juga memulai pengaturan yang berfokus pada kemudahan pengembangan, tetapi akhirnya saya menambahkan beberapa kemampuan pengujian sederhana juga: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/8217e5508782827320209644dcbaf9a6b3141724#test-this -laporan
Saya belum menganalisis semua pengaturan lain dengan sangat terperinci, dan mereka kemungkinan melakukan lebih dari yang saya miliki, namun saya percaya bahwa pengaturan saya sangat mudah untuk memulai dengan cepat karena memiliki banyak dokumentasi dan otomatisasi.
sumber
Tidak sangat mudah untuk mengotomatisasi pengujian kernel. Sebagian besar pengembang Linux melakukan pengujian sendiri, seperti yang disebutkan adobriyan.
Namun, ada beberapa hal yang membantu men-debug Kernel Linux:
Kemudian, pengembang biasanya meminta orang lain meninjau tambalan mereka. Setelah tambalan ditinjau secara lokal dan terlihat tidak mengganggu hal lain, dan tambalan diuji untuk bekerja dengan kernel terbaru dari Linus tanpa merusak apa pun, tambalan didorong ke hulu.
Sunting: Berikut adalah video yang bagus yang merinci proses yang dilalui patch sebelum diintegrasikan ke dalam kernel.
sumber
Selain poin di atas / di bawah ini, yang lebih menekankan pada pengujian fungsionalitas, pengujian sertifikasi perangkat keras, dan pengujian kinerja kernel Linux.
Banyak pengujian yang sebenarnya terjadi, sebenarnya skrip, alat analisis kode statis, ulasan kode, dll. Yang sangat efisien dalam menangkap bug, yang jika tidak akan merusak sesuatu dalam aplikasi.
Jarang - Alat sumber terbuka yang dirancang untuk menemukan kesalahan pada kernel Linux.
Coccinelle adalah program lain yang melakukan pencocokan dan transformasi mesin yang menyediakan bahasa SmPL (Semantic Patch Language) untuk menentukan kecocokan yang diinginkan dan transformasi dalam kode C.
checkpatch.pl dan skrip lainnya - masalah gaya pengkodean dapat ditemukan dalam file Documentation / CodingStyle di pohon sumber kernel. Yang penting untuk diingat ketika membacanya bukanlah bahwa gaya ini entah bagaimana lebih baik daripada gaya lainnya, hanya saja itu konsisten. ini membantu pengembang dengan mudah menemukan dan memperbaiki masalah gaya pengkodean, skrip script / checkpatch.pl di pohon sumber kernel telah dikembangkan. Skrip ini dapat menunjukkan masalah dengan mudah, dan harus selalu dijalankan oleh pengembang pada perubahannya, alih-alih meminta pengulas membuang waktu dengan menunjukkan masalah di kemudian hari.
sumber
Saya akan membayangkan mereka menggunakan virtualisasi untuk melakukan tes cepat, sesuatu seperti QEMU, VirtualBox atau Xen, dan beberapa skrip untuk melakukan konfigurasi dan tes otomatis.
Pengujian otomatis mungkin dilakukan dengan mencoba banyak konfigurasi acak atau beberapa yang spesifik (jika mereka bekerja dengan masalah tertentu). Linux memiliki banyak alat level rendah (seperti dmesg) untuk memonitor dan mencatat data debug dari kernel, jadi saya membayangkan itu digunakan juga.
sumber
Ada juga:
MMTests yang merupakan kumpulan benchmark dan skrip untuk menganalisis hasilnya
https://github.com/gormanm/mmtests
Trinity yang merupakan sistem panggilan Linux fuzz tester
http://codemonkey.org.uk/projects/trinity/
Juga halaman LTP di sourceforge cukup usang dan proyek telah pindah ke GitHub https://github.com/linux-test-project/ltp
sumber
Sejauh yang saya tahu, ada alat pemeriksaan regresi kinerja otomatis (bernama lkp / 0 hari) dijalankan / didanai oleh Intel, itu akan menguji setiap tambalan yang valid yang dikirim ke milis dan memeriksa skor yang diubah dari berbagai microbenchmark seperti hackbench , fio, unixbench, netperf, dll, begitu ada regresi / peningkatan kinerja, laporan terkait akan dikirim langsung ke pembuat tambalan dan pengelola terkait Cc.
sumber
LTP dan Memtests umumnya merupakan alat yang lebih disukai.
sumber
adobriyan menyebut pengulangan pengujian konfigurasi confo buatan Ingo. Sekarang sudah cukup banyak yang dicakup oleh bot uji 0-hari (alias bot uji kbuild). Artikel bagus tentang infrastruktur disajikan di sini: Kernel Build / boot testing
Gagasan di balik pengaturan ini adalah untuk memberi tahu pengembang ASAP sehingga mereka dapat memperbaiki kesalahan segera. (sebelum tambalan membuatnya menjadi pohon Linus dalam beberapa kasus karena infrastruktur kbuild juga menguji terhadap pohon subsistem pemelihara)
sumber
Saya telah melakukan kompilasi kernel linux dan melakukan beberapa modifikasi untuk android (Marshmallow dan Nougat) di mana saya menggunakan linux versi 3. Saya mengkompilasinya secara silang dalam sistem linux, men-debug kesalahan secara manual dan kemudian menjalankan file boot image-nya di Android dan memeriksa apakah itu akan di loop-hole atau tidak. Jika berjalan sempurna maka itu berarti dikompilasi dengan sempurna sesuai dengan persyaratan sistem.
Untuk Kompilasi kernel MotoG
CATATAN: - Kernel Linux akan berubah sesuai dengan persyaratan yang bergantung pada Perangkat Keras Sistem
sumber
Sekali setelah kontributor mengirimkan file tambalan mereka & setelah membuat permintaan gatekeeper linux memeriksa tambalan dengan mengintegrasikan & memeriksanya. Sekali jika berhasil mereka akan menggabungkan tambalan ke cabang yang relevan & membuat rilis versi baru. Proyek Uji Linux ( https://github.com/linux-test-project/ltp ) adalah sumber utama yang menyediakan skenario pengujian (Kasus Uji) untuk dijalankan terhadap kernel setelah menerapkan tambalan. Ini mungkin memakan waktu sekitar 2 ~ 4 jam & tergantung. Harap perhatikan tentang sistem file dari kernel yang Dipilih yang akan diuji. Contoh: Ext4 menghasilkan hasil yang berbeda dengan EXT3 & seterusnya.
Prosedur Pengujian Kernel.
sumber