Ubuntu 26.04 Waylandでの仮想モニター設定スクリプト

以前、モニターを接続していない環境で仮想モニターを作成してデスクトップ共有を行う方法を紹介しました。別の環境で設定することがあったので、手軽に実現出来るようにスクリプトを作成してみました。

ホストで直接実行

クリーンな環境で実施してもおそらく成功するんじゃないかと思いますが、何度か試したあとなのでこちらは完全なクリーン状態ではなく、このスクリプトだけでうまくいくのかは未検証。次回試すケースがあったときに確認してみます。

nano setup-virtual-monitor.sh
sudo bash setup-virtual-monitor.sh
#!/bin/bash
# VKMS + GNOME virtual-monitor セットアップスクリプト
set -e

if [ "$(id -u)" != "0" ]; then
  echo "root権限で実行してください: sudo $0"
  exit 1
fi

echo "=== 1. VKMSモジュール有効化 ==="
modprobe vkms enable_cursor=1
echo "vkms" > /etc/modules-load.d/vkms.conf
echo "options vkms enable_cursor=1" > /etc/modprobe.d/vkms.conf
lsmod | grep vkms

echo ""
echo "=== 2. GNOME virtual-monitor 設定 ==="
echo "解像度を選んでください"
echo "1) 1920x1080 (FHD)"
echo "2) 2560x1440 (QHD)"
echo "3) 3840x2160 (4K)"
echo "4) 1280x1024"
echo "5) カスタム入力"
read -rp "番号: " RES_CHOICE

case "$RES_CHOICE" in
  1) RES="1920x1080" ;;
  2) RES="2560x1440" ;;
  3) RES="3840x2160" ;;
  4) RES="1280x1024" ;;
  5) read -rp "解像度を入力してください (例: 1920x1080): " RES ;;
  *) echo "無効な選択"; exit 1 ;;
esac
echo "選択: $RES"

REAL_USER="${SUDO_USER:-$USER}"
USER_HOME=$(getent passwd "$REAL_USER" | cut -d: -f6)
REAL_UID=$(id -u "$REAL_USER")

# 現在使われているGNOME Shellのユニット名を検出 (Ubuntuは org.gnome.Shell@ubuntu.service)
SHELL_UNIT=$(sudo -u "$REAL_USER" \
  XDG_RUNTIME_DIR="/run/user/$REAL_UID" \
  DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$REAL_UID/bus" \
  systemctl --user list-units --plain --no-legend 'org.gnome.Shell@*.service' | awk '{print $1}' | head -1)
SHELL_UNIT=${SHELL_UNIT:-org.gnome.Shell@ubuntu.service}
MODE=$(echo "$SHELL_UNIT" | sed -E 's/org\.gnome\.Shell@(.*)\.service/\1/')
echo "検出したユニット: $SHELL_UNIT (mode=$MODE)"

CONF_DIR="$USER_HOME/.config/systemd/user/${SHELL_UNIT}.d"
mkdir -p "$CONF_DIR"
cat > "$CONF_DIR/persistent-virtual-monitor.conf" << EOF
[Service]
ExecStart=
ExecStart=/usr/bin/gnome-shell --mode=$MODE --virtual-monitor $RES
EOF
chown -R "$REAL_USER:$REAL_USER" "$USER_HOME/.config/systemd"

sudo -u "$REAL_USER" \
  XDG_RUNTIME_DIR="/run/user/$REAL_UID" \
  DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$REAL_UID/bus" \
  systemctl --user daemon-reload

echo ""
echo "=== 完了 ==="
echo "反映にはログアウト→再ログイン、または再起動が必要です。"
read -rp "今すぐ再起動しますか? (y/N): " DO_REBOOT
if [ "$DO_REBOOT" = "y" ] || [ "$DO_REBOOT" = "Y" ]; then
  reboot
else
  echo "後で確認する場合:"
  echo "  ps aux | grep gnome-shell   # --virtual-monitor $RES が付いていればOK"
  echo "  ls /sys/class/drm/ | grep -i virtual"
fi
タイトルとURLをコピーしました