همون طور که میدونید در لینوکس برای دسترسی به درایوها باید اونها رو در یک فولدر mount کرد. ولی جالبه که بدونید میتونیم هر یک از محتویات یک درایو ماونت شده رو هم در جاهای دیگه ماونت کرد! به این کار میگن bind (بخوانید بایند) دو تا فولدر به هم.
یک چیزی شبیه به ایجاد کردن لینک که با دستور ln
انجام میدیم. منتها با یک سری تفاوت های کوچک...
ln
ما یک شورتکات از مقصد میسازیم. درواقع فولدر واقعی وجود نداره. اما در bind ما یک فولدر میسازیم و محتویات یک فولدر دیگه رو داخلش ماونت میکنیم.bindfs
هم bind کرد که نیاز به دسترسی root نداره، ولی خب برای نصب پکیج باید دسترسی root داشته باشید!من در هاردم، چند تا فولدر دارم به نام های Documents, Downloads, Pictures, Videos, Music. یعنی همون هایی که در فولدر home کاربری هم داریم. تا الان با ln یک شورتکات از هر کدوم این ها در فولدر home داشتم. ولی حالا فولدرهای روی هارد رو با فولدرهای متناظرشون در فولدر home کاربر bind کردم. ظاهر قضیه بهتر شده. یعنی دیگه خبری از فلش روی آیکن نیست و انگار واقعا همه چیز در home قرار داره.
توجه: بعد از نوشتن این مطلب متوجه شدم فعلا امکان Trash کردن فایلها در مسیرهای bind شده دستکم در دسکتاپها وجود نداره. ولی در cli با trash-cli میشه اینکار رو کرد. اما بعدا متوجه شدم که با bindfs میشه! پایین تر توضیح دادم.
برای اینکه بدونید چطوری، ادامه مطلب رو ببینید...
این کار رو میشه هم با fstab انجام داد و هم با یونیت های mount در systemd که در این مطلب توضیح دادم چی هستن.
برای اینکه همین الان دو تا فولدر رو به هم bind کنیم از دستور mount استفاده میکنیم. مثلا:
$ sudo mount --bind /data/sdb/Documents /home/amin/Documents
کافیه مطابق با الگوی زیر، دو تا فولدری که میخواید با هم bind بشن رو در فایل fstab اضافه کنید:
$ sudo nano /etc/fstab
/data/sdb/Documents /home/amin/Documents none bind 0 0
دقت کنید که ستون اول از چپ مربوط به فولدر مبدا و ستون دوم مربوط به فولدر مقصد هست. و ضمنا پارتیشن اصلی هم در fstab قبل از bindها وجود داشته باشه.
اول مطلب قبلی رو بخونید. ما باید پارتیشن اصلی رو هم از همین طریق ماونت کنیم. در اینجا میبینید که بوسیله یونیت 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 این مورد رفع شده.
همون طور که گفتم اگر با 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
حاصل سر و کله زدن های من با لینوکس