Mengatasi Masalah Boot A/B pada eMMC

Mengatasi Masalah Boot A/B pada eMMC

Ketika mencoba boot dari eMMC, saya mendapatkan error berikut:

fsl_avb_ab_flow.c:1182: ERROR: No bootable slots found.

Saya dapat boot ke u-boot dari eMMC dan menggunakan perintah fastboot usb 0 untuk memasukkan perangkat dalam mode fastboot. Namun, mengirimkan file boot.img dari host PC melalui perintah fastboot flash boot juga gagal dengan error yang serupa:

error: Failed to identify current slot.

Saya melakukan difine antara hasil dari perintah fastboot getvar all pada eMMC dan kartu SD, dan saya menemukan perbedaan sebagai berikut:

  • (bootloader) erase-block-size memiliki nilai 0x80000 pada eMMC, sedangkan pada kartu SD nilainya adalah 0x200.
  • (bootloader) partition-size:all memiliki nilai 0xece000000 pada eMMC, sedangkan pada kartu SD nilainya adalah 0x3b5980000.
  • (bootloader) current-slot menunjukkan bahwa tidak ada slot yang dapat dibootkan pada eMMC, sedangkan pada kartu SD nilainya adalah "a".
  • (bootloader) slot-successful: a menunjukkan bahwa tidak ada slot yang dapat dibootkan pada eMMC, sedangkan pada kartu SD nilainya adalah "yes".

Jadi, tampaknya terdapat masalah dengan A/B slots pada eMMC.

Mengatasi Masalah

Saya telah mencoba perintah fastboot --set-active=a, namun tidak memiliki efek apa pun.
Masih ada beberapa pertanyaan yang harus dijawab:

  • Dimana informasi A/B ini disimpan?
  • Bagaimana membuat slot yang dapat dibootkan?

Setelah melakukan penelitian, saya menemukan bahwa informasi A/B disimpan dalam file bootctl pada sistem operasi Android.
Untuk membuat slot yang dapat dibootkan, kita perlu menggunakan perintah mark-boot-successful pada u-boot.

Contoh Penerapan

Pada sebuah Google Pixel (arm64, A/B), saya telah mencoba mengatasi masalah dengan memasukkan kode berikut ke dalam file init.treble-environ.rc:

on property:sys.boot_completed=1
 exec u:r:phhsu_daemon:s0 root -- /system/bin/bootctl mark-boot-successful

Kode tersebut berhasil membuat slot sebagai bootable. Sebelum pertama kali boot, saya menjalankan perintah fastboot getvar all dan mendapatkan hasil sebagai berikut:

(…)
(bootloader) slot-count:2
(bootloader) current-slot:a
(bootloader) slot-retry-count:b:0
(bootloader) slot-unbootable:b:no
(bootloader) slot-successful:b:no
(bootloader) slot-retry-count:a:3
(bootloader) slot-unbootable:a:no
(bootloader) slot-successful:a:no

Setelah pertama kali boot, saya menjalankan perintah fastboot getvar all lagi dan mendapatkan hasil sebagai berikut:

(…)
(bootloader) slot-count:2
(bootloader) current-slot:a
(bootloader) slot-retry-count:b:0
(bootloader) slot-unbootable:b:no
(bootloader) slot-successful:b:no
(bootloader) slot-retry-count:a:2
(bootloader) slot-unbootable:a:no
(bootloader) slot-successful:a:yes

Dengan demikian, masalah boot A/B pada eMMC dapat diatasi.

Leave a comment