Scalanie stabilne w systemie Linux

Codziennie w nadrzędnym jądrze Linuksa wprowadzane są spore zmiany. Te zmiany zwykle nie są oceniane pod kątem bezpieczeństwa, ale wiele z nich może wpłynąć na bezpieczeństwo jądra. Ocena wpływu każdej z tych zmian na bezpieczeństwo jest kosztowną i prawdopodobnie niemożliwą do wykonania operacją. Bardziej zrównoważonym i łatwym w utrzymaniu podejściem jest regularne synchronizowanie zmian z górnego jądra Linuksa.

Zalecamy regularne aktualizowanie urządzeń z nowszymi jądrami obsługiwanymi długoterminami (LTS). Regularne aktualizacje LTS mogą pomóc w rozwiązaniu potencjalnych nierozpoznanych luk w zabezpieczeniach, takich jak ten raport Project Zero z początku 2019 r., jeszcze przed ujawnieniem lub odkryciem przez osoby o złośliwych zamiarach.

Wymagania wstępne

  • Gałąź wspólnego jądra Androida (z AOSP)
  • gałąź tymczasowa scalania LTS dla jądra urządzenia docelowego;
  • Gałąź jądra urządzenia
  • Repozytorium Git
  • Łańcuch narzędzi do kompilowania jądra

Scal zmiany w LTS

Scalanie zmian LTS
Rysunek 1.: scalanie zmian LTS

Poniżej znajdziesz typowe czynności związane z łączeniem wersji LTS.

  • Złącz gałę docelową wersji jądra z gałęzi przygotowawczej LTS
  • Lokalne scalanie gałęzi linux-stable lub Android common z gałęzią stagingową -LTS
  • Rozwiązywanie konfliktów scalania (w razie potrzeby skonsultuj się z właścicielami obszaru lub kodu)
  • Utwórz lokalnie i przeprowadź testy wiarygodności lub testy jednostkowe (patrz sekcja testowania poniżej).
  • Przesyłanie i scalanie wspólnych zmian w Androidzie do gałęzi testowej LTS
  • Przeprowadź dokładne testy, korzystając z gałęzi przejściowej -LTS (patrz sekcja dotycząca testowania poniżej).
  • Sprawdzanie wyników testu
  • Rozwiązywanie regresji i w razie potrzeby scalanie połówek.
  • Scal gałąź przejściową -LTS z główną gałęzią wersji jądra urządzenia
  • Utwórz nową kompilację Androida dla urządzeń, która zawiera jądrową wersję LTS.
  • Kompilowanie wersji produkcyjnej/ROM-u z nowym jądrem

Przykład scalania z LTS

Połącz android-4.9 z główną gałęzią (za pomocą gałęzi tymczasowej LTS) oraz pobierz i zsynchronizuj gałąź tymczasową 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 najlepiej przesłać zaktualizowane dane do źródłowego urządzenia zdalnego, a dopiero potem kontynuować. Następnie scal Android common z wersją testową LTS.

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

Rozwiązywanie konfliktów scalania

W większości przypadków występują konflikty między wspólnym jądrem Androida a gałęzią przejściową -LTS. Rozwiązywanie konfliktów podczas scalania wersji LTS może być trudne, dlatego poniżej znajdziesz kilka przydatnych wskazówek.

Scalanie przyrostowe

Jeśli od momentu aktualizacji jądra urządzenia przy użyciu LTS upłynęło dużo czasu, istnieje duże prawdopodobieństwo, że od momentu opublikowania ostatniej scalonej aktualizacji przed opublikowaniem ostatniej scalonej aktualizacji mogło pojawić się wiele (ponad 50) stabilnych wersji. Najlepszym sposobem na rozwiązanie tego problemu jest stopniowe nadrabianie zaległości przez scalanie mniejszej liczby wersji naraz (do 5 mniejszych wersji) i testowanie na każdym etapie.

Jeśli na przykład podpoziom wersji jądra urządzenia to 4.14.100, a na upstreamie podpoziom stabilnej wersji to 4.14.155, najlepiej jest scalać w mniejszych przyrostach, aby zapewnić odpowiednią ilość zmian, które można odpowiednio sprawdzić i przetestować.

Ogólnie stwierdziliśmy, że stopniowe tworzenie pakietów z mniej niż 5 małymi wersjami na scalanie zapewnia łatwiejszy do zarządzania zestaw poprawek.

Testowanie

Test szybkiego uruchamiania

Aby przeprowadzić szybki test uruchamiania, musisz najpierw scalić zmiany LTS lokalnie i skompilować jądro. Poniżej opisujemy proces szybkiego uruchamiania.

Podłącz urządzenie docelowe do komputera za pomocą kabla USB i prześlij plik .ko na urządzenie za pomocą narzędzia 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 prześlij obraz jądra.

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

Poszukaj błędów w logu /dev/kmsg.

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

Testy Androida

Najpierw utwórz lokalnie obraz -userdebug z nowymi modułami i jądrem LTS.

Zanim przejdziesz dalej, sprawdź, czy w pliku /dev/kmsg nie ma błędów. Jeśli tak nie jest, upewnij się, że nie ma żadnych błędów. Aby mieć pewność, że wszystko działa zgodnie z oczekiwaniami, przetestuj te elementy.

  • Szybkość Wi-Fi
  • Przeglądarka Chrome
  • rejestrowanie zdjęć i filmów za pomocą aplikacji Aparat;
  • Odtwarzanie filmów w YouTube z wbudowanymi głośnikami i zestawem słuchawkowym Bluetooth
  • Połączenia przez sieć operatora
  • Połączenie wideo przez Wi-Fi

Pakiety testów automatycznych

Ostatnią weryfikację, która zagwarantuje, że zdjęcie produktu nie zacznie się ponownie odtwarzać, jest przeprowadzana za pomocą zestawów testów dostępnych w ramach pakietu testowego dostawcy (VTS) i automatycznych testów w warunkach skrajnych związanych ze stabilnością.