Android タブレットを Ubuntu 17.04 のディスプレイにする
以前に Acer ICONIA A700 を買ったのだが、 今となっては性能が悪くてタブレットとして快適に使うことができない。 それで、Ubuntu をインストールしたノート PC のセカンドディスプレイとして 使うことができないかと設定を試してみた。 Ubuntu で VNC サーバを動かして、タブレットでその VNC サーバにアクセスする方法なので Android タブレットである必要はなく、VNC のクライアントが動くなら何でも良い (Windows, MacOS、Android、iOS のどれでも Ubuntu のデュアルディスプレイにできる)。
作業は VAIO Pro 11 にインストールした Ubuntu 17.04 で行った。
Ubuntu と Android タブレットの通信
自分が管理している LAN なら Ubuntu とタブレットを同じネットワークに接続させれば終わり。 タブレットをセカンドディスプレイにしたいという状況は、 主に出先なので Ubuntu を無線ルータとして動かして、そこにタブレットを接続する。
create_ap を使うとコマンド一つで Linux を簡易的なルータにできる。
git clone https://github.com/oblique/create_ap
で適当なディレクトリにダウンロードする。
apt install util-linux procps hostapd iproute2 iw
で必要なパッケージをインストールする。
sudo <PATH_TO>/create_ap wlan0 wlan0 <NAME_SSID> <PASSWORD>
とすると wlan0 で Ubuntu が無線ルータと動いて LAN を作ることと 外部へのアクセスの両方ができる (対応していないハードウェアもあるらしい)。 このとき、無線 LAN が 11a で接続しているとうまく動かなかった。 私の環境では、create_ap を編集して 11a でインターネットに接続している場合でも 強制的に 2.4 GHz の無線 LAN を transmit するようにすればうまくいった。
if is_wifi_connected ${WIFI_IFACE}; then
WIFI_IFACE_FREQ=$(iw dev ${WIFI_IFACE} link | grep -i freq | awk '{print $2}')
- WIFI_IFACE_CHANNEL=$(ieee80211_frequency_to_channel ${WIFI_IFACE_FREQ})
+ # WIFI_IFACE_CHANNEL=$(ieee80211_frequency_to_channel ${WIFI_IFACE_FREQ})
+ WIFI_IFACE_CHANNEL=1
+ FREQ_BAND=2.4
echo -n "${WIFI_IFACE} is already associated with channel ${WIFI_IFACE_CHANNEL} (${WIFI_IFACE_FREQ} MHz)"
- if is_5ghz_frequency $WIFI_IFACE_FREQ; then
- FREQ_BAND=5
- else
- FREQ_BAND=2.4
- fi
+ # if is_5ghz_frequency $WIFI_IFACE_FREQ; then
+ # FREQ_BAND=5
+ # else
+ # FREQ_BAND=2.4
+ # fi
if [[ $WIFI_IFACE_CHANNEL -ne $CHANNEL ]]; then
echo ", fallback to channel ${WIFI_IFACE_CHANNEL}"
CHANNEL=$WIFI_IFACE_CHANNEL
のように、create_ap を編集した。
sudo <PATH_TO>/create_ap wlan0 eth0 <NAME_SSID> <PASSWORD>
のようにすると外部へのアクセスとしては有線 LAN を使ったりすることもできる。
sudo <PATH_TO>/create_ap --stop wlan0
とすると終了する。
create_ap の設定によっては、設定が元に戻らなくて NetworkManager で無線 LAN を設定できなくなる場合がある。 /etc/NetworkManager/NetworkManager.conf の [keyfile] のところを調べる。 NetworkManager の管理からデバイスが除かれる設定が残っていて、 無線 LAN の設定ができなくなっている場合はその部分を削除する。
タブレットとの間の VNC の通信は、普通は SSH などを使ってセキュリティに注意する必要がある。 ただ、私の使い方では他の人のマシンをこのネットワークに接続させるようなことはなく、 ノート PC とタブレットだけのネットワークなので 何もセキュリティの対策をとらない VNC を使っている。
xrandr の --fb を使う方法
VNC を使ってディアルディスプレイするには、 何らかの方法でデスクトップのサイズを拡大して、実際のディスプレイに表示されない領域を作り、 そこを x11vnc で表示する。
まず、xrandr の --fb オプションを使う方法を述べる。 https://askubuntu.com/questions/28608/how-do-you-use-an-android-tablet-as-a-second-display を参考にした。
eDP-1 をデフォルトのディスプレイで解像度は 1920x1080 とする。 このディスプレイの右側に 1920x1080 の領域を作って、 それを x11vnc の -clip で指定する。
xrandr -fb 3840x1080 --output eDP-1 --panning 1920x1080
x11vnc -clip 1920x1080+1920+0 -nocursorshape -nocursorpos -noxinerama
として x11vnc サーバーを動かす。 このとき -noxinerama をつけないと、 VNC で接続後に背景だけしか表示されず、ウィンドウがうまく表示されなかった。
後は、bVNC などを使って Android で VNC サーバにアクセスすれば良い。 ただ、私の環境では、VNC で表示している領域にウィンドウを動かしたときに、 残像が残るため、常用しようとは思えなかった。
xrandr の --output に VirtualHeads を使う方法
Google で検索すると xrandr --output でディスプレイに表示しない領域を作って使う方法が 見つかるのだが、はじめはうまくいかなかった。
DEVICE="VIRTUAL1"
# gtf 1920 1080 60 | sed -n 's/.*Modeline "\([^" ]\+\)" \(.*\)/\1 \2/p'
MODELINE="1920x1080_60.00 172.80 1920 2040 2248 2576 1080 1081 1084 1118 -HSync +Vsync"
NAME="1920x1080_60.00"
xrandr --delmode "$DEVICE" "${NAME}"
xrandr --rmmode "${NAME}"
xrandr --newmode ${MODELINE}
xrandr --addmode "$DEVICE" "${NAME}"
xrandr --output $DEVICE --mode $NAME --right-of eDP-1
というような感じにするのだが、VAIO Pro 11 の Ubuntu 17.04 ではエラーが出た。
私の環境では、 http://linux.rofer.me/2014/07/using-another-tabletcomputer-as-second.html にあるように /etc/xorg.conf (ファイルがなければ作る) に
Section "Device"
Identifier "Device0"
Option "AccelMethod" "sna"
Option "VirtualHeads" "1"
Driver "intel"
EndSection
を書く必要があった。編集したら再起動する。 ドライバが intel となっているように、intel 以外のグラフィックチップでは 上の設定では動かない (はず)。
上述のスクリプトを使えば良いのだが、 xorg.conf を設定した後は eDP-1 が eDP1 に HDMI-1 が HDMI1 になっていた。
xrandr
とすると今までなかった VIRTUAL1 ができていることを確認する。 次のスクリプト
DEVICE="VIRTUAL1"
# gtf 1920 1080 60 | sed -n 's/.*Modeline "\([^" ]\+\)" \(.*\)/\1 \2/p'
MODELINE="1920x1080_60.00 172.80 1920 2040 2248 2576 1080 1081 1084 1118 -HSync +Vsync"
NAME="1920x1080_60.00"
xrandr --delmode "$DEVICE" "${NAME}"
xrandr --rmmode "${NAME}"
xrandr --newmode ${MODELINE}
xrandr --addmode "$DEVICE" "${NAME}"
xrandr --output $DEVICE --mode $NAME --right-of eDP1
を実行する。
xrandr
とすると VIRTUAL1 に connected と表示されている。
x11vnc -clip 1920x1080+1920+0 -noxfixes -noxdamage -nocursorshape -nocursorpos -noxinerama -viewonly
のように x11vnc を実行して、タブレットで VNC サーバに接続する。 x11vnc のオプションはこれが最適かはわからないが、 今のところ上のようにしている。