% 関数型Linux: NixOSの仕組みと特徴の紹介 % OSC 2016 Tokyo/Spring % 2016年2月26日
- サニエ エリック
- 東京NixOSミートアップオーガナイザー
- Nixパッケージマネージャーの紹介 (20分)
- NixOSリナックスの紹介 (10分)
- 東京NixOSミートアップの紹介 (5分)
- 質問タイム
- いつでも気軽に質問してください!
- ファイル・プログラムをインストール・アップグレード・アンインストールをするソフトウェア
- 依存関係解決
- apt, yum, pacman
- パッケージ操作にリスクがあります
- ルート権限が必要
- 依存管理は難しい
- 依存地獄
- パッケージの代わりにコンテナーでソフトウェア配布が最近増えてる
- Eelco Dolstraの研究が原点
- 2006年に博士論文発表
- POSIX準拠 (LinuxとOS Xで利用できます)
- 主にC++で書かれている
- 良く出来たマニュアル
- LGPLライセンス
- パッケージの複数バージョン
- 一般ユーザパッケージインストール
- パッケージカスタマイズ
- 依存関係完結の保証
- パッケージ完全隔離
- ソースビルドとバイナリインストール対応
- ビルド再現性の保証
- 並行ビルド
- 低リスク
- nix-shell
- 関数型:
- パッケージは関数であり、依存は引数
- インストールされたパッケージのファイルは絶対に変更されない
- → 安全性 (依存関係完結の保証、ロールバック)
- 純粋:
- 関数の結果(パッケージ)は引数のみ(依存関係)で決まります
- → 再現性
- 遅延評価
- パッケージを簡単カスタマイズできます、パーフォーマンス向上
- → 柔軟性
- パッケージ"レシピ"関数(導出)
- パッケージレシピはNix言語で書かれています
- Nix言語はパッケージ用のドメイン固有言語
- NixはNix言語のコンパイラー
- パッケージはNixストアにインストールされます
- 導出コンパイル = パッケージのビルド + ストアへインストール
-
Nixはパッケージを必ずNixストアにインストールします
-
ストア内に同じパッケージの複数バージョンが存在できます
-
パッケージはストア内に導出ハッシュで特定されたフォルダーにインストールされます
-
隔離されたフォルダーにパッケージのすべてのファイルが入ります
$ readlink $(which tree) /nix/store/zzljry2r5w14rmvg3p9lz7ym326rfcpp-tree-1.7.0/bin/tree $ tree /nix/store/zzljry2r5w14rmvg3p9lz7ym326rfcpp-tree-1.7.0/ /nix/store/zzljry2r5w14rmvg3p9lz7ym326rfcpp-tree-1.7.0/ ├── bin │ └── tree └── share └── man └── man1 └── tree.1.gz
-
パッケージは他のパッケージファイルを絶対に変更できない
-
Nixストアは読み込み専用ファイルシステムでマウントされています
-
特定なNixストアパッケージを環境にリンクする仕組み
-
環境は自動的にバージョニングされます
-
世代はコマンドでロールバックできます
$ nix-env --list-generations 28 2016-01-31 07:23:34 29 2016-01-31 18:03:26 30 2016-02-06 11:58:46 31 2016-02-15 10:42:21 32 2016-02-15 10:44:14 (current) $ nix-env --switch-generation 30
- パッケージでインストールされるファイルは導出で決まります(再現性)
- 導出のハッシュがわかれば、ストアフォルダーとインストールされるファイルを判別できます
- ハッシュを利用し、バイナリパッケージを特定できます
- 再現性を利用し、導出を評価せずにバイナリパッケージをインストールできます
-
アプリケーションパッケージも対応(プログラミング言語)
-
Haskellのサポートが特に進んでいる
$ nix-env -f "<nixpkgs>" -qaP -A haskellPackages | wc -l 12014
-
Python等のパッケージもあります
$ nix-env -f "<nixpkgs>" -qaP -A python2Packages | wc -l 1199 $ nix-env -f "<nixpkgs>" -qaP -A python33Packages | wc -l 996 $ nix-env -f "<nixpkgs>" -qaP -A python32Packages | wc -l 997
-
NixOSマニュアルの生成
$ nix-build '<nixpkgs/nixos/release.nix>' -A manualPDF
-
NixOS ISOイメージの生成
$ nix-build '<nixpkgs/nixos/release.nix>' -A iso_minimal.x86_64-linux
-
テストの実行
-
インストールしてないプログラムのコマンド実行
$ nix-shell -p jdk --run "java -version"
-
特定のパッケージを含めた一時環境
$ nix-shell -p jdk -p subversion
$ nix-shell -p jdk7 -p git --pure
-
パッケージのカスタマイズ(引数)
libreNginx = nginx.override { openssl = libressl; }
-
パッケージのカスタマイズ(パッケージオーバーライド)
myNginx = nginx.overrideDerivation (super: name = "nginx-git"; src = fetchFromGitHub { sha256 = "04s7xcgmi5g58lirr48vf203n1jwdxf981x1p6ysbax24qwhs2kd"; rev = "c0eb2f0759726f47bd06f5c8f46739f43ce55cac"; repo = "nginx"; owner = "nginx"; }; })
-
キーワード: 再現性、依存関係完結、パッケージ隔離
-
closure: パッケージとその依存関係チェインのセット
-
nix-copy-closure
コマンドで他マシンにclosureをコピーできる$ nix-copy-closure --to [email protected] $(type -tp firefox)
$ nix-copy-closure --from [email protected] /nix/store/0dj0503hjxy5mbwlafv1rsbdiyx1gkdy-subversion-1.4.4
-
nix-push
でNixストアclosureのバイナリキャッシュを生成できます$ nix-push --dest /tmp/cache $(nix-build -A thunderbird)
- サーバを設定すれば、他のマシンからそのバイナリキャッシュは利用可能
- Nixのパッケージレポジトリ
- GitHubレポジトリ
- パッケージ追加とアップデートはプールリクエスト
- 簡単に拡張
- 77000コミット以上
- 700コミッター以上
- Hydraはnixpkgsのビルドファーム
- 兼継続的インテグレーション(CI)
- 独自サーバにインストールできます
- nixpkgsのジョブセット
- チャンネルは特定な条件を満たすnixpkgsのバージョンを提供する仕組み
- Hydraでビルドとテスト成功
- 種類はいくつかあります
- 安定チャンネル、例 nixos-15.09
- 不安定(開発): nixos-unstable
- サーバ向け、例 nixos-15.09-small, nixos-unstable-small
- Nixストア内にはチャンネルの最新nixpkgsが入っていて、Nixに利用されます
- Hydraでパッケージはビルドされているため、自動的にバイナリパッケージは生成されます
- 一息
- 質問?
- 宣言型設定 (モジュールシステム)
- パッケージロールバック
- アトミックアップグレード
- 安定性
- 軽量コンテナー (systemd-nspawn利用)
- DevOps向けツール (NixOps)
- OS = パッケージ + 設定
- パッケージ = Nix
- 設定 = モジュールシステム
- NixOS = Nix + モジュールシステム
- 宣言型設定
- 自動化
- 拡張したNix言語を利用
- OS設定固有ドメイン言語
- オプション型
- 良く出来たマニュアル
- 独自モジュールで拡張可能
- /etc/nixos/configuration.nix がメインのファイルになります
- モジュールシステムはnixpkgsに含まれています
-
プロビジョニング
environment.systemPackages = with pkgs; [ firefox termite tmux ];
-
systemdのサービス
systemd.services.ircSession = { wantedBy = [ "multi-user.target" ]; after = [ "network.target" ]; serviceConfig = { Type = "forking"; User = "username"; ExecStart = ''${pkgs.tmux}/bin/tmux new-session -d -s irc -n irc ${pkgs.irssi}/bin/irssi''; ExecStop = ''${pkgs.tmux}/bin/tmux kill-session -t irc''; }; };
-
gnomeを利用
services.xserver.enable = true; services.xserver.displayManager.gdm.enable = true; services.xserver.desktopManager.gnome3.enable = true;
-
Apache HTTPDを有効
services.httpd = { enable = true; enablePHP = true; adminAddr = "[email protected]"; documentRoot = "/srv/http"; };
-
カーネルバージョンの変更
boot.kernelPackages = pkgs.linuxPackages_4_4;
-
ユーザ作成
users.extraUsers.eric = { isNormalUser = true; createHome = true; extraGroups = [ "wheel" "scanner" "vboxusers" "audio" "docker" ]; uid = 1000; };
-
日本語入力を有効
i18n.inputMethod = { enabled = "fcitx"; fcitx.engines = with pkgs.fcitx-engines; [ mozc anthy ]; };
-
firefoxのflashプラグインを有効
nixpkgs.config = { allowUnfree = true; firefox.enableAdobeFlash = true; };
-
フォント設定まで!
fonts = { fonts = with pkgs; [ ipafont powerline-fonts kochi-substitute ]; fontconfig = { defaultFonts = { monospace = [ "DejaVu Sans Mono for Powerline" "IPAGothic" ]; serif = [ "DejaVu Serif" "IPAPMincho" ]; sansSerif = [ "DejaVu Sans" "IPAPGothic" ]; }; }; };
-
ループも利用できます
services.httpd.virtualHosts = let makeVirtualHost = { name, root }: { hostName = name; documentRoot = root; adminAddr = "[email protected]"; }; in map makeVirtualHost [ { name = "example.org"; root = "/sites/example.org"; } { name = "example.com"; root = "/sites/example.com"; } { name = "example.gov"; root = "/sites/example.gov"; } { name = "example.nl"; root = "/sites/example.nl"; } ];
-
if分岐
environment.systemPackages = if config.services.xserver.enable then with pkgs; [ firefox thunderbird ] else [ ];
-
nixos-rebuild コマンドで設定を適応する
$ nixos-rebuild switch
-
設定をビルドのみ(コンパイルチェック)
$ nixos-rebuild build
-
設定をビルドし、バーチャルマシン(QEMU)起動で動作確認
$ nixos-rebuild build-vm
- 宣言的にOSを設定できます
- configuration.nixを別マシンにコピーし、適応すれば同じ環境を再現できます
- Surface 3用のNixOS設定ファイルもあります
- 専用ツール
- NixOps: NixOS環境のデプロイツール
- nix言語で設定ファイル
- バーチャルマシン、EC2、GCE、Hetznerなどをサポートします
- 詳細は3月のNixOS勉強会へ!
- Disnix: サービス向けシステムデプロイツール
- 異質OSネットワーク対応
- ステートもサポート(Dysnomia)
- 一息
- 質問?
- 2015年9月に始まった
- 毎月に勉強会をやります
- MeetupとConnpassにグループあります
- 前回はパッケージ作成
- 次回は
- 3月23日 19:00 - 21:00
- テーマはNixとDevOps、NixOps
- 場所は茅場町Co-Edo
- GitHubで日本語Wiki管理
- パッケージ追加、モジュール追加(日本語入力)
- マニュアル翻訳を近々に始める予定
- ブースに
- NixOSを体験できるマシン
- インストールCD
- ステッカー
- があります、気軽に寄ってください!
- ご清聴ありがとうございました
- 質問タイム