2 votes

Lancer un script en utilisant init.rc ne fonctionne pas

J'essaie d'exécuter un script qui s'exécute lorsque le périphérique a fini de démarrer. Ce périphérique particulier ne prend pas en charge l'exécution de scripts à partir d'un répertoire init.d, c'est pourquoi j'utilise init.rc.

Le fichier init.rc a été modifié pour inclure le code suivant

on property:sys.boot_completed=1
start initAsic

service initAsic /data/local/tmp/runn.sh
user root
group root
oneshot

L'image de démarrage a ensuite été reconstruite et flashée sur le dispositif. Les changements peuvent être confirmés en consultant le fichier init.rc situé à l'adresse suivante /

Actuellement, je n'utilise qu'un simple script de test (testScript.sh) qui lance la commande suivante

echo hi >> /data/local/tmp/test.txt

Le fichier testScript.sh et text.txt a 777 et les deux ont été poussés vers l'appareil en utilisant la fonction adb push . Leur emplacement actuel est le suivant /data/local/tmp/

Pour une raison quelconque, il semble que mon script ne fonctionne pas, car je ne vois pas de texte écrit dans test.txt.

Est-ce que je rate quelque chose ? Serait-ce un problème avec SELinux ?

Mon appareil a actuellement SElinux réglé sur permissif. Cela a été fait en modifiant le fichier BoardConfig.mk et en reconstruisant le fichier boot.img.

1 votes

0 votes

Ajouter disabled mot-clé pour le service. Après le redémarrage, vérifiez le journal : dmesg | grep -C5 initAsic .

0 votes

Je m'excuse pour la réponse tardive et je vous remercie pour vos suggestions. @alecxs J'ai vu ce message et j'ai reproduit la plupart des étapes de l'un des processus décrits, mais pas étape par étape - la seule différence étant l'emplacement des fichiers qui sont exécutés. Je n'ai pas réussi. @IrfanLatif J'ai ajouté le mot clé disabled aux services et j'ai lancé la commande dmesg. Il semble que ma supposition était correcte, puisqu'elle renvoie service initAsic does not have a SELinux domain defined . Je devrais être en mesure de résoudre le problème maintenant - je vous ferai savoir comment je procède et je publierai une réponse. Je vous tiendrai au courant de l'évolution de la situation et publierai une réponse.

1voto

Ringo001 Points 41

En exécutant la commande dmesg | grep -C5 initAsic J'ai vu que j'obtenais ce code d'erreur retourné

service initAsic does not have a SELinux domain defined

Le problème est que je devais ajouter la ligne suivante seclabel u:r:init:s0 à mon service d'init car c'est une exigence de init . Le service complet ressemble maintenant à ceci. Le mot clé "disabled" a également été ajouté comme suggéré par Irfan.

service initAsic2 /data/local/tmp/runn.sh
seclabel u:r:init:s0
user root
group root
oneshot
disabled

Notez également que SElinux doit être réglé sur permissive pour autoriser l'exécution de ce service ou, de préférence - étant donné que le réglage de SElinux sur permissif constitue un risque pour la sécurité - définir les règles appropriées pour SElinux et utiliser la politique modifiée.

Plus d'informations sur le sujet ici : https://Android.stackexchange.com/a/207647/218526

C'est dans cet article que j'ai trouvé la suggestion d'ajouter la propriété seclabel. Il contient également des informations plus utiles concernant le problème SELinux que je rencontrais : https://stackoverflow.com/questions/43600261/init-warning-service-myservice-needs-a-selinux-domain-defined-please-fix

1 votes

Quel est l'intérêt d'ajouter seclabel lorsque vous rendez SELinux inefficace en le paramétrant permissive ? Désactiver SELinux est un risque pour la sécurité. Définissez plutôt le contexte et/ou injectez des règles SELinux appropriées. Voir les détails aquí . Ou au moins utiliser un contexte permissif comme celui de Magisk pour votre service uniquement. Voir ma réponse à la question question marqué en double par @alecxs.

0 votes

Tbh @IrfanLatif Je ne suis pas sûr de savoir pourquoi ça a marché. Le réglage de SELinux sur permissif aurait dû le rendre inefficace, mais pour moi, il semble que ce ne soit pas le cas - je vais me pencher un peu plus sur la question pour confirmer que ce n'est pas un autre facteur qui a contribué à ce que cela fonctionne. Je comprends que c'est un risque de sécurité mais pour mes besoins (prototypage rapide) c'est bon. À l'avenir, je prévois de définir correctement les règles SELinux.

0 votes

Cela a fonctionné parce que seclabel est une exigence de la init que vous avez rempli. L'essentiel est là, seclabel n'est d'aucune utilité lorsque SELinux est réglé sur permissive . Il ne s'agit pas plus de protéger le service ou tout autre fichier/processus.

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