کدنگار

وبلاگ شخصی-آموزشی علی رشیدی

کدنگار

وبلاگ شخصی-آموزشی علی رشیدی

طبقه بندی موضوعی
پیوندهای روزانه
پیوندها

آموزش Linux Essentials - قسمت نهم

يكشنبه, ۱۰ مرداد ۱۳۹۵، ۰۴:۲۹ ب.ظ

در این قسمت در ادامه مبحث کار با فایل ها به بررسی انواع لینک ها و روش ایجاد آن در لینوکس میپردازیم

تمرین‌های مربوط به قسمت قبل


1. در پوشه ی خانه خود (home) یک کپی از فایل etc/services/ به نام myservices ایجاد کنید. سپس آنرا به srv.dat تغییر نام دهید و آن را با حفظ نام به دایرکتوری tmp/ کپی کنید. در پایان. هر دو کپی که ایجاد کردید را حذف کنید.

۲. چرا دستور mv مانند cp گزینه ی R- ندارد؟

۳. فرض کنید در یکی از دایرکتوری ها فایلی به نام file- (با خط تیره شروع میشود) دارید. چگونه آنرا حذف میکنید؟

۴. برخی دایرکتوری ها شامل فایل‌های مهمی هستند و ممکن است بخواهید از حذف اتباهی آن‌ها توسط * rm جلوگیری کنید. در این دایرکتوری فایلی به نام i- بسازید و اکنون * rm را امتحان کنید. چه اتفاقی می‌افتد و چرا؟

لینک کردن فایل‌ها ــ ln و ln -s


لینوکس به شما اجازه میدهد تا مرجعی به فایل‌ها به نام لینک ایجاد کنید، به این وسیله میتوانید فایلی را با چند نام متفاوت در یک دیرکتوری ایجاد کنید. اما چرا باید کسی چنین کاری کند؟ برای مثال فرض کنید فایل libPaint.so را که فایل حجیمی هم هست داریم، یک برنامه به این فایل تحت همین نام، و برنامه ی دیگری به همین فایل ولی با نام libPaint1.so نیاز دارد. اولین راهی که به ذهن ما میرسد این است که یک کپی از libpaint.so به نام libPaint1.so ایجاد کنیم، اما گفتم که این فایل حجم زیادی دارد و در ضمن راه حل معقولی نیست، در این شرایط از لینک کردن استفاده میکنیم، اکنون یک فایل به نام libPaint1.so خواهیم داشت که به همان libPaint.so اشاره میکند.

اما چگونه اینکار را انجام دهیم؟ دستور ln نام جدیدی (آرگومان دوم) را به یک فایل نسبت میدهد. مثال زیر را ببینید:

$ ln libPaint.so libPaint1.so
حالا با لیست کردن دیرکتوری خواهیم داشت:

$ ls -l
-rw-r--r-- 2 ali-rnt ali-rnt 0 Jul 12 08:53 libPaint1.so 
-rw-r--r-- 2 ali-rnt ali-rnt 0 Jul 12 08:53 libPaint.so
اکنون به نظر میاید که دیرکتوری شامل یک فایل جدید به نام libPaint1.so است، اما در‌واقع ما فقط دو فایل داریم که به یک فایل رجوع میکنند. Reference counter این عدد را مشخص میکند و در خروجی ls -l نیز میتوانید آنرا ببینید، در دومین ستون عدد ۲ نشان میدهد که این فایل دو نام دارد. راه دیگر استفاده از ls -i است، در این صورت میبینید که شماره هر دو فایل یکسان است یعنی این دو فایل در‌واقع یکی هستند:

$ ls -i
1576000 libPaint1.so  1576000 libPaint.so
این شماره به نام inode number نیز شناخته میشود. Inode کوتاه شده ی Indirectional Node است، Inode ها تمامی اطلاعاتی که سیستم درباره فایل دارد را نگهداری میکنند، به جز نام فایل را. برای هر فایل دقیقاً فقط یک Inode وجود دارد.

اگر محتویات فایلی را تغییر دهید، محتویات فایل‌های لینک شده به آن نیز تغییر میکند. چون ما فقط یک فایل با دو نام داریم، نه یک فایل و یک کپی از آن.

نکته: دیرکتوری ها فقط جدول هایی هستند که نام فایل‌ها را به Inode مرتبط میکنند. و میتوان در یک جدول خانه‌های مختلفی داشت که نام های متفاوت ولی شماره Inode یکسان دارند. به هر یک از خانه‌های دیرکتوری که یک نام و شماره ی Inode داشته باشد یک لینک گفته میشود.

باید بدانید که برای فایلی با دو لینک، تقریباً غیر ممکن است که بتوان فهمید کدام یک فایل اصلی است. از دید سیستم هر دو نام با هم برابر و غیر قابل تشخیص اند.

حذف کردن یکی از لینک ها عدد مرجع را یک واحد کاهش میدهد. برای مثال اگر در مثال قبلی libPaint1.so را حذف کنیم:

$ls -l
-rw-r--r-- 2 ali-rnt ali-rnt 0 Jul 12 08:53 libPaint1.so 
-rw-r--r-- 2 ali-rnt ali-rnt 0 Jul 12 08:53 libPaint.so
$ rm libPaint1.so
$ ls -l
-rw-r--r-- 1 ali-rnt ali-rnt 0 Jul 12 08:53 libPaint.so
میبینید که عدد مرجع از دو به یک کاهش پیدا کرده.

نکته‌ای در مورد حذف فایل ها: اگر فایلی را حذف کنید، این فایل دیگر نمیتواند توسط برنامه‌ای باز شود، اما اگر قبل از حذف شدن برنامه‌ای آنرا باز کرده باشد، سیستم صبر میکند تا آن برنامه بسته شود تا آن فایل را حذف کند. این روش در جاهایی کاربرد دارد که برنامه ما یک فایل موقت ایجاد میکند، در این صورت برنامه فایل مورد نیاز خود را باز میکند و بلافاصله آنرا حذف میکند، و به این ترتیب هنگامی که برنامه خاتمه می‌یابد فایل نیز حذف میشود.

لینک نمادی (Symbolic link)


نوعی از لینک که تا کنون بررسی کردیم لینک سخت (hard link) بود که برای ایجاد متکی بر شماره inode فایل بود. نوع دیگری از لینک نیز وجود دارد که لینک نمادی (یا لینک نرم (soft link) در تقابل با لینک سخت) نام گرفته است. این نوع لینک در‌واقع یک فایل است که نام فایل هدف را ذخیره میکند و دارای یک flag است که به سیستم میگوید این فایل یک لینک است. بر خلاف لینک سخت، فایل هدف نمیداند که از آن لینکی ایجاد شده (شماره مرجع آن به لینک نمادی ربطی ندارد) و حذف لینک ها به فایل هدف آسیبی نمیزند. همچنین، اگر فایل هدف را حذف کنید، هنگام باز کردن لینک نمادی آن با خطا مواجه خواهید شد چون آن لینک به هیچ جا اشاره نمیکند (به جایی که وجود ندارد.)
یکی از مشکلات لینک های سخت این بود که شما نمیتوانستید آنرا برای دیرکتوری ها به کار برید، که خوشبختانه این مشکل با لینک های نرم برطرف شده.
یک مثال از این مزیت: در حال حاضر بنابر توافق ایمیل‌های خوانده نشده در دیرکتوری var/mail/ ذخیره میشوند، اما در گذشته این دیرکتوری var/spool/mail/ بود و برنامه‌های زیادی این مسیر را استفاده میکردند. برای اینکه این برنامه‌ها کار کنند، دیرکتوری var/spool/mail/ را به دیرکتوری جدید لینک میکردند. بدون استفاده از لینک های نمادی این کار غیر ممکن بود.

ایجاد لینک های نمادی ساده است و شما کافی است گزینه ی s- را به دستور ln بدهید:

$ ln test.c -s testProg.c
$ ls -l
-rw-r--r-- 1 ali-rnt ali-rnt 0 libPaint.so 
-rw-r--r-- 1 ali-rnt ali-rnt 0 test.c 
lrwxrwxrwx 1 ali-rnt ali-rnt 6 testProg.c -> test.c

تمرین:

۱. در پوشه ی خانه خود، فایلی با یک متن دلخواه ایجاد کنید و سپس یک لینک سخت از آن ایجاد کنید. اکنون فایل را با یک ویرایشگر متن باز کنید و تغییر دهید. چه اتفاقی می افتد؟
۲.مانند تمرین قبل اینبار یک لینک نمادی از فایل اصلی ایجاد کنید. اینبار آنرا با ویرایشگر باز کنید و ببینید چه اتفاقی می افتد. همچنین بینید در صورت حذف فایل اصلی (فایل هدف) چه رخ میدهد؟
۳. میدانید که .. نیز یک لینک است (در دروس قبلی توضیح داده شده). امتحان کنید و ببینید که .. در مسیر ریشه یا همان / به کجا لینک شده است؟
۴. دستور زیر و خروجی اش را در نظر بگیرید.

$ ls -ai /
2 .		330211 etc	1 proc	4303 var
2 ..		2 home		65153 root
4833 bin	244322 lib	313777 sbin
228033 boot	460935 mnt	244321 tmp
330625 dev	460940 opt	390938 usr
میبینید که / و home/ شماره inode یکسانی دارند، در حالی که دو فایل در یک دیرکتوری نمیتوانند شماره inode یکسانی داشته باشند. علت این پدیده را توضیح دهید.

قسمت دهم
  • موافقین ۰ مخالفین ۰
  • ۹۵/۰۵/۱۰
  • ۲۳۴ نمایش
  • علی رشیدی

Linux

آموزش لینوکس

لینوکس

نظرات (۰)

هیچ نظری هنوز ثبت نشده است
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی