Linux çekirdeği nasıl test edilir?


258

Linux çekirdek geliştiricileri kodlarını yerel olarak ve işledikten sonra nasıl test eder? Bir tür birim testi kullanıyorlar mı, otomasyon kuruyorlar mı? test planları?


16
youtube.com/watch?v=L2SED6sewRw , bir yerde, tam olarak hatırlayamıyorum, ancak QA bölümünde bunun hakkında konuşulduğunu düşünüyorum.
Anders

6
Anders'in bağlantısı harika - en iyi çekirdek geliştiricilerinden biri olan Greg Kroah Hartman'dan bir Google Tech Talk. Çekirdek geliştiricisi @adobriyan tarafından verilen cevabı doğrular. Greg çekirdek hakkında eğlenceli bir şey - çalıştırmadan test etmek için iyi bir yol - birim testleri vb yapmak zor - birçok permütasyon notları. "Test etmek için geliştirme topluluğuna güveniyoruz. Mümkün olduğu kadar çok fonksiyonel test ve performans testleri de istiyoruz." Doğrudan test tartışmasına bir bağlantı youtube.com/…
nealmcb

VM'lerin popülaritesiyle, çekirdeği bir grup yapılandırma permütasyonu ile yapıp bunlara önyükleme yapmaya çalışarak bunu otomatikleştirmek mümkün olmaz mı? Hiçbir şekilde bir "birim" testi olmaz, ancak hataları yakalayabilir.
Daniel Kaplan

@DanielKaplan: Her biri 10 CPU'dan birinin yanı sıra 1000 PCI aygıtının 3'ünün yanı sıra 1000 USB aygıtının 3'üne sahip yaklaşık 1000 anakart olduğunu varsayarsanız; ve çekirdeğin 1000 farklı derleme zamanı seçeneği olması; test etmek için yaklaşık 1000 * 10 * 1000 * 999 * 9981000 * 999 * 998 * 1000 olası permütasyona bakıyorsunuz. Her permütasyon için 8 saatlik güzel bir test yanması yapar ve aynı anda 400 VM'yi paralel olarak çalıştıracak 100 sunucudan oluşan bir havuzunuz varsa; o zaman 1 milyonda biri test ettiğiniz zaman sonuçların hepsi eski olacak çünkü birisi kodu değiştirdi ve yeniden başlamak zorunda.
Brendan

Ycombinator üzerinde birim testleri hakkında küçük bir tartışma var .
joeytwiddle

Yanıtlar:


76

Linux çekirdeği topluluk testlerine büyük önem vermektedir.

Tipik olarak herhangi bir geliştirici göndermeden önce kendi kodunu test eder ve çoğu zaman Linus'un çekirdeğinin geliştirme sürümünü veya çalışmalarıyla ilgili bir proje için diğer kararsız / geliştirme ağaçlarından birini kullanır. Bu, genellikle hem değişikliklerini hem de diğer insanların değişikliklerini test ettikleri anlamına gelir.

Resmi test planlarının yolunda çok fazla olma eğilimi yoktur, ancak özellikler yukarı akış ağaçlarıyla birleştirilmeden önce ekstra test istenebilir.

Dean'in işaret ettiği gibi, bazı otomatik testler, linux test projesi ve çekirdek otomatik testi ( iyi genel bakış ) da var.

Geliştiriciler de genellikle değişikliklerini test etmeyi hedefleyen otomatik testler yazacaklar, ancak bu adhoc testleri merkezi olarak toplamak için (genellikle kullanılan) bir mekanizma olduğundan emin değilim.

Tabii ki çekirdeğin hangi alanının değiştirildiğine çok bağlıdır - yeni bir ağ sürücüsü için yapacağınız test, çekirdek zamanlama algoritmasını değiştirirken yapacağınız testten oldukça farklıdır.


8
+1, savaşın yarısı, sürücülerin bağımlı olduğu bir şeyi kırmaz, bu nedenle BKL'nin yıllar boyunca devam etmesi. Dikkate alınması gereken diğer bir şey, Linux'un aldığı topluluk kötüye kullanımı, hata testi ile pratik olarak mümkün olan birçok farklı mimaride birçok alt sistemi test etmektir.
Tim Post

66

Doğal olarak, çekirdeğin kendisi ve parçaları serbest bırakılmadan önce test edilir, ancak bu testler sadece temel işlevselliği kapsar. Linux Çekirdeği testi yapan bazı test sistemleri vardır:

Linux Test Projesi (LTP) , Linux'un güvenilirliğini ve kararlılığını doğrulayan açık kaynak topluluğuna test paketleri sunar. LTP test paketi, Linux çekirdeğini ve ilgili özellikleri test etmek için bir dizi araç içerir. https://github.com/linux-test-project/ltp

Autotest - tam otomatik test için bir çerçeve. Öncelikle Linux çekirdeğini test etmek için tasarlanmıştır, ancak yeni donanım, sanallaştırma testi ve Linux platformları altında diğer genel kullanıcı alanı programı testi gibi diğer birçok amaç için yararlıdır. GPL kapsamında açık kaynaklı bir projedir ve Google, IBM, Red Hat ve diğerleri de dahil olmak üzere birçok kuruluş tarafından kullanılır ve geliştirilir.http://autotest.github.io/

Ayrıca bazı büyük GNU / Linux dağıtım şirketleri tarafından geliştirilen sertifikasyon sistemleri bulunmaktadır. Bu sistemler genellikle eksiksiz GNU / Linux dağıtımlarının donanımla uyumluluğunu kontrol eder. Novell, Red Hat, Oracle, Canonical, Google tarafından geliştirilen sertifika sistemleri vardır. .

Linux çekirdeğinin dinamik analizi için sistemler de vardır:

Kmemleak , Linux çekirdeğinde bulunan bir bellek sızıntı detektörüdür. Olası çekirdek bellek sızıntılarını, izleme çöp toplayıcısına benzer şekilde, yetim nesnelerinin serbest bırakılmadığı, yalnızca / sys / kernel / debug / kmemleak ile bildirildiği farkıyla tespit etmenin bir yolunu sunar.

Kmemcheck , dinamik olarak ayrılan her okuma ve yazma belleğini yakalar (yani kmalloc () ile). Daha önce yazılmamış bir bellek adresi okunursa, çekirdek günlüğüne bir mesaj yazdırılır. Ayrıca Linux Çekirdeğinin bir parçasıdır

Arıza Enjeksiyonu Çerçevesi (Linux çekirdeğinde bulunur), sistemin daha yüksek kapsama alanına ve hataya toleransını elde etmek için bir uygulamanın mantığına hata ve istisnalar aşılamaya izin verir.


62

Linux çekirdek geliştiricileri kodlarını yerel olarak ve işledikten sonra nasıl test eder?

Bir tür birim testi kullanıyorlar mı, otomasyon kuruyorlar mı?

Klasik anlamda, hayır.

Örneğin. Ingo Molnar aşağıdaki iş yükünü çalıştırıyor: 1. rasgele yapılandırma seçenekleri kümesiyle yeni bir çekirdek oluşturun 2. içine önyükleme 3. git 1

Her derleme başarısız, önyükleme başarısız, HATA veya çalışma zamanı uyarısı ele alınır. 24/7. Birkaç kutu ile çarpın ve biri oldukça fazla sorunu ortaya çıkarabilir.

test planları?

Hayır.

Merkezi test tesisinin olduğu konusunda yanlış anlaşılmalar olabilir, yoktur. Herkes istediğini yapar.


6
Bu ve bunun gibi sitelerin varlığı göz önüne alındığında, bu cevabın geçerliliğini de sorgularım.
Dean Harding

3
Bence adobriyan'ın cevabının özü "merkezi test tesisi var, hiçbiri yok." haklı. Farklı gruplar farklı seviyelerde testler yaparlar, ancak çekirdek tamamen test edilmemiş gibi değildir.
stsquad

2
Bence hem SUSE hem de RedHat kendi çekirdeklerini test etmenin yanı sıra vanilyayı sık sık test ediyorlar. Kendi başına merkezi bir test yoktur, ancak yine de büyük Linux kullanıcıları tarafından devam eden bir test vardır. Aksi takdirde yorum duruyor. Daha az alaycı bir şekilde yazılmış olsaydı, onu bile değiştirirdim.
Dummy00001

55
Errr, tüm insanlar Alexey Dobriyan fark yapmak olduğu bir Linux çekirdeği geliştirici?
ninjalj

9
Başka bir çekirdek geliştiricisi olarak, bunun sorunun en dürüst cevabı olduğunu söylemeliyim: çekirdek klasik anlamda test edilmez, çünkü bu imkansızdır. Test için mevcut geliştirici süresinden daha fazla yapılandırma ve donanım kombinasyonu vardır. Çok az insan belirli cihazları test etmek için gerekli becerilere sahiptir ve bazı durumlarda çok az insan aslında belirli cihazlara sahiptir.
Ezequiel Garcia

19

Ağaç içi araçlar

Çekirdekteki test araçlarını bulmanın iyi bir yolu:

V4.0 sürümünde, bu beni:

Çekirdek CI

https://kernelci.org/ , çekirdek testini daha otomatik ve görünür hale getirmeyi amaçlayan bir projedir.

Sadece derleme ve önyükleme testleri yapıyor gibi görünüyor (TODO, önyüklemenin çalıştığını otomatik olarak nasıl test eder? Kaynak https://github.com/kernelci/ olmalıdır ).

Linaro , birçok büyük şirketin katkılarıyla projenin ana sorumlusu gibi görünüyor: https://kernelci.org/sponsors/

Linaro Lava

http://www.linaro.org/initiferences/lava/ , geliştirme kurulu getirisine ve Linux çekirdeğine odaklanan bir CI sistemine benziyor.

ARM LISA

https://github.com/ARM-software/lisa

Ayrıntılı olarak ne yaptığından emin değilim, ancak ARM ve Apache Lisanslı, bu yüzden muhtemelen bir göz atmaya değer.

Demo: https://www.youtube.com/watch?v=yXZzzUEngiU

Adım ayıklayıcıları

Gerçekten birim testi değil, testleriniz başarısız olmaya başladıktan sonra yardımcı olabilir:

Kendi QEMU + Buildroot + Python kurulumum

Ayrıca, geliştirme kolaylığına odaklanan bir kurulum başlattım, ancak buna basit test yetenekleri de ekledim: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/8217e5508782827320209644dcbaf9a6b3141724#test-this -repo

Diğer tüm kurulumları ayrıntılı olarak analiz etmedim ve muhtemelen benimkinden çok daha fazlasını yapıyorlar, ancak kurulumumun hızlı bir şekilde başlamak için çok kolay olduğuna inanıyorum çünkü çok fazla dokümantasyon ve otomasyona sahip.


13

Çekirdek testlerini otomatikleştirmek çok kolay değil. Linux geliştiricilerinin çoğu testi adobriyan'da olduğu gibi kendi başlarına yapar.

Bununla birlikte, Linux Çekirdeğinin hata ayıklamasına yardımcı olan birkaç şey vardır:

  • kexec: Başka bir çekirdeği belleğe koymanıza ve BIOS'a geri dönmeden yeniden başlatmanıza ve başarısız olursa yeniden başlatmanıza izin veren bir sistem çağrısı.
  • dmesg: Kesinlikle çekirdek önyüklemesi sırasında neler olduğu ve çalışıp çalışmadığı / çalışmadığı hakkında bilgi aramak için bir yer.
  • Çekirdek Enstrümantasyonu: Printk'e (ve 'CONFIG_PRINTK_TIME') adı verilen ve çekirdek çıktısının ne olduğunu görmenize (mikrosaniye doğruluğuna) izin veren bir seçeneğe ek olarak, çekirdek yapılandırması, oluyor.

Ardından, geliştiriciler genellikle başkalarını yamalarını gözden geçirir. Yamalar yerel olarak incelendiğinde ve başka hiçbir şeye müdahale etmediği görüldüğünde ve yamalar hiçbir şey kırmadan Linus'un en son çekirdeği ile çalışacak şekilde test edilir, yamalar yukarı doğru itilir.

Düzenleme: İşte bir düzeltme eki çekirdeğe entegre edilmeden önce geçen süreci detaylandıran güzel bir video .


6

Linux çekirdeğinin işlev testine, donanım sertifikasyon testine ve performans testine daha fazla vurgu yapan yukarıdaki / aşağıdaki noktalara ek olarak.

Aslında bir test gerçekten gerçekleşir, aslında komut dosyaları, statik kod analiz araçları, kod incelemeleri vb. Bu hataların yakalanmasında çok etkilidir, aksi takdirde uygulamada bir şey kırır.

Sparse - Linux çekirdeğindeki hataları bulmak için tasarlanmış açık kaynaklı bir araçtır.

Coccinelle , C kodunda istenen eşleşmeleri ve dönüşümleri belirtmek için SmPL (Semantik Yama Dili) dilini sağlayan bir eşleştirme ve dönüştürme motorudur.

checkpatch.pl ve diğer komut dosyaları - kodlama stili sorunları, çekirdek kaynak ağacındaki Documentation / CodingStyle dosyasında bulunabilir. Okurken hatırlanması gereken önemli şey, bu stilin diğer stillerden bir şekilde daha iyi olması değil, sadece tutarlı olmasıdır. Bu, geliştiricilerin kodlama stili sorunlarını kolayca bulmasına ve düzeltmesine yardımcı olur, çekirdek kaynak ağacındaki komut dosyası komut dosyaları / checkpatch.pl geliştirilmiştir. Bu komut dosyası sorunları kolayca gösterebilir ve bir geliştiricinin sorunları daha sonra işaret ederek zamanını boşa harcamak yerine, her zaman değişikliklerinde çalıştırılmalıdır.


3

Sanallaştırma, QEMU, VirtualBox veya Xen gibi bir şey yapmak için sanallaştırma kullandıklarını ve yapılandırmalar ve otomatik testler yapmak için bazı komut dosyaları kullandıklarını düşünürüm.

Otomatik test, muhtemelen çok sayıda rastgele yapılandırmayı veya birkaç belirli yapılandırmayı deneyerek yapılır (belirli bir sorunla çalışıyorlarsa). Linux, çekirdekten hata ayıklama verilerini izlemek ve günlüğe kaydetmek için birçok düşük düzey araçlara (dmesg gibi) sahiptir, bu yüzden bunun da kullanıldığını hayal ediyorum.


Kesinlikle haklısın. Çekirdek modülü geliştirmemi yaptığımda, çekirdek yürütmesini izlemek için VirtualBox + KGDB'ye LINE-BY-LINE izlemesine yoğun bir şekilde bağlıydım. Evet, gdb'nin tüm çekirdeği satır satır yürütmesini görmek gerçekten harika. Aynı ünlü çekirdek geliştiricisi Valerie Aurora ile aynı, örneğin: youtube.com/watch?v=Tach2CheAc8 . Videonun içinde, çekirdeğe adım atmak için UserModeLinux sanallaştırmasını nasıl kullandığını görebilirsiniz.
Peter Teoh


1

Bildiğim kadarıyla, Intel tarafından çalışan / fon sağlayan otomatik bir performans regresyon kontrol aracı (lkp / 0 gün) var, posta listesine gönderilen her geçerli yamayı test edecek ve hackbench gibi farklı mikrobençelerden değiştirilen puanları kontrol edecek , fio, unixbench, netperf, vb. bir performans regresyonu / iyileştirmesi olduğunda, ilgili bir rapor doğrudan yama yazarına ve Cc ile ilgili destekçilere gönderilecektir.



0

adobriyan, Ingo'nun rasgele yapılandırma oluşturma testinden bahsetti. Bu hemen hemen 0 günlük test botu (aka kbuild test botu) tarafından kapsanmaktadır. Altyapı hakkında güzel bir makale burada sunulmaktadır: Çekirdek Oluşturma / önyükleme testi

Bu kurulumun arkasındaki fikir, geliştiricileri ASAP'a bildirerek hataları en kısa sürede düzeltebilmelerini sağlamaktır. (yamalar bazı durumlarda Linus ağacına girmeden önce, kbuild altyapısı aynı zamanda bakımcının alt sistem ağaçlarına karşı da test eder)


0

Linux çekirdeği derlemesi yapmıştım ve linux sürüm 3'ü kullandığım android (Marshmallow ve Nougat) için bazı Değişiklikler yaptım. Döngü deliğine giriyordu ya da girmiyordu. Mükemmel çalışırsa, sistem gereksinimlerine göre mükemmel bir şekilde derlendiği anlamına gelir.
MotoG çekirdek Derleme için

NOT: - Linux Çekirdeği, Sistem Donanımına bağlı gereksinimlere göre değişecektir


0

Katkıda bulunanlar yama dosyalarını gönderdikten sonra ve birleştirme isteği yaptıktan sonra linux gatekeepers, yamayı entegre ederek ve gözden geçirerek kontrol eder.Yarışarsa, yamayı ilgili dalda birleştirecek ve yeni sürüm sürümü yapacaklardır. Linux Test Projesi ( https://github.com/linux-test-project/ltp ), yamaları uyguladıktan sonra çekirdeklere karşı test senaryolarının (Test Durumları) çalıştırılmasını sağlayan ana kaynaktır. Bu yaklaşık 2 ~ 4 saat sürebilir ve bağlıdır. Seçili çekirdeğin dosya sistemi ile ilgili test yapılacağını lütfen unutmayın. Örn: Ext4, EXT3 vb.'ye karşı farklı sonuçlar üretir.

Çekirdek Test prosedürü.

  1. Depodan en son çekirdek kaynağını alın. ( Https://www.kernel.org/Depodan veya Github.com)
  2. Düzeltme eki dosyasını uygulama (Fark aracını kullanma)
  3. Yeni çekirdek oluşturun.
  4. LTP'deki test prosedürlerine karşı test edin ( https://github.com/linux-test-project/ltp )
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.