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(โดยไม่ต้อง|และ grep)?
Sree

คำเตือนแบบเดียวกันนั้นเกิดขึ้นไม่ว่าจะทางใดทางหนึ่ง แต่เพียงแค่lsofส่งออกรายการไฟล์ที่เปิดขนาดใหญ่ ฉันคิดว่ามันเป็นปัญหาด้าน ฉันคิดว่าบางทีไฟล์อาจถูกเปิดค้างไว้โดยกระบวนการและนั่นอาจเป็นสาเหตุที่ทำให้รูทไม่สามารถย้ายไฟล์ได้ แต่ดูเหมือนจะไม่เป็นเช่นนั้น ดังนั้นความสับสน
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ไม่สามารถเข้าถึงได้ เมื่อต้องการแทนที่ข้อ จำกัด นี้ก็เป็นไปได้ที่จะใช้ตัวเลือก mount และallow_root allow_otherตัวเลือกจะต้องเปิดใช้งานใน FUSE daemon ซึ่งอธิบายไว้ในคำตอบนี้... แต่ในกรณีของคุณคุณไม่จำเป็นต้อง (และไม่ควร) เปลี่ยนสิทธิ์การเข้าถึง

ไม่รวมระบบไฟล์จาก 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()ล้มเหลวคุณสามารถเรียกใช้สิ่งนี้ (ใน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ที่จุดเชื่อมต่อตามที่ข้อความระบุ) แสดงว่ามันบ่น

ตามปกติแล้วคุณจะได้รับอนุญาตให้เข้าถึงระบบไฟล์ อย่างไรก็ตามเนื่องจากการทำงานภายในของFUSEรูตจึงไม่มีอำนาจทั้งหมดในระบบไฟล์ FUSE โดยอัตโนมัติ นี่ไม่ใช่คุณลักษณะด้านความปลอดภัย (รูทสามารถกลายเป็นผู้ใช้ที่เป็นเจ้าของระบบไฟล์และเข้าถึงได้ด้วยวิธีนี้) มันเป็นข้อ จำกัด ทางเทคนิค

GVFS-FUSE เป็นอินเตอร์เฟส FUSE สำหรับGVFSซึ่งเป็นกลไกที่อนุญาตให้แอปพลิเคชัน Gnome เข้าถึงระบบไฟล์เสมือนที่ใช้งานโดยปลั๊กอิน Gnome: GVFS ให้แอปพลิเคชันที่ไม่ใช่ Gnome เข้าถึงระบบไฟล์เสมือนเหล่านี้ผ่านทางระบบไฟล์ทั่วไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.