UProLa

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

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 ,

Відповідей: 7

Subscribe to comments with RSS.

  1. Тепер я зрозумів, чому немає бінариника для хрома. Після 12-годинної компіляції з сорсів, хром запустився, але не може відобржати жодну сторінку.

    [danbst@localhosted:~]$ chromium
    [30596:30596:67631526886:FATAL:child_process.cc(37)] Check failed: io_thread_.StartWithOptions( base::Thread::Options(MessageLoop::TYPE_IO, 0)). 
    [30618:30618:67690648906:FATAL:child_process.cc(37)] Check failed: io_thread_.StartWithOptions( base::Thread::Options(MessageLoop::TYPE_IO, 0)). 
    [30568:30575:67698346379:ERROR:object_proxy.cc(495)] Failed to call method: org.kde.KWallet.isEnabled: org.freedesktop.DBus.Error.ServiceUnknown: The name org.kde.kwalletd was not provided by any .service files
    [30568:30575:67698346537:ERROR:native_backend_kwallet_x.cc(175)] Error contacting kwalletd (isEnabled)
    

    Може спробувати поставити Оперу замість ФФ? Там бінарник точно є.

    danbst

    Червень 25, 2012 at 11:02

    • Слава небесам! Хром працює, якщо запускати з параметром –disable-seccomp-sandbox !

      danbst

      Липень 2, 2012 at 23:18

  2. Прикра історія сталась. Вирубився ноут по причині “батарейка сіла”, і якимось чином пошкодилась ext3 файлова система. Після fsck.ext3 -y /dev/disk/by-label/nixos ніби стало добре, проте зникла утиліта “find“. А без неї не працював nixos-rebuild switch

    Короче, намагаючись переустановити пакет findutils, я випадково видалив добру половину NIX-оболочки. Печалька, подумав я, і вставив рятувальну флешку в USB-порт. Після переустановки системи findutils з’явився, проте установка не була завршена вдало.

    Винною було те, що список систем при завантаженні в GRUB падав на етапі генерації. А точніше, змінна $link була порожньою, в той час як повинна була містити шлях до останньої версії NixOS.

    Вирішення проблеми було неочікуване: rm /nix/var/nix/profiles/system*

    Як пояснив чувак в IRC, після переустановки залишилось багато старих профілів, які і заважали нормально працювати утиліті nixos-rebuild.

    danbst

    Липень 2, 2012 at 23:37

  3. Про автокомпліт: для башу нескладно написати свій власний, дивно, що вони ще не впхнули туди свій скрипт автодоповнення, який інгнорував би хеші. Треба їм порадити цю ідею.

    dmytrish

    Липень 5, 2012 at 09:21

    • Там проблема дещо глибша, бо можуть бути два пакети одної версії, але з різними хешами (різні білди). Тоді не зрозуміло, котрий з них вибере автокомпліт.

      danbst

      Липень 5, 2012 at 10:49

  4. Про проблеми з драйверами відеокарти — не факт, якщо ментейнери не сильно патчили ядро, то все має бути гаразди.

    dmytrish

    Липень 5, 2012 at 09:23


Залишити відповідь

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out / Змінити )

Twitter picture

Ви коментуєте, використовуючи свій обліковий запис Twitter. Log Out / Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out / Змінити )

Google+ photo

Ви коментуєте, використовуючи свій обліковий запис Google+. Log Out / Змінити )

З’єднання з %s

%d блогерам подобається це: