লিনাক্সের একই পার্টিশনে 2 ডিরেক্টরি হোস্ট করা হয়েছে কিনা তা পরীক্ষা করুন


9

/my/dirএকই পার্টিশনে রয়েছে কিনা তা আমি কীভাবে পরীক্ষা করতে পারি /?

এটি কোনও স্ক্রিপ্টের মধ্যে একীকরণের জন্য। বাইন্ড মাউন্টগুলি সঠিকভাবে পরিচালনা করা উচিত। POSIX সামঞ্জস্যপূর্ণ সমাধান স্বাগত।


"বাইন্ড মাউন্টগুলি সঠিকভাবে পরিচালনা করা উচিত” " তবে আপনি কি সঠিক বিবেচনা করবেন? আপনার প্রশ্নের যে কোনও উপায়ে ব্যাখ্যা করা যেতে পারে।
গিলস

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

উত্তর:


6

আপনি স্ট্যাটাস দিয়ে এটি পরীক্ষা করতে পারেন:

$ stat -c '%d %m' /proc/sys/
3 /proc

আপনাকে ডিভাইস নম্বর এবং যেখানে আপনার ডিরেক্টরিটি মাউন্ট করা হয়েছিল তা দেখায়।


1
দুর্দান্ত, তবে statশেল কমান্ডটি
পসিক্স

কোন? তুমি কিভাবে জান?


ওহ! আমার দুরবস্থা. তবে পরের বার এই লিঙ্কটি আগে থেকেই দেখান।

5

নিম্নলিখিত কমান্ডটি ফাইল $fileসহ মাউন্ট পয়েন্টের জন্য একটি অনন্য নাম দেয় :

df -P -- "$file" | awk 'NR==2 {print $1}'

এটি কোনও পসিক্স সিস্টেমে কাজ করে । -Pবিকল্প একটি আন্দাজের বিন্যাস আরোপ; দ্বিতীয় লাইনের প্রথম ক্ষেত্রটি হ'ল "ফাইল সিস্টেমের নাম"। সুতরাং, দুটি ফাইল একই মাউন্ট পয়েন্টের অধীনে যাচাই করতে:

if [ "$(df -P -- "$file1" | awk 'NR==2 {print $1}')" = \
     "$(df -P -- "$file2" | awk 'NR==2 {print $1}')" ]; then
  echo "$file1 and $file2 are on the same filesystem" ; fi

বা, কয়েক বার প্রক্রিয়া আমন্ত্রণ সংরক্ষণ করতে:

if df -P -- "$file1" "$file2" |
   awk 'NR!=1 {dev[NR] = $1} END {exit(dev[2] != dev[3])}'; then
  echo "$file1 and $file2 are on the same filesystem" ; fi

কয়েকটি অপারেটিং সিস্টেমে ভলিউম নামেরে ফাঁকা স্থান থাকতে পারে। dfএই ক্ষেত্রে আউটপুট পার্স করার কোনও সম্পূর্ণ নির্ভরযোগ্য উপায় নেই ।

ফণা অধীনে, আপনি st_devক্ষেত্র দ্বারা ফিরে আসা ফাইল দ্বারা ফাইল ফাইল সনাক্ত করতে পারবেন stat। শেল স্ক্রিপ্ট থেকে এটি করার কোনও পোর্টেবল উপায় নেই। কিছু সিস্টেমের একটি statইউটিলিটি থাকে তবে এর বাক্য গঠনটি ভিন্ন হয়:

  • নন-এম্বেড থাকা লিনাক্সে, সাইগউইন বা জিএনইউ কোর্টিলস সহ অন্যান্য সিস্টেমে ক্ষেত্রটি statপ্রতিবেদন করার st_devসময় রিপোর্ট করে stat -c %D -- "$file"
  • কিছু ব্যসিবক্স ইনস্টলেশনগুলিতে statজিএনইউ কোর্টিলগুলির সাথে সামঞ্জস্যপূর্ণ একটি অন্তর্ভুক্ত রয়েছে । অন্যদের বিকল্প statছাড়া আছে %c; আপনি ব্যবহার করতে পারবেন stat -t -- "$file" | awk '{print $8}'তবে এটি কেবল তখনই কাজ করে যদি ফাইলের নামটিতে সাদা স্থান থাকে না বা stat -t -- "$file" | awk 'END {print $(NF-8)}'যেগুলি স্বেচ্ছাসেবী ফাইল নামের সাথে অনুলিপি করে তবে ভবিষ্যতে ক্ষেত্রের statআউটপুট সংযোজন না করে ।
  • বিএসডি সিস্টেমগুলির একটি পৃথক statইউটিলিটি রয়েছে যা প্রয়োজন stat -f %d -- "$file"
  • সোলারিস, এআইএক্স এবং অন্যদের কোনও statউপকার নেই।

পার্ল উপলভ্য থাকলে আপনি ব্যবহার করতে পারেন

perl -e 'print ((stat($ARGV[0]))[0])' -- "$file"

এবং তুলনা করতে:

perl -e 'exit((stat($ARGV[0]))[0] != (stat($ARGV[1]))[0])' -- "$file1" "$file2"

নোট করুন যে কয়েকটি কোণার ক্ষেত্রে রয়েছে যেখানে পছন্দসই ফলাফল পরিষ্কার নয়। উদাহরণস্বরূপ, লিনাক্স এর বেঁধে মাউন্ট সঙ্গে, পরে mount --bind /foo /bar, /fooএবং /barএকই ফাইলসিস্টেম বলে মনে করা হয়। এটি সর্বদা সম্ভব যে দুটি ফাইলই আসলে একই ডিভাইসে অবস্থিত তবে আপনি কখনই জানতে পারবেন না: উদাহরণস্বরূপ, ফাইলগুলি দুটি পৃথক নেটওয়ার্ক মাউন্টে থাকলে, ক্লায়েন্টের এটি জানার কোনও উপায় নেই যে সার্ভারটি বিভিন্ন ফাইল সিস্টেম রফতানি করছে কিনা।

যদি ফাইলগুলি ডিরেক্টরি হয় এবং আপনি সেগুলিতে লিখতে পারেন তবে অন্য একটি পদ্ধতি হল একটি অস্থায়ী ফাইল তৈরি করা এবং একটি হার্ড লিঙ্ক তৈরি করার চেষ্টা করা। এটি লিনাক্সের বাইন্ড মাউন্টগুলিতে একটি নেতিবাচক ফলাফলের প্রতিবেদন করে।

tmp1=$(TMPDIR=$dir1 mktemp)
tmp2=$(TMPDIR=$dir2 mktemp)
if ln -f -- "$tmp1" "$tmp2"; then
  echo "$dir1 and $dir2 are on the same filesystem, which supports hard links"
fi
rm -f "$tmp1" "$tmp2"

সমস্যা: dfসর্বদা ডিভাইসটির নাম দেয় না তবে কিছু সময় এটির জন্য একটি সিএমলিংক নির্ভরযোগ্য নয় /dev/disk/by-uuid/ca09b761-ae1b-450f-8a46-583327b48fb4making dfএখন পর্যন্ত একমাত্র নির্ভরযোগ্য বিকল্পটি statভিত্তিক সমাধান ব্যবহার করা ।
টোটার

@ টোটার এতে কিছু আসে যায় না: dfডিভাইসের জন্য যে নামটিই রিপোর্ট করে, এটি দুটি অনুরোধের মধ্যে সামঞ্জস্যপূর্ণ, তাই এটি তুলনার জন্য ঠিক।
গিলস 14'50

না, এটি কাজ করে না, আমি এটি পরীক্ষা করেছি। এখানে ডেবিয়ান হুইজি-তে, একটি একক dfপ্রতিবেদন /dev/sda6এবং /dev/disk/by-uuid/ca09b...উভয়ই একই ডিভাইসটিকে উল্লেখ করে তবে বিভিন্ন মাউন্ট পয়েন্ট। স্ট্রিং তুলনা পরীক্ষা প্রতিটি মাউন্ট পয়েন্ট থেকে ফাইল চেষ্টা করার সময় অবশ্যই ব্যর্থ হয়।
টোটার

@ টোটার সাধারণত আপনার একই ব্লক ডিভাইস দু'বার মাউন্ট করা যায় না। আমি আমার উত্তরে যেমনটি ইঙ্গিত করেছি, সেখানে বাঁধার মাউন্টগুলির মতো কোণার কেস রয়েছে যা পৃথক হিসাবে রিপোর্ট করা হতে পারে বা নাও হতে পারে।
গিলস 15'30

তবুও এটি ডিবিয়ান স্কুইজ এবং হুইজির উপর পুরোপুরি কাজ করে: এর mount /dev/sda6 /mnt1পরে মনোমুগ্ধকর mount /dev/sda6 /mnt2কাজ করে । cat /proc/mountsএটা ঠিক আছে। তবে, কেবল হুইজি থেকেই মূল ফাইল সিস্টেমের ডিভাইস হিসাবে /dev/disk/by-uuid/ca09b...দেখানো হয়েছে df। আরও প্রচেষ্টা এটা এই simlink ব্যবহার বা মাউন্ট করতে UUID=ca09b...মাউন্ট সিনট্যাক্স ছাড়া অন্য কিছু দেখাচ্ছে শেষ করবেন না /dev/sda6মধ্যে df(আমি পুনর্গঠন করা কিভাবে তা বুট প্রক্রিয়ার সময় সম্পন্ন জানি না, কিন্তু যে উদ্বেগ এখানে নেই)।
টোটার

4
test $(df -P $path1 $path2 | awk '{if (NR!=1) {print $6}}' | uniq | wc -l) -eq 1

যে কোনও সংখ্যক পথ নিয়ে কাজ করে।


আউটপুট পার্সিং dfহয় সবসময় একটি ভাল ধারণা না
জোসেফ আর

1
@ টোটার আমি $6ডিভাইসের নাম ( $1) নয়, মাউন্টপয়েন্ট ( ) পরীক্ষা করছি , যাতে সমস্যা না হয়।
n.st

1
@ জোসেফআর পসিক্সে এটি সেরা। n.st: কেন প্রথম ক্ষেত্রটি চেক করবেন না? ডিভাইসটি অ্যাক্সেস করতে কোন পাথটি ব্যবহৃত হয়েছিল তা বিবেচ্য নয়, যদি এটি একই মাউন্ট পয়েন্ট হয় তবে আউটপুটটি ধারাবাহিক হবে।
গিলস

এটি বাইন্ড মাউন্টগুলির সাথে কাজ করে না।
টোটার

0

পসিএক্স-এ উপলব্ধ সেরা বুদ্ধিমানের সমাধান হ'ল স্ট্যাট (2) ফাংশন দ্বারা সরবরাহ করা ফাইলগুলির ডিভাইস আইডিগুলির তুলনা ।

গিলস যেভাবে উল্লেখ করেছেন পার্লের একই স্ট্যাটাস ফাংশন রয়েছে :

perl -e 'exit((stat($ARGV[0]))[0] != (stat($ARGV[1]))[0])' -- file1 file2

তবে "পসিক্স উপায়" হ'ল সি প্রোগ্রাম ব্যবহার করা যেমন:

./checksamedev file1 file2

নিম্নলিখিত উত্স কোড যা:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int main(int argc, char* argv[]) {
    struct stat s1, s2;
    if( argc==3 && lstat(argv[1], &s1)==0 && lstat(argv[2], &s2)==0 )
        return !(s1.st_dev == s2.st_dev);
    return 2;
}

উভয় ফাইলের ডিভাইস আইডি সমান হলে সেগুলি একই ফাইল সিস্টেমে হোস্ট করা হয়, সেক্ষেত্রে উপরের কমান্ডগুলি 0 (অন্য কোনও মান) ফেরত দেয়। সঙ্গে পরীক্ষা করুন echo $?

এটি বাইন্ড মাউন্টগুলির সাথে ভালভাবে কাজ করে তবে সম্ভবত নেটওয়ার্ক মাউন্টগুলির সাথে এটি করবে না।

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