تعرف على كيفية استخدام الروابط التي تجعل أعمالك أسهل من خلال توفير إمكانية الوصول إلى الملفات من مواقع متعددة من شجرة المجلدات في نظام ملفات لينكس. في مقالاتٍ لي كَتبتُ عن جوانب مختلفة من أنظمة ملفات لينوكس ، بما في ذلك مقدمة عن نظام الملفات EXT4 لينكس و إدارة الأجهزة في لينكس و مقدمة عن نظام ملفات لينكس و دليل مستخدم لينكس لإدارة وحدة التخزين المنطقية ، وقد أشرت فيها إلى ميزة مثيرة للاهتمام من أنظمة الملفات في لينكس، يمكن أن تجعل هذه الميزة بعض المهام أسهل من خلال توفير إمكانية الوصول إلى الملفات من مواقع متعددة من شجرة المجلدات في نظام الملفات. هناك نوعان من روابط الملفات في لينكس: صلب و لين . والفرق بين هذين النوعين كبير، ولكن كلا النوعان يستخدمان لحل مشاكل مماثلة. كلاهما يوفر مداخل ( أو مراجع) إلى ملف واحد، لكنها تفعل ذلك بشكل مختلف تمامًا . الروابط مفيدة جدًا وإضافة مرنة إلى أنظمة ملفات لينكس فكل شيء فيه هو ملف.
لقد وجدت -على سبيل المثال- أن بعض البرامج تتطلب نسخة معينة من المكتبات . عندما تقوم بترقية النظام تحل مكتبة جديدة محل أخرى، سوف يتعطل البرنامج الذي تمت برمجته لاعتماد المكتبة القديمة. عادة يكون التغيير الوحيد في اسم المكتبة هو رقم الإصدار، ببساطة أضفت رابطًا يشير إلى المكتبة الجديدة ولكن باسم المكتبة القديمة. شغلت البرنامج مرة أخرى وقد عمل بشكل جيد. في الواقع ترتبط جميع التطبيقات تقريبًا بالمكتبات باستخدام اسم عام مع رقم إصدار رئيسي فقط ، وهذا الارتباط يشير إلى ملف المكتبة الفعلي الذي يحتوي أيضًا على رقم الإصدار الثانوي. وفي حالات أخرى يتم نقل الملفات المطلوبة من مجلد إلى آخر لتتوافق مع مواصفات لينكس، وتبقى في المجلدات القديمة روابط تشير إلى الملفات التي تم نقلها ، حتى إذا كان البرنامج لا يزال مرتبطًا بالمجلد القديم وملفاته لم يقع في مشكلة فقدان الملفات ، إذا عرضت الملفات في المجلد /lib64 فستجد العديد من الأمثلة على كلا الأمرين.
lrwxrwxrwx. 1 root root 36 Dec 8 2016 cracklib_dict.hwm -> ../../usr/share/cracklib/pw_dict.hwm lrwxrwxrwx. 1 root root 36 Dec 8 2016 cracklib_dict.pwd -> ../../usr/share/cracklib/pw_dict.pwd lrwxrwxrwx. 1 root root 36 Dec 8 2016 cracklib_dict.pwi -> ../../usr/share/cracklib/pw_dict.pwi lrwxrwxrwx. 1 root root 27 Jun 9 2016 libaccountsservice.so.0 -> libaccountsservice.so.0.0.0 -rwxr-xr-x. 1 root root 288456 Jun 9 2016 libaccountsservice.so.0.0.0 lrwxrwxrwx 1 root root 15 May 17 11:47 libacl.so.1 -> libacl.so.1.1.0 -rwxr-xr-x 1 root root 36472 May 17 11:47 libacl.so.1.1.0 lrwxrwxrwx. 1 root root 15 Feb 4 2016 libaio.so.1 -> libaio.so.1.0.1 -rwxr-xr-x. 1 root root 6224 Feb 4 2016 libaio.so.1.0.0 -rwxr-xr-x. 1 root root 6224 Feb 4 2016 libaio.so.1.0.1 lrwxrwxrwx. 1 root root 30 Jan 16 16:39 libakonadi-calendar.so.4 -> libakonadi-calendar.so.4.14.26 -rwxr-xr-x. 1 root root 816160 Jan 16 16:39 libakonadi-calendar.so.4.14.26 lrwxrwxrwx. 1 root root 29 Jan 16 16:39 libakonadi-contact.so.4 -> libakonadi-contact.so.4.14.26
بعض الروابط في الدليل / lib64. تظهر القائمة الطويلة من الدليل /lib64 أعلاه أن الحرف الأول في الملف هو الحرف “l”، وهو ما يعني أن كلاً منها رابط لين ( رمزي).
الروابط الصلبة Hard links
في مقدمة لنظام الملفات EXT4 لينكس ، ناقشت حقيقة أن كل ملف يحتوي على inode واحد يحتوي على معلومات حول هذا الملف، بما في ذلك موقع البيانات الذي ينتمي إلى هذا الملف. الشكل 2 في تلك المقالة يظهر مدخل دليل واحد يشير إلى inode ، يجب أن يكون لكل ملفٍ مدخلُ دليل واحدٌ على الأقل يشير إلى inode الذي يصف الملف. مدخل الدليل عبارة عن رابط صلب Hard links ، وبالتالي يكون لكل ملف رابط صلب واحد على الأقل.
في الشكل 1 أدناه، تشير مداخل الأدلة المتعددة إلى inode واحد. هذه كلها روابط صلبة. لقد اختصرت مواقع ثلاثة من مداخل الأدلة باستخدام التلدة ( ~ ) وهي تشير إلى المجلد الرئيسي، بحيث ( ~ ) يعادل /home/user . لاحظ أن مدخل الدليل الرابع مختلف تماما، (/home/shared ) والذي قد يكون موقعا لتبادل الملفات بين مستخدمي الكمبيوتر.
شكل 1
تقتصر الروابط الصلبة على الملفات الموجودة في نظام ملفات واحد، “نظام الملفات” يستخدم هنا بمعنى التقسيم من القرص الصلب أو الحجم المنطقي( logical volume) الذي وُصِل إلى نقطة توصيل معينة ( specified mount point)، في هذه الحالة /home . وذلك لأن أرقام inode فريدة من نوعها فقط داخل نظام ملفات الواحد، وفي حال اختلف نظام ملفات -على سبيل المثال- /var أو /opt سيكون inode له نفس رقم inode لملفنا. كل الروابط الصلبة تشير إلى inode واحدٍ يحتوي على البيانات الوصفية للملف، لذلك فإن كل هذه البيانات تعتبر جزءا من الملف، مثل الملكية والأذونات وعدد الروابط الصلبة إلى تلك inode ، هذه البيانات لا تختلف باختلاف الروابط الصلبة. السمة الوحيدة التي يمكن أن تكون مختلفة هي اسم الملف فلذلك لا يضمن في inode ، الروابط الصلبة إلى file/inode واحد موجود في نفس الدليل يجب أن يكون لها أسماء مختلفة، نظرا لأنه لا يمكن أن يكون هناك أسماء ملفات مكررة داخل دليل واحد.
يتم عرض الروابط الصلبة لملف بالأمر ls -l ، إذا كنت ترغب في عرض أرقام ال inode الفعلية، فإن الأمر ls -li يفعل ذلك.
الروابط الرمزية (اللينة)
الفرق بين الرابط الصلب والرابط اللين ( والمعروف أيضا باسم الرابط الرمزي أو الرابط التشعبي)، هو أن الروابط الصلبة تشير مباشرة إلى inode ، وأما الروابط اللينة فتشير إلى مدخل الدليل، أي واحدة من الروابط الصلبة. ولأن الروابط اللينة تشير إلى رابط صلب للملف وليس inode فإنها لا تعتمد على رقم inode ، ويمكن أن تعمل عبر أنظمة ملفات مختلفة.
الجانب السلبي لهذا هو أنه إذا حذف الرابط الصلب الذي يشير إليه الرابط اللين أو غُيِّر اسمه فإن الرابط الرمزي سوف يتعطل، لحسن الحظ الأمر ls يوضح الروابط المعطلة بالنص الأبيض بخلفية حمراء في قائمة طويلة.
مشروع مختبر: تجربة الروابط
أعتقد أن أسهل طريقة لفهم استخدام والاختلاف بين الروابط الصلبة واللينة هي مع مشروع المختبر. يجب أن يتم هذا المشروع في دليل فارغ بمستخدم غير جذر . لقد أنشأت الدليل ~/temp لهذا الغرض، ويجب عليك فعل ذلك أيضا. هذا يهيئ مكانا آمنا للقيام بالمشروع ويوفر دليلا جديدا فارغا للعمل فيه بحيث تكون فيه فقط الملفات المرتبطة بهذا المشروع.
الإعداد الأولي
أولا، أنشئ الدليل المؤقت الذي سوف تؤدي فيه المهام اللازمة لهذا المشروع. تأكد من أن مجلد العمل الحالي (PWD) هو المجلد الرئيسي الخاص بك، ثم أدخل الأمر التالي.
mkdir temp
ادخل إلى الدليل ~/temp بالأمر
cd temp
للبدء نحتاج إلى إنشاء ملف يمكننا الربط إليه. الأمر التالي يفعل ذلك ويوفر بعض المحتويات أيضا.
du -h > main.file.txt
استخدم الأمر ls -l للتحقق من إنشاء الملف بشكل صحيح . يجب أن يكون الإخراج مشابه لنتائجي. لاحظ أن حجم الملف هو 7 بايت فقط، لكن قد يختلف حجم الملف عن بايت أو اثنين.
[dboth@david temp]$ ls -l
total 4
-rw-rw-r-- 1 dboth dboth 7 Jun 13 07:34 main.file.txt
لاحظ الرقم “1” الذي يتبع وضع الملف في القائمة . يمثل هذا العدد عدد الروابط الصلبة الموجودة للملف. في الوقت الحالي، يجب أن تكون 1 لأننا لم ننشئ أي روابط صلبة إضافية لملف الاختبار.
تجربة الروابط الصلبة
تنشئ الروابطُ الصلبة مدخلَ دليل جديد يشير إلى نفس inode ، لذلك عند إضافة روابط صلبة إلى ملف، سترى زيادة عدد الروابط. تأكد من أنك لا تزال في المجلد ~/temp ثم أنشئ رابطا صلبا إلى الملف main.file.txt ، وقم بعرض القائمة الطويلة بالأمر ls -l :
[dboth@david temp]$ ln main.file.txt link1.file.txt
[dboth@david temp]$ ls -l
total 8
-rw-rw-r-- 2 dboth dboth 7 Jun 13 07:34 link1.file.txt
-rw-rw-r-- 2 dboth dboth 7 Jun 13 07:34 main.file.txt
لاحظ أن كلا الملفين يحتوي على رابطين، وهما بنفس الحجم والتاريخ. فهو ملف واحد مع inode واحد ورابطين صلبين اثنين. أنشئ رابطا صلبا ثانيا إلى هذا الملف واعرض محتويات المجلد . يمكنك إنشاء رابط إلى أي من الروابط الموجودة link1.file.txt أو main.file.txt
[dboth@david temp]$ ln link1.file.txt link2.file.txt ; ls -l
total 16
-rw-rw-r-- 3 dboth dboth 7 Jun 13 07:34 link1.file.txt
-rw-rw-r-- 3 dboth dboth 7 Jun 13 07:34 link2.file.txt
-rw-rw-r-- 3 dboth dboth 7 Jun 13 07:34 main.file.txt
لاحظ أن كل رابط صلب جديد في هذا الدليل يجب أن يكون لها اسم مختلف لأنه لا يمكن أن يكون للملفين نفس الاسم داخل نفس الدليل. حاول إنشاء رابط آخر باسم ملف موجود حاليا.
[dboth@david temp]$ ln main.file.txt link2.file.txt
ln: failed to create hard link 'link2.file.txt': File exists
من الواضح أن هذا لن ينجح، لأن link2.file.txt موجود بالفعل.
حتى الآن، أنشأنا فقط الروابط الصلبة في نفس الدليل. لذلك، أنشئ رابطا في الدليل الرئيسي الخاص بك، حيث يوجد مجلد المشروع الذي نعمل عليه.
[dboth@david temp]$ ln main.file.txt ../main.file.txt ; ls -l ../main*
-rw-rw-r-- 4 dboth dboth 7 Jun 13 07:34 main.file.txt
يظهر الأمر ls في القائمة المذكورة أعلاه أن الملف main.file.txt موجود في الدليل الرئيسي بنفس اسم الملف في الدليل المؤقت . وبطبيعة الحال، هذه ليست ملفات مختلفة. فهي الملف نفسه مع عدة روابط (مداخل الأدلة) إلى نفس Inode . للمساعدة في توضيح النقطة التالية أضف ملفا لا رابطا.
[dboth@david temp]$ touch unlinked.file ; ls -l
total 12
-rw-rw-r-- 4 dboth dboth 7 Jun 13 07:34 link1.file.txt
-rw-rw-r-- 4 dboth dboth 7 Jun 13 07:34 link2.file.txt
-rw-rw-r-- 4 dboth dboth 7 Jun 13 07:34 main.file.txt
-rw-rw-r-- 1 dboth dboth 0 Jun 14 08:18 unlinked.file
انظر في عدد الروابط الصلبة للملف الأول والملف الجديد باستخدام الخيار -i إلى الأمر ls
[dboth@david temp]$ ls -li
total 12
657024 -rw-rw-r-- 4 dboth dboth 7 Jun 13 07:34 link1.file.txt
657024 -rw-rw-r-- 4 dboth dboth 7 Jun 13 07:34 link2.file.txt
657024 -rw-rw-r-- 4 dboth dboth 7 Jun 13 07:34 main.file.txt
657863 -rw-rw-r-- 1 dboth dboth 0 Jun 14 08:18 unlinked.file
لاحظ الرقم 657024 على يسار وضع الملف في المثال أعلاه. هذا هو رقم Inode، وتشير جميع الروابط الثلاثة إلى Inode نفسه . يمكنك استخدام الخيار -i لعرض رقم Inode للروابط التي أنشأناها في الدليل الرئيسي أيضا، والتي سوف تظهر أيضا نفس القيمة. رقم Inode للملف الذي يحتوي على رابط واحد يختلف عن الروابط الأخرى. لاحظ أن أرقام Inode ستكون مختلفة على النظام الخاص بك.
لنقم بتغيير حجم رابط من الروابط الصلبة.
[dboth@david temp]$ df -h > link2.file.txt ; ls -li
total 12
657024 -rw-rw-r-- 4 dboth dboth 1157 Jun 14 14:14 link1.file.txt
657024 -rw-rw-r-- 4 dboth dboth 1157 Jun 14 14:14 link2.file.txt
657024 -rw-rw-r-- 4 dboth dboth 1157 Jun 14 14:14 main.file.txt
657863 -rw-rw-r-- 1 dboth dboth 0 Jun 14 08:18 unlinked.file
حجم الملف سيتغير في جميع الروابط الصلبة وذلك لأن هناك ملفا واحدا يرتبط بمداخل متعددة.
أنا أعلم أن التجربة المقبلة سوف تعمل على جهاز الكمبيوتر الخاص بي لأن المجلد /tmp على تقسيم ( partition ) منفصل ، إن كان لك ذلك تأكد أن لديك إمكانية الوصول إلى التقسيم. إذا لم تقم بذلك، يمكنك إدراج إصبع ذاكرة USB وتركيبه. إذا كان أحد هذه الخيارات يناسبك، يمكنك إجراء هذه التجربة.
حاول إنشاء رابط إلى أحد الملفات في الدليل ~/temp في /tmp أو في أي مكان حيث نظام الملفات مختلف.
[dboth@david temp]$ ln link2.file.txt /tmp/link3.file.txt
ln: failed to create hard link '/tmp/link3.file.txt' => 'link2.file.txt':
Invalid cross-device link
لماذا يحدث هذا الخطأ؟ السبب هو أن كل نظام ملفات منفصل لديه مجموعة خاصة من أرقام Inode ، ببساطة الإشارة إلى ملف من رقم Inode معين عبر كامل أدلة لينكس يمكن أن يؤدي إلى الارتباك، لأن نفس رقم Inode يمكن أن يوجد في كل نظام الملفات المختلفة.
ربما تريد تحديد مواقع كل الروابط الصلبة التي تنتمي إلى Inode واحد . يمكنك العثور على رقم Inode باستخدام الأمر ls –li ثم يمكنك استخدام الأمر find لتحديد كافة الروابط المتعلقة برقم Inode هذا.
[dboth@david temp]$ find . -inum 657024
./main.file.txt
./link1.file.txt
./link2.file.txt
لاحظ أن الأمر find لم يجد كل الروابط الأربعة إلى هذا Inode لأننا بدأنا في الدليل الحالي من ~/temp . لا يجد الأمر find سوى الملفات في الدليل الحالي. للعثور على جميع الروابط، يمكننا استخدام الأمر التالي الذي يحدد الدليل الرئيسي الخاص بك كمكان للبدء بالبحث.
[dboth@david temp]$ find ~ -samefile main.file.txt
/home/dboth/temp/main.file.txt
/home/dboth/temp/link1.file.txt
/home/dboth/temp/link2.file.txt
/home/dboth/main.file.txt
قد تشاهد رسائل خطأ إذا لم يكن لديك أذونات كمستخدم غير جذر. يستخدم هذا الأمر أيضا الخيار -samefile بدلا من تحديد رقم Inode . هذا يعمل كما لو استخدمت رقم Inode ويمكن أن يكون هذا أسهل إذا كنت تعرف اسم واحد من الروابط الصلبة.
تجربة الروابط اللينة (الرمزية)
كما رأيت للتو، إنشاء روابط صلبة غير ممكن خارج حدود نظام الملفات. الروابط اللينة هي وسيلة لحل هذه المشكلة، رغم أنها يمكن أن تحقق نفس الغاية، فهي مختلفة جدا، ومعرفة هذه الاختلافات هو المهم.
لنبدأ من خلال إنشاء رابط رمزي في مجلد الاختبار ~/temp لبدء الاستكشاف
[dboth@david temp]$ ln -s link2.file.txt link3.file.txt ; ls -li
total 12
657024 -rw-rw-r-- 4 dboth dboth 1157 Jun 14 14:14 link1.file.txt
657024 -rw-rw-r-- 4 dboth dboth 1157 Jun 14 14:14 link2.file.txt
658270 lrwxrwxrwx 1 dboth dboth 14 Jun 14 15:21 link3.file.txt ->
link2.file.txt
657024 -rw-rw-r-- 4 dboth dboth 1157 Jun 14 14:14 main.file.txt
657863 -rw-rw-r-- 1 dboth dboth 0 Jun 14 08:18 unlinked.file
الروابط الصلبة -وهي تلك التي تحتوي على رقم Inode 657024 - لم تتغير، وعدد الروابط الصلبة المعروضة لم يتغير أيضا . الروابط الجديدة التي تم إنشاؤها لديها رقم Inode مختلف حيث رقمها658270 .
الرابط اللين المسمى link3.file.txt يشير إلى link2.file.txt ، استخدم الأمر cat لعرض محتويات link3.file.txt .
معلومات الملف للرابط الرمزي يبدأ بالحرف ” l ” الذي يشير إلى أن هذا الملف هو في الواقع رابط رمزي.
حجم الرابط الرمزي link3.file.txt في المثال أعلاه هو 14 بايت فقط. هذا هو حجم النص link3.file.txt -> link2.file.txt” “، وهو المحتوى الفعلي للرابط الرمزي.
الرابط الرمزي link3.file.txt لا يشير إلى Inode ، بل يشير إلى مدخل دليل آخر (رابط صلب أو رمزي) ، هذا يجعل من المفيد إنشاء روابط تمتد خارج حدود نظام الملفات . لذلك، دعونا ننشئ هذا الرابط.
[dboth@david temp]$ ln -s /home/dboth/temp/link2.file.txt
/tmp/link3.file.txt ; ls -l /tmp/link*
lrwxrwxrwx 1 dboth dboth 31 Jun 14 21:53 /tmp/link3.file.txt ->
/home/dboth/temp/link2.file.txt
حذف الروابط
هناك بعض الأشياء الأخرى التي يجب عليك مراعاتها عندما تحتاج إلى حذف الروابط أو الملفات التي تشير إليها.
أولا، دعونا نحذف الرابط main.file.txt ، تذكر أن كل مدخل دليل يشير إلى Inode هو مجرد رابط صلب.
[dboth@david temp]$ rm main.file.txt ; ls -li
total 8
657024 -rw-rw-r-- 3 dboth dboth 1157 Jun 14 14:14 link1.file.txt
657024 -rw-rw-r-- 3 dboth dboth 1157 Jun 14 14:14 link2.file.txt
658270 lrwxrwxrwx 1 dboth dboth 14 Jun 14 15:21 link3.file.txt ->
link2.file.txt
657863 -rw-rw-r-- 1 dboth dboth 0 Jun 14 08:18 unlinked.file
لقد كان الرابط main.file.txt هو الرابط الأول الذي تم إنشاؤه عند إنشاء الملف. حذفه الآن لا يزال يترك الملف الأصلي وبياناته على القرص الصلب مع جميع الروابط الصلبة المتبقية. لحذف الملف وبياناته، سيكون عليك حذف كافة الروابط الصلبة المتبقية.
الآن احذف الرابط الصلب link2.file.txt
[dboth@david temp]$ rm link2.file.txt ; ls -li
total 8
657024 -rw-rw-r-- 3 dboth dboth 1157 Jun 14 14:14 link1.file.txt
658270 lrwxrwxrwx 1 dboth dboth 14 Jun 14 15:21 link3.file.txt ->
link2.file.txt
657024 -rw-rw-r-- 3 dboth dboth 1157 Jun 14 14:14 main.file.txt
657863 -rw-rw-r-- 1 dboth dboth 0 Jun 14 08:18 unlinked.file
لاحظ ما يحدث للرابط اللين (الرمزي). حذف الرابط الصلب الذي يشير إليه الرابط اللين يتركه معطلا. لإصلاحه يمكنك إنشاء رابط صلب آخر في نفس الدليل بنفس اسم القديم، طالما لم يتم حذف كافة الروابط الصلبة.
يمكنك أيضا إعادة إنشاء الرابط بنفس الاسم ولكن بالإشارة إلى واحد من الروابط الصلبة المتبقية. وبطبيعة الحال، إذا لم يعد هناك حاجة إلى رابط لين يمكن حذفها مع الأمر rm
يمكن أيضا استخدام الأمر unlink لحذف الملفات والروابط. إنه بسيط جدا وليس لديه خيارات كالأمر rm ، ومع ذلك فإنه يعكس بشكل أكثر دقة العملية الأساسية للحذف، من حيث أنه يزيل الارتباط - مدخل الدليل - عن الملف الذي يتم حذفه.
الخلاصة
لقد عملت مع كلا النوعين من الروابط لفترة طويلة قبل أن أبدأ في فهم قدراتها وخصوصياتها. استغرق الأمر كتابة مشروع مختبر لفئة لينكس، لقد علمت أخيرا كيف تعمل الروابط. هذه المقالة هي تبسيط ما تعلمت في تلك الفئة، وآمل أن يسرع ذلك التعلم لديك.
ترجمة -وبتصرّف- للمقال A user’s guide to links in the Linux filesystem لصاحبه David Both
حقوق الصورة البارزة محفوظة لـ Freepik
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.