Catatan ini bertujuan untuk mendemonstrasikan git bisect otomatis menggunakan kernel Linux sebagai contoh. Dengan pencarian berikutnya untuk versi resmi dimulai dengan mana semuanya rusak dan versi bagus terakhir.

Deskripsi Toolkit
Toolkit [^ 7] adalah proyek sederhana untuk merakit kernel dan modul dengan konfigurasi minimum yang cukup untuk dijalankan di qemu, kotak sibuk minimal, file konfigurasi dan sejumlah kecil skrip.
- gcc;)
- binutils
- membuat
- qemu
- harapkan (hanya jika Anda akan menjalankan dua bagian dari contoh)
Kernel, bersama dengan gambar initramsfs , diluncurkan menggunakan qemu :
$ qemu-system-x86_64 -cpu host \ -kernel build-linux/arch/x86/boot/bzImage \ -initrd initramfs.cpio.xz \ -nographic -append "nokaslr console=ttyS0 root=/dev/ram" \ -enable-kvm -serial mon:stdio
Tidak ada kata sandi dan segera melempar kami ke konsol.
Dengan proyek ini, dua bagian sederhana [^ 1] dapat dilakukan.
Perhatian! Jika Anda berencana untuk mengulang manipulasi yang disajikan di bawah ini, atau akan digunakan sebagai dasar untuk proyek Anda, perlu diingat:
- kernel sangat bergantung pada versi gcc dan binutils , beberapa kernel
hanya bisa berkumpul dengan versi gcc tertentu, bisa berkumpul bersama
suntingan kecil atau penekanan kesalahan atau tidak mengumpulkan sama sekali - Mungkin ada masalah dengan versi baru binutils (mulai dari versi 2.31)
memuat modul pada versi kernel sebelum v4.16-rc3
Versi gcc 7.3.0 dan binutils 2.30 biarkan saya membangun dan
jalankan versi kernel v4.14 hingga v5.3-rc2.
Pernyataan masalah
Sebenarnya, masalah tambahan disajikan di sini, diselesaikan dalam kerangka masalah utama, yang diputuskan untuk dijadikan dasar sebagai contoh.
Pada titik tertentu, jalur dalam debugfs mengubah nilainya dari yang awalnya diimplementasikan dalam versi v4.14 :
# ls /sys/kernel/debug/ gpio-mockup-event # ls /sys/kernel/debug/gpio-mockup-event gpio-mockup-A
Nyala (terlihat pada v5.3-rc2 ):
# ls /sys/kernel/debug/ gpio-mockup # ls /sys/kernel/debug/gpio-mockup gpiochip1
Apa yang melanggar tes saya untuk program saya, dan tugasnya adalah menemukan kapan, di mana dan siapa, termasuk menentukan versi resmi kernel "baik" dan "buruk".
Solusi dengan menjalankan git bisect
Jika Anda mengulangi percobaan ini, jangan lupa untuk menyelesaikan:
$ git submodule update --init
run bisect.sh melalui git bisect run , skrip itu sendiri sangat sederhana dan terdiri dari tiga tindakan:
bersihkan semuanya
kumpulkan semuanya
jalankan tes / bisect.expect (skrip untuk mengharapkan)
Tes memulai qemu, menunggu promt, memuat modul gpio-mockup dan memeriksa keberadaan direktori di / sys / debug / kernel .
Kami memulai proses (sama dengan membagi dua manual dengan pengecualian pada langkah terakhir):
$ git -C linux bisect start $ git -C linux bisect good v4.14 # $ git -C linux bisect bad v5.3-rc2 # Bisecting: 73727 revisions left to test after this (roughly 16 steps) [798bba01b44b0ddf8cd6e542635b37cc9a9b739c] RDMA/core: Fail early if unsupported QP is provided
Run git bisect run :
$ time git -C linux bisect run ../bisect.sh #
Kami sedang menunggu ... Kami sedang menunggu ... Kami sedang menunggu ... Secara umum, meskipun mencoba menghemat waktu perakitan, saya punya satu perakitan:
$ time ../bisec.sh real 2m1.695s user 11m7.409s sys 2m0.751s
Menurut perkiraan awal, git bisect harus menangani 16 langkah.
Dan akhirnya, hasilnya:
d51ee07a8de7d6d3f7738a5e74861133fd2d46a0 is the first bad commit commit d51ee07a8de7d6d3f7738a5e74861133fd2d46a0 Author: Bartosz Golaszewski <bgolaszewski@baylibre.com> Date: Thu Jan 17 15:04:23 2019 +0100 gpio: mockup: don't create the debugfs link named after the label User-space tests no longer use it and we're breaking the interface anyway. Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com> :040000 040000 c1a1873f4cfcecace123b72fb036c3861151c9b9 61917a273f4f1f078639463a29acb8a103d50b41 M drivers bisect run success real 42m6.873s user 192m39.291s sys 33m55.932s
Nah, hasilnya memberi kami jumlah komit di mana semuanya hilang:
d51ee07a8de7d6d3f7738a5e74861133fd2d46a0 .
Sekarang Anda dapat melihat daftar semua langkah yang dilakukan oleh git bisect :
log git bisect $ git bisect log git bisect start # good: [bebc6082da0a9f5d47a1ea2edc099bf671058bd4] Linux 4.14 git bisect good bebc6082da0a9f5d47a1ea2edc099bf671058bd4 # bad: [609488bc979f99f805f34e9a32c1e3b71179d10b] Linux 5.3-rc2 git bisect bad 609488bc979f99f805f34e9a32c1e3b71179d10b # good: [798bba01b44b0ddf8cd6e542635b37cc9a9b739c] RDMA/core: Fail early if unsupported QP is provided git bisect good 798bba01b44b0ddf8cd6e542635b37cc9a9b739c # good: [e266ca36da7de45b64b05698e98e04b578a88888] Merge tag 'staging-5.1-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging git bisect good e266ca36da7de45b64b05698e98e04b578a88888 # bad: [318222a35bfb0ae9b5ff3e359a583463e6cfcd94] Merge branch 'akpm' (patches from Andrew) git bisect bad 318222a35bfb0ae9b5ff3e359a583463e6cfcd94 # bad: [962d5ecca101e65175a8cdb1b91da8e1b8434d96] Merge tag 'regmap-v5.2' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap git bisect bad 962d5ecca101e65175a8cdb1b91da8e1b8434d96 # bad: [f47d633134f7033e3d0c667419d9f8afd69e308d] Merge tag 'tag-chrome-platform-for-v5.1' of git://git.kernel.org/pub/scm/linux/kernel/git/chrome-platform/linux git bisect bad f47d633134f7033e3d0c667419d9f8afd69e308d # good: [6c3f98faddc7f07981c5365ba2f45905ad75fcaa] Merge branch 'i2c/for-5.1' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux git bisect good 6c3f98faddc7f07981c5365ba2f45905ad75fcaa # bad: [2901752c14b8e1b7dd898d2e5245c93e531aa624] Merge tag 'pci-v5.1-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci git bisect bad 2901752c14b8e1b7dd898d2e5245c93e531aa624 # bad: [1a29e857507046e413ca7a4a7c9cd32fed9ea255] Merge tag 'docs-5.1' of git://git.lwn.net/linux git bisect bad 1a29e857507046e413ca7a4a7c9cd32fed9ea255 # bad: [3601fe43e8164f67a8de3de8e988bfcb3a94af46] Merge tag 'gpio-v5.1-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio git bisect bad 3601fe43e8164f67a8de3de8e988bfcb3a94af46 # good: [cf2e8c544cd3b33e9e403b7b72404c221bf888d1] Merge tag 'mfd-next-5.1' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd git bisect good cf2e8c544cd3b33e9e403b7b72404c221bf888d1 # good: [8fab3d713ca36bf4ad4dadec0bf38f5e70b8999d] Merge tag 'gpio-v5.1-updates-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux into devel git bisect good 8fab3d713ca36bf4ad4dadec0bf38f5e70b8999d # bad: [9aac1e336c3ab3824f646224f4b2309b63c51668] Documentation: gpio: legacy: Don't use POLLERR for poll(2) git bisect bad 9aac1e336c3ab3824f646224f4b2309b63c51668 # good: [0248baca03b8f188eccbb991bda2caec4c330975] Merge tag 'intel-gpio-v5.1-1' of git://git.kernel.org/pub/scm/linux/kernel/git/andy/linux-gpio-intel into devel git bisect good 0248baca03b8f188eccbb991bda2caec4c330975 # bad: [e09313ce7ea1706d1642c7d5af103915e69fc6d0] gpio: mockup: change the signature of unlocked get/set helpers git bisect bad e09313ce7ea1706d1642c7d5af103915e69fc6d0 # good: [cbf1e092f2d86e6d7cdb7f9ff8a333f52c826232] gpio: mockup: implement get_multiple() git bisect good cbf1e092f2d86e6d7cdb7f9ff8a333f52c826232 # bad: [83336668b94eb44ecd78a0b7840e43f0859e05cb] gpio: mockup: change the type of 'offset' to unsigned int git bisect bad 83336668b94eb44ecd78a0b7840e43f0859e05cb # bad: [d51ee07a8de7d6d3f7738a5e74861133fd2d46a0] gpio: mockup: don't create the debugfs link named after the label git bisect bad d51ee07a8de7d6d3f7738a5e74861133fd2d46a0 # first bad commit: [d51ee07a8de7d6d3f7738a5e74861133fd2d46a0] gpio: mockup: don't create the debugfs link named after the label
Sebenarnya, ini adalah kegagalan tes pertama (ya - ada dua di antaranya dalam tes):
send "ls /sys/kernel/debug/\r" expect { "gpio-mockup-event" {} timeout { puts "gpio-mockup-event not found"; exit 1 } }
Cek lain istirahat dengan komit 2a9e27408e12de455b9fcf66b5d0166f2129579e (tentu saja akan memisahkan mereka tapi malas, jadi saya hanya melihat komit << berikutnya >>):
send "ls /sys/kernel/debug/gpio-mockup-event/\r" expect { "gpio-mockup-A" { puts "gpio-mockup-A found" } timeout { puts "gpio-mockup-A not found"; exit 1 } }
Nah, mari kita cari tahu kapan komit d51ee07a8de7 masuk ke cabang utama ke Linus dan dengan versi kernel resmi apa yang ada [^ 6].
Mari kita lihat semua komit hingga d51ee07a8de7 memfilter hanya menggabungkan commit [^ 3] (gabungan komit) dan memiliki jalur langsung [^ 4] (rantai keturunan):
$ git log --pretty=oneline d51ee07a8de7d6d3f7738a5e74861133fd2d46a0..master --ancestry-path --merges
Ini memberi kita semua gabungan komit antara d51ee07a8de7 dan master. Mari kita lihat bagian akhir daftar (hanya tiga entri terakhir yang ditampilkan):
3601fe43e8164f67a8de3de8e988bfcb3a94af46 Merge tag 'gpio-v5.1-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio 3dda927fdbaac926c50b550ccb51ed18c184468b Merge branch 'ib-qcom-ssbi' into devel 2f7db3c70fdfb22480a1b0aa734664fc256532f2 Merge tag 'gpio-v5.1-updates-for-linus-part-2' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux into devel
Seperti yang kita lihat pada commit terakhir, ini adalah pengambilalihan cabang dari git: //git.kernel.org/pub/scm/linux/kernel/git/brgl/linux in git: //git.kernel.org/pub/scm/linux/kernel / git / linusw / linux-gpio devel, dan yang pertama dalam daftar adalah pengambilalihan cabang kawan Linus Walleij (<< kepala >> dari subsistem GPIO) oleh kawan Linus Torvalds di cabang master.
Ada skrip yang sangat bagus [^ 2], yang langsung mengarah ke hasil tanpa kerja manual:
# 3601fe43e816 $ git-find-merge d51ee07a8de7d6d3f7738a5e74861133fd2d46a0 master
Temukan versi pertama setelah melakukan 3601fe43e816 :
$ git name-rev --name-only 3601fe43e816 tags/v5.1-rc1~102
Angka 102 di sini adalah jarak dari 3601fe43e816 ke v5.1-rc1 , mari kita periksa menggunakan opsi orang tua pertama [^ 5]:
$ git -P log --pretty --oneline --first-parent \ --graph 3601fe43e816..v5.1-rc1 | wc -l 102
Segalanya tampak teratur. Saya dapat mengatakan bahwa versi resmi pertama kernel di mana semuanya << rusak >> v5.1-rc1 , dan dalam versi v5.0 semuanya baik-baik saja:
$ git describe 3601fe43e816 v5.0-8748-g3601fe43e816
Kesimpulan
Bukan rahasia lagi bahwa melakukan hal-hal seperti itu secara otomatis jauh lebih menyenangkan. Sangat sulit untuk membuat sejumlah langkah secara manual, mengingat waktu perakitan yang lama, Anda bisa melupakan apa yang Anda lakukan.
Sebenarnya, dengan persyaratan yang dirumuskan, Anda dapat melakukan manipulasi, membuat program khusus dan menambah initramfs , atau memeriksa sesuatu dari Anda sendiri dan memiliki dua bagian di tangan.
Pengujian dapat dalam bentuk apa pun yang mudah sementara memenuhi persyaratan menjalankan git bisect . Selain itu, dengan bantuan program aplikasi (misalnya, harapan yang sama), Anda dapat membatasi firmware papan dengan arsitektur yang Anda butuhkan dan melakukan pemeriksaan langsung di atasnya.
[^ 1]: Christian Couder. Pemutusan otomatis sepenuhnya dengan "git bisect run" .
[^ 2]: rmandvikar. Sistem kait Git (global, kait lokal), skrip shell utilitas, konfigurasi untuk direktori HOME .
[^ 3]: Scott Chacon dan Ben Straub. Buku Pro Git .
[^ 4]: void.pointer. Bagaimana cara kerja jalur leluhur dengan git log? .
[^ 5]: Marc G Gauthier. Opsi Git Log βPertama-induk .
[^ 6]: Guillaume Morin. Temukan komit gabungan yang menyertakan komit tertentu .
[^ 7]: Templat kernel Linux git bisect
Gambar asli yang digunakan di header: https://xkcd.com/1597/ .