Penggabungan yang stabil di Linux

Setiap hari sejumlah besar perubahan dilakukan pada kernel Linux upstream. Perubahan ini umumnya tidak dievaluasi dampak keamanannya, namun banyak di antaranya berpotensi berdampak pada keamanan kernel. Mengevaluasi dampak keamanan setiap perubahan ini adalah operasi yang mahal dan kemungkinan besar tidak mungkin dilakukan. Sebaliknya, pendekatan yang lebih berkelanjutan dan dapat dipelihara adalah dengan menyinkronkan perubahan secara rutin dengan kernel Linux upstream.

Disarankan untuk memperbarui perangkat secara berkala dengan kernel yang Didukung Jangka Panjang (LTS) yang lebih baru. Pembaruan LTS secara rutin dapat membantu mengatasi potensi kerentanan keamanan yang tidak diketahui, seperti laporan Project Zero pada awal tahun 2019, sebelum diungkapkan kepada publik atau ditemukan oleh pelaku kejahatan.

Prasyarat

  • Cabang kernel umum Android (dari AOSP)
  • Cabang pementasan gabungan LTS untuk kernel perangkat target
  • Cabang rilis kernel perangkat
  • Repo Git
  • Rantai alat pembuatan kernel

Penggabungan dengan perubahan LTS

Menggabungkan perubahan LTS
Gambar 1 : Menggabungkan perubahan LTS

Langkah-langkah berikut menguraikan langkah-langkah umum untuk penggabungan LTS.

  • Gabungkan kembali cabang rilis kernel target ke dalam cabang pementasan -LTS
  • Gabungkan linux-stable atau Android common secara lokal ke dalam cabang pementasan -LTS
  • Selesaikan konflik penggabungan (konsultasikan dengan pemilik area/kode sesuai kebutuhan)
  • Bangun secara lokal dan lakukan pengujian kewarasan/unit (lihat bagian pengujian di bawah)
  • Unggah dan gabungkan perubahan umum Android ke cabang pementasan LTS
  • Uji secara menyeluruh menggunakan cabang pementasan -LTS (lihat bagian pengujian di bawah)
  • Tinjau hasil tes
  • Atasi regresi apa pun, gabungkan dua sesuai kebutuhan
  • Gabungkan cabang pementasan -LTS ke dalam cabang rilis kernel perangkat utama
  • Buat build Android baru untuk perangkat Anda yang menyertakan kernel LTS staging
  • Kompilasi rilis build/ROM dengan kernel baru

Contoh penggabungan dengan LTS.

Gabungkan Android-4.9 ke main (melalui staging LTS) dan checkout serta sinkronkan cabang staging LTS:

repo init -b <Device kernel LTS staging branch>  # init
repo sync
git checkout -b lts <Device kernel LTS staging branch>
git merge <Device kernel release branch>         # back-merge
git commit

Pada titik ini yang terbaik adalah mendorong penggabungan kembali ke sumber jarak jauh sebelum melanjutkan. Setelah itu, gabungkan Android common ke dalam staging LTS.

git merge -X patience android-4.9-q            # LTS merge

Menyelesaikan konflik penggabungan

Dalam kebanyakan kasus, akan ada konflik antara kernel umum Android dan cabang staging -LTS. Menyelesaikan konflik penggabungan selama penggabungan LTS dapat menjadi tantangan, jadi berikut adalah beberapa tips berguna untuk mengatasinya.

Penggabungan bertahap

Jika jangka waktu yang cukup lama telah berlalu sejak kernel perangkat diperbarui dengan LTS, kemungkinan besar terdapat banyak (>50) rilis stabil sejak pembaruan gabungan terakhir dirilis di bagian hulu. Cara terbaik untuk mengatasi hal ini adalah dengan perlahan mengejar ketertinggalan dengan menggabungkan sejumlah rilis yang lebih kecil dalam satu waktu (<=5 versi minor), sambil melakukan pengujian pada setiap langkahnya.

Misalnya, jika sublevel versi kernel perangkat adalah 4.14.100 dan sublevel stabil upstream adalah 4.14.155, yang terbaik adalah menggabungkannya sedikit demi sedikit untuk memastikan volume perubahan yang wajar dapat ditinjau dan diuji secara memadai.

Secara umum, kami menemukan bahwa bekerja secara bertahap dalam batch <=5 rilis kecil per penggabungan memastikan serangkaian patch yang lebih mudah dikelola.

Pengujian

Tes boot cepat

Untuk melakukan tes boot cepat, Anda harus terlebih dahulu menggabungkan perubahan LTS secara lokal dan membangun kernel.
Langkah-langkah berikut menjelaskan proses tes boot cepat.

Hubungkan perangkat target ke komputer Anda menggunakan kabel USB dan tekan .ko ke perangkat menggunakan Android Debug Bridge (ADB).

adb root
adb disable-verity
adb reboot
(wait for device boot-to-home)
adb root
adb remount
adb push *.ko vendor/lib/modules/
adb reboot bootloader

Boot dtbo dan sideload image kernel.

fastboot boot --header-version=2 Image.lz4 (redo again if device rebooted)

Periksa log /dev/kmsg apakah ada kesalahan.

adb shell
su
cat /dev/kmsg  (inspect kernel log for obvious new errors)

tes Android

Pertama, buat image -userdebug secara lokal dengan kernel dan modul LTS baru.

Periksa /dev/kmsg apakah ada kesalahan dan konfirmasikan bahwa tidak ada kesalahan sebelum melanjutkan. Uji hal-hal berikut untuk memastikan semuanya berjalan sesuai harapan.

  • Kecepatan Wi-Fi
  • peramban Chrome
  • Pengambilan gambar dan video dengan aplikasi kamera
  • Pemutaran video YouTube dengan speaker internal dan headset Bluetooth
  • Panggilan melalui jaringan operator
  • Panggilan video melalui Wi-Fi

Rangkaian pengujian otomatis

Verifikasi akhir untuk memastikan gambar produk tidak mengalami kemunduran dilakukan menggunakan rangkaian pengujian yang tersedia melalui vendor test suite (VTS) dan pengujian tekanan stabilitas otomatis.