استفاده از systemd برای mount درایوها

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

برای دسترسی به درایوها در لینوکس باید اونها رو اصطلاحا mount کنیم. یعنی یک فولدر بسازیم و به سیستم عامل بگیم که درایو مورد نظر ما رو داخلش نشون بده. برای اینکه این کار حین بوت انجام بشه، به طور سنتی از فایل /etc/fstab استفاده میکردیم.

اما با ظهور systemd و رفتن توزیع ها به سمت اون، تغییرات جدیدی در نحوه مدیریت خیلی چیزها از جمله ماونت کردن درایو ها ایجاد شد. systemd فایل fstab رو موقع بوت بررسی میکنه و به ازای هر ردیفی که داخلش وجود داره یک یونیت mount درست میکنه و سپس درایو مورد نظر ماونت میشه. 

چرا ما از اول خودمون این یونیت ها رو آماده نکنیم؟ که دیگه systemd مجبور نباشه در هر بوت اونها رو تولید کنه و بعد ماونت کنه؟ در این نوشته میخوام بگم من چطوری پارتیشن مورد نظرم رو با استفاده از systemd موقع بوت ماونت میکنم و دیگه توی fstab ردیفی برای اون قرار ندادم.

استفاده از systemd برای ماونت این فواید رو داره:

  • میتونید مشخص کنید درایو شما در چه زمانی ماونت بشه
  • میتونید مشخص کنید درایو شما فقط وقتی ماونت بشه که بهش نیاز دارید (Automount)
  • اگر مشکلی در فایل fstab وجود داشت، کل سیستم تحت تاثیر قرار نمیگیره، و فقط یک یونیت هست که دچار مشکل میشه.
  • به راحتی میتونیم با بررسی status یونیت مورد نظر، مشکل احتمالی رو پیدا کنیم.

ایجاد یک یونیت Mount

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

$ sudo blkid

مقدار UUID برای پارتیشن مورد نظرتون رو یک جا کپی کنید و داشته باشید. و فرمت پارتیشن رو هم که در قسمت TYPE میگه در نظر داشته باشید.

تصمیم بگیرید فولدری که قراره پارتیشن شما در اون ماونت بشه کجاست؟ توصیه شده از مسیرهای /media و /run و حتی /mnt استفاده نکنید. مثلا من مسیر /data/sdb رو برای ماونت کردن هارد دیسک دیتای خودم (که یک پارتیشن بیشتر نیست) ایجاد کردم. شما هم میتونید یک فولدر به نام data در مسیر روت یعنی / بسازید و برای هر درایو یا پارتیشنی که دارید داخلش فولدرهای مورد نظرتون رو ایجاد کنید. مثلا sdb1 یا sdb2 یا هر اسم دیگه ای. 

حالا باید در مسیر /etc/systemd/system یک یونیت با پسوند .mount ایجاد کنیم. منتها نام این یونیت باید دقیقا متناظر با مسیر فولدر ماونت باشه. مثلا برای مسیر /data/sdb نام این فایل میشه data-sdb.mount یا اگر مثلا اینطوری ساختید: /mnt/hdd/driveD اسم یونیت شما میشه mnt-hdd-driveD.mount

محتوای یونیت ماونت شامل چند قسمت هست. به مثال زیر توجه کنید:

[Unit]
Description=Mount HDD

[Mount]
What=/dev/disk/by-uuid/42EEF8E5EEF8D261
Where=/data/sdb
Type=ntfs3
Options=nosuid,nodev,nofail,defaults,rw,noatime,prealloc,nohidden,windows_names,x-gvfs-hide

[Install]
WantedBy=local-fs.target

قسمت [mount] که مشخص میکنیم چه چیزی What= در کجا Where= و با چه مشخصاتی Type= و Options= ماونت بشه.

و قسمت [Install] هم که در همه یونیت ها وجود داره تا مشخص کنیم چه زمانی یونیت مورد نظر ما فعال بشه.

بنابراین طبق الگوی بالا، برای هر پارتیشنی که مد نظر دارید با توجه به مشخصات خودش، فایل یونیتش رو ایجاد کنید و ذخیره کنید.

در نهایت با دستور زیر یک بار پارتیشن رو ماونت کنید تا مطمئن بشید همه چیز درسته:

sudo systemctl start UNIT-NAME.mount 

و اگر مشکلی وجود نداشت، سرویس رو فعال کنید:

sudo systemctl enable UNIT-NAME.mount 

یادتون نره که ردیف مربوط رو از fstab بردارید یا کامنتش کنید. ( یه # در ابتدای خطش بگذارید)

در مورد متغیرهای مربوط به فرمت پارتیشن مورد نظرتون، میتونید جست و جو کنید. من برای پارتیشن با فرمت NTFS از درایور خود کرنل (ntfs3) استفاده میکنم و متغیرهایی که در خط Options میبینید رو قرار دادم. ممکنه شما از ntfs-3g استفاده میکنید و متغیرها اندکی متفاوت باشند. یا از vfat حتی.

ایجاد یونیت Automount

ممکنه شما نیاز نداشته باشید که پارتیشن مورد نظر شما موقع هر بوت، ماونت بشه. و این رو هم نمیخواید که هر بار که لازمش داشتید از خط فرمان با دستور mount اون رو ماونت کنید. و میخواید این کار رو به سیستم بسپرید. یعنی مثلا وقتی به فولدری در مسیر خاصی رفتید، پارتیشن شما بطور خودکار در اون مسیر ماونت بشه. جالبه نه؟ این طوری برای ماونت شدن هارد درایو حین بوت زمانی تلف نمیشه.

برای این کار باید یک تغییری در یونیت mount بدیم و یک یونیت automount هم ایجاد کنیم.

خط Where رو از یونیت mount حذف کنید. (میتونید هم حذف نکنید. ولی چون در automount باید بیاریمش دیگه ضرورتی نداره توی mount هم بیاریم).

یونیت automount رو با همون نام یونیت mount بسازید و محتوایی رو مطابق با الگوی زیر در اون قرار بدید:

[Unit]
Description=Mount HDD by demand
ConditionPathExists=/data/sdb

[Automount]
Where=/data/sdb
TimeoutSec=5

[Install]
WantedBy=multi-user.target

اگر یونیت mount رو enable کرده بودید، اون رو stop و سپس disable کنید. و بعد یونیت automount رو start کنید و تست کنید آیا بعد از رفتن به دایرکتوری مورد نظر شما، پارتیشن ماونت میشه یا نه، اگر مشکلی نبود اون رو enable کنید.

با ترکیب های مختلفی میشه ایده های متفاوتی رو پیاده کرد. مثلا اگه شما یک هارد درایو اکسترنال یا فلش مموری دارید و میخواید هر وقت که اون رو وصل کردید در یک مسیر خاصی ماونت بشه، این یونیت ها میتونن به شما کمک کنن.

برای مطالعه بیشتر میتونید به این فروم و man page مراجعه کنید. اینجا هم روش های دیگه ای رو برای پیدا کردن مشخصات درایوها نوشته.

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




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