yasuosaiki一覧

libvirt-phpでWebからKVM仮想マシンの状態確認と起動

検証用の仮想マシンを動かすKVMホスト環境で、仮想マシンの状態確認と電源オンのためにvirt-managerを開いたりvirshコマンドを叩いたりするのが面倒くさかった。
Webブラウザでアクセスできれば楽だと思い、WebからGUIで管理できるソフトウェアを試したものの、しっくり来るものがなかったのでPHPで作ってしまうことにした。
Webから入力された裏でvirshコマンドを叩くような仕組みではお行儀が悪いので、libvirt-phpというPHPモジュールでPHPから直接KVMへ接続できるようにもする。

KVMホスト上にNginx+php-fpmを構築してPHPのWeb実行環境を構築。
サンプルのスクリプトはアクセス制限がないので、インターネットなど公開しているサーバの場合は不正にアクセスされないよう対策が必要。

確認環境

Ubuntu 18.04

インストール

KVM環境は既に構築されているものとする。

sudo apt install nginx \
php-fpm \
php-libvirt-php

設定

Nginxの設定

sudo vi /etc/nginx/sites-available/default
---
#indexに「index.php」を追加
        index index.html index.htm index.php index.nginx-debian.html;
---
#ソケットのパスを指定してphp実行環境を構築(例)
        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        }
---

Nginxを再起動

sudo systemctl restart nginx.service

php-fpmのユーザをlibvirtのグループへ追加

これをしないと権限が足りなくてqemuへ接続できなくてエラーとなる。

php-fpmのユーザ名を確認
以下なら「www-data」が対象のユーザ

$ grep "user =" /etc/php/7.2/fpm/pool.d/www.conf
user = www-data

グループへ追加

sudo adduser www-data libvirt

php-fpmを再起動

sudo systemctl restart php7.2-fpm.service

スクリプトの設置

公式?の「libvirt.php」で簡単に利用できるクラスが提供されてるのでそれを使う。

sudo mkdir /var/www/html/virt
cd /var/www/html/virt
sudo wget https://raw.githubusercontent.com/libvirt/libvirt-php/master/examples/libvirt.php

/var/www/html/virt/index.phpとして以下を保存
(仮想マシンの一覧を表示し、ボタンで起動する管理メニュー)

<?php
    require('libvirt.php');
    $lv = new Libvirt();
    if ($lv->connect("qemu:///system") == false)
        die('<html><body>Cannot open connection to hypervisor</body></html>');

    $uuid = (string)filter_input(INPUT_POST, 'dom_start');
    if ( $uuid !== '' ){
        $domName = $lv->domain_get_name_by_uuid($uuid);
        $ret = $lv->domain_start($domName) ? "<p>[ " . $domName . " ] has been started successfully</p>" : '<p>Error while starting domain: '.$lv->get_last_error().'</p>';
    }

    $doms = $lv->get_domains();
?>
<html>
<head>
<meta charset="UTF-8">
<title>PHP Virt Start</title>
</head>
<body>
<?php if(isset($ret)) echo $ret; ?>
<table>
    <tr>
        <th>Name</th>
        <th>State</th>
        <th>Start</th>
    </tr>
<?php foreach ($doms as $name) :
    $dom = $lv->get_domain_object($name);
    $uuid = libvirt_domain_get_uuid_string($dom);
    $info = $lv->domain_get_info($dom);
    $state = $lv->domain_state_translate($info['state']);
    $disable = $lv->domain_is_running($name) ? ' disabled' : '';
?>
    <tr>
        <td><?php echo $name; ?></td>
        <td><?php echo $state; ?></td>
        <td>
            <form method="POST" action="#">
                <input type="hidden" name="dom_start" value="<?php echo $uuid; ?>">
                <button type="submit"<?php echo $disable; ?>>Start</button>
            </form>
        </td>
    </tr>
<?php endforeach; ?>
</table>
</body>
</html>

一応ownerをNginx/PHPのユーザに変更。

sudo chown -R www-data:www-data /var/www/html/virt

アクセス

「http://(サーバのIPアドレス)/virt/」でアクセスする。

libvirt-phpの使い方の参考

ソースと一緒に公開されてるサンプルぐらいしか参考にできるものが見つからなかった。
https://github.com/libvirt/libvirt-php/tree/master/examples


Ubuntu18.04にデフォルトのWineを入れた時にダブルクリックでEXEを起動できるようにする

Wineをインストールした後に、何も考えずにGUIから.exeファイルをダブルクリックするとアーカイブマネージャーが起動すると思う。
これはNautilusでダブルクリックの既定アプリケーションにWineを選択すれば起動できるようになる。

しかし、Ubuntu18.04でWineHQとかでないデフォルトのリポジトリからWineを以下のようにインストールすると、デスクトップ環境向けの設定ファイル(wine.desktop)が入っていないため、そのままでは選択できない。

#インストール先が64bit版OSの場合
sudo apt install wine64

#インストール先が32bit版OSの場合
sudo apt install wine32

なので、手動でファイルを入れる。

#すべてのユーザで選択できるようにしたい時
sudo curl -o /usr/share/applications/wine.desktop https://raw.githubusercontent.com/wine-mirror/wine/5c2d6211f6590d3856dc9188593b3d3597c8b441/loader/wine.desktop
#現在のユーザのみで選択できるようにしたい時
curl -o ~/.local/share/applications/wine.desktop https://raw.githubusercontent.com/wine-mirror/wine/5c2d6211f6590d3856dc9188593b3d3597c8b441/loader/wine.desktop

GUIで.exeのファイルのプロパティを開く。

「開き方」タブから「Wine ~」アプリケーションを選択して「追加」ボタンをクリック。

これで.exeをダブルクリックすればwineで起動するはず。


vpsbenchスクリプトで超手軽にVPS上のDebian/Ubuntuのベンチマークを取得

タイトルでVPSって書いたけど、OSさえ対応してればIaaSでも自宅サーバでも当然動く。

何箇所かVPSサービスを使っているためスペックの確認方法も色々と考えてやっていたのですが、このスクリプトで大抵は事足りるため最近は新しいサービスを始める時にとりあえずこれを動かしています。

動作要件

大前提としてサーバからインターネットへ接続可能である必要があります。

編集時点で以下のOSで確認済みとなっていました。

  • Debian 6
  • Debian 7
  • Debian 8
  • Ubuntu 10.04 LTS
  • Ubuntu 12.04 LTS
  • Ubuntu 14.04 LTS

私が試した限りではUbuntu 16.04ではswapの大きさ部分がfreeコマンドの仕様変更でうまく表示できない以外、動いているようにみえます。

また、以下のパッケージが必要です。(ほとんどの場合、インストール済みかと思われます)

  • time
  • bzip2

インストールする場合

sudo apt-get install time bzip2

実行方法

bash <(wget --no-check-certificate -O - https://raw.github.com/mgutz/vpsbench/master/vpsbench)

これだけ。
特定の要素だけ実行したい場合など、詳しいオプションは以下を確認。
https://github.com/mgutz/vpsbench

ベンチマーク取得結果の例

VPSを確認する時必要そうなものが見れる。

CPU model:  Intel Core Processor (Skylake)
Number of cores: 1
CPU frequency:  2399.998 MHz
Total amount of RAM: 985 MB
Total amount of swap:  MB
System uptime:   7 min,
I/O speed:  300 MB/s
Bzip 25MB: 6.34s
Download 100MB file: 107MB/s

Windows10のMedia FoundationでH265(HEVC)を再生できるようにする

以前は意識してなくてもWindows10のWindows Media PlayerなどでH265(HEVC)が再生できていたのに、アップデートしたらなんか見れなくなってた。
どうもFall Creators Updateからコーデックが同梱されなくなったらしく、内部的にMedia FoundationというAPIを使っているメディアプレーヤーはコーデックがないので再生できなくなったということらしい。
参考 : Microsoft removes HEVC codec in Windows 10 Fall Creators Update, adds it to Store – gHacks Tech News

私の場合、HTC Viveで使用できるVR動画向けプレーヤーにMedia Foundationを使用しているものが多く、軒並みH265の動画が再生できなくなってしまっていた。(Simple VR Video Player,Whirligig VR Media Playerなど)

再生できるようにするやり方

Windows10のFall Creators Updateであれば以下のリンクの拡張をインストールすることで見れるようになる。

デバイス製造元からの HEVC ビデオ拡張機能 を入手 – Microsoft Store ja-JP
※以前は「HEVC Video Extension」という名前だったみたいだけど、なぜか自動翻訳っぽい怪しいものに変わってる。