सूची केवल मौतों को बांधें


24

उपयोग करने के बजाय mount | grep, मैं उपयोग करना चाहता हूं mount -l -t bind, लेकिन यह काम नहीं करता है, और सभी आरोह -t noneदिखाता है ।

जवाबों:


28

बाइंड माउंट्स एक फाइलसिस्टम प्रकार नहीं हैं, न ही एक माउंटेड फाइल सिस्टम का एक पैरामीटर; वे एक माउंट ऑपरेशन के पैरामीटर हैं । जहां तक ​​मुझे पता है, कमांड के निम्नलिखित अनुक्रम अनिवार्य रूप से समान सिस्टम राज्यों तक ले जाते हैं जहां तक ​​कर्नेल का संबंध है:

mount /dev/foo /mnt/one; mount --bind /mnt/one /mnt/two
mount /dev/foo /mnt/two; mount --bind /mnt/two /mnt/one

तो याद करने का एकमात्र तरीका यह है कि जो mounts बाइंड mounts थे, mountउन कमांड का लॉग है जो अंदर छोड़ दिया गया है /etc/mtab। एक बाइंड माउंट ऑपरेशन bindमाउंट विकल्प द्वारा इंगित किया जाता है (जिसके कारण फ़ाइल सिस्टम प्रकार को अनदेखा किया जाता है)। लेकिन mountविकल्पों के सेट के एक विशेष सेट के साथ घुड़सवार केवल फाइल सिस्टम को सूचीबद्ध करने का कोई विकल्प नहीं है। इसलिए आपको अपना फ़िल्टर करने की आवश्यकता है।

mount | grep -E '[,(]bind[,)]'
</etc/mtab awk '$4 ~ /(^|,)bind(,|$)/'

ध्यान दें कि /etc/mtabयह केवल यहाँ उपयोगी है अगर यह एक पाठ फ़ाइल द्वारा बनाए रखा है mount। कुछ वितरण इसके बजाय /etc/mtabएक प्रतीकात्मक कड़ी के रूप में स्थापित /proc/mountsहोते हैं; /proc/mountsज्यादातर समान है, /etc/mtabलेकिन इसमें कुछ अंतर हैं, जिनमें से एक बाँध माउंट को ट्रैक नहीं कर रहा है।

जानकारी का एक टुकड़ा जो कर्नेल द्वारा बनाए रखा जाता है, लेकिन इसमें नहीं दिखाया जाता है /proc/mounts, जब माउंट बिंदु केवल माउंटेड फ़ाइल सिस्टम पर निर्देशिका ट्री का एक हिस्सा दिखाता है। व्यवहार में यह अधिकतर बाइंड माउंट्स के साथ होता है:

mount --bind /mnt/one/sub /mnt/partial

में /proc/mounts, एक ही फाइल सिस्टम प्रकार और एक ही विकल्प के लिए प्रविष्टियों /mnt/oneऔर /mnt/partialएक ही डिवाइस है। वह जानकारी जो /mnt/partialकेवल रूट किए गए फ़ाइल सिस्टम के भाग को दिखाती है, वह (कॉलम 4) /subमें प्रति-प्रक्रिया माउंट बिंदु जानकारी में दिखाई देती है /proc/$pid/mountinfo। वहाँ प्रविष्टियाँ इस तरह दिखती हैं:

12 34 56:78 / /mnt/one rw,relatime - ext3 /dev/foo rw,errors=remount-ro,data=ordered
12 34 56:78 /sub /mnt/partial rw,relatime - ext3 /dev/foo rw,errors=remount-ro,data=ordered

1
असल में @Gilles, तो आप बस का उपयोग कर ऐसा कर सकते हैं findmnt | fgrep [के रूप में यहां विस्तार से बताया
आकुल

@ क्या mount --versionआप उस किसी भी bindजानकारी को रिकॉर्ड कर रहे हैं /etc/mtab? मैं संस्करण २.२०.१ का उपयोग कर रहा हूं और मैंने नवीनतम स्रोतों पर ध्यान दिया और न ही मामले में मुझे कहीं भी रिकॉर्ड की गई जानकारी दिखाई दे रही है जो आपको इसके लिए तैयार करने की अनुमति देगी bind। दूसरी ओर, मैंने अपने उत्तर में जो सुझाव दिया था, वह वास्तव --bindमें bind विकल्प का उपयोग करने के साथ बनाई गई सूची बिंदुओं को बांधता है
एसुलिच

@aculich </etc/mtab awk …POSIX-compliant है (मैं भूल गया कि क्या यह बॉर्न में समर्थित है)। कृपया अपने तथ्यों की जाँच करें। मुझे लगता है कि इस बात की पुष्टि कर सकते हैं /etc/mtabहै bindविकल्प के लिए एक फाइल सिस्टम के साथ घुड़सवार mount --bind /source /targetडेबियन स्थिर पर (util-linux एनजी 2.17.2 से माउंट)।
गिल्स एसओ- बुराई को रोकें '

@ गिले-शिकवे दूर करने के लिए मैंने अपनी गलत टिप्पणी को डिलीट कर दिया। आप सही हैं, यह वास्तव में POSIX- आज्ञाकारी है। इसके अलावा अब मैं कारण है कि हम के विभिन्न व्यवहार देख रहे हैं समझते हैं mountऔर /etc/mtab। आप डेबियन स्थिर का उपयोग कर रहे हैं, जिसमें उपयोग-लिनक्स-एनजी का पुराना संस्करण है; मैं डेबियन परीक्षण का उपयोग कर रहा हूं जिसका एक नया संस्करण है जो अब समान /etc/mtabव्यवहार नहीं लगता है , यही कारण है कि शायद @rozcietrzewiacz ने यह नहीं देखा bindकि /etc/mtabक्या उसका वितरण भी नए संस्करण का उपयोग कर रहा है?
aculich

1
@aculich आपको findmntउत्तर के रूप में पोस्ट करना चाहिए । यह केवल तभी काम करता है जब लक्ष्य निर्देशिका दूसरी माउंट पॉइंट नहीं होती है, वैसे। उदाहरण के लिए कोशिश करेंsudo mount --bind / foo && findmnt | grep foo
l0b0

21

शायद यह चाल कर सकता है:

findmnt | grep  "\["

उदाहरण:

$ mkdir /tmp/foo
$ sudo mount --bind /media/ /tmp/foo
$ findmnt | grep  "\["
│ └─/tmp/foo                     /dev/sda2[/media] ext4            rw,relatime,data=ordered

1
जाहिरा तौर पर, यह केवल तभी काम करता है जब एक माउंटपॉइंट की उपनिर्देशिका को बांध दिया जाता है। /उदाहरण के लिए, यदि बाइंड माउंटेड है, तो आउटपुट ए नहीं है [...]
मुरु

8

कर्नेल बाँध mounts तथ्य के बाद सामान्य mounts से अलग संभाल नहीं करता है। mountदौड़ते समय जो होता है, उसमें केवल अंतर होता है ।

जब आप किसी फ़ाइल सिस्टम को माउंट करते हैं (उदाहरण के साथ mount -t ext4 /dev/sda1 /mnt) कर्नेल (थोड़ा सरलीकृत) तीन चरण करता है:

  1. कर्नेल निर्दिष्ट फाइलसिस्टम प्रकार के लिए फाइलसिस्टम ड्राइवर की तलाश करता है (यदि आप चूक करते हैं -tया उपयोग करते हैं तो आपके -t auto mountलिए प्रकार का अनुमान लगाते हैं और कर्नेल को अनुमानित प्रकार प्रदान करते हैं)
  2. कर्नेल फ़ाइल सिस्टम ड्राइवर को स्रोत पथ और किसी भी उपलब्ध विकल्पों का उपयोग करके फाइल सिस्टम तक पहुंचने का निर्देश देता है। इस बिंदु पर फाइलसिस्टम को केवल एक प्रमुख: लघु संख्या जोड़ी द्वारा पहचाना जाता है।
  3. फाइलसिस्टम एक पथ (माउंटपॉइंट) से बंधा है। कर्नेल यहां कुछ माउंट विकल्पों का भी उपयोग करता है। ( nodevउदाहरण के लिए माउंटपॉइंट पर एक विकल्प है, फाइलसिस्टम पर नहीं। आपके पास nodevएक बिना और एक माउंट माउंट हो सकता है)

यदि आप बाइंड माउंट करते हैं (उदाहरण के साथ mount --bind /a /b) तो निम्न होता है:

  1. कर्नेल हल करता है कि किस फाइलसिस्टम में स्रोत पथ और माउंटप्वाइंट से निर्देशिका तक सापेक्ष पथ शामिल है।
  2. फाइलसिस्टम विकल्प और सापेक्ष पथ का उपयोग करके नए माउंटपॉइंट के लिए बाध्य है।

(मैं छोड़ दूँगा mount --move, क्योंकि यह सवाल के लिए प्रासंगिक नहीं है)

यह काफी लिनक्स पर फाइलें कैसे बनाई जाती हैं:

  1. कर्नेल इस बात का समाधान करता है कि कौन सी फाइलसिस्टम उस डायरेक्टरी के लिए जिम्मेदार है जिसमें फाइल बनाई जानी चाहिए।
  2. फाइलसिस्टम में एक नई फाइल बनाई जाती है। इस बिंदु पर फ़ाइल में केवल एक इनकोड संख्या होती है।
  3. नई फ़ाइल निर्देशिका में फ़ाइल नाम से जुड़ी हुई है।

यदि आप एक कड़ी बनाते हैं तो निम्न कार्य होते हैं:

  1. कर्नेल स्रोत फ़ाइल के इनोड नंबर को हल करता है।
  2. फ़ाइल गंतव्य फ़ाइल नाम से जुड़ी हुई है।

जैसा कि आप देख सकते हैं, बनाई गई फ़ाइल और हार्ड लिंक अप्रभेद्य हैं:

$ touch first
$ ln first second
$ ls -li
1184243 -rw-rw-r-- 2 cg909 cg909 0 Feb 20 23:56 /tmp/first
1184243 -rw-rw-r-- 2 cg909 cg909 0 Feb 20 23:56 /tmp/second

लेकिन , जैसा कि आप इनकोड संख्याओं की तुलना करके किसी फ़ाइल में सभी हार्डलिंक की पहचान कर सकते हैं, आप किसी फ़ाइल सिस्टम के लिए सभी मापों की पहचान प्रमुख: मामूली संख्याओं की तुलना करके कर सकते हैं।

आप इसे findmnt -o TARGET,MAJ:MINसीधे या सीधे देख सकते हैं /proc/self/mountinfo( अधिक जानकारी के लिए लिनक्स कर्नेल प्रलेखन देखें )।

निम्नलिखित पायथन लिपि सभी बाइंड माउंटों को सूचीबद्ध करती है। यह मानता है कि माउंटेड फ़ाइल सिस्टम के रूट के सबसे छोटे सापेक्ष पथ के साथ सबसे पुराना माउंट पॉइंट मूल माउंट है।

#!/usr/bin/python3

import os.path, re
from collections import namedtuple

MountInfo = namedtuple('MountInfo', ['mountid', 'parentid', 'devid', 'root', 'mountpoint', 'mountoptions', 'extra', 'fstype', 'source', 'fsoptions'])

mounts = {}

def unescape(string):
    return re.sub(r'\\([0-7]{3})', (lambda m: chr(int(m.group(1), 8))), string)

with open('/proc/self/mountinfo', 'r') as f:
    for line in f:
        # Parse line
        mid, pid, devid, root, mp, mopt, *tail = line.rstrip().split(' ')
        extra = []
        for item in tail:
            if item != '-':
                extra.append(item)
            else:
                break
        fstype, src, fsopt = tail[len(extra)+1:]
        # Save mount info
        mount = MountInfo(int(mid), int(pid), devid, unescape(root), unescape(mp), mopt, extra, fstype, unescape(src), fsopt)
        mounts.setdefault(devid, []).append(mount)

for devid, mnts in mounts.items():
    # Skip single mounts
    if len(mnts) <= 1:
        continue
    # Sort list to get the first mount of the device's root dir (if still mounted)
    mnts.sort(key=lambda x: x.root)
    src, *binds = mnts
    # Print bind mounts
    for bindmount in binds:
        if src.root == bindmount.root:
            srcstring = src.mountpoint
        else:
            srcstring = src.mountpoint+':/'+os.path.relpath(bindmount.root, src.root)
        print('{0} -> {1.mountpoint} ({1.mountoptions})'.format(srcstring, bindmount))

0
unset DONE1FSES
FSES=$(findmnt -vUPno SOURCE,FSROOT,TARGET,MAJ:MIN)
FSES=${FSES//MAJ:MIN/MAJ_MIN}
while read SEARCH1FS
do
  unset DONE2FSES
  eval "$SEARCH1FS"
  SEARCH1SOURCE=$SOURCE
  SEARCH1FSROOT=$FSROOT
  SEARCH1TARGET=$TARGET
  SEARCH1MAJMIN=$MAJ_MIN

  FS1WASHANDLED=0
  while read DONE1FS 
  do
    if [[ $DONE1FS == $MAJ_MIN ]]
    then
      FS1WASHANDLED=1
      break
    fi
  done < <(echo "$DONE1FSES")


  if [[ ($SEARCH1FSROOT == /) && ($FS1WASHANDLED == 0) ]]
  then
  DONE1FSES+=$MAJ_MIN$'\n'
  while read SEARCH2FS
  do
    eval "$SEARCH2FS"
    SEARCH2SOURCE=$SOURCE
    SEARCH2FSROOT=$FSROOT
    SEARCH2TARGET=$TARGET
    SEARCH2MAJMIN=$MAJ_MIN

    FS2WASHANDLED=0
    while read DONE2FS 
    do
      if [[ $DONE2FS == $SEARCH2FS ]]
      then
        FS2WASHANDLED=1
        break
      fi
    done < <(echo "$DONE2FSES")

    if [[ ($SEARCH1MAJMIN == $SEARCH2MAJMIN)  && ($SEARCH1TARGET != $SEARCH2TARGET )  && ($FS2WASHANDLED == 0 ) ]]
    then
      DONE2FSES+=$SEARCH2FS$'\n'
      echo "$SEARCH1TARGET$SEARCH2FSROOT   --> $SEARCH2TARGET"
    fi

  done < <(echo "$FSES")


  fi
done   < <(echo "$FSES")

0

यह अन्य findmnt उत्तर के समान है, लेकिन स्वरूपण समस्या से बचा जाता है।

सभी प्रस्तुतियाँ दिखाने के लिए:

findmnt --kernel -n --list | grep '\['

Ext4 के सभी प्रकार के फाइल सिस्टम को दिखाने के लिए:

findmnt --kernel -t ext4 -n --list | grep '\['

सबमाउंट को छोड़कर सभी आरोह दिखाने के लिए:

findmnt --kernel -n --list | grep -v '\['

सबमाउंट को छोड़कर ext4 के फाइल सिस्टम के सभी आरोह दिखाने के लिए:

findmnt --kernel -t ext4 -n --list | grep -v '\['

"-N" हेडर को हटाता है और "--लिस्ट" "ट्री" प्रारूप की पंक्तियों को हटा देता है।

डेबियन खिंचाव पर परीक्षण किया गया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.