NixOS part 3: Home-Manager kurulumu ve kullanımı

Uzun bir aradan sonra başladığım 3.rehberi okurken umarım sıkılmazsınız, öğrenip detaylara alışmak biraz yorucu da.🫠

Öncelikle Home-Manager nedir ne değildir onu konuşalım. Kabaca söylemek gerekirse sistemi yönetirken kullanıcıya rahatlık vermek, sisteme doğrudan etki etmeden çeşitli konfigürasyonları bir arada tutmak amaçlı kullanılan bir araç.

Home-Manager kurulumu



Part 2'de anlattığım gibi burada da konfigürasyon dosyamızı öyle hazırlıyoruz. Yaani configuration.nix ≈ home.nix olarak düşünülebilir. Dalgalı eşittirin sebebi kendilerine ait bazı ufak ayrılıkları olmasıdır. Onu da ileride göreceğiz.

Öncelikle configuration.nix dosyamızı istediğiniz bir editör ile açıp içine kullanacağımız yazılımları yazmamız gerekli. Part 1'de anlattığım gibi paketleri environment.systemPackages satırına eklemeniz gerekiyor ancak ben orada yazdığım satırların aksine bu sefer fonksiyon kurarak yazılımları ekleyeceğim, maksat farklı yollarında olduğunu göstermek.

Kuracağımız yazılımlar: home-manager & hyprland olacak, bunun eklememiz gereken satırlar şu şekilde olacak.

Kod:
environment.systemPackages =
 map (p: pkgs.${p}) [
 "home-manager"
 "hyprland"
 ];

Eğer bundan bir şey anlamadıysan bildiğin yol ile kuralım bunu.

Kod:
environment.systemPackages = with pkgs; [
 home-manager
 hyprland.
];

Kurduktan sonra home-manager init ile hazır home.nix dosyasını oluşturabilirsiniz. Olurda benim gibi Home-Manager yok hatası alırsanız yukarıdaki yönetmlerin aksine manuel olarak kurmanız gerekir. Bunun için terminale alttaki kodları girip yeniden Home dosyanızı oluşturun.

Kod:
nix-channel --add https://github.com/nix-community/home-manager/archive/master.tar.gz home-manager

nix-channel --update

Bunları yaptıktan sonra Home-Manager kurulmuş olacak.


Home-Manager kullanımı



Hemen varsayılana en yakın home.nix dosyası üzerinden örnek vererek anlatıma geçelim. otomatik düzeltme sağ olsun kodları kopyala yapıştır yaptığınızda bolca hata alabileceğinizden yapmayın.

Kod:
{ config, pkgs, ... }:

{
 home.username = "user";
 home.homeDirectory = "/home/default";

 home.stateVersion = "25.05";

 # The home.packages option allows you to install Nix packages into your.
 # environment.
 home.packages = with pkgs; [
 pkgs.nerd-fonts.iosevka-term
 waybar.
 fuzzel.
 mako.
 wofi-emoji
 clock-rs
 kitty.
 nautilus.
 pavucontrol.
 grim.
 slurp.
 fastfetch.
 ];

 # Home Manager is pretty good at managing dotfiles. The primary way to manage.
 # plain files is through 'home.file'.
 home.file = {
 # # symlink to the Nix store copy.
 # ".screenrc".source = dotfiles/screenrc;
 # "./configs/waybar" = nix-dotfiles/waybar; recursive = true;
 # # You can also set the file content immediately.
 # ".gradle/gradle.properties".text = ''.
 # org.gradle.console=verbose
 # org.gradle.daemon.idletimeout=3600000
 # '';
 };

 home.sessionVariables = {
 EDITOR = "neovim";
 TERMINAL = "kitty";
 };
 programs.home-manager.enable = true;
}

Tam olarak böyle gelmiyor, ancak varsayılan halinden izler taşıması için bu şekilde bıraktım.

Şimd bölümleri açıklama zamanı🙂

home.username ="user" => bu dosyamızın hangi kullanıcıya tanımlı oldduğunu gösterir. Hazır konfigürasyonlarda değiştirmeniz gerekir.
home.homeDirectory ="/home/default" => varsayılan olarak ayarlı olan yaani username kısmında belirlediğiniz kısmımdan bahseder. Bunu ileride değiştereceğiz. Kendi dosya ağacımı gösterdiğim zaman anlarsınız.
home.stateVersion "version" => nix sürümünüz ne ise onunla değiştirin. configuration.nix dosyanızdan bulabilirsiniz.
home.packages => configuration.nix kısmına gidin, orası ile aynı.

home.file => symlink oluştururken kullanılır ancak daha iyi bir alternatifi bulunmakta. Kısaca anlatmak gerekirse kendisi /home/default kısmında bulunan klasörlerde bulunan verileri okuyup salt okunur bir şekilde gerekli yere bağlayabilir. Örnek:

JavaScript:
home.file = {
 "./.config/hypr/" = ./nix-dotfile/hypr;
 recursive = true;
 };

Bu /home/user/nix-dotfile/hypr konumunu içindekiler ile beraber /home/user/.config/hypr konumuna symlink oluşturur. symlink oluşturulan konumdakiler salt okunur olduğundan değiştirilemezler.

home.sessionVariables => varsayılan yazılımları belirlediğiniz kısımdır.

En basit bu şekilde anlatabildim, şimdi ise benim home.nix dosyama bakalım.


benim nix ağacım


Öncelikle ağacı göstereyim ki kafanız karışmasın.

Kod:
NAOS.
|--/home => home.nix |--/import/import.nix
|
|--/modules => conflinks.nix | pkgs.nix | hyprland.nix
|
|--/.config => -/hypr/hyprland.conf |-/waybar {style.css/ confıg.jsonc} |-/fuzzel/fuzzel.ini
|
|--/nixos => configuration.nix | hardware-configuration.nix
|
|- flake.nix (Daha yazılmadı. 4.rehber için hazırlık yapılacak.)

Kodları göstermeden önce ne işe yaradıklarını söylemekte fayda var. Çünkü çok fazla detaya gireceğiz 😁

Home.nix:

Kod:
{ config, pkgs, ... }:

 let.
 hmdir = "/home/user"
 naosDir = "${hmdir}/naos";

 in {

 imports = [
 "${naosDir}/home/import/import.nix"
 ];

 home.username = "user";
 home.homeDirectory = homeDir;

 home.stateVersion = "25.05";

 home.sessionVariables = {
 EDITOR = "neovim";
 TERMINAL = "kitty";
 };
 programs.home-manager.enable = true;
}

Evet. Varsayılana göre boş ve bir farklılık var. Fark edildiği gibi let ve in girdileri var, hemen anlatayım.
let => değişikliğin atandığı ve kullanıcının işini kolaylaştırması için eklemeler yapılır. Tıpkı yaptığım naosDir tanımlaması gibi.
in => normal bir şekilde kodlarımızı eklediğimiz bölümdür, uzun uzun yazmak yerine değişkenleri de kullanamamız için işimizi kolaylaştırır.

Import kısmı ile oluşturduğum import.nix dosyasından veri çekmekte. Veri çekmek derken kodu alıp Home. Nix dosyamız ile birleştiriyor diyebiliriz.

import.nix:

JavaScript:
{ config, pkgs, lib, ... }:

let.
 homeDir = "home/user";
 modulesDir = "${homeDir}/naos/modules";

 moduleFiles = builtins.attrNames (builtins.readDir modulesDir);

 nixFiles = builtins.filter (name: lib.hasSuffix ".nix" name) moduleFiles;

 fullPaths = builtins.map (name: "${modulesDir}/${name}") nixFiles;
in.
{
 imports = fullPaths;
}

Let kısmını inceleyelim. Home ve modulesdir satırları varsayılan kullanıcının dizinini temsil etmekte. Değiştirmenize gerek yok, otomatikman sizin oturumunuza bağlanır.

modulesFiles => modülleri belirttiğimiz klasörün içini tarar.
nixFiles => adında .nix içeren dosyalari filtreler.
fullPaths => modüller klasördündeki .nix içeren dosyaları içe aktarır.
Import ise aktarılanları home.nix ile birleştirir.

Bende modüller modules klasörünün içinde ancak sizde böyle olmak zorunda değil, nasıl derseniz mödüller/ahmet/bilgi isleme merkezi gibi klasör isimleri yazabilirsiniz.😃

Hadi modules içindeki ilk dosyam olan conflinks.nix dosyama bakalım.

Kod:
{ config, lib, ... }:

let.
 homeDir = "/home/asus"
 naosDir = "${homeDir}/naos";
 confD = "${naosDir}/.config";
in.
 {
 xdg.configFile = {
 "waybar" = {
 source = "${confD}/waybar";
 recursive = true;
 };
 "hypr" = {
 source = "${confD}/hypr";
 recursive = true;
 };
 "fuzzel" = {
 source = "${.confD}/fuzzel;
 recursive = true;
 };
 };
}

Mantık şu: Klasörü belirt, kaynağını göster ve içini dahil et. xdg.configFile doğrudan /home/user/.config klasörüne bağlar bu yüzden bağlayacağınız klasörün sadece adını yazmanız yeterli olacaktır.

Bu dosya symlink oluşturmak ve yönetmek için var. home.file = yapısı yerine xdg.configFile yapısı kullandım çünkü bu şekilde daha derli toplu duruyor ve düzenleyip kullanması daha rahat geliytor bana. symlink oluşturduğunuz dosyalar salt okunur olduğundan silinemez. Silmek istenilirse bulunduğu klasörü silmeniz gerekir.

hyprland.nix dosyamda Hyprland için gerekli düzenlemeler ve paketler yer almakta. Çok üstünde durmayacağım, diğer linux dağıtımlarında bashrc ve zshrc ayarlarınızı bu dosyaya da ekleyebilmektesiniz.

Kod:
{ config, pkgs, ... }:

{
 home.packages = with pkgs; [
 hyprland.
 xdg-desktop-portal-hyprland
 brightnessctl.
 playerctl.
 wl-clipboard
 pavucontrol.
 font-awesome
 waybar.
 fuzzel.
 mako.
 wofi-emoji
 clock-rs
 kitty.
 nautilus.
 grim.
 slurp.
 ];

 home.sessionVariables = {
 XDG_SESSION_TYPE = "wayland";
 XDG_CURRENT_DESKTOP = "Hyprland";
 NIXOS_OZONE_WL = "1";
 WLR_NO_HARDWARE_CURSORS = "1";
 GTK_USE_PORTAL = "1";
 };

}

pkgs.nix dosyası ise ihtiyaç duyulan paketleri bir arada tuttuğumuz pakettir. Bu arada unutmadan dosyalara istediğiniz isimleri verebilirsiniz, yukarıda da bahsetmiştim.

Kod:
{ pkgs, ...}

 {
 home.packages = with pkgs; [
 onlyoffice-desktopeditors
 vscode.
 neovim.
 ];

 }

Eğer fonts.fontsConfig.enable ekleyecekseniz kodun başına lib ve config eklememelisiniz yaani { pkgs, lib, config, ...} olarak düzenleyeceksiniz.

Bu sefer detaylı olduğunu düşündüğüm bir rehber yazmış durumdayım, umarım anlaşılırdır. 😇 olur da anlamazsanız konu açın, bilen biri cevaplayacaktır.😉

Yorumlar

@Maomao hocam nix dili ile yazılan dosyaların başına neden {pkgs, lib ...} koyuyoruz?
Nix dosyaları fonksiyon belirtebiliyor. ... koymamız pkgs ve lib dışında verilen diğer parametreleride kabul etmemizi sağlıyor.

Python karşılığı bu şekilde düşünülebilir:
Python:
def nix_dosyam(pkgs, lib, **kwargs):
    ...
 

Blog girdisi detayları

Ekleyen
Maomao
Okuma süresi
4 dakika okuma
Görüntüleme
278
Yorumlar
5
Son güncelleme

Yazılım kategorisindeki diğer girdiler

Maomao adlı kullanıcının diğer girdileri

Bu girdiyi paylaş

Geri
Yukarı