
Steam Link'te NixOS: elle derlenen kexec modülü Valve'ın imzalı çekirdek kilidini aşıyor
George Huebner 2018'de indirimde aldığı Steam Link'i sürekli açık bir ARM sunucusuna çevirdi. Cihaz yalnızca Valve imzalı çekirdekleri önyüklediği için eksik kexec sistem çağrısını ekleyen minimal bir modül derledi ve önyüklemeyi küçültülmüş NixOS imajına devretti.
George Huebner dolabında 2018'de indirimde aldığı ve yıllar sonra hâlâ sorunsuz çalışan bir Steam Link buldu. Ethernet, Wi-Fi, Bluetooth ve birkaç USB portu olan küçük ARM cihazın sürekli açık, düşük güç tüketimli bir makine olarak işe yarayacağını düşündü. 26 Eylül 2026'da yayımladığı yazıda NixOS'u cihazda nasıl çalıştırdığını ve bunu mümkün kılan çekirdek modülü hilesini anlatıyor.
Zor kısmı zaten fijam adlı bir geliştirici çözmüştü; yazar onun notlarına atıf yapıyor. Başlıca engel şu: cihazın önyükleyicisi yalnızca Valve'ın imzaladığı çekirdekleri açıyor, dolayısıyla özel bir çekirdek doğrudan başlatılamıyor. Çözüm, önce Valve'ın onayladığı çekirdeğe önyüklemek ve ardından kexec ile yeni çekirdeğe geçmek.
Bir sistem çağrısının modül olarak yeniden inşası
Burada ikinci duvar çıkıyor: Valve'ın gönderdiği çekirdek CONFIG_KEXEC etkin olmadan derlenmiş, yani kexec sistem çağrısı sistemde hiç yok. Yazar ilgili kexec kaynak dosyalarını minimal bir çekirdek modülünde birleştirip kexec_load.ko adını verdiği modülü üretti; modül, çalışan sisteme eksik sistem çağrısını ekliyor. Aynı yöntem başka dağıtımlar için de kullanılmış, ancak çoğu kişi fijam'ın sitesindeki hazır modülü indirmekle yetinmiş. Huebner internete çekirdek modülü yüklemeye çekindiği için kendisi derledi.
13 yıllık çekirdeğe çapraz derleme
NixOS kullanıcı alanını, çekirdeği ve initrd'yi derlemek basit: lib.nixosSystem'a doğru system ve crossSystem değerlerini vermek yeterli. Mimari seçimi daha çetrefilliydi. Valve'ın araç zinciri armv7a hedefliyor, ancak karşılık gelen crossSystem ayarı armv7a-unknown-linux-gnueabihf, Nix'in Go derleme altyapısıyla kötü geçiniyor, bu yüzden yazar armv7l'yi seçti ve aarch64 makineden çapraz derledi. Modülün kendisi Valve'ın 3.8.13 sürümlü, 13 yıllık gömülü çekirdek çatalına karşı derlenmeli: modern GCC ile derlenebilmesi için yamalar ve yalnızca make modules_prepare değil tam bir çekirdek derlemesi gerekti, çünkü modül sürümlemesi Module.symvers dosyasını istiyor ve o olmadan insmod modülü reddediyor.
Kör uçuş ve imajın küçültülmesi
Devir teslimi doğrulamak zordu: yeni çekirdekte HDMI çalışmıyor, yazar da UART için cihazı açmadı. Önce diske işaret dosyası yazıp yeniden başlayarak başarıyı bildiren BusyBox tabanlı minimal bir initramfs denedi, ardından ağı etkin NixOS initrd'sine ve dizüstü bilgisayarına Netcat üzerinden ters kabuğa geçti. İki ayrıntı kritikti: USB sürücüden okuma için reset_berlin initrd'nin kullanılabilir modüllerine eklenmeliydi ve systemd tabanlı olmayan eski initrd kullanılmalıydı. Önyükleme çalıştığında imaj hâlâ 2,3 GB'tı; yazar belgeleri, yazı tiplerini, XDG servislerini, Nix'i ve 1,8 GB'lık linux-firmware paketindeki bellenim bloblarını biri hariç çıkarıp 1,2 GB'ta durdu ve sonucu yeterince iyi saydı. Yazının sonunda bir başkasının yakın zamanda vibe coding ile önyüklenebilir bir NixOS yapılandırmasına ulaştığını, ancak o yapılandırmanın yeniden başlatmaları yanlış yönettiğini ve gereksiz ikili bloblar kullandığını belirtiyor. Flake ve modül kaynak kodu yazıyla birlikte yayımlandı.
SiTech — AI destekli web geliştirme
Hızlı ve modern web siteleri kuruyor, AI'yı gerçek iş akışlarına taşıyoruz. Projeniz veya sorunuz mu var? Yardımcı olmaktan mutluluk duyarız.