কেবল বাঁধাইয়ের মাউন্টগুলি তালিকাবদ্ধ করুন


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

তাই কোন মাউন্টগুলি বাইন্ড মাউন্টগুলি ছিল তা মনে রাখার একমাত্র উপায় হ'ল 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 বিকল্পটি ব্যবহারের পাশাপাশি তৈরি করা বাঁধার মাউন্টগুলিকে তালিকাই দেয় ।
অ্যাকুলিচ

@ অ্যাকুলিচ পসিএক্স </etc/mtab awk …- সম্মতিজনক (আমি ভুলে যাই এটি বোর্নে সমর্থিত কিনা)। আপনার তথ্য পরীক্ষা করুন। আমি নিশ্চিত করতে পারি যে /etc/mtabএতে ডেবিয়ান স্ট্যাবিলে মাউন্ট bindকরা ফাইল সিস্টেমের বিকল্প রয়েছে mount --bind /source /target(ইউজার-লিনাক্স-এনজি ২.১.2.২ থেকে মাউন্ট)।
গিলস 21'10 মিনিটে

@ গিলস আমি বিভ্রান্তি দূর করতে আমার ভুল মন্তব্য মুছে ফেলেছি। আপনি ঠিক বলেছেন, এটি প্রকৃতপক্ষে পসিক্স-সম্মতিযুক্ত। এছাড়াও এখন আমি কারণ আমরা বিভিন্ন ব্যবহার দেখা যাচ্ছে বুঝতে mountএবং /etc/mtab। আপনি দেবিয়ান স্থিতিশীল ব্যবহার করছেন যা ব্যবহার-লিনাক্স-এনজি এর পুরানো সংস্করণ রয়েছে; আমি ডেবিয়ান পরীক্ষামূলক যা একটি নতুন সংস্করণ রয়েছে ব্যবহার করছি যা আর একই আছে বলে মনে হয় /etc/mtabআচরণ, যা হয়তো এই কারণেই @rozcietrzewiacz দেখতে পাইনি bindমধ্যে /etc/mtabতাঁর বন্টন একটি নতুন সংস্করণ ব্যবহার করছেন?
অ্যাকুলিচ

1
@aculich আপনার findmntউত্তর হিসাবে পোস্ট করা উচিত । এটি কেবল তখনই কাজ করে যদি লক্ষ্য ডিরেক্টরিটি অন্য কোনও মাউন্ট পয়েন্ট না হয় by উদাহরণস্বরূপ চেষ্টা করুন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

কার্নেলটি ব্যান্ড মাউন্টগুলি হ্যান্ডেল করে না সত্যের পরে সাধারণ মাউন্টগুলির থেকে আলাদা । mountরান করার সময় যা ঘটে তার মধ্যে একমাত্র পার্থক্য ।

যখন আপনি একটি ফাইল সিস্টেম মাউন্ট করবেন (উদাহরণস্বরূপ mount -t ext4 /dev/sda1 /mnt) কার্নেল (কিছুটা সরলীকৃত) তিনটি ধাপ সম্পাদন করে:

  1. কার্নেলটি নির্দিষ্ট ফাইল সিস্টেমের ধরণের জন্য একটি ফাইল সিস্টেম ড্রাইভারের সন্ধান করে (যদি আপনি বাদ পড়ে -tবা ব্যবহার করেন তবে আপনার -t auto mountজন্য প্রকারটি অনুমান করে এবং কার্নেলের অনুমানযুক্ত প্রকারটি সরবরাহ করে)
  2. কার্নেলটি ফাইল-সিস্টেম ড্রাইভারকে উত্স পাথ এবং যে কোনও সরবরাহকৃত বিকল্প ব্যবহার করে ফাইল-সিস্টেম অ্যাক্সেস করতে নির্দেশ দেয়। এই মুহুর্তে ফাইল সিস্টেমটি কেবল একটি বড়: গৌণ সংখ্যা জোড় দ্বারা চিহ্নিত করা হয়।
  3. ফাইল সিস্টেম একটি পাথ (মাউন্টপয়েন্ট) এ আবদ্ধ। কার্নেলটি এখানে কিছু মাউন্ট অপশন ব্যবহার করে। ( nodevউদাহরণস্বরূপ মাউন্টপয়েন্টে একটি বিকল্প, ফাইল সিস্টেমে নয় You আপনার কাছে একটি বাইন্ড মাউন্ট থাকতে পারে nodevএবং একটি ছাড়াও)

আপনি যদি একটি বাইন্ড মাউন্ট সম্পাদনা করেন (উদাহরণস্বরূপ mount --bind /a /b) নিম্নলিখিতটি ঘটে:

  1. কার্নেলটি সমাধান করে যে কোন ফাইল সিস্টেমের মধ্যে সোর্স পাথ এবং ডিরেক্টরি থেকে মাউন্টপয়েন্ট থেকে আপেক্ষিক পথ রয়েছে।
  2. বিকল্প সিস্টেম এবং আপেক্ষিক পথটি ব্যবহার করে ফাইল সিস্টেমটি নতুন মাউন্টপয়েন্টে আবদ্ধ।

(আমি এড়িয়ে যাব mount --move, কারণ এটি প্রশ্নের সাথে প্রাসঙ্গিক নয়))

লিনাক্সে ফাইলগুলি কীভাবে তৈরি করা হয় তার সাথে এটি বেশ মিল:

  1. কার্নেলটি সমাধান করে যে ফাইল ডিরেক্টরিটি ফাইল তৈরি করতে হবে সেই ডিরেক্টরিটির জন্য দায়ী files
  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 --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" শিরোনামগুলি সরায় এবং "--list" "ট্রি" ফর্ম্যাটটির লাইনগুলি সরিয়ে দেয়।

দেবিয়ান প্রসারিত পরীক্ষিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.