4.3 نظرة تشريحية :لينكس تحت المجهر كتاب لينكس الشامل >>

4.3 نظرة تشريحية :لينكس تحت المجهر

الفهرس

4.3.1 الإقلاع booting

نظام الإدخال والإخراج الأساسي BIOS

عند تشغيل الحاسوب يتم تشغيل BIOS نظام الإدخال والإخراج الأساسي يقوم بعد الرام وفحص الأشياء الأساسية. ثم يبحث ال BIOS عن برنامج الإقلاع بتسلسل معين يحدده برنامج إعداد ال BIOS وغالباً ما يكون القرص المرن فالمدمج فالصلب أو في الأجهزة الأكثر أماناً الصلب أولاً، ولكن أين وعن ماذا يبحث؟ في أول قطاع من كل قرص يوجد منطقة اسمها Boot record أي سجل الإقلاع يتم قراءة ذلك القطاع والتأكد من أنه يحمل توقيع ( يسمى Magic Num ) فإذا وجده وضع القطاع في الذاكرة ونفذه إذا لم يجده انتقل إلى القرص التالي وإذا لم يجده أبداً يطبع رسالة تفيد ذلك. بالنسبة للأقراص الصلبة فإن كل قسم منها يحتوي على مثل هذا السجل ولكن لا يتم قراءة أي منها لأن هناك سجل اضافي للقرص كاملاً يسمى جل الإقلاع المتسيد Master Boot Record وللاختصار MBR هو الذي يتم قراءته .

يمكنك أن تصل قرصين صلبين على الحزام الواحد بمقبس IDE على اللوحة الأم، ويوجد عادةً متسع على اللوحة الأم لوصل حزامين أي أنك تصل 4 أقراص باللوحة الواحدة (دون اضافات) تكون مقابس IDE مرقمة الرقم الأصغر يسمى primary أولي والتالي يسمى secondary ثانوي ، ولكن كيف تحديد أي القرصين المرتبطين مع الأولي يأتي أولاً؟ يتم اختيار ترتيب الأقراص المرتبطة على الحزام الواحد بطريقة فيزيائية باستعمال Jumper وهو قطعة معدنية مغلفة بعازل توضع في مكان محدد على القرص الصلب فتوصل دارات لتحدد فيما لو كان القرص سيد Master أم عبد Slave. تكون طريقة وضع ال Jumper مطبوعة على القرص نفسه وتحددها الشركة الصانعة.

في لينكس نسمي القرص الأولي السيد Primary Master باسم hda والعبد الأولي Primary Slave باسم hdb والسيد الثانوي hdc والعبد الثانوي hdd ونسمي القسم الأول من hda باسم hda1

في كل مرة تشبك قرص أو تبدل قرص مكان قرص عليك الدخول على برنامج إعداد ال BIOS لتعريفه وبعض أنواع ال BIOS يمكن إعدادها بحيث تفحص نوع القرص تلقائياً في كل حالة اقلاع ولكن هذا يأخذ وقتاً على أي حال لينكس ليس بحاجة لل BIOS فهو يعرف الأقراص تلقائيا حتى لو لم يعرفها ال BIOS وبوقت أقل من ال BIOS ولكن هذا الإجراء لنظام ويندوز ، إذا لم تكن تتعامل معه ضع كل الأقراص عدا قرص لينكس غير موجودة في BIOS!!

القرص الذي يبحث في BIOS عن MBR هو Primary Master أي hda فقط.

يحتوي ال MBR على برنامج صغير جدا ( محدود بحجم القطاع وهو 512 بايت) يسمى Boot loader وبالتحديد first stage boot loader

4.3.2 برامج الإقلاع Boot-Loaders

قد يكون برنامج ال boot-loader برنامج يسألك اي الأنظمة تريد أن تقلع مثل برنامج BootMagic الشهير وغيره ولكن في ويندوز أو دوس يكون غبي وغير تفاعلي لديه عنوان command.com و io.sys و msdos.sys يقوم يتحميلها وتنفيذها فقط دون أن يأخذ بعين الإعتبار الأقسام الأخرى والأنظمة الأخرى كما لا يمكنه تمرير أي معلومات للنظام لهذا نقول أن ويندوز ليس Multi-boot system وأكثر من ذلك فإن له العيوب التالية:

في لينكس فهناك برامج مثل lilo و grub و isolinux . أولها LILO (أي LInux LOader) هو الأكثر انتشارا ويمكنه عمل قائمة نصية أو رسومية بدقة 640 في 480 ب 16 لون BMPأو 320 في 200 لون PCX يمكنه تحميل لينكس وتمرير معلومات له وتحميل ويندوز وعمل بعض الخدع لويندوز مثل الإقلاع من قرص افتراضي (الدي أو الإي) عن طريق اخفاء القرص الأساسي ( السي ) ولكن عند اجراء أي تعديل على أي من الملفات التي يستعملها مثل الصورة فانه يتوجب عليك إعادة تركيبه بتنفيذ lilo و أنت جذر ليجدد معلوماته ويأخذ الاحداثيات الجديدة للملفات.

grub (أي Gnu ) وهو برنامج يهدف أولا للقضاء على lilo أو استبداله وثانياً إقلاع لينكس يوفر الكثير من المزايا اضافة لما يوفره lilo مثل الكذب على ويندوز باخفاء الأقسام وإمكانية تمرير معلومات ليس إلى لينكس فقط بل وإلى انظمة اخرى مثل OS/2 و شبيهات unix مثل BSD ويمكنه الدخول إلى أنظمة الملفات fat و ext3 و ext2 وغيرها أي لا ضرورة لإعادة تركيبه عند تعديل الصورة أو الملف الخيارات ويمتاز بأنه يستطيع إقلاع أنظمة غير موجودة في القائمة

isolinux يستخدم لإقلاع القرص المدمج أو برامج ال setup وهو غير شائع للحالات العادية

loadlin برنامج يعمل في ظل دوس ولا يعمل في ويندوز يستطيع وضع نواة لينكس في الذاكرة ثم ازالة كل شيء عدا ذلك ثم الاقلاع وهو يستعمل للذين لايريدون اعادة تقسيم القرص الصلب وتغيير ال boot loader ويأتي مع بعض التوزيعات مثل SOT

يمكن للينكس الإقلاع دون boot loader ولكن ستخسر امكانية تمرير بعض المعلومات له إذا أردت تجربة ذلك ضع قرص مرن ثم اكتب في لينكس الأمر التالي

bash# dd if=/boot/vmlinuz of=/dev/fd0 bs=1024
ثم ضعه في السواقة وأعد تشغيل الجهاز سوف تقلع النواة ثم تعطي رسالة
kernel panic : can't find root file system
وهي تعني أن لينكس الذي وضعناه على القرص المرن لايحتوي على نظام ملفات ( وهو نظام ext3 أو ext2 أو minix يحتوي على البرامج الأساسية مثلinit او sh ) أعد تشغيل الجهاز

4.3.3 نواة النظام kernel

النواة تكون عادة موجودة في مجلد boot وهي نوعان vmlinuz او bz2Image تبعا لطريقة الضغط المتبعة ملفات bz2 تستخدم للأنوية العملاقة التي تحتوي الكثير من التعريفات أو كل التعريفات عادة يكون الملف vmlinuz هو وصلة لإصدارة محدد من النواة مثلاً vmlinux-2.4.24 هذه أمثلة على بعض اسماء الأنوية

/boot/vmlinuz
/boot/vmlinuz-2.4.18
/boot/vmlinuz-2.4.20-mdk-9
/boot/bz2Image
/boot/bz2Image-2.4.18
/boot/bz2Image-2.4.20-ErrorMsg-3
الرقم 2.4.18 يشير إلى رقم الإصدارة وإذا كان الأوسط زوجي فهذا يعني أنها نواة مختبرة ومستقرة (بإدارة ليناس) أما إذا كان فردي (بإدارة Alan Cox) فهذا يعني أنها قيد التجريب لإضافة مزايا جديدة
vmlinuz-2.5.57 هي نسخة تجريبية
vmlinuz-2.4.20 مستقرة
من الجدير بالذكر أن هناك ملف اسمه vmlinux ينتهي ب X وليس ب Z هو عبارة عن ملف بيني ( يمكن شطبه ) ربما تجده في RH لا اعلم لماذا لا يشطبونه

4.3.4 تمرير معلومات للنواة

بعد أن يحمل برامج الإقلاع boot loader النواة يمرر لها بعض الخيارت ثم ينفذ النواة وكل خيار لم يتم ذكره يستعمل القيم الإفتراضية لمعرفة القيم الإفتراضية أو تغيرها استعمل هذه الخمسة أوامر rdev و swapdev و ramsize و vidmodeو rootflags التي تعني

لتعرف المزيد نفذ.
bash$ man rdev
bash$ rdev /boot/vmlinuz

يستخدم قرص الرام لعمل rescue disk أو لإضافة تعريفات لأشياء ضرورية قبل تحميل نظام الملفات الجذري مثلا النواة في RedHat 8.0 لا تدعم ext3 والنظام الجذري هو ext3 فكيف يمكن أن يقرأ نظام الجذري الطريقة أنه يعمل صورة لقسم صغير من نوع ext2 المدعوم من النواة ويوضع فيه ملف initrd أي قرص الرام الاستهلالي init ram disk يحتوي على تعريف ext3. يمكن عمل initrd بواسطة mkinitrd أو يدوياً كما في عمل ram disk في الفصل التالي. وعلى الرغم من كون initrd هو ram drive إلى أنها لا يمرر عن طريق rdev بل عن طريق برنامج الإقلاع lilo مثلاً مما يعني أن برنامج هو المسؤول عن تحميله باستخدام ال BIOS لقراءة هذا الملف وتمريره للنواة. بعد أن تضمه النواة على أنه الجذر يتم تنفيذ ملف linuxrc الذي يفترض أن يحتوي على العمليات اللازمة لتمكين النواة من رؤية النظام الجذري الحقيقي مثل تحميل تعريف ext3 عبر modprobe في حالة أن النواة لا تحتوي تعريفاً مثبتاً فيها له أو تحميل تعريف الإيثرنت و أخذ عنوان (عبر dhcp) تمهيداً لضم نظام جذري عبر الشبكة NFS أو عمل losetup لإعداد إلى ماذا يشير جهاز /dev/loop0 وما نوع التشفير ... وغيرها من الحالات الخاصة التي يكون النظام الجذر غير جاهز/متوفر ويحتاج لإعداد معين قبل تحميله. وبهذا يمكن الآن أن يقرأ نظام الملفات الجذري فتقوم النواة بتحويل الدليل الجذر الحالي من initrd إلى الجذر الذي مرر عبر خيار root من برنامج الإقلاع أو rdev. ويتم ضم initrd إلى دليل /initrd في البيئة الجديدة (يجب أن يكون موجوداً). بالنسبة لقيام ريدهات بعمل initrd من أجل ext3 فأنا غير مقتنع بهذه الخزعبلات لماذا لا يضعون تعريف ext3 داخل النواة ويريحونا من هذه اللفة الطويلة خصوصاً وأنها لا تدعم أن يكون النظام الجذر reiserfs أو xfs (أظن أن مبرر ريدهات هو دعمهم ل LVM و RAID ولكن لم أقتنع بكونهم لا يضعون النظام الوحيد{بإهمام ext2 } الذي يدعمون داخل النواة مباشرة)

أما الأشياء الأخرى التي يمكن تمريرها فهي كثيرة منها
root=/dev/hda7 اعتبار أن القسم hda7 هو الدليل الجذر
ro للقراءة فقط لكي تتمكن من فحصه ثم يتحول إلى قراءة وكتابة
rw قراءة وكتابة
load_ramdisk=1 تفعيل قرص رام (اجعلها صفر لتثبيط هذا الخيار)
prompt_ramdisk=1 تعطيك فرصة لتبديل الأقراص وإدخال القرص الثاني عند عمل rescue disk
ramdisk_size=4096 تحديد حجم قرص رام بمقدار 4096 كيلوبايت
ramdisk_start=400 تحديد مكان قرص رام بمقدار 400 كيلوبايت عن بداية القرص المرن
init=/bin/init تمرر اسم البرنامج الذي سيتم تشغيله أولا
mca-pentium تحتاجه لجهاز IBM-95 Microchannle لأنه يحتوي على عيب صناعي يتم تلافيه بها
panic=10 إعادة تسغيل الجهاز تلقائيا بعد 10 ثواني من حدوث الخلل panic مثل طلبت منه أن يبوت على hda8 ولكن لايوجد hda8
quiet يجعل الكيرنل لا تطبع شيء ، يمكن الإطلاع على الرسائل في ما بعد بأمر dmesg
reboot=warm تجعل لينكس يخبر ال BIOS بأن لا تعد الرام،وتفحص الأقراص.. عند اعادة التشغيل وهي عكس ال cold
vga=ask تجعل لينكس يسأل عن طور الشاشة المطلوب(عدد الأعمدة والأسطر) عند بدء التشغيل
ram=64m بعض BIOS القديمة توهم النظام بأن الرام أقل مما هي عليه نستعمل هذا الخيار لنحدد الحجم الحقيقي لذاكرة رام RAM، المثال 64ميغا-بايت
hda=cyl,head,sec في حال رغبتك في تمرير قيم مختلفة عن ما يتم فحصه لعدد قطاعات القرص ...
sound=sound-driver تمرير كرت الصوت وهو يستخدم لكروت non-PNP ISA وهي قديمة جدا
idle=poll تزيد من سرعة الجهاز واستهلاكه للكهرباء في حال استخدام أكثر من معالج SMS
ملاحظة لا يوجد مسافة بين ما هو على يمين المساواة ويسارها أو يمين ويسار الفاصلة

4.3.5 مبدأ عمل قرص الإنقاذ

تعمل النواة على فحص كل شيء القرص الصلب والسي دي وكروت الشبكة أو إذا كان هناك معلومة تم تمريرها عن طريق ال boot loader يستعملها ولا يفحص. حتى الآن لم يعمل ضم mount للدليل الجذر. ثم تبحث النواة عن صورة مضغوطة لنظام ملفات جذري على شكل قرص رام ram drive مدموج معها (إن وجد وطلب منها ذلك) ثم تضمه mount على أنه الدليل الجذر ويمكن عمل هذه الصورة بعمل ملف بالحجم المطلوب باستعمال dd ثم تحويله إلى تهيئته ليحمل نظام ملفات mke2fs أو mkfs.minix ثم ضمه ووضع الملفات المطلوبة فيه ثم إزالة الضم وضغطه ثم دمجه مع النواة. الطريقة التالية توضح كيفية عمل قرصص إنقاذ يحتوي على bash فقط.

tipتلميح

الطريقة التالية تعليمية فقط وغير عملية لعمل قرص إنقاذ كامل الأدوات هناك بديل جاهز عنها

warningتحذير

إنتبه: هذه الطريقة لاتؤذي التوزيعة الموجدة ولكن الخطأ في طباعة الأوامر يقوم بذلك !!

bash$ su
bash# dd if=/dev/zero of=~/fsImage bs=1024 count=4096
4096+0 records in
4096+0 records out
bash# mkfs.minix ~/fsImage
bash# mkdir /mnt/test
bash# mount -o loop -t minix ~/fsImage /mnt/test
bash# cd /mnt/test
bash# mkdir bin usr tmp var proc sbin lib etc
bash# cp /bin/bash /mnt/test/bin/
bash# cd /mnt/test/bin && ln -s bash init
bash# cd /mnt/test/sbin && ln -s ../bin/init init
ثم نسخ الملفات التي تريد إلى mnt/test ولا تنس وضع المكتبات في lib تستطيع أن تعرف ما هي المكتبات المطلوبة عن طريق ldd ، ثم اضغط تلك الصورة
tipتلميح

لاحظ أننا هنا عملنا وصلة من bash باسم init لهذا عندما تأتي النواة لتشغيله سيعمل سطر الأوامر bash ولن يسأل عن كلمة سر أو يعطيك أجهزة إفتراضية أو يتعامل مع CTRL+ALT+DEL لأنه باش وليس init

نتابع :
bash# ldd /bin/bash
 # انسخ كل المكتبات التي ظهرت
bash# cp -avi /lib/libc.*so* /mnt/test/lib
bash# cp -avi /lib/ld.so /mnt/test/lib
bash# cp -avi /lib/libncurses.*so* /mnt/test/lib
bash# umount /mnt/test
bash# gzip -9 < ~/fsImage > ~/fsImage.gz
ولوضعها مع النواة على القرص المرن ضع قرص وتأكد من أنه غير مضموم unmounted وأن حجم الملف floppy.img الذي سينتج من دمج vmlinuz مع ~/fsImage.gz سيتسع على القرص وأن النواة معدة كما ذكرنا لتأخذ قرص رام من نوع minix ثم نفذ ما يلي
bash# dd if=/boot/vmlinuz-old-with-minix-support of=/dev/fd0 bs=1k
389+0 records in
389+0 records out
bash# dd if=fsImage.gz of=/dev/fd0 bs=1k seek=400
bash# rdev /dev/fd0 /dev/fd0
bash# rdev -r /dev/fd0 `expr 16384+400`
هنا قمنا بإرسال نواة صغير للقرص المرن وقسنا الحجم من ناتج dd فكان 389 الآن نرسل صورة قرص الرام المضغوط في مكان ما بعد هذه المنطقة مثلاً 400 كيلوبايت بخيار seek الآن نحدد أن القرص الجذر هو /dev/fd0 ونحدد أنه على بعد 400 (الرقم 16384 يكافئ load_ramdisk=1) ويمكنك أن تعمل صورة لقرص مرن مثل المحترفين(كتلك التي تأتي مع أقراص توزيعتك في حال لم يقلع القرص المدمج) بكل بساطة ضع ~/floppy.img مكان /dev/fd0 واجعل سطر rdev كما يلي rdev ~/floppy.img /dev/fd0. أما عمل قرصي إقلاع أحدهما النواة والآخر هو قرص رام(لأن قرص واحد لا يكفي) فيكون
bash# dd if=/boot/vmlinuz-big-new of=/dev/fd0 bs=1k
#ضع لاصق "القرص الأول" ثم ضع قرص آخر
bash# dd if=fsImage.gz of=/dev/fd0 bs=1k
bash# rdev /dev/fd0 /dev/fd0
#ضع لاصق "القرص الثاني"؛
bash# rdev -r /dev/fd0 49152
الرقم 49152 يعني load_ramdisk=1,prompt_ramdisk=1

لاحظ أن الحجم هو 4 ميغا غالبا لا تكفي لوضع الأدوات الأساسية(مثل initوshوls..) ولا حتى المكتبات لذا استعمل برنامج besybox وهو برنامج واحد يقوم بوظيفة الكثير من البرامج المعروفة ويتم ذلك بعمل وصلات منه بأسماء مختلفة فعند تنفيذه باسم ls يقوم بعمل ls !! وهكذا نوفر مساحة تلك البرامج

tipتلميح

ملاحظة : لا تخلط بينه وبين initrd لأنه في حالة ramdisk يكون ال root=/dev/ram ويتم قراءته بواسطة النواة kernel وبإعدادات rdev أما في حالة initrd يكون الجذر عادياً root=/dev/hda7 أي القرص مثلاً. وقبل عمل Mount له يتم تحميل initrd والتعريفات المطلوبة. في حالة ramdisk يتم تنفيذ init أما في حالة initrd يتم تنفيذ linuxrc. وعادة ما يكون initrd موجود في /boot/initrd-ver
باختصار ال initrd يكون موجود على مكان في ال root-file-sytem اما الآخر فيكون هو ال root-file-system

نعود للحديث عن إقلاع نظام لينكس، وكنا قد وصلنا إلى أنه يبحث عن قرص رام ram disk فإذا لم يجده أو طلبت منه أن لا يبحث عنه يتم عمل mount لنظام الملفات الجذر ويفضل أن يكون ro أي read only لعمل فحص له إذا كان بحاجة لذلك وهذا ضروري إلا إذا كنا نتحدث عن ram disk موجود على rescue disk فهو يكون rw أي read and write والسبب في كونه يجب أن يكون ro لأن نظام لينكس متعدد المهام فإذا كان النظام للقراءة والكتابة والنظام يفحص ربما يكون هناك برنامج يكتب في الملف الذي يفحص الآن مما يؤدي إلى حدوث أخطاء.

4.3.6 برنامج init و مستويات التشغيل run-levels

الآن تبحث النواة عن برنامج init الموجود في bin أو sbin أي /bin/init أو /sbin/init ويتم تمرير كل شي لم تفهم النواة من المعلومات التي مررت إليها عن طريق برنامج الإقلاع boot loader وهي غالباً عن رقم المستوى run level وهو رقم من 1إلى 5 . المستوى صفر وستة يستخدمان لإغلاق الجهاز أو إعادة تشغيله

في ديبيان تكون 2-5 كلها متشابهة -إكس مع شبكة- والتلقائي هو 2. فإذا تم تمرير root=/dev/hda7 ro 2 فإن النواة ستفهم كل شيء عدا 2 فترسل إلى init رقم 2

4.3.7 ملف inittab

يقوم برامج init بقراءة الملف inittab الموجود في etc أي /etc/inittab يمكنك أن تقرأ كتيب هذا الملف بكتابة الأمر man inittab كل سطر (عدا التعليقات) تكون على الصيغة [ID]:[RUNLEVEL]:[ACTION]:[COMMAND] معرّف(لا معنى له) فرقم مستويات التشغيل فمحدد لمتى أو كيف ينفذ الأمر (يحدد معنى السطر كله) يمكن أن تكون نفذه مرة عند الإقلاع (بغض النظر عن المستوى) sysinit أو نفذه وانتظر حتى ينتهي عند عند دخول/خروج المستوى wait نفذه عند إغلاق الجهاز shutdown أو عند الضغط على ctrlaltdel أو عند انقطاع الكهرباء powerfail أو عودتها powerokwait أو نفذها مرة واحدة once أو أعد تشغيلها كلما انتهت respown ثم الأمر. ويفصل بينهم نقطتين رأسيتين ‘:‘ منها سطر يشير إلى رقم المستوى التلقائي default run level ليتم استعماله في حال لم تمرر النواة رقم وهو سطر يبدو مثل

id:5:initdefault:
ومعناه أن مستوى التشغيل التلقائي هو خمسة أي الرسومي هنا id تعني init default وهي كما قلنا لأغراض التوثيق فقط.

يوجد في ملف inittab أسماء برامج نصوص الاستهلال initializeing scripts والتي تسمى نصوص الإقلاع Boot scripts ويقوم باستدعائها ملف يحدده سطر يشبه

si::sysinit:/etc/rc.d/rc.sysinit
يقوم هذا الملف بتنفيذ العمليات الاستهلالية التي يجب أن تنفذ بشكل مسبق قبل كل شيء مثل تشغيل برنامجي klogd و syslogd اللازمان لحفظ تقارير النواة والنظام، ومثل تحميل خط الشاشة النصية
unicode_start /usr/lib/kbd/consolefonts/LatArCyrHeb16.pcf.gz
أو تحديد وضع أضواء لوحة المفاتيح بواسطة setleds مثل Numlock. وضم الأقراص وفحصها ب fsck عند اللزوم وتشغيل الذكرة الافترضية swap و ضبط الساعة ... ثم تأتي نصوص الإقلاع الخاصة بمستوى تشغيل معين وهي في Slackware باسلوب BSD أي أو تكون باسلوب SysV كما في ريدهات وديبيان أي ملف وحيد اسمه /etc/rc.d/rc يتم تمرير رقم المستوى له وعلى ضوئه يتصرف
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
وهو الملف المسؤول عن تشغيل/إغلاق كل المراقبات daemons (إختصار ل Disk And Execution Monitor وهي ككلمة تعني شبح إذ يعتقد بأن يونكس يملك قوى فوق طبيعية) واحداً واحداً. للانتقال من مستوى لآخر نستعمل الأداة /sbin/telinit ونمرر لها الرقم

4.3.8 ملف fstab

يعمل أحد نصوص الإقلاع على تشغيل mount -a الذي بدوره يقرأ الملف fstab (اي file systems table) أي /etc/fstab وهو بالصيغة التالية

# this is /etc/fstab by <alsadi[at]gmail.com>
# this is a comment
# devicemount-pointtypeoptionsdump pass
/dev/hda7/ext3defaults,errors=remount-ro0 1
/dev/hda1/mnt/win_cvfatdefaults,umask=00 0
/dev/fd0/mnt/floppyautodefaults,noauto,user0 0
/dev/cdrom/mnt/cdromiso9660defaults,noauto,ro,user0 0
proc/procprocdefaults0 0
/dev/hda8noneswapsw0 0
ملاحظة يجب أن تكون المجلدات win_c و floppy موجودة لتنجح. جرب هذه الأوامر
bash$ man fstab
bash$ man mount
bash$ mount
bash$ cat /proc/mounts
bash# su root
password :
bash# fdisk -l
bash# cat /proc/partitions
bash# mkdir /mnt/win_c
bash# mount /dev/hda1 /mntt/win_c -t auto
bash# exit
لاحظ أن mount بدون شيء تعطي معلومات عن الأقسام والأجهزة المعرفة حاليا ولاحظ أن fdisk -l تعرض الأقسام الموجودة وأن الملف /proc/partitions

4.3.9 برامج الخدمات services

قلنا أن الملف rc يقوم بتشغيل أو إيقاف كل المراقبات daemons المطلوبة في ذلك المستوى ويتم ذلك فعلياً من خلال نصوص الملفات (shell scripts) الموجدة في المجلد المقابل لرقم مستوى التشغيل مثلاً /etc/rc.d/rc2.d/ (طبعا استبدل 2 بأي رقم آخر) فيوقف تلك التي تبدأ ب K (اختصار ل‘KILL‘) ويشغل تلك التي تبدأ ب S (اختصار ل‘START‘) مثلاً في مستوى 0 أو 6 (إغلاق الجهاز وإعادة تشغيله) كل الملفات تبدأ ب K أما في 5 تكون كلها تبدأ ب S. والتي يسمح بتنفيذها(أي أنها تحمل إذن التنفيذ) تسمى هذه الملفات خدمات service وهما عبارة عن رابط إلى ملف نصي تنفيذي موجود في /etc/rc.d/init.d/ مثلاً /etc/rc.d/init.d/random والرابط يكون /etc/rc.d/rc2.d/S51random الرقم 51 من أجل التحكم في ترتيب تشغيلها. يقبل هذا البرنامج معاملاً مثل start و stop و restart و status فإذا كان مطلوباً أن يوقفه يمرر له stop وإذا كان مطلوباً أن يشغله يمرر له start

# part of simple rc
# take runlevel from argument 1
runlevel=$1
# distro links "/etc/rc$runlevel.d/" to "/etc/rc.d/rc$runlevel.d/"
# like /etc/rc.d/rc2.d/ & /etc/rc2.d/
for i in /etc/rc$runlevel.d/K*
do
	[ -x $i ] && $i stop
done
for i in /etc/rc$runlevel.d/S*
do
	[ -x $i ] && $i start
done

tipتلميح

[ -x $i ] تعني افحص هل الملف قابل للتنفيذ (هل يسمح لي بتشغيله) إذا نجح الفحص عندها نفذ ما بعد ‘&&‘

tipتلميح

الملفات في توزيعتك أكثر تعقيداً لأنها تستعمل وظائف خاصة لتجميل وترجمة الرسائل. هذه الوظائف موجودة في ملف اسمه /etc/init.d/functions مثل وظيفة لطباعة [OK] بالأخضر عند النجاح و [Fail] بالأحمر عند الفشل وربما في ماندريك المعرب [فشل] بدلاً من كتابتها في كل ملف.

في العادة تعمل هذه النصوص على إيقاف المراقب من خلال kill أو تقوم بعملية الإلغاء المناسب مثلاً umount وللتشغيل تعمل على استدعاء المراقبات daemon مثل talkd أو بعمليات تفعيل مناسبة مثل mount أو إضافة تعريف module بواسطة insmod أو modprobe . في الحقيقة تسميته تعريف غير دقيقة لأن module قد يكون طريقة تشفير مثلاً. التعريفات موجودة في دليل /lim/modules ثم إصدار النواة uname -r حيث تجد ملفات o أو ko في الأنوية 2.6 لتشغيل التعريف modprobe foo حيث foo اسم التعريف دون الدليل ودون o لعرض التعريفات الحالية lsmod و rmmod foo لإزالة تعريف foo. لمعرفة وصف لتعريف معين modinfo -d foo ولمعرفة ما يأخذ من معاملات modinfo -p foo أما insmod فهي طريقة قديمة لما يقوم به modprobe.

وتأتي كل توزيعة ببرنامج رسومي تفاعلي يعمل على تفعيل/تثبيط كل واحدة من هذه الخدمات ولكن الفكرة بسيطة كل ما عليك هو عمل رابط للملف في مجلد كل مستوى التشغيل 2-5 يبدأ اسمه ب S ورقم مثلاً ln -s /etc/init.d/gpm /etc/rc2.d/S57gpm ثم إعطاء الإذن بالتنفيذ بكتابة chmod +x /etc/init.d/gpm للتفعيل. أو منع التنفيذ بكتابة chmod -x /etc/init.d/gpm للتثبيط . مثلاً إذا كنت تريد تشغيل الخدمة gpm في مستوى 2 دون مستوى 5 كل ما عليك هو تغيير اسم من /etc/rc.d/rc5.d/S57gpm إلى /etc/rc.d/rc5.d/K17gpm والتأكد من وجود الأول في rc2.d (أختلاف الرقم هو لأن من يشغل أخيراً يغلق أولاً)

يمكن القيام بهذه العملية ببساطة باستعمال الأداة chkconfig مثلاً لتفعيل خدمات gpm في المستوى 2 و 3 اكتب chkconfig --level 23 gpm on ولتثبيطه في المستويات الباقية chkconfig --level 01456 gpm off. ولتشغيل أي من هذه الخدمات يدوياً (أي دون إعادة الإقلاع) يمكننا بدل أن نكتب اسم الملف في المجلد /etc/rc.d/init.d/ متبوعاً بالمعامل المناسب الذي غالباً ما يكون start و stop و resart و state ولكن يمكنك استعمال الأداة service متبوعة باسم الخدمة ثم المعامل مثلاً لتشغيل gpm اكتب service gpm start.

يلاحظ وجود وصلة باسم /etc/rc1.d لتشير إلى /etc/rc.d/rc1.d ... إلى آخر الستة مستويات تشغيل ، كما ونجد وصلة باسم /etc/init.d تشير إلى /etc/rc.d/init.d هذه الوصلات موجودة للتوافق بين التوزيعات حيث قد تكون الوصلات في توزيعة هي الأدلة في أخرى . ومن الأمثلة على الخدمات services برنامج لتفحص بطارية الجهاز المحمول وإدارة الطاقة apm وآخر من أجل تعريف الصوت alsa وآخر من أجل الماوس في ال console (اسمه gpm) وبرامج تعريب ال console (اسمه acon)

ثم يتم تشغيل عدد من الطرفيات الوهمية VT (أي Virtual Terminal) وهي شاشات من منفصلة يتم التنقل بينها ب ctrl+alt+Fn ( و Fn هي F1 F2 F3 ...) يتحكم في عددها مجموعة من الأسطر في ملف inittab وهذا مثال

1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
لاحظ أن عددها 6 إذا أردت جعلها 4 اشطب آخر سطرين أما إذا أردت جعلها 7 أضف سطر مع تغيير أول رقم وآخر رقم.
الرقم الأول للعد والتعريف (لا معنى له) ،ومجموعة الأرقام الأخرى 2345 هي المستويات التي ستعمل فيها ،أما /sbin/mingetty tty1 فهي اسم البرنامج الذي سينفذ، أما respawn تعني أنه إذا أُغلق هذا البرنامج فإن init سوف يقوم بتشغيله مرة اخرى

إن ttyN (مثل tty1 ) عبارة عن الجهاز الذي يمثل ال VT لتفهم ذلك جرب الأوامر التالية

Press ctrl+alt+F1 and login
bash$ echo "Hello Ali"
Hello Ali
bash$ echo "Hello Ali" >> /dev/tty2
Nothing printed , press ctrl+alt+F2 ,and woo

4.3.10 تسجيل الدخول بمعرف وكلمة سر

قلنا أن هناك عدد من الطرفيات VT تشغل برنامج getty وعادة يكون mingetty مهمتها عرض رسالة ترحيبية ( وهي موجودة في ملف /etc/issue ويمكنها أن تحتوي ألوان لا تتعب نفسك في تغيرها لأن هناك بعض الأسطر في rc.sysinit تعيدها إلى ما كانت عليه والسبب طبعاً أن هذه الرسالة في غالب تحتوي اسم وإصدار النواة والتي قد تتغير لهذا تقوم نصوص الإقلاع بإعادة تكوين هذا الملف ) ثم تسأل المستخدم عن اسم الدخول و كلمة السر ثم التحقق من أن الكلمة صحيحة وتشغيل البرنامج الافتراضي وهو عادة مفسر لغة bash الذي تستخدمه لإدخال الأوامر ، طبعا يبدأ من الدليل البيت home folder و الملف الذي يتحكم في ذلك هو passwd قد تجد فيه شيئا كهذا

root:x:0:0::/root:/bin/bash
operator:x:11:0:operator:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
myname:x:1000:100:mygroup:/home/myname:/bin/bash
الخانة الأولى هي اسم المستخدم و الخانة هي كلمة السر المشفرة الرقمان التاليان هما رقم المستخدم ( أي UID ) ورقم المجموعة(أي GID) التي ينتمي لها، الحقل الخامس هو المجموعات الإضافية التي يعتبر عضواً فيها. والحقلان الأخيران هما البرنامج الذي سيشغل(في الأغلبbash) والمكان(الدليل البيت home) الذي سيبدأ فيه في حال نجاحه في الدخول
tipتلميح

أنا لا أتحدث هنا عن الدخول من الواجهة الرسومية X وإنما الدخول إلى runlevel 2 أو الضغط على ctrl+alt+Fn

ال root دائما رقمه صفر ورقم مجموعته صفر.
لاحظ وجود مستخدمين أنت لم تضفهم إنهم لتنظيم علاقات البرامج من الضروري أن يكون مفسر الأوامر لهم هو برنامج nologin أو أي برنامج يمنع الدخول لهم كما أن أرقامهم UID تكون أقل من 100 . هكذا مستخدمين موجودين ليمثلوا صلاحيات برامج معينة بحيث نتحكم في صلاحياته وكأنه مستخدم. لتغير كلمة سر مستخدم اكتب passwd متبوعة بمعرف ذلك المستخدم(اسمه المختصر).
bash$ passwd LOGIN
ومن الضروري أن لا يكون هذا الملف قابل للكتابة وحتى للقراءة عدا للمستخدم الجذر أي أن يكون الإذن الخاص به هو 600 وأن يكون مملوك للمستخدم الجذر (المجموعة غير مهمة)
bash# ls -l /etc/passwd
-rw-r--r-- 1 root root 30 FEB 2003 passwd
bash# chmod 600 /etc/passwd
bash# chown root:root /etc/passwd
ls -l /etc/passwd
-rw------- 1 root root 30 FEB 2003 passwd

عند كل الدخول إلى bash يتم تنفيذ الملفات التالية

/etc/profile
/etc/profile.d/*.sh (only exectable)
~/.bashrc
وهي تحتوي على بعض الإعدادات والمتغيرات العامة مثل
export PATH=/bin:/usr/bin:/sbin:/usr/sbin:.
alias ls="ls --color -F -h"
alias df="df -h"
alias cp="cp -i"
التي تقوم ب

4.3.11 الدخول إلى إكس الشاشة الرسومية

وبمجرد تشغيل getty من هنا وقبل أن تدخل اسمك تعمل الشاشة$الرسومية من هناك هذا إذا كنا في runlevel 5 وذلك لأن ملف inittab به سطر يشبه (السطر من slackware)

x:5:respawn:/etc/rc.d/rc.X
أو يستدعي rc مع تمرير 5 له كما ذكرنا سابقاً ، ديبيان ببساطة يعمل خدمة service مثلاً باسم xdm تعمل على تشغيل الدخول الرسومي. لاحظ الحقل الثاني يحتوي الرقم خمسة أي فقط في المستوى الخامس الواجهة الرسومية، ينفذ هذا الملف أحد البرامج التالية kdm أو gdm أو xdm . ذلك عن طريق نص برمجي script يشبه التالي
if [ -x /usr/bin/gdm ]
	/usr/bin/gdm
elseif [ -x /usr/bin/kdm ]
	/usr/bin/kdm
elseif [ -x /usr/bin/xdm ]
	/usr/bin/xdm
else
	echo "error blah blah"
fi

ينفذ startx الملف ~/.xinitrc أو /etc/X11/xinitrc أما xdm فالملف الخاص به هو /etc/X11/Xsession أو /etc/X11/xinit/xinitrc و Xclients

4.3.12 رسومات قبل ودون إكس

في برنامج تركيب توزيعة ريدهات 7.x تظهر صورة بِطريق قبل دخول إكس ؟! أيضاً في توزيعة ماندريك منذ 8.2 (وربما قبل) عند إقلاع التوزيعة وأثناء تحميل الخدمات تجد خلفية زرقاء رسومية ومؤشر progress bar رسومي حتى قبل دخول إكس وبعد الخروج منه! وفي الكثير من Live CD's تجد في سطر الأوامر الحقيقي console يوجد ظل بِطريق كما أن هناك عدد كبير من الأسطر! هذا بواسطة frame buffer device وكأي جهاز آخر يمكن تعريفة بواسطة module موجود في دليل video اكتب ls /lib/module/`uname -r`/kernel/video يمكن إضافته بواسطة modprobe. وربما تجد تعريف عام vesa موجود ضمن النواة (دون الحاجة ل modprobe) يتم تفعيله بتمرير vga=0301 إلى النواة عبر برنامج الإقلاع lilo أو grub. قد تحتاج تمرير video=XXXX لتحميل تعريف غير القياسي. الرقم 0311 بالست-عشري (يدل عليه وجود الصفر) هنا هو لتحديد الكثافة النقطية لتكون 640x480x16 و يمكن أن نستعمل العشري 785. هذا جدول بالست-عشري

Colours   640x400 640x480 800x600 1024x768 1152x864 1280x1024 1600x1200
--------+--------------------------------------------------------------
 4 bits |    ?       ?      0302      ?        ?        ?         ?
 8 bits |   0300    0301    0303     0305     0161     0307      031C
15 bits |    ?      0310    0313     0316     0162     0319      031D
16 bits |    ?      0311    0314     0317     0163     031A      031E
24 bits |    ?      0312    0315     0318      ?       031B      031F
32 bits |    ?       ?       ?        ?       0164      ?
الأداة fbset تمكنك من تعديل خيارات الجهاز مثل الكثافة النقطية وموقع(توسيط) الجزء المرئي. مثلاً لعرض معلومات عن الطور الحالي اكتب fbset دون معاملات. لمعلومات عامة عن كل الأطوار fbset -i والخيار x لعرض معلومات عن التزامن (تلزم في إكس) لإختيار أحد الأطوار يكفي ذكر اسمه (موجودين في /etc/fb.modes) مثلاً fbset 800x600@65. الخيار g متبوع بالأبعاد والأبعاد الافتراضية والعمق اللوني (بت) مثل fbset -g 800 600 800 600 16 الخيار move متبوع بأحد الإتجاهات right أو left أو up أو down ثم بالخيار step لتحديد المقدار من أجل تحريك الجزء المرئي لتوسيطه. الخيار accel متبوع ب true أو false لتفعيل أو تثبيط التسريع. إذا كان هناك أكثر من بطاقة عرض حدد أيها بالخيار fb متبوعاً بالجهاز مثلاً fbset -i -fb /dev/fd0 انظر كتيبات fbset(1) fb.modes(5) fbdev(4)

مراجع و وصلات


<< السابق كتاب لينكس الشامل التالي >>