Product SiteDocumentation Site

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

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

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

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

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

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 بت).

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-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
[...]

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-*/). في معظم الحالات، يذكر مشرف الحزمة إصدارات النواة التي أُعدَّت الرقعة لها.