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 に配置して、著者と読者が後で使用できるようにしました。