חזרה
NixOS על Steam Link: מודול kexec שנבנה מהמקור עוקף את נעילת הגרעינים החתומים של Valve
SiTech AI Team3 წთ. საკითხავი

NixOS על Steam Link: מודול kexec שנבנה מהמקור עוקף את נעילת הגרעינים החתומים של Valve

ג'ורג' היבנר מצא בארון Steam Link שנקנה במבצע ב-2018 והפך אותו לשרת ARM דל-הספק שפועל תמיד. מכיוון שהמכשיר טוען רק קרנלים חתומים בידי Valve, הוא בנה מודול גרעין מינימלי שמוסיף את קריאת המערכת kexec החסרה ומעביר את האתחול ל-NixOS מצומצם.

ג'ורג' היבנר מצא בארון Steam Link שנקנה במבצע ב-2018 ועדיין עבד היטב, והחליט שמכשיר ARM קטן עם Ethernet, Wi-Fi, Bluetooth וכמה יציאות USB יכול לשמש כשרת חסכוני שפועל כל הזמן. בפוסט שפרסם ב-26 בספטמבר 2026 הוא מתאר איך הריץ עליו NixOS ואיזה טריק במודול גרעין איפשר זאת.

החלק הקשה כבר נפתר בידי מהנדס בשם fijam, שאת הערותיו על הרצת הפצת Linux מותאמת על ה-Steam Link המחבר מזכיר. המכשול המרכזי: טוען האתחול של המכשיר מקבל רק קרנלים חתומים בידי Valve, ולכן אי אפשר להעלות קרנל מותאם ישירות. הפתרון הוא לאתחל לקרנל המאושר של Valve ואז לבצע kexec לקרנל החדש.

קריאת מערכת שנבנתה מחדש כמודול גרעין

כאן מתבררת הבעיה השנייה: הקרנל שמספקת Valve לא הודר עם CONFIG_KEXEC, כלומר קריאת המערכת kexec פשוט אינה קיימת. המחבר אסף את קבצי המקור הרלוונטיים ובנה מהם מודול גרעין מינימלי בשם kexec_load.ko, שמוסיף למערכת הפועלת את קריאת המערכת החסרה. אחרים כבר השתמשו בשיטה הזו להעלאת הפצות אחרות, אך רובם פשוט הורידו את המודול והבינארי המוכנים מאתר של fijam. היבנר לא רצה לטעון מודולי גרעין מהאינטרנט, ובנה אותם בעצמו.

הידור צולב מול קרנל בן 13 שנה

בניית מרחב המשתמש, הקרנל וה-initrd של NixOS היא פשוטה: מעבירים ל-lib.nixosSystem את ה-system וה-crossSystem הנכונים. הארכיטקטורה הייתה מורכבת יותר. שרשרת הכלים של Valve מכוונת ל-armv7a, אבל ההגדרה המקבילה armv7a-unknown-linux-gnueabihf משתלבת רע עם מנגנון הבנייה של Go ב-Nix, ולכן המחבר בחר ב-armv7l והדר בצורה צולבת ממכונת aarch64. את המודול יש לבנות מול הענף המוטבע של קרנל בגרסה 3.8.13: נדרשו טלאים כדי לעבור הידור ב-GCC מודרני, וכן הידור קרנל מלא ולא רק make modules_prepare, משום שגרסאות מודולים דורשות את קובץ Module.symvers, שבלעדיו insmod דוחה את המודול.

איתור תקלות בעיוורון וצמצום התמונה

אימות ההעברה היה מסובך. יציאת ה-HDMI אינה עובדת עם הקרנל החדש, והמחבר בחר שלא לפתוח את המכשיר כדי להגיע ל-UART, ולכן בדק תחילה עם initramfs מינימלי מבוסס BusyBox שכתב קובץ סימון לדיסק ואז אתחל מחדש כאות להצלחה. בהמשך עבר ל-initrd של NixOS עם רשת פעילה ומעטפת הפוכה דרך Netcat. שני פרטים היו קריטיים: היה צריך להוסיף את reset_berlin למודולים הזמינים של ה-initrd כדי לקרוא מהדיסק החיצוני, ולהשתמש ב-initrd הישן שאינו מבוסס systemd. לאחר האתחול התמונה עדיין שקלה 2.3 ג'יגה-בייט, ולכן הסיר תיעוד, גופנים, שירותי XDG, את Nix עצמו ואת כל קושחות החומרה מחבילת linux-firmware בגודל 1.8 ג'יגה-בייט פרט לאחת, וסיים בתמונה של 1.2 ג'יגה-בייט שהוא מכנה טובה מספיק. בסוף הוא מציין שמישהו אחר הגיע לאחרונה לקונפיגורציית NixOS שאתחולה בשיטת vibe coding, אבל היא מתנהלת לא נכון עם אתחולים מחדש ונשענת על בלובינים מיותרים. קוד ה-flake והמודול פורסמו יחד עם הפוסט.

SSiTech

SiTech — פיתוח אתרים בכוח ה-AI

אנחנו בונים אתרים מהירים ומודרניים ומשלבים AI בתהליכי עבודה אמיתיים. יש לכם פרויקט או שאלה? נשמח לעזור.