Edited at

NixOSことはじめ 


はじめに

Nixとは純粋関数型手法によりDependency hellから我々を解放してくれる超強力なパッケージマネージャである。そしてNixOSとはシステムの管理、構成をNixが担うLinuxディストリビューションである。今回はNixOSを試す目的でVirtualBoxを利用した。しかし、NixOSはシステム構成を簡単に再現出来る特性を持っているため、すぐにメイン環境へと移行することも可能である。筆者はNixOSを試し、その機能に魅了され、メイン環境として使おうと決意したところである。この記事は基本的に筆者がやったことのまとめ、自分用のメモが目的なので、例えばVirtualBoxの使い方などは説明しないし、ある程度行間は読まないとわからないかもしれない。よって想定読者はVirtualBoxを使って既に何かしらのOSをインストールしたことがある方で、バイナリの海よりも広い心を持ったエスパーである。

またNixOSの仕組みについてはここでは語らないが、とても良い記事が存在する。

ぼくが普段使っているOS - NixOSの話

これを読めばあなたもNixOSを試してみたくなると思う。


システム構成

筆者の環境を以下に示す。


  • プロセッサ: Intel Core i5-6500 3.2GHz

  • メモリ容量: 8G

  • グラフィック: GeForce GTX 1060 3G

  • ストレージ: SSD 256G

  • ホストOS: Windows 10 Home ビルド 18362

  • ゲストOS: NixOS 19.03

  • ゲストOSのWM: XMonad

  • VM: VirtualBox 6.0.10, VirtualBox Extension Pack

この程度のスペックではあるが快適に動作している。


インストール

Tokyo-NixOS/Tokyo-NixOS-Meetup-Wiki

このwikiに日本語のインストール手順が書いてあるので、そのまま実行していけば上手くいく。ただしVirtualBoxへのインストールについては書いてないので補足する。


  • VBoxの設定、EFIを有効化のチェックをはずす

  • VBoxの設定、グラフィックコントローラをVboxVGAに変更する。

  • 上記インストール手順のMBRの項目をなぞっていく

これで上手くいった。他にもVirtualBox特有な部分はあるので後述する。


各種設定

個人的に情報を探すのに手間取ったところ、これは便利と思ったところを抜粋する。とりあえず、筆者のconfiguration.nixはまだ小さいのでここに張っておく。ぱっとみで雰囲気は分かると思う。

{ config, pkgs, ... }:

let
all-hies = import (fetchTarball "https://github.com/infinisil/all-hies/tarball/master") {};
in
{
imports =
[
./hardware-configuration.nix
];

boot.loader.grub.enable = true;
boot.loader.grub.version = 2;
boot.loader.grub.device = "/dev/sda";
boot.initrd.checkJournalingFS = false;

fileSystems."/vboxshare" = {
fsType = "vboxsf";
device = "vboxshare";
options = [ "rw" "nofail" ];
};

networking.hostName = "yakotokay-nixos";

fonts = {
enableDefaultFonts = true;
enableFontDir = true;
enableGhostscriptFonts = true;
fontconfig.enable = true;
fonts = with pkgs; [
source-code-pro
noto-fonts-cjk
];
};

i18n = {
inputMethod.enabled = "ibus";
inputMethod.ibus.engines = with pkgs.ibus-engines; [ mozc anthy ];
consoleKeyMap = "jp106";
defaultLocale = "ja_JP.UTF-8";
};

time.timeZone = "Asia/Tokyo";

programs.bash.enableCompletion = true;

environment.interactiveShellInit = ''
export PATH="$PATH:$HOME/.local/bin";
'';
environment.variables = {
EDITOR="emacs";
BROWSER="google-chrome-stable";
};

nixpkgs.config.allowUnfree = true;

environment.systemPackages = with pkgs; [
wget curl git gcc gnumake binutils pkg-config zip unzip xclip htop
openal powershell byobu gnome3.gnome-terminal xorg.xev xorg.xprop
vscode google-chrome evince emacs texlive.combined.scheme-full
rustup stack dotnet-sdk fstar (all-hies.selection { selector = p : { inherit (p) ghc865; };})
rofi nitrogen xmobar trayer volumeicon
];

sound.enable = true;
hardware.pulseaudio.enable = true;

virtualisation.virtualbox.guest.enable = true;

services.xserver.enable = true;
services.xserver.layout = "jp";
services.xserver.xkbOptions = "ctrl:nocaps";
services.xserver.windowManager.xmonad.enable = true;
services.xserver.windowManager.xmonad.enableContribAndExtras = true;
services.xserver.windowManager.default = "xmonad";
services.xserver.desktopManager.xterm.enable = false;
services.xserver.desktopManager.default = "none";
services.xserver.displayManager.lightdm.enable = true;
services.xserver.displayManager.sessionCommands = ''
nitrogen --set-scaled /home/yakotokay/Downloads/ui8VNo.jpg
trayer --edge top --align center --SetDockType true --SetPartialStrut false --expand true --width 10 --transparent true --tint 0x000000 --height 14 &
volumeicon &
ibus-daemon -drx
rofi &
emacs &
gnome-terminal &
google-chrome-stable &
'';

# services.compton = {
# enable = true;
# fade = true;
# activeOpacity = "0.7";
# inactiveOpacity = "0.5";
# shadow = true;
# fadeDelta = 4;
# opacityRules = [
#
# ];
# };

programs.tmux.enable = true;

users.users.yakotokay = {
isNormalUser = true;
createHome = true;
extraGroups = [ "wheel" "vboxsf" ];
};

system.stateVersion = "19.03";

}


日本語入力

i18n

この項で最初に説明しておくが、上のリンクのコードについてoptionがユーザーが設定できる部分、configが実装だと考えれば良いと思う。

Nix言語は当然読めるようになった方がいいが、案外雰囲気でなんとかなるものである。

config部分で以下のように書かれているのでわざわざ自分で環境変数をこのように設定する必要はない。なかった。

environment.variables = {

GTK_IM_MODULE = "ibus";
QT_IM_MODULE = "ibus";
XMODIFIERS = "@im=ibus";
};

オプションはNixOS Optionで検索することが出来る。

i18nで検索するとinputMethod.ibus.enginesがあるので説明を読めばわかる。

i18n = {

inputMethod.enabled = "ibus";
inputMethod.ibus.engines = with pkgs.ibus-engines; [ mozc anthy ];
consoleKeyMap = "jp106";
defaultLocale = "ja_JP.UTF-8";
};

こう。ただし、筆者の環境ではmozcは動作しなかったのでAnthyを使っている。誰か理由を教えて欲しい。


VirtualBox Guest Additon

virtualbox-guest

virtualisation.virtualbox.guest.enable = true;

これだけで有効になる。

ホストOSとファイル共有したい場合はfileSystemで検索すると良い。

fileSystems."/vboxshare" = {

fsType = "vboxsf";
device = "vboxshare";
options = [ "rw" "nofail" ];
};

上のように書いた場合、VirtualbBoxの設定はこのようにすれば良い。

vboxshare.png

これでNixOS側からは/boxshare,Windows側からは指定したフォルダーのパスで共有フォルダへの読み書きが出来る。ああ、ユーザーをvboxsfグループに追加するのを忘れないように。

users.users.yakotokay = {

isNormalUser = true;
createHome = true;
extraGroups = [ "wheel" "vboxsf" ];
};


雑多

compton

services.compton = {

enable = true;
fade = true;
activeOpacity = "0.7";
inactiveOpacity = "0.5";
shadow = true;
fadeDelta = 4;
};

なぜ皆Window透過したがるのか。男の子は透け透けが好き。


おわりに

筆者はこれから日常生活でNixOSを使っていく予定であり、まだ書きたいこともあるので追記編集していくと思われる。またXMonadに関してはそのうち単独で記事にしたいと思っている。あと一番大事なこと言うと、configuration.nixに変更を加えたら、こまめにnixos-build switchしておこう。原因の特定がしやすくなる。(それはそう)

ロールバックも出来るから凄い。あとconfiguration.nixファイル一つで環境を再構成出来るところとか。おわります。

nixos1.gif