Boot Process

From AsteroidOS
Revision as of 19:45, 3 July 2023 by Mosen (talk | contribs)
This page describes the basis of the AsteroidOS’ boot process. It’s focused on the LG G Watch but it should be similar on most other Android watches.


= General description =

The first component loaded by the LG G Watch is the bootloader, this component is proprietary and can’t be modified, by default it is locked and only allows to boot Android, but we can access it by swiping the screen from top left to bottom right when booting up or with the <code>adb reboot bootloader</code> from a PC connected to a running Android or AsteroidOS instance with adb mode enabled.
This bootloader supports the <code>fastboot</code> protocol which is also the name of the command used on the computer to communicate with the bootloader. Fastboot allows to unlock the bootloader and then to flash partitions remotely and boot selected kernels. The bootloader can load three kernels, the one flashed on the <code>BOOT</code> partition, the one flashed on the <code>RECOVERY</code> partition and one sent via usb with the <code>fastboot boot boot.img</code> command. Kernels are stored in the boot.img format which is a concatenation of a kernel (sometimes with device tree) and an initramdisk. The boot.img format can be packed or unpacked with the mkbootimg and unmkbootimg tools. The AsteroidOS’s kernel is a slightly modified Android Kernel with, for example, a backported Bluetooth subsystem. The AsteroidOS’s ramdisk mostly load the init program of the rootfs which is systemd by default.
Systemd loads many components like

* Psplash which is a lightweight splashscreen software.
* Android’s init which loads the Android log daemon and servicemanager, both needed to run Asteroid-Launcher.
* DBus which is needed for inter-process communication.
* Adbd which is a daemon implementing the Android Debug Bridge protocol and which is used to get a remote shell and to push/pull files from a connected computer.
* MCE which handles the power consumption, inputs and screen…
* Patchram which loads a proprietary firmware to the broadcom bluetooth chip.
* Bluetoothd which is the BlueZ5 daemon handling bluetooth.
* Asteroid-Launcher which is the desktop and wayland compositior.

<br>
[[File:Boot-process.jpg|thumb|Boot process]]
<br>

= Troubleshooting the boot process =

The default initramfs has a section to enable adbd on the watch before booting into the rootfs. You can enable it by appending <code>debug-ramdisk</code> to the boot kernel’s parameters for example with <code>fastboot -c</code> or <code>fastboot --command</code> for some versions of fastboot. For example, if you have a <code>dory</code> watch and the watch's fastboot file in your current directory on your computer, you can do this with this command:<pre>fastboot --cmdline debug-ramdisk boot zImage-dtb-dory.fastboot

When you boot the watch, you will be able to access a command line on the ramdisk with adb shell.

Here is an example [initscript] and the [kernel configuration line] of bass.

Troubleshooting systemd

If you see the AsteroidOS logo (even for a split second), the watch is able to boot into the rootfs and launch systemd. Logs are normally stored in a tmpfs filesystem which is lost whenever the watch is rebooted. To disable the tmpfs mount, first mount the sdcard card containing the rootfs, and then the rootfs. Execute these commands as root on the watch:

. /machine.conf
mkdir /sdcard /rfs
mount /dev/$sdcard_partition /sdcard
mount -o loop /sdcard/media/0/asteroidos.ext4 /rfs

You can then disable the /var/volatile tmpfs mount and enable systemd journal logging (/var/log is a symlink to /var/volatile/log):

sed -i '/volatile/d' /rfs/etc/fstab
mkdir /rfs/var/log/journal

Once you reboot into the rootfs partition (it’ll fail again), you can hop back into the adb shell and read the journal:

chroot /rfs /bin/journalctl