2010-06-07 13 views
3

J'ai une application en cours d'exécution appelée AppFS. Cette application a un système de fichiers ext2 juste attaché à la fin du fichier (il est positionné de sorte que le binaire de l'application existe dans une zone d'espacement de 1 Mo, suivi par les données ext2).Comment puis-je modifier le fichier d'application d'une application en cours d'exécution (sous Linux)?

Maintenant, FUSE est intégré dans le programme et j'ai réussi à extraire le système de fichiers des données de l'application dans un fichier temporaire afin que FUSE puisse le monter/l'utiliser.

Le problème que j'ai maintenant est d'écrire le fichier temporaire de retour dans le fichier d'application. Je reçois le "fichier texte occupé" sans doute parce que l'application s'est verrouillée et ne laissera pas les écritures se produire.

Y at-il un moyen de forcer le déverrouillage du fichier afin que je puisse y écrire des données? (Il est important de noter que je ne change pas la zone binaire de l'application - en réécrivant simplement le composant ext2.) Elle doit être déverrouillée sans avoir besoin d'autorisations root (déverrouillées par le même utilisateur qui a démarré l'application).

+0

Je suppose que le problème ici est que l'utilisateur qui démarre l'application n'est pas nécessairement le même que celui qui possède le binaire. Avez-vous vraiment besoin d'intégrer les données 'ext2' dans le binaire? – ereOn

+0

Fractionnez ext2 du binaire ou lors de l'exécution de l'exécutable complet (avec ext2 attaché) ou extrayez simplement l'exécutable dans un fichier, exécutez-le et utilisez l'autre fichier exécutable (avec ext2 attaché) comme fichier avec le système de fichiers. – INS

+0

La séparation entre la partie exécutable et le composant ext2 peut ne pas être évidente pour le système d'exploitation. Comment saurait-il prendre un verrou byterange sur le fichier? Il doit verrouiller la partie exécutable, car elle peut être supprimée de la mémoire lorsque la RAM est faible. – MSalters

Répondre

1

La solution à ce problème était de renommer le nom de l'application existante (à un emplacement dans un répertoire temporaire) et ensuite de déplacer le nouveau fichier (généré) à sa place et d'appliquer le même umask/uid/gid que le un ancien avait. Une fois qu'il est déplacé, vous pouvez simplement dissocier l'exécutable en cours.

C'est un peu une solution de contournement hacky (je n'aime pas particulièrement le fait que l'application est entièrement supprimée et remplacée), mais cela fonctionne.

0

Ce que je ferais:

  1. Lancement AppFS
  2. Extrait ne la partie exécutable dans un fichier (sans le FS)
  3. Exécutez le don exécutable extrait en tant que paramètre l'exécutable d'origine (avec FS joint)
  4. Modifier l'exécutable d'origine à partir du programme extrait (pas de problème - l'exécutable n'est plus en cours d'exécution)
  5. auto supprimer le programme extrait lors de la sortie

Ce que vous devez faire:

  1. Modifier l'application AppFS pour lui faire faire les étapes 2, 3, 4 et 5 de l'énumération précédente.

Je ne vois pas d'autre moyen de le faire. Cette architecture ressemble à l'architecture d'un SFX.

+0

En fait, l'application AppFS exécute un système de fichiers FUSE, elle ne peut donc pas être arrêtée.Néanmoins, j'ai résolu mon propre problème et j'attacherai la solution ci-dessous/ci-dessus. –