ばっかじゃないの!

じゃみらー

Ubuntu 12.04 (LTS)に VNC(正確にはXDMCP?)でログインする

最近の Ubuntu は,デスクトップマネージャ(DM)にGNOMEのやつ(GDM)を使っていないらしく,デフォルトはLightDMだったので記録しておく(ネットにある情報はだいたいがわざわざgdmを入れさせてるので).

環境は以下のとおり.

  • VNCサーバ:vnc4server on ubuntu 12.04
  • VNCクライアント:画面共有.app on Mac OS X 10.8.5

今のところの問題点はクリップボード(コピペ)まわりがうまくいかないこと.具体的には

  1. クライアント側でコピーして,サーバ側で,ペーストが出来ない.そもそもコピーした内容がサーバ側に渡ってない様子.
  2. 逆に,VNCサーバ側でコピーして,クライアント側でそれを受け取ってペーストは出来るが,日本語は文字化けする.例:サーバ側で「あいうえお」をコピーする→クライアント側でペーストすると「¥u3042¥u3044¥u3046¥u3048¥u304a」となる.(単に文字コードが変なだけな気がする)

てな具合.それ以外は概ね良好.

以下は導入の手順.ただしクライアント側はMacなのでデフォルトでOK *1

1. Ubuntu 上で,vnc4server と xinetd *2を入れる.

$ sudo apt-get install vnc4server xinetd

(vnc4server だけでもVNCは出来るけど,その場合は常にユーザがログインした状態になるか,もしくはsshでまず入ってvnc4serverを起動してからVNCすることになる.それでもいいならUbuntuでVNC使えるようになるまでメモ - i_aose(旧polaroidoon)の日記 に従えばできる)

2. 次は xinetd の設定.

xinetd は

ポート監視用のデーモンプログラムで、あるポートに対してアクセスがあると、設定ファイル (/etc/xinetd.d/ 等) を元にポートに対応したサービス (ftp 等) を起動します。この際、ポートとサービスの関係は、/etc/services によって導かれます( xinetd の設定 )

とある通り,以下で,/etc/services に VNCのポートを追加して,そのポートにアクセスがあった場合の挙動を /etc/xinetd.d/xvnc に指定する.

2. 1. VNC用の監視ポートを登録する.

$ sudo vim /etc/services

とかで開いて,最終行にでも以下を追加する.

xvnc            5902/tcp                        # VNC server

※ポート番号5902は,他とかぶってなかったら好きに替えてもいいはず.

2. 2. VNC用の設定ファイルを作成する.

$ sudo vim /etc/xinetd.d/xvnc

とかして(好きな)エディタで以下を入力する.

service xvnc
{
disable = no
socket_type = stream
wait = no
user = nobody
group = tty
server = /usr/bin/Xvnc
server_args = -inetd -geometry 1920x1200 -depth 24 -query localhost -once PasswordFile=/etc/passwd_vnc
}

 ただし"-geometry 1920x1200"はVNCしたときの画面の解像度になるので,自分の好きに指定する.

3. VNCサーバにアクセスするためのパスワードを用意する

$ sudo vncpasswd /etc/passwd_vnc
$ chown nobody:tty /etc/passwd_vnc

とか打ってみる.これは(詳しくは)知らない.知ってるひとは教えてください.

4. LightDM の XDMCP を有効化させる

これも詳しくは分からないが,以下の設定をしてないと,ちゃんとGUIが起動しなかった.VNC でマルチユーザー・ログインを可能にするとか,Xディスプレイマネージャ - Wikipediaとかを参照して勉強して,理解したら教えてください.

作業自体は

$ sudo vim /etc/lightdm/lightdm.conf

とか打って,/etc/lightdm/lightdm.conf *3を開いて,最後に

[XDMCPServer]
enabled=true

と追加する.

5. LightDM と xinetd を再起動する.

$ sudo /etc/init.d/xinetd restart
$ sudo /etc/init.d/lightdm restart

6. クライアント側からアクセスしてみる.

以上で導入完了.うまくいったかチェックしてみる.

Finder で ⌘ + k とするか,「移動 > サーバへ接続…」として,vnc://xxx.xxx.xxx.xxx:5902 とかしてアクセスしてみる. (当たり前だけど xxx.xxx.xxx.xxx はサーバのIPアドレスで,192.168.0.10 とかそんなの.5902 も 2.2 で指定したポート番号にすること)

捕捉. ちゃんとLISTENしてるか一応,確認

 netstat -a | grep vnc
tcp        0      0 *:xvnc                  *:*                     LISTEN 

となっていたら良い. もしかすると grep 5902 じゃないとヒットしないかもしれない.

捕捉その2.SSHでトンネルして接続する.

これについては,セキュリティ面でやっておくべき.ヒントはMacからSSH経由でVNCを使う|mattintosh note (跡地)とか.


 これを書いてから,そもそもなんで xinetd が入ってないのか疑問に思って調べてみたら,upstart ってのが最近は主流らしい.これについての情報があんまりないので,どうすれば良いかは調べてみないと分かんないけど,たぶん xinetd の部分は全部 upstart で置き換えられると思う.

*1:そう,macだからね.

*2:詳しくは xinetd の設定 とか参照

*3:書き方が不安なら /usr/share/doc/lightdm/lightdm.conf.gz に見本がある