見出し画像

僕が特におすすめしたいLinuxディストリビューション、NixOS

いつも僕の記事を読んでくださる皆様、本当にありがとうございます。

ガジェットやハードウェアの深い魅力、そして日常を少しだけ豊かにするテクノロジーについて、僕なりの視点で発信し続けてきました。

コツコツと書き溜めてきた記事への「スキ」が積み重なり、多くの方にフォローしていただけるようになったことは、日々の執筆活動において何よりのモチベーションになっています。

今月に入り、ありがたいことにnoteのフォロワーさんが500人という大きな節目を迎え、累計の「スキ」の数も2000を突破しました。

これもひとえに、いつも読んでくださる皆様のおかげです。

今日は、少しだけ視点を変えさせてください。僕が愛してやまない、そして僕のデジタルライフの「根幹」を支え続けているソフトウェアの世界について、どうしても熱く語りたいのです。

みなさんは、Linuxディストリビューションに何を求めますか? 軽快な動作、最新のパッケージ、美しいUI、それとも安定性でしょうか。Ubuntu、Fedora、Arch Linux……世界には星の数ほどのディストリビューションが存在し、それぞれが素晴らしいコミュニティと哲学を持っています。

僕も過去に様々なOSを渡り歩いてきました。しかし、最終的にたどり着き、今や「これ以外の選択肢は考えられない」とまで惚れ込んでいるOSがあります。

それが「NixOS」です。

画像

学習コストの高さから敬遠されがちなこのOSですが、その壁を越えた先には、他のいかなるOSでも味わえない「絶対的な安心感」と「圧倒的な美しさ」が待っています。今日は、なぜ僕がここまでNixOSを愛し、皆さんにおすすめしたいのか、その理由を6000字の熱量でお届けします。


① NixOSの最大の特徴「宣言的なシステム管理」と、他にはないメリット

NixOSを語る上で絶対に避けて通れない、そして最大の魅力が「宣言的(Declarative)なシステム管理」です。

従来のOS(WindowsやmacOS、そしてUbuntuやFedoraなどの一般的なLinux)は、「命令的(Imperative)」なアプローチを採用しています。 例えば、新しいソフトウェアをインストールしたいとき、私たちはターミナルにこう打ち込みます。 sudo apt install firefox あるいは、設定ファイルをエディタで開き、一行一行書き換えて保存します。これはつまり、「システムに対して『これをしろ』と順番に命令を与え続け、その結果として今のシステムの状態が存在している」ということです。

一見当たり前のように思えますが、この「命令の積み重ね」には大きな罠が潜んでいます。 長く使えば使うほど、「いつ」「誰が」「どのような命令を下したか」が分からなくなっていくのです。不要な依存関係のゴミが溜まり、手動でいじった設定ファイルがどこにあるか忘れ、ある日突然アップデートでシステムが起動しなくなる。そして「なぜか動かない」「前は動いていたのに」と頭を抱える……。いわゆる「環境が汚れる」という現象です。

NixOSは、この根本的な問題を「宣言的」なアプローチによって完全に解決しました。

NixOSにおけるシステム構築は、たった一つの(あるいは分割された少数の)テキストファイルに、「最終的にシステムがどうあるべきか(What)」を記述するだけです。 「Firefoxがインストールされているべき」「タイムゾーンは日本であるべき」「ユーザー『hatake』が存在し、この権限を持つべき」……。

設定ファイルを書いた後、nixoses-rebuild switch という魔法のコマンドを一度叩くだけで、パッケージマネージャである「Nix」が、その設定ファイルに書かれた理想の状態と寸分違わぬシステムを、自動的に、そして決定論的に組み上げてくれます。

ここから生まれるメリットは計り知れません。

1. 究極の「再現性(Reproducibility)」

設定ファイルが同じであれば、地球上のどのPCにインストールしても、全く同じ環境が寸分の狂いもなく構築されます。「僕の環境では動くのに……」という、エンジニアやLinuxユーザーを長年苦しめてきた呪いの言葉が、NixOSの世界には存在しません。

2. 環境を汚さない「イミュータブル(不変)な設計」

NixOSは、すべてのソフトウェアとライブラリを /nix/store という特殊なディレクトリに、暗号化ハッシュを用いた一意のパスで保存します。 これにより、「AというソフトはライブラリXのバージョン1.0を要求し、BというソフトはライブラリXのバージョン2.0を要求する」といった、いわゆる「依存関係地獄(Dependency Hell)」が原理的に発生しません。異なるバージョンのライブラリが完全に独立して共存できるからです。

3. 恐怖からの解放「不可逆操作の排除」

従来のOSでシステムの中核に関わる設定をいじるのは、薄氷を踏むような作業でした。しかし、NixOSにおける設定変更は単なるテキストの書き換えです。失敗したら、テキストを元に戻して再ビルドするだけ。システム全体がコードとして管理されているため、ブラックボックス化する部分が一つもないのです。


② 具体的にどのような場面で宣言型の特徴が役に立つのか?

「宣言的と言われても、なんだか難しそうでピンとこない」 そう思われるかもしれません。しかし、日常のリアルな場面でこそ、NixOSの真価は強烈に発揮されます。具体的に僕が「NixOSにして本当に良かった!」と心から救われた場面を3つ紹介します。

場面A:アップデートによる突然のカーネルパニック・システム崩壊からの「1秒復旧」

LinuxをメインPCで使っていると、グラフィックドライバの更新やシステムアップデートの直後に、画面が真っ暗なまま起動しなくなる……という絶望的なトラブルに見舞われることがあります。 過去の僕なら、スマートフォンで血眼になって解決策を検索し、Live USBを引っ張り出してきてchrootし、何時間もかけて復旧作業を行っていました。休日の貴重な時間がこれで潰れると、本当に泣きたくなります。

しかしNixOSの場合、そんな悲劇は起こり得ません。 NixOSはシステムを再ビルドするたびに、「Generation(世代)」と呼ばれるスナップショットを自動的にブートローダー(GRUBなど)に作成します。 もしアップデートしてシステムが壊れたら? PCを再起動し、起動画面のメニューから「1つ前のGeneration」を矢印キーで選んでEnterを押すだけです。 たったこれだけで、アップデート前の「完全に動いていた状態」にタイムスリップします。設定ファイルも、インストールされていたパッケージも、カーネルのバージョンも、すべてが1秒で元通りです。この「絶対にいつでも引き返せる」という圧倒的な安心感は、一度味わうと二度と手放せません。

場面B:新しいPC・ガジェットへの環境移行が「数分」で完了する

最近は魅力的なノートPCやUMPCなど、新しいハードウェアを次々と試したくなりますよね。新しいデバイスを手に入れるのは最高にワクワクしますが、同時に「また最初から環境構築(セットアップ)をしなければならないのか」という憂鬱さも付きまといます。 開発ツールを入れて、お気に入りのフォントを設定して、キーボードのマッピングを変えて、デスクトップ環境を自分好みにカスタマイズして……半日、あるいは数日かかる作業です。

NixOSユーザーである僕は、新しいPCを買っても一切焦りません。 GitHubなどのリポジトリに保存しておいた自分の configuration.nix(最近はFlakesというより高度な機能を使っていますが、基本は同じです)を新しいPCにクローンし、コマンドを一発叩くだけです。 お湯を沸かしてコーヒーを淹れ終わる頃には、前のPCと「一言半句違わない、全く同じ使い慣れた環境」が目の前の新しい画面に広がっています。ハードウェアの買い替えに対するフットワークが信じられないほど軽くなるのです。

場面C:「ちょっとこのソフト試したいな」がシステムを絶対に汚さない

「この記事を書くために、ちょっと新しい画像編集ソフトを試したい」 「話題になっているAIのローカル環境を少しだけ動かしてみたい」 そんな時、従来のOSではパッケージをインストールし、依存関係のライブラリが大量に引きずり込まれ、後からアンインストールしても見えないゴミが残りがちです。

NixOSには nix-shell(または新しい nix run)という魔法のコマンドがあります。 例えばターミナルで nix-shell -p gimp と打つと、その場だけGIMPが使える仮想的な環境が立ち上がります。使い終わってターミナルを閉じれば、システムからはGIMPの存在は最初から無かったかのように消え去ります。メインのシステム環境を1ミリも汚すことなく、無数のソフトウェアを自由自在に試すことができる「最強のサンドボックス」が標準で備わっているのです。


③ 設定ファイル(configuration.nix)の具体例

では、その魔法の呪文である設定ファイルがどのようなものか、実際に見てみましょう。Nixという独自の言語で書かれますが、基本的にはJSONなどのように設定値を羅列していくだけのシンプルな構造です。

ここでは、僕自身も注目している次世代のデスクトップ環境「COSMIC」を導入しつつ、日常使いに十分な設定を施した具体的な configuration.nix の一部を抜粋して解説します。(完全なテキストはこちらの記事を見てね!)

Nix

# /etc/nixos/configuration.nix
{ config, pkgs, ... }:

{
  # 1. ハードウェア設定の読み込み(自動生成されます)
  imports =
    [ ./hardware-configuration.nix ];

  # 2. ブートローダーの設定
  # systemd-bootを有効化。シンプルでモダンなブートローダーです。
  boot.loader.systemd-boot.enable = true;
  boot.loader.efi.canTouchEfiVariables = true;

  # 3. ネットワーク設定
  networking.hostName = "nixos-workstation"; # PCの名前
  networking.networkmanager.enable = true;   # Wi-Fi等の管理を有効化

  # 4. タイムゾーンとロケール(日本向け設定)
  time.timeZone = "Asia/Tokyo";
  i18n.defaultLocale = "ja_JP.UTF-8";

  # 5. 日本語入力(Fcitx5とMozc)の設定
  i18n.inputMethod = {
    enabled = "fcitx5";
    fcitx5.addons = with pkgs; [ fcitx5-mozc ];
  };

  # 6. デスクトップ環境の設定(ここが宣言的の面白いところです!)
  # 最近話題のRust製デスクトップ環境「COSMIC」を有効化する設定。
  # 従来のOSなら複雑なリポジトリ追加が必要ですが、NixOSならこれだけです。
  services.desktopManager.cosmic.enable = true;
  services.displayManager.cosmic-greeter.enable = true;

  # 7. ユーザーアカウントの設定
  users.users.hatake = {
    isNormalUser = true;
    description = "Takeshi Hatakeyama";
    extraGroups = [ "networkmanager" "wheel" ]; # wheelでsudo権限を付与
  };

  # 8. システム全体にインストールするパッケージの宣言
  # 「何を入れるか」をここにリストアップするだけ。
  environment.systemPackages = with pkgs; [
    git           # バージョン管理
    vim           # テキストエディタ
    wget          # ダウンロードツール
    vscode        # いつものエディタ
    google-chrome # ブラウザ
  ];

  # 9. システムのバージョン(変更してはいけない魔法の数字)
  system.stateVersion = "23.11"; 
}

どうでしょうか。 「ネットワークを有効にするか(true)」「デスクトップ環境は何を使うか」「何のソフトを入れるか」が、まるでカタログから商品を選ぶように、人間が読んで理解できる言葉で明確に記述されています。

もし、「やっぱりCOSMICじゃなくてGNOMEにしたいな」と思ったら、services.desktopManager.cosmic.enable = true; の部分を消して、GNOME用の設定を1行書き足し、再ビルドするだけです。システムの深い部分でパッケージが競合して壊れる……といった心配は一切ありません。OS全体が、このテキストファイルという「設計図」から常に新しく生成されるからです。


④ まとめ:学習コストを支払う価値のある、一生モノのOS

ここまでNixOSの魅力を熱く語ってきましたが、公平を期すためにデメリットにも触れておかなければなりません。 それは「学習コストの高さ」です。

NixOSは、これまでのLinuxの常識(FHS:Filesystem Hierarchy Standardなど)を根本から破壊し、再構築したOSです。そのため、Ubuntuなどで培ってきた「とりあえずここを書き換えれば動く」というノウハウが通用しない場面が多々あります。独自の「Nix言語」の文法を多少なりとも理解する必要があり、最初は公式ドキュメント(NixOSマニュアルやNixOS Wiki)と睨めっこする日々が続くでしょう。僕自身、思い通りの環境を作り上げるまでに何度も頭を抱え、試行錯誤を繰り返しました。

しかし、その急な坂道を登り切った先にある景色は、本当に、本当に美しいのです。

「環境が壊れる恐怖」からの完全な解放。 「自分がシステムを100%コントロールできている」という万能感。 そして、積み上げた設定ファイルが、自分自身のデジタルライフの歴史そのものとしてGithubにテキストデータとして残り続けるというロマン。

最近はハードウェアの面白さに魅了されて色々なガジェットを触っていますが、それらのデバイスを自分色に染め上げ、最高のパフォーマンスを引き出すための「土台」として、NixOSほど頼もしい相棒はいません。

OSの再インストールや環境構築のたびに疲弊している方。 プログラミングやシステム管理における「再現性」に美しさを感じる方。 そして何より、コンピュータという箱の中に、自分だけの完璧な秩序を持った「城」を築き上げたいと願うすべての人へ。

僕が心からおすすめするLinuxディストリビューション、NixOS。 週末の時間を使って、ぜひ一度、この美しく宣言的な世界へ足を踏み入れてみてください。きっと、元の世界には戻れなくなるはずです。

最後まで読んでいただき、ありがとうございました。
そしてNixOSに興味を持ってくれたら、ぜひこちらの記事を読んでみたください!


いいなと思ったら応援しよう!

はたけっち|テック&ガジェット雑学【毎日投稿】 よろしければ応援お願いします! いただいたチップはクリエイターとしての活動費に使わせていただきます!

ピックアップされています

Apple製品 & Linux関連情報まとめ

  • 42本

コメント

コメントするには、 ログイン または 会員登録 をお願いします。
毎日投稿。会社員のお父さんにとって役に立つ情報を発信してます。テクノロジー・ガジェット・家族愛・幸福論・メンタルヘルス。仕事の依頼はこちら(acesmash@gmail.com)Amazonアソシエイト参加者です。記事内のリンクには広告が含まれる場合があります。
僕が特におすすめしたいLinuxディストリビューション、NixOS|はたけっち|テック&ガジェット雑学【毎日投稿】
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1