NIX OS入門

## そもそもNixとは？
### OSとしてのNIX OS
NixOSは、構成管理とパッケージ管理を統合した、機能豊富なLinuxディストリビューションです。NixOSは、他のディストリビューションと異なる特徴を持っており、システム構成やアプリケーションの管理方法が独自です。

特徴:
- Declarative Configuration: NixOSは、システムの構成を宣言的に定義します。これは、コンフィグレーションファイルやスクリプトを編集する代わりに、設定オプションを変更するだけでシステムを変更できることを意味します。
- Atomic Upgrades and Rollbacks: NixOSは、システム全体をアトミックにアップグレードまたはロールバックできる機能を提供します。これにより、システムの安定性と信頼性が向上します。
- Isolation and Reproducibility: アプリケーションや環境は、Nixパッケージマネージャを使用して分離され、再現性のある方法で管理されます。これにより、異なるバージョンのパッケージを同じシステム上で簡単に実行できます。

### パッケージ管理ツールとしてのNIX
Nixは、パッケージ管理システムであり、NixOSだけでなく他のLinuxディストリビューションやUnix系オペレーティングシステムでも使用できます。Nixは、従来のパッケージ管理システムとは異なる方法でパッケージを管理します。

特徴:
- Functional Package Management: Nixは、パッケージの依存関係を含む全体の環境を関数として表現します。これにより、環境の変更や異なるバージョンのパッケージの同居が容易になります。
- Atomic Transactions: パッケージのインストールやアンインストールは、トランザクションとしてアトミックに実行されます。これにより、環境の一貫性と信頼性が保たれます。
- Versioning and Isolation: 異なるバージョンのパッケージは、互いに干渉せずにシステム内で共存できます。これにより、アプリケーション間の依存関係が問題なく管理されます。


## NIX OSのインストール方法
公式ダウンロードサイトからNIXOSをダウンロード。
ページ上部のNixはパッケージマネージャなので注意する。

https://nixos.org/download

インストーラは手元の環境に一致するものをダウンロード。
Ubuntuなど一般的なLinuxGUIインストーラの手順と同じなので、手順に沿ってインストールする。

## configファイルの分類

- ユーザー全員にインストールしたい場合
    - /etc/nixos/configuration.nixに設定を書く。

- 特定のユーザだけインストールしたい場合
    - nix-envコマンドで直接インストールする。
    - ~/.config/nixpkgs/config.nixに設定を書く。

- あるユーザーのある開発環境だけ
    - nix-shellコマンドを使う。
    - nix-shell -p hogehoge とすると、hogehogeのあるshell環境ができる。
    - exitをするとそのhogehogeへの参照が消える。

## 最初にやること。
### 初期設定のために
各種configを書き換えるために、vimをインストールする。
nix-shellとは、あるユーザーのある開発環境だけに作用するパッケージでexitすると参照が消えるもの。
他にも一時的に使用したいものがある場合はこれを使う。
```nix-shell -p vim```


### ハードウェア情報を反映する。
nix-hardwareからお使いのハードウェア情報を調べる。

https://github.com/NixOS/nixos-hardware

nixos-hardwareのチャンネルを追加してアップデートする。
```
$ sudo nix-channel --add https://github.com/NixOS/nixos-hardware/archive/master.tar.gz nixos-hardware
$ sudo nix-channel --update
```
configuration.nix上部のconfigurationを読んでいる部分を以下のように書き換える。

```
$ sudo vim /etc/nixos/configuration.nix
```
```
imports = [
  <nixos-hardware/lenovo/thinkpad/x1/10th-gen>
  ./hardware-configuration.nix
];
```
リビルドする。
```
sudo nixos-rebuild switch 
```

### 各種packageをインストールする。
configuration.nixを変更してパッケージを宣言する。
```
$ sudo vim /etc/nixos/configuration.nix
```
configration.nix下部のenvironment.systemPackagesに好きなパッケージを追加する。
パッケージの名前は以下のサイトから検索できる。

https://search.nixos.org/packages

以下サンプル
```
  environment.systemPackages = with pkgs; [
    vscode wireshark
    gnumake automake cmake
    gcc gdb nodejs
    tilix
    brave 
    zoom-us slack discord
    docker-compose
    fzf
    direnv
    gnupg
    mpd
    htop
  ];
```

### 日本語入力
他のi18nの記述周辺に以下の設定を入れる。
```
$ sudo vim /etc/nixos/configuration.nix
```
```
 i18n.inputMethod = {
     enabled = "fcitx5";
     fcitx5.addons = with pkgs; [
         fcitx5-mozc
         fcitx5-gtk
     ];
 };
```
リビルドし、再起動する。
```
sudo nixos-rebuild switch 
sudo reboot now
```
その後以下のコマンドを用いてmozcを有効化する。
```
$ fcitx5-configtool
```
画面右側の検索バーからmozcを選んで左に移す。
デフォルトのIME切り替えはCtr＋Spa
![Screenshot from 2023-08-30 10-37-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291593/d10ce4a9-68ed-67b5-ee4f-5969a6c3c684.png)


## 指紋認証有効化
configに``fprintd``パッケージを追加する。追加箇所は他のパッケージと同じところ。
```
$ sudo vim /etc/nixos/configuration.nix
```
任意の場所に以下の設定をいれる。
```
services.fprintd.enable = true;
services.fprintd.tod.enable = true;
services.fprintd.tod.driver = pkgs.libfprint-2-tod1-vfs0090; 
```
リビルドして再起動。その後gnomのSettingのUserにfingureprintが出るので登録する。
sudo権限の指紋認証も自動で設定される。
```
sudo nixos-rebuild switch 
sudo reboot now
```

### flakes

```
  nix = {
    settings = {
      experimental-features = ["nix-command" "flakes"];
    };
  };
```

任意のフォルダで以下を実行することで，flakeのテンプレートを入手可能
```
nix flake init --template github:kino-ma/flake-templates#devshell
vim flake.nix
nix develop
```


### home-manager

```
  imports =
    [ # Include the results of the hardware scan.
	<nixos-hardware/lenovo/thinkpad/x1/10th-gen>	
	./hardware-configuration.nix
	<home-manager/nixos>
    ];

```

```
  home-manager.users.feles = { config, pkgs, ... }: {
    imports = [
      /home/feles/dotfiles/home.nix
      #/home/feles/.config/nixpkgs/custom.nix
    ];

    home.homeDirectory = "/home/feles";
  };
```





## 基本的なコマンド
-　特定のユーザにインストールする場合：``nix-env``
-　/etc/nixos/configuration.nixを編集した後に打つもの。：``sudo nixos-rebuild switch``
-　No space left on deviceと言われたとき：``sudo nix-collect-garbage -d``
-　それでもだめなとき：``sudo /run/current-system/bin/switch-to-configuration boot``

以下学びながら追記していきます。