Windows環境でのVirtualBoxとLubuntu仮想マシンのセットアップ

概要

Windows 11上にVirtualBoxとLubuntu 24.04 LTS仮想マシンをコマンド操作で構築し、Windows 95風の画面デザインを適用する手順を説明する。GUI操作を用いず、コマンドプロンプトに貼り付けて実行するコマンド列により、同じ構成の仮想マシンを再現できる。

構築は4つのステップで行う。ステップ1ではwingetによりVirtualBoxをインストールし、ステップ2ではVBoxManageコマンドでCPU・メモリ・ストレージなどを設定して仮想マシンを作成し、無人インストールによりUbuntu Desktop 24.04 LTSをインストールする。ステップ3ではGuest Additionsのインストールと日本語環境の構築を行い、ステップ4でlubuntu-desktopメタパッケージの追加とGNOME関連パッケージの削除によりLXQtデスクトップ環境としたうえで、Chicago95テーマによりWindows 95風のデザインを適用する。

Ubuntu Desktop の ISO を用いるのは、Lubuntu 公式 ISO のインストーラ(Calamares)が VBoxManage unattended install に対応していないためである。Ubuntu Desktop 22.10 以降の ISO に対しては、VirtualBox は subiquity(autoinstall)方式の無人インストーラを選択する。

前提として、管理者権限、70GB以上の空きディスク容量(ISOファイル約6GBと仮想ハードディスク最大60GB)、物理メモリ16GB以上(仮想マシンに8GBを割り当てるため)が必要である。Hyper-Vが有効な環境では、VirtualBoxはWindowsハイパーバイザプラットフォーム経由で動作し、実行速度が低下することがある。

本ページの記述はVirtualBox 7.2系(2026年7月21日リリースの7.2.14が7.2系の最新)とUbuntu 24.04.4 LTSを対象とする。Lubuntu 24.04 LTS が採用するLXQtのバージョンは1.4.0(Qt 5.15系)である。

取り組み内容

  1. コマンド列を実行し、仮想マシンを作成する。
  2. VBoxManage showvminfo で設定値を確認する。

用語

ステップ1からステップ4の構成

ステップ4:Windows 95 風デザインの適用(4章)
  LXQt環境への変更 + テーマ・アイコン・カーソル・パネル・壁紙の設定
  ─────────────────────────────────────────
ステップ3:ゲストOS環境の構築(3章)
  Guest Additions による統合 + 日本語環境の構築
  ─────────────────────────────────────────
ステップ2:仮想マシンの作成と Ubuntu のインストール(2章)
  VBoxManage による仮想マシンの構成 + 無人インストール
  ─────────────────────────────────────────
ステップ1:VirtualBox のインストール(1章)
  winget による VirtualBox のインストール
  ─────────────────────────────────────────

その他情報

項目 内容
目的 コマンドラインによる仮想環境構築の自動化とWindows 95風デザインの適用
使用ツール winget(パッケージ管理)、VBoxManage(VM管理)、SSH(ゲストOS操作)
構築環境 VirtualBox 7.2系 + Lubuntu 24.04 LTS(メモリ8GB、ストレージ60GB)
前提 Windows 11(64bit)、管理者権限、70GB以上の空き容量、物理メモリ16GB以上

目次

サイト内の関連情報

1. ステップ1:VirtualBox のインストール

1.1 インストール

管理者権限コマンドプロンプトを起動する (手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。

次のコマンドを実行する。Extension Pack は VirtualBox 本体と同一バージョンのものを取得する。

REM VirtualBox をシステム領域にインストール
winget install --scope machine --id Oracle.VirtualBox -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements

REM VBoxManage のパス設定(システム環境変数に永続化)
powershell -NoProfile -Command "$p='C:\Program Files\Oracle\VirtualBox'; $c=[Environment]::GetEnvironmentVariable('Path','Machine'); if((Test-Path $p) -and $c -notlike \"*$p*\"){[Environment]::SetEnvironmentVariable('Path',\"$p;$c\",'Machine')}"

REM 現在のセッションにも反映
set "PATH=C:\Program Files\Oracle\VirtualBox;%PATH%"

REM VirtualBox Extension Pack をインストール(本体と同一バージョンを取得)
for /f "tokens=1 delims=r" %a in ('VBoxManage --version') do set "VBOX_VER=%a"
set "EXTPACK_URL=https://download.virtualbox.org/virtualbox/%VBOX_VER%/Oracle_VirtualBox_Extension_Pack-%VBOX_VER%.vbox-extpack"
set "EXTPACK_FILE=%TEMP%\Oracle_VirtualBox_Extension_Pack-%VBOX_VER%.vbox-extpack"
curl -fL --retry 3 -o "%EXTPACK_FILE%" "%EXTPACK_URL%"
echo y | VBoxManage extpack install --replace "%EXTPACK_FILE%"
del "%EXTPACK_FILE%"

上記はコマンドプロンプトに直接貼り付けて実行する形式である。for の変数が %a と1個のパーセント記号になっているのは、そのためである。echo y は Extension Pack のライセンス条項(PUEL)への同意に対する応答である。

なお、Extension Pack は本ページの構成では必須ではない。USB 2.0/3.0 は VirtualBox 7.0 以降、本体に統合されている。Extension Pack が提供するのは VRDP によるリモート表示、ホストWebカメラの受け渡し、NVMe、PXEブート、ディスク暗号化などである。

1.2 インストールの確認

2. ステップ2:仮想マシンの作成と Ubuntu のインストール

VBoxManageのオプションでCPU・メモリ・ストレージ・ネットワークなどを設定し、Ubuntu仮想マシンを作成する。

2.1 VBoxManage modifyvm 主要オプション

オプション 設定内容 本手順の値
--memory RAMサイズ(MB) 8192
--cpus CPU数 2
--vram ビデオメモリ(MB) 128
--firmware ファームウェア種別 efi
--paravirt-provider 準仮想化プロバイダ(ゲストとホストの連携方式) kvm(Linux向け)
--graphicscontroller グラフィックコントローラ vmsvga

2.2 ストレージ構成とネットワーク構成

仮想マシン
├── SATA Controller(IntelAhci)
│   └── Port 0: 仮想HDD(60GB, VDI形式)
└── IDE Controller(PIIX4)
    └── Port 0: DVDドライブ(Ubuntu ISO → Guest Additions ISO → 空)

ネットワークはNATモードとし、ホストのポート2222をゲストのポート22(SSH)に転送する。ホストからの操作はこのSSH接続を通して行う。

2.3 仮想マシンの作成と Ubuntu の無人インストール

コマンドプロンプトを起動する (手順:Windowsキーまたはスタートメニュー → cmd と入力)。

次のコマンドを実行する。ここでは学習用に分かりやすさを優先し、ユーザー名とパスワードをコマンド内に直接書いている。インストール後はゲストOSにログインしてパスワードを変更する。ISOファイルは約6GBあり、ダウンロードには回線速度に応じた時間がかかる。

REM Ubuntu 24.04 LTS ISO ダウンロード設定
set "ISO_URL=https://releases.ubuntu.com/noble/ubuntu-24.04.4-desktop-amd64.iso"
set "ISO_DIR=%USERPROFILE%\VirtualBox VMs\ISO"
set "ISO_FILE=%ISO_DIR%\ubuntu-24.04.4-desktop-amd64.iso"

REM ISOディレクトリ作成
if not exist "%ISO_DIR%" mkdir "%ISO_DIR%"

REM ISOファイルが存在しない場合のみダウンロード
if exist "%ISO_FILE%" (
    echo Ubuntu 24.04 LTS ISO は既に存在します:%ISO_FILE%
) else (
    echo Ubuntu 24.04 LTS ISO をダウンロード中...
    curl -fL --retry 3 -C - -o "%ISO_FILE%" "%ISO_URL%"
)

REM 仮想マシン設定
set "VM_NAME=ubuntu2404"
set "VM_DIR=%USERPROFILE%\VirtualBox VMs\%VM_NAME%"
set "VDI_FILE=%VM_DIR%\%VM_NAME%.vdi"
set "MEMORY_MB=8192"
set "STORAGE_MB=61440"
set "USER_NAME=myuser"
set "USER_PASSWORD=changeme"
set "SSH_HOST_PORT=2222"
set "SSH_GUEST_PORT=22"

REM 同名VM存在確認
VBoxManage showvminfo "%VM_NAME%" >nul 2>&1
if not errorlevel 1 (
    echo 仮想マシン "%VM_NAME%" は既に存在します
    echo 削除する場合: VBoxManage unregistervm "%VM_NAME%" --delete
)

REM 仮想マシン作成・登録(--basefolder 配下に VM 用ディレクトリが自動生成される)
VBoxManage createvm --name="%VM_NAME%" --ostype=Ubuntu24_LTS_64 --register --basefolder="%USERPROFILE%\VirtualBox VMs"

REM 基本設定(メモリ8GB, CPU2コア)
VBoxManage modifyvm "%VM_NAME%" --memory=%MEMORY_MB% --cpus=2 --ioapic=on --acpi=on

REM グラフィック設定
VBoxManage modifyvm "%VM_NAME%" --vram=128 --graphicscontroller=vmsvga

REM ファームウェア設定(EFI)
VBoxManage modifyvm "%VM_NAME%" --firmware=efi

REM パフォーマンス設定
VBoxManage modifyvm "%VM_NAME%" --paravirt-provider=kvm --nested-paging=on

REM 入力デバイス設定
VBoxManage modifyvm "%VM_NAME%" --mouse=usbtablet --keyboard=usb

REM ネットワーク設定(NAT / virtio)
VBoxManage modifyvm "%VM_NAME%" --nic1=nat --nic-type1=virtio --cable-connected1=on

REM SSHポートフォワーディング設定(ホスト2222 → ゲスト22)
VBoxManage modifyvm "%VM_NAME%" --nat-pf1="ssh,tcp,,%SSH_HOST_PORT%,,%SSH_GUEST_PORT%"

REM オーディオ設定(VirtualBox 7 系では --audio-driver で有効化する)
VBoxManage modifyvm "%VM_NAME%" --audio-driver=default --audio-controller=hda --audio-out=on

REM クリップボード・ドラッグ&ドロップ共有
VBoxManage modifyvm "%VM_NAME%" --clipboard-mode=bidirectional --drag-and-drop=bidirectional

REM USB設定(VirtualBox 7 系では EHCI も本体機能)
VBoxManage modifyvm "%VM_NAME%" --usb-ohci=on --usb-ehci=on

REM RTC設定(時計をUTCで扱う。Linux ゲストの標準的な構成)
VBoxManage modifyvm "%VM_NAME%" --rtc-use-utc=on

REM 仮想ハードディスク作成(60GB)
VBoxManage createmedium disk --filename="%VDI_FILE%" --size=%STORAGE_MB% --format=VDI --variant=Standard

REM SATAコントローラ作成・ハードディスク接続
VBoxManage storagectl "%VM_NAME%" --name="SATA Controller" --add=sata --controller=IntelAhci --bootable=on
VBoxManage storageattach "%VM_NAME%" --storagectl="SATA Controller" --port=0 --device=0 --type=hdd --medium="%VDI_FILE%"

REM IDEコントローラ作成・DVDドライブ接続
VBoxManage storagectl "%VM_NAME%" --name="IDE Controller" --add=ide --controller=PIIX4
VBoxManage storageattach "%VM_NAME%" --storagectl="IDE Controller" --port=0 --device=0 --type=dvddrive --medium="%ISO_FILE%"

REM ブート順序設定
VBoxManage modifyvm "%VM_NAME%" --boot1=dvd --boot2=disk --boot3=none --boot4=none

REM 無人インストール設定・起動
VBoxManage unattended install "%VM_NAME%" ^
  --iso="%ISO_FILE%" ^
  --user=%USER_NAME% ^
  --password=%USER_PASSWORD% ^
  --full-user-name="%USER_NAME%" ^
  --locale=ja_JP.UTF-8 ^
  --time-zone=Asia/Tokyo ^
  --hostname=ubuntu2404.localdomain ^
  --no-install-additions ^
  --post-install-command="/usr/bin/apt-get install -y --no-install-recommends openssh-server" ^
  --start-vm=separate

echo 無人インストールが開始されました

インストールの進行状況は、別ウィンドウで開く仮想マシンの画面で確認できる。--no-install-additions を指定しているのは、Guest Additions のインストールをステップ3で行うためである。--ostype に指定できる識別子の一覧は VBoxManage list ostypes で確認できる。

--post-install-command について注意点がある。VirtualBox はこのオプションの値を、ゲストOS内で実行される後処理スクリプトの中に、シェルの引数配列として展開する。そのため &&|> といったシェル演算子や、複数コマンドの連結は解釈されない。ここでは単一のコマンド(openssh-server のインストール)のみを指定し、SSH鍵の登録などその後の設定は2.4節以降でSSH経由で行う。

また --rtc-use-utc=on を指定している場合、無人インストールのテンプレートは --time-zone の値ではなく Etc/UTC をゲストに設定する。日本時間への変更は3.2節で timedatectl により行う。

2.4 インストール完了の待機とSSH鍵の登録

インストールが完了するとVMは自動的に再起動し、openssh-server が起動する。以下では、ホスト側のポート2222が応答することをもってインストール完了を判定する。その後、以降の操作をパスワード入力なしで行えるよう、SSH公開鍵を登録する。

コマンドプロンプトを起動する (手順:Windowsキーまたはスタートメニュー → cmd と入力)。

REM === 変数の設定 ===
set "VM_NAME=ubuntu2404"
set "USER_NAME=myuser"
set "USER_PASSWORD=changeme"
set "SSH_HOST_PORT=2222"

REM ホストキーの警告・エラーを回避するためのSSHオプション
set "SSH_OPTS=-o StrictHostKeyChecking=no -o UserKnownHostsFile=NUL"

REM === SSH ポートが応答するまで待機(最大30分) ===
echo SSH ポートを待機中 ...
powershell -NoProfile -Command "$port=%SSH_HOST_PORT%; for($i=1; $i -le 180; $i++){ if(Test-NetConnection -ComputerName '127.0.0.1' -Port $port -InformationLevel Quiet -WarningAction SilentlyContinue){ Write-Host 'SSH ポートが応答しました'; exit 0 }; Write-Host 'SSH 未応答 ... 10 秒待機します'; Start-Sleep -Seconds 10 }; exit 1"

REM === インストール ISO の取り外し ===
VBoxManage storageattach "%VM_NAME%" --storagectl "IDE Controller" --port 0 --device 0 --type dvddrive --medium emptydrive

REM === SSH 鍵の作成(未作成の場合のみ) ===
if not exist "%USERPROFILE%\.ssh" mkdir "%USERPROFILE%\.ssh"
if not exist "%USERPROFILE%\.ssh\id_ed25519" (
    ssh-keygen -t ed25519 -f "%USERPROFILE%\.ssh\id_ed25519" -N ""
)

REM === 公開鍵をゲストへ登録(ここで一度だけパスワードを入力する) ===
type "%USERPROFILE%\.ssh\id_ed25519.pub" | ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

REM === 鍵認証で接続できることの確認(パスワードを求められなければ成功) ===
ssh %SSH_OPTS% -o BatchMode=yes -p %SSH_HOST_PORT% %USER_NAME%@localhost "echo SSH_KEY_OK" <nul

REM === システムの更新 ===
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "echo '%USER_PASSWORD%' | sudo -S sh -c 'apt-get update && DEBIAN_FRONTEND=noninteractive apt-get upgrade -y'" <nul

echo === 動作確認 ===
VBoxManage list vms
VBoxManage showvminfo "%VM_NAME%" | findstr /C:"Memory size" /C:"Number of CPUs" /C:"Firmware" /C:"VRAM size"

公開鍵の登録時のみ、ゲストOSのパスワード(changeme)の入力を求められる。以降のSSH接続は鍵認証で行われるため、入力は不要である。

確認すべき出力項目:

3. ステップ3:ゲストOS環境の構築

Guest Additionsによるホストとゲストの間の統合と、日本語環境の構築を行う。

3.1 Guest Additions のインストール

Guest Additionsにより、画面解像度の自動調整、クリップボード共有、共有フォルダ、マウス統合、時刻同期が利用可能となる。カーネルモジュールのビルドに build-essentialdkms、カーネルヘッダが必要である。

コマンドプロンプトを起動する (手順:Windowsキーまたはスタートメニュー → cmd と入力)。

set "VM_NAME=ubuntu2404"
set "USER_NAME=myuser"
set "USER_PASSWORD=changeme"
set "SSH_HOST_PORT=2222"

REM ホストキーの警告・エラーを回避するためのSSHオプション
set "SSH_OPTS=-o StrictHostKeyChecking=no -o UserKnownHostsFile=NUL"

REM 依存パッケージのインストール(ビルドに必要なツールとカーネルヘッダ)
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "echo '%USER_PASSWORD%' | sudo -S sh -c 'apt-get update && apt-get install -y build-essential dkms linux-headers-$(uname -r)'" <nul

REM Guest Additions ISOをマウント(--medium additions でVBoxが自動解決)
VBoxManage storageattach "%VM_NAME%" --storagectl "IDE Controller" --port 0 --device 0 --type dvddrive --medium additions

REM Guest Additionsのビルド・インストール(終了コード2はモジュール読込済みを意味するため許容する)
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "echo '%USER_PASSWORD%' | sudo -S sh -c 'mkdir -p /mnt/cdrom && mount /dev/cdrom /mnt/cdrom && (/mnt/cdrom/VBoxLinuxAdditions.run --nox11 || true) && umount /mnt/cdrom'" <nul

REM Guest Additions ISO の取り外し
VBoxManage storageattach "%VM_NAME%" --storagectl "IDE Controller" --port 0 --device 0 --type dvddrive --medium emptydrive

REM 再起動(ゲストOS側から reboot を実行する)
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "echo '%USER_PASSWORD%' | sudo -S reboot" <nul

REM === 再起動後の SSH 接続待機 ===
timeout /t 30 /nobreak
set "SSHGA_DONE=" & for /L %i in (1,1,60) do @(if not defined SSHGA_DONE (timeout /t 10 /nobreak >nul & ssh -o BatchMode=yes -o StrictHostKeyChecking=no -o UserKnownHostsFile=NUL -o ConnectTimeout=5 -p %SSH_HOST_PORT% %USER_NAME%@localhost "echo SSH_OK" <nul 2>nul | findstr "SSH_OK" >nul && (echo Guest Additions インストール済みの VM が起動しました & set "SSHGA_DONE=1") || (echo SSH 未応答 ... 10 秒待機します)))

REM インストールの確認(バージョンが表示される)
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "VBoxControl --version" <nul

VBoxLinuxAdditions.run は、カーネルモジュールを読み込み済みで再起動が必要な場合に終了コード2を返す。これは異常ではないため、上記では || true により後続の umount が実行されるようにしている。

3.2 日本語環境の構築

ロケール、タイムゾーン、日本語フォント、日本語入力を設定する。LXQtでの入力メソッドフレームワークは Fcitx5、日本語変換エンジンは Mozc を用いる。入力の切替キーは半角/全角キー(Zenkaku_Hankaku)とAlt+`(Alt+grave)とする。後続の節でホームディレクトリ配下を英語名(~/Documents 等)で参照するため、XDGユーザーディレクトリは英語名に固定する。

この節は3.1節の完了後、LXQtの導入(4.2節)より前に実行する。fcitx5-frontend-qt5 はこの時点ではQt5アプリケーションが少ないが、LXQt 1.4.0 が Qt 5.15 系であるため必要となる。

コマンドプロンプトを起動する (手順:Windowsキーまたはスタートメニュー → cmd と入力)。

set "VM_NAME=ubuntu2404"
set "USER_NAME=myuser"
set "USER_PASSWORD=changeme"
set "SSH_HOST_PORT=2222"

REM ホストキーの警告・エラーを回避するためのSSHオプション
set "SSH_OPTS=-o StrictHostKeyChecking=no -o UserKnownHostsFile=NUL"

REM 日本語ロケール、タイムゾーン、日本語フォント、Fcitx5 と Mozc
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "echo '%USER_PASSWORD%' | sudo -S sh -c 'locale-gen ja_JP.UTF-8 && update-locale LANG=ja_JP.UTF-8 && timedatectl set-timezone Asia/Tokyo && apt-get install -y language-pack-ja fonts-noto-cjk fonts-noto-cjk-extra fonts-vlgothic fcitx5 fcitx5-mozc fcitx5-config-qt fcitx5-frontend-qt5 fcitx5-frontend-qt6 fcitx5-frontend-gtk3 fcitx5-frontend-gtk4'" <nul

REM XDG ユーザーディレクトリを英語名に固定
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "LC_ALL=C xdg-user-dirs-update --force" <nul

REM 入力メソッドの環境変数設定
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "mkdir -p ~/.config/environment.d && printf 'GTK_IM_MODULE=fcitx\nQT_IM_MODULE=fcitx\nXMODIFIERS=@im=fcitx\n' > ~/.config/environment.d/im.conf && printf 'export GTK_IM_MODULE=fcitx\nexport QT_IM_MODULE=fcitx\nexport XMODIFIERS=@im=fcitx\n' > ~/.xprofile" <nul

REM Fcitx5 のトリガーキー設定(半角/全角キーと Alt+`)
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "mkdir -p ~/.config/fcitx5 && printf '[Hotkey/TriggerKeys]\n0=Zenkaku_Hankaku\n1=Alt+grave\n\n[Hotkey/EnumerateForwardKeys]\n0=Control+Shift_R\n\n[Hotkey/EnumerateBackwardKeys]\n0=Control+Shift_L\n\n[Hotkey/PrevPage]\n0=Up\n\n[Hotkey/NextPage]\n0=Down\n\n[Behavior]\nActiveByDefault=False\nShowInputMethodInformation=True\nDefaultPageSize=5\n' > ~/.config/fcitx5/config" <nul

REM Fcitx5 のプロファイル設定(キーボードと Mozc)
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "printf '[Groups/0]\nName=Default\nDefault Layout=jp\nDefaultIM=mozc\n\n[Groups/0/Items/0]\nName=keyboard-jp\nLayout=\n\n[Groups/0/Items/1]\nName=mozc\nLayout=\n\n[GroupOrder]\n0=Default\n' > ~/.config/fcitx5/profile" <nul

REM Fcitx5 の自動起動設定(LXQt のシステムトレイ起動後に開始する)
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "mkdir -p ~/.config/autostart && printf '[Desktop Entry]\nType=Application\nName=Fcitx5\nExec=fcitx5 -d\nX-LXQt-Need-Tray=true\n' > ~/.config/autostart/fcitx5.desktop" <nul

REM 再起動(設定を反映)
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "echo '%USER_PASSWORD%' | sudo -S reboot" <nul

REM === 再起動後の SSH 接続待機 ===
timeout /t 30 /nobreak
set "SSHJA_DONE=" & for /L %i in (1,1,60) do @(if not defined SSHJA_DONE (timeout /t 10 /nobreak >nul & ssh -o BatchMode=yes -o StrictHostKeyChecking=no -o UserKnownHostsFile=NUL -o ConnectTimeout=5 -p %SSH_HOST_PORT% %USER_NAME%@localhost "echo SSH_OK" <nul 2>nul | findstr "SSH_OK" >nul && (echo 日本語環境の構築が完了しました & set "SSHJA_DONE=1") || (echo SSH 未応答 ... 10 秒待機します)))

LXQt 1.4.0 は Qt 5.15 系で構成されるため fcitx5-frontend-qt5 が必要である。Qt 6 や GTK4 のアプリケーションを併用する場合に備えて、対応するフロントエンドも導入している。X-LXQt-Need-Tray=true は、システムトレイが利用可能になってからFcitx5を起動させるためのLXQt独自のキーである。日本語配列キーボードでない場合は、Alt+`(Alt+grave)で入力を切り替える。

4. ステップ4:LXQt 環境への変更と Windows 95 風デザインの適用

LXQt 環境への変更と Windows 95 風デザインの適用

4.1 設定するレイヤ

LXQtでは、画面外観を構成する要素が複数のレイヤに分かれ、それぞれ別の設定ファイルで管理される。統一した外観を得るには、以下のレイヤを個別に設定する。本手順ではすべてのレイヤに Chicago95 の各テーマを割り当てる。

レイヤ対象設定ファイル設定値
LXQt テーマパネル、メニュー、通知~/.config/lxqt/lxqt.confthemeLXQt標準のテーマ(本手順では変更しない)
アイコンテーマデスクトップ、ファイルマネージャ、メニュー~/.config/lxqt/lxqt.conficon_themeChicago95
Qt ウィジェットスタイルQt アプリケーションの部品~/.config/lxqt/lxqt.conf[Qt] styleWindows(Qt 標準スタイル)
Openbox ウィンドウ装飾タイトルバー、ウィンドウ枠~/.config/openbox/rc.xmlChicago95
GTK テーマGTK アプリケーションの外観~/.config/gtk-3.0/settings.iniChicago95
カーソルテーママウスカーソル~/.config/lxqt/session.conf[Mouse]Chicago95_Cursor_Black
パネル画面下部のタスクバー~/.config/lxqt/panel.conf下端・高さ30ピクセル
壁紙デスクトップ背景~/.config/pcmanfm-qt/lxqt/settings.conf任意の画像ファイル

Chicago95 は GitHub から git clone で取得できるため、ダウンロードから配置までをコマンドで完結できる。一方、opendesktop.org 系のサイト(pling.com、gnome-look.org、store.kde.org は同一のバックエンドを共有する)で配布されるテーマは、ページ内の file_id が随時変更されるため curl による直リンクのダウンロードができない。それらを使う場合は、ホスト側のWebブラウザで該当ページを開き「Files」からアーカイブをダウンロードしたうえで、scp によりゲストOSへ転送する。各テーマ・壁紙は、それぞれの配布元のライセンスに従って利用する。Chicago95 のライセンスは GPL-3.0+/MIT である。

4.2 LXQt デスクトップ環境への変更

SSH経由で lubuntu-desktop を追加し、GNOME関連パッケージを削除してLXQtデスクトップ環境とする。lubuntu-desktop メタパッケージにより、LXQt、Openbox、PCManFM-Qt、SDDM、Lubuntu標準のアプリケーション群がインストールされる。続いてGNOMEとGDM3を削除し、SDDMの自動ログインを設定する。DEBIAN_FRONTEND=noninteractive はインストール中の対話的プロンプトを抑制する指定である。

コマンドプロンプトを起動する (手順:Windowsキーまたはスタートメニュー → cmd と入力)。

set "VM_NAME=ubuntu2404"
set "USER_NAME=myuser"
set "USER_PASSWORD=changeme"
set "SSH_HOST_PORT=2222"

REM ホストキーの警告・エラーを回避するためのSSHオプション
set "SSH_OPTS=-o StrictHostKeyChecking=no -o UserKnownHostsFile=NUL"

REM lubuntu-desktop のインストール
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "echo '%USER_PASSWORD%' | sudo -S sh -c 'DEBIAN_FRONTEND=noninteractive apt-get install -y lubuntu-desktop'" <nul

REM ディスプレイマネージャを SDDM に設定
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "printf '/usr/bin/sddm\n' > /tmp/ddm" <nul
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "echo '%USER_PASSWORD%' | sudo -S sh -c 'cp /tmp/ddm /etc/X11/default-display-manager && rm -f /tmp/ddm'" <nul

REM GNOME 関連パッケージの削除と不要な依存パッケージの削除
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "echo '%USER_PASSWORD%' | sudo -S sh -c 'DEBIAN_FRONTEND=noninteractive apt-get purge -y ubuntu-desktop ubuntu-desktop-minimal ubuntu-session gnome-shell gnome-session gnome-control-center gnome-terminal nautilus gdm3 && apt-get autoremove -y'" <nul

REM SDDM の自動ログイン設定
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "printf '[Autologin]\nUser=%USER_NAME%\nSession=Lubuntu.desktop\n' > /tmp/autologin.conf" <nul
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "echo '%USER_PASSWORD%' | sudo -S sh -c 'mkdir -p /etc/sddm.conf.d && cp /tmp/autologin.conf /etc/sddm.conf.d/autologin.conf && rm -f /tmp/autologin.conf'" <nul

REM 利用可能なセッション名の確認(Lubuntu.desktop と lxqt.desktop が表示される)
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "ls /usr/share/xsessions/" <nul

REM 再起動(ゲストOS側から reboot を実行する)
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "echo '%USER_PASSWORD%' | sudo -S reboot" <nul

REM === 再起動後の SSH 接続待機 ===
timeout /t 30 /nobreak
set "SSH_DONE=" & for /L %i in (1,1,60) do @(if not defined SSH_DONE (timeout /t 10 /nobreak >nul & ssh -o BatchMode=yes -o StrictHostKeyChecking=no -o UserKnownHostsFile=NUL -o ConnectTimeout=5 -p %SSH_HOST_PORT% %USER_NAME%@localhost "echo SSH_OK" <nul 2>nul | findstr "SSH_OK" >nul && (echo LXQt デスクトップ環境の構築が完了しました & set "SSH_DONE=1") || (echo SSH 未応答 ... 10 秒待機します)))

自動ログインのセッション名には Lubuntu.desktop を指定している。これは lubuntu-default-settings パッケージが /usr/share/xsessions/Lubuntu.desktop を提供し、Lubuntu独自の既定設定(/etc/xdg/xdg-Lubuntu 配下)を読み込むセッションだからである。lxqt-session が提供する素の lxqt.desktop を使う場合は、そちらを指定する。上記の ls /usr/share/xsessions/ の出力で実際のファイル名を確認できる。

仮想マシンの画面を表示するには VBoxManage startvm "ubuntu2404" --type gui を実行する。自動ログイン設定により、myuser としてLXQtデスクトップが表示される。

4.3 テーマファイルの配置

コマンドプロンプトを起動する (手順:Windowsキーまたはスタートメニュー → cmd と入力)。

次のコマンドを実行する。Chicago95のリポジトリからGTK/Openboxテーマ・アイコン・カーソルのみを抽出して配置する。Theme/Chicago95 ディレクトリには gtk-3.0gtk-3.22openbox-3 などのサブディレクトリが含まれており、GTKテーマとOpenboxウィンドウ装飾の両方を兼ねる。

set "VM_NAME=ubuntu2404"
set "USER_NAME=myuser"
set "USER_PASSWORD=changeme"
set "SSH_HOST_PORT=2222"
set "SSH_OPTS=-o StrictHostKeyChecking=no -o UserKnownHostsFile=NUL"

REM パッケージリスト更新とgitのインストール
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "echo '%USER_PASSWORD%' | sudo -S sh -c 'apt-get update && apt-get install -y git'" <nul

REM 配置用ディレクトリの作成
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "mkdir -p ~/.themes ~/.icons" <nul

REM Chicago95 リポジトリの取得
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "rm -rf /tmp/Chicago95 && git clone --depth 1 https://github.com/grassmunk/Chicago95.git /tmp/Chicago95" <nul

REM GTK/Openboxテーマ、アイコン、カーソルの配置
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "cp -r /tmp/Chicago95/Theme/Chicago95 ~/.themes/ && cp -r /tmp/Chicago95/Icons/Chicago95 ~/.icons/ && cp -r /tmp/Chicago95/Cursors/Chicago95_Cursor_Black ~/.icons/" <nul

REM 一時ファイルの削除と配置の確認
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "rm -rf /tmp/Chicago95 && ls -d ~/.themes/Chicago95 ~/.icons/Chicago95 ~/.icons/Chicago95_Cursor_Black" <nul

REM Openbox ウィンドウ装飾が含まれることの確認
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "ls -d ~/.themes/Chicago95/openbox-3 ~/.themes/Chicago95/gtk-3.0" <nul

最後の2つのコマンドの出力で、実際に配置されたディレクトリ名を確認する。次節の設定値は、この名前(Chicago95 および Chicago95_Cursor_Black)と一致させる必要がある。

4.4 テーマの適用

コマンドプロンプトを起動する (手順:Windowsキーまたはスタートメニュー → cmd と入力)。

設定ファイルの直接編集は、LXQtセッションによる上書きを避けるためSSH経由で行う。壁紙は、あらかじめホスト側の %USERPROFILE%\Downloads\wallpaper.jpg に用意した画像を転送して使用する。

set "VM_NAME=ubuntu2404"
set "USER_NAME=myuser"
set "USER_PASSWORD=changeme"
set "SSH_HOST_PORT=2222"
set "SSH_OPTS=-o StrictHostKeyChecking=no -o UserKnownHostsFile=NUL"

REM アイコンテーマ・Qt ウィジェットスタイルの設定
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "mkdir -p ~/.config/lxqt && printf '[General]\n__userfile__=true\nicon_theme=Chicago95\nsingle_click_activate=false\n\n[Qt]\nstyle=Windows\nfont=\"Sans,10,-1,5,50,0,0,0,0,0\"\n' > ~/.config/lxqt/lxqt.conf" <nul

REM カーソルテーマの設定(session.conf を新規に作成する)
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "printf '[General]\n__userfile__=true\nwindow_manager=openbox\n\n[Mouse]\ncursor_theme=Chicago95_Cursor_Black\ncursor_size=24\n' > ~/.config/lxqt/session.conf && mkdir -p ~/.icons/default && printf '[Icon Theme]\nName=Default\nInherits=Chicago95_Cursor_Black\n' > ~/.icons/default/index.theme" <nul

REM Openbox ウィンドウ装飾の設定(Lubuntu の既定設定を複製してテーマ名を書き換える)
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "mkdir -p ~/.config/openbox && [ -f ~/.config/openbox/rc.xml ] || cp /etc/xdg/xdg-Lubuntu/openbox/rc.xml ~/.config/openbox/rc.xml; sed -i '0,/<name>.*<\/name>/s|<name>.*</name>|<name>Chicago95</name>|' ~/.config/openbox/rc.xml" <nul

REM GTK3 テーマの設定
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "mkdir -p ~/.config/gtk-3.0 && printf '[Settings]\ngtk-theme-name=Chicago95\ngtk-icon-theme-name=Chicago95\ngtk-cursor-theme-name=Chicago95_Cursor_Black\ngtk-font-name=Noto Sans CJK JP 10\n' > ~/.config/gtk-3.0/settings.ini" <nul

REM パネルの設定(画面下部、高さ30ピクセル、幅100パーセント)
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "printf 'panels=panel1\n\n[panel1]\nalignment=-1\ndesktop=0\nhidable=false\niconSize=22\nlineCount=1\nwidth=100\nwidth-percent=true\nlockPanel=true\npanelSize=30\nplugins=mainmenu, quicklaunch, taskbar, tray, statusnotifier, worldclock\nposition=Bottom\nreserve-space=true\n\n[mainmenu]\ntype=mainmenu\nalignment=Left\n\n[quicklaunch]\ntype=quicklaunch\nalignment=Left\n\n[taskbar]\ntype=taskbar\nalignment=Left\n\n[tray]\ntype=tray\nalignment=Right\n\n[statusnotifier]\ntype=statusnotifier\nalignment=Right\n\n[worldclock]\ntype=worldclock\nalignment=Right\n' > ~/.config/lxqt/panel.conf" <nul

REM 壁紙の転送と設定(BgColor は壁紙が読み込めない場合の背景色)
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "mkdir -p ~/.local/share/wallpapers" <nul
scp -P %SSH_HOST_PORT% -o StrictHostKeyChecking=no -o UserKnownHostsFile=NUL "%USERPROFILE%\Downloads\wallpaper.jpg" %USER_NAME%@localhost:~/.local/share/wallpapers/
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "mkdir -p ~/.config/pcmanfm-qt/lxqt && printf '[Desktop]\nWallpaper=/home/%USER_NAME%/.local/share/wallpapers/wallpaper.jpg\nWallpaperMode=stretch\nBgColor=#008080\nFgColor=#ffffff\nDesktopShortcuts=Home, Trash, Computer\nShowHidden=false\n\n[System]\nFallbackIconThemeName=Chicago95\n\n[FolderView]\nBigIconSize=48\n' > ~/.config/pcmanfm-qt/lxqt/settings.conf" <nul

REM デスクトップアイコンの配置
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "mkdir -p ~/Desktop && printf '[Desktop Entry]\nType=Application\nName=マイ コンピュータ\nExec=pcmanfm-qt computer:///\nIcon=computer\nTerminal=false\n' > ~/Desktop/computer.desktop && printf '[Desktop Entry]\nType=Application\nName=ごみ箱\nExec=pcmanfm-qt trash:///\nIcon=user-trash\nTerminal=false\n' > ~/Desktop/trash.desktop && printf '[Desktop Entry]\nType=Application\nName=マイ ドキュメント\nExec=pcmanfm-qt /home/%USER_NAME%/Documents\nIcon=folder-documents\nTerminal=false\n' > ~/Desktop/home.desktop && chmod +x ~/Desktop/*.desktop" <nul

REM 再起動(設定を反映)
ssh %SSH_OPTS% -p %SSH_HOST_PORT% %USER_NAME%@localhost "echo '%USER_PASSWORD%' | sudo -S reboot" <nul

REM === 再起動後の SSH 接続待機 ===
timeout /t 30 /nobreak
set "SSHXP_DONE=" & for /L %i in (1,1,60) do @(if not defined SSHXP_DONE (timeout /t 10 /nobreak >nul & ssh -o BatchMode=yes -o StrictHostKeyChecking=no -o UserKnownHostsFile=NUL -o ConnectTimeout=5 -p %SSH_HOST_PORT% %USER_NAME%@localhost "echo SSH_OK" <nul 2>nul | findstr "SSH_OK" >nul && (echo デザインの適用が完了しました & set "SSHXP_DONE=1") || (echo SSH 未応答 ... 10 秒待機します)))

REM 仮想マシンの画面を表示
VBoxManage startvm "%VM_NAME%" --type gui

パネルの設定について補足する。lxqt-panel が読むキー名は、長さが widthwidth-percent、パネル位置が position、太さが panelSize である。alignment はパネル自体の配置を表し、-1 が左(下部パネルの場合は左寄せ)、0 が中央、1 が右である。各プラグインのセクション内の alignmentLeft または Right の文字列で、パネル内での寄せ方を指定する。

壁紙の設定について補足する。~/.config/pcmanfm-qt/lxqt/settings.conf[Desktop] セクションで WallpaperWallpaperModeBgColor を指定する。デスクトップアイコンのサイズは [FolderView] セクションの BigIconSize で指定する。WallpaperMode には stretchfitcentertilezoomcolor が指定できる。BgColor#008080 はWindows 95の既定のデスクトップ背景色(ティール)である。

5. トラブルシューティング

5.1 よくある問題と対処

症状 原因 対処
VBoxManageが認識されない PATHが通っていない コマンドプロンプトを再起動、または絶対パス "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" で実行する。
ISOダウンロード失敗 ネットワーク切断、通信エラー 同じ curl -fL --retry 3 -C - -o のコマンドを再実行すると中断位置から再開する。改善しない場合は releases.ubuntu.com からブラウザでダウンロードし、%USERPROFILE%\VirtualBox VMs\ISO に置く。
Extension Pack のインストール失敗 本体とバージョンが一致していない VBoxManage --version の出力から得たバージョンでURLを組み立て直す。download.virtualbox.org で該当バージョンのディレクトリを確認する。
--ostype の指定でエラーになる 使用中のVirtualBoxが当該識別子を持たない VBoxManage list ostypes で識別子の一覧を表示し、Ubuntu 24.04 LTS 64bit に対応する識別子を指定する。
無人インストールが途中で対話待ちになる ISOが古い、または --ostype の検出結果が Desktop でない Ubuntu Desktop 22.10 以降の ISO を用いる。VirtualBox は 22.10 以降の Desktop に対して subiquity(autoinstall)方式を選択する。それ以前は preseed 方式となり、Desktop 版では正しく動作しない。
--post-install-command の内容が実行されない &&> を含む複合コマンドを指定した このオプションは単一のコマンドとして引数展開されるため、シェル演算子は解釈されない。単一コマンドのみを指定し、複雑な設定はインストール後にSSH経由で行う。ゲスト内の /var/log/vboxpostinstall.log に実行結果が記録される。
インストール後にディスクから起動しない ISOが取り外されていない、またはブート順序 ISOを --medium emptydrive で取り外し、VBoxManage modifyvm "ubuntu2404" --boot1=disk --boot2=none を実行する。EFIでインストールしているため、事後に --firmware=bios へ変更しても起動しない。復旧できない場合はVMを削除し、2.3節から再実行する。
Hyper-V競合エラー、実行速度の低下 Hyper-V やメモリ整合性などによりハイパーバイザが動作中 管理者権限のコマンドプロンプトで bcdedit /set hypervisorlaunchtype off を実行し、Windowsを再起動する。「Windows の機能の有効化または無効化」でHyper-Vと仮想マシンプラットフォームのチェックを外す方法もある。
SSH 接続がタイムアウトする ポートフォワーディング未設定、または SSH サーバ未起動 VBoxManage showvminfo "ubuntu2404" --machinereadable | findstr natpf で設定を確認。VM 内で sudo systemctl status ssh を確認する。
SSH ホスト鍵エラー VM 再作成による鍵の不一致 ssh-keygen -R "[localhost]:2222" で既知のホスト鍵を削除する。本ページのコマンド列は -o UserKnownHostsFile=NUL によりこの問題を回避している。
ログイン後に黒い画面になる SDDM がセッションを認識していない ls /usr/share/xsessions/Lubuntu.desktop の存在を確認し、/etc/sddm.conf.d/autologin.confSession= の値を実在するファイル名に合わせる。sudo dpkg-reconfigure sddm も試す。
画面解像度が変更できない Guest Additions のカーネルモジュールが読み込まれていない lsmod | grep vboxguest で確認し、表示されない場合は3.1節のコマンドを再実行する。/var/log/vboxadd-setup.log にビルドの失敗理由が記録される。
テーマが適用されない 設定ファイル中のテーマ名が実際のディレクトリ名と一致していない ls ~/.themes ~/.icons の出力と、~/.config/lxqt/lxqt.conf~/.config/gtk-3.0/settings.ini に記述した名前を一致させる。
Openbox のウィンドウ装飾が変わらない 編集した設定ファイルがセッションで使われていない Lubuntu 22.04 以降、LXQtセッションのOpenbox設定は ~/.config/openbox/rc.xml である(20.04以前は lxqt-rc.xml)。~/.config/openbox/ の中身を確認し、openbox --reconfigure を実行する。
半角/全角キーで日本語入力に切り替わらない Fcitx5 が起動していない システムトレイのアイコンを確認し、表示されていなければ fcitx5 -d で起動する。設定変更後は fcitx5 -r で再起動する。fcitx5-diagnose で環境変数の設定状況を診断できる。

5.2 VMの削除と再作成

REM VM登録解除とファイル削除
VBoxManage unregistervm "ubuntu2404" --delete

REM 仮想ディスクのみ削除(VMは残す場合)
VBoxManage closemedium disk "%USERPROFILE%\VirtualBox VMs\ubuntu2404\ubuntu2404.vdi" --delete

5.3 VM の管理コマンド

操作コマンド
VM を画面付きで起動VBoxManage startvm "ubuntu2404" --type gui
VM を画面なしで起動VBoxManage startvm "ubuntu2404" --type headless
VM の電源を切る(ACPI シャットダウン)VBoxManage controlvm "ubuntu2404" acpipowerbutton
VM を強制停止VBoxManage controlvm "ubuntu2404" poweroff
スナップショットの作成VBoxManage snapshot "ubuntu2404" take "初期設定完了"
スナップショットの復元VBoxManage snapshot "ubuntu2404" restore "初期設定完了"
SSH 接続ssh -p 2222 myuser@localhost