NisOS とは?#
Nix は、独自の方法でパッケージ管理とシステム構成を行うツールです。再現性があり、宣言的で信頼性の高いシステムを構築できます。
NixOS は、Nix パッケージマネージャーの上に構築された Linux ディストリビューションです。宣言的な構成を使用し、信頼性のあるシステムアップグレードを可能にします。Nix は、現在の安定版と最新の開発に従った不安定版を含むいくつかの公式パッケージ「チャネル」を提供しています。NixOS には、DevOps やデプロイメントタスク用のツールが用意されています。
なぜ NixOS なのか?#
今、あなたには次のようなニーズがあります:ローカルでテストサーバーにプロジェクトをデプロイし、テストが完了した後にクラウドサーバー(例えば AWS)にデプロイしたい。では、どのようにしてテストが有効であることを保証するのでしょうか?
言い換えれば、2 台のサーバーの環境をどのように一致させるか?Docker を使用することを考えるかもしれませんが、Docker の欠点は、そのイメージが不変であり、イメージを更新するには再構築が必要で非常に面倒です。では、環境を一致させつつ柔軟性を失わない方法はあるのでしょうか?答えは NixOS です。
NixOS のパッケージマネージャーは非常に特別です。宣言的で、すべてのパッケージは/etc/nixos/configuration.nix
にあり、必要なパッケージを宣言し、nixos-rebuild switch
を実行することでインストールできます。環境を一致させたい場合は、/etc/nixos/configuration.nix
を別のサーバーにコピーし、nixos-rebuild switch
を実行するだけです。
NixOS を使用してオープンソースプロジェクトをデプロイすることは、DevOps の良い練習です。この文書では、サーバー用の最小限の NixOS をインストールする方法について説明します。
準備作業#
サーバーであるため、デスクトップ環境は使用せず、最小限の NixOS を使用します。NixOS イメージのダウンロードリンクは https://nixos.org/download.html にあります。
ブログ主のテストサーバーは ESXi (ESX) を仮想化プラットフォームとして使用し、使用している NixOS のバージョンは22.11
です。
仮想マシンの構成は以下の通りです:
- CPU: 4vCPU(EPYC 7302)
- RAM: 8GB
- Disk: 50GB(HDD)
- UEFI ブート
インストール#
最小限のイメージのインストールにはグラフィカルインターフェースがなく、コマンドラインインターフェースのみで、Linux 初心者には少し難しいかもしれません。しかし、以下の手順に従えば、大きな問題はないはずです。
仮想マシンの電源を入れ、UEFI インターフェースに入り、NixOS 22.11.4426 Installer
(デフォルトオプション)を選択してインストール環境に入ります。
バージョンの違いにより、異なる場合があります。
すべてが順調であれば、<<< NixOS Stage 1 >>>
と<<< NixOS Stage 2 >>>
を経て、コマンドラインインターフェースに入るはずです。
sudo su
を入力して root ユーザーに切り替え、以降の操作を行います。
パーティション#
cfdisk
を入力してパーティションインターフェースに入り、以下のパーティションスキームに従ってパーティションを作成します:
- GPT パーティションテーブルを選択
- 最初に
/boot
パーティションを新規作成し、サイズは少なくとも512MB
、ファイルシステムはEFI System
- メモリが少ない場合は、スワップパーティションを作成し、サイズはメモリの 2 倍、ファイルシステムは
Linux swap
- 残りのスペースを使って
/
パーティションを作成し、ファイルシステムはLinux filesystem
最初のパーティションは
EFI System
でなければなりません。NixOS は EFI パーティションを必要とします。
以下はパーティションの例です:
パーティションが完了したら、必ず Write の後に Quit してください。そうしないと、パーティションは有効になりません。
lsblk
コマンドを使用してパーティションの状況を確認できます。
次に、パーティションをフォーマットします。
mkfs.ext4 -L nixos /dev/sda3
。/
パーティションをフォーマットし、ラベルを付けて後の操作を容易にします。- スワップパーティションがある場合は、
mkswap -L swap /dev/sda2
を入力してスワップパーティションをフォーマットします。 mkfs.fat -F 32 -n boot /dev/sda1
。/boot
パーティションをフォーマットします。
注意:上記のパーティションはブログ主のものであり、あなたのパーティションが異なる場合は、コマンド内のパーティション番号を変更する必要があります。
次に、パーティションをマウントします。
mount /dev/disk/by-label/nixos /mnt
mkdir -p /mnt/boot
mount /dev/disk/by-label/boot /mnt/boot
swapon /dev/sda2
lsblk
を入力すると、以下のような出力が表示されるはずです:
ファイルの生成#
次に、NixOS の設定ファイルを生成します。
nixos-generate-config --root /mnt
今、nixos-install
を入力してインストールを開始します。
インストールプロセスではネットワークが必要ですので、必ずネットワークが通じていることを確認してください。インストールプロセスの予想所要時間は 5〜10 分で、具体的な時間はネットワーク速度や CPU 性能などによって異なります。
インストールプロセスの最後の段階で、root パスワードの入力を求められます。パスワードを入力すると、インストールプロセスは終了します。
reboot
を入力して再起動し、インストールメディアを取り外します。
(一時的に)ユーザーを追加#
再起動後、コマンドラインインターフェースに入り、以前のパスワードを入力して root ユーザーにログインします。
nixos login: root
password:
パスワードを入力する際、何の文字も表示されないのは正常な現象です。
新しいユーザーを作成することをお勧めします。日常の操作が楽になります。root ユーザーはシステム管理のみに使用します。
非 root ユーザーを使用することは良い習慣であり、安全上のリスクや破壊的な誤操作を避けることができます。
ただし、ここで示す操作は NixOS のベストプラクティスではありません。NixOS のユーザー管理は宣言的であり、コマンドラインでユーザーを作成すべきではありません。
正しい方法については次のセクション「ユーザーを sudoer リストに追加」を参照してください。
useradd -c 'admin' -m nk
passwd sh # パスワードを設定
useradd
コマンドのパラメータの意味は以下の通りです:
-c
:ユーザーの備考情報
-m
:ユーザーのホームディレクトリを作成
nk
:ユーザー名(カスタマイズ可能)
今、exit
コマンドを使用して root ユーザーから退出し、新しいユーザーでログインできます。
nk
はユーザー名です。あなたのユーザー名がnk
でない場合は、変更してください。
最後に、uname -a
を入力すると、以下のような出力が表示されるはずです:
Linux nixos 5.15.133 #1-NixOS SMP Wed May 24 16:36:55 UTC 2023 x86_64 GNU/Linux
あなたが見るカーネルバージョンが
5.15.133
でない場合でも、慌てないでください。これは NixOS のカーネルが動的に生成され、毎回インストール時に新しいカーネルが生成されるためです。
ユーザーを sudoer リストに追加#
便利さのために、新しいユーザーを sudoer リストに追加する必要があります。sudoer リストを変更したいと思うかもしれませんが、NixOS では sudoer リストを変更する必要はなく、ユーザーをwheel
グループに追加するだけで済みます。そして、NixOS でこの操作の正しい方法は、/etc/nixos/configuration.nix
ファイルを変更することです。
あなたは vim を使って設定ファイルを変更したいと思うかもしれませんが、NixOS はデフォルトで vim をインストールしておらず、nano がデフォルトでインストールされています。したがって、最初に
nix-shell -p vim
を使用して一時的に vim をインストールする必要があります。パッケージマネージャーの詳細な使い方については、後で説明します。
具体的な手順は以下の通りです:
-
users.users
フィールドを見つけます(最小限のインストールの設定ファイルでは、このフィールドはコメントアウトされています)。 -
新しいユーザーを作成します。例えば
nk
という名前で、wheel
グループに追加します。つまり、次のような設定を記述します:
users.users.nk = {
isNormalUser = true;
extraGroups = [ "wheel" ];
};
- 設定ファイルを保存し、
nixos-rebuild switch
コマンドを実行して設定を有効にします。
新しいユーザーのパスワードを設定するために
passwd
コマンドを忘れずに使用してください。
よく使うツールのインストール#
NixOS の特異性は、パッケージマネージャーの特殊性にあります。まず、NixOS のパッケージマネージャーについて簡単に理解する必要があります。
NixOS のパッケージマネージャーは Nix で、3 つのインストール方法があります:
nix-env
:ユーザーディレクトリにインストールし、現在のユーザーにのみ有効です。nix-shell
:一時的にインストールし、現在のシェルにのみ有効です。.nix
設定ファイルを変更する:システムディレクトリにインストールし、すべてのユーザーに有効です。
apt
のようにnix-env
を使用することはできません。なぜなら、この方法にはいくつかの欠点があるからです:
- 依存関係のエラー:
nix-env
コマンドはデフォルトでソフトウェアパッケージの依存関係を解決し、自動的に依存項目をインストールしようとします。しかし、この自動解決は不一致や予測不可能な結果を引き起こす可能性があります。 - 環境の隔離とバージョン管理の混乱:
nix-env
コマンドを使用して手動でソフトウェアパッケージ環境を管理すると、環境が混乱したり衝突したりする可能性があります。 - 共有性と再現性の喪失:
nix-env
コマンドでソフトウェアパッケージを管理する方法は、明確さや可読性が不足する可能性があります。設定ファイルには、より詳細なドキュメントやコメントを含めることができ、ソフトウェアパッケージ環境に関する情報をより良く記録し共有できます。
私たちが NixOS を使用する目的を考慮すると、私たちは.nix
設定ファイルを変更する方法を優先します。
設定ファイルを変更してインストールする#
サーバーとして、明らかにほとんどの人が必要とするソフトウェアは以下の通りです:
- openssh
- vim
- wget
- curl
デフォルトの NixOS 設定ファイルでenvironment.systemPackages
を見つけ、上記のソフトウェアパッケージを追加します。つまり、次のように変更します:
あなたは vim を使って設定ファイルを変更したいと思うかもしれませんが、NixOS はデフォルトで vim をインストールしていないため(そうでなければ、なぜインストールする必要があるのでしょうか)、最初に
nix-shell -p vim
を使用して一時的に vim をインストールする必要があります。
environment.systemPackages
フィールドに以下の内容を追加します:
environment.systemPackages = with pkgs; [
vim
wget
curl
openssh
];
この部分はデフォルトでコメントアウトされているので、最初にコメントを解除し、その中に上記の内容を追加する必要があります。
environment.systemPackages = with pkgs;
はデフォルトの書き方であり、変更しないでください。
これにより、openssh を除くソフトウェアがインストールされます。openssh のインストールは少し複雑で、設定ファイルをさらに変更する必要があります。
openssh の設定#
services.openssh
フィールドに以下の内容を追加します:
最小限のインストールの NixOS にはこの部分の設定がないため、自分で追加する必要があります。
services.openssh = {
enable = true;
permitRootLogin = "no"; // オプション:Rootユーザーのログインを無効にする
passwordAuthentication = true; // オプション:パスワード認証を有効にする
};
設定ファイルを保存した後、nixos-rebuild switch
コマンドを実行して設定を有効にします。
このコマンドを実行して openssh の状態を確認できます:
sudo systemctl status sshd
SSH サービスが実行中であれば、その状態は「active」と表示されるはずです。
将来的にこの設定ファイルが必要になる可能性があるため、この設定ファイルを IPFS に保存して、ブログ主と読者が使用できるようにしました。