العودة
نظام NixOS على Steam Link: وحدة kexec مبنية يدويًا تتجاوز قيد نوى Valve الموقّعة
SiTech AI Team3 წთ. საკითხავი

نظام NixOS على Steam Link: وحدة kexec مبنية يدويًا تتجاوز قيد نوى Valve الموقّعة

حوّل George Huebner جهاز Steam Link الذي اشتراه في تخفيضات عام 2018 إلى خادم ARM يعمل بلا توقف. وبما أن الجهاز لا يقلع إلا بنوى موقّعة من Valve، فقد بنى وحدة نواة دنيا تضيف استدعاء النظام kexec المفقود ثم سلّم الإقلاع إلى صورة NixOS مصغّرة.

عثر George Huebner في خزانته على جهاز Steam Link اشتراه في تخفيضات عام 2018 وما زال يعمل بلا مشاكل. رأى أن جهاز ARM الصغير، بمنافذ Ethernet وWi-Fi وBluetooth وعدة منافذ USB، يمكن أن يتحول إلى خادم قليل الاستهلاك يعمل على مدار الساعة. وفي تدوينة نشرها في 26 سبتمبر 2026 يشرح كيف شغّل عليه نظام NixOS والحيلة التي جعلت ذلك ممكنًا.

الجزء الصعب كان قد حُلّ سابقًا على يد مطوّر يُعرف باسم fijam، وتشير التدوينة إلى ملاحظاته حول تشغيل توزيعة Linux مخصصة على Steam Link. العقبة الأساسية أن محمّل الإقلاع في الجهاز لا يقلع إلا بنوى موقّعة من Valve، لذا لا يمكن تشغيل نواة مخصصة مباشرة. الحل هو الإقلاع أولًا إلى النواة المعتمدة من Valve ثم الانتقال إلى النواة الجديدة عبر kexec.

استدعاء نظام أُعيد بناؤه كوحدة نواة

هنا يظهر الحاجز الثاني: النواة التي تشحنها Valve بُنيت دون تفعيل CONFIG_KEXEC، أي أن استدعاء النظام kexec غير موجود أساسًا. جمع الكاتب ملفات kexec المصدرية ذات الصلة في وحدة نواة دنيا باسم kexec_load.ko تضيف الاستدعاء المفقود إلى النظام العامل. استُخدمت الحيلة نفسها لتشغيل توزيعات أخرى، لكن معظمهم اكتفى بتنزيل الوحدة والملف الثنائي kexec من موقع fijam. لم يرتح Huebner لتحميل وحدات نواة من الإنترنت فبناها بنفسه.

ترجمة متقاطعة لنواة عمرها 13 عامًا

بناء مساحة المستخدم والنواة وinitrd في NixOS بسيط: يكفي تمرير system وcrossSystem الصحيحين إلى lib.nixosSystem. أما مسألة المعمارية فكانت أعقد، إذ تستهدف سلسلة أدوات Valve معمارية armv7a، لكن الإعداد المكافئ armv7a-unknown-linux-gnueabihf يتفاعل بشكل سيئ مع بنية بناء Go في Nix، فاختار الكاتب armv7l وقام بترجمة متقاطعة من جهاز aarch64. أما الوحدة نفسها فتجب بناؤها مقابل النسخة المتشعبة المضمّنة من نواة عمرها 13 عامًا، الإصدار 3.8.13: احتاجت إلى رقع لتبنى بمترجم GCC حديث، وإلى بناء كامل للنواة وليس مجرد make modules_prepare، لأن ترقيم إصدارات الوحدات يتطلب ملف Module.symvers، ومن دونه يرفض insmod الوحدة.

تشخيص أعمى وتقليص حجم الصورة

كان التحقق من عملية التسليم صعبًا. فمخرج HDMI لا يعمل مع النواة الجديدة، واختار الكاتب عدم فتح الجهاز للوصول إلى منفذ UART، فجرّب أولًا نظام initramfs دنيًا مبنيًا على BusyBox يكتب ملف علامة على القرص ثم يعيد التشغيل إشارةً للنجاح. بعد ذلك انتقل إلى initrd من NixOS مع شبكة مفعّلة وقشرة عكسية عبر Netcat. تفصيلان كانا حاسمين: إضافة reset_berlin إلى الوحدات المتاحة في initrd لقراءة قرص USB، واستخدام initrd القديم غير المبني على systemd. بعد نجاح الإقلاع كانت الصورة ما زالت بحجم 2.3 جيجابايت، فأزال التوثيق والخطوط وخدمات XDG ونظام Nix نفسه وكل شرائح firmware من حزمة linux-firmware البالغة 1.8 جيجابايت إلا واحدة، وتوقف عند 1.2 جيجابايت واصفًا النتيجة بأنها جيدة بما يكفي. ويذكر في الختام أن شخصًا آخر وصل حديثًا إلى إعداد NixOS قابل للإقلاع بطريقة vibe coding، لكن إعداده لا يتعامل مع إعادة التشغيل بشكل صحيح ويعتمد على ملفات ثنائية زائدة. ونُشر كود flake والوحدة مع التدوينة.

SSiTech

SiTech — تطوير ويب مدعوم بالذكاء الاصطناعي

نبني مواقع سريعة وعصرية وندمج الذكاء الاصطناعي في سير عمل الشركات. لديك مشروع أو سؤال؟ يسعدنا مساعدتك.