NixOS 26.05: systemd-initrd Devrimi ve Impermanence Çatışması
NixOS 26.05 “Yarara” sürümüyle birlikte kaputun altındaki en büyük değişiklik nihayet varsayılan oldu: Eski bash betikli Stage 1 boot süreci yerini systemd-initrd’ye bıraktı.
Kağıt üzerinde bu harika bir haber. Binlerce satırlık spagetti shell script’leri yerine, paralel çalışan, hata ayıklaması kolay ve standart bir systemd boot süreci… Ancak sistemi, özellikle de impermanence (ephemeral root) mimarisiyle sıfırdan kuranlar veya upgrade edenler için bu yeni yapı gerçek bir sürtünme noktası yaratabiliyor.
Sıfır bir 26.05 ISO’su ile impermanence kurulumunu ilk kez yaparken bu katı kurallara baştan dikkat etmek şart.
Sorun: systemd-initrd’nin Katılığı
Eski scripted-initrd oldukça affediciydi. Mount işlemlerini sırayla yapar, tmpfs’i bir şekilde root’a bağlar ve /persist üzerinden Btrfs subvolume’larını devreye alırken ufak tefek eksik konfigürasyonları tolere edebilirdi.
Ancak systemd-initrd tamamen unit (birim) tabanlı ve katı kurallarla çalışıyor. Root dosya sistemini (/) pivot etmeden önce her şeyin sistemin beklediği gibi tanımlanmış olması gerekiyor.
Eğer benim gibi / (root) dizinini tmpfs olarak ayarladıysanız ve sistem verilerinizi /persist Btrfs subvolume’u üzerinden bind-mount ediyorsanız, boot sürecinde systemd neyin ne zaman mount edileceğine dair net direktifler bekliyor. Eksik tanımlarda karşılaştığınız tek şey karanlık bir ekranda beliren Kernel Panic ve Failed to mount /sysroot hatası oluyor.
Çözüm: fileSystems.”/” Tanımını Explicit (Açık) Tutmak
Bu sürtünmeyi aşmanın yolu, konfigürasyonda fileSystems."/" tanımını systemd’nin anlayacağı şekilde son derece spesifik ve açık (explicit) hale getirmekten geçiyor.
boot.initrd.systemd.enable = true; yaptıktan sonra hardware.nix veya disks.nix dosyanızdaki root tanımı şuna benzemeli:
fileSystems."/" = {
device = "none";
fsType = "tmpfs";
options = [ "defaults" "size=8G" "mode=755" ];
# systemd-initrd için kritik nokta:
neededForBoot = true;
};
Normalde tmpfs olan bir root için neededForBoot = true parametresine ihtiyaç duymayacağınızı düşünebilirsiniz. Ne de olsa o bir disk değil, sadece RAM’de açılan bir boşluk. Ancak systemd-initrd, ana sisteme geçiş (pivot_root) yapmadan önce /sysroot hedefini kesin olarak hazırlamak zorunda. Bu flag, systemd’ye “Evet, bu tmpfs bölümünü Stage 1’de oluşturmak zorundasın” emrini veriyor.
Aynı şekilde, kalıcı verilerinizi tutan /persist (veya /nix) Btrfs subvolume’larının da aynı şarta sahip olduğundan emin olmalısınız:
fileSystems."/persist" = {
device = "/dev/disk/by-label/NIXOS";
fsType = "btrfs";
options = [ "subvol=@persist" "compress=zstd" "noatime" ];
neededForBoot = true;
};
Sonuç: Teknik Borçtan Kurtuluş
İlk kurulum aşamasında neededForBoot = true mantığını kavramak ve konfigürasyonu buna göre şekillendirmek süreci biraz uzatsa da sonuç kesinlikle buna değdi.
Geçiş tamamlandığında fark ettiğim ilk şey, boot loglarının çok daha temiz okunabilir olması ve paralel servis başlatma sayesinde açılış süresinin (boot time) ölçülebilir oranda hızlanmasıydı. NixOS, yılların teknik borcu olan o karmaşık shell script’lerinden kurtularak modern bir temele oturdu.
Eğer siz de impermanence kurulumunuzu NixOS 26.05’e geçiriyorsanız, systemd-initrd’den korkmayın. Sadece ona ne yapması gerektiğini tam olarak (explicit) söyleyin.