কেন বাইন্ড মাউন্টগুলির জন্য পঠনযোগ্য বিকল্পটির সম্মান করবেন না?


35

আমার আর্চ লিনাক্স সিস্টেমে (লিনাক্স কার্নেল 3.14.2) বাইন্ড মাউন্টগুলি কেবল পঠনের বিকল্পটিকে সম্মান করে না

# mkdir test
# mount --bind -o ro test/ /mnt
# touch /mnt/foo

ফাইল তৈরি করে /mnt/foo। প্রাসঙ্গিক এন্ট্রি /proc/mountsহয়

/dev/sda2 /mnt ext4 rw,noatime,data=ordered 0 0

মাউন্ট অপশনগুলি আমার অনুরোধ করা বিকল্পগুলির সাথে মেলে না, তবে বাইন্ড মাউন্টের পঠন / লেখার আচরণ এবং মূলত মাউন্ট /dev/sda2করার জন্য ব্যবহৃত বিকল্পগুলির সাথে উভয়ই মিলছে do/

/dev/sda2 / ext4 rw,noatime,data=ordered 0 0

তবে, আমি যদি মাউন্টটি পুনরায় মাউন্ট করি তবে এটি কেবল পঠনযোগ্য বিকল্পটিকে সম্মান করে

# mount --bind -o remount,ro test/ /mnt
# touch /mnt/bar
touch: cannot touch ‘/mnt/bar’: Read-only file system

এবং প্রাসঙ্গিক এন্ট্রি /proc/mounts/

/dev/sda2 /mnt ext4 ro,relatime,data=ordered 0 0

দেখে মনে হচ্ছে যা আমি আশা করতে পারি (যদিও সত্যে আমি testডিরেক্টরিটির পুরো পথটি দেখতে আশা করব )। /proc/mounts/অরিনগাল মাউন্ট-এর /dev/sda2/অন এন্ট্রিটিও /অপরিবর্তিত এবং পড়া / লেখার অবধি রয়েছে

/dev/sda2 / ext4 rw,noatime,data=ordered 0 0

এই আচরণ এবং চারপাশের কাজগুলি কমপক্ষে ২০০৮ সাল থেকে জানা ছিল এবং এর ম্যান পেজে ডকুমেন্টেড রয়েছেmount

নোট করুন যে ফাইল-সিস্টেম মাউন্ট অপশনগুলি মূল মাউন্ট পয়েন্টের মতোই থাকবে এবং --bind / - rbind সহ -o বিকল্পটি পাস করার মাধ্যমে পরিবর্তন করা যাবে না। মাউন্ট অপশনগুলি পৃথক পুনরায় গণনা কমান্ড দ্বারা পরিবর্তন করা যেতে পারে

সমস্ত বিতরণ একই রকম আচরণ করে না। আর্চ চুপচাপ বিকল্পগুলি সম্মান করতে ব্যর্থ হয়েছে বলে মনে হচ্ছে যখন বাঁধন মাউন্টটি কেবল পঠনযোগ্য মাউন্টটি পায় না তখন ডেবিয়ান একটি সতর্কতা উত্পন্ন করে

mount: warning: /mnt seems to be mounted read-write.

এমন একটি প্রতিবেদন রয়েছে যে ডেবিয়ান লেনি এবং স্কিজে এই আচরণটি "স্থির" ছিল যদিও এটি সর্বজনীন স্থির হিসাবে দেখা যায় না বা এটি এখনও ডেবিয়ান হুইজে কাজ করে না। প্রাথমিক মাউন্টটিতে কেবল পঠনযোগ্য বিকল্পটি বাঁধার মাউন্ট তৈরির সাথে কঠিনভাবে কী যুক্ত?


আপনার কি একটি / ইত্যাদি / এমটিএবি আছে?
eyoung100

আরও দেখুন thread.gmane.org/gmane.linux.utilities.util-linux-ng/2979 এবং ব্যবহার করে একটি কার্যসংক্রান্ত mount -t bindএবং একটি সাহায্যকারী স্ক্রিপ্ট bugs.launchpad.net/ubuntu/+source/mountall/+bug/519380
Stéphane চেজেলাস

@ECarterYoung হ্যাঁ আমি একজন আছে /etc/mtab। প্রাথমিক মাউন্টের পরে এন্ট্রিটি বলে যে মাউন্টটি rw এবং পুনঃসমাজের পরে এটি ro বলে, সুতরাং এটি মাউন্টের অবস্থা সঠিকভাবে জানাচ্ছে। এটি কেবল মাউন্ট কমান্ড ব্যর্থ হয়।
স্ট্রংব্যাড 16

3
আমি দুটি ডিবিয়ান টেস্টিং / অস্থির মেশিনে পরীক্ষা করেছি, একটি ডেবিয়ান কার্নেল চালাচ্ছে এবং একটি কার্নেল.আর। কার্নেল চালাচ্ছে, দু'জনের সাথেই কাজ করছে না mount --bind -o ro, তারা দু'জনেই একটি বার্তা ছুঁড়ে দিয়েছে mount: warning: «mountpoint» seems to be mounted read-write.তাই ডিবিয়ান মনে হয় প্যাচটি কিছুটা ফেলেছে বা হারিয়ে গেছে ... রিমান্ট কাজ করে, যদিও।
ডার্ববার্ট

2
@ স্ট্রংব্যাড অনুরোধ অনুসারে পরীক্ষিত, এবং এটিও কার্যকর হয় না।
ডার্ববার্ট

উত্তর:


21

বিন্দু মাউন্ট ঠিক ... ভাল ... একটি বিন্দু মাউন্ট। অর্থাৎ এটি কোনও নতুন মাউন্ট নয়। এটি কেবলমাত্র "লিঙ্কগুলি" / "এক্সপোজ" / "" একটি উপ-ডিরেক্টরিকে নতুন মাউন্ট পয়েন্ট হিসাবে বিবেচনা করে। যেমন এটি মাউন্ট পরামিতি পরিবর্তন করতে পারে না। এজন্য আপনি অভিযোগ পেয়ে যাচ্ছেন:

# mount /mnt/1/lala /mnt/2 -o bind,ro
mount: warning: /mnt/2 seems to be mounted read-write.

তবে আপনি যেমন বলেছিলেন যে একটি সাধারণ বাঁধাই কাজ করে:

# mount /mnt/1/lala /mnt/2 -o bind

এবং তারপরে একটি রো রিমান্টও কাজ করে:

# mount /mnt/1/lala /mnt/2 -o bind,remount,ro 

তবে যা ঘটে তা হ'ল আপনি পুরো মাউন্টটি পরিবর্তন করছেন এবং কেবল এই বাঁধাই মাউন্টটিই নয়। আপনি যদি / প্রোক / মাউন্টগুলি একবার দেখে থাকেন তবে দেখবেন যে বাঁধাই মাউন্ট এবং আসল মাউন্ট উভয়ই কেবল পঠনযোগ্যতে পরিবর্তিত হবে:

/dev/loop0 /mnt/1 ext2 ro,relatime,errors=continue,user_xattr,acl 0 0
/dev/loop0 /mnt/2 ext2 ro,relatime,errors=continue,user_xattr,acl 0 0

সুতরাং আপনি যা করছেন তা হ'ল প্রাথমিক মাউন্টটিকে কেবল পঠনযোগ্য মাউন্টে পরিবর্তন করা এবং তারপরে একটি বাঁধাই মাউন্ট করা যা অবশ্যই পঠনযোগ্য।

আপডেট ২০১ 2016-০7-২০:

নিম্নলিখিত 4.5 টি কার্নেলের ক্ষেত্রে সত্য, তবে 4.3 কার্নেলের ক্ষেত্রে সত্য নয় (এটি ভুল। নীচে আপডেট # 2 দেখুন):

কার্নেলের দুটি পতাকা রয়েছে যা কেবলমাত্র পঠন নিয়ন্ত্রণ করে:

  • দ্য MS_READONLY: মাউন্টটি কেবল পঠনযোগ্য কিনা তা নির্দেশ করে
  • এটি MNT_READONLY: "ব্যবহারকারী" এটি কেবল পঠনযোগ্য চায় কিনা তা নির্দেশ করে

একটি 4.5 কার্নেল এ, mount -o bind,roউইল করা আসলে কৌশলটি করে। উদাহরণস্বরূপ, এটি:

# mkdir /tmp/test
# mkdir /tmp/test/a /tmp/test/b
# mount -t tmpfs none /tmp/test/a
# mkdir /tmp/test/a/d
# mount -o bind,ro /tmp/test/a/d /tmp/test/b

শুধুমাত্র-পঠনযোগ্য বেঁধে মাউন্ট তৈরি করবে /tmp/test/a/dকরার /tmp/test/b, যা দৃশ্যমান হবে /proc/mountsহিসাবে:

none /tmp/test/a tmpfs rw,relatime 0 0
none /tmp/test/b tmpfs ro,relatime 0 0

আরও বিশদ বিবরণ এতে দৃশ্যমান /proc/self/mountinfo, যা ব্যবহারকারীর দৃষ্টিভঙ্গি (নেমস্পেস) বিবেচনা করে। সম্পর্কিত লাইনগুলি হ'ল:

363 74 0:49 / /tmp/test/a rw,relatime shared:273 - tmpfs none rw
368 74 0:49 /d /tmp/test/b ro,relatime shared:273 - tmpfs none rw

দ্বিতীয় লাইনে আপনি কোথায় দেখতে পাবেন যে এটি ro( MNT_READONLY) এবং rw( !MS_READONLY) উভয়ই বলে says

শেষ ফলাফলটি হ'ল:

# echo a > /tmp/test/a/d/f
# echo a > /tmp/test/b/f
-su: /tmp/test/b/f: Read-only file system

আপডেট ২০১ 2016-০7-২০ # 2:

এর থেকে আরও কিছু খনন করে দেখানো হয় যে আচরণটি আসলে ব্যবহার-লিনাক্সের অংশ লিবমাউন্টের সংস্করণের উপর নির্ভর করে। এই প্রতিশ্রুতি দিয়ে এর জন্য সমর্থন যুক্ত করা হয়েছিল এবং এটি ২.২27 সংস্করণে প্রকাশিত হয়েছিল:

প্রতিশ্রুতিবদ্ধ 9ac77b8a78452eab0612523d27fi52159f5016a
লেখক: কারেল জাক 
তারিখ: সোমবার 17 আগস্ট 11:54:26 2015 +0200

    libmount: "বাইন্ড, রো" এর জন্য সমর্থন যোগ করুন

    কেবলমাত্র পঠনযোগ্য তৈরি করতে এখন দুটি মাউন্ট (8) কল ব্যবহার করা দরকার
    মাউন্ট করুন:

      মাউন্ট / foo / বার-বাঁধাই
      মাউন্ট / বার -ও রিমান্ট, রো, বাইন্ড

    এই প্যাচটি "বাঁধাই, রো" নির্দিষ্ট করার অনুমতি দেয় এবং পুনরায় কাজ শেষ হয়ে যায়
    অতিরিক্ত মাউন্ট (2) সিস্টেল দ্বারা স্বয়ংক্রিয়ভাবে libmount দ্বারা। এটা না
    অবশ্যই পারমাণবিক

    সাইন-অফ-বাই: কারেল জাক 

যা কর্মক্ষেত্রও সরবরাহ করে। পুরানো এবং আরও নতুন মাউন্টে স্ট্রেস ব্যবহার করে আচরণটি দেখা যায়:

পুরানো:

mount("/tmp/test/a/d", "/tmp/test/b", 0x222e240, MS_MGC_VAL|MS_RDONLY|MS_BIND, NULL) = 0 <0.000681>

নতুন:

mount("/tmp/test/a/d", "/tmp/test/b", 0x1a8ee90, MS_MGC_VAL|MS_RDONLY|MS_BIND, NULL) = 0 <0.011492>
mount("none", "/tmp/test/b", NULL, MS_RDONLY|MS_REMOUNT|MS_BIND, NULL) = 0 <0.006281>

উপসংহার:

কাঙ্ক্ষিত ফলাফল অর্জন করতে একজনকে দুটি কমান্ড চালানো দরকার (যেমন থমাস ইতিমধ্যে বলেছে):

mount SRC DST -o bind
mount DST -o remount,ro,bind

মাউন্ট (ইউজন-লিনাক্স> = 2.27) এর নতুন সংস্করণগুলি যখন রান হয়ে যায় তখন স্বয়ংক্রিয়ভাবে এটি করে

mount SRC DST -o bind,ro

3
হ্যাঁ, তবে না আইআইআরসি-র বিভিন্ন বিকল্পের জন্য বিভিন্ন মাউন্ট পয়েন্টগুলির জন্য (ফাইল সিস্টেম নয়) কার্নেলে কিছু সমর্থন রয়েছে । দেবিয়ান একটি প্যাচ ব্যবহার করত যা mount -o bind,roকেবল পঠন-পাঠানোর ফাইল সিস্টেমের পঠনযোগ্য দর্শন তৈরি করে (তবে এটি আর হুইজি বলে মনে হয় না)।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

আমি দেখতে পাচ্ছি না যে এটি কীভাবে উপরের বিপরীতে rad হ্যাকগুলি এমন সমস্ত জিনিসকে মঞ্জুরি দিতে পারে যার মধ্যে খুব বেশি অর্থ হয় না including বর্তমানে ৩.১৪ কার্নেলের কেবল পঠনযোগ্য রিমাউন্টটি শেষ পর্যন্ত এই কলটি দ্বারা পরিচালনা করা হবে: mnt_make_readonly (রিয়েল_মাউন্ট (mnt)), যা আপনি দেখতে পাচ্ছেন রিয়েল_মাউন্ট () ব্যবহার করে, তাই এটি কার্যত বাস্তবের মাউন্টকে প্রভাবিত করে এবং এতে বাইন্ড মাউন্টগুলি নতুনকে প্রতিফলিত করে (কেবল পঠনযোগ্য) মাউন্ট পতাকা। কমপক্ষে এটি আমার বোঝাপড়া।
V13

সুতরাং এটি "স্প্রেড স্ট্রাক্ট মাউন্ট" প্যাচ (বিশেষত এই প্রতিশ্রুতিবদ্ধ ) এর ফলাফল হবে, প্রথমে কার্নেল ৩.৩ প্রদর্শিত হবে। আপনি কি জানেন যে এই প্যাচটির পরিণতিগুলি lkML বা lwn নিয়ে আলোচনা করা হয়েছিল?
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

7
mount --bind /tmp/ /mnt/tmp/; mount -o remount,bind,ro /mnt/tmp/... তবে touch /tmp/aঠিক আছে, কিন্তু touch /mnt/tmp/bদেয় touch: cannot touch ‘/mnt/tmp/b’: Read-only file system। এটি ডেবিয়ান 3.13 এবং কার্নেল.org 3.14 উভয় ক্ষেত্রেই কাজ করে। সুতরাং এটি পুরো মাউন্টটি পরিবর্তন করে না। কমপক্ষে সাম্প্রতিক কার্নেলের সাথে নয়।
ডারোবার্ট

1
সম্ভবত একটি বিবৃতি "বাঁধার মাউন্ট ঠিক আছে ... ভাল ... একটি বাঁধাই মাউন্ট।" সত্যিই গুরুত্বপূর্ণ কিন্তু আমার কাছে কিছুই বোঝায় না। আমি কেন বুঝতে পারি না কেন এটি পুনঃসমাধ্যম বিকল্পের সাথে দ্বিতীয় বার কাজ করে।
স্ট্রংব্যাড

9

সঠিক সমাধানটি হ'ল এটি দুটিবার মাউন্ট করা। কমান্ড লাইনে:

mount -t none -o bind /source/dir /destination/dir
mount -t none -o bind,remount,ro /source/dir /destination/dir

ইন /etc/fstab:

/source/dir            /destination/dir    none  bind            0 0
/source/dir            /destination/dir    none  remount,bind,ro 0 0

ম্যানুয়াল ( man mount) এটিকে এভাবে জানায়:

   The bind mounts.
          Since Linux 2.4.0 it is possible to remount part of the file hierarchy somewhere else. The call is
                 mount --bind olddir newdir
   [...]
          Note that the filesystem mount options will remain the same as those on the original mount point, and cannot be changed  by  passing  the  -o  option
          along with --bind/--rbind. The mount options can be changed by a separate remount command, for example:
          .
                 mount --bind olddir newdir
                 mount -o remount,ro newdir
          .
          Note  that  behavior  of  the remount operation depends on the /etc/mtab file. The first command stores the 'bind' flag to the /etc/mtab file and the
          second command reads the flag from the file.  If you have a system without the /etc/mtab file or if you explicitly define source and target  for  the
          remount command (then mount(8) does not read /etc/mtab), then you have to use bind flag (or option) for the remount command too. For example:
          .
                 mount --bind olddir newdir
                 mount -o remount,ro,bind olddir newdir

এটি কমপক্ষে উবুন্টু 14.04 এলটিএস এবং কার্নেল 3.19.0-51-lowlatency নিয়ে কাজ করবে বলে মনে হচ্ছে। নিস!
মিক্কো রেন্টালাইনেন

0

আপনি mount(8)কমান্ড লাইনের দৃষ্টিকোণ থেকে জিজ্ঞাসা করছেন (যা এই সাইটে গ্রহণযোগ্য)। এই আদেশটি অন্যান্য উত্তরে আলোচনা করা হয়েছে এবং কিছু ক্ষেত্রে প্রয়োজনীয় দ্বিতীয় mount(2)সিস্টেম কলকে বিমূর্ত করে তোলে।

তবে কেন দ্বিতীয় সিস্টেম কল প্রয়োজন? কেন একটি একক mount(2)কল কেবল পঠনযোগ্য বাইন্ড মাউন্ট তৈরি করতে পারে না ?

mount(2)Man পৃষ্ঠা ব্যাখ্যা করে সেখানে আছে অন্যদের নির্দিষ্ট করেছি, দুটি সেট পতাকা সেট হচ্ছে:

  • অন্তর্নিহিত ফাইল সিস্টেম পতাকা
  • ভিএফএস মাউন্ট-পয়েন্ট পতাকা

এটা বলে:

যেহেতু লিনাক্স ২.6.১6, MS_RDONLYসেট আপ বা মাউন্ট-পয়েন্ট ভিত্তিতে বা অন্তর্নিহিত ফাইল সিস্টেমের উপর সাফ করা যায়। মাউন্ট করা ফাইল সিস্টেম কেবল তখনই লিখনযোগ্য হবে যদি ফাইল-সিস্টেম বা মাউন্টপয়েন্ট দুটিই কেবল পঠনযোগ্য হিসাবে পতাকাঙ্কিত না হয়।

এবং সম্পর্কিত MS_REMOUNT:

লিনাক্স ২.6.২6 থেকে, এই পতাকাটি MS_BINDকেবলমাত্র প্রতি মাউন্ট-পয়েন্ট ফ্ল্যাগগুলি সংশোধন করতে ব্যবহার করা যেতে পারে । এটি অন্তর্নিহিত ফাইল সিস্টেম পরিবর্তন না করে মাউন্ট পয়েন্টে "কেবল পঠনযোগ্য" পতাকা সেট বা পরিষ্কার করার জন্য বিশেষভাবে কার্যকর। মাউন্টফ্লেগগুলি উল্লেখ করে:

      MS_REMOUNT | MS_BIND | MS_RDONLY

অন্যান্য মাউন্ট পয়েন্টগুলিকে প্রভাবিত না করেই কেবল এই মাউন্টপয়েন্টের মাধ্যমে পঠনযোগ্য অ্যাক্সেস তৈরি করবে।

আমি মনে করি যখন বাঁধাইয়ের মাউন্টগুলি প্রথম চালু করা হয়েছিল তখন সমস্যাটি এসেছিল:

যদি মাউন্টফ্ল্যাগগুলি অন্তর্ভুক্ত থাকে MS_BIND(লিনাক্স ২.৪ থেকে পাওয়া যায়), তবে একটি বাইন্ড মাউন্ট করুন। ... মাউন্টফ্ল্যাজ যুক্তিতে অবশিষ্ট বিটগুলিও বাদ দেওয়া হয়, বাদে MS_REC। (বাইন্ড মাউন্টের অন্তর্নিহিত মাউন্ট পয়েন্টের মতো একই মাউন্ট বিকল্প রয়েছে))

দেখে মনে হচ্ছে যে, MS_BIND | MS_REMOUNTকেবল ভিএফএস পতাকা সেট করার জন্য সিগন্যাল হিসাবে ব্যবহার না করে তারা MS_RDONLYপ্রাথমিকের পাশাপাশি (এবং গ্রহণযোগ্য) বাদে MS_BINDমাউন্ট পয়েন্টে প্রয়োগ করতে পারে।

সুতরাং mount(2)সিস্টেম কলটির কিছুটা বিজোড় শব্দার্থক কারণে :

  • প্রথম কলটি বাইন্ড মাউন্ট তৈরি করে এবং অন্যান্য সমস্ত পতাকা অগ্রাহ্য করা হয়
  • দ্বিতীয় কল (পুনঃতফসিল সহ) মাউন্ট-পয়েন্ট ফ্ল্যাগগুলি কেবল পঠন করতে সেট করে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.