Skip to content

Instantly share code, notes, and snippets.

@showyou
Last active July 5, 2026 02:35
Show Gist options
  • Select an option

  • Save showyou/33af871aa5a89bc0bb2a5cf8af273c40 to your computer and use it in GitHub Desktop.

Select an option

Save showyou/33af871aa5a89bc0bb2a5cf8af273c40 to your computer and use it in GitHub Desktop.

NixOS GNOME/XFCE VM setup

GNOMEまたはXFCE入りのNixOSをVMへ入れるための、初心者向け設定ファイルです。

  • ホスト名: nixos-vm
  • デスクトップ: GNOME + GDM(既定) / XFCE + LightDM
  • Flake構成: nixos-vm(GNOME) / nixos-vm-xfce(XFCE)
  • ブラウザ: Firefox(既定) / Chromium / Vivaldi
  • アプリ: Slack、Bitwarden、Discord、Obsidian、Zed、VS Code
  • シェル: zsh + Oh My Zsh(履歴共有・重複整理・履歴サジェストつき)
  • ターミナル: Ghostty
  • コンテナ: Docker CLI/Engine
  • フォント: 源ノ角ゴシック/明朝、Source Han Code JP、Notoフォールバック、Noto Color Emoji
  • 言語/地域: 日本語
  • キーボード: 日本語配列
  • 日本語入力: Fcitx5 + Mozc(Mozcを既定入力に設定)
  • 初期ユーザー: nixos
  • 初期パスワード: nixos
  • SSH: 有効(ユーザー nixos で接続)

Important

hardware-configuration.nix はVMごとに違うため、このリポジトリには含めていません。 インストール中に nixos-generate-config --root /mnt で生成したものを使ってください。

1. VMを作る

NixOSのISOイメージをダウンロードします。

VMの目安:

  • CPU: 2コア以上
  • メモリ: 4GB以上
  • ディスク: 30GB以上
  • ファームウェア: UEFI
  • ネットワーク: NATでOK

VirtualBox、VMware、GNOME Boxes、UTM、QEMU/KVMなどで動かせます。

Important

この設定は systemd-boot を使うUEFI向けです。 VirtualBoxを使う場合は、VM設定の「システム」→「マザーボード」→「EFIを有効化」にチェックを入れてください。 EFIが無効のままだと、インストール後に Booting from Hard Disk... から進まないことがあります。

2. ISOから起動して端末を開く

NixOSのライブ環境で端末を開き、rootになります。

sudo -i

ディスク名を確認します。

lsblk

以降の例ではインストール先ディスクを /dev/vda としています。 VirtualBoxなら /dev/sda になることがあります。

Warning

次の手順は指定したディスクを初期化します。 VM用に作った空ディスクを選んでいることを確認してください。

3. ディスクを分割してフォーマットする

UEFI用の標準的な構成です。

parted /dev/vda -- mklabel gpt
parted /dev/vda -- mkpart ESP fat32 1MiB 512MiB
parted /dev/vda -- set 1 esp on
parted /dev/vda -- mkpart primary ext4 512MiB 100%

mkfs.fat -F 32 -n boot /dev/vda1
mkfs.ext4 -L nixos /dev/vda2

マウントします。

mount /dev/disk/by-label/nixos /mnt
mkdir -p /mnt/boot
mount /dev/disk/by-label/boot /mnt/boot

4. NixOSのハードウェア設定を生成する

nixos-generate-config --root /mnt

これで /mnt/etc/nixos/hardware-configuration.nix が生成されます。 このファイルはそのVM固有なので、基本的に手で書き換えなくて大丈夫です。

5. この設定をコピーする

ライブ環境でこのリポジトリを取得します。

nix-shell -p git --run "git clone https://github.com/showyou/generic-development.git /tmp/generic-development"

まだこの変更がmainに入っていない場合は、作業ブランチをチェックアウトします。

cd /tmp/generic-development
nix-shell -p git --run "git checkout cursor/nixos-xfce-vm-setup-5332"

設定ファイルをコピーします。

cp /tmp/generic-development/nixos/{common,configuration,configuration-xfce,desktop-gnome,desktop-xfce,flake}.nix /mnt/etc/nixos/

hardware-configuration.nix は上書きしないでください。 上のコピーコマンドでは含めないようにしています。

通常の nixos-install でXFCE版を使う場合は、XFCE用の設定を configuration.nix として使います。

cp /mnt/etc/nixos/configuration-xfce.nix /mnt/etc/nixos/configuration.nix

Flakesでインストールする場合は、次の手順で .#nixos-vm-xfce を指定できるため、この上書きは不要です。

6. インストールする

初めてなら、まず通常のNixOSインストールとして実行するのが簡単です。

nixos-install

Flakesでインストールしたい場合は、代わりに次を使います。

cd /mnt/etc/nixos
nixos-install --flake .#nixos-vm

XFCE版をFlakesでインストールする場合は、次を使います。

cd /mnt/etc/nixos
nixos-install --flake .#nixos-vm-xfce

途中でrootパスワードを聞かれたら、好きなパスワードを設定します。 完了したら再起動します。

reboot

ISOを外して、インストール済みディスクから起動してください。

7. 初回ログイン後にやること

GNOMEまたはXFCEのログイン画面で以下を使います。

  • ユーザー名: nixos
  • パスワード: nixos

ログイン後、すぐにパスワードを変更してください。

passwd

SSHで入る場合は、VM内でIPアドレスを確認します。

hostname -I

手元の端末から接続します。

ssh nixos@VMのIPアドレス

ProxmoxでVMのネットワークをNATにしている場合は、ホスト側のポートフォワードが必要です。 同じLANから直接つなぐなら、ブリッジ接続にしてVMへIPアドレスが割り当たっていることを確認してください。

設定を変更したら、次のコマンドで反映します。

sudo nixos-rebuild switch

Flakesを使っている場合は、次のコマンドで反映します。

sudo nixos-rebuild switch --flake /etc/nixos#nixos-vm

XFCE版をFlakesで使っている場合は、次のコマンドです。

sudo nixos-rebuild switch --flake /etc/nixos#nixos-vm-xfce

日本語入力の設定を反映した直後は、一度ログアウトしてログインし直してください。 ログインし直した後、半角/全角 または Ctrl+Space で Mozc に切り替えられます。

zshの履歴設定も共通で有効化しています。

  • 履歴保存数: 100000件
  • 複数ターミナル間で履歴を共有
  • 重複履歴を整理して保存
  • 入力中の文字で上下キーを押すと、前方一致する履歴を検索
  • 過去の履歴からコマンド候補を薄く表示

履歴に残したくないコマンドは、先頭にスペースを入れて実行してください。

Fcitx5が起動しているか確認するには、次を実行します。

fcitx5-remote

入力メソッドの一覧をGUIで確認したい場合は、次を実行します。

fcitx5-configtool

「Input Method」に keyboard-jpMozc が入っていればOKです。

Dockerを使えるか確認します。

docker --version
docker run hello-world

フォントが反映されているか確認するには、次を実行します。

fc-match sans-serif
fc-match serif
fc-match monospace

デスクトップ環境やアプリ側で古いフォント表示が残る場合は、一度ログアウトしてログインし直してください。

よく変更する場所

ユーザー名を変えたい

common.nix のここを変えます。

users.users.nixos = {
  isNormalUser = true;
  description = "NixOS User";
  extraGroups = [
    "docker"
    "networkmanager"
    "wheel"
  ];
  initialPassword = "nixos";
  shell = pkgs.zsh;
};

例: ユーザー名を showyou にするなら:

users.users.showyou = {
  isNormalUser = true;
  description = "showyou";
  extraGroups = [
    "docker"
    "networkmanager"
    "wheel"
  ];
  initialPassword = "nixos";
  shell = pkgs.zsh;
};

パッケージを追加したい

共通アプリは common.nixenvironment.systemPackages に追加します。 GNOMEだけ、XFCEだけで使うものは desktop-gnome.nix または desktop-xfce.nix に追加します。

environment.systemPackages = with pkgs; [
  curl
  ghostty
  git
  vim
  wget
  vscode
];

VirtualBox Guest Additionsを使いたい

VirtualBoxでクリップボード共有や画面リサイズを使いたい場合は、 common.nix に次を追加します。

virtualisation.virtualbox.guest.enable = true;

トラブルシュート

nixos-install --flakehardware-configuration.nix がないと言われる

先に次を実行してください。

nixos-generate-config --root /mnt

ディスクが /dev/vda ではない

lsblk で表示されたインストール先ディスクに読み替えてください。 VirtualBoxでは /dev/sda のことがあります。

Booting from Hard Disk... から進まない

多くの場合、VMがLegacy BIOSで起動しているのに、ディスクはUEFI用としてインストールされている状態です。 この設定はUEFI前提なので、まず次を確認してください。

  1. VMをシャットダウンする
  2. VM設定でUEFI/EFIを有効にする
    • VirtualBox: 「設定」→「システム」→「マザーボード」→「EFIを有効化」
    • VMware/UTM/QEMU/KVMでもFirmwareをUEFIにする
  3. NixOSのISOを取り外す、または起動順でハードディスクを先にする
  4. もう一度起動する

それでも起動しない場合は、UEFIを有効にした状態でNixOS ISOから起動し直し、 既存のパーティションをマウントして nixos-install を再実行してください。

sudo -i

mount /dev/disk/by-label/nixos /mnt
mkdir -p /mnt/boot
mount /dev/disk/by-label/boot /mnt/boot

nixos-install
reboot

まだ何も大事なデータが入っていないVMなら、UEFI/EFIを有効にした状態で手順3からやり直すのが一番簡単です。

ブラウザでSSLエラーが表示される

VMではホストとの時刻差やNTP同期前の起動により、ブラウザでSSL証明書エラーが出ることがあります。 特に NET::ERR_CERT_DATE_INVALID や証明書の有効期限に関するエラーの場合は、まず時刻を確認してください。

date
timedatectl

時刻がずれている場合は、NTP同期を有効化して同期し直します。

sudo timedatectl set-ntp true
sudo systemctl restart systemd-timesyncd.service
timedatectl

この設定では services.timesyncd.enable = true; を明示して、起動後に時刻同期されるようにしています。 時刻が正しい場合、端末に出る handshake failed はChromium系ブラウザのバックグラウンド接続や、 HTTP/3/QUIC接続の失敗ログであることがあります。 ページ自体が開けているなら、多くの場合は無視して大丈夫です。

ページ自体が開けない場合は、ブラウザ以外でもTLS接続できるか確認します。

curl -Iv https://www.mozilla.org/
curl -Iv https://www.google.com/

curl でも失敗する場合は、DNS、プロキシ、ファイアウォール、証明書ストア側の問題です。 curl は成功してブラウザだけ失敗する場合は、ブラウザのエラーコード全文を確認してください。

日本語入力が出ない

この設定では、Fcitx5の既定入力メソッドとして keyboard-jpMozc を入れています。 設定を反映した後は、まずログアウトしてログインし直してください。

sudo nixos-rebuild switch

Flakesで使っている場合:

sudo nixos-rebuild switch --flake /etc/nixos#nixos-vm

XFCE版をFlakesで使っている場合:

sudo nixos-rebuild switch --flake /etc/nixos#nixos-vm-xfce

ログインし直した後、半角/全角 または Ctrl+Space で Mozc に切り替えます。 確認には次を使えます。

fcitx5-remote
fcitx5-configtool

fcitx5-configtool の「Input Method」に keyboard-jpMozc が入っていることを確認してください。 古いユーザー設定が残っている場合でも、この設定ではNixOS側のFcitx5設定を優先します。

{ pkgs, ... }:
{
nix.settings.experimental-features = [
"nix-command"
"flakes"
];
nixpkgs.config.allowUnfree = true;
boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = true;
networking.hostName = "nixos-vm";
networking.networkmanager.enable = true;
services.openssh = {
enable = true;
openFirewall = true;
settings = {
PasswordAuthentication = true;
KbdInteractiveAuthentication = true;
PermitRootLogin = "no";
};
};
time.timeZone = "Asia/Tokyo";
services.timesyncd.enable = true;
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";
};
console.keyMap = "jp106";
services.xserver.enable = true;
services.xserver.xkb = {
layout = "jp";
variant = "";
};
# Provide Mesa/OpenGL support for desktop apps and virtual GPU drivers.
hardware.graphics.enable = true;
i18n.inputMethod = {
enable = true;
type = "fcitx5";
fcitx5 = {
addons = with pkgs; [
fcitx5-gtk
fcitx5-mozc
kdePackages.fcitx5-configtool
];
ignoreUserConfig = true;
settings.inputMethod = {
"Groups/0" = {
Name = "Default";
"Default Layout" = "jp";
DefaultIM = "mozc";
};
"Groups/0/Items/0" = {
Name = "keyboard-jp";
Layout = "";
};
"Groups/0/Items/1" = {
Name = "mozc";
Layout = "";
};
GroupOrder."0" = "Default";
};
waylandFrontend = true;
};
};
environment.sessionVariables = {
GTK_IM_MODULE = "fcitx";
QT_IM_MODULE = "fcitx";
SDL_IM_MODULE = "fcitx";
XMODIFIERS = "@im=fcitx";
};
fonts = {
packages = with pkgs; [
noto-fonts
noto-fonts-cjk-sans
noto-fonts-cjk-serif
noto-fonts-color-emoji
source-han-code-jp
source-han-sans
source-han-serif
];
fontconfig.defaultFonts = {
sansSerif = [
"Source Han Sans JP"
"Noto Sans CJK JP"
];
serif = [
"Source Han Serif JP"
"Noto Serif CJK JP"
];
monospace = [
"Source Han Code JP"
"Noto Sans Mono CJK JP"
];
emoji = [
"Noto Color Emoji"
];
};
};
services.printing.enable = true;
programs.zsh = {
enable = true;
enableCompletion = true;
autosuggestions.enable = true;
histFile = "$HOME/.zsh_history";
histSize = 100000;
setOptions = [
"EXTENDED_HISTORY"
"HIST_EXPIRE_DUPS_FIRST"
"HIST_IGNORE_ALL_DUPS"
"HIST_IGNORE_SPACE"
"HIST_REDUCE_BLANKS"
"HIST_SAVE_NO_DUPS"
"INC_APPEND_HISTORY"
"SHARE_HISTORY"
];
interactiveShellInit = ''
autoload -Uz up-line-or-beginning-search down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey "^[[A" up-line-or-beginning-search
bindkey "^[[B" down-line-or-beginning-search
'';
ohMyZsh = {
enable = true;
plugins = [
"git"
"history"
"sudo"
];
theme = "robbyrussell";
};
};
programs.firefox.enable = true;
xdg.mime = {
enable = true;
defaultApplications = {
"text/html" = "firefox.desktop";
"x-scheme-handler/http" = "firefox.desktop";
"x-scheme-handler/https" = "firefox.desktop";
"x-scheme-handler/about" = "firefox.desktop";
"x-scheme-handler/unknown" = "firefox.desktop";
};
};
security.rtkit.enable = true;
services.pipewire = {
enable = true;
alsa.enable = true;
alsa.support32Bit = true;
pulse.enable = true;
};
# Useful on many QEMU/KVM and GNOME Boxes guests for clipboard and display resize.
services.spice-vdagentd.enable = true;
virtualisation.docker.enable = true;
users.users.nixos = {
isNormalUser = true;
description = "NixOS User";
extraGroups = [
"docker"
"networkmanager"
"wheel"
];
initialPassword = "nixos";
shell = pkgs.zsh;
};
environment.systemPackages = with pkgs; [
bitwarden-desktop
chromium
curl
discord
git
ghostty
obsidian
slack
vivaldi
vivaldi-ffmpeg-codecs
vim
vscode
wget
zed-editor
];
# Change this only after reading the NixOS release notes for the release you installed.
system.stateVersion = "25.05";
}
{ ... }:
{
imports = [
# Generate this file on the VM with:
# nixos-generate-config --root /mnt
./hardware-configuration.nix
./common.nix
./desktop-xfce.nix
];
}
{ ... }:
{
imports = [
# Generate this file on the VM with:
# nixos-generate-config --root /mnt
./hardware-configuration.nix
./common.nix
./desktop-gnome.nix
];
}
{ pkgs, ... }:
{
services.xserver.displayManager.gdm.enable = true;
services.xserver.desktopManager.gnome.enable = true;
environment.systemPackages = with pkgs; [
gnome-tweaks
];
}
{ pkgs, ... }:
{
services.xserver.displayManager.lightdm.enable = true;
services.xserver.desktopManager.xfce.enable = true;
services.displayManager.defaultSession = "xfce";
environment.systemPackages = with pkgs.xfce; [
xfce4-clipman-plugin
xfce4-whiskermenu-plugin
];
}
{
description = "Beginner-friendly NixOS GNOME and XFCE VM configurations";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.05";
};
outputs = { nixpkgs, ... }: {
nixosConfigurations = {
nixos-vm = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
./configuration.nix
];
};
nixos-vm-xfce = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
./configuration-xfce.nix
];
};
};
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment