0 votes

Comment flasher la partition de démarrage depuis le téléphone lui-même ?

J'ai déjà installé Magisk par Parcheando. boot_b - la partition de démarrage actuelle. Par conséquent, j'ai le privilège Root et je peux y accéder par le biais de la fonction su dans Termux. Le problème est que lorsque je mets à jour LineageOS par OTA, il met également à jour l'image de démarrage, donc je perds Magisk à chaque mise à jour. Et donc, j'ai besoin d'un ordinateur pour le réinstaller à chaque mise à jour (c'est-à-dire toutes les semaines environ).

J'essaie de m'en sortir en installant Magisk depuis le téléphone juste après la mise à jour alors que je suis toujours sur la partition enracinée.

J'ai réussi à extraire la mise à jour boot_a partition en utilisant cp /dev/block/by-name/boot_a /data/data/com.termux/files/home/storage/documents/boot_a.img je l'ai patché avec Magisk, et maintenant j'essaye de flasher l'image patchée à nouveau avec dd if=/data/data/com.termux/files/home/storage/downloads/magisk_patched-25200_FyF2V.img of=/dev/block/by-name/boot_a

Mais il dit que l'opération n'est pas autorisée et refuse de faire la chose :

dd: /dev/block/by-name/boot_a: write error: Operation not permitted
1+0 records in
0+0 records out
0 bytes (0 B) copied, 0.002583 s, 0 B/s

Je trouve cela étrange car il y a des posts ( 1 , 2 ) où les gens ont réussi à faire de même.

Encore une fois, j'exécute la commande dans un shell Root donné par su . Et, comme vous pouvez le voir, les permissions des fichiers sont fixées à rw pour le root propriétaire :

# ls -l /dev/block/by-name/boot_a /dev/block/mmcblk0p38                                                                                                                         
lrwxrwxrwx 1 root root       21 1970-07-16 15:34 /dev/block/by-name/boot_a -> /dev/block/mmcblk0p38
brw------- 1 root root 259,   6 2022-08-31 22:02 /dev/block/mmcblk0p38
# whoami
root

J'ai aussi réglé SELinux sur permissive juste au cas où, mais ça n'a pas aidé non plus :

# getenforce
Permissive

J'ai également trouvé une belle histoire dans deux questions ( 1 , 2 ) de quelqu'un ayant un problème similaire, et ils ont déterminé que c'était le manque de certaines capacités de Linux qui les empêchait de chrooter. Donc, j'ai également essayé de trouver si je manque de certaines "capacités" pour dd et il semble que je n'aie pas de capacités sur le site. toybox binaire, qui fournit dd . Cependant, je dispose des 38 capacités du processus actuel (le shell) :

# ls -l `which dd`
lrwxrwxrwx 1 root root 6 1970-07-16 15:34 /system/bin/dd -> toybox
# getcap /system/bin/dd
# getcap /system/bin/toybox        
# getcap /dev/block/by-name/boot_a                                                                                                                                              
# getcap /dev/block/mmcblk0p38
# cat /proc/self/status | grep Cap                                                                                                                                              
CapInh: 0000000000000000
CapPrm: 0000003fffffffff
CapEff: 0000003fffffffff
CapBnd: 0000003fffffffff
CapAmb: 0000000000000000
[ThisOneRan@PC]$ capsh --decode=0000003fffffffff
0x0000003fffffffff=cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read
# cat /proc/sys/kernel/cap_last_cap                                                                                                                                           
37

Donc, j'ai essayé de mettre cap_dac_override pour le /system/bin/toybox binaire, mais ne pouvait pas - il est en lecture seule :

# setcap cap_dac_override+ep /system/bin/toybox                                                                                                                                 
Failed to set capabilities on file `/system/bin/toybox' (Read-only file system)

Forme de course mount | grep system il s'avère que ce n'est pas le system lui-même est monté, mais... de Magisk system_root bloack device to eash individual binary and stuff. Donc, j'ai remonté toybox en tant que rw :

# mount | grep toybox                                                                                                                                                           
/dev/DBScy/.magisk/block/system_root on /system/bin/toybox type ext4 (ro,seclabel,relatime)
# mount -o remount,rw /dev/DBScy/.magisk/block/system_root /system/bin/toybox                                                                                                   
# mount | grep toybox                                                                                                                                                           
/dev/DBScy/.magisk/block/system_root on /system/bin/toybox type ext4 (rw,seclabel,relatime)

Cela m'a permis de setcap toutes les capacités :

# setcap all+ep /system/bin/toybox
# getcap /system/bin/toybox                                                                                                                                                     
/system/bin/toybox =ep

Mais même avec cela, je ne suis toujours pas autorisé à flasher l'image de démarrage :

# dd if=/data/data/com.termux/files/home/storage/downloads/magisk_patched-25200_FyF2V.img of=/dev/block/by-name/boot_a                                                          
dd: /dev/block/by-name/boot_a: write error: Operation not permitted
1+0 records in
0+0 records out
0 bytes (0 B) copied, 0.001446 s, 0 B/s
# dd if=/data/data/com.termux/files/home/storage/downloads/magisk_patched-25200_FyF2V.img of=/dev/block/mmcblk0p38                                                              
dd: /dev/block/mmcblk0p38: write error: Operation not permitted
1+0 records in
0+0 records out
0 bytes (0 B) copied, 0.000779 s, 0 B/s

À ce stade, je n'ai aucune idée de ce qu'il faut essayer d'autre, ou de l'endroit où se trouve mon erreur évidente, alors aidez-moi à la résoudre. Merci d'avance !

0voto

Maksym Hazevych Points 11

Bizarre, mais après un redémarrage au même préfixe, il m'a permis de le flasher sans aucune "capacité" et en appliquant SELinux. Et tout a fonctionné parfaitement comme prévu. Je n'ai aucune idée de la raison pour laquelle cela n'a pas fonctionné du premier coup, peut-être ai-je dû redémarrer le shell ?

Quoi qu'il en soit, pour démarrer dans le même préfixe lors du prochain redémarrage, vous devez définir l'emplacement de démarrage actif en utilisant la méthode suivante bootctl set-active-boot-slot `bootctl get-current-slot`

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X