VMwareゲストOSのサスペンド・レジューム時にスクリプトを自動実行する完全ガイド【vmware-tools設定】【2026年版】

2012年1月27日


VMware PlayerやWorkstationでUbuntuなどのゲストOSを使う開発者が必ずぶつかる問題がある。サスペンドからのレジューム後にApacheやNginxが止まる共有フォルダのマウントがおかしくなるといったトラブルだ。

毎回ターミナルを開いて手動で systemctl restart を叩くのは時間の無駄であり、うっかり忘れると開発に支障が出る。

この記事では、VMware Tools(open-vm-tools含む)が標準で提供するイベントフック機構を利用して、サスペンド・レジュームのタイミングで任意のシェルスクリプトを自動実行する方法を徹底解説する。2026年時点での最新版 open-vm-tools 12.x での動作を実機で確認済みだ。

VMwareゲストOSのサスペンド・レジューム時にスクリプトが自動実行されるフロー全体図


この記事で解決できること

  • VMwareゲストOSのレジューム時に任意のスクリプトを自動実行する設定
  • /etc/vmware-tools/scripts/ 配下のディレクトリ構造の完全理解
  • 電源ON・OFF・サスペンド・レジュームそれぞれのトリガーに対応したスクリプト配置
  • open-vm-tools 12.x 最新版での設定・動作確認方法
  • スクリプトが実行されない場合のデバッグ方法

動作確認環境:
– Ubuntu 22.04 LTS / Ubuntu 20.04 LTS
– VMware Workstation Player 17.x
– open-vm-tools 12.3.x(2024年以降の最新版)


前提条件

このガイドを進める前に、以下の環境が必要だ。

  • VMware Workstation Player または Workstation Pro がホストOSにインストール済み
  • ゲストOS(Linux)に open-vm-tools または VMware Tools がインストール済み
  • ゲストOS上でsudo権限を持つユーザーでログインできること

open-vm-toolsのバージョン確認

# open-vm-toolsのバージョン確認
dpkg -l open-vm-tools

# VMware Toolsデーモンの稼働確認
systemctl status open-vm-tools

# VMware Toolsコマンドラインの確認
vmware-toolsd --version

open-vm-toolsがインストールされていない場合はインストールする:

sudo apt update
sudo apt install open-vm-tools

VMware Workstation Playerでデスクトップ環境(GUI)を使用する場合は以下も必要だ:

sudo apt install open-vm-tools-desktop

注意: open-vm-tools-desktopはGUI(X11/Wayland)環境向けで、クリップボード共有や画面解像度の自動調整を提供する。サーバー用途(CUI環境)では不要。

確認: systemctl status open-vm-tools の出力が Active: active (running) になっていればOKだ。


VMware Toolsのスクリプトディレクトリ構造の完全解説

/etc/vmware-tools/scripts/ ディレクトリ構造のツリー図

VMware Tools(open-vm-tools)がインストールされたLinuxゲストOSには、/etc/vmware-tools/scripts/ 以下に専用のディレクトリが用意されている。

ls -la /etc/vmware-tools/scripts/
# drwxr-xr-x 3 root root 4096 ...
# drwxr-xr-x 2 root root 4096 ...  vmware/

デフォルトでは vmware/ ディレクトリのみ存在する。中身を確認すると:

ls -la /etc/vmware-tools/scripts/vmware/
# -rwxr-xr-x 1 root root ... network

network というスクリプトがあり、VMware Toolsが標準で提供するネットワーク再接続スクリプトだ。このファイルは編集しない。

イベントトリガー対応ディレクトリ一覧

VMware Toolsは以下の4つのイベントに対応したスクリプトディレクトリをサポートしている。これらはデフォルトでは作成されていないため、必要なものを自分で作成する。

ディレクトリ名 実行タイミング 用途例
poweron-vm-default.d 電源ONでゲストOSが起動したとき 初期化スクリプト、サービス起動
resume-vm-default.d サスペンドから復帰(レジューム)したとき サービス再起動、マウント再設定
poweroff-vm-default.d 電源OFFでゲストOSがシャットダウンするとき クリーンアップ処理
suspend-vm-default.d サスペンド前に実行 データのフラッシュ、セーフシャットダウン

スクリプトの実行方式

これらのディレクトリ内に配置されたスクリプトは、VMware Tools(vmware-toolsd)が対応イベント発生時にroot権限で順次実行する。実行されるのは以下の条件を満たすファイルのみだ:

  • ファイルに実行権限(chmod +x)が付与されている
  • ファイル名が .sh 拡張子(慣例。実際はshebangで判断)
  • ディレクトリが /etc/vmware-tools/scripts/ の直下ではなく、イベント名ディレクトリ内に存在する

ステップ1: レジューム時にApacheを自動再起動する

最も典型的なユースケースとして、レジューム後にApacheを自動再起動する設定を行う。

1-1: ディレクトリを作成する

sudo mkdir -p /etc/vmware-tools/scripts/resume-vm-default.d

1-2: スクリプトを作成する

sudo nano /etc/vmware-tools/scripts/resume-vm-default.d/restart-apache.sh

以下の内容を記述する:

#!/bin/bash
# VMwareレジューム時にApacheを再起動するスクリプト
# 配置先: /etc/vmware-tools/scripts/resume-vm-default.d/restart-apache.sh

LOG_FILE="/var/log/vmware-resume.log"

log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S'): $1" >> "$LOG_FILE"
}

log "=== VMware resume event triggered ==="

# Apacheのサービス名を確認して再起動
if systemctl is-active --quiet apache2; then
    log "Apache2 is already running, restarting..."
    systemctl restart apache2
    log "Apache2 restarted: $(systemctl is-active apache2)"
elif systemctl list-unit-files | grep -q "^apache2.service"; then
    log "Apache2 was not running, starting..."
    systemctl start apache2
    log "Apache2 started: $(systemctl is-active apache2)"
else
    log "Apache2 service not found, skipping."
fi

log "=== Resume script completed ==="
exit 0

1-3: 実行権限を付与する

sudo chmod +x /etc/vmware-tools/scripts/resume-vm-default.d/restart-apache.sh

権限確認:

ls -la /etc/vmware-tools/scripts/resume-vm-default.d/
# -rwxr-xr-x 1 root root ... restart-apache.sh

1-4: 動作確認

スクリプトを直接実行して、エラーなく完了することを確認する:

# ログファイルを事前に作成(権限問題を防ぐため)
sudo touch /var/log/vmware-resume.log
sudo chmod 644 /var/log/vmware-resume.log

# 直接実行してテスト
sudo /etc/vmware-tools/scripts/resume-vm-default.d/restart-apache.sh

# ログ確認
cat /var/log/vmware-resume.log

期待する出力例:

2026-04-10 10:00:00: === VMware resume event triggered ===
2026-04-10 10:00:00: Apache2 is already running, restarting...
2026-04-10 10:00:01: Apache2 restarted: active
2026-04-10 10:00:01: === Resume script completed ===

ターミナルでスクリプト動作確認中のログ出力スクリーンショット

ステップ1完了の確認: ゲストOSをサスペンドして復帰させた後、Apacheが自動的に起動していること、およびログファイルにエントリが追記されていることを確認する。


ステップ2: 複数サービスに対応した汎用スクリプト

開発環境では複数のサービスをまとめて管理したいケースが多い。以下は複数サービスの再起動に対応した汎用スクリプトだ。

2-1: 汎用レジュームスクリプト

sudo nano /etc/vmware-tools/scripts/resume-vm-default.d/restart-services.sh
#!/bin/bash
# VMwareレジューム時に複数サービスを再起動する汎用スクリプト
# 配置先: /etc/vmware-tools/scripts/resume-vm-default.d/restart-services.sh

LOG_FILE="/var/log/vmware-resume.log"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')

log() {
    echo "${TIMESTAMP}: $1" >> "$LOG_FILE"
}

# 再起動するサービスリスト(必要に応じて追加・削除)
SERVICES=(
    "apache2"
    "nginx"
    "mysql"
    "postgresql"
    "redis-server"
    "docker"
)

log "=== VMware resume: service restart started ==="

for service in "${SERVICES[@]}"; do
    # サービスが存在するか確認
    if systemctl list-unit-files | grep -q "^${service}.service"; then
        log "Restarting ${service}..."
        if systemctl restart "${service}" 2>/dev/null; then
            log "${service}: restarted successfully"
        else
            log "${service}: restart failed (exit code: $?)"
        fi
    else
        log "${service}: not installed, skipping"
    fi
done

log "=== VMware resume: service restart completed ==="
exit 0
sudo chmod +x /etc/vmware-tools/scripts/resume-vm-default.d/restart-services.sh

注意: 複数のスクリプトを配置した場合、ファイル名のアルファベット順に実行される。実行順序が重要な場合は 01-first.sh02-second.sh のように数字プレフィックスを付けると制御しやすい。

2-2: 共有フォルダのマウント再設定スクリプト

hgfs(VMwareの共有フォルダ)のマウントが不安定になる場合は以下のスクリプトが有効だ:

sudo nano /etc/vmware-tools/scripts/resume-vm-default.d/remount-hgfs.sh
#!/bin/bash
# VMwareレジューム時にhgfsを再マウントするスクリプト
# 配置先: /etc/vmware-tools/scripts/resume-vm-default.d/remount-hgfs.sh

LOG_FILE="/var/log/vmware-resume.log"
MOUNT_POINT="/mnt/hgfs"

log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S'): $1" >> "$LOG_FILE"
}

log "Checking hgfs mount at ${MOUNT_POINT}..."

# hgfsマウントポイントが存在しない場合は作成
if [ ! -d "$MOUNT_POINT" ]; then
    mkdir -p "$MOUNT_POINT"
    log "Created mount point: ${MOUNT_POINT}"
fi

# 既存のマウントをアンマウント(エラーは無視)
umount "$MOUNT_POINT" 2>/dev/null

# 再マウント
if vmhgfs-fuse "$MOUNT_POINT" -o allow_other,uid=1000,gid=1000 2>/dev/null; then
    log "hgfs remounted successfully at ${MOUNT_POINT}"
else
    log "hgfs remount failed (vmhgfs-fuse not available or not needed)"
fi

exit 0
sudo chmod +x /etc/vmware-tools/scripts/resume-vm-default.d/remount-hgfs.sh

ステップ2完了の確認: ls -la /etc/vmware-tools/scripts/resume-vm-default.d/ で複数のスクリプトが存在し、すべて実行権限が付与されていることを確認する。


ステップ3: サスペンド前にデータを安全に保存する

サスペンド前に実行したい処理(データのフラッシュ、バックアップなど)は suspend-vm-default.d を使う。

3-1: MySQLのデータを安全にフラッシュ

sudo mkdir -p /etc/vmware-tools/scripts/suspend-vm-default.d
sudo nano /etc/vmware-tools/scripts/suspend-vm-default.d/flush-databases.sh
#!/bin/bash
# VMwareサスペンド前にデータベースを安全にフラッシュするスクリプト
# 配置先: /etc/vmware-tools/scripts/suspend-vm-default.d/flush-databases.sh

LOG_FILE="/var/log/vmware-suspend.log"

log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S'): $1" >> "$LOG_FILE"
}

log "=== VMware suspend: data flush started ==="

# MySQLのflush(Debian/Ubuntuの場合)
if systemctl is-active --quiet mysql 2>/dev/null || systemctl is-active --quiet mariadb 2>/dev/null; then
    log "Flushing MySQL/MariaDB logs..."
    if mysqladmin --defaults-file=/etc/mysql/debian.cnf flush-logs 2>/dev/null; then
        log "MySQL flush completed"
    else
        # debian.cnfがない場合のフォールバック(sudo経由でのソケット接続)
        mysqladmin -u root --socket=/var/run/mysqld/mysqld.sock flush-logs 2>/dev/null || true
        log "MySQL flush attempted (fallback method)"
    fi
fi

# PostgreSQLのチェックポイント強制実行
if systemctl is-active --quiet postgresql 2>/dev/null; then
    log "Checkpointing PostgreSQL..."
    sudo -u postgres psql -c "CHECKPOINT;" 2>/dev/null && log "PostgreSQL checkpoint completed" || log "PostgreSQL checkpoint failed"
fi

# Redisのデータ永続化
if systemctl is-active --quiet redis-server 2>/dev/null; then
    log "Saving Redis data..."
    redis-cli BGSAVE 2>/dev/null && log "Redis BGSAVE triggered" || log "Redis BGSAVE failed"
fi

log "=== VMware suspend: data flush completed ==="
exit 0
sudo chmod +x /etc/vmware-tools/scripts/suspend-vm-default.d/flush-databases.sh

suspend-vm-default.dとresume-vm-default.dのスクリプト配置を示すファイルツリー

ステップ3完了の確認: スクリプトを直接実行してエラーがないことを確認する。


応用編: open-vm-tools 12.x の新機能と注意点

open-vm-tools 12.x でのスクリプト実行の仕様

open-vm-tools 12.x(2023年以降のリリース)での動作について整理する。

実行条件: スクリプトに実行権限(chmod +x)が付与されていることが必須条件だ。statechange.sh-x "$scriptFile" でチェックを行うため、実行権限がないスクリプトは無視される。

# スクリプトの権限確認
ls -la /etc/vmware-tools/scripts/resume-vm-default.d/
# -rwxr-xr-x 1 root root ... restart-apache.sh
# ↑ 実行権限(x)が必須

# 実行権限がない場合は付与
sudo chmod +x /etc/vmware-tools/scripts/resume-vm-default.d/*.sh

実行順序: statechange.sh は同一ディレクトリ内のスクリプトをアルファベット順に実行する。実行順序を制御したい場合は 01-first.sh02-second.sh のように数字プレフィックスを使う。

タイムアウト: 各スクリプトには実行タイムアウトが設定されている。長時間かかる処理はバックグラウンドで実行するか分割することを推奨する。

#!/bin/bash
# タイムアウトを回避するためバックグラウンドで重い処理を実行
nohup /usr/local/bin/heavy-backup.sh &>> /var/log/vmware-background.log &
disown
exit 0

カスタムスクリプトのデバッグ方法

スクリプトが実行されているかどうかを確認するには、vmware-toolsdのログを参照する:

# open-vm-toolsのシステムログを確認
sudo journalctl -u open-vm-tools -f

# または syslogで確認
sudo tail -f /var/log/syslog | grep -i vmware

実際にサスペンド・レジュームをトリガーせずにスクリプト実行をテストするには:

# vmware-toolsd を使った手動テスト(警告: 実際のイベントを発火させる)
# 以下はサスペンドイベントのシミュレーション(テスト環境のみ推奨)
vmware-toolsd --cmd "vmx.capability.unified_loop PowerOff"

トラブルシュート

スクリプトが実行されない

症状 原因 解決策
レジューム後もApacheが止まったまま スクリプトに実行権限がない sudo chmod +x スクリプトパス
実行権限はあるがログが残らない ログファイルのパーミッション問題 sudo touch /var/log/vmware-resume.log && sudo chmod 644 /var/log/vmware-resume.log
スクリプトが実行されない(実行権限がない) chmod +x が未実施 sudo chmod +x スクリプトパス
VMware Toolsデーモンが停止している 何らかの原因でデーモンが落ちた sudo systemctl restart open-vm-tools
スクリプトエラーで途中終了 Bashの構文エラーや存在しないコマンド bash -n スクリプトパス で構文チェック

open-vm-tools が正しく動作しているか確認する

# デーモンの稼働確認
systemctl status open-vm-tools

# VMwareとの通信確認
vmware-toolsd --version

# スクリプトディレクトリの確認
ls -la /etc/vmware-tools/scripts/

/etc/vmware-tools/scripts/ が存在しない場合

open-vm-toolsのインストール後にディレクトリが存在しない場合は、VMware Toolsが正常に動作していない可能性がある。

# open-vm-toolsの再インストール
sudo apt purge open-vm-tools
sudo apt install open-vm-tools

# インストール後にディレクトリを確認
ls /etc/vmware-tools/scripts/

重要: ディレクトリを手動で作成しても、VMware Toolsデーモンが起動していなければスクリプトは実行されない。必ず systemctl status open-vm-tools でデーモンの稼働を確認すること。

スクリプトはroot権限で実行される点に注意

VMware Toolsのスクリプトはroot権限で実行される。一般ユーザー向けの操作(例: ホームディレクトリへのファイル操作)は sudo -u ユーザー名 を使う必要がある:

# 一般ユーザーのプロセスとして実行する例
sudo -u username /home/username/scripts/my-resume-task.sh

まとめ

VMware Toolsのイベントフック機構を活用することで、サスペンド・レジューム時のスクリプト自動実行が実現できる。

  • 仕組み: /etc/vmware-tools/scripts/ 配下に用途別ディレクトリを作成してスクリプトを配置する
  • 対応イベント: 電源ON(poweron-vm-default.d)・レジューム(resume-vm-default.d)・電源OFF(poweroff-vm-default.d)・サスペンド(suspend-vm-default.d)の4種類
  • 必須設定: スクリプトファイルへの実行権限(chmod +x)の付与(statechange.sh が実行権限でスクリプトを識別する)

VMware PlayerやWorkstationを使った開発環境では、共有フォルダとサービスの再起動がセットになることが多い。この仕組みを活用することで、レジューム後の手動作業をなくし、開発効率を大幅に向上できる。

サスペンド前の安全なデータフラッシュ(suspend-vm-default.d)と組み合わせることで、データ損失リスクも低減できる。


関連記事

VMWare

Posted by GENDOSU