निर्धारित करें कि निर्देशिका किस डिवाइस पर स्थित है


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और $PWDजो आसानी से काटे जाने योग्य नहीं है /test। मैं यह कैसे निर्धारित कर सकता हूं कि कौन सा डिवाइस (यानी, / देव / sda2) /proc/mountsसामान्य रूप से दिखाने के लिए जा रहा है कि बाइंड माउंट एक निर्देशिका / फ़ाइल के लिए हो सकता है जो संभवतः सहानुभूति, अन्य बाइंड माउंट, आदि द्वारा "अस्पष्ट" है?

जवाबों:


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

यह पता लगाने के लिए कि किस डिवाइस पर एक विशेष फ़ाइल / निर्देशिका पाई जाती है, फ़ाइल को एक तर्क के रूप में दें 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)

प्रत्येक डिवाइस के लिए मुहिम शुरू की गई निर्देशिका उपरोक्त आउटपुट में तीसरा तर्क है। तो डिवाइस के लिए /dev/sda1होगा /boot। अन्य उपकरण LVM (लॉजिकल वॉल्यूम मैनेजमेंट) का उपयोग कर रहे हैं और यह जानने के लिए और अधिक सतर्क रहने की आवश्यकता है कि LVM द्वारा किस वास्तविक उपकरण का उपयोग किया जा रहा है।


अगर $PWD(जो मैं बढ़ रहा हूं) सिमिलिंक, बाइंड माउंट आदि की एक श्रृंखला में दफन है, तो मुझे माउंट पॉइंट्स के लिए पथ की पुन: जांच करने की आवश्यकता होगी।
स्ट्रॉन्गबैड

बाइंड माउंट्स के साथ, /proc/mountsजो "चीज़" में दिखाया गया है , जो माउंटेड होने के बावजूद , कम से कम मेरे दिमाग में है, यह वह डिवाइस नहीं है जो यह डायरेक्टरी / फाइल है।
स्ट्रांगबड

@StrongBad - क्या readlink -f /mntदिखाता है?
स्लम

2
यदि आप सिम्बलिंक द्वारा अस्पष्ट होने पर आरोह बिंदु / डिवाइस का निर्धारण करने से निपटते हैं, तो आपको अपने सवाल में कहना चाहिए। यह सही जवाब पाने के लिए बहुत आसान बना देगा।
पैट्रिक

readlink -f /mntदेता है/mnt
StrongBad

29

लिनक्स पर हम है findmntसे util-linuxवास्तव में इस के लिए बनाया

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

अन्य समाधानों के बारे में लाभ यह है कि यह अभी भी काम करता है अगर पथ को सीक्लिंक्स या डुप्लिकेट बाइंड माउंट्स द्वारा अस्पष्ट किया जाता है।


यह मेरे लिए काम नहीं करता है। यह सिस्टम पर हर माउंट के स्रोत को दर्शाता है। findmnt from use-linux 2.23.2
bwduncan

मेरे लिए @bwduncan यह 2.23.2 के साथ काम करता है। शायद एक बग? क्या आप नवीनतम संस्करण 2.29.2 आज़मा सकते हैं?
रदिमीयर

२.२ ९ उबंटू पर करता है। बग जैसा नहीं, अधिक विशेषता :)
bwduncan

1
धन्यवाद! ठीक ऐसा ही मुझे एक सिस्टम स्क्रिप्ट के लिए चाहिए था।
वोग

11

सबसे सटीक तरीका जिससे मैं अवगत हूं, वह है lstat () सिस्टम कॉल के आउटपुट का उपयोग करना। विशेष रूप से, st_dev क्षेत्र। एक कमांड लाइन उपयोगिता है, स्टेट (1) जिसका उपयोग इस जानकारी को देखने के लिए किया जा सकता है। उदाहरण के लिए, मेरे लैपटॉप पर "स्टेट / आदि / इश्यू" का आउटपुट:

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 / विभाजन में सामग्री है:

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 को नोटिस करें।

यह समझना / याद रखना महत्वपूर्ण है कि डिवाइस फ़ाइल का नाम जैसे / dev / sda1 केवल एक लेबल है। प्रमुख और मामूली संख्या डिवाइस फ़ाइल के महत्वपूर्ण, महत्वपूर्ण मूल्य हैं। यदि आप उत्सुक हैं, तो डिवाइस फ़ाइलों को बनाने के लिए उपयोग किए जाने वाले mknod (1) उपयोगिता की जांच करें। मैं निम्नलिखित सिंटैक्स के साथ प्रमुख 8, माइनर 18 के साथ एक नई / देव प्रविष्टि बना सकता हूं, जिसे अर्वार्क कहा जाता है:

mknod /dev/aardvark b 8 18

तब, मैं इसे आसानी से माउंट कर सकता था:

mount /dev/aardvark /mnt

और, यदि हम माउंट कमांड या / proc / mounts की सामग्री को देखते हैं और हम देखते हैं:

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

df -h शो:

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

... वैसे भी, इस सब का मतलब यह है कि ब्लॉक डिवाइस की पहचान के लिए महत्वपूर्ण विवरण प्रमुख और मामूली संख्या हैं - डिवाइस फ़ाइल लेबल नहीं - और यह कि lstat () सिस्टम कॉल का उपयोग करना सबसे अच्छा तरीका है उन मूल्यों को क्वेरी करें।

अंतिम टिप्पणी के रूप में, मैं सिर्फ यह सुनिश्चित करने के लिए आपके प्रश्न को फिर से पढ़ता हूं कि मैं इसका उत्तर दे रहा था और मुझे एहसास हुआ कि आप पूछ रहे थे कि बाइंड माउंट के लिए कौन सा स्रोत उपकरण लेबल / प्रॉप / माउंट में दिखाई देगा। यह वैसा ही सोर्स डिवाइस लेबल होगा जैसा कि बाइंड माउंट के लिए फाइलसिस्टम माउंटपॉइंट सोर्स के लिए ओरिजिनल माउंट (2) कॉल में इस्तेमाल किया गया था। शायद एक उदाहरण मदद करेगा:

मेरे पास / dev / sdb2 और / dev / aardvark (ऊपर जैसा है)। वे दोनों प्रमुख 8, मामूली 18 हैं। ध्यान दें, मैं एक ही फाइल सिस्टम को दो बार बढ़ाऊंगा। मैं निम्नलिखित कार्य करता हूं:

mkdir /mnt1 /mnt2 /foo

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

ध्यान दें कि मैं निर्देशिका को किसी दिन / mnt1 में बनाता हूं। लेकिन चूंकि / mnt1 और / mnt2 में समान फाइलसिस्टम आरोहित है, सोमेदिर भी / mnt2 के माध्यम से उपलब्ध होगा।

mkdir /mnt1/somedir

mkdir /foo/left /foo/right

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

अब, यदि हम जाँच / खरीद / 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 / ... बाइंड माउंट पर स्रोत डिवाइस लेबल मूल रूप से फाइलसिस्टम माउंट (2) कॉल में दिए गए मूल्य के समान है। याद रखें, मेरे उदाहरण में / dev / aardvark और / dev / sdb2 एक ही उपकरण हैं।

मुझे लगता है कि मैंने सिर्फ एक उपन्यास टाइप किया है और पहली छमाही वास्तव में आपके सवाल का जवाब नहीं देती है, लेकिन ऐसा लगता है कि इसे हटाने के लिए ऐसा बेकार है। शायद यह किसी और की मदद करेगा।

शुभ लाभ।

PS ध्यान रखें कि कुछ फाइलसिस्टम नेटवर्क आधारित हैं - जैसे NFS या CIFS - या वर्चुअल हैं - जैसे कि procfs या sysfs और जिनके पास स्रोत ब्लॉक डिवाइस नहीं है। मुझे नहीं पता कि स्टेट आउटपुट में डिवाइस के रूप में क्या लौटाया जाएगा, बस इसके लायक क्या है।


1
पहला भाग निश्चित रूप से मुझे पिछले भाग को समझने में मदद करता है।
स्ट्रॉन्गबैड

यह उत्तर tmpfs पथ के लिए काम नहीं करता है। आप st_dev को छोटा नहीं पाएंगे, प्रमुख / खरीद / विभाजन पर।
3

@mbello जैसा कि मैंने अपने जवाब के अंत में उल्लेख किया है, यह विधि उन फ़ाइलों के लिए काम नहीं करेगी और जिनके पास कोई बैकिंग डिवाइस नहीं है - जैसे tmpfs mounts।
इथरफिश

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

सहेलियां हमेशा की तरह थोड़ा ध्यान रखती हैं:

$ 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!

मेरा डिस्ट्रो का टैब पूरा होने पर भी यह अधिकार नहीं मिलता है, इसलिए हम इस उदाहरण को वाइल्डकार्ड करेंगे, जैसे कि गाड़ी के रिटर्न और लाइनफीड के साथ माउंटपॉइंट और रिक्त स्थान के रन:

$ 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> मार्कअप का उपयोग एक पूरे कमांड के बजाय एक ही कुंजी के लिए किया जाता है। यह मेरी विनम्र राय में इस तरह से कोई बेहतर नहीं दिखता है।
टोमाज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.