Fusiones estables de Linux

Cada día se realiza una cantidad significativa de cambios en el kernel de Linux. Por lo general, estos cambios no se evalúan en cuanto al impacto en la seguridad, pero muchos de ellos tienen el potencial de afectar la seguridad del kernel. Evaluar el impacto en la seguridad de cada uno de estos cambios es una operación costosa y probablemente inviable. En cambio, un enfoque más sostenible y fácil de mantener es sincronizar periódicamente los cambios con el kernel de Linux ascendente.

Se recomienda actualizar periódicamente los dispositivos con kernels más nuevos con soporte a largo plazo (LTS). Las actualizaciones periódicas de LTS pueden ayudar a abordar posibles vulnerabilidades de seguridad no reconocidas, como este informe de Project Zero de principios de 2019, antes de su divulgación pública o descubrimiento por parte de actores maliciosos.

Requisitos previos

  • Rama del kernel común de Android (de AOSP)
  • Una rama provisional de fusión LTS para el kernel del dispositivo de destino
  • Rama de lanzamiento del kernel del dispositivo
  • repositorio de git
  • Cadena de herramientas de construcción del kernel

Fusionarse con cambios LTS

Fusionar cambios de LTS
Figura 1 : Fusión de cambios de LTS

Los siguientes pasos describen los pasos típicos para una fusión LTS.

  • Fusionar hacia atrás la rama de lanzamiento del kernel de destino en la rama provisional -LTS
  • Fusionar localmente Linux-stable o Android común en la rama provisional -LTS
  • Resolver conflictos de fusión (consulte a los propietarios del código/área según sea necesario)
  • Construya localmente y realice pruebas unitarias/de cordura (consulte la sección de pruebas a continuación)
  • Cargar y fusionar cambios comunes de Android en la rama provisional LTS
  • Pruebe minuciosamente utilizando la rama de preparación -LTS (consulte la sección de pruebas a continuación)
  • Revisar los resultados de la prueba
  • Abordar cualquier regresión, fusionar en dos según sea necesario
  • Fusionar la rama provisional -LTS en la rama de lanzamiento del kernel del dispositivo principal
  • Cree una nueva compilación de Android para sus dispositivos que incluya el kernel LTS provisional
  • Compilar versión/ROM de lanzamiento con nuevo kernel

Ejemplo de fusión con LTS.

Fusione Android-4.9 en la rama principal (a través de la preparación LTS) y verifique y sincronice la rama provisional 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

En este punto, es mejor realizar la fusión inversa en el control remoto de origen antes de continuar. Después de eso, combine Android común en la preparación LTS.

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

Resolver conflictos de fusión

En la mayoría de los casos, habrá conflictos entre el kernel común de Android y la rama provisional -LTS. Resolver conflictos de fusión durante fusiones LTS puede ser un desafío, por lo que a continuación se ofrecen algunos consejos útiles para abordarlos.

Fusión incremental

Si ha pasado una cantidad significativa de tiempo desde que se actualizó el kernel de un dispositivo con LTS, es muy probable que haya habido muchas (>50) versiones estables desde que se lanzó la última actualización fusionada. La mejor manera de abordar esto es ponerse al día poco a poco fusionando un número menor de versiones a la vez (<=5 versiones menores), mientras se prueba en cada paso del camino.

Por ejemplo, si el subnivel de la versión del kernel del dispositivo es 4.14.100 y el subnivel estable ascendente es 4.14.155, es mejor fusionar en pequeños incrementos para garantizar que se pueda revisar y probar adecuadamente un volumen razonable de cambios.

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

Pruebas

Prueba de arranque rápido

Para realizar una prueba de arranque rápida, primero debe fusionar los cambios de LTS localmente y compilar el kernel.
Los siguientes pasos explican el proceso de prueba de arranque rápido.

Conecte el dispositivo de destino a su computadora usando un cable USB y presione .ko en el dispositivo usando 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

Inicie dtbo y descargue la imagen del kernel.

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

Verifique el registro /dev/kmsg para ver si hay errores.

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

pruebas de Android

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

Verifique /dev/kmsg en busca de errores y confirme que no haya ninguno antes de continuar. Pruebe lo siguiente para asegurarse de que todo funcione como se esperaba.

  • velocidad wifi
  • Navegador Chrome
  • Captura de imágenes y videos con la aplicación de cámara.
  • Reproducción de vídeos de YouTube con altavoces integrados y auriculares Bluetooth
  • Llamadas a través de la red del operador
  • Videollamada a través de Wi-Fi

Suites de pruebas automatizadas

La verificación final para garantizar que la imagen del producto no retroceda se realiza utilizando los conjuntos de pruebas disponibles a través del conjunto de pruebas del proveedor (VTS) y pruebas de estrés de estabilidad automatizadas.