見出し画像

【需要があるかわかりませんが…】僕のNixOS+COSMICデスクトップ環境の全設定を公開します。(解説付き)

noteを読んでくださっている皆さん、こんにちは!

最近はNixOSそのもののシステム周りよりも、スマートデバイスや周辺機器などガジェット全般の方に興味が移りつつあるのですが、毎日触れているこの自作PC環境も、僕のこだわりを詰め込んだ最高の「ガジェット」の一つだと思っています。現在LPIC(Linux技術者認定試験)の資格取得に向けて勉強中ということもあり、普段遣いのデスクトップ環境からLinuxにどっぷり浸かっています。

今回は、僕が構築した「NixOS + COSMIC」という少しマニアックなデスクトップ環境の全設定ファイルを公開し、一つひとつの項目について初心者の方にもわかるように、徹底的に詳しく解説していこうと思います!

「NixOSって難しそう…」と思っている方も、この記事を読めば設定ファイル(宣言的設定)がどんな役割を果たしているのかイメージが湧くはずです。長丁場になりますが、ぜひ最後までお付き合いください!

画像

今回公開する設定ファイルについて

NixOSの最大の特徴は、「現在のシステムの状態を一つの設定ファイル(群)で完全に定義できる」という点にあります。今回はモダンなパッケージ管理手法である「Flakes」を導入しているため、以下の2つのファイルがシステムの心臓部になります。

  1. flake.nix: どこからパッケージ(ソフトウェア)を取得するかを定義するファイル。

  2. configuration.nix: 実際のシステム設定(インストールするソフト、ユーザー設定、ネットワークなど)を記述するファイル。

それでは、順番にコードと解説を見ていきましょう。


1. flake.nix の解説

まずはシステムの入り口となる flake.nix です。このファイルは、NixOSのバージョンやパッケージの取得元(チャンネル)を管理します。

Nix

{
  description = "NixOS configuration with stable and unstable packages";
  inputs = {
    # Main channel (latest packages, unstable)
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    # Stable channel (selectively used for stability)
    nixpkgs-stable.url = "github:NixOS/nixpkgs/nixos-25.11";
  };
  outputs = { self, nixpkgs, nixpkgs-stable, ... }:
    let
      system = "x86_64-linux";
    in
    {
      nixosConfigurations.nixos = nixpkgs.lib.nixosSystem {
        inherit system;
        # 全ての module に追加引数として渡される特殊な引数
        specialArgs = {
          inherit nixpkgs-stable;
        };

        modules = [
          # メインの設定ファイル
          ./configuration.nix

          # Overlay モジュール: pkgsStable を globally 利用可能にするための定義
          ({ pkgs, ... }: {
            nixpkgs.overlays = [
              (final: prev: {
                pkgsStable = import nixpkgs-stable {
                  inherit system;
                  config.allowUnfree = true;
                };
              })
            ];
          })
        ];
      };
    };
}

詳細解説

  • inputs: システムの設計図(Nixpkgs)をどこから持ってくるかを指定します。ここでは、最新のソフトウェアを使いたいのでメインに nixos-unstable(不安定版・最新版)を指定しつつ、日本語入力など動作の安定性が絶対に欲しい部分のために nixos-25.11(安定版)も同時に読み込んでいます 。

  • outputs: 読み込んだ設計図を元に、実際のシステムを出力します。アーキテクチャは一般的な64ビットPCである x86_64-linux を指定しています 。

  • specialArgs: 読み込んだ安定版のパッケージ群(nixpkgs-stable)を、後述する configuration.nix でも使えるように引数として渡しています 。

    1. overlays(オーバーレイ): ここが少しテクニカルですが、NixOSの強力な機能です。システム全体の基本パッケージは「最新版(unstable)」を使いますが、このオーバーレイ設定により、pkgsStable という名前で呼び出した時だけ「安定版(stable)」のパッケージをインストールできるようにカスタムしています 。オープンソースではないソフトウェア(プロプライエタリなソフト)もインストールできるように config.allowUnfree = true; を設定しています 。


    2. configuration.nix の解説

    ここからが本番です。PCの具体的な設定を全てここに記述しています。項目ごとに分けて解説します。

    1. システム基本設定 (Kernel, Time, Bootloader)

    Nix

    { config, pkgs, ... }:
    
    {
      imports = [
        ./hardware-configuration.nix
      ];
      # -----------------------------------------------------------------------------
      # 1. システム基本設定 (Kernel, Time, Bootloader)
      # -----------------------------------------------------------------------------
      boot.kernelPackages = pkgs.linuxPackages;
      networking.timeServers = [ "ntp.nict.jp" ];
      time.timeZone = "Asia/Tokyo";
    
      boot.loader = {
        timeout = 3;
        efi = {
          efiSysMountPoint = "/boot";
          canTouchEfiVariables = true;
        };
        grub = {
          enable = true;
          efiSupport = true;
          devices = [ "nodev" ];
          useOSProber = true;
          efiInstallAsRemovable = false;
          extraEntriesBeforeNixOS = false;
    
          # GRUB メニューエントリ (再起動・シャットダウン)
          extraEntries = ''
            menuentry "Reboot" { reboot }
            menuentry "Poweroff" { halt }
          '';
        };
      };
    
    • imports: ハードウェア固有の設定(ドライブの構成など)が書かれた hardware-configuration.nix を読み込んでいます 。

    • カーネルと時間: OSのコアとなるカーネルはデフォルトの linuxPackages を指定 。時計を合わせるためのNTPサーバーには日本の情報通信研究機構の ntp.nict.jp を指定し、タイムゾーンはもちろん Asia/Tokyo です 。

    • ブートローダー (GRUB): パソコンの電源を入れた直後にOSを起動させるためのプログラムです。最近のPCの標準であるEFI環境に合わせて設定し、マウントポイントを /boot に指定しています 。ブートローダーには「GRUB」を採用し、useOSProber = true にすることで、もしWindowsなど他のOSが入っていても自動で見つけて起動メニューに追加してくれます 。また、起動メニューから直接再起動やシャットダウンができるように、カスタムエントリ(extraEntries)を追加しています 。

    2. ネットワーク・ホスト名・ファイアウォール

    Nix

      # -----------------------------------------------------------------------------
      # 2. ネットワーク・ホスト名・ファイアウォール
      # -----------------------------------------------------------------------------
      networking.hostName = "nixos";
      networking.networkmanager.enable = true;
      networking.firewall = {
        enable = true;
        allowedTCPPorts = [ 53317 2049 8080 ];
      };
    
    • ネットワーク設定: コンピュータの名前(ホスト名)はシンプルに nixos にしています 。ネットワーク管理は、Linuxで最も一般的な NetworkManager を有効にしています 。

    • ファイアウォール: セキュリティのためにファイアウォールを有効化しています 。ただし、ファイル共有アプリのLocalSend(ポート53317など)、NFS(2049)、Webサーバーのテスト用(8080)など、特定の用途で使うTCPポートだけは通信を許可しています 。

    3. ロケール・言語環境 (i18n)

    Nix

      # -----------------------------------------------------------------------------
      # 3. ロケール・言語環境 (i18n)
      # -----------------------------------------------------------------------------
      i18n.defaultLocale = "ja_JP.UTF-8";
      i18n.extraLocaleSettings = {
        LC_ADDRESS        = "ja_JP.UTF-8";
        LC_IDENTIFICATION = "ja_JP.UTF-8";
        LC_MEASUREMENT    = "ja_JP.UTF-8";
        LC_MONETARY       = "ja_JP.UTF-8";
        LC_NAME           = "ja_JP.UTF-8";
        LC_NUMERIC        = "ja_JP.UTF-8";
        LC_PAPER          = "ja_JP.UTF-8";
        LC_TELEPHONE      = "ja_JP.UTF-8";
        LC_TIME           = "ja_JP.UTF-8";
      };
      i18n.inputMethod = {
        type = "fcitx5";
        enable = true;
        fcitx5.waylandFrontend = true;
        fcitx5.addons = with pkgs;
        [
          pkgsStable.fcitx5-mozc
          pkgsStable.fcitx5-gtk
        ];
      };
    
    • 日本語化設定: OSの基本言語を日本語 (ja_JP.UTF-8) に設定しています 。日付、お金の単位、名前のフォーマットなども全て日本仕様に統一しています 。

    • 日本語入力 (Fcitx5 + Mozc): Linuxの日本語入力には「Fcitx5」と、Google日本語入力のオープンソース版である「Mozc」を組み合わせて使っています 。ここでポイントなのが、先ほど flake.nix で作った pkgsStable を使っている点です。入力メソッドはOSの根幹に関わり、バグがあると非常にストレスなので、あえて「安定版」のパッケージを指定しています 。

    4. フォント設定

    Nix

      # -----------------------------------------------------------------------------
      # 4. フォント設定
      # -----------------------------------------------------------------------------
      fonts = {
        packages = with pkgs;
        [
          pkgsStable.migu
          pkgsStable.noto-fonts-cjk-sans
          pkgsStable.noto-fonts-cjk-serif
          pkgsStable.noto-fonts-color-emoji
          pkgsStable.ipafont
        ];
        fontDir.enable = true;
        fontconfig = {
          enable = true;
          defaultFonts = {
            serif          = [ "Noto Sans CJK JP" ];
            sansSerif      = [ "Noto Sans CJK JP" ];
            monospace      = [ "Migu 1M" ];
          };
        };
      };
    
    • フォントのインストール: 日本語を綺麗に表示するために、Googleの「Noto Fonts (CJK)」や、プログラミングで見やすい「Migu」、そして「IPAフォント」などをインストールしています 。ここでも表示崩れを防ぐため pkgsStable を使っています 。絵文字フォント(noto-fonts-color-emoji)も入れているので、スマホのように絵文字もバッチリ表示されます 。

    • デフォルトフォント設定: 明朝体(serif)とゴシック体(sansSerif)のデフォルトを「Noto Sans CJK JP」に、ターミナルなどで使う等幅フォント(monospace)を「Migu 1M」に指定しています 。フォントディレクトリの設定(fontDir.enable = true)も有効化しています 。

    5. Nix / Flakes 設定 & 6. デスクトップ環境 (COSMIC)

    Nix

      # -----------------------------------------------------------------------------
      # 5. Nix / Flakes 設定 (システムポリシー)
      # -----------------------------------------------------------------------------
      nix.settings.experimental-features = [ "nix-command" "flakes" ];
      nix.settings.auto-optimise-store = true;
    
      # -----------------------------------------------------------------------------
      # 6. デスクトップ環境 (Cosmic)
      # -----------------------------------------------------------------------------
      services.desktopManager.cosmic = {
        enable = true;
        xwayland.enable = true;
        showExcludedPkgsWarning = true;
      };
    
      services.displayManager.cosmic-greeter.enable = true;
      services.system76-scheduler.enable = true;
      environment.sessionVariables.COSMIC_DATE_CONTROL_ENABLED = "1";
    
    • Flakesの有効化: flake.nix を使うための必須設定である experimental-features を有効にしています 。また、NixOSは使えば使うほど古いパッケージがディスクを圧迫するため、自動で最適化して容量を節約する auto-optimise-store = true; を入れています 。

    • COSMICデスクトップ: ここが僕の環境の目玉です!PCメーカーのSystem76がRust言語でイチから開発している、非常にモダンで爆速な次世代デスクトップ環境「COSMIC」を採用しています 。古いアプリも動くように互換レイヤーの xwayland を有効化し 、ログイン画面も cosmic-greeter に設定しています。

    7. サウンド・メディア (PipeWire) & 8. ユーザー設定

    Nix

      # -----------------------------------------------------------------------------
      # 7. サウンド・メディア (PipeWire)
      # -----------------------------------------------------------------------------
      services.pulseaudio.enable = false;
      security.rtkit.enable = true;
      services.pipewire = {
        enable = true;
        alsa.enable = true;
        alsa.support32Bit = true;
        pulse.enable = true;
      };
    
      # -----------------------------------------------------------------------------
      # 8. ユーザー・グループ設定
      # -----------------------------------------------------------------------------
      users.users.takeshi = {
        isNormalUser = true;
        description = "takeshi";
        shell = pkgs.fish; 
        extraGroups = [ "networkmanager" "wheel" "docker" "render" "vboxusers" ];
      };
      users.groups.video.members = [ "takeshi" "ollama" ];
      users.groups.render.members = [ "takeshi" "ollama" ];
      services.displayManager.autoLogin = {
        enable = true;
        user = "takeshi";
      };
    
      programs.fish.enable = true;
    
    • モダンなサウンドシステム: 古いPulseAudioは無効化し 、最新の標準である「PipeWire」に移行しています 。遅延が少なく、配信や録画(OBSなど)での音声ルーティングが劇的に簡単になります。

    • ユーザー設定: 僕のアカウント takeshi の設定です 。普段使うコマンドラインのシェルには、補完機能が超強力で使いやすい「Fish」を指定しています 。

    • グループと権限: システム管理者権限を持たせる wheel グループや、Dockerをsudoなしで使うための docker グループなどに所属させています 。また、グラフィックボードやAI推論(Ollama)をスムーズに動かすため、video と render グループに権限を付与しています 。毎回パスワードを打つのは面倒なので、自動ログイン(autoLogin)も有効にしています 。

    9. ハードウェア・デバイス (Bluetooth, GPU)

    Nix

      # -----------------------------------------------------------------------------
      # 9. ハードウェア・デバイス (Bluetooth, GPU, Swap)
      # -----------------------------------------------------------------------------
      hardware.bluetooth = {
        package = pkgs.bluez;
        enable = true;
        powerOnBoot = true;
      
        settings.General = {
          Experimental = true;
          FastConnectable = true;
        };
        settings.Policy.AutoEnable = true;
      };
    
      services.blueman.enable = true;
    
      boot.initrd.kernelModules = [ "amdgpu" ];
      services.xserver.videoDrivers = [ "amdgpu" ];
      hardware.graphics = {
        enable = true;
        extraPackages = with pkgs;
        [
          mesa vulkan-tools rocmPackages.rocminfo rocmPackages.clr.icd libva
        ];
      };
    
      hardware.amdgpu.opencl.enable = true;
      environment.variables = { 
        RUSTICL_ENABLE = "radeonsi";
        HSA_OVERRIDE_GFX_VERSION = "11.0.1";
      };
    
    • Bluetooth設定: イヤホンやマウスをスムーズに繋ぐため、Bluetoothを有効化し、PC起動時に自動でオンになるように powerOnBoot を設定 。GUIで管理できるツール blueman も導入しています。

    • AMD GPUの最適化: 僕はAMDのグラフィックボードを使用しているため、専用の amdgpu ドライバーをカーネルモジュールとして読み込んでいます 。さらに、Vulkan(ゲームなどに必須)や、AI・演算用のライブラリである「ROCm」の関連パッケージを追加し 、OpenCLも有効化しています 。環境変数 HSA_OVERRIDE_GFX_VERSION を設定することで、一部非対応のソフトでもAMD GPUを無理やり(?)使えるようにするテクニックも盛り込んでいます 。

    10. ゲーム・Steam 関連

    Nix

      # -----------------------------------------------------------------------------
      # 10. ゲーム・Steam
      # -----------------------------------------------------------------------------
      hardware.steam-hardware.enable = true;
      programs.steam = {
        enable = true;
        fontPackages = with pkgs; [ pkgsStable.migu ];
        remotePlay.openFirewall = true;
        localNetworkGameTransfers.openFirewall = true;
    
        package = pkgs.steam.override {
          extraPkgs = pkgs: with pkgs;
          [
            pkgsStable.migu
            pkgsStable.noto-fonts-cjk-sans
            gnome-themes-extra 
            adwaita-icon-theme
          ];
          extraEnv = {
            LANG = "ja_JP.UTF-8";
            LC_ALL = "ja_JP.UTF-8";
            LANGUAGE = "ja_JP.UTF-8";
            FONTCONFIG_PATH = "/etc/fonts";
            XCURSOR_THEME = "Adwaita";
            MANGOHUD = "1";
            OBS_VKCAPTURE = "1";
          };
        };
      };
    
      programs.gamemode.enable = true;
      programs.gamemode.settings.general.renice = 10;
    

    実はLinuxでもゲームはかなり快適に動きます!

    • Steamの導入: Steamクライアントを有効化し、文字化けを防ぐためにフォント(migu や noto-fonts)をSteam環境内に流し込んでいます 。

    • 日本語環境の強制: Steam上で日本語がうまく認識されないトラブルを防ぐため、環境変数(extraEnv)で LANG や LC_ALL を全て ja_JP.UTF-8 に固定しています 。(もしかしたらこれは必要ないかもしれません)

    • 配信・パフォーマンス監視: ゲームのFPSを表示する「MangoHud」や、OBSでゲーム画面を直接キャプチャするための「OBS_VKCAPTURE」をデフォルトで有効化しています 。

    • Gamemode: ゲーム起動時にPCのパワーをゲームに全振りしてくれる最適化ツール「Gamemode」を導入し、優先度(renice)を高く設定しています 。

    11. 外部サービス & 12. 仮想化環境

    Nix

      # -----------------------------------------------------------------------------
      # 11. 外部サービス (Blender, Ollama, Dropbox, Sunshine など)
      # -----------------------------------------------------------------------------
      services.blendfarm.enable = true;
      services.blendfarm.blenderPackage = pkgs.blender;
    
      services.ratbagd.enable = true;
      services.ratbagd.package = pkgs.libratbag;
    
      services.sunshine = {
        enable = true;
        autoStart = true;
        openFirewall = true;
        capSysAdmin = true;
        package = pkgs.sunshine;
        settings = {
          port = 47989;
          sunshine_name = "mainPC";
        };
      };
      systemd.user.services.dropbox = {
        description = "Dropbox Service";
        wantedBy = [ "graphical-session.target" ];
        environment.QT_QPA_PLATFORM = "xcb";
        serviceConfig = {
          ExecStart = "${pkgs.dropbox}/bin/dropbox";
          Restart = "on-failure";
          RestartSec = "10s";
        };
      };
    
      # -----------------------------------------------------------------------------
      # 12. 仮想化 (Docker, Podman)
      # -----------------------------------------------------------------------------
      virtualisation.docker = {
        enable = true;
        daemon.settings = {
          experimental = true;
          default-address-pools = [{
            base = "172.30.0.0/16";
            size = 24;
          }];
        };
      };
      virtualisation.podman.enable = true;
    
      virtualisation.virtualbox.host.enable = true;
      virtualisation.virtualbox.host.enableExtensionPack = true;
      virtualisation.virtualbox.guest.enable = true;
    
    • Sunshine: PCの画面をスマホや別のPCにストリーミング(リモートプレイ)するための超優秀なソフトです。ポート開放設定や自動起動(autoStart)などを細かく設定し、サーバー名を mainPC としています 。

    • Dropbox: クラウドストレージのDropboxをバックグラウンドサービスとして自動起動させています。GUI(デスクトップ)が立ち上がったタイミングで起動するように wantedBy = [ "graphical-session.target" ]; を設定しています 。

    • ゲーミングマウス設定: ロジクールなどの高機能マウスのボタン割り当てを変えるためのサービス ratbagd を有効にしています 。(FF14プレイヤーなのでロジクールG600マウスは必須)

    • 仮想化(Docker/Podman/VirtualBox): 開発やテスト環境構築に必須のDocker 。ネットワーク帯域が被らないようにIPアドレスプールを設定しています 。Podmanや、昔ながらのVirtualBoxも使える状態にしています 。LPICの試験勉強でサーバー環境を作る際にも非常に役立ちます。

    13〜16. 各種ツールと膨大なシステムパッケージ群

    Nix

      # -----------------------------------------------------------------------------
      # 13. ツール・アプリケーション群
      # -----------------------------------------------------------------------------
      programs.gnome-disks.enable = true;
      programs.obs-studio.enable = true;
      programs.localsend.enable = true;
      programs.localsend.openFirewall = true;
      programs.gpu-screen-recorder.enable = true;
      hardware.logitech.wireless.enable = true;
      hardware.logitech.wireless.enableGraphical = true;
    

    ディスク管理ツールや、配信ソフト(OBS)、スマホとPCでファイルを超高速転送できる「LocalSend」などをシステムレベルで有効化しています 。LocalSendは本当に神アプリです。


    そして最後に、インストールしている大量のパッケージ群(environment.systemPackages)です。

    Nix

      # -----------------------------------------------------------------------------
      # 14. システムパッケージ (Flatpak,environment.systemPackages)
      # -----------------------------------------------------------------------------
      # --- 不安定版パッケージの利用許可 ---
      nixpkgs.config.allowUnfree = true;
      # --- 外部プラットフォーム設定 (Flatpak) ---
        services.flatpak = {
          enable = true;
        };
      environment.systemPackages = with pkgs; [
        # --- 基本ツール / CLI ---
        bash-language-server neovim wget git gh firewalld fastfetch htop
        pkgsStable.flatpak pkgsStable.flatpak-builder pkgsStable.flatpak-xdg-utils
        boost ghostty
        # --- シェル / エディタ ---
        bash fish
        (vscode-with-extensions.override {
          vscodeExtensions = with vscode-extensions; [
            ms-ceintl.vscode-language-pack-ja
            vscode-extensions.bbenoist.nix
          ];
        })
        # --- デスクトップ / Cosmic 関連 ---
        cosmic-greeter cosmic-edit cosmic-player cosmic-bg cosmic-osd cosmic-term
        cosmic-idle cosmic-comp cosmic-randr cosmic-panel cosmic-icons cosmic-files
        cosmic-session cosmic-applets cosmic-settings cosmic-launcher cosmic-protocols
        cosmic-wallpapers cosmic-screenshot cosmic-applibrary cosmic-notifications
        cosmic-initial-setup cosmic-settings-daemon cosmic-ext-tweaks
        # --- テーマ・アイコン ---
        candy-icons gnome-themes-extra adwaita-icon-theme
        # --- ブラウザ・通信・オフィス ---
        firefox google-chrome localsend thunderbird discord dropbox libreoffice obsidian tradingview freecad
        # --- マルチメディア ---
        obs-studio ffmpeg-full vlc audacity handbrake
        obs-studio-plugins.wlrobs obs-studio-plugins.obs-backgroundremoval
        obs-studio-plugins.obs-pipewire-audio-capture obs-studio-plugins.obs-vaapi
        obs-studio-plugins.obs-gstreamer obs-studio-plugins.obs-vkcapture
        gimp-with-plugins blender kdePackages.kdenlive
        # --- AMD管理・仮想化 ---
        mesa xf86-video-amdgpu amdgpu_top docker docker-client distrobox podman lshw
        # --- AI・録画 ---
        lmstudio gpu-screen-recorder gpu-screen-recorder-gtk
      ];
    
      # -----------------------------------------------------------------------------
      # 15. セキュリティ・SSH & 16. バージョン固定
      # -----------------------------------------------------------------------------
      programs.gnupg.agent = {
        enable = true;
        enableSSHSupport = true;
      };
      services.openssh.enable = true;
      system.stateVersion = "25.11";
    }
    
    • Flatpak: Nixパッケージだけでは補いきれないアプリをインストールするために、Flatpakを有効化しています 。

    • VSCode: エディタのVSCodeは、最初から日本語化パックとNixのシンタックスハイライト拡張機能を組み込んだ状態でインストールされるように記述しています 。これも宣言的設定の醍醐味です。

    • COSMICアプリ群: デスクトップ環境を構成するファイルマネージャー(cosmic-files)やターミナル(cosmic-term)、ランチャー(cosmic-launcher)などを漏れなく記述しています 。

    • マルチメディアとOBSプラグイン: OBS Studioに背景透過やPipeWire録音などの各種プラグインを盛り込んでいます 。動画編集用のKdenlive、画像編集のGIMP、3DモデリングのBlenderなど、クリエイティブ系ソフトも充実させています 。

    • AMDツール・AI: グラボのステータスを見る amdgpu_top 、そしてローカルで手軽にAIモデルを動かせる lmstudio なんかも入れています 。

    • StateVersion: 最後に system.stateVersion = "25.11"; とありますが、これはNixOSを最初にインストールした時のバージョンを記録するもので、勝手に書き換えてはいけない重要なおまじないです 。


    おわりに

    いかがだったでしょうか。非常に長い解説になってしまいましたが、これだけの複雑なシステム環境が、たった数個のテキストファイルに完全にバックアップ・定義されていると考えると、NixOSの凄さが少しでも伝わるのではないかと思います。

    PCを買い替えても、OSが壊れても、このファイルさえあれば全く同じ自分好みのガジェット環境が一瞬で復活します。学習コストは少し高いですが、Linuxやシステム構築に興味がある方は、ぜひ一度NixOS沼に足を踏み入れてみてください!

    需要があるかわかりませんが、誰かの参考になれば嬉しいです。最後まで読んでいただき、ありがとうございました!

    分割されていない全文については以下に記述しておきます。

    参考になるかはわかりませんが・・・

    #flake.nix
    
    {
      description = "NixOS configuration with stable and unstable packages";
    
      inputs = {
        # Main channel (latest packages, unstable)
        nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    
        # Stable channel (selectively used for stability)
        nixpkgs-stable.url = "github:NixOS/nixpkgs/nixos-25.11";
      };
    
      outputs = { self, nixpkgs, nixpkgs-stable, ... }:
        let
          system = "x86_64-linux";
        in
        {
          nixosConfigurations.nixos = nixpkgs.lib.nixosSystem {
            inherit system;
    
            # 全ての module に追加引数として渡される特殊な引数
            specialArgs = {
              inherit nixpkgs-stable;
            };
    
            modules = [
              # メインの設定ファイル
              ./configuration.nix
    
              # Overlay モジュール: pkgsStable を globally 利用可能にするための定義
              ({ pkgs, ... }: {
                nixpkgs.overlays = [
                  (final: prev: {
                    pkgsStable = import nixpkgs-stable {
                      inherit system;
                      config.allowUnfree = true;
                    };
                  })
                ];
              })
            ];
          };
        };
    }
    #configuration.nix
    
    { config, pkgs, ... }:
    
    {
      imports = [
        ./hardware-configuration.nix
      ];
    
      # -----------------------------------------------------------------------------
      # 1. システム基本設定 (Kernel, Time, Bootloader)
      # -----------------------------------------------------------------------------
      boot.kernelPackages = pkgs.linuxPackages;
    
      networking.timeServers = [ "ntp.nict.jp" ];
      time.timeZone = "Asia/Tokyo";
    
      boot.loader = {
        timeout = 3;
    
        efi = {
          efiSysMountPoint = "/boot";
          canTouchEfiVariables = true;
        };
    
        grub = {
          enable = true;
          efiSupport = true;
          devices = [ "nodev" ];
          useOSProber = true;
          efiInstallAsRemovable = false;
          extraEntriesBeforeNixOS = false;
    
          # GRUB メニューエントリ (再起動・シャットダウン)
          extraEntries = ''
            menuentry "Reboot" { reboot }
            menuentry "Poweroff" { halt }
          '';
        };
      };
    
      # -----------------------------------------------------------------------------
      # 2. ネットワーク・ホスト名・ファイアウォール
      # -----------------------------------------------------------------------------
      networking.hostName = "nixos";
      networking.networkmanager.enable = true;
    
      networking.firewall = {
        enable = true;
        allowedTCPPorts = [ 53317 2049 8080 ];
      };
    
      # -----------------------------------------------------------------------------
      # 3. ロケール・言語環境 (i18n)
      # -----------------------------------------------------------------------------
      i18n.defaultLocale = "ja_JP.UTF-8";
    
      i18n.extraLocaleSettings = {
        LC_ADDRESS        = "ja_JP.UTF-8";
        LC_IDENTIFICATION = "ja_JP.UTF-8";
        LC_MEASUREMENT    = "ja_JP.UTF-8";
        LC_MONETARY       = "ja_JP.UTF-8";
        LC_NAME           = "ja_JP.UTF-8";
        LC_NUMERIC        = "ja_JP.UTF-8";
        LC_PAPER          = "ja_JP.UTF-8";
        LC_TELEPHONE      = "ja_JP.UTF-8";
        LC_TIME           = "ja_JP.UTF-8";
      };
    
      i18n.inputMethod = {
        type = "fcitx5";
        enable = true;
        fcitx5.waylandFrontend = true;
        fcitx5.addons = with pkgs; [
          pkgsStable.fcitx5-mozc
          pkgsStable.fcitx5-gtk
        ];
      };
    
      # -----------------------------------------------------------------------------
      # 4. フォント設定
      # -----------------------------------------------------------------------------
      fonts = {
        packages = with pkgs; [
          pkgsStable.migu
          pkgsStable.noto-fonts-cjk-sans
          pkgsStable.noto-fonts-cjk-serif
          pkgsStable.noto-fonts-color-emoji
          pkgsStable.ipafont
        ];
    
        fontDir.enable = true;
        fontconfig = {
          enable = true;
          defaultFonts = {
            serif          = [ "Noto Sans CJK JP" ];
            sansSerif      = [ "Noto Sans CJK JP" ];
            monospace      = [ "Migu 1M" ];
          };
        };
      };
    
      # -----------------------------------------------------------------------------
      # 5. Nix / Flakes 設定 (システムポリシー)
      # -----------------------------------------------------------------------------
      nix.settings.experimental-features = [ "nix-command" "flakes" ];
      
      nix.settings.auto-optimise-store = true;
    
      # -----------------------------------------------------------------------------
      # 6. デスクトップ環境 (Cosmic)
      # -----------------------------------------------------------------------------
      services.desktopManager.cosmic = {
        enable = true;
        xwayland.enable = true;
        showExcludedPkgsWarning = true;
      };
    
      services.displayManager.cosmic-greeter.enable = true;
      services.system76-scheduler.enable = true;
      environment.sessionVariables.COSMIC_DATE_CONTROL_ENABLED = "1";
    
      # -----------------------------------------------------------------------------
      # 7. サウンド・メディア (PipeWire)
      # -----------------------------------------------------------------------------
      services.pulseaudio.enable = false;
      security.rtkit.enable = true;
    
      services.pipewire = {
        enable = true;
        alsa.enable = true;
        alsa.support32Bit = true;
        pulse.enable = true;
      };
    
      # -----------------------------------------------------------------------------
      # 8. ユーザー・グループ設定
      # -----------------------------------------------------------------------------
      users.users.takeshi = {
        isNormalUser = true;
        description = "takeshi";
        shell = pkgs.fish; 
        extraGroups = [ "networkmanager" "wheel" "docker" "render" "vboxusers" ];
      };
    
      users.groups.video.members = [ "takeshi" "ollama" ];
      users.groups.render.members = [ "takeshi" "ollama" ];
    
      services.displayManager.autoLogin = {
        enable = true;
        user = "takeshi";
      };
    
      programs.fish.enable = true;
    
      # -----------------------------------------------------------------------------
      # 9. ハードウェア・デバイス (Bluetooth, GPU, Swap)
      # -----------------------------------------------------------------------------
      hardware.bluetooth = {
        package = pkgs.bluez;
        enable = true;
        powerOnBoot = true;
      
        settings.General = {
          Experimental = true;
          FastConnectable = true;
        };
        settings.Policy.AutoEnable = true;
      };
    
      services.blueman.enable = true;
    
      boot.initrd.kernelModules = [ "amdgpu" ];
      services.xserver.videoDrivers = [ "amdgpu" ];
    
      hardware.graphics = {
        enable = true;
        extraPackages = with pkgs; [
          mesa vulkan-tools rocmPackages.rocminfo rocmPackages.clr.icd libva
        ];
      };
    
      hardware.amdgpu.opencl.enable = true;
    
      environment.variables = { 
        RUSTICL_ENABLE = "radeonsi";
        HSA_OVERRIDE_GFX_VERSION = "11.0.1";
      };
    
      # -----------------------------------------------------------------------------
      # 10. ゲーム・Steam
      # -----------------------------------------------------------------------------
      hardware.steam-hardware.enable = true;
    
      programs.steam = {
        enable = true;
        fontPackages = with pkgs; [ pkgsStable.migu ];
        remotePlay.openFirewall = true;
        localNetworkGameTransfers.openFirewall = true;
    
        package = pkgs.steam.override {
          extraPkgs = pkgs: with pkgs; [
            pkgsStable.migu
            pkgsStable.noto-fonts-cjk-sans
            gnome-themes-extra 
            adwaita-icon-theme
          ];
          extraEnv = {
            LANG = "ja_JP.UTF-8";
            LC_ALL = "ja_JP.UTF-8";
            LANGUAGE = "ja_JP.UTF-8";
            FONTCONFIG_PATH = "/etc/fonts";
            XCURSOR_THEME = "Adwaita";
            MANGOHUD = "1";
            OBS_VKCAPTURE = "1";
          };
        };
      };
    
      programs.gamemode.enable = true;
      programs.gamemode.settings.general.renice = 10;
    
      # -----------------------------------------------------------------------------
      # 11. 外部サービス (Blender, Ollama, Dropbox, Sunshine など)
      # -----------------------------------------------------------------------------
      services.blendfarm.enable = true;
      services.blendfarm.blenderPackage = pkgs.blender;
    
      services.ratbagd.enable = true;
      services.ratbagd.package = pkgs.libratbag;
    
      services.sunshine = {
        enable = true;
        autoStart = true;
        openFirewall = true;
        capSysAdmin = true;
        package = pkgs.sunshine;
        settings = {
          port = 47989;
          sunshine_name = "mainPC";
        };
      };
    
      systemd.user.services.dropbox = {
        description = "Dropbox Service";
        wantedBy = [ "graphical-session.target" ];
        environment.QT_QPA_PLATFORM = "xcb"; 
        serviceConfig = {
          ExecStart = "${pkgs.dropbox}/bin/dropbox";
          Restart = "on-failure";
          RestartSec = "10s";
        };
      };
    
      # -----------------------------------------------------------------------------
      # 12. 仮想化 (Docker, Podman)
      # -----------------------------------------------------------------------------
      virtualisation.docker = {
        enable = true;
        daemon.settings = {
          experimental = true;
          default-address-pools = [{
            base = "172.30.0.0/16";
            size = 24;
          }];
        };
      };
    
      virtualisation.podman.enable = true;
    
      virtualisation.virtualbox.host.enable = true;
      virtualisation.virtualbox.host.enableExtensionPack = true;
      virtualisation.virtualbox.guest.enable = true;
    
      # -----------------------------------------------------------------------------
      # 13. ツール・アプリケーション群
      # -----------------------------------------------------------------------------
      programs.gnome-disks.enable = true;
      programs.obs-studio.enable = true;
      programs.localsend.enable = true;
      programs.localsend.openFirewall = true;
      programs.gpu-screen-recorder.enable = true;
      hardware.logitech.wireless.enable = true;
      hardware.logitech.wireless.enableGraphical = true;
    
      # -----------------------------------------------------------------------------
      # 14. システムパッケージ (Flatpak,environment.systemPackages)
      # -----------------------------------------------------------------------------
      # --- 不安定版パッケージの利用許可 ---
      nixpkgs.config.allowUnfree = true;
      
      # --- 外部プラットフォーム設定 (Flatpak) ---
        services.flatpak = {
          enable = true;
        };
    
      environment.systemPackages = with pkgs; [
        # --- 基本ツール / CLI ---
        bash-language-server
        neovim
        wget
        git
        gh
        firewalld
        fastfetch
        htop
        pkgsStable.flatpak
        pkgsStable.flatpak-builder
        pkgsStable.flatpak-xdg-utils
        boost
        ghostty
    
        # --- シェル / エディタ ---
        bash
        fish
        (vscode-with-extensions.override {
          vscodeExtensions = with vscode-extensions; [
            ms-ceintl.vscode-language-pack-ja
            vscode-extensions.bbenoist.nix
          ];
        })
    
        # --- デスクトップ / Cosmic 関連パッケージ ---
        cosmic-greeter
        cosmic-edit
        cosmic-player
        cosmic-bg
        cosmic-osd
        cosmic-term
        cosmic-idle
        cosmic-comp
        cosmic-randr
        cosmic-panel
        cosmic-icons
        cosmic-files
        cosmic-session
        cosmic-applets
        cosmic-settings
        cosmic-launcher
        cosmic-protocols
        cosmic-wallpapers
        cosmic-screenshot
        cosmic-applibrary
        cosmic-notifications
        cosmic-initial-setup
        cosmic-settings-daemon
        cosmic-ext-tweaks
    
        # --- テーマ・アイコン ---
        candy-icons
        gnome-themes-extra 
        adwaita-icon-theme
    
        # --- XFCE 関連 ---
        thunar
        pkgs.ristretto
        pkgs.tumbler
    
        # --- KDE 関連 ---
        kdePackages.ark
    
        # --- ブラウザ / 通信 ---
        firefox
        google-chrome
        localsend
        thunderbird
        discord
        dropbox
    
        # --- オフィス / 日常用途 ---
        libreoffice
        obsidian
        tradingview
        freecad
    
        # --- フォント (systemPackages としての追加) ---
        pkgsStable.noto-fonts-cjk-sans
        pkgsStable.noto-fonts-cjk-serif
        pkgsStable.noto-fonts-color-emoji
        pkgsStable.migu
        pkgsStable.wqy_zenhei
    
        # --- マルチメディア / 配信 ---
        obs-studio
        ffmpeg-full
        vlc
        audacity
        handbrake
    
        obs-studio-plugins.wlrobs
        obs-studio-plugins.obs-backgroundremoval
        obs-studio-plugins.obs-pipewire-audio-capture
        obs-studio-plugins.obs-vaapi
        obs-studio-plugins.obs-gstreamer
        obs-studio-plugins.obs-vkcapture
    
        # --- 画像 / 動画制作 ---
        gimp-with-plugins
        blender
        kdePackages.kdenlive
    
        # --- ゲーム / Steam 関連ツール ---
        steam-run
        protonup-qt
        gamemode
        lsfg-vk
        lsfg-vk-ui
        sunshine
        moonlight-qt
    
        # --- GPU / AMD 開発・管理ツール ---
        mesa
        libvdpau-va-gl
        xf86-video-amdgpu
        amdgpu_top
        amdenc
        amdctl
        amd-blis
        amdfwtool
        amd-ucodegen
        amd-libflame
        microcode-amd
        radeon-profile
        radeontools
        rocmPackages.clr
        rocmPackages.rpp
        rocmPackages.rocminfo
    
        # --- 周辺機器 / デバイス管理 ---
        gparted
        gnome-disk-utility
        piper
        libratbag
        solaar
        librepods
    
        # --- コンテナ / 仮想化 ---
        docker
        docker-client
        distrobox
        podman
        lshw
        bottles
        bottles-unwrapped
    
        # --- AI / GPU Compute ---
        lmstudio
    
        # --- 録画 / スクリーンキャプチャ ---
        gpu-screen-recorder
        gpu-screen-recorder-gtk
    
      ];
    
      # -----------------------------------------------------------------------------
      # 15. セキュリティ・SSH
      # -----------------------------------------------------------------------------
      programs.gnupg.agent = {
        enable = true;
        enableSSHSupport = true;
      };
    
      services.openssh.enable = true;
    
      # -----------------------------------------------------------------------------
      # 16. NixOS バージョン固定
      # -----------------------------------------------------------------------------
      system.stateVersion = "25.11";
    }

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

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

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

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

    • 29本

    コメント

    2
    コメントするには、 ログイン または 会員登録 をお願いします。
    Saji|ペンギンになろうのプロフィールへのリンク

    記事にしていただいてありがとうございます🙏 NixOSの設定についてこんなに包括的な説明をしてくれている記事はなかなかないので、本当に助かります! NixOSをデュアルブートで楽しんで使っていきたいと思います🔥

    1
    はたけっち【毎日投稿】明日”会社”で話せるテクノロジー&ガジェット雑学 いいね
    はたけっち【毎日投稿】明日”会社”で話せるテクノロジー&ガジェット雑学のプロフィールへのリンク

    コメントありがとうございます!ぜひぜひデュアルブート楽しんじゃってください😃

    1
    【需要があるかわかりませんが…】僕のNixOS+COSMICデスクトップ環境の全設定を公開します。(解説付き)|はたけっち【毎日投稿】明日”会社”で話せるテクノロジー&ガジェット雑学
    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