· kaynak dev.to (home feed)
systemd, yeni bileşenler için Rust desteğini birleştirdi — Cargo yok, no_std, yalnızca C linkage
systemd, yeni yaprak (leaf) bileşenlerinin Cargo, harici crate'ler veya standart kütüphane olmadan Rust'ta yazılabilmesini sağlayan Rust altyapısını birleştirdi — Linux kernel'in dile yaklaşımını yansıtan bir karar.

Ne birleştirildi
Çoğu Linux dağıtımının kalbinde yer alan init ve servis yöneticisi systemd, artık Rust ile yazılmış bileşenleri barındırabiliyor. dev.to'da yeniden yayımlanan bir Joho no Todai haberine göre, Linux kernel'inin VFS alt sistemini de yöneten systemd geliştiricilerinden Christian Brauner, #44324 numaralı pull request'i systemd'nin Git deposuna birleştirdi. Değişiklik 54 dosyaya yayılıyor ve 5.144 satır ekliyor.
Pull request, daha önceki bir RFC'yi yeniden işliyor ve systemd geliştiricilerinin Berlin'deki bir hackfest'te üzerinde anlaştıkları kuralları uyguluyor. Lennart Poettering'in talebiyle çalışma dört pull request'e bölündü; şu anda main dalında bulunan, dördünün ikincisi, doğrudan Rust altyapısını kapsıyor.
Koşullar bilinçli olarak dar tutulmuş. Rust yalnızca yeni yaprak (leaf) bileşenleri — yığının kenarındaki, başka hiçbir şeyin bağımlı olmadığı programlar — için kullanılabilecek ve mevcut C kodunu taşıma planı yok. Cargo yerine derleme sistemi olarak Meson yerinde kalıyor, harici crate'ler kullanılmıyor ve Rust kodu dilin standart kütüphanesi olmadan çalışıyor. Yalnızca C linkage'a izin veriliyor; bu da libsystemd-shared'ı ve onun dlopen mekanizmasını koruyor.
Rust'ın derlenip derlenmeyeceği Meson'un -Drust= seçeneğiyle belirleniyor ve varsayılanı auto: uygun bir toolchain bulunduğunda destek açılıyor, aksi halde systemd saf bir C projesi olarak derlenmeye devam ediyor.
Standart olan değil, özel bir allocator
systemd no_std'un da ötesine geçiyor ve alloc crate'ini bile atlıyor. Vec ve Box gibi Rust'ın standart koleksiyonları, bir bellek ayırma başarısız olduğunda süreci sonlandırıyor; önyükleme sırasında çalışan yazılımda buna tahammül edilemez. systemd bu yüzden, işlemi durdurmak yerine hata döndüren kendi Box ve Vec implementasyonunu yazıyor. Pull request açıklamasında Brauner, bunun Linux kernel'inin izlediği yaklaşımla aynı olduğunu söylüyor.
Bir başka karar, köklü bir C geleneğini tip sistemine taşıyor. Özel anahtarlar gibi hassas verilerle çalışırken C kodu, belleği serbest bırakmadan önce erase_and_free() çağırmayı hatırlamak zorundaydı; bunun atlanması gizli bilgileri serbest bırakılmış bellekte bırakıyordu. systemd'nin Rust tarafı, silme işleminin deallocation'da allocator davranışına gömülüp çağıranın hafızasına bırakılmadığı bir Vec<u8, Erasing> türü sunuyor.
Bayt bayt CLI uyumu
Rust ile yazılan programların dışarıdan C karşılıklarından ayırt edilememesi hedefleniyor. test-cli-parity.sh adlı bir test betiği, --help çıktısının, seçenek ayrıştırmasının ve --introspect-cli yanıtlarının C sürümleriyle bayt bayt eşleştiğini doğruluyor. libsystemd-shared'a bağlantılar, derleme sırasında bindgen ile, kütüphaneyle aynı başlık dosyaları ve bayraklar kullanılarak üretiliyor. Boyut cezası şimdilik mütevazı görünüyor: LTO ile derlenip strip edilmiş test programları Rust'ta 32KB, C'de ise 20KB çıktı.
Dağıtımlar karar vermek zorunda
Destek, rustc 1.85 veya daha yenisini, bindgen 0.71.1 veya daha yenisini ve Meson 1.4.0 veya daha yenisini gerektiriyor — bu sürümleri Debian 13 (Trixie) zaten sunuyor. Arch ve openSUSE'nin OBS'i ise systemd'yi rustc ve bindgen'i derleme bağımlılığı olarak bildirmeden --auto-features=enabled ile derliyor; bu yüzden mevcut yapılandırmayla derlemeleri başarısız oluyor. Bu dağıtımlar ya bu bağımlılıkları eklemek ya da -Drust=disabled'ı açıkça belirtmek zorunda.
Şu ana kadar yalnızca altyapı yerini aldı. İlk pratik Rust programı olan systemd-keyring-setup — dm-verity, fs-verity ve BPF anahtarlıklarına X.509 sertifikalarını kaydeden bir önyükleme zamanı yardımcı aracı — hâlâ #44114 numaralı pull request'te bekliyor. Haber, bunun yakında birleştirilmesini bekliyor ve birleştirilen desteğin systemd 263'te yer alacağını söylüyor.
Neden önemli
systemd çoğu Linux dağıtımında PID 1 olarak çalışıyor; dolayısıyla dil politikası ufak bir mesele değil: her dağıtım artık systemd'yi derlemek için bir Rust toolchain sunup sunmayacağına karar vermek zorunda. Tasarım ayrıca kritik altyapıda Rust benimseme için kendine özgü bir model çiziyor — mevcut derleme sistemini koru, harici bağımlılık alma, çalışan C kodunu yeniden yazma ve başarısızlıkta iptal eden bellek ayırmayı kabul etmek yerine bellek yönetimini elle gerçekleştir. Bu felsefeyi, Rust çalışmasının — Android'in Binder sürücüsü ve NVIDIA'nın Nova sürücüsü gibi — deney aşamasından pratik kullanıma doğru ilerlediği ve Brauner'in kendisinin de geliştirme yaptığı Linux kernel ile paylaşıyor. Bir Linux önyüklemesinin iki temeli olan kernel ve systemd artık aynı temel kurallarla Rust'ı kabul ettiğine göre, çekirdek sistem yazılımında Rust'ın deneysel aşaması kapanıyor görünüyor.
- #systemd
- #rust
- #linux
- #open-source