Mount کردن در یونیکس – بخش دوم(رفع مشکلات Unmount)

Mount کردن در یونیکس – بخش دوم(رفع مشکلات Unmount)

در این پست با مفهوم و دستور mount آشنا شدید. عمل Unmount عکس mount است و اتصال میان نقطه اتصال و پارتیش یا دایرکتوری را قطع می کند. چندین دلیل وجود دارد که یک نقطه اتصال نتواند قطع شود. یکی از آنها مشغول یا Busy بودن پارتیشن یا دایرکتوری است یعنی کاربری مثلن با دستور cd وارد آن نقطه اتصال شده و امکان قطع اتصال وجود ندارد و یا اینکه فرایند یا کاربری در حال استفاده از فایلی درون آن نقطه اتصال هستند.یعنی یک فایل Open وجود دارد که در حال استفاده شدن توسط دیگران است.

پیش از خواندن این مطلب، مطالعه پست های lsof و fuser مهم و ضروری است.

بطور کلی شما نمی توانید یک نقطه اتصال را بخاطر Busy بودن یا باز بودن فایلی در آن دایرکتوری، قطع یا Unmount کنید. دو دستور lsof و fuser دستور هایی هستند که می توانید توسط آنها بررسی کنید که کدام فرایند ها و کاربران در حال استفاده چه فایل هایی هستند که باع عدم عمل Unmount شده است.

سیستم فایل ها در زمان shutdown شدن بصورت خودکار Unmount می شوند که پس از اینکه تمام فرایند های غیر سیستمی خاتمه یافتند، این کار انجام می شود و دوباره موقع بوت شدن، بصورت خودکار Mount خواهند شد.یکی از خطاهایی که ممکن است در هنگام Unmount کردن رخ دهد خطای زیر خواهد بود :

sudo umount /mnt/NAS

umount: /mnt/NAS: device is busy

خطای بالا به این معنی است که نقطه اتصالی به نام NAS اشغال است. یک علت خطای Busy بخاط این است که شاید کاربری در دایرکتوری mnt/NAS/ قرار دارد. یعنی دایرکتوری جاری برای آن کاربر، دایرکتوری mnt/NAS/ است. می توانید از دستور pwd برای فهمیدن دایرکتوری جاری استفاده کنید. دلیل دیگر آن این است که کاربر یا فرایندی در حال استفاده از یک فایل که درون این دایرکتوری(mnt/NAS/) وجود دارد هستند. دستور lsof برای فهرست کردن فایل های باز استفاده می شود. با توجه به مثال های گفته شده در این پست می توانید بصورت تفکیکیف بررسی کنید کدام فایل ها توسط چه کاربران یا فرایند هایی در حال استفاده شدن هستند.

یک سوئیچ مفید از دستور umount در لینوکس، سویج l- است که کمک بسیاری برای کمک کردن به عمل Unmount یک سیستم فایل می کند.البته این سوئیج با کرنل 2.4.11 به بعد کار می کند که در توزیع های امروزه مشکلی از نظر نسخه کرنل وجود ندارد.با این سوئیچ و به فرمت زیر یک سیستم فایل را برای جدا کردن از سلسه مراتب ساختار فایل تععین می کنیم. این سوئیچ از استفاده فرایند های جدید از این دایرکتوری و فایل هایش جلوگیری می کند و زمانی که تمام فرایند های فعلی از بین رفتند(خاتمه یا Terminate شدند) سیستم فایل را Unmount کنند.

در فرمت زیر  filesystem سیتتم فایلی است که آنرا از سلسله مراتب دایرکتوری ها جدا کرده ایم. می توانید نام پارتیشن یا دایرکتوری را بجای آن بیاورید.

umount  -l  /name/of/filesystem

برای درک بهتر استفاده از این سوئیچ، ابتدا یک دایرکتوری با دستور mkdir  /mnt/NAS ایجاد کنید. سپس دستور زیر را برای اتصال پارتیش sda3 به نقطه اتصال NAS استفاده کنید.

mount  /dev/sda3  /mnt/NAS

سپس با دستور cd وارد دایرکتوری NAS شوید

cd  /mnt/NAS

دستور mount را به تنهایی اجرا کنید. مشاهده می کنید که دایرکتوری NAS نیز در فهرست دایرکتوری ها mount شده وجود دارد.

حالا با دستور زیر سعی کنید تا نقطه اتصال را از بین ببرید.

umount  /mnt/NAS

با اجرای دستور بالا خطای شکل زیر یعنی اشغال بودن دایرکتوری مشاهده خواهد شد.

ولی اگر از دستور زیر برای Unmount کردن استفاده کنید چون دایرکتوری mnt/NAS/ را جدا از سلسله مراتب سیستم فایل می بینید بدون خطا نقطه اتصال را قطع می کند.

umount  -l  /mnt/NAS

رفع مشکل Unmount کردن :

فرض کنید یک سیستم فایل بر روی دایرکتوری opt2/ اتصال داده شده است و می خواهید این نقطه اتصال را قطع کنید ولی با مشکل Busy بودن مواجه می شوید. دو دستور lsof و fuser وجود دارند تا بدانید چه فرایند هایی با کدام فایل ها و در کدام دارکتوری یا Device در ارتباط است.

با دستور lsof در این پست آشنا شدید. برای فهرست کردن لیستی از فرایند های مرتبط با دایرکتوری opt2/ از دستور lsof بصورت زیر استفاده می کنیم.

lsof /opt2

پس از بدست آوردن شماره PID هر یک از فرایند ها باید آنها را با دستور kill از بین ببریم(بکشیم). فرمت کلی برای این کار بصورت زیر است.

kill  -15  PID

نکته ای که درباره شکل بالا و دو خط پایانی که دستور more را نشان می دهند این است که ستون FD در دومین خط بیانگر این است که دایرکتوری جاری، Current Work  Directory یا cwd آن دایرکتوری opt2/ است و این به این معنی است که دستور more در حال اجرا شدن و خواندن یک فایل در دایرکتوری opt2/ است و فایلی که دستور more در حال خواندن آن است، resume.txt نام دارد. در ستون FD از خط سوم 3r بیانگر خواندن فایل توسط دستور more است.(برای اطلاع بیشتر خواندن این پست پیشنهاد می شود)

به هر حال باید با دستور lsof شماره PID ها را بدست بیاورید و سپس با دستور kill آن فرایند ها را از بین ببرید و در آخر با دستور زیر دایرکتوری opt2/ را Unmount کنید.

umount  /opt2

fuser دستور دیگری است که می توانید با آن PID فرایندهای مرتبط با دایرکتوری ها و فایل های آنها را بدست بیاورید. در این پست کاربرد fuser گفته شد. این دستور در یونیکس هایی که از سیستم فایل (دایرکتوری) proc/ پشتیبانی کنند قابل استفاده است مانند تمام توزیع های لینوکسی و همچنین سیستم عامل FreeBSD.

بطور مثال اگر بخواهیم بداینم که کدام فرایند ها در حال استفاده از فایلی به نام yellowmachine هستند از دستور زر استفاده می کنیم و خواهیم دید که دو فرایند با PID های 23334 و 23697 در حال استفاده از این فایل هستند.

حرف c در انتهای شماره PID های فرایند ها همان مفهوم cwd را در دستور lsof دارد. یعنی دو فرایند که دایرکتوری جاریشان mnt/ است در حال استفاده از این فایل هستند. مانند قبل با استفاده از دستور kill می توانید فرایند های مرتبط را از بین ببرید ولی امکان دیگر استفاده از سوئیچ k- از دستور fuser است. برای اطلاع بیشتر پست مزتبط با fuser را بخوانید.