Combinaciones estables para Linux

Todos los días, se confirma una cantidad significativa de cambios al kernel de Linux ascendente. Por lo general, estos cambios no se evalúan pero muchos de ellos tienen el potencial de afectar la seguridad del kernel. Evaluar cada uno de estos cambios en cuanto al impacto en la seguridad es costoso y probablemente una operación inviable. En cambio, un enfoque más sustentable y fácil de mantener sincronizan regularmente los cambios con el kernel ascendente de Linux.

Se recomienda actualizar los dispositivos con frecuencia (LTS). Las actualizaciones periódicas de LTS ayudan a abordar los posibles problemas vulnerabilidades de seguridad, como esta informe de Project Zero de principios de 2019, antes de su divulgación pública o el descubrimiento por parte de actores maliciosos.

Requisitos previos

  • Rama de kernel común de Android (de AOSP)
  • Una rama de etapa de pruebas de combinación de LTS para el kernel del dispositivo de destino
  • Rama de actualización del kernel del dispositivo
  • Repositorio de Git
  • Cadena de herramientas de compilación del kernel

Combinar con cambios de LTS

Cómo combinar cambios de LTS
Figura 1: Combinación de cambios de LTS

En los siguientes pasos, se describen los pasos típicos para una combinación de LTS.

  • Vuelve a combinar la rama de la versión del kernel de destino en la etapa de pruebas de -LTS. rama
  • Combina localmente linux-stable o Android común en la rama de etapa de pruebas de LTS
  • Resuelve los conflictos de combinación (consulta a los propietarios de código o área según sea necesario).
  • Compila de forma local y realiza pruebas de estado o de unidades (consulta la sección de pruebas a continuación)
  • Sube y combina los cambios comunes de Android en la rama de etapa de pruebas de LTS
  • Realiza una prueba exhaustiva con la rama de etapa de pruebas de LTS (consulta la sección de pruebas a continuación)
  • Revisa los resultados de la prueba
  • Aborda las regresiones, divide la combinación según sea necesario
  • Combinación de la rama de etapa de pruebas de LTS con la rama de la versión del kernel del dispositivo principal
  • Crea una nueva compilación de Android para tus dispositivos que incluya el kernel de LTS de etapa de pruebas
  • Cómo compilar la compilación/ROM de lanzamiento con un kernel nuevo

Ejemplo de combinación con LTS.

Combina android-4.9 en la principal (a través de una etapa de pruebas de LTS) y la rama de etapa de pruebas de LTS de la confirmación de la compra y la sincronización:

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

En este punto, es mejor enviar la operación back-merge al control remoto de origen antes y continúa. Después de eso, combina Android común en la etapa de pruebas de LTS.

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

Cómo resolver conflictos de combinación

En la mayoría de los casos, se producen conflictos entre el kernel común de Android y la rama de etapa de pruebas de LTS. Puedes resolver conflictos de combinación durante las combinaciones de LTS desafiante, así que a continuación hay algunos consejos útiles para abordarlos.

Combinación incremental

Si ya pasó una cantidad de tiempo considerable desde que se actualizó el kernel de un dispositivo con LTS, es muy probable que se hayan registrado muchos (más de 50) estables desde que se lanzó la última actualización combinada en sentido upstream. La mejor manera de es ponerse al día combinando de forma gradual en una menor cantidad de versiones una vez (menos de 5 versiones secundarias), mientras se prueba en cada paso del camino.

Por ejemplo, si el subnivel de la versión de kernel del dispositivo es 4.14.100 y el nivel el subnivel estable es 4.14.155, es mejor fusionarlo en pequeños incrementos para asegurar que un volumen razonable de cambios pueda revisarse y probarse de forma adecuada.

En general, hemos descubierto que trabajar de forma incremental en lotes de <=5 Las versiones menores por combinación garantizan un conjunto de parches más manejable.

Prueba

Prueba de inicio rápido

Para realizar una prueba de inicio rápido, primero debes combinar los cambios de LTS de forma local y compilar el kernel. En los siguientes pasos, se explica el proceso de prueba de inicio rápido.

Conecta el dispositivo de destino a la computadora con un cable USB y envía .ko a el dispositivo con 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

Inicia dtbo y transfiere la imagen del kernel.

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

Busca errores en el registro /dev/kmsg.

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

Pruebas de Android

Primero, compila la imagen -userdebug localmente con el nuevo kernel de LTS y módulos.

Revisa /dev/kmsg para ver si hay algún error y confirma que no haya ninguno antes y continúa. Prueba lo siguiente para asegurarte de que todo funciona según lo esperado.

  • Velocidad de Wi-Fi
  • Navegador Chrome
  • Captura de imagen y video con una app de cámara
  • Reproducción de videos de YouTube con bocinas integradas y auriculares Bluetooth
  • Llamadas mediante la red del operador
  • Videollamada por Wi-Fi

Paquetes de pruebas automatizadas

La verificación final para garantizar que la imagen del producto no disminuya realizada con los paquetes de pruebas disponibles a través del paquete de pruebas del proveedor (VTS) y las pruebas de esfuerzo de estabilidad automatizadas.