조용히 다시 시작

Android 11은 조용히 다시 시작 기능을 지원합니다. 조용히 다시 시작 기능은 재부팅이 필요한 업데이트(예: APEX 패키지 업데이트)를 적용하는 데 사용되는 사용자 공간에서 프로세스가 런타임 재시작하는 것을 말합니다. 현재 조용히 다시 시작은 userdata가 마운트된 이후에 시작된 프로세스로 제한됩니다.

조용히 다시 시작은 다음과 같은 방법으로 요청됩니다.

  • PowerManager에서 PowerManager.reboot(PowerManager.REBOOT_USERSPACE) 호출

  • 셸에서 adb shell svc power reboot userspace 또는 adb reboot userspace 사용

조용히 다시 시작이 시작되면 사용자 인증 정보가 암호화된 저장소는 잠금 해제 상태로 유지됩니다.

기기가 조용히 다시 시작을 지원하는 경우 PowerManager.isRebootingUserspace() API 메서드는 true를 반환하고 시스템 속성 init.userspace_reboot.is_supported의 값은 1입니다.

기기가 조용히 다시 시작을 지원하지 않는 경우 PowerManager.reboot(PowerManager.REBOOT_USERSPACE), adb reboot userspace, adb shell svc power reboot userspace 호출이 실패합니다.

조용히 다시 시작 실행

PowerManager 또는 셸을 통해 조용히 다시 시작이 요청되면 init는 다음 단계를 실행합니다.

  1. sys.powerctl=reboot,userspace를 수신합니다.

  2. 별도의 UserspaceRebootWatchdogThread() 프로세스를 포크하여 조용히 다시 시작을 모니터링합니다.

  3. 조용히 다시 시작에 영향을 미칠 수 있는 모든 시스템 속성을 재설정하는 userspace-reboot-requested 작업을 트리거합니다. 영향을 받는 속성:

    • sys.usb.config
    • sys.usb.state
    • sys.boot_completed
    • dev.bootcomplete
    • sys.init.updatable_crashing
    • sys.init.updatable_crashing_process_name
    • apexd.status
    • sys.user.0.ce_available
    • sys.shutdown.requested
    • service.bootanim.exit

    부팅 시퀀스 중에 위의 속성을 다시 설정해야 합니다. 필요한 경우 추가 속성을 재설정할 수 있습니다. 예는 rootdir/init.rc에서 on userspace-reboot-requested 작업을 참고하세요.

  4. 다음 작업을 실행하는 DoUserspaceReboot 함수를 실행합니다.

    1. userdata가 마운트된 후 시작된 프로세스로 SIGTERM을 전송하고 프로세스가 중지될 때까지 기다립니다.
    2. 제한 시간에 도달하면 SIGKILL을 전송하여 실행 중인 프로세스를 종료합니다.
    3. /system/bin/vdc volume reset을 호출합니다.
    4. zRAM 지원 기기를 마운트 해제합니다.
    5. 활성 APEX 패키지를 마운트 해제합니다.
    6. 부트스트랩 마운트 네임스페이스로 다시 전환됩니다.
    7. userspace-reboot-resume 작업을 트리거합니다.

조용히 다시 시작 전에 파일 시스템 체크포인트가 요청되었다면 userspace-reboot-fs-remount 작업 중에 userdata가 체크포인트 모드로 다시 마운트됩니다(세부정보는 다음 섹션 참고). sys.boot_completed property1로 설정되면 조용히 다시 시작이 고려됩니다. 조용히 다시 시작이 끝나면 디스플레이는 꺼진 상태로 유지되고 명시적인 사용자 상호작용이 있어야 디스플레이의 절전 모드를 해제할 수 있습니다.

파일 시스템 체크포인트

조용히 다시 시작 전에 파일 시스템 체크포인트가 요청되었다면 조용히 다시 시작 중에 userdata가 체크포인트 모드로 다시 마운트됩니다. 재마운트 로직은 fs_mgr_remount_userdata_into_checkpointing 함수에 구현되며 체크포인트 메서드마다 다릅니다. 특히 userdata가 다음을 지원하는 경우:

  • 파일 시스템 수준 체크포인트(예: f2fs) - userdatacheckpoint=disable 옵션으로 다시 마운트됩니다.

  • 블록 수준 체크포인트(예: ext4) - /data가 마운트 해제되고 이 항목이 마운트된 모든 상위 기기의 매퍼 기기가 삭제됩니다. 그다음으로 userdata가 일반 체크포인트 부팅에 사용된 것과 동일한 코드 경로를 사용하여 마운트됩니다.

사용자 인증 정보가 암호화(CE)된 키와 기기가 암호화(DE)된 키를 파일 시스템 수준의 키링으로 관리하는 경우에는 userdata가 마운트 해제되면 키가 손실됩니다. 파일 시스템 키링에 키를 설치할 때 키 복원을 허용하기 위해 voldfscrypt-provisioning 유형의 동일한 키를 세션 수준 키링에도 설치합니다. init_user0가 호출되면 vold는 파일 시스템 키링에 키를 재설치합니다.

하드 재부팅으로 대체

조용히 다시 시작으로 인해 기기가 사용 불가한 상태가 되지 않도록 Android 11에서는 다음 조건 중 하나에 해당할 때 하드 재부팅으로 대체됩니다.

  • 지정된 제한 시간 내에 기기가 조용히 다시 시작을 시작하지 못합니다(즉, sys.init.userspace_reboot.in_progress=1).
  • 지정된 제한 시간 내에 프로세스가 중지되지 못합니다.
  • /system/bin/vdc volume reset 작업이 실패합니다.
  • zRAM 기기의 마운트 해제가 실패합니다.
  • 활성 APEX 패키지가 올바르지 않게 마운트 해제됩니다.
  • userdata를 체크포인트 모드로 다시 마운트하려는 시도가 실패합니다.
  • 지정된 제한 시간 내에 기기가 부팅되지 못합니다(즉, sys.boot_completed=1).

기기별 구성

다음 속성 값을 변경하여 조용히 다시 시작의 일부 속성을 조정할 수 있습니다.

  • init.userspace_reboot.is_supported는 기기가 조용히 다시 시작을 실행할 수 있는 시점을 제어합니다. 이 속성 값이 false 또는 0이거나 지정되지 않은 경우 다시 시작 시도가 거부됩니다.
  • init.userspace_reboot.sigkill.timeoutmillisSIGKILL 신호를 수신한 프로세스가 중지하기 위한 제한 시간(단위: 밀리초)을 제어합니다. 프로세스 중 하나가 지정된 제한 시간 내에 중지되지 않으면 하드 재부팅으로 대체됩니다.
  • init.userspace_reboot.sigterm.timeoutmillisSIGTERM 신호를 수신한 프로세스가 종료하기 위한 제한 시간(단위: 밀리초)을 제어합니다. 지정된 제한 시간 내에 종료되지 않은 모든 프로세스는 SIGKILL 신호를 수신합니다.
  • init.userspace_reboot.started.timeoutmillis는 조용히 다시 시작을 시작하기 위한 제한 시간(단위: 밀리초)을 제어합니다(즉, sys.init.userspace_reboot.in_progress=1). 기기가 지정된 제한 시간 내에 조용히 다시 시작을 시작하지 못하면 하드 재부팅으로 대체됩니다.
  • init.userspace_reboot.userdata_remount.timeoutmillisuserdata 마운트 해제를 위한 제한 시간(단위: 밀리초)을 제어합니다. 기기가 지정된 제한 시간 내에 userdata를 마운트 해제하지 못하면 하드 재부팅으로 대체됩니다.
  • init.userspace_reboot.watchdog.timeoutmillis는 기기가 성공적으로 부팅하기 위한 제한 시간을 제어합니다(즉, sys.boot_completed=1). 기기가 지정된 제한 시간 내에 부팅하지 못하면 하드 재부팅으로 대체됩니다.

조용히 다시 시작 중 애니메이션 맞춤설정

조용히 다시 시작의 참조 구현에는 조용히 다시 시작 중에 표시되는 애니메이션을 맞춤설정할 수 있는 기능이 들어 있습니다.

userspace-reboot-fs-remount 작업이 끝나면 initbootanim 서비스를 시작합니다. 이 서비스는 다음 애니메이션 파일이 있는지 나열된 순서대로 찾고 찾은 첫 번째 파일을 재생합니다.

  • /product/media/userspace-reboot.zip
  • /oem/media/userspace-reboot.zip
  • /system/media/userspace-reboot.zip

조용히 다시 시작을 위한 특정 애니메이션 파일이 지정되지 않으면 bootanim에서 기본 android 애니메이션을 표시합니다.

테스트

Android 11에는 조용히 다시 시작의 참조 구현이 포함되어 있습니다. 또한 UserspaceRebootHostTest에서 CTS 테스트를 사용하여 조용히 다시 시작을 확인할 수 있습니다.