インスタンスにデスクトップ画面をインストールしよう【VNC編】

はじめに

 今回の目標・・・それは・・・

インスタンスターミナル画面

普段のターミナル画面を・・・

VNCデスクトップ

こうすることです!!!

 弊社のインスタンスに限らず、クラウドであれオンプレであれ、Linux系のOS(ディストリビューション)はターミナルからコマンドで操作するのが基本です(でもなぜかRaspberryPiJetsonは無理してでもGUIで操作したくなるのは筆者だけでしょうか・・・)。しかしながら、数値シミュレーションソフトをGPUパワーで動かす場合など、GUIを必須とする方もいらっしゃると思います(たいていのシミュソフトの場合、演算結果を何らかのバイナリ形式に変換しローカルに落としてレンダリングできると思いますが面倒ですよね)。

 インスタンスをGUI化するには、VNCというソフトウェアを使用します。まず、インスタンスにデスクトップをインストールします(これってびっくりしません?筆者は「え??ああ確かに・・・」って感覚を味わったのを鮮明に覚えています)。そしてデスクトップ画面を送信するためのサーバ (VNCサーバ) をインスタンス内に立ち上げます。一方、ローカルPC(インスタンスに接続するために使っているPCです)の方ではVNC Viewerというソフトをインストールし、VNCサーバに対して接続をかけます。これでインスタンスにインストールしたデスクトップ画面の画面情報そのものが、ローカルPCに常時送信され続ける形となり、なおかつマウスやキーボードなどの入力も受け付けるようになります。

 こういうセットアップで自分で実践しつつ、仕組みを知ると、コンピュータやサーバ、ネットワークって本当に面白いなって思うんですよね。それはさておき、具体的な手順をみていきましょう!

インスタンス側:アクセスサーバに接続

 最初にアクセスサーバへの接続を行います。ターミナル上で以下のコマンドを入力しアクセスサーバを立ち上げます。

ssh -L 20122:[インスタンスIP]:22 user@[アクセスサーバIP] -p 30022 -i .\.ssh\ackey.txt
アクセスサーバへの接続

なお、インスタンスやアクセスサーバのIPアドレスの確認方法についてにはこちらの記事をご参照ください。

インスタンス側: ローカルPCのlocalhostとインスタンスのポート間を紐づけてログイン

  標準的なHGAインスタンスの接続では、アクセスサーバ立ち上げ後、localhostに接続するという形でインスタンスにログインします。しかし、今回はインスタンスからsshとは別口で画面情報をローカルPCの方に送ります。具体的には、以下のコマンドでローカルPCの5901番ポートに接続すれば、インスタンスの5901番ポートを通してTCP通信ができるようにします

ssh -L 5901:[インスタンスIP]:5901 user@localhost -p 20122 -i .\.ssh\mykey.txt
localhostの紐づけ

こうすることでローカルPCからlocalhost:5901にアクセスすれば、インスタンスの5901番ポートを通して情報を受け取れるようになります。

インスタンス側:ubuntu-desktopとvnc serverのインストール

  まず以下のコマンドでインスタンスにデスクトップ環境をインストールします(不思議な表現だと思いません・・・?)。

sudo apt update
sudo apt install -y ubuntu-desktop
sudo apt install -y gnome-core gnome-panel gnome-settings-daemon metacity nautilus gnome-terminal
sudo apt install -y lxde

なお、上のコマンド(特に2個目)にはとても時間がかかります。上記3つのコマンド実行だけで30~40分程度見積もるのが無難です(なんせデスクトップをインストールするんですからね・・・)。

 実は3個目のコマンドのツール群、今回は使用しない有名なトラブルの種になっているので代替ツールもインストールしています)のですが、VNCといえばよく使われるツール群なのでとりあえずいれておいちゃいましょう!いれるだけタダですし!

 デスクトップ環境を構築するツール群をインストールしたら、次はVNC用のサーバをインストールしましょう。

sudo apt install -y vnc4server

サーバをインストールしたら初回のみ(そして不幸にもパスワードを忘れた場合)以下のコマンドでパスワードの設定を行ってください。

vncpasswd

インスタンス側: vimエディタのインストールとVNCサーバのポート設定

  ここからは標準的なVNC環境の構築法から少し外れるので注意してください。時間があるならお茶を飲んだりして焦らずのんびりやりましょうね。あなたならきっとできます。

 さて、インスタンスへのログイン時にローカルPCの5901番ポートとインスタンス側5901番ポート間のTCP通信として画面情報をやりとりする旨説明しましたが、ここが少しクセのあるところです。なぜなら、デフォルト設定時、VNCサーバの送信ポートは5900 + ディスプレイ番号というようにディスプレイ番号という値に応じて動的にポートが変わるようになっているためです(複数種のディスプレイ情報を同時に送信できるということですね)。このように動的に送信元ポート番号が変わってしまっては、先ほどの設定では送受信できなくなってしまうため、この値を固定する必要があります

 ポート番号の設定は、サーバ立ち上げ時に行われるので、ここのポートセット部分を強引に書き換えます。これには、nanoやvimなど、ちょっとクセのあるエディタを使用する必要があります。VSCodeで編集する方法について記事書いてたでしょ!って思ったそこのあなた!、いつもありがとうございます!しかし、残念ながら権限の関係でVSCode越しに編集することはできません(回避法ご存じの方いらっしゃいましたらご教授お願いしたいです)。

 脅すわけではありませんが、上記に挙げたnanoやvimは恐ろしくクセのあるエディタです(emacs???)。はじめて触れる方は、ファイルの変更や保存、そしてエディタの終了の仕方にさえとまどうことでしょう。筆者はvim派(厳密にはVSCodeがダメならもうvimしかないかな・・・派です)ですのでvimエディタを使って説明させていただきます。クセのあるエディタです。ですが、今後何らかの形でLinux系OS(ディストリビューション)に関わる機会があるのなら、高確率で出会うはめになる目にするエディタとなるでしょう。vimはいいものですーーー他人が流暢に使いこなしている様子を眺めている分には。

 さて、それではvimのインストールからはじめましょう:

sudo apt install -y vim

インストールが完了したので、このエディタを使ってVNCサーバ側の送信元ポートを固定する作業に入ります。vimエディタを用いて(sudo権限で)VNCサーバ起動時・起動中に行う処理の書き換えを行うため、下記コマンドでvimを開きます。

sudo vi /usr/bin/vncserver

すると下記のような画面が表示されると思います。

vncserverコマンドの編集

これがVNCサーバ立ち上げ時に行われる処理群です。一連の処理うち、送信元ポートの番号だけを変えていけば良いのですが、必要な箇所を特定するため、まず、

/

と入力し、その後

$vncPort

を入力しEnterを押してください。すると

$vncPort = 5900 + $displayNumber;

という箇所が確認できます。これが送信元ポートの番号を規定する箇所です(5900+ディスプレイ番号で規定されています)。これを書き換えるためにiキーを押してください。vimにはモードという概念があり、編集や編集後の保存処理を行うにはこのモードの切り替えを行う必要があります。iキーを押して切り替わるモードは編集モードやinsertモードと呼ばれ、最初にvimでファイルを開いた時や、後に説明するEscキーを押下した際のモードはノーマルモードと呼ばれます。なぜこんな面倒な構造になっているのか疑問を抱く方もいらっしゃると思いますが、これはCUIで(つまり、ターミナル画面上のみで)文書やコードを編集するのに合理的だからです。

 iキーを押したら、編集できる状態になるので、カーソルキー(矢印キー)で文字入力用カーソルを動かして、 $vncPort = 5900 + $displayNumber;の冒頭にコメントアウトをかけて一旦無効化します(下記)。

#$vncPort = 5900 + $displayNumber;

 次に、その行の直下に、下記内容を貼り付けてください。

$vncPort = 5901;

以上で編集完了なので、これを保存します。まず、Escキーを押してノーマルモードに切り替えます。その後

:wq

を押して編集内容の保存とvimエディタの終了を行います。全体として下図のような状態になっていれば完璧です。

送信元ポート

 ここまでできた方、大変すばらしい!次の節でもう一個重要な設定が控えていますが、あなたならもう大丈夫です。お茶やコーヒーでも飲んで一旦頭を休めましょう。

インスタンス側: グレースクリーンエラー回避の設定

 VNCには比較的有名(?)なトラブルがあります。それはグレースクリーントラブルと呼ばれるもので、VNCサーバを立ち上げてviewerで接続してもグレー画面のまま何も表示されなくなるというものです。根本的な対処法は2020/11/17現在存在しないため、LXDEという代替のデスクトップツールをインストールして対処することにします。ツール群のインストール自体はすでに完了しているので、これをVNCサーバ起動時に動作させるようにします。そのための設定ファイルを下記コマンドで作成してください。

cd /home/user/.vnc
sudo vi xstartup

 こうすることで、VNCサーバ起動時にxstartupというコマンド(正確には後ほどこのファイルを755付与で実行可能コマンドにします)を連動動作させることができます。このxstartupに、編集モード(iキー押下)で入り、下記内容を貼り付けてください(冗長な箇所はありますがあくまでトラブル回避のために一部をコメントアウトしたりLXDE呼び出し文を追記しているだけなのであまり気にしないでください)。

#!/bin/sh

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
#xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
#x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#x-window-manager &
#exec gnome-session
# Fix to make GNOME work
export XKL_XMODMAP_DISABLE=1
/etc/X11/Xsession
/usr/bin/startlxde

貼り付けが完了したらEscキーを押下してノーマルモードに切り替えて

:wq

を入力してファイルを保存しvimを終了します。そして、これを以下にて実行可能コマンド化とします。

sudo chmod 755 xstartup

これでVNCサーバ起動時にxstartupコマンドとして呼び出され処理されるようになりました(めっちゃくちゃ面白いですね)。後はVNCサーバを立ち上げてこれで終わりと言いたいところですが、更なるトラブル回避のためVNCサーバを起動する際に読み込むファイルをあらかじめ生成するという処置を施しておきます。詳しくは次節で解説します。

インスタンス側: 初期ファイル群の作成

 VNCサーバ起動時の更なるトラブル回避のためサーバを起動する際に読み込むファイルをあらかじめ生成するという処置を施すのが無難です。「またvimか・・・」と思った方、大丈夫です。以下の2コマンドを順に入力すれば自動生成されます。

vncserver :1
vncserver -kill :1

これでインスタンス側全ての初期設定が完了しました。後は

vncserver

コマンドを入力すれば、VNCサーバが起動し、後の節でご紹介するVNC Viewerというソフトウェアから接続すればVNCが使えるようになります。

クライアントPC側:VNC Viewerのインストール

それでは、ここからはクライアントPC(インスタンスに接続している方のPCです)に、VNC接続環境をセットアップしていきます。このリンクからVNC Viewerをダウンロードし、インストールします(下図)。

VNC Viewerダウンロード画面

インストールが完了したらアプリを立ち上げて、下図のアドレス欄に

localhost:5901

を入力します。

VNC Viewrにアドレス入力

アドレス入力し、出てきたポップアップ上「Continue」を押下し、先ほど設定したVNC用のパスワードを入力することで認証が完了します(下図)。

認証画面1
認証画面2

接続時にUbuntu20.04LTSのアップデートを促されますが、今回は「Don’t Upgrade」を押下してアップグレードしないようにします(なお、HGAインスタンスにおいてUbuntu20.04は2020/11/17現在サポート対象外です)。また、画面左上にVNCクライアントについて各種設定画面が出ますので、各項目を確認「×」をクリックして閉じます。

VNC接続後初期画面

Ubutnu20.04アップグレード方法を確認する画面が出るので「OK」押下で閉じてください。

20.04アップグレード方法確認ウィンドウ

これでデスクトップ画面が表示されます。LXDEを使っているのでDebianとなっています。

デスクトップ画面

ブラウザを開いてネットサーフィンをしたりYouTubeを観たりする分には全く問題ありませんでした(さりげなくブログの宣伝もしていてバッチリです)。

デフォルトブラウザは火狐

 ここで注意していただきたいのは、LibraOfficeなどのアイコンがデスクトップ上にあっても、初期段階ではクリックしても動作しないことです。これはインスタンス自体に入っていないためであり、使いたい場合は別途ダウンロードとインストールを行ってください。また、GPUで~のソフトを使いたいので検証してほしい・もっと詳しくセットアップ方法が知りたい等ございましたらサポートやTwitterよりお問い合わせください。弊社の方でも引き続きMatlabなどメジャーどころの数値シミュレーションソフトの動作を検証していく予定です。

注意1:VNCサーバのシャットダウンについて

 デスクトップ画面を切りたいときはVNC Viewerの画面を閉じると共に、VNCサーバを忘れずシャットダウンするようにしましょう(プロセスごと)。インスタンス内で下記コマンドを使用します。

vncserver -kill :1

これを忘れてサーバを重複起動させると次の注意2で述べるトラブルにつながる可能性があります。

注意2:VNC Viewer接続後画面が真っ暗になるとき

 VNCに接続しても画面が真っ黒のまま何も表示されないときがあります。そのときは/tmp配下にある、VNCサーバ起動時に一時的にキャッシュされる変数群を削除するとうまく行きます。下記のコマンドで削除します。

rm -f /tmp/.X11-unix/X*

 vncserverの実行コマンドの311行目辺りを見ると、上記のテンポラリファイル系が存在する場合にディスプレイ環境変数に値をセットするのですが、$displayNumberが複数ある場合ここのセットに失敗する可能性があります。また、通信状況によっては再度時間をおいてからvncserverを起動しないとだめな場合もあるようです。

注意3:emacs派の方・生粋vimmerの方へ

 emacs派の方へ:すみません、がんばって慣れようとしたのですが本当に使いにくかったです。もちろん、インスタンスにインストールできます。

 生粋vimmerの方へ:入力カーソル移動にいちいちノーマルモードでh,j,k,lしんど過ぎません・・・?

いかがでしたでしょうか。
弊社クラウドGPUサーバのご利用をご検討中の方はhttps://gpu-advance.highreso.jpからお気軽にお申込みやお問い合わせください。
最初の3日間はお試し期間として利用無料です!