آموزش 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
$ ls -i 1576000 libPaint1.so 1576000 libPaint.so
اگر محتویات فایلی را تغییر دهید، محتویات فایلهای لینک شده به آن نیز تغییر میکند. چون ما فقط یک فایل با دو نام داریم، نه یک فایل و یک کپی از آن.
نکته: دیرکتوری ها فقط جدول هایی هستند که نام فایلها را به 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
قسمت دهم