Comment utiliser les canaux inotify ou nommés sur SSHFS?

12

Merci la sshfsmagie, je peux monter mon répertoire personnel à partir d'un serveur distant avec

sshfs user@server:/home/user ~/remote

Optimiste, je pensais que je serais mis local inotify-hook sur ~/remote/logFile(dans le sshfsmontage) donc un programme local peut réagir aux changements de journaux à distance.

cd ~/remote
touch logFile                                # create remote file
inotifywait logFile &                        # set up local inotify-hook
ssh user@server -x touch /home/user/logFile  # touch file from remote

Rien ne se passe . inotifywaitest silencieux, sauf si je touchle fichier localement. L'écriture dans un canal nommé échoue de la même manière.

Pourquoi est-ce?
Comment puis-je combler cet écart?

Je pourrais exécuter inotifywaitsur la télécommande, pirater une stratégie de sérialisation de changement de système de fichiers et maintenir une connexion au local, mais je réimplémente essentiellement SSHFS . Et cela tue complètement l'abstraction.

Anko
la source
2
Je ne pense pas qu'il existe un moyen inotifysur le système local de détecter les changements sur un système de fichiers distant. Le noyau local est hors de la boucle dans ces changements. Vous devez exécuter inotifywaitsur le serveur, pas sur le client.
Barmar
@Barmar Mais alors le client (machine locale) ne sera pas au courant des changements. J'ai modifié pour ajouter un peu à ce sujet.
Anko
En général, les systèmes de fichiers réseau ne sont pas en mesure de fournir une transparence complète, ils cassent souvent l'abstraction. Ce qui est nécessaire est une amélioration de SSHFS - lorsque vous exécutez inotify localement, il doit envoyer la demande au serveur, qui exécute inotify là-bas et transmet les notifications au client.
Barmar
avez-vous vérifié gamin?
Janus Troelsen
@JanusTroelsen Je n'ai pas entendu parler de gamin. Selon sa page de présentation, il utilise également inotify. Est-il utile pour distribuer ces mises à jour sur un réseau?
Anko

Réponses:

10

Le système de fichiers SSHFS est construit au-dessus du protocole SFTP . SFTP fournit uniquement des fonctionnalités pour manipuler les fichiers de manière «classique»; le client fait une demande au serveur (lister un répertoire, télécharger un fichier, etc.), et le serveur répond. Il n'y a aucune facilité dans ce protocole pour que le serveur informe spontanément le client que quelque chose s'est produit.

Il est donc impossible de fournir une fonctionnalité telle que inotify dans SSHFS. Il serait possible d'étendre SSHFS avec des extensions propriétaires, ou de le compléter avec une connexion SSH à part entière; mais je ne connais pas une telle extension à SSHFS.

Les canaux nommés ne peuvent pas être implémentés au-dessus de SSHFS pour la même raison. NFS, le système de fichiers en réseau classique, n'a pas non plus la possibilité de prendre en charge les canaux nommés inter-machines. Sur un système de fichiers en réseau, un canal nommé crée un point de communication indépendant sur chacune des machines où il est monté (en plus du serveur).

FAM (l'analogue inotify dans SGI IRIX, qui a été porté sur Linux) fournit un démon qui permet d'envoyer des notifications sur le réseau. Linux a plutôt déprécié FAM depuis que inotify est entré en scène, donc je ne sais pas si faire fonctionner FAM serait plus facile que de lancer votre propre système de notification spécifique à l'application. Vous devez configurer une redirection de port via SSH ou établir un VPN afin de sécuriser la liaison réseau pour FAM et NFS.

Si vous choisissez de lancer le vôtre, en supposant que vous êtes d'accord pour donner l'accès au shell des clients, il est assez facile d'exécuter un moniteur inotify au nom d'un client: demandez au client d'ouvrir une connexion SSH et exécutez la inotifywaitcommande sur le serveur , en analysant sa sortie sur le client. Vous pouvez configurer une connexion principale pour accélérer l'ouverture de nombreuses connexions du même client au même serveur.

Gilles 'SO- arrête d'être méchant'
la source
1
au moins qemu supporte une sorte de pipe cross-machine: une pipe vers l'invité virtuel
Janus Troelsen