Linux에서 안정적인 병합

매일 상당한 수의 변경사항이 업스트림 Linux 커널에 커밋됩니다. 이러한 변경사항에 대해 일반적으로 보안 영향을 평가하지는 않지만 상당수의 변경사항이 커널의 보안에 영향을 줄 수 있습니다. 각 변경사항의 보안 영향을 평가하는 것은 비용이 많이 들고 현실적으로 실행이 어려운 작업입니다. 대신, 지속 가능하고 유지 가능한 접근법은 정기적으로 변경사항을 업스트림 Linux 커널과 동기화하는 것입니다.

정기적으로 최신 LTS(Long Term Supported) 커널로 기기를 업데이트하는 것이 좋습니다. 정기적인 LTS 업데이트는 인식되지 않는 보안 취약점(예: 2019년 초의 Project Zero 보고서)을 공개되기 전 또는 악의적 행위자가 발견하기 전에 해결하는 데 도움이 될 수 있습니다.

기본 요건

  • Android 공통 커널 브랜치(AOSP)
  • 타겟 기기 커널을 위한 LTS 병합 스테이징 브랜치
  • 기기 커널 릴리스 브랜치
  • Git 저장소
  • 커널 빌드 도구 모음

LTS 변경사항과 병합

LTS 변경사항 병합
그림 1: LTS 변경사항 병합

다음 단계는 LTS 병합의 일반적인 단계를 간략히 보여줍니다.

  • 타겟 커널 출시 분기를 LTS 스테이징 분기로 역병합
  • Linux에서 안정적인 커널 또는 Android 공통을 LTS 스테이징 브랜치로 로컬 병합
  • 병합 충돌 해결(필요한 경우 지역/코드 소유자에게 문의)
  • 로컬에서 온전성/단위 테스트를 빌드하고 실행(아래 테스트 섹션 참조)
  • Android 공통 변경사항을 LTS 스테이징 브랜치에 업로드 및 병합
  • LTS 스테이징 브랜치를 사용하여 철저히 테스트(아래 테스트 섹션 참조)
  • 테스트 결과 검토
  • 필요한 경우 모든 회귀, bisect 병합 처리
  • LTS 스테이징 브랜치를 기본 기기 커널 릴리스 브랜치에 병합
  • 스테이징 LTS 커널이 포함된 기기용으로 새 Android 빌드 만들기
  • 새 커널로 출시 빌드/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 케이블을 사용하여 타겟 기기를 컴퓨터에 연결하고 Android 디버그 브리지(ADB)를 사용하여 .ko를 기기에 푸시합니다.

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 테스트

먼저 새 LTS 커널과 모듈을 사용하여 로컬에서 -userdebug 이미지를 빌드합니다.

/dev/kmsg에서 오류를 확인하고 노드가 있는지 확인한 후 계속합니다. 다음 사항을 테스트하여 모든 것이 예상대로 작동하는지 확인합니다.

  • Wi-Fi 속도
  • Chrome 브라우저
  • 카메라 앱으로 이미지 및 동영상 캡처
  • 내장된 스피커와 블루투스 헤드셋을 사용하고 YouTube 동영상 재생
  • 이동통신사 네트워크를 통한 통화
  • Wi-Fi를 통한 영상 통화

자동화된 테스트 도구 모음

제품 이미지가 회귀하지 않는지 최종적으로 확인하는 방법은 공급업체 테스트 도구 모음(VTS)을 통해 제공되는 테스트 도구 모음 및 자동화된 안정성 스트레스 테스트를 실행하는 것입니다.