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.