NixOS'ta Şifreli Swap Çilesi: 90 Saniyelik Boot Gecikmesi ve Zram Çözümü

NixOS mimarisini güncellerken bazen en küçük güvenlik dokunuşları bile boot sürecini felç edebilir. Son yaptığım değişikliklerde, disk üzerindeki fiziksel swap (takas) alanını şifrelemek amacıyla randomEncryption.enable = true parametresini aktif etmiştim. Teorik olarak her boot’ta rastgele anahtarla şifrelenen güvenli bir swap alanı elde edecektim.

Fakat pratikte işler planlandığı gibi gitmedi. Sistem boot edilirken ekran bir anda donuyor ve dev-mapper servisinin zaman aşımına uğramasını beklemeye başlıyordu.

Hatanın Anatomisi: 90 Saniyelik Devmapper Blokajı

Sistemin açılışındaki bu gizemli yavaşlamayı analiz etmek için systemd-analyze araçlarını çalıştırdım:

systemd-analyze blame | head -5
systemd-analyze critical-chain

Çıkan tablo korkunçtu: graphical.target hedefine ulaşılması tam 1 dakika 33 saniye sürüyordu. journalctl loglarını incelediğimde ise suçlu hemen kendini belli etti:

Timed out waiting for device /dev/mapper/dev-disk-byx2dpartuuid-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Sorun Neydi?

NixOS, hardware.nix içinde tanımladığım /dev/disk/by-partuuid/... adresindeki fiziksel swap alanını (nvme0n1pX) dm-crypt ile şifreli olarak açmaya çalışıyordu. Ancak erken boot (initrd) aşamasında cryptsetup veya aygıt zamanlaması (device timing) uyuşmazlığı nedeniyle bu cihaz hazır hale gelemiyor, systemd ise cihazı mount edebilmek için varsayılan 90 saniyelik zaman aşımı (timeout) süresi boyunca tüm boot sürecini askıya alıyordu.

90 saniye bittiğinde systemd cihazı mount etmekten vazgeçiyor, boot tamamlanıyor ancak masaüstüne ulaşmamız işkenceye dönüşüyordu.

Fiziksel Swap vs. Zram: LLM ve Ollama Perspektifi

Sistemimde 32 GB fiziksel RAM bulunuyor. Bu donanım seviyesinde, özellikle yerel yapay zeka modelleri (Ollama / local LLM) koştururken swap ihtiyacını nasıl yönetmeliydim?

NixOS konfigürasyonumda zaten zram aktifti:

# system.nix içinde zram yapılandırması
zramSwap = {
  enable = true;
  algorithm = "zstd";
  memoryPercent = 100; # RAM boyutuna yakın sanal sıkıştırılmış alan
};

Bu yapılandırma, RAM’in bir kısmını zstd algoritmasıyla sıkıştırarak sanal bir takas (swap) alanı oluşturuyor.

Ollama Performansına Etkisi

Ollama gibi yerel LLM araçları, modelleri öncelikle GPU’nun VRAM’ine yükler. Model katmanları (layer’lar) VRAM kapasitesine göre bölünerek RAM’e offload edilir.

Bu senaryoda disk üzerindeki 32 GB’lık fiziksel swap alanı hem boşa yer kaplıyor, hem boot’u 90 saniye geciktiriyor, hem de aktif olduğunda performansı baltalıyordu.

Çözüm: Fiziksel Swap’a Veda

Çözüm son derece basitti: Zram zaten tüm swap görevini üstlendiği için bozuk ve yavaş olan fiziksel swap alanını tamamen devre dışı bırakmak.

hosts/nixos/hardware.nix dosyasındaki şifreli swap tanımını iptal ettim:

# hardware.nix
# Eski şifreli fiziksel swap kaldırıldı, zram yeterli.
swapDevices = [];

Değişikliği sisteme uyguladıktan sonra:

just sync "fix(boot): fiziksel swap kaldirildi — randomEncryption 90s timeout sorunu cozuldu, zram yeterli"
just rebuild

Sonuç

Sistem yeniden başlatıldığında 90 saniyelik devmapper bekleme süresi tamamen ortadan kalktı. Sistem zram sayesinde kararlılığından hiçbir şey kaybetmeden, saniyeler içinde doğrudan masaüstüne ulaşabilir hale geldi.

Bazen en iyi optimizasyon, sisteme yeni bir şey eklemek değil, artık gereksizleşen eski yükleri deklaratif olarak söküp atmaktır.


Kaynaklar


İlgili:

EOF.