دستور umount
یک دایرکتوری را از حالت mount خارج میکند که در اصطلاح آن را unmount
میکند. شکل استفاده از آن ساده بود و فرمت کلی زیر را دارد:
umount <mount_point>
دقت کنید همانطور که در مثال زیر مشاهده میکنید دستور مورد نظر unmount
نیست بلکه umount
است
umount -a
برخی از فایل سیستم ها به دلیل busy
بودن یا در حال استفاده بودن قابل unmount
شدن نیستند. به این موضوع هم توجه کنید که محتویات فایل هایی که در فایل etc/mtab/
و proc/mounts/
قرار دارند شبیه به هم هستند.
دستور umount
در لینوکس به شما اجازه میدهد که بتوانید در یک لحظه چندین mount point
را unmount
کنید به مثال زیر توجه کنید:
umount /mydata /backup
در دستور فوق بطور همزمان دایرکتوری mydata/
و backup/
همزمان unmount
خواهند شد
برخی اوقات پیش میآید که شما در حال کپی کردن یا کپی گرفتن از محتویات یک پارتیشن هستید و میخواهید پارتیشن مربوطه را unmount
کنید اما نمیخواهید فرآیند کپی کردن شما دچار مشکل شود در چنین شرایطی unmount
به شما گزینه ای را ارائه میکند که به Lazy Unmount
معروف است. زمانیکه شما یک پارتیشن یا یک فایل سیتم را Lazy Unmount
میکنید تا زمانیکه فرآیند در حال کار که در اینجا کپی کردن است تمام نشود عملیات unmount
انجام نخواهد شد شما میتوانید با استفاده از آرگومان l-
در دستور umount
این کار را مشابه دستور زیر انجام دهید و خیالتان از بابت کپی شدن فایل های در حال کپی راحت باشد:
umount -l /mydata
برخی اوقات بعد از اینکه شما دستور umount
را وارد میکنید ممکن است دستگاه یا پارتیشن مورد نظر در حال کار باشد و به شما پیام داده شود که دستگاه busy
است و در حال حاضر نمیتوان آن را unmount
کرد اما شما میتوانید در چنین موارد با استفاده از آرگومان f-
در دستور umount
فرایند unmount
شدن را force
یا اجبار کنید که در این صورت دستگاه بلافاصله unmount
خواهد شد به مثال زیر دقت کنید:
umount -f /mnt
اگر دستور مورد نظر کار نکرد شما میتوانید مانند مثال قبلی از Lazy Unmount
استفاده کنید شما میتوانید از طریق دستور متوجه شوید که چه پردازش هایی در حال استفاده از mount point
مورد نظر هستند ps به همراه grep به شکل زیر به شما خروجی ها را نمایش میدهد که در خصوص پردازش هایی هستند که در حال استفاده از mount point
ی به نام mydata/
میباشند:
ps ajx|grep /mydata
با استفاده از دستورfuser به شکل زیر هم میتوانید متوجه شوید که در حال حاضر کدام پردازش دایرکتوری را برای انجام کار نگه داشته است:
fuser -cu /mydata
خروجی دستور بالا
/mydata: 5430(phoenix)
همانطور که در خروجی فوق مشاهده میکنید نام کاربری به همراه نام پردازش مورد نظر به شما نمایش داده میشود نام کاربری در واقع مالک پردازش مورد نظر است و شما میتوانید با kill کردن پردازش مورد نظر عملیات unmount
را به درستی انجام دهید.
عمل Unmount
عکس mount است و اتصال میان نقطه اتصال و پارتیشن یا دایرکتوری را قطع میکند. چندین دلیل وجود دارد که یک mount point
نتواند قطع شود. یکی از آنها مشغول بودن پارتیشن یا دایرکتوری است یعنی کاربری مثلا با دستور cd وارد آن نقطه اتصال شده و امکان قطع اتصال وجود ندارد و یا اینکه فرآیند یا کاربری در حال استفاده از فایلی درون آن نقطه اتصال هستند. یعنی یک فایل open
یا باز وجود دارد که در حال استفاده شدن توسط دیگران است.
بطور کلی شما نمیتوانید یک نقطه اتصال را بخاطر مشغول بودن یا باز بودن فایلی در آن دایرکتوری قطع یا Unmount
کنید دو دستور lsof و دستورfuser دستورهایی هستندکه میتوانید توسط آنها بررسی کنید که کدام فرآیندها و کاربران در حال استفاده چه فایل هایی هستند که باعث عدم عمل Unmount
شده است.
سیستم فایل ها در زمان خاموش شدن بصورت خودکار Unmount
میشوند که پس از اینکه تمام فرآیندهای غیر سیستمی خاتمه یافتند اینکار انجام میشود و دوباره موقع boot
شدن بصورت خودکار mount
خواهند شد یکی از خطاهایی که ممکن است در هنگام Unmount
کردن رخ دهد خطای زیر است:
umount /dev/sdb1 umount: /run/media/phoenix/EXT-HARD: target is busy.
خطای بالا به این معنی است که نقطه اتصالی به نام EXT-HARD
اشغال است. یک علت خطای busy
به خاطر این است که شاید کاربری در دایرکتوری /run/media/phoenix/EXT-HARD
قرار دارد یعنی دایرکتوری جاری برای آن کاربر دایرکتوری /run/media/phoenix/EXT-HARD
است. میتوانید از دستور pwd برای فهمیدن دایرکتوری جاری استفاده کنید. دلیل دیگر آن این است که کاربر با فرآیندی در حال استفاده از یک فایل که درون این دایرکتوری وجود دارد هستند دستور lsof برای فهرست کردن فایل های باز استفاده میشود.
فرض کنید سیستم فایل بر روی دایرکتوری mnt/hdd/
اتصال داده شده است و میخواهید این نقطه اتصال را قطع کنید ولی با مشکل busy
بودن مواجه میشوید. برای فهرست کردن لیستی از فرایندهای مرتبط با دایرکتوری mnt/hdd/
از دستور lsof بصورت زیر استفاده میکنیم.
lsof /mnt/hdd/
خروجی دستور بالا
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 31010 phoenix cwd DIR 8,17 4096 20323 /mnt/hdd/software bash 31145 phoenix cwd DIR 8,17 4096 20323 /mnt/hdd/software more 31370 phoenix cwd DIR 8,17 4096 20323 /mnt/hdd/software more 31370 phoenix 3r REG 8,17 70 3983 /mnt/hdd/software/test.txt lsof 31379 phoenix cwd DIR 8,17 4096 20323 /mnt/hdd/software lsof 31380 phoenix cwd DIR 8,17 4096 20323 /mnt/hdd/software
پس از بدست آوردن شماره pid
هر یک از فرایندها باید آنها را با دستور kill از بین ببریم. فرمت کلی برای اینکار بصورت زیر است.
kill -l5
نکته ای که درباره خروجی دستور بالا خط سوم و چهارم است که دستور more را نشان میدهند این است که ستون fd در سومین خط بیانگر این است که دایرکتوری جاری یا cwd آن دایرکتوری mnt/hdd/software/
است و این به این معنی است که دستور more در حال اجرا شدن و خواندن یک فایل در دایرکتوری mnt/hdd/software/
است و فایلی که دستور more در حال خواندن آن است test.txt نام دارد در ستون fd از خط چهارم 3r بیانگر خواندن فایل توسط دستور more است.
به هر حال باید با دستور lsof شماره pid ها بدست بیاورید و سپس با دستور kill آن فرایندها را از بین ببرید و در آخر با دستور umount دایرکتوری را Unmount کنید