توجه: اقدامات زیر ممکنه باعث بشه سیستم شما موقتا بوت نشه. بنابراین با دقت کامل و با جست و جوی بیشتر در این مورد، عمل بفرمایید.
systemd میتونه بدون نیاز به فایل fstab پارتیشن ها رو مونت کنه. قبلا توضیح دادم چطوری. اما در این پست میخوام بگم systemd با استفاده از systemd-gpt-auto-generator میتونه پارتیشن های سیستمی رو بدون اینکه ما دخالتی داشته باشیم و حتی یونیت برای اونها بسازیم، مونت کنه. البته به شرطی که شما از هوک systemd در ساخت ایمیج کرنل استفاده کرده باشید.
منظور از پارتیشن های سیستمی یعنی پارتیشن روت در /
پارتیشن بوت در /boot
یا /efi
پارتیشن هوم در /home
و همچنین پارتیشن های دیگه از جمله /var
و var/tmp
و... مونت بشن.
توجه: حتما یک نسخه live روی مموری داشته باشید تا اگر با دستکاری های زیر دچار مشکل شدید بتونید قضیه رو حل کنید.
برای این کار اول اینکه باید پارتیشن های شما از نوع GPT باشند تا هر کدوم یک آی دی خاصی که بهشون Partition Type GUID میگن اختصاص داده بشه. در واقع systemd با استفاده از این نوع پارتیشن ها رو مشخص میکنه و اونها رو در جایی که باید، مونت میکنه. با این کار دیگه نیازی به فایل fstab نیست و نیازی هم به اضافه کردن مسیر پارتیشن root در خط کرنل بوت لودر هم نیست.
سالها برای مونت کردن درایوهای ntfs در لینوکس، باید ntfs-3g
رو نصب میکردیم و در متغیرهای مونت، نوع فایلسیستم رو ntfs-3g قرار میدادیم. اما از کرنل 5.15 درایور اختصاصی ntfs-3 با قابلیت خواندن و نوشتن در خود کرنل گنجانده شده و دیگه لازم نیست ntfs-3g
رو نصب داشته باشیم.
و الان که کرنل در نسخه ۶.۷ بسر میبره، این درایور پیشرفت های زیادی داشته و حتی در مواردی بهتر از ntfs-3g هم عمل میکنه. و متغیرهای جالبی هم برای مونت درایو داره. از جمله:
nohidden
: فایلها و فولدرهایی که در ویندوز hidden هستند (مثل فولدر system volume information) در لینوکس هم مخفی بمانند.sys_immutable
: فایلها و فولدرهایی که در ویندوز سیستمی تلقی میشن و قابل write نیستند، در لینوکس هم همین ویژگی رو داشته باشند.hide_dot_files
: فایلها و فولدرهایی که در لینوکس میسازیم و اونها رو با گذاشتن یک نقطه در ابتدای اسمشون مخفی میکنیم، در ویندوز هم hidden شناخته خواهند شد.windows_names
: نام فایلها و فولدرهایی که در لینوکس انتخاب میکنیم، با شیوه نام گذاری فایلها در ویندوز مغایرت نداشته باشند.force
: وقتی درایو در ویندوز هایبرنیت شده (که قابل مونت با ntfs-3g نیست) با این متغیر قابل مونت میشه.کافیه برای استفاده از درایور ntfs کرنل، بجای ntfs-3g از ntfs-3 استفاده کنید و متغیرها رو بر اساس شیوه جدید تنظیم کنید. از هر نوع روشی که برای مونت استفاده میکنید مهم نیست، از دستور مستقیم mount یا فایل fstab یا یونیت های systemd. مثلا برای دستور مستقیم:
# mount -t ntfs-3 -o rw,nodev,noatime,nohidden,windows_names,uid=1000,gid=1000 /dev/sdXX /data/driveC
بعد از اینکه تست کردید و همه چیز اوکی بود، میتونید بسته ntfs-3g رو حذف کنید. اگر یک روزی خواستید از دستور ntfsfix استفاده کنید میبایست بسته ntfsprogs-ntfs3 رو از AUR نصب کنید.
شاید تا حالا براتون سوال پیش اومده باشه که در mount کردن درایوها، اون defaults چیه که همه جا هست؟!
باید بگم که متغیر defaults شامل یک سری متغیرها است که بجای نوشتن همه اونها، شما فقط کافیه defaults رو بنویسید. تا سیستم موقع مونت کردن درایو (مثلا از روی فایل fstab) اون متغیرها رو اعمال کنه.
ما میتونیم این متغیرهای پیشفرض رو طبق سلیقه خودمون تغییر بدیم! برای این کار، کافیه فایل زیر رو یک نگاهی بیندازید:
$ nano /etc/udisks2/mount_options.conf.example
توضیحات فایل گویای خودش هست. شما میتونید برای انواع فایل سیستم (ext4 یا ntfs یا vfat و...) متغیر های پیشفرض خودتون رو تعیین کنید. از فایل نمونه بالا استفاده کنید و فایل نهایی رو بدون پسوند example در همون مسیر ذخیره کنید.
همون طور که میدونید در لینوکس برای دسترسی به درایوها باید اونها رو در یک فولدر 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 میشه! پایین تر توضیح دادم.
برای اینکه بدونید چطوری، ادامه مطلب رو ببینید...
برای دسترسی به درایوها در لینوکس باید اونها رو اصطلاحا mount کنیم. یعنی یک فولدر بسازیم و به سیستم عامل بگیم که درایو مورد نظر ما رو داخلش نشون بده. برای اینکه این کار حین بوت انجام بشه، به طور سنتی از فایل /etc/fstab
استفاده میکردیم.
اما با ظهور systemd و رفتن توزیع ها به سمت اون، تغییرات جدیدی در نحوه مدیریت خیلی چیزها از جمله ماونت کردن درایو ها ایجاد شد. systemd فایل fstab رو موقع بوت بررسی میکنه و به ازای هر ردیفی که داخلش وجود داره یک یونیت mount درست میکنه و سپس درایو مورد نظر ماونت میشه.
چرا ما از اول خودمون این یونیت ها رو آماده نکنیم؟ که دیگه systemd مجبور نباشه در هر بوت اونها رو تولید کنه و بعد ماونت کنه؟ در این نوشته میخوام بگم من چطوری پارتیشن مورد نظرم رو با استفاده از systemd موقع بوت ماونت میکنم و دیگه توی fstab ردیفی برای اون قرار ندادم.
استفاده از systemd برای ماونت این فواید رو داره:
وقتی با دسکتاپ های لینوکس کار میکنید و یک USB Storage متصل میکنید، ممکنه از خودتون بپرسید چه فرقی بین انجام Safe remove و unmount کردن usb شما است؟
با unmount یک درایو، دیگه عملیات خواندن یا نوشتن روی اون انجام نمیشه. ولی درایو هنوز به پورت متصل هست و برق داخلش جریان داره. و در لیست درایوهای شما قابل دیدن هست.
ولی با Safe remove کردن درایو، دیگه برق هم قطع میشه و درایو شما کاملا Off میشه. این طوری میتونیم با خیال راحت تری درایو رو از پورت جدا کنیم.
برای اینکار، اگر از systemd استفاده میکنید میتونید با دستورهای زیر ابتدا درایو رو unmount و سپس safe remove کنید. توجه داشته باشید که sda رو مطابق با درایو مورد نظرتون انتخاب کنید
udisksctl unmount -b /dev/sda1 udisksctl power-off -b /dev/sda
اما اگر از systemd استفاده نمیکنید، میتونید از دستور زیر استفاده کنید
udisks --unmount /dev/sda1 udisks --detach /dev/sda
حاصل سر و کله زدن های من با لینوکس