[اقتباسات] 📘 ❞ نظام لينكس (Linux System) ❝ كتاب ــ محمد عماد غباين اصدار 2023

كتب لينكس - 📖 اقتباسات كتاب ❞ نظام لينكس (Linux System) ❝ ــ محمد عماد غباين 📖

█ _ محمد عماد غباين 2023 حصريا كتاب ❞ نظام لينكس (Linux System) ❝ عن جميع الحقوق محفوظة للمؤلف 2024 System): تعلم من صفر حتى الاحتراف باللغة العربية مع مراعاة المصطلحات الإنجليزية هذا الكتاب نقدم لكم مواضيع وشروحات نظم التشغيل عامةً ونظام خاصةً حيث نبدأ بهذا بأساسيات بشكل عام (في هذه المرحلة مكنك الإجابة الأسئلة: 1 ما هو الحاسوب 2 النظام 3 هي مكونات 4 كيف يعمل 5 هيكلية الحاسوب) للننتقل بعد ذلك لمرحلة لينكس؛ تم تغظية المواضيع التالية: 1 نبذة لينكس 2 تطور لينكس 3 لينكس 4 توزيعات Distributions) 4 أوامر الأساسية (Basic Linux Commands) 5 الملفات (بكل تفاصيله) 6 إدارة المستخدمين 7 الصلاحيات والمليكة (Ownership & Permissions) 8 ارتباط (Link File) 9 ضغط (Compression) 10 أرشفة (Archiving) 11 قائمة تحكم الوصول (Access Control Lists) 12 تجزئة الديسك (Disk Partitioning) 13 (Files) 14 أنواع (File Type) 15 Structure) 16 التعامل الملفات 17 التخزين Storage) 20 الهارد ديسك فيزيائياً (Physical HHD) 19 منطقيًا (Logical HHD) 20 عملية التهيئة (Formatting) 21 ربط (Mounting) 22 مدير الحزم Package Manager) 23 الشبكات 24 تشخيص مشكلات الشبكة (Troubleshoot Network) 25 عمليات Process Management) وغيرها متقدمة كتب مجاناً PDF اونلاين ركن خاص تحميل شرح لِينُكس (بالإنجليزية: Linux) ويسمى أيضا (جنو لينكس) تشغيل حر ومفتوح المصدر بسبب تطوره إطار مشروع جنو يتمتع بدرجة عالية الحرية تعديل وتشغيل وتوزيع وتطوير أجزاءه ويعتبر الأنظمة الشبيهة بيونكس يصنف ضمن عائلة أشباه يونكس إلى جانب أنظمة أخرى بعضها مملوك مثل سولاريس وبعضها حُر (مفتوح المصدر) أوبن وفري بي إس دي

إنضم الآن وتصفح بدون إعلانات
نظام لينكس (Linux System)
كتاب

نظام لينكس (Linux System)

ــ محمد عماد غباين

صدر 2023م
نظام لينكس (Linux System)
كتاب

نظام لينكس (Linux System)

ــ محمد عماد غباين

صدر 2023م


المحتويات
الفصل الأول// مفاهيم 8
1. نظام الحاسوب 8
1.1 هيكلية نظام الحاسوب (Computer System Structure) 8
2. نظام التشغيل (Operating System) 9
3. بدء الحاسوب (Computer Startup) 12
4. تنظيم نظام التشغيل (Operating System Organization) 12
5. المقاطعات (Interrupts) 13
6. استدعاءات النظام (System Calls) 14
7. واجهة برمجة تطبيقات (Application Programming Interface) 15
الفصل الثاني// نظام التشغيل لينكس 16
1. تطور نظام لينكس 16
1.1 مراحل تطور نظام لينكس 16
2. مكونات نظام لينكس 18
2.1 نواة لينكس (Linux Kernel) 18
2.2 مكتبات النظام (System Libraries) 19
2.3 شيل (Shell) 19
2.4 مفاهيم 20
3. توزيعات لينكس (Linux Distributions) 21
4. أوامر لينكس الاساسية (Basic Linux Commands) 21
الفصل الثالث// نظام الملفات 24
1. مفاهيم 24
1.1 جهاز التخزين (Storage Device) 24
1.2 التخزين الكتلي (Block Storage) 24
1.3 التخزين الكائني (Object Storage) 24
1.4 تجزئة الديسك (Disk Partitioning) 24
2. الملفات (Files) 25
2.1 أنواع الملفات (File Type) 26
2.2 هيكلية الملفات (File Structure) 26
3. أوامر التعامل مع نظام الملفات 30
4. أوامر تعامل مع محتويات الملف 34
الفصل الرابع/ إدارة المستخدمين 36
1. الإدارة المركزية (Centralized management) 36
2. الإدارة الفردية (Standalone management) 37
2.1 عملية المصادقة (Authentication) 37
2.2 ملفات إدارة المستخدمين (User management files) 37
2.3 المستخدمين (Users) 39
2.4 المجموعات (Group) 40
2.5 أوامر التعامل مع حسابات المستخدمين (User handling commands) 41
2.6 أوامر التعامل مع جروبات (Group handling commands) 43
2.7 أوامر عامة مع مستخدم 44
3. الصلاحيات والمليكة (Ownership & Permissions) 45
3.1 العمود Mode 46
3.2 العمود Owner 49
3.3 العمود Group 50
الفصل الخامس// نظام ملفات متقدمة 51
1. الـ inode 52
2. ارتباط الملفات (Link File) 54
2.1 الروابط الناعم (Soft Links) 54
2.2 الروابط الصلبة (Hard links) 54
2.3 أوامر التعامل مع الارتباطات 55
3. ضغط الملفات (Compression) 56
4. أرشفة الملفات (Archiving) 57
5. قائمة تحكم الوصول File System (Access Control Lists)) 58
5.1 أوامر إعداد ACL 58
6. البحث وتحديد موقع الملفات (Searching & Locating Files) 59
6.1 البحث عن الأدوات والاوامر 59
6.2 البحث في الملفات 60
الفصل السادس// التخزين (Linux Storage) 65
1. الهارد ديسك فيزيائياً (Physical HHD) 65
2. الهارد ديسك منطقيًا (Logical HHD) 66
2.1 الـ Master Boot Record 66
2.2 الـ GUID Partition Table 68
3. تسمية وحدات التخزين 68
3.1 الـ SATA HHD 68
3.2 الـ NVMe SSD 68
3.3 الـ Virtual Disk 68
4. رقم تعريفي لوحدة التخزين 69
3.1 تعيين مسمى لوحدة تخزين (Assign a label to a storage) 69
3.2 كشف الرقم تعريفي لوحدة التخزين 69
4. عملية التهيئة (Formatting) 70
4.1 أداء lsblk 70
4.2 أداة fdisk 70
5. عملية Reformatting 75
6. عملية ربط (Mounting) 76
6.1 خطوات تركيب وحدة تخزين (Drive) في نظام لينكس 77
6.2 اضافات 79
6.3 إلغاء ربط وحدة تخزين مربطه مسبقًا 79
الفصل السابع // مدير الحزم (Linux Package Manager) 80
1. الحزمة (Package) 81
2. مدير الحزم (Package Manager) 81
أولاً/ مدير الحزم YUM 81
ثانياً/ مدير الحزم DNF 83
الفصل الثامن// الشبكات 84
1. شبكة الحاسوب (Network Computer) 84
1.1 مكونات شبكة الكمبيوتر 84
1.2 كرت شبكة (Network Interface Card) 85
1.3 عنوان IP-Address 87
2. اتصالات شبكات لينكس 89
2.1 أداة network-scripts 89
2.2 الـ NetworkManager 90
3. تشخيص مشكلات الشبكة (Troubleshoot Network) 94
3.1 أوامر تشخيص 95
4. الأداة ifconfig 96
4.1 خيارات الاداة 97
الفصل التاسع// إدارة عمليات لينكس (Linux Process Management) 99
1. أنواع العلميات (Types Process) 99
1.1 الـ Parent Process 99
1.2 الـ Child Process 100
1.3 الـ Orphan process 100
1.4 الـ Zombie process 100
1.5 الـ Daemon process 100
2. أوامر التعامل مع العلميات 101
2.1 عرض العلميات التي تعمل 101
قتل العمليات (kills process) 104
الـ Background & Foreground Process 105
حالة العلميات (Status Process) 106
الـ Checking Process State 107
أولوية العلميات (Priority Process) 109



الفصل الأول// مفاهيم 
1. نظام الحاسوب
نظام الحاسوب هو مجموعة من الأجهزة العتادية والبرمجيات التي تتعاون معًا لتنفيذ وإدارة العمليات والمهام المختلفة في الحواسيب. يتكون نظام الحاسوب من مجموعة متنوعة من المكونات التي تعمل معًا لتوفير بيئة تشغيل للتطبيقات وتنفيذ العمليات الحاسوبية.
1.1 هيكلية نظام الحاسوب (Computer System Structure)
يمكن تقسيم نظام الكمبيوتر إلى أربع مكونات:
أولاً// العتاد (Hardware)
هي عبارة عن المكونات المادية للحاسوب، مثل Processor و Memory و Devices و Storage و I/O Devices، وما إلى ذلك. 
ثانياً// نظام التشغيل (Operating System) 
عبارة عن مجموعة من البرمجيات، كل منها مصمم لوظيفة معينة؛ بهدف التحكم وتنسيق استخدام العتاد بين مختلف التطبيقات والمستخدمين.
ثالثاً// تطبيقات البرامج (Application programs)
تحديد طرق استخدام موارد النظام لحل مشاكل الحوسبة للمستخدمين. على سبيل المثال، تطبيقات Word Processors و Compilers و Web Browsers و Database Systems.
رابعاً// الـمستخدمين (Users)
وهو مستخدم جهاز الحاسوب، وقد يكون هذا المستخدم هو  Peopleأو machines أو الخ.
يوضح الشكل التالي، هيكلية نظام الحاسوب:

 

 

 

 

2. نظام التشغيل (Operating System)
نظام التشغيل هو برنامج أساسي يعمل كوسيط بين العتاد (الأجهزة الفعلية للحاسوب) وتطبيقات البرمجيات. يوجد العديد من التعريفات لنظام التشغيل بناءً على وجهات نظر مختلفة، وجميعها صحيحة لكننا سنركز هنا على التعريف الأبسط.
يعتبر نظام التشغيل ضروريًا في كل جهاز كمبيوتر لتشغيل البرامج وإدارة الموارد. يقوم نظام التشغيل بتنظيم وتنسيق عمل الأجهزة المختلفة في الحاسوب مثل المعالج والذاكرة ووحدات التخزين ووحدات الإدخال والإخراج.
يمكن تعريف نظام تشغيل على أن برنامج يقوم بـإدارة العتاد (Management Hardware) من خلال:
 تخصيص الموارد (Resource Allocator) يدير ويخصص جميع موارد النظام للاستخدام الفعال والعادل للموارد بين البرامج.
 تحكم بالبرامج (Control Program) يتحكم في تنفيذ البرامج لمنع الأخطاء والاستخدام غير السليم للكمبيوتر.
البرنامج الوحيد الذي يعمل في جميع الأوقات على الكمبيوتر هو النواة (kernel). كل شيء آخر هو إما برامج النظام (System Program) أو تطبيقات المستخدم (Application Program).
من هنا يأتي الاختلاف بين أنظمة تشغيل، هو قدرتها على إدارة العتاد (Management Hardware) بأفضل طريقة وأسرع كفاءة. بالتالي سيكون المستخدم سعيد عند توفير أفضل أداة من جهاز الحاسوب. يعتبر نظام تشغيل لينكس واحد من أفضل الأنظمة التي تتمتع بقدرة ممتازة على إدارة العتاد. 
يمكن تعريف نظام التشغيل على أنه برنامج يوفر بيئة لتنفيذ البرامج والخدمات. يقوم نظام التشغيل بتوفير مجموعة من الخدمات والمكتبات الأساسية التي يحتاجها البرامج لتشغيلها بشكل صحيح
يوضح شكل التالية بنية وهيكلية الحاسوب.

 

 

 


2.1 عمليات نظام التشغيل (Operating System Operations)
تقوم أنظمة التشغيل بتنفيذ العديد من العمليات على مستوى الأجهزة والبرمجيات، ومن بين هذه العمليات:
المقاطعات (Interrupts)
تستخدم أنظمة التشغيل مفهوم المقاطعات للتعامل مع أحداث غير متوقعة ومتزامنة التي تحدث على مستوى الأجهزة. عندما يحدث حدث مقاطعة مثل خطأ برمجي أو طلب لخدمة النظام، يتم تنشيط المقاطعة وتوفير تغيير في تنفيذ البرنامج الحالي للتعامل مع الحدث المقاطع. هذا يساعد في ضمان استجابة فعالة للأحداث الهامة وفي تنظيم توزيع الموارد.
التعامل مع أخطاء البرمجيات (Software Errors)
تتعامل أنظمة التشغيل مع الأخطاء والاستثناءات التي يمكن أن تحدث في البرامج. على سبيل المثال، إذا قام برنامج بالقسمة على الصفر، فإن النظام يكون مسؤولًا عن التعامل مع هذا الخطأ وإرجاع نتيجة مناسبة مثل رسالة خطأ أو إيقاف التنفيذ البرمجي.
طلب خدمة النظام (Request for Operating System Service)
يمكن للبرامج أن تطلب خدمات محددة من نظام التشغيل لتنفيذ وظائف معينة أو الوصول إلى موارد النظام. قد تتضمن هذه الخدمات إنشاء وإغلاق الملفات، وإدارة الذاكرة، والاتصال بالشبكة، وتنظيم العمليات، والوصول إلى الأجهزة الفيزيائية مثل الطابعات أو القرص الصلب. يعمل نظام التشغيل على تلبية هذه الطلبات وتنفيذ الخدمات المطلوبة بشكل فعال وآمن.
بهذه الطرق وغيرها، تقوم أنظمة التشغيل بتنفيذ العمليات على مستوى الأجهزة والبرمجيات لضمان تشغيل سلس وفعال للأنظمة والتطبيقات.
2.2 أوضع نظم التشغيل (OS Mode)
يوفر نظام التشغيل وضعين متعددين وهما:
وضع المستخدم (User Mode)
يتم تشغيل النظام في وضع المستخدم عند تشغيل تطبيقات المستخدم مثل إنشاء مستند نصي أو استخدام أي برنامج تطبيق. في هذا الوضع، تكون صلاحيات التطبيقات محدودة ومعزولة عن الموارد والوظائف الأساسية للنظام. هذا يساعد في تحقيق الأمان والاستقرار، حيث لا يمكن لتطبيقات المستخدم التدخل في عمليات النظام الحيوية أو الوصول إلى الموارد الحساسة مباشرة.
وضع النواة (Kernel Mode)
عندما يطلب تطبيق المستخدم خدمة من نظام التشغيل أو يحدث انقطاع أو استدعاء نظام (system call)، يتم تحويل النظام إلى وضع النواة. في هذا الوضع، يكون للنظام وصول كامل إلى جميع الموارد والوظائف الأساسية للنظام. يسمح وضع النواة بتنفيذ العمليات الحساسة والخدمات النظامية التي تحتاج إلى صلاحيات متقدمة، مثل إدارة الذاكرة والجدولة والتواصل مع الأجهزة الفيزيائية.
هذا النمط ثنائي الوضع (Dual Mode) يساعد في فصل وحماية أنشطة المستخدم عن أنشطة النظام الحساسة. عندما يكون النظام في وضع المستخدم، يتم ضمان عدم التأثير على استقرار النظام أو سلامة الموارد الحساسة. بينما في وضع النواة، يتم تمكين النظام من تلبية طلبات المستخدم وتنفيذ العمليات الحساسة للنظام بشكل آمن وفعال.
2.3 خدمات نظم التشغيل (Operating System Services)
تحسين الخدمات المقدمة من أنظمة التشغيل:
واجهة المستخدم (User interface)
توفر أنظمة التشغيل واجهة تفاعلية للمستخدم للتفاعل مع الحاسوب. تتنوع هذه الواجهات بين واجهة سطر الأوامر (CLI) وواجهة المستخدم الرسومية (GUI). توفر واجهة سطر الأوامر إمكانية استخدام الأوامر وإدخال الأوامر يدويًا، في حين توفر واجهة المستخدم الرسومية واجهة بديهية تعتمد على الرسومات والنقرات والسحب.
نستنتج أنه تنقسم هذه واجهات المستخدم إلى:
 الـ Command-Line Interface: ويرمز لها بـ CLI. وهي عبارة عن واجهة يتفاعل معها من خلال الأوامر.
 الـ Graphics User Interface: ويرمز لها بـ GUI. وهي عبارة عن واجهة يتفاعل معها من خلال رسومات. 
تنفيذ البرامج (Program Execution)
يعتبر تحميل البرامج في الذاكرة وتنفيذها من أهم خدمات أنظمة التشغيل. يجب على النظام أن يكون قادرًا على تحميل البرنامج في الذاكرة وتنفيذه بشكل سليم وإنهاء تنفيذه بشكل طبيعي (normally) أو غير طبيعي (abnormally) عند حدوث أخطاء.
عمليات الإدخال والإخراج (I/O Operations)
يحتاج البرامج إلى إجراء عمليات إدخال وإخراج للتفاعل مع المستخدم أو التعامل مع ملفات (Files) أو أجهزة إدخال/إخراج (Device I/O). تشمل هذه الخدمة عمليات الإدخال والإخراج للملفات والأجهزة المختلفة.
الاتصالات (Communications)
توفر أنظمة التشغيل خدمات الاتصالات لتبادل المعلومات بين العمليات على نفس الكمبيوتر أو بين أجهزة الكمبيوتر عبر الشبكة. يمكن أن تكون هذه الاتصالات عبر ذاكرة مشتركة أو عن طريق تمرير الرسائل (Passing message) بين العمليات عبر نظام التشغيل.
الكشف عن الأخطاء (Error Detection)
يعتبر الكشف عن الأخطاء ومعالجتها جزءًا مهمًا من خدمات أنظمة التشغيل. يجب على النظام أن يكون على دراية مستمرة بالأخطاء المحتملة التي يمكن أن تحدث في وحدة المعالجة المركزية (CPU) أو الذاكرة أو أجهزة الإدخال/الإخراج أو برامج المستخدم، ويجب على النظام محاولة التعامل مع هذه الأخطاء وإصلاحها.
خدمات متعددة لعدة مستخدمين (services multi endearment)
عند تشغيل عدة مستخدمين أو وظائف في نفس الوقت، يجب على نظام التشغيل توفير خدمات تخصيص الموارد لكل مستخدم أو وظيفة. تشمل هذه الخدمات أنظمة التشغيل المتعددة لعدة مستخدمين أو وظائف:
• تخصيص الموارد (Resource Allocation)
عند تشغيل عدة مستخدمين أو وظائف في نفس الوقت، يجب على نظام التشغيل تخصيص الموارد بشكل مناسب لكل مستخدم (user) أو وظيفة (job). تشمل الموارد المختلفة مثل دورات وحدة المعالجة المركزية (CPU) والذاكرة الرئيسية وتخزين الملفات وأجهزة الإدخال/الإخراج.

• التحاسب (Accounting)
توفر خدمة التحاسب تتبع المستخدمين والعمليات التي تستخدم موارد الكمبيوتر ونوعية استخدامها. يتم استخدام هذه المعلومات لأغراض مثل تحديد تكاليف استخدام الموارد وتقدير الأداء.
الأمان (Security)
تشمل خدمة الأمان إجراءات حماية النظام من الوصول غير المصرح به والاختراق. يتضمن ذلك مصادقة المستخدم وتأمين وصوله إلى موارد النظام من خلال كلمات المرور أو طرق أخرى. كما يتم حماية الأجهزة الخارجية للإدخال/الإخراج من محاولات الوصول غير المصرح به، ويتم تسجيل الأنشطة للكشف عن أنشطة الاختراق. 
الحماية (Protection)
تتضمن خدمة الحماية تحديد وتنظيم صلاحيات الوصول إلى الملفات وموارد النظام. يتم فرض سياسات وقواعد الوصول التي تضمن حماية المعلومات والموارد الحساسة من الوصول غير المصرح به.
إدارة العمليات
تهدف خدمة إدارة العمليات إلى تنظيم وتنسيق تنفيذ العمليات المختلفة في النظام. يتم تخصيص موارد النظام وتنظيم جدولة تنفيذ العمليات لضمان تنفيذها بشكل عادل وفعال.
2.4 واجهة سطر الأوامر (Command Line Interface)
واجهة سطر الأوامر (Command Line Interface)، المعروفة أيضًا بـ command interpreter، هي واجهة تسمح للمستخدم بالتفاعل مع نظام التشغيل والبرامج باستخدام أوامر في شكل أسطر نصية. تعمل واجهة سطر الأوامر عن طريق تحليل وتنفيذ الأوامر التي يدخلها المستخدم على النظام التشغيل.
واجهة سطر الأوامر قد تكون مدمجة في نواة النظام التشغيل (built into kernel)، حيث تكون جزءًا منها وتتمتع بصلاحيات عالية. أو يمكن أن تكون برنامجًا خاصًا (special program) يعمل بشكل مستقل عن النواة. تهدف واجهة سطر الأوامر إلى تسهيل تنفيذ الأوامر وإدارة النظام والبرامج بطريقة فعالة.
يحتوي نظام التشغيل عادة على عدة command interpreters يمكن للمستخدم اختيار أحدها، وتعرف هذه الـ command interpreters باسم shell command. بعض أمثلة الـ shells الشهيرة هي shell و C shell و Bourne-Again shell و Korn shell. وفي الوقت الحاضر، يوفر معظم أنظمة التشغيل ما يعرف بـ GUI shell، وهو واجهة سطر الأوامر التي تتيح التفاعل مع النظام عبر واجهة رسومية مستخدم أكثر تفصيلاً مثل Terminal في لينكس و command prompt في ويندوز.
الأوامر التي يمكن استدعائها من خلال واجهة سطر الأوامر (CLI) تشمل:
 Utilities: تعتبر برامج صغيرة مصممة لتنفيذ مهمة محددة في النظام. تعتبر هذه الأدوات جزءًا من أنظمة التشغيل وتتوفر عادة كأمر مستقل في واجهة سطر الأوامر. بعض الأمثلة على utilities تشمل:
- ls: يعرض قائمة الملفات والمجلدات في الدليل الحالي.
- cp: يقوم بنسخ ملف من مكان إلى آخر.
- mv: يقوم بنقل ملف من مكان إلى آخر.
- rm: يحذف ملف أو مجلد.
 Basic Commands: تشمل basic commands الأوامر الأساسية التي تتيح للمستخدم التفاعل مع النظام وإدارة الملفات والبرامج. تعتبر هذه الأوامر جزءًا من واجهة سطر الأوامر الأساسية للنظام. بعض الأمثلة على basic commands تشمل:
- cd: يقوم بتغيير الدليل الحالي.
- dir (أو ls في بعض الأنظمة): يعرض قائمة الملفات والمجلدات في الدليل الحالي.
- echo: يعرض نص على الشاشة أو يحفظه في ملف.
- help: يعرض مساعدة للأوامر المتاحة في النظام.
 Programs: يمكن استدعاء البرامج المثبتة على النظام أيضًا من خلال واجهة سطر الأوامر. هذه البرامج قد تكون تطبيقات مستقلة أو أدوات متقدمة توفر وظائف محددة. يمكن تشغيل البرامج باستخدام اسم البرنامج كأمر في واجهة سطر الأوامر. بعض الأمثلة على البرامج تشمل:
- نصوص المحررات مثل Vim و Nano.
- أدوات الشبكة مثل ping و curl.
- لغات البرمجة المفسرة مثل Python و Ruby.
هذه أمثلة فقط وتختلف الأوامر المتاحة حسب نوع نظام التشغيل والأدوات المثبتة عليه. قد تكون هناك أوامر إضافية متاحة وفقًا للتطبيقات المثبتة أو الإعدادات المخصصة في النظام.
3. بدء الحاسوب (Computer Startup)
يتم تحميل برنامج bootstrap عند بدء التشغيل أو إعادة التشغيل. يتم تخزينه عادةً في ROM أو EPROM، والمعروفين عمومًا باسم firmware.
وظيفة الـ bootstrap هي تهيئة جميع جوانب النظام وتحميل النواة (kernel) ليبدأ نظام التشغيل (OS) بالتنفيذ. بعد تحميل النواة (kernel)، يتم تنفيذ سلسلة من الإجراءات لبدء تشغيل الحاسوب بشكل كامل، بما في ذلك تتم عملية تسمى التهيئة الأولية (Initialization)؛ حيث تهيئة الأجهزة، فحص ذاكرة الوصول العشوائي (RAM)، تحميل البرامج والخدمات الأساسية، وإعداد بيئة التشغيل. بعد ذلك، يتم تنفيذ النواة وتهيئة المزيد من الأجهزة، ويصبح الحاسوب جاهزًا لتشغيل التطبيقات وتلبية احتياجات المستخدم.
4. تنظيم نظام التشغيل (Operating System Organization)
يتضمن نظام التشغيل تنظيمًا لكل جهاز عتادي يتواجد في الحاسوب (نطلق على العتاد الجهاز اسم Hardware Device). يحتوي كل جهاز عتاد على وحدة تحكم للجهاز (Device Controller) وذاكرة مؤقتة (Buffer) لتسهيل عملية الاتصال والتفاعل معه.
على سبيل المثال، عندما يتعامل نظام التشغيل مع وحدة تخزين القرص الصلب (Hard Disk Drive)، يوجد متحكم بجهاز القرص الصلب (Hard Disk Controller) الذي يتحكم في عمليات القراءة والكتابة على القرص. يتم استخدام ذاكرة مؤقتة (Buffer) لتخزين البيانات المؤقتة التي يتم قراءتها أو كتابتها على القرص، مما يساعد على زيادة كفاءة النظام وسرعة الوصول إلى البيانات.
يجب أن يحتوي جهاز الحاسوب على وحدة معالجة مركزية (CPU) واحد أو اكثر. تتصل هذه الواحدة مع متحكم الأجهزة (device controllers) من خلال ناقلات (bus) الذي يوفر الوصول إلى ذاكر مشتركة (shared memory). لاحظ الشكل التالي:

 

 

 


5. المقاطعات (Interrupts)
هي إشارات (signals) تنبعث من البرمجيات (software) أو العتاد (hardware) عندما تحتاج عملية أو حدث ما إلى اهتمام فوري. تنبه هذه الإشارات المعالج إلى وجود عملية ذات أولوية عالية تتطلب توقف العمل الحالي والتعامل معها.
5.1 أنواع المقاطعات
قد يتم إصدار إشارات المقاطعة (Interrupt signals) استجابةً لأحداث برمجية (software) أو أحداث عتادية (hardware). وتصنف هذه المقاطعات عادةً إلى الأنواع التالية:
 مقاطعة العتاد (Hardware Interrupt): تتعلق بحالة العتاد (state hardware) التي يمكن أن تنشئ إشارات المقاطعة (Interrupt signals) وترسلها إلى وحدة المعالجة المركزية (CPU) عبر نظام الحافلة النظامية (System Bus).

 مقاطعة البرمجيات (Software Interrupt): تتعلق بحالة البرمجيات (state software) التي يمكن أن تنشئ إشارات المقاطعة (Interrupt signals) وترسلها إلى وحدة المعالجة المركزية (CPU) من خلال استدعاء نظامي (System Call).
على سبيل المثال، في حالة مقاطعة العتاد (Hardware Interrupt)، عند الضغط على مفتاح على لوحة المفاتيح أو تحريك الماوس، يتم إطلاق مقاطعة العتاد التي تعمل على إبلاغ المعالج لقراءة الحدث المتعلق بضغط المفتاح أو موقع المؤشر.
على سبيل المثال، في حالة مقاطعة البرمجيات (Software Interrupt)، عند حدوث خطأ أثناء التنفيذ، يتم إطلاق مقاطعة البرمجيات التي تعمل على إبلاغ المعالج للتعامل مع الخطأ الذي حدث.
بوجود نظام المقاطعات، يتم تمكين نظام التشغيل من التعامل مع الأحداث غير المتوقعة وإدارة استجابتها بشكل فعال، مما يضمن استمرارية العمل وأداء النظام بشكل سلس ومستقر.


6. استدعاءات النظام (System Calls)
أثناء تشغيل البرنامج قد يحتاج إلى إحدى الخدمات (Services) التي يوفرها نظام التشغيل. للوصول لهذه الخدمات (Services) تم توفير الـ System Calls. ويتم معالجة هذه الـ System Calls في الـ Kernel mode.
على سبيل المثال، عندما يُطلب من البرنامج تنفيذ عملية الطباعة، يتم استدعاء دوال مخفية (معروفة أيضًا بالـ System Calls) المخصصة لعملية الطباعة في نظام التشغيل. يتم تمرير المعلمات (Parameters) اللازمة لهذه الدوال ومن ثم يتم تنفيذ عملية الطباعة.
من المهم أن نعرف أن استدعاءات النظام تعمل في وضع النواة (Kernel mode)، وعادةً ما يتم تنفيذ آلاف الاستدعاءات في الثانية الواحدة في الأنظمة الحديثة. ومن بين أشهر استدعاءات النظام التي يوفرها نظام Linux تشمل: open، read، write، close، wait، exec، fork، وexit.
من مهم معرفة أن الـ System Calls تعمل في kernel mode، وعادةً ما يتم تنفيذ آلاف الاستدعاءات في الثانية الواحدة في الأنظمة الحديثة. ومن بين أشهر استدعاءات النظام التي يوفرها نظام Linux تشمل: open، read، write، close، wait، exec، fork، وexit.
استدعاءات النظام معقدة وتتضمن العديد من التفاصيل، وقد يكون من الصعب التعامل معها مباشرة. لذلك، يلجأ مطورو التطبيقات إلى بناء تطبيقاتهم باستخدام API التي تعمل في وضع المستخدم (User mode). يسهل ذلك عملية التطوير والتفاعل مع استدعاءات النظام. لاحظ الشكل التالي:

 

 

 

 

وراء الكواليس، تتم استدعاء الدوال الموجودة في API والتي تقابل استدعاءات النظام (System Calls) عن طريق واجهة تسمى System Call Interface تختصر بـ SCI.
على سبيل المثال، في حالة عملية الطباعة، يحتوي API POSIX على دالة خاصة للطباعة على الشاشة تُسمى printf(). عند تنفيذ هذه الدالة، تقوم SCI بالاستدعاء الفعلي لدالة write() الموجودة في System Calls، وتمرير المعلمات اللازمة لتنفيذ العملية في وضع النواة (Kernel mode). بعد انتهاء الدالة write()، تعيد قيمة العودة (return value) إلى SCI، والتي بدورها تمررها إلى printf(). يمكن توضيح هذا بالشكل التالي:

 

 

 

 

 

تكون هذه الـ System Calls بشكل عام كـ Routines (كدوال واجراءات جاهزة) قد تكون مكتوبة:
 بـ High Level Language مثل لغة C و C++؛ ويتم استخدامها عند التعامل مع Software.
 بـ Low Level Language مثل لغة Assembly Language؛ ويتم استخدامها عند التعامل مع Hardware.
7. واجهة برمجة تطبيقات (Application Programming Interface)
تحدد API مجموعة من الدوال المتاحة لمبرمج التطبيق، بما في ذلك البارامترات التي يتم تمريرها إلى كل دالة وقيم الإرجاع التي يمكن أن يتوقعها المبرمج.
للتبسيط، توفر الـ API استجابة المستخدم للنظام وترسل استجابة النظام مرة أخرى إلى المستخدم. ثلاثة من أكثر APIs التطبيقات لمبرمجي التطبيقات شيوعًا هي:
 الـ Windows API لأنظمة Windows 
 الـ POSIX API للأنظمة المستندة إلى POSIX (والتي تشمل تقريبًا جميع إصدارات UNIX و Linux و Mac OSX).
 الـ Java API  لبرمجة تطبيقات Java التي تعمل على جهاز JVM.
يصل المبرمج إلى API عبر الـ Library Stander التي يوفرها نظام التشغيل. في حالة UNIX و Linux للبرامج المكتوبة بلغة C، تسمى المكتبة libc.
لماذا يفضل مبرمج التطبيقات البرمجة وفقًا لـ API بدلاً من استدعاء system calls الفعلية؟ هناك عدة أسباب للقيام بذلك. فائدة واحدة تتعلق بـ program portability؛ بمعنى يمكن لمبرمج التطبيقات الذي يصمم برنامجًا باستخدام API أن يتوقع أن يقوم برنامجه بالتجميع والتشغيل على أي نظام يدعم نفس API.

 


الفصل الثاني// نظام التشغيل لينكس 
لينكس (Linux) هو نظام تشغيل مفتوح المصدر، مشابه لأنظمة التشغيل الأخرى مثل Microsoft Windows و Apple macOS و iOS و Google Android وغيرها. يتميز نظام لينكس (Linux) بدعمه للعديد من الميزات مثل التعدد المهام (multitasking) والتعدد المستخدمين (multiuser)، مما يتيح للأشخاص تشغيل تطبيقات متعددة على جهاز كمبيوتر واحد في نفس الوقت.
يمكن استخدام نظام Linux على مجموعة واسعة من الأجهزة، بدءًا من الأجهزة اليدوية الحديثة مثل الهواتف الذكية، وصولاً إلى أجهزة الكمبيوتر الضخمة. يحظى نظام لينكس بشعبية كبيرة بين المطورين ومستخدمي الكمبيوتر على حد سواء، حيث يتواجد في الهواتف الذكية وأجهزة الكمبيوتر المحمولة وأجهزة الكمبيوتر الشخصية وحتى في السيارات والثلاجات.
بفضل طبيعته المفتوحة المصدر، يتمتع نظام لينكس بقوة المشاركة المجتمعية والتطوير المستمر، مما يسهم في تطويره وتحسينه بشكل مستمر. يحتوي على مجموعة واسعة من التوزيعات المختلفة التي تلبي احتياجات مختلف المستخدمين والمشاريع.
باختصار، نظام لينكس هو نظام تشغيل قوي ومتعدد الاستخدامات يحظى بشعبية كبيرة بين المطورين والمستخدمين، ويوجد في العديد من الأجهزة المختلفة في حياتنا اليومية.
1. تطور نظام لينكس
تطور نظام Linux يعود إلى بداية العقد التسعينات عندما قام المطور Linus Torvalds بتطويره في عام 1991. بدأت فكرة Linux كمحاولة لتحسين نظام التشغيل UNIX، حيث قدم تحسينات ومزايا جديدة ولكنها تم رفضها من قبل مطوري UNIX. وبناءً على ذلك، قرر Linus Torvalds إطلاق نظام تشغيل قابل للتعديل من قِبَل المستخدمين.
منذ ذلك الحين، شهد نظام Linux نموًا متسارعًا واستخدامًا واسعًا. حاليًا، يُعتبر Linux أحد أنظمة التشغيل الأسرع نموًا. يتم استخدامه على نطاق واسع من الهواتف الذكية إلى أجهزة الكمبيوتر العملاقة، ويتواجد على معظم الأجهزة الرئيسية تقريبًا.
يتميز نجاح Linux بعدة عوامل، بما في ذلك مرونته وتوافره كنظام تشغيل مفتوح المصدر. يمكن للمستخدمين تعديل وتخصيص نظام Linux وفقًا لاحتياجاتهم الخاصة. كما يوفر Linux أداءً ممتازًا واستقرارية عالية، ويُعد اختيارًا شائعًا بين المطورين والمؤسسات.
باختصار، تطور نظام Linux منذ بدايته في التسعينات، وأصبح نظامًا تشغيليًا سريع النمو وشائع الاستخدام، يُستخدم على نطاق واسع على مختلف الأجهزة ويتميز بمرونة وقابلية للتعديل وأداء ممتاز.
1.1 مراحل تطور نظام لينكس
حدث تطوير نظام لينكس على ثلاث مراحل وهي:
1.1.1 المرحلة الاولى 1964-1984
في سنة 1965 تم عقد بين ثلاث شركات ضخمة متخصصة لإنشاء نظام تشغيل يخدم الباحثين وغيرهم من مستخدمين، وهذه الشركات هي:
• الـ General Electric وكانت بمثابة ممول للمشروع.
• الـ Bell Laboratories وكانت بمثابة معهد أبحاث.
• الـ MIT وكانت بمثابة معهد تعليمي.
في سنة 1968 تم إطلاق أول نظام تشغيل ويسمى Multics، كان هذا النظام يدعم Multitasking و Multiuser أي أصبح يوفر خاصية Time Sharing Operating System. برغم من نجاح مشروع إلا أن الطموح كانت أكبر من الامكانيات؛ فقامت كلاً من General Electric و MIT بالانسحاب.
استمرت شركةBell  في تطوير Multics بقيادة المطور ken Thompson، حتى سنة 1970 تم أطلاق نظام تشغيل جديد يسمى unics وكان هذا النظام مكتوب في B Language. استمر تطوير نظام unics حتى سنة 1971 تم تغير اسمه ليصبح Unix وكان تطور كبير في عالم الحاسوب.
وفي فترة 1971-1984 تم تطوير على نظام Unix، وتم إعادة كتابة النظام بـ C Language واصدار عدة نسخ منه. وأصبح نظام متطور قادر على تلبية متطلبات العامة.
وفي محاوله من شركة Bell من نشر نظام Unix قامت بنشره في الجامعات وكانت من ضمن الجامعات التي حاولت نشر Unix فيها هي جامعة University Berkeley حيث تم منح نسخة مجانية (أو free-release) من نظام Unix للجامعة. وكانت هذه الجامعة هي التي درس بها المطور ken Thompson.
وفي عام 1975 عاد المهندس ken Thompson إلى جامعه University Berkeley كمدرّس وأحضر معه أحدث إصدار Unix انضم إليه طالبان حديثا التخرجّ. وعملوا معًا وقد كانت محررات نصوص من ضمن الأشياء التي عملوا عليها فقاموا بعمل محرر EX الذي تحول بعد ذلك إلي محرر النصوص VI الشهير. وقاموا بعمل بعض التطبيقات الخاصة لهم وأصدروا نسخه من نظام تشغيل وأطلقوا عليها BSD) اختصار لـ (Berkeley Software Distribution وقد ظهر هذا الإصدار في سنه 1976.
أدي ذلك إلي جعل شركة Bell Labs تقوم بعمل ترخيص (أو Linens) لاستخدام Unix في سنه 1983 وظهور أول نسخه من Unix ذات ترخيص وذلك لحماية الحقوق الخاصة بها فكانت هذه الخطوة سببًا في غضب الكثير من المبرمجين والمهتمين بـ Unix والذين ساهموا في تطويره علي مدار سنوات مما دفع البعض علي تقديم استقالتهم من المشروع وكان أبرزهم Richard Stallman.
1.1.2 المرحلة الثانية 1984-1991
قام المهندس Richard Stallman بعد تقديم استقالته. وقام بتطوير مشروع واسماه GNU (اختصار لـ GNU Not UNIX) وكان هدف المشروع هوة عمل نظام تشغيل مفتوح المصدر مجاني.
وانضم في ذلك الوقت إلي المشروع ألاف المبرمجين واستمروا في كتابه Applications و Library و Shell و Compiler ولكن لم يقوموا بعمل kernel (كان معتمد على Unix Kernel) واستمروا من 1984 حتى سنه 1991.
في سنه 1991 قام طالب (يسمى بـ Linus) بنشر مشروع التخرج، محتوى المشروع أنه قام بعمل kernel وهذا kernel تعمل مع الـ hard disk (تحديداً من نوع AT) وتدعم Multi-threading. وتم استخدام هذا البحث لتطوير نظام جديد يسمى GNU/Linux.
ملاحظة
كملة Linux هي من الكلمتين Linus , Tux؛ وتعود كملة Linus لاسم مطور كرينل، وتعود كملة Tux لبطريق موجود في مدينة المطور.
1.1.3 المرحلة الثالثة -1991 للآن
في سنه 1993 تم ظهور إتنان من الشركات وهي Slack Ware و Debian. وقاموا بأخذ Applications و Library و Kernel وقامت كل منهم بعمل نظام تشغيل خاص بها.
على سبيل المثال قامت شركة Debian بتطوير الاصدارات التالية من الانظمة:
• نظام Ubuntu
• نظامChrome 
• نظامKnoppix 
في سنه 1994 تم ظهور شركة Red-Hat وفي سنه 1998 قامت الشركة بعمل نسخه تسمى RHL واستمرت بعملها إلي أن وصلت إلي الإصدار رقم 9 في سنه 2003 ثم توقفت.

في سنة 2003 قامت شركة Red-Hat بتطوير صنفان من لينكس وهما:
• الـ Fedora: تم توفيره مجانًا ولكنه يحصل على تحديثات لكل إصدار لمدة 13 شهرًا تقريبًا.
• الـ Red Hat Enterprise Linux: وهو للعملاء الذين كانوا على استعداد لدفع ثمنه.
برغم من أن نسخ RHEL غير متاحة للتنزيل المجاني إلا أن شروط الترخيص الخاصة بـ GNU/Linux تنص صرحةً بـإتاحة كود المصدر الخاص بنظام؛ وهذا جعل من سهل نسبياً إعادة تجميع كود المصدري بالكامل. تم إنشاء العديد من التوزيعات التي أخذت الكود المصدري لـ Red Hat وأعادت تجميعها وأصدرتها. على سبيل المثال، ثم تجميع الكود المصدر الخاص بـ RHEL8 وإصدار نسخة جديدة تسمى AlmaLinux8 وكذلك CentOS8.
2. مكونات نظام لينكس
يحتوي نظام Linux OS على المكونات التالية:

 

 

 


2.1 نواة لينكس (Linux Kernel)
نواة لينكس (Linux Kernel) هي الجزء الأساسي من نظام التشغيل الذي يقوم بتأسيس الاتصال بين الأجهزة والبرامج. على سبيل المثال، تدير النواة تخصيص الذاكرة لتشغيل برامج محددة، وتدير موارد النظام بشكل عام.
2.1.1 مسؤوليات نواة لينكس
لديها أربع مسؤوليات الأساسية:
1. إدارة الأجهزة (Device Management)
يحتوي النظام على العديد من الأجهزة المتصلة به، مثل وحدة المعالجة المركزية (CPU Device) ووحدة الذاكرة (Memory Device) وبطاقات الصوت (Sound Cards Device) وبطاقات الرسومات (Graphic Cards Device) وغيرها. تخزن نواة لينكس (Linux Kernel) معلومات عن جميع الأجهزة المتصلة في مشغلات الأجهزة (Device Drivers). بدون نواة لينكس (Linux Kernel)، لن يكون بإمكانها التحكم في هذه الأجهزة. تعرف النواة كيفية التعامل مع الأجهزة ومعالجة طلباتها لتحقيق أفضل أداء، وتدير الاتصال بين جميع الأجهزة. كما تحتوي النواة على قواعد يجب على جميع الأجهزة اتباعها.
2. إدارة الذاكرة (Memory Management)
تتتبع النواة الذاكرة المستخدمة وغير المستخدمة وتتأكد من أن العمليات لا تتداخل في بيانات بعضها البعض باستخدام عناوين الذاكرة الافتراضية (Virtual Memory Addresses).
3. إدارة العمليات (Processes Management)
الغرض الرئيسي من الكمبيوتر هو تشغيل سلسلة محددة مسبقًا من التعليمات، تُعرف باسم البرنامج ((Program. غالبًا ما يشار إلى البرنامج قيد التنفيذ على أنه عملية (Process).
في الوقت الحاضر، يهدف معظم أجهزة الكمبيوتر إلى تشغيل عمليات متعددة بشكل متزامن. تتطلب هذه العمليات تخصيص موارد النظام مثل وحدة المعالجة المركزية والذاكرة والأجهزة والتخزين وغيرها. لذا، نحتاج إلى طبقة وسيطة تدير توزيع موارد النظام بكفاءة وعدالة بين هذه العمليات، وتسمى هذه الطبقة الوسطى "النواة" (Kernel). تقوم الـنواة بشكل أساسي بتحويل موارد النظام الفعلية إلى موارد افتراضية مخصصة لكل عملية، مما يجعل العملية تبدو وكأنها العملية الوحيدة التي تعمل على الجهاز. وتكون النواة أيضًا مسؤولة عن منع التعارضات وتخفيفها بين العمليات المختلفة.
4. معالجة استدعاءات النظام (Handling System Calls)
تتيح للمطورين كتابة استعلامات أو طلبات للنواة لتنفيذ مهام محددة.
2.1.2 الأنظمة الفرعية في نواة لينكس
تتكون نواة لينكس (Linux Kernel) من أنظمة فرعية أساسية (Core Subsystems) وهي:
1. جدولة العمليات (Process Scheduler)
يتحكم في توزيع وقت وحدة المعالجة المركزية (CPU) بشكل عادل بين جميع العمليات التي تعمل على النظام في وقت واحد. يقوم بتحديد أي عملية تتمتع بالأولوية في الحصول على الموارد وتنفيذها.
2. وحدة إدارة الذاكرة (Memory Management Unit)
تدير توزيع وإدارة موارد الذاكرة بين العمليات المختلفة التي تعمل على النظام. توفر وحدة إدارة الذاكرة مساحات عناوين ذاكرة افتراضية مستقلة (virtual address spaces) لكل عملية، مما يسمح لكل عملية بالوصول إلى مساحة ذاكرة خاصة بها دون التداخل مع العمليات الأخرى.
3. نظام الملفات الافتراضي (Virtual File System)
يوفر واجهة موحدة للوصول إلى البيانات المخزنة في أنظمة الملفات المختلفة ووسائط التخزين المادية. يسمح للمستخدمين والبرامج بالوصول إلى الملفات وإجراء العمليات المختلفة عليها مثل القراءة والكتابة والحذف والتعديل.
2.2 مكتبات النظام (System Libraries)
تعمل كبرامج فرعية تساعد في الوصول واستخدام ميزات النواة (kernel). توفر وظائف ومكونات برمجية مشتركة للتعامل مع النظام والتفاعل مع مختلف الخدمات والوظائف المقدمة من النواة. مثال على ذلك هي مكتبة Glibc (مكتبة GNU C) التي توفر واجهات برمجة تطبيقات (APIs) للتفاعل مع النظام.
2.3 شيل (Shell)
يعمل كمحول بين المستخدم والنواة، ويوفر واجهة لإدخال الأوامر وتنفيذها على النظام. يتيح استخدام الأوامر والبرامج وإجراء العمليات المختلفة مثل التخزين والاسترجاع ومعالجة البيانات. توجد أنواع مختلفة من شيل لنظام لينكس، وأشهرها هو Bash Shell (Bourne Again Shell) الذي يوفر مجموعة واسعة من الوظائف والأدوات للتفاعل مع النظام.
يسمح لنا الـشيل بالتفاعل مع نظام لينكس من خلال الـ Terminal (أو tty). يتيح لنا استدعاء الملفات القابلة للتنفيذ (executable file) لإنشاء عملية قيد التشغيل. علاوة على ذلك، يسمح لنا أيضًا بالتفاعل مع الـ Linux file system.
إذا كنا مستخدمًا جديدًا لنظام لينكس، وقمنا بفتح الـ  terminal(أو tty)، فمن المفترض أننا مرتبكون فيما يتعلق بما يجب فعله بها. هنا يأتي دور الـ Bash Shell.
2.3.1 الـ Scripting
افترض أننا مطالبون بتنفيذ بعض الأوامر الأساسية كل يوم. يدعم لينكس ميزة تسمى الـ scripting تتيح لنا تنفيذ أكثر من مهمة في وقت واحد. لذلك، من الجيد استخدام الـ scripting بدلاً من أداء المهام المتكررة. تنتهي ملفات scripting بامتداد sh. 
في لينكس، الأوامر هي طرق أو تعليمات يمكنك من خلالها توجيه نظامك للقيام ببعض الإجراءات. يتم تنفيذ الأوامر في command line. تنقسم الاوامر الى نوعين:
1. الـ Built-in commands
هي أوامر داخلية مدمجة في الـ shell. يتم استدعاء الـ Built-in commands من shell ويتم تنفيذها مباشرة داخل الـ shell نفسها. يمكنك سرد الـ Built-in commands بمساعدة الأمر "help" و "compgen -b". بعض الأمثلة على الـ Built-in commands هي "pwd" و "help" و "type" و "set" و "unset" وما إلى ذلك.
2. الـ External command
وتمسى بـ command line utility. هذه الأوامر هي برامج لها binary file خاص بها وتقع في file system. هذه هي الأوامر التي يقدمها نظامك وهي مستقلة تمامًا عن shell. معظم هذه الأوامر موجودة في bin/ و/sbin  و /usr/sbin.
2.4 مفاهيم
في أنظمة لينكس يوجد نسختان منها وهي:
 الـ minimal: وهي عبارة عن أنظمة يتم تعامل معها من خلال CLI فقط.
 الـ maximal: وهي عبارة عن أنظمة يتم تعامل معها من خلال GUI و CLI.
إذا قمنا بتنصيب نظام يعتمد على GUI فيطلق على CLI هنا باسم Terminal. إما إذا قمنا بتنصيب نظام لا يعتمد على GUI فتسمى فيطلق على CLI هنا باسم  TTY (اختصار لـtele type terminal ).
ملاحظة:
 الـ TTY هو مصطلح قديم كان يستخدم عند تعامل مع حاسوب بواسطة شاشة سوداء وكيبورد. 
 الـ TTY يتم استخدامها عند الوصول فيزيائي للجهاز.
 الـ PTS يتم استخدامها عند الوصول عن بعد للجهاز.
الـ Virtual TTY
يوفر Linux إمكانية الحصول على أكثر من جلسة تسجيل دخول واحدة على الـنظام في وقت واحد. لإثبات ذلك، قم بتسجيل الدخول إلى نظامك. بعد ذلك، اضغط على Alt+Ctl+Fn يجب أن ترى تسجيل الدخول؛ الان نحن نقف على TTYn. للرجوع إلىTTY  معينة، اضغط على Fn+ Alt. حيث n هي رقم TTY  وقد تكون من صفر الى تسعة.
ملاحظة:
 يمكن استخدام الأمر chvt n (اختصار لـ Virtual tty change ) بدل Alt+Ctl+Fn للانتقال بين TTY.
 يمكن استخدام الأمرtty  لمعرفة tty الحالية.
 يمكن استخدام الأمرexit  للخروج من الجلسة الحالية.

 


3. توزيعات لينكس (Linux Distributions)
هي عبارة عن انظمة مبنيه على Linux Kernel بالإضافة لدعم User Programs و Repositories و Libraries. والسبب في وجود الكثير من توزيعات لينكس هو ان open source بالتالي يمكن لأي شخص تشغيل الـ source code ودراسته وتعديله وإعادة توزيعه. هذا يختلف اختلافًا كبيرًا عن أنظمة التشغيل التقليدية مثل Unix و Microsoft Windows و MacOS والتي تعتبر مملوكة وأقل قابلية للتعديل. فيما يلي أشهر توزيعات لينكس الاساسية:

 

 

 


4. أوامر لينكس الاساسية (Basic Linux Commands)
قبل التطرق إلى الأوامر يجب تعرف على صيغة العامة للأوامر في لينكس، وهي كما يلي:
command [option] [arguments] #
حيث الـ command هي الأمر المراد تنفيذها. إما option هي اختيارية ويمكن استخدامها مع الامر بهدف تغير سلوك الامر. إما arguments هي اختيارية وهي الملفات أو المجلدات أو العملية المراد تطبيق الامر عليها.
قبل أن ننتقل إلى قائمة الأوامر، تحتاج إلى فتح سطر الأوامر أولاً. على الرغم من أن الخطوات قد تختلف بناءً على التوزيع الذي تستخدمه، يمكنك عادةً العثور على سطر الأوامر في قسم الأدوات المساعدة. فيما يلي قائمة بأوامر لينكس الأساسية:
الامر clear
تقوم بتنظيف شاشة الـ terminal. فيما يلي مثال على ذلك:
clear Command:
الامر jobs
سيعرض هذا الأمر جميع المهام الحالية إلى جانب الـ statuses الخاصة بها. الـ  jobهي في الأساس process تبدء بواسطة shell. 
الامر top
امر top مكافئ لـ Task Manage في Windows، حيث سيعرض قائمة بالعمليات الجارية ومقدار CPU التي تستخدمها كل عملية. من المفيد جدًا مراقبة استخدام موارد النظام، خاصة معرفة العملية التي يجب إنهاؤها لأنها تستهلك الكثير من الموارد.
الامر history
عندما كنت تستخدم Linux لفترة معينة من الوقت، ستلاحظ بسرعة أنه يمكنك تشغيل مئات الأوامر كل يوم. على هذا النحو، يكون تشغيل أمر history مفيدًا بشكل خاص إذا كنت تريد مراجعة الأوامر التي أدخلتها من قبل.
الامر man
يمكنك بسهولة معرفة كيفية استخدام وتعامل مع الاوامر باستخدام الأمر man. على سبيل المثال:
man clear Command:
امر id
يخبرنا هذا الأمر عن معرف  uidو primary group وقائمة  secondary groupsالتي تنتمي إليك. لاحظ التالي:
id  Command:
سيكون الإخراج مشابه لما يلي:
uid=1001(ghabayen) gid=1001(ghabayen) groups=1001(ghabayen) … Output:

ملاحظة
سيكون دائما الـ uid للـ root يساوي صفر.
امر echo
يستخدم هذا الأمر لطباعة على الـ bash sell. على سبيل المثال:
echo "Hello, my name is Mohammed" Command:
امر hostname
يظهر هذا الامر اسم host/network. ستؤدي إضافة الوسيطة -i إلى عرض عنوان IP الخاص بشبكتك. مثال:
hostname -i Command:
امر date
يظهر هذا الامر التاريخ الحالي. مثال:
date  Command:
امر cal
وهي اختصار calendar، يظهر تقويم الشهر الحالي. مثال:
Cal  Command:
يمكن اظهار تقويم سنة كاملة، نقوم بما يلي:
Cal 2023 Command:
يمكن اظهار تقويم لشهر معين في سنة، نقوم بما يلي: 
Cal 9 2023 Command:
امر su
اختصار لـ switch user. هو يستخدم لتبديل من المستخدم الحالي لمستخدم جديد. مثال:
su - username Command:
إذا لم تقم بتمرير username فيفترض أنك تريد الانتقال إلى root. وكذلك من المهم معرفة عند الانتقال من مستخدم صلاحيات أعلى الى مستخدم أقل فلن يطلب كلمة مرور عند الانتقال إما العكس فستطلب كلمة مرور الانتقال.

 



الفصل الثالث// نظام الملفات 
قبل البدء يوجد بعض المفاهيم التي يجب ذكرها قبل البدء في نظام الملفات في لينكس:
1. مفاهيم
1.1 جهاز التخزين (Storage Device)
هي عبار عن عتاد (Hardware) يمكن استخدامه لتخزين البيانات والملفات والصور والخ. من الأمثلة على أجهزة التخزين HDD و SSD و flash memory وما إلى ذلك.
1.2 التخزين الكتلي (Block Storage)
هي طريقة لتخزين ملفات على أجهزة التخزين (storage device)؛ بشكل مختصر يمكننا القول أن هذه الطريقة تعتمد على تقسيم جهاز التخزين إلى مجموعة من الكتل (Block) ذات حجم ثابت ولكل كتلة عنوان يتم الوصول لهذه الكتلة من خلاله.
1.3 التخزين الكائني (Object Storage)
هي طريقة لتخزين ملفات على أجهزة التخزين (storage device)؛ بشكل مختصر يمكننا القول أن هذه الطريقة تعتمد على تنظيم بيانات بشكل كائني (Objects). كل كائن يتضمن البيانات نفسها ومعرفًا فريدًا (مثل مفتاح) للوصول إليه. هذا يمكن من تخزين البيانات بشكل مستقل عن هيكلها ويسهل الوصول إليها وإدارتها.
1.4 تجزئة الديسك (Disk Partitioning)
جهاز التخزين (Storage Device) يكون في البداية مساحة تخزين فارغة تماماً ويطلق عليها في هذه الحالة اسم الفضاء الخام (raw space). يتم بعد ذلك تقسيمه منطقياً لمجموعة من الأجزاء (Partitions) من خلال عملية تجزئة الديسك (Disk Partitioning). يمكن القيام بعملية تجزئة الديسك (Disk Partitioning) باستخدام:
 الـ Master Boot Record ويرمز له بـ MBR.
 الـ GUID Partition Table ويرمز له بـ GPT.
مصطلح الـ Block Storage هو اسم الآخر للـ Storage Device من وجهة نظر نواة لينكس (Linux kernel). جهاز التخزين (storage drive) هو عبارة عن Hardware Device يمكن استخدامه لتخزين البيانات، مثل HDD و SSD و flash memory وما إلى ذلك.
وحدة التخزين (Storage Drive) هي كناية عن جهاز تخزين (Storage Device) أو جزء (Partition). ضع في اعتبارك ان جهاز تخزي يمكن ان يكون يعامل كجزء واحد أو قد يكون مقسم لعدة أجزاء. وكذلك كل جزء يعامل على انها على جهاز تخزين منفصل ومستقل.
عند تجزئة جهاز التخزين (Storage Device) إلى أجزاء (Partitions)، يتم تعيين كل جزء (Partition) بشكل منفصل ويعامل كجهاز تخزين مستقل. بمعنى آخر، يتم التعامل مع كل جزء (Partition) كوحدة تخزين منفصلة يمكن تهيئتها وتنسيقها بنظام ملفات مستقل ويحتوي على مجموعة من الملفات والمجلدات الخاصة به.
عند تجزئة جهاز الخزين بطريقة MBR؛ فإنه يخصص مساحة صغيرة جداً في بداية جهاز الخزين، هذه المساحة تسمى MBR، حيث هذه المساحة لا تنتمي لأي Partitions.  تعمل MBR على تخزين معلومات هامة لتهيئة وتشغيل جهاز التخزين، بما في ذلك جدول الاجزاء (Partition Table) الذي يحدد المواقع والحجم وأنواع الاجزاء الموجودة على الجهاز. ومع ذلك، فإن MBR نفسها لا تحتوي على أي بيانات فعلية للأجزاء.

يوضح الشكل التالي تهيئة جهاز تخزين من HDD بطريقة MBR؛ حيث سنقوم بتجزئة جهاز HDD إلى أربعة أجزاء (Partitions)، كما يلي:

 

 

الـ MBR نفسه مقسم لثلاث أجزاء وسندرس الآن الجزء الأول منه وهو جدول الأجزاء (Partition Table). فيما بعد سنتطرق إلى تفاصيل أكثر عن MBR. حيث يمكننا القول:
جدول الأجزاء (Partition Table) ببساطة يخزن بيانات وصفية (metadata) عن الأجزاء (Partitions). في حالة فقد جدول الأجزاء (Partition Table) عن جهاز التخزين؛ فسيتم فقد البيانات جميعها؛ لأنه يحتوي على البيانات الخاصة ببداية ونهاية كل جزء (Partition).
كل جزء (Partition) يديره نظام ملفات (File System)، حيث يمكننا القول:
نظام ملفات (File System) وهو المسؤول والمتحكم في كيفية تخزين البيانات واسترجاعها على وحدة تخزين. بدونه فإن المعلومات الموجودة في جهاز التخزين ستكون كأنها قطعة واحدة من البيانات التي لا يمكن التفريق بينها ومعرفة أين بداية كل جزء منها ونهايته. 
من أشهر انواع أنظمة الملفات (File System) هي FAT32 و NTFS و ext2 و ext3 و ext4 و XFS. كل نظام له استخداماته الخاصة. على سبيل المثال، في نظام FAT32 لا يمكن تعامل مع ملفات حجمها أكبر من 4-GB. الذي يحدد نوع الـ file system هو الاستخدامات؛ مثلاً نريد سرعة استرجاع أو نريد تعامل مع ملفات ذات حجم كبير جداً والخ.
2. الملفات (Files)
في نظام لينكس، كل شيء عبارة هو ملف وإذا لم يكن ملف، فإنه يُعتبر عملية. ولا يقتصر مصطلح "ملف" على الملفات النصية والصور والبرامج فحسب، بل يشمل أيضًا الأجزاء (partitions) وبرامج تشغيل أجهزة العتاد (hardware device drivers) والمجلدات (directories).
يوفر نظام الملفات لكل ملف مجموعة من الخصائص والمعلومات التي تتضمن:
 اسم الملف (File-name):
هو الاسم الذي يُعطى للملف للتعرف عليه والوصول إليه في النظام. يتم تحديد اسم الملف من قبل المستخدم أو النظام ويجب أن يكون فريدًا داخل الدليل (directory) الذي ينتمي إليه.

 البيانات الوصفية (Metadata):
تشمل البيانات الوصفية معلومات حول الملف مثل حجمه وتاريخ إنشائه وتاريخ آخر تعديل وصلاحيات الوصول إليه ومالك الملف ومجموعة المستخدمين المرتبطة به وغيرها من المعلومات. تساعد البيانات الوصفية في إدارة وتنظيم الملفات وتحديد الأذونات المناسبة للوصول إليها.

 

 رقم فريد (Inode):
يُعتبر الـ Inode رقمًا فريدًا يتم تعيينه لكل ملف في نظام الملفات. يحتوي الـ Inode على المعلومات المتعلقة بالملف مثل البيانات الوصفية وموقع البيانات الفعلية للملف على القرص. يتم استخدام الـ Inode للإشارة إلى الملف بدلًا من استخدام الاسم الملف في العمليات الداخلية للنظام. اسم للملف (File-name)
2.1 أنواع الملفات (File Type)
يشير نوع الملف إلى قدرة نظام التشغيل على التمييز بين أنواع الملفات المختلفة. تدعم العديد من أنظمة التشغيل العديد من أنواع الملفات. يحتوي نظام التشغيل لينكس على الأنواع التالية من الملفات:
2.1.1 الـ Regular Files
تُعرف أيضًا باسم الملفات العامة (General Files). وهي مجرد حزمة معلومات لها اسم محدد وامتداد. تُستخدم هذه النوعية من الملفات لتخزين المعلومات مثل ملفات النصوص والصور. ويمكن للمستخدم تنفيذ عمليات مختلفة على هذه الملفات مثل الإضافة والتعديل والحذف وحتى إزالة الملف بأكمله. وترمز لها بالرمز "-" (شرطة).
2.1.2 الـ Directory Files
تُعتبر المجلدات (الدلائل) مجموعة من الملفات الأخرى. يتم تعيين أسماء لملفات الدلائل للتعرف عليها. بالإضافة إلى ذلك، يتم الاحتفاظ بالمجلدات في هيكل شبيه بشجرة، وبمعنى آخر، قد تحتوي المجلدات على مجلدات أخرى. وترمز لها بالرمز "d".
2.1.3 الـ Special Files
تعتبر الملفات الخاصة ملفات لها استخدامات خاصة وتعرف أيضًا باسم ملفات الأجهزة (Device Files). في أنظمة التشغيل مثل Windows، يتم تمثيل الأجهزة مثل محركات الأقراص المضغوطة (CD-ROM) ومحركات الأقراص الصلبة (hard drives) بواسطة أحرف تمثيلية مثل F وG وH، بينما في نظام Linux يتم تمثيلها كملفات. وفيما يلي أنواع هذه الملفات:
• الـ Block file: ويتم الاشارة لها بـ b.
• الـ Character device file: ويتم الاشارة لها بـ c.
• الـ Named pipe file: ويتم الاشارة لها بـ p.
• الـ Symbolic link file: ويتم الاشارة لها بـ l.
2.2 هيكلية الملفات (File Structure)
نعلم أن نظام التشغيل الشبيه بـ Windows يخزن الملفات في مجلدات مختلفة على الأجزاء (Partitions) مثل C وD وE. بينما يتم تخزين نظام ملفات بـ Linux في هيكلية تشبه الشجرة تبدأ بالمجلد الجذر (root directory).
يعتمد نظام ملفات بـ Linux على هيكلية الملفات الهرمية (hierarchical file structure). وبمعنى آخر، تُنظم جميع الملفات على شكل شجرة. يُطلق على المجلد الأعلى اسم مجلد الجذر (root directory). يمكن الوصول إلى جميع المجلدات الأخرى في Linux عن طريق مجلد الجذر. كما هو موضح في الرسم البياني أدناه.

 

 

ملاحظة:
ملاحظة يمكن استخدام الأداة tree لإظهار شجرة الملفات.
2.2.1 المجلد الجذر (Root Directory)
تأتي جميع المجلدات (directories) في نظام الملفات ضمن مجلد الجذر (Root Directory) الذي يتم تمثيله بعلامة /. يمكن العثور على كل شيء في نظام الملفات ضمن هذا مجلد الجذر (Root Directory). ويعتبر نقطة الدخول (بداية) نظام الملفات.
2.2.2 مجلد المستخدم (User Directory)
على وجه الخصوص، كل مستخدم لديه مجلد المستخدم الرئيسي (home directory)، مخصص لتخزين ملفات ذلك المستخدم. عادةً ما يتم تضمين هذه المجلدات (directories) ضمن مجلد home/، ويتم تسميتها باسم المستخدم الذي يمتلك هذا المجلد.
2.2.3 أنواع المجلدات (Type Directory)
لقد قمنا بتصنيف الـ directories وفقًا لنوع الملف كما هو موضح أدناه:
Directory  type Types of files stored
Binary directories
Contains binary or compiled source code files, eg, /bin, /sbin, etc.
Configuration directories
Contains configuration files of the system, eg, /etc, /boot.
Data directories
Stores data files, eg, /home, /root, etc.
Memory directories
Stores device files which doesn"t take up actual hard disk space, eg, /dev, /proc, /sys.
Usr (Unix System Resources)
Contains sharable, read only data, eg, /usr/bin, /usr/lib, etc.
var (variable directory)
Contains larger size data, eg, /var/log, /var/cache, etc.
Non-standard directories
Directories which do not come under standard FHS, eg, lost+found, /run, etc.

1. مجلد البرامج الثنائية (Binary Directory)
يتضمن هذا النوع من مجلدات على الملفات التي تحتوي على الشفرة المصدرية المترجمة (compiled source code). وتعرف أيضًا بملفات التنفيذ (executable files) لأنه يمكن تنفيذها على الكمبيوتر. يحتوي هذا النوع على المجلدات التالية:
المجلد الوصف
/bin يحتوي على البرامج الثنائية للمستخدم وملفات التنفيذ وأوامر لينكس (Linux commands)؛ هذه الأوامر يتم استخدامها في وضع المستخدم غير الجذر.
/sbin يحتوي على البرامج الثنائية للجذر (root binaries) وملفات التنفيذ وأوامر لينكس (Linux commands)؛ هذه الأوامر يتم استخدامها في وضع المستخدم الجذر.
/lib يحتوي على المكتبات المشتركة (shared libraries) التي يتم استخدامها بشكل متكرر من قبل المجلدات /bin و/sbin. على سبيل المثال، ld-linux.so.2 و libfuse.so.2.8.6.

2. مجلد تكوين (Configuration Directory)
يتضمن هذا النوع من مجلدات على ملفات تم تكوينها والتي تقوم بتكوين البارامترات والإعدادات الأولية لبعض برامج الكمبيوتر. يحتوي هذا النوع على المجلدات التالية:
المجلد الوصف
/boot يحتوي على ملفات تكوين الاقلاع (boot configuration) لنظام لينكس. يعتبر هذا المجلد أحد المجلدات الأكثر أهمية. إزالة أو تلف أي ملفات في هذا المجلد قد يتسبب في تعطل نظام التشغيل بعد إعادة التشغيل. فبدون هذه الملفات، لن يتمكن نظامك من البدء بشكل صحيح.
etc/ يحتوي على جميع ملفات التكوين الخاصة بنظام لينكس. على سبيل المثال، عند تعيين عنوان IP لبطاقة الشبكة، يتم حفظ هذه الإعدادات في ملف داخل هذا المجلد. وبالمثل، عند إنشاء مستخدم جديد، يتم تخزين إعداداته الخاصة في ملف داخل المجلد هذا. وعند تعيين دقة لبطاقة الشاشة، يتم حفظ هذه الإعدادات في ملف داخل هذا المجلد.

3. مجلدات البيانات (Data Directories) 
يتضمن هذا النوع من مجلدات على ملفات تحتوي على بيانات المستخدمين. تحتوي مجلدات البيانات في لينكس على مجلدات التالية:
المجلد الوصف
/home يعمل كمستودع لملفات المستخدم الشخصية والبرامج. يتم إنشاء مجلد باسم المستخدم في هذا المجلد، مثل home/ghabayen/. يمكن أن يحتوي هذا المجلد على مجلدات فرعية مثل Desktop و Downloads و Pictures وغيرها، حسب تنظيم المستخدم.
/tmp يشير المصطلح "tmp" إلى كلمة "temporary"، ويستخدم لتخزين البيانات المؤقتة. تكون البيانات المخزنة في هذا المجلد مؤقتة وقابلة للحذف بعد إعادة تشغيل النظام أو بعد فترة زمنية معينة. يمكن أن تكون هذه البيانات مخزنة في القرص الصلب أو في الذاكرة العشوائية (RAM).
/srv يشير المصطلح "srv" إلى كلمة "service"، ويحتوي على بيانات مرتبطة بالخدمات التي يقدمها النظام مثل خدمة الويب (www) ونظام إدارة الإصدارات (cvs) والنسخ الاحتياطي المتزامن (rsync) وخدمة نقل الملفات (ftp)، وغيرها من الخدمات.
ملاحظة
نظام الملفات في لينكس حساس لحالة الاحراف. على سبيل المثال، المجلد المسمى foo يختلف عن المجلد المسمى بـ Foo.
4. مجلدات الذاكرة (Memory Directories)
مجلدات الذاكرة تحتوي على ملفات النظام بأكمله. يتم تخزين جميع معلومات الجهاز وعمليات تشغيل البيانات والمعلومات المتعلقة بالنظام في هذه المجلدات. تحتوي مجلدات الذاكرة في Linux على المجلدات التالية:
المجلد الوصف
/dev يشير المصطلح "dev" إلى كلمة "device". في نظام التشغيل لينكس، يتم تخزين الملفات التي تُستخدم لتمثيل الأجهزة والوصول إليها في هذا المجلد. على سبيل المثال، يتم تمثيل قرص الصلب كملف في هذا المجلد (/dev/sda) ويمكن الوصول إلى محتوياته عن طريق قراءة وكتابة هذا الملف.
/proc يشير المصطلح "proc" إلى كلمة "process". يحتوي على معلومات حول العمليات القيد التشغيل. يعمل هذا المجلد كنظام ملفات افتراضي يحتوي على معلومات نصية حول موارد النظام والتطبيقات التي تعمل. عند تشغيل النظام، يقوم النواة (kernel) بجمع البيانات عن الأجهزة المتصلة وتسجيلها في ملفات تم تخزينها في هذا المجلد.
/sys يشير المصطلح "sys" إلى كلمة "system". يحتوي هذا المجلد بشكل أساسي على معلومات حول النواة (kernel). يوفر معلومات مفصلة حول تكوين النظام، والأجهزة المتصلة، والمعلومات الإحصائية الخاصة بالنظام. يمكن للمطورين والمستخدمين الوصول إلى هذه المعلومات للتحكم والتفاعل مع النواة والتأكد من حالة النظام.

5. مجلد المتغيرات (Variable directories)
مصطلح "var" هو اختصار لكلمة varible. وتحتوي على الملفات التي لها حجم غير متوقع والتي من المتوقع أن يتغير محتواها باستمرار أثناء التشغيل العادي للنظام هنا. على سبيل المثال،  log filesو spool files و cache files.
6. الـ Unix System Resources Directories
مصطلح "usr" هو اختصار لكلمة Unix System Resources. يحتوي المجلد usr على الملفات القابلة للمشاركة بين جميع المستخدمين. على سبيل المثال، ملفات Fonts، وكذلك ملفات Background، وكذلك ملفات Themes، والخ.
7. الـ Media Directories
من أجل الوصول إلى البيانات الموجودة في وسيط معين (مثل Disks أو Partitions أو USB Flash أو (CD-ROM عليك أولاً بعملية Mounting له. الـ Mounting يعني ببساطة إتاحة الوصول إلى وسيط تخزين معين في نقطة معينة من file-system.
في حالة كان وسيط تخزين هو أو USB Flash أو CD-ROM فيمكن الوصول له في المجلد media.
2.2.4 الـ Absolute Paths & Relative Paths
يعد فهم الفرق بين relative path و absolute path أمرًا مهمًا للغاية، حيث يساعدك المسار الصحيح على الوصول إلى المجلد المطلوب بدقة. عند تحديد مسار، يمكن أن يكون هناك اختلاف في الاستخدام اعتمادًا على ما إذا كان المسار نسبيًا (relative) أم مطلقًا (absolute).
عندما تحدد مسارًا يبدأ بعلامة /، يُفترض أن نقطة البداية هي root directory. إذا لم تضع علامة /، فمن المفترض أن نقطة البداية هي current directory.
يتم تعريف المسار المطلق (Absolute Path) على أنه تحديد موقع الملف أو المجلد من مجلد الجذر (root directory). ببساطة، يعتبر المسار المطلق مسارًا كاملاً، حيث يبدأ بعلامة / ليشير إلى مجلد الجذر ويمر بالمجلدات الفرعية المتتالية حتى يصل إلى المجلد المطلوب.
يتم يتعرف المسار النسبي (Relative Path) على أنه المسار المتعلق بالموقع الحالي مباشرة. يبدأ المسار النسبي من المجلد الحالي ولا يبدأ أبدًا بمجلد الجذر (/). بدلاً من ذلك، يشير إلى المجلدات الفرعية المتصلة بالمجلد الحالي. يُستخدم المسار النسبي عادةً عند العمل في سياق العمل الحالي لتحديد الملفات والمجلدات المرتبطة به.
ملاحظة
 الـ root user وهو مستخدم الرئيسية على النظام ويكون له مجلد يسمى /root.
 الـ root directory يتم تمثيله بعلامة / وهو عبارة عن نقطة دخول إلى الـ file system.
 عند تعامل مع مجلدات لا يهم وضع علامة / في أخر المسار؛ لكن في حالة تعامل مع ملفات لا يمكن وضع علامة / في أخر المسار.
 الـ root directory هو أساس Linux file system. يتم الإشارة إليه بـ /. مثلا المسار home/ يعني انه داخل الـ root directory يوجد مجلد يسمى home.
اختصارات:
 الاختصار ctrl + a تضع المؤشر في بداية السطر.
 الاختصار ctrl + e تضع المؤشر في نهاية السطر.
 الاختصار ctrl + k تحذف من عند المؤشر إلى نهاية السطر.
 الاختصار ctrl + u تحذف من عند المؤشر إلى نهاية البداية.
 الاختصار  ctrl + dلتسجيل الخروج من جلسة الحالية.
 الاختصار  ctrl + l لتنقية الترمينال.
 الاختصار shift + PgUp للصعود لأعلى.
 الاختصار shift + PgDn للنزول لأسفل.
 الاختصار ctrl + s يعمل قفل للترمينال.
 الاختصار ctrl + q يعمل يفك قفل ترمينال.
 الاختصار ctrl + c لقطع عملية قيد تشغيل في الواجهة.
3. أوامر التعامل مع نظام الملفات
فيما يلي الاوامر المستخدمة مع الملفات والمجلدات والمسارات:
الأمر pwd
وهي اختصار لـ Printed Wiring Directory. يستخدم هذا الأمر لمعرفة مسار المجلد الحالي الذي أنت فيه. سيعيد هذا الأمر المسار المطلق ((absolute path. عند فتح الجهاز لأول مرة، تكون في المجلد الرئيسي للمستخدم. فيما يلي مثال على ذلك:
pwd Command:
فيما يلي مخرج (للتوضيح):
/ghabayen Output:
أي نحن نقف حالياً داخل مجلد ghabayen  (وهو المجلد الرئيسي للمستخدم) الموجود داخل home/.
الأمر ls
هي اختصار لـ local system. استخدم الأمر "ls" لعرض محتويات المجلد الحالي. فيما يلي مثال على ذلك:
ls Command:
إذا كنت تريد عرض محتوى مجلدات أخرى فرعية، فأكتب ls ثم مسار المجلد. فيما يلي مثال على ذلك:
ls /home/ghabayen Command:
هناك أشكال (بارامترات) مختلفة يمكنك استخدامها مع الأمر ls:
 الشكل ls -l سيعرض المزيد من المعلومات عن الملفات. والحرف l اختصار لـ long.
 الشكل ls -R سيعرض جميع الملفات الموجودة في الـ sub-directories أيضًا.
 الشكل ls -a سيعرض الملفات المخفية.
 الشكل ls -all سيعرض files و directories بمعلومات مفصلة مثل الأذونات والحجم والمالك وما إلى ذلك.
ملاحظة:
 يكون مخرج الأمر ls ملون؛ على سبيل المثال، يتم منح لون الازرق للمجلدات، ولون الابيض للملفات.
 الأمر dir مشابه للأمر ls؛ ولكن يكون المخرج غير ملون.
الأمر cd
هي اختصار لـ Change Directory. يتم استخدام الأمر cd للتنقل عبر ملفات والمجلدات. يتطلب هذا الامر إما المسار الكامل أو اسم المجلد، اعتمادًا على المجلد الحالي الذي أنت فيه.
لنفترض أنك في home/username/Documents/ وتريد الانتقال إلى المجلد Photos )وهو مجلد فرعي من المجلد الرئيسي Documents). للقيام بذلك، ما عليك سوى كتابة الأمر التالي: 
cd Photos Command:
هناك بعض الاختصارات التي تساعدك على التنقل بسرعة:
• الشكل .. cd لنقل مجلد واحد للخلف.
• الشكل cd للانتقال مباشرة إلى المجلد الرئيسي.
• الشكل cd - للانتقال إلى المجلد السابق.
• الشكل cd ~ للانتقال المجلد الرئيسي للمستخدم الحالي.
• الشكل cd . تشير إلى المجلد الحالي.
مثال على استخدام الشكل cd ~:
cd ~/media Command:
هنا، نقوم برجوع إلى المجلد الرئيسي ثم الانتقال إلى المجلد الفرعي (المجلد media) من المجلد الرئيسي.
مثال على استخدام الشكل cd ..:
cd ../media Command:
هنا، نقوم برجوع إلى مجلد واحد للخلف ثم الانتقال إلى المجلد الفرعي (المجلد media) من المجلد الجديد.
الأمر file
يتم استخدام الأمر file لتحديد نوع الملف. لا يهمه الامتداد المستخدم للملف. فيما يلي مثال:
file /etc/doc.txt Command:
Text.txt: ASCII text
فيما يلي الخيارات التي يمكن استخدامها مع الامر file:
Option Function
file -s
Used for special files.
file *
Used to list types of all the files.
file /directory name/*
Used to list types of all the files from mentioned directory.
file [range]*
It will list out all the files starting from the alphabet present within the given range.
الامر stat 
يتيح لك الأمر stat معرفة الـ filename و Size و Access Time و Modify Time و Change Time و Birth Time و UID و GID و Access و Context و Inode والخ. فيما يلي مثال على ذلك:
stat /etc/doc.txt Command:

 


سيكون الإخراج مشابه لما يلي:
File: doc.txt
Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d    Inode: 17283229    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2022-09-17 20:14:57.074695586 +0300
Modify: 2022-09-17 20:14:57.074695586 +0300
Change: 2022-09-17 20:14:57.074695586 +0300
Birth: 2022-09-17 20:14:57.074695586 +0300 Output:
الامر touch
يتيح لك الأمر touch إنشاء ملف جديد فارغ. فيما يلي مثال لإنشاء ملف:
touch index.html Command:
يمكن إنشاء أكثر من ملف فارغ في نفس الامر كما يلي:
touch index.html    doc.txt Command:
يتيح لك الأمر touch تحديت وقت التعديل ووقت الوصول للملف. الملف موجود مسبقاً، فقط سيقوم بتعديل على modification time و access time للملف.
فيما يلي الـ Options التي يمكن استخدامها مع الامر touch:
Option Function
touch -a
To change file access and modification time.
touch -m
It is used to only modify time of a file.
touch -r
To update time of one file with reference to the other file.
touch -t
To create a file by specifying the time.
touch -c
It does"t create empty file.
لتعيين الـ Access Time بالوقت الحالي. فيما يلي تغير الـ Access Time بالوقت الحالي:
touch -a index.html  Command:
لتعيين modification time بالوقت الحالي. فيما يلي تغير الـ Access Time بالوقت الحالي:
touch -m index.html  Command:
لن يؤدي استخدام الوسيطة "c" مع الأمر touch إلى إنشاء ملف فارغ، إذا كان هذا الملف غير موجود.
touch -c index.html  Command:

الامر cp
هي اختصار لـ copy. يتم استخدام الأمر cp لنسخ ملف أو مجلد. فيما يلي مثال لنسخ ملف:
cp   source destination Command:
فيما يلي مثال لنسخ مجلد (غير فارغ):
cp -r   source destination Command:
الامر rm
هي اختصار لـ remove. يتم استخدام الأمر rm لحذف ملف (فارغ). فيما يلي مثال لحذف ملف:
rm   doc.txt Command:
فيما يلي الـ Options التي يمكن استخدامها مع الامر rm:
Option Description

rm *extension
Used to delete files having same extension.
rm -r 
To delete a directory recursively.
rm -i
Remove a file interactively.
rm -rf
Remove a directory forcefully.
فيما يلي مثال لحذف ملف (غير فارغ):
rm -f  doc.txt Command:
فيما يلي مثال لحذف مجلد (فارغ):
rm -r directortx Command:
فيما يلي مثال لحذف مجلد (غير فارغ):
rm -rf directortx Command:
فيما يلي مثال لحذف ملفات لها نفس الامتداد:
rm *txt /home/ghabayen Command:
الامر mkdir
وهي اختصار لـ make directory. يستخدم الأمر  mkdir لإنشاء مجلد جديد. على سبيل المثال، لاحظ التالي:
mkdir /home/ghabayen/test Command:
في هذا المثال، نريد إنشاء مجلد جديد (يسمى test) داخل المجلد الرئيسي للمستخدم ghabayen.
يمكن إنشاء مجلدات جديدة بمستوى عمق متعدد؛ بمعنى إنشاء المجلدات الفرعية اللازمة بشكل تلقائي إذا لم تكن موجودة بالفعل:
mkdir -p /home/ghabayen/dir1/dir2/dir3 Command:
في هذا المثال، سيتم إنشاء المجلدات "dir1" و "dir2" و "dir3" بشكل تلقائي إذا لم تكن موجودة بالفعل. إذا كانت المجلدات موجودة، فلن يتم إعادة إنشائها.
الامر rmdir
وهي اختصار لـ remove directory. استخدم الأمر " rmdir" لحذف مجلد الفارغ فقط. على سبيل المثال، لاحظ التالي:
rmdir /home/ghabayen/dir1 Command:
لحذف مجلد بما في ذلك المجلدات الفرعية دفعة واحدة استخدم الامر مع وسيطة"rmdir -p" كما يلي:
rmdir -p dir1/dir2/dir3 Command:
الامر mv
وهي اختصار لـ Move. الأمر "mv" هو أمر متعدد الأغراض. لا يقتصر الأمر على نقل الملفات والمجلدات فحسب، بل يمكن استخدامه أيضًا لإعادة تسمية الملفات والمجلدات.
الاستخدام الأساسي للأمر mv هو نقل الملفات والمجلدات، فيما يلي مثال لنقل ملف:
mv /home/ghabayen/file.txt Command:
الاستخدام الثانوية للأمر mv هو إعادة تسمية الملفات والمجلدات، فيما يلي مثال لإعادة تسمية ملف:
mv file.txt   text.txt  Command:
4. أوامر تعامل مع محتويات الملف 
هناك العديد من الأوامر التي تساعد في إلقاء نظرة على محتويات الملف. الآن سننظر في بعض الأوامر الواردة في الجدول:
Commands Function
head
It displays the beginning of a file.
tail
It displays the last part of a file.
cat
This command is versatile and multi worker.
tac
Opposite of cat.
more
Command line displays contents in pager form that is either in more format.
less
Command line displays contents in pager form that is either in less format.
امر cat
وهي اختصار لـ concatenate. يتم استخدامه لعرض محتويات الملف على sdout. لعرض محتويات ملف معين، اكتب cat متبوعًا باسم الملف وامتداده. على سبيل المثال:
cat /home/ghabayen/file.txt Command:
امر less
يتم استخدامه لعرض محتويات الملف على sdout. الفرق بينها وبين cat هي انها تعرض المحتويات كصفحة يمكن تصفحها في ترمينال. لعرض محتويات ملف معين باستخدام الامر less قم بما يلي:
less /home/ghabayen/file.txt Command:
امر more
يتم استخدامه لعرض محتويات الملف على sdout. الفرق بينها وبين less هي انه عند الوصول إلى نهاية صفحة (محتويات الملف) يتم الخروج منها. لعرض محتويات ملف معين باستخدام الامر more قم بما يلي:
more /home/ghabayen/file.txt Command:
امر head
يتم استخدام الأمر head لعرض الأسطر الأولى من أي ملف نصي. بشكل افتراضي، سيعرض أول عشرة أسطر. فيما يلي مثال:
head /home/ghabayen/file.txt Command:
ولكن يمكنك تحديد عدد الاسطر المراد عرضها باستخدام الوسيطة n. على سبيل المثال، إذا كنت تريد فقط إظهار الأسطر الخمسة الأولى، فاكتب:
head -n 5 /home/ghabayen/file.txt Command:
يمكن استخدام لعرض محتويات ملفين، كما يلي:
head file1.txt file2.txt Command:
يحسب الأمر "head -c" عدد بايتات الملف.
head -c file.txt Command:
امر tail
هذا واحد له وظيفة مماثلة لأمر head، ولكن بدلاً من إظهار الأسطر الأولى، سيعرض الأمر tail الأسطر العشرة الأخيرة من ملف نصي. على سبيل المثال: 
tail /home/ghabayen/file.txt Command:

ولكن يمكنك تحديد عدد الاسطر المراد عرضها باستخدام الوسيطة n. على سبيل المثال، إذا كنت تريد فقط إظهار الأسطر الخمسة الاخيرة، فاكتب:
tail -n 5 /home/ghabayen/file.txt Command:


الفصل الرابع/ إدارة المستخدمين 
هناك طريقتان لإدارة حسابات المستخدمين هما:
1. الإدارة المركزية (Centralized management)
2. الإدارة الفردية (Standalone management)
يتم اختيار الطريقة المناسبة لإدارة حسابات المستخدمين بناءً على حجم ونطاق البيئة، ومتطلبات الأمان والتوافق، واحتياجات إدارة الصلاحيات.
1. الإدارة المركزية (Centralized management)
تتم الإدارة المركزية في شبكة مراقبة المجال (Domain Controller Network). يتم في الإدارة المركزية إدارة حسابات المستخدمين لجميع الأنظمة في نظام الخادم المركزي. يتم استخدام خدامات مثل LDAP و ADS لإدارة المستخدمين وعملية المصادقة في نظام الخادم. تتمثل الفائدة الرئيسية للإدارة المركزية في توفير مركز واحد لإدارة حسابات المستخدمين وتعيين الصلاحيات وتنفيذ سياسات الأمان والمراقبة بشكل متكامل. لاحظ الشكل التالي:

 

 

 

في هذا النموذج، يتم إرسال معلومات تسجيل الدخول الخاصة بالمستخدم من النظام المحلي إلى نظام الخادم المركزي. يستخدم نظام الخادم المركزي Directory Service مثل LDAP أو ADS للتحقق من صحة معلومات تسجيل الدخول والمصادقة على هوية المستخدم.
عندما يقوم المستخدم بتسجيل الدخول إلى النظام المحلي، يُرسل اسم المستخدم وكلمة المرور إلى نظام الخادم المركزي. يتحقق نظام الخادم المركزي من صحة المعلومات المقدمة باستخدام Directory Service المخزنة فيه. يتم التحقق من صحة اسم المستخدم وكلمة المرور ومعلومات الصلاحية والأذونات المرتبطة بالمستخدم في الدليل.
إذا تم التحقق وتمت المصادقة بنجاح، يُسمح للمستخدم بالوصول إلى النظام واستخدام الموارد المشتركة وتنفيذ الأوامر المسموح بها. في حالة عدم تطابق المعلومات أو عدم صحتها، يتم رفض التسجيل ومنع الوصول.
باستخدام الإدارة المركزية، يمكن توفير توحيد إدارة حسابات المستخدمين وتطبيق سياسات الأمان والمراقبة بشكل مركزي، مما يسهل إدارة الأنظمة وتوزيع الصلاحيات وضمان الامتثال للمتطلبات الأمنية والقوانين.
هذا الأسلوب هو خارج نطاق كتابنا. يمكن متابعة والبحث في كتب شبكات المتخصصة بهذا المجال. وربما سيكون في مستقبل القريب كتاب بهذا المجال.

2. الإدارة الفردية (Standalone management)
في الإدارة الفردية (Standalone management)، تتم إدارة حسابات المستخدمين على مستوى النظام المحلي. يحدث ذلك في بيئة workgroup network، حيث لا يوجد خادم مركزي لإدارة حسابات المستخدمين.
في هذا النموذج، اعتمادًا على معلومات تسجيل الدخول المخزنة محليًا، يصادق النظام المحلي نفسه على أنه يُسمح للمستخدم بتسجيل الدخول أم لا.
2.1 عملية المصادقة (Authentication)
عندما يقوم المستخدم بإدخال اسم المستخدم وكلمة المرور، يتم تنفيذ الخطوات التالية في النظام المحلي من خلال تلك الملفات (قاعدة البيانات) التي تحتوي على تفاصيل تسجيل دخول المستخدم.
1. التحقق من وجود حساب المستخدم: يتم التحقق من ما إذا كان اسم المستخدم المدخل موجودًا في قاعدة بيانات المستخدمين المحلية.
2. التحقق من صلاحية الوصول: إذا كان الحساب موجودًا، يتم التحقق مما إذا كان يُسمح للمستخدم بتسجيل الدخول من الموقع المحدد أو الجهاز الذي تم إدخال اسم المستخدم وكلمة المرور عليه.
3. التحقق من كلمة المرور: إذا تم السماح بتسجيل الدخول، يتم التحقق من صحة كلمة المرور المقدمة مع المخزنة محليًا.
4. إدارة حدود إعادة المحاولة: إذا لم تكن كلمة المرور صحيحة، يتم التحقق من قيمة الحد المسموح به لعمليات إعادة المحاولة. إذا تم تجاوز الحد، يتم قفل الحساب.
5. تحديث كلمة المرور: إذا تم السماح بإعادة كتابة كلمة المرور، يتم التحقق من صلاحية كلمة المرور المخزنة ويُطلب من المستخدم تحديثها في حالة انتهاء صلاحيتها.
6. تنبيهات تاريخ انتهاء الصلاحية: إذا كانت كلمة المرور على وشك الانتهاء، يتم عرض رسالة تحذير تطالب المستخدم بتغيير كلمة المرور قبل تاريخ انتهاء الصلاحية.
7. الوصول المصرح به: إذا تم استيفاء جميع الشروط وتم التحقق من صحة اسم المستخدم وكلمة المرور، يتم السماح للمستخدم بتسجيل الدخول والوصول إلى النظام المحلي.
2.2 ملفات إدارة المستخدمين (User management files)
يتم تخزين معلومات المستخدمين في أربع ملفات رئيسية تسمى passwd و shadow و group و gshadow. يتم تخزين هذه الملفات في المجلد المسمى etc/.
نظرًا لأنه يتم التحكم في نظام إدارة المستخدم بالكامل من خلال هذه الملفات، فإن لينكس نفسه يحتفظ بنسخة خلفية (احتياطية) من كل ملف في نفس المجلد ويحدثها. يتم تخزين النسخة الخلفية (الاحتياطية) بالاسم الأصلي. لتمييز النسخة الاحتياطية عن النسخة الأصلية، يتم استخدام علامة الواصلة كبادئة في اسم النسخة الاحتياطية. يسرد الجدول التالي اسم ملف النسخ الاحتياطي مع الملف الأصلي.
Original file name passwd shadow group gshadow
Backup file name passwd- shadow- group- gshadow-
2.2.1 ملفpasswd 
يمكنك عرض جميع المستخدمين على النظام بالنظر إلى محتويات الملف etc/passwd/. يحتوي كل سطر في هذا الملف على معلومات حول مستخدم واحد، بدءًا من اسم المستخدم الخاص به.
يمكنك طباعة محتويات ملف passwd باستخدام cat:
cat /etc/passwd  Command:
يمكنك طباعة معلومات المستخدم المخزنة في الملف passwd باستخدام الامر:
getent passwd username Command:
يحتوي ملف passwd على قائمة بجميع حسابات المستخدمين. يتم تخزين كل حساب مستخدم في سطر فردي. يحتوي كل سطر على سبعة حقول مفصولة بنقطتين. وهي كما يلي:
الحقل الوصف
Username يمثل اسم المستخدم الفريد الذي يُستخدم لتحديد هوية المستخدم في النظام.
password يمثل هذا الحقل نائبًا عن كلمة المرور الحقيقية للمستخدم. يتم تخزين الكلمة المرورية بشكل مشفر أو مشفر هاش لأغراض الأمان.
UID يوفر هذا الحقل رقمًا فريدًا يُعرف باسم "رقم تعريف المستخدم" ويُستخدم لتحديد هوية المستخدم بشكل فريد في النظام.
GID يُمثل هذا الحقل رقمًا فريدًا يُعرف باسم "رقم تعريف المجموعة" ويُستخدم لتحديد المجموعة التي ينتمي إليها المستخدم.
Description يعرض هذا الحقل وصفًا موجزًا للمستخدم، ويُستخدم عادةً لتوضيح أوصاف إضافية حول المستخدم، مثل الاسم الكامل أو الدور الوظيفي.
Home directory يحدد هذا الحقل المسار الذي يتم فيه حفظ ملفات المستخدم الشخصية والإعدادات. عند تسجيل الدخول، يتم توجيه المستخدم إلى هذا الدليل كنقطة انطلاق له.
Login shell يحدد هذا الحقل نوع الشل (Shell) الذي يتم تعيينه للمستخدم عند تسجيل الدخول إلى حسابه. الشل هو البرنامج الذي يتيح للمستخدم التفاعل مع النظام.
2.2.2 ملفshadow 
يتم تخزين المعلومات المتعلقة بكلمة المرور وكلمة المرور الخاصة بالمستخدمين في etc/shadow/. يتم تخزين كل حساب مستخدم في سطر فردي. 
يمكنك طباعة محتويات ملف shadow باستخدام cat:
cat /etc/shadow Command:
يمكنك طباعة معلومات المستخدم المخزنة في الملف shadow باستخدام الامر:
getent shadow username Command:
يحتوي ملف shadow على قائمة بجميع حسابات المستخدمين. يتكون كل سطر من تسعة حقول التالية:
الحقل الوصف
Username يمثل اسم المستخدم الفريد الذي يُستخدم لتحديد هوية المستخدم في النظام.
password Encrypted يُمثل هذا الحقل الكلمة المرورية للمستخدم والتي تم تشفيرها بطريقة معينة لأغراض الأمان.
Days since last password change يعرض هذا الحقل عدد الأيام التي مرت منذ تم تغيير كلمة المرور لآخر مرة.
Days until password change allowed يُمثل هذا الحقل عدد الأيام المتبقية قبل أن يتمكن المستخدم من تغيير كلمة المرور.
Days until password must be changed يُعرض هذا الحقل عدد الأيام المتبقية قبل أن يجب على المستخدم تغيير كلمة المرور.
Days before password expiration to display warning يحدد هذا الحقل عدد الأيام المتبقية قبل انتهاء صلاحية كلمة المرور، حيث يتم عرض رسالة تحذير للمستخدم قبل انتهاء هذه الفترة.
Days after password expiration to disable account يُعرض هذا الحقل عدد الأيام المتبقية بعد انتهاء صلاحية كلمة المرور، حيث يتم تعطيل حساب المستخدم إذا تجاوزت هذه الفترة.
Days since account was disabled يُمثل هذا الحقل عدد الأيام الماضية منذ تم تعطيل حساب المستخدم.
Reserved field يُعتبر هذا الحقل محجوزًا وعادةً لا يستخدم، ويُستخدم في بعض الأحيان لأغراض محددة في النظام
2.2.3 الملفgroup 
يتم تخزين المعلومات المتعلقة بـ group في etc/group/. يتم تخزين كل group في سطر فردي. يمكنك طباعة محتويات ملف group باستخدام cat:
cat /etc/group Command:
يمكنك طباعة معلومات المستخدم المخزنة في الملف group باستخدام الامر:
getent group grpname Command:
يخزن هذا الملف معلومات الـ groups. يخزن كل سطر في هذا الملف معلومات خاصة بـ group واحد. يحتوي كل سطر على أربعة حقول مفصولة بنقطتين وهي:
الحقل الوصف
Group-name يحمل هذا الحقل اسم المجموعة ويعمل كمعرف فريد لها في النظام.
group password  يمثل هذا الحقل نائبًا عن كلمة المرور الحقيقية للجروب. يتم تخزين الكلمة المرورية بشكل مشفر أو مشفر هاش لأغراض الأمان.
GID يُعرف هذا الحقل برقم تعريف المجموعة (Group ID) وهو رقم فريد يستخدم لتحديد هوية المجموعة في النظام.
group members يُعرض هذا الحقل قائمة بأسماء المستخدمين الذين هم أعضاء في المجموعة المحددة. يتم فصل أسماء المستخدمين بفواصل للتمييز بينهم.

2.3 المستخدمين (Users)
في نظام لينكس، لتعريف نفسك على النظام، يجب عليك تسجيل الدخول، مما يستلزم إدخال اسم تسجيل الدخول الخاص بك (الاسم الذي يستخدمه النظام لتعريفك)، وإدخال كلمة المرور الخاصة بك (وهي مفتاحك الشخصي لتسجيل الدخول إلى حسابك). نظرًا لأنك فقط تعرف كلمة المرور الخاصة بك، فلا يمكن لأي شخص آخر تسجيل الدخول إلى النظام باسم المستخدم الخاص بك.
قبل أن تتمكن من استخدام نظام لينكس تم تثبيته حديثًا، يجب عليك إعداد حساب مستخدم لنفسك. ليس من الجيد عادةً استخدام الـ  root accountللاستخدام العادي؛ يجب أن تحتفظ بـ  root accountلتشغيل الأوامر ذات الامتيازات وللحفاظ على النظام.
حساب المستخدم هو طريقة منهجية لتتبع ومراقبة استخدام موارد النظام. يحتوي كل حساب مستخدم على اثنين من المعرفات الفريدة هما username و uid 
الـ Username وهو الاسم تعريفي للمستخدم ويجب أن يكون فريدًا في النظام. وهو يستخدم من قبل المستخدم للوصول (تسجيل الدخول) إلى النظام. قد يقوم المستخدم في وقت لاحق بتغيره حسب حاجته.
الـ UID وهو رقم تعريفي للمستخدم ويجب أن يكون فريدًا في النظام. وهو يستخدم من قبل النظام للمصادقة على نشاط حساب المستخدم وتتبعه ومراقبته. لا يمكن تغيير الـ UID بمجرد التعيين يظل دائمًا هو نفسه لحساب المستخدم هذا.
2.3.1 أنواع المستخدمين
في لينكس، هناك ثلاث انواع من المستخدمين هم:
الـ Root User 
الـ root user هو حساب المستخدم الرئيسي في نظام لينكس. يتم إنشاؤه تلقائيًا أثناء التثبيت. لديه القدرة على تجاوز أي قيود على ملكية الملفات والأذونات. يكون له UID دائمًا يساوي صفر.
في الممارسة العملية، هذا يعني أن الـ root user لديه الحق في الوصول إلى أي شيء على السيرفر الخاص به. يتم استخدام هذا المستخدم لإجراء تغييرات على مستوى النظام. 
الـ Service User
يتم إنشاء الـ Service User بواسطة الـ Services ويتم استخدام هذه الحسابات من قبل هذه الـ Services؛ وذلك لتشغيل العمليات وتنفيذ الوظائف. يكون له UID ما بين 1 إلى 999. هذه الحسابات ليست مقصودة ولا ينبغي استخدامها في الأعمال الروتينية. 
الـ Regular Users 
هم المستخدمون الذين أنشأهم الـRoot User  أو مستخدم آخر بامتيازات sudo. عادةً ما يكون لدى هذا النوع من المستخدمين login shell و home directory. يكون له UID عادًة أكبر من 999. ويوجد منه نوعين:
 الـ sudo user: من الممكن أيضًا انشاء حسابات مستخدمين آخرين يكون لهم صلاحيات مشابهة للـ root user. بهذه الطريقة، يمكنك أن تكون أكثر تحفظًا في استخدامك لحساب الـ root user.
 الـ non-sudo user: من الممكن أيضًا انشاء حسابات مستخدمين آخرين يكون لهم صلاحيات عادية. يعني ليس لهم صلاحيات غير في ملفات الخاصة بهم.
2.4 المجموعات (Group)
وهي عبارة عن مجموعة من المستخدمين. ينتمي كل مستخدم بشكل افتراضي إلى default group، ويمكن أيضًا أن يكون عضوًا في أي من جروبات الأخرى على النظام.
في لينكس، يجب أن يكون كل user عضوًا في group واحدة على الأقل. 
أثناء قيامنا بإنشاء حساب مستخدم، تقوم shell تلقائيًا بإنشاء جروب وإضافة المستخدم الذي تم إنشاؤه فيها. يعرف هذا الجروب بـ primary group للمستخدم.
ما لم نقم بتغيير أو تحديث اسم الـ primary group للمستخدم يدويًا، فإنه يتطابق مع username. على سبيل المثال، إذا كان اسم المستخدم هو john، فسيكون اسم الـ primary group الافتراضي الخاص به هو john أيضًا. إلى جانب الـ primary group، يمكن إعداد مجموعات إضافية حسب المتطلبات. 
بالتالي، يوجد نوعان أساسيان من الـ Groups في Linux:
 الـ primary group: ينتمي كل مستخدم إلى primary group واحدة. 
 الـ Secondary group: قد ينتمي المستخدم إلى الـ Secondary group واحدة أو أكثر باستثناء الـ primary group. 
2.5 أوامر التعامل مع حسابات المستخدمين (User handling commands)
فيما يلي الاوامر المستخدمة مع المستخدمين:
2.5.1 اضافة مستخدم جديد
استخدم الأمر "useradd" لإنشاء حساب المستخدم الجديد. قد تحتاج إلى توفير البيانات الإضافية مثل الاسم الكامل للمستخدم ومعلومات الاتصال إذا كانت مطلوبة.
useradd Command:
2.5.2 إضافة كلمة مرور لمستخدم الجديد
قم بتعيين كلمة المرور للمستخدم المنشأ باستخدام الأمر "passwd" واتبع التعليمات على الشاشة لإدخال كلمة المرور الجديدة وتأكيدها.
passwd Command:
مستخدمك الجديد جاهز الآن للاستخدام ويمكن تسجيل الدخول باستخدام كلمة المرور التي أدخلتها. 
2.5.3 عرض مجموعات المستخدم
لعرض قائمة بالمجموعات التي ينتمي إليها مستخدم معين في نظام Linux، يمكنك استخدام الأمر "groups" مع اسم المستخدم كوسيطة. ستعرض هذه الأمر قائمة بالمجموعات التي ينتمي إليها المستخدم:
groups Command:
بشكل افتراضي، يكون المستخدم الجديد في مجموعته الافتراضية فقط لأن الامر useradd يقوم بإنشاء المستخدم بالإضافة إلى ملف تعريف المستخدم. يتشارك المستخدم والمجموعة الخاصة به في نفس الاسم.
2.5.4 إضافة المستخدم إلى جروب
لإضافة المستخدم إلى مجموعة ثانوية (second group) في نظام Linux، يمكنك استخدام الأمر "usermod" مع الخيار "-G" لإضافة المستخدم إلى المجموعة الثانوية.
فيما أمر اضافة المستخدم الى second groups:
usermod -G Command:
يخبرنا الخيار -G أن نضيف المستخدم إلى المجموعة المدرجة (والتي يتم اعتبارها كـ Secondary Group). يرجى ملاحظة أن الأمر usermod يتطلب امتيازات sudo. هذا يعني أنه لا يمكنك إضافة مستخدمين إلى مجموعة محددة إلا إذا قمت بتسجيل الدخول كـ root user أو كـ sudo user تمت إضافته بالفعل كعضو في Sudo Group.
فيما يلي مثال على موضح اعلاه:
usermod -G ghabayen auditors Command:
لإضافة المستخدم إلى مجموعة اساسية (primary group) في نظام Linux، يمكنك استخدام الأمر "usermod" مع الخيار "-g" لإضافة المستخدم إلى المجموعة الثانوية.
usermod -g Command:
فيما أمر اضافة المستخدم الى المزيد من الـ second groups:
usermod -aG     //a: append Command:
بدلاً من ذلك يمكن تعيين الـ primary group اثناء الانشاء كما يلي:
useradd -g Command:
ويمكن تعيين الـ primary group و second group اثناء الانشاء كما يلي:
useradd -g -G ,   Command:
2.5.5 إضافة وصف للمستخدم
يمكن اضافة وصف قصير للمستخدم الجديد. عادةً ما تتم إضافة الاسم الكامل للمستخدم أو معلومات الاتصال كتعليق. فيما يلي ذلك:
usermod -c "comment"   Command:
2.5.6 تحديد المجلد الرئيسي للمستخدم
في اغلب توزيعات لينكس، عند إنشاء حساب مستخدم جديد باستخدام الامر useradd، يتم إنشاء المجلد الرئيسي للمستخدم في المجلد /home.

في توزيعات اخرى لا يتم إنشاء المجلد الرئيسي للمستخدم. لإنشاء المجلد الرئيسي للمستخدم نقوم بإضافة الباراميتر التالي:
useradd -m Command:

قد لن نريد أن يتم إنشاء المجلد الرئيسي للمستخدم في المجلد /home. لإنشاء إنشاء المجلد الرئيسي في مسار مخصص نقوم بإضافة الخيارات التالية:
useradd -m -d Command:
2.5.7 تحديد الـ UID للمستخدم
الـ UID هو عدد صحيح موجب فريد يعينه نظام Linux لكل مستخدم. بشكل افتراضي، عندما يتم إنشاء مستخدم جديد، يقوم النظام بتعيين الـ UID المتوفر التالي من نطاق الأرقام المحددة في ملف /etc/login.defs.
لتعيين الـ UID بشكل متخصص عند إنشاء مستخدم نستخدم الخيار التالي:
useradd -u Command:
يجب أن يكون الـ UID أكبر من 1000؛ لأن من 0 الى 1000 تستخدم مع الـ Service User. لعرض الـ UID للمستخدم نستخدم الامر التالي:
id -u Command:
2.5.8 حذف مستخدم موجود
في حالة عدم حاجتك إلى مستخدم، فمن الأفضل حذف الحساب القديم. يمكنك حذف المستخدم نفسه، دون حذف أي من ملفاته، عن طريق تشغيل الأمر التالي:
deluser Command:
بدلاً من ذلك، إذا كنت تريد حذف المجلد الرئيسي للمستخدم عند حذف المستخدم، فيمكنك استخدام الأمر التالي
Deluser -r                // r: remove-home Command:

2.6 أوامر التعامل مع جروبات (Group handling commands)
فيما يلي الاوامر المستخدمة مع المستخدمين:
2.6.1 انشاء جروب جديد
لإنشاء مجموعة جديدة في نظام Linux، يمكنك استخدام الأمر "groupadd" متبوعًا بالاسم المراد للمجموعة.
groupadd < groupname> Command:
لتعيين الـ GID بشكل متخصص عند انشاء الجروب نستخدم الخيار التالي:
groupadd -g < groupname> Command:
2.6.2 حذف جروب موجود
لحذف مجموعة موجودة في نظام Linux، يمكنك استخدام الأمر "groupdel" متبوعًا بالاسم المراد للمجموعة.
groupdel < groupname> Command:
2.6.3 حذف مستخدم من جروب
لحذف مستخدم من مجموعة في نظام Linux، يمكنك استخدام الأمر "gpasswd" مع الخيار "-d" لإزالة المستخدم من المجموعة.
gpasswd -d < username> Command:
2.7 أوامر عامة مع مستخدم
الامر su
يسمح لك الأمر su بتشغيل shell كمستخدم آخر.
su - < username>  Command:
الامر exit
يسمح لك الأمر exit بالخروج من الـ shell للمستخدم الحالي:
exit Command:
الامر whoami
يمكن عرض المستخدم الحالي من خلال الامر التالي:
whoami Command:
يمكن عرض معلومات المستخدمين النشطين من خلال الامر التالي:
w Command:
الامر users
يمكن عرض المستخدمين الحاليين (جلسات النشطة) من خلال الامر التالي:
users Command:
الامر last
يعرض تسجيلات الدخول وحالاتها ومدة جلسة، هذه المعلومات مخزنة في /var/log/wtmp:
last Command:

 

3. الصلاحيات والمليكة (Ownership & Permissions)
لينكس هو نظام تشغيلٍ متعدد المستخدمين (Multi-users) مبني على مفاهيم يونكس (Unix) لملكية وأذونات الملف بهدفِ توفير حمايةٍ أفضل؛ بالتالي يمتلك كل مستخدم صلاحيات وأذونات للوصول إلى ملفات ومجلدات الموجودة على النظام. وكذلك قد يمتلك المستخدم ملف معين. دعونا نلقي نظرة على كيفية عرض ملكية وأذونات الملف.
الطريقة الأكثر شيوعًا لعرض أذونات الملف هي استخدام الامر ls مع الخيار -l (اختصار لـ long listing). إذا كنت تريد عرض أذونات جميع الملفات في المجلد الحالي، فقم بتشغيل الأمر كالتالي:
ls -l Command:
إليك مثال على لقطة شاشة لمخرج ls -l، مع تسميات كل عمود من المخرجات:

 

 

 

 

لاحظ أنه يتم عرض تفاصيل الملف على شكل اعمدة. وهي كما يلي:
الحقل الوصف
Mode يشير إلى أذونات الملف على مستوى المستخدم والمجموعة والمستخدمين الآخرين.  
Owner  يشير إلى المالك (المستخدم) للملف الذي لديه حق الوصول إليه وفقًا لأذونات العمود "الـ Mode".
Group يشير إلى المجموعة التي لها حق الوصول إلى الملف وفقًا لأذونات العمود "الـ Mode".
File Size يشير إلى حجم الملف بالبايتات.
Last Modified يشير إلى تاريخ ووقت آخر تعديل للملف.
Filename يشير إلى اسم الملف.
دعنا ندرس كل عمود على حد.
3.1 العمود Mode
يشير هذا العمود الى الأذونات الخاصة بالملف على مستوى User وGroup  و Other. للمساعدة في شرح ما تعنيه كل الرموز والحروف التي تظهر في هذا العمود، إليك تفصيل التالي يوضح المثال أعلاه:

 

 


فيما يلي شرح كل قسم في هذا العمود:
3.1.1 أنواع الملفات (File Type)
في لينكس، هناك ثلاث انواع من الملفات (المجلدات) وهي:
 الـ Regular Files: هي الملفات التي يتم استخدامها لتخزين المعلومات مثل النصوص أو الصور.
 الـ Directory Files: هي المجلدات التي يتم استخدامها لتخزين الـ Regular Files.
 الـ Special Files: هي ملفات لها استخدامات خاصة.
أسهل طريقة لمعرفة نوع الملف في أي نظام تشغيل هي النظر إلى امتداده. إذا لم يكن للملف امتداد، فيمكننا استخدام الامر file. فيما يلي مثال على ذلك:
File file.txt Command:
يتم الاشارة إلى الـ File Type بالحرف الأول من الـ Mode Column، ويسمى هذا الحرف بـ "file type field". لاحظ ما يلي:
 يتم الاشارة الى الـ Regular Files في حقل file type  بواصلة (-).
 يتم الاشارة الى الـ Directory Files في حقل file type  بحرف d.
 يتم الاشارة الى الـ Special Files في حقل file type  برموز خاصة حسب نوعها.
3.1.2 تصنيفات الأذونات (Permissions Classes)
من الشكل السابق، يمكنك أن ترى أن الـ Mode Column يشير إلى الـ File Type، متبوعًا بثلاث ثلاثية من الحروف وهي تشير الـ Permissions. وفيما يلي توضيح لهذه الفئات الثلاثة: 
• الـ user class: وهي تشير الى الأذونات الخاصة بمالك الملف.
• الـ group class: وهي تشير الى الأذونات الخاصة أعضاء مجموعة.
• الـ other class: وهي تشير الى الأذونات بمستخدمين ليسوا جزءًا من الـ user class أو الـ group class لهذا الملف.
الشيء التالي الذي من الواجب الاهتمام به هو تشكيلة الحروف الثلاثة بكل فئة، لأنها هي التي تقوم بتحديد الأذونات الخاصّة بالملفّ. فيما يلي انواع الاذونات مع رمز الخاص بها:
• الـ Read: يشار إليها بحرف r في الموضع الأول.
• الـ Write: يشار إليها بحرف w في الموضع الثاني.
• الـ Execution: يشار إليه بعلامة x في الموضع الثالث. 
تشير الشَرطة (-) في مكان أحد هذه الأحرف إلى أن الإذن المعني غير متاح للفئة المعنية. على سبيل المثال، إذا كانت الفئة الثانية لملف هي r--، يكون الملف "للقراءة فقط" للمجموعة المرتبطة بالملف.
فيما يلي تفصيل للوصول الذي تمنحه أنواع الأذونات الثلاثة للمستخدم:
الاذن ملف مجلد
Read يسمح هذا الإذن للملف العادي أن يتم عرضه من قبل المستخدم لمشاهدة محتويات الملفّ. يسمح مع هذا الإذن الأوامر cat , tail, head والخ.
يسمح هذا الإذن للمستخدم بعرض أسماء الملفات في المجلد. يسمح مع هذا الإذن الأوامر ls. 
Write يسمح هذا الإذن للملف العادي أن يتم عرضه أو تعديله أو حذفه من قبل المستخدم .يسمح مع هذا الإذن الأوامرrm , mv, cp, nano  والخ.
يسمح هذا الإذن حذف المجلد وتعديل محتوياته (إنشاء، حذف وإعادة تسمية الملفّات داخلية). يسمح مع هذا الإذن الأوامر rm , mv, cp, nano, touch, mkdir  والخ.
Execution يسمح هذا الإذن للمستخدم تنفيذ (تشغيل) الملف. يجب تعيين هذا الاذن التنفيذ للـ executable file و shell scripts. يسمح هذا الإذن للمستخدم بالوصول إلى يسمح هذا الإذن الوصول للمجلد والوصول إلى البيانات الوصفية. يسمح مع هذا الإذن الأوامر cd , ls -l والخ. 
تغير الاذونات
يستخدم الأمر chmod إلى تغير الـ mode. إنه يقيد طريقة الوصول إلى الملف. بشكل عام، فيما صيغة العامة للأمر chmod:
chmod [options] permissions filename Command:
تحدد الـ  permissionsكل ما يلي:
 الأذونات الممنوحة لمالك الملف (user).
 الأذونات الممنوحة لأعضاء المجموعة (group).
 الأذونات الممنوحة لأي شخص آخر (others).
هناك طريقتان لتمثيل هذه الأذونات: 
 الـ symbolic method 
 الـ numeric method
مثال// لنفترض أنك مالك ملف يسمى myfile، وتريد تعيين أذوناته بحيث:
 يمنح الـ user الاذونات Read و  Writeو Execute.
 يمنح الـ group الاذونات Read و Write.
 يمنح الـ others الاذن Read.
فيما يلي فعل ذلك باستخدام symbolic method:
chmod u=rwx,g=rx,o=r filename Command:


الآن إذا أردنا منح الـ others الاذن Write أيضاً. سنقوم بما يلي:
chmod o+w filename Command:
الآن إذا أردنا حذف الاذن  Writeمن الـ others. سنقوم بما يلي:
chmod o-w filename Command:
مثال// لنفترض أنك مالك ملف يسمى myfile، وتريد تعيين أذوناته بحيث:
 يمنح الـ user الاذونات Read و Write.
 يمنح الـ group الاذونات Read و Write.
فيما يلي فعل ذلك باستخدام الرموز:
chmod ug=rw filename Command:
مثال// لنفترض أنك مالك ملف يسمى myfile، وتريد تعيين أذوناته بحيث:
 يمنح الـ user الاذونات Read و Write و Execute.
 يمنح الـ group الاذونات Read و Write و Execute.
 يمنح الـ others الاذونات Read و Write و Execute.
فيما يلي فعل ذلك باستخدام symbolic method:
chmod ugo=rwx filename Command:
الآن إذا أردنا حذف الاذن  Executeمن others و group. سنقوم بما يلي:
chmod go=x filename Command:
من المهم معرفة أن الاذونات لا تورث على سبيل المثال، إذا كان لدينا مجلد يسمى web ويحتوي على ملفات index.html و contact.html و about.html. وقمنا بمنح المجلد web الاذونات التالية:
 يمنح الـ user الاذونات Read و Write.
 يمنح الـ group الاذن Read.
 يمنح الـ others الاذن Read.
هذا يعني لن يتم تطبيق نفس هذه الاذونات ايضاً على الملفات (أو المجلدات الفرعية) الموجودة داخل هذا المجلد. ولتطبيق نفس هذه الاذونات على الملفات (أو المجلدات الفرعية) في داخل هذا المجلد قم بما يلي:
chmod -R u=rw,go=r web            //R = Recursive Command:


مثال// لنفترض أنك مالك ملف يسمى myfile، وتريد تعيين أذوناته بحيث:
 يمنح الـ user الاذونات Read و  Writeو Execute.
 يمنح الـ group الاذونات Read و Write.
 يمنح الـ others الاذن Read.
فيما يلي فعل ذلك باستخدام numeric method: 
chmod  754   myfile  Command:
لاحظ الصورة توضح ذلك:

 

 


لكلّ رمز، نضربه في 1 إذا كان مذكورا في الأذونات وفي 0 إن لم يكن (تظهر عارضة مكانه)، ثم نجمع نتيجة كل ثلاثي.
ملاحظة:
يكون مخرج الأمر ls ملون؛ على سبيل المثال، لاحظ ما يلي:
• يتم منح لون الازرق للمجلدات.
• يتم منح لون الابيض للملفات العادية.
• يتم منح لون سماوي للـ executable file و shell scripts.
3.2 العمود Owner
وهي يشير هذا العمود الى مالك الملف. يوجد ثلاثة أنواع من المالكين:
 الـ User: وهو المستخدم هو الذي أنشأ الملف. بشكل افتراضي، يصبح أي شخص يقوم بإنشاء الملف هو مالك الملف. 
 الـ Group: وهم جميع المستخدمين الذين ينتمون إلى مجموعة لديهم نفس إذن الوصول لملف.
 الـ Other: وهو أي شخص لديه حق الوصول إلى الملف بخلاف المستخدم والمجموعة. 
3.2.1 تغير المالك
يستخدم الأمر chmod لتغير ملكية الملف أو نقلها إلى اسم المستخدم المحدد.  فيما يلي صيغة تعديل على مالك ملف:
chown  username filename  Command:
فيما يلي صيغة تعديل على مالك المجلد:
Chown -R username dir-name Command:
3.3 العمود Group
يشير إلى المجموعة التي لها حق الوصول إلى الملف وفقًا لأذونات العمود "الـ Mode". يوضح هذا العمود اسم المجموعة التي ينتمي إليها الملف.
3.3.1 تغير المجموعة
يستخدم الأمر chgrp لتغير ملكية الملف بالنسبة للمجموعة. فيما يلي صيغة تعديل على مجموعة لملف:
chgrp group-name filename Command:
فيلي صيغة تعديل على مالك المجلد:
Chgrp -R group-name dir-ame Command:

الفصل الخامس// نظام ملفات متقدمة
تفقنا مسبقًا، يتم تقسيم جهاز التخزين على سبيل المثال، الهارد ديسك، لمجموعة من الأجزاء (Partitions) وكل جزء (Partition) بعمل كوحدة تخزين مستقلة ومنفصلة يديرها نظام ملفات (File-System). وتكلمنا فيما سبق بقليل من تفاصيل أنه عند استخدام طريقة MBR لتهيئة جهاز التخزين فإنه يخصص في بداية جهاز التخزين مساحة صغيرة جداً، تسمى MBR (Master Boot Record)، هذه المساحة لا تنتمي لأي جزء (Partition).
بشكل بسيط، يحتوي كل جزء (Partition) على مجموعة من البلوكات (Blocks). تخزن كل بلوك قدرًا ثابتًا من البيانات التي يمكن للمستخدم الوصول إليها. في أنظمة الملفات المستخدمة على أجهزة تخزين HDD، يتم تعيين حجم البلوك (Block Size) بشكل ثابت ويختلف من نظام ملفات لآخر. على سبيل المثال، في نظام الملفات ext4 الشائع في نظام لينكس، الحجم الافتراضي للبلوك هو 4 كيلوبايت (4096 بايت).
يقوم نظام الملفات (Filesystem) بتخصيص رقم فريد لكل بلوك (أو لكل مجموعة من البلوكات)؛ يسمى هذا الرقم بـ inode، وذلك لتسهيل العمليات المتعلقة بإدارة واسترجاع الملفات. فالفكرة هي أن يقوم كل ملف بحجز عدد معين من البلوكات وتخصيص رقم inode لهذه البلوكات.
يتم حفظ هذه الـ inodes في جدول يسمى Inodes Table ويتم تخزينه في مساحة صغيرة بداية كل Partition. وبهذا الشكل، يتم تنظيم جهاز التخزين وإدارته بواسطة Partition و filesystem، مما يسمح بتخزين واسترجاع الملفات بطريقة منظمة وفعالة.
يوضح الشكل التالي تهيئة جهاز التخزين هارد ديسك (Hard Disk Drive) بطريقة MBR. حيث سيتم تخصيص مساحة صغيرة في بداية الجهاز. وسيقوم نظام الملفات لكل وحدة تخزين (جزء) بتخصيص مساحة صغيرة ف بدايته.
 

 


يمكننا تعريف الـ Inodes Table كما يلي:
هو مساحة صغيرة يتم تخصيصيها بداية كل وحدة تخزين، يكون كجزء من نظام الملفات. ويقوم بتخزين معلومات هامة حول الملفات الموجودة في نظام الملفات.
توضيح
إذا كان حجم البلوك في نظام الملفات ext4 يساوي 4 كيلوبايت (4096 بايت). إذا أردنا تخزين ملف حجمه 8 كيلوبايت. كيف سيتم التعامل معه؟ بكل بساطة يتم حجز 4 بلوكات متتالية ويستخدم inode لأول للإشارة إلى الملف.
مشكلة الأكبر، هو أننا إذا قمنا بتعديل على ملف وأصبح حجمه 10 كيلوبايت. على افتراض، لن يكون هناك مزيد من البلوكات المجاورة مباشرًة ليتم حجزها إلى هذا الملف. مبدئياً لحل هذه المشكلة بنظام ext4 نستخدم تقنية journal. هي خارج نطاق كتابنا.
1. الـ inode 
الـ inode هو فهرس البيانات يستخدم للإشارة الى ملف في لينكس، ويتم تخزينه في الـ Inodes Table. يتم تحديد كل inode بعدد صحيح. يتم تعيين الـ inode إلى ملف عند إنشائه. وبالإضافة إلى inodes يحتوي الـ Inodes Table ايضاً على ملفات وصفية (metadata) للملفات. ومن هذه المعلومات التي يخزنها هي:

 

 

المجلد (directory) هو في الأصل ملف. ويمكن القول ان المجلد يعمل كـ جدول المؤشرات (Pointer table). جدول المؤشرات (Pointer table) هو جدول (قاعدة بيانات) يحتوي على مؤشرات تشير على الـملفات الموجودة به. بما أن المجلد هو في الأصل ملف فيتم إعطاءه الـ inode خاص به. ويحتوي الـ Inodes Table على بيانات وصفية للمجلدات. ومن هذه المعلومات التي يخزنها هي:

 

 


تقوم بعض الـ Filesystem (أبرزها ext3) بإنشاء جميع الـ inodes عند إنشاء نظام الملفات وتخزينها. هذا يعني أنه من الممكن نفاد مساحة التخزين نظرًا لاستخدام جميع inodes، على الرغم من توفر مساحة على القرص. تقوم Filesystem أخرى (مثل xfs) بإنشاء الـ inodes حسب الحاجة.
كلما تم إنشاء ملف جديد، يتم إعطاؤه filename و inode. يعمل هذا الرقم كمعرف فريد لهذا الملف. بصفتك مستخدمًا، ستستخدم الـ filename للوصول إلى الملف ولكن لينكس سيستخدم inode عند تعامل مع الملفات. 
يمكنك عرض inode و metadata للملف باستخدام الأمر ls -il:
ls -il                      //i: inode Command:
إليك مثال على لقطة شاشة لمخرج ls -il، مع تسميات كل عمود من المخرجات:
inode     Mode count  Owner  Group   Size  Last Modified   Location
50772711   drwxr-xr-x.   2     root   root    6     Sep 18 21:01    Desktop
506837     drwxr-xr-x.   2     root   root    6     Sep 18 21:01    Documents
17283201   drwxr-xr-x.   2     root   root    6     Sep 18 21:01    Download Output:
تحقق من Inodes على نظام الملفات
يمكنك العثور على إجمالي عدد inodes على كل Filesystem باستخدام الأمر التالي:
df  -i                     //i: inode Command:
فيما يلي شكل المخرج (للتوضيح):

Filesystem          Inodes  IUsed   IFree    IUse%    Mounted on
/dev/nvme0n1p1      524288   310    523978    1%      /boot Output:
من المهم معرفة أنه يجب أن يكون لكل نظام ملفات عدد من الـ inodes متاح وقابلة للاستخدام؛ وذلك للسماح بإنشاء ملفات جديدة. إذا كانت الـ inodes ممتلئة، فلن يسمح لك النظام بإنشاء ملفات جديدة.
بحث عنinode  للملف
يمكنك العثور علىinode  لأي ملف باستخدام الامر التالي:
ls  -il filename                     //i: inode Command:
عملية نسخ ملف في نفس نظام الملفات
عند القيام بعملية نسخ لملف على نفس نظام الملفات فيتم ما يلي:
• حجزinode  جديد.
• نسخ البيانات الفعلية على البلوكات الجديدة.
• منح الملف مؤشر داخل المجلد جديد.
عملية نسخ ملف في أنظمة ملفات مختلفة
• حجز inode جديد على نظام الملفات الجديد.
• نسخ البيانات الفعلية على البلوكات الجديدة.
• منح الملف مؤشر داخل المجلد جديد.
عملية نقل ملف في نفس نظام الملفات
• يبقي الـinode  كما هو.
• تبقي البيانات الفعلية على البلوكات كما هي.
• منح الملف مؤشر جديد داخل المجلد جديد.
عملية نقل ملف في أنظمة ملفات مختلفة
• حجز inode جديد على نظام الملفات الجديد.
• نسخ البيانات الفعلية على الـ البلوكات الجديدة.
• منح الملف مؤشر داخل المجلد جديد.
• اتاحة الـ inode وحذف البيانات الفعلية من نظام الملفات القديم.
عملية حذف ملف من نظام الملفات
• اتاحة الـ inode.
• حذف البيانات الفعلية (ليست حذف تماماً).
ملاحظة
لا يمكن على نفس نظام الملفات تكرار الـ inode  لملفين.


2. ارتباط الملفات (Link File)
الربط (link) في نظام لينكس هو مؤشر إلى ملف. مثل المؤشرات في أي لغة برمجة، الروابط في نظام لينكس هي مؤشرات تشير إلى ملف أو مجلد. إن إنشاء الروابط هو نوع من الاختصارات للوصول إلى ملف. تسمح الروابط بوجود أكثر من اسم للملف يشير إلى نفس الملف في مواقع مختلفة. هناك نوعان من الروابط الناعمة (Soft Link) الروابط الصلبة (Hard Links). 
2.1 الروابط الناعم (Soft Links)
عبارة عن اختصار (shortcuts) يشير إلى الملف أو المجلد الآخر بواسطة مساره الكامل. يمكن استخدام الـ soft links للإشارة إلى الملفات أو المجلدات في نفس النظام الملفات أو في أنظمة ملفات أخرى. لاحظ الشكل التالي:

 

 

 


إذا تم حذف أو نقل الملف الأصلي (Original File)، فسيؤثر ذلك على الملف الاختصار (File Shortcut) نفسه؛ لأن inode الخاصة به ستشير إلى قيمة غير صالحة. وفي حالة محاولة الوصول إلى الملف الاختصار بعد حذف الملف الأصلي، ستواجه رسالة خطأ تشير إلى أن الملف الأصلي غير موجود. ولن يتم حذف الارتباط تلقائيًا عند حذف الملف الأصلي. وعندها يجب فك الارتباط بينهما؛ لأنه أصبح بلا قيمة. لاحظ الشكل التالي:

 

 

 


2.2 الروابط الصلبة (Hard links)
عبارة عن ارتباط يشير مباشرة إلى نفس الـ inode الخاص بالملف أو المجلد الآخر. بمعنى آخر، يشارك الـ hard link نفس الـ inode مع الملف أو المجلد الأصلي، وبالتالي يتم التعامل معهما كملفين أو مجلدين منفصلين ولكنهما يشغلان نفس المساحة في وحدة التخزين.

 

 


إذا تم حذف أو نقل الملف الأصلي (Original File)، فلن يؤثر ذلك على الملف الاختصار (File Shortcut) نفسه لأنه الـ inode الخاصة بـ ملف الاختصار (Shortcut File) تشير على البلوكات التي يتم تخزين البيانات عليها. وعندها سيتم فك الارتباط تلقائياً بينهما؛ لأنه أصبح بلا قيمة. لاحظ الشكل التالي:

 

 

 

2.3 أوامر التعامل مع الارتباطات
2.3.1 إنشاء ارتباط ناعم للملفات
يستخدم الامر ln لإنشاء ارتباطات بين الملفات. بشكل افتراضي، عند النجاح لا ينتج ln أي ناتج ويعيد صفرًا. صيغة الأمر ln لإنشاء ارتباط كما يلي:
ln [options] [file] [link] Command:
يمكن استخدم الامر ln مع الخيار–symbolic  أو –s لإنشاء ارتباط ناعم للملفات. فيما يلي مثال:
ln -s Original Shortcut Command:
في حالة استخدامنا الامر ls –il فسيكون المخرج كالتالي:
17283201 -rw-r--r--. 2 root root 0 Sep 18 23:49 Original
17283201 -rw-r--r--. 0 root root 0 Sep 18 23:49 Shortcut
17283228 lrwxrwxrwx. 0 root root 4 Sep 18 23:49 Shortcut -> Original Output:
الآن انظر لو قمنا بحذف الملف الأصلي؛ وقمنا باستخدام الامر ls –il من جديد، فسيكون المخرج كالتالي:
17283201 -rw-r--r--. 0 root root 0 Sep 18 23:49 Shortcut
17283228 lrwxrwxrwx. 0 root root 4 Sep 18 23:49 Shortcut -> Original Output:
2.3.2 إنشاء ارتباط صلب للملفات
يمكن استخدم الامر ln بدون خيارات لإنشاء ارتباط صلبة للملفات. فيما يلي مثال:
ln Original Shortcut Command:
2.3.3 إنشاء ارتباط ناعم للمجلدات
الأمر الخاص بإنشاء ارتباط للمجلد هو نفسه عند إنشاء ارتباط للملف. كما يلي:
ln [options] [directory] [link] Command:
يمكن استخدم الامر ln مع الخيار–symbolic  أو –s لإنشاء ارتباط ناعم للمجلدات. فيما يلي مثال:
ln -s Original-Dir Shortcut-Dir Command:
ونفس الفكرة إذا أردنا انشاء ارتباط صلب للمجلدات. فكل مع عليك هو استخدام الامر ln بدون خيارات.
إذا حاولت إنشاء ارتباط موجود بالفعل، فإن الأمر ln سيطبع رسالة خطأ. للكتابة فوق مسار الوجهة الارتباط، استخدام الامر كالتالي:
ln -sf Original Shortcut Command:
2.3.4 حذف الارتباط 
لحذف الارتباط، استخدم إما الأمر unlink أو rm. صيغة حذف الارتباط بسيطة للغاية:
unlink Shortcut Command:
لحذف الارتباط باستخدام الأمر rm هي نفسها:
rm Shortcut Command:
3. ضغط الملفات (Compression)
ضغط الملفات (Compression) هي عملية تقليل حجم الملف أو المجلد. تساعدك عملية ضغط الملفات (Compression) على تقليل حجم الملف ومشاركة الملفات بكفاءة. كما يسهل نسخ الملفات المضغوطة إلى الخوادم البعيدة. ويساعدك في الحفاظ على مساحة القرص. يشتمل نظام لينكس على أوامر متنوعة للضغط وإلغاء الضغط. وهي:
الاداء عملية الضغط عملية إلفاء الضغط النتيجة
gzip استخدام الأداة ثم اسم الملف استخدام الأداة مع خيار d ثم اسم ملف ملف بامتداد gz.
bzip استخدام الأداة ثم اسم الملف استخدام الأداة مع خيار d ثم اسم ملف ملف بامتداد bz.
bzip2 استخدام الأداة ثم اسم الملف استخدام الأداة مع خيار d ثم اسم ملف ملف بامتداد bz2.
zip استخدام الأداة ثم اسم الملف استخدام الأداة unzip ثم اسم ملف ملف بامتداد zip.
تعد الاداة bzip2 بشكل عام أفضل من ناحية المساحة. تعد الاداة gzip بشكل عام أفضل من ناحية السرعة.  فيما يلي الصيغة العامة لضغط ملف باستخدام الأداة gzip:
# gzip filename 
فيما يلي الصيغة العامة لفك ضغط ملف باستخدام gzip -d:
# gzip -d filename.gz 
يمكن القيام فقط بعملية ضغط لملفات نصية باستخدام الأدوات السابقة، ولا يمكن القيام بعملية ضغط للصور والفيديو.
4. أرشفة الملفات (Archiving)
الأرشفة (Archiving) هي عملية دمج ملفات ومجلدات متعددة في ملف واحد. تساعدك عملية الأرشفة (Archiving) على تنظيم البيانات الغير نشطة وحفظها لفترات طويلة من زمن. كما تسهل عملية نسخ الاحتياطي.
يمكننا استخدام أداة tar لإنشاء ملف مأرشف (File Archive). هنا سنقدم كيفية استخدام tar لإنشاء أرشيف، وعرض محتويات الأرشيف، واستخراج الملفات من الأرشيف.
هناك خياران شائعان مستخدمان مع هذه العمليات الثلاث هما:
• الخيار f: اختصار لـ filename. وهو يستخدم لتحديد اسم File Archive المراد انشاءه.
• الخيار v: اختصار لـ view. وهو يستخدم لعرض العملية (عرض تفاصيل الارشفة) على stdout.
لإنشاء ملف مأرشف (File Archive)، استخدم الخيار c (اختصار لـ create)، فيما يلي ذلك:
# tar cvf FileArchiv directoryname
على سيبل المثال، لعمل ارشفة للمجلد المسمى ghabayen في "ghabayen.tar"، اكتب:
# tar cvf ghabayen.tar   ghabayen
لإلغاء ارشفة الملف استخدم الخيار x (اختصار لـ extract)، فيما يلي مثال:
# tar xvf  ghabayen.tar
بشكل افتراضي، تقوم الأداة tar بإنشاء ملف مأرشف (File Archive) ينتهي بامتداد tar. أيضًا، يمكن استخدام الأداة tar جنبًا إلى جنب مع أدوات الضغط gzip و bzip2. الملفات التي تنتهي بامتدادات tar تشير إلى ملف مأرشف (File Archive)، والملفات التي تنتهي بـ tar.gz أو tgz تشير إلى ملف مأرشف مضغوط (Compress File Archive).
استخدم الخيار z لضغط الأرشيف أثناء كتابته. لإنشاء أرشيف مضغوط يسمى "project.zip" ، اكتب:
# tar cvfz ghabayen.tar.gz  ghabayen
لفك ضغط الأرشيف، اكتب:
# tar xvfz ghabayen.tar.gz  b ghabayen
كذلك الملفات التي تنتهي بـ tar.bz2 أو tar.bz تشير إلى Compress File Archive.
الفرق بين Archiving و Compressing
عملية الـ Compressing تقوم بضغط ملف فردي؛ لتقليل حجمه وهو سهولة مشاركته. بينما عملية الـ Archiving تقوم بأرشفة مجموعة من الملفات مع الاحتفاظ على ببنية وأذونات الملفات الأصلية؛ وذلك بهدف حفظها كنسخة احتياطية.

5. قائمة تحكم الوصول File System (Access Control Lists))
توفر قائمة ACL آلية أذونات إضافية وأكثر مرونة لأنظمة الملفات. يسمح لك ACL بمنح أذونات لأي مستخدم أو مجموعة لأي مورد قرص.
فكر في سيناريو لا يكون فيه مستخدم معين عضوًا في المجموعة التي أنشأتها ولكنك لا تزال ترغب في منح بعض الوصول للقراءة أو الكتابة، كيف يمكنك القيام بذلك دون جعل المستخدم عضوًا في المجموعة، وهنا يأتي في ميزة قائمة ACL التي تساعدنا على القيام بهذه الحيلة.
بشكل أساسي، يتم استخدام قوائم ACL لإنشاء flexible permission في Linux. يتم استخدام setfacl و getfacl لإعداد ACL وإظهار ACL على التوالي.
على سبيل المثال، فيما كيفية استخدم الامر getfacl:
# getfacl [filename]    //getfacl: get file access control lists 
فيما يلي المخرج:
# file: [filename]
# owner: [username]
# group: [groupname]
user::rw-
group::rw-
other::r--

5.1 أوامر إعداد ACL
5.1.1 إضافة إذن للمستخدم
يمكن اضافة إذن للمستخدم من خلال الامر التالي:
# setfacl -m [user:username:permissions] [filename]    
على سبيل المثال، امنح المستخدم ghabayen الإذن بقراء والكتابة على الملف  /temp/file.txt:
# setfacl -m user:ghabayen:rw-  /temp/file.txt
5.1.2 إضافة إذن للمجموعة
يمكن اضافة إذن للمجموعة من خلال الامر التالي:
# setfacl -m [group:groupname:permissions] [filename]   
على سبيل المثال، امنح المجموعة admin الإذن بقراء والكتابة على الملف  /temp/file.txt:
# setfacl -m g:admin:rw-  /temp/file.txt
5.1.3 حذف ACL
إذا كنت تريد إزالة أذونات ACL المحددة، فاستخدم الأمر التالي:
# setfacl -b filename    
5.1.4 استخدام Default ACL
الـ Default ACL هي نوع محدد من الأذونات المعينة إلى المجلد لا يغير أذونات المجلد نفسه، ولكنه يتم تعيين الـ Default ACL على جميع الملفات التي تم إنشاؤها بداخله.
دعنا نوضح ذلك: أولاً سنقوم بإنشاء مجلد يسمى test وتعيين الـ Default ACL إليه كما يلي:
# setfacl -d –m user:ghabayen:rw   test
5.1.5 وراثة ACL
للسماح لجميع الملفات أو المجلدات بوراثة الـ ACL من المجلد الموجود بداخله. مثال:
# setfacl -dm user:ghabayen:rw  /tep/folder
# setfacl -dm group:admin:rw /tep/folder

ملاحظة:
الـ mask وهي الاذونات الاساسي للملف.
6. البحث وتحديد موقع الملفات (Searching & Locating Files)
في نظام Linux، هناك عدة أدوات يمكن استخدامها للبحث وتحديد موقع الملفات والبحث فيها. 
6.1 البحث عن الأدوات والاوامر
يمكن البحث عن الأدوات والأوامر في نظام Linux باستخدام الأوامر التالية:

6.1.1 الأمر whatis
يستخدم الأمر `whatis` للبحث عن وظيفة (function) محددة لأمر معين. يقوم بعرض وصف مختصر للأمر ووظيفته. على سبيل المثال، يمكن استخدام الأمر التالي للبحث عن وظيفة الأمر "ls":
# whatis ls
6.1.2 الأمر whereis
يستخدم الأمر `whereis` للبحث عن ملفات البرنامج (binary files) ومساراتها لأمر معين. يقوم بعرض مسارات الملفات المرتبطة بالأمر المحدد، بما في ذلك الملفات التنفيذية والملفات المساعدة والصفحات التوثيقية. على سبيل المثال، يمكن استخدام الأمر التالي للبحث عن مسارات الأمر "ls":
# whareis ls
6.1.3 الأمر man
يستخدم الأمر `man` للبحث عن صفحة دليل الأمر (manual page) المتعلقة بأمر معين. تحتوي صفحات الدليل على معلومات شاملة حول الأمر، بما في ذلك وظيفته والخيارات المتاحة وأمثلة الاستخدام. على سبيل المثال، يمكن استخدام الأمر التالي لعرض صفحة الدليل للأمر "ls":

# man ls

يمكن التنقل في صفحة الدليل باستخدام مفاتيح الأسهم والأزرار للتمرير والبحث. للخروج من صفحة الدليل، يمكنك الضغط على مفتاح "q".
هذه بعض الأوامر للبحث عن الأدوات والأوامر في نظام Linux والحصول على معلومات حولها. استخدم هذه الأوامر لتعزيز معرفتك وفهمك للأدوات والأوامر المتاحة في النظام.

6.2 البحث في الملفات
للبحث عن ملف نستخدم:
6.2.1 الامر locate
يقوم الأمر بتحديد موقع البحث عن الملفات في لينكس باستخدام اسم الملف (filename). يتم استخدام locate للحصول على نتائج فورية، وهي أداة أساسية عندما تكون السرعة أولوية.
يعتمد الامر locate على قاعدة بيانات (database) تحتوي اسم الملفات في النظام والمسارات المقابلة لها. بالتالي لا يتحقق الامر الـ locate من وجود ملفات خارج قاعدة بيانات (database)، مما يعني أنه لا يقوم بالإبلاغ عن الملفات التي تم إنشاؤها بعد آخر تحديث لـ قاعدة بيانات (database). حيث يتم تحديث هذه قاعدة بيانات (database):
• في وقت معين من اليوم (يمكن تحديده يدوياً)
• عند تشغيل النظام.
• يمكن تحديث يدوياً (من خلال الامر updatedb)
صيغة الأمر locate هي:
# locate [options] [pattern]
إن أبسط طريقة لاستخدام الأمر locate هي إدخال النمط (Pattern) الذي تريد البحث عنه. وقد يكون النمط (Pattern) عبارة عن اسم الملف أو جزء منه أو إلخ.
على سبيل المثال، ابحث عن جميع الملفات التي تحتوي على mysql في عن طريق تشغيل الأمر التالي:
# locate mysql
علاوة على ذلك، فإن استخدام الوسيطة -i مع هذا الأمر سيجعلها غير حساسة لحالة الأحرف، لذا يمكنك البحث عن ملف حتى إذا كنت لا تتذكر اسمه بالضبط. على سبيل المثال:
# locate -i mysql
سيبحث عن أي ملف يحتوي على اسمه على الكلمة "mysql" سواء كان أحرفًا كبيرة أو صغيرة. للبحث عن ملف يحتوي اسمه على كلمتين أو أكثر، استخدم علامة النجمة (*). على سبيل المثال:
# locate -i mysql*database
سيبحث عن أي ملف اسمه يحتوي على الكلمة "school" و " database"، سواء كان أحرفًا كبيرة أو صغيرة.
ملاحظة:
إذا كان الامر غير موجود يمكنك تنزيل ه من خلال الحزمة mlocate
6.2.2 الامر find
يتم استخدام الأمر find للبحث عن قائمة الملفات والمجلدات وتحديد موقعها بناءً على الشروط التي تحددها للملفات. يمكن استخدام الأمر find في مجموعة متنوعة من الحالات مثل يمكنك العثور على الملفات حسب permissions و usersو groups و types و date و size وغيرها من المعايير الأخرى الممكنة.
# find [path] [options] [pattern]
البحث بالاسم
الطريقة الأكثر وضوحًا للبحث عن الملفات هي من خلال filename. للعثور على ملف من خلال filename باستخدام الأمر find، يمكنك استخدام الصيغة التالية:
# find [path] -name query
سيكون هذا حساسًا لحالة الأحرف، مما يعني أن البحث عن query يختلف عن البحث عن Query.
على سبيل المثال، سيقوم الأمر التالي بالبحث عن ملف يسمى test في المجلد الحالي:
# find -name test
على سبيل المثال، سيقوم الأمر التالي بالبحث عن ملف يسمى test في المجلد /home:
# find -name test
للعثور على ملف بالاسم مع تجاهل حالة الأحرف، استخدم ما يلي:
# find [path] -iname query
يمكنك عكس البحث باستخدام علامة تعجب، مثل هذا:
# find [path] ! -name query_to_avoid
ملاحظة
إذا لم يتم تحديد path فسيفترض أنه المسار الحالي.
البحث بالنوع
يمكنك تحديد نوع الملفات التي تريد البحث عنها. يمكنك استخدام الصيغة التالية:
# find [path] -type type_descriptor –name query
فيما يلي بعض الواصفات التي يمكنك استخدامها لتحديد نوع الملف:
• f: regular file
• d: directory
• l: symbolic link
• c: character devices
• b: block devices
إذا كنت تريد البحث عن ملفات لها الاسم test في المجلد /home/username/ ومن نوع regular file، فجرّب ما يلي:
# find /home/username/ -type f -name test
إذا كنت تريد البحث عن ملفات لها الامتداد php في المجلد /home/username/ ومن نوع regular file، فجرّب ما يلي:
# find /home/username/ -type f -name "*.php"
البحث بالحج
يمكنك تصفية الملفات حسب حجمها باستخدام البارامتير -size. يمكنك استخدام الصيغة التالية:
# find [path] –size n
يمكنك الحاق الحجم بعلامة تدل على وحدة الحجم. وفيما يلي لواحق الشائعة الاستخدام:
• c: bytes
• k: kilobytes
• M: megabytes
• G: gigabytes
• b: 512-byte block
للتوضيح، سيجد الأمر التالي كل ملف في المجلد usr/ يبلغ حجمه 50 بايت بالضبط:
# find /usr –size 50c
للعثور على الملفات التي يقل حجمها عن 50 بايت، يمكنك استخدام الصيغة هذا بدلاً من ذلك:
# find /usr –size -50c
للعثور على الملفات التي يزيد حجمها عن 50 بايت، يمكنك استخدام الصيغة هذا بدلاً من ذلك:
# find /usr –size +50c
البحث بالوقت
لكل ملف على النظام، يقوم Linux بتخزين بيانات الوقت حول access times و modification times change times. حيث:
• الـ Access Time: آخر مرة تمت فيها قراءة الملف أو الكتابة إليه.
• الـ Modification Time: آخر مرة تم فيها تعديل محتويات الملف.
• الـ Change Time: آخر مرة تم فيها تغيير بيانات inode metadata للملف.
يمكنك بناء عمليات البحث الخاصة بك على هذه المعلمات باستخدام الخيارات atime- و mtime- و ctime-، على التوالي. فيما يلي صيغة العامة:
# find path –atime time
يشير الـ time إلى عدد الأيام الماضية التي تريد البحث فيها. على سبيل المثال، للعثور على الملفات في المجلد usr/ التي تم تعديلها في اليوم الأخير، قم بتشغيل الأمر التالي:
# find /usr –mtime 1
إذا كنت تريد الملفات التي تم الوصول إليها منذ أقل من يوم، فيمكنك تشغيل هذا الأمر:
# find /usr –mtime -1
للعثور على الملفات التي تم تغيير معلوماتها الوصفية مؤخرًا منذ أكثر من 3 أيام، يمكنك تنفيذ ما يلي:
# find /usr –ctime +3
البحث بالمالك والاذونات
يمكنك أيضًا البحث عن الملفات بواسطة user أو group التي تمتلك الملف باستخدام المعلمات -user و -group، على التوالي. للعثور على كل ملف في المجلد usr/ يمتلكه مستخدم syslog، قم بتشغيل هذا الأمر:
# find /usr –user syslog

وبالمثل، يمكنك تحديد الملفات في المجلد etc/ الذي تملكه مجموعة shadow عن طريق كتابة:
# find /usr –group shadow
يمكنك أيضًا البحث عن الملفات ذات الأذونات المحددة. إذا كنت تريد مطابقة مجموعة محددة من فيمكنك استخدام هذه البنية لتحديد الأذونات باستخدام التدوين الثماني:
# find /usr –perm 644
على سبيل المثال، يمكنك البحث عن جميع الملفات التي تكون Executable files، كالتالي:
# find /usr –perm /a=x
على سبيل المثال، يمكنك البحث عن الملفات التي تكون Executable files لمالك محدد ، كالتالي:
# find /usr –user syslog –perm /u=x
على سبيل المثال، يمكنك البحث عن الملفات التي تكون Read-Only files لمجموعة معينة، كالتالي:
# find /usr –group shadow –perm /g=r
البحث والحذف
للعثور على ملف واحد يسمى tecmint.txt وإزالته. قم بتشغيل الامر التالي:
# find –type f –name tecmint.txt -exec rm -f {} ;
للعثور على ملفات مستخدم ميعن وحذفها. قم بتشغيل الامر التالي:
# find –user test -exec rm -f {} ;

ملاحظة
• تستخدم exec لتنفيذ أمر أخر بعد الامر الحالي.
• تستخدم  {} للإشارة إلى ناتج الأمر الاول.
• تستخدم   ; للإشارة إلى نهاية exec.
البحث والنسخ
للعثور على ملف واحد يسمى tecmint.txt ونسخه. قم بتشغيل الامر التالي:
# find –type f –name tecmint.txt -exec cp –r /work {} ;
البحث والنقل
للعثور على ملف واحد يسمى tecmint.txt ونقله. قم بتشغيل الامر التالي:
# find –type f –name tecmint.txt -exec mv –r /work {} ;
6.2.3 امر grep
وهي اختصار لـ Global Regular Expression Print، يتم استخدام الامر grep للبحث عن نص في ملف معين. بمعنى آخر، يبحث الأمر grep في الملف المحدد عن الأسطر التي تحتوي على تطابق مع نصوص أو الكلمات المحددة.
فيما يلي الصيغة العامة للـ grep:
# grep [options] [pattern] [path]
أبحث عن أي سطر يحتوي على الكلمة المحددة في الملف المحدد:
# grep "word" filename 
قم بإجراء بحث حساس لحالة الأحرف عن الكلمة المحددة في الملف المحدد:
# grep -i "word" filename
ابحث عن جميع الملفات في المجلد الحالي وفي جميع المجلدات الفرعية عن كلمة المحددة:
# grep -R "word"
لإظهار كلمة بدون سطر كامل الذي يحتوي نص المراد البحث عنه:
# grep -l "word"
ملاحظة
الامر find و locate تستخدم للبحث عن ملف، إما الامر grep يستخدم للبحث عن نص في ملف معين.

 


الفصل السادس// التخزين (Linux Storage)
يُعَدُّ جهاز التخزين (Storage Device) جهازًا ماديًا يُستخدَم لتخزين البيانات، مثل HDD و SSD و Flash Memory، وغيرها. في هذا السياق، سنركز حصرًا على محرك الأقراص الصلبة (Hard Disk Drive).
1. الهارد ديسك فيزيائياً (Physical HHD)
الـ hard disk drive عبارة عن جهاز تخزين بيانات كهروميكانيكي يقوم بتخزين واسترداد البيانات الرقمية باستخدام تقنية التخزين المغناطيسي. يتألف الهارد ديسك من أطباق صلبة تدور بسرعة عالية ومغلفة بمادة مغناطيسية. يُعَرَفُ هذه الأطباق بـ "disk".
يتم إقران الأطباق برؤوس مغناطيسية، يتم ترتيبها عادةً على ذراع مشغل متحرك، والذي يقوم بقراءة البيانات وكتابتها على أسطح الطبق (Disk). يتم الوصول إلى البيانات بطريقة الوصول العشوائي، مما يعني أنه يمكن تخزين البلوكات الفردية من البيانات واسترجاعها بأي ترتيب. وفيما يلي أنواع الهارد ديسك من ناحية الواجهة هي PATA و SATA و SCSI و SAS. يوضح الشكل التالي الـهارد ديسك:

 

 

 

 

 

 

 

يتم تقسيم الطبق (Disk) إلى سيكتورات (Sectors). الـسيكتور (Sector) وهي الوحدة الأساسية للتخزين له عنوان وموقع فريدان على الهارد ديسك حيث يخزن كل سيكتور قدرًا ثابتًا من البيانات التي يمكن للمستخدم الوصول إليها، حجم السيكتور القياسي هو 512 بايت. في السنوات الأخيرة، أصبحت تقنية التخزين تتجه نحو استخدام سيكتورات أكبر الحجم، حيث تستخدم بعض الأقراص الحديثة سيكتورات بحجم 4 كيلوبايت (أو 4096 بايت). وقد تختلف احجام السيكتور قليلاً بين أنواع الهاردات ديسك المختلفة والتكنولوجيات المستخدمة.
في الهارد ديسك الحديثة، يتكون كل سيكتور (Sector) فعلي من جزأين رئيسيين هما:
 منطقة الرأس (Header Area): تحتوي على المعلومات الأساسية التي يستخدمها وحدة التحكم (Controller) والمشغل (Drive). تشمل هذه المعلومات معلومات الوصول إلى الـسيكتور، ومعلومات التحقق من الأخطاء وغيرها.
 منطقة البيانات (Data Area): تحتوي على وحدات البايت المتزامنة والبيانات المستخدمة وغيرها من المحتويات. يتم تخزين البيانات الفعلية التي يرغب المستخدم في تخزينها في هذه المنطقة.


2. الهارد ديسك منطقيًا (Logical HHD)
في البداية، يكون الهارد ديسك عبارة عن مساحة تخزين فارغة تماماً ويطلق عليه في هذه الحالة اسم المساحة الخام (raw space). يتم بعد ذلك تقسيم الهارد ديسك منطقياً لمجموعة من الأجزاء (Partitions) من خلال عملية تسمى تجزئة القرص (Disk Partitioning). يمكن القيام بعملية الـ Disk Partitioning باستخدام GPT و MBR. بالتالي يمكننا القول:
تجزئة القرص (Disk Partitioning) هو عملية تقسيم القرص الصلب إلى عدة أجزاء كما لو أنها أقراص مستقلة. الاجزاء (Partitions) هي أجزاء من القرص ذات أحجام محددة.
بشكل بسيط، يحتوي كل جزء (Partition) على مجموعة من البلوكات (Blocks). تخزن كل بلوك قدرًا ثابتًا من البيانات التي يمكن للمستخدم الوصول إليها. في أنظمة الملفات المستخدمة على أجهزة تخزين HDD، يتم تعيين حجم البلوك (Block Size) بشكل ثابت ويختلف من نظام ملفات لآخر. على سبيل المثال، في نظام الملفات ext4 الشائع في نظام لينكس، الحجم الافتراضي للبلوك هو 4 كيلوبايت (4096 بايت).
وكل بلوك منطقي قد يشغل سيكتور فيزيائي واحد أو أكثر. ودرسنا أن حجم البلوك يختلف بين أنظمة الملفات وإعدادات النظام. في معظم الأحيان، يتكون البلوك من مجموعة من السيكتورات المتتالية. على سبيل المثال، في نظام الملفات ext4 المعتاد، البلوك الافتراضي يتكون من 4 سيكتورات. 
ومع ذلك، يجب أن نلاحظ أنه في بعض الأحيان يمكن استخدام بلوك مكون من سيكتور واحد فقط، وذلك في حالات معينة مثل أنظمة الملفات القديمة أو الإعدادات المخصصة. فكلما زاد عدد السيكتورات التي يشغلها البلوك واحد زادت سرعة القراءة والكتابة.
2.1 الـ Master Boot Record 
يرمز له بـ MBR، يمكننا القول ما يلي:
الـ MBR هي طريقة لتجزئة جهاز التخزين، بحيث يقوم بتقسيم الجهاز إلى أجزاء ووضع مساحة صغيرة في بداية الجهاز؛ تحتوي هذه المساحة على البيانات الوصفية للأجزاء.
يوضح الشكل التالي تهيئة جهاز تخزين من نوع HDD بطريقة MBR؛ حيث سنقوم بتجزئة جهاز HDD إلى أربعة أجزاء (Partitions)، ويتم تخصيص مساحة صغيرة جداً في بداية القرص، تسمى MBR، هذه المساحة لا تنتمي لأي Partitions.

 


حجم مساحة المخصصة للـ MBR بحد أقصى 512 byte. يحتوي الـ MBR على ما يلي:
 الـ Partition Table وحجمه يساوي 64 byte.
 الـ boot loader ويبلغ حجمه 446 byte.
 الـ magic number ويبلغ حجمه 2 byte.
يدعم الـ MBR أربعة أجزاء (Partitions) كحد أقصى فقط؛ السبب هو أن كل جزء (Partition) في جدول التجزئة (Partition Table) يحتاج الى 16 بايت. بالتالي أقصى عدد للأجزاء (Partitions) التي يمكن انشائها في MBR هي أربعة فقط.
يدعم الـ MBR جهاز تخزين بمساحة أقصى تبلغ 2 تيرابايت؛ هو أنه يمنح كل سيكتور (sector) عنوان؛ وعدد العنوانين التي يستطيع منحها هي 32-bit بالتالي:
232 = 4,294,967,296 x 512 byte = 2 TB
قد يكون وجود أربعة أجزاء (Partitions) غير كافي؛ فلذلك نلجئ الى مفاهيم الـ Primary Partitions و Extended Partitions. حيث يمكننا القول:
تعتبر Primary Partitions هي الأقسام الأساسية المباشرة التي يمكن إنشاؤها على القرص الصلب. يمكن تعيين حتى أربعة أقسام أساسية فقط في جدول التجزئة الرئيسي الموجود في MBR. يمكن لكل قسم أن يحتوي على نظام ملفات مستقل ويكون قابلًا للتمهيد (Bootable).
إذا كانت الأجزاء (Partitions) الأربعة الأساسية في جدول التجزئة (Partition Table) قد تم استخدامها بالفعل، فيمكن إنشاء Extended Partition كبديل. حيث يمكننا القول:
الـ Extended Partition هي نوع خاص من الأجزاء (Partitions) يمكن أن يحتوي على مجموعة من الاجزاء الفرعية المعروفة بـ Logical Partitions. يعني ذلك أنه يمكن إنشاء عدد غير محدود من الاجزاء الفرعية داخل Extended Partition. ومن خلال هذه الاجزاء الفرعية، يمكن تحقيق تقسيم أكثر دقة ومرونة للقرص الصلب.
بالتالي سيخزن جدول التجزئة (Partition Table) الموجود في MBR معلومات وصفية عن كلاً من primary partitions و extended partitions. بينما يتم تخزين معلومات الـ logical Partitions في جدول التجزئة (Partition Table) جديد يتم وضعه في بداية extended partitions. كما في الشكل التالي:

 

 

 

ملاحظة
 ضع في اعتبارك أنه أصبح لدينا جدولين تجزئة هما:
1. جدول التجزئة الرئيسي والمخزن في MBR والذي يحتوي على معلومات وصفية للأجزاء الأربعة الأساسية.
2. جدول التجزئة الفرعي والمخزن في extended partition والذي يحتوي على معلومات وصفية للأجزاء الفرعية.
 مرادف MBR هي LBA أو MSDOS. 
 مرادف GPT هي GUID أو EFI أو UEFI.
2.2 الـ GUID Partition Table 
يرمز له بـ GPT. يمكننا القول ما يلي:
الـ GPT هي طريقة لتجزئة جهاز التخزين، بحيث يقوم بتجزئة الجهاز إلى أجزاء وتخصيص مساحة صغيرة في أماكن متفرقة على جهاز التخزين ؛ تحتوي هذه المساحات على البيانات الوصفية للأجزاء.
يعتبر GPT أكثر حداثة يحاول حل بعض المشكلات الملازمة لـ MBR. يمكن أن تحتوي الأنظمة التي تقوم بتشغيل GPT على العديد من الأجزاء (Partitions). عادة ما يكون هذا مقيدًا فقط بالقيود التي يفرضها نظام التشغيل نفسه. بالإضافة إلى ذلك، لا يوجد حد لحجم جهاز التخزين مع GPT وتتوفر معلومات جدول التجزئة (partition table) في مواقع متعددة للحماية من التلف. يمكن لـ GPT أيضًا كتابة "Protective MBR" الذي يخبر أدوات MBR فقط أن الهارد ديسك قيد الاستخدام.
ملاحظة:
• لا يمكن تحويل من MBR إلى GPT مباشرةً؛ يجب إرجاع جهاز التخزين إلى Raw Storage Device تم القيام بتحويل.
• في معظم الحالات، يعد GPT هو الخيار الأفضل ما لم يمنعك نظام التشغيل أو الأدوات من استخدامه.
3. تسمية وحدات التخزين 
يتم تسمية أجهزة التخزين حسب نوع جهاز التخزين (Storage Device) والواجهة المستخدمة. فيما يلي كيفية تسمية مع أشهر أجهزة التخزين:
3.1 الـ SATA HHD
يتم تسمية HDD المتصلة عبر واجهة SATA بتنسيق "sdxn"، حيث يمثل "x" حرفًا أبجديًا و "n" رقمًا. يُستخدم "sd" للإشارة إلى أقراص التخزين، ويتبعها حرف أبجدي يُمثل الجهاز نفسه (مثل sda أو sdb)، ويتبعها رقم يُعرف برقم الجزء (مثل sda1 أو sdb2).
ضع في اعتبارك أنه يتم تسمية SSD بشكل مماثل لـ HDD عبر واجهة SATA. يمكن استخدام تنسيق "sdxn" لتسمية أقراص SSD أيضًا.
3.2 الـ NVMe SSD 
يتم تسمية SSD المتصلة عبر واجهة NVMe. يمكن استخدام تنسيق "nvmesnxpy"، حيث يمثل "s" يمثل رقم السلوت، و "x" هي رقم ترتيب SSD و  "y"هي رقم الجزء (Partition). على سبيل المثال، يمكن تسمية أقراص NVMe SSD الأولى بـ "nvme0n1"، والجزء الأول فيها بـ "nvme0n1p1". بالطبع، هذه التسميات قد تختلف اعتمادًا على النظام الذي يتم تشغيله وتكوين الأجهزة الفردية.
3.3 الـ Virtual Disk
تتم تسمية الأقراص الافتراضية (Virtual Disks) وفقًا لتنسيق "vdxn"، حيث يُمثل "x" حرفًا أبجديًا و "n" رقمًا. يُستخدم تنسيق الاسم هذا لتمييز الأقراص الافتراضية وتحديدها في بيئات البرمجيات والأنظمة الافتراضية. 
ملاحظة
 الـ sr0 disk وهي symlink يشير الى /div/cdrom.

4. رقم تعريفي لوحدة التخزين
في عالم يتم فيه استخدام العديد من وحدات التخزين، يصعب تتبعها بناءً على الأسماء، ولذلك يتم استخدام معرّف (ID) ومسمى (Label) لتمييزها. يتم تخصيص معرّف فريد لكل وحدة تخزين باستخدام UUID (وهي اختصار لـ Universal Unique Identifier)، وهو رقم تعريفي فريد يتم توليده بشكل عشوائي.
يتم توليد معرّف UUID بشكل عشوائي لضمان الفرادة وعدم التعارض مع معرّفات أخرى. يتم استخدام هذا المعرّف لتعيين هوية فريدة لكل وحدة تخزين، ويمكن استخدامه للتعرف على الوحدة وإدارتها بشكل دقيق.
بالإضافة إلى ذلك، يمكن استخدام مسمى (Label) لتسمية وحدة التخزين بشكل ودي وذو مغزى. يمكن للمستخدم تعيين علامة للوحدة التخزين، مثل "مستندات" أو "صور"، وتستخدم هذه العلامة لتحديد طبيعة ومحتوى الوحدة التخزينية بشكل أكثر وضوحًا.
باستخدام معرّف UUID ومسمى (Label)، يمكن تمييز وتعقب وحدات التخزين بشكل دقيق وفعال، مما يسهل إدارتها واستخدامها في البيئات المتعددة ومع الأنظمة المختلفة.
3.1 تعيين مسمى لوحدة تخزين (Assign a label to a storage)
لتعيين مسمى (Label) لوحدة التخزين باستخدام الأمر e2label في نظام Linux، يمكن اتباع النمط التالي:
# e2label [device] [label]
حيث:
• [device] يمثل المسار أو الجهاز الخاص بوحدة التخزين، مثل /dev/sdb1، وهو يعتمد على نظام الملفات المستخدم.
• [label] يمثل المسمى الذي ترغب في تعيينه لوحدة التخزين.
على سبيل المثال، فيما يلي توضيح:
# e2label /dev/sdb1   MyStorage
في هذا المثال، يتم تعيين المسمى "MyStorage" لوحدة التخزين الموجودة في /dev/sdb1.
3.2 كشف الرقم تعريفي لوحدة التخزين
يتم منح الجزء (Partition) رقم UUID بشكل عشوائي عند انشاءه. يمكن الحصول علىUUID  الخاص بكل Drive و Partitions باستخدام الامر blkid، كما يلي:
# blkid 
وسيكون المخرج مشابه لما يلي:

NAME      UUID                                           FILESY      Parent UUID
/dev/sda1: UUID="f3de4-814f-478f-8570-d0446a68" BLOCK_SIZE="512"   TYPE="xfs"    PARTUUID="94d1679b-01"
/dev/sda2: UUID="RdbcEJ-Wjkl-KxPw-jJLp-IfId-32" BLOCK_SIZE="512"   TYPE="xfs"    PARTUUID="94d1679b-02"
/dev/sdc:  UUID="72c8198a-65e7-46be-b909-e25ee" BLOCK_SIZE="512"   TYPE="xfs"

4. عملية التهيئة (Formatting)
على الرغم من أن نواة لينكس (Linux kernel) قادرة على التعرف على أجهزة التخزين بشكلها الخام (Raw Device)، إلا أنه لا يمكن استخدامها مباشرة. يجب أن تخضع وحدات التخزين لعملية التهيئة (Formatting) قبل استخدامها. عملية التهيئة تشمل إنشاء أجزاء (Partitions) وكتابة نظام الملفات (Filesystem) على كل جزء وتهيئته للاستخدام.
يتم استخدام أداة fdisk في نظام لينكس لتنفيذ عملية التهيئة. تسمح أداة fdisk بإنشاء وتعديل الأجزاء (Partitions)على أجهزة التخزين وتحديد نوع نظام الملفات لكل جزء.
بالإضافة إلى ذلك، يمكن استخدام أداة lsblk للحصول على قائمة بجميع أجهزة التخزين القابلة للتوصيل وأجزائها المتوفرة. توفر أداة lsblk معلومات مفيدة مثل اسم الجهاز التخزين، الحجم، ونظام الملفات المستخدم.

4.1 أداء lsblk 
فيما يلي مثال على استخدام أداة lsblk:
# lsblk 
لاحظ المخرج التالي (للتوضيح):

NAME                 MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0                   11:0    1  1.6G  0 rom
nvme0n1              259:0    0   20G  0 disk
├─nvme0n1p1          259:1    0    1G  0 part /boot
└─nvme0n1p2          259:2    0   19G  0 part
 ├─almalinux-root   253:0    0   17G  0 lvm  /
 └─almalinux-swap   253:1    0    2G  0 lvm  [SWAP]

من المخرج نلاحظ لدينا جهاز تخزين من نوع NVMe، يسمى بـ nvme0n1، يحتوي على اثنين من الأجزاء (Partitions) وهي كما يلي:
• الـ nvme0n1p1: مساحته 1G ومربوط مع boot/.
• الـ nvme0n1p2: مساحته 19G ومربوط مع root directory.
وكذلك نلاحظ وجود ROM-Disk يسمى sr0، وهذا يستخدم في حالة وضعنا أسطوانة في ROM-Disk. باقي تفاصيل حالياً مهمشة لحين الوصول إلى المواضيع الخاصة بها.
ملاحظة:
الـ RM تحدد ما إذا كان الجهاز قابلاً للإزالة (1 إذا كانت الإجابة بنعم، 0 إذا كان الجواب لا). وكذلك الـ RO ما إذا كان الجهاز للقراءة فقط (1 إذا كانت الإجابة بنعم، 0 إذا كان الجواب لا).
4.2 أداة fdisk 
أداة fdisk تستخدم عادة الأجزاء (Partitions) على أجهزة التخزين مثل الأقراص الصلبة (HDD). ومع ذلك، يمكن استخدامها أيضًا لإدارة الأجزاء أجهزة التخزين الأخرى مثل أجهزة التخزين SSD وأجهزة Flash Storage و USB.
أداة fdisk تفرض قيودًا على عدد الأجزاء (Partitions) التي يمكن إنشاؤها على جهاز التخزين باستخدام نظام التقسيم MBR. وفقًا لهذا النظام، يمكن إنشاء ما يصل إلى 4 أجزاء أساسية (Primary Partitions). ولكن يمكن استخدام أحد هذه الاجزاء الأساسية كأجزاء موسعة (Extended Partitions) لإنشاء مجموعة إضافية من الاجزاء المنطقية (Logical Partitions) داخلها.
4.2.1 عرض المعلومات لكل جهاز تخزين
أول خطوة يجب القيام بها قبل القيام بأي عملية هي عرض التفاصيل الأساسية حول كل جهاز تخزين متوفر في النظام. يمكن استخدام الأمر التالي لذلك:
# fdisk –l         //l :list
لاحظ المخرج التالي (للتوضيح):

Disk /dev/nvme0n1: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xe4291aa1

Device         Boot   Start      End  Sectors Size Id Type
/dev/nvme0n1p1 *       2048  2099199  2097152   1G 83 Linux
/dev/nvme0n1p2      2099200 41943039 39843840  19G 8e Linux LVM


Disk /dev/mapper/almalinux-root: 17 GiB, 18249416704 bytes, 35643392 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/almalinux-swap: 2 GiB, 2147483648 bytes, 4194304 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

4.2.2 عرض معلومات لجهاز تخزين معين
يتم استخدام الأمر أدناه لعرض Partitions لـ Block Storage معين:
# fdisk –l devicename
4.2.3 إنشاء جزء على جهاز تخزين معين
استخدم الأمر التالي:
# fdisk devicename
الآن نحن داخل الاداة fdisk. وسيكون مشابه لما يلي:

Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Command (m for help):

 

في البداية، عند استخدام أداة fdisk، ستظهر رسالة ترحيبية ترحب بك في الأداة وتوفر معلومات عامة. بعد ذلك، ستظهر رسالة تحذيرية تذكرك بأن أي تغييرات تقوم بها ستحفظ في الذاكرة ولن تكون نافذة إلى أن تقوم بحفظها على القرص الصلب.
من ثم، ستُطلب منك إدخال أوامر فرعية في أداة fdisk لتنفيذ العمليات المطلوبة. فيما يلي بعض الأوامر الشائعة في أداة fdisk:
1. الأمر d: يستخدم لحذف الجزء (Partition).
2. الأمر l: يستخدم لعرض قائمة بأنواع الأجزاء المعروفة.
3. الأمر m: يستخدم لطباعة الأوامر المتاحة في واجهة fdisk.
4. الأمر n: يستخدم لإضافة قسم جديد (Partition).
5. الأمر p: يستخدم لطباعة جدول الأجزاء (Partition table).
6. الأمر w: يستخدم لكتابة الجدول على القرص الصلب والخروج من واجهة fdisk.
الآن عليك كتابة n لإنشاء جزء (Partition) جديد. وسيكون مشابه لما يلي:

Command (m for help): n
Partition type
P: Primary (0 primary, 0 extended, 4 free)
e: Extended (container for logical partitions)
select (default p):

تظهر رسالة توضيحية، وهي توضح لنا نوع الجزء (Partition Type) المطلوب انشاءه، حيث:
• الأمر P: لإنشاء Primary Partition جديد. بالإضافة توضح لنا عدد Primary Partition و extended Partition مستخدمة، وكذلك توضح لنا عدد Partitions الاساسية المتاح انشاءها.
• الأمر e: لإنشاء Extended Partition جديد. بالإضافة توضح لنا أن هذا النوع سيكون حاوية لـ logical partitions.
الآن سنقوم بجلستين هما:
الاولى// إنشاء Primary Partition
لإنشاء Primary Partition نقوم بإدخال p وسيكون مشابه لما يلي:

select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-10485759, default 2048): 2048
Last sector, +sectors or +size{K,M,G,T,P} (2048-10485759, default 10485759): 10485759

Created a new partition 1 of type "Linux" and of size 5 GiB.

الان سيطلبنا ببعض الإدخال وهي:
• الـ Partition Number
• الـ First Sector
• الـ Last Sector
ملاحظة
الـ sectors ما بين 0 إلى 2048 محجوزة لـ inode table. وتسمى هذه المساحة بـ Superblock.


لإظهار table Partition قم بإدخال p وسيكون مشابه لما يلي:

Command (m for help): p

Disk /dev/sdb: 5 GiB, 5368709120 bytes, 10485760 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x7ad36c6e

Device      Boot   Start    End        Sectors    Size   Id   Type
/dev/sdb1          2048     10485759   10483712   5G     83   Linux

من المخرج نلاحظ لدينا Partition يسمى بـ sdb1. لحفظ التغيرات قم بتشغيل الأمر w وسيكون مشابه لما يلي:

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

ثم استخدام الامر partprobe وهذا الامر لازم لكي يتم إعادة تحميل الـ partition table وقراءة الـ kernel التعديلات الجديدة من الـ partition table. كما يلي:
# partprobe namedisk
الثانية// إنشاء Extended Partition
لإنشاء Primary Partition نقوم بإدخال e وسيكون مشابه لما يلي:

select (default p): e
Partition number (1-4, default 1): 1
First sector (2048-10485759, default 2048): 2048
Last sector, +sectors or +size{K,M,G,T,P} (2048-10485759, default 10485759): 1G

Created a new partition 1 of type "Linux" and of size 1 GiB.

الآن سيطلبنا ببعض الإدخال وهي:
• الـ Partition number
• الـ First sector
• الـ Last sector
لإظهار table Partition قم بإدخال p وسيكون مشابه لما يلي:

Command (m for help): p

Disk /dev/sdb: 5 GiB, 5368709120 bytes, 10485760 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x7ad36c6e

Device      Boot   Start    End        Sectors    Size   Id   Type
/dev/sdb1          2048     10485759   10483712   5G     83   Extended

من المخرج نلاحظ لدينا Partition يسمى بـ sdb1. لحفظ التغيرات قم بتشغيل الأمر w وسيكون مشابه لما يلي:

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

ثم استخدام الامر partprobe وهذا الامر لازم لكي يتم إعادة تحميل الـ partition table وقراءة الـ kernel التعديلات الجديدة من الـ partition table. كما يلي:
# partprobe namedisk
4.2.4 كتابة نظام ملفات على الجزء الجديد
بعد إنشاء الجزء (Partition)، الآن يجب تحديد نظام الملفات (Filesystem) لهذا الجزء، يمكن القيام بذلك كما يلي:
# mkfs.filesystem partition
على سبيل المثال، لاحظ ما يلي:
# mkfs.ext4 dev/sdb1
لعرض قائمة تحتوي على معلومات نظام الملفات، أضف الخيار f مع الأمر lsblk، كما يلي:
# lsblk -f
يعد اختيار نظام الملفات الصحيح أمرًا بالغ الأهمية. كل نوع من أنواع أنظمة الملفات له قيود مختلفة على حجم الملف أو توافق مختلف لنظام التشغيل. فيما يلي الميزات والاختلافات الرئيسية لأشهر الانظمة:
النظام حجم الملف المعتمد الاستخدام المثالي
FAT32 up to 4 GB لتحقيق أقصى قدر من التوافق
NTFS 16 EiB – 1 KB لملف نظام
Ext4 16 GiB – 16 TiB للملفات الأكبر من 4 جيجا بايت

 

4.2.5 حذف جزء على قرص معين
لحذف الجزء (Partition) وإخلاء مساحة يشغلها هذا الجزء. انتقل إلى قائمة الأوامر باستخدام ما يلي:

# fdisk devicename
الآن عليك كتابة d لحذف الجزء. وسيكون مشابه لما يلي:

Command (m for help): d
Partition number(1,5, default 5): 1

Partition 1 has been deleted.

تظهر رسالة إدخاليه، وهي تطلب الـ Partition Number المراد حذفها. لحفظ التغيرات قم بتشغيل الأمر w. ثم استخدام الأمر partprobe.
5. عملية Reformatting
لإرجاع الهارد ديسك الى raw disk؛ للقيام بذلك نقوم بكتابة بيانات عشوائية في أماكن عشوائية على ديسك؛ مما يؤذي إلى اتلاف الـ partition table، لفعل ذلك نقوم بما يلي:
# cat /dev/random >> namedisk
أو
# cat /dev/zero >> namedisk
الفرق بين /dev/zero و /dev/random هي أن الملف random سيولد حروف بينما الملف zero يولد أرقام. والأفضل استخدام الـ zero.
هذه الطريقة غير فعالة؛ لأنه لا يمكن التحكم في حجم البيانات وفي اماكن كتابته؛ لذلك نلجأ لاستخدام الاداة dd. بشكل افتراضي، تقرأ dd من stdin وتكتب إلى stdout، ولكن يمكن تغييرها باستخدام خيارات if و of. وفيما يلي تنسيق هذه الاداة المستخدم مع عملية Reformatting:
# dd if=/dev/zero if= namedisk bs=x count=y 
حيث الخيار bs هي حجم الـ block. الخيار  countهي عدد الـ block. لو أردنا اتلاف partition table نقوم بتعيين القيمة 64 للخيار count و القيمة 1B للخيار bs. لو أردنا اتلاف MBR نقوم بتعيين القيمة  512 للخيار count و القيمة 1B للخيار bs.
ملاحظة
 قبل القيام بعملية Reformatting تأكد من ان الديسك غير مربوط مع مجلد.
 يمكن استبدال الأداة fdisk بالأداة cfdisk.

6. عملية ربط (Mounting)
في نظام التشغيل Windows تكون كل جزء (Partition) على شكل وحدة تخزين منفصلة ومستقلة. إما في لينكس يستخدم مفهوم الـ Mount Point.
من أجل الوصول إلى البيانات الموجودة على وسيط تخزين (مثل Drive أو Partitions أو الخ) عليك أولاً القيام بعملية Mounting. حيث يمكننا القول:
عملية الربط (Mounting) يعني ببساطة إتاحة الوصول إلى وسيط تخزين معين في نقطة الربط (Mount Point).  نقطة الربط (Mount Point) وهو المكان التي يجعل امكانية الوصول إلى Drives أو Partitions متاح.
وتتم هذه العملية عند بداية إقلاع الجهاز. لاحظ الشكل التالي، يتم تقسيم الـ HDD إلى أربعة Partitions، كما يلي:
 

 


بشكل أساسي، يكون هناك Disk أو Partition مربوط مع الـ Root Directory. ويحتوي هذا الـ Disk أو Partition على الملفات الازمة للـ Bootloader. ويتم تخزين داخل في هذا Partition حتى انتهاء مساحة المحددة. الان لاحظ الشكل:
 

 

 


الآن سنقوم بعمل ربط للـ Partition2 مع media directory. حيث أي بيانات سيحتوي عليها الـ media directory ستكون مخزنة في Partition2. إذا كان حجم الـ Partition2 هي 50G فيمكن تخزين بيانات في media directory حتى 50G. الان لاحظ الشكل:
 

 

 


يمكن ربط أكثر من Partition مع نفس directory. الآن سنقوم بعمل ربط للـ Partition3 مع media directory أيضاً. الان لاحظ الشكل:
 

 

 


الآن سيكون بالواجهة الـ Partition3 بينما الـ Partition2 سيكون بالخلفية ولن تظهر بياناته في mount point.
6.1 خطوات تركيب وحدة تخزين (Drive) في نظام لينكس
الخطوة الأولى// احصل على وحدة تخزين الذي تريد ربطه
يمكن القيام بذلك باستخدام الأمر "lsblk" لعرض جميع أجهزة التخزين المتصلة بالنظام وتفاصيلها، بما في ذلك HDD و SSD وغيرها. يمكن تحديد الوحدة التخزين المطلوبة بناءً على حجمها ونوعها. فيما يلي مخرج استخدام lsblk على جهازي:

Name     MAJ:MAIN RM SIZE  RO TYPE MOUNTROINT
sda      8:0      0     20G    0  disk 
├─sda1    8:2      0    513M    0  part  /boot
└─sda2    8:3      0   19.5G    0  part  /
sdb       8:16     0     20G    0  disk 
└─sdb1    8:17     0     20G    0  part 
sr0      11:0     1   1024M    0  rom

لاحظ العمود الاخير، يظهر لنا الـ Drive و Directories المربوطة بها. الآن نريد ربط للـ sda1 مع media directory.
الخطوة الثانية// التحقق من نوع نظام ملفات المركب على وحدة تخزين
يمكن استخدام الأمر "blkid" لعرض معلومات التعريف الفريدة للأجهزة وأنواع نظامات الملفات المركبة عليها. يمكن تحديد نوع نظام الملفات من خلال الاطلاع على الحقول ذات الصلة في نتائج الأمر. فيما يلي مخرج استخدام blkid للـ sda1 على جهازي:

/dev/sdb1: UUID="ccab0f8d-3b5b-4189-9da3" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="c088a647-01"
     
هذه الخطوة مهمة؛ لأنه قد نريد تعيين filesystem عند القيام بعملية mounting.
الخطوة الثالثة// قم بإنشاء مجلد لنقطة الربط إذا لم تكن موجودة بالفعل
يمكن استخدام الأمر "mkdir" لإنشاء مجلد جديد لنقطة الربط (Mount Point) إذا لم يكن موجودًا بالفعل. على سبيل المثال، يمكن استخدام "mkdir /media" لإنشاء مجلد باسم "media".

الخطوة الرابعة// قم بتركيب وحدة تخزين يدويًا 
يمكن استخدام الأمر "mount" لربط وحدة التخزين مع نقطة الربط. على سبيل المثال، نريد عمل mount للـ sda1 معmedia directory . يمكن القيام بذلك كالتالي:
# mount /dev/sda1  /media 
الآن أصبح media directory مربوط مع Partition المسمى sda1. الآن لو لدينا  Partitionجديد يسمى sda2 مساحته 10G، ونريد ايضاً عمل mount له معmedia directory . يمكن القيام بذلك كالتالي:
# mount /dev/sda2  /media 
الآن أصبح media directory مربوط مع  Partitionالمسمى sda2. واصبحت المساحة الكلية المتاحة للـ media directory هي 20G. 
لو أردنا تحديد الـ filesystem عند القيام بعملية Mounting، فيما يلي الصيغة العامة لذلك:
# mount –t filesystem  device  directory
بشكل افتراضي، إذا لم نحدد نوع file-system. يقوم الامر mount بعملية auto detect؛ وهي تحديد نوع file-system المناسب.
الخطوة الخامسة// تحقق مما إذا تم تركيب وحدة تخزين بنجاح
يمكن استخدام الأمر "df -h" لعرض معلومات وحدات التخزين المتصلة وحجمها ومساحتها المستخدمة والمتبقية. يمكن التحقق من وجود وحدة التخزين المربوطة بنجاح من خلال التأكد من ظهورها في نتائج الأمر. فيما يلي مخرج استخدام df -h:

Filesystem      Size   Used  Avail  Use%  Mounted on
/dev/sda3        20G   7.1G    12G   39%  /
/dev/sda2       512M   7.8M   505M    2%  /media
/dev/sdb1        20G    45M    19G    1%  /media
     
الخطوة السادسة// حفظ الربط
حالياً يتم تخزين الاعدادات الحالية الخاصة بـ Mounting في /etc/mtab. ولكن سيتم فقد جميع عمليات الـ Mounting بمجرد إعادة تشغيل الجهاز. لمنع ذلك يجب حفظ الـ Mounting في /etc/fstab؛ والذي يلجأ إليه نظام عند الاقلاع.  يوضح الشكل التالي الأعمدة الذي يحتوي عليها الملف /etc/fstab:

 

 

حيث:
 الـ device: وهي تمثل Partition.
 الـ mount point: وهي تمثل directory.
 الـ type: وهي تمثل file-system.
 الـ mount option: وهي تمثل الصلاحيات مثلًا rw أو ro أو noexec أو exec.
 الـ dump order: وهي تستخدم لأخذ نسخة من Partition.
• القيمة صفر تعني لا تأخذ نسخة احتياطية.
• القيم من 1 الى 9 أولوية اخذ نسخة احتياطية.
 الـ filesystem check order: وهي تستخدم للتحقق من Partition بالترتيب عند الاقلاع. حيث:
• القيمة صفر تعني لا تحقق.
• القيم من 1 الى 9 أولوية التحقيق.
بعد تعديل، قم بتشغيل الامر التالي. والذي سيعيد قراءة الـ mount، وهذه مفيد في حالة كان هناك خطأ في تعديل:
# mount –a            //a: amount
6.2 اضافات
يمكن استخدام UUID في عملية Mounting. كما يلي:
# mount UUID=UUID  directory
يمكن استخدام Label في عملية Mounting. كما يلي:
# mount label=label  directory

6.3 إلغاء ربط وحدة تخزين مربطه مسبقًا
لإلغاء ربط وحدة التخزين المربوطة مسبقًا في نظام Linux، يمكن اتباع الخطوات التالية:
أولاً// تأكد من عدم استخدام الملفات أو المجلدات الموجودة في وحدة التخزين المربوطة. قم بإغلاق أي برامج أو عمليات قد تكون تستخدم الملفات في تلك الوحدة.
ثانياً// تأكد من عدم تشغيل أي عمليات نقل أو نسخ للبيانات إلى أو من وحدة التخزين المربوطة.
ثالثاً// قم بفصل وحدة التخزين المربوطة باستخدام الأمر "umount" تليها مسار نقطة الربط. على سبيل المثال، إذا كانت وحدة التخزين مربوطة بمجلد "media"، يمكن استخدام الأمر التالي:
# umount /media
لو كان هناك directory مربوط مع أكثر من drive، فإن unmount تقوم بعمل الغاء ربط لأخر drive.
ربعاً// بعد تنفيذ الأمر، سيتم فصل وحدة التخزين عن نقطة التركيب. يمكن التحقق من ذلك باستخدام الأمر "df -h"، حيث يجب أن لا تظهر وحدة التخزين المربوطة في قائمة الأقراص المتصلة.
خامساً// للتأكد من عدم إعادة ربط وحدة التخزين عند إعادة التشغيل، قم بفحص ملف /etc/fstab وتأكد من أنه لا يحتوي على إدخال يشير إلى تركيب تلك الوحدة. إذا وجدت إدخالًا مشابهًا، فيمكنك حذفه باستخدام محرر النصوص.

 


الفصل السابع // مدير الحزم (Linux Package Manager)
قديماً، لتشغيل برنامج نقوم بما يلي:
• تطوير البرنامج باستخدام لغة برمجة معينة ومكتبات مخصصة وقياسية.
• نقوم بعمل ترجمة للـ Source Code File بواسطة الـ Compiler الخاص بلغة البرمجة.
• ناتج الـ Compiler هو Binary File وهذا الملف هو المطلوب لكي يتم تشغيله بواسطة النظام.
لاحظ الشكل التالي:

 

 


المشكلة هي أنه لا نستطيع تشغيل نفس الـ Source Code File على جهاز اخر بنفس نظام تشغيل؛ والسبب يرجع إلى:
• النظام الجديد قد لا يحتوي على لغة البرمجة المكتوبة لها البرنامج؛ بالتالي لا يمكن ترجمة الملف.
• النظام الجديد قد لا يحتوي على مكتبات المخصصة؛ بالتالي لا يمكن تشغيل البرنامج بشكل صحيح.
لحل هذه المشكلة تم تطوير مفهوم جديد وهو الحزم (Package)، حيث تتضمن الحزمة على Binary File و Custom Library و Files (مثل الخطوط والالوان والنصوص والخ). لاحظ الشكل التالي:

 

 

 

بالتالي للتعامل مع الحزمة Package)) نحتاج الى مدير الحزم (Package Manager). على سبيل المثال يدعم نظام ويندوز كلاً exe و msi, يدعم نظام المدير rpm، يدعم نظام الاندرويد apk.
باستخدام مدير الحزم، يمكن تثبيت الحزمة وتكوين النظام لتوفير البيئة المطلوبة لتشغيل البرنامج بنجاح، بما في ذلك تثبيت لغة البرمجة المطلوبة والمكتبات المخصصة وغيرها من المتطلبات اللازمة.

1. الحزمة (Package)
الحزمة (Package) هي عبارة عن ملف أرشيف برمجي مضغوط (compressed software archive file) يحتوي على جميع الملفات المرتبطة بتطبيق برمجي، ويمكن أن تكون هذه الملفات ذات أي نوع مثل أدوات السطر الأوامر (Command Line Utilities)، وتطبيقات واجهة المستخدم الرسومية (GUI Applications)، أو مكتبات البرمجيات (Software Libraries).
تتكون الحزمة عادةً من ملف تنفيذي ثنائي (Binary Executable)، ملف تكوين (Configuration File)، وقائمة بالتبعيات (Dependencies). تحتوي الحزمة أيضًا على بيانات تعريفية مثل:
1. اسم الحزمة (Package Name).
2. رقم الإصدار (Version Number).
3. رقم الإصدار الفرعي (Release Number).
4. نوع الهندسة المعمارية (Architecture Type).
5. امتداد الملف (File Extension).
في نظام Linux، عادةً لا تحتوي حزمة لينكس على التبعيات اللازمة للتثبيت، ولذا يتم استخدام مديري الحزم الخاصة بتوزيعات لينكس لقراءة ملف التبعيات تلقائيًا وتنزيل الحزم الضرورية قبل المتابعة في عملية التثبيت.
توازيًا مع ذلك، يعمل مدير الحزم على تسهيل عملية تثبيت وإدارة الحزم بطريقة مرنة وفعالة، حيث يتولى قراءة بيانات الحزمة والتحقق من التبعيات اللازمة وتنزيلها وتثبيتها بشكل آلي، مما يسهل على المستخدم تركيب التطبيقات والمكتبات بسهولة وتجنب المتاعب المحتملة المتعلقة بالتبعيات.
2. مدير الحزم (Package Manager)
مديري الحزم (Package Managers) هم مجموعة من الأدوات البرمجية التي تساعد المستخدمين في البحث عن تطبيقات البرامج وتنزيلها وتثبيتها وإزالتها وتحديثها على أنظمة تشغيل الكمبيوتر الخاصة بهم. يمكن أن تكون هذه الأدوات عبارة عن واجهة سطر الأوامر أو تطبيقات واجهة مستخدم رسومية كاملة.
نادرًا ما يقوم المستخدمون المتمرسون في Linux بتنزيل البرامج من مواقع الويب أو أي مكان آخر. وتتضمن الأسباب الرئيسية لذلك جوانب مثل سهولة الاستخدام والأمان، بالإضافة إلى حقيقة أن معظم توزيعات Linux توفر قوائم بمصادر الحزم حيث يمكن للمستخدمين تنزيل حزم برامج مفتوحة المصدر ومجانية.
تُشار إلى مصادر الحزم هذه باسم المستودعات (Repositories). باستخدام مدير الحزم، يقوم المستخدمون تلقائيًا بتنزيل الحزم المناسبة من المستودعات المكونة وتثبيتها وإكمال جميع مهام التكوين المطلوبة.
الـ Package Managers الشائعة في Linux:
أولاً/ مدير الحزم YUM
هو اختصار لـ .Yellowdog Updater, Modified هو أحد مديري الحزم الشائعة في نظام التشغيل لينكس، ويستخدم بشكل أساسي في توزيعات مبنية على Red Hat مثل CentOS وFedora. يهدف YUM إلى تسهيل إدارة وتثبيت الحزم البرمجية وتحديثها على النظام.
مدير الحزم YUM يتبع نموذج المتعاونين (Client-Server) ويعتمد على مفهوم المستودعات (Repositories). يتم تكوين قائمة بالمستودعات التي تحتوي على الحزم البرمجية المتاحة والتي يمكن لـ YUM الاستعلام عنها وتحميل الحزم منها.
في هذا السياق، يعتبر YUM أن العميل (Client) هو الذي يقوم بالاستعلام عن المستودعات وتحميل الحزم، بينما يتم اعتبار المستودع نفسه الخادم (Server). المستودع يحتوي على مجموعة واسعة من الحزم المختلفة التي يمكن للمستخدمين تنزيلها وتثبيتها باستخدام YUM.
المستودعات يمكن أن تكون محلية على الجهاز المستخدم أو متاحة عبر الشبكة، مثل مستودعات عامة على الإنترنت. يتم تكوين YUM للاتصال بالمستودعات المحددة والاستعلام عنها للحصول على قائمة الحزم المتاحة وتنزيلها عند الحاجة.
باستخدام هذا النموذج، يتيح YUM للمستخدمين الوصول إلى مجموعة واسعة من الحزم البرمجية المتاحة في المستودعات بطريقة مركزية ومنظمة. يمكن للمستخدمين تكوين YUM للعمل مع مستودعات متعددة وتحديثها بانتظام للحصول على أحدث إصدارات الحزم وتثبيتها بسهولة على أنظمتهم.
بشكل عام، يعد YUM أداة قوية وموثوقة لإدارة الحزم في توزيعات Linux المبنية على Red Hat، ويوفر واجهة سهلة الاستخدام للمستخدمين للتعامل مع الحزم البرمجية بكفاءة.
العميل
من المهم معرفة أن العميل يقوم بتنزيل metadata على نظام في احدى الحالتين:
• عند البحث أو تثبيت برنامج جديد.
• عند تحديث النظام.
ليتم بعد ذلك استخدام الـ metadata المحلية في الاستعلام عن برنامج. ويتم تخزين الـ metadata في /mnt/repodata.
فيما يلي الاوامر التي يمكن استخدامها مع Client YUM:
تثبيت الحزم
# yum install package
إعادة تثبيت الحزم
# yum reinstall package
بحث عن الحزم
# yum search package
تحديث الحزم
# yum update package
تحديث النظام
# yum update 
حذف الحزم
# yum remove package 
عرض مستودعات متصلة
# yum repolist 
السيرفر
السيرفر هو نظام يستخدم لإنشاء مستودع YUM مركزي على خادم (Server) يمكن الوصول إليه من عدة عملاء (Clients) متصلة عبر الشبكة. يتيح سيرفر توفير حزم البرامج والتحديثات المركزية لعدة أنظمة Linux تستخدم YUM كمدير حزم.
عند إعداد السيرفر، يتم تكوين الخادم لتحتوي على مستودع YUM المحلي. يتم تنزيل الحزم البرمجية والتحديثات المطلوبة للأنظمة المستهدفة وتخزينها في المستودع المحلي. يمكن للعملاء الاتصال بـ YUM Server عبر الشبكة والاستعلام عن المستودع للحصول على قائمة الحزم المتاحة وتنزيلها وتثبيتها على أنظمتهم.
ثانياً/ مدير الحزم DNF
هو مدير حزم يستخدم في توزيعات Linux التي تعتمد على نظام التشغيل Fedora و CentOS/RHEL 8 وما بعدها. يعتبر DNF الجيل القادم لمدير الحزم YUM ويهدف إلى تحسين الأداء وتوفير ميزات إضافية.
DNF يحتفظ بالتوافق مع واجهة YUM الأساسية ويعمل بنفس الأوامر والأساليب المعروفة. ومع ذلك، يتميز DNF بعمارة داخلية معادة تصميمها لتحسين سرعة البحث والتثبيت والتحديث للحزم. يتمتع DNF أيضًا بقدرة أفضل على إدارة التبعيات (Dependencies) وحل مشاكل التعارض بين الحزم.
بالإضافة إلى ذلك، يوفر DNF ميزات إضافية لتحسين تجربة إدارة الحزم، مثل القدرة على تثبيت المجموعات الحزم (Package Groups) وإدارة الإصدارات المتعددة للحزم (Module Streams). كما يدعم DNF تنزيل الحزم بشكل موازي لتحسين سرعة عملية التثبيت.
يتم تحديث DNF بانتظام وتوفير تحديثات الأمان والتحسينات الأخرى لمستخدميه. تم اعتماد DNF كمدير حزم افتراضي في توزيعة Fedora اعتبارًا من Fedora 22 وبعدها، ويستخدم أيضًا في CentOS/RHEL 8 وما بعدها بدلاً من YUM.
باختصار، DNF هو تطوير لمدير الحزم YUM يقدم أداءً أفضل وميزات إضافية لإدارة الحزم في توزيعات Linux المستندة إلى Fedora و CentOS/RHEL 8 وما بعدها.

 

 

 

 


الفصل الثامن// الشبكات
سندرس في هذا الفصل، شبكة الحاسوب وتوصيل نظام لينكس بهذه الشبكة. وكيفية تعيين عنوانين Ips له وما هي الطرق والأدوات المستخدمة.
1. شبكة الحاسوب (Network Computer)
بشكل عام، يمكن أن يشير مصطلح الشبكة إلى أي مجموعة أو نظام مترابط. وبشكل أكثر تحديدًا، الشبكة هي أي طريقة لمشاركة المعلومات بين نظامين. في تكنولوجيا المعلومات، الشبكة عبارة عن سلسلة من النقاط أو العقد المترابطة بواسطة مسارات الاتصال.
شبكة الكمبيوتر عبارة عن مجموعة من أنظمة الكمبيوتر أو الأجهزة المتصلة ببعضها البعض. يسمح لأجهزة الكمبيوتر بـالتواصل مع بعضها البعض، ومشاركة الموارد والمعلومات. لاحظ الشكل التالي:

 

 

 

 

1.1 مكونات شبكة الكمبيوتر
مكونات شبكة الكمبيوتر هي الأجزاء الرئيسية اللازمة لتثبيت البرمجيات. فيما يلي المكونات الاساسية لشبكة الكمبيوتر:
1.1.1 الأجهزة النهائية (End Device)
تشمل الأجهزة النهائية أو المستخدمة في شبكة الكمبيوتر مثل أجهزة الكمبيوتر الشخصي، والأجهزة اللوحية، والهواتف الذكية، والطابعات، والأجهزة الذكية الأخرى والسيرفرات. تستخدم هذه الأجهزة للوصول إلى الموارد والخدمات عبر الشبكة.
1.1.2 وسائط الشبكة (Network Media)
هي الوسائط التي تستخدم لنقل البيانات في الشبكة، مثل الكابلات النحاسية مثل الكابل الإيثرنت، والكابلات الضوئية مثل الألياف البصرية، والأمواج اللاسلكية مثل الواي فاي.
1.1.3 كرت الشبكة (Network Interface Card)
هي البطاقة المثبتة في الأجهزة النهائية والتي تسمح بتوصيل الجهاز بشبكة الكمبيوتر. تعمل بطاقة واجهة الشبكة على تحويل البيانات من تنسيق الجهاز إلى تنسيق قابل للنقل عبر الشبكة والعكس.

1.1.4 بروتوكول الشبكة (Network Protocol)
يشير إلى مجموعة من القواعد والاتفاقيات التي تحدد كيفية تنظيم وتبادل البيانات في شبكة الكمبيوتر. أمثلة على بروتوكولات الشبكة تشمل TCP/IP (بروتوكول التحكم في النقل/بروتوكول الإنترنت) وUDP (بروتوكول تحديث اليونيفيرسال).
1.1.5 أجهزة الشبكة (Network Devices)
تشمل أجهزة الشبكة المكونات التي تقوم بتوجيه وتوصيل حركة البيانات في الشبكة. من أمثلة أجهزة الشبكة: رواترات (Routers) التي توجه حركة البيانات بين الشبكات، وسويتشات الشبكة (Switches) التي توجه حركة البيانات داخل الشبكة المحلية، وجدران الحماية (Firewalls) التي توفر الأمان وتحمي الشبكة من التهديدات الخارجية.
هذه المكونات الأساسية تعمل معًا لتشكيل شبكة الكمبيوتر وتوفير الاتصال وتبادل البيانات بين الأجهزة والمستخدمين في الشبكة.
1.2 كرت شبكة (Network Interface Card)
تختصر بـ NIC. وهي أحد مكونات الأجهزة المستخدمة لتوصيل جهاز كمبيوتر بشبكة. يمكن أن تدعم معدل نقل من 1Mbps إلى 1000Mbps. قد يتم توصيل الـ NIC بشبكة سلكياً أو لاسلكياً.
يتم ترميز الـ Address MAC على الـ NIC. يتم تعيين الـ Address MAC بواسطة منظمة IEEE. يتم تخزين الـ Address MAC في PROM الخاص بـ NIC.
عادةً ما تكون الـ NIC عن circuit board يتم تثبيتها على الكمبيوتر للاتصال بالشبكة. تعمل كمكون لا غنى عنه لاتصال شبكة أجهزة الكمبيوتر. لاحظ الشكل التالي:

 

 

تعمل الـ NIC في طبقة الثانية من OSI Model. على سبيل المثال، عندما يطلب المستخدم صفحة ويب، تحصل الـ NIC على البيانات من جهاز المستخدم ثم تقوم بتضمين الـ MAC Address الخاص بها في الـ header باعتباره Source MAC Address ثم تقوم بإرسالها إلى السيرفر على الإنترنت، ثم تتلقى البيانات المطلوبة مرة أخرى من الإنترنت لعرضها للمستخدمين (وهي التي تقرر قبول أو رفض البيانات بناءً على عنوان destination MAC address في header).
ملاحظة:
تسمى أيضاً بـ network interface controller أو network adapter أو LAN adapter. وقد تكون داخلية (مدمجة مع لوحة الام) أو قد تكون خارجية (يتم ربطها مع لوحة الام من خلال slot مخصص).
2.1.1 أنواع كروت شبكة
يدعم الـحاسوب العديد من كروت الشبكة (وتسمى بـ Network Interface) ومنها:
1. واجهة الحلقة المغلقة (Loopback Interface)
هي واجهة افتراضية (Virtual Network Interface) يرمز له بـ lo. تقوم هذه الواجهة بإرسال البيانات إلى نفس الحاسوب دون الحاجة إلى الاتصال بشبكة خارجية. تستخدم لاختبار تشغيل الشبكة وتأكيد عمل البرامج والخدمات المثبتة على الحاسوب.
عنوان IP-Address الأكثر استخدامًا على loopback network هو 127.0.0.1 لـ IPv4. ويكون الـ standard domain name للعنوان هو localhost.
2. واجهة الإيثرنت (Ethernet Interface)
تعتبر واحدة من أكثر أنواع كروت الشبكة شيوعًا، يرمز لها بـ eth. تستخدم لتوصيل الحاسوب بشبكة الإيثرنت، وهي تقنية شبكة متعددة الوسائط تستخدم للاتصالات في الشبكات المحلية (LAN). تتوفر بسرعات مختلفة مثل 10/100/1000 ميجابت في الثانية وتستخدم موصلات مثل الموصلات RJ-45.
يعتمد تسمية وترقيم واجهة الإيثرنت (Ethernet Interface) على BOIS بواسطة الـboisdevname ، بحيث يتم تسمية وترقيم كما يلي:
• الـ enoX اختصار ethernet on-board، حيث x هي رقم البورت.
• الـ ensXpY اختصار ethernet Express-PCI، حيث x هي رقم سلوت وy  هي رقم البورت.
ملاحظة
1. يستخدم الامر lspci لعرض الاجهزة الموصلة على السلوت (Slot).
2. في العالم الحقيقي يكون هناك patch panel وسيط بين السيرفر والسويتش وذلك بهدف cable management.
3. واجهة اللاسلكي (Wireless Interface)
تعتبر واحدة من ثاني أكثر أنواع كروت الشبكة شيوعًا، يرمز لها بـ wlan. لتوصيل الحاسوب بشبكة الإيثرنت الاسلكية التي تعمل بتقنية الواي فاي (Wi-Fi). تعمل واجهة اللاسلكي عن طريق تلقي وإرسال الإشارات اللاسلكية بين الحاسوب ونقطة الوصول (Access Point) في الشبكة اللاسلكية.
4. واجهة الألياف البصرية (Fiber Interface)
هي تكنولوجيا الصاعدة بقوة خلال الفترة المقبلة. تستخدم الألياف البصرية لنقل البيانات بواسطة الألياف الضوئية. تعتبر الألياف البصرية واحدة من أسرع تقنيات نقل البيانات حيث تدعم سرعات عالية ومسافات طويلة. تستخدم واجهة الألياف البصرية للاتصال بشبكات الألياف البصرية والتي تستخدم في الشبكات الواسعة (WAN) أو في الاتصالات عبر الشبكات الداخلية في الشركات.
تعتبر هذه الأنواع الشائعة من كروت الشبكة جزءًا من تشكيلة واسعة من الخيارات المتاحة حسب احتياجات الشبكة وتقنيات الاتصال المستخدمة.
1.2.2 بارامترات واجهة الشبكة 
كل لها واجهة شبكة (Network Interface) العديد من البارامترات التي ممكن ان تدعمها مثل:
1. الـ MAC Address
يُعرف أيضًا بعنوان الجهاز الفيزيائي (Physical Address)، هو اختصاراً لـ Media Access Control. وهو عبارة عن رقم فريد يُعطى للواجهة ويُستخدم لتمييز الجهاز في الشبكة. يتكون من سلسلة من الأرقام والحروف الست عشرية، ويتم ترميزه بشكل ثابت وفريد على بطاقة NIC، ويعمل في الطبقة الثانية وهي الطبقة المسؤولة عن توصيل ونقل البيانات.
الـ Mac Address هو رمز فريد خاص بكل جهاز وهو المسؤول عن تعريف الجهاز على الشبكة وهو بمثابة بطاقة الهوية أو البصمة الخاصة لجهاز الكمبيوتر. يمكن التعرف على هوية المتصل بالشبكة. يتم تحديد الـ Mac Address عن طريقة الشركة المصنعة له.
2. الـ IP Address
يُعرف أيضًا بعنوان الجهاز المنطقي (Logical Address)، هو اختصاراً لـ Internet Protocol. يُستخدم لتحديد موقع الجهاز في الشبكة. يتكون من سلسلة من الأرقام الموضوعة في تنسيق معين، مثل "192.168.1.1". يُستخدم لتمييز الأجهزة وتوجيه حركة البيانات عبر الشبكة.
3. الـ Netmask
يُستخدم لتحديد الجزء من عنوان IP الذي يمثل الشبكة والجزء الذي يمثل الجهاز في الشبكة. يُعرف أيضًا بـ Subnet Mask ويكون في شكل عنوان IP مع وجود أصفار متتالية، مثل "255.255.255.0".
4. الـ Gateway
يُشير إلى عنوان IP لجهاز الراوتر (Router) الذي يستخدم لتوجيه حركة البيانات بين الشبكات المختلفة. يُستخدم البوابة كنقطة اتصال للوصول إلى شبكات خارجية، مثل الإنترنت.
5. الـ DNS
يُشير إلى عنوان IP لسيرفر DNS؛ الذي يستخدم لتحويل أسماء Domain إلى عناوين IP. تعين عادةً عناوين IP لسيرفرات DNS المتاحة للجهاز، ويتم استخدامها لترجمة أسماء المواقع إلى عناوين IP المقابلة.
ملاحظة
يجب أن يكون للـ DNS عنوان static address، لأن تغيير العنوان قد يؤدي إلى فشل العملية.
6. الـ Broadcast & Multicast
عملية العنونة (أي اعطاء عناوين للأجهزة) تنقسم الى ثلاث:
 الـ Unicast address: وهي عنوان يدل على جهاز مستخدم واحد.
 الـ Broadcast address: وهي عنوان يدل على جميع الأجهزة المتصلة بشبكة.
 الـ Multicast address: وهي عنوان يدل على مجموعة محددة لأجهزة المتصلة بشبكة
7. الـ MTU
وهي اختصار لـ Maximum Transmission Unit، وهي مصطلح يستخدم في أنظمة الشبكات والتشغيل. وهي تحدد الحجم الأكبر للباكيت التي يمكن إرسالها ككيان واحد في اتصال الشبكة. بمعنى أخر، يحدد حجم MTU مقدار البيانات التي يمكن إرسالها بالبايت عبر الشبكة.
حيث افتراضيًا، الـMTU  يبلغ 1500-Byte، وهو أكبر وحدة قياسية للإيثرنت. يعتمد حجم MTU على مواصفات الشبكة.
8. الـ RX Packet
يشير إلى عدد الحزم التي تم استقبالها عبر واجهة الشبكة.
9. الـ TX Packet
يشير إلى عدد الحزم التي تم إرسالها عبر واجهة الشبكة.
10. الـ RX Error
يشير إلى عدد الأخطاء التي واجهتها واجهة الشبكة أثناء استقبال الحزم.
.11 الـ RX Error
يشير إلى عدد الأخطاء التي واجهتها واجهة الشبكة أثناء إرسال الحزم.

1.3 عنوان IP-Address
الـ Internet Protocol عبارة عن مجموعة من القواعد للاتصال عبر الإنترنت، مثل إرسال البريد أو دفق الفيديو أو الاتصال بموقع ويب. يحدد الـ IP Address شبكة أو جهازًا على الإنترنت.
تدير الـ internet protocols عملية تعيين Address IP الخاص بكل جهاز بشكل فريد. (تقوم الـ internet protocols بأشياء أخرى أيضًا، مثل توجيه البيانات على الإنترنت.) وبهذه الطريقة، من السهل معرفة الأجهزة على الإنترنت التي ترسل وتطلب وتتلقى المعلومات.
تشبه الـ IP Address أرقام الهواتف وتخدم نفس الغرض. عندما تتصل بشخص ما، فإن رقم هاتفك يحدد هويتك، ويؤكد للشخص الذي يرد على الهاتف هويتك. تعمل الـ IP Address نفس الشيء تمامًا عندما تكون متصلاً بالإنترنت - ولهذا السبب يكون لكل جهاز متصل بالإنترنت عنوان IP.
هناك نوعان من الـ IP Addresses هما IPv4 و IPv6. لكن الاكثر استخداما في شركات ولإنترنت هو IPv4. لذلك سندرس هنا فقط IPv4.
1.3.1 الـ Address IPv4
هو عبارة عن رقم يتكون من 4-byte. يطلق على كل 1-byte اسم OCTET. يتم تعيين الـ Address IP لكل جهاز على شبكة إما بشكل ثابت أو متغير وكذلك يمكن تعيينه يدويًا أو باستخدام برتوكول DHCP.
نظريا يتم كتابة الـ IP address على شكل عشري. مقسم لأربع OCTET كل قسم يحتوي على ثلاث Digit.
- أكبر قيمة يمكن أن يخزنه الـ OCTET هي 255 .
- أقل قيمة يمكن أن يخزنه الـ OCTET هي صفر.
لاحظ الشكل التالي للـ IP address:
192.168.0.0
فعلياً يتعرف الحاسوب على الـ IP address على شكل رقم ثنائي مقسم لأربع octat كل octat يحتوي على ثمن Digit.
- أكبر قيمة يمكن ان يخزنه الـ OCTET هي 11111111 (تساوي بالعشري 255).
- أقل قيمة يمكن ان يخزنه الـ OCTET هي 00000000. 
لاحظ الشكل التالي للـ IP address:
00111111.00111011.00000000.00000000
الـ IP Address فعلياً هو عبارة عن قسمين هما:
1. الـ Network ID: هو جزء من الـ IP address يحدد الشبكة.
2. الـ Host ID: هو جزء من الـ IP address يحدد المضيف.
1.3.2 الـ Netmask
هي تقنية تسمح بتقسيم شبكة إلى مجموعة أصغر من شبكات. الـ subnet mask هو عبارة عن رقم يتكون من 4-byte من خلاله يمكن تحديد الشبكة التي ينتمي إليه الجهاز.
تم إنشاء الـ Subnet Mask عن طريق ضبط جميع بتاتHost  على جميع 0 وضبط جميع بتاتNetwork  على كل 1. بهذه الطريقة، يفصل الـ subnet mask عنوان IP إلى Network ID و Host ID. يمكن كتابة الـ IP address بأكثر من شكل:
192.168.0.1 /24
192.168.0.1 255.255.255.0
1.3.4 الـ Gateway
يتم استخدام الـ gateway عند إرسال البيانات. عندما يتم إرسال البيانات عبر شبكة، يتم فحص عنوان destination IP-Address. إذا كان عنوان destination IP-Address خارج الشبكة، فإن البيانات تنتقل إلى الـ gateway للإرسال خارج الشبكة. يجب أن يكون لعنوان gateway address نفس netmask. حيث:
• الـ gateway هي البوابة التي يتم استخدامها عند الاتصال بشبكات معرفة في الـ routing table.
• الـ default gateway هي البوابة الافتراضية التي يتم استخدامها عند الاتصال بشبكات غير معرفة في الـ routing table.

2. اتصالات شبكات لينكس
يمكن التحكم وإدارة كروت شبكة واتصالات الشبكة في لينكس بطريقتين هما Network-Scripts و NetworkManager. تعمل كل منهما على تهيئة وإدارة اتصالات الشبكة، ولكن بطرق مختلفة.
الـ network-scripts هو أداة تستخدم في أنظمة مثل CentOS وRHEL  وبعض التوزيعات الأخرى المستندة إلى نظام RHEL. تعتمد هذه الأداة على ملفات نصية الموجودة في المجلد /etc/sysconfig/network-scripts/ لتهيئة وإدارة إعدادات الشبكة.
الـ NetworkManager هو أداة أكثر حداثة ومستقلة عن النظام تستخدم في العديد من توزيعات Linux مثل Ubuntu وFedora ومشتقاتها. يعتبر NetworkManager أكثر سهولة وتوافقًا للمستخدمين الذين يرغبون في إدارة اتصالات الشبكة بشكل مبسط.
2.1 أداة network-scripts
الـ network-scripts هي أداة تستخدم في أنظمة التشغيل المبنية على نظام RHEL مثل CentOS وتهدف network-scripts إلى تسهيل إعداد وإدارة إعدادات الشبكة على النظام بشكل يدوي.
في النظام، توجد مجموعة من ملفات النصية في المجلد /etc/sysconfig/network-scripts/ وتستخدم لتكوين واجهات الشبكة المختلفة. هذه الملفات تحمل تسميات مثل ifcfg-eth0 و ifcfg-wlan0 وتتضمن مجموعة من المعلومات والإعدادات المتعلقة بالشبكة.
من خلال تحرير هذه الملفات، يمكن للمستخدمين تعيين عناوين IP و Gateway و Netmask وإعدادات أخرى لواجهات الشبكة المعنية. بالقيام بذلك، يتم تكوين الشبكة وتهيئتها وجعلها جاهزة للاستخدام.
من الجوانب المهمة لـ network-scripts هو أنها تسمح بمرونة كبيرة في تكوين الشبكة. يمكن للمستخدمين تعيين إعدادات مختلفة لكل واجهة شبكة وتكوين شبكات VLAN وتعيين عمليات تشغيل مختلفة للشبكة مثل الاتصال التلقائي عند بدء التشغيل.
ومع ذلك، يجب ملاحظة أن استخدام network-scripts قد يكون معقدًا بعض الشيء ويتطلب معرفة مسبقة بتهيئة الشبكة وتفاصيل الإعدادات. لذلك، قد يواجه المستخدمون الجدد صعوبة في التعامل معها.
يجب أيضًا ملاحظة أن network-scripts تم إعلانها على أنها تاريخية وتم تجاوزها بواسطة أدوات إدارة الشبكة الحديثة مثل NetworkManager. ومن ثم، في بعض التوزيعات الحديثة، قد لا تكون مثبتة افتراضيًا وقد يتعين على المستخدم تثبيتها بشكل صريح إذا كانوا يرغبون في استخدامها. فيما يلي سنقوم تثبيتها: 
# dnf install network-scripts
لنفترض أن لدينا نظام لينكس متصل بشبكة (عنوانها 192.168.1.0/24 والبوابة 192.168.1.1 وسيرفر DNS هو 192.168.1.2). وتكوين هذا الانترافيس موجود في ملف ifcfg-eth0/etc/sysconfig/network-scripts/. سيكون محتويات هذا الملف كما يلي:

1. DEVICE=eth1
2. TYPE=Ethernet
3. ONBOOT=yes
4. BOOTPROTO=static
5. IPADDR=192.168.1.10
6. NETMASK=255.255.255.0
7. GATEWAY=192.168.1.1
8. DNS1=192.168.1.2 
9. IPV6INIT=no
هنا تفسير لبعض الخطوط المهمة في المثال:
1. يحدد سطر الاول اسم الواجهة كـ eth1.
2. يحدد سطر الثاني نوع الواجهة كواجهة Ethernet.
3. سطر الثالث يشير إلى أن الواجهة يجب تفعيلها تلقائيًا عند بدء التشغيل.
4. سطر الرابع يشير إلى أن العنوان IP يجب تعيينه بشكل ثابت (ثابت) بدلاً من الحصول عليه بشكل ديناميكي.
5. سطر الخامس يحدد عنوان IP الثابت الذي سيتم تعيينه للواجهة eth1.
6. سطر السادس يحدد قناع الشبكة الذي يحدد النطاق الفعال للعنوان IP.
7. سطر السابع يحدد عنوان بوابة الشبكة (راوتر) الذي يستخدمه النظام للاتصال بشبكة خارجية.
8. سطر الثامن يحدد عناوين خوادم DNS التي سيستخدمها النظام لحل أسماء النطاقات.
9. سطر تاسع نشير الى عدم استخدام IPv6
لنفترض أن لدينا نظام لينكس متصل بشبكة (عنوانها 192.168.1.0/24 والبوابة 192.168.1.1 وسيرفر DNS هو 192.168.1.2). نريد وتكوين هذا الانترافيس موجود في ملف ifcfg-eth1/etc/sysconfig/network-scripts/. سيكون محتويات هذا الملف كما يلي:

DEVICE=eth2
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=dhcp
بعد حفظ التغييرات في الملف، يمكنك إعادة تشغيل واجهة الشبكة باستخدام الأمر التالي:
# sudo ifdown eth2
# sudo ifup eth2
2.2 الـ NetworkManager
يمكن تعريف NetworkManager على أنه خدمة الشبكة على مستوى النظام تدير وتتحكم في الملفات المسماة البروفايل (Profiles). يقوم الـبروفايل بإدارة والتحكم في اتصال الشبكة الفردية. يوفر NetworkManager واجهة رسومية أو سطر الأوامر لتكوين الشبكة بشكل مبسط. يمكن للمستخدمين إضافة وتعديل وحذف اتصالات الشبكة بكل سهولة دون الحاجة إلى التعديلات المباشرة على ملفات الإعداد.
يتم التفاعل والتعامل مع NetworkManager عادةً باستخدام أداة سطر الأوامر المسماة "nmcli". ويتم حفظ الملفات الخاصة بالـ "profiles" في المسار "/etc/sysconfig/network-scripts/".
يعتبر الـبروفايل جزءًا من NetworkManager ويحتوي على إعدادات وتكوينات تحكم في اتصال الشبكة الفردية، مثل عنوان IP و Gateway و DNS وغيرها. يمكن لـ NetworkManager تحميل وتنفيذ الـ "profile" المناسب لتكوين الاتصال بناءً على اكتشافات الشبكة والتغيرات في البيئة.
بالنسبة لأداة سطر الأوامر "nmcli"، فهي أداة قوية تسمح للمستخدمين بالتفاعل مع NetworkManager وإدارة الاتصالات الشبكية. يمكن استخدام "nmcli" لإنشاء وتعديل وحذف الـ "profiles" وتكوين اتصالات الشبكة وإجراءات أخرى ذات صلة.
يتم حفظ الملفات الخاصة بالـ "profiles" في المسار "/etc/sysconfig/network-scripts/" على أنظمة Linux التي تستخدم NetworkManager. تتضمن هذه الملفات معلومات التكوين الخاصة بكل اتصال شبكي، مما يسمح لـ NetworkManager بتحميل وتطبيق الإعدادات المناسبة على الواجهات الشبكية.

الصيغة الأساسية لأمر nmcli هي كما يلي:
# nmcli [ OPTIONS ] OBJECT { COMMAND | help }
تفسير العناصر في الصيغة:
 nmcli: هو اسم الأمر الذي يستخدم للتفاعل مع NetworkManager من خلال سطر الأوامر.
 OPTIONS: تشمل الخيارات الإضافية التي يمكن تحديدها مع الأمر. تتضمن الخيارات الشائعة تكوينات الإعداد والمؤشرات والتفاصيل الإضافية.
 OBJECT: يشير إلى الكائن الذي يتم التفاعل معه في NetworkManager. يمكن أن يكون الكائن واجهة الشبكة (مثل connection أو device) أو إعدادات الـ DNS (مثل dns) وما إلى ذلك.
 COMMAND: يشير إلى الإجراء الذي يتم تنفيذه على الكائن. يمكن أن يكون الإجراء إنشاء (add) أو حذف (delete) أو تعديل (modify) وغيرها من الإجراءات المتاحة.
 help: يستخدم لعرض مساعدة مفصلة حول الأمر nmcli والخيارات والكائنات المتاحة.
2.2.1 الكائنات (Objects)
يشير إلى الكائن الذي يتم التفاعل معه في NetworkManager. يمكن أن يكون الكائن واجهة الشبكة (مثل connection أو device) أو إعدادات الـ DNS (مثل dns) وما إلى ذلك.
1. الكائن Connection
يمثل واجهة الشبكة الفردية التي يتم التحكم بها وإدارتها عن طريق NetworkManager. يمكن إنشاء اتصالات Ethernet وWi-Fi  و VPN وغيرها باستخدام كائن connection. يمكن استخدام أمر nmcli لإنشاء وعرض وتحرير وحذف وتكوين إعدادات الاتصالات.
فيما يلي الصيغة العامة لأمر nmcli مع الكائن connection:
# nmcli connection COMMAND [action]
لإظهار جميع الاتصالات (Profiles)، استخدم الامر التالي:
# nmcli connection show
وسيكون المخرج مشابه لما يلي:

NAME                UUID                                  TYPE      DEVICE
ens33               39c9af00-8914-45a7-8258-0b84bc458cae  ethernet  ens33
Wired connection 1  35276676-7eee-39b3-a667-c2f4f1e7d7b8  ethernet  ens160

حيث:
• الـ NAME هي عبارة عن name profile.
• الـ UUID هي عبارة عن unique identification profile.
• الـ Type هي عبارة عن type connection.
• الـ Device هي عبارة عن name interface network.


لإظهار معلومات بروفايل محددة، استخدم الامر التالي:
# nmcli connection show UUID
على سبيل المثال، لاحظ الامر التالي:
# nmcli connection show 35276676-7eee-39b3-a667-c2f4f1e7d7b8  
وسيكون المخرج مشابه لما يلي:

connection.id:                          Wired connection 1
connection.uuid:                        5380576e-25e9-3819-b93d-e26e287db8f2
connection.stable-id:                   --
connection.type:                        802-3-ethernet
connection.interface-name:              ens160
connection.autoconnect:                 yes
connection.autoconnect-priority:        -999
connection.autoconnect-retries:         -1 (default)
connection.multi-connect:               0 (default)
connection.auth-retries:                -1
connection.timestamp:                   1663858901
connection.read-only:                   no
connection.permissions:                 --
connection.zone:                        --
connection.master:                      --
connection.slave-type:                  --
connection.autoconnect-slaves:          -1 (default)
connection.secondaries:                 --
connection.gateway-ping-timeout:        0
connection.metered:                     unknown
connection.lldp:                        default
connection.mdns:                        -1 (default)
connection.llmnr:                       -1 (default)
connection.wait-device-timeout:         -1
802-3-ethernet.port:                    --
802-3-ethernet.speed:                   0
802-3-ethernet.duplex:                  --
802-3-ethernet.auto-negotiate:          no
802-3-ethernet.mac-address:             --
802-3-ethernet.cloned-mac-address:      --
802-3-ethernet.generate-mac-address-mask:--
802-3-ethernet.mac-address-blacklist:   --
802-3-ethernet.mtu:                     auto
802-3-ethernet.s390-subchannels:        --
802-3-ethernet.s390-nettype:            --
802-3-ethernet.s390-options:            --
802-3-ethernet.wake-on-lan:             default
802-3-ethernet.wake-on-lan-password:    --
802-3-ethernet.accept-all-mac-addresses:-1 (default)
ipv4.method:                            auto
ipv4.dns:                               --
ipv4.dns-search:                        --
ipv4.dns-options:                       --
ipv4.dns-priority:                      0
ipv4.addresses:                         192.168.1.120/24
ipv4.gateway:                           192.168.1.1
ipv4.routes:                            --
ipv4.route-metric:                      -1
ipv4.route-table:                       0 (unspec)
ipv4.routing-rules:                     --
ipv4.ignore-auto-routes:                no
ipv4.ignore-auto-dns:                   no
ipv4.dhcp-client-id:                    --
ipv4.dhcp-iaid:                         --
ipv4.dhcp-timeout:                      0 (default)
ipv4.dhcp-send-hostname:                yes
ipv4.dhcp-hostname:                     --
ipv4.dhcp-fqdn:                         --
ipv4.dhcp-hostname-flags:               0x0 (none)
ipv4.never-default:                     no
ipv4.may-fail:                          yes

عرض البروفايل النشطة (active profiles). استخدم الامر التالي:
# nmcli connection show --active
لتشغيل بروفايل. استخدم الامر التالي:
# nmcli connection up profile-name
لإيقاف بروفايل. استخدم الامر التالي:
# nmcli connection up profile-name
لإنشاء بروفايل، استخدم الامر التالي:
# nmcli connection add con-name profile-name ifname interface-name type type-connection 
بشكل افتراضي البروفايل يستخدم الـ DHCP لتعيين الـ IP-Address. لإعطاء IP-Address بشكل يدوي للبروفايل، استخدم الامر التالي:
# nmcli connection modify profile-name ipv4.method manual
لتعيين الـ IP-Address بشكل يدوي للبروفايل، استخدم الامر التالي:
# nmcli connection modify profile-name ip4 IP-address/netmask gw4 gateway-address
لتعيين الـ DNS-Address بشكل يدوي للبروفايل، استخدم الامر التالي:
# nmcli connection modify profile-name ipv4.dns dns-address

لتفعيل خاصية التشغيل التلقائي للبروفايل، استخدم الامر التالي:
# nmcli connection modify profile-name autoconnect yes/no
لتغير type-connection للبروفايل، استخدم الامر التالي:
# nmcli connection modify profile-name type type-connection
لحذف بروفايل، استخدم الامر التالي:
# nmcli connection del profile-name
ملاحظة
• يجب ربط البروفايل مع انترافيس، ولا يمكن تشغيل أكثر من بروفايل على نفس الانترافيس.
• لفحص هل يوجد ارتباط فيزيائي مع الانترافيس استخدام الأداة ethtool.
2. الكائن Device
يمثل الجهاز الفعلي المستخدم للاتصال بالشبكة، مثل بطاقة الشبكة المتصلة بالكمبيوتر أو واجهة Wi-Fi. يمكن استخدام كائن device  في NetworkManager لإدارة تكوينات الجهاز ومراقبته. يمكن استخدام nmcli لعرض وتكوين إعدادات الجهاز وإجراءات الاتصال المتعلقة به.
عرض الأجهزة التي يتعرف عليها NetworkManager. استخدم الامر التالي:
# nmcli device 
وسيكون المخرج مشابه لما يلي:

DEVICE  TYPE      STATE                                  CONNECTION
ens33   ethernet  connected                              ens33
lo      loopback  unmanaged                              --


3. تشخيص مشكلات الشبكة (Troubleshoot Network)
صيانة شبكة النظام هي مهمة مسؤول النظام/الشبكة. تتضمن مهمتهم تكوين الشبكة واستكشاف الأخطاء وإصلاحها. في حالة حدوث مشكلة في شبكة تأكد دائماً:
• التأكد من الاتصال الفعلي (Physical Connected).
• التأكد من تشغيل خادم الشبكة (Interface Network Server UP).
• التأكد من تشغيل مفتاح الشبكة (Interface Network Switch UP).
• التحقق من عنوان IP (IP-Address).
• التحقق من قناع الشبكة (Netmask).
• التحقق من البوابة الافتراضية (gateway).
• التحقق من جدول توجيه (IP Route Table).
• التحقق من البورت (Port).

3.1 أوامر تشخيص
فيما يلي قائمة الأدوات الشبكات واستكشاف الأخطاء وإصلاحها:
3.1.1 الاداة ping
الامر ping يساعد في تحديد مدى توفر الشبكة والمضيف. يتحقق مما إذا كان المضيف يمكن الوصول إليه أو إذا كانت الخدمة قيد التشغيل. يمكنك أيضًا التحقق من مشكلات الاتصال بالشبكة مثل وقت الاستجابة العالي وإسقاط الحزمة.
يرسل الامر ping رسائل تسمى بـ echo request messages باستخدام البرتوكول ICMP وينتظر رد عليها برسائل تسمى بـ       echo reply packets. يحتوي الإخراج على إجمالي الرسائل المرسلة والمستلمة مع الوقت الذي تستغرقه الحزمة للوصول إلى وجهتها.
فيما يلي مثال:
# ping 8.8.8.8
3.1.2 الاداة netstat
netstat عبارة عن أداة مساعدة لـ command-line تساعد في اكتشاف منافذ توصيل المتصلة والاستماع إليها. يعرض معلومات حول routing tables و listening ports وinformation statistics. 
يمكنك سرد كل من الاتصالات المستمعة والمغلقة عن طريق كتابة:
# netstat -a
لسرد الـ  listening TCP connectionsفقط:
# netstat -tl
كما يسمح لك بإدراج الـ PID للعمليات وأسماء البرامج التي تستخدم TCP:
# netstat -ptl
3.1.3 الاداة route
يتم استخدام أمر route لعرض وإجراء التغييرات على kernel routing table. يؤدي تشغيل الامر route بدون أي خيارات إلى عرض routing table entries:
# route 
لعرض العناوين الرقمية بدلاً من محاولة تحديد أسماء symbolic hostnames. استخدام الامر التالي:
# route -n
3.1.3 الاداةTelnet 
الـ Telnet هي أداة يمكن استخدامها لفتح الـ command line على كمبيوتر بعيد، عادةً ما يكون سيرفر. يمكنك أيضًا استخدامه للتحقق مما إذا كان بورت معين مفتوحًا.
الـ Telnet هو نظام لفتح text-based connection بين جهازي كمبيوتر. بشكل افتراضي، يتصل Telnet بالكمبيوتر الذي تتصل به على المنفذ 23. يستخدم بروتوكول TELNET. ومع ذلك، فإن هذا البروتوكول به بعض العيوب الأمنية، ولكنه أحد أكثر بروتوكولات الشبكات استخدامًا نظرًا لبساطته. إنه ليس بروتوكولًا آمنًا لأنه ينقل البيانات في شكل غير مشفر. غالبًا ما يفضل المستخدم الـ ssh لأن ssh ينقل البيانات في شكل مشفر.
الـ Telnet تشبه هذه الأداة المساعدة ميزة Remote Desktop في Windows. يكون بناء جملة telnet كما يلي:
# telnet hostname/IP address
الأوامر:
لإنشاء اتصال بين نظامين بواسطة أمر telnet قم بتنفيذ الأمر telnet متبوعًا باسم المضيف.
# telnet [host]
على سبيل المثال، نحن نربط نظامنا بالمضيف المحلي. نفّذ الأمر كما يلي:
# telnet locahost
على سبيل المثال، نحن نربط نظامنا بالمضيف بعيد. نفّذ الأمر كما يلي:
# telnet 10.10.10.10
الان نخن نقف على الـ command line في كمبيوتر بعيد. للخروج من أمر telnet، قم بتنفيذ أمر:
# logout

4. الأداة ifconfig
اختصار لـ interface configuration، هي أداة تستخدم في إدارة شبكات الحاسوب. تتيح لنا ifconfig القيام بالوظائف التالية:
 تهيئة وتكوين الواجهة (interface).
 الاستعلام عن معلومات الواجهة. 
 تمكين أو تعطيل الواجهة.
 تعيين عنوان IP وقناع الشبكة (netmask) للواجهة.
 عرض المعلومات التالية:
o جميع الواجهات المتاحة.
o عناوين IP.
o عناوين MAC.
o قيمة MTU للواجهات النشطة.

مع العلم أن التكوينات التي تم تعيينها باستخدام الأداة ifconfig ليست ثابتة، وبعد إعادة تشغيل النظام، يتم فقد جميع التغييرات المُجراة. يُمكن تكوين واجهة الشبكة فقط بواسطة المستخدم الجذر (root) أو المستخدمين الذين يمتلكون امتيازات sudo.
تشغيل الأمر ifconfig بدون وسيطات، مثل هذا:
# ifconfig 
سيظهر هذا الامر كافة الانترافيس النشطة و الـ IP addresses لها وكذلك سيعرض MAC addresses و MTU لها. الإخراج مشابهًا لما يلي:

eth0      Link encap:Ethernet  HWaddr 09:00:12:90:e3:e5  
         inet addr:192.168.1.29 Bcast:192.168.1.255  Mask:255.255.255.0
         inet6 addr: fe80::a00:27ff:fe70:e3f5/64 Scope:Link
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:54071 errors:1 dropped:0 overruns:0 frame:0
         TX packets:48515 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000 
         RX bytes:22009423 (20.9 MiB)  TX bytes:25690847 (24.5 MiB)
         Interrupt:10 Base address:0xd020 
lo        Link encap:Local Loopback  
         inet addr:127.0.0.1  Mask:255.0.0.0
         inet6 addr: ::1/128 Scope:Host
         UP LOOPBACK RUNNING  MTU:16436  Metric:1
         RX packets:83 errors:0 dropped:0 overruns:0 frame:0
         TX packets:83 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:0 
         RX bytes:7766 (7.5 KiB)  TX bytes:7766 (7.5 KiB)
wlan0     Link encap:Ethernet  HWaddr 58:a2:c2:93:27:36  
         inet addr:192.168.1.64  Bcast:192.168.2.255  Mask:255.255.255.0
         inet6 addr: fe80::6aa3:c4ff:fe93:4746/64 Scope:Link
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:436968 errors:0 dropped:0 overruns:0 frame:0
         TX packets:364103 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000 
         RX bytes:115886055 (110.5 MiB)  TX bytes:83286188 (79.4 MiB)

4.1 خيارات الاداة
4.1.1 عرض تفاصيل جميع الانترافيسس:
إذا كنت ترغب في عرض تكوين جميع الانترافيس الشبكة على النظام (وليس فقط الانترافيسس النشطة حاليًا) ، فيمكنك تحديد الامر التالي:
# ifconfig -a
4.1.2 عرض تفاصيل انترافيس محددة:
لإظهار تفاصيل خاصة بانترافيس محددة دون غيرها، نستخدم الامر التالي:
# ifconfig interface-name
على سبيل المثال:
# ifconfig eth0
4.1.3 تمكين أو تعطيل انترافيس معينة:
عندما تكون الانترافيس نشطة، يمكنها إرسال واستقبال البيانات؛ عندما تكون غير نشطة، لا يمكنه الإرسال أو الاستقبال. يمكنك استخدام ifconfig لتغيير حالة الانترافيس من غير نشطة إلى نشطة، أو العكس.

لتنشيط انترافيس غير نشطة، استخدام الامر التالي:
# ifconfig up interface-name
لإلغاء تنشيط انترافيس نشطة، استخدام الامر التالي:
# ifconfig down interface-name



الفصل التاسع// إدارة عمليات لينكس (Linux Process Management)
في نظام التشغيل، هناك العديد من البرامج التي يتم تحميلها على RAM. يمكن تشغيل هذه البرامج بواسطة نظام التشغيل نفسه أو بواسطة مستخدم، وتسمى هذه البرامج بـ Processes. العملية (Process) عبارة عن برنامج قيد التنفيذ. يُطلق على ضبط العملية أو التحكم فيها بـ Process Management.
ملاحظة
الـبرنامج (Program) هي مجموعة من تعليمات البرمجية مخزنة في source code. بينما الـ Process هي الـبرنامج الذي يكون قيد التنفيذ. ويتم منح كل Process رقم تعريفي يسمى PID.
عادةً ما يكون للـ Process دورة حياة ويتم إنهاؤها من تلقاء نفسها عند اكتمالها أو عندما ننهيها يدويًا. ولكن في بعض الأحيان قد نحتاج إلى إيقاف الـ Process يدويًا بسبب خطأ في Process Scheduling أو بسبب استهلاك الكثير من RAM أو CPU؛ لإنقاذ أجهزتنا من قطع الاتصال غير المتوقع.
1. أنواع العلميات (Types Process)
هناك خمسة أنواع من العمليات في لينكس وهي:
1.1 الـ Parent Process
وهي الـ Process التي تنشئ Child Process. جميع الـ Processes لها Parent Process. إذا تم إنشاء الـ Process مباشرة من قبل المستخدم، فستكون الـ Parent Process هي kernel Process.
قد يكون لأكثر Child Process نفس الـ Parent Process، ولكن Child Process تكون دائماً تابعة لـ Parent Process واحدة فقط.
على سبيل المثال، قام المستخدم بتشغيل sell، ومن خلال sell قام مستخدم بتشغيل nano. الشكل التالي يوضح تسلسل هذه الـ Processes.

 

 


الـ kernel Process هي أول عملية تتم على النظام، ويكون لـ PID لها يساوي 0. أول Process تعمل على نظام بعد الـ kernel Process  هي:
 في الأنظمة الحديثة (أكبر من RHEL 7) هي systemd ويكون لـ PID يساوي 1. 
 في الأنظمة القديمة (الأقل من RHEL 6) هي init ويكون لـ PID يساوي 1.
وظيفة الـ systemd أو init هي تشغيل باقي Processes المتعلقة بالخدمات مفعلة على النظام.
1.2 الـ Child Process
وهي الـ Process التي تم إنشاؤها بواسطة الـ Process أخرى. المهم معرفته أن جميع الـ Processes لها Parent Process ما عدا الـkernel Process .
1.3 الـ Orphan process
في بعض الأحيان قد يتم إعدام parent process قبل إنهاء الـ child process الخاصة بها، عندها تصبح child process هي Orphan process. ومع ذلك، سرعان ما يتم تبني الـ Orphan process من خلال systemd process، بمجرد أن تموت الـ parent process.
لاحظ الشكل التالي:

 

 

 

1.4 الـ Zombie process
وهي العمليات التي ماتت بالفعل ولكنها تظهر في  process statusتسمى Zombie process. ويكون لها استهلاك صفري لوحدة CPU.
1.5 الـ Daemon process
هي العمليات المتعلقة بالنظام والتي تعمل في الخلفية. يمكن التعرف على الـ Daemon process إذا كانت تحتوي على "؟" في حقل TTY الخاص بها.

 

 

 

 

 

2. أوامر التعامل مع العلميات
2.1 عرض العلميات التي تعمل
الأمر ps 
يتم استخدام الامر ps لعرض كل الـ Processes التي تم تنفيذها من خلال الترمينال الحالية فقط. كما يلي:
# ps 
وسيكون المخرج مشبه لما يلي:

  PID  TTY       TIME      COMMAND
  2758 pts/1     00:00:00   bash
  3047 pts/1     00:00:00   ps

المخرج يخربنا أنه يوجد فقط عمليتين تم تشغيلهم من هذه الترمينال وهي bash sell والأمر ps.
لعرض كل الـ Processes التي تم تنفيذها من أي terminal، استخدام الامر التالي:
# ps a 
وسيكون المخرج مشبه لما يلي:

  PID  TTY      STAT   TIME  COMMAND
  1732 tty1     Ss     0:01  -bash
  1833 tty1     S      0:00  su -
  1837 tty1     S      0:00  -bash
  1899 pts/0    Ss     0:01  -bash
  2758 pts/1    Ss     0:00  -bash
  3052 tty1     S+     0:00  ping 8.8.8.8
  3053 pts/1    R+     0:00  ps a

المخرج يخربنا أنه يوجد ثلاث من الـترمينال (وهم tty1 و pts/0 و pts/1). وكذلك يوضح لنا العمليات لكل ترمينال.
المزيد من تفاصيل عن الـ Processes، استخدام الامر التالي: 
# ps aux 
يمكن تفسير كل حرف في aux، كما يلي:
 a: لعرض العمليات لجميع المستخدمين
 u: لعرض معلومات مفصلة حول كل من العمليات.
 x: قم بتضمين العمليات التي لا يتحكم فيها المستخدمون (أي التي يتم تحكم بها بواسطة daemons).

 

وسيكون المخرج (جزء من المخرج) من الامر ps aux مشبه لما يلي:

USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           2  0.0  0.0      0     0 ?        S    09:28   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<   09:28   0:00 [rcu_gp]
root           4  0.0  0.0      0     0 ?        I<   09:28   0:00 [rcu_par_gp]
root           6  0.0  0.0      0     0 ?        I<   09:28   0:00 [kworker/0:0H-
root           9  0.0  0.0      0     0 ?        I<   09:28   0:00 [mm_percpu_wq]
root          10  0.0  0.0      0     0 ?        S    09:28   0:00 [ksoftirqd/0]
root          11  0.0  0.0      0     0 ?        I    09:28   0:09 [rcu_sched]
chrony      1035  0.0  0.1 128772  3488 ?        S    09:29   0:00 /usr/sbin/chronyd
centos      1732  0.0  0.2  24256  4172 tty1     Ss   09:30   0:01 –bash
لاحظ أنه يتم عرض تفاصيل العمليات على شكل اعمدة. وهي كما يلي:
• العمود الاول يمثل الـ ) UIDتحدد المستخدم الذي قام بتشغيل العملية).
• العمود الثاني يمثل الـ) PID تحدد الرقم التعريفي للعملية).
• العمود الثالث يمثل الـ  CPU utilization of process(تحدد نسبة استخدم هذه العملية للمعالج).
• العمود الرابع يمثل  Mummery utilization of process(تحدد نسبة استخدم هذه العملية للذاكرة).
• العمود الخامس والسادس؛ ليس مهم الان. 
• العمود السابع يمثل الـTTY  (تحدد الترمينال التي قامت بتشغيل العملية).
• العمود الثامن يمثل الـ Status (تحدد حالة العملية في الوقت الحالي).
• العمود التاسع يمثل الـTime Start  (تحدد وقت بدء هذه العملية).
• العمود العاشر يمثل الـTime Use CPU  (تحدد الوقت المستخدم لتنفيذ هذه العملية في CPU).
• العمود الحادي عشر يمثل الـCommand  (تحدد الامر التي قام بتشغيل العملية).
لعرض العمليات التي تعمل في الخلفية فقط استخدام الخيار –f. كما يلي:
# ps -f 
وسيكون المخرج من الامر ps -f مشبه لما يلي:


لاحظ أنه يتم عرض تفاصيل العمليات على شكل اعمدة. وهي كما يلي:
• العمود الاول يمثل الـ ) UIDتحدد المستخدم الذي قام بتشغيل العملية).
• العمود الثاني يمثل الـ) PID تحدد الرقم التعريفي للعملية).
• العمود الثالث يمثل الـ PPID  (تحدد الرقم التعريفي للـ Parent Process).
• العمود الرابع .
• العمود الخامس يمثل الـTime Start  (تحدد وقت بدء هذه العملية).
• العمود السادس يمثل الـTTY  (تحدد الترمينال التي قامت بتشغيل العملية).
• العمود السابع يمثل الـTime Use CPU  (تحدد الوقت المستخدم لتنفيذ هذه العملية في CPU).
• العمود الثامن يمثل الـCommand  (تحدد الامر التي قام بتشغيل العملية).


لمعرفة المزيد من المعلومات حول العملية (يظهر background process و foreground process)، استخدم الخيار –e. كما يلي:
# ps -e 
وسيكون المخرج من الامر ps -e مشبه لما يلي:

 


ملاحظة:
إذا كانت قيمة العمود TTY هي ? فهذا يعني ان النظام (Process Kernel) هو من قام بتشغيل هذه العلمية. على سبيل المثال، الذي يقوم بتشغيل Process Systemd هي Process Kernel.
الامر pgrep 
يعد أمر pgrep طريقة أكثر تعقيدًا لإيجاد عملية. سيعيد هذا الأمر العمليات بناءً على معايير اختيار محددة، والتي تُعرف بـ pattern. الـ  patternعبارة عن regular expression.
بشكل بسيط، قم بتمرير اسم العملية (سيتم اعتبارها pattern ) مع الامر pgrep وسيعود بـ PID. على سبيل المثال:
# pgrep nano 
ملاحظة
اهم معلومتين على الـ process هي PID و PPID.
الامر top 
يمكنك استخدام الاوامر top أو htop لعرض العمليات النشطة والمزيد عن معلومات عنها ومعلومات النظام الأخرى. على سبيل المثال:
# top 
وسيكون المخرج من الامر top مشبه لما يلي:
الامر jobs 
يمكنك استخدام الاوامر jobs لسرد العمليات التي تقوم بتشغيلها في الخلفية وفي المقدمة. إذا تم إرجاع المطالبة بدون معلومات، فلا توجد عمليات. هذا الأمر متاح فقط في csh و bash و tcsh و ksh.
الامر pstree 
يمكنك استخدام الاوامر pstree لسرد العمليات الجارية التي قام بتشغيلها المستخدم الحالي على شكل شجرة. يمكن تثبيته باستخدام حزمة psmisc. يمكنك استخدام الخيار p لعرض شجرة العمليات مع PIDs.

 

قتل العمليات (kills process)
إذا أصبحت العملية (process) لا تستجيب أو تستهلك الكثير من الموارد، فقد تحتاج إلى القضاء عليها. معظم الـ processes لها طرقها الخاصة في الإغلاق. لسوء الحظ، يمكن أن تتعطل الـ processes ولا تسمح لنفسها بالإغلاق. إذا كانت الـ process الجارية في الخلفية لا تستجيب، يصبح من الضروري استخدام أمر لإيقافها.
ملاحظة
قبل إنهاء العملية، عليك التفكير في الأذونات. حيث يمكن للـ root user قتل جميع العمليات.
تؤدي عملية الـkills process  إلى termination signal إلى العملية المحددة. الـ termination signal وهي عبارة عن إشارة يتم إرسالها الى العملية المحددة ليتم انهاءها. هناك أنواع متعددة من termination signal. ويمكن إظهار جميع هذه الأنواع المتاحة من خلال الأمر التالي:
# kill -l

لكل termination signal يوجد رقم تعريفي لها. وفيما يلي أشهر أنواع الـ termination signal:
 الـSIGKILL : اختصار لـ Signal Kill، تقوم بقتل العملية بشكل فوري. ويكون لها رقم تعريفي يساوي 9.
 الـSIGTERM : اختصار لـ Signal Terminate، تحاول قتل العملية بطريقة ألطف. ويكون لها رقم تعريفي يساوي 15.
بالنسبة لمعظم الأغراض، ستكون SIGKILL هي الطريقة الأسرع والأكثر فعالية لإنهاء العملية؛ ولكن قد تؤذي إلى خطأ فادح إذا كانت هذه العملية مهمة أو يتبع لها عمليات اخرى.
الامر kill
يمكن استخدام الامر kill لقتل العملية من خلال رقم PID:
# kill PID
بشكل افتراضي، يقوم هذه الأمر بإرسال اشارة SIGTERM إلى العملية؛ يحاول من خلال هذه الإشارة قتل العملية بشكل ناعم دون حدوث خطأ.
يمكن تحديد نوع الإشارة مع الأمر kill. فيما يلي صيغة العامة لذلك:
# kill –SginalNumber PID
أو
# kill –s SignalName PID
على سبيل المثال، إذا كان لدينا عملية لها PID يساوي 1050وأردنا قتلها باستخدام اشارة SIGKILL، فسنقوم باستخدام الامر التالي:
# kill –9  1050
ملاحظة
• إذا قمت بعمل kill للـ Background Process وكانت عبارة عن Parent Process، فسيتم تعين الـ PPID للـ Child Processes على أنها  1(أي هو systemd). 
• إذا قمت بعمل kill للـ Foreground Process وكانت عبارة عن Parent Process، فسيتم أيضاً عمل Kill للـ Child Processes.
الامر pkill
يمكن استخدام الامرpkill  لقتل العملية من خلال اسمها:
# pkill –SginalNumber ProcessName
أو
# pkill –s SignalName ProcessName
لكن المشكلة أن قتل العمليات من خلال الاسم قد يؤذي إلى نتيجة غير متوقعة؛ بمعنى إذا كان هناك أكثر من عملية قيد تنفيذ لنفس البرنامج فسيؤذي ذلك إلى قتل جميع العمليات الخاصة بهذا البرنامج.
الامر killall
أمر killall هو أسهل تقنية لقتل عمليات الخاص ببرنامج. لقتل البرنامج، قم بتنفيذ الأمر على النحو التالي:
# killall –SginalNumber ProcessName
الـ Background & Foreground Process
في مصطلحات الحوسبة، نعرف الـ background process على أنها أي عملية لا تتفاعل مع المستخدم. تعمل الـ background process بشكل مستقل عن المهام الأخرى ولا تتطلب منا القيام بأي شيء. 
عند بدء تشغيل الـ background process من خلال ترمينال، ستكون نفس الـترمينال متاحة على الفور لتنفيذ أوامر أخرى. في المقابل، عند بدء تشغيل الـ foreground process من خلال ترمينال سيتم تخصيص التحكم بالكامل لهذه العملية، ولن يكون من الممكن تشغيل أي أمر آخر في تلك الـترمينال حتى تكتمل foreground process.
في بعض الحالات، نريد نقل هذه العمليات إلى الخلفية أو استئناف العملية أو الايقاف المؤقت للعملية، وهذا الموضوع الذي سنتحدث عليها
ملاحظة
إذا كانت العملية تعمل كـ background process فتسمى ) demonأو قد يطلق عليها تسمى Service). يكون قيمة الحقل TTY تساوي على "؟".
الامر bg 
يتم استخدام الأمر bg لاستئناف العمليات المعلقة مع إبقائها قيد التشغيل في الخلفية. فيما يلي صيغة العامة للأمر:
# bg               //bg: background
ملاحظة:
• الاختصار ctrl + c يعني اقتل العملية فوراً.
• الاختصار ctrl + q يعني اوقف العملية.
• الاختصار ctrl + z يعني اوقف العملية بشكل مؤقت، وهنا يتم استخدام الاشارة SIGTSTP.
الامر fg Command 
يتم استخدام الامر fg لاستئناف العمليات المعلقة مع إبقائها قيد التشغيل في الواجهة. كما يلي:
# fg              //fg: foreground
حالة العلميات (Status Process)
في لينكس، العملية هي مثيل لتنفيذ برنامج أو أمر. أثناء وجود هذه العمليات، ستكون في إحدى الحالات الخمس المحتملة:
• الـ Running or Runnable
• الـ Uninterruptible Sleep
• الـ Interruptible Sleep
• الـ Stopped
• الـ Zombie
لتصور دورة حياة العملية، يمكننا نمذجة من خلال الشكل التالي:

 

 

 

 

 

 

 

 

 

 

 

 

 


بالنسبة لأي عملية من عمليات لينكس، فإن نقطة البداية هي لحظة إنشائها. بمجرد أن تبدأ، تنتقل العملية إلى state running أو runnable state؛ الذي يحدد ذلك هو الـ kernel scheduler. حيث:
 الـ runnable process هي العملية التي تنتظر وقت CPU فقط، وهي جاهزة للتنفيذ.
 الـ running process هي العملية التي قيد تنفيذ في CPU.
يشكل الـ kernel scheduler جوهر multitasking في لينكس، حيث يستخدم الـ priority-based scheduling algorithm للاختيار بين الـ runnable processes في النظام.
تقوم خوارزمية الـ priority-based scheduling algorithm تصنيف الـ Processes بناءً على الأكثر  الأولوية، يوجد الكثير من العوامل التي تحدد الـ من اشهرها: 
 الـ nice value 
 الـ real-time priority
وسنتطرق إلى الـ Priority Process في الموضوع التالي.
عندما تكون الـ Process في حالة  running stateيمكن أن يتطلب منها انتظار موارد أو إشارات معينة قبل المتابعة. أثناء انتظار الموارد، ستتخلى هذه الـ Process طوعياً عن الـ CPU. ثم تنتقل إلى حالةsleeping state . حيث:
الـ sleeping process وهي العملية التي تنتظر الحصول على أحد موارد النظام أو تنتظر وقوع حدث معين (مثل انتهاء عملية اخرى لأخذ نتائجها). 
فعلياً الـ sleeping stateتنقسم لنوعين هما:
 الـuninterruptible sleep state : وفيها تتجاهل العملية الـ signal وتنتظر فقط إرسال wake-up call لتنقل من حالة sleeping إلى حالة أخرى.
 الـinterruptible sleep state : تنتظر العملية signal أو wake-up call لتنقل من حالة sleeping إلى حالة أخرى.
أحد الأمثلة الشائعة على الـuninterruptible sleep state  هو إنشاء مجلد باستخدام mkdir، والذي لا يدخل إلا في وضع الـuninterruptible sleep state. لاحظ الشكل التالي:

 

 

 

 

ملاحظة:
والذي يرسل الـ signal هو user. والذي يرسل الـ wake-up call هي parent call.
يمكننا تعليق الـ running process ووضعها في حالة stopped state؛ عن طريق إرسال إشارة SIGSTOP (أو SIGTSTP) إليها. ستستمر الـ stopped process في هذه الحالة حتى يتم إيقافها أو استئنافها باستخدام SIGCONT.
أخيرًا، تكمل العملية دورة حياتها عندما يتم إنهاؤها ووضعها في حالة zombie state وعندها ترسل إشارة SIGCHLD إلى الـ parent process لتقوم بإزالتها من process table.
الـ Checking Process State
هناك عدة طرق للتحقق من حالة العمليات في لينكس. وفيما يلي أشهرها:
الـ Displaying Process State Using ps
لعرض حالة العملية باستخدام ps، فلنقم بتشغيل الامر التالي:
# ps a
وسيكون المخرج مشابه لما يلي:

PID     TTY      STAT   TIME   COMMAND
2234    tty2     Ssl+   0:00   /usr/lib/gdm3/gdm-x-session 
2237    tty2     Rl+    0:07   /usr/lib/xorg/Xorg vt2 
2287    tty2     Sl+    0:00   /usr/libexec/gnome-session-binary
2982    pts/0    Ss     0:00    bash
3467    pts/0    R+     0:00    ps a

يمكن اضافة مزايد من المعلومات (الاعمدة) مع الامر ps من خلال اضافة خيارات مثل %c و %g و u% والخ.
الـ Displaying Process State Using top
لعرض تفاصيل العملية في الوقت الفعلي استخدام top، كذلك سيعرض بعص تفاصيل الاخر الخاصة بنظام مثل الذاكرة واستخدام CPU للعمليات الفردية. فلنقم بتشغيل الامر التالي:
# top 
وسيكون المخرج مشابه لما يلي:

   PID USER  PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                                                                                             
  2237 bob   20   0  252252  81740  49204 S   2.3   2.0   0:09.37 Xorg                                                                                                                                
  2519 bob   20   0 3428664 375256 125080 S   2.0   9.3   0:19.57 gnome-shell                                                                                                                         
  2909 bob   20   0  966852  49944  37308 S   1.0   1.2   0:02.28 gnome-terminal-                                                                                                                     
     1 root  20   0  103500  13312   8620 S   0.7   0.3   0:04.44 systemd                                                                                                                                                                                                                                                     
  3588 bob   20   0   20600   3936   3380 R   0.3   0.1   0:00.01 top                                                                                                                                 
     2 root  20   0       0      0      0 S   0.0   0.0   0:00.00 kthreadd                                                                                                                            
     3 root   0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp

وفيما يلي اختصار لرموز الحالات:
 D    uninterruptible sleep (usually IO)
 I    Idle kernel thread
 R    running or runnable (on run queue)
 S    interruptible sleep (waiting for an event to complete)
 T    stopped by job control signal
 t    stopped by debugger during the tracing
 W    paging (not valid since the 2.6.xx kernel)
 X    dead (should never be seen)
 Z    defunct ("zombie") process, terminated but not reaped by its parent

جنباً إلى ذلك قد يتم استخدام رموز اضافية وهي:
 <    high-priority (not nice to other users)
 N    low-priority (nice to other users)
 L    has pages locked into memory (for real-time and custom IO)
 s    is a session leader
 l    is multi-threaded (using CLONE_THREAD, like NPTL p threads do)
 +    is in the foreground process group
أولوية العلميات (Priority Process) 
بالنسبة لأي عملية من عمليات لينكس، فإن نقطة البداية هي لحظة إنشائها. بمجرد أن تبدأ، تنتقل العملية إلى state running أو runnable state؛ الذي يحدد ذلك هو الـ kernel scheduler. 
يشكل الـ kernel scheduler جوهر multitasking في لينكس، حيث يستخدم الـ priority-based scheduling algorithm للاختيار بين الـ runnable processes في النظام.
تقوم خوارزمية الـ priority-based scheduling algorithm تصنيف الـ Processes بناءً على الأكثر  الأولوية؛ حيث سيتم تنفيذ العمليات ذات الأولوية الأعلى قبل العمليات ذات الأولوية الأقل، بينما تتم جدولة العمليات التي لها نفس الأولوية واحدة تلو التالية، بشكل متكرر.
هناك 140 أولوية ونطاقين متميزين للأولوية تم تنفيذهما في لينكس.
 الأول هو الـ nice value تتراوح من -20 (أعلى قيمة أولوية) إلى 19 (أدنى قيمة أولوية) والقيمة الافتراضية هي 0.
 الثانية هي real-time priority، والتي تتراوح من 1 إلى 99 افتراضيًا، ثم 100 إلى 139 مخصصة لمساحة المستخدم.
ملاحظة
 كلما زادت الاولوية تزيد سرعة تنفيذ العملية بوسطة النظام.
 العلاقة بين قيمة nice value وقيمة priority value هي علاقة عكسية.
 قيمة nice value الافتراضية للعمليات التي بدأها مستخدم عادي هي 0.
إحدى السمات المهمة لنظام لينكس هي dynamic priority-based scheduling، والتي تسمح بتغيير nice value للعمليات (زيادتها أو تقليلها) اعتمادًا على احتياجاتك، كما سنرى لاحقًا.
يمكنك استخدام الاوامر top أو htop لعرض nice value للعمليات. من المخرجات أوامر top و htop أعلاه، ستلاحظ وجود.
 الـ NI: هي nice value، وهي التي يمكن للمستخدم التحكم بأولوية العلمية.
 الـ RP: هي الأولوية الفعلية للعملية، كما تراه Kernel Linux.
في لينكس، يتم استخدام الأمرين nice و renice لتغيير أولوية العملية. حيث:
 يقوم الأمر nice بتهيئة أولوية عملية لينكس قبل أن تبدأ. بمجرد البدء، لا يمكنك تغيير الأولوية باستخدام الأمر nice.
 يقوم الأمر renice بتغير الأولوية لعملية قيد التشغيل بالفعل.
فيما يلي الصيغة العامة للأمر nice:
# nice –n nice_value command

على سبيل المثال، لاحظ الامر التالي:
# nice –n 5 yum install tree
فيما يلي الصيغة العامة للأمر renice:
# renice –n nice_value process_name
أو
# renice –n nice_value –p PUUID
على سبيل المثال، لاحظ الامر التالي:
# nice –n 10 –p 1620


الفصل العاشر// عملية الاقلاع لينكس (Linux Boot Process)
في كل مرة تقوم فيها بتشغيل جهاز حاسوب يعمل بنظام لينكس، فإنه يمر بسلسلة من المراحل قبل عرض شاشة تسجيل الدخول التي تطالب باسم المستخدم أو كلمة المرور الخاصة بك. هناك 4 مراحل متميزة يمر بها كل توزيعات لينكس في عملي الإقلاع (booting process) وهي:
 تشغيل BIOS
 تحميل Boot Loader
 تهيئة النواة (Kernel Initialization)
 بدء systemd
1. مراحل عملية الإقلاع (Boot Process)
1.1 تشغيل الـ BIOS
عند بدء تشغيل جهاز، أول شيء يتم تشغيله هو BIOS (اختصار لـ Basic Input/Output System) المخزن على firmware على اللوحة الام.  يقوم الـ BIOS بإجراء عدة عمليات، بما في ذلك:
1.1.1 عملية الـ POST
اختصار لـ Power On Self-Test. يتم في هذه العملية بما يلي:
 اختبار الذاكرة (Memory Test): يتم اختبار الذاكرة العشوائية (RAM) للتأكد من سلامتها وقدرتها على العمل بشكل صحيح. يتم فحص الذاكرة للتحقق من عدم وجود أخطاء فيها، مثل البتات المعطوبة.
 اختبار الأجهزة (Hardware Test): يتم اختبار الأجهزة المتصلة بالنظام، مثل المعالج (CPU) وبطاقة الرسومات (Graphics Card) ووحدة التخزين (Storage) وغيرها، للتحقق من سلامتها ووجود أي مشاكل.
إذا تم اكتشاف أي مشكلة في أي جزء من الأجهزة أو المكونات، قد تظهر رسالة خطأ على الشاشة تطلب من المستخدم التدخل. في بعض الحالات، يمكن أن يتم إصدار صوت صفير للإشارة إلى وجود مشكلة، على سبيل المثال في حالة عدم اكتشاف الذاكرة العشوائية (RAM) بشكل صحيح.
1.1.2 عملية البحث عن الأجهزة القابلة للإقلاع (Bootable Devices) ومقارنة الإعدادات 
بمجرد اكتمال عملية POST، يقوم BIOS بالبحث عن الأجهزة القابلة للإقلاع (Bootable Devices)، وهي الأجهزة التي تحتوي على الملفات اللازمة لبدء تشغيل الكمبيوتر (تسمى ملفات الإقلاع). بعض الأجهزة القابلة للإقلاع مثل HHD و SSD و USB و CD-ROM. يمكن تعريف الأجهزة القابلة للإقلاع (Bootable Devices) كما يلي:
الأجهزة القابلة للإقلاع (Bootable Devices) هي الأجهزة التي تحتوي على ملفات الإقلاع اللازمة لبدء تشغيل الكمبيوتر.
ومع ذلك، ما لم يتم تخزين ملفات الإقلاع (boot files) الضرورية على أي من أجهزة القابلة للإقلاع (bootable devices)، فلن يتمكن الكمبيوتر من الاقلاع من هذا الجهاز.
قد يكون هناك أكثر من جهاز قابل للإقلاع متصل بالحاسوب، بالتالي سيقوم الـ BIOS بترتيب أولويات هذه أجهزة حسب الاعدادات المخزنة به. ليقوم بعد ذلك بأخذ الجهاز الأعلى اولوية ليقوم بالإقلاع منه.

1.1.3 عملية الـ IPL
اختصار لـ Initial Program Loader، وتسمى ايضاً بـ Initial Boot Record؛ هو برنامج صغير مخزن في BIOS يساعد في تحديد وتحميل الـ Bootloader الموجود في MBR على جهاز قابل للإقلاع (bootable device).
الـ MBR هو عبارة كود حجمه 512 بايت موجود في سيكتور الإقلاع (sector boot) في جهاز التخزين والذي يكون عادةً /dev/sda أو /dev/hda اعتمادًا على جهاز التخزين (الهادر ديسك). ويحتوي على الاجزاء التالية:
 الـ Partition Table وحجمه يساوي 64-byte.
 الـ boot loader ويبلغ حجمه 446-byte.
 الـ magic number ويبلغ حجمه 2-byte. 
1.2 عملية الـ Bootloader
الـ Bootloader هو برنامج صغير مخزن في MBR يساعد في تحميل نظام التشغيل في الذاكرة. بدون الـ Bootloader، لا يمكن تحميل نظام التشغيل الخاص بك في الذاكرة.
هناك ثلاث أنواع رئيسية من bootloader في لينكس وهي LILO و GRUB و GRUB2. حيث الـ GRUB2 هو أحدث في توزيعات لينكس الحديثة.
نستنتج أن:
الهدف الرئيسي لـ GRUB هو تحميل الـ Linux kernel على الذاكرة الرئيسية.
1.3 عملية الـ Kernel Initialization
النواة (Kernel) هي الجوهر الأساسي لنظام Linux. تربط النواة بين عتاد الكمبيوتر والعمليات الأساسية. تتحكم النواة في جميع العمليات التي تحدث على نظام Linux الخاص بك.
تنقسم نواة Linux إلى قسمين رئيسيين:
 Kernel Core: تحتوي على الملفات الأساسية الضرورية لبدء التشغيل.
 initramfs: اختصار لـ Initial RAM File-System، وهي تحتوي على الملفات الثانوية اللازمة لبدء التشغيل.
الهدف من هذا التقسيم، هو تقليل الموارد المستهلكة من قبل النواة. وكذلك تسريع عملية تشغيل النواة. وكذلك عزل الاخطاء التي قد تحدث في الـ Derives و Modules عن الـ kernel core.
ويتم تخزين الـ kernel core في /boot/ فيما يلي مثال لاسم الـ kernel core:
vmlinuz-4.18.0-305.3.1.el8.x86_64
ويتم تخزين الـ kernel initramfs  في /boot/ فيما يلي مثال لاسم الـ kernel initramfs:
initramfs-4.18.0-305.3.1.el8.x86_64.img 
فيما يلي شكل يعرض محتويات المجلد /boot على سيرفر يعمل بنظام CentOS8.

 

عند تحميل النواة المحددة بواسطة برنامج bootloader، تقوم النواة المحددة بربط (mount) نظام الملفات الأساسي (root file system) وتقوم بـ:
 في الانظمة القديمة (الاقل 6)، تقوم بتهيئة البرنامج init.
 في الانظمة الحديقة (الاكبر 6)، تقوم بتهيئة البرنامج systemd.
ملاحظة
بشكل اساسي النواة هي المسئولة عن إعطاء اسماء للأجزاء (Partitions). ولكن قبل تحميل النواة فإن المسئول عن إعطاء اسماء الـ للأجزاء (Partitions)هو الـ GRUB2. ويكون اسم الهادر هنا هو hd0 و hd1 و hd2 وهكذا. ويكون اسم الـ Partition هو msdos1 و msdos2 و msdos3.
فيما يلي صورة توضح شاشة Kernel Initialization Process:

 

 

 

 

 

 


ملاحظة
تقوم النواة المحددة بربط (mount) نظام الملفات الأساسي (root file system). تحديداً تقوم بعمل اولاً mounts من نوع read only؛ وذلك لفحص وجود أخطاء. ثم تقوم بعمل mounts من نوعread /write.
1.4 تشغيل الـ Systemd
بعد تشغيل نواة لينكس (Linux kernel)، فإن أول عملية تبدأ هي systemd. في الواقع، يحصل systemd دائمًا على PID خاص وهو 1. يتم تنفيذ هذه العملية دائمًا بواسطة نواة لينكس (Linux kernel) بعد اكتمال المراحل الأولى من Booting  بواسطة BIOS و  bootloader.
يجب على systemd أن يبدأ جميع daemons و background processes و services required لجعل نظام التشغيل يعمل. تتضمن أمثلة هذه العمليات بدء boot screen و networking stack، والأجهزة الموجودة في جهازك.
ملاحظة
تدير هذه الـ daemons أجزاء كثيرة من نظامك، مثل معلومات التسجيل، ومراقبة الأجهزة التي تدخلها أو تزيلها، وإدارة تسجيل دخول المستخدم.
بعد التهيئة، يظل الـ systemd قيد التشغيل، طالما أن نظامك قيد التشغيل، ويدير العمليات التي بدأت بالفعل، ويسمح للآخرين بالبدء والإيقاف وإعادة التشغيل أثناء تشغيل نظام التشغيل.
3. الـ Bootloader
هو عبارة عن برنامج صغير مخزن في MBR يساعد في تحميل نظام التشغيل في الذاكرة. بدون الـ Bootloader، لا يمكن تحميل نظام التشغيل الخاص بك في الذاكرة.
هناك ثلاث أنواع رئيسية من bootloader في لينكس وهي LILO و GRUB و GRUB2. حيث الـ GRUB2 هو أحدث في توزيعات لينكس الحديثة.
الهدف الرئيسي لـ GRUB هو تحميل نواة لينكس (Linux kernel) على الذاكرة الرئيسية. تتيح لك الـ GRUB2 القيام بأمرين هما:
 يسمح لك بتحديدOS  الذي تريد استخدامه والموجودة على الجهاز القابل للإقلاع (bootable device).
 يسمح لك بتحديد اصدارKernel  لنفسOS  إذا توفر ذلك.
بالتالي نستنتج أنه قد يحتوي الجهاز القابل للإقلاع (bootable device) على أكثر من OS ويسمح لنا الـ GRUB2 تحديد أي منها للإقلاع؛ لتحقيق ذلك، يتم توفير شاشة تحتوي على قائمة، كل عنصر في القائمة يسمى menu-entry. الـ menu-entry وهي عبارة عن OS أو Kernel موجودة على الـ bootable devices. فيما توضيح إلى لهذه الشاشة:

 

 

 

 

كما يظهر من الشكل، يوجد لدينا نظام تشغيل لينكس (Centos)، يحتوي على اصدارين من kernel. الفائدة من وجود أكثر من kernel لنفس نظام تشغيل؛ هو بوجود أكثر من نسخة من kernel بالتالي يمكن رجوع للنسخة القديمة في حالة تعطلت النسخة الاحدث. 
في هذه الشاشة، يجب علينا تحديد menu-entry المناسب للإقلاع وإلا سيقوم الـ GRUB2 باختيار الـ menu-entry default بعد مرور فترة معينة من وقت. والاعدادات الخاصة بـهذه القائمة موجودة في الملف etc/default/grub/.
فعلياً يتكون إلى الـ GRUB2 من قسمين:
 الـ First Stage: وهو الذي يتم تخزينه في MBR، الهدف الرئيسي لـه هو الاشارة الى الـ Second Stage.
 الـ Second Stage: وهو الذي يتم تخزينه في الـ bootable device، الهدف الرئيسي لـه هو تحميل OS kernel على الذاكرة الرئيسية. 
سبب في تقسيم الـ GRUB2 هو أن 446-byte غير كافيه لحفظه؛ خصوصاً أنه يحتوي على واجهة واعدادات وغير ذلك. الملفات الخاصة بـ الـ Second Stage يتم تخزينها في /boot/grub2.لاحظ محتويات المجلد /boot/grub2:

 device.map  fonts  grub.cfg  grubenv  i386-pc

الملف grub.cfg يحتوي على تكوين الخاص بـ GRUB2؛ ويتم أخذ soft-link منه في /etc/grub2/grub2.cfg. سنقوم بعد قليل بفهم بعض هذه التكوينات وتعديل عليها؛ وتعديل تحديداً سيكون على /etc/grub2/grub.cfg.
الآن نوضح العملية كاملة، يقوم BISO بعملية IPL، والتي ستقوم بتحميل الـ GRUB2 الموجودة في MBR (ونقصد هنا بـ First Stage)، يتم بعد ذلك الـ GRUB2 بتنفيذ الـ Second Stage. ثم يقوم GRUB2 بتحديد kernel Linux لإقلاع نظام تشغيل.
ملاحظة
للتغير على الـ GRUB2 نقوم بتعديل على /etc/grub2/grub.cfg وفي حالة قمت بتعديل خطأ على GRUB2، يمكن اعادة توليده كما يلي:
# grup2-mkconfig –o /boot/grub2/grub.cfg       // o: output
لاحظ الجزء التالي من ملف /etc/grub2/grub.cfg:

terminal_output console
if [ x$feature_timeout_style = xy ] ; then
 set timeout_style=menu
 set timeout=5
# Fallback normal timeout code in case the timeout_style feature is
# unavailable.
else
 set timeout=5
fi
هذا الجزء من الملف يتحكم في وقت بالثواني بعد عرض القائمة لتشغيل menu-entry default. ولكن يفضل عدم تغير ذلك من هنا؛ لأنه سيتم بمجرد توليد الملف ؛ للتغير قم بتعديل على etc/default/grub/. يسرد التالي محتويات الملف etc/default/grub/:

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed "s, release .*$g" /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

إذا تم إجراء تغييرات على أي من هذه البارامترات، فأنت بحاجة إلى تشغيل grub2-mkconfig لإعادة إنشاء الملف /boot/grub2/grub.cfg. يتم وصف القيم على النحو التالي:
 الـ GRUB_TIMEOUT: الوقت بالثواني بعد عرض القائمة لتشغيل menu-entry default، ما لم يتم الضغط على مفتاح. الافتراضي هو 5. اضبط على 0 للتمهيد فورًا بدون عرض القائمة، أو على 1 للانتظار إلى أجل غير مسمى.
 الـ GRUB_DISTRIBUTOR: تم تعيينه بواسطة موزعي GRUB ويستخدم لتوليد المزيد من menu-entry titles بالمعلومات. 
 الـ GRUB_DEFAULT: وهي menu-entry default. تقوم القيمة 0 بإقلاع العنصر الأول. تقوم القيمة 1 بإقلاع العنصر الثانية. تقوم قيمة saved بتوجيه GRUB2 لتحميل آخر نظام تشغيل تم تحميله بنجاح.
 الـ GRUB_DISABLE_RECOVERY: بشكل افتراضي، يتم إنشاء اثنين من menu-entry لكل Kernel Linux وهما:
• الاولى وهي الحقيقة.
• الثانية لوضع الاسترداد. 
لاحظ الجزء التالي من ملف /etc/grub2/grub.cfg:

### BEGIN /etc/grub.d/10_linux ###
insmod part_msdos
insmod xfs
set boot="hd0,msdos1"
if [ x$feature_platform_search_hint = xy ]; then
 search --no-floppy --fs-uuid --set=boot --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 
                           --hint-baremetal=ahci0,msdos1 –hint="hd0,msdos1"  f3ee4-814f-478f-8570-d04a68
else
 search --no-floppy --fs-uuid --set=boot f3ee4-814f-478f-8570-d04a68
fi

هذا الجزء من الملف يتحكم في device bootable.
3. الـ Systemd
مسبقًا كان يستخدم الـ SystemV ولكن حديثًا أصبح يستخدم الـ Systemd هي الأم لجميع عمليات لينكس، وتدير بدء وإيقاف الخدمات وغيرها الكثير.
الـ systemv 
وتسمى الـ init system، والذي يعتمد على مبدأ run-level. وهي منقسمة لستة مستويات كل مستوي لها وظائف معينة. تكوين هذه المستويات موجودة في الملفات /etc/rc0.d و /etc/rc1.d و /etc/rc2.d.
توضيح طريقة العمل مع الـ systemv، بعد أن قامت النواة بتهئية برنامج init. ثم تقوم الـinit  بتشغيل الخدمات بشكل متوالي، بمعنى ستقوم بتشغيل خدمة الأولى وتنتظر نجاح تشغيل هذه العملية حتى تبدأ بتشغيل الخدمة التالية.
ملاحظة:
في الـ systemv، كل خدمة لها file shell script. المسؤول عن بدء تنفيذ خدمة معينة هو ملف shell script الخاصة بها.
فيما يلي مستويات الـ init system:
• الـ run-level-0: وهو مسؤول عن System halt.
• الـ run-level-1: وهو Signal user mode.
• الـ run-level-2: وهو Multiple user mode without GUI/NFS.
• الـ run-level-3: وهو Multiple user mode without GUI.
• الـ run-level-4: وهو غير مستخدم.
• الـ run-level-5: وهو Multiple user mode with GUI.
• الـ run-level-6: وهو مسؤول عن System Reboot.
كمدير أنظمة عادي، نقوم بالعمل في run-level-3، وهي توفر لنا shell لتشغيل البرامج والخدمات.
الـ systemd 
تعتمد الـ systemd على مبدأ targets. الشيء الأساسي الذي يديره systemd ويعمل عليه هو unit. حيث الـ unit يؤدي أو يتحكم في مهمة أو مجموعة من المهام معاً.
توضيح طريقة العمل مع الـ systemd، بعد أن قامت النواة بتهئية برنامج systemd ، تقوم الـ systemd بتشغيل الخدمات معاً بشكل متوازي.
ملاحظة
• في الـ systemd، كل خدمة لها file unit. المسؤول عن بدء تنفيذ خدمة معينة هو file unit الخاصة بها. من المهمة معرفة أن الـ systemd تدعم أيضاً السيرفس التي تكون init script.
• كمدير أنظمة عادي، نقوم بالعمل في multi-user.target، وهي توفر لنا shell لتشغيل البرامج والخدمات.
تتعامل الـ systemd بشكل مباشر ومتكامل مع الـ journald. الـ journald تقوم بتسجيل جميع الـ logs التي تحدث على النظام.
للتعامل وتفاعل مع systemd نستخدم الاداة systemctl (اختصار لـ system controller). للتعامل وتفاعل مع journald نستخدم الاداة journalctl (اختصار لـ journal controller).
لمشاهدة جميع الـ units التي يديرها الـ systemd على نظام الخاص بك، استخدم الأمر:
# systemctl     
لعرض جميع units التي قام الـ systemd بتحميلها أو حاول تحميلها إلى الذّاكرة بما في ذلك الـ units غير النشطة:
# systemctl list-units --all
لعرض جميع الـ units التي قام systemd بتنشيطها (أي التي تكون active):
# systemctl list-units
يشرح الجدول التالي بإيجاز المصطلحات التي يستخدمها systemd لوصف status units بعد تشغيل:
Status Description
loaded تمت قراءة الـ unit"s configuration file ومعالجته بنجاح.
Active (exited) تم تنفيذ الـ unit configuration file لمرة واحدة بنجاح وبعد التنفيذ، لا تقوم unit بتشغيل عملية نشطة ولا تنتظر حدثًا.
Active (running) تم تنفيذ الـ unit configuration file لمرة واحدة بنجاح وبعد التنفيذ، تقومunit  بتشغيل عملية نشطة واحدة أو أكثر.
Active (waiting) تم تنفيذ الـ unit configuration file لمرة واحدة بنجاح وبعد التنفيذ، تنتظر unit حدثًا.
Inactive (dead) إما فشل تنفيذ الـ unit configuration file لمرة واحدة أو لم يتم تنفيذه بعد.
لعرض حالة الـ units عند تشغيل النظام، نستخدم الأمر التالي.
# sysyemctl list-unit-files 
بشكل افتراضي، يعرض هذا الأمر الـ systemd units التي يتم تشغيلها تلقائياً عند بدء التشغيل. يمكن أن تكون الـ units في ثلاث حالات وهي:
 إذا كانت الـ unit في حالة enabled ، يقوم النظام ببدء تشغيلها في وقت الاقلاع.
 إذا كانت الـ unit في حالة disabled، فلن يقوم النظام ببدء تشغيلها عند بدء التشغيل.
 إذا كانت الـ unit في حالة static، فلن يبدأها النظام عند بدء التشغيل ولا يسمح لنا بتغيير حالتها.
بلغة سهلة، إذا كانت الـ unit في حالة  enabled أو disabled، يمكنك تغيير حالتها. ولكن إذا كانت في حالة static، فلا يمكنك تغيير حالتها. 
الـ static service هي عبارة عن سيرفس مساعدة لسيرفيس أخرى، على سبيل المثال، تعد sshd-keygen service مساعدة لـ sshd service. بالتالي الـ sshd-keygen service تعد كـ static service.
ملاحظة:
إذا كنت تريد معرفة الـ units (أو اصطلاحاً نسميها Services أو Demeans) التي تكون حالتها Inactive، كل ما عليك فعله هو استخدام الامر التالي:
# sysyemctl list-units | grep –i failed 
إذا كنت تريد معرفة الـ units (أو اصطلاحاً نسميها Services أو Demeans) التي تكون حالتها running، كل ما عليك فعله هو استخدام الامر التالي:
# sysyemctl list-units | grep –i running

إذا كنت تريد معرفة الـ units (أو اصطلاحاً نسميها Services أو Demeans) التي تكون enable، كل ما عليك فعله هو استخدام الامر التالي:
# sysyemctl list-unit-files | grep –i enabled
الـ Unit Operations
للتعامل وتفاعل مع systemd نستخدم الاداة .sysyemctl وفيما يلي العمليات على سيرفس:
الـ Enable Service
يمكن تشغيل السيرفس تلقائياً عند اقلاع النظام. وذلك كالتالي:  
# systemctl enable httpd.service
Created symlink /etc/systemd/system/multi-user.target.wants/httpd → /usr/lib/systemd/system/httpd
تم تمكين السيرفس من خلال انشاء soft-link في httpd /etc/systemd/system/multi-user.target.wants/ من httpd/usr/lib/systemd/system/.

للاستعلام أن تبدأ السيرفس تلقائيًا عند إعادة تشغيل النظام.
# systemctl is-enable httpd.service
للاستعلام أن السيرفس نشطة:
# systemctl is-active httpd.service
للاستعلام أن السيرفس بها فشل:
# systemctl is-failed httpd.service
الـ Disable Service
لمنع بدء تشغيل السيرفس تلقائياً عن اقلاع النظام:
# systemctl disable httpd.service
Removed /etc/systemd/system/multi-user.target.wants/httpd.service
تم الغاء تمكين السيرفس من خلال حذف soft-link من httpd/usr/lib/systemd/system/.
الـ Start Service
إذا كنت تريد أن يبدأ السيرفس الويب على الفور، علينا القيام بذلك يدويًا كما يلي:
# systemctl start httpd.service
الـ Stop Service
لإيقاف السيرفس، أدخل الأمر التالي:
# systemctl stop httpd.service
الـ Status Service
يمكننا التحقق من أن حالة السيرفس، عن طريق كتابة:
# systemctl status httpd.service
وسيكون المخرج مشبه لما يلي:

 

 

 


الـ Restart Service
يمكننا إعادة تشغيل السيرفس، عن طريق كتابة:
# systemctl restart httpd.service


الـ Reload Service
يمكننا إعادة تحميل السيرفس، عن طريق كتابة:
# systemctl reload httpd.service
الـ dependencies Service
لعرض قائمة السيرفس التبعية للسيرفس المحددة (بمعني ما هي السيرفس المساعدة للسيرفس الحالية) نستخدم الامر التالي.
# systemctl list-dependencies httpd.service
الـ mask Service
لحظر سيرفس من البدء، نستخدم الامر التالي:
# systemctl mask httpd.service
Created symlink /etc/systemd/system/httpd.service → /dev/null.
تم حظر السيرفس من خلال انشاء soft-link من configuration directories إلى /dev/null file مما يمنع السيرفس من بدء التشغيل. 
لفك حظر السيرفس من البدء، نستخدم الامر التالي:
# systemctl unmask httpd.service
Removed /etc/systemd/system/httpd.service.
تم فك حظر السيرفس من خلال حذف soft-link من ./dev/null file 
ملاحظة:
• لا يمكن أن يعمل اثنين من سيرفس معاً على نفس البورت؛ على سبيل المثال، لا يمكن تشغيل Apache و Nginx معاً.
• كل سيرفس يتم تثبيته على نظام يكون لها اعدادات افتراضية.
الـSystemd Unit 
تصف الـ Systemd Unit Service كيفية إدارة service أو application على السيرفر. سيشمل ذلك كيفية بدء أو إيقاف الخدمة، وفي ظل أي ظروف يجب أن تبدأ تلقائيًا، والتبعية ومعلومات الطلب للبرامج ذات الصلة.
يتم تخزين جميع الـ configuration files للسيرفس بشكل افتراضي في المسار التالي:
/user/lib/systemd/system 
لا يجب تغير في اعدادات سيرفس الموجودة في هذا المكان. إذا اردنا تغير على إعدادات السيرفس نذهب الى مسار التالي وهناك نقوم بتعديل:
/etc/systemd/system 
ملفات etc/systemd/system هي soft-link من /user/lib/systemd/system؛ وسبب في ذلك ان النظام لا يقرأ الاعدادات إلا من خلال etc.
إذا ذهبنا للمسار /usr/lib/systemd/system/sshd.service وقمنا بعرض الـ configuration file للـ  sshd Service فيكون ناتج كما يلي:
[Unit]
Description=OpenSSH Server daemon
Documentation=man:sshd(8) man:sshd_config ig(5)
After= network.target sshd-keygen.target
Wants=sshd-ketgen.target

[Service]
Type=notify
EnvironmentFile=-/etc/crypto-publicies/back-ends/opensshserver.config
EnvironmentFile= -/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd –D $OPTIOS $CRYPTO_POLICY
ExecReload=/bin/kill –HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target
هذا الملف يسمى بـ Unit File. يتم تنظيم الـ Unit File على شكل sections. يُشار إلى الـ sections بزوج من الأقواس المربعة مع إرفاق اسم section بداخلها. يمتد كل sections حتى بداية sections التالي أو حتى نهاية الملف.
الـ Section names محددة جيدًا وحساسة لحالة الأحرف. لذلك، لن يتم تفسير الـ sections بشكل صحيح إذا تم تهجئته. ضمن هذه الـ sections، يتم تعريف behavior و metadata للـ Unit من خلال استخدام directives بسيطة.
الـ Section Unit Directives
القسم الأول الموجود في معظم Unit File هو Unit section. يستخدم هذا بشكل عام لتحديد metadata للـ Unit وتكوين علاقات بين الـ Units. بعض الـ directives الشائعة التي ستجدها في Unit section هي:
الـ Description:
يمكن استخدام هذا الـ directive لوصف الاسم والوظيفة الأساسية للوحدة.

الـ Documentation:
يوفر هذا الـ directive موقعًا لقائمة URIs للتوثيق. يمكن أن تكون هذه إما page man متاحة داخليًا أو عناوين URL يمكن الوصول إليها عبر الويب. سيعرض الأمر systemctl status هذه المعلومات، مما يتيح سهولة الاكتشاف.
الـ Requires:
يسرد هذا أي units تعتمد عليها هذهunit  بشكل أساسي. لن يتم تنشيط هذه الـ unit إلا بحالة تنشيط الـ units المدرجة هنا بنجاح، وإلا ستفشل هذه الـ unit. 
الـ Wants:
هذا الـ directive مشابه لـ Requires، لكنه أقل صرامة. سيحاول الـ systemd بدء تشغيل أي units مدرجة هنا عند تنشيط هذه unit. إذا لم يتم العثور على units المدرجة هنا أو فشل في بدئها، ستستمر الـ unit الحالية في العمل. هذه هي الطريقة الموصي بها لتكوين معظم dependency relationships.
الـ BindsTo:
هذا التوجيه مشابه لـ Requires، ولكنه يتسبب أيضًا في توقف unit الحالية عند إنهاء units المرتبطة.
الـ Before:
لن يتم بدء تشغيل الـunits  المدرجة في هذا حتى يتم تمييز الـ unit الحالية على أنها بدأت إذا تم تنشيطها في نفس الوقت. هذا لا يعني وجود علاقة تبعية ويجب استخدامه مع أحد التوجيهات المذكورة أعلاه إذا كان ذلك مطلوبًا.
الـ After:
ستبدأ الـ units المدرجة في هذا الـ directive قبل بدء الـ unit الحالية. هذا لا يعني وجود علاقة تبعية ويجب إنشاء واحدة من خلال التوجيهات المذكورة أعلاه إذا كان ذلك مطلوبًا.
الـ Conflicts:
يمكن استخدام هذا لسرد الـ units التي لا يمكن تشغيلها في نفس الوقت مع الـ unit الحالية. سيؤدي بدء الـ unit الحالية إلى إيقاف الـ units الأخرى.
الـ Section Install Directives
غالبًا ما يكون القسم الأخير هو Section Install. هذا القسم اختياري ويستخدم لتعريف behavior إذا تم تمكينها أو تعطيلها. يؤدي تمكين الوحدة إلى تحديدها لبدء التشغيل تلقائيًا عند التمهيد.  بعض الـ directives الشائعة التي ستجدها في Unit Install هي:
الـ WantedBy:
يُعد WantedBy أكثر الطرق شيوعًا لتحديد كيفية عمل  enableللـ Unit. يسمح لك هذا بتحديد علاقة تبعية بطريقة مماثلة لما يفعله الـ Wants. عندما يتم عمل enable للوحدة مع هذا التوجيه، سيتم إنشاء مجلد داخل هذا المسار /etc/systemd/system المسمى على اسم الوحدة المحددة مع ملحق wants في النهاية.
ضمن هذا، سيتم إنشاء symbolic للوحدة الحالية، مما يؤدي إلى إنشاء التبعية. على سبيل المثال، إذا كانت الوحدة الحالية تحتوي على WantedBy = multi-user.target، فسيتم إنشاء مجلد يسمى multi-user.target.wants داخل المسار هذا etc/systemd/system و symbolic للوحدة الحالية سيتم وضعها في الداخل. يؤدي تعطيل هذه الوحدة إلى إزالة symbolic وإزالة علاقة التبعية.
الـ Section Service Directives
وهي تعد Unit-Specific Section Directives. يُستخدم Service section لتوفير التكوين الذي ينطبق فقط على الخدمات. أحد الأشياء الأساسية التي يجب تحديدها داخل Service section هو Type.


حول
محمد عماد غباين ✍️ المؤلف
المتجر أماكن الشراء
جميع الحقوق محفوظة للمؤلف 🏛 الناشر
مناقشات ومراجعات
QR Code
عن كتاب نظام لينكس (Linux System):
تعلم نظام لينكس من صفر حتى الاحتراف باللغة العربية مع مراعاة المصطلحات الإنجليزية.

في هذا الكتاب نقدم لكم جميع مواضيع وشروحات نظم التشغيل عامةً ونظام لينكس خاصةً.

حيث نبدأ بهذا الكتاب بأساسيات نظم التشغيل بشكل عام (في هذه المرحلة مكنك الإجابة على الأسئلة:

1. ما هو نظام الحاسوب، 2. ما هو النظام التشغيل، 3. ما هي مكونات نظام التشغيل، 4.

كيف يعمل نظام الحاسوب 5. هيكلية نظام الحاسوب). للننتقل بعد ذلك لمرحلة تعلم نظام لينكس؛ حيث تم تغظية المواضيع التالية:

1. نبذة عن نظام لينكس
2. تطور نظام لينكس
3. مكونات نظام لينكس
4. توزيعات لينكس (Linux Distributions)
4. أوامر لينكس الأساسية (Basic Linux Commands)
5. نظام الملفات (بكل تفاصيله)
6. إدارة المستخدمين
7. الصلاحيات والمليكة (Ownership & Permissions)
8. ارتباط الملفات (Link File)
9. ضغط الملفات (Compression)
10. أرشفة الملفات (Archiving)
11. قائمة تحكم الوصول (Access Control Lists)
12. تجزئة الديسك (Disk Partitioning)
13. الملفات (Files)
14. أنواع الملفات (File Type)
15. هيكلية الملفات (File Structure)
16. أوامر التعامل مع نظام الملفات
17. التخزين (Linux Storage)
20. الهارد ديسك فيزيائياً (Physical HHD)
19. الهارد ديسك منطقيًا (Logical HHD)
20. عملية التهيئة (Formatting)
21. عملية ربط (Mounting)
22. مدير الحزم (Linux Package Manager)
23. الشبكات
24. تشخيص مشكلات الشبكة (Troubleshoot Network)
25 إدارة عمليات لينكس (Linux Process Management)
وغيرها من مواضيع متقدمة في لينكس
الترتيب:

#1K

0 مشاهدة هذا اليوم

#2K

0 مشاهدة هذا الشهر

#109K

714 إجمالي المشاهدات
عدد الصفحات: 122.