
هذه هي ملاحظات الإصدار لنواة لينكس الإصدار 4. اقرأها بعناية، فهي تخبرك ما هو هذا الأمر، وتشرح كيفية تثبيت النواة، وماذا تفعل إذا حدث خطأ ما.
ما هو لينكس؟
لينكس هو نسخة مقلدة من نظام التشغيل يونكس، مكتوبة من الصفر بواسطة لينوس تورفالدز بمساعدة فريق غير مترابط من المخترقين عبر الإنترنت. يهدف إلى الامتثال لمعايير POSIX و Single UNIX Specification.
يتمتع بجميع الميزات التي تتوقعها في نظام يونكس حديث متكامل، بما في ذلك تعدد المهام الحقيقي، الذاكرة الافتراضية، المكتبات المشتركة، التحميل عند الطلب، الملفات التنفيذية المشتركة للنسخ عند الكتابة، إدارة الذاكرة السليمة، والشبكات متعددة الأكوام بما في ذلك IPv4 و IPv6.
يتم توزيعه بموجب رخصة جنو العمومية العامة - راجع ملف COPYING المرفق لمزيد من التفاصيل.
على أي أجهزة يعمل؟
على الرغم من أنه طُوّر في البداية لأجهزة الكمبيوتر الشخصية 32-بت المعتمدة على x86 (386 أو أعلى)، إلا أن لينكس اليوم يعمل أيضًا (على الأقل) على معماريات Compaq Alpha AXP و Sun SPARC و UltraSPARC و Motorola 68000 و PowerPC و PowerPC64 و ARM و Hitachi SuperH و Cell و IBM S/390 و MIPS و HP PA-RISC و Intel IA-64 و DEC VAX و AMD x86-64 و AXIS CRIS و Xtensa و Tilera TILE و AVR32 و Renesas M32R.
لينكس سهل النقل إلى معظم المعماريات العامة 32-بت أو 64-بت طالما أنها تحتوي على وحدة إدارة ذاكرة مقسمة الصفحات (PMMU) ومنفذ لمترجم GNU C (gcc) (جزء من مجموعة مترجمات GNU، GCC). كما تم نقل لينكس إلى عدد من المعماريات بدون PMMU، على الرغم من أن الوظائف محدودة بشكل واضح. تم نقل لينكس أيضًا إلى نفسه. يمكنك الآن تشغيل النواة كتطبيق على مستوى المستخدم - وهذا يسمى UserMode Linux (UML).
التوثيق:
هناك الكثير من التوثيق المتاح سواء في شكل إلكتروني على الإنترنت أو في الكتب، سواء الخاصة بلينكس أو المتعلقة بأسئلة UNIX العامة. أوصي بالاطلاع على الأدلة الفرعية للتوثيق على أي موقع FTP للينكس من أجل كتب مشروع توثيق لينكس (LDP). هذا الملف README ليس المقصود منه أن يكون توثيقًا للنظام: هناك مصادر أفضل بكثير متاحة.
هناك ملفات README مختلفة في الدليل الفرعي Documentation/: تحتوي هذه عادةً على ملاحظات تثبيت خاصة بالنواة لبعض برامج التشغيل على سبيل المثال. راجع Documentation/00-INDEX للحصول على قائمة بما هو موجود في كل ملف. يُرجى قراءة ملف Changes، لأنه يحتوي على معلومات حول المشاكل التي قد تنتج عن ترقية النواة الخاصة بك.
الدليل الفرعي Documentation/DocBook/ يحتوي على عدة أدلة للمطورين والمستخدمين للنواة. يمكن عرض هذه الأدلة بعدة تنسيقات: PostScript (.ps) و PDF و HTML وصفحات الدليل (man-pages)، من بين أخرى. بعد التثبيت، سيؤدي تشغيل "make psdocs" أو "make pdfdocs" أو "make htmldocs" أو "make mandocs" إلى عرض التوثيق بالتنسيق المطلوب.
تثبيت شفرة مصدر النواة:
إذا قمت بتثبيت المصادر الكاملة، ضع حزمة النواة المضغوطة في دليل لديك فيه صلاحيات (مثل دليل منزلك) وقم بفك ضغطها:
xz -cd linux-4.X.tar.xz | tar xvf -
استبدل "X" برقم إصدار أحدث نواة.
لا تستخدم منطقة /usr/src/linux! هذه المنطقة تحتوي على مجموعة (عادة غير كاملة) من رؤوس النواة التي تستخدمها ملفات رؤوس المكتبات. يجب أن تتطابق مع المكتبة، وألا تُفسد بأي شيء قد يكون هو النواة الحالية.
يمكنك أيضًا الترقية بين إصدارات 4.x عن طريق التصحيح (patching). يتم توزيع التصحيحات بتنسيق xz. للتثبيت عن طريق التصحيح، احصل على جميع ملفات التصحيح الأحدث، وادخل إلى الدليل العلوي لمصدر النواة (linux-4.X) وقم بتنفيذ:
xz -cd ../patch-4.x.xz | patch -p1
استبدل "x" لجميع الإصدارات الأكبر من الإصدار "X" لشجرة المصادر الحالية لديك، بالترتيب، ويجب أن تكون بخير. قد ترغب في إزالة ملفات النسخ الاحتياطي (some-file-name~ أو some-file-name.orig)، وتأكد من عدم وجود تصحيحات فاشلة (some-file-name# أو some-file-name.rej). إذا كانت موجودة، فإما أنك أو أنا ارتكبنا خطأ.
على عكس تصحيحات النواة 4.x، فإن تصحيحات النواة 4.x.y (المعروفة أيضًا باسم النواة المستقرة -stable) ليست تراكمية بل تطبق مباشرة على النواة الأساسية 4.x. على سبيل المثال، إذا كانت نواتك الأساسية هي 4.0 وتريد تطبيق التصحيح 4.0.3، يجب ألا تطبق أولاً التصحيحين 4.0.1 و 4.0.2. وبالمثل، إذا كنت تستخدم إصدار النواة 4.0.2 وتريد القفز إلى 4.0.3، يجب عليك أولاً عكس التصحيح 4.0.2 (أي patch -R) قبل تطبيق التصحيح 4.0.3. يمكنك قراءة المزيد حول هذا في Documentation/applying-patches.txt
بدلاً من ذلك، يمكن استخدام السكربت patch-kernel لأتمتة هذه العملية. يحدد إصدار النواة الحالي ويطبق أي تصحيحات موجودة.
linux/scripts/patch-kernel linux
الوسيطة الأولى في الأمر أعلاه هي موقع مصدر النواة. يتم تطبيق التصحيحات من الدليل الحالي، ولكن يمكن تحديد دليل بديل كوسيطة ثانية.
تأكد من عدم وجود ملفات .o قديمة وتبعيات عالقة:
cd linux make mrproper
يجب أن يكون لديك الآن المصادر مثبتة بشكل صحيح.
متطلبات البرمجيات
يتطلب تجميع وتشغيل النواة 4.x إصدارات حديثة من حزم برمجية متنوعة. استشر Documentation/Changes للحصول على أرقام الإصدارات الدنيا المطلوبة وكيفية الحصول على تحديثات لهذه الحزم. احذر من أن استخدام إصدارات قديمة جدًا من هذه الحزم يمكن أن يسبب أخطاء غير مباشرة يصعب تتبعها، لذلك لا تفترض أنه يمكنك فقط تحديث الحزم عند ظهور مشاكل واضحة أثناء البناء أو التشغيل.
دليل البناء للنواة:
عند تجميع النواة، سيتم تخزين جميع ملفات الإخراج افتراضيًا مع شفرة مصدر النواة. باستخدام الخيار "make O=output/dir" يمكنك تحديد مكان بديل لملفات الإخراج (بما في ذلك .config). مثال:
شفرة مصدر النواة: /usr/src/linux-4.X
دليل البناء: /home/name/build/kernel
لتكوين وبناء النواة، استخدم:
cd /usr/src/linux-4.X
make O=/home/name/build/kernel menuconfig
make O=/home/name/build/kernel
sudo make O=/home/name/build/kernel modules_install install
يُرجى ملاحظة: إذا تم استخدام الخيار 'O=output/dir'، فيجب استخدامه لجميع استدعاءات make.
تكوين النواة:
لا تتخط هذه الخطوة حتى لو كنت تقوم فقط بترقية إصدار ثانوي واحد. يتم إضافة خيارات تكوين جديدة في كل إصدار، وستظهر مشاكل غريبة إذا لم يتم إعداد ملفات التكوين كما هو متوقع. إذا كنت ترغب في نقل تكوينك الحالي إلى إصدار جديد بأقل جهد، استخدم "make oldconfig"، والذي سيسألك فقط عن الإجابات للأسئلة الجديدة.
أوامر التكوين البديلة هي:
"make config" واجهة نصية عادية.
"make menuconfig" قوائم ملونة تعتمد على النص، وقوائم راديو وحوارات.
"make nconfig" قوائم ملونة معززة تعتمد على النص.
"make xconfig" أداة تكوين تعتمد على X windows (Qt).
"make gconfig" أداة تكوين تعتمد على X windows (Gtk).
"make oldconfig" الافتراضي لجميع الأسئلة بناءً على محتويات ملف ./.config الحالي الخاص بك والسؤال عن رموز التكوين الجديدة.
"make silentoldconfig" مثل ما سبق، لكنه يتجنب تشويش الشاشة بالأسئلة التي تمت الإجابة عليها بالفعل. بالإضافة إلى تحديث التبعيات.
"make olddefconfig" مثل ما سبق، لكنه يضبط الرموز الجديدة على قيمها الافتراضية دون مطالبة.
"make defconfig" أنشئ ملف ./.config باستخدام قيم الرموز الافتراضية إما من arch/$ARCH/defconfig أو arch/$ARCH/configs/${PLATFORM}_defconfig، اعتمادًا على المعمارية.
"make ${PLATFORM}_defconfig" أنشئ ملف ./.config باستخدام قيم الرموز الافتراضية من arch/$ARCH/configs/${PLATFORM}_defconfig. استخدم "make help" للحصول على قائمة بجميع المنصات المتاحة لمعماريتك.
"make allyesconfig" أنشئ ملف ./.config عن طريق ضبط قيم الرموز على 'y' قدر الإمكان.
"make allmodconfig" أنشئ ملف ./.config عن طريق ضبط قيم الرموز على 'm' قدر الإمكان.
"make allnoconfig" أنشئ ملف ./.config عن طريق ضبط قيم الرموز على 'n' قدر الإمكان.
"make randconfig" أنشئ ملف ./.config عن طريق ضبط قيم الرموز على قيم عشوائية.
"make localmodconfig" أنشئ تكوينًا يعتمد على التكوين الحالي و الوحدات المحملة (lsmod). يعطل أي خيار وحدة غير مطلوب للوحدات المحملة.
لإنشاء localmodconfig لجهاز آخر،
احفظ lsmod لذلك الجهاز في ملف
وقم بتمريره كمعامل LSMOD.
target$ lsmod > /tmp/mylsmod
target$ scp /tmp/mylsmod host:/tmp
host$ make LSMOD=/tmp/mylsmod localmodconfig
ما ورد أعلاه يعمل أيضًا عند التجميع المتقاطع.
"make localyesconfig" مشابه لـ localmodconfig، إلا أنه سيحول جميع خيارات الوحدات إلى خيارات مدمجة (=y).
يمكنك العثور على مزيد من المعلومات حول استخدام أدوات تكوين نواة لينكس في Documentation/kbuild/kconfig.txt.
ملاحظات حول "make config":
وجود برامج تشغيل غير ضرورية سيجعل النواة أكبر، ويمكن في بعض الظروف أن يؤدي إلى مشاكل: البحث عن بطاقة تحكم غير موجودة قد يربك وحدات التحكم الأخرى لديك.
تجميع النواة:
تأكد من توفر gcc 3.2 على الأقل. لمزيد من المعلومات، راجع Documentation/Changes.
يُرجى ملاحظة أنه لا يزال بإمكانك تشغيل برامج مستخدم a.out باستخدام هذه النواة.
قم بعمل "make" لإنشاء صورة نواة مضغوطة. من الممكن أيضًا القيام بـ "make install" إذا كان لديك lilo مثبتًا ليناسب ملفات make للنواة، ولكن قد ترغب في التحقق من إعداد lilo الخاص بك أولاً.
للقيام بالتثبيت الفعلي، يجب أن تكون الجذر (root)، ولكن لا يتطلب أي من عمليات البناء العادية ذلك. لا تستخدم اسم الجذر عبثًا.
إذا قمت بتكوين أي من أجزاء النواة كـ "وحدات" (modules)، ستحتاج أيضًا إلى القيام بـ "make modules_install".
إخراج تفصيلي لتجميع/بناء النواة:
عادةً، يعمل نظام بناء النواة في وضع هادئ إلى حد ما (ولكن ليس صامتًا تمامًا). ومع ذلك، في بعض الأحيان تحتاج أنت أو مطورو النواة الآخرون إلى رؤية أوامر التجميع والربط وغيرها تمامًا كما يتم تنفيذها. لهذا، استخدم وضع البناء "التفصيلي". يتم ذلك عن طريق إدراج "V=1" في أمر "make". مثال:
make V=1 all
لجعل نظام البناء يخبر أيضًا عن سبب إعادة بناء كل هدف، استخدم "V=2". الافتراضي هو "V=0".
احتفظ بنواة احتياطية في متناول اليد في حالة حدوث خطأ ما. هذا صحيح بشكل خاص بالنسبة للإصدارات التطويرية، لأن كل إصدار جديد يحتوي على كود جديد لم يتم تصحيحه. تأكد من الاحتفاظ بنسخة احتياطية من الوحدات المقابلة لتلك النواة أيضًا. إذا كنت تقوم بتثبيت نواة جديدة بنفس رقم إصدار النواة العاملة لديك، قم بعمل نسخة احتياطية من دليل الوحدات الخاص بك قبل القيام بـ "make modules_install".
بدلاً من ذلك، قبل التجميع، استخدم خيار تكوين النواة "LOCALVERSION" لإلحاق لاحقة فريدة برقم إصدار النواة العادي. يمكن تعيين LOCALVERSION في قائمة "الإعداد العام" (General Setup).
من أجل إقلاع نواتك الجديدة، ستحتاج إلى نسخ صورة النواة (مثل .../linux/arch/i386/boot/bzImage بعد التجميع) إلى المكان الذي توجد فيه نواتك القابلة للإقلاع العادية.
لم يعد إقلاع نواة مباشرة من قرص مرن دون مساعدة محمل إقلاع مثل LILO مدعومًا.
إذا قمت بإقلاع لينكس من القرص الصلب، فمن المحتمل أنك تستخدم LILO، والذي يستخدم صورة النواة المحددة في الملف /etc/lilo.conf. ملف صورة النواة عادة ما يكون /vmlinuz، /boot/vmlinuz، /bzImage أو /boot/bzImage. لاستخدام النواة الجديدة، احفظ نسخة من الصورة القديمة وانسخ الصورة الجديدة فوق القديمة. ثم، يجب عليك إعادة تشغيل LILO لتحديث خريطة التحميل!! إذا لم تفعل، لن تتمكن من إقلاع صورة النواة الجديدة.
إعادة تثبيت LILO عادة ما يكون مسألة تشغيل /sbin/lilo. قد ترغب في تحرير /etc/lilo.conf لتحديد إدخال لصورة النواة القديمة (مثل /vmlinux.old) في حالة عدم عمل الجديدة. راجع وثائق LILO لمزيد من المعلومات.
بعد إعادة تثبيت LILO، يجب أن يكون كل شيء جاهزًا. قم بإيقاف تشغيل النظام، وأعد التشغيل، واستمتع!
إذا احتجت في أي وقت إلى تغيير جهاز الجذر الافتراضي، وضع الفيديو، حجم قرص رام، إلخ. في صورة النواة، استخدم برنامج 'rdev' (أو بدلاً من ذلك خيارات إقلاع LILO عند الاقتضاء). لا حاجة لإعادة تجميع النواة لتغيير هذه المعلمات.
إذا حدث خطأ ما:
إذا كانت لديك مشاكل تبدو بسبب أخطاء في النواة، يُرجى التحقق من الملف MAINTAINERS لمعرفة ما إذا كان هناك شخص معين مرتبط بالجزء من النواة الذي تواجه مشكلة معه. إذا لم يكن هناك أي شخص مدرج هناك، فإن ثاني أفضل شيء هو إرسال بريد إلكتروني إليّ ([email protected])، وربما إلى أي قائمة بريدية أخرى ذات صلة أو إلى مجموعة الأخبار.
في جميع تقارير الأخطاء، من فضلك أخبرني عن أي نواة تتحدث، وكيفية تكرار المشكلة، وما هو إعدادك (استخدم فطنتك السليمة). إذا كانت المشكلة جديدة، فأخبرني بذلك، وإذا كانت المشكلة قديمة، فيرجى محاولة إخباري متى لاحظتها لأول مرة.
إذا أدى الخطأ إلى رسالة مثل
unable to handle kernel paging request at address C0000010 Oops: 0002 EIP: 0010:XXXXXXXX eax: xxxxxxxx ebx: xxxxxxxx ecx: xxxxxxxx edx: xxxxxxxx esi: xxxxxxxx edi: xxxxxxxx ebp: xxxxxxxx ds: xxxx es: xxxx fs: xxxx gs: xxxx Pid: xx, process nr: xx xx xx xx xx xx xx xx xx xx xx
أو معلومات تصحيح نواة مماثلة على شاشتك أو في سجل النظام الخاص بك، فيرجى تكرارها تمامًا. قد يبدو التفريغ غير مفهوم لك، لكنه يحتوي على معلومات قد تساعد في تصحيح المشكلة. النص الموجود فوق التفريغ مهم أيضًا: فهو يخبرنا عن سبب قيام النواة بتفريغ الكود (في المثال أعلاه، يرجع ذلك إلى مؤشر نواة خاطئ). مزيد من المعلومات حول فهم التفريغ موجود في Documentation/oops-tracing.txt
إذا قمت بتجميع النواة مع CONFIG_KALLSYMS، يمكنك إرسال التفريغ كما هو، وإلا ستحتاج إلى استخدام برنامج "ksymoops" لفهم التفريغ (ولكن التجميع مع CONFIG_KALLSYMS عادة ما يكون مفضلاً). يمكن تنزيل هذه الأداة من ftp://ftp..kernel.org/pub/linux/utils/kernel/ksymoops/ . بدلاً من ذلك، يمكنك البحث في التفريغ يدويًا:
في تصحيح التفريغ مثل ما سبق، يساعد بشكل كبير إذا كان بإمكانك البحث عن معنى قيمة EIP. القيمة السداسية العشرية كما هي لا تساعدني أو أي شخص آخر كثيرًا: ستعتمد على إعداد النواة الخاص بك. ما يجب عليك فعله هو أخذ القيمة السداسية العشرية من سطر EIP (تجاهل "0010:")، والبحث عنها في قائمة أسماء النواة لمعرفة وظيفة النواة التي تحتوي على العنوان المخالف.
لمعرفة اسم وظيفة النواة، ستحتاج إلى العثور على الملف الثنائي للنظام المرتبط بالنواة التي أظهرت الأعراض. هذا هو الملف 'linux/vmlinux'. لاستخراج قائمة الأسماء ومطابقتها مع EIP من انهيار النواة، قم بما يلي:
nm vmlinux | sort | less
سيعطيك هذا قائمة بعناوين النواة مرتبة ترتيبًا تصاعديًا، والتي من السهل منها العثور على الوظيفة التي تحتوي على العنوان المخالف. لاحظ أن العنوان المعطى بواسطة رسائل تصحيح النواة لن يتطابق بالضرورة تمامًا مع عناوين الوظائف (في الواقع، هذا غير مرجح جدًا)، لذلك لا يمكنك فقط 'grep' القائمة: ومع ذلك، ستعطيك القائمة نقطة البداية لكل وظيفة نواة، لذلك من خلال البحث عن الوظيفة التي لها عنوان بداية أقل من الذي تبحث عنه ولكن تليها وظيفة ذات عنوان أعلى ستعثر على الوظيفة التي تريدها. في الواقع، قد تكون فكرة جيدة تضمين القليل من "السياق" في تقرير المشكلة الخاص بك، مع إعطاء بضعة أسطر حول السطر المثير للاهتمام.
إذا لم تتمكن لسبب ما من القيام بما ورد أعلاه (لديك صورة نواة مترجمة مسبقًا أو ما شابه)، فإن إخباري بقدر ما تستطيع عن إعدادك سيساعد. يُرجى قراءة وثيقة REPORTING-BUGS للحصول على التفاصيل.
تجميع النواة مع تعيين "نوع المعالج" أعلى من 386 سينتج نواة لا تعمل على نظام 386. ستكتشف النواة ذلك عند الإقلاع، وتستسلم.
النواة المزودة بمحاكاة رياضية (math-emulation) ستستمر في استخدام المعالج المساعد (coprocessor) إذا كان موجودًا: لن يتم استخدام المحاكاة الرياضية في هذه الحالة. ستكون النواة أكبر قليلاً، ولكنها ستعمل على أجهزة مختلفة بغض النظر عن وجود معالج مساعد رياضي أم لا.
تفاصيل تكوين "اختراق النواة" (kernel hacking) تؤدي عادةً إلى نواة أكبر أو أبطأ (أو كليهما)، ويمكنها حتى جعل النواة أقل استقرارًا عن طريق تكوين بعض الإجراءات لمحاولة كسر الكود السيئ بنشاط للعثور على مشاكل النواة (kmalloc()). لذلك يجب عليك على الأرجح الإجابة بـ 'n' على أسئلة ميزات "التطوير" و"التجريبية" و"التصحيح".
أعد التشغيل بالنواة الجديدة واستمتع.
بدلاً من ذلك، يمكنك استخدام gdb على نواة قيد التشغيل. (للقراءة فقط؛ أي لا يمكنك تغيير القيم أو تعيين نقاط التوقف.) للقيام بذلك، قم أولاً بتجميع النواة مع -g؛ قم بتحرير arch/i386/Makefile بشكل مناسب، ثم قم بعمل "make clean". ستحتاج أيضًا إلى تمكين CONFIG_PROC_FS (عبر "make config").
بعد إعادة التشغيل بالنواة الجديدة، قم بعمل "gdb vmlinux /proc/kcore". يمكنك الآن استخدام جميع أوامر gdb المعتادة. الأمر للبحث عن النقطة التي تعطل فيها نظامك هو "l *0xXXXXXXXX". (استبدل الـ XXXes بقيمة EIP.)
gdb على نواة غير قيد التشغيل يفشل حاليًا لأن gdb (بشكل خاطئ) يتجاهل الإزاحة الأولية التي تم تجميع النواة من أجلها.