जवाबों:
बाइंड माउंट्स एक फाइलसिस्टम प्रकार नहीं हैं, न ही एक माउंटेड फाइल सिस्टम का एक पैरामीटर; वे एक माउंट ऑपरेशन के पैरामीटर हैं । जहां तक मुझे पता है, कमांड के निम्नलिखित अनुक्रम अनिवार्य रूप से समान सिस्टम राज्यों तक ले जाते हैं जहां तक कर्नेल का संबंध है:
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
mount --version
आप उस किसी भी bind
जानकारी को रिकॉर्ड कर रहे हैं /etc/mtab
? मैं संस्करण २.२०.१ का उपयोग कर रहा हूं और मैंने नवीनतम स्रोतों पर ध्यान दिया और न ही मामले में मुझे कहीं भी रिकॉर्ड की गई जानकारी दिखाई दे रही है जो आपको इसके लिए तैयार करने की अनुमति देगी bind
। दूसरी ओर, मैंने अपने उत्तर में जो सुझाव दिया था, वह वास्तव --bind
में bind
विकल्प का उपयोग करने के साथ बनाई गई सूची बिंदुओं को बांधता है ।
</etc/mtab awk …
POSIX-compliant है (मैं भूल गया कि क्या यह बॉर्न में समर्थित है)। कृपया अपने तथ्यों की जाँच करें। मुझे लगता है कि इस बात की पुष्टि कर सकते हैं /etc/mtab
है bind
विकल्प के लिए एक फाइल सिस्टम के साथ घुड़सवार mount --bind /source /target
डेबियन स्थिर पर (util-linux एनजी 2.17.2 से माउंट)।
mount
और /etc/mtab
। आप डेबियन स्थिर का उपयोग कर रहे हैं, जिसमें उपयोग-लिनक्स-एनजी का पुराना संस्करण है; मैं डेबियन परीक्षण का उपयोग कर रहा हूं जिसका एक नया संस्करण है जो अब समान /etc/mtab
व्यवहार नहीं लगता है , यही कारण है कि शायद @rozcietrzewiacz ने यह नहीं देखा bind
कि /etc/mtab
क्या उसका वितरण भी नए संस्करण का उपयोग कर रहा है?
findmnt
उत्तर के रूप में पोस्ट करना चाहिए । यह केवल तभी काम करता है जब लक्ष्य निर्देशिका दूसरी माउंट पॉइंट नहीं होती है, वैसे। उदाहरण के लिए कोशिश करेंsudo mount --bind / foo && findmnt | grep foo
शायद यह चाल कर सकता है:
findmnt | grep "\["
उदाहरण:
$ mkdir /tmp/foo
$ sudo mount --bind /media/ /tmp/foo
$ findmnt | grep "\["
│ └─/tmp/foo /dev/sda2[/media] ext4 rw,relatime,data=ordered
/
उदाहरण के लिए, यदि बाइंड माउंटेड है, तो आउटपुट ए नहीं है [...]
।
कर्नेल बाँध mounts तथ्य के बाद सामान्य mounts से अलग संभाल नहीं करता है। mount
दौड़ते समय जो होता है, उसमें केवल अंतर होता है ।
जब आप किसी फ़ाइल सिस्टम को माउंट करते हैं (उदाहरण के साथ mount -t ext4 /dev/sda1 /mnt
) कर्नेल (थोड़ा सरलीकृत) तीन चरण करता है:
-t
या उपयोग करते हैं तो आपके -t auto
mount
लिए प्रकार का अनुमान लगाते हैं और कर्नेल को अनुमानित प्रकार प्रदान करते हैं)nodev
उदाहरण के लिए माउंटपॉइंट पर एक विकल्प है, फाइलसिस्टम पर नहीं। आपके पास nodev
एक बिना और एक माउंट माउंट हो सकता है)यदि आप बाइंड माउंट करते हैं (उदाहरण के साथ mount --bind /a /b
) तो निम्न होता है:
(मैं छोड़ दूँगा mount --move
, क्योंकि यह सवाल के लिए प्रासंगिक नहीं है)
यह काफी लिनक्स पर फाइलें कैसे बनाई जाती हैं:
यदि आप एक कड़ी बनाते हैं तो निम्न कार्य होते हैं:
जैसा कि आप देख सकते हैं, बनाई गई फ़ाइल और हार्ड लिंक अप्रभेद्य हैं:
$ 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))
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")
यह अन्य 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" हेडर को हटाता है और "--लिस्ट" "ट्री" प्रारूप की पंक्तियों को हटा देता है।
डेबियन खिंचाव पर परीक्षण किया गया।
findmnt | fgrep [
के रूप में यहां विस्तार से बताया ।