How to install TWRP via script
The recovery image TWRP is very useful for the maintenance of the Android OS. You can either boot the phone from the TWRP image without installing it using these commands:
Bash:
adb reboot bootloader
sudo fastboot boot ./twrp-3.7.0_12-0-I006D.img
or install the TWRP image into the boot partition and use the command
Bash:
adb reboot recovery
or
Bash:
sudo fastboot boot recovery
to boot into TWRP. Depending on the OS used there is also an option in the reboot dialog in the GUI to reboot into the recovery.
While the phone is booted from TWRP you can open a shell as user root via adb.
The only official method to install TWRP into the boot partition of the phone is via the TWRP GUI, e.g.:
boot the phone from the TWRP image (see above)
install TWRP into the boot partition using the menu entry "Advanced" and then "Flash Current TWRP". TWRP will then install itself into both boot partitions.
There is no method to install TWRP without user interaction via a script (at least I did not found any ...). Therefor I wrote a shell script to install TWRP without user input:
install_twrp_from_within_twrp.sh
The script install_twrp_from_within_twrp.sh can be used to install TWRP either into a boot partition or into an image file for the boot partition. The script must be executed in a shell on the phone while the phone is booted from the TWRP image that should be installed.
The usage of the script is:
Code:
ASUS_I006D:/data/local/tmp $ ./install_twrp_from_within_twrp.sh -h
install_twrp_from_within_twrp.sh - script to install TWRP into a boot partition or into a file
Usage:
install_twrp_from_within_twrp.sh [-f] [boot_image_file] [new_boot_image_file]
boot_image can be either an image file from the boot partition or a boot partition block device
(e.g. /dev/block/by-name/boot_a)
new_boot_partition_file must be the absolute name of a file.
Both parameter are optional
If the script is called without a parameter TWRP will be installed in the current boot partition.
If boot_image_file is a block device and new_boot_image_file is missing TWRP will be installed in the block device.
If the parameter new_boot_image_file is used the script will only write a boot partition image with TWRP into that file.
Use the parameter -f to ignore missing or invalid checksums.
This script must run in a shell in TWRP
Environment variables used by the script if set:
BIN_DIR (Current value: "/system/bin")
TMPDIR (Current value: "/data/local/tmp")
|ASUS_I006D:/data/local/tmp $
The commands used in the script install_twrp_from_within_twrp.sh to install TWRP are copied from the TWRP source file with the code to install TWRP:
https://github.com/TeamWin/android_bootable_recovery/blob/android-12.1/twrpRepacker.cpp
Note that TWRP contains a copy of the binary magiskboot to unpack and repack the boot partition. Therefor the installation should work on all phones that are supported by Magisk.
Be aware that the installation of TWRP will wipe out the installation of Magisk (or any other tool for enabling root access). So for installing TWRP and Magisk they must be installed in this order:
install TWRP
install Magisk (or a similar tool)
Example usage:
Code:
ASUS_I006D:/ # /cache/install_twrp_from_within_twrp.sh /dev/block/by-name/boot_b
Installing TWRP into a boot image or boot partition via script
Checking the running OS ...
OK, running a shell in TWRP: "twrp_I006D" version "3.7.0_12-0"
Checking the prerequisites for installing TWRP ...
Using the partition "/dev/block/by-name/boot_b" as source for the installation of TWRP
Creating the new boot image with TWRP in the file "/data/local/tmp/img.568/new-boot.img"
Checking if the required executables exist ...
OK, the file "/system/bin/magiskboot" exists and is executable
OK, the file "/system/bin/cpio" exists and is executable
OK, the file "/system/bin/sha256sum" exists and is executable
OK, the file "/system/bin/getprop" exists and is executable
OK, the file "/system/bin/dd" exists and is executable
Checking if the requried data files exist ...
OK, the file "/ramdisk-files.sha256sum" exists
OK, the file "/ramdisk-files.txt" exists
OK, the file "/dev/block/by-name/boot_b" exists
Checking the check sums of the files for the new ramdisk ...
OK, the check sums of the files for the new ramdisk are okay
Directory "/data/local/tmp" successfully created
Directory "/data/local/tmp/img.568" successfully created
Directory "/data/local/tmp/img_files.568" successfully created
The temporary directory to unpack the boot image is "/data/local/tmp/img_files.568"
Unpacking the boot image from "/dev/block/by-name/boot_b" ...
Parsing boot image: [/dev/block/by-name/boot_b]
HEADER_VER [3]
KERNEL_SZ [42027520]
RAMDISK_SZ [34080747]
OS_VERSION [12.0.0]
OS_PATCH_LEVEL [2022-05]
PAGESIZE [4096]
CMDLINE []
KERNEL_FMT [raw]
RAMDISK_FMT [gzip]
VBMETA
OK, "/dev/block/by-name/boot_b" successfully unpacked to "/data/local/tmp/img_files.568" :
Creating a backup of the original ramdisk ...
total 74412
-rw-rw-rw- 1 root root 50 2022-10-24 19:35 header
-rw-r--r-- 1 root root 42027520 2022-10-24 19:35 kernel
-rw-r--r-- 1 root root 34080747 2022-10-24 19:35 ramdisk.cpio.org
Creating the new ramdisk with TWRP ...
New ramdisk with TWRP "/data/local/tmp/img_files.568/ramdisk.cpio" successfully created.
-rw-rw-rw- 1 root root 85852380 2022-10-24 19:35 /data/local/tmp/img_files.568/ramdisk.cpio
-rw-r--r-- 1 root root 34080747 2022-10-24 19:35 /data/local/tmp/img_files.568/ramdisk.cpio.org
Repacking the boot image into the file "/data/local/tmp/img.568/new-boot.img" ...
+ cd /data/local/tmp/img_files.568
+ /system/bin/magiskboot repack /dev/block/by-name/boot_b /data/local/tmp/img.568/new-boot.img
Parsing boot image: [/dev/block/by-name/boot_b]
HEADER_VER [3]
KERNEL_SZ [42027520]
RAMDISK_SZ [34080747]
OS_VERSION [12.0.0]
OS_PATCH_LEVEL [2022-05]
PAGESIZE [4096]
CMDLINE []
KERNEL_FMT [raw]
RAMDISK_FMT [gzip]
VBMETA
Repack to boot image: [/data/local/tmp/img.568/new-boot.img]
HEADER_VER [3]
KERNEL_SZ [42027520]
RAMDISK_SZ [34080769]
OS_VERSION [12.0.0]
OS_PATCH_LEVEL [2022-05]
PAGESIZE [4096]
CMDLINE []
+ TEMPRC=0
+ set +x
OK, the new boot image "/data/local/tmp/img.568/new-boot.img" successfully created
-rw-r--r-- 1 root root 100663296 2022-10-24 19:35 /data/local/tmp/img.568/new-boot.img
Now rewriting "/dev/block/by-name/boot_b" using "/data/local/tmp/img.568/new-boot.img" ...
196608+0 records in
196608+0 records out
100663296 bytes (96 M) copied, 4.498630 s, 21 M/s
TWRP successfully installed in "/dev/block/by-name/boot_b"
ASUS_I006D:/ #
To install TWRP using the script without user input these steps are neccessary:
reboot the phone into the bootloader
boot the phone from the TWRP image that should be installed on the phone
copy the script install_twrp_from_within_twrp.sh to the phone
execute the script install_twrp_from_within_twrp.sh on the phone in an adb shell
To automate these steps I wrote a wrapper script :
install_twrp.sh
The wrapper script install_twrp.sh must be executed on a machine running Linux with the phone attached via USB.
The wrapper script will check the current status of the phone, boot the phone from the TWRP image, copy the script install_twrp_from_within_twrp.sh to the phone and execute it on the phone to install TWRP into either the active or the inactive boot partition.
The script install_twrp_from_within_twrp.sh must be in the same directory as install_twrp.sh (if not set the variable TWRP_INSTALL_SCRIPT before executing the script -- see the script usage below).
The usage for the script install_twrp.sh is:
Code:
[[email protected] /data/develop/android/scripts_on_linux]$ ./install_twrp.sh -h
./install_twrp.sh version - 1.0.0.0 - install TWRP to the boot partition of a phone running Android using TWRP
Usage
install_twrp_via_twrp.sh [boot_slot] [wait=n] [dd|fastboot] [twrp_image]
All parameter are optional
The parameter "boot_slot" can be a, b, active, inactive, next, current; default is the current boot slot of the phone
Use the parameter "dd" to request repatching via dd in an adb session ; use the parameter "fastboot" to request repatching via "fastboot"
Default is to use "dd" to flash the patched boot image
The value for the parameter "wait" is the number of seconds to wait before starting the script "install_twrp_from_within_twrp.sh" on the phone
This seems to be necessary to avoid errors while repacking the boot image. The default wait time is 10 seconds.
The parameter "twrp_image" can be used to define another TWRP image to use. The parameter is optional - the
default for "twrp_image" is hardcoded in the script (variable TWRP_IMAGE)
The default TWRP image of the script is the TWRP for the ASUS Zenfone 8.
The phone to patch must be attached via USB.
The phone can be either in fastboot mode, in normal mode with enabled adb support, or already booted from the TWRP image
The script uses the script "install_twrp_from_within_twrp.sh" to install TWRP. The script install_twrp_from_within_twrp.sh must
be in the same directory as this script. The script will be copied to the phone and then executed on the phone.
Set the variable TWRP_INSTALL_SCRIPT to the name of the script to use before starting this script if another script should be used .
To change some of the values used by the script you can set environment variables before starting the script:
Set the environment variable REBOOT to "yes" before starting the script to automatically reboot the phone after patching the new image
Set the environment variable REBOOT to "no" before starting the script to disable the automatic reboot after patching the new image.
Set the environment variable SERIAL_NUMBER to the serial number of the phone to patch if there is more then one phone connected via USB
Set the environment variable ADB_OPTIONS to the options to be used with the adb command
Set the environment variable FASTBOOT_OPTIONS to the options to be used with the fastboot command
Set the environment variable TMP_DIR_ON_THE_PHONE to the temporary directory to use on the phone
The default TWRP image to use is "/data/backup/ASUS_ZENFONE8/twrp/twrp-3.7.0_12-0-I006D.img"
The default script executed on the phone to install TWRP is "./install_twrp_from_within_twrp.sh"
[[email protected] /data/develop/android/scripts_on_linux]$
Without any parameter the script install_twrp.sh will install TWRP into the active boot partition.
Example:
Code:
[[email protected] /data/develop/android/scripts_on_linux]$ ./install_twrp.sh
./install_twrp.sh version - 1.0.0.0 - install TWRP to the boot partition of a phone running Android using TWRP
Using the TWRP image hardcoded in the script: "/data/backup/ASUS_ZENFONE8/twrp/twrp-3.7.0_12-0-I006D.img"
Checking the script prerequisites ...
Will wait 10 second(s) before starting the script on the phone
The script is running as user "xtrnaw7" -- will use "sudo" for the fastboot commands ...
Will patch the boot partition on the attached phone with the serial number "M6AIB760D0939LX"
Using the options "-d -s M6AIB760D0939LX " for the adb commands
Using the options " -s M6AIB760D0939LX " for the fastboot commands
Checking for a connected phone booted into fastboot mode ...
No attached phone in fastboot mode found
Checking for an attached phone with working access via adb (USB) ...
Linux localhost 5.4.147-Omni-qgki-perf-gea6f815f5af9-dirty #46 SMP PREEMPT Sat Oct 15 08:38:07 CEST 2022 aarch64
... found a phone connected via USB with working adb access
The phone is booted in normal mode
Booting the phone into the fastboot mode now ...
Waiting up to 60 seconds for the boot into the fastboot mode ...
Booting the phone from the TWRP image "/data/backup/ASUS_ZENFONE8/twrp/twrp-3.7.0_12-0-I006D.img" now ...
Sending 'boot.img' (98304 KB) OKAY [ 2.500s]
Booting OKAY [ 10.440s]
Finished. Total time: 12.983s
Waiting up to 60 seconds for the boot of the phone ....
Retrieving the current boot slot from the phone ...
The current boot slot is "_a"
The boot slot to patch is "_a"
The boot partition to patch is "boot_a"
Checking if the directory "/data/local/tmp" exists on the phone ....
/data/local/tmp
Copying the script "./install_twrp_from_within_twrp.sh" to the phone ...
./install_twrp_from_within_twrp.sh: 1 file pushed, 0 skipped. 216.6 MB/s (13141 bytes in 0.000s)
Creating the boot image file "/data/local/tmp/boot_a.327964.img" from the partition "/dev/block/by-name/boot_a" ...
196608+0 records in
196608+0 records out
100663296 bytes (96 M) copied, 0.311720 s, 308 M/s
Checking the result ...
-rw-rw-rw- 1 root root 100663296 2022-10-24 18:02 /data/local/tmp/boot_a.327964.img
The check sums are:
The check sum of the boot partition "/dev/block/by-name/boot_a" on the phohe is "728455636"
The check sum of the boot image file on the phone is "/data/local/tmp/boot_a.327964.img" is "728455636"
Installing TWRP using the boot image file "/data/local/tmp/boot_a.327964.img" ...
----------------------------------------------------------------------
[2022.10.24 20:02:43] Waiting now 10 seconds ...
+ adb -d -s M6AIB760D0939LX shell /data/local/tmp/install_twrp_from_within_twrp.sh /data/local/tmp/boot_a.327964.img /data/local/tmp/boot_a_witn_twrp.327964.img
Installing TWRP into a boot image or boot partition via script
Checking the running OS ...
OK, running a shell in TWRP: "twrp_I006D" version "3.7.0_12-0"
Checking the prerequisites for installing TWRP ...
Using the file "/data/local/tmp/boot_a.327964.img" as source for the installation of TWRP
Creating the boot image with TWRP in the file "/data/local/tmp/boot_a_witn_twrp.327964.img"
Checking if the required executables exist ...
OK, the file "/system/bin/magiskboot" exists and is executable
OK, the file "/system/bin/cpio" exists and is executable
OK, the file "/system/bin/sha256sum" exists and is executable
OK, the file "/system/bin/getprop" exists and is executable
Checking if the requried data files exist ...
OK, the file "/ramdisk-files.sha256sum" exists
OK, the file "/ramdisk-files.txt" exists
OK, the file "/data/local/tmp/boot_a.327964.img" exists
Checking the check sums of the files for the new ramdisk ...
OK, the check sums of the files for the new ramdisk are okay
Directory "/data/local/tmp" successfully created
Directory "/data/local/tmp/img.583" successfully created
Directory "/data/local/tmp/img_files.583" successfully created
The temporary directory to unpack the boot image is "/data/local/tmp/img_files.583"
Unpacking the boot image from "/data/local/tmp/boot_a.327964.img" ...
Parsing boot image: [/data/local/tmp/boot_a.327964.img]
HEADER_VER [3]
KERNEL_SZ [42025472]
RAMDISK_SZ [34080743]
OS_VERSION [12.0.0]
OS_PATCH_LEVEL [2022-05]
PAGESIZE [4096]
CMDLINE []
KERNEL_FMT [raw]
RAMDISK_FMT [gzip]
VBMETA
OK, "/data/local/tmp/boot_a.327964.img" successfully unpacked to "/data/local/tmp/img_files.583" :
Creating a backup of the original ramdisk ...
total 74412
-rw-rw-rw- 1 root root 50 2022-10-24 18:02 header
-rw-r--r-- 1 root root 42025472 2022-10-24 18:02 kernel
-rw-r--r-- 1 root root 34080743 2022-10-24 18:02 ramdisk.cpio.org
Creating the new ramdisk with TWRP ...
New ramdisk with TWRP "/data/local/tmp/img_files.583/ramdisk.cpio" successfully created.
-rw-rw-rw- 1 root root 85852380 2022-10-24 18:02 /data/local/tmp/img_files.583/ramdisk.cpio
-rw-r--r-- 1 root root 34080743 2022-10-24 18:02 /data/local/tmp/img_files.583/ramdisk.cpio.org
Repacking the boot image into the file "/data/local/tmp/boot_a_witn_twrp.327964.img" ...
+ cd /data/local/tmp/img_files.583
+ /system/bin/magiskboot repack /data/local/tmp/boot_a.327964.img /data/local/tmp/boot_a_witn_twrp.327964.img
Parsing boot image: [/data/local/tmp/boot_a.327964.img]
HEADER_VER [3]
KERNEL_SZ [42025472]
RAMDISK_SZ [34080743]
OS_VERSION [12.0.0]
OS_PATCH_LEVEL [2022-05]
PAGESIZE [4096]
CMDLINE []
KERNEL_FMT [raw]
RAMDISK_FMT [gzip]
VBMETA
Repack to boot image: [/data/local/tmp/boot_a_witn_twrp.327964.img]
HEADER_VER [3]
KERNEL_SZ [42025472]
RAMDISK_SZ [34080758]
OS_VERSION [12.0.0]
OS_PATCH_LEVEL [2022-05]
PAGESIZE [4096]
CMDLINE []
+ TEMPRC=0
+ set +x
OK, the new boot image "/data/local/tmp/boot_a_witn_twrp.327964.img" successfully created
-rw-r--r-- 1 root root 100663296 2022-10-24 18:03 /data/local/tmp/boot_a_witn_twrp.327964.img
Note: Flashing the new image to the boot partition was not requested
+ set +x
----------------------------------------------------------------------
Checking the result ...
The patched boot image is "/data/local/tmp/boot_a_witn_twrp.327964.img"
-rw-r--r-- 1 root root 100663296 2022-10-24 18:03 /data/local/tmp/boot_a_witn_twrp.327964.img
[2022.10.24 20:03:05] Waiting now 5 seconds ...
Patching the partition "/dev/block/by-name/boot_a" from the patched boot image file "/data/local/tmp/boot_a_witn_twrp.327964.img" via dd ...
196608+0 records in
196608+0 records out
100663296 bytes (96 M) copied, 4.865411 s, 20 M/s
Checking the result ....
The check sums for the images and devices on the phone are:
Checksum Size File/Device name
-------------------------------------
728455636 100663296 /data/local/tmp/boot_a.327964.img
2360878166 100663296 /data/local/tmp/boot_a_witn_twrp.327964.img
2360878166 100663296 /dev/block/by-name/boot_a
OK, patching the boot partition "/dev/block/by-name/boot_a" was successfull
*** Press return to reboot the phone now
Rebooting the phone now ...
[[email protected] /data/develop/android/scripts_on_linux]$
Advanced Usage
To install TWRP and Magisk via script these commands can be used (for example after an OS upgrade) :
Bash:
# install the Magisk App (if not already done ...)
#
cat Magisk-25.1_25100.apk | adb shell pm install -S "$( ls -l Magisk-25.1_25100.apk | awk '{ print $5}' )"
# install TWRP and Magisk into the boot partition
#
REBOOT=no ./install_twrp.sh ; REBOOT=yes ./install_magisk_via_twrp.sh
To install a new OS image including TWRP and Magisk these commands can be used:
Bash:
# boot the phone into the boot loader
#
adb reboot bootloader
# boot the phone from the TWRP image
#
sudo fastboot boot /data/backup/ASUS_ZENFONE8/twrp/twrp-3.7.0_12-0-I006D.img
# copy the OS image to install to the phone
#
adb push /data/develop/android/OmniROM/out/target/product/zenfone8/omni-12-20221015-zenfone8-MICROG.zip /sdcard/Download/
# install the OS image
#
adb shell twrp install /sdcard/Download/omni-12-20221015-zenfone8-MICROG.zip
# reboot into the new OS
#
adb shell twrp reboot
# install the Magisk app
#
cat Magisk-v25.2.apk | adb shell pm install -S "$( ls -l Magisk-v25.2.apk | awk '{ print $5}' )"
# install TWRP and Magisk
#
REBOOT=no ./install_twrp.sh ; REBOOT=yes ./install_magisk_via_twrp.sh
The documentation for the script install_magisk_via_twrp.sh can be found here:
How to install Magisk into the boot partition using a script.
Details
The script install_twrp_from_within_twrp.sh was tested on an ASUS Zenfone 8 with
OmniROM 12 (Android 12) and TWRP 3.7.0.12
OmniROM 12 (Android 12) and TWRP 3.6.1.12
Original Android 12 from ASUS and TWRP 3.7.0.12
OmniROM 13 (Android 13) and TWRP 3.7.0.12 (see note below)
Important Update 04.12.2022 /bs
In TWRP installed in the boot partition of an ASUS Zenfone 8 running early versions of OmniROM 13 the touch screen does not work. You can only use TWRP in an adb session in this configuration.
This bug was fixed in OmniROM 13 from 04.12.2022.
To get around this bug boot the phone from the image file with TWRP, e.g.:
Bash:
sudo fastboot boot twrp-3.7.0_12-0-I006D.img
or, better, update OmniROM 13 to the image from 04.12.2022 or later.
The script install_twrp_from_within_twrp.sh does not create a backup of the boot partition before rewriting it.
The script install_twrp_from_within_twrp.sh creates temporary files in the directory ${TMPDIR} on the phone; the default value for this variable in the script is
Bash:
TMPDIR="${TMPDIR:=/cache/install_twrp.$$}"
The default value for the variable in the tested TWRP versions is /data/local/tmp so without changes the temporary files will be created in that directory.
The script does not delete the temporary files so a manual cleanup of the directory might be necessary .
Trouble Shooting
For unknown reasons repacking the boot image fails sometimes and the script ends with an error message like this:
Code:
ERROR: The size of the new boot image file is 56713216 but the size of the original image file is 100663296 -- that does not match (RC=33)
To avoid this error increase the wait time using the script parameter "wait=n" (the default wait time is 10 seconds).
If increasing the wait time does not help just restart the wrapper script install_twrp.sh again while the phone is still booted from the TWRP image. So a workaround for this problem is :
Bash:
install_twrp.sh ; [ $? = 33 ] && install_twrp.sh
The following error message appears when executing the script install_twrp_from_within_twrp.sh after booting the already installed TWRP:
Code:
ERROR: Error checking the check sums of the files for the new ramdisk
./system/etc/fstab.postinstall: FAILED
Installing TWRP via script only works if the phone is booted from the TWRP image.
To ignore this error the parameter -f can be used - but this is NOT recommended.
Notes:
see here on How to install Magisk into the boot partition via script
[added 29.10.2022/bs]
see here for How to add additional files to the TWRP image
Related
HI
Update 13.04.2023 /bs
To install Magisk v26.0 or newer the script version 25.01.2023 v2.5.1.0 is necessary.
Unfortunately there is a new feature in Magisk v26.x that prevents the full installation of Magisk from within a booted recovery; from the Magisk docs:
This means that any installation of Magisk v26+ using custom recovery will be incomplete; a subsequent re-installation through the Magisk app after booting up is required.
Click to expand...
Click to collapse
Therefor currently the installation of Magisk v26.x via script without user intervention does not yet work
I wrote a little shell script for Linux (bash) to add Magisk to the boot partition of a phone without user intervention called install_magisk_via_twrp.sh.
This is useful for example to re-install Magisk into the boot partition after an OS upgrade .
The script uses only the commands fastboot and adb, a recovery image (e.g. TWRP), and the patch script from Magisk to re-install Magisk into the boot partition.
Notes
Note that the script version 1.1.0.0 or newer also works if the phone is secured via PIN or something similar.
Since version 2.0.0.0 it is not necessary anymore to install Magisk via Magisk App into a boot image file before starting the script.
Since version 2.0.0.0 the script can install Magisk into the partition even if the Magisk app is not installed yet.
SInce version 2.1.0.0 the script will also copy the Magisk apk to the phone file if requested via parameter.
Version 2.5.1.0 of the script install_magisk_via_twrp.sh or newer of the script is necessary to install Magisk v26.1 or newer
The usage for the script is:
Code:
[ OmniRom 13 Dev - [email protected] /data/develop/android/scripts_on_linux ] $ ./install_magisk_via_twrp.sh -h
install_magisk_via_twrp.sh version - v2.3.0.0 - add Magisk to the boot partition of a phone running Android using TWRP
install_magisk_via_twrp.sh [-h|help|-H] [boot_slot] [wait=n] [dd|fastboot] [twrp_image] [cleanup] [delete_adb_dir] [adb_only] [use_apk] [copy_apk]
[ OmniRom 13 Dev - [email protected] /data/develop/android/scripts_on_linux ] $
Use the parameter -H to print the detailed usage:
Spoiler: Detailed usage
Code:
[ OmniRom 13 Dev - [email protected] /data/develop/android/scripts_on_linux ] $ ./install_magisk_via_twrp.sh -H
install_magisk_via_twrp.sh version - v2.3.0.0 - add Magisk to the boot partition of a phone running Android using TWRP
Usage
install_magisk_via_twrp.sh [-h|help|-H] [boot_slot] [wait=n] [dd|fastboot] [twrp_image] [cleanup] [delete_adb_dir] [adb_only] [use_apk] [copy_apk]
All parameter are optional. The parameter can be used in any order.
Use the parameter "help" or "-H" to print the detailed usage help; use the parameter "-h" to print only the short usage help
The parameter "boot_slot" can be a, b, active, inactive, next, current; default is the current boot slot of the phone
The value for the parameter "wait" is the number of seconds to wait before starting the script to install Magisk on the phone
This seems to be necessary to avoid errors while repacking the boot image. The default wait time is 10 seconds.
Use the parameter "dd" to request repatching via dd in an adb session ; use the parameter "fastboot" to request repatching via "fastboot"
Default is to use "dd" to flash the patched boot image.
The parameter "twrp_image" can be used to define another TWRP image to use. The parameter is optional - the
default for "twrp_image" is hardcoded in the script (variable TWRP_IMAGE)
The default TWRP image of the script is the TWRP for the ASUS Zenfone 8.
Use the parameter "cleanup" to delete the directory /data/MagiskInst at script end
If the parameter "delete_adb_dir" is used the script will delete all files and directories created in the directory /data after Magisk
was successfully installed into the boot partition
If the parameter "adb_only" is used the script will only install the directories and binaries for Magisk in the directory /data/adb.
The script will unpack the necesseray files for adding Magisk to the boot partition from the installed Magisk apk file to
the temporary directory /data/MagiskInst if the files in /data/adb/magisk are missing.
Use the parameter "use_apk" to force the script to use the files from the Magisk app even if the files in /data/adb/magisk exist.
If the parameter "copy_apk" is used the script will copy the Magisk apk file to the phone.
The script now can also install Magisk into a boot partition without an installed Magisk app. To use this feature copy the Magisk apk file
(Magisk*apk) to the directory /data or /sdcard/Download on the phone before starting the script or use the parameter "copy_apk".
The phone to patch must be attached via USB.
The phone can be either in fastboot mode, in normal mode with enabled adb support, or already booted from the TWRP image
To change some of the values used by the script you can set environment variables before starting the script:
Set the environment variable REBOOT to "yes" before starting the script to automatically reboot the phone after patching the new image
Set the environment variable REBOOT to "no" before starting the script to disable the automatic reboot after patching the new image.
Set the environment variable SERIAL_NUMBER to the serial number of the phone to patch if there is more then one phone connected via USB
Set the environment variable ADB_OPTIONS to the options to be used with the adb command
Set the environment variable FASTBOOT_OPTIONS to the options to be used with the fastboot command
Set the environment variable DOWNLOAD_DIR_ON_PHONE to the data directory to use on the phone (def.: /sdcard/Download)
Set the envionment variable MAGISK_APK_FILE to the Magisk apk file to use
The default TWRP image to use is "/data/backup/ASUS_ZENFONE8/twrp/current_twrp.img"
[ OmniRom 13 Dev - [email protected] /data/develop/android/scripts_on_linux ] $
In the default the script will ask the user for input before rebooting the phone from the patched boot partition.
To disable this request call the script like this
Code:
REBOOT=yes install_magisk_via_twrp.sh
Additional infos
Prerequisites
the Magisk App; either installed or as apk file
a computer running Linux with working adb and fastboot binaries available via PATH variable
a phone with unlocked boot loader
a working recovery image (e.g. TWRP) for the attached phone that automatically mounts /data and has enabled adb support (For the ASUS Zenfone 8 the official TWRP image from https://twrp.me/asus/zenfone8.html version 3.7.0 or newer can be used)
Test Environment
Tested on an ASUS Zenfone 8 and with
OmniROM 12 (Android 12) and Magisk v24.3
OmniROM 12 (Android 12) and Magisk v25.0
OmniROM 12 (Android 12) and Magisk v25.2
OmniROM 13 (Android 13) and Magisk v25.2
AospExtended 9.0 w/o GAPPS (Android 12) and Magisk v24.3
AospExtended 9.0 w/o GAPPS (Android 12) and Magisk v25.0
ASUS Original Android 11 and Magisk v24.3
ASUS Original Android 12 and Magisk v24.3
ASUS Original Android 13 Beta 1 and Magisk v25.0
Details
The script uses the scripts and binaries from the directory /data/adb/magisk. If these executables do not exist the script searches for the installed Magisk apk file /data/app/*/com.topjohnwu.magisk*/base.apk and extracts the scripts and binaries from that file. If the Magisk apk is not installed the script searches for the Magisk APK file Magisk*.apk in the directories /sdcard/Download and /data and extracts the scripts and executables from that file if found.
If the parameter copy_apk is used the script copies the Magisk apk file to the directory /sdcard/Download on the phone or, if that directory does not exist, to the directory /data on the phone
The patched boot images will be created in the directory /sdcard/Downloads on the phone (variable DOWNLOAD_DIR_ON_PHONE)
The script uses the original script called boot_patch.sh from Magisk to patch the boot image.
You can execute the script as often as you like.
The script will not delete the created files in the directory /sdcard/Download on the phone so you might do a cleanup of that directory manual
If the directory /sdcard/Download is not available the script will use the directory /tmp for temporary files (Note: /tmp is mounted on a ramdisk)
If the check sum of the boot image before the patching is equal to the check sum after the successfull patching then Magisk was already installed in the boot partition
The script will boot the phone up to 4 times.
Trouble Shooting
- Error message like this
Code:
/data/adb/magisk/boot_patch.sh[211]: can't create /proc/self/fd/: Is a directory
can be ignored (these are only error messages from the function to print some additional messages)
Note: Since version 2.0.0.0 these error messages should not occur anymore.
- Patching the boot partition via "dd" fails sometimes for unknown reason so you should only use it if you know how to fix a damaged boot partition!
- Downloading the patched boot image via "adb pull" (neccessary for patching the boot partition using fastboot) sometimes fails for unknown reason:
So if you get an error message like this:
Code:
[ 77%] /sdcard/Download/patched_boot_a.391985.img
ERROR: Error downloading the file "/sdcard/Download/patched_boot_a.391985.img" from the phone!
just restart the script again (or download the file and flash the boot partition manually)
- If the adb connection dies and there are error messages like this
Code:
adb: insufficient permissions for device
restart the adb server using
Code:
adb kill-server
if that does not work disconnect and reconnect the USB cable
Spoiler: Sample output of the script
Code:
[[email protected] /data/backup/Android/scripts_on_linux]$ ./install_magisk_via_twrp.sh
./install_magisk_via_twrp.sh version - 2.0.0.0 - add Magisk to the boot partition of a phone running Android using TWRP
Using the TWRP image hardcoded in the script: "/data/backup/ASUS_ZENFONE8/twrp/twrp-3.7.0_12-0-I006D.img"
Checking the script prerequisites ...
Will wait 10 second(s) before starting the script on the phone
The script is running as user "xtrnaw7" -- will use "sudo" for the fastboot commands ...
Will patch the boot partition on the attached phone with the serial number "M6AIB760D0939LX"
Using the options "-d -s M6AIB760D0939LX " for the adb commands
Using the options " -s M6AIB760D0939LX " for the fastboot commands
Checking for a connected phone booted into fastboot mode ...
No attached phone in fastboot mode found
Checking for an attached phone with working access via adb (USB) ...
Linux localhost 5.4.147-Omni-qgki-perf-gea6f815f5af9-dirty #42 SMP PREEMPT Tue Sep 27 18:03:41 CEST 2022 aarch64
... found a phone connected via USB with working adb access
The phone is booted in normal mode
The installed OS is based on Android 12 (Wed Aug 10 06:59:46 CEST 2022); the description for the distribution is "omni_zenfone8-user 12 SQ3A.220605.009.A1 eng.xtrnaw.20220810.065947 release-keys"
The installed version of Magisk is com.topjohnwu.magisk versionCode 25200
Booting the phone into the fastboot mode now ...
Waiting up to 60 seconds for the boot into the fastboot mode ...
Booting the phone from the TWRP image "/data/backup/ASUS_ZENFONE8/twrp/twrp-3.7.0_12-0-I006D.img" now ...
Sending 'boot.img' (98304 KB) OKAY [ 2.489s]
Booting OKAY [ 10.359s]
Finished. Total time: 12.888s
Waiting up to 60 seconds for the boot of the phone ....
Retrieving the current boot slot from the phone ...
The current boot slot is "_b"
The boot slot to patch is "_b"
The boot partition to patch is "boot_b"
Checking if the Magisk patch script "boot_patch.sh" exists on the phone ....
-rwxr-xr-x 1 root root 5987 2022-10-27 07:33 /data/adb/magisk/boot_patch.sh
Checking if the download directory "/sdcard/Download" exists on the phone ....
/sdcard/Download
Creating the boot image file "/sdcard/Download/boot_b.732627.img" from the partition "/dev/block/by-name/boot_b" ...
196608+0 records in
196608+0 records out
100663296 bytes (96 M) copied, 0.308243 s, 311 M/s
Checking the result ...
-rw-rw---- 1 root media_rw 100663296 2022-10-28 09:51 /sdcard/Download/boot_b.732627.img
The check sums are:
The check sum of the boot partition "/dev/block/by-name/boot_b" on the phone is "4108888341"
The check sum of th boot image file on the phone is "/sdcard/Download/boot_b.732627.img" is "4108888341"
Patching the boot image file "/sdcard/Download/boot_b.732627.img" ...
Waiting now 10 seconds ...
- Unpacking boot image
Parsing boot image: [/sdcard/Download/boot_b.732627.img]
HEADER_VER [3]
KERNEL_SZ [42025472]
RAMDISK_SZ [34080597]
OS_VERSION [12.0.0]
OS_PATCH_LEVEL [2022-05]
PAGESIZE [4096]
CMDLINE []
KERNEL_FMT [raw]
RAMDISK_FMT [gzip]
VBMETA
- Checking ramdisk status
Loading cpio: [ramdisk.cpio]
- Stock boot image detected
- Patching ramdisk
Loading cpio: [ramdisk.cpio]
Add entry [init] (0750)
Create directory [overlay.d] (0750)
Create directory [overlay.d/sbin] (0750)
Add entry [overlay.d/sbin/magisk64.xz] (0644)
Patch with flag KEEPVERITY=[false] KEEPFORCEENCRYPT=[false]
Found fstab file [system/etc/fstab.postinstall]
Remove pattern [,avb_keys=/product/etc/security/avb/system_other.avbpubkey]
Loading cpio: [ramdisk.cpio.orig]
Backup mismatch entry: [init] -> [.backup/init]
Record new entry: [overlay.d] -> [.backup/.rmlist]
Record new entry: [overlay.d/sbin] -> [.backup/.rmlist]
Record new entry: [overlay.d/sbin/magisk64.xz] -> [.backup/.rmlist]
Backup mismatch entry: [system/etc/fstab.postinstall] -> [.backup/system/etc/fstab.postinstall]
Create directory [.backup] (0000)
Add entry [.backup/.magisk] (0000)
Dump cpio: [ramdisk.cpio]
- Repacking boot image
Parsing boot image: [/sdcard/Download/boot_b.732627.img]
HEADER_VER [3]
KERNEL_SZ [42025472]
RAMDISK_SZ [34080597]
OS_VERSION [12.0.0]
OS_PATCH_LEVEL [2022-05]
PAGESIZE [4096]
CMDLINE []
KERNEL_FMT [raw]
RAMDISK_FMT [gzip]
VBMETA
Repack to boot image: [new-boot.img]
HEADER_VER [3]
KERNEL_SZ [42025472]
RAMDISK_SZ [34331854]
OS_VERSION [12.0.0]
OS_PATCH_LEVEL [2022-05]
PAGESIZE [4096]
CMDLINE []
Checking the result ...
-rw-r--r-- 1 root root 100663296 2022-10-28 09:51 /data/adb/magisk/new-boot.img
The patched boot image is "/sdcard/Download/patched_boot_b.732627.img"
Waiting now 5 seconds ...
Patching the partition "/dev/block/by-name/boot_b" from the patched boot image file "/sdcard/Download/patched_boot_b.732627.img" via dd ...
196608+0 records in
196608+0 records out
100663296 bytes (96 M) copied, 4.721236 s, 20 M/s
Checking the result ....
The check sums for the images and devices on the phone are:
4108888341 100663296 /sdcard/Download/boot_b.732627.img
3369959638 100663296 /sdcard/Download/patched_boot_b.732627.img
3369959638 100663296 /dev/block/by-name/boot_b
OK, patching the boot partition "/dev/block/by-name/boot_b" was successfull
*** Press return to reboot the phone now
Rebooting the phone now ...
[[email protected] /data/backup/Android/scripts_on_linux]$
Update 03.07.2022 /bs
The script now uses the directory /tmp for temporary file if the directory /sdcard/Download is not available. Therefor it will also work if the phone is secured by a PIN or something similar.
Update 05.07.2022/bs
The script is also available on my web site:
http://bnsmb.de/files/public/Android/install_magisk_via_twrp.sh
Update 30.12.2022/bs
Updated the usage help for the script to match the version 2..3.0 of the script
Update 28.10.2022 /bs
Updated the post to match the new script version 2.0.0.0
Update 17.12.2022 /bs
Updated the post to match the new script version 2.1.0.0
see here for How to install TWRP via script
Update 13.04.2023 /bs
To install Magisk v26.0 or newer the script version 25.01.2023 v2.5.1.0 is necessary.
Unfortunately there is a new feature in Magisk v26.x that prevents the full installation of Magisk from within a booted recovery; from the Magisk docs:
This means that any installation of Magisk v26+ using custom recovery will be incomplete; a subsequent re-installation through the Magisk app after booting up is required.
Click to expand...
Click to collapse
Therefor currently the installation of Magisk v26.x via script without user intervention does not yet work
In Magisk v26.0 the developer changed the code so that it's not possible anymore to install Magisk into the boot partition while booted from a recovery image.
from the Magisk change log:
"This means that any installation of Magisk v26+ using custom recovery will be incomplete; a subsequent re-installation through the Magisk app after booting up is required."
The installation of Magisk v26.x while booted into the recovery (for example using my script install_magisk_via_twrp.sh; see How to install Magisk into the boot partition using script) will succeed but executing the Magisk app after the necessary reboot will end with this dialog:
{
"lightbox_close": "Close",
"lightbox_next": "Next",
"lightbox_previous": "Previous",
"lightbox_error": "The requested content cannot be loaded. Please try again later.",
"lightbox_start_slideshow": "Start slideshow",
"lightbox_stop_slideshow": "Stop slideshow",
"lightbox_full_screen": "Full screen",
"lightbox_thumbnails": "Thumbnails",
"lightbox_download": "Download",
"lightbox_share": "Share",
"lightbox_zoom": "Zoom",
"lightbox_new_window": "New window",
"lightbox_toggle_sidebar": "Toggle sidebar"
}
After pressing OK in that dialog Magisk will reinstall itself in the boot partition and reboot. And afterwards Magisk works again. But that step needs user intervention.
Without executing this additional step Magisk won't work. There is no way to trigger this reinstallation via an CLI command that is usable in a script (at least I did not found it until now ...)
Unfortunately, Magisk also does not execute the init scripts from /data/adb/post-fs-data.d or /data/adb/service.d in this state.
Therefor the automatic installation of Android, TWRP, Magisk, etc like implemented in the tasks in prepare_phone.include (see How to install and configure the Android OS for details) will fail.
To get around this I added some code to the script install_magisk_via_twrp.sh to support the installation of Magisk v26:
install_magisk_via_twrp.sh version v3.1.0.0 (or newer) can now be used to also install Magisk v26 into the boot partition. There are two new parameter for the script install_magisk_via_twrp.sh to select the method to use for the installation:
oldmethod - install Magisk into the boot partition while booted into a recovery
newmethod - install Magisk into the boot partition image while booted into the Android OS
The installation using the "newmethod" only works if their is a working adb connection to the running Android OS on the phone.
Without one of the two new parameter the script will check the Magisk apk file to detect the necessary method to install Magisk into the boot partition. The default method if no apk file is used is still the old method.
Patching the boot image with Magisk v26 is done using these steps:
boot the phone from a TWRP image
create an image of the boot partition while booted from the TWRP image
copy the boot partition image and the Magisk executables to a directory that can be accessed by the user shell while booted into the Anroid OS
boot the phone into the Android OS
patch the boot partition image using the Magisk binaries (that can be done by the non-root user shell)
reboot the phone from a TWRP image
install the patched boot image via dd or fastboot
To do an automatic installation via script using Magisk v26 I added another task to prepare_phone.include:
install_magisk_v26_in_boot_partition
This task will install Magisk using the new method described above.
Because the installation of Magisk v26 needs a working adb connection the tasks in prepare_phone.include will first install Magisk v25.x and enable adb via Magisk init script like before. After this is done Magisk v26 can be installed via script.
So the new task list to install and configure the Android OS using the tasks in the file prepare_phone.include is:
Bash:
DEFAULT_TASKS="
enable_disable_abort_on_error:enable
boot_phone_from_twrp_image
install_os:noreboot:factory_reset
install_twrp:noreboot:next
#
# first install Magisk v25.x into the boot partition; this installation is necessary to
# enable the access via adb to the phone; the Magisk installation will be overwritten later
# with Magisk v26 or newer
#
install_magisk_in_boot_partition_only:noreboot:next
enable_adb:reboot
#
install_magisk_in_data_adb_only:noreboot:copy_apk
enable_root_access_for_the_shell:reboot
wait_for_access_via_adb:120:kill
#
# the next step is necessary to install Magisk v26 or newer
#
install_magisk_v26_in_boot_partition:active:reboot
install_the_magisk_app
wait_for_access_via_adb:120:kill
enable_disable_abort_on_error:disable
install_essential_scripts
install_essential_apps
install_essential_magisk_modules
enable_root_access_for_apps:reboot
execute_script_on_the_phone:ignorerc
"
To distinguish between the apk files for Magisk v25 and Magisk v26 two new variables must be defined in the config file prepare_phone.conf for the tasks in prepare_phone.include:
Bash:
MAGISK_v26_APK_FILE="/data/backup/Android/EssentialApps/Magisk-v26.1.apk"
MAGISK_v25_APK_FILE="/data/backup/Android/EssentialApps_Backup/Magisk-v25.2.apk"
see here for the log of an update of Magisk v25 to Magisk v26 via script using the command
Bash:
./prepare_phone.sh install_magisk_v26_in_boot_partition
see here for the log of an automated installation using the tasks in prepare_phone.include with the installation of Magisk v26 using the command
Bash:
./prepare_phone.sh all
Testenvironments for the installation of Magisk v26 via script
an ASUS Zenfone 8 running
OmniROM 13 with MicroG and Magisk v26.1
OmniROM 12 with MicroG and Magisk v26.1
ASUS Android 13 and Magisk v26.1
ASUS Android 12 and Magisk v26.1
LineageOS 19 and Magisk v26.1
All tests were done using TWRP 3.7.0.12
How to add additonal files to an TWRP image
The recovery image TWRP is very useful for the maintenance of the Android OS.
It's the Swiss Army knife for maintaining phones running the Android OS but sometimes you might miss some files in the TWRP recovery.
To add additional files to an TWRP image the instructions from the HowTo How to change files in the boot image can be used.
To make sure that the new files are also added to an TWRP installed in the boot partition additional steps are necessary.
To unpack and repack the TWRP image the Magisk binary magiskboot is necessary. This binary is part of TWRP so creating the new image should be done while the phone is booted from the TWRP image.
So to add additional files to an TWRP image do:
Bash:
# boot into the TWRP image
#
adb reboot bootloader
sudo fastboot boot /data/backup/ASUS_ZENFONE8/twrp/twrp-3.7.0_12-0-I006D.img
Wait until booting the TWRP image is done and open an adb shell
Bash:
adb shell
Create some directories for the work on the phone:
Bash:
mkdir -p /data/develop/workdir/twrp/ramdisk
Copy the TWRP image file from your PC to the working directory on the phone
Bash:
adb push twrp-3.7.0_12-0-I006D.img /data/develop/workdir/twrp
Unpack the image file:
Bash:
cd /data/develop/workdir/twrp
magiskboot unpack -h twrp-3.7.0_12-0-I006D.img
e.g.
Code:
ASUS_I006D:/data/develop/workdir/twrp # magiskboot unpack -h twrp-3.7.0_12-0-I006D.img
Parsing boot image: [twrp-3.7.0_12-0-I006D.img]
HEADER_VER [3]
KERNEL_SZ [18627321]
RAMDISK_SZ [34811448]
OS_VERSION [99.87.36]
OS_PATCH_LEVEL [2099-12]
PAGESIZE [4096]
CMDLINE [twrpfastboot=1]
KERNEL_FMT [gzip]
RAMDISK_FMT [gzip]
VBMETA
ASUS_I006D:/data/develop/workdir/twrp #
ASUS_I006D:/data/develop/workdir/twrp # ls -ltr
total 324223
-rw-rw---- 1 u0_a119 media_rw 100663296 2022-10-12 13:38 twrp-3.7.0_12-0-I006D.img
-rw-r--r-- 1 root root 100663296 2022-10-28 15:55 new-boot.img
-rw-rw-rw- 1 root root 66 2022-10-28 16:14 header
-rw-r--r-- 1 root root 41943552 2022-10-28 16:14 kernel
-rw-r--r-- 1 root root 88384000 2022-10-28 16:14 ramdisk.cpio
drwxrwxrwx 2 root root 3452 2022-10-28 16:15 ramdisk
ASUS_I006D:/data/develop/workdir/twrp #
Unpack the ramdisk from the TWRP image:
Bash:
cd /data/develop/workdir/twrp/ramdisk
cpio -idm <../ramdisk.cpio
The directory /data/develop/workdir/twrp/ramdisk now contains the contents of the ramdisk used for TWRP.
Now add the new files for the image to the directory /data/develop/workdir/twrp/ramdisk:
In this example we will add the binaries zsh, sqlite3, and vi.
Bash:
cd /data/develop/workdir/twrp/ramdisk
cp ../../newfiles/sqlite3 ./system/bin/
cp ../../newfiles/zsh ./system/bin/
cp ../../newfiles/vi ./system/bin/
Note:
In case you want to add new binaries :
To check if the binaries will work in TWRP execute the binaries while the phone is booted from the original TWRP image. If the binaries need additional libraries not included in TWRP just also add them to the TWRP image into the directory ./system/lib64 of the image.
The next step is necessary to make sure that TWRP will copy the new files also to a TWRP installation in a boot partition:
For each new file add an entry to the files
./ramdisk-files.sha256sum
./ramdisk-files.txt
in the directory with the contents from the ramdisk.
The file ramdisk-files.txt contains the name and path of the files used in the ramdisk for the boot partition and the file ramdisk-files.sha256sum contains the checksum for each of the files for the ramdisk.
Note:
If you change an existing file that is mentioned in the file ./ramdisk-files.sha256sum you must also correct the entry in that file.
So do for each new file:
echo <file_with_path_not_starting_with_a_dot_or_slash> >>ramdisk-files.txt ; done
sh256sum <file_with_path_startinge with_a_slash> >>ramdisk-files.sha256sum
e.g:
Code:
ASUS_I006D:/data/develop/workdir/twrp/ramdisk # for i in system/bin/sqlite3 system/bin/vi system/bin/zsh ; do sha256sum ./$i >>ramdisk-files.sha256sum ; echo "$i" >>ramdisk-files.txt ; done
ASUS_I006D:/data/develop/workdir/twrp/ramdisk #
Check the result.
Code:
ASUS_I006D:/data/develop/workdir/twrp/ramdisk # tail -4 ramdisk-files.sha256sum
8a8ff76cbda445f08ba3552598085089883f9d594cd7716e90f3411a8b82f8a0 ./twres/fonts/DroidSansMono.ttf
09fcec146d9ecba0f2a0b7362b52d2f87607a3c5760c94ba5fcd900e423e16f8 ./system/bin/sqlite3
3a221d10ffc275cadaf79fb1a00c39c9083ce672ea111205301e277091a04b51 ./system/bin/vi
354e415da42503ed4211907adf93ed8bfb14ce2e2d8418fcd7a3227873b4b53f ./system/bin/zsh
ASUS_I006D:/data/develop/workdir/twrp/ramdisk #
ASUS_I006D:/data/develop/workdir/twrp/ramdisk # tail -4 ramdisk-files.txt
twres/fonts/DroidSansMono.ttf
system/bin/sqlite3
system/bin/vi
system/bin/zsh
ASUS_I006D:/data/develop/workdir/twrp/ramdisk #
Correct the entry for the file ramdisk-files.txt in the file ramdisk-files.sha256sum :
Bash:
cd /data/develop/workdir/twrp/ramdisk
cp ./ramdisk-files.sha256sum ./ramdisk-files.sha256sum.org
NEW_ENTRY="$( sha256sum ./ramdisk-files.txt )" && sed -i -e "s#.*\./ramdisk-files.txt#${NEW_ENTRY}#g" ./ramdisk-files.sha256sum
Check the entries in the file ramdisk-files.sha256sum
Bash:
sha256sum --status -c ./ramdisk-files.sha256sum ; echo $?
If the output of that command is not 0 use
Bash:
sha256sum -c ./ramdisk-files.sha256sum | grep -v OK
to get the entry with the invalid checksum. Fix the entry and check again.
Now repack the ramdisk:
Bash:
cd /data/develop/workdir/twrp/ramdisk
find . | cpio -o >../ramdisk.cpio
And recreate the image file:
Bash:
cd /data/develop/workdir/twrp
magiskboot repack twrp-3.7.0_12-0-I006D.img
e.g
Code:
ASUS_I006D:/data/develop/workdir/twrp # magiskboot repack twrp-3.7.0_12-0-I006D.img
Parsing boot image: [twrp-3.7.0_12-0-I006D.img]
HEADER_VER [3]
KERNEL_SZ [18627321]
RAMDISK_SZ [34811448]
OS_VERSION [99.87.36]
OS_PATCH_LEVEL [2099-12]
PAGESIZE [4096]
CMDLINE [twrpfastboot=1]
KERNEL_FMT [gzip]
RAMDISK_FMT [gzip]
VBMETA
Repack to boot image: [new-boot.img]
HEADER_VER [3]
KERNEL_SZ [18618540]
RAMDISK_SZ [37358888]
OS_VERSION [99.87.36]
OS_PATCH_LEVEL [2099-12]
PAGESIZE [4096]
CMDLINE [twrpfastboot=1]
ASUS_I006D:/data/develop/workdir/twrp #
The file new-boot.img contains the TWRP image with the additional files.:
ASUS_I006D:/data/develop/workdir/twrp # ls -ltr new-boot.img
-rw-r--r-- 1 root root 100663296 2022-10-28 16:28 new-boot.img
ASUS_I006D:/data/develop/workdir/twrp #
To test the image, rename the file, copy the file to an PC and boot the phone from the image:
Bash:
mv new-boot.img twrp-3.7.0_12-0-I006D-enhanced.img
Execute on the PC:
Bash:
adb pull /data/develop/workdir/twrp/twrp-3.7.0_12-0-I006D-enhanced.img
adb reboot bootloader
sudo fastboot boot twrp-3.7.0_12-0-I006D-enhanced.img
Connect via adb to the phone booted from the new TWRP image and check the result:
Code:
ASUS_I006D:/ # ls -l /system/bin/zsh /system/bin/sqlite3 /system/bin/vi
-rwxr-xr-x 1 root root 1714720 2022-10-28 16:19 /system/bin/sqlite3
-rwxr-xr-x 1 root root 1815152 2022-10-28 16:19 /system/bin/vi
-rwxr-xr-x 1 root root 2004808 2022-10-28 16:19 /system/bin/zsh
ASUS_I006D:/ #
ASUS_I006D:/ # /system/bin/sqlite3 --version
3.39.3 2022-09-05 11:02:23 4635f4a69c8c2a8df242b384a992aea71224e39a2ccab42d8c0b0602f1e826e8
ASUS_I006D:/ #
ASUS_I006D:/ # /system/bin/vi --version | head -1
VIM - Vi IMproved 8.1 (2018 May 18)
ASUS_I006D:/ #
ASUS_I006D:/ # /system/bin/zsh --version
zsh 5.9 (aarch64-unknown-linux-android)
ASUS_I006D:/ #
Advanced Usage
To be able to distinguish the new image from the original one you can change or add values in the file ./default.prop in the ramdisk for the image, e.g.:
Bash:
# before creating the new ramdisk
cd /data/develop/workdir/twrp/ramdisk
echo "ro.product.type=enhanced" >>default.prop
Then when booted from the image you can check the new property, e.g.:
Code:
ASUS_I006D:/ # getprop ro.product.type
enhanced
ASUS_I006D:/ #
Notes:
The file default.prop is not listed in the checksum file ramdisk-files.sha256sum for the image.
Adding new files to ramdisk-files.sha256sum is not mandatory but recommended
To add files to the image that should not be copied to an TWRP installation in a boot partition just add them to the ramdisk but not to the file ramdisk-files.txt.
see also How to install TWRP via script
Update 28.11.2022 /bs
see als How to compile TWRP for the ASUS Zenfone 8
How to process Android boot image files on a PC running the Linux OS
To unpack and repack the boot image for phones running the Android OS the Magisk binary magiskboot is necessary (well, there might be other tools for this task but magiskboot seems to be one of the best tools for this task). Therefor these kind of tasks will usually be done on a phone running the Android OS.
But there is also a magiskboot binary for x86 CPUs in the Magisk apk file and that executable can be used to work with boot images for Android phones on a PC running the Linux OS on a machine with x86 CPU. To retrieve the x86 version of magiskboot from the Magisk apk file do:
Bash:
# to use the 32 bit version
unzip Magisk-v25.2.apk lib/x86/libmagiskboot.so
mv lib/x86/libmagiskboot.so ./magiskboot
chmod 755 ./magiskboot
or
Bash:
# to use the 64 bit version
unzip Magisk-v25.2.apk lib/x86_64/libmagiskboot.so
mv lib/x86_64/libmagiskboot.so ./magiskboot
chmod 755 ./magiskboot
Example:
Code:
[[email protected] /data/develop/android/magisk]$ unzip Magisk-v25.2.apk lib/x86_64/libmagiskboot.so
Archive: Magisk-v25.2.apk
version=25.2
versionCode=25200
inflating: lib/x86_64/libmagiskboot.so
[[email protected] /data/develop/android/magisk]$
[[email protected] /data/develop/android/magisk]$ mv lib/x86_64/libmagiskboot.so ./magiskboot
[[email protected] /data/develop/android/magisk]$
[[email protected] /data/develop/android/magisk]$ chmod 755 magiskboot
[[email protected] /data/develop/android/magisk]$
[[email protected] /data/develop/android/magisk]$ file ./magiskboot
./magiskboot: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=b2d42d7bab2f70a0d66fc606a1fb2726a0559fed, stripped
[[email protected] /data/develop/android/magisk]$
[[email protected] /data/develop/android/magisk]$ ldd ./magiskboot
not a dynamic executable
[[email protected] /data/develop/android/magisk]$
[[email protected] /data/develop/android/magisk]$ ./magiskboot
MagiskBoot - Boot Image Modification Tool
Usage: ./magiskboot <action> [args...]
...
[[email protected] /data/develop/android/magisk]$
The binary magiskboot from the Magisk apk file is a statically linked executable either for 32 Bit or 64 Bit. Therefor it should run on any Linux distribution that supports executing executables for x86. I tested the binary from the apk file with Magisk v25.2 on these distributions:
Fedora 36 (64 Bit, kernel 6.x)
Redhat 8.6 (64 Bit, kernel 4.x)
Redhat 6.10 (64 Bit, kernel 2.x)
GRML LiveCD (32 Bit, kernel 5.x, the 32 bit version only)
RockyLinux 9.0 (64 Bit, kernel 5.x)
openSUSE LEAP 15.2 (64 Bit, kernel 5.x)
Unpacking a boot image file using magiskboot on a PC running the Linux OS can be done using this command;
Bash:
./magiskboot unpack boot_a.img
To change files in the ramdisk from the boot image use the magiskboot parameter cpio:
Code:
[[email protected] /data/develop/android/test2]$ ./magiskboot
MagiskBoot - Boot Image Modification Tool
Usage: ./magiskboot <action> [args...]
Supported actions:
...
cpio <incpio> [commands...]
Do cpio commands to <incpio> (modifications are done in-place)
Each command is a single argument, add quotes for each command
Supported commands:
exists ENTRY
Return 0 if ENTRY exists, else return 1
rm [-r] ENTRY
Remove ENTRY, specify [-r] to remove recursively
mkdir MODE ENTRY
Create directory ENTRY in permissions MODE
ln TARGET ENTRY
Create a symlink to TARGET with the name ENTRY
mv SOURCE DEST
Move SOURCE to DEST
add MODE ENTRY INFILE
Add INFILE as ENTRY in permissions MODE; replaces ENTRY if exists
extract [ENTRY OUT]
Extract ENTRY to OUT, or extract all entries to current directory
test
Test the current cpio's status
Return value is 0 or bitwise or-ed of following values:
0x1:Magisk 0x2:unsupported 0x4:Sony
patch
Apply ramdisk patches
Configure with env variables: KEEPVERITY KEEPFORCEENCRYPT
backup ORIG
Create ramdisk backups from ORIG
restore
Restore ramdisk from ramdisk backup stored within incpio
sha1
Print stock boot SHA1 if previously backed up in ramdisk
...
[[email protected] /data/develop/android/test2]$
E.g. to change the file system/etc/ramdisk/build.prop in the ramdisk, extract the file from the ramdisk
Bash:
./magiskboot cpio ramdisk.cpio "extract system/etc/ramdisk/build.prop build.prop"
edit the file, and add the file back to the ramdisk using this command:
Bash:
./magiskboot cpio ramdisk.cpio "add 0644 system/etc/ramdisk/build.prop build.prop"
Notes
Note that I did not yet manage to create a working boot image with magiskboot running in the Linux OS after extracting, changing, and recreating the ramdisk via the Linux cpio command (as Linux user root, of course) :
Creating a new boot image this way with magiskboot running in the LInux OS works without error but booting the new created boot image always ends with a ramdump error on the phone. So extracting the ramdisk via Linux cpio command can only be used to view the files in a boot image file for an Android Phone from wthin the Linux OS.
Trouble Shooting
To test the new boot image without installing it use this approach:
Bash:
# boot the phone into the bootloader
#
adb reboot bootloader
# boot the phone from the patched image file
#
sudo fastboot boot ./new-boot.img
If booting the phone works and everything is fine flash the image to the active boot partition
In case you get a ramdump error after booting the phone from the new boot partition just restart the phone into the bootloader mode and flash the old image back to the boot partition.
This HowTo contains some hints for using TWRP in general and some tips for using CLI commands in TWRP.
I will update this post in case I find something new & useful regarding TWRP and update the history section at the end of this post.
The test environment for the instructions below was
TWRP 3.6.2.12 for the ASUS Zenfone 8
TWRP 3.7.0_12-0 for the ASUS Zenfone 8
Note:
This is NOT a general HowTo for TWRP.
How to test a TWRP image?
It's recommended to boot from the TWRP image file before installing it into the boot or recovery partition of your phone. To do this do
Bash:
# connect the phone via USB to your PC
# boot the phone into the bootloader - e.g. via
#
adb reboot bootloader
# boot the phone from the TWRP image (this will not change anything on the phone)
#
sudo fastboot boot <twrpimage_file>
If everything works you can install the TWRP image into the boot or recovery partition using the approbiate menu entry in TWRP.
How to connect via adb to an TWRP session?
TWRP supports adb session as user root, therefor an
Bash:
adb shell
on your PC is sufficient to open an adb shell as user root on the phone booted into TWRP.
In case you get a permission denied error kill the running adb daemon on the PC and restart the adb command. If that does not fix the error disconnect and reconnect the USB cable between the PC and the Phone.
Be aware that TWRP starts the adb daemon twice after booting. Therefor an adb session to the phone started to early after the boot into TWRP might be killed. In this case just open a new adb shell.
How to check if the phone is booted into TWRP ?
Check the value of the property ro.twrp.boot; this property is only set if TWRP is running
e.g:
Code:
ASUS_I006D:/ # getprop ro.twrp.boot
1
ASUS_I006D:/ #
How to check if the running TWRP was booted from an TWRP image or from a boot or recovery partition?
Check the value of the property ro.bootmode; the value of this property is "unknown" if TWRP was booted from an image file via "fastboot boot <twrp_image_file>", e.g.
Code:
ASUS_I006D:/ # getprop ro.bootmode
unknown
ASUS_I006D:/ #
-> TWRP was booted from an TWRP image file
Code:
ASUS_I006D:/ # getprop ro.bootmode
recovery
ASUS_I006D:/ #
-> TWRP was booted from the boot or recovery partition
How to get the version of the running TWRP?
Check the value of the property getprop ro.twrp.version, e.g.:
Code:
ASUS_I006D:/ # getprop ro.twrp.version
3.7.0_12-0
ASUS_I006D:/ #
Where is the log file from TWRP?
The logfile with the messages written while booting TWRP is /data/recovery/log.gz.
e.g.
Code:
130|ASUS_I006D:/ # ls -ltr /data/recovery/l*gz
-rw------- 1 system system 8022 2022-12-26 14:03 /data/recovery/log.gz
ASUS_I006D:/ #
ASUS_I006D:/ # gzip -cd /data/recovery/log.gz | head -10
Starting TWRP 3.7.0_12-0-d07fdb3c on Sat Jan 10 00:53:15 1970
(pid 403)
I:Lun file '/config/usb_gadget/g1/functions/mass_storage.0/lun.0/file'
PRODUCT_USE_DYNAMIC_PARTITIONS := true
TW_INCLUDE_CRYPTO := true
I:TW_BRIGHTNESS_PATH := /proc/lcd_brightness
I:Found brightness file at '/proc/lcd_brightness'
I:TWFunc::Set_Brightness: Setting brightness control to 420
I:TW_EXCLUDE_ENCRYPTED_BACKUPS := true
I:LANG: en
ASUS_I006D:/ #
The current logfile of the running TWRP is /tmp/recovery.log, e.g.:
Code:
ASUS_I006D:/ # ls -l /tmp/recovery.log
-rw-rw-rw- 1 root root 43303 2023-05-19 20:11 /tmp/recovery.log
ASUS_I006D:/ #
Where are the settings from TWRP stored?
The settings from TWRP are stored in the file
/data/media/0/TWRP/.twrps
This is a binary file.
Note that on phones with active encryption that file is only accessible after /data is decrypted.
How to edit a file while booted into TWRP?
The editor nano is part of TWRP and can be used to edit files in an adb session.
How to mount a partition while inside TWRP?
Use
twrp mount <mountpoint>
to mount a partition while TWRP is running.
Note that you should use this command with caution in adb sessions because the adb session may be killed after the mount
How to decrypt an encrypted /data partition
Use
twrp decrypt <password>
to decrypt an encrypted /data partition, e.g.
Code:
ASUS_I006D:/ # ls /data/media/0
+lnodCAAAAAnYFLObBoWS5ZNb5yVMpze 8KdHMCAAAAQOgtDHq,XdSfFPW+XURA2M KlfTJCAAAAwL93jkH2ugnU4eUG3Zzm7M W9W9SCAAAAgh6lwoP0mNiEK9VIWJoH6L
0nUvhAAAAAQ9ptz+L5qPQrpzcAt4G06K DWk4KDAAAAA,B1xVDmT3dZI87g2C0IS8 M6jcmCAAAAAU,4gn9o0zoBZmkysyXy49 bE7t0CAAAAQ2YuHL9styNaf,iSf2cCO,
4nFjMBAAAAwv2oUczXEpKUDfRIOi+nR5 EcHrdAAAAAglBtbhNWl0NvyX8aW+3CHN O5ZVrDAAAAAlKd7PPpo7CaQmkFbZzKRm haPcnBAAAAw9o2lLF97zpPTaC+byP92s
5yL8gCAAAAgekBDBUi4,W78rJAkgFcMF FA1aZAAAAAg2XNF+M859lpPY,3rUC2cY Vda+LCAAAAwR+g6Tav35+h,Epc8latGR mSKc8BAAAAwm+12sMClHPf+zwtHAeW+Q
8CsF+DAAAAwI3tImfOqIS9aHCQ3S7Cdg JpuFgAAAAAwdEzuQerx4681dzGLjlK3X VvEV4DAAAAgRgoqCfrypNqryZxRACnfr rMJEjAAAAAgwTgx,vA5ewWMVizc2LAos
ASUS_I006D:/ #
ASUS_I006D:/ # twrp decrypt 12345
Attempting to decrypt data partition or user data via command line.
Attempting to decrypt FBE for user 0...
User 0 Decrypted Successfully
Data successfully decrypted
Updating partition details...
...done
ASUS_I006D:/ #
ASUS_I006D:/ # ls /data/media/0
Alarms Android Audiobooks DCIM Documents Download Movies Music Notifications Pictures Podcasts Recordings Ringtones TWRP
ASUS_I006D:/ #
see the TWRP Commandline Guide for the known parameter for this command
Note that existing adb sessions will be stopped after sucessfully executing this command.
How to check if the data partition is encrypted from within a booted TWRP
To check if the data partition is encrypted in a script executed in a running TWRP use code like this:
Spoiler: # check if the data partition is encrypted
Bash:
PASSWORD="1234"
CRYPTO_READY=$( getprop crypto.ready )
TWRP_DECRYPT_DONE=$( getprop twrp.decrypt.done )
if [ "${TWRP_DECRYPT_DONE}"x = "true"x ] ; then
echo "The data partition is not encrypted or already decrypted"
elif [ "${CRYPTO_READY}"x = "1"x ] ; then
echo "The data partition is encrypted"
# sample commands to decrypt the data partition
#
# echo "Decryptiong the data partition now ..."
# twrp decrypt "${PASSWORD}"
elif [ "${CRYPTO_READY}"x = "0"x ] ; then
echo "The data partition is not encrypted"
else
echo "ERROR: The value of the property crypto.ready \"${CRYPTO_READY}\" is not known"
fi
How to install a ZIP file via cli command from within a running TWRP?
Copy the zip file to the phone via adb push and then use
twrp install /path/to/update.zip
to install a ZIP file from within TWRP
Note that the parameter must be a fully qualified filename.
Using this method to update the OS only works in a terminal session on the phone; it does not work in a adb session (at least in my tests until now ...)
What commands are available in TWRP?
Most of the Unix commands are available in TWRP
Be aware that a lot of Unix commands in TWRP are implemented using a general binary called toybox (toybox is something like busybox) and do not support all parameter like the original Linux commands
Code:
ASUS_I006D:/ # ls -l /bin/ | wc -l
261
ASUS_I006D:/ # ls -l /bin/ | grep toybox | wc -l
175
ASUS_I006D:/ #
What other TRWP specific commands can be used while in a running TWRP?
Spoiler: The twrp command
Code:
ASUS_I006D:/ # twrp
TWRP openrecoveryscript command line tool, TWRP version 3.7.0_12-0
Allows command line usage of TWRP via openrecoveryscript commands.
Some common commands include:
install /path/to/update.zip
backup <SDCRBAEM> [backupname]
restore <SDCRBAEM> [backupname]
wipe <partition name>
format data
sideload
set <variable> [value]
decrypt <password> [USER ID]
remountrw
fixperms
mount <path>
unmount <path>
listmounts
print <value>
mkdir <directory>
reboot [recovery|poweroff|bootloader|download|edl]
See more documentation at https://twrp.me/faq/openrecoveryscript.html
ASUS_I006D:/ #
See more documentation at https://twrp.me/faq/openrecoveryscript.html
https://twrp.me/faq/openrecoveryscript.html
and a few others like bootctl (see below) or magiskboot (see below).
How to change the active slot for the next reboot while in TWRP?
Use bootctl, e.g.
Code:
ASUS_I006D:/ # bootctl get-current-slot
1
ASUS_I006D:/ # bootctl set-active-boot-slot 0
The usage for the command bootctl is
Spoiler: bootctl usage
Code:
ASUS_I006D:/ # /bin/bootctl
/bin/bootctl - command-line wrapper for the boot HAL.
Usage:
/bin/bootctl COMMAND
Commands:
hal-info - Show info about boot_control HAL used.
get-number-slots - Prints number of slots.
get-current-slot - Prints currently running SLOT.
mark-boot-successful - Mark current slot as GOOD.
get-active-boot-slot - Prints the SLOT to load on next boot.
set-active-boot-slot SLOT - On next boot, load and execute SLOT.
set-slot-as-unbootable SLOT - Mark SLOT as invalid.
is-slot-bootable SLOT - Returns 0 only if SLOT is bootable.
is-slot-marked-successful SLOT - Returns 0 only if SLOT is marked GOOD.
get-suffix SLOT - Prints suffix for SLOT.
set-snapshot-merge-status STAT - Sets whether a snapshot-merge of any dynamic
partition is in progress. Valid STAT values
are: none, unknown, snapshotted, merging,
or cancelled.
get-snapshot-merge-status - Prints the current snapshot-merge status.
SLOT parameter is the zero-based slot-number.
ASUS_I006D:/ #
see also How to switch the active slot
How to use Magisk binaries while booted into TWRP
Magisk is another great tool for Android phones -- for details about Magisk see here:
https://github.com/topjohnwu/Magisk
The Magisk binary for manipulating the boot partition, magiskboot, is already part of TWRP. This binary can be used to unpack and repack boot partition (or boot partition images), ramdisks, or compress/decompress files. The binary works without problems while booted into TWRP.
Spoiler: magiskboot usage
Code:
1|ASUS_I006D:/ # magiskboot
MagiskBoot - Boot Image Modification Tool
Usage: magiskboot <action> [args...]
Supported actions:
unpack [-n] [-h] <bootimg>
Unpack <bootimg> to, if available, kernel, kernel_dtb, ramdisk.cpio,
second, dtb, extra, and recovery_dtbo into current directory.
If '-n' is provided, it will not attempt to decompress kernel or
ramdisk.cpio from their original formats.
If '-h' is provided, it will dump header info to 'header',
which will be parsed when repacking.
Return values:
0:valid 1:error 2:chromeos
repack [-n] <origbootimg> [outbootimg]
Repack boot image components from current directory
to [outbootimg], or new-boot.img if not specified.
If '-n' is provided, it will not attempt to recompress ramdisk.cpio,
otherwise it will compress ramdisk.cpio and kernel with the same format
as in <origbootimg> if the file provided is not already compressed.
If env variable PATCHVBMETAFLAG is set to true, all disable flags will
be set in the vbmeta header.
hexpatch <file> <hexpattern1> <hexpattern2>
Search <hexpattern1> in <file>, and replace with <hexpattern2>
cpio <incpio> [commands...]
Do cpio commands to <incpio> (modifications are done in-place)
Each command is a single argument, add quotes for each command
Supported commands:
exists ENTRY
Return 0 if ENTRY exists, else return 1
rm [-r] ENTRY
Remove ENTRY, specify [-r] to remove recursively
mkdir MODE ENTRY
Create directory ENTRY in permissions MODE
ln TARGET ENTRY
Create a symlink to TARGET with the name ENTRY
mv SOURCE DEST
Move SOURCE to DEST
add MODE ENTRY INFILE
Add INFILE as ENTRY in permissions MODE; replaces ENTRY if exists
extract [ENTRY OUT]
Extract ENTRY to OUT, or extract all entries to current directory
test
Test the current cpio's status
Return value is 0 or bitwise or-ed of following values:
0x1:Magisk 0x2:unsupported 0x4:Sony
patch
Apply ramdisk patches
Configure with env variables: KEEPVERITY KEEPFORCEENCRYPT
backup ORIG
Create ramdisk backups from ORIG
restore
Restore ramdisk from ramdisk backup stored within incpio
sha1
Print stock boot SHA1 if previously backed up in ramdisk
dtb <input> <action> [args...]
Do dtb related actions to <input>
Supported actions:
print [-f]
Print all contents of dtb for debugging
Specify [-f] to only print fstab nodes
patch
Search for fstab and remove verity/avb
Modifications are done directly to the file in-place
Configure with env variables: KEEPVERITY
split <input>
Split image.*-dtb into kernel + kernel_dtb
sha1 <file>
Print the SHA1 checksum for <file>
cleanup
Cleanup the current working directory
compress[=format] <infile> [outfile]
Compress <infile> with [format] (default: gzip), optionally to [outfile]
<infile>/[outfile] can be '-' to be STDIN/STDOUT
Supported formats: gzip zopfli xz lzma bzip2 lz4 lz4_legacy lz4_lg
decompress <infile> [outfile]
Detect format and decompress <infile>, optionally to [outfile]
<infile>/[outfile] can be '-' to be STDIN/STDOUT
Supported formats: gzip zopfli xz lzma bzip2 lz4 lz4_legacy lz4_lg
1|ASUS_I006D:/ #
If Magisk is installed in the Android OS on the phone and the booted TWRP is able to mount the volume for /data the Magisk binary magisk can also be used in an session in TWRP.
For details see the section Using the magisk binary while the phone is booted into TWRP in the post Some hints for using Magisk on Android phones
How to install TWRP into the boot partition using CLI commands from within a booted TWRP?
Use the script
install_twrp_from_within_twrp.sh
Download from here: http://bnsmb.de/files/public/Android/install_twrp_from_within_twrp.sh
How to install TWRP after an OS Upgrade from within the running Android OS?
see How to Install TWRP into the boot partition again after the installation of an OS update
How to add additional files to an existing TWRP image?
see How to add additional files to an TWRP image
How to install TWRP into the boot partition via script?
see How to install TWRP via script
How to build a TWRP image?
seee How to compile TWRP for the ASUS Zenfone 8
How to install an OS image using the twrp command in a script
see How to install an OS image using the TWRP binary twrp?
How to use TWRP if LineageOS 20.x is installed
As of 26.06.2023 booting the phone from the TWRP recovery image using the command
sudo fastboot boot <twrp_image>
Does not work anymore if LineageOS 20.x is installed on the phone.
see How to use TWRP if LineageOS 20.x is installed for a workaroujnd
Spoiler: History / Change log of this entry
02.12.2022 /bs
initial release
17.12.2022 /bs
added infos about how to use the binary twrp to install an OS image
26.12.2022 /bs
added infos about the logile used by TWRP
23.04.2023 /bs
added info about how to decrypt the data partition
30.04.2023 /bs
added infos about the file used for the TWRP settings
19.05.2023 /bs
added infos about how to check if the data partition is encrypted
updated the infos about the log file used by TWRP
added infos about how to install TWRP from within a running Android OS
26.06.2023 /bs
added the infos about how to use TWRP with LineageOS 20.x
While trying to get TWRP to boot on a phone with LIneageOS 20.x installed, I found some information about the boot parameters for the Android OS, which I document with this forum post.
To view the current kernel parameter for the Android kernel the command
Code:
cat /proc/cmdline
can be used. e.g
Code:
1|ASUS_I006D:/ $ su - -c cat /proc/cmdline
cgroup_disable=pressure log_buf_len=256K earlycon=msm_geni_serial,0x98c000 rcupdate.rcu_expedited=1 rcu_nocbs=0-7 kpti=off noirqdebug androidboot.console=ttyMSM0 androidboot.hardware=qcom androidboot.memcg=1 androidboot.usbcontroller=a600000.dwc3 cgroup.memory=nokmem,nosocket console=ttyMSM0,115200n8 ip6table_raw.raw_before_defrag=1 iptable_raw.raw_before_defrag=1 loop.max_part=7 lpm_levels.sleep_disabled=1 msm_rtb.filter=0x237 pcie_ports=compat service_locator.enable=1 swiotlb=0 kpti=off buildvariant=userdebug androidboot.verifiedbootstate=orange androidboot.keymaster=1 androidboot.bootdevice=1d84000.ufshc androidboot.fstab_suffix=default androidboot.boot_devices=soc/1d84000.ufshc androidboot.serialno=M6AIB760D0939LX androidboot.baseband=msm msm_drm.dsi_display0=qcom,mdss_dsi_samsung_fhd_cmd: androidboot.slot_suffix=_b rootwait ro init=/init androidboot.dtbo_idx=0 androidboot.dtb_idx=0 androidboot.force_normal_boot=1 androidboot.pre-ftm=0 androidboot.id.prj=4 androidboot.id.stage=7 androidboot.id.sku=3 androidboot.id.rf=1 androidboot.id.pcb=4731 androidboot.id.nfc=1 androidboot.country_code=EU androidboot.bootcount=0 androidboot.rawdump_en=0 androidboot.asus.authorized=0 androidboot.cpuid.hash=551c6708e291a3a57e013f5bdf2afe4a androidboot.toolid=15715839e737449088fe70f7faf618f0 SB=Y androidboot.fused=1 SBNR=Y androidboot.fused.norpmb=1 androidboot.id.panel=1 androidboot.id.ufs=3 androidboot.factory.crc=0x4FE99984 androidboot.ddr.manufacturer_id=FF androidboot.ddr.device_type=8 LCD=AC0E0041 androidboot.bootreason=hard
ASUS_I006D:/ $
Additional boot parameter can be defined in the boot partition. To do this the Magisk binary magiskboot can be used; Example (for doing this in an Android shell):
Code:
#
# the commands must be done as user root
#
ASUS_I006D:/ $ su -
ASUS_I006D:/ # mkdir /data/develop
ASUS_I006D:/ # cd /data/develop
ASUS_I006D:/data/develop # getprop ro.boot.slot_suffix
_b
ASUS_I006D:/data/develop #
#
# unpack the current boot partition to the current directory
#
# Note: The parameter -h for magiskboot is required to write the header file
#
ASUS_I006D:/data/develop # /data/adb/magisk/magiskboot unpack -h /dev/block/by-name/boot_b
Parsing boot image: [/dev/block/by-name/boot_b]
HEADER_VER [4]
KERNEL_SZ [39909888]
RAMDISK_SZ [43610592]
OS_VERSION [13.0.0]
OS_PATCH_LEVEL [2023-05]
PAGESIZE [4096]
CMDLINE []
KERNEL_FMT [raw]
RAMDISK_FMT [lz4_legacy]
VBMETA
ASUS_I006D:/data/develop #
ASUS_I006D:/data/develop # ls -l
total 129960
-rw-rw-rw- 1 root root 50 2023-06-25 14:31 header
-rw-r--r-- 1 root root 39909888 2023-06-25 14:31 kernel
-rw-r--r-- 1 root root 93031052 2023-06-25 14:31 ramdisk.cpio
ASUS_I006D:/data/develop #
ASUS_I006D:/data/develop # cat header
cmdline=
os_version=13.0.0
os_patch_level=2023-05
ASUS_I006D:/data/develop #
To define additional boot parameter add them to the line cmdline= in the file header and repack the boot image, e.g:
Code:
ASUS_I006D:/data/develop # sed -i -e "s/cmdline=/cmdline=debug /g" header
ASUS_I006D:/data/develop #
ASUS_I006D:/data/develop # cat header
cmdline=debug
os_version=13.0.0
os_patch_level=2023-05
ASUS_I006D:/data/develop #
ASUS_I006D:/data/develop # /data/adb/magisk/magiskboot repack /dev/block/by-name/boot_b ../new_boot.img
Parsing boot image: [/dev/block/by-name/boot_b]
HEADER_VER [4]
KERNEL_SZ [39909888]
RAMDISK_SZ [43610592]
OS_VERSION [13.0.0]
OS_PATCH_LEVEL [2023-05]
PAGESIZE [4096]
CMDLINE []
KERNEL_FMT [raw]
RAMDISK_FMT [lz4_legacy]
VBMETA
Repack to boot image: [../new_boot.img]
HEADER_VER [4]
KERNEL_SZ [39909888]
RAMDISK_SZ [43610592]
OS_VERSION [13.0.0]
OS_PATCH_LEVEL [2023-05]
PAGESIZE [4096]
CMDLINE [debug]
ASUS_I006D:/data/develop #
Use dd (or fastboot) to flash the new boot image, e.g:
dd if=../new_boot.img of=/dev/block/by-name/boot_b
Notes:
To define additional kernel parameter add them to the line using the blank as separator for the parameter - e.g.:
Code:
cmdline=loglevel=7 debug
The list of known kernel parameter for the ASUS Zenfone 8 can be found in the file
./kernel/asus/sm8350/Documentation/admin-guide/kernel-parameters.txt
in the source for the Android OS used (but most of the parameter described there are useless for the Android OS I guess ...)
The method described above can also be used to define additional kernel parameter for the kernel in the TWRP image. Note that you should never delete the kernel parameter twrpfastboot=1 in the TWRP boot image.
Unpacking and repacking the boot image can also be done on a PC running the Linux OS using the x86 version of magiskboot from the Magisk apk file.
To extract the magiskboot binary for 64 Bit Linux from the apk file use these commands:
Bash:
unzip -p Magisk-v26.1.apk lib/x86_64/libmagiskboot.so >magiskboot
chmod 755 magiskboot
The x86 binaries from the Magisk apk file are static linked binaries and should work on every Linux OS running on x86.
The Magisk Module cmdpatch (https://github.com/Magisk-Modules-Alt-Repo/cmdpatch) contains a script to add new kernel parameter
bnsmb said:
To define additional boot parameter add them to the line cmdline= in the file header and repack the boot image...
Click to expand...
Click to collapse
There's no particular need to unpack/pack the image.
The image added options to cmdline are right there in the header.
Just hexedit at offset 0x40 (for Android image versions 0, 1, 2) or offset 0x2c (for Android image versions 3, 4).
If your device uses AVB0 you may need to regenerate that.
Renate said:
There's no particular need to unpack/pack the image.
The image added options to cmdline are right there in the header.
Just hexedit at offset 0x40 (for Android image versions 0, 1, 2) or offset 0x2c (for Android image versions 3, 4).
If your device uses AVB0 you may need to regenerate that.
Click to expand...
Click to collapse
Thanks for the update - good to know that
You seem to know the Android kernel much better than I do.
My goal in playing with the kernel parameter was to find a way to get more messages from the kernel to find out why I can't boot the phone from a TWRP image via fastboot boot <twrpimage> when LineageOS 20.x is installed
But I was not successful ... do you know if this is possible?
regards
Bernd
bnsmb said:
My goal in playing with the kernel parameter was to find a way to get more messages from the kernel to find out why I can't boot the phone from a TWRP image via fastboot boot <twrpimage> when LineageOS 20.x is installed
Click to expand...
Click to collapse
There are cases where fastboot boot recimage does not work but fastboot flash recovery recimage and go to recovery does.
I've never chased this down all the way. Many parameters for cmdline are generated on the fly from abl.
I presume that there is some parameter specific to recovery that is not inserted when you boot from memory.
I haven't used TWRP in years, I just roll my own recovery with rooted ADB.
I don't need any screen stuff.
Also, you could use my imgutil.exe (in the sig)
Code:
C:\>imgutil /v boot
Header2: 1,660 (0000067c)
Kernel: 12,626,808 (00c0ab78) 00000800
Ramdisk: 1,224,504 (0012af38) 00c0b800
DTB: 68,134 (00010a26) 00d36800
Command: bootopt=64S3,32N2,64N2 buildvariant=user
C:\>imgutil /v boot /c"bootopt=64S3,32N2,64N2 buildvariant=user silly=always"
Header2: 1,660 (0000067c)
Kernel: 12,626,808 (00c0ab78) 00000800
Ramdisk: 1,224,504 (0012af38) 00c0b800
DTB: 68,134 (00010a26) 00d36800
Command: bootopt=64S3,32N2,64N2 buildvariant=user
Replaced cmdline
Wrote image
C:\>imgutil /v boot
Header2: 1,660 (0000067c)
Kernel: 12,626,808 (00c0ab78) 00000800
Ramdisk: 1,224,504 (0012af38) 00c0b800
DTB: 68,134 (00010a26) 00d36800
Command: bootopt=64S3,32N2,64N2 buildvariant=user silly=always