محمد أحمد العيل

المساهمون
  • المساهمات

    206
  • تاريخ الانضمام

  • تاريخ آخر زيارة

السُّمعة بالموقع

94 Excellent

المعلومات الشخصية

  • النبذة الشخصية مهندس نظم معلومات، أكتب في مدونتي (تلميحات تقنية) عن البرامج الحرة ومفتوحة المصدر. لدي خبرة في التطوير بلغة جافا وإدارة قواعد بيانات MySQL و Oracle، إضافة إلى إدارة أنظمة لينوكس (دبيان ومشتقاتها).
  • الموقع الالكتروني

5 متابعين

آخر الزُوّار

2,996 زيارة للملف الشّخصي
  1. إدارة بيئة KVM بأدوات سطر الأوامر

    سنعرض في هذا الدرس، الرابع من سلسلة دروس الحوسبة الافتراضية باستخدام KVM، كيفية إدارة الآلات الافتراضية عن طريق أدوات تعمل على سطر الأوامر؛ بدلا من واجهة virt-manager الرسومية. تفيد أدوات سطر الأوامر خصوصا في كتابة السكربتات لأتمتة Automating المهام. سنرى الأدوات التاليّة: virt-install: لإنشاء الآلات الافتراضية وضبطها. virsh: لإنشاء مجامع التخزين وإعدادها. qemu-img: لإدارة تجزئات التخزين الافتراضية. إعداد مجمع تخزين تُعد أداة virsh على سطر الأوامر واجهةً لإدارة الآلات الافتراضية وإعدادها. سنستخدم هذه الأداة في الفقرات المقبلة لإنشاء مجمع تخزين لبيئة KVM. ننفذ الأمر pool-define-as مع virsh لتعريف مجمع تخزين جديد. نمرّر للأمر اسم المجمع، نوعه ومعطيات النوع. يبلغ عدد معطيات نوع المجمع خمسة، وتختلف معطيات نوع المجمع التي يجب تمريرها إلى الأمر من نوع إلى أخر. إن أردنا - مثلا - إنشاء مجمع تخزين مماثل للمجمع SPool1 الذي أنشأناه في الدرس الماضي ، والذي هو من نوع dir فسنحتاج لذكر المعطى target (الأخير من المعطيات الخمسة، ويشير إلى مسار مجلّد على النظام المضيف) فقط ونعوّض المعطيات الأربعة المتبقية بعلامة -: $ sudo virsh pool-define-as SPool1CL dir - - - - "/mnt/spools/Spool1New" Pool SPool1CL defined تظهر بعد تنفيذ الأمر رسالة توضّح أن مجمع التخزين قد عُرِّف. ملحوظة: أسمينا مجمع التخزين SPool1CL لتمييزه عن مجمع التخزين الذي أنشأناه في الدرس السابق. يمكننا سرد جميع مجامع التخزين المتوفّرة على النظام بتمرير المعطى all-- إلى الأمر virsh pool-list: $ sudo virsh pool-list --all Name State Autostart ------------------------------------------- default active yes SPool1 active yes SPool1CL inactive no SPool2 active yes ستلاحظ ظهور مجمع التخزين SPool1CL إلى جانب مجامع التخزين التي أنشأناها في الدرس الماضي؛ لكنّه يختلف عنها في الحالة State والتفعيل التلقائي (Autostart). في الواقع، الأمر السابق يعرّف مجمع تخزين، ولكنه لا ينشئه فعليا. ننفّذ الأمر virsh pool-build لإنشاء مجمع التخزين SPool1CL المعرَّف أعلاه: $ sudo virsh pool-build SPool1CL Pool SPool1CL built تظهر بعد تنفيذ الأمر رسالة تخبرنا بإنشاء المجمع SPool1CL. يمكننا الآن تفعيل SPool1CL (تغيير الحالة من خامل inactive إلى نشِط active): $ sudo virsh pool-start SPool1CL Pool SPool1CL started إن أعدنا سرد جميع مجامع التخزين في النظام فسنلاحظ تغيّر حالة SPool1CL من inactive إلى active: $ sudo virsh pool-list --all Name State Autostart ------------------------------------------- default active yes SPool1 active yes SPool1CL active no SPool2 active yes بقي لنا تفعيل التفعيل التلقائي لـSPool1CL بتنفيذ الأمر التالي: $ sudo virsh pool-autostart SPool1CL Pool SPool1CL marked as autostarted فلنعرض معلومات مفصّلة عن مجمع التخزين الذي أكملنا إنشاءه للتو: $ sudo virsh pool-info SPool1CL Name: SPool1CL UUID: 120247f3-669c-4868-8c1e-bbd134077f55 State: running Persistent: yes Autostart: yes Capacity: 184.33 GiB Allocation: 17.90 GiB Available: 166.43 GiB مجمع التخزين SPool1CL جاهز الآن للاستخدام. يُضبَط مجمع تخزين جديد إذن على خطوات: التعريف pool-define-as، الإنشاء pool-build، التفعيل pool-start والتفعيل التلقائي pool-autostart. إعداد تجزئات تخزين افتراضية حان الآن دور التجزئات الافتراضية التي نستخدم الأداة qemu-img لإعدادها. سننشئ بهذه الأداة تجزئة افتراضية جديدة على مجمع التخزين SPool1CL. نحدّد للأداة الأمر الذي نريد تنفيذه (create بالنسبة للإنشاء)، صيغة تجزئة التخزين، مسار الملفّ الخاصّ بالتجزئة وحجمها: $ sudo qemu-img create -f raw /mnt/spools/Spool1New/SVol1.img 10G Formatting '/mnt/spools/Spool1New/SVol1.img', fmt=raw size=10737418240 لاحظ أن مسار الملفّ الخاصّ بالتجزئة mnt/spools/Spool1New/SVol1.img/ يوجد ضمن المجلّد mnt/spools/Spool1New/ الخاصّ بمجمع التخزين الذي أنشأناه أعلاه (تذكّر أننا حدّدنا النوع dir، الذي يحفظ التجزئات الافتراضية ضمن مجلد يوجد في نظام التشغيل). يمكن التحقّق من خاصيّات التجزئة بتنفيذ الأمر qemu-img info: $ sudo qemu-img info /mnt/spools/Spool1New/SVol1.img image: /mnt/spools/Spool1New/SVol1.img file format: raw virtual size: 10G (10737418240 bytes) disk size: 0 تحذير: تجنّب استخدام الأمر qemu-img للتعديل على تجزئات تستخدمها آلالات افتراضية نشطة، أو أي عمليّة Process أخرى؛ فقد يؤدي ذلك إلى إفساد التجزئة. إنشاء آلات افتراضية الخطوة الأخيرة هي إنشاء آلة افتراضية وتثبيت نظام تشغيل عليها؛ نستخدم الأداة virt-install لهذا الغرض. يتطلّب إنشاء آلة افتراضية جديدة تمرير المعطيات التاليّة إلى الأمر virt-install: اسم الآلة الافتراضية name--. مسار التجزئة التي نريد استخدامها مع الآلة الافتراضية disk path--. كيفية الاتصال بالآلة الافتراضية graphics--. تكون هذه القيمة عادة spice (اسم برمجية للتخاطب مع أسطح المكتب الافتراضية، موجودة في حزمة libvirt-bin). عدد المعالجات الافتراضية vcpu--. حجم الذاكرة العشوائية بالميغابايت ram--. مسار ملفّ ISO المستخدَم لتثبيت نظام التشغيل الضيف على الآلة الافتراضية cdrom--. واجهة الشبكة الافتراضية network--. $ sudo virt-install --name=win7 --disk path=/mnt/spools/Spool1New/SVol1.img --graphics spice --vcpu=2 --ram=4096 --cdrom=/home/zeine77/Documents/ISOs/GRMCULFRER_FR_DVD.iso --network bridge=virbr0 يبدأ بعد تنفيذ الأمر إنشاءُ الآلة الافتراضية. ثم تظهر نافذة منبثقة جديدة لبدء تثبيت نظام التشغيل الضيف. ترجمة - بتصرّف - لمقال How to Manage KVM Virtual Environment using Commandline Tools in Linux لصاحبه Mohammad Dosoukey.
  2. رأينا في الدرسين السابقين من هذه السلسلة ( تثبيت KVM وإنشاء آلات افتراضية Virtual machines باستخدامه على أوبونتو و إنشاء آلات افتراضية في بيئة KVM بوسائط تثبيت شبكية) كيفية استخدام virt-manager لإنشاء آلات افتراضيّة وتثبيت أنظمة تشغيل (ضيفة) عليها، انطلاقا من وسيط تخزين محلي أو عبر الشبكة. سنتابع في هذا الدرس مع virt-manager ونرى كيفية إدارة وسائط تخزين افتراضيّة Virtual storage devices. تستخدَم أنظمة التشغيل يوميا وسائط تخزين بنظم ملفات File systems مختلفة، بعضها محلّي Local وآخر يعمل عبر الشبكة. لا توجد عموما اختلافات كبيرة بين مبادئ عمل وسائط التخزين الافتراضية وتلك الملموسة Physical. تُنشأ الأقراص الخاصّة بالآلات الافتراضية في بيئة KVM اعتمادا على أقراص التخزين الملموسة التي يتخاطب معها النظام المُضيف. يتعامل نظام التشغيل مع أقراص التخزين حسب تجزئات Partitions (أو Volumes)، ويتكوّن كل قرص صلب من تجزئة أو أكثر. بالنسبة لبيئة KVM فإنها تتعامل مع التجزئات الافتراضية ضمن مجموعات تُسمّى مجامع (أو أحواض) التخزين Storage pools. يجب أولا إنشاء مَجمع تخزين ثم ننشئ به تجزئة جديدة لقرص افتراضي. إنشاء مجامع تخزين Storage pools في بيئة KVM نبدأ أولا بعرض مجامع التخزين المتوفّرة بالنقر على قائمة Edit (تعديل) ضمن برنامج virt-manager، ثم Connection Details (تفاصيل الاتصال) ونختار تبويب Storage (تخزين). يوجد مبدئيًّا مجمع تخزين باسم default يحفظ التجزئات الافتراضية على المسار var/lib/libvirt/images/. ستلاحظ وجودَ التجزئة الخاصة بنظام التشغيل الضيف الذي أنشأناه في الدرس الأول (اخترنا عند إعداد التخزين في الخطوة 4 مساحة تخزين افتراضية موجودة سلفا). سننشئ في الخطوات التاليّة مجمع تخزين جديدا، بالنقر على زر + في الجانب السفلي الأيسر من النافذة. تظهر نافذة جديدة لإعطاء اسم لمجمع التخزين واختيار نوعه. يدعم KVM ثمانية أنواع لمجامع التخزين: dir: يحفظ التجزئات الافتراضية ضمن مجلد يوجد في نظام الملفات الذي يستخدمه نظام التشغيل . disk: يستخدم أقراصا صلبة ملموسة لحفظ التجزئات الافتراضية بداخلها. fs: يستخدم تجزئات تخزين مهيّأة سلفا لتخزين التجزئات الافتراضية. netfs: يستخدم وسائط تخزين متشاركة عبر الشبكة، مثل NFS، من أجل حفظ التجزئات الافتراضية. gluster: يحتفظ بالتجزئات الافتراضية ضمن وسيط تخزين ملموس يعمل بنظام الملفات GlusterFS. iscsi: يحفظ التجزئات الافتراضية في وسائط تخزين متوفّرة على الشبكة ببروتوكول ISCSI. scsi: يستخدم وسيط تخزين محلي يعمل بنظام SCSI. lvm: يعتمد على مدير التجزئات المنطقية لتخزين التجزئات الافتراضية. سنختار في هذه الخطوة استخدام مجمع تخزين من نوع dir (مجلد في نظام التشغيل المُضيف)؛ فهو النوع الأكثر شيوعا ولا يحتاج للتعديل على بنية نظام الملفات المحلية. لا توجد تقييدات على مكان وجود المجلد الخاص بمجمع التخزين، ولكن من المستحسَن أن يكون على تجزئة منفصلة؛ مع التأكد من الأذون والملكية الخاصة بالمجلّد حتى يمكن ل KVM التعامل معه. تأكد من أن التجزئة التي تريد إنشاء المجمع عليها فارغة، ثم ركّبها على النحو التالي: sudo mount -t ext4 /dev/sdb4 /mnt/spools/SPool1 تحذير: يمكن أن يؤدي استخدام تجزئة غير فارغة إلى مسح محتوياتها. حيث dev/sdb4/ التجزئة الملموسة وmnt/spools/SPool1/ مجلد التركيب. استخدم الأمر lsblk لعرض التجزئات المتوفرة لديك (أو الموجودة على قرص خارجي)؛ كما يمكنك استخدام الأداة الرسومية GParted لنفس الغرض. يظهر في النافذة التالية المسار الذي تريد حفظ تجزئة التخزين الافتراضية فيه. إن كنت تستخدم تجزئة منفصلة فتأكد من ذكر مسار مجلد التركيب (مثلا mnt/spools/SPool1/) هنا. يظهر مجمع التخزين SPool1 بعد إنشائه في القائمة ضمن تبويب Storage السابق. أنشأنا مجمع تخزين ويمكننا الآن إنشاء تجزئة تخزين افتراضية عليه؛ ولكن قبل ذلك سنرى نوعا آخر من أنواع مجامع التخزين، وهو fs. يشير النوع fs إلى أننا نريد استخدام تجزئة قرص ملموسة كاملة، بدلا من مجلد فقط. ستحتاج لإعداد تجزئة قرص ملموس جديدة. تأكد من اسم التجزئة الجديدة (وأنها فارغة) ثم أعدّها لاستخدام نظام الملفات ext4 (على سبيل المثال) بالأمر التالي أو ببرنامج إدارة الأقراص المفضّل لديك: sudo mkfs.ext4 /dev/sdb6 أنشئ أيضا مجلدا جديدا (مثلا SPool2) في النظام المُضيف لتركيب القرص عليه. ملحوظة: اكتف بتهيئة التجزئة وإنشاء المجلد دون تركيبها عليه. سيتولى KVM هذه المهمة. يمكننا الآن إنشاء مجمع تخزين جديد وتسميته مع تحديد نوع المجمع بـfs. حدد في الخطوة التالية من إنشاء المجمع مسار مجلد التركيب (مثلا mnt/spools/SPool2/) في الخانة Target Path (المسار المستهدَف) ومسار التجزئة التي أعددناها سابقا (dev/sdb6/ في المثال) في الخانة Source Path (المسار المصدَر). يظهر مجمع التخزين الجديد في قائمة وسائط التخزين سنناقش في الدرس الموالي إنشاء نوع آخر من مجامع التخزين (عن طريق سطر الأوامر). ننتقل الآن لإنشاء تجزئة جديدة. إضافة تجزئة تخزين افتراضية إلى مجمع تخزين في بيئة KVM توجد صيغ عدّة لتجزئات التخزين. تمكّن هذه الصّيغ من استخدام التجزئة مع مراقبين Hypervisors مختلفين: QEMU، VMware، VirtualBox أو Hyper-V. حدّد مجمع التخزين الذي تريد إضافة التجزئة إليه (SPool2 مثلا) ثم انقر على زر + الموجود تحت بيانات مجمع التخزين أمام عبارة Volumes (التجزئات) لتظهر نافذة إضافة تجزئة. حدّد اسم التجزئة الجديدة والصيغة Format التي تريد استخدامها لإنشاء التجزئة ومساحتها ثم انقر على زر Finish (إنهاء). إن كنت تنوي استخدام التجزئة على مراقب آخر غير KVM في ما بعد فتأكد من اختيار صيغة يدعمها ذلك المراقب. تظهر التجزئة الجديدة ضمن قائمة التجزئات الموجودة في مجمع التخزين SPool2. ترجمة - بتصرّف - لمقال How to Manage KVM Storage Volumes and Pools for Virtual Machines – Part 3 لصاحبه.
  3. يتناول هذا المقال، الثاني من سلسلة من أربعة أجزاء، كيفيّة توزيع آلات افتراضيّة عبر وسائط شبكة في بيئة تستخدم KVM. تأكد - قبل تنفيذ الخطوات المشروحة هنا - من تثبيت المتطلّبات المذكورة في الجزء الأول من السلسلة. تثبيت نظام تشغيل عن طريق خادوم FTP في بيئة KVM سنثبّت لأغراض هذا الدرس خادوم FTP على النظام المُضيف؛ وذلك باتباع الخطوات التالية (راجع درس كيفية تنصيب وإعداد خادوم FTP على أوبنتو لتفاصيل أكثر عن إعداد خادوم FTP). سنكتفي هنا بالأوامر الأساسية للحصول على الخادوم وتثبيت نظام ضيف على آلة افتراضية عن طريقه. للتثبيت: $ sudo apt install vsftpd ثم نعدّل ملف الإعداد etc/vsftpd.conf/ للسماح بالوصول المجهول لخادوم FTP: $ sudo nano /etc/vsftpd.conf نغيّر قيمة التعليمة anonymous_enable من NO إلى YES؛ ثم نعيد تشغيل الخادوم: $ sudo systemctl restart vsftpd.service إن أردنا مشاركة ملفات عن طريق خادوم FTP فيمكننا وضعها على المسار ‎/srv/ftp. جهّزنا خادوم FTP لمشاركة الملفات؛ حان الآن وقت اختيار ملف ISO الخاص بنظام التشغيل الذي نريد تثبيته على الآلة الافتراضية (النظام الضّيف)؛ ونحدّد نقطة تركيب Mount point ليُركَّب عليها هذا الملف: $ sudo mount -t iso9660 -o ro ISO_FILE MOUNT_POINT تشير ISO_FILE إلى المسار الذي يوجد عليه ملف ISO وMOUNT_POINT إلى مسار مجلد التركيب. ملحوظة: تمثّل ملفات ISO نسخا خامة من أقراص صلبة ويجب تركيبها على نظام الملفات File system حتى يمكن لنظام التشغيل التعامل معها. يتعامل نظام التشغيل مع المجلَّد الذي رُكِّب عليه المحتوى كما لو كان يقرأ البيانات من قرص مًدمَج (CD أو DVD). نحدّد أثناء التركيب نظام الملفات المناسب للتعامل مع ملف ISO وهو iso9660. لا يمكن لحدّ الساعة الوصول إلى محتويات الملفّ أعلاه عن طريق FTP؛ إذ أنها لا توجد في المسار الذي يمكن لخادوم تشارك الملفات القراءة منه. ننشئ مجلدا جديدا على المسار ‎/srv/ftp: $ sudo mkdir /srv/ftp/ubuntu-14.04 ثم ننقل إليه محتويات ملفّ ISO انطلاقا من نقطة التركيب: $ sudo cp -r /mnt/ubuntu-14.04/* /srv/ftp/ubuntu-14.04/ حيثُ mnt/ubuntu-14.04/ هي نقطة التركيب (MOUNT_POINT) السابقة. نتأكد من أن مجموعة المستخدمين ftp هي المالكة للمجلد ubuntu-14.04 الذي أنشأناه للتو حتى يمكن لخادوم FTP قراءة محتوياته: $ sudo chown -R :ftp /srv/ftp/ubuntu-14.04/ يمكننا الآن استخدام أداة virt-manager لإنشاء آلات افتراضية تستخدم وسيط التثبيت الموجود على خادوم تشارك الملفات. تظهر عند طلب إنشاء آلة افتراضية جديدة النافذة التالية. نحدّد خيار التثبيت عبر الشبكة Network Install وننتقل للخطوة الموالية. نحدّد في هذه الخطوة المسار URL الذي يوجد عليه وسيط التثبيت. بما أننا نريد الوصول إلى خادوم FTP فالمسار سيكون حسب الصيغة التالية: ftp://ip_or_host/folder حيثُ ip_or_host عنوان IP الخاص بخادوم تشارك الملفات أو اسم المضيف Host الخاص به؛ وfolder المجلّد حيث توجد ملفات نظام التشغيل الذي نريد تثبيته على الآلة الافتراضية (مجلد ubuntu-14.04 الموجود على خادوم تشارك الملفات). تذكّر أننا في الدرس السابق ثبّتنا حزمة bridge-utils وذكرنا أنها تنشئ جسرا يعمل بين الآلات الافتراضية (النظام الضّيف) والنظام المُضيف. ستلاحظ بعد تثبيت الحزمة ظهور واجهة شبكة جديدة لديك على النظام المُضيف (حيثُ ثبتتنا KVM وأدواته) باسم virbr0. يمكن للأجهزة الافتراضية التواصل مع النظام المضيف عن طريق هذه الواجهة؛ لذا سنحصُل على عنوانها بتنفيذ الأمر التالي: $ ip -4 a show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000 inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 valid_lft forever preferred_lft forever يظهر من نتيجة الأمر أعلاه أن الواجهة vibr0 لديها العنوان 192.168.122.1 (قد يختلف العنوان لديك). يصبح عنوان المجلّد حيث توجد ملفات التثبيت على النحو التالي: ftp://192.168.122.1/ubuntu-14.04 وهو العنوان الذي أعطيناه للأداة virt-manager كما في الصورة أعلاه. تشبه الخطوات الموالية (من 3 إلى 5) الخطوات المذكورة في الجزء الأول من هذه السلسلة. تثبيت نظام تشغيل عن طريق خادوم وِب في بيئة KVM لا تقتصر إمكانيات التثبيت عبر الشبكة على الوسائط الموجودة على خواديم تشارك ملفات، بل يمكن استخدام خواديم أخرى مثل خواديم الوِب (Apache أو Nginx على سبيل المثال). سنأخذ في هذه الفقرة مثالا لإنشاء آلة افتراضية عبر الأداة virt-manager وتثبيت نظام تشغيل ضيف عن طريق وسيط تثبيت موجود على خادوم وِب. راجع درس كيف تثبت حزم MySQL ،Apache ،Linux :LAMP و PHP على أوبنتو 14.04 للمزيد عن تفاصيل تثبيت خادوم وِب Apache؛ أو مقال كيف تثبت حزم MySQL ،nginx ،Linux :LEMP وPHP على أوبنتو 14.04 إن كنت تفضّل خادوم Nginx. يمكن الاكتفاء - لأغراض هذا الدرس - بالجزء الأول من أحد المقالين المذكوريْن سابقا (تثبيت Apache أو Nginx دون بقية الحزم). لا يختلف تثبيت النظام الضّيف انطلاقا من وسيط تثبيت على خادوم وِب عن التثبيت عبر خادوم تشارك ملفات سوى في الخطوة الثانية عند تحديد العنوان. في حالة خادوم الوِب يُحدّد العنوان على النحو التالي: http://192.168.122.1/ubuntu-14.04 رأينا في هذا الدرس والدرس السابق كيفية استخدام الأداة الرسومية virt-manager لإنشاء آلات افتراضيّة في بيئة تستخدم KVM للحوسبة الافتراضية؛ سنرى في الدرس الموالي كيفية إدارة الأقراص الافتراضية في هذه البيئة. ترجمة - بتصرّف لمقال How to Deploy Multiple Virtual Machines using Network Install (HTTP, FTP and NFS) under KVM Environment – Part 2 لصاحبه Mohammad Dosoukey.
  4. تقدّم تقنية KVM (اختصار Kernel-based Virtual Machine؛ الأجهزة الافتراضيّة المعتمدة على نواة لينكس) آلية لتشغيل الحوسبة الافتراضيّة (التخيّليّة أو الوهميّة) Virtualization على الأنظمة العاملة بلينكس. تمكّن هذه الآلية - التي تتوفّر على هيئة وحدة Module في نواة لينكس منذ الإصدار 2.6.20 - من استخدام أنظمة تشغيل مستقلّة ومنفصلة في وقت واحد على نفس العتاد Hardware. يتولّى نظامٌ يُعرَف بالمضيف Host تشغيل العتاد Hardware عن طريق برنامج يُعرَف بالمراقِب Hypervisor. يوفّر المراقب موارد (معالج، ذاكرة عشوائية، أجهزة طرفية وغيرها) للآلات الافتراضيّة. يُسمّى النظام الذي يُشغّل الآلة الافتراضيّة بالنظام الضيف Guest. يقدّم KVM الميزات التاليّة: التعهّد الزائد Over-commiting: يعني تخصيص موارد افتراضيّة (المعالجات والذاكرة العشوائية) أكثر من تلك التي يوفّرها العتاد. التموين السريع Thin provisionning: يسمح بالتوزيع المرن للمساحة التخزينية المتوفّرة والبحث عن أمثل طريقة لمشاركتها بين الآلات الافتراضية. تحجيم الإدخال/الإخراج من القرص Disk I/O throttling: يوفّر إمكانية تعريف حد لطلبات الإدخال والإخراج بالنسبة لكل آلة افتراضيّة. إمكانيّة زيادة قدرات المعالجة الخاصّة بالآلات الافتراضية حسب الطّلب دون الحاجة لإيقافها عن العمل. يتطرّق هذا المقال، الأوّل في سلسلة من أربعة أجزاء، لكيفية استخدام KVM والأدوات التي يوفّرها على توزيعة Ubuntu 16.04. تشترك توزيعات لينكس عموما في الخطوط العريضة، وكثير من الخطوات الواردة في هذه السلسلة. المتطلّبات يجب أن تكون لدى العتاد الذي يعمل عليه النظام المُضيف القدرةُ على تنفيذ طلبات المُراقب عن طريق ما يُعرَف بامتدادات العتاد الخاصّة بالحوسبة الافتراضية Hardware virtualization extensions؛ وهو ما توفّره أغلب الحواسيب الحديثة. يمكّن الأمر kvm-ok من التأكد من جاهزيّة جهازك لاستخدام KVM: $ kvm-ok INFO: /dev/kvm exists KVM acceleration can be used يظهر من نتيجة الأمر أعلاه أن الجهاز قادر على استخدام التقنيّة. تأكّد، إن كانت النتيجة مخالفة، من أن امتدادات العتاد موجودة ومفعّلة في محمّل الإقلاع BIOS (أو UEFI) الخاص بجهازك. تثبيت أدوات KVM ونشر الآلات الافتراضية سنحتاج لبضعة حزم قبل أن يمكننا البدء في إنشاء آلات افتراضية باستخدام KVM. يُثبّت الأمر التالي هذه الحزم: $ sudo apt install qemu-kvm libvirt-bin bridge-utils virt-manager تعمل حزمة أدوات kvm-qemu على تشغيل وحدة KVM في النواة لتنفيذ الشفرة البرمجية الخاصّة بالآلة الافتراضية. كما أن هذه الأدوات تحجز الذاكرة العشوائية والموارد التي تحتاجها الآلات الافتراضيّة للعمل؛ زيادة على كونها تعمل على محاكاة عمل الأجهزة الطرفية Peripherals الملموسة التي يتوفّر عليها النظام المُضيف من أجل إتاحة أجهزة طرفية افتراضية للنظام الضيف. تتيح الحزمة libvirt-bin مجموعة من الأدوات للتخاطب مع قدرات الحوسبة الافتراضية التي يتوفّر عليها الجهاز المضيف. نذكر مثلا الأداة virsh التي يمكن من خلالها إنشاء آلات افتراضية، تعليقها (توقيف مؤقّت) أو إيقافها عن العمل. تحوي الحزمة bridge-utils الأدوات الضرورية لإنشاء أجهزة طرفية تعمل جسورا Bridge بين واجهات شبكة عدّة، ولإدارة هذه الأجهزة. من المهمّ توفّر هذه الميزة حتى يمكننا ضبط شبكة حواسيب تشمل الآلات الافتراضية. توفّر حزمة virt-manage واجهة رسومية لإدارة الآلات الافتراضية. الخطوة التاليّة هي إضافة المستخدم الحالي إلى مجموعة المستخدمين libvirtd حتى يمكنه استخدام الآلات الافتراضيّة التي ننشئها عن طريق KVM؛ إذ لا تُتاح هذه الوظيفة لغير أعضاء هذه المجموعة والحساب الجذر: $ sudo adduser zeine77 libvirtd نطلُب، من أجل التأكد من أن كل شيء على ما يُرام، سردَ الآلات الافتراضية المتوفّرة؛ وذلك باستخدام الأمر virsh على النحو التالي: $ virsh -c qemu:///system list Id Name State ---------------------------------------------------- لا توجد آلات افتراضية لحد الساعة، لذا لن تظهر معلومات عن هذه الآلات؛ وسيكتفي الأمر بعرض أسماء أعمدة (المعرّف Id، الاسم Name والحالة State) تصف معلومات تتعلّق بالآلات الافتراضية. تشير هذه النتيجة إلى أننا مستعدون الآن للبدء في استخدام KVM. إنشاء آلات افتراضية باستخدام KVM سنستخدم في هذا الجزء من المقال الأداة virt-manager للتخاطب مع KVM من أجل إنشاء آلات افتراضية. يمكن تشغيل virt-manager من قوائم سطح المكتب الذي تستخدمه (Gnome، KDE أو غيرهما) أو بتنفيذ الأمر virt-manager في سطر الأوامر. تظهر النافذة التاليّة بعد تشغيل الأداة. يظهر في واجهة البرنامج أنه متّصل بمضيف محلي يستخدم المُراقب QEMU/KVM. يمكن من هذه الواجهة الاتّصال بمضيفات Hosts بعيدة (توجد على أجهزة مغايرة للجهاز الذي تعمل عليه الأداة virt-manager)، وذلك عن طريق القائمة …File -> Add Connection ثم تحديد الخانة Connect to remote host وذكر البيانات المطلوبة. ننقر على زر Create a new virtual machine في واجهة virt-manager لإنشاء آلة افتراضية جديدة. تظهر نافذة جديدة تطلُب تحديد طريقة لتثبيت نظام التشغيل الضّيف على الآلة الافتراضية. توجد أكثر من طريقة كما يظهر في لقطة الشاشة أعلاه. سنحدّد خيار Local install media (وسيط تثبيت محليّ). تظهر النافذة التاليّة. يمكن عبر الواجهة الظاهرة في الصورة أعلاه الاختيار بين قرص مُدمَج (CD أو DVD) أو ملفّ ISO. سنحدّد الخيار الثاني (ملف ISO) وننقر على الزّر Browse. تظهر النافذة التالية. نستطيع عبر هذه النافذة إنشاء مساحة تخزين Storage volume افتراضية لاستخدامها مع الآلة؛ إلا أننا لن نفعل ذلك الآن وسننقر على الزّر Browse Local لتحديد المسار Path الذي يوجد عليه ملفّ ISO. يعود البرنامج بعد تحديد المسار إلى واجهة الاختيار الخاصة بوسيط التثبيت. نلاحظ أن البرنامج تعرّف تلقائيا على نوعية نظام التشغيل وإصداره اعتمادا على اسم وسيط التثبيت. ثم يطلب منا البرنامج ضبط إعدادات المعالج والذاكرة العشوائية الخاصّين بالآلة الافتراضيّة. نختار القيم المناسبة اعتمادا على العتاد المتوفّر على المُضيف ثم ننتقل لإعدادات التخزين. يمكن تحديد أحد خيارين؛ إما إنشاء مساحة تخزين افتراضية جديدة أو اختيار مساحة تخزين افتراضية موجودة سلفا. بما أننا لم نضبُط مساحة تخزين قبلًا فسنحدّد الخيار الأول. ثم ننتقل للخطوة الأخيرة وهي تحديد اسم للآلة الافتراضية. إن أردت تخصيص عمليّة التثبيت فبإمكانك تحديد الخيار Customize configuration before install (تخصيص الإعدادات قبل التثبيت). ثم ننقر على زر Finish. تبدأ الآلة الافتراضية بالعمل مباشرة وتظهر في واجهة برنامج virt-manager شاشةُ التثبيت الخاصّة بنظام التشغيل الضيف على الآلة الافتراضية. توجد في واجهة virt-manager أزرار للتحكّم في الآلة الافتراضية: إعادة التشغيل Reboot، الإيقاف Shut Down، فرض إعادة التعيين Force reset، فرض الإيقاف Force off (يشبه فصل حاسوب عن الطاقة دون إيقاف نظام التشغيل) وحفظ حالة الآلة Save. كما يمكن عن طريق زرّ Open فتح نافذة خاصّة للآلة الافتراضية يمكن عبرها أخذ لقطات سريعة Snapshots. تخزّن اللقطات السريعة جميع البيانات الموجودة على الآلة ويمكن الرجوع إلى هذه اللقطات في حالات مثل حدوث مشكل مع الآلة الافتراضية، توقفها عن العمل أو لإنشاء آلة افتراضية مطابقة لها تماما. ترجمة - بتصرّف - لمقال How to Create Virtual Machines in Linux Using KVM (Kernel-based Virtual Machine) – Part 1 لصاحبه Mohammad Dosoukey.
  5. استخدم اسم المشروع الذي خصّصه لك Heroku بعد تنفيذ الأمر create (راجع مخرجات الأمر heroku create)؛ nameless-chamber-90421 هو اسم المشروع الذي أعطاه Heroku لي عند كتابة الدرس وليست لديك صلاحيات الوصول إليه.
  6. يتناول هذا المقال المفاهيم الأساسيّة للاستيثاق باستخدام LDAP: ماهيّته، متى يُستخدَم ولماذا؛ وكيفيةَ ضبط خادوم LDAP وإعداد عميل للاستيثاق عن طريقه اعتمادا على Red Hat Enterprise Linux 7. سنركّز في هذا الدّرس على الاستيثاق المعتمد على LDAP رغم وجود طرق أخرى للاستيثاق. بيئة المختبر سنفترض وجود بيئة اختبار مكوّنة من جهازيْن تشغّلهما توزيعة RHEL 7: الخادوم: 192.168.2.100 واسم نطاقه المعرَّف بالكامل academy1.virtuallab.dev. العميل: 192.168.2.200 واسم نطاقه المعرَّف بالكامل ldapclient.virtuallab.dev. راجع مقال إنشاء شبكة داخلية افتراضية باستخدام Oracle VirtualBox للمزيد حول إنشاء هذه البيئة باستخدام Oracle VirtualBox، ومقال حول إعداد أسماء المضيفات. ما هو LDAP؟ يعرفّ LDAP (اختصار لـLightweight Directory Access Protocol، الميثاق الخفيف للوصول إلى الدّليل) مجموعة من البروتوكولات التي تسمح لعميل بالوصول إلى معلومات مخزّنة مركزيًّا عبر الشبكة. يتعلّق الأمر بمعلومات يُتاح الوصول إليها من أماكن مختلفة أو لمستخدمين كثر؛ مثل صدفات الدّخول (الولوج) Login shells، مسارات الوصول إلى المجلّدات الشخصيّة للمستخدمين أو معلومات أخرى - عناوين أشخاص، أرقام هواتف - عن مستخدمي النظام، على سبيل المثال لا الحصر. جعلُ هذه المعلومات في مكان مركزي يسهّل من صيانتها وتحديثها ويعني أنه يمكن لأي شخص الوصول إليها إذا كان لديه التصريح بذلك. يدور LDAP حول مفاهيم أساسية ثلاثة: مَدخَل Entry: يُمثّل المَدخَل في LDAP معلومة أو وحدة معلومات، ويُعرَّف باسم مُميَّز Distinguished name. خاصيّة Attribute: وهي بيانات تتعلّق بالمَدخَل. قيم Values: تُسنَد لكلّ خاصيّة قيمة أو مجموعة قيم تفصِل بينها مسافة. يُشار إلى القيمة الوحيدة في المَدخَل (أي التي لا توجد إلا مرة واحدة في خاصيّات المدخل) بالاسم المُميَّز النسبي Relative Distinguished Name. سنرى في الخطوة التاليّة كيفية تثبيت LDAP على كلّ من الخادوم والعميل. تثبيت LDAP وإعداده على الخادوم والعميل يُنفّذ برنامج OpenLDAP مبادئ LDAP على RHEL 7؛ يمكن تثبيته على الخادوم والعميل على التوالي بالأمرين التاليّين: # yum update && yum install openldap openldap-clients openldap-servers # yum update && yum install openldap openldap-clients nss-pam-ldapd تحوي الحزمة nss-pam-ldapd التي نثبّتها على العميل مجموعة دوال مهمّتها البحث عن معلومات في دليل LDAP والاستيثاق من المستخدمين بناءً على المعلومات المتوفّرة على خادوم LDAP. يجب أن نعدّ بضعة أمور بعد اكتمال التثبيت. تأكّد من SELinux يسمح لـLDAP بالعمل عن طريق تفعيل الإعدادات التاليّة على كلّ من الخادوم والعميل. لا تنس استخدام الخيار P- حتى تستمر التعديلات لما بعد إعادة تشغيل النّظام: # setsebool -P allow_ypbind=1 authlogin_nsswitch_use_ldap=1 يتطلّب الاستيثاق عبر LDAP تفعيل الإعداد allow_ypbind، بينما تحتاج برامج أخرى تفعيل الإعداد authlogin_nsswitch_use_ldap حتى يمكنها استخدام LDAP للاستيثاق. ثم نفعّل خدمة slapd التي تنصِت للاتصالات القادمة إلى خادوم LDAP، مبدئيّا على المنفذ 389 وتجيب على الطلبات التي تتلقّاها عبر هذه الاتصالات: # systemctl enable slapd.service # systemctl start slapd.service تذكّر أن نظام التمهيد SystemD يمكّنك من تعطيل الخدمة، إعادة تشغيلها أو إيقافها: # systemctl disable slapd.service # systemctl restart slapd.service # systemctl stop slapd.service تعمل خدمة slapd بصلاحيّات الحساب ldap (وهو ما يمكن التأكد منه بتنفيذ الأمر ps -e -o pid,uname,comm | grep slapd)، الأمر الذي يعني أن هذا الحساب يجب أن يكون مالكَ المجلّد var/lib/ldap/ من أجل أن تستطيع خدمة slapd تعديل مداخل LDAP التي تُنشئها الأدوات الإداريّة، التي لا تعمل إلا بصلاحيّات الحساب الجذر، في المجلّد المذكور. تأكّد قبل تغيير ملكيّة المجلّد var/lib/ldap/ من نسخ نموذج ملفّ الإعداد لقاعدة بيانات LDAP: # cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG # chown -R ldap:ldap /var/lib/ldap ضبط الحساب الإداري لـOpenLDAP وتعيين كلمة سرّ له: # slappasswd مثل ما يظهر في الصّورة التالية: ثم ننشئ ملفّ LDIF باسم ldaprootpasswd.ldif. ملفّات LDIF (اختصار لـ LDAP Data Interchange Format، صيغة تبادل البيانات في LDAP) هي تمثيل للبيانات الموجودة في خادوم LDAP والتغيرات التي تطرأ عليها. نضع البيانات التاليّة في الملفّ ldaprootpasswd.ldif: dn: olcDatabase={0}config,cn=config changetype: modify add: olcRootPW olcRootPW: {SSHA}PASSWORD حيث: PASSWORD: كلمة السّر التي حصلنا عليها أعلاه. cn=config: تشير إلى خيار إعداد عامّ. olcDatabase: اسم قاعادة بيانات معيّنة، توجد عادة على المسار etc/openldap/slapd.d/cn=config/. يُضيف ملفّ ldaprootpasswd.ldif مدخلا إلى دليل LDAP. يشير كلّ سطر في هذا المدخل إلى خاصيّة وقيمتها اللتين تفصل بينهما نقطتان عموديّتان :؛ أي أن changetype، add، dn وolcRootPW خاصيّات توجد قيمها على نفس السّطر، يمين النقطتين. تنبغي المحافظة في الخطوات المواليّة على نفس الأسماء الشائعة =Common Names, cn المستخدمة أعلاه. نضيف الآن مدخلا إلى دليل LDAP باستخدام الأمر ldapadd وتحديد عنوان URI الخاصّ بالخادوم وملفّ LDIF الخاصّ بالمدخل على النحو التالي: # ldapadd -Y EXTERNAL -H ldapi:/// -f ldaprootpasswd.ldif ثم نضيف تعريفات للدليل باستيراد الأمثلة الموجودة في المجلّد etc/openldap/schema/: # for def in cosine.ldif nis.ldif inetorgperson.ldif; do ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/$def; done جعل LDAP يستخدم اسم النطاق في قاعدة بياناته. dn:olcDatabase={1}monitor,cn=config changetype:modify replace: olcAccess olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read by dn.base="cn=Manager,dc=virtuallab,dc=dev" read by * none dn:olcDatabase={2}hdb,cn=config changetype: modify replace: olcSuffix olcSuffix: dc=virtuallab,dc=dev dn: olcDatabase={2}hdb,cn=config changetype: modify replace: olcRootDN olcRootDN: cn=Manager,dc=virtuallab,dc=dev dn: olcDatabase={2}hdb,cn=config changetype: modify add: olcRootPW olcRootPW: {SSHA}07/TOeaEPDlpTscePfA5kyij9mmepdr0 dn: olcDatabase={2}hdb,cn=config changetype: modify add: olcAccess olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=Manager,dc=virtuallab,dc=dev" write by anonymous auth by self write by * none olcAccess: {1}to dn.base="" by * read olcAccess: {2}to * by dn="cn=Manager,dc=virtuallab,dc=dev" write by * read نستخدم الأمر ldapmodify للتعديل على مَداخل الدليل: # ldapmodify -Y EXTERNAL -H ldapi:/// -f ldapdomain.ldif ننشئ ملفّ LDIF باسم baseldapdomain.ldif ونحدّد فيه مداخل لإضافتها إلى الدليل: dn: dc=virtuallab,dc=dev objectClass: top objectClass: dcObject objectclass: organization o: virtuallab dev dc: virtuallab dn: cn=Manager,dc=virtuallab,dc=dev objectClass: organizationalRole cn: Manager description: Directory Manager dn: ou=People,dc=virtuallab,dc=dev objectClass: organizationalUnit ou: People dn: ou=Group,dc=virtuallab,dc=dev objectClass: organizationalUnit ou: Group ثم نضيفها إلى الدليل بتنفيذ الأمر ldapadd (مع تحديد اسم النطاق المناسب): # ldapadd -x -D cn=Manager,dc=virtuallab,dc=dev -W -f baseldapdomain.ldif ملحوظة: أدخل كلمة السّر التي أنشأتها سابقا عندما تُطلب منك. ننشئ حسابَ مستخدم لإضافته إلى دليل LDAP: # adduser ldapuser نبدأ بإنشاء ملفّ LDIF باسم ldapgroup.ldif سنستخدمه لإضافة المجموعة التي ينتمي إليها المستخدم السّابق إلى الدّليل: # nano ldapgroup.ldif نضيف المحتوى التالي إلى الملفّ: dn: cn=Manager,ou=Group,dc=virtuallab,dc=dev objectClass: top objectClass: posixGroup gidNumber: 1012 قيمة الخاصيّة gidNumber هي معرّف المجموعة التي ينتمي إليها المستخدم ldapuserالسابق. يمكن الحصول عليه بتنفيذ الأمر id -g ldapuser. ننفذ الأمر ldapaddعلى النحو التالي لإضافة مدخل لمجموعة المستخدم إلى الدليل: # ldapadd -x -W -D "cn=Manager,dc=virtuallab,dc=dev" -f ldapgroup.ldif نعرّف في ملفّ LDIF جديد باسم ldapuser.ldif بيانات المستخدم ldapuser (استخدم الأمر slappasswd لإنشاء كلمة سرّ للمستخدم وإضافتها للملف): dn: uid=ldapuser,ou=People,dc=virtuallab,dc=dev objectClass: top objectClass: account objectClass: posixAccount objectClass: shadowAccount cn: ldapuser uid: ldapuser uidNumber: 1009 gidNumber: 1012 homeDirectory: /home/ldapuser userPassword: {SSHA}9A93CS4LCUx9L8s6HPw1PB3ClH5JEI0U loginShell: /bin/bash gecos: ldapuser shadowLastChange: 0 shadowMax: 0 shadowWarning: 0 ثم ننفّذ الأمر: # ldapadd -x -D cn=Manager,dc=virtuallab,dc=dev -W -f ldapuser.ldif يمكن باستخدام الأمر ldapdelete حذفُ نفس المستخدم من الدليل على النحو التالي (لن نفعل ذلك هنا): # ldapdelete -x -W -D cn=Manager,dc=virtuallab,dc=dev "uid=ldapuser,ou=People,dc=virtuallab,dc=dev" نطلُب من الجدار الناري السماح لخدمة LDAP بالعمل على المنفذ 389: # firewall-cmd --add-service=ldap # firewall-cmd --permanent --add-port=389/tcp # firewall-cmd reload ننتقل إلى العميل لتفعيل إمكانيّة التسجيل لمستخدمي LDAP. تأكّد من أن العميل يمكنه الوصول إلى الخادوم (والعكس). غيّر - إن لزم الأمر - ملفّ etc/hosts/ لإضافة عنوان الخادوم على العميل (والعكس، العميل على الخادوم). ننفّذ الأمر التالي - على العميل - لضبط طرق الاستيثاق عليه: # authoconfig-tui تظهر الواجهة التالية: تأكد من تحديد خياري Use LDAP وUse LDAP authentication بوضع علامة * أمامهما. استخدم الأسهم للانتقال بين الخيارات، والمسافة لتفعيل خيّار أو تعطيله؛ ثم Enter عند الوصول إلى زرّ Next. أضف في الشاشة المواليّة عنوان خادوم LDAP بالصّيغة ldap://academy1.virtuallab.dev ثم الاسم المُميّز القاعدي DN. لم نستخدم شهادة TLS لذا اترك الخيّار TLS غير محدّد. يمكننا الآن اختبار عمل LDAP على العميل بالبحث في الدليل عن المستخدم ldapuser: # ldapsearch -x cn=ldapuser -b dc=virtuallab,dc=dev يجب أن تظهر جميع معلومات المستخدم ldapuser في الدليل: # extended LDIF # # LDAPv3 # base <dc=virtuallab,dc=dev> with scope subtree # filter: cn=ldapuser # requesting: ALL # # ldapuser, People, virtuallab.dev dn: uid=ldapuser,ou=People,dc=virtuallab,dc=dev objectClass: top objectClass: account objectClass: posixAccount objectClass: shadowAccount cn: ldapuser uid: ldapuser uidNumber: 1009 gidNumber: 1012 homeDirectory: /home/ldapuser userPassword:: e1NTSEF9OUE5M0NTNExDVXg5TDhzNkhQdzFQQjNDbEg1SkVJMFU= (...) نفس الشيء عند استخدام الأمر getent على العميل: # getent passwd ldapuser ldapuser:x:1009:1012:ldapuser:/home/ldapuser:/bin/bash ترجمة - يتصرّف - لمقال RHCSA Series: Setting Up LDAP-based Authentication in RHEL 7 – Part 14 لصاحبه Gabriel Cánepa.
  7. 15 مثالا لإدارة الحزم باستخدام RPM

    تستخدم بعض توزيعات لينكس، خصوصا تلك المعتمدة على Fedora مثل CentOS وRed Hat Enterprise Linux، حزم RPM لتثبيت البرامج وإدارتها. ملف rpm. هو عبارة عن تجميع لبرامج ومكتبات تحتاجها هذه البرامج في حزمة تُستخدَم أداة باسم rpm لتثبيتها. الأداة rpm هي أداة مفتوحة المصدر تحتفظ ببيانات الحزم المثبّتة على النظام في المجلّد var/lib/rpm/. من المهم الانتباه إلى أن أداة rpm لا تستطيع التعامل مع البرامج التي ثُبِّتت انطلاقا من المصدر Source. يحتوي ملفّ rpm. على معلومات من قبيل ماهية الحزمة، من أين تأتي، الاعتماديات التي تحتاجها للعمل، الإصدار… إلخ. توجد خمسة أوضاع أساسية لأداة rpm: التثبيت i-: يُستخدَم لتثبيت حزم RPM. الحذف e-: يُستخدَم لحذف حزمة وإلغاء تثبيتها. الترقية U-: يُحدّث حزمة مثبّتة (تثبيت إصدار جديد من الحزمة). التحقق V-: يُستخدَم للتحقّق من حزمة RPM. الاستعلام q-: يُستخدَم للاستعلام عن حزم RPM. حزم RPM هي حزم قائمة بذاتها؛ تمكن الاستفادة من المواقع التالية للحصول على حزم RPM الخاصّة ببرنامج تريده: redhat.com rpmfind.net. rpm.pbone.net rpmseek.com يقدّم هذا المقال أمثلة لأوامر RPM من أجل المساعدة في تثبيت البرامج، تحديثها أو حذفها على توزيعة تستخدم RPM للتحزيم. ملحوظة: يجب أن تكون لديك صلاحيات الجذر حتى تستطيع إدارة الحزم. التحقق من توقيع حزمة يجب أولا التحقّق من مصدر الحزمة وموثوقيتها قبل تثبيتها. يُستخدم الخيار checksig-- مع الأمر rpm لهذا الغرض. لكي نستطيع التحقق من حزمة فإنه يجب أولا استيراد المفاتيح العمومية Public keys الخاصّة بالنظام الذي نعمل عليه (Fedora، CentOS، RHEL أو غيرها). بالنسبة لتوزيعة Red Hat Enterprise Linux فالأمر على النحو التالي: rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-* نطلب في الأمر التالي التحقق من الحزمة pidgin-1.5.1-6.el3.x86_64.rpm: [root@academy1 ~]# rpm --checksig pidgin-1.5.1-6.el3.x86_64.rpm pidgin-1.5.1-6.el3.x86_64.rpm: (sha1) dsa sha1 md5 gpg OK لاحظ أن نتيجة التحقق هي OK. تثبيت حزمة يطلُب الأمر التالي تثبيت الحزمة pidgin-1.5.1-6.el3.x86_64.rpm التي تحققنا من موثوقيتها أعلاه: [root@academy1 ~]# rpm -ivh pidgin-1.5.1-6.el3.x86_64.rpm Preparing... ########################################### [100%] 1:pidgin ########################################### [100%] تظهر في الأمر أعلاه الخيارات التالية: i-: وضع التثبيت، v-: طلب إظهار رسائل بتقدم عملية التثبيت، h-: طلب إظهار علامات # للدلالة على التقدم الحاصل في تنفيذ خطوات التثبيت. الخياران الأخيران v- وh- ليسا ضروريين. التحقق من اعتماديات حزمة قبل تثبيتها تتيح أداة rpm التحقق من اعتماديات حزمة قبل تثبيتها، مثلا للتحقق من اعتماديات الحزمة pidgin-2.11.0-1.fc24.x86_64.rpm: [root@academy1 ~]# rpm -qpR pidgin-1.5.1-6.el3.x86_64.rpm /bin/sh /bin/sh glib2 >= 2.2 htmlview libICE.so.6()(64bit) libSM.so.6()(64bit) libX11.so.6()(64bit) libXext.so.6()(64bit) libao.so.2()(64bit) libatk-1.0.so.0()(64bit) libaudiofile.so.0()(64bit) (...) يشير الخيار q- إلى أننا في وضع الاستعلام عن الحزمة. يطلب الخيار p- معلومات عن حزمة غير مثبّتة ويسرُد الخيار R- اعتماديّات الحزمة. تثبيت حزمة بغض النظر عن اعتمادياته لا يقبل rpm في الحالة العادية تثبيت حزمة إلا إذا كانت جميع اعتمادياتها مثبتة؛ إلا أنه يمكن إجباره على ذلك باستخدام الخيار nodeps--: [root@academy1 ~]# rpm -ivh --nodeps pidgin-1.5.1-6.el3.x86_64.rpm Preparing... ################################# [100%] Updating / installing... 1:pidgin-1.5.1-6.el3 ################################# [100%] يُثبّت الأمر أعلاه الحزمة بتجاهل الأخطاء المتعلقة باعتماديّاتها؛ إلا أن البرنامج لن يعمل إلا بعد تثبيت الاعتماديات المطلوبة. التحقق من أن حزمة مثبّتة استخدم وضع الاستعلام q- للتأكد من أن حزمة مّا مثبتة على النظام: [root@academy1 ~]# rpm -q BitTorrent package BitTorrent is not installed [root@academy1 ~]# rpm -q pidgin pidgin-1.5.1-6.el3.x86_64.rpm سرد قائمة بجميع ملفات حزمة مثبتة أضف خيار السرد l- إلى وضع الاستعلام q- للحصول على قائمة بملفات حزمة مثبتة على النظام: [root@academy1 ~]# rpm -ql pidgin /etc/gconf/schemas/purple.schemas /usr/bin/gaim /usr/bin/pidgin /usr/lib64/pidgin /usr/lib64/pidgin/convcolors.so /usr/lib64/pidgin/extplacement.so /usr/lib64/pidgin/gestures.so /usr/lib64/pidgin/gtkbuddynote.so (...) سرد الحزم المُثبتة يسرُد الخيار a- عند استخدامه في وضع الاستعلام قائمة بأسماء جميع الحزم المثبتة: [root@academy1 ~]# rpm -qa libsss_nss_idmap-1.13.0-40.el7_2.9.x86_64 pygobject3-base-3.14.0-3.el7.x86_64 libfprint-0.5.0-3.el7.x86_64 man-pages-3.53-5.el7.noarch redhat-release-server-7.2-9.el7.x86_64 rsyslog-7.4.7-12.el7.x86_64 libsane-hpaio-3.13.7-6.el7_2.1.x86_64 (...) يمكن ترتيب القائمة لتظهر الحزم المثبتة مؤخرا في الأعلى باستخدام الخيار last--: [root@academy1 ~]# rpm -qa --last pidgin-1.5.1-6.el3.x86_64.rpm Sun 04 Sep 2016 09:47:32 PM GMT glibc-devel-2.17-106.el7_2.8.x86_64 Tue 02 Aug 2016 11:42:29 PM GMT nss-pam-ldapd-0.8.13-8.el7.x86_64 Tue 02 Aug 2016 11:42:23 PM GMT nscd-2.17-106.el7_2.8.x86_64 Tue 02 Aug 2016 11:42:17 PM GMT glibc-headers-2.17-106.el7_2.8.x86_64 Tue 02 Aug 2016 11:42:14 PM GMT glibc-common-2.17-106.el7_2.8.x86_64 Tue 02 Aug 2016 11:42:01 PM GMT (...) تحديث حزمة يُستخدَم وضع الترقية U- لتحديث إصدار حزمة مثبتة. يحتفظ أمر rpm عند تحديث حزمة بنسخة احتياطية من الإصدار المثبت للعودة إليها في حال لم تعمل الحزمة حسب المطلوب بعد تحديثها: [root@academy1 ~]# rpm -Uvh pidgin-1.5.1-6.el3.x86_64.rpm Preparing... ########################################### [100%] 1:pidgin ########################################### [100%] حذف حزمة استخدم الخيار e- مع الأمر rpm لحذف حزمة بذكر اسمها. مثلا؛ لحذف حزمة pidgin السابقة: [root@academy1 ~]# rpm -e pidgin تمكن أيضا إضافة الخيار v إلى الأمر لعرض رسائل بما يحدُث: [root@academy1 ~]# rpm -ev pidgin Preparing packages... pidgin-1.5.1-6.el3.x86_64.rpm كما يمكن الإبقاء على اعتماديات الحزمة باستخدام الخيار nodeps-- مع أمر الحذف وهو ما ينتج عنه حذف الحزمة فقط دون اعتمادياتها: [root@academy1 ~]# rpm -ev --nodeps pidgin انتبه إلى أن حذف حزمة من النظام يمكن أن يؤدي إلى عدم استقراره؛ لذا تأكد من حاجتك فعلا لحذف الحزمة. معرفة الحزمة التي ينتمي إليها ملف استخدم الخيار f- في وضع الاستعلام لمعرفة الحزمة التي ينتمي إليها ملف. مثلا؛ تخبرنا نتيجة الأمر التالي أن الملف usr/bin/htpasswd/ ينتمي للحزمة httpd-tools-2.4.6-40.el7_2.4.x86_64. [root@academy1 ~]# rpm -qf /usr/bin/htpasswd httpd-tools-2.4.6-40.el7_2.4.x86_64 الحصول على معلومات عن حزمة يعرض الخيار i- عند استخدامه في وضع الاستعلام معلومات عن حزمة مثبتة؛ مثلا بالنسبة لحزمة vsftpd: [root@academy1 ~]# rpm -qi vsftpd Name : vsftpd Version : 3.0.2 Release : 11.el7_2 Architecture: x86_64 Install Date: Thu 21 Jul 2016 03:29:37 PM GMT Group : System Environment/Daemons Size : 355788 License : GPLv2 with exceptions Signature : RSA/SHA256, Fri 18 Mar 2016 01:08:35 AM GMT, Key ID 199e2f91fd431d51 Source RPM : vsftpd-3.0.2-11.el7_2.src.rpm Build Date : Wed 24 Feb 2016 11:06:41 AM GMT Build Host : x86-019.build.eng.bos.redhat.com Relocations : (not relocatable) Packager : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla> Vendor : Red Hat, Inc. URL : https://security.appspot.com/vsftpd.html Summary : Very Secure Ftp Daemon Description : vsftpd is a Very Secure FTP daemon. It was written completely from scratch. أما إن أردت الحصول على معلومات عن حزمة قبل تثبيتها فالأمر هو التالي: [root@academy1 ~]# rpm -qip pidgin-1.5.1-6.el3.x86_64.rpm Name : pidgin Version : 1.5.1 Release : 6.el3 Architecture: x86_64 Install Date: (not installed) Group : Applications/Internet Size : 11168813 License : GPL Signature : DSA/SHA1, Thu 29 Oct 2009 08:14:44 AM GMT, Key ID 219180cddb42a60e Source RPM : pidgin-1.5.1-6.el3.src.rpm Build Date : Wed 28 Oct 2009 03:52:51 PM GMT Build Host : x86-003.build.bos.redhat.com Relocations : (not relocatable) Packager : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla> Vendor : Red Hat, Inc. URL : http://www.pidgin/im/ Summary : A Gtk+ based multiprotocol instant messaging client Description : Pidgin allows you to talk to anyone using a variety of messaging protocols, including AIM, ICQ, IRC, Yahoo!, Novell Groupwise, MSN Messenger, Jabber, Gadu-Gadu, Napster, and Zephyr. These protocols are implemented using a modular, easy to use design. To use a protocol, just add an account using the account editor. Pidgin supports many common features of other clients, as well as many unique features, such as perl scripting, TCL scripting and C plugins. Pidgin is NOT affiliated with or endorsed by America Online, Inc., Microsoft Corporation, Yahoo! Inc., or ICQ Inc. [root@academy1 ~]# الاستعلام عن التوثيق Documentation الخاص بحزمة مثبتة يمكن الحصول على مستندات التوثيق الخاصّة بحزمة باستخدام الخيارين df- في وضع الاستعلام. يأخذ الأمر معطى عبارة عن مسار الحزمة؛ وهو ما يمكن الحصول عليه عن طريق الأمر which. نطلب في المثال التالي معرفة مسار الحزمة vsftpd ثم نستعلم عن مستدات التوثيق الخاصّة بها: [root@academy1 ~]# which vsftpd /sbin/vsftpd [root@academy1 ~]# rpm -qdf /sbin/vsftpd /usr/share/doc/vsftpd-3.0.2/AUDIT /usr/share/doc/vsftpd-3.0.2/BENCHMARKS /usr/share/doc/vsftpd-3.0.2/BUGS /usr/share/doc/vsftpd-3.0.2/COPYING /usr/share/doc/vsftpd-3.0.2/Changelog (...) التحقق من حزمة تقارن أداة rpm عند طلب التحقق من حزمة المعلومات المستقاة من الملفات المثبتة مع تلك الموجودة في قاعدة بيانات rpm. يُستخدم الخيار V- لوضع التحقق وp لتمرير حزمة إلى الأمر: [root@academy1 ~]# rpm -Vp vsftpd-3.0.3-2.fc24.x86_64.rpm warning: vsftpd-3.0.3-2.fc24.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 81b46521: NOKEY .......T. c /etc/logrotate.d/vsftpd .......T. c /etc/pam.d/vsftpd .......T. c /etc/vsftpd/ftpusers .......T. c /etc/vsftpd/user_list .......T. c /etc/vsftpd/vsftpd.conf .......T. /etc/vsftpd/vsftpd_conf_migrate.sh .......T. /usr/lib/systemd/system-generators/vsftpd-generator .......T. /usr/lib/systemd/system/vsftpd.service .......T. /usr/lib/systemd/system/vsftpd.target .......T. /usr/lib/systemd/system/vsftpd@.service S.5....T. /usr/sbin/vsftpd missing /usr/share/doc/vsftpd missing d /usr/share/doc/vsftpd/AUDIT missing d /usr/share/doc/vsftpd/BENCHMARKS missing d /usr/share/doc/vsftpd/BUGS (...) يمكن طلب التحقق من جميع الحزم في النظام بالخيار a في وضع التحقق على النحو التالي: [root@academy1 ~]# rpm -Va S.5....T. c /etc/os-release S.5....T. /usr/src/kernels/3.10.0-327.22.2.el7.x86_64/include/config/auto.conf S.5....T. /usr/src/kernels/3.10.0-327.22.2.el7.x86_64/include/config/auto.conf.cmd S.5....T. /usr/src/kernels/3.10.0-327.22.2.el7.x86_64/include/config/tristate.conf S.5....T. /usr/src/kernels/3.10.0-327.22.2.el7.x86_64/include/generated/autoconf.h (...) سرد جميع المفاتيح العمومية المستوردة يمكنك إن أردت سرد جميع المفاتيح العمومية للحزم المثبتة على نظامك، وذلك على النحو التالي: [root@academy1 ~]# rpm -qa gpg-pubkey* gpg-pubkey-2fa658e0-45700c69 gpg-pubkey-37017186-45761324 gpg-pubkey-897da07a-3c979a7f gpg-pubkey-f21541eb-4a5233e7 gpg-pubkey-42193e6b-4624eff2 gpg-pubkey-fd431d51-4ae0493b gpg-pubkey-db42a60e-37ea5438 تصحيح قاعدة بيانات RPM معطوبة يحدُث أن تُصاب قاعدة البيانات الخاصّة بحزم RPM بعُطب مما ينتُج عنه غياب وظائف من أداة rpm. يمكنك في هذه الحالة محاولة بناء قاعدة البيانات من جديد بالأوامر التالية: [root@academy1 ~]# cd /var/lib/rpm [root@academy1 rpm]# rm __db* [root@academy1 rpm]# rpm --rebuilddb [root@academy1 rpm]# /usr/lib/rpm/rpmdb_verify Packages BDB5105 Verification of Packages succeeded. ترجمة - وبتصرف - لمقال 20 Practical Examples of RPM Commands in Linux لصاحبه Ravi Saive.
  8. يتغيّر إطار العمل Laravel باستمرار بإدراج تحديثات جديدة على كلّ إصدار من أجل تحسين تجربة التطوير وإضافة ميزات جديدة تسهّل عمل المطوّر. سنتناول في هذا الدرس، الأول من سلسلة مكونة من ستة أجزاء، التغييرات الحاصلة في هيكلة مشاريع في الإصدار 5.3 من إطار العمل Laravel. سنستخدم لأغراض الشرح مشروعي Laravel؛ الأول يعمل بالإصدار 5.2 والثاني بالإصدار 5.3 (الأخير أثناء كتابة هذا المقال). ننشئ المشروعين بمدير الاعتمادات composer على النحو التالي: بالنسبة للإصدار 5.2: composer create-project --prefer-dist laravel/laravel laravel52 "5.2.*" بالنسبة للإصدار 5.3: composer create-project --prefer-dist laravel/laravel laravel53 "5.3.*" يظهر الإصدار المستهدَف في كل من الأمرين أعلاه (5.2 و5.3 على التوالي). ملف المسارات Routes تعدّ المسارات الخطوة الأولى في معالجة الطلبات التي يتلقاها التطبيق. في الإصدارات السابقة من Laravel (قبل 5.3) كانت المسارات تُضبَط في الملف app/Http/routes.php بغضّ النظر عن طبيعة الطلبات التي تتعامل معها. إن بحثت عن هذا الملف في الإصدار الجديد فلن تجده؛ إذ أنه اختفى مع إنشاء مجلّد جديد باسم routes يوجد في جذر المشروع ويحوي ملفّين: ملف web.php: يحوي هذا الملف المسارات الخاصّة بواجهة الوِب. تعتمد المسارات الموجودة في هذا الملفّ على وسيط برمجي Middleware يحمل نفس الاسم (web) ويوفّر خاصيّات مثل حالة الجلسة Session state (الاحتفاظ ببيانات العميل لاستخدامها في الطلبات الواردة منه أثناء صلاحية الجلسة) والحماية من هجمات تزوير الطلب عبر الموقع Cross-site request forgery, CSRF. ملف api.php: يتوجّه هذا الملف للتطبيقات التي توفّر واجهة تطبيقات برمجية Application programming interface. تعتمد المسارات الموجودة في الملف api.php على وسيط برمجي أخف من السابق (يُسمّى هذا الوسيط api)؛ إذ لا يحتوي على الخاصيّات الموجودة في الوسيط web والتي لا تحتاجها واجهات التطبيقات البرمجية. يمكن القول إن الملف web.php معدّ للتعامل مع الطلبات ذات الحالة Stateful، بينما الملف api.php معدّ للطلبات عديمة الحالة Stateless. من الجيد الانتباه إلى أن جميع المسارات المذكورة في الملف api تُطبَّق عليها لاحقة api. لو نظرنا إلى الملف api.php المبدئي فسنجد أن محتواه على النحو التالي: <?php use Illuminate\Http\Request; Route::get('/user', function (Request $request) { return $request->user(); })->middleware('auth:api'); وبالنسبة للملف web.php: <?php Route::get('/', function () { return view('welcome'); }); إن نفذنا أمر سرد مسارات المشروع فستكون على النحو التالي: لاحظ كيف أن Laravel أضاف تلقائيا اللاحقة api إلى المسار user/ مع تحديد الوسيط البرمجي المستخدم بـ api, auth:api. فلنضف مسارا باسم user/ إلى الملف web.php: Route::get('/user', function () { return "1,2,3,4"; }); ثم نسرُد المسارات المتوفرة: يظهر المسار الجديد في القائمة، ولكن بدون اللاحقة api، ومع تحديد الوسيط بـweb. تغيير الهيكلة المبدئية للمجلدات تخَلّص الإصدار 5.3 من Laravel من مجلدات كانت تأتي مبدئيا مع إطار العمل. يمكن ملاحظة هذا الأمرحيث تظهر، في الصورة أدناه، المجلدات الفرعية من المجلد app لكل من الإصدارين 5.2 (في اليسار) و5.3 (في اليمين). نلاحظ إخفاء المجلدات Listeners، Jobs، Events و Policies. لا يعني الإخفاء المبدئي لهذه الملفات أن الوظائف المرتبطة بها لم تعد موجودة؛ بل يتعلّق الأمر بالتخفيف من المجلدات الموجودة مبدئيا وإنشائها فقط عند الحاجة لذلك. مثلا؛ إن أردنا إنشاء حدث Event باسم ContactHandlerAction فسنفّذ الأمر التالي: php artisan make:event ContactHandlerAction إن نفذت الأمر أعلاه فستجد أن Laravel أنشأ مجلدا فرعيا في app باسم Events وأنشأ داخله الملف ContactHandlerAction.php. نفس الشيء بالنسبة للمستمعات Listeners: php artisan make:listener EmailContactListener --event="ContactHandlerAction" يظهر جليا أن Laravel 5.3 تخفّف من مجلداتٍ مبدئيا؛ إلا أنه ينشئها إن احتاج إليها.
  9. عرضنا في دروس سابقة من هذه السلسلة لوسيلتين من وسائل التحكّم في الوصول على Red Hat Enterprise Linux، وهما إدارة الأذونات وقوائم التحكّم في الوصول. هاتان الآليتان مهمتان وأساسيّتان؛ إلا أن لديهما نقاطَ قصور تأتي آليّة أخرى تُسمّى Security Enhanced Linux (التأمين المُعزَّز في لينكس، وتشتهر بـSELinux) للتغلّب عليها. تنبغي الإشارة هنا إلى أن SELinux ليست الآليّة الوحيدة المستخدمة في توزيعات لينكس للتغلّب على عوامل النّقص في الآليتين المُشار إليهما سابقا. توجد آليّة أخرى تُسمّى AppArmor تتبناها توزيعات مثل Suse وUbuntu. عند ما يُشغّل مستخدم برنامجا فإن العمليّة Process التي يُنفّذها تعمل بصلاحيّات هذا المستخدِم. يمكن في غياب آليّة مثل SELinux أن تنفّذ أي عمليّة الإجراءات التي تريد على الملفات التي يمكن للمستخدم الذي تعمل بصلاحياته الوصول إليها، مما قد يتسبّب الوصول غير المرخَّص إلى كامل النظام. بدأت وكالة الأمن القومي الأمريكية NSA بتصميم SELinux من أجل تقييد قدرة العمليّات على الوصول إلى الكائنات (مثل الملفات، المجلدات، منافذ الشبكة، ..إلخ) أو إجراء عمليّات عليها؛ وقصرها على الحدّ الأدنى. يمكن تعديل التقييدات التي يُطبّقها نظام SELinux حسب الحاجة. تُضمِّن توزيعة Red Hat Enterprise Linux 7 وحدة خاصّة بنظام SELinux في النواة وتُفعّل مبدئيا وضع Enforcing. سنشرح في هذا الدّرس المفاهيم الأساسيّة التي يعتمد عليها نظام SELinux في عمله. الأوضاع Modes في SELinux يعمل SELinux في أحد الأوضاع الثلاثة التالية: Enforcing: يمنع SELinux في هذه الحالة الوصول إلى الكائنات بناءً على مجموعة قواعد السياسة الأمنيّة المعرَّفة في النظام. Permissive: لا يمنع SELinux في هذا الوضع العمليّات من الوصول إلى الكائنات، ويكتفي بتسجيل الإجراءات التي كانت ستُمنَع لو كان الوضع Enforcing مستخدما. Disabled. نظام SELinux معطَّل. يُظهر الأمر getenforce الوضع الذي يعمل عليه SELinux حاليا؛ بينما يضبط الأمر setenforce وضع SELinux للجلسة الحاليّة، ويتلقّى أحد معطييْن: 1 لوضع Enforcing و0 لوضع Permissive. إن أردت أن يكون تغيير وضع عمل SELinux دائما ولا يقتصر على الجلسة الحاليّة فستحتاج لتحرير الملفّ etc/selinux/config/ وتعيين قيمة التعليمة SELINUX بالوضع الذي تريد: permissive، enforcing أو disabled: # getenforce Enforcing # setenforce 0 # getenforce Permissive # setenforce 1 # getenforce Enforcing # cat /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=enforcing # SELINUXTYPE= can take one of three two values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted يُستخدَم الأمر setenforce عادةً للانتقال بين وضعيْ Enforcing وPermissive أثناء البحث عن أسباب مشكل. مثلا؛ إن ظهر المشكال أثناء تفعيل الوضع Enforcing واختفى عند الانتقال إلى الوضع Permissive فهذا يعني أن المشكل يتعلّق بقاعدة في سياسة SELinux الأمنيّة. السيّاقات Contexts في SELinux السيّاقات هي بيئة تحكّم في الوصول تُتخَّذ فيها الإجراءات بناء على مستخدم SELinux، الدّور Role والنوع Type وبصيغة اختيارية المستوى Level: يُكمّل المستخدمون في SELinux المستخدمين العاديّن، إذ يربط SELinux حساب المستخدم العادي بحساب في SELinux. يُستخدَم حساب SELinux في السيّاق للتحكّم في العمليات من أجل تعريف أدوارها ومستوياتها. يعمل الدّور وسيطا بين أنواع الملفّات والمستخدمين في SELinux إذ يُعرّف ماهي أنواع الملفات التي يمكن لمستخدمي SELinux الوصول إليها. تُساهم الأدوار في الحؤول دون الثغرات التي تؤدي إلى هجمات الارتقاء في الصلاحيّات Privilege escalation. يعرّف SELinux نوعًا لكلّ ملفّ أو عمليّة. تُمنَع العمليّات في الظروف العاديّة من الوصول إلى الملفات التي تستخدمها عمليّات أخرى، أو من الوصول إلى هذه العمليّات. لا يُسمَح لعمليّة بالوصول إلى ملفّات إلا إذا أضيفت قاعدة إلى الساسية الأمنية تُصرّح لها بالوصول إلى النوع المستهدف. سنرى في ما يلي أمثلة لعمل SELinux. تغيير المنفذ المبدئي لخدمة SSH شرحنا في درس سابق أن تغيير المنفذ المبدئي الذي تنصت عبره خدمة SSH هو أحد الإجراءات الأمنيّة المتّبعة لتأمين الخادوم ضدّ الهجمات القادمة من شبكة الإنترنت. نحرّر الملفّ etc/ssh/sshd_config/ لتغييرالمنفذ الذي تعمل عبره هذه الخدمة ليصبح المنفذ رقم 9999 (انزع علامة التعليق # عن التعليمة Port وحدّد القيمة 9999 بدلا من 22): Port 9999 نحفظ التعديلات ونعيد تشغيل خدمة SSH (لاحظ الحرف d في نهاية اسم الخدمة): # systemctl restart sshd # systemctl status sshd غيّرنا المنفذ الذي تُنصت عبره خدمة SSH ثم أعدنا تشغيل العمليّة sshd التي تتحكّم في الخدمة ولكن إعادة تشغيل الخدمة أخفقت كما يظهر ذلك عند إظهار حالة الخدمة (الأمر systemctl status). إن كنت تستخدم واجهة رسوميّة فستظهر رسالة بعد تنفيذ أمر إعادة التشغيل تفيد بأن SELinux لاحظ أمرا ما. مالذي حصل إذن؟ يمكّن الفحص السّريع لملف السّجل var/log/audit/audit.log/ الذي يحوي معلومات متعلّقة بالأحداث الأمنية على مستوى نظام التشغيل من الحصول على معلومات عن ما حدث. يُشار في ملفّ السّجل المذكور بالنوع AVC إلى المعلومات المتعلقة بـSELinux؛ تمكننا الاستعانة بهذه المعلومة للبحث في المُدخلات ذات الصّلة بـSELinux: # grep AVC /var/log/audit/audit.log | tail -1 نلاحظ أن الخدمة sshd مُنعت من استخدام المنفذ 9999 نظرا لكونه محجوزا لصالح خدمة أخرى (JBoss Management): يمكنك تعطيل SELinux كما هو موضّح أعلاه وإعادة تشغيل خدمة SSH وستجد أن الخدمة تعمل على المنفذ الجديد؛ لكن لا تفعل. سنستخدم أداة semanage لإخبارنا بما يجب فعله لنتمكّن من تشغيل خدمة SSH على أي منفذ نريده دون مشاكل. ننفّذ الأمر التالي للحصول على لائحة بالمنافذ التي يسمح SELinux لخدمة SSH بالإنصات للاتّصالات القادمة عبرها: # semanage port -l | grep ssh ssh_port_t tcp 22 يظهر في نتيجة الأمر أن SELinux يسمح لـSSH بالإنصات للاتّصالات القادمة عبر المنفذ 22 فقط، لا غير. ما سنفعله الآن هو العودة إلى ملفّ إعداد SSH على المسار etc/ssh/sshd_config/ وتغيير المنفذ من 9999 إلى 9998: Port 9998 ثم نضيف المنفذ 9998 إلى السيّاق ssh_port_t ونعيد تشغيل الخدمة: # semanage port -a -t ssh_port_t -p tcp 9998 # systemctl restart sshd # systemctl is-active sshd تمكن ملاحظة أن الخدمة شُغّلت دون أية مشاكل هذه المرة. يوضّح هذا المثال كيف أن SELinux يتحكّم في منافذ الشبكة بالاعتماد على تعريفاته الخاصّة لنوع كلّ منفذ. السّماح لخدمة httpd بالوصول إلى خدمة sendmail ذكرنا أن SELinux يتحكّم في إمكانيّة وصول عمليّة Process إلى عمليّات أخرى. سنرى الآن مثالا على ذلك. سنفترض أنك تريد تفعيل وحدتي mod_security وmod_evasive على خادوم وِب Apache واستخدامهما لإرسال إشعارات بالبريد الإلكتروني (خدمة sendmail) عند حدوث هجمة حجب خدمة (Dos, Denial of Service). تحتاج في هذه الحالة للسماح لخادوم وِب Apache (خدمة httpd) بالوصول إلى خدمة البريد sendmail. توجد في SELinux إعدادات تشغيل تُسمّى SELinux booleans (قيم منطقيّة) يمكن عبرها تعطيل أو تفعيل قواعد ضمن سياسة SELinux الأمنية. تُستخدم الأداة semanage للحصول على قائمة بجميع هذه الإعدادات: # semanage boolean -l يتحكّم الإعداد httpd_can_sendmail في إمكانيّة وصول الخدمة httpd إلى sendmail: # semanage boolean -l | grep httpd_can_sendmail httpd_can_sendmail (off, off) Allow httpd to can sendmail يظهر في نتيجة الأمر أعلاه أن الإعداد مضبوط على القيمة off بمعنى أن القاعدة الأمنيّة معطّلة، نفعّلها على النحو التالي: # setsebool -P httpd_can_sendmail 1 استخدمنا الأمر setsebool لتفعيل القاعدة بتمرير اسمها والقيمة 1 (تفعيل). يؤدي استخدام الخيار P- إلى استمرار مفعول الأمر (تفعيل القاعدة) بعد إعادة تشغيل الخادوم. يمكن التأكد من تغيير الإعداد بإعادة تنفيذ أمر semanage السابق: # semanage boolean -l | grep httpd_can_sendmail httpd_can_sendmail (on, off) Allow httpd to can sendmail ملحوظة: يشير الحقل الثاني في نتيجة الأمر semanage boolean (أي (on, off)) في المثال أعلاه إلى قيمة الإعداد حاليّا (on)، وقيمته المبدئيّة (off). تقديم صفحة وِب توجد في مجلّد مغاير للمجلد المبدئي سنفترض في هذا المثال أن لديك موقع وِب توجد صفحاته في المجلّد websites/ بدلا من المجلّد المبدئي لخادوم الوِب (var/www/html/). أنشئ ملفا باسم index.html في المجلد websites/ وأضف إليه المحتوى التالي: <html> <h2>SELinux test</h2> </html> إن نفّذت الأمر التالي: # ls -lZ /websites/index.html فستجد أن الملفّ index.html من النوع default_t وهو النوع المبدئي في SELinux ولا يمكن لخادوم الوِب الوصولُ إليه. غيّر قيمة التعليمة DocumentRoot في الملفّ etc/httpd/conf/httpd.conf/ لتصبح websites/. حدّث كتلة Directory التي يظهر فيها اسم المجلّد المبدئي السابق؛ مثلا: <Directory "/var/www/html"> ... </Directory> تصبح: <Directory "/websites"> ... </Directory> أعد تشغيل خادوم الوِب: # systemctl restart httpd أدخل عنوان الخادوم في المتصفّح (أو 127.0.0.1 إن كان المتصفّح على الخادوم). يجب أن تظهر رسالة خطأ 403 تفيد بأن الوصول إلى هذا المحتوى ممنوع. ملحوظة: إن ظهرت الصفحة المبدئيّة لخادوم الوِب فعلّق جميع الأسطر الموجودة في الملفّ etc/httpd/conf.d/welcome.conf/ وأعد تشغيل خادوم الوِب. نعدّل نوع المجلّد websites/ وجميع محتوياته ليصبح httpd_sys_content_t type (بدلا من النوع المبدئي default_t) ممّا يتيح لخادوم الوِب Apache الوصول إلى هذا المحتوى بصلاحيّة القراءة فقط: # semanage fcontext -a -t httpd_sys_content_t "/websites(/.*)?" ثم نطبّق سياسة SELinux التي عدّلناها للتّو: # restorecon -R -v /websites أعد تشغيل خادوم الوِب وافتح عنوان الخادوم في المتصفّح من جديد، وستجد أن خادوم الوِب يعرض محتوى ملفّ HTML الذي أنشأناه سابقا. موضوع SELinux متشعّب جدا؛ إلا أن المفاهيم التي عرضنا لها في هذا المقال ستمكّنك من إيجاد قاعدة تبني عليها للانتقال إلى مواضيع أخرى تتعلّق بنظام الحماية SELinux. ترجمة - بتصرّف - لمقال RHCSA Series: Mandatory Access Control Essentials with SELinux in RHEL 7 – Part 13 لصاحبه Gabriel Cánepa.
  10. أتمتة تثبيت Red Hat Enterprise Linux باستخدام Kickstart

    يتطلّب عملُ مدير الأنظمة غالبا تثبيتَ نظام التشغيل على أكثر من خادوم؛ فسواء تعلّق الأمر بمركز بيانات أو بيئة للاختبار، سيجد مدير الأنظمة نفسه أمام مهمة تثبيت النظام على أكثر من جهاز. تأخذ الطريقة التقليدية في التثبيت الكثير من الوقت، خصوصا إذا كان عدد الخواديم معتبرا. تتيح Red Hat إمكانية تفادي ضياع الوقت في مثل هذه التثبيتات باستخدام أداة تثبيت تُعرَف بـKickstart. سنعرِض في هذا المقال لكيفية استخدام Kickstart لتثبيت Red Hat Enterprise Linux 7. مقدمة عن Kickstart والتثبيت المؤتمَت Automated installation تُستخدَم أداة Kickstart لأتمتة عمليات التثبيت على Red Hat Enterprise Linux وتوزيعات أخرى مشتقة من Fedora (مثل CentOS وOracle Linux)؛ يعني هذا أنّ تدخّل مدير النّظام أثناء عمليّة التثبيت سيكون في الحدّ الأدنى، على عكس عملية التثبيت الاعتيادية التي تتطلّب المتابعة المباشرة من مدير النظام للانتقال من خطوة إلى أخرى. يمكن باستخدام Kickstart الحصول على خواديم بأنظمة تشغيل متطابقة (نفس حزم البرامج وملفات الإعداد) بقليل من الجهد. الاستعداد للتثبيت باستخدام Kickstart نحتاج لاتّباع الخطوات التاليّة لتنفيذ تثبيت عن طريق Kickstart: إنشاء ملفّ Kickstart وهو ملفّ نصيّ توجد به خيّارات إعداد تُعرَّف مسبقا. توفير ملفّ Kickstart على وسيط تخزين (قرص مُدمَج، قرص صلب أو موقع على الشبكة). يستخدم العميل ملفّ rhel-server-7.2-x86_64-boot.iso للإقلاع عليه، وهو ملفّ ISO يحوي الملفات الأساسيّة فقط للتوزيعة؛ ثم نتيح ملف التوزيعة الكامل rhel-server-7.0-x86_64-dvd.iso على مورد على الشبكة، مثل خادوم HTTP (وِب) أو خادوم FTP. يحوي الملفّ الكامل جميع الحزم الموجودة في التوزيعة ويُستخدَم لتثبيت الحزم التي نحدّدها في ملفّ Kickstart. سنستخدم في حالتنا خادوم RHEL 7 آخر على العنوان 192.168.2.100. بدء التثبيت باستخدام Kickstart. يُنشأ ملفّ Kickstart من حساب زبناء Red Hat حيثُ توجد أداة إعداد Kickstart. استخدم هذه الأداة لتحديد خيارات التثبيت التي تناسبك، بعد التمعّن فيها جيدا. تتألف الأداة من مقاطع عدّة تشمل الإعدادات الأساسيّة مثل لغة الواجهة، لوحة المفاتيح والمنطقة الزمنيّة. كما تشمل الأداة جزءًا خاصًّا بمصدر التثبيت (قرص مُدمَج CD، خادوم وِب أو غيرهما). يُعدّ ملفّ Kickstart مبدئيّا لتثبيت الحزم الأساسيّة للنّظام فقط، لكن يمكن تحديد حزم أخرى لتثبيتها. إن قرّرت أن التثبيت سيكون عبر خادوم وِب، FTP أو NFS فتأكّد من أن الجدار الناري على الخادوم معدّ للسماح بهذه الخدمات. حدّد خادوم وِب مصدرا للتثبيت في أداة إنشاء ملفّ Kickstart واستخدم 192.168.2.100 عنوانا للخادوم وkickstart/media/ بوصفه المجلد الذي يوجد فيه ملفّ ISO الخاصّ بالنظام. نزل الملف بعد إكمال الإعدادات. يمكنك أيضا إنشاء ملفّ Kickstart يدويا دون اللّجوء إلى الأداة التي توفّرها Red Hat. نختار في المثال التالي لملفّ Kickstart أن تكون لغة التثبيت الإنكليزية، لوحة المفاتيح us والمنطقة الزمنية Africa/Nouakchott. بالنسبة للحزم فهي توجد بين التعليمتيْن packages% وend% وحدّدنا الحزم الأساسية، خادوم نسخ احتياطي Backup server وخادوم طباعة Print server. تظهر في الملفّ أيضا كلمة سرّ الحساب الجذر المعمّاة (التعليمة rootpw مع الخيار iscrypted--). راجع توثيق Kickstart للمزيد من الخيارات. lang en_US keyboard us timezone Africa/Nouakchott --isUtc rootpw $1$5sOxDlRo$In4KTyX7OmcOW9HUxWtbn0 --iscrypted #platform x86, AMD64, or Intel EM64T text url --url=http://192.168.2.100//kickstart/media bootloader --location=mbr --append="rhgb quiet crashkernel=auto" zerombr clearpart --all --initlabel autopart auth --passalgo=sha512 --useshadow selinux --enforcing firewall --enabled firstboot --disable %packages @base @backup-server @print-server %end انتبه للتعليمة التالية في ملفّ إعداد Kickstart: url --url=http://192.168.2.100//kickstart/media يُستخدَم المجلّد kickstart/media (على خادوم الوِب) لاستخراج محتوى ملف ISO (ملف التثبيت). سنحتاج قبل استخراج محتوى ملف ISO إلى تركيبه Mounting على المسار media/rhel/ مع تحديد خيار التركيب o loop- للتعامل مع الملفّ بوصفه جهازا طرفيا حلقيا Loop device: # mount -o loop /var/www/html/kickstart/rhel-server-7.0-x86_64-dvd.iso /media/rhel يفترض الأمر أعلاه وجود ملف ISO باسم rhel-server-7.0-x86_64-dvd.iso في المجلّد /var/www/html/kickstart/ على الخادوم 192.168.2.100. ملحوظة: الأجهزة الطرفية الحلقيّة Loop devices هي شبه أجهزة تخيّلية (بمعنى أنها لا توجد فعلا، غير ملموسة) تتيح التعامل مع ملف كما لو أنه جهاز طرفي كتلي Block device (وسيط تخزين مثل قرص صلب). يمكّن تركيب ملفات ISO - التي هي تمثيل لنظام ملفات File system أو تجزئة من قرص صلب - بوصفها أجهزة حلقية من الوصول إلى محتواها كما لو كانت أنظمة ملفات فعلية. ثم ننسخ جميع محتويات المجلّد media/rhel/ إلى المجلّد var/www/html/kickstart/media/ ليكون الوصول إليه متاحا عبر خادوم الوِب: # cp -R /media/rhel/* /var/www/html/kickstart/media/ يجب أن نحصُل الآن بسرد محتويات المجلد var/www/html/kickstart/media/ على نتيجة تشبه التالي: من الجيد، بغضّ النظر عن الآليّة المستخدمة لإنشاء ملف Kickstart، التحقّق من صيغة الملفّ قبل البدء في استخدامه لتثبيت النظام. ثبّت، لهذا الغرض، حزمة pykickstart: # yum update && yum install pykickstart ثم استخدم أداة ksvalidator لفحص الملفّ: # ksvalidator /var/www/html/kickstart/academy.bin لن تحصُل على أية مخرجات إن كانت صيغة الملفّ صحيحة؛ أما إذا كانت توجد أخطاء في صيغة الملف فستظهر رسائل توضّح أين توجد التعليمات غير الصّحيحة أو غير المعروفة في الملف. تنفيذ عمليّة التثبيت نبدأ عمليّة التثبيت بالإقلاع على ملفّ rhel-server-7.2-x86_64-boot.iso؛ ثم نحدّد خيار تثبيت Red Hat Enterprise Linux 7 ونضغط على زرّ الجدولة Tab في لوحة المفاتيح من أجل إلحاق التعليمات التاليّة بأمر التثبيت: # inst.ks=http://192.168.2.100/kickstart/academy.bin تشير التعليمات إلى ملفّ academy.bin الذي أنشأناه سابقا؛ ثم نضغط على زرّ Enter لبدء التثبيت. تظهر أثناء التثبيت الحزم ومجموعات الحزم التي اخترتها عند إنشاء ملفّ Kickstart أعلاه؛ كما تظهر بعد انتهاء التثبيت رسالة تطلُب منك إخراج وسيط التثبيت وسيمكنك بعدها تشغيل النظام الجديد. يمكن، كما أشرنا سابقا، إنشاء ملفات Kickstart يدويا إلا أن الطريقة المنصوح بها هي استخدام الأداة التي توفّرها Red Hat كل ما كان ذلك ممكنا. تنشئ عمليّة تثبيت Red Hat Enterprise Linux دائما ملفّا يحوي إعدادات Kickstart للنظام المُثبَّت باسم anaconda-ks.cfg على المسار root/anaconda-ks.cfg/. يمكن استخدام هذا الملفّ أيضا لإعداد خواديم مشابهة باستخدام Kickstart. من الجيّد التعوّد على استخدام Kickstart لأتمتة تثبيت Red Hat Enterprise Linux؛ فهو طريقة سهلة للتثبيت والحصول على خواديم متشابهة في أقل مدة. نشير في اﻷخير إلى أنه يمكن استخدام Kickstart لتثبيت Red Hat Enterprise Linux بصورة مؤتمتة تماما باستخدام خادوم إقلاع عبر الشبكة (PXE Server) وضبط محمّل الإقلاع Boot loader لاستخدامه. ترجمة - بتصرّف - لمقال RHCSA Series: Automate RHEL 7 Installations Using ‘Kickstart’ – Part 12 لصاحبه Gabriel Cánepa.
  11. يتكوّن نظام التمهيد systemd من مجموعة من الأدوات التي تمثّل منصة مركزية لإدارة نظام لينكس وإعداده. تُستخدم أداة systemctl للتحكّم في systemd وإدارة الخدمات المرتبطة به. يهدف هذا المقال إلى إلقاء الضوء على كيفية إدارة النظام والخدمات على نظام تشغيل يستخدم systemd للتمهيد. أساسيات systemd وsystemctl التحقق من أن systemd مثبّت وإصداره: $ systemd --version systemd 229 +PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD -IDN يظهر من المثال أعلاه أن نظام التمهيد systemd مثبت وأن لدينا الإصدار 229. التحقق من مكان تواجد الملفات التنفيذية والمكتبات البرمجية الخاصّة بـ وsystemctl: $ whereis systemd systemd: /usr/lib/systemd /bin/systemd /etc/systemd /lib/systemd /usr/share/systemd /usr/share/man/man1/systemd.1.gz $ whereis systemctl systemctl: /bin/systemctl /usr/share/man/man1/systemctl.1.gz التحقق من حالة عمل systemd يمكن استخدام الأمر ps لسرد العمليات Processes النشطة ثم عزل تلك المتعلقة بـsystemd، وذلك على النحو التالي: $ ps -eaf | grep [s]ystemd root 1000 1 0 12:23 ? 00:00:00 /lib/systemd/systemd-journald root 1029 1 0 12:23 ? 00:00:00 /lib/systemd/systemd-udevd systemd+ 2639 1 0 12:23 ? 00:00:00 /lib/systemd/systemd-timesyncd message+ 2781 1 0 12:23 ? 00:00:01 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation root 2862 1 0 12:23 ? 00:00:00 /lib/systemd/systemd-logind sddm 3284 1 0 12:23 ? 00:00:00 /lib/systemd/systemd --user academy 3532 1 0 12:25 ? 00:00:00 /lib/systemd/systemd --user تحمل عمليّة systemd المعرِّف 1. استخدمنا الخيار e- مع الأمر ps لسرد جميع العمليات، ثم حدّدنا العمليات التي لا ترأس جلسة Session leaders (العمليات التي يساوي معرّف العمليّة السّلف Parent Id معرّفَ الجلسة Session Id). استخدمنا الخيار f- لتهيئة مخرجات الأمر التي طبّقنا عليه الأمر grep لتحديد تلك التي توافق التعبير النمطي s]ystemd]. تحليل متتالية الإقلاع في systemd تُستخدَم أداة systemd-analyze لتحليل متتالية الإقلاع: $ systemd-analyze Startup finished in 9.314s (firmware) + 2.897s (loader) + 9.290s (kernel) + 46.672s (userspace) = 1min 8.175s نضيف المعطى blame للأمر أعلاه من أجل الحصول على الوقت الذي استغرقته كل خدمة للإقلاع: $ systemd-analyze blame 40.880s systemd-suspend.service 25.010s apt-daily.service 14.173s dev-sda7.device 10.530s dnsmasq.service 10.228s click-system-hooks.service 7.909s accounts-daemon.service 7.908s ModemManager.service 7.120s NetworkManager-wait-online.service 7.084s gpu-manager.service (...) يمكن أيضا تحليل الوقت المستغرق للعمليات الحرجة باستخدام المعطى critical-chain الذي يطبع شجرة بتتالي العمليات التي تنتظر بقية العمليات إقلاعها: $ systemd-analyze critical-chain The time after the unit is active or started is printed after the "@" character. The time the unit takes to start is printed after the "+" character. graphical.target @41.348s └─multi-user.target @41.348s └─apache2.service @34.735s +6.612s └─network-online.target @34.717s └─NetworkManager-wait-online.service @27.596s +7.120s └─NetworkManager.service @21.672s +5.913s └─dbus.service @21.471s └─basic.target @21.470s └─sockets.target @21.470s └─snapd.socket @21.441s +17ms └─sysinit.target @21.391s └─apparmor.service @20.785s +605ms └─local-fs.target @20.772s └─run-user-123.mount @35.991s └─local-fs-pre.target @15.110s └─systemd-remount-fs.service @15.038s +27ms └─systemd-journald.socket @3.530s └─-.slice @3.497s تظهر بعد علامة @ المدة التي فُعلت بعدها الوحدة، في ما يظهر الوقت الذي استغرقته الوحدة للإقلاع بعد علامة +. يمكن تمرير اسم وحدة إلى الأمر أعلاه لقصر السّرد على العمليات التي تنتظر الوحدة إقلاعها: $ systemd-analyze critical-chain apache2.service The time after the unit is active or started is printed after the "@" character. The time the unit takes to start is printed after the "+" character. └─network-online.target @35.533s └─NetworkManager-wait-online.service @29.424s +6.108s └─NetworkManager.service @22.174s +7.234s └─dbus.service @20.998s └─basic.target @20.976s └─sockets.target @20.976s └─snapd.socket @20.919s +46ms └─sysinit.target @20.902s └─apparmor.service @19.691s +1.193s └─local-fs.target @19.681s └─run-user-123.mount @37.402s └─local-fs-pre.target @14.915s └─systemd-remount-fs.service @14.866s +32ms └─system.slice @3.541s └─-.slice @3.508s سرد الوحدات يعمل الأمر systemctl عند استخدام المعطى list-unit-files على سرد قائمة بجميع الوحدات الموجودة في النظام: $ systemctl list-unit-files UNIT FILE STATE proc-sys-fs-binfmt_misc.automount static org.freedesktop.hostname1.busname static org.freedesktop.locale1.busname static org.freedesktop.login1.busname static org.freedesktop.network1.busname static org.freedesktop.resolve1.busname static org.freedesktop.systemd1.busname static org.freedesktop.timedate1.busname static dev-hugepages.mount static dev-mqueue.mount static proc-sys-fs-binfmt_misc.mount static sys-fs-fuse-connections.mount static sys-kernel-config.mount static sys-kernel-debug.mount static acpid.path enabled cups.path enabled (...) ملحوظة: يمكن للوحدة أن تكون خدمة، نقطة تركيب Mount point، مقبس شبكة Socket أو جهازا طرفيا Device. يمكنك الاقتصار على الوحدات العاملة حاليا بالمعطى list-units: $ systemctl list-units UNIT LOAD ACTIVE SUB DESCRIPTION proc-sys-fs-binfmt_misc.automount loaded active running Arbitrary Executable File Formats File System Automoun sys-devices-pci0000:00-0000:00:02.0-drm-card0-card0\x2deDP\x2d1-intel_backlight.device loaded active plugged /sys/devices/pci0000: sys-devices-pci0000:00-0000:00:03.0-sound-card0.device loaded active plugged Broadwell-U Audio Controller sys-devices-pci0000:00-0000:00:14.0-usb1-1\x2d3-1\x2d3:1.0-net-enx582c80139263.device loaded active plugged E353/E3131 sys-devices-pci0000:00-0000:00:14.0-usb1-1\x2d4-1\x2d4:1.0-bluetooth-hci0.device loaded active plugged /sys/devices/pci0000:00/000 sys-devices-pci0000:00-0000:00:1b.0-sound-card1.device loaded active plugged Wildcat Point-LP High Definition Audio Controller (…) كما يمكن عزل الوحدات التي أخفقت بالمعطى failed--: $ systemctl --failed UNIT LOAD ACTIVE SUB DESCRIPTION ● snapd.refresh.service loaded failed failed Automatically refresh installed snaps ● systemd-suspend.service loaded failed failed Suspend LOAD = Reflects whether the unit definition was properly loaded. ACTIVE = The high-level unit activation state, i.e. generalization of SUB. SUB = The low-level unit activation state, values depend on unit type. 2 loaded units listed. Pass --all to see loaded but inactive units, too. To show all installed unit files use 'systemctl list-unit-files'. التحقق من تفعيل خدمة يطلُب الأمر التالي التحقق من أن خدمة الجدولة Cron مفعَّلة (تعمل مع إقلاع النظام): $ systemctl is-enabled cron.service enabled يظهر من نتيجة الأمر أن الخدمة مفعَّلة enabled. التحقق من حالة خدمة نتحقق في الأمر التالي من حالة الخدمتين mysql وapache2: systemctl status apache2.service ● apache2.service - LSB: Apache2 web server Loaded: loaded (/etc/init.d/apache2; bad; vendor preset: enabled) Drop-In: /lib/systemd/system/apache2.service.d └─apache2-systemd.conf Active: active (running) since Wed 2016-09-14 12:23:56 GMT; 4h 31min ago يظهر في نتيجة تنفيذ الأمرين أعلاه أن mysql غير مفعَّلة وليست نشطة أثناء تنفيذ الأمر؛ أما الخدمة apache2 فهي مفعَّلة وتعمل منذ أربع ساعات. التحكم في الخدمات وإداراتها بـ systemctl سرد جميع الخدمات يسرُد الأمر التالي جميع خدمات النظام بغضّ النظر عن حالتها (مفعَّلة أو معطَّلة): $ systemctl list-unit-files --type=service UNIT FILE STATE accounts-daemon.service enabled acpid.service disabled apport-forward@.service static apt-daily.service static atd.service enabled autovt@.service enabled bootlogd.service masked bootlogs.service masked bootmisc.service masked cgmanager.service enabled cgproxy.service enabled checkfs.service masked checkroot-bootclean.service masked checkroot.service masked (...) تشغيل خدمة (apache2)، إيقافها، إعادة تشغيلها أو إعادة تحميلها: تبدأ الأوامر التالية تشغيل الخدمة apache2، تعيد تحميلها، تعيد تشغيلها وتوقفها على التوالي (تحتاج لصلاحيات إدارية): # sudo systemctl start apache2 # sudo systemctl restart apache2 # sudo systemctl stop apache2 # sudo systemctl reload apache2 apache2.service is not active, cannot reload. # sudo systemctl start apache2 # sudo systemctl reload apache2 # sudo systemctl status apache2 ● apache2.service - LSB: Apache2 web server Loaded: loaded (/etc/init.d/apache2; bad; vendor preset: enabled) Drop-In: /lib/systemd/system/apache2.service.d └─apache2-systemd.conf Active: active (running) since Wed 2016-09-14 17:15:11 GMT; 17s ago لا تُظهر الأوامر أعلاه مخرجات عند تنفيذها بدون مشاكل. استخدم أمر التحقق status لمعرفة حالة الخدمة. تفعيل خدمة أو تعطيلها تُسمّى الخدمات التي تبدأ بالعمل مع إقلاع النظام بالخدمات المفعَّلة Enabled، وعكسُها الخدمات المعطّلة Disabled. أما الخدمات النشطة Active فهي الخدمات العاملة حاليا (تُشغَّل بالأمر start). يستفسر الأمر التالي عن نشاط الخدمة apache2 (تعمل أم لا): $ systemctl is-active apache2.service active نستخدم الأمر disable لتعطيل خدمة وenable لتفعيلها: # systemctl enable apache2.service # systemctl disable apache2.service إخفاء خدمة يمنع الإخفاء Masking تشغيل خدمة. يمكن إخفاء الخدمة apache2 على النحو التالي: # systemctl mask apache2.service Created symlink from /etc/systemd/system/apache2.service to /dev/null. ولإلغاء الإخفاء: $ sudo systemctl unmask apache2.service Removed symlink /etc/systemd/system/apache2.service. الإيقاف الإجباري لخدمة بـsystemctl # systemctl kill apache2 # sudo systemctl status apache2 ● apache2.service - LSB: Apache2 web server Loaded: loaded (/etc/init.d/apache2; bad; vendor preset: enabled) Drop-In: /etc/systemd/system/apache2.service.d └─50-CPUShares.conf /lib/systemd/system/apache2.service.d └─apache2-systemd.conf Active: inactive (dead) Docs: man:systemd-sysv-generator(8) التحكم في نقاط التركيب وإداراتها بـsystemctl سرد جميع نقاط التركيب في النظام $ systemctl list-unit-files --type=mount UNIT FILE STATE dev-hugepages.mount static dev-mqueue.mount static proc-sys-fs-binfmt_misc.mount static sys-fs-fuse-connections.mount static sys-kernel-config.mount static sys-kernel-debug.mount static tmp.mount disabled 7 unit files listed. إدارة نقاط التركيب يمكن بالأوامر التالية تشغيل نقطة تركيب، فصلها، إعادة تركيبها والتحقق من حالتها على التوالي: # systemctl start tmp.mount # systemctl stop tmp.mount # systemctl restart tmp.mount # systemctl reload tmp.mount # systemctl status tmp.mount tmp.mount - Temporary Directory Loaded: loaded (/usr/lib/systemd/system/tmp.mount; disabled) Active: active (mounted) since Wed 2016-09-14 17:36:11 GMT;; 2min 48s ago Where: /tmp What: tmpfs (...) تفعيل نقطة تركيب أو تعطيلها يمكن بطريقة مشابهة للخدمات تفعيل نقاط التركيب أوتعطيلها: # systemctl enable tmp.mount # systemctl disable tmp.mount إخفاء نقطة تركيب يُستخدَم الأمر mask لإخفاء نقطة تركيب على النحو التالي: # systemctl mask tmp.mount Created symlink from /etc/systemd/system/tmp.mount to /dev/null. ولإلغاء الإخفاء: # systemctl unmask tmp.mount Removed symlink /etc/systemd/system/tmp.mount التحكّم في مقابس الشبكة بـsystemctl سرد جميع المقابس $ systemctl list-unit-files --type=socket UNIT FILE STATE acpid.socket enabled apport-forward.socket enabled avahi-daemon.socket enabled cups.socket enabled dbus.socket static lxd.socket masked saned.socket disabled snapd.socket enabled syslog.socket static systemd-bus-proxyd.socket static systemd-fsckd.socket static systemd-initctl.socket static systemd-journald-audit.socket static systemd-journald-dev-log.socket static systemd-journald.socket static systemd-networkd.socket disabled systemd-rfkill.socket static systemd-udevd-control.socket static systemd-udevd-kernel.socket static uuidd.socket enabled 20 unit files listed. تشغيل مقبس (cups)، إعادة تشغيله، إعادة تحميله أو إيقافه: # systemctl start cups.socket # systemctl restart cups.socket # systemctl reload cups.socket # systemctl stop cups.socket $ systemctl status cups.socket ● cups.socket - CUPS Scheduler Loaded: loaded (/lib/systemd/system/cups.socket; enabled; vendor preset: enabled) Active: active (listening) since Thu 2016-09-15 14:39:47 GMT; 5s ago Listen: /var/run/cups/cups.sock (Stream) تفعيل مقبس أو تعطيله: # systemctl enable cups.socket # systemctl disable cups.socket إخفاء مقبس $ sudo systemctl mask cups.socket Created symlink from /etc/systemd/system/cups.socket to /dev/null. $ sudo systemctl unmask cups.socket Removed symlink /etc/systemd/system/cups.socket. استخدام المعالج حصة خدمة من المعالج يمكن استخدام systemctl لعرض عدد الحصص الحاليّة المحدّدة لخدمة من المعالج: # systemctl show -p CPUShares apache2.service CPUShares=18446744073709551615 تعرّف قيمة CPUShares الوقت المخصّص للخدمة من المعالج. تعني زيادة هذه القيمة الرفع من أولويّة للخدمة. يمكن تحديد الحصّة بتغيير قيمة المتغيّر على النحو التالي: # systemctl set-property apache2.service CPUShares=1500 $ systemctl show -p CPUShares apache2.service CPUShares=1500 ينشئ النظام عند تحديد حصّة خدمة مجلّدا يوافق اسمه اسمَ الخدمة (مثلا apache2.service.d) وينشئ بداخله ملف إعداد يبدأ برقم يتبعه اسم المتغيّر (مثلا 50-CPUShares.conf): $ cat /etc/systemd/system/apache2.service.d/50-CPUShares.conf [Service] CPUShares=1500 عرض تفاصيل الإعداد الخاصّة بخدمة $ systemctl show apache2 Type=forking Restart=no NotifyAccess=none RestartUSec=100ms TimeoutStartUSec=5min TimeoutStopUSec=5min RuntimeMaxUSec=infinity WatchdogUSec=0 WatchdogTimestampMonotonic=0 FailureAction=none PermissionsStartOnly=no RootDirectoryStartOnly=no RemainAfterExit=no GuessMainPID=no MainPID=0 ControlPID=0 FileDescriptorStoreMax=0 NFileDescriptorStore=0 StatusErrno=0 (...) عرض اعتماديّات خدمة $ systemctl list-dependencies apache2.service apache2.service ● ├─system.slice ● ├─network-online.target ● │ ├─networking.service ● │ └─NetworkManager-wait-online.service ● └─sysinit.target ● ├─apparmor.service ● ├─brltty.service ● ├─console-setup.service ● ├─dev-hugepages.mount ● ├─dev-mqueue.mount ● ├─friendly-recovery.service ● ├─keyboard-setup.service ● ├─kmod-static-nodes.service ● ├─plymouth-read-write.service ● ├─plymouth-start.service ● ├─proc-sys-fs-binfmt_misc.automount ● ├─resolvconf.service ● ├─setvtrgb.service (...) سرد مجموعات التحكّم Control groups يُستخدَم الأمر systemd-cgls لسرد مجموعات التحكّم هرميّا على النحو التالي: # systemd-cgls ├─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 ├─user.slice │ └─user-1000.slice │ └─session-1.scope │ ├─ 2292 gdm-session-worker [pam/gdm-password] │ ├─ 2308 /usr/bin/gnome-keyring-daemon --daemonize --login │ ├─ 2351 gnome-session --session gnome-classic │ ├─ 2358 dbus-launch --sh-syntax --exit-with-session │ ├─ 2359 /bin/dbus-daemon --fork --print-pid 4 --print-address 6 --sessi... │ ├─ 2424 /usr/libexec/gvfsd │ ├─ 2428 /usr/libexec/gvfsd-fuse /run/user/1000/gvfs -f -o big_writes يُمكن سرد هذه المجموعات حسب استخدام المعالج والذاكرة العشوائية أو حسب المُدخَلات والمُخرجات بالأمر systemd-cgtop: Path Tasks %CPU Memory Input/s Output/s / 216 37.7 1.6G - - /system.slice - 7.1 - - - /system.slice/gdm.service 2 7.1 - - - /system.slice/rngd.service 1 0.0 - - - /system.slice/tuned.service 1 0.0 - - - /system.slice/vboxadd-service.service 1 0.0 - - - /system.slice/httpd.service 6 0.0 - - - التحكم في مستويات التشغيل Runlevels الإقلاع في وضع الإنقاذ Rescue mode أو وضع الطوارئ Emergency mode يمكن في حال حدوث مشكل الإقلاعُ في وضع الإنقاذ بالأمر التالي: # systemctl rescue كما يُستخدم الأمر systemctl للإقلاع في وضع الطوارئ: # systemctl emergency وللعودة إلى وضع الإقلاع المبدئي: # systemctl default عرض مستوى التشغيل الحالي $ systemctl get-default graphical.target الإقلاع على مستوى تشغيل يمكن تحديد مستوى التشغيل الذي نريد الإقلاع عليه بالأمر systemctl isolate؛ مثلا: # systemctl isolate runlevel5.target # systemctl isolate runlevel3.target أو بذكر اسم المستوى: # systemctl isolate graphical.target # systemctl isolate multiuser.target تعيين مستوى التشغيل المبدئي # systemctl set-default runlevel3.target # systemctl set-default runlevel5.target مستويات التشغيل هي التالية: المستوى 0 runlevel0: إيقاف تشغيل النظام وفصله عن الطاقة. المستوى 1 runlevel1: وضع الإنقاذ والصيانة. المستوى 2 runlevel2: تعدّد المستخدمين. المستوى 3 runlevel3: تعدّد المستخدمين مع تشغيل خدمات الشبكة. المستوى 4 runlevel4: مستوى تشغيل محجوز لما يعرّفه المستخدم. المستوى 5 runlevel5: المستوى 3 + واجهة رسومية. المستوى 6 runlevel6: إعادة تشغيل النظام. إعادة تشغيل النظام، إيقافه، تعليقه وإسباته # systemctl reboot # systemctl halt # systemctl suspend # systemctl hibernate كما يمكن جعل النظام في وضع السبات المزدوج (مزيج من وضع السبات والتعليق) بالأمر: # systemctl hybrid-sleep ترجمة - بتصرّف - لمقال How to Manage ‘Systemd’ Services and Units Using ‘Systemctl’ in Linux.
  12. الجدران النارية Firewalls هي أنظمة حماية تتحكّم في حركة البيانات القادمة إلى شبكة أو الخارجة منها، اعتمادا على مجموعة من القواعد المعرَّفة مسبقا؛ على سبيل المثال وجهة الحزم Packets، مصدرها أو نوعية البيانات. سنعرض في هذا الدرس لأساسيات FirewallD وهو البرنامج المبدئي لإدارة الجدار الناري في Red Hat Enterprise Linux 7، وIptables الذي هو الجدار الناري التقليدي في أنظمة لينكس، ويتوفّر أيضا في RHEL 7. مقارنة بين FirewallD وIptables يعمل الجداران الناريان FirewallD وIptables عن طريق التخاطب مع النواة عبر نفس الواجهة، أمر iptables؛ إلا أن الاختلاف بينهما يكمن في أن FirewallD يمكنه تعديل الإعدادات أثناء عمل النظام دون ضياع الاتّصالات الجارية. يجب أن يكون FirewallD مثبتا مبدئيا على RHEL 7، إلا أنه يمكن ألا يكون مفعلا. يمكن التحقّق منه بالأوامر التاليّة: # yum info firewalld firewall-config تُظهر نتيجة الأمر أعلاه أن الجدار الناري FirewallD مثبت فعلا، وكذلك حزمة firewall-config التي توفّر أداة في واجهة المستخدم لإدارة الجدار الناري. الجدار الناري مثبّت، يمكننا الآن التحقق من ما إذا كان مفعّلا أم لا: # systemctl status -l firewalld.service على الجانب الآخر، لا يُضمَّن جدار Iptables الناري مبدئيا في Red Hat Enterprise Linux 7؛ إلا أنه يمكن تثبيته بالأمر: # yum update && yum install iptables-services تُشغَّل الخدمتان وتُفعّلان مع الإقلاع عن طريق أوامر systemd الاعتيادية: # systemctl start firewalld.service # systemctl start iptables.service # systemctl enable firewalld.service # systemctl enable iptables.service يوجد ملفّ إعداد iptables على المسار etc/sysconfig/iptables/ (يجب أن تكون الحزمة مثبتة حتى يوجد الملفّ)؛ بينما توجد ملفات إعداد FirewallD موزعة بين المجلدين usr/lib/firewalld/ وetc/firewalld/. يمكن الحصول على معلومات أكثر عن هذه الأدوات بتنفيذ الأوامر: # man firewalld.conf # man firewall-cmd # man iptables راجع مقال أساسيات التعامل مع الصدفة Shell في Red Hat Enterprise Linux لطرق أخرى حول الحصول على المعلومات عن الأوامر في Red Hat Enterprise Linux 7. استخدام Iptables للتحكم في حركة البيانات عبر الشبكة سنذكُر في ما يلي أمثلة لإعداد Iptables على RHEL 7؛ تأكد من مراجعة مقال ما هو الجدار الناري وكيف يعمل؟ والمقالات المرتبطة به لفهم آلية عمل الجدار الناري بالتفصيل. السماح لحركة البيانات المتجهة إلى خادوم الوِب والصّادرة منه تستخدم خواديم الوِب المنفذين 80 و443 للإنصات للطلبات القادمة إلى الخادوم. المنفذ الأول 80 خاصّ بحركة البيانات العاديّة بينما يُستخدم المنفذ الثاني 443 للبيانات المؤمّنة. تطلُب الأوامر التالية من Iptables السماح بحركة البيانات الواردة والصّادرة عبر المنفذين 80 و443 في واجهة الشبكة enp0s3: # iptables -A INPUT -i enp0s3 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT # iptables -A OUTPUT -o enp0s3 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT # iptables -A INPUT -i enp0s3 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT # iptables -A OUTPUT -o enp0s3 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT حجب بيانات قادمة من شبكة محدّدة تحتاج أحيانا لمنع اتصالات واردة من شبكة تحدّدها، مثلا 192.168.1.0/24. يؤدّي Iptables هذه المهمة بتنفيذ الأمر التالي: # iptables -I INPUT -s 192.168.1.0/24 -j DROP يحجب الأمر السابق جميع الاتصالات القادمة من عنوان IP ضمن الشبكة الفرعية 192.168.1.0/24؛ يمكننا تخصيص الأمر بحجب الاتصالات القادمة من هذه الشبكة عبر المنفذ 22 دون غيره: # iptables -A INPUT -s 192.168.1.0/24 --dport 22 -j ACCEPT توجيه البيانات الواردة إلى وجهة أخرى يمكن استخدام RHEL 7 فاصلا بين شبكتين بحيث يعيد توجيه البيانات بينهما؛ يجب في هذه الحالة تفعيل إعادة توجيه عناوين IP على النظام بتحرير الملف etc/sysctl.conf/ وتعيين القيمة 1 للتعليمة net.ipv4.ip_forward: net.ipv4.ip_forward = 1 احفظ التعديلات ثم نفّذ الأمر لاعتمادها: # sysctl -p /etc/sysctl.conf سنفترض أن لدينا طابعة مربوطة بخادوم للطباعة يعمل على العنوان 192.168.0.10 ويُنصِت للطلبات القادمة عبر المنفذ 631. يمكن في هذه الحالة توجيه طلبات الطباعة القادمة إلى الجدار الناري على المنفذ 631 إلى خادوم الطباعة بالأمر التالي: # iptables -t nat -A PREROUTING -i enp0s3 -p tcp --dport 631 -j DNAT --to 192.168.0.10:631 ملحوظة: يجب تذكر أن Iptables يقرأ القواعد الأمنية بالتسلسل، لذا تأكد من القواعد المحدّدة بعد القواعد أعلاه لا تلغيها. نفس الشيء بالنسبة للسياسات المبدئية Default policies. جدار FirewallD الناري المناطق Zones هي أحد التغييرات التي أضافها جدار FirewallD؛ وهي درجات مختلفة من الموثوقيّة يمنحها مدير النظام للأجهزة والبيانات في الشبكة. يُستخدم الأمر التالي لسرد لائحة بالمناطق النشطة في FirewallD: # firewall-cmd --get-active-zones public interfaces: enp0s3 enp0s9 يظهر في نتيجة الأمر أعلاه أن المنطقة public التي توجد بها الواجهتان enp0s3 وenp0s9، نشطة. نستخدم الأمر التالي للحصول على جميع المعلومات المتوفرة عن منطقة (public في المثال): # firewall-cmd --zone=public --list-all السماح للخدمات بالمرور عبر الجدار الناري يتعرّف FirewallD تلقائيا على أسماء عدد من الخدمات، يمكن الحصول على لائحة بها بتنفيذ الأمر: # firewall-cmd --get-services تطلب الأوامر التالية من الجدار الناري السماح بمرور بيانات الخدمتين http (المنفذ 80) وhttps (المنفذ 443) وتفعيلها مع إقلاع النظام (permanent--): # firewall-cmd --zone=MyZone --add-service=http # firewall-cmd --zone=MyZone --permanent --add-service=http # firewall-cmd --zone=MyZone --add-service=https # firewall-cmd --zone=MyZone --permanent --add-service=https # firewall-cmd --reload إن لم تحدّد المنطقة عن طريق الخيار zone فستُسخدَم المنطقة المبدئيّة. استخدم remove مكان add إن أردت حذف القاعدة. توجيه البيانات يجب التأكد أولا من أن إخفاء العناوين IP masquerading مفعَّل بالنسبة للمنطقة المطلوبة: # firewall-cmd --zone=MyZone --query-masquerade yes # firewall-cmd --zone=public --query-masquerade no يظهر في نتيجة الأمر السابق أن إخفاء العناوين مفعَّل بالنسبة للمنطقة MyZone بينما هو معطَّل بالنسبة لـpublic. ملحوظة: إخفاء العناوين IP masquerading هو آلية في لينكس تشبه ترجمة العناوين Network address translation, NAT في الموجّهات Routers. تمكّن هذه الآلية - مثلا - مجموعة من الأجهزة من الاتّصال بالإنترنت باستخدام نفس عنوان IP؛ حيث يتولى الجهاز الذي يُفعَّل عليه إخفاء العناوين التخاطب مع العالم الخارجي ثم يعيد توجيه الحزم في الشبكة الداخلية. يمكن تفعيل إخفاء العناوين بالنسبة للمنطقة public على النحو التالي: # firewall-cmd --zone=public --add-masquerade يؤدي الأمر التالي نفس مهمة مثال التوجيه السابق باستخدام FirewallD بدلا من Iptables: # firewall-cmd --zone=public --add-forward-port=port=631:proto=tcp:toport=631:toaddr=192.168.0.10 لا تنس إعادة تحميل إعدادات الجدار الناري لاعتماد التعديلات: # firewall-cmd --reload يمكنك الحصول على أمثلة أخرى في درس إعداد خادوم وِب وخادوم FTP على Red Hat Enterprise Linux حيث شرحنا كيفية السماح للبيانات بالمرور عبر المنافذ التي يستخدمها عادة خادومُ الوِب وخادوم FTP وكيفية تغيير القاعدة في الجدار الناري عند تغيير المنفذ الذي تعمل عبره هذه الخدمات. تمكن أيضا الاستعانة بويكي FirewallD للمزيد من الأمثلة. ترجمة - بتصرّف - لمقال RHCSA Series: Firewall Essentials and Network Traffic Control Using FirewallD and Iptables – Part 11 لصاحبه Gabriel Cánepa.
  13. 18 مثالا لاستخدام مدير الحزم YUM

    يتناول هذا المقال كيفية تثبيت الحزم، تحديثها، حذفها، البحث عنها وإدارة مستودعاتها Repositories على توزيعة لينكس تستخدم مدير الحزم YUM الذي تُطوّره شركة Red Hat. يُمكن استخدام الأمثلة المذكورة في هذا الدّرس، والتي جُرِّبت على خادوم Red Hat Enterprise Linux 7، لأغراض الدراسة، التحضير لشهادة متخصّصة أو لاستكشاف طرق جديدة لتثبيت الحزم والإبقاء على نظامك محدَّثا. يجب، لكي تتبع الأمثلة المقدَّمة في هذا الدرس، أن يكون لديك فهم لأساسيات عمل الأوامر في لينكس وتوزيعة تستخدم YUM للتجربة عليها، Fedora أو Red Hat Enterprise Linux 7 على سبيل المثال. ما هو مدير الحزم YUM؟ يُستخدَم مدير الحزم YUM (اختصار لـYellowdog Updater Modified) لإدارة البرامج المُحزَّمة بصيغة RPM (RedHat Package Manager). يمكن استخدام YUM من سطر الأوامر أو عبر واجهة رسومية. يتيح مدير الحزم YUM لمدير النظام تثبيت الحزم، تحديثها، حذفها أو البحث عنها. يُوزَّع مدير الحزم YUM حسب رخصة غنو GNU العمومية. تثبيت الحزم يُستخدَم الأمر install في مدير الحزم YUM على النحو التالي لتثبيت حزمة برنامج يُسمَّى Firefox. يتولّى مدير الحزم تثبيت الاعتمادات Dependencies، أي البرامج والمكتبات Libraries التي يتطلب عملُ الحزمة Firefox وجودَها (يجب أن تكون لديك صلاحيات المستخدم الجذر لتثبيت الحزم): [root@academy1 ~]# yum install firefox Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager Resolving Dependencies --> Running transaction check ---> Package firefox.x86_64 0:45.3.0-1.el7_2 will be installed --> Finished Dependency Resolution Dependencies Resolved ========================================================================= Package Arch Version Repository Size ========================================================================= Installing: firefox x86_64 45.3.0-1.el7_2 rhel-7-server-eus-rpms 76 M Transaction Summary ========================================================================= Install 1 Package Total download size: 76 M Installed size: 142 M Is this ok [y/d/N]: y Downloading packages: (...) Installed: firefox.x86_64 0:45.3.0-1.el7_2 Complete! يطلُب الأمر أعلاه التأكيد (Is this ok) قبل البدء في تنزيل الحزمة وتثبيتها (اكتب y ثم اضغط على زرّEnter للتأكيد). استخدم الخيار y- إن كنت ترغب في تثبيت الحزم تلقائيا دون طلب التأكيد: # yum -y install firefox حذف حزمة يحذف الأمر التالي الحزمة firefox تماما من النظام (بما في ذلك اعتماداتها): [root@academy1 ~]# yum remove firefox Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager Resolving Dependencies --> Running transaction check ---> Package firefox.x86_64 0:45.3.0-1.el7_2 will be erased --> Finished Dependency Resolution Dependencies Resolved =========================================================================================== Package Arch Version Repository Size =========================================================================================== Removing: firefox x86_64 45.3.0-1.el7_2 @rhel-7-server-eus-rpms 142 M Transaction Summary =========================================================================================== Remove 1 Package Installed size: 142 M Is this ok [y/N]: y Downloading packages: Running transaction check Running transaction test Transaction test succeeded Running transaction Erasing : firefox-45.3.0-1.el7_2.x86_64 1/1 Verifying : firefox-45.3.0-1.el7_2.x86_64 1/1 Removed: firefox.x86_64 0:45.3.0-1.el7_2 Complete! يطلُب الأمر التأكيد قبل حذف الحزمة. استخدم الخيار y- لتعطيل طلب التأكّد كالتالي: # yum -y remove firefox تحديث حزمة فلنفترض أن لديك حزمة MySQL قديمة، لم تُحدَّث منذ زمن؛ وترغب في تحديثها إلى آخر إصدار. الأمر التالي يؤدي المهمة: # yum update mysql سرد قائمة بالحزم يُستخدَم أمر السرد list للبحث عن حزمة معيّنة عن طريق اسمها. يبحث الأمر التالي عن حزمة باسم openssh: [root@academy1 ~]# yum list openssh Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager Installed Packages openssh.x86_64 6.6.1p1-25.el7_2 @rhel-7-server-eus-rpms يمكن جعل البحث أكثر دقة بذكر إصدار الحزمة إن عُرِف؛ مثلا: # yum list openssh-6.6.1p1 البحث عن حزمة يمكن استخدام الأمر search للبحث عن حزمة لا تتذكر اسمها بالضبط؛ مثلا نبحث عن ftp: [root@academy1 ~]# yum search ftp Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager ================== N/S matched: ftp ================================= ftp.x86_64 : The standard UNIX FTP (File Transfer Protocol) client tftp.x86_64 : The client for the Trivial File Transfer Protocol (TFTP) tftp-server.x86_64 : The server for the Trivial File Transfer Protocol (TFTP) vsftpd.x86_64 : Very Secure Ftp Daemon curl.x86_64 : A utility for getting files from remote servers (FTP, HTTP, and others) lftp.i686 : A sophisticated file transfer program lftp.x86_64 : A sophisticated file transfer program wget.x86_64 : A utility for retrieving files using the HTTP or FTP protocols Name and summary matches only, use "search all" for everything. الحصول على معلومات عن حزمة استخدم الأمر info للحصول على معلومات عن حزمة؛ مثلا قبل تثبيتها: [root@academy1 ~]# yum info firefox Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager Available Packages Name : firefox Arch : x86_64 Version : 45.3.0 Release : 1.el7_2 Size : 76 M Repo : rhel-7-server-eus-rpms/7Server/x86_64 Summary : Mozilla Firefox Web browser URL : http://www.mozilla.org/projects/firefox/ License : MPLv1.1 or GPLv2+ or LGPLv2+ Description : Mozilla Firefox is an open-source web browser, designed for standards : compliance, performance and portability. سرد جميع الحزم المتوفّرة يسرُد الأمر list عند استخدامها دون معطيات جميع الحزم المتوفرة في المستودعات؛ وهي كثيرة؛ لذا أعد توجيه نتيجة أمر السّرد إلى الأمر less لتيسير عمليّة التصفح: [root@academy1 ~]# yum list | less استخدم المعطى installed إن أردت أن يقتصر السّرد على الحزم المثبّتة: [root@academy1 ~]# yum list installed | less العثور على حزمة انطلاقا من ملفّ يُستخدَم الأمر provides في مدير الحزم YUM لمعرفة الحزمة التي يتبع لها ملفّ مّا. مثلا؛ نريد معرفة الحزمة التي توفّر ملفّ الإعداد etc/httpd/conf/httpd.conf/، لذا ننفذ الأمر بالطريقة التالية: [root@academy1 ~]# yum provides /etc/httpd/conf/httpd.conf Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager httpd-2.4.6-17.el7.x86_64 : Apache HTTP Server Repo : rhel-7-server-eus-rpms Matched from: Filename : /etc/httpd/conf/httpd.conf httpd-2.4.6-17.el7.x86_64 : Apache HTTP Server Repo : rhel-7-server-rpms Matched from: Filename : /etc/httpd/conf/httpd.conf يُظهر الأمر اسم الحزمة والمستودع الذي تأتي منه. التحقق من وجود تحديثات وتحديث النظام استخدم الأمر yum check-update لمعرفة الحزم المثبّتة التي تتوفّر لها تحديثات. أما إن أردت تحديث الحزم إلى آخر إصدار متوفّر فالأمر yum update يؤدي المهمة. سرد مجموعات الحزم تُجمَّع كثير من الحزم في مجموعات لتسهيل التعامل معها؛ فبدلا من تثبيت هذه الحزم الواحدة تلو الآخرى، أو كتابة أسمائها جميعا، يمكن تثبيتها دفعة واحدة عن طريق اسم المجموعة. استخدم الأمر grouplist لسرد مجموعات الحزم المتوفّرة: [root@academy1 ~]# yum grouplist Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager Available Environment Groups: Minimal Install Infrastructure Server File and Print Server Basic Web Server Virtualization Host Server with GUI Installed Groups: Development Tools Graphical Administration Tools Legacy UNIX Compatibility Security Tools System Administration Tools Available Groups: Compatibility Libraries Console Internet Tools RT Scientific Support Smart Card Support System Management Done تثبيت مجموعة حزم استخدم الأمر groupinstall لتثبيت مجموعة حزم. يثبّت الأمر التالي مجموعة حزم File and Print Server (خادوم الطباعة وتشارك الملفات): [root@academy1 ~]# yum groupinstall 'File and Print Server' Dependencies Resolved ====================================================================================== Package Arch Version Repository Size ====================================================================================== Installing for group install "File and Storage Server": cifs-utils x86_64 6.2-7.el7 rhel-7-server-eus-rpms 84 k nfs4-acl-tools x86_64 0.3.3-14.el7 rhel-7-server-eus-rpms 47 k targetcli noarch 2.1.fb41-3.el7 rhel-7-server-eus-rpms 61 k targetd noarch 0.7.1-1.el7 rhel-7-server-eus-rpms 48 k Installing for dependencies: PyYAML x86_64 3.10-11.el7 rhel-7-server-eus-rpms 153 k libyaml x86_64 0.1.4-11.el7_0 rhel-7-server-eus-rpms 55 k lvm2-python-libs x86_64 7:2.02.130-5.el7_2.5 rhel-7-server-eus-rpms 166 k pyparsing noarch 1.5.6-9.el7 rhel-7-server-eus-rpms 94 k python-configshell noarch 1:1.1.fb18-1.el7 rhel-7-server-eus-rpms 67 k python-kmod x86_64 0.9-4.el7 rhel-7-server-eus-rpms 57 k python-rtslib noarch 2.1.fb57-3.el7 rhel-7-server-eus-rpms 88 k python-setproctitle x86_64 1.1.6-5.el7 rhel-7-server-eus-rpms 15 k python-urwid x86_64 1.1.1-3.el7 rhel-7-server-eus-rpms 654 k Transaction Summary ========================================================================================= Install 4 Packages (+9 Dependent packages) Total download size: 1.6 M Installed size: 5.7 M Is this ok [y/d/N]: تحديث مجموعة حزم يُستخدَم الأمر groupupdate على النحو التالي لتحديث مجموعة حزم سبق تثبيتها: [root@academy1 ~]# yum groupupdate 'File and Print Server' حذف مجموعة حزم استخدم الأمر groupremove لحذف مجموعة حزم مثبتة؛ مثلا لحذف مجموعة الحزم السابقة: [root@academy1 ~]# yum groupremove 'File and Print Server' سرد مستودعات YUM يمكن سرد المستودعات المفعَّلة في مدير الحزم YUM باستخدام الأمر التالي: [root@academy1 ~]# yum repolist Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager repo id repo name status !rhel-7-server-eus-rpms/7Server/x86_64 Red Hat Enterprise Linux 7 Server - Extended Update Support (RPMs) 11,241 !rhel-7-server-rpms/7Server/x86_64 Red Hat Enterprise Linux 7 Server (RPMs) 11,250 !rhel-7-server-rt-beta-rpms/x86_64 Red Hat Enterprise Linux for Real Time Beta (RHEL 7 Server) (RPMs) 15 !rhel-7-server-rt-rpms/7Server/x86_64 Red Hat Enterprise Linux for Real Time (RHEL 7 Server) (RPMs) 129 !rhel-ha-for-rhel-7-server-eus-rpms/7Server/x86_64 Red Hat Enterprise Linux High Availability (for RHEL 7 Server) - Extended Update Support (RP 224 !rhel-ha-for-rhel-7-server-rpms/7Server/x86_64 Red Hat Enterprise Linux High Availability (for RHEL 7 Server) (RPMs) 224 !rhel-rs-for-rhel-7-server-eus-rpms/7Server/x86_64 Red Hat Enterprise Linux Resilient Storage (for RHEL 7 Server) - Extended Update Support (RP 279 !rhel-rs-for-rhel-7-server-rpms/7Server/x86_64 Red Hat Enterprise Linux Resilient Storage (for RHEL 7 Server) (RPMs) 279 repolist: 23,641 أضف الخيار all إلى الأمر السابق إن أردت سرد جميع المستودعات بما فيها تلك غير المفعَّلة: [root@academy1 ~]# yum repolist all تثبيت حزمة مع تحديد المستودع يُستخدم الخيار enablerepo-- في أمر التثبيت لتحديد المستودع الذي نريد تنزيل الحزمة منه: [root@academy1 ~]# yum --enablerepo=rhel-7-server-rpms install postgresql Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager Resolving Dependencies --> Running transaction check ---> Package postgresql.x86_64 0:9.2.15-1.el7_2 will be installed --> Processing Dependency: postgresql-libs(x86-64) = 9.2.15-1.el7_2 for package: postgresql-9.2.15-1.el7_2.x86_64 --> Processing Dependency: libpq.so.5()(64bit) for package: postgresql-9.2.15-1.el7_2.x86_64 --> Running transaction check ---> Package postgresql-libs.x86_64 0:9.2.15-1.el7_2 will be installed --> Finished Dependency Resolution Dependencies Resolved ======================================================================================= Package Arch Version Repository Size ======================================================================================= Installing: postgresql x86_64 9.2.15-1.el7_2 rhel-7-server-eus-rpms 3.0 M Installing for dependencies: postgresql-libs x86_64 9.2.15-1.el7_2 rhel-7-server-eus-rpms 231 k Transaction Summary ======================================================================================== Install 1 Package (+1 Dependent package) Total download size: 3.2 M Installed size: 16 M Is this ok [y/d/N]: صدفة YUM تفاعلية يتيح مدير الحزم YUM صدفة Shell لتنفيذ أوامر عدّة لإدارة الحزم: [root@academy1 ~]# yum shell Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager > update > repolist repo id repo name status rhel-7-server-eus-rpms/7Server/x86_64 Red Hat Enterprise Linux 7 Server - Extended Update Support (RPMs) 11,241 rhel-7-server-rpms/7Server/x86_64 Red Hat Enterprise Linux 7 Server (RPMs) 11,250 rhel-7-server-rt-beta-rpms/x86_64 Red Hat Enterprise Linux for Real Time Beta (RHEL 7 Server) (RPMs) 15 rhel-7-server-rt-rpms/7Server/x86_64 Red Hat Enterprise Linux for Real Time (RHEL 7 Server) (RPMs) 129 rhel-ha-for-rhel-7-server-eus-rpms/7Server/x86_64 Red Hat Enterprise Linux High Availability (for RHEL 7 Server) - Extended Update Support (RPM 224 rhel-ha-for-rhel-7-server-rpms/7Server/x86_64 Red Hat Enterprise Linux High Availability (for RHEL 7 Server) (RPMs) 224 rhel-rs-for-rhel-7-server-eus-rpms/7Server/x86_64 Red Hat Enterprise Linux Resilient Storage (for RHEL 7 Server) - Extended Update Support (RPM 279 rhel-rs-for-rhel-7-server-rpms/7Server/x86_64 Red Hat Enterprise Linux Resilient Storage (for RHEL 7 Server) (RPMs) 279 > exit Leaving Shell عرض سجلّ أوامر YUM يُستخدَم الأمر history على النحو التالي لعرض قائمة بآخر أوامر YUM المنفّذة: [root@academy1 ~]# yum history Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager ID | Login user | Date and time | Action(s) | Altered ------------------------------------------------------------------------------- 14 | Mohamed ... <meyil> | 2016-09-01 23:57 | Erase | 1 13 | Mohamed ... <meyil> | 2016-09-01 23:48 | Install | 1 12 | Mohamed ... <meyil> | 2016-08-02 23:41 | I, U | 6 11 | Mohamed ... <meyil> | 2016-07-31 23:19 | Install | 2 10 | Mohamed ... <meyil> | 2016-07-21 22:09 | Install | 1 9 | Mohamed ... <meyil> | 2016-07-21 15:29 | Install | 4 8 | Mohamed ... <meyil> | 2016-07-21 14:18 | I, U | 75 7 | Mohamed ... <meyil> | 2016-06-11 01:32 | Erase | 1 6 | Mohamed ... <meyil> | 2016-06-07 13:51 | Update | 1 5 | Mohamed ... <meyil> | 2016-06-05 02:57 | Install | 2 4 | Mohamed ... <meyil> | 2016-06-05 02:56 | Update | 1 3 | Mohamed ... <meyil> | 2016-05-28 03:16 | Install | 1 2 | Mohamed ... <meyil> | 2016-05-28 02:45 | I, U | 190 EE 1 | System <unset> | 2016-05-27 20:43 | Install | 1293 history list تنظيف تخبئة Cache مدير الحزم يحتفظ مدير الحزم YUM بنسخ من البيانات المتعلقة بالحزم ضمن مجلّد var/cache/yum/؛ يمكن حذف جميع هذه النسخ بتنفيذ الأمر التالي: [root@academy1 ~]# yum clean all Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager Cleaning repos: rhel-7-server-eus-rpms rhel-7-server-rpms rhel-7-server-rt-beta-rpms rhel-7-server-rt-rpms rhel-ha-for-rhel-7-server-eus-rpms : rhel-ha-for-rhel-7-server-rpms rhel-rs-for-rhel-7-server-eus-rpms rhel-rs-for-rhel-7-server-rpms Cleaning up everything ترجمة - بتصرّف - لمقال20 Linux YUM (Yellowdog Updater, Modified) Commands for Package Management لصاحبه Ravi Saive.
  14. المسترجعات Accessors والمعدلات Mutators في Laravel

    المسترجِعات Accessors والمعدِّلات Mutators في Laravel هي مجموعة دوالّ مخصّصة يعرّفها المستخدم لتهيئة خواص النماذج Models. تُستخدم المسترجعات لتهيئة خواصّ النموذج عند طلب الحصول عليها من قاعدة البيانات، بينما تُستخدَم المعدّلات لتهيئة الخواصّ قبل حفظ النموذج في القاعدة. تعريف مسترجع تُسمى الدوال المسترجعة بالصيغة ()getFooAttribute حيث Foo هو اسم الخاصيّة التي نريد تهيئتها في الدالة، مع الانتباه إلى حالة الحرف الأول من الخاصية (حرف كبير Uppercase). سيستدعي Laravel تلقائيا هذه الدالة في كلّ مرة تبحث فيها عن قيمة الخاصيّة foo. لا يقتصر استخدام المسترجعات على سلاسل المحارف، بل يمكنك استخدامها لتهيئة أي نوع من البيانات تواريخ، أثمان، …إلخ. سنفترض أن لدينا نموذجا باسم Member (عضو) يحوي الخاصيّات التاليّة: first_name last_name email password last_visit settings created_at updated_at توجد من ضمن اللائحة أعلاه بضعة خاصيّات سيكون مفيدا لنا تطبيق المسترجعات عليها. على سبيل المثال، لا يهتمّ المستخدمون كثيرا بطريقة كتابة أسمائهم، لذا يمكننا استخدام المسترجعات للتأكد من أن الأسماء تُكتب بطريقة صحيحة. يحاكي المثال التالي إضافة مستخدم لم ينتبه كثيرا لطريقة كتابة بياناته: $user = App\Member::create([ 'first_name' => 'mirza', 'last_name' => 'pasic', 'email' => 'mirza.pasic@bosnadev.com', 'password' => '!supersecretpassword!', 'last_login' => Carbon\Carbon::now(), 'settings' => ['two_factor_aut' => false, 'session_time' => 1200], 'created_at' => Carbon\Carbon::now(), 'updated_at' => Carbon\Carbon::now() ]); يمكننا استخدام المسترجعات لتهيئة مُدخلات المستخدم: use Illuminate\Database\Eloquent\Model; /** * Class Member * @package App */ class Member extends Model { /** * التأكد من تهيئة الاسم الشخصي بعد الحصول على النموذج من قاعدة البيانات * * @param $value * @return string */ public function getFirstNameAttribute($value) { return ucfirst($value); } /** * التأكد من تهيئة الاسم العائلي بعد الحصول على النموذج من قاعدة البيانات * * @param $value * @return string */ public function getLastNameAttribute($value) { return ucfirst($value); } } سيعمل المسترجعان getFirstNameAttribute و getLastNameAttribute على تهيئة الحقلين first_name (الاسم الشخصي) وlast_name (الاسم العائلي) على التوالي لجعل الحرف الأول في كلّ واحد منهما يُكتب كبيرا (Uppercase)، بغضّ النظر عن الطريقة التي أدخلهما بها المستخدم. يمكن أيضا استخدام المسترجعات لدمج خاصيّتين في النموذج لتكوّنا واحدة جديدة. يمكن مثلا تعريف الاسم الكامل full_name بناء على الاسم الشخصي والاسم العائلي: /** * Get members full name * * @return string */ public function getFullNameAttribute() { return ucfirst($this->first_name) . ' ' . ucfirst($this->last_name); } ثم يمكننا استخدامه كما لو كان فعلا يوجد حقل باسم full_name في النموذج: $member = App\Member::find(1); echo $member->full_name; يمكنك إن أردت استخدام المسترجعات على أنواع بيانات أخرى. مثلا، لتهيئة التاريخ. نستخدم في المثال التالي الدالة getLastLoginAttribute لتهيئة تاريخ آخر دخول (الحقل last_login) بحيث يظهر بالصيغة d.m.Y (يمثّل الحرف d اليوم، الحرفm الشهر وY السنة مكتوبة بأربعة أرقام): /** * Custom format for the last login date * * @param $value * @return string */ public function getLastLoginAttribute($value) { return \Carbon\Carbon::parse($value)->format('d.m.Y.'); } ثم نستخدم الحقل last_login كما في المثال التالي: $member = App\Member::find(1); echo $member->last_login; يظهر الحقل كما يلي: 11.07.2016. تعريف معدل تشبه آلية تسميّة المعدِّل تعريفَ المسترجع، مع فرق إحلال set مكان get. إذا أردنا تعريف معدِّل للخاصيّة foo فسيكون اسمُه setFooAttribute. نعود لمثال النموذج Member السابق. نريد الآن أن نتأكد من تهيئة اسم العضو قبل حفظ النموذج في قاعدة البيانات: /** * التأكد من تهيئة الاسم الشخصي **قبل** حفظ النموذج * * @param $value * @return string */ public function setFirstNameAttribute($value) { $this->attributes['first_name'] = ucfirst($value); } /** * التأكد من تهيئة الاسم العائلي **قبل** حفظ النموذج * * @param $value * @return string */ public function setLastNameAttribute($value) { $this->attributes['last_name'] = ucfirst($value); } ربما لاحظت أن الدالة لا ترجِع أية قيمة. ما يحدُث هو أننا نضبُط الخاصيّة بالقيمة التي نريد مباشرة. نتأكد بهذه الطريقة أن الاسمين الشّخصي والعائلي سيكونان مهيأيْن دائما بالصيغة التي نريد. أمثلة على المسترجعات والمعدلات رأينا في الفقرات السابقة أمثلة لاستخدامات سهلة للمسترجعات والمعدّلات؛ إلا أن هذه الدوال يمكن أن تُستخدَم لأمور أكثر تخصيصا كما سنرى في الأمثلة التالية. حماية كلمات السّر يمكن استخدام المعدِّلات لتجزئة كلمة السّر Password hashing قبل حفظها في قاعدة البيانات؛ مثلا: public function setPasswordAttribute($value) { $this->attributes['password'] = Hash::make($value); } تتأكد بهذه الطريقة أن كلمة السّر لن تُحفَظ أبدا بصيغتها المقروءة في قاعدة البيانات، وهو ما يعدّ إجراء أمنيًّا أساسيا. استخدمنا في المثال السابق صنف Hash الذي يوفّره Laravel مبدئيا، ولكن يمكنك استخدام دوال تعميّة إن أردت، مثل ()bcrypt. الترميز بصيغة Json إن نظرت إلى نموذج Member السابق فستجد أنه يحوي خاصيّة باسم settings تُستخدَم لحفظ تفضيلات العضو الشخصيّة وخيارات أخرى يتيحها التطبيق. يمكن استخدام مصفوفة لإدارة هذه الخيارات وحفظها في قاعدة البيانات بصيغة Json. تتيح قواعد بيانات مثل PostgreSQL نوع البيانات Json في حقول الجدول منذ زمن، كما أن MySQL أتاحت نوع البيانات هذا في الإصدار 5.7.8. ملحوظة: دعم نوع البيانات Json في MySQL لا زال في بداياته، وقد تواجه مشاكل عند استخدامه. بالنسبة لخاصيّة settings فسنحتاج لمعدِّل يخزّن البيانات بصيغة Json في القاعدة ومسترجِع لتحويل Json إلى مصفوفة من سلسلة محارف: /** * Make sure that we get an array from JSON string * * @param $value * @return array */ public function getSettingsAttribute($value) { return json_decode($value, true); } /** * Encode an array to a JSON string * * @param $value */ public function setSettingsAttribute($value) { $this->attributes['settings'] = json_encode($value); } المثال كاملا في ما يلي الخطوات اللازمة لإنشاء مثال عملي يعتمد على النموذج المقدّم في هذا الدرس. نفترض وجود Laravel مثبّت بقاعدة بيانات مضبوطة. إنشاء التهجير والنموذج php artisan make:model Member -m Model created successfully. Created Migration: 2016_07_04_020531_create_members_table التعديل على التهجير public function up() { Schema::create('members', function (Blueprint $table) { $table->increments('id'); $table->string('first_name'); $table->string('last_name'); $table->string('email'); $table->string('password'); $table->date('last_login'); $table->string('settings'); $table->timestamps(); }); } التعديل على النموذج في ما يلي الشفرة الكاملة للنموذج Member مع المسترجعات والمعدِّلات. <?php namespace App; use Illuminate\Support\Facades\Hash; use Illuminate\Database\Eloquent\Model; /** * Class Member * @package App */ class Member extends Model { /** * @var array */ protected $fillable = ['first_name', 'last_name', 'email', 'password', 'last_login', 'settings', 'created_at', 'updated_at']; /** * التأكد من تهيئة الاسم الشخصي بعد الحصول على النموذج من قاعدة البيانات * * @param $value * @return string */ public function getFirstNameAttribute($value) { return ucfirst($value); } /** * التأكد من تهيئة الاسم العائلي بعد الحصول على النموذج من قاعدة البيانات * * @param $value * @return string */ public function getLastNameAttribute($value) { return ucfirst($value); } /** * الاسم الكامل للعضو * * @return string */ public function getFullNameAttribute() { return ucfirst($this->first_name) . ' ' . ucfirst($this->last_name); } /** * تهيئة تاريخ آخر زيارة * * @param $value * @return string */ public function getLastLoginAttribute($value) { return \Carbon\Carbon::parse($value)->format('d.m.Y.'); } /** * التأكد من تهيئة الاسم الشخصي **قبل** حفظ النموذج * * @param $value * @return string */ public function setFirstNameAttribute($value) { $this->attributes['first_name'] = ucfirst($value); } /** * التأكد من تهيئة الاسم العائلي **قبل** حفظ النموذج * * @param $value * @return string */ public function setLastNameAttribute($value) { $this->attributes['last_name'] = ucfirst($value); } /** * تهيئة كلمة السّر **قبل** حفظها * * @param $value */ public function setPasswordAttribute($value) { $this->attributes['password'] = Hash::make($value); } /** * الحصول على مصفوفة من حقل بصيغة * Json * * @param $value * @return array */ public function getSettingsAttribute($value) { return json_decode($value, true); } /** * الترميز بصيغة * Json * قبل حفظ الحقل * @param $value */ public function setSettingsAttribute($value) { $this->attributes['settings'] = json_encode($value); } } استخدام النموذج Route::get('members', function() { $user = App\Member::create([ 'first_name' => 'mirza', 'last_name' => 'pasic', 'email' => 'mirza.pasic@bosnadev.com', 'password' => '!supersecretpassword!', 'last_login' => Carbon\Carbon::now(), 'settings' => ['two_factor_aut' => true, 'session_time' => 1200], 'created_at' => Carbon\Carbon::now(), 'updated_at' => Carbon\Carbon::now() ]); $member = App\Member::find(1); echo $member->last_login . '<br>'; echo $member->full_name . '<br>'; }); ترجمة -وبتصرّف- للمقال Laravel Accessors and Mutators لصاحبه Mirza Pasic.
  15. يُراجع هذا المقال تثبيت الحزم، تحديثها وحذفها في توزيعة Red Hat Enterprise Linux 7؛ كما يغطّي أتمتة المهامّ باستخدام Cron وكيفيةَ تحليل ملفات السّجلات Logs الموجودة على النظام. استخدام Yum لإدارة الحزم تثبيت الحزم يُستخدَم أمر yum لتثبيت الحزم على Red Hat Enterprise Linux بالطريقة التالية: # yum -y install package_name حيثُ package_name اسم الحزمة التي نريد تثبيتها. يمكننا تثبيت أكثر من حزمة في نفس الوقت بكتابة أسمائها على التوالي. نطلُب في المثال التالي تثبيت الحزم httpd وmlocate: # yum -y install httpd mlocate يؤدي استخدامُ الخيار y- إلى تجاوز طلب التأكيد الذي يظهر قبل تنزيل الحزم وتثبيتها. يمكن حذفه من الأمر إن أردت. يُثبّت yum مبدئيا الحزم المطابقة لمعمارية Architecture نظام التشغيل؛ إلا أنه يمكن تخصيص معماريّة الحزمة بإلحاق المعمارية المرغوبة باسم الحزمة. على سبيل المثال، إن كنت تستخدم نظام تشغيل بمعمارية 64 بت فإن تنفيذ الأمر yum install package سيُثبّت الإصدار 64 بت (x86_64) من الحزمة package؛ في حين يؤدي تنفيذ الأمر yum install package.x86 إلى تثبيت الإصدار 32 بت، في حال توفّره. البحث عن حزمة قد تحتاج أحيانا لتثبيت حزمة ولكنّك لا تعرف اسمها بالضبط؛ يمكن في هذه الحالة استخدام الأمر yum search أو yum search all للبحث في المستودعات المُفعَّلة عن كلمة مفتاحية في اسم الحزمة أو في وصفها، على التوالي. على سبيل المثال؛ يبحث الأمر التالي ضمن المستودعات المفعَّلة عن الحزم التي تحوي كلمة log في أسمائها أو في مختصر عملها: # yum search log بينما يبحث الأمر التالي عن الكلمة log في أسماء الحزم، مختصرات عملها، أوصافها وروابط url الخاصّة بها: # yum search all log ماذا إن كنت تعرف اسم برنامج دون أن تعرف الحزمة التي تُثبته؟ مثلا برنامج ps2pdf. يمكن اللجوء في هذه الحالة إلى الأمر yum whatprovides على النحو التالي: # yum whatprovides "*/ps2pdf" الحصول على معلومات عن حزمة قد تودّ الحصول على معلومات عن حزمة، قبل أن تقرّر تثبيتها على جهازك؛ بعد ظهورها مثلا في نتيجة البحث بالأمر السابق. يمكنك استخدام الأمر yum لهذا الغرض: # yum info logwatch البحث عن تحديثات يُستخدم الأمر yum check-update للبحث عن التحديثات المتوفّرة للحزم. يُظهر الأمر لائحة بالحزم التي يتوفر لها تحديث. يمكنك بعدها تحديث جميع الحزم مرة واحدة بتنفيذ الأمر yum update؛ كما يمكنك تحديث حزمة محدّدة بتنفيذ الأمر yum update package حيثُ package هو اسم الحزمة. حذف حزمة يمكن حذف حزمة بالأمر yum remove على النحو التالي: # yum remove httpd حزم RPM يمكن تثبيت البرامج على Red Hat Enterprise Linux بحزم RPM (اختصار لـ RedHat Package Manager) القائمة بذاتها (لا توجد ضمن مستودعات ولا تحتاج للاتصال بالشبكة). تثبيت الحزم يُستخدَم الأمر rpm لتثبيت هذه الحزم، ويكثُر استخدام الخيارات Uvh- التي تشير إلى أنه يجب تثبيت الحزمة إن لم تكن مثبّتة على النظام ومحاولة تحديثها إن كانت مثبّتة (U-)، إظهار عرض تفصيلي بنتيجة تنفيذ الأمر (v-) وعرض شريط بتقدّم تنفيذ الأمر (h-). مثلا: # rpm -Uvh package.rpm عرض لائحة بالحزم المثبتة يمكن استخدام الأمر rpm مع الخيار qa- (اختصار لـ Query all) لإظهار لائحة بجميع الحزم المثبتة على النظام: # rpm -qa جدولة المهامّ باستخدام Cron تتضمّن أنظمة تشغيل لينكس والأنظمة الشبيهة بيونكس أداة تُسمّى Cron لجدولة المهام (أوامر أو سكربتات الصدفة) للعمل دوريا. تبحث أداة Cron كل دقيقة في المجلّد var/spool/cron/ عن ملفات بأسماء حسابات موافقة لتلك المذكورة في الملف etc/passwd/. تُرسَل مخرجات تنفيذ المهامّ إلى صاحب المهمّة أو المستخدم المحدَّد في متغيّر البيئة MAILTO ضمن الملفّ etc/crontab/ إن كان موجودا. يُستخدَم الأمر crontab -e لإنشاء ملفات Crontab التي تأخذ الأسطُر فيها الصيغة التالية: نطلُب في المثال التالي جدولة تحديث قاعدة البيانات الخاصة بالملفات (يستخدمها الأمر locate للبحث في الملفات) بحيثُ ينفَّذ أمر الجدولة bin/updatedb/ في اليوم الثاني من كلّ شهر عند الساعة 2:15 صباحا: 15 02 2 * * /bin/updatedb يُقرأ السطر أعلاه “نفّذ الأمر bin/updatedb/ في اليوم الثاني من الشّهر، كل شهر من السنة بدون النظر في يوم الأسبوع (أحد، اثنان، …إلخ) عند الساعة 2 صباحا والدقيقة 15”. تشير العلامة * إلى أن قيمة الحقل غير معيّنة. ملحوظة: المحرّر المستخدم مبدئيا عند تنفيذ الأمر crontab -e هو محرّر vi. ستلاحظ بعد إضافة المهمة إلى الجدول إنشاءَ ملفّ باسم root في المجلد var/spool/cron/، كما ذكرنا آنفا. يمكن عرض جميع ملفات Crontab بسرد محتويات المجلّد السّابق الذكر: # ls -l /var/spool/cron كما يمكن للمستخدم الحالي (root) عرضُ جميع مهامّه المجدولة إما بعرض محتوى الملف var/spool/cron/root/ أو بتنفيذ الأمر crontab -l. تستطيع جدولة مهمّة للعمل أكثر من مرة. نطلُب من Cron في المثال التالي تنفيذ السكربت myscript وتوجيه مخرجاته إلى dev/null/ في الدقيقة الأولى من اليومين الأول والخامس عشر من كل شهر: 01 00 1 * * /myscript > /dev/null 2>&1 01 00 15 * * /my/script > /dev/null 2>&1 يمكن دمج السّطرين على النحو التالي: 01 00 1,15 * * /my/script > /dev/null 2>&1 نطلُب في المثال التالي تنفيذ سكربت عند الساعة الواحدة و30 دقيقة صباحا في اليوم الأول من الشهر كل ثلاثة أشهر (الأشهر 1، 4، 7 و10): 30 01 1 1,4,7,10 * /my/other/script > /dev/null 2>&1 إلا أنه توجد طريقة أسهل من السابقة؛ إذ يتيح Cron تحديد عدد مرات للتنفيذ. إن أردنا مثلا تنفيذ أمر كل 3 دقائق فإننا نستخدم الصّيغة 3/* مكان الدقائق. نفس الشي بالنسبة للساعات، الأيام أو الأشهر. يؤدي السّطر التالي نفس غرض السّطر السابق: 30 01 1 */3 * /my/other/script > /dev/null 2>&1 توجد اختصارات لجدولة الأوامر للتنفيذ بتردّد ثابت أو مباشرة بعد إعادة تشغيل النظام. يوضّح الجدول التالي هذه الاختصارات والصّيغة المكافئة لها؛ إن أردت استخدام أحد الاختصارات اكتبه مكان الحقول الزمنية الخمسة في ملفّ Cron: @reboot - - تنفيذ السكربت أو الأمر مباشرة بعد إقلاع النظام. @yearly - 00 00 1 1 * - مرة في السنة. @monthly - 00 00 1 * * - مرة في الشهر. @weekly - 00 00 * * 0 - مرة في الأسبوع. @daily - 00 00 * * * - مرة في اليوم. @hourly - 00 * * * * - مرة في الساعة. راجع مقال كيف تجدول مهامك الروتينية باستخدام أداتي Cron و Anacron في لينكس للمزيد. السّجلات توجد سجلّات النظام في المجلّد var/log/. يحتفظ النظام بسجلات مختلفة داخل هذا المجلّد، موزّعة على مجلّدات فرعية مثل audit، httpd وsamba. يعمل النّظام على تقسيم السّجل على ملفات لتجنّب الحصول على ملفات كبيرة جدا؛ تُعرَف هذه العمليّة بالتدوير Rotation حيثُ تُنقَل السجلات القديمة إلى ملفّ آخر بنفس الاسم مع عدد أو تاريخ للترتيب (مثلا secure-20160530). من أهمّ ملفات السّجلات: dmesg الذي يحوي الرسائل القادمة من النواة Kernel، ملفّ secure الذي توجد به سجلات لمحاولات الاتصال بالخادوم التي تتطلّب الاستيثاق، messages الذي توجد به رسائل متعلقّة بالنظام ككلّ وwtmpالذي يحوي سجلات بعمليات الدخول Logins والخروج Logouts. تكمُن أهميّة السّجلات في أنها تعطيك نظرة عن ما يحدُث في النظام أو ما حدث في الماضي. تُستخدَم السّجلات لفحص اختلالات النظام وإصلاحها أو لمراقبة الخادوم. إن أردت تتبّع ما يطرأ على أحد السّجلات مباشرة فيمكنك استخدام الأمر tail مع الخيار f-؛ مثلا: # tail -f /var/log/dmesg وإن كنت تريد رؤية عمليات الوصول إلى خادوم الوِب فور حدوثها: # tail -f /var/log/httpd/access.log من المهمّ النظرُ إلى السجلات دوريا، ومعرفة ملفّ السّجلات المناسب لكلّ خدمة تعمل على خادومك. ترجمة - بتصرّف - لمقال RHCSA Series: Yum Package Management, Automating Tasks with Cron and Monitoring System Logs – Part 10 لصاحبه Gabriel Cánepa.