Fusiones estables de Linux

Todos los días se realiza una cantidad significativa de cambios en el kernel de Linux ascendente. Estos cambios generalmente no se evalúan por su 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 mantenible es sincronizar periódicamente los cambios con el kernel de Linux ascendente.

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

requisitos previos

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

Fusión con cambios LTS

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

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

  • Vuelva a fusionar la rama de lanzamiento del kernel de destino en la rama de ensayo -LTS
  • Combinar localmente Linux estable o común de Android en la rama de ensayo -LTS
  • Resolver conflictos de fusión (consultar a los propietarios del código/área según sea necesario)
  • Cree localmente y realice pruebas de cordura/unidad (consulte la sección de pruebas a continuación)
  • Cargue y fusione los cambios comunes de Android en la rama de ensayo de LTS
  • Realice una prueba exhaustiva con la rama de ensayo -LTS (consulte la sección de pruebas a continuación)
  • Revisar los resultados de la prueba
  • Aborde cualquier regresión, biseque la fusión según sea necesario
  • Fusionar la rama de ensayo 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
  • Compile la versión de compilación/ROM con el nuevo kernel

Ejemplo de fusión con LTS.

Combine android-4.9 en principal/maestro (a través de LTS staging) y pague y sincronice la rama de staging 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 empujar la fusión hacia atrás a su control remoto de origen antes de continuar. Después de eso, combine Android Common en LTS staging.

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

Resolución de conflictos de fusión

En la mayoría de los casos, habrá conflictos entre el kernel común de Android y la rama de ensayo -LTS. Resolver conflictos de fusión durante las fusiones LTS puede ser un desafío, por lo que a continuación se incluyen 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 mediante la fusión de un número menor de versiones a la vez (<=5 versiones secundarias), 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 fusionarlo 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ápido, 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 objetivo a su computadora usando un cable USB y presione .ko al 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 transfiera la imagen del kernel.

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

Compruebe el registro de /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.

Compruebe si hay errores en /dev/kmsg y confirme que no haya ninguno antes de continuar. Pruebe lo siguiente para asegurarse de que todo funciona como se esperaba.

  • velocidad wifi
  • navegador cromo
  • Captura de imágenes y videos con la aplicación de la cámara
  • Reproducción de videos de YouTube con parlantes incorporados y auriculares Bluetooth
  • Llamadas a través de la red del operador
  • Videollamada por Wi-Fi

Conjuntos 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 las pruebas de estrés de estabilidad automatizadas.