UProLa

Неокріпші думки

Posts Tagged ‘NixOS

NixOS – дистрибутив Лінукса з декларативною конфігурацією

with 7 comments

Блукаючи по сторінках, пов’язаних з Haskell-ем, наштовхнувся на експериментальний дистрибутив Лінукса з цікавими властивостями. Особливо мене зацікавили наступні: можливість транзакційного оновлення системи та декларативне налаштування системи. Першими словами було “Це анріал”, але дистрибутив скачав і поставив (у мене якраз ArchLinux здох через апдейт драйверів). Певні враження та приклади приведу в даному пості.

Конфігурація NixOS

Менйтейнери знають про функ. програмування не з лівих вуст – головний девелопер вчився в Utrecht University, котрий подарував світу альтернативну GHC реалізацію Хаскеля. Власне він розробив спеціальну функційну мову для роботи з пакетами, в якій установка пакета або вибір певної поширеної опції є всього лиш “галочкою” у текстовому вигляді. Ось приклад, що я вже наставив собі у систему (файл /etc/nixos/configuration.conf):

# the system.  Help is available in the configuration.nix(5) man page
# or the NixOS manual available on virtual console 8 (Alt+F8).

{ config, pkgs, ... }:

{
  require =
    [ # Include the results of the hardware scan.
      ./hardware-configuration.nix
    ];

  boot.initrd.kernelModules =
    [ # Specify all kernel modules that are necessary for mounting the root
      # filesystem.
      # "xfs" "ata_piix"
    ];
    
  # Use the GRUB 2 boot loader.
  boot.loader.grub.enable = true;
  boot.loader.grub.version = 2;
 
  # Define on which hard drive you want to install Grub.
  boot.loader.grub.device = "/dev/sda";
  boot.initrd.enableSplashScreen = true;

  networking.hostName = "localhosted"; # Define your hostname.
  networking.wireless.enable = true;  # Enables Wireless.
  networking.useDHCP = true;
  networking.wireless.driver = "wext";
  # networking.wireless.userControlled.enable = true;
  networking.nameservers = [ "8.8.8.8" ];

  # Add filesystem entries for each partition that you want to see
  # mounted at boot time.  This should include at least the root
  # filesystem.
  fileSystems =
    [ { mountPoint = "/";
        device = "/dev/disk/by-label/nixos";
      }

      { mountPoint = "/storage"; # where you want to mount the device
        device = "/dev/sda8";  # the device
        fsType = "ext4";      # the type of the partition
      #   options = "data=journal";
      }
    ];

  # List swap partitions activated at boot time.
  swapDevices =
    [ { device = "/dev/disk/by-label/swap"; }
    ];

  # Select internationalisation properties.
  i18n = {
    consoleFont = "Terminus";
    consoleKeyMap = "us";
    defaultLocale = "uk_UA.UTF-8";
    supportedLocales = [ "en_US.UTF-8/UTF-8" "ru_RU.UTF-8/UTF-8" "uk_UA.UTF-8/UTF-8" ];
  };

  # List services that you want to enable:

  # Enable the OpenSSH daemon.
  # services.openssh.enable = true;

  # Enable CUPS to print documents.
  # services.printing.enable = true;

  # Enable the X11 windowing system.
  services.xserver.enable = true;
  services.xserver.layout = "us";
  services.xserver.xkbOptions = "eurosign:e";

  # Enable the KDE Desktop Environment.
  services.xserver.displayManager.kdm.enable = true;
  services.xserver.desktopManager.kde4.enable = true;
}

Гляньте, для прикладу, на рядок

# Use the GRUB 2 boot loader.
  boot.loader.grub.enable = true;
  boot.loader.grub.version = 2;
 
  # Define on which hard drive you want to install Grub.
  boot.loader.grub.device = "/dev/sda";

Достатньо всього лиш вписати в конфігу ці рядки і після ребілду система сама поставить GRUB куди їй там треба. Якщо ми змінимо версію на 1, то під-час ребілду буде автоматично скачаний перший груб і поставлений замість другого. Тобто, не обов’язково вручну скачувати, ставити і налаштовувати пакет, якщо для нього є описана опція – користуйтесь нею.

Інший приклад – мережа.

networking.hostName = "localhosted"; # Define your hostname.
  networking.wireless.enable = true;  # Enables Wireless.
  networking.useDHCP = true;
  networking.wireless.driver = "wext";
  # networking.wireless.userControlled.enable = true;
  networking.nameservers = [ "8.8.8.8" ];

В ArchLinux також спробували зробити такий конфіг мережі, але у них вийшло гавняно і новий синтаксис використовується не сильно. (До-речі, якщо вам вкрай не подобається вручну налаштовувати мережу, можна все то закоментувати і вказати опцію networking.wicd.enable=true; – всі налаштування будуть йти через wicd, котрий буде автоматично скачаний і поставлений.)

Далі ви побачите статичне монтування дисків. Замість спеціального синтаксису mount і /etc/fstab можна використовувати уніфікований, що є серйозним напрямком до User-oriented операційної системи.

Установка X і кедів – взагалі пісня. Простіше, мабуть, тільки галочка (але які нафіг галочки, коли навіть xserver не стоїть?)

Модифікація системи

Серед різноміїття дистрибутивів я надаю перевагу rolling-release варіаціям. Мені подобається, коли система оновлена “по максимуму”. Проте вибір, як такий, у мене невеликий – Arch Linux, Gentoo, NixOS, можливо ще щось. Арч при цьому має перевгу над Генту в плані наявності бінарних пакетів. Так ось, NixOS також має таку перевагу над Генту! Тобто, всі програми компіляться з сорсів, проте якщо є бінарник, то буде використаний саме він. Бінарники, в свою чергу, білдяться на спеціальній гідра-фермі, цілодобово, кожен день.

Всі пакети ставляться в юзер-спейс, тому для установки пакетів не потрібно root-права. Я поки-що не знаю, добре це чи погано, але це чудова причина для тих, хто юзає sudo без пароля, використовувати менше sudo без пароля.

Іншою цікавою особливістю є те, що якщо конфігурація системи змінюється, то це не призведе до втрати системи. Усі старі кофігурації не видаляються, і потім доступні у меню GRUB. Цим самим можна легко відкатити будь-які зміни системи, що радує (fallback image не завжди справляється з цією задачею, адже проблеми можуть бути в обв’язці ядра, що враховується конфігурацією NixOS.)

Миска дьогтю

Недарма NixOS виступає як експериментальна система. Один з Дебіан-майнтейнерів розкритикував її менеджер пакетів, коли хтось запропнував замінити dpkg і apt.

  • Готових пакетів доволі мало. В тому ж дебіану, генті та арчі їх в рази більше
  • Готових бінарних пакетів дуже мало. Навіть Chromium, і той поки-що не білдиться бінарно (а на моєму компі він компілився всю ніч, поки не здохла батарея…)
  • Замість dependency hell ми тепер отримуємо configuration options hell. Кількість опцій зашкалює і в майбутньому буде тільки рости. Думаю, скоро з’явиться якась графічна приблуда для цих опцій і ми отримаємо повноцінний MacOS *irony*
  • Якщо ви будете модифікувати систему старим способом (через конфіги /etc), то будьте готові ними пожертувати під-час чергового ребілду системи. Тру-способом є створення нової опції і підключення її в конфіг системи. Unix-way, кажете? =)
  • Все тормозить. В порівнянні з Arch
  • Ггюки присутні. Наприклад, kate під рутом не хоче запускатись
  • Думаю, проблема з драйверами для відеокарти тут стоїть дуже гостро.
  • Відсутність крауд-документації (гугл-отвєти, форуми, ком’юніті). Всі проблеми треба напряму вирішувати з девелоперами або в не дуже активному IRC-чаті (котрий, до-речі, мені сильно допоміг в установці системи). Гугл і ЛОР практично нічого не знають про NixOS.
  • Думаю, тут є серйозні проблеми з security, але це всього-лиш здогадка
  • В папці /bin знаходиться тільки один файл – /bin/sh ! kernel panic!
  • А знаєте, чого один? Бо всі програми ставляться в /nix/store/, і до них спереду дописується 160бітний хеш. Вигляда
    це приблизно так:

    [danbst@localhosted:~]$ ls /nix/store/ | head
    00418vqs74568frbp4bzb27wq0q7drd2-switch-to-configuration.sh
    00ix198j4hfbbkb2w18aiwiz73rr017l-libevent-2.0.17-stable.tar.gz.drv
    00j4kxw914408w5bwap970f7iljff955-upstart-tty4.conf
    01656gv7ysz8vj6qxnh5drqka6n1118n-closure.drv
    01a60wl2a2gg7pwcs7v4arx29173s9g3-kde.pam.drv
    01d61sgqavjph83c9qx9n05yjv1qblcl-gmp-5.0.5
    01dzpp03fsvc7xixg9sp2hdhi5iy9m3v-1k7b4mpfxpbcq5wih614z9g05w22ibwjq8wzh30xihl70q310zzq.nar-bsdiff
    01r9wqssr0m7h7hb13jkchn3g8zyjk6r-pth-2.0.7
    01w11lngp8s4lxllyr6xbmjfyrfkrn43-builder.sh
    0286r8g56dj2pvirgac079flz9gjnka2-font-cursor-misc-1.0.3.tar.bz2.drv
    

    ЖОПА. Переходити по автокомпліту до потрібного пакету тепер нереально.

  • …і ще багато-багато різних голімих приколів, котрі мене поки-що не чіпали.

Як висновок

Як висновок, я скажу, що система юзабельна в певних межах і цікава, в межах своїх унікальних властивостей. Як на робочу машину я би не ставив, але на домашню типового лінуксойда – то цілком навіть дуже непогано. Подивимся, чи зможу я на ній прожити до кінця літа, поставити xmonad, ATI-драйвери, wine та Windows-ігри. Якщо особливо серйозних проблем я з цим не отримаю, то значить WIN. Арівідерчі!

Written by danbst

Червень 24, 2012 at 09:34

Оприлюднено в Пости, Програмування

Tagged with ,