lsof: ПОПЕРЕДЖЕННЯ: не може stat () файлова система fuse.gvfsd-fuse


25

Що саме тут відбувається?

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.

Чи отримуєте ви це попередження, коли ви видаєте лише lsof(без |і греп)?
Sree

Це ж попередження відбувається в будь-якому випадку, але просто lsofвиводить великий список відкритих файлів. Я думаю, що це побічне питання. Я подумав, що, можливо, цей файл був відкритий процесом, і це, можливо, було причиною того, що root не зміг перемістити файл, але, здається, це не так. Звідси плутанина.
jmunsch

1
так, схоже, це can't stat...вже інше питання. Я припускаю, що справжньою проблемою є No such file or directoryпомилка, яку ви отримуєте. Це може здатися ідіотським, але чи існує місцезнаходження / home / bob / Desktop?
Sree

Відповіді:


30

FUSE та його права доступу

lsofза замовчуванням перевіряє всі встановлені файлові системи, включаючи файлові системи FUSE, реалізовані в просторі користувача, які мають спеціальні права доступу в Linux.

Як ви бачите в цій відповіді на запитанні Ubuntu, змонтована файлова система GVFS (особливий випадок FUSE) зазвичай доступна лише користувачеві, який її встановив (власнику gvfsd-fuse). Навіть rootне можете отримати доступ до нього. Щоб замінити це обмеження, можна використовувати параметри кріплення allow_rootта allow_other. Цей параметр також повинен бути включений у демон FUSE, який описаний, наприклад, у цій відповіді ... але у вашому випадку вам не потрібно (і не слід) змінювати права доступу.

Виключення файлових систем з lsof

У вашому випадку lsofне потрібно перевіряти файлові системи GVFS, щоб ви могли виключити stat()дзвінки на них за допомогою -eпараметра (або ви можете просто проігнорувати попередження):

lsof -e /run/user/1000/gvfs

Перевірка певних файлів lsof

Ви використовуєте lsofдля отримання інформації про всі процеси, що працюють у вашій системі, і лише тоді ви фільтруєте повний вихід, використовуючи grep. Якщо ви хочете перевірити лише певні файли та пов'язані з цим процеси, використовуйте -fпараметр без значення, яке знаходиться безпосередньо за ним, тоді вкажіть список файлів після роздільника "кінця параметрів" --. Це буде значно швидше.

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

Загальне рішення

Щоб виключити всі змонтовані файлові системи, на яких stat()не вдалося, можна запустити щось подібне (in bash):

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

Або обов'язково використовувати stat()( test -eможна було б реалізувати іншим способом):

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

11

lsofзавжди намагається отримати якусь основну інформацію про всі файлові системи, навіть якщо аргументи мають на увазі, що результат не прийде від певної файлової системи. Якщо він не може отримати доступ до файлової системи (зокрема, дзвонити statв її місце монтажу, як йдеться в повідомленні), він скаржиться.

Як root, ви, як правило, маєте дозвіл на доступ до файлових систем. Однак, завдяки внутрішній роботі FUSE , root автоматично не має всіх повноважень у файловій системі FUSE. Це не функція безпеки (root може стати користувачем, який володіє файловою системою і таким чином отримати доступ), це технічне обмеження.

GVFS-FUSE - це інтерфейс FUSE до GVFS , який є механізмом, який дозволяє програмам Gnome отримати доступ до віртуальних файлових систем, реалізованих плагінами Gnome: GVFS надає додаткам, які не є Gnome, доступу до цих віртуальних файлових систем через звичайний інтерфейс файлової системи.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.