Linux-стабильные слияния

Каждый день в исходное ядро ​​Linux вносится значительное количество изменений. Эти изменения, как правило, не оцениваются на предмет влияния на безопасность, но многие из них потенциально могут повлиять на безопасность ядра. Оценка влияния каждого из этих изменений на безопасность является дорогостоящей и, вероятно, невыполнимой операцией. Вместо этого более устойчивым и поддерживаемым подходом является регулярная синхронизация изменений с вышестоящим ядром Linux.

Рекомендуется регулярно обновлять устройства новыми ядрами с долгосрочной поддержкой (LTS). Регулярные обновления LTS могут помочь устранить потенциальные непризнанные уязвимости безопасности, такие как этот отчет Project Zero , выпущенный ранее в 2019 году, до публичного раскрытия или обнаружения злоумышленниками.

Предпосылки

  • Ветка общего ядра Android (из AOSP)
  • Промежуточная ветвь слияния LTS для ядра целевого устройства.
  • Ветка выпуска ядра устройства
  • Git-репозиторий
  • Набор инструментов для сборки ядра

Слияние с изменениями LTS

Объединение изменений LTS
Рис. 1. Объединение изменений LTS

Следующие шаги описывают типичные шаги для слияния LTS.

  • Обратное слияние целевой ветки выпуска ядра с промежуточной веткой -LTS
  • Локально объединить linux-stable или Android common с промежуточной веткой -LTS.
  • Разрешить конфликты слияния (при необходимости проконсультироваться с владельцами области/кода)
  • Сборка локально и выполнение работоспособного/модульного тестирования (см. раздел тестирования ниже)
  • Загрузите и объедините общие изменения Android с промежуточной веткой LTS.
  • Тщательно протестируйте, используя промежуточную ветку -LTS (см. раздел тестирования ниже).
  • Просмотрите результаты теста
  • Устранение любых регрессий, разделение пополам при необходимости
  • Объединить промежуточную ветку -LTS с веткой выпуска ядра основного устройства
  • Создайте новую сборку Android для своих устройств, включающую промежуточное ядро ​​LTS.
  • Скомпилируйте релизную сборку/ПЗУ с новым ядром

Пример слияния с LTS.

Объедините android-4.9 в main/master (через LTS-стадию) и извлеките и синхронизируйте промежуточную ветку 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

На этом этапе лучше всего нажать обратное слияние на исходный пульт, прежде чем продолжить. После этого объедините Android common с промежуточной версией LTS.

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

Разрешение конфликтов слияния

В большинстве случаев будут возникать конфликты между общим ядром Android и промежуточной ветвью -LTS. Разрешение конфликтов слияния во время слияний LTS может быть сложной задачей, поэтому ниже приведены несколько полезных советов по их устранению.

Инкрементное слияние

Если с момента обновления ядра устройства с помощью LTS прошло значительное количество времени, есть большая вероятность, что было выпущено много (> 50) стабильных выпусков с момента выпуска последнего объединенного обновления. Лучший способ решить эту проблему — медленно наверстывать упущенное, объединяя меньшее количество выпусков за раз (<=5 младших версий), при этом тестируя каждый шаг пути.

Например, если подуровень версии ядра устройства — 4.14.100, а стабильный подуровень восходящей ветки — 4.14.155, лучше всего выполнять слияние небольшими шагами, чтобы можно было надлежащим образом проверить и протестировать разумный объем изменений.

В общем, мы обнаружили, что поэтапная работа в пакетах <=5 второстепенных выпусков на слияние обеспечивает более управляемый набор исправлений.

Тестирование

Быстрый тест загрузки

Чтобы выполнить быстрый тест загрузки, вы должны сначала объединить изменения LTS локально и собрать ядро.
Следующие шаги объясняют процесс быстрой проверки загрузки.

Подключите целевое устройство к компьютеру с помощью USB-кабеля и отправьте .ko на устройство с помощью 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

Загрузите dtbo и загрузите образ ядра.

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

Проверьте журнал /dev/kmsg на наличие ошибок.

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

Android-тесты

Сначала создайте образ -userdebug локально с новым ядром и модулями LTS.

Проверьте /dev/kmsg на наличие ошибок и убедитесь, что их нет, прежде чем продолжить. Проверьте следующие вещи, чтобы убедиться, что все работает так, как ожидалось.

  • Скорость Wi-Fi
  • Браузер Chrome
  • Съемка изображений и видео с помощью приложения камеры
  • Воспроизведение видео с YouTube со встроенными динамиками и Bluetooth-гарнитурой
  • Звонки через операторскую сеть
  • Видеозвонок по Wi-Fi

Комплекты автоматизированного тестирования

Окончательная проверка, чтобы убедиться, что образ продукта не регрессирует, выполняется с использованием наборов тестов, доступных через набор тестов поставщика (VTS) и автоматизированное стресс-тестирование стабильности.