Linux에서 안정적인 병합

매일 상당한 수의 변경 사항이 업스트림 Linux 커널에 커밋됩니다. 이러한 변경 사항은 일반적으로 보안 영향에 대해 평가되지 않지만, 그 중 다수는 커널 보안에 영향을 미칠 가능성이 있습니다. 보안 영향에 대해 이러한 각 변경 사항을 평가하는 것은 비용이 많이 들고 실행 불가능할 수 있는 작업입니다. 대신 보다 지속 가능하고 유지 관리 가능한 접근 방식은 변경 사항을 업스트림 Linux 커널과 정기적으로 동기화하는 것입니다.

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

전제조건

  • Android 일반 커널 분기(AOSP에서)
  • 대상 장치 커널에 대한 LTS 병합 스테이징 분기
  • 장치 커널 릴리스 분기
  • 힘내 레포
  • 커널 빌드 도구 모음

LTS 변경 사항과 병합

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

다음 단계에서는 LTS 병합의 일반적인 단계를 간략하게 설명합니다.

  • 대상 커널 릴리스 분기를 -LTS 스테이징 분기로 백병합
  • linux-stable 또는 Android common을 -LTS 스테이징 브랜치에 로컬로 병합
  • 병합 충돌 해결(필요에 따라 영역/코드 소유자에게 문의)
  • 로컬로 빌드하고 온전성/단위 테스트를 수행합니다(아래 테스트 섹션 참조).
  • Android 일반 변경사항을 LTS 스테이징 브랜치에 업로드 및 병합
  • -LTS 스테이징 브랜치를 사용하여 철저하게 테스트합니다(아래 테스트 섹션 참조).
  • 테스트 결과 검토
  • 회귀 문제를 해결하고 필요에 따라 병합을 이등분합니다.
  • -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 Common을 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 케이블을 사용하여 대상 장치를 컴퓨터에 연결하고 ADB(Android 디버그 브리지)를 사용하여 .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)

안드로이드 테스트

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

계속하기 전에 /dev/kmsg에서 오류가 있는지 확인하고 오류가 없는지 확인하세요. 다음 사항을 테스트하여 모든 것이 예상대로 작동하는지 확인하세요.

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

자동화된 테스트 제품군

제품 이미지가 회귀되지 않도록 하기 위한 최종 검증은 VTS( 공급업체 테스트 제품군 ) 및 자동화된 안정성 스트레스 테스트를 통해 제공되는 테스트 제품군을 사용하여 수행됩니다.