ডিরেক্টরিটি কোন ডিভাইসে অবস্থিত তা নির্ধারণ করুন


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। আমি কীভাবে নির্ধারণ করতে পারি যে কোন ডিভাইসটি (যেমন, / dev / 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। অন্যান্য ডিভাইসগুলি এলভিএম (লজিকাল ভলিউম ম্যানেজমেন্ট) ব্যবহার করছে এবং কোন আসল ডিভাইস এলভিএম ব্যবহার করছে তা জানতে আরও জিজ্ঞাসা করা দরকার।


যদি $PWD(যা আমি মাউন্ট করছি) যদি সিরিজগুলি, বাঁধাইয়ের মাউন্ট ইত্যাদির একটি সিরিজে সমাহিত করা হয় তবে মাউন্ট পয়েন্টগুলির জন্য আমার পুনরাবৃত্তভাবে পরীক্ষা করা দরকার।
স্ট্রংব্যাড

/proc/mounts"জিনিস" যা যা মাউন্ট করা আছে তাতে কি দেখাবে তা সত্ত্বেও বাইন্ড মাউন্টগুলি অন্ততঃ মনে মনে, এটি ডিভাইসটি ডিরেক্টরি / ফাইল নয়।
স্ট্রংব্যাড

@ স্ট্রংব্যাড - কী readlink -f /mntদেখায়?
slm

2
@ স্ট্রংব্যাড যদি সিমলিংকগুলি দ্বারা অস্পষ্ট হয়ে যাওয়ার সময় মাউন্ট পয়েন্ট / ডিভাইস নির্ধারণের ক্ষেত্রে আপনাকে মোকাবেলা করতে হয় তবে আপনার এটি আপনার প্রশ্নের মধ্যে রাখা উচিত। সঠিক উত্তর পাওয়া এটি আরও সহজ করে তুলবে।
প্যাট্রিক

readlink -f /mntদেয়/mnt
স্ট্রংব্যাড

29

লিনাক্স আমরা আছে findmntথেকে util-linuxঠিক এই জন্য তৈরি

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

অন্যান্য সমাধানগুলির সুবিধাটি হ'ল এটি এখনও কাজ করে যদি সিমলিংকগুলি বা ডুপ্লিকেট বাইন্ড মাউন্টগুলি দ্বারা পাথগুলি অস্পষ্ট করা হয়।


এটি আমার পক্ষে কাজ করে না। এটি সিস্টেমে প্রতিটি মাউন্টের উত্স দেখায়। ইউটি-লিনাক্স ২.২৩.২ থেকে সন্ধানকারী
বিডব্লুঙ্কান

@bwduncan আমার জন্য এটি ২.২৩.২ নিয়ে কাজ করে। একটি বাগ হতে পারে? আপনি সর্বশেষতম সংস্করণ 2.29.2 চেষ্টা করতে পারেন?
rudimeier

২.২৯ উবুন্টু কৌতুক করে। এর মতো বাগ নয়, আরও একটি বৈশিষ্ট্য :)
bwduncan

1
ধন্যবাদ! সিস্টেম স্ক্রিপ্টের জন্য আমার ঠিক এটি দরকার ছিল।
vog

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)

তৃতীয় লাইনটি দেখুন, প্রথম ক্ষেত্র, "ডিভাইস"। এখানে এটি 801 ঘন্টা তালিকাবদ্ধ। এই মানটিকে দুটি বাইট, 8 এবং 1 এ বিভক্ত করা যেতে পারে প্রথম বাইটটি প্রধান সংখ্যা হিসাবে পরিচিত, দ্বিতীয় বাইটটি গৌণ সংখ্যা। সুতরাং, পরবর্তী পদক্ষেপটি হ'ল বড় কোন ডিভাইসটি 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 এসডিএ 1। আমরা একটি 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 / মাউন্টগুলির সামগ্রীগুলি দেখি এবং আমরা দেখতে পাই:

/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

এখন, আমরা যদি / প্রোম / মাউন্টগুলি পরীক্ষা করি তবে আমরা দেখতে পাই:

/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 একই ডিভাইস।

আমি বুঝতে পেরেছি যে আমি সবেমাত্র একটি উপন্যাস টাইপ করেছি এবং প্রথমার্ধটি সত্যিই আপনার প্রশ্নের কোনও উত্তর দেয় না, তবে এটি মুছে ফেলার মতো এমন অপচয় বলে মনে হয়েছিল। সম্ভবত এটি অন্য কাউকে সাহায্য করবে।

শুভকামনা

পিএস মনে রাখবেন যে কিছু ফাইল সিস্টেমগুলি নেটওয়ার্ক ভিত্তিক - যেমন এনএফএস বা সিআইএফএস - বা ভার্চুয়াল - যেমন প্রোফস বা সিএসএফস এবং কোনও সোর্স ব্লক ডিভাইস নেই। স্ট্যাট আউটপুটে ডিভাইস হিসাবে কী ফিরিয়ে দেওয়া হবে তা আমি জানি না, কেবল এটির জন্য মূল্য।


1
প্রথম অংশটি অবশ্যই আমাকে শেষ অংশটি বুঝতে সহায়তা করে।
স্ট্রংবেড

এই উত্তরটি tmpfs পাথের জন্য কাজ করে না। আপনি st_dev নাবালিকা পাবেন না / মেজাজে / proc / পার্টিশনগুলি।
এমবেলো

@mbello আমি আমার উত্তরের শেষে উল্লেখ করেছি যে, এই পদ্ধতিটি এমন ফাইল সিস্টেমগুলির পক্ষে কাজ করবে না যার কোনও ব্যাকিং ডিভাইস নেই - যেমন tmpfs মাউন্টগুলি।
ইথারফিশ

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> মার্কআপ পুরো কমান্ডের পরিবর্তে একক কীতে ব্যবহৃত হয়। আমার নম্র মতে এটি আর ভাল দেখাচ্ছে না।
টমাসজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.