Your browser doesn't support the features required by impress.js, so you are presented with a simplified version of this presentation.

For the best experience please use the latest Chrome, Safari or Firefox browser.

NixOS

関数型パッケージマネジャー

Dennis Gosnell

this presentation online

自己紹介

Dennis (デニス)

twitter: @cdepillabout

github: github.com/cdepillabout

  • Haskell, Scala, 圏論
  • NixOS
  • CTF

NixOSとは

  • 普通のLinuxディストリビューション
  • Debian系とかRedhat系ではない
  • 独自のディストリビューション
  • もともと研究用のOS

パッケージマネジャー(Nix)

  • yumとかaptと違って、関数型パッケージマネジャー

関数型パッケージマネジャーとは?

  • パッケージを一回入れたら絶対削除されない

え?

パッケージ更新したら古い方のパッケージは削除されるんじゃない?

例えば

  • java-1.7を/usr/bin/javaとしてインストール
  • java-1.8にアップグレードしたら/usr/bin/javaが更新される
  • java-1.7に依存しているソフトが動かなくなる

NixOS

この問題を回避できる

パッケージをインストール

/nix/store/の配下にファイルができる

/nix/store/ └── n5qcp6cd3mca903zkqq39vzkbcfig94z-java-1.7/    ├── bin/    │   ├── java    │   ├── javac    │   └── (...)    ├── include/    │   └── (...)    └── lib/       └── (...)

java8をインストール

java7は削除されず

/nix/store/ ├── n5qcp6cd3mca903zkqq39vzkbcfig94z-java-1.7/ │   └── (...) └── xwz6c4685klixn326baq3dgjj2mp2m0h-java-1.8/    ├── bin/    │   ├── java    │   ├── javac    │   └── (...)    └── (...)

そのハッシュは?

/nix/store/ └── n5qcp6cd3mca903zkqq39vzkbcfig94z-java-1.7/    └── (...)

derivation

パッケージの定義ファイル

{ stdenv, fetchurl, zlib }:
stdenv.mkDerivation rec {
 name = "hello-2.9";
 src = fetchurl {
  url = "mirror://gnu/hello/${name}.tar.gz";
  sha256 = "19qy37gkasc4csb1d3bdiz9snn8mir2p3aj0jgzmfv0r2hi7mfzc"; };
 meta = {
  description = "A program that produces a friendly greeting";
  license = stdenv.lib.licenses.gpl3Plus; };
}

derivationファイルでハッシュが決まる

/nix/store/ ├── hwi70kh40mxmw25h3w9rf3yhcz4rjim0-java-1.7/ │   └── (...) └── n5qcp6cd3mca903zkqq39vzkbcfig94z-java-1.7/    └── (...)

Nixのいいところ

  • 依存関係を大切にしている
  • パッケージを入れたらずっと使える
  • パッケージ管理がより安全で楽になる

NixOSなりの構成管理

  • パッケージマネジャーだけじゃなくて、OSのすべての設定を関数型的に設定できる
  • /etc/nixos/configuration.nixにOSの設定を記述(puppetかchefみたいな感じで)
  • `nixos-rebuild switch`で設定を適用

NixOS設定適用

  • パッケージがインストール(例:java-1.8)
  • サービスが機動(例:sshd)
  • /etc/の中のファイルが書き換え(例:/etc/hostsに新しいホストが追加されたり)

puppetとかchefで出来ることはだいたい出来る

他の機能

  • Nix: rubyのrbenvとかpythonのvirutalenvみたいな機能
  • NixOS: dockerみたいな機能

Thank You

Questions?

Use a spacebar or arrow keys to navigate