bind در mount

امین 24 فوریه 2024 زمان خواندن: 4 دقیقه

همون طور که میدونید در لینوکس برای دسترسی به درایوها باید اونها رو در یک فولدر mount کرد. ولی جالبه که بدونید میتونیم هر یک از محتویات یک درایو ماونت شده رو هم در جاهای دیگه ماونت کرد! به این کار میگن bind (بخوانید بایند) دو تا فولدر به هم.

یک چیزی شبیه به ایجاد کردن لینک که با دستور ln انجام میدیم. منتها با یک سری تفاوت های کوچک...

  • در لینک کردن با ln ما یک شورتکات از مقصد میسازیم. درواقع فولدر واقعی وجود نداره. اما در bind ما یک فولدر میسازیم و محتویات یک فولدر دیگه رو داخلش ماونت میکنیم.
  • انجام bind توسط mount نیاز به دسترسی root داره. البته میشه با پکیج bindfs هم bind کرد که نیاز به دسترسی root نداره، ولی خب برای نصب پکیج باید دسترسی root داشته باشید!
  • در bind کردن دو فولدر به هم، دیگه اون شورتکات فِلِش در گوشه آیکن وجود نخواهد داشت.

من در هاردم، چند تا فولدر دارم به نام های Documents, Downloads, Pictures, Videos, Music. یعنی همون هایی که در فولدر home کاربری هم داریم. تا الان با ln یک شورتکات از هر کدوم این ها در فولدر home داشتم. ولی حالا فولدرهای روی هارد رو با فولدرهای متناظرشون در فولدر home کاربر bind کردم. ظاهر قضیه بهتر شده. یعنی دیگه خبری از فلش روی آیکن نیست و انگار واقعا همه چیز در home قرار داره.

توجه: بعد از نوشتن این مطلب متوجه شدم فعلا امکان Trash کردن فایلها در مسیرهای bind شده دست‌کم در دسکتاپ‌ها وجود نداره. ولی در cli با trash-cli میشه اینکار رو کرد. اما بعدا متوجه شدم که با bindfs میشه! پایین تر توضیح دادم.

برای اینکه بدونید چطوری، ادامه مطلب رو ببینید...

این کار رو میشه هم با fstab انجام داد و هم با یونیت های mount در systemd که در این مطلب توضیح دادم چی هستن.

انجام bind موقت

برای اینکه همین الان دو تا فولدر رو به هم bind کنیم از دستور mount استفاده میکنیم. مثلا:

$ sudo mount --bind /data/sdb/Documents /home/amin/Documents

انجام bind در fstab

کافیه مطابق با الگوی زیر، دو تا فولدری که میخواید با هم bind بشن رو در فایل fstab اضافه کنید:

$ sudo nano /etc/fstab
/data/sdb/Documents /home/amin/Documents none bind 0 0

دقت کنید که ستون اول از چپ مربوط به فولدر مبدا و ستون دوم مربوط به فولدر مقصد هست. و ضمنا پارتیشن اصلی هم در fstab قبل از bindها وجود داشته باشه.

انجام bind با systemd

اول مطلب قبلی رو بخونید. ما باید پارتیشن اصلی رو هم از همین طریق ماونت کنیم. در اینجا میبینید که بوسیله یونیت data-sdb.mount پارتیشن اصلی ماونت میشه و این bind ها وقتی عمل میکنند که data-sdb.mount عمل کرده باشه و پارتیشن ماونت شده باشه.

برای ایجاد bind یک یونیت mount بسازید و مطابق با الگوی زیر فولدر مورد نظر خودتون رو قرار بدید. توجه داشته باشید که برای هر کدوم از فولدرها باید یک یونیت جداگانه داشته باشیم. و اسم یونیت هم میبایست متناظر با مسیری باشه که در نظر داریم. مثلا:

$ sudo nano /etc/systemd/system/home-amin-Documents.mount[Unit]
Documentation=Bind mount: Documents
After=data-sdb.mount

[Mount]
What=/data/sdb/Documents
Where=/home/amin/Documents
Type=none
Options=bind,x-gvfs-hide,nofail

[Install]
WantedBy=data-sdb.mount

و بعد این یونیت رو یک بار start و اگر مشکلی وجود نداشت enable میکنیم تا موقع بوت این کارها خودبخود انجام بشه:

$ sudo systemctl start home-amin-Documents.mount 
$ sudo systemctl enable
home-amin-Documents.mount

در Options عبارت x-gvfs-hide رو میبینید. بخاطر اینه که این bindها در واقع یک mount point هستند و مثل یک درایو در سایدبار فایل منیجر شما نشون داده میشن. با این عبارت به سیستم میگیم که این ها رو توی سایدبار بعنوان یک درایو نشون نده. متاسفانه با fstab این عبارت عمل نکرد و من در جست و جوهام به جایی نرسیدم. درواقع همه همین مشکل رو داشتند. ولی با یونیت systemd این مورد رفع شده.

انجام bind با bindfs

همون طور که گفتم اگر با mount بخوایم دو تا فولدر رو بایند کنیم، امکان فرستدن فایلها به trash رو نخواهیم داشت. ولی ابزاری وجود داره به نام bindfs که این محدودیت رو نداره و فایلها راحت trash میشن. برای این کار، bindfs رو از AUR نصب کنید.

یک مثال برای دستور مستقیم برای مونت این هست: (مبدا: /data/sdb/Documents)

$ sudo bindfs /data/sdb/Documents /home/amin/Documents

تنظیمات bindfs در fstab میتونه به شکل زیر باشه. پیشنهاد میکنم ابتدا مسیر درایو اصلی رو در fstab در بالای مواردی که میخواید بایند کنید قرار بدید:

$ sudo nano /etc/fstab
/dev/sdb1 /data/sdb ext4 nosuid,nodev,nofail,defaults,rw,noatime,x-gvfs-hide,commit=60,x-systemd bindfs#/data/sdb/Documents /home/amin/Documents fuse noatime,user,comment=x-gvfs-hide,x-systemd.requires=/data/sdb 0 0 bindfs#/data/sdb/Downloads /home/amin/Downloads fuse noatime,user,comment=x-gvfs-hide,x-systemd.requires=/data/sdb 0 0 bindfs#/data/sdb/Music /home/amin/Music fuse noatime,user,comment=x-gvfs-hide,x-systemd.requires=/data/sdb 0 0 bindfs#/data/sdb/Pictures /home/amin/Pictures fuse noatime,user,comment=x-gvfs-hide,x-systemd.requires=/data/sdb 0 0 bindfs#/data/sdb/Videos /home/amin/Videos fuse noatime,user,comment=x-gvfs-hide,x-systemd.requires=/data/sdb 0 0

یونیت مونت هم برای هر کدوم از بایندها احتمالا میتونه به شکل زیر باشه (تست نکردم):

[Unit]
Documentation=Bindfs Documents
After=data-sdb.mount

[Mount]
What=bindfs#/data/sdb/Documents
Where=/home/amin/Documents
Type=fuse
Options=noatime,user,comment=x-gvfs-hide

[Install] WantedBy=data-sdb.mount

اولین نفری باشید که دیدگاهی ارسال می کند!




حاصل سر و کله زدن های من با لینوکس