Product SiteDocumentation Site

8.10. ترجمة النواة

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

8.10.1. المتطلبات الأولية ومقدمة

ليس غريباً أن تدير دبيان النواة بشكل حزمة، ولم تكن هذه الطريقة هي المتبعة في ترجمة وتثبيت النوى تقليدياً. بما أن النواة تبقى تحت سيطرة نظام الحزم، فيمكن عندها إزالتها بشكل نظيف، أو تنصيبها على عدة أجهزة. بالإضافة لذلك، تؤتمت السكربتات المرتبطة بهذه الحزم التفاعلات مع محمل الإقلاع ومولد initrd.
تحوي أكواد لينكس المنبعية (upstream) كل ما تحتاجه لبناء حزمة دبيان للنواة. لكنك تحتاج مع ذلك تثبيت build-essential لضمان أنك تملك الأدوات اللازمة لبناء حزمة دبيان. بالإضافة لذلك، تحتاج خطوة ضبط النواة للحزمة libncurses5-dev. أخيراً، تسمح الحزمة fakeroot بإنشاء حزمة دبيان دون استخدام الصلاحيات الإدارية.

8.10.2. الحصول على الشفرة المصدرية

تتوفر الشِّفرة المصدرية للنواة لينكس في حزمة، ككل الأشياء التي قد تكون لها فائدة في نظام دبيان. للحصول عليها، فقط ثبّت الحزمة linux-source-version. يسرد الأمر apt-cache search ^linux-source نسخ النواة المختلفة التي توفرها دبيان. يتوفر الإصدار الأخير في التوزيعة غير المستقرة: يمكنك الحصول عليه دون مخاطرة كبيرة (خصوصاً إذا أعددت APT عندك حسب تعليمات قسم 6.2.6, “العمل مع عدة توزيعات”). لاحظ أن الشفرة المصدرية التي تحويها هذه الحزم لا تتفق تماماً مع تلك التي ينشرها لينوس تورفالدس ومطورو النواة؛ لأن دبيان –كباقي التوزيعات– تطبّق عدداً من الرقع، التي قد تصل (أو لا تصل) إلى النسخة المنبعية من لينكس. تشمل هذه التعديلات نقلاً خلفياً لتصحيحات أو مزايا أو تعاريف من نسخ النواة الأحدث، ومزايا لم تُدمج (بالكامل) بعد في شجرة لينكس المنبعية، وأحياناً بعض تعديلات الخاصة بدبيان.
تركز بقية هذا القسم على النسخة 3.16 من النواة لينكس، لكن يمكن طبعاً تطبيق الأمثلة على أي نسخة تريدها من النواة.
نحن نفترض أنك قد ثبّتَّ الحزمة linux-source-3.16. تحوي هذه الحزمة الأرشيف /usr/src/linux-source-3.16.tar.xz، وهي نسخة مضغوطة من أكواد النواة. عليك فك الضغط عن هذه الملفات في مجلد جديد (ليس تحت /usr/src/ مباشرة، لعدم الحاجة لصلاحيات خاصة لترجمة النواة لينكس): المجلد ~/kernel/ سيكون مناسباً.
$ mkdir ~/kernel؛ cd ~/kernel
$ tar -xaf /usr/src/linux-source-3.16.tar.xz

8.10.3. ضبط النواة

تتمثل الخطوة التالية في إعداد النواة حسب احتياجاتك. تعتمد الإجراءات الدقيقة على أهدافك.
عند إعادة ترجمة نسخة أحدث من النواة (تحوي رقع إضافية مثلا)، ستبقى الإعدادات أقرب ما يمكن إلى الإعدادات التي تقترحها دبيان على الأغلب. في هذه الحالة، يمكن بدلاً من إعادة ضبط كل شيء بدءاً من الصفر أن تنسخ الملف /boot/config-version (يقصد بكلمة version نسخة النواة المستخدمة حالياً، التي يمكن معرفتها بالأمر uname -r) إلى ملف .config في المجلد الذي يحوي أكواد النواة.
$ cp /boot/config-3.16.0-4-amd64 ~/kernel/linux-source-3.16/.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 بت).

8.10.4. ترجمة وبناء الحزمة

بعد تجهيز إعدادات النواة، سيولد الأمر البسيط 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-3.16.7-ckt4-falcot_3.16.7-1_amd64.deb
../linux-image-3.16.7-ckt4-falcot_3.16.7-1_amd64.deb
../linux-image-3.16.7-ckt4-falcot-dbg_3.16.7-1_amd64.deb
../linux-libc-dev_3.16.7-1_amd64.deb

8.10.5. ترجمة الوحدات الخارجية

تُطوّر بعض الوحدات خارج نواة لينكس الرسمية. لاستخدام هذه الوحدات، يجب ترجمتها مع النواة التي ستستخدم معها. هناك عدد من الوحدات الخارجية الشهيرة التي توفرها دبيان في حزم خاصة، مثل xtables-addons-source (وحدات iptables إضافية) أو oss4-source‏ (Open Sound System، تعاريف بديلة للصوت).
هذه الوحدات الخارجية عديدة ومتنوعة ولا يمكننا ذكرها جميعاً هنا؛ قد يضيق الأمر apt-cache search source$ مجال البحث. على أي حال، لن تفيد هذه القائمة كثيراً لعدم وجود سبب يدعو لترجمة الوحدات الخارجية إلا إذا كنت تعلم أنك تحتاجها. في هذه الحالات، سوف تذكر وثائق الجهاز نموذجياً الوحدات الخاصة التي تحتاجها حتى تعمل في لينكس.
مثلاً، لنلق نظرة على الحزمة xtables-addons-source: بعد تثبيتها، نحصل على ملف .tar.bz2 يحوي أكواد الوحدة في المجلد /usr/src/. ومع أننا نستطيع فك الضغط عن الأرشيف وترجمة الوحدة بأنفسنا، إلا أننا نفضل أتمتة هذه العملية بكاملها باستخدام DKMS. توفر معظم الوحدات تكاملات DKMS المطلوبة في حزمة ينتهي اسمها باللاحقة -dkms. في حالتنا، كل ما نحتاجه هو تثبيت الحزمة xtables-addons-dkms لترجمة الوحدة للنواة المستخدمة حالياً شرط أن تكون حزمة linux-headers-* التي توافق نسخة النواة المثبتة موجودة على النظام. مثلاً، إذا استخدمت linux-image-amd64، عليك أيضاً تثبيت linux-headers-amd64.
$ sudo apt install xtables-addons-dkms

[...]
Setting up xtables-addons-dkms (2.6-1) ...
Loading new xtables-addons-2.6 DKMS files...
First Installation: checking all kernels...
Building only for 3.16.0-4-amd64
Building initial module for 3.16.0-4-amd64
Done.

xt_ACCOUNT:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/3.16.0-4-amd64/updates/dkms/
[...]
DKMS: install completed.
$ sudo dkms status
xtables-addons, 2.6, 3.16.0-4-amd64, x86_64: installed
$ sudo modinfo xt_ACCOUNT
filename:       /lib/modules/3.16.0-4-amd64/updates/dkms/xt_ACCOUNT.ko
license:        GPL
alias:          ipt_ACCOUNT
author:         Intra2net AG <opensource@intra2net.com>
description:    Xtables: per-IP accounting for large prefixes
[...]

8.10.6. ترقيع النواة

لا تتضمن النواة القياسية بعض المزايا لأنها غير ناضجة أو نتيجة بعض الخلافات مع مشرفي النواة. يمكن توزيع هذه المزايا كرقع يستطيع أي أحد تطبيقها على أكواد النواة إذا أراد.
توزع دبيان بعض هذه الرقع في الحزم linux-patch-* أو kernel-patch-* (مثل linux-patch-grsecurity2، التي تضيّق بعض النواحي في سياسة النواة الأمنية). تُثبِّتُ هذه الحزم ملفات في المجلد /usr/src/kernel-patches/.
إذا أردت تطبيق بعض من هذه الرقع، استخدم الأمر patch في مجلد الأكواد المصدرية ثم ابدأ ترجمة النواة كما شرحنا سابقاً.
$ cd ~/kernel/linux-source-3.16
$ make clean
$ zcat /usr/src/kernel-patches/diffs/grsecurity2/grsecurity-3.0-3.17.1-201410250027.patch.gz | patch -p1
لاحظ أنه لا يشترط أن تعمل أي رقعة مع جميع إصدارات النواة؛ قد يخفق الأمر patch عند تطبيق بعض الرقع على أكواد النواة. ستعرض رسالة خطأ تعطي بعض التفاصيل عن سبب الإخفاق؛ في هذه الحالة، راجع الوثائق المتوفرة في حزمة الرقعة (في المجلد /usr/share/doc/linux-patch-*/). في معظم الحالات، يذكر مشرف الحزمة إصدارات النواة التي أُعدَّت الرقعة لها.