1 puan yazan GN⁺ 4 시간 전 | 1 yorum | WhatsApp'ta paylaş
  • NixOS, yalnızca yapılandırmayla VM veya ISO oluşturmayı kolaylaştırıyor; ancak neredeyse en küçük canlı imaj bile baştan 458MiB olarak üretiliyor ve Alpine VM ISO’sunun yaklaşık 66MiB boyutuna kıyasla büyük fark gösteriyor
  • Boyutun büyük kısmını nix-store.squashfs oluşturuyordu; bunun içinde Python 3.13.13, Linux modülleri, systemd, Perl, GRUB, belgeler ve Nix ile ilgili bağımlılıklar yer alıyordu
  • nix.enable = false, documentation.enable = false, register-nix-paths kaldırma adımlarından geçilince ISO boyutu 458MiB → 384MiB → 360MiB oldu ve Boost bağımlılığı da çıktı
  • OpenSSH istemcisi, varsayılan paketler, GRUB kurulum araçları, çalışma zamanı çekirdek modülleri ve Perl tabanlı etkinleştirme yolu da kaldırılınca nihai boyut 183MiB seviyesine indi
  • Küçük deneysel önyükleme imajları için faydalı bir referans olabilir; ancak gerekli birçok özelliği çıkardığı için masaüstünde veya önemli ortamlarda olduğu gibi kullanmak zor

NixOS yapılandırmasından ISO oluşturma

  • NixOS, yapılandırma temelinde kolayca VM oluşturabiliyor
    • nixos-rebuild build-vm, mevcut sistem yapılandırmasının VM’sini üretir
    • pkgs.nixos kullanılırsa sistem yapılandırması olmasa da rastgele bir yapılandırmayla VM oluşturulabilir
  • Temel örnek, yalnızca system.stateVersion = "26.05" ve services.getty.autologinUser = "root" bırakan en minimal VM’yi oluşturuyor
  • Bu VM, thin VM olarak çalışıyor
    • Disk imajına yalnızca VM içinde doğrudan oluşturulan dosyalar giriyor
    • /nix/store ve geri kalan kısımlar ana makine işletim sisteminden mount ediliyor
  • Ana makinede Nix yoksa ya da uzak ana makinede, sıradan bir hypervisor üzerinde çalıştırılacaksa kendi kendine yeterli bir ISO gerekiyor
  • NixOS’un iso-image.nix modülü import edilirse ISO derlenebiliyor
    • image.baseName = lib.mkForce "nixos" ile çıktı ISO adını belirliyor
    • Çalıştırma örneği qemu-system-x86_64 --cdrom .../nixos.iso -m 1G --accel kvm biçiminde
    • Ortam amd64 için modern bir Linux değilse mimariyi veya hızlandırma yöntemini değiştirmek gerekebilir

Başlangıç noktası: 458MiB ISO

  • Varsayılan ISO derleme sonucu 458MiB idi
  • Bu imajda henüz vim bile yok
    • Önyüklemeden sonra vim çalıştırıldığında command not found çıkıyor
  • Karşılaştırma için verilen Alpine VM ISO’su yaklaşık 66MiB
  • Damn Small Linux, çok daha küçük boyutta tamamlanmış bir masaüstü ortamı sunmuş bir örnek olarak anılıyor
  • Amaç Damn Small Linux seviyesine ulaşmak değil, NixOS ISO’sunun ne kadar küçültülebileceğini görmek

ISO iç boyut analizi

  • ISO mount edilip du ile bakıldığında boyut şu şekilde ayrılıyordu
    • nix-store.squashfs: 416MiB
    • initrd: 26MiB
    • kernel: 13MiB
    • toplam ISO: 458MiB
  • Asıl boyut etkeni, ana kullanıcı alanı olan nix-store.squashfs idi
  • squashfs mount edildiğinde içinde Nix store’a benzeyen yollar görülüyor
    • python3-3.13.13: 128MiB
    • linux-6.18.35-modules: 144MiB
    • systemd-260.1: 60MiB
    • perl-5.42.0: 56MiB
    • grub-2.12: birkaç kalemin toplamında yaklaşık 62MiB
    • nix-manual-2.34.7, nixos-manual-html gibi belgeler de dahil
  • ISO ana makinede derlendiği için, ISO içindeki store yolları ana makinenin /nix/store dizininde de izlenebiliyor
  • nix why-depends ile bağımlılıkların kaynağı incelendi
    • Boost, Nix daemon yolu üzerinden geliyordu
    • nix-daemon.conf, nix, libnixutil.so üzerinden boost-1.89.0’a ulaşılıyordu

Nix ve belgeleri kaldırma

  • nix.enable = false ile imajdan Nix’in kendisini çıkarmaya çalışıldı
  • documentation.enable = false ile belgeler de devre dışı bırakıldı
  • İlk sonuç 458MiB → 384MiB oldu
  • Ancak Boost hâlâ kalmıştı
    • register-nix-paths.service, önyüklemede ISO store içeriğini kaydetmeye çalışıyordu
    • Bu yol yeniden Nix ve Boost’u içeri çekiyordu
  • systemd.services.register-nix-paths = lib.mkForce {} ile bu servis boşaltılıp kaldırıldı
  • Sonuçta ISO 360MiB oldu ve nix why-depends çıktısında Boost bağımlılığının kalmadığı doğrulandı

OpenSSH ve varsayılan paketleri kaldırma

  • Benzer şekilde environment.defaultPackages de boşaltılabildi
  • ssh kaldırmak daha zordu
    • modules/programs/ssh.nix, OpenSSH’yi environment.corePackages içine ekliyordu
    • Bunu kontrol edecek programs.ssh.enable gibi bir seçenek bulunamadı
    • services.openssh.enable bir istemci kaldırma seçeneği değil, sunucu ayarıydı
  • disabledModules ile programs/ssh.nix dışlanabiliyordu; ancak diğer modüller programs.ssh seçeneğinin varlığını beklediği için zincirleme hatalar oluşuyordu
  • Çözüm, programs.ssh seçeneklerini kullanmayan ayrı bir modül olarak stub seçeneği sunmaktı
    • options.programs.ssh = lib.mkOption {};
    • Ardından disabledModules = [ "programs/ssh.nix" ]; ile gerçek SSH modülü dışlandı
  • Bu süreçte şu ayarlar da birlikte uygulandı
    • documentation.man.enable = false
    • networking.firewall.enable = false
    • environment.defaultPackages = lib.mkForce []

NixOS modül yapısı notu

  • NixOS modülleri kabaca üç bölümden oluşur
    • Modül düzeyi öğeler: imports, disabledModules
    • Seçenek tanımları: options.*
    • Uygulama: config.*
  • Seçenek tanımlamayan modüller, config. öneki olmadan uygulama özelliklerini yazan kısaltılmış biçimi kullanabilir
  • Kalan yapılandırmada bu kısaltılmış biçimi korumak için programs.ssh stub seçeneği ayrı bir import modülüne ayrıldı

GRUB kurulum araçlarını kaldırma

  • Kalan büyük kalemlerden biri, yaklaşık 62MiB tutan GRUB ile ilgili dosyalardı
  • Önyükleyicinin kendisi gerekliydi; ancak tüm kurulum araçlarını dahil etmek gerekmiyordu
  • NixOS ISO preset’i hem UEFI hem BIOS sürümü GRUB’u paket halinde getiriyor
  • Bunu kapatmak için net bir seçenek olmadığı için daha sert bir yöntemle şu değerler sıfırlandı
    • system.extraDependencies = lib.mkForce []
    • environment.systemPackages = lib.mkForce config.environment.corePackages
  • environment.systemPackages tamamen boşaltılmadı
    • bash olmazsa getty sürekli crashloop’a girebileceğinden, kabuğun bir miktar çalışması için corePackages korundu

Çekirdek modüllerini kaldırma

  • linux-6.18.35-modules 144MiB idi ve toplam boyutun yaklaşık dörtte birine denk geliyordu
  • NixOS’ta çalışma zamanında kullanılacak çekirdek modüllerini sınırlamak için uygun bir hook görünmüyordu
  • Bunun yerine sistem çıktısından kernel-modules klasörü kaldırıldı
    • system.systemBuilderCommands = lib.mkAfter "rm $out/kernel-modules";
  • Bu yöntem çalışma zamanında modül yüklemeyi fiilen devre dışı bırakıyor
    • Gerekli modüllerin boot.initrd.kernelModules veya availableKernelModules içine eklenmesi gerekiyor
  • Bu değişiklikten sonra daha rahat bir ekran çözünürlüğüne geçme özelliği kaybedildi ama sistem yine de önyükleyebildi
  • ISO boyutu 197MiB seviyesine indi

Perl’i kaldırma ve deneysel alternatif özellikler

  • Hâlâ 56MiB boyutunda Perl bulunuyordu
  • nix why-depends ile bakıldığında Perl’in sistem etkinleştirme sırasında kullanıcıları ve /etc içeriğini oluşturmak için kullanıldığı görüldü
  • Kullanıcı yönetimi ve /etc yapılandırması tamamen terk edilemedi
  • Bunun yerine mevcut yol deneysel özelliklerle değiştirildi
    • /etc yönetiminde overlay yöntemi kullanıldı
    • Kullanıcı yönetiminde yerel userborn kullanıldı
  • Uygulanan ayarlar şunlardı
    • system.etc.overlay.enable = true
    • system.etc.overlay.mutable = false
    • services.userborn.enable = true
  • Nihai ISO boyutu 183MiB oldu

Son durum ve sınırlamalar

  • Başlangıçtaki 458MiB boyuttan nihai 183MiB boyuta inildi; yani neredeyse özgün boyutun üçte biri seviyesine düşüldü
  • Yine de sonuç “iyi” olarak görülmüyor
  • Gerçekten kullanılacak bir masaüstü ya da kritik ortam için uygun değil
    • Kaldırılan özelliklerin hepsinin bir varlık nedeni var
  • Küçük deneysel önyükleme imajına ihtiyaç duyuluyorsa ve yalnızca çok küçük işler yapılacaksa faydalı olabilir
  • Nihai yapılandırmayı doğrudan kopyalayıp kullanmak, amaç için gerekli bazı işlevlerin eksik kalmasına yol açabilir

Daha da küçültme payı

  • Bu çalışmada, “basitçe kaldırılabilen” ya da nispeten açık alternatifleri olan öğelere odaklanıldı
  • Daha derin çalışma gerektiren alanlar hâlâ var
    • Şu anda hem systemdMinimal hem systemd birlikte paketleniyor
    • Bunlardan birini kaldırmaya çalışınca başka derleme yolları bozuldu
  • Daha küçük kalemler de ayrıca temizlenebilir ve toplamda anlamlı bir boyut tasarrufu sağlayabilir
  • Ek optimizasyon için daha fazla araştırma ve deney gerekiyor

1 yorum

 
GN⁺ 4 시간 전
Lobste.rs görüşleri
  • Tam bu amaç için yapılmış bir modül var. Epey derleme gerektiriyor ama tüm NixOS kullanıcı alanını içeren tamamen bağımsız bir initrd’yi zstd sıkıştırmayla yaklaşık 80MiB boyutunda üretebiliyor
    Bu çalışma yalnızca bağımsız initrd ile sınırlı değil; herhangi bir NixOS’un boyutunu küçültmek için de kullanılabilir
    Kurulum ISO’suna da muhtemelen uygulanabilir gibi görünüyor
    https://github.com/wucke13/minimal-nixos/

  • TinyCore Linux’un temel sistemi 17MB boyutundaki Core
    X ve FLTK/FLWM de istenirse 23MB boyutundaki TinyCore var; daha fazla pencere yöneticisi ve uygulama istenirse 248MB boyutundaki CorePlus bulunuyor
    http://www.tinycorelinux.net/downloads.html

    • Bunun deklaratif yapılandırma ya da yeniden üretilebilir VM’lerle ne ilgisi olduğunu bilmiyorum
  • NixCon’da NixOS’un Yocto alternatifi olarak küçültülmesini anlatan şu sunumu tavsiye ederim: https://youtu.be/AsXY61laNb8
    Beklediğim kadar ayrıntılı değildi ama konferansta Óli ve Matthew’dan bizzat duyduklarım gerçekten etkileyiciydi. Acaba bununla ilgili bir yazılı özet var mı diye merak ediyorum

  • NixOS’ta küçük bir kurulum alanı oluşturmak her zaman biraz sinir bozucu
    SSH tarafındaki boyut şu ayarlarla azaltılabilir gibi görünüyor

    programs.ssh.setXAuthLocation = false;  
    security.pam.services.su.forwardXAuth = lib.mkForce false;  
    fonts.fontconfig.enable = false;  
    

    "${nixpkgs}/nixos/modules/profiles/minimal.nix" da içe aktarılabilir. Yazıdaki optimizasyonların bir kısmı orada zaten var

    • Orijinal yazıyı yazdıran kullanım senaryosunda aslında ssh’in kendisine neredeyse hiç ihtiyaç yoktu
      Yine de çoğu durumda bu yaklaşım muhtemelen daha mantıklı olur
      "${nixpkgs}/nixos/modules/profiles/minimal.nix" dosyasına daha önce bakmıştım ve beklediğim kadar iyi olmadığını düşündüğüm için araştırmaya başlarken onu dahil etmeyi akıl etmedim. Sonradan aklıma geldiğinde ise işin zaten yarısına gelmiştim; aslında en başta yer alması gereken bir şeyi sonradan araya sıkıştırmak biraz dürüstçe gelmedi
  • Bu aralar Perl’ün modern sistemlere çok sık dahil edilmesi garip geliyor. Küçük ISO’da da Perl var; sıfırdan düzgün bir şey derlemeye çalışınca bile zincir openssl -> Perl’e gidiyor

  • Okumadan önce bile bunun, birinin C’de yeniden yazmadığı aptal bir Perl betiği yüzünden olacağını tahmin etmiştim
    Düzeltme: tahminim doğru çıktı

  • NixOS, 26.05 sürümünden itibaren varsayılan initrd’de systemd kullanıyor. Çünkü modern bir işletim sisteminin desteklemesi gereken pek çok initrd kullanım senaryosu var
    systemdMinimal, daha az bayrak ve bağımlılıkla derlenmiş bir systemd ikilisi; bu da initrd’yi daha küçük tutmaya yardımcı oluyor
    Ancak hedef minimum ISO ise, ikisinin de aynı ikiliye bağımlı olmasını sağlamak da mümkün gibi görünüyor