Scalanie stabilne w systemie Linux

Każdego dnia w jądrze Linuksa wprowadzana jest znaczna liczba zmian. Zmiany te na ogół nie są oceniane pod kątem wpływu na bezpieczeństwo, ale wiele z nich może mieć wpływ na bezpieczeństwo jądra. Ocena każdej z tych zmian pod kątem wpływu na bezpieczeństwo jest operacją kosztowną i prawdopodobnie niewykonalną. Zamiast tego bardziej zrównoważonym i łatwiejszym w utrzymaniu podejściem jest regularna synchronizacja zmian z nadrzędnym jądrem Linuksa.

Zaleca się regularne aktualizowanie urządzeń za pomocą nowszych jąder z obsługą długoterminową (LTS). Regularne aktualizacje LTS mogą pomóc w rozwiązaniu potencjalnych, nierozpoznanych luk w zabezpieczeniach, takich jak raport Project Zero z początku 2019 r., przed publicznym ujawnieniem lub wykryciem przez złośliwe podmioty.

Warunki wstępne

  • Wspólna gałąź jądra Androida (z AOSP)
  • Gałąź pomostowa scalania LTS dla jądra urządzenia docelowego
  • Gałąź wydania jądra urządzenia
  • Repozytorium Git
  • Łańcuch narzędzi do budowania jądra

Połączenie ze zmianami LTS

Łączenie zmian LTS
Rysunek 1 : Łączenie zmian LTS

Poniższe kroki opisują typowe kroki scalania LTS.

  • Scal ponownie docelową gałąź wydania jądra z gałęzią pomostową -LTS
  • Lokalnie scal wersję stabilną dla systemu Linux lub wspólnego systemu Android z gałęzią pomostową -LTS
  • Rozwiązuj konflikty scalania (w razie potrzeby skonsultuj się z właścicielami obszarów/kodów)
  • Kompiluj lokalnie i przeprowadzaj testy zdrowego rozsądku/jednostkowe (patrz sekcja testowania poniżej)
  • Prześlij i scal typowe zmiany Androida w gałęzi testowej LTS
  • Przetestuj dokładnie, używając gałęzi testowej -LTS (patrz sekcja testowania poniżej)
  • Przejrzyj wyniki testu
  • Zajmij się wszelkimi regresjami, w razie potrzeby podziel połączenie na pół
  • Połącz gałąź pomostową -LTS z gałęzią wydania jądra głównego urządzenia
  • Utwórz nową kompilację Androida dla swoich urządzeń, która zawiera jądro LTS
  • Skompiluj wersję kompilacji/ROM z nowym jądrem

Przykład połączenia z LTS.

Połącz Androida 4.9 z głównym (poprzez staging LTS), sprawdź i zsynchronizuj gałąź testową 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

W tym momencie przed kontynuowaniem najlepiej jest przesunąć połączenie wsteczne do pilota źródłowego. Następnie połącz wspólny system Android z etapem LTS.

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

Rozwiązywanie konfliktów scalania

W większości przypadków wystąpią konflikty między wspólnym jądrem Androida a gałęzią pomostową -LTS. Rozwiązywanie konfliktów podczas łączenia LTS może być trudne, dlatego poniżej znajduje się kilka przydatnych wskazówek, jak je rozwiązać.

Stopniowe łączenie

Jeśli od aktualizacji jądra urządzenia za pomocą LTS minęło dużo czasu, istnieje duża szansa, że ​​od czasu ostatniej połączonej aktualizacji wydano wiele (>50) stabilnych wydań. Najlepszym sposobem rozwiązania tego problemu jest powolne nadrabianie zaległości poprzez łączenie mniejszej liczby wydań na raz (<= 5 mniejszych wersji) podczas testowania na każdym etapie.

Na przykład, jeśli podpoziom wersji jądra urządzenia to 4.14.100, a stabilny podpoziom nadrzędny to 4.14.155, najlepiej jest łączyć w małych przyrostach, aby zapewnić odpowiednią przejrzystość i przetestowanie rozsądnej liczby zmian.

Ogólnie rzecz biorąc, odkryliśmy, że praca przyrostowa w partiach <=5 mniejszych wydań na połączenie zapewnia łatwiejszy w zarządzaniu zestaw poprawek.

Testowanie

Szybki test rozruchu

Aby wykonać test szybkiego rozruchu, musisz najpierw scalić zmiany LTS lokalnie i zbudować jądro.
Poniższe kroki wyjaśniają proces szybkiego testu rozruchu.

Podłącz urządzenie docelowe do komputera za pomocą kabla USB i wciśnij .ko na urządzenie za pomocą 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

Uruchom dtbo i załaduj obraz jądra.

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

Sprawdź dziennik /dev/kmsg pod kątem błędów.

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

Testy Androida

Najpierw zbuduj lokalnie obraz -userdebug z nowym jądrem i modułami LTS.

Przed kontynuowaniem sprawdź plik /dev/kmsg pod kątem błędów i potwierdź, że ich nie ma. Przetestuj następujące elementy, aby upewnić się, że wszystko działa zgodnie z oczekiwaniami.

  • Szybkość Wi-Fi
  • Przeglądarka Chrome
  • Przechwytywanie obrazu i wideo za pomocą aplikacji aparatu
  • Odtwarzanie wideo YouTube z wbudowanymi głośnikami i zestawem słuchawkowym Bluetooth
  • Połączenia przez sieć operatora
  • Rozmowy wideo przez Wi-Fi

Zautomatyzowane zestawy testów

Ostateczna weryfikacja mająca na celu zapewnienie, że obraz produktu nie ulegnie pogorszeniu, przeprowadzana jest przy użyciu zestawów testów dostępnych w ramach pakietu testów dostawcy (VTS) i automatycznych testów obciążeniowych stabilności.