lsof: OSTRZEŻENIE: system plików nie może stat () fuse.gvfsd-fuse

25

Co się tu właściwie dzieje?

root@bob-p7-1298c:/# ls -l /tmp/report.csv && lsof | grep "report.csv"
-rw-r--r-- 1 mysql mysql 1430 Dec  4 12:34 /tmp/report.csv
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      Output information may be incomplete.
jmunsch
źródło
Czy otrzymujesz to ostrzeżenie, gdy wydajesz tylko lsof(bez |i grep)?
Sree
To samo ostrzeżenie pojawia się w obu przypadkach, ale po prostu lsofwyświetla dużą listę otwartych plików. Myślę, że to kwestia poboczna. Pomyślałem, że być może plik został otwarty przez proces i mógł to być powód, dla którego root nie mógł przenieść pliku, ale tak nie jest. Stąd zamieszanie.
jmunsch
1
tak, wygląda na can't stat...to, że to kolejny problem. Zakładam, że prawdziwym problemem jest występujący No such file or directorybłąd. Może to zabrzmieć idiotycznie, ale czy istnieje lokalizacja / home / bob / Desktop?
Sree,

Odpowiedzi:

30

BEZPIECZNIK i jego prawa dostępu

lsofdomyślnie sprawdza wszystkie zamontowane systemy plików, w tym FUSE - systemy plików zaimplementowane w przestrzeni użytkownika, które mają specjalne prawa dostępu w systemie Linux.

Jak widać w tej odpowiedzi na Ask Ubuntu, zamontowany system plików GVFS (specjalny przypadek FUSE) jest zwykle dostępny tylko dla użytkownika, który go zamontował (właściciela gvfsd-fuse). Nawet rootnie ma do niego dostępu. Aby ominąć to ograniczenie, można użyć opcji montowania allow_rooti allow_other. Opcja musi być również włączona w demonie FUSE, który jest opisany na przykład w tej odpowiedzi ... ale w twoim przypadku nie musisz (i nie powinieneś) zmieniać praw dostępu.

Wyłączając systemy plików z lsof

W twoim przypadku lsofnie musisz sprawdzać systemów plików GVFS, abyś mógł wykluczyć stat()wywołania z nich za pomocą -eopcji (lub możesz po prostu zignorować ostrzeżenie):

lsof -e /run/user/1000/gvfs

Sprawdzanie niektórych plików przez lsof

Używasz, lsofaby uzyskać informacje o wszystkich procesach uruchomionych w systemie, a dopiero potem filtrujesz całe dane wyjściowe za pomocą grep. Jeśli chcesz sprawdzić tylko niektóre pliki i powiązane procesy, użyj -fopcji bez wartości bezpośrednio po niej, a następnie podaj listę plików po separatorze „koniec opcji” --. Będzie to znacznie szybsze.

lsof -e /run/user/1000/gvfs -f -- /tmp/report.csv

Ogólne rozwiązanie

Aby wykluczyć wszystkie zamontowane systemy plików, w których stat()nie działa, możesz uruchomić coś takiego bash:

x=(); for a in $(mount | cut -d' ' -f3); do test -e "$a" || x+=("-e$a"); done
lsof "${x[@]}" -f -- /tmp/report.csv

Lub dla pewności użycia stat()( test -emoże być zaimplementowany w inny sposób):

x=(); for a in $(mount | cut -d' ' -f3); do stat --printf= "$a" 2>/dev/null || x+=("-e$a"); done
pabouk
źródło
11

lsofzawsze próbuje uzyskać podstawowe informacje o wszystkich systemach plików, nawet jeśli argumenty sugerują, że żaden system nie uzyska żadnego wyniku. Jeśli nie jest w stanie uzyskać dostępu do systemu plików (w szczególności do wywołania statw punkcie montowania, jak mówi komunikat), narzeka.

Jako root zwykle posiadasz uprawnienia dostępu do systemów plików. Jednak ze względu na wewnętrzne działanie FUSE root nie ma automatycznie wszystkich uprawnień w systemie plików FUSE. To nie jest funkcja bezpieczeństwa (root może stać się użytkownikiem, który jest właścicielem systemu plików i uzyskać w ten sposób dostęp), to techniczne ograniczenie.

GVFS-FUSE to interfejs FUSE do GVFS , który jest mechanizmem, który pozwala aplikacjom Gnome na dostęp do wirtualnych systemów plików zaimplementowanych przez wtyczki Gnome: GVFS zapewnia aplikacjom innym niż Gnome dostęp do tych wirtualnych systemów plików za pośrednictwem zwykłego interfejsu systemu plików.

Gilles „SO- przestań być zły”
źródło