ตรวจสอบว่าโฟลเดอร์เป็นระบบไฟล์รีโมตที่เมาท์หรือไม่


43

เป็นวิธีที่ดีที่สุด (เชื่อถือได้พกพา ฯลฯ ) เพื่อตรวจสอบว่าโฟลเดอร์ที่กำหนดอยู่ในระบบไฟล์ระยะไกลติดตั้ง (NFS) ภายในเปลือกสคริปต์คืออะไร?

ฉันกำลังมองหาคำสั่งที่จะมีลักษณะ:

chk-remote-mountpoint /my/path/to/folder 

คำตอบ:


34

ในขณะที่สเตฟานกล่าวว่า "ไม่มีคำตอบ Unix สากล"

ทางออกที่ดีที่สุดที่ฉันได้พบกับคำถามของฉัน:

df -P -T /my/path/to/folder | tail -n +2 | awk '{print $2}'

จะกลับชนิดของระบบแฟ้มตัวอย่างเช่น: หรือnfsext3

-Tตัวเลือกที่ไม่ได้มาตรฐานดังนั้นจึงอาจไม่ทำงานในระบบอื่น ๆ Unix / Linux ...

ตามความเห็นของGilles 'ด้านล่าง: "ใช้งานได้บน Linux ที่ไม่ได้ฝัง แต่ไม่ได้อยู่ใน BusyBox, * BSD, ฯลฯ "


1
สิ่งนี้ใช้ได้กับ Linux ที่ไม่ได้ฝังตัวใด ๆ แต่ไม่ใช่ใน BusyBox, * BSD ฯลฯ ขึ้นอยู่กับคุณที่จะตัดสินใจว่ามันดีพอหรือไม่
Gilles 'หยุดความชั่วร้าย'

การดู/etc/mtabหรือผลลัพธ์mountแทนการใช้dfสามารถทำได้ในบางกรณี
TNW

1
@TNW หรือแม้กระทั่ง/proc/mounts
laebshade

1
เห็นได้ชัดว่าค่าmountหรือ/etc/mtabไม่ได้/proc/mountsมาตรฐานจึงมีการรับประกันที่ไม่มีในสิ่งที่อาจจะพบว่ามี ...
Totor

1
สิ่งนี้ใช้ไม่ได้กับ OSX 10.8 เนื่องจาก-Tมีความหมายแตกต่างกันที่นี่
DavAlPi

13

คุณสามารถใช้ statGNU

%m เพื่อหาจุดเมานต์

$ stat --format=%m /usr/src/linux
/usr/src

%T (ในโหมดระบบไฟล์) เพื่อค้นหาชื่อของระบบไฟล์

$ stat --file-system --format=%T /usr/src/linux
reiserfs

ดังนั้นคุณรู้ว่า/usr/src/linuxในระบบของฉันถูกเก็บไว้ในระบบแฟ้มที่ติดตั้งอยู่บนและมีประเภทระบบแฟ้ม/usr/srcreiserfs

ยังอ้างถึงman statสำหรับการอ้างอิงเพิ่มเติม มันเป็นคำสั่งที่ใช้งานได้หลากหลายมีประโยชน์เกือบทุกครั้งที่คุณต้องการข้อมูลเกี่ยวกับไฟล์และไม่ต้องการถอยกลับไปสู่grep | awkวอร์ด


เวอร์ชันของฉันstatไม่มี%mตัวเลือกสำหรับ--format(ใช้ Debian Squeeze, coreutils 8.5) ดังนั้นฉันเดาว่าโซลูชันนี้ไม่น่าเชื่อถือมาก
Totor

ฉันไม่เชื่อ แต่แตกต่างระหว่าง coreutils 8.5 และ 8.13 (debian wheezy) บอกว่าคุณพูดถูก พิจารณาฉันประหลาดใจมาก :) บีบเป็นเพียงเก่าเกินไป :( ผิดพลาดมีเสถียรภาพมากเกินไป
frostschutz

1
จากการเปลี่ยนแปลง 2010-08-27 <Aaron Burgemeister> stat: add %m to output the mount point for a filecoreutils: เกือบ 3 ปีที่แล้ว น่าประหลาดใจที่เดเบียนยังไม่มีสิ่งนี้
frostschutz

แม้ว่า Debian Squeeze จะวางตลาดเมื่อวันที่ 2011-02-06 มันจะถูกแช่แข็งในวันที่ 2010-08-06 ก่อนที่ coreutils นี้จะเปลี่ยนไป ... ฉันค่อนข้างมองหาวิธีการแก้ปัญหา "มาตรฐาน" ถ้าเป็นไปได้
Totor

คุณสามารถใช้คำสั่งระบบไฟล์% T ได้หากใช้กับสถิติเก่า หากวิธีนี้ใช้ไม่ได้ผลและสถิติเวอร์ชั่นของคุณไม่ได้ให้ข้อมูลที่คุณต้องการให้กลับไปที่วิธีแก้ปัญหาที่น่าอึดอัดใจ
frostschutz

4

mount -lและการใช้งานgrep, sedหรือawkจะหาบรรทัดที่หมายถึงไดเรกทอรีในคำถาม


มันดูซับซ้อนที่จะเข้าใจว่า/my/path/to/the/directoryจริง ๆ แล้วมีบางอย่างจากจุดเมานท์/my/pathพร้อมคำตอบ บางทีคุณอาจจะสามารถให้รายละเอียดบางอย่างเพิ่มเติมเกี่ยวกับgrep, sed, awkคำสั่งที่คุณแนะนำ (คำตอบที่สมบูรณ์) ?.
Totor

mount -l | grep 'type nfs' | sed 's/.* on \([^ ]*\) .*/\1/'ควรให้รายการของจุดเชื่อมต่อ nfs ทั้งหมดบนระบบ
Andy Shulman

สิ่งนี้สามารถรวมกับmount | fgrep "`stat --printf=" on %m type" /var/log/`". The คำสั่งstat: mount` จะพิมพ์จุดเมานต์ทั้งหมดใน<device> on <mountpoint> type <type>รูปแบบ เพื่อ grep นี้ฉันได้stat --printfสร้างon <mountpoint> typeส่วน
MSalters

มีชนิดเมาต์ระบบไฟล์โลคัลและรีโมตจำนวนมาก การมีแผนที่ทั้งหมดอาจจะท้าทาย (ตัวอย่างเช่น drvfs ท้องถิ่นหรือระยะไกล?)
Erik Aronesty

ใช่ แต่คำถามจะถามเฉพาะเกี่ยวกับ nfs: "ระบบไฟล์ระยะไกลที่ติดตั้ง (nfs)"
jayhendren

2

น่าเสียดายที่ Unix ไม่มีคำตอบสากล

สิ่งหนึ่งที่คุณสามารถทำได้สำหรับไฟล์ที่กำหนด/a/b/c/dคือการเดินไปตามเส้นทาง:

  • / a / B / C /
  • / a / B / C / ..
  • /a/b/c/../ ..
  • ...

... และทำstat(2)ในแต่ละระดับจนกว่าจะมีst_devการเปลี่ยนแปลง จากนั้นคุณจะรู้ว่าจุดต่อคืออะไร จากนั้นคุณสามารถค้นหาพา ธ แบบบัญญัติของจุดเมานต์นั้นใน/etc/mtabหรือในผลลัพธ์ของmountเพื่อค้นหาประเภทระบบไฟล์ จากนั้นหาสิ่งที่อยู่ห่างไกลและสิ่งที่จะไม่ยุ่งยากโดยเฉพาะอย่างยิ่งสำหรับคนประเภทฟิวส์ ยกตัวอย่างเช่นnfs, cifs, fuse.sshfs, fuse.davfsที่เห็นได้ชัด แต่สิ่งที่เกี่ยวกับตัวอย่างfuse.gvfs-fuse-daemonหรือfuse.avfsdว่าสามารถมีได้ทั้งไฟล์เครือข่ายและนอกเครือข่าย?


ฉันใช้ nfs ที่นี่ (แก้ไขคำถามของฉัน) สำหรับstat(2)ฉันคิดว่าคุณกำลังอ้างถึงฟังก์ชั่น C แต่ฉันใช้เชลล์ อย่างไรก็ตามst_devอ้างอิงถึง ID อุปกรณ์หลักและรอง (เป็น Linux เฉพาะหรือไม่) และคำสั่งเชลล์stat(1)มี (ไม่ใช่มาตรฐาน) %tและ%Tมี--formatตัวเลือกสำหรับหมายเลขหลักและรองตามลำดับแต่จะส่งกลับ "0" (local และ nfs เสมอ) ) ฉันลองใช้ Debian Squeeze และ Lenny
Totor

คุณลองใช้--file-systemตัวเลือกนี้หรือไม่?
frostschutz

@frostschutz โดยไม่ต้อง --file-systemมันมีความหมายอื่นถ้าใช้กับ
Totor

2

"-l" ถึง df (1) จะล้มเหลวโดยมีข้อผิดพลาดในระบบไฟล์ที่ไม่ได้อยู่ในระบบดังนั้นคุณสามารถใช้ลักษณะการทำงานนี้เพื่อทราบว่าระบบไฟล์นั้นเป็นระยะไกลหรือไม่:

df -l /path 2> /dev/null | grep -q "File"
rc=$?
if [ "$rc" = "0" ]
then
   echo "local mount, do stuff"
fi

อย่างไรก็ตาม-lตัวเลือกที่ไม่ได้มาตรฐาน


นี่ไม่ใช่คำตอบ
2560

@Totor ทำไมไม่? ได้รับมีเหตุผลอื่น ๆ อีกหลายเหตุผลที่dfจะล้มเหลวและเพียงอย่างเดียวทำให้นี่เป็นคำตอบที่ไม่ดีนัก แต่ก็พยายามตอบคำถามดังนั้นฉันจึงไม่เห็นว่าทำไมคุณถึงเรียกมันว่า "ไม่ใช่คำตอบ"
terdon

@terdon ฉันเห็นด้วย ฉันอ่านไม่พอ ขอบคุณที่ชี้นำสิ่งนี้ ฉันจะแก้ไขและลงคะแนน :)
2560

นี่เป็นเพียงสิ่งเดียวที่ทำงานได้อย่างน่าเชื่อถือบน linux
Erik Aronesty

1

df /pathจะบอกคุณว่าเป็นจุดติดถ้ามันบอกว่าติดประเด็นก็คือไม่ได้/path/


1
คำถามหมายถึงจุดเชื่อมต่อระยะไกล
Totor

1

แค่ทำ

df /me/path/to/folder

หากฟิลด์แรก (ระบบไฟล์) อยู่ในรูปแบบโฮสต์: / path คุณจะรู้ว่าเป็น NFS


0

คุณสามารถใช้df -tบน Linux และdf -Tบนระบบ BSD

จากผู้ชาย df :

-t, --type = TYPE

จำกัด รายการไปยังระบบไฟล์ประเภท TYPE

if df -t nfs | grep -q /path/to/folder$; then
  # it is an NFS
fi

ค่อนข้างดี อย่างไรก็ตามและน่าเสียดายที่-tตัวเลือกนั้นมีความหมายแตกต่างกันใน POSIX / SUS ดังนั้นการใช้ตัวเลือกนี้อาจให้ผลลัพธ์ที่ไม่สอดคล้องกันในเวอร์ชันต่าง ๆ บนเครื่องมือ / UNIX
Totor

-2

ฉันจะใช้เป็นการส่วนตัวmountpoint(พกพาได้บน Linux!):

NAME
       mountpoint - see if a directory is a mountpoint

SYNOPSIS
       mountpoint [-d|-q] directory

หรือshowmountต้องการติดตั้งบนระบบใด ๆ ที่ติดตั้งการNFSแชร์ (ส่วนหนึ่งของnfs-commonแพ็คเกจ):

NAME
       showmount - show mount information for an NFS server

SYNOPSIS
       showmount [ -adehv ] [ --all ] [ --directories ] [ --exports ] [ --help ] [ --version ] [ host ]

ตัวเลือกอื่นจะเป็น someting เช่น:

$ mount -l -t nfs | grep 'my mount point'

1
mountpointยูทิลิตี้ไม่ได้บอกคุณถ้าจุดติดเป็นระยะไกล นอกจากนี้ระบบไฟล์ระยะไกลไม่ได้ จำกัด อยู่ที่ระบบไฟล์ NFS สุดท้ายmountpointไม่ใช่มาตรฐาน (ไม่ใช่ในรายการนี้ )
Totor

คุณร้องขอเครื่องมือโดยเฉพาะบน linux และ NFS mountpointเป็นมาตรฐานในกรณีนี้
malat

นี่ไม่ตอบจุดแรกของฉันอยู่ดี
Totor

-3
find . -type d -name nfs -exec mountpoint {} \; | grep not

จะตรวจสอบโฟลเดอร์ทั้งหมดที่ชื่อ 'nfs' หากพวกเขาถูกเมาท์


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