İlk yazımızda bahsettiğim Nix_gernerator aracından tekrar bahsederek konuya girmek istiyorum.
- NixOS: İşletim Sistemlerine Fonksiyonel Yaklaşım
- Nix Dili ve Özellikleri
- Nix Dili ile ilgili Alıştırmalar
- Nix Dilinde Builtins Fonksiyonlar
- Nix Paket Yöneticisi
- Nix Paket Yöneticisi Shell, Profile Kavram ve Komutları
- Nix Flake Nedir?
- Birden Çok Paketi Aynı Repo Üzeriden Yayınlamak
- Override ve Overlay Kavramları
- Nix Paket Yöneticisi ile Developer ve Profile Ortamları Oluşturmak
- Nix ile NixOs Konfigürasyonu
- NixOs Module ve Option Kullanımı
- NixOs Kurulumu ve Konfigürasyonu
- NixOs'u Cloud ve Uzak Ortamlara Deploy Etmek
Tek bir konfigürasyonu kullanarak nix-generator aracı ile alttaki bütün ortamlara çıktı üretebilirsiniz.
format | description |
---|---|
amazon | Amazon EC2 image |
azure | Microsoft azure image (Generation 1 / VHD) |
cloudstack | qcow2 image for cloudstack |
do | Digital Ocean image |
docker | Docker image (uses systemd to run, probably only works in podman) |
gce | Google Compute image |
hyperv | Hyper-V Image (Generation 2 / VHDX) |
install-iso | Installer ISO |
install-iso-hyperv | Installer ISO with enabled hyper-v support |
iso | ISO |
kexec | kexec tarball (extract to / and run /kexec_nixos) |
kexec-bundle | same as before, but it's just an executable |
kubevirt | KubeVirt image |
linode | Linode image |
lxc | create a tarball which is importable as an lxc container, use together with lxc-metadata |
lxc-metadata | the necessary metadata for the lxc image to start, usage: lxc image import $(nixos-generate -f lxc-metadata) $(nixos-generate -f lxc) |
openstack | qcow2 image for openstack |
proxmox | VMA file for proxmox |
proxmox-lxc | LXC template for proxmox |
qcow | qcow2 image |
raw | raw image with bios/mbr. for physical hardware, see the 'raw and raw-efi' section |
raw-efi | raw image with efi support. for physical hardware, see the 'raw and raw-efi' section |
sd-aarch64 | Like sd-aarch64-installer, but does not use default installer image config. |
sd-aarch64-installer | create an installer sd card for aarch64. For cross compiling use --system aarch64-linux and read the cross-compile section. |
vagrant-virtualbox | VirtualBox image for Vagrant |
virtualbox | virtualbox VM |
vm | only used as a qemu-kvm runner |
vm-bootloader | same as vm, but uses a real bootloader instead of netbooting |
vm-nogui | same as vm, but without a GUI |
vmware | VMWare image (VMDK) |
Sayfasında detaylarına bakabilirsiniz. Uygulama olarak Nix paket yöneticisi ile kurulum yapıp kullanılabiliyor veya flake dosyasına konfigürasyon olarak da girilebiliyor. Yani illa Nixos sahibi olmak zorunda değiliz. Yani örneğin bir Ubuntu üzerinde Nix paket yöneticisini kurup bu aracı kullanabiliriz.
Elimizdeki Konfigürasyon üzerinden bu aracı kullanarak ISO, Docker Image ve VM oluşturmak çok vakit alcaktır. Bu nedenle Github sayfamda önceki yazılarımızda kullandığımız repo'da ilk oluşturduğumuz base konfigürasyonu kullanarak uygulamaları yapacağız.
Bunun için alttaki komutla base brach'i klonlayalım.
git clone -b base https://github.com/muratcabuk/nixos-sample-dotfiles.git
ISO Oluşturmak
Configuration.nix
dosyasındaboot.loader.grub.enable = true;
satırınıboot.loader.grub.enable = pkgs.lib.mkForce true;
olarak değiştiriyoruz.Configuration.nix
dosyasındanetworking.networkmanager.enable = true;
satırınınetworking.networkmanager.enable = false;
olarak değiştiriyoruz.- Daha sonra
nix profile install github:nix-community/nixos-generators
komutuyla kurulumu yapıyoruz. Son olaraknixos-generate -f install-iso -c configuration.nix
komutu ile ISO dosyamızı oluşturuyoruz.
Bu biraz vakit alcaktır. İşlem bittiğinde /nix/store/4sqxkbx1im3wsrdfrzxcyklkaynq3mpy-nixos-23.11pre536306.12bdeb01ff9e-x86_64-linux.iso/iso/nixos-23.11pre536306.12bdeb01ff9e-x86_64-linux.iso
adresine benzer şekilde ISO dosyasının adresini görebilirsiniz.
Ddocker Image Oluşturmak
Mesela docker image oluşturmak için nixos-generate -f docker -c configuration.nix
komutunu kullanmak yeterli olacaktır.
komutu çalıştırdığınızda /nix/store/5bmzn6rrjqjb3j1vn7h09vplfjn960r2-tarball/tarball/nixos-system-x86_64-linux.tar.xz
adresine benzer şekilde docker image dosyasının adresini görebilirsiniz. Bu paketi load etmek için alttaki komutu çalıştırabilirsiniz.
docker import /nix/store/5bmzn6rrjqjb3j1vn7h09vplfjn960r2-tarball/tarball/nixos-system-x86_64-linux.tar.xz
sha256:31f06f10c13b90698c2764c16f0b2a9c50d52113f3b8ddf9771c3c4c1070dcfe
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 31f06f10c13b 8 seconds ago 1.07GB
<none> <none> 925f5d1664a6 4 days ago 1.11GB
<none> <none> bb873de60531 4 days ago 3.02GB
<none> <none> 1b6b71ea5c5c 4 days ago 966MB
-
Docker için doğrudan Nix paket yöneticisinde de bir çok paket var. Kendi resmi developer sayfasında da konu ilgili bir başlık var.
-
Nix paket yöneticisi içinde de docker ile ilgili bir çok örnek bulabilirsiniz. Örneğin şu sayfada aklınıza gelebilecek hemen hemen bir çok örnek var.
-
Bir de şu harika örneği inceleyebilirsiniz. Baştan sona bir uygulamanın dev ortamının ve paketin oluşturulması ve uygulamanın docker image'ı haline getirilmesi sürecinin tamamını Nix ile anlatıyor.
-
Nixpkgs içinde Docker image'larını oluştururken çok daha detaylı çalışabileceğiniz dockerTools adında ir paket bulunuyor. Buna da bakmanızı tavsiye ederim.
-
Diğer bir araç da Arion. Bu aracı daha doğrusu paketi kullanarak Docker Compose'daki gibi aynı anda bir den fazla uygulamayı hem container yapabilir hem de çalıştırabilirsiniz.
VM Oluşturmak
Virtualbox virtual Machine oluşturmak için öncelikle configuration.nix
dosyasındaki disk bilgisini açıklama satırına alarak devre dışı bırakıyoruz.
# fileSystems."/" =
# { device = "/dev/disk/by-uuid/5b06bc26-f363-4810-bc0d-a44a9c7cdc12";
# fsType = "ext4";
# };
Daha sonra nixos-generate -f virtualbox -c configuration.nix
komutunu kullanarak VirtualBox için sanal bir makine oluşturmuş olacağız.
İşlem bittiğinde /nix/store/7qy9wvm93p4ycwq2rxf6184xj8bna32c-nixos-ova-23.11pre536306.12bdeb01ff9e-x86_64-linux/nixos-23.11pre536306.12bdeb01ff9e-x86_64-linux.ova
şeklinde bir dizinde VirtualBox image'ımızın oluştuğunu görebiliriz.
Burada karşımıza alttaki araçlar çıkıyor. Bir iki araç daha var ama ya geliştirmeleri durmuş ya da çok popüler değil o yüzden listeye eklemedim.
-
Nixos Everywhere: Yıldız Sayısı 950. Temel amacı SSH ile bağlanılabilen bir sisteme elinizdeki Flake ile kurulum yapmak. Nix Everywhere'de cloud kısmı yok ancak Disco eklentisi sayesinde disk formatlama ve biçimlendirme işlerini de yapabiliyor.
- Detaylar için resmi dokümanına bakabilirsiniz.
- Yetenekleri
- Disk formatlama ve bölümlendirme
- Nixos'un kurulumu ve konfigürasyonu
- Uygulama kurabilir
- Ayrıca ekstra dosya konulacaksa onları ekleyebilir
- Nasıl Çalışır?
- SSH ile bağlanılabiliyor olması lazım.
- SSh ile ayarları sayfasında bulabilirsiniz.
- Karşı makinede Nixos kurulu olmalı yada installer çalışıyor olmalı. Eğer o yoksa kexec ile makine boot edilmiş olmalı.
- şu komutla sisteme kurulum yapılır
nix run github:nix-community/nixos-anywhere -- --flake '.#myconfig' nixos@remote-host-ip-address
-
deploy-rs: Yıldız Sayısı (1100)
- Yetenekleri
- Birden fazla profili deploy edebiliyor
- Rust diliyle yazılmış çok hızlı bir araç
- Kurulum işlemleri ters giderse sistemi temiz bir şekilde rollback yapabiliyor.
- Temel amacı bir flake üzerideki profili alıp tanımlanan makine (node) üzerine kurmaktır.
- Blok sitesinden baştan sona bir örnek. Diğer bir örnek Github sayfasındaki tam sistem kurulumu gösteren örnek.
- Nasıl Çalışır
- Flake içinde node (makine) tanımı yapılır (ip, ssh port, kullanıcı adı, parola, ssh key, vb.)
- daha sonra deploy-rs cli kullanılarak
deploy-rs --flake ./flake.nix --profile defaultPackage --node myNode1 --node myNode2
komutu ile kurulum yapılır.
- colmena: Yıldız sayısı 930. Rust diliyle yazılmış diğer bir deployment aracı.
- Yetenekleri
- Node'lara tag vererek gruplandırmak mümkün.
- Nixops network konfigurayonu ile uyumlu değişiklik yapmadan kullanılabilir.
- Local makine deployment'ı da yapabiliyor.
- Paralel deployment yapabiliyor. Zaten Rust ile yazılı olduğu için de hızlı.
- Cloud deployment yeteneği yok. Sadece local ve uzak makinelere kurulum yapabiliyor.
- Kullanımı Nixops'a çok benziyor. YAni bir flake deployment'ı yok daha çok sunucu kurulumlar için uygun görünüyor.
- Yetenekleri
- Yetenekleri
-
Morph: Yıldız Sayısı 700
- Temel amacı birden fazla host üzerinde Nixos'u yönetmek. Kurulum yapıp health check yapabiliyor.
- Daha önce Ansible, Chef veya Puppet gibi araçlar kullandıysanız tam olarak onların yaptığı için Nixos ve Nix paket yöneticisini kullanarak yapıyor.
- Çok basit bir kullanımı var. Bir nix dosyasına makinelerin bilgilerini yazdıktan morph komutu ile elinizdeki konfigürasyonu toplu halde makinelerinize uygulayabiliyorsunuz.
-
Nixops: Yıldız Sayısı 1700. Araçlardan en dikkat çekeni Nixops. Temelde Nixops bir flake'i alıp onu belirtilen makineye kurmaya odaklanmıyor. Bunu Nix Everywhere veya Deploy-rs ile yapabiliriz. Nixops amacı çok farklı ortamlardaki makinelere bağlanmak ve onlara Nixops konfigürasyonunda belirttiğimiz paketleri ve uygulamaları kurmaktır. Toplu halde paket kurmak, toplu halde sistemleri destroy etmek gibi işlemleri yapabilir. Yani daha çok sunucu işlemleri ve konfigürasyonu için kullanılır.
-
Nixops'un yeni versiyonu Nixops 2.0'da bazı değişikliliklere gidilmiş. Yeni versiyonla ilgili olarak da elimizdeki tek kaynak da resmi dokümanlar. Ancak bu versiyondaki bazı yapısal problemlerden dolayı da Rust diliyle yeniden yazmaya karar verilmiş. Bu yeni versiyonu da tamamen yeni bir Github hesabından devam ettiriyorlar. Şu linkten takip edebilirsiniz. Mevzu halen şu issue'da tartışılıyor.
-
Elimizdeki çalışan en temiz versiyon olarak 1.7'nin resmi dokümanlarına da şu linkten erişebilirsiniz.
-
Konu ile ilgili Türkçe olarak bulabileceğiniz belki tek içerik şu Youtube videosu olacaktır. Bunu da izlemenizi tavsiye ederim. Çünkü videonun yarısında Nix paket yöneticisi ve Nixos hakkında çok güzel bilgiler veriliyor.
-
Baştan sona tüm detaylarıyla Nixops'un anlatıldığı bir makale.
-
Yetenekleri
- Local veya uzak makinelere kurulum yapabilirsiniz.
- Hetzner fiziksel makinelere kurulum yapabilirsiniz.
- Libvirt (Qemu) üzerinde VM oluşturabilirsiniz.
- VirtualBox üzerinde çalışan bir Nixos üzerinde kurulum ve değişiklik yapabilirsiniz. Ancak buraya dikkat çekmek istiyorum Nixops Virtualbox üzerinden makine oluşturmaz sadece vorolan makşneye bağlanablir.
- AWS (Amazon Web Services), GCE (Google Compute Engine), Azure (Microsoft Azure), Digital Ocean gibi cloud ortamlarına kurulum yapabilir hatta network, storage, IP, firewall gibi
- Şu kaynakta da Versiyon 1'den 2'ye geçişle alakalı konulara değinilmiş.
Son tahlilde eğer 1.7 kullanmak istiyorsak özellikle ilgili Nixos versiyonunu bulup onun üzerinden nixops'u yüklememiz gerekiyor. Nixops 1.7 versiyonunun bulunduğu Nixpks'nin en son versiyonu Nixos 23.05'de bulabiliyoruz. O zaman registry (channel) olarak 23.05 versiyonunu registry'lere ekleyip bu versiyon üzeridnen Nixops'u kurabiliriz.
nix registry add nixpkgs2305 github:NixOS/nixpkgs/nixos-23.05 export NIXPKGS_ALLOW_INSECURE=1 nix profile install flake:nixpkgs2305#nixops nixops --version
Nixops'u kullanırken flake içine veya flake'den bağımsız olarak bir dosya içine konfigürasyonu yazabiliriz. Bu dosya içinde birden fazla makine tanımlayabiliriz. Bu makinelere bağlanarak Nixos konfigürasyonunu uygulayabiliriz.
Flake içinde tanımlama yaparken alttaki gibi bir template kullanmalısınız.
nixopsConfigurations
bloğuna bakacak olursanıznetwork
,defaults
vemachine
bloklarını görebilirsiniz.network
bloğunda genel network ayarları yapılırkenmachine
bloğunda ise tekbir makinenin tanımını gösteriyor. Defaults bloğu ise tüm makinelere uygulanacak genel ayarları gösteriyor. Konfigürasyondaki databasefile kısmı ise eskiye uyumluluk için gerekiyor. Bu dosya içinde deployment'lar ve makine bilgileri tutuluyor.Network bloğuna eğer örneğin bir AWS konfigürasyonu yapacak olursak bu durumda makinelerimiz ve diğer AWS kaynakları AWS üzerinden Nixops tarafından oluşturulacaktır. Alttaki örnek Virtualbox üzerinde bir makine oluşturmak için kullanılabilir.
# flake.nix { description = "Murat Cabuk NixOs Configuration"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-23.11"; nixops.url = "github:NixOS/nixops"; }; outputs = { self, nixpkgs, ... }@inputs: { nixopsConfigurations.default = { inherit nixpkgs; network = { description = "my virtual network"; enableRollback = true; storage.legacy = { databasefile = "~/.nixops/deployments.nixops"; }; deployment.targetEnv = "virtualbox"; deployment.virtualbox.memorySize = 4096; # megabytes deployment.virtualbox.vcpu = 2; # number of cpus deployment.virtualbox.headless = true; }; defaults = { imports = [ ]; }; machine = { config, pkgs, ... }: { services = { httpd.enable = true; openssh.enable = true; }; environment.systemPackages = with pkgs; [ vim git htop]; }; }; nixosConfigurations.nixos = nixpkgs.lib.nixosSystem { system = "x86_64-linux"; modules = [ /configuration.nix ]; }; }; }
-
- Kubenix: Bu araç Rust dili kullnılarak yazılmış amaç development ortamı için Kubernetes cluster'ı oluşturmak.
Nixops ile Kubernetes kurulumu için fikir olması adına altta 2 Github projesinin linkini paylaşıyorum.
- Sadene Kubernetes değil ELK, Kafka, Mesos ve Postgres cluster'larının da Nixops ile nasıl oluşturabilceğinize örnek olarak şu linkten inmceleyebilirsiniz.
- Bu örnek de sade bir şekilde 6 sunuculu bir Kubernetes cluster'ının nasıl yapılabileceğini gösteriyor.
Evet bu yazmızda bu kadar. Fırsat buldukça Nixos hakkındaki deneyimlerimi paylaşmaya devam edeceğim. Umarım faydalı olmuştur diğer yazılarımda görüşmek ümidiyle.