Jak używać potoków inotify lub nazwanych przez SSHFS?

12

Dzięki sshfsmagii, mogę zamontować mój katalog domowy ze zdalnego serwera za pomocą

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

Optymistycznie pomyślałem, że inotifyustawię lokalny hak na ~/remote/logFile(w sshfsmontażu), aby lokalny program mógł zareagować na zdalne zmiany dziennika.

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

Nic się nie dzieje . inotifywaitmilczy, chyba że touchplik jest lokalnie. Zapisywanie do nazwanego potoku kończy się podobnie.

Dlaczego to?
Jak mogę wypełnić tę lukę?

I mógłby działać inotifywaitna pilocie, włamywania się na zmianę strategii serializacji systemu plików i utrzymania połączenia lokalne, ale ja w zasadzie reimplementing SSHFS . I to całkowicie zabija abstrakcję.

Anko
źródło
2
Nie sądzę, aby istniał sposób, aby inotifyw systemie lokalnym można było wykryć zmiany w zdalnym systemie plików. W tych zmianach lokalne jądro jest poza pętlą. Musisz uruchomić inotifywaitna serwerze, a nie na kliencie.
Barmar
@Barmar Ale wtedy klient (komputer lokalny) nie będzie wiedział o zmianach. Zredagowałem, aby trochę o tym dodać.
Anko,
Zasadniczo sieciowe systemy plików nie są w stanie zapewnić pełnej przejrzystości, często przerywają abstrakcję. Potrzebne jest rozszerzenie do SSHFS - kiedy uruchomisz inotify lokalnie, musi on wysłać żądanie do serwera, który tam uruchamia inotify i przesyła powiadomienia z powrotem do klienta.
Barmar
sprawdziłeś gamin?
Janus Troelsen,
@JanusTroelsen Nie słyszałem o gaminie. Według strony przeglądu używa on również inotify. Czy jest to przydatne do dystrybucji takich aktualizacji przez sieć?
Anko,

Odpowiedzi:

10

System plików SSHFS jest zbudowany na protokole SFTP . SFTP zapewnia jedynie narzędzia do manipulowania plikami w „klasyczny” sposób; klient wysyła żądanie do serwera (wyświetla katalog, przesyła plik itp.), a serwer odpowiada. W tym protokole nie ma możliwości, aby serwer spontanicznie powiadomił klienta, że ​​coś się stało.

Uniemożliwia to zapewnienie funkcji takiej jak inotify w SSHFS. Możliwe byłoby rozszerzenie SSHFS o zastrzeżone rozszerzenia lub uzupełnienie go o pełnoprawne połączenie SSH; ale nie znam żadnego takiego rozszerzenia SSHFS.

Nazwanych potoków nie można zaimplementować na SSHFS z tego samego powodu. NFS, klasyczny sieciowy system plików, nie ma też żadnej funkcji do obsługi nazwanych potoków między maszynami. W sieciowym systemie plików nazwany potok tworzy niezależny punkt komunikacji na każdym komputerze, na którym jest zamontowany (oprócz serwera).

FAM (analog inotify w SGI IRIX, który został przeniesiony do Linuksa) zapewnia demona, który umożliwia wysyłanie powiadomień przez sieć. Linux raczej przestarzał FAM od czasu pojawienia się inotify, więc nie wiem, czy uruchomienie FAM byłoby łatwiejsze niż uruchomienie własnego systemu powiadomień specyficznych dla aplikacji. Musisz skonfigurować przekierowanie portów przez SSH lub VPN, aby zabezpieczyć łącze sieciowe dla FAM i NFS.

Jeśli zdecydujesz się na własne, zakładając, że nie masz nic przeciwko udzieleniu dostępu do powłoki klienta, dość łatwo jest uruchomić monitor inotify w imieniu klienta: poproś klienta, aby otworzył połączenie SSH i uruchom inotifywaitpolecenie na serwerze , analizuje swoje dane wyjściowe na kliencie. Możesz skonfigurować połączenie główne, aby przyspieszyć otwieranie wielu połączeń od tego samego klienta do tego samego serwera.

Gilles „SO- przestań być zły”
źródło
1
przynajmniej qemu obsługuje rodzaj potoku między maszynami: potok do wirtualnego gościa
Janus Troelsen