15 votes

Comment décompresser/recompresser le fichier system.img d'une ROM Android ?

J'ai un appareil OnePlus 6T qui a un système de partition A/B et a une ROM de type utilisateur c'est à dire [ro.build.type]: [user] . Cet appareil est enraciné avec Magisk. J'ai une exigence( Vous voulez placer un fichier de politique personnalisé dans le répertoire system_root. ) pour modifier system.img .

J'ai essayé différents outils comme :

  1. simg2img :

    OMEN-by-HP-Laptop-15-dc0xxx:~/WorkArea/img-tools$ ./simg2img system.img sys.raw Invalid sparse file format at header magi Failed to read sparse file OMEN-by-HP-Laptop-15-dc0xxx:~/WorkArea/img-tools$

  2. imgtools

    OMEN-by-HP-Laptop-15-dc0xxx:~/WorkArea/imgtool$ sudo ./imgtool system.img extract [sudo] password for OMEN: system.img is not a recognized image. Sorry OMEN-by-HP-Laptop-15-dc0xxx:~/WorkArea/imgtool$

  3. et d'autres outils, même sur Windows..

mais aucun d'entre eux n'est capable d'analyser ma system.img .

J'ai copié system.img directement à partir de OnePlus6T ROM setup qui installe Android 9 sur cet appareil sans aucun problème.

Une aide pour :

  1. Comment réparer le system.img pour qu'il soit extrait et repacké correctement ?
  2. Une commande qui peut décompresser/recompresser system.img ?
  3. Un outil de travail pour accomplir cette tâche ?

Mise à jour 1 : J'ai couru file system.img et j'ai trouvé que son image ext2 et les outils supportent ext4.

system.img: Linux rev 1.0 ext2 filesystem data, UUID=d09c08e9-628d-590e-a610-3a14de2a8db0 (extents) (large files) (huge files)

Mise à jour 2 : J'ai essayé de trouver le nombre magique et j'ai obtenu le résultat suivant :

OMEN-by-HP-Laptop-15-dc0xxx:~/WorkArea/imgtool$ xxd system.img | head
00000000: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000060: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000070: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000080: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000090: 0000 0000 0000 0000 0000 0000 0000 0000  ................
OMEN-by-HP-Laptop-15-dc0xxx:~/WorkArea/imgtool$ 

Mise à jour 3 Fing l'image déjà déballée. Donc pour ajouter le fichier requis, j'ai monté l'image en tant que sudo mount -o loop system.img system_mount et a ensuite essayé de copier le contenu vers un autre dossier avec cp system_mount/* system/ afin que je puisse ajouter le fichier requis et créer une nouvelle image à partir de celui-ci, mais j'ai obtenu les erreurs suivantes :

root@OMEN-by-HP-Laptop-15-dc0xxx:~/WorkArea# mkdir system && cp system_mount/* system/
cp: omitting directory 'system_mount/acct'
cp: cannot stat 'system_mount/bin': No such file or directory
cp: cannot stat 'system_mount/bt_firmware': No such file or directory
cp: cannot stat 'system_mount/bugreports': No such file or directory
cp: cannot stat 'system_mount/cache': No such file or directory
cp: cannot stat 'system_mount/charger': No such file or directory
cp: cannot stat 'system_mount/charger_log': No such file or directory
cp: omitting directory 'system_mount/config'
cp: omitting directory 'system_mount/d'
cp: omitting directory 'system_mount/data'
cp: omitting directory 'system_mount/dev'
cp: cannot stat 'system_mount/dsp': No such file or directory
cp: cannot stat 'system_mount/etc': No such file or directory
cp: cannot stat 'system_mount/firmware': No such file or directory
cp: omitting directory 'system_mount/lost+found'
cp: omitting directory 'system_mount/mnt'
cp: omitting directory 'system_mount/odm'
cp: omitting directory 'system_mount/oem'
cp: omitting directory 'system_mount/op1'
cp: omitting directory 'system_mount/op2'
cp: cannot stat 'system_mount/persist': No such file or directory
cp: omitting directory 'system_mount/postinstall'
cp: omitting directory 'system_mount/proc'
cp: cannot stat 'system_mount/product': No such file or directory
cp: omitting directory 'system_mount/res'
cp: omitting directory 'system_mount/sbin'
cp: cannot stat 'system_mount/sdcard': No such file or directory
cp: omitting directory 'system_mount/storage'
cp: omitting directory 'system_mount/sys'
cp: omitting directory 'system_mount/system'
cp: omitting directory 'system_mount/vendor'
root@OMEN-by-HP-Laptop-15-dc0xxx:~/WorkArea#

1 votes

Est-ce que le system.img que vous avez commence avec l'hexagone 3AFF 26ED ? Sinon, vérifiez si les octets magiques de l'en-tête du fichier sont connus.

0 votes

Il est affiché comme 00 00 00 00 00 Veuillez vérifier le Mise à jour 2 .

1 votes

On dirait que l'image est déjà déballée.

7voto

Vatish Sharma Points 761

Ces commandes ne fonctionnent pas toujours : parfois la taille de system_new.img devient plus grande que celle de system.img.ext4 et donc elle ne clignote pas sur le périphérique. D'après mes connaissances, la taille de la nouvelle image doit être égale ou inférieure à la taille de l'image système originale. ---- Si quelqu'un est en mesure de déterminer les nouvelles commandes, veuillez le partager.

Pour déballer-modifier-pâcher le system.img J'ai suivi la procédure suivante :

a) Déballage

  • Exécuter file system.img et s'assurer que system.img est une image éparse Android.
  • Renommer system.img a system.img.ext4 . // Non requis si vous utilisez un autre nom pour l'image brute dans les étapes suivantes.
  • simg2img system.img.ext4 system.img vous obtiendrez un fichier image brut nommé system.img
  • mkdir system créer un répertoire pour monter system.img
  • sudo mount -t ext4 -o loop system.img system/ vous obtiendrez tous les fichiers de system.img en system dossier

b) Modifier

  • ls -l system/init.rc autorisations de notes : 750
  • sudo chmod 777 system/init.rc donner les droits d'écriture
  • sudo echo "#MODIFICATION " >> system/init.rc a fait quelques modifications dans init.rc
  • sudo chmod 750 init.rc réinitialiser init.rc aux permissions notées

c) Calculer la taille du secteur du système

  • tune2fs -l system.img | grep "Block size\|Block count" vous obtiendrez la taille et le nombre de blocs
  • echo $((1553064 * 4096)) multiplier les deux résultats. J'ai obtenu 6361350144

d) Emballage

  • sudo make_ext4fs -s -l 6361350144 -a system system_new.img system/ vous obtiendrez system_new.img "Android Sparse Image" qui a tous les changements

0 votes

Obtention de l'erreur 'can't set Android permissions - built without Android support' lors de l'exécution de la commande packing. Une idée ?

0 votes

Je n'ai jamais eu cette erreur. Vous utilisez probablement une autre(ou une version précédente de) make_ext4fs peut résoudre votre problème.

1 votes

Merci pour votre réponse, Pourriez-vous me dire ce que signifie le 'sys/' mentionné dans la queue de la commande packing ?

1voto

becomputer06 Points 5806

C'est facile et ça marche :

truncate --size=3000M system.img
mke2fs -t ext4 -L system_rw system_rw.img
sudo mount system_rw.img
sudo cp -R --preserve=all /path_to_the_ronly_system.img_mountpoint/. /system_rw_mountpoint

Exemple pour cp : sudo cp -R --preserve=all /media/user/_/. /media/user/system_rw/

C'est tout, les gars.

0voto

Ankit Srivastava Points 101

Utilisez cet outil sous linux, j'ai pu extraire l'image de mon émulateur en utilisant ext4 sur vm sous ubuntu.

https://github.com/qmfrederik/extfstools

Je cherche encore un moyen de le ramener. Je mettrai à jour ici une fois que je serai capable de le faire.

0 votes

Pourquoi ne pas simplement mount ? Le reconditionnement est simple. Créez un fichier clairsemé avec truncate . Faites mkfs.ext4 et mount . Ajouter des fichiers et umount . Aucun outil spécial n'est nécessaire. Mais comment préserver les permissions, la propriété, l'horodatage, le xattr des fichiers de cette façon ?

0 votes

@IrfanLatif Je ne sais pas comment monter sur VM. et b) Je suis noob à ubuntu. J'ai installé la VM hier soir. c) Jusqu'à hier soir, les permissions, etc. m'étaient étrangères. J'ai juste besoin d'exécuter une petite application en automatique sur un serveur sur émulateur donc je ne pense pas que je doive m'inquiéter des autorisations mais je veux fournir un accès Root à certaines applications. Je n'ai pas besoin de m'inquiéter des autorisations mais je veux donner un accès Root à certaines applications. Cela vous dérangerait-il d'en discuter et de m'aider ?

0 votes

Chat sur quoi ? Posez une question précise si elle n'a pas déjà été traitée. Pour les bases de Linux/Android, faites des recherches et étudiez. Je suis disponible pour vous aider si vous n'êtes pas disponible autrement.

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