障害対応演習のために再起動からVMが復帰しない状況を意図的に作る

環境

背景

vSphere HAによってvSphereホスト障害時VMは再起動が走るが、その際に稀にVMが復帰に失敗することがあった。 この障害に対する障害対応演習を行うために、VMを再起動した際に起動に失敗する状態を再現したかった。

方法

意図的にVM起動直後に fork-bomb を実行するように仕掛けて、起動時にプロセス生成が困難な状況にする1。 毎回の起動直後にfork-bombを実行するようにすると、復旧できなくなるので、仕掛けた後に一回だけfork-bombが起動するようにし、 再び再起動を強制的に行えば復旧できるようにする。 これを次のようにして実現する:

fork-bomb実行前にファイルの存在性をチェックし、ファイルが存在する場合に限りfork-bombを実行する。 実行した場合は、対象のファイルを削除する。

  1. 以下のfork-bombを実行するシェルスクリプトを /var/tmp/reserved-fork-bomb.sh に配置する。 (このシェルスクリプトはfork-bombである。実行すると、大量のプロセスが生成されて制御不能になる恐れがある。壊れてもいいような試験用VMで行うこと。)
    #!/bin/bash
    # reserved_file_path にファイルが存在する場合のみ
    # fork-bombを実行します。
    # reserved_file_path に存在するファイルはfork-bomb実行前に削除されます。
    set -eux
    
    reserved_file_path=$1
    
    if [ ! -e ${reserved_file_path} ]; then
      echo "do nothing."
      exit 0
    fi
    
    rm ${reserved_file_path}
    sync
    
    fork_bomb() {
     fork_bomb | fork_bomb &
    }
    
    fork_bomb
    
  2. 以下のカスタムUnitファイルを /etc/systemd/system/reserved-fork-bomb.service に配置する。 network.targetのまえに起動するようにしているが、環境によっては適切でないかもしれないので、適宜修正する。
    [Unit]
    Description=reserved fork bomb.
    Before=network.target
    
    [Service]
    Type=forking
    ExecStart=/var/tmp/reserved-fork-bomb.sh /var/tmp/reserve-fork-bomb
    
    [Install]
    WantedBy=default.target
  3. シェルスクリプトに実行権限を与える。
    $ chmod u+x /var/tmp/reserved-fork-bomb.sh
    
  4. Unitファイルを追加したのでリロードを行う。
    $ systemctl daemon-reload
    
  5. reserved-fork-bomb サービスを enabled にして、起動時に実行するようにする。
    $ systemctl enable reserved-fork-bomb
    
  6. /var/tmp/reserve-fork-bomb ファイルを作成する。このファイルが存在するときに限り、fork-bombが実行される。
    $ touch /var/tmp/reserve-fork-bomb
  7. 再起動を実行する。これによってVMが再起動され、復帰しない状態となる。
    $ reboot
    

  1. PIDのLimitが設定されている場合は、制限されるので困難な状況にはならない場合がある。