NixOSの導入と初期設定
もともとBasixを利用していましたが、アップグレード時に、色々と設定が壊れたりしたので、
移行を検討するにあたって、前から気になっていたNixOSを手元の余っているノートPCにインストールして初期設定までやってみます。
インストール
インストール手順
インストール方法の詳細は以下の記事が参考になります。
注意:
Minimal ISO imageはGUIが含まれません。マウス操作やデスクトップ環境が必要な場合は、Graphical ISO imageを選択してください。
パッケージのインストール方法まとめ
NixOSでは主に以下4つの方法でパッケージを管理できます。用途や好みに応じて使い分けましょう。
-
nix-env(非推奨)
- 例:
nix-env -iA nixpkgs.htop - パッケージを個別にインストールする従来型の方法(推奨されません)
- 例:
-
configuration.nix(宣言型・グローバル)
- 例:
/etc/nixos/configuration.nixに以下を追記し、sudo nixos-rebuild switchを実行environment.systemPackages = with pkgs; [ htop git ];
- 例:
-
home-manager(宣言型・ローカル)
- 例:
~/.config/home-manager/home.nixに以下を追記し、home-manager switchを実行home.packages = with pkgs; [ htop git ];
- 例:
-
nix shell / nix run(一時利用)
- 例:
nix shell nixpkgs#htopで一時的にhtopを利用 - 例:
nix run nixpkgs#htopでhtopを即時実行
- 例:
よく使うインストール例
vimのインストール
初期状態ではviやvimが入っていない場合があるため、まずnanoで設定ファイルを編集し、vimを追加します。
sudo nano /etc/nixos/configuration.nix
Emacsライクなキーバインド(C-fで検索、C-n/C-pで移動など)が使えます。
vimを追加したら、C-oで保存、C-xで終了します。
environment.systemPackages = with pkgs; [
vim
];
追加後は、必ずsudo nixos-rebuild switchで反映しましょう。
home-managerの導入
home-managerはデフォルトで入っていないため、以下の手順で導入します。
詳細は公式ドキュメントや解説記事も参照してください。
- https://zenn.dev/kuu/articles/20250204_introduce-home-manager
- https://nix-community.github.io/home-manager/#sec-install-nixos-module
チャンネルの追加
sudo nix-channel --add https://github.com/nix-community/home-manager/archive/master.tar.gz home-manager
sudo nix-channel --update
グローバル設定の変更
sudo vim /etc/nixos/configuration.nix
{
imports = [
# 既存の内容は残して、以下を追記
<home-manager/nixos>
];
}
設定の反映と初期化
# グローバルの設定を反映
sudo nixos-rebuild switch
# home-managerでインストールできる状態にする
nix-shell -p home-manager
# home-managerの初期化
home-manager init --switch
これで~/.config/home-manager/home.nixが作成されます。以降はこのファイルを編集してローカル設定を管理します。
パッケージ検索・インストールの流れ
まずconfiguration.nixに以下を追記し、リビルドして検索機能を有効化します。
nix.settings.experimental-features = [ "nix-command" "flakes" ];
パッケージをインストールする前に、以下のコマンドで存在を検索できます。
部分一致だと大量にヒットするため、正規表現での絞り込みが便利です。
# 部分一致
nix search nixpkgs git
# 完全一致
nix search nixpkgs "^git$"
インストール時は、以下のファイルを編集します。
vim ~/.config/home-manager/home.nix
例として、以下のパッケージを追加します。
# `with pkgs` を追記しない場合は、 `pkgs.nkf` のように書くこと
home.packages = with pkgs; [
nkf
python3
]
# gitはその他の設定もあるので、以下の形式が推奨とのこと
program.git = {
enable = true;
# userName = "YourName";
# userEmail = "yoru-mail@sample.com";
# extraConfig = {
# init.defaultBranch = "main";
# }
}
以下のコマンドでインストールを反映します。
# インストールする前に、必ずこのコマンドは実行しておくこと
nix-shell -p home-manager
# インストール開始
home-manager switch
guake
もともとターミナルとしてguakeを利用していましたが、下記理由のためGNOME環境のNixOSとの相性が良くないので、ddtermを利用するようにします。
guakeはX11向けに作成されているため、Wayland環境では、F12によるトグルがうまく動作しないようです。
回避策としてguake-toggleをグローバルキーバインドに設定する方法もありますが、Waylandの仕様と相性が悪く、実用的ではありません。
ddtermの導入
Wayland対応のドロップダウンターミナルとしてddtermが便利です。
グローバル設定ファイルに追記し、リビルドします。
# 設定ファイルを開く
sudo nano /etc/nixos/configuration.nix
environment.systemPackages = with pkgs; [
# 既存の項目はそのままにして以下を追記
gnomeExtensions.ddterm
];
リビルド後、以下のコマンドで有効化します。
# リビルド
sudo nixos-rebuild switch
# 有効化
gnome-extensions enable ddterm@amezin.github.com
有効化後はF12でddtermが開きます。
ddtermのおすすめ設定
デフォルト設定に違和感がある場合は、右クリック→Preferencesで以下のように調整できます。
- Position and Size
- Window size:
100%
- Window size:
- Colors
- Theme variant:
Dark - Background opacity:
60%
- Theme variant:
CapsLockとControlキーの入れ替え
キーボードのCapsLockキーと左Controlキーを入れ替える設定例です。
まず、dconfを有効化するためにグローバル設定ファイルを編集します。
# 設定ファイルを開く
sudo nano /etc/nixos/configuration.nix
# 存在しなければ以下の設定を追加
programs.dconf.enable = true;
# リビルドする
sudo nixos-rebuild switch
ローカル設定には以下を追加します。
# 設定ファイルを開く
vim ~/.config/home-manager/home.nix
# 以下の設定を追加
dconf.settings = {
"org/gnome/desktop/input-sources" = {
# 完全に上書きする場合は `ctrl:nocaps` とする
xkb-options = [ "ctrl:swapcaps" ];
};
};
# インストールする前に、必ずこのコマンドは実行しておくこと
nix-shell -p home-manager
# 設定反映
home-manager switch
Unfreeパッケージのインストール
Google ChromeやVSCodeなど、ライセンスの関係でデフォルトでは有効化されていない「Unfree」パッケージをインストールするには、明示的な許可設定が必要です。
-
home.nixの冒頭でlibをインポートします - 許可したいパッケージ名をリストで指定します
{ pkgs, config, lib, ... }:
{
# 例: google-chromeとvscodeのみインストールを許可する
nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
"google-chrome"
"vscode"
];
home.packages = with pkgs; [
google-chrome
vscode
];
}
ワンポイント
セキュリティや再現性の観点から、allowUnfree = true;で全許可するよりも、必要なパッケージだけを個別に許可するのが推奨です。
設定後は、home-manager switch で反映してください。
日本語入力ソースの追加(Fcitx5 + Mozc)
日本語入力ソースを追加します。
グローバル設定ファイルに以下を追記し、リビルドします。
# /etc/nixos/configuration.nix の一部
i18n.inputMethod = {
enable = true;
type = "fcitx5";
fcitx5.addons = with pkgs; [
fcitx5-mozc
fcitx5-gtk
];
};
設定反映後、一度再ログインするか、fcitx5を手動で起動してください。
- 入力切り替えは
Ctrl + Spaceで行えます - GTKアプリでも日本語入力を有効にしたい場合は
fcitx5-gtkの追加を忘れずに
日本語キーボードの固定設定
私の環境では、システム設定から日本語キーボード(jp配列)を選択しても、再起動やログインのたびに英語(us配列)に戻ってしまうようなので、これを恒久的に変更する設定を追加します。
設定手順
(1) グローバル設定ファイルを編集します。
sudo nano /etc/nixos/configuration.nix
(2) libがインポートされていない場合は、先頭の引数に追加してください。
{ config, pkgs, lib, ... }
(3) dconfの設定例(programs.dconf)を追加・修正します。
programs.dconf = {
enable = true;
profiles.user.databases = [
{
lockAll = true; # 設定が他から上書きされないようロック
settings = {
"org/gnome/desktop/input-sources" = {
sources = [ (lib.gvariant.mkTuple [ "xkb" "jp" ]) ];
};
};
}
];
};
(4) 設定を反映します。
sudo nixos-rebuild switch
ポイント
lockAll = true;を指定することで、GUIや他のツールから設定が上書きされるのを防げます。- GNOME以外のデスクトップ環境の場合は、設定方法が異なる場合があります。
この設定で、再起動や再ログイン後も日本語キーボード配列が維持されます。
Nix Flakesの使い方
Nix Flakesは、プロジェクトごとに依存パッケージや開発環境を宣言的・再現可能に管理できるNixの新機能です。従来のnix-shellよりも柔軟で、言語やツールに依存しない環境構築が可能です。
Flakesの特徴
- 依存関係の固定: どのバージョンのパッケージを使うか明示でき、開発者間で同じ環境を再現できます。
-
言語非依存:
package.jsonやrequirements.txtのような特定言語の仕組みではなく、あらゆるツール・言語の依存を一元管理できます。 - バージョン管理と共有: GitHubなどでflake.nixを共有すれば、誰でも同じ開発環境を即座に再現できます。
使い方例:Node.js開発環境の固定
(1) プロジェクトディレクトリを作成し、flake.nixを用意します。
mkdir node-project
cd node-project
touch flake.nix
(2) flake.nixに以下の内容を記述します(例:Node.js 22とpnpmを利用)。
{
description = "Node.js development environment";
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11";
outputs = { self, nixpkgs }: {
devShells.x86_64-linux.default = let
pkgs = import nixpkgs { system = "x86_64-linux"; };
in pkgs.mkShell {
packages = with pkgs; [
nodejs_22
nodePackages.pnpm
];
shellHook = ''
echo "Node.js $(node --version) ready"
'';
};
};
}
(3) Flake環境を有効化します。
nix develop
これで、指定したNode.jsやpnpmが使える開発シェルが起動します。exitで抜けられます。
ポイント
- Flakesを使うには
nix.settings.experimental-features = [ "nix-command" "flakes" ];が有効になっている必要があります。- 他の言語やツールも同様に
packagesへ追加するだけでOKです。flake.nixはGit管理しておくと、チームやCI/CDでも同じ環境を再現できます。
自作スクリプトの登録
NixOSでは、PATH環境変数に自作スクリプトのディレクトリを追加するのではなく、以下の様に設定を追加する方式が推奨されているようです。
home-managerを利用してローカル環境にシェルスクリプトを登録してみます。
まずは、スクリプトを格納するディレクトリを作成します。
mkdir ~/.config/home-manager/scripts
以下のスクリプトを作成します。
# ~/.config/home-manager/scripts/sl.nix
{ pkgs, ... }:
{
home.packages = [
(pkgs.writeShellScriptBin "sl" ''
echo \(*^o^\)
)
];
}
home-managerでビルドして設定を反映すると、上記のコマンドが sl として利用可能になります。
シェルスクリプト以外の登録
少し手間ですが、以下の様にすると他言語によるスクリプトを登録することができます。
# ~/.config/home-manager/scripts/hello.nix
{ pkgs, ... }:
{
home.packages = [
(pkgs.writeShellScriptBin "hello" ''
exec ${pkgs.python3}/bin/python3 ${./python/hello.py} "$@"
)
];
}
# ~/.config/home-manager/scripts/python/hello.py
print("Hello")
こちらも home-managerでビルドして設定を反映すると、上記のコマンドが利用可能になります。
まとめ・所感
NixOSのパッケージ管理はかなり癖がありますが、仕組みを理解すればすぐに慣れる印象でした。
どのパッケージがインストールされているかを設定ファイルを見てすぐに把握できるため、管理や再現性の面でも非常に便利です。
今回は、環境構築とパッケージ管理の基本を一通り学ぶことができたので、ひとまずここまでとします。