見出し画像

【雑記】NixOSユーザーがまた一人生まれました!+XFCE環境に移行

いつも僕の記事を読んでいただき、ありがとうございます。
僕は以前から、NixOSの記事を定期的に投稿しているのですが、今日はとても嬉しいことがありました。

まずは、こちらの記事をご覧ください!

以前から交流があったSajiさんが、僕のコードを参考にNixOSを導入した過程を記事にしてくれました!
この場を借りて、感謝申し上げます。

Sajiさんの設定ファイルは僕よりもはるかに凝ったことをしているので、とても参考になると思います。


かくいう僕はこのゴールデンウィークの間に、COSMIC環境からXFCE環境に設定を移植したりしていました。(XFCE環境に移した理由は後述)

以前からの差分がかなりあるので、configuration.nixの全文を掲載します。
(解説を追記しました)

{ config, pkgs, ... }:

{
  imports = [
    ./hardware-configuration.nix
  ];


  # -----------------------------------------------------------------------------
  # 1. システム基本設定 (Kernel, Time, Bootloader)
  # -----------------------------------------------------------------------------
  # 最新のLinuxカーネルを使用するように指定
  boot.kernelPackages = pkgs.linuxPackages_latest;
  # 初期RAMディスク(initrd)にAMD GPU用のドライバをロードするように設定
  boot.initrd.kernelModules = [
        "amdgpu"
        ];

  # NTPサーバーとしてNICTのサーバーを指定
  networking.timeServers = [ "ntp.nict.jp" ];
  # システムのタイムゾーンを日本時間に設定
  time.timeZone = "Asia/Tokyo";

  boot.loader = {
    # ブートメニューの待機時間(秒)
    timeout = 3;

    # EFI環境の設定
    efi = {
      efiSysMountPoint = "/boot";
      canTouchEfiVariables = true;
    };

    # GRUBブートローダーの設定
    grub = {
      enable = true;
      efiSupport = true;
      devices = [ "nodev" ];
      useOSProber = true; # 他のOS(Windows等)を自動検出するための設定
      efiInstallAsRemovable = false;
      extraEntriesBeforeNixOS = false;

      # GRUBメニューに「再起動」と「シャットダウン」のエントリを追加
      extraEntries = ''
        menuentry "Reboot" { reboot }
        menuentry "Poweroff" { halt }
      '';
    };
  };

  # -----------------------------------------------------------------------------
  # 2. ネットワーク・ホスト名・ファイアウォール
  # -----------------------------------------------------------------------------
  # システムのホスト名を設定
  networking.hostName = "nixos";
  # NetworkManagerを有効化(Wi-Fiや有線LANの管理)
  networking.networkmanager.enable = true;

  # ファイアウォールの設定
  networking.firewall = {
    enable = true;
    # 許可するTCPポートを指定 (DNS/NTP, NFS, HTTP等)
    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";
  };

  # 入力メソッド (Fcitx5 + Mozc) の設定
  i18n.inputMethod = {
    type = "fcitx5";
    enable = true;
    fcitx5.waylandFrontend = true; # Wayland環境への対応
    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)の設定
    fontconfig = {
      enable = true;
      defaultFonts = {
        serif          = [ "Noto Sans CJK JP" ];
        sansSerif      = [ "Noto Sans CJK JP" ];
        monospace      = [ "Migu 1M" ];
      };
    };
  };

  # -----------------------------------------------------------------------------
  # 5. Nix / Flakes 設定 (システムポリシー)
  # -----------------------------------------------------------------------------
  # nix-commandとflakes機能を有効化(モダンなNix利用に必須)
  nix.settings.experimental-features = [ "nix-command" "flakes" ];
  # Nixストアの自動最適化(重複するファイルを削除して容量節約)を有効化
  nix.settings.auto-optimise-store = true;

  # -----------------------------------------------------------------------------
  # 6. デスクトップ環境
  # -----------------------------------------------------------------------------
   services.xserver = {
    enable = true;
    desktopManager = {
      xterm.enable = false;
      xfce.enable = true; # XFCEデスクトップを有効化
    };
    displayManager.lightdm.enable =  true; # ディスプレイマネージャにLightDMを使用
    # 日本語キーボード(106/109キー)の設定
    xkb = {
    layout = "jp";
    model = "jp106"; # 一般的な106/109キーボードの場合
  };
  };

  # デフォルトのデスクトップセッションをXFCEに設定
  services.displayManager.defaultSession = "xfce";

  # 環境変数:ターミナルのデフォルトをghosttyに指定
  environment.variables = {
    TERMINAL = "ghostty";
  };
  # MIMEタイプのデフォルトアプリケーション(ディレクトリを開くときはThunar)
  xdg.mime.defaultApplications = {
    "inode/directory" = [ "thunar.desktop" ];
  };


  # -----------------------------------------------------------------------------
  # 7. サウンド・メディア (PipeWire)
  # -----------------------------------------------------------------------------
  # PulseAudioを無効化し、PipeWireを使用する準備
  services.pulseaudio.enable = false;
  security.rtkit.enable = true; # PipeWireのリアルタイム処理に必要な設定

  # PipeWireの設定(ALSA/PulseAudio互換レイアを含める)
  services.pipewire = {
    enable = true;
    alsa.enable = true;
    alsa.support32Bit = true;
    pulse.enable = true;
  };

  # -----------------------------------------------------------------------------
  # 8. ユーザー・グループ設定
  # -----------------------------------------------------------------------------
  users.users.takeshi = {
    isNormalUser = true;
    description = "takeshi";
    shell = pkgs.fish; # デフォルトシェルをFishに設定
    extraGroups = [ 
      "networkmanager" 
      "wheel"     # sudo権限の付与
      "video"     # GPUアクセス用
      "docker"    # Docker使用のため
      "render"    # GPUレンダリング用
      "libvirtd"  # KVM/QEMU用
      "kvm"];     # 仮想化支援機能用
  };

  # 特定のユーザーをビデオ・レンダリンググループに追加
  users.groups.video.members = [ "takeshi" ]; 
  users.groups.render.members = [ "takeshi" ];

  # 自動ログインの設定
  services.displayManager.autoLogin = {
    enable = true;
    user = "takeshi";
  };

  # Fishシェルをシステム全体で有効化
  programs.fish.enable = true;

  # -----------------------------------------------------------------------------
  # 9. ハードウェア・デバイス (Bluetooth, GPU, Swap,電源管理)
  # -----------------------------------------------------------------------------
  # Bluetoothの設定
  hardware.bluetooth = {
    package = pkgs.bluez;
    enable = true;
    powerOnBoot = true;
  
    settings.General = {
      Experimental = true; # 実験的な機能を有効化
      FastConnectable = true;
    };
    settings.Policy.AutoEnable = true;
  };

  # Bluetooth管理ツール (Blueman) の有効化
  services.blueman.enable = true;

  # AMD GPUドライバの指定
  services.xserver.videoDrivers = [ "amdgpu" ];

  # グラフィックス・ハードウェアの設定
  hardware.graphics = {
    enable = true;
    extraPackages = with pkgs; [
      mesa vulkan-tools rocmPackages.rocminfo rocmPackages.clr.icd libva
    ];
  };

  # AMD OpenCLを有効化
  hardware.amdgpu.opencl.enable = true;

  # GPU関連の環境変数設定(RDNA3等の互換性調整)
  environment.variables = { 
    RUSTICL_ENABLE = "radeonsi";
    HSA_OVERRIDE_GFX_VERSION = "11.0.1"; # 特定のGPU世代向けのオーバーライド
  };

  # auto-cpufreqによる省電力・パフォーマンス自動切り替え設定
  services.auto-cpufreq = { 
   enable = true;
   settings = {
  battery = {
    governor = "powersave"; # バッテリー駆動時は省電力モード
    turbo = "auto";
  };
  charger = {
    governor = "performance"; # AC接続時はパフォーマンス重視
    turbo = "auto";
  };
  };
  };

  # power-profiles-daemonとの競合を避けるため無効化
  services.power-profiles-daemon.enable = false;

  # -----------------------------------------------------------------------------
  # 10. ゲーム・Steam
  # -----------------------------------------------------------------------------
  # Steam用のハードウェア設定を有効化
  hardware.steam-hardware.enable = true;

  programs.steam = {
    enable = true;
    fontPackages = with pkgs; [ pkgsStable.migu ];
    remotePlay.openFirewall = true; # Remote Play用ポート開放
    localNetworkGameTransfers.openFirewall = true;

    # Steamパッケージのカスタマイズ(フォントや環境変数の追加)
    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"; # MangoHud(オーバーレイ)を有効化
        OBS_VKCAPTURE = "1"; # OBS用キャプチャ機能を有効化
      };
    };
  };

  # Gamemodeの有効化と設定
  programs.gamemode.enable = true;
  programs.gamemode.settings.general.renice = 10;

  # -----------------------------------------------------------------------------
  # 11. 外部サービス (Blender, Ollama, Dropbox, Sunshine など)
  # -----------------------------------------------------------------------------
  # Blender用管理ツール(Blendfarm)の設定
  services.blendfarm.enable = true;
  services.blendfarm.blenderPackage = pkgs.blender;

  # マウスドライバ(libratbag/ratbagd)の有効化
  services.ratbagd.enable = true;
  services.ratbagd.package = pkgs.libratbag;

  # Sunshine(ストリーミング用サーバー)の設定
  services.sunshine = {
    enable = true;
    autoStart = true;
    openFirewall = true;
    capSysAdmin = true;
    package = pkgs.sunshine;
  };

  # Dropboxのユーザーサービス設定(systemd経由)
  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";
    };
  };

  # FUSE(ファイルシステム)の権限設定
  programs.fuse.userAllowOther = true;

  # Google Driveマウント用サービスの設定
  systemd.user.services.google-drive-mount = {
    description = "Mount Google Drive using google-drive-ocamlfuse";
    wantedBy = [ "default.target" ];
    serviceConfig = {
      ExecStart = "${pkgs.google-drive-ocamlfuse}/bin/google-drive-ocamlfuse -f %h/googledrive";  
      ExecStop = "/run/wrappers/bin/fusermount -u %h/googledrive"; 
      Restart = "on-failure";
      RestartSec = "10s";
    };
  };


  # -----------------------------------------------------------------------------
  # 12. 仮想化 (Docker, Podman)
  # -----------------------------------------------------------------------------
  # Dockerの設定
  virtualisation.docker = {
    enable = true;
    daemon.settings = {
      experimental = true; # 実験的機能の有効化
      default-address-pools = [{
        base = "172.30.0.0/16"; # Dockerネットワークのアドレス範囲
        size = 24;
      }];
    };
  };

  # Podmanの有効化
  virtualisation.podman.enable = true;

  # Virt-manager(仮想マシン管理)の設定
  programs.virt-manager.enable = true;
  virtualisation.spiceUSBRedirection.enable = true;

  # ユーザーをlibvirtdグループに追加
  users.groups.libvirtd.members = ["takeshi"];
  services.qemuGuest.enable = true;
  services.spice-vdagentd.enable = true;
  services.spice-autorandr.enable = true;

  # KVM/QEMUの詳細設定
  virtualisation = {
    libvirtd = {
      enable = true;
      qemu = {
        package = pkgs.qemu_kvm;
        swtpm.enable = true; # TPMエミュレーションの有効化
        vhostUserPackages = [ pkgs.virtiofsd ];
      };
    };
   };

  # -----------------------------------------------------------------------------
  # 13. ツール・アプリケーション群
  # -----------------------------------------------------------------------------
  # Thunar(ファイルマネージャ)のプラグイン設定
  programs.thunar = {
    enable =true;
    plugins = with pkgs; [
    thunar-vcs-plugin
    thunar-shares-plugin
    thunar-archive-plugin
    thunar-dropbox-plugin
    thunar-media-tags-plugin
    thunar-volman
    ];
  };
  services.gvfs.enable = true; # ネットワークドライブ等のマウント用
  services.tumbler.enable = true; # 画像のサムネイル生成用
  
  # 各種アプリケーションの有効化
  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
    flatpak
    flatpak-builder
    flatpak-xdg-utils
    boost
    ghostty
    libinput-gestures
    auto-cpufreq
    pciutils

    # --- シェル / エディタ ---
    bash
    fish
    opencode
    opencode-desktop
    (vscode-with-extensions.override {
      vscodeExtensions = with vscode-extensions; [
        ms-ceintl.vscode-language-pack-ja
        vscode-extensions.bbenoist.nix
      ];
    })


    # --- テーマ・アイコン ---
    kora-icon-theme
    pkgs.nordic

    # --- XFCE 関連 ---
    pkgs.ristretto
    pkgs.tumbler
    pkgs.mousepad
    pkgs.parole
    pkgs.xfce4-appfinder
    pkgs.xfce4-notifyd
    pkgs.xfce4-screenshooter
    pkgs.xfce4-session
    pkgs.xfce4-settings
    pkgs.xfce4-taskmanager 
    pkgs.xfce4-whiskermenu-plugin
    copyq

    # --- KDE 関連 ---
    kdePackages.ark
    kdePackages.discover

    # --- ブラウザ / 通信 ---
    firefox
    google-chrome
    localsend
    thunderbird
    discord
    dropbox
    google-drive-ocamlfuse

    # --- オフィス / 日常用途 ---
    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用プラグイン群
    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

    rustc
    cargo
    perl
    gcc
    clang 

    # --- 周辺機器 / デバイス管理 ---
    gparted
    gnome-disk-utility
    piper
    libratbag
    solaar
    librepods

    # --- コンテナ / 仮想化 ---
    docker
    docker-client
    distrobox
    podman
    lshw
    virt-manager
    virt-viewer
    qemu_kvm
    vde2
    libguestfs
    spice-vdagent
    spice-autorandr

    # --- AI / GPU Compute ---
    lmstudio

    # --- 録画 / スクリーンキャプチャ ---
    gpu-screen-recorder
    gpu-screen-recorder-gtk

  ];

  # -----------------------------------------------------------------------------
  # 15. セキュリティ・SSH
  # -----------------------------------------------------------------------------
  # GnuPGエージェントの設定(SSHサポートを有効化)
  programs.gnupg.agent = {
    enable = true;
    enableSSHSupport = true;
  };

  # OpenSSHサーバーの有効化
  services.openssh.enable = true;

  # -----------------------------------------------------------------------------
  # 16. NixOS バージョン固定
  # -----------------------------------------------------------------------------
  # システム構成の互換性を維持するためのバージョン情報
  system.stateVersion = "25.11";
}
スクリーンショット

COSMIC環境からXFCE環境に移った理由は以下の3点に集約されます。

①COSMICファイラーの機能不足
②COSMICファイラー以外のファイラーをデフォルトに設定できない
③Wayland環境と相性が悪い特定のSteamタイトルがある


僕は以前からファイラーはthunarを愛用していました。
愛用する理由は多々あるのですが、その中でも一番大きな理由を占めるのが、GitやDropboxといった外部サービスとの連携がプラグインで簡単に行えることです。

それに対して、COSMICファイラーにはそういった機能はなく、とてもシンプルな作りになってました。

普段使いには問題ないのですが、ふとした時に不便を感じていました。

また、一番大きな問題は、COSMICファイラー以外のファイラーをCOSMICファイラー環境ではデフォルトに使用することが事実上できないことでした。

COSMICファイラーを例外的に除去するとデスクトップ上で右クリックでメニューが出なくなる不具合がありました。(なにかいい方法があれば教えてください)

加えて、ここ最近はまっているSteamのタイピングゲーム(Glyphica)で画面が出力されない不具合もありました。(こちらはCOSMIC環境が問題の主因とは限りませんが)

こういった不具合が重なり、ゴールデンウィークは重い腰をあげて、XFCE環境に移行しました。

設定の細かな点については、そのうち行いたいと思ってます。


今日はそんな雑記でした!


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

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