Come posso usare inotify o named pipe su SSHFS?


12

Grazie alla sshfsmagia, posso montare la mia home directory da un server remoto con

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

Ottimisticamente, ho pensato di impostare un locale inotify-hook sul ~/remote/logFile(nel sshfsmontaggio), in modo da un programma locale può reagire ai cambiamenti di log remoti.

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

Non succede niente . inotifywaitè silenzioso a meno che non sia touchil file localmente. La scrittura su una pipe denominata non riesce allo stesso modo.

Perchè è questo?
Come posso colmare questa lacuna?

Ho potuto correre inotifywaitsul telecomando, incidere una strategia serializzazione cambiamento di sistema di file e mantenere una connessione con il locale, ma poi ho praticamente reimplementare SSHFS . E uccide completamente l'astrazione.


2
Non credo che inotifysul sistema locale sia possibile rilevare eventuali modifiche su un file system remoto. Il kernel locale è fuori dal circuito in queste modifiche. È necessario eseguire inotifywaitsul server, non sul client.
Barmar,

@Barmar Ma poi il client (macchina locale) non sarà a conoscenza delle modifiche. Ho modificato per aggiungere un po 'a tale proposito.
Anko,

In generale, i file system di rete non sono in grado di fornire una completa trasparenza, spesso interrompono l'astrazione. Ciò che serve è un miglioramento a SSHFS: quando si esegue inotify localmente, è necessario inviare la richiesta al server, che esegue inotify lì e restituisce le notifiche al client.
Barmar,

hai controllato gamin?
Janus Troelsen,

@JanusTroelsen Non ho mai sentito parlare di Gamin. Secondo la sua pagina panoramica , usa anche inotify. È utile per distribuire tali aggiornamenti su una rete?
Anko,

Risposte:


10

Il filesystem SSHFS è basato sul protocollo SFTP . SFTP fornisce solo funzionalità per manipolare i file in modo "classico"; il client effettua una richiesta al server (elenca una directory, carica un file, ecc.) e il server risponde. In questo protocollo non esiste alcuna possibilità per il server di notificare spontaneamente al client che è successo qualcosa.

Ciò rende impossibile fornire una struttura come inotify all'interno di SSHFS. Sarebbe possibile estendere SSHFS con estensioni proprietarie o integrarlo con una connessione SSH a tutti gli effetti; ma non conosco alcuna estensione del genere a SSHFS.

Le pipe nominate non possono essere implementate su SSHFS per lo stesso motivo. NFS, il classico filesystem collegato in rete, non ha alcuna possibilità di supportare tra-pipe denominate pipe. Su un filesystem in rete, una pipe denominata crea un punto di comunicazione indipendente su ciascuna delle macchine su cui è montata (oltre al server).

FAM (l'analogo inotify in SGI IRIX, che è stato portato su Linux) fornisce un demone che consente l'invio di notifiche sulla rete. Linux ha piuttosto deprecato FAM dal momento in cui inotify è apparso sulla scena, quindi non so se far funzionare FAM sarebbe più facile che implementare il proprio sistema di notifica specifico dell'applicazione. Dovresti impostare un port forwarding su SSH o stabilire una VPN per proteggere il collegamento di rete per FAM e NFS.

Se si sceglie di eseguire il roll-up personale, supponendo che si stia accettando l'accesso ai client alla shell, è abbastanza semplice eseguire un monitor inotify per conto di un client: fare in modo che il client apra una connessione SSH ed esegua il inotifywaitcomando sul server , analizzandone l'output sul client. È possibile impostare una connessione principale per rendere più veloce l'apertura di più connessioni dallo stesso client allo stesso server.


1
almeno qemu supporta una sorta di pipe cross-machine: una pipe per l'ospite virtuale
Janus Troelsen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.