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

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

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

Предварительные условия

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

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

Merging LTS changes
Рисунок 1. Объединение изменений LTS.

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

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

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

Объедините android-4.9 с основной (через промежуточную версию 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 с промежуточной версией LTS.

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

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

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

Incremental merging

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

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

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

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

Quick boot test

Чтобы выполнить быстрый загрузочный тест, вы должны сначала объединить изменения 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)

Андоидные тесты

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

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

  • Скорость Wi-Fi
  • Браузер Хром
  • Захват изображений и видео с помощью приложения камеры
  • YouTube video playback with built-in speakers and Bluetooth headset
  • Звонки через сеть оператора
  • Видеозвонок через Wi-Fi

Пакеты автоматизированного тестирования

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

,

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

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

Предварительные условия

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

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

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

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

  • Обратное слияние целевой ветки выпуска ядра с промежуточной веткой -LTS.
  • Локально объединить стабильную версию Linux или общую версию Android в промежуточную ветку -LTS.
  • Устраните конфликты слияния (при необходимости проконсультируйтесь с владельцами областей/кодов)
  • Сборка локально и выполнение работоспособного/модульного тестирования (см. раздел тестирования ниже).
  • Загрузить и объединять Android Common Manings в постановку LTS
  • Test thoroughly using -LTS staging branch (see testing section below)
  • Просмотрите результаты теста
  • Устраните любые регрессии, при необходимости выполните слияние пополам.
  • Объединить промежуточную ветку -LTS с веткой выпуска ядра основного устройства.
  • Создайте новую сборку Android для своих устройств, включающую промежуточное ядро ​​LTS.
  • Скомпилируйте релизную сборку/ROM с новым ядром.

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

Объедините android-4.9 с основной (через промежуточную версию 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 с промежуточной версией 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
  • Браузер Хром
  • Захват изображений и видео с помощью приложения камеры
  • Воспроизведение видео YouTube со встроенными динамиками и Bluetooth-гарнитурой.
  • Звонки через сеть оператора
  • Видеозвонок через Wi-Fi

Пакеты автоматизированного тестирования

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