ตรวจสอบว่าอุปกรณ์อยู่ในไดเรกทอรีใด


49

ถ้าฉันทำ

# cd /
# ln -s /home test
# cd test
# mount --bind $PWD /mnt

รายการใน/proc/mountsคือ

/dev/sda2 /mnt ext4 rw,noatime,data=ordered 0 0

ซึ่งเป็นอุปกรณ์ที่ติดตั้งไป/homeและไม่ได้เป็น deducible จากได้อย่างง่ายดายซึ่งเป็น$PWD /testฉันจะทราบได้อย่างไรว่าอุปกรณ์ใด (เช่น / dev / sda2) จะแสดง/proc/mountsโดยทั่วไปเนื่องจาก bind mount นั้นอาจจะอยู่ในไดเรคทอรี / ไฟล์ที่อาจ "บดบัง" โดย symlinks, bind mount อื่น ๆ ฯลฯ ?

คำตอบ:


49

หากฉันเข้าใจคำถามของคุณคุณต้องการทราบว่าอุปกรณ์ใดที่ใช้สำหรับการเมาท์ที่กำหนด สำหรับสิ่งนี้คุณสามารถใช้dfคำสั่ง:

$ df -h 
Filesystem                         Size  Used Avail Use% Mounted on
/dev/mapper/fedora_greeneggs-root   50G   21G   27G  44% /
devtmpfs                           3.8G     0  3.8G   0% /dev
tmpfs                              3.8G   14M  3.8G   1% /dev/shm
tmpfs                              3.8G  984K  3.8G   1% /run
tmpfs                              3.8G     0  3.8G   0% /sys/fs/cgroup
tmpfs                              3.8G  3.4M  3.8G   1% /tmp
/dev/sda1                          477M   99M  349M  23% /boot
/dev/mapper/fedora_greeneggs-home  402G  184G  198G  49% /home

เพื่อหาที่อุปกรณ์แฟ้มเฉพาะ directory / dfพบในให้ไฟล์เป็นอาร์กิวเมนต์ไปยัง ใช้ตัวอย่างของคุณ:

$ df -h /mnt
Filesystem                         Size  Used Avail Use% Mounted on
/dev/sda1                          477M   99M  349M  23% /

คุณยังสามารถใช้mountคำสั่ง:

$ mount | grep '^/dev'
/dev/mapper/fedora_greeneggs-root on / type ext4 (rw,relatime,seclabel,data=ordered)
/dev/sda1 on /boot type ext4 (rw,relatime,seclabel,data=ordered)
/dev/mapper/fedora_greeneggs-home on /home type ext4 (rw,relatime,seclabel,data=ordered)

ไดเร็กทอรีที่เมาท์สำหรับแต่ละอุปกรณ์คืออาร์กิวเมนต์ที่ 3 ในเอาต์พุตด้านบน ดังนั้นสำหรับอุปกรณ์ที่จะเป็น/dev/sda1 /bootอุปกรณ์อื่นกำลังใช้ประโยชน์จาก LVM (การจัดการปริมาณแบบลอจิคัล) และจะต้องมีการสอบถามเพิ่มเติมเพื่อทราบว่ามีการใช้อุปกรณ์จริงใดโดย LVM


หาก$PWD(ซึ่งเป็นสิ่งที่ฉันกำลังติดตั้ง) ถูกฝังอยู่ในชุดของ symlinks ผูกติด ฯลฯ จากนั้นฉันจะต้องตรวจสอบเส้นทางซ้ำสำหรับจุดที่ติดตั้งซ้ำ
StrongBad

ด้วย bind mounts แม้จะมีสิ่งที่ปรากฏใน/proc/mounts"สิ่งของ" ที่ติดตั้งอย่างน้อยก็ในใจของฉันไม่ใช่อุปกรณ์ที่เป็นไดเรกทอรี / ไฟล์
StrongBad

@StongBad - readlink -f /mntแสดงอะไร
slm

2
@ StrongBad หากคุณต้องจัดการกับการกำหนดจุดเชื่อมต่อ / อุปกรณ์เมื่อบดบังด้วย symlink คุณควรใส่ในคำถามของคุณ มันจะทำให้ง่ายขึ้นมากที่จะได้คำตอบที่ถูกต้อง
Patrick

readlink -f /mntให้/mnt
StrongBad

29

บน Linux ที่เราได้findmntจากการutil-linuxทำว่าสำหรับเรื่องนี้

findmnt -n -o SOURCE --target /path/to/FILE

ข้อได้เปรียบเกี่ยวกับการแก้ปัญหาอื่น ๆ คือมันยังคงใช้งานได้หากเส้นทางถูกบดบังด้วย symlink หรือการเชื่อมต่อ bind ที่ซ้ำกัน


มันไม่ได้ผลสำหรับฉัน มันแสดงให้เห็นแหล่งที่มาของการเมานต์ทุกตัวในระบบ findmnt จาก util-linux 2.23.2
bwduncan

@bwduncan สำหรับฉันมันใช้งานได้กับ 2.23.2 อาจจะเป็นข้อผิดพลาด? คุณลองรุ่นล่าสุด 2.29.2 ได้ไหม
rudimeier

2.29 บน Ubuntu ทำเคล็ดลับ ไม่ใช่ข้อผิดพลาดเช่นนี้เพิ่มฟีเจอร์ :)
bwduncan

1
ขอบคุณ! นั่นคือสิ่งที่ฉันต้องการสำหรับสคริปต์ของระบบ
2560

11

วิธีที่แม่นยำที่สุดที่ฉันทราบคือใช้เอาต์พุตของการเรียกระบบ lstat () โดยเฉพาะอย่างยิ่งฟิลด์ st_dev มียูทิลิตีบรรทัดคำสั่ง stat (1) ที่สามารถใช้เพื่อดูข้อมูลนี้ ตัวอย่างเช่นผลลัพธ์ของ "stat / etc / issue" บนแล็ปท็อปของฉัน:

File: ‘/etc/issue’
  Size: 65          Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d  Inode: 1610916043  Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)

สังเกตุบรรทัดที่สามฟิลด์แรก "อุปกรณ์" ที่นี่มันแสดงรายการ 801h ค่านั้นสามารถแยกออกเป็นสองไบต์ 8 และ 1 ไบต์แรกเรียกว่าหมายเลขหลักไบต์ที่สองคือหมายเลขรอง ดังนั้นขั้นตอนต่อไปคือการค้นหาว่าอุปกรณ์หลัก 8, รอง 1 คืออะไร

ฉันพบว่าการให้คำปรึกษา / proc / พาร์ทิชันจะเร็วที่สุด ในกรณีของฉัน / proc / พาร์ทิชันมีเนื้อหา:

major minor  #blocks  name

   8       16  234431064 sdb
   8       17   33554432 sdb1
   8       18  200875608 sdb2
   8        0  500107608 sda
   8        1  500106584 sda1

มันค่อนข้างชัดเจนจากผลลัพธ์นั้นที่สำคัญ 8, รอง 1 คือ sda1 เราสามารถยืนยันได้ด้วย ls -l / dev / sda1

brw-rw---- 1 root disk 8, 1 May  8 05:33 /dev/sda1

สังเกตว่า 8, 1 ก่อน dateramp

สิ่งสำคัญคือต้องเข้าใจ / จำไว้ว่าชื่อของไฟล์อุปกรณ์เช่น / dev / sda1 เป็นเพียงฉลาก หมายเลขหลักและรองคือค่าสำคัญและสำคัญของไฟล์อุปกรณ์ หากคุณอยากรู้อยากเห็นตรวจสอบยูทิลิตี้ mknod (1) ที่ใช้ในการสร้างไฟล์อุปกรณ์ ฉันสามารถสร้างรายการใหม่ / dev ที่เรียกว่า aardvark ด้วย major 8, รอง 18, ด้วยไวยากรณ์ต่อไปนี้:

mknod /dev/aardvark b 8 18

จากนั้นฉันสามารถติดตั้งได้อย่างง่ายดาย:

mount /dev/aardvark /mnt

และถ้าเราดูผลลัพธ์ของคำสั่ง mount หรือเนื้อหาของ / proc / mounts และเราเห็น:

/dev/aardvark on /mnt type xfs (rw,relatime,attr2,inode64,noquota)

df -h แสดง:

/dev/aardvark   192G  154G   38G  81% /mnt

... ยังไงก็ตามประเด็นทั้งหมดนี้ก็เพื่อแสดงให้เห็นว่ารายละเอียดที่สำคัญสำหรับการระบุอุปกรณ์บล็อกคือหมายเลขหลักและรอง - ไม่ใช่ฉลากไฟล์ของอุปกรณ์ - และการใช้การเรียกระบบ lstat () เป็นวิธีที่ดีที่สุดในการ สอบถามค่าเหล่านั้น

ในฐานะที่เป็นความคิดเห็นล่าสุดฉันเพิ่งอ่านคำถามของคุณอีกครั้งเพื่อให้แน่ใจว่าฉันตอบคำถามแล้วและฉันก็รู้ว่าคุณกำลังถามว่าฉลากอุปกรณ์แหล่งข้อมูลใดจะแสดงใน / proc / mounts สำหรับการเชื่อมต่อแบบผูก นั่นจะเป็นป้ายชื่อของอุปกรณ์ต้นทางเดียวกันกับที่ใช้ในการเรียกใช้เมานต์ (2) ต้นฉบับสำหรับแหล่งจุดติดตั้งระบบไฟล์สำหรับการเชื่อมต่อแบบ bind บางทีตัวอย่างจะช่วย:

ฉันมี / dev / sdb2 และ / dev / aardvark (เหมือนข้างบน) พวกเขาทั้ง 8 หลักรองลงมา 18 หมายเหตุฉันจะติดตั้งระบบไฟล์เดียวกันสองครั้ง ฉันทำต่อไปนี้:

mkdir /mnt1 /mnt2 /foo

mount /dev/aardvark /mnt1
mount /dev/sdb2 /mnt2

โปรดสังเกตว่าฉันทำไดเรกทอรี somedir ใน / mnt1 แต่เนื่องจาก / mnt1 และ / mnt2 มีการติดตั้งระบบไฟล์เดียวกัน somedir จะสามารถเข้าถึงได้ผ่าน / mnt2

mkdir /mnt1/somedir

mkdir /foo/left /foo/right

mount -o bind /mnt1/somedir /foo/left
mount -o bind /mnt2/somedir /foo/right

ตอนนี้ถ้าเราตรวจสอบ / proc / mounts เราจะเห็น:

/dev/aardvark /mnt1 xfs rw,relatime,attr2,inode64,noquota 0 0
/dev/sdb2 /mnt2 xfs rw,relatime,attr2,inode64,noquota 0 0
/dev/aardvark /foo/left xfs rw,relatime,attr2,inode64,noquota 0 0
/dev/sdb2 /foo/right xfs rw,relatime,attr2,inode64,noquota 0 0

เลเบลของอุปกรณ์ต้นทางบน / foo / ... bind mounts จะเหมือนกับค่าที่ให้มาในการเรียกเมานต์ระบบไฟล์ (2) จำไว้ว่า / dev / aardvark และ / dev / sdb2 ในตัวอย่างของฉันเป็นอุปกรณ์เดียวกัน

ฉันรู้ว่าฉันเพิ่งพิมพ์นวนิยายขึ้นมาและครึ่งแรกไม่ได้ตอบคำถามของคุณเลย แต่ดูเหมือนว่าจะเป็นการลบทิ้ง บางทีมันอาจช่วยคนอื่นได้

โชคดี.

PS โปรดจำไว้ว่าระบบไฟล์บางระบบนั้นใช้เครือข่ายเช่น NFS หรือ CIFS หรือเสมือนจริงเช่น procfs หรือ sysfs และไม่มีอุปกรณ์บล็อกต้นทาง ฉันไม่ทราบว่าจะส่งคืนอะไรเป็นอุปกรณ์ในเอาต์พุต stat เพียงเพื่อสิ่งที่คุ้มค่า


1
ส่วนแรกแน่นอนช่วยให้ฉันเข้าใจส่วนสุดท้าย
StrongBad

คำตอบนี้ใช้ไม่ได้กับพา ธ tmpfs คุณจะไม่พบ st_dev รองที่สำคัญใน / proc / พาร์ทิชัน
mbello

@mbello ตามที่ฉันพูดถึงในตอนท้ายของคำตอบของฉันวิธีนี้จะไม่และไม่สามารถใช้ได้กับระบบไฟล์ที่ไม่มีอุปกรณ์สำรอง - เช่นการติดตั้ง tmpfs
etherfish

2

ได้รับเมานต์ทั่วไปดังต่อไปนี้:

$ df --output=target
Mounted on
/
/dev
/run
/sys/fs/cgroup
/run/lock
/run/shm
/run/user

stat --format %m <path> จะพิมพ์เฉพาะจุดยึดในแบบวนรอบ (แม้ว่าคุณจะต้องตรวจสอบรหัสออกเพื่อตรวจหาข้อผิดพลาดในการอนุญาตอย่างไม่น่าสงสัยแนวทางการติดตั้งแบบตารางชนะที่นี่):

$ stat --format %m /
/
$ stat --format %m /tmp
/
$ stat --format %m /proc
/proc
$ stat --format %m /run
/run
$ stat --format %m /run/mount
/run
$ stat --format %m /run/user
/run/user
$ stat --format %m /run/user/1000/dconf
/run/user
$ stat --format %m /run/user/1000/gvfs
/run/user/1000/gvfs

Symlinks ใช้ความระมัดระวังตามปกติ:

$ ls -lh ~/.gvfs
/home/cwillu/.gvfs -> /run/user/1000/gvfs
$ stat --format %m ~/.gvfs
/run/user/1000/gvfs
$ stat --format %m ~/.gvfs
/

และแน่นอนอย่าลืมใช้เครื่องหมายคำพูดเมื่อสคริปต์ พิจารณาพา ธ พอยต์ที่มีช่องว่างและเช่น:

$ mkdir /tmp/Something\ Like\ This\!
$ sudo mount none /tmp/Something\ Like\ This\! -t tmpfs
$ stat --format %m /tmp/Something\ Like\ This\!
/tmp/Something Like This!
$ touch /tmp/Something\ Like\ This\!/pretend-I\'m-big
$ ls /tmp/Something\ Like\ This\!
pretend-I'm-big

วิธีการใหญ่เป็นคุณ?

$ du $(stat --format %m /tmp/Something\ Like\ This\!/)
du: cannot access /tmp/Something: No such file or directory
du: cannot access Like: No such file or directory
du: cannot access This!: No such file or directory

$ du "$(stat --format %m /tmp/Something\ Like\ This\!/)"
0   /tmp/Something Like This!

ความสมบูรณ์ของแท็บ distro ของฉันไม่ได้รับสิทธิ์นี้ดังนั้นเราจะใส่สัญลักษณ์เมานต์ตัวอย่างนี้ด้วยการขึ้นบรรทัดใหม่และ linefeeds และการวิ่งของช่องว่าง:

$ stat --format %m /tmp/Something*
/tmp/Something   
Like   This!

$ a="$(stat --format %m /tmp/Something*)"
    # the above assignment is actually the one place you don't need quotes, 
    # but `export a=...` or similar _would_ need them, so we'll just put them in;
    # they don't change the behaviour in this form of assignment.

$ stat "$a"
  File: ‘/tmp/Something   \r\n\rLike   This!’
  Size: 40          Blocks: 0          IO Block: 4096   directory
Device: 7bh/123d    Inode: 1279171     Links: 2
Access: (1777/drwxrwxrwt)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-09-30 11:43:17.933467344 -0600
Modify: 2016-09-30 11:43:17.933467344 -0600
Change: 2016-09-30 11:43:17.933467344 -0600
 Birth: -

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