Raspberry Pi3 ZERO(W) Alpine Linux(3.8.1)インストール

Alpine Linux(3.8.1)がリリースされています。
dockerコンテナを運用するにはやはり軽量OSがいいでしょうということで学習用にAlpine LinuxをRaspberry Piにインストールしてみたいと思います。

Alpine Linuxは超軽量ということもあってdebian系と比べるとシステム系のコマンドが大分違うように感じます。またRaspberry Piに配布されているイメージはdiskless modeというこれまた一癖ある仕様かなと思います。
Alpine Linuxに関する情報はTutorials and Howtos当りにあります。(一部古いものもある)
検索すると結構関連情報(ヒント)が見つかると思います。
Raspberry Pi3,zero(W)のwifiドライバーは調べるとbrcmが使われるようです。raspbianのdmesgを調べるとこれが見つかります。

$ dmesg | grep brcm
[    6.140562] brcmfmac: brcmf_fw_map_chip_to_name: using brcm/brcmfmac43430-sdio.bin for chip 0x00a9a6(43430) rev 0x000001

一旦alpineをインストールして調べると/lib/firmware/brcm以下に見つかります。
以上を踏まえて有線なしwifiインストールでいってみたいと思います。

インストール環境

基本の初期インストールはどうしてもディスプレー、キーボードが必要になってしまいます。
運用についてはzero(W)を想定していますがディスプレーやらキーボードを繋ぎ変えるのが面倒(設定も)なためRaspberry Pi3でカードを作成、インストール、ネットワーク設定まで実施、その後はzero(W)に挿し替えてRaspberry Pi3からsshでzero(W)に接続、設定を続行します。

カードの作成

パーティションエディタ(gparted)を起動(作成するカードを間違えないように!)

alpineのOS領域とデータ保存などにするためパーテーションを分けて作成します。
8GBのカード(/dev/sdaで認識)を3000MiBで切ってFAT32でフォーマット、alpineに割り当てて残りをEXT4にしています。
パーテーションを作成したらsda1のフラグをbootにチェックを入れます。


https://alpinelinux.org/downloads/からRASPBERRY PI(armhf)をダウンロード
sda1にコピーして展開、元ファイルは削除します。
特に編集する項目はありません。抜き差しして正常にマウント、ファイルが見えていればOK

Alpine Linux(3.8.1)のインストール

wifiセットアップのため接続情報を用意しておきます。
Pi3にカードをセットしてpower on

# root Enter
# setup-alpine
keyboard
Select keyboard layout [none]: jp
Select variant []: jp

ホスト名はかっこいい名前を!

Enter system hostname (short form, e.g. 'foo') [localhost]: alpine

IPはdhcpで設定してみます。([dhcp]でアドレスを指定すると固定IPになる)
表示はコピーできないので大分端折っています。

Which one do you want to initialize? [eth0] Enter
Ip addres for eth0?  [dhcp] Enter
which one ----- initialize? [wlan0] Enter
Buffallo-G-110=psk (ステーションが表示)
Type the ---- connct to: Buffallo-G-110
---- --- Pre Shared key: xxxxxxxxxxxxxx
Ip address for wlan? [dhcp] Enter
Do you want ------ ? [no] Enter
wdhcpc:sending select for 192.168.0.166 (dhcpでIP取得)
Changing password for root
New password: (rootパスワード)
Retype password: (rootパスワード)
Which timezone are you in? ('?' for list) [?] Asia/Tokyo
HTTP/FTP proxy URL? (http://proxy:8080') [none] Enter
Enter mirror number [f]: done (ネットワークが有効になっていないので取得できない)
Which SSH server? [openssh] Enter
Which NTP client to run? [chrony] Enter
Which disk(s) would you like to use? [none] Enter
---- ----- ----- ----- ---- [mmcblkp01] Enter
---- ----- ----- --- [media/mmcblkp01/cache] Enter
alpine #

取り敢えずインストールが完了しました。
# ip aで見ると設定した内容が反映されていますがまだ有効になっていません。

起動時wifiを有効にします。

# rc-update add wpa_supplicant boot

rebootする前に変更を記憶します。disklessの場合はなにか変更を加えたら必ず実行します。

# lbu ci -d

再起動してネットワークが有効になっているか確認します。

# ip a
2: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether b8:27:eb:95:d9:14 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.166/24 scope global wlan0

yahooはpingを返してくれます。

# ping -c 3 yahoo.co.jp
PING yahoo.co.jp (182.22.59.229): 56 data bytes
64 bytes from 182.22.59.229: seq=0 ttl=47 time=35.139 ms
64 bytes from 182.22.59.229: seq=1 ttl=47 time=20.057 ms
64 bytes from 182.22.59.229: seq=2 ttl=47 time=21.332 ms

--- yahoo.co.jp ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 20.057/25.509/35.139 ms

setup-alpineは何度でもやり直しできます。(一からですが)
有線では2度目にリポジトリを取得します。wifiは初期化するので無理
同一ネットワーク帯に2個のIPを配置することはできないのでwifiを使用する時は/etc/network/interfacesのeth0を無効(コメントor削除)にしておきます。
繋がるネットワークができたら以降はこのファイルで有線、無線、固定、dhcpの変更ができます。
apk addできるまではデフォルトのviエディタを使うことになると思います。
数回インストールをやり直しましたが慣れてくるとカード作成からここまで10分もかからないでできます。

デフォルトのsshはrootからログインできません。userを作成するまでrootからのログインを許可
32行目当りに追記

/etc/ssh/sshd_config
#PermitRootLogin prohibit-password
PermitRootLogin yes

# lbu ci -d 忘れずに!
# poweroff

zero(W)にカードをセット起動、pi3からログイン
zero(W)から起動するとdhcpから取得するIPは変わってしまうと思います。なんらかの方法でIPを捜す必要があります。スマホを利用するとか当サイトではPi3にnmapをインストールしています。

# apt install nmap
# nmap -sP 192.168.0.0/24

Raspberry Pi特有の問題としてクロックを変更する必要があるようです。

# rc-update add swclock boot
 * service swclock added to runlevel boot
# rc-update del hwclock boot
 * service hwclock removed from runlevel boot

# lbu ci -d 忘れずに!
rebootして再ログイン

# rc-status
なんか出てますね。
acpid [ crashed ]
pi3では出ていなかったのでzero(W)特有の問題と思われます。

取り敢えずサービスを止めます。

# rc-update del acpid
 * service acpid removed from runlevel default

# lbu ci -d 忘れずに!

以下は試しに有線でインストール取得したリポジトリです。
正規に取得した場合2行目のmain以降はコメント扱いになっているので解除してやります。
/etc/apk/repositoriesに追記

/media/mmcblk0p1/apks
http://dl-cdn.alpinelinux.org/alpine/v3.8/main
http://dl-cdn.alpinelinux.org/alpine/v3.8/community
http://dl-cdn.alpinelinux.org/alpine/edge/main
http://dl-cdn.alpinelinux.org/alpine/edge/community
http://dl-cdn.alpinelinux.org/alpine/edge/testing

# lbu ci -d 忘れずに!

 # apk update
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/main/armhf/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/community/armhf/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/edge/main/armhf/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/edge/community/armhf/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/edge/testing/armhf/APKINDEX.tar.gz
v3.8.1-1-g91d49cb572 [http://dl-cdn.alpinelinux.org/alpine/v3.8/main]
v3.8.1-1-g91d49cb572 [http://dl-cdn.alpinelinux.org/alpine/v3.8/community]
v3.8.0-1995-gca2ab7494b [http://dl-cdn.alpinelinux.org/alpine/edge/main]
v3.8.0-1944-g009fc7167b [http://dl-cdn.alpinelinux.org/alpine/edge/community]
v3.8.0-1940-g1a4a0a7c7c [http://dl-cdn.alpinelinux.org/alpine/edge/testing]
OK: 21677 distinct packages available

ユーザー作成
ディフォルトではadduserが使えます。

adduser -u 1000 -g 1000 -h /home/pi pi

# lbu ci -d 忘れずに!
忘れないでlbuしたのですが再起動するとpiのホームディレクトリや/rootにscpしたファイルがきれいさっぱり無くなってしまいました。
調べてみるとlbuで保存する対象も設定が必要ということです。まだよくわかっていないのですがWeb情報を頼りに以下を設定しています。
piのホームディレクトリはmkdir chownで再作成
/etc/apk/protected_paths.d/lbu.list 新規作成

+home/*/
+home/*/*
+root/*/
+root/*/*

# lbu ci -d 忘れずに!
# lbu lsすると保存リストを表示します。
再起動すると無事保存されるようです。但しネットワークなどを変更すると無くなってしまうこともあるようです。

/dev/mmcblk0p2のマウント
ホームディレクトリや設定ファイルのバックアップなどにも使えます。
/mntは汎用に使うとして/srvにマウントしました。

/etc/fstab 追記
/dev/mmcblk0p2  /srv    ext4    defaults,noatime  0 0

パッケージインストール

# apk add bash tmux sudo shadow

以降適宜 # lbu ci -d 忘れずに! # reboot
shell 変更

# chsh -s /bin/bash

# apk add docker メインの実験環境
# apk add bind-tools ネットワークツール

sshに叱られる
当初は順調に稼働していたのですが次第にssh接続が切れる、最後にはログインできなくなってしまいました。
メッセージは次のとおり
root@192.168.0.188’s password:
PTY allocation request failed on channel 0
WARNING: Your password has expired.
Password change required but no TTY available.
Connection to 192.168.0.188 closed.
パスワードをチェンジしろと言っています。
接続できているときにrootでpasswdしても変更を拒否されてしまいます。
pi3にカードをセットして直ログイン、パスワードを変更、IPを固定IPに変更しました。
詳しいことはわかりませんが原因は2枚のカードを作り直す際に同Ip、同パスワードを使い廻したため不正ログインとPi3にみなされたようです。

その後は問題なく稼働しています。
.bashrc .vimrcなどコピーしてさらに必要なコマンドは都度追加、unix系コマンド操作に関してはraspbian lite並になりました。
若干変態的なところがありますが設定ファイルが非常にシンプル、ディレクトリ構成もシンプルなところに好感が持てます。
どこまで使いこなせるかわかりませんがもう少し勉強してみたいと思います。

Raspberry Pi docker Nginx Web Server

nginxにはstable版とmainline版がありますが今回はコンテナ内でmainline版をbuild、ビルドしてできたファイルを別のコンテナにインストールしてnginx serverを動かしてみたいと思います。

mainline版は約1ヶ月毎に新機能やbugfixその他変更が加わります。当サイトのRaspberry Piでは無理にmainline版を追いかける必要はないのですが初回インストール時位は最新のバージョンにしたいものです。

現時点(20180912)の最新バージョンはnginx 1.15.3

元ネタはこちらです。
Raspberry Piにnginx (mainline)をインストール

ビルド用コンテナの作成

コンテナイメージは前回作成したstretch_liteを使います。

$ docker container run --name nginx_build -v ~/build:/mnt -it stretch_lite-img /bin/bash

コンテナ内で作業開始
認証キーの登録

# curl http://nginx.org/keys/nginx_signing.key | apt-key add -
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1561  100  1561    0     0   2774      0 --:--:-- --:--:-- --:--:--  2772
OK

ソースリストの登録

/etc/apt/sources.list.d/nginx.list
deb-src http://nginx.org/packages/mainline/debian/ stretch nginx

コンパイルに必要なパッケージのインストール

# apt update && apt -y upgrade
# apt -y build-dep nginx

作業ディレクトリの変更
共有ディレクトリに/mnt/nginx_1.15.3を作成

# mkdir /mnt/nginx_1.15.3
# cd /mnt/nginx_1.15.3

ビルドを実行(約10分)
ソースを取得する際下記のメッセージが出ますがダウンロードはできているのでOKと思います。
stretchでは特にoptionを指定する必要はないようです。

# apt-get -y source nginx
W: ファイル 'nginx_1.15.3-1~stretch.dsc' がユーザ '_apt' からアクセスできないため、ダウンロードは root でサンドボックスを通さずに行われます。 - pkgAcquire::Run (13: 許可がありません)
# cd nginx-*
# export DEB_BUILD_MAINT_OPTIONS=hardening=+pie
# dpkg-buildpackage -uc -b
# cd ../
# ls -la nginx_*~stretch_armhf.deb
-rw-r--r-- 1 root root 724588  9月 12 22:41 nginx_1.15.3-1~stretch_armhf.deb
# exit

共有ディレクトリ~/build/nginx_1.15.3内にはnginx_1.15.3-1~stretch_armhf.debができています。

Web Server用コンテナの作成

ビルドしたnginx_1.15.3-1をインストールするため新たにWeb Server用として上記同様のコンテナイメージ(stretch_lite)から作成します。
ネットワークはnginx_networkを作成して固定IPを割り当ててみます。

$ docker network create --subnet=172.21.0.0/24 nginx_network
$ docker container run --privileged -d --net=nginx_network --ip=172.21.0.11 -p 80:80 --name nginx_server -v ~/build:/mnt stretch_lite-img /lib/systemd/systemd
$ docker container ls
85913f8c1af1  stretch_lite-img  "/lib/systemd/systemd" 2 minutes ago  Up 2 minutes        0.0.0.0:80->80/tcp   nginx_server
$ ping -c 3 172.21.0.11
PING 172.21.0.11 (172.21.0.11) 56(84) bytes of data.
64 bytes from 172.21.0.11: icmp_seq=1 ttl=64 time=0.248 ms
64 bytes from 172.21.0.11: icmp_seq=2 ttl=64 time=0.125 ms
64 bytes from 172.21.0.11: icmp_seq=3 ttl=64 time=0.186 ms

--- 172.21.0.11 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2111ms
rtt min/avg/max/mdev = 0.125/0.186/0.248/0.051 ms

コンテナに入って作業開始

$ docker container exec -it nginx_server /bin/bash

nginxのインストール

# dpkg -i /mnt/nginx_1.15.3/nginx_1.15.3-1~stretch_armhf.deb
以前に未選択のパッケージ nginx を選択しています。
(データベースを読み込んでいます ... 現在 15203 個のファイルとディレクトリがインストールされています。)
.../nginx_1.15.3-1~stretch_armhf.deb を展開する準備をしています ...
----------------------------------------------------------------------

Thanks for using nginx!

Please find the official documentation for nginx here:
* http://nginx.org/en/docs/

Please subscribe to nginx-announce mailing list to get
the most important news about nginx:
* http://nginx.org/en/support.html

Commercial subscriptions for nginx are available on:
* http://nginx.com/products/

----------------------------------------------------------------------
nginx (1.15.3-1~stretch) を展開しています...
nginx (1.15.3-1~stretch) を設定しています ...
invoke-rc.d: policy-rc.d denied execution of start.
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /lib/systemd/system/nginx.service.
systemd (232-25+deb9u4) のトリガを処理しています ...
# systemctl start nginx


無事動いているようです。


インストールされる/etc/nginx以下の設定ファイルはパッケージからインストールされるdebian(raspbian)形式とは違って多分nginxデフォルトの形式と思います。
dpkg -iで導入する際は既存の設定ファイルがあっても問答無用で置き換えてしまうので注意が必要です。

php7.0-fpmのインストール、設定

# apt install php7.0-fpm

nginxデフォルトの設定ファイルでphpが動く最低限の設定をしてみます。
/etc/nginx/conf.d/default.conf
index.phpを追記

location / {
        root   /usr/share/nginx/html;
        index  index.php index.html index.htm;
    }

location ~ \.php$を以下のとおり

location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        root   /usr/share/nginx/html;
        fastcgi_index  index.php;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
        include        fastcgi_params;
    }

/etc/php/7.0/fpm/pool.d/www.conf
www-dataからnginxに変更

listen.owner = nginx
listen.group = nginx

/usr/share/nginx/html/phpinfo.php

<?php
phpinfo();
?>
# systemctl restart nginx
# systemctl restart php7.0-fpm


ブラウザからhttp://172.21.0.11/phpinfo.php

Raspberry Pi docker PulseAudio

前回作成したraspbian-MATEのコンテナからPulse Audioを利用できるか試してみました。

当サイトの環境はmoode audioにpulse serverを設定、clientのpi3はmoode audioでpulse audioがスタートしてあればmoode audio側で再生、ストップ時は内臓のalsaで再生します。

raspbian-MATE

作成したraspbian-MATEのコンテナにはpulse clientのライブラリはインストールされています。

/root/.config/pulse/client.confを作成します。
内容はhostのpi3(~/.config/pulse/client.conf)と同様です。

# mkdir ~/.config/pulse

/root/.config/pulse/client.conf
autospawn = no
daemon-binary = /bin/true
default-server = 192.168.xxx.xxx

音楽プレーヤーにはaudaciousをインストールしてみました。必要なライブラリを含めて240MB位インストールされます。

# apt install audacious

インストールが終わっtら一旦コンテナをリスタートさせます。


audaciousを起動してオーディオ設定から出力プラグインをAlsa出力からPulseAudio出力に変更します。
pulse serverがスタートしていないとAlsa出力に戻るので要チェック


音楽ファイルを適当に用意します。
dockerで設定した共有ディレクトリ以外にもMATEのファイルマネージャーにはhostの物理デバイス(osパーテーションを覗く)が見えてきます。
コンテナはrootで実行しているので扱いは慎重に!

pulse serverのpulse audioをstartしてhost(pi3)はpavucontrolを起動します。

コンテナからもhostから利用する場合と全く同様に実行が可能ですね。
firefoxもpulse serverが先にスタートしてあれば自動でPulseAudioに出力します。

raspbian RPDはpulse clientだけインストールすれば同様に動きます。

# apt install libpulse0

起動メニューを作成する
これまで作成したコンテナはいろいろ使い倒せるので簡単に起動できるようメニューを作成してみました。

Container Stopは起動中のコンテナ全てを停止します。
RPDとMATEはXの起動を待つため5秒のsleepを入れています。(時間は要調整)
状況に応じてhostのdockerデーモンを再起動。
必要に応じてmenuを書き換え。~/bin/docker.sh

Main Menu Editorで登録しておけば使いやすくなると思います。
#実行権限が必要でした。
$ chmod 755 ~/bin/docker.sh

#!/bin/bash
ACTION=$(zenity --list --radiolist \
  --width=300 --height=230 \
  --hide-header \
  --title="Docker Session" \
  --text="What would you like to do? by Docker" \
  --column "Select" --column="Action" \
  TRUE  "Docker Container Stop" \
  FALSE "Stretch RPD" \
  FALSE "Stretch MATE" \
  FALSE "Stretch Lite" \
  FALSE "Systemctl Restart Docker" \
  FALSE "This Menu Edit")
RET=$?

if [ "$ACTION" = "Docker Container Stop" ]; then
  docker container stop $(docker ps -q)
elif [ "$ACTION" = "Stretch RPD" ]; then
  docker container start stretch_rpd
  sleep 5
  vncviewer localhost:1
elif [ "$ACTION" = "Stretch MATE" ]; then
  docker container start stretch_mate
  sleep 5
  vncviewer localhost:1
elif [ "$ACTION" = "Stretch Lite" ]; then
  docker container start stretch_lite
  sleep 2
  gnome-terminal -e 'docker container exec -it stretch_lite /bin/bash'
elif [ "$ACTION" = "Systemctl Restart Docker" ]; then
  sudo systemctl restart docker
elif [ "$ACTION" = "This Menu Edit" ]; then
  leafpad ~/bin/docker.sh
else
   echo "cancel"
fi

Raspberry Pi docker デスクトップ MATE

[GUIDE] Raspbian Lite with RPD/LXDE/XFCE/MATE/i3/Openbox/X11 GUIにはXFCEとMATEのインストール方法についても記述があります。

docker上でうまくインストールできるか試してみました。

XFCEについてはlighdmも依存関係でインストールされてしまい削除してもきれいには動いてくれませんでした。

MATEはlighdmなしにインストール及び動作が可能のようです。

コンテナの作成

ベースイメージは前回作成したこちら

$ docker container run --privileged -d -p 5901:5901 --name stretch_mate -v /home/pi/build:/mnt stretch_lite-img /lib/systemd/systemd

コンテナに入る

$ docker container exec -it stretch_mate /bin/bash

パッケージのインストール

# apt install -y --no-install-recommends xserver-xorg xinit
# apt install -y mate-desktop-environment-core
# apt install -y fcitx-anthy fonts-ipafont fonts-ricty-diminished
# apt install -y tightvncserver autocutsel

vncserverを起動、パスワードを設定

# vncserver :1 -geometry 950x650 -depth 24
You will require a password to access your desktops.
Password: 
Verify:   
Would you like to enter a view-only password (y/n)? n

ホストPi3のターミナルから $ vncviewer localhost :1
いきなりOKですね

通知エリアに変な記号が入っていますがfcitxも起動しています。気にしなければOK
本来はボリュームコントロール、USB、ネットワークマネージャーが並ぶと思います。
ユーザーのフォント設定も入っているようです。
標準フォントを等幅からプロポーショナルフォントにしたい場合は前回のフォントセットを実施

取り敢えずautocutselと自動起動(vncboot)の設定を入れておきます。
~/.vnc/xstartupの編集

#!/bin/sh
xrdb $HOME/.Xresources
xsetroot -solid grey
cd
autocutsel -fork
#x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#x-window-manager &
# Fix to make GNOME work
export XKL_XMODMAP_DISABLE=1
/etc/X11/Xsession

/etc/init.d/vncboot 新規作成

#! /bin/sh
### BEGIN INIT INFO
# Provides: vncboot
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start VNC Server at boot time
# Description: Start VNC Server at boot time.
### END INIT INFO
# /etc/init.d/vncboot
USER=root
HOME=/root
export LANG='ja_JP.UTF-8'
export USER HOME
case "$1" in
    start)
        echo "Starting VNC Server"
        #Insert your favoured settings for a VNC session
        su $USER -c '/usr/bin/vncserver :1 -geometry 950x650 -depth 24'
        ;;
    stop)
        echo "Stopping VNC Server"
        su $USER -c '/usr/bin/vncserver -kill :1'
        ;;
    *)
        echo "Usage: /etc/init.d/vncboot {start|stop}"
        exit 1
        ;;esac
exit 0
# chmod 755 vncboot
# systemctl enable vncboot

以降はコンテナをrestart(start)するだけでvncviewerからアクセスできます。

少しUIをいじってみました。

通知エリアが気になる場合は削除してfcitxの設定からウインドー内に移動すことができます。

今回試した中では後発ということもあって画面構成は洗練されている感じがします。

ここでcommit

$ docker container commit stretch_mate stretch_mate-img
sha256:7043838bc706a7c24d1a4ab8b8526f8ef4f4bc8163d8d6b9902ce17bfef8dc6f
$ docker image ls | grep mate
stretch_mate-img  latest   7043838bc706    2 minutes ago    1.22GB

イメージサイズはRPDよりは若干大きくなりますが試すにはMATEがおすすめです。

firefox-esr-l10n-jaをインストール

youtubeも特に問題なく再生できるようです。音声(alsa)はホストに送られます。
なぜか前回のrpdの方はクラッシュする率が高いです。
chromium-browserのインストール設定は難しい。

dockerデスクトップも使い方次第で面白いことができそうです。

Raspberry Pi docker デスクトップ環境

前回はraspbianのcliイメージを作り直しましたがやはりdocker上で動くデスクトップ環境も試してみたいですね。

今回は前回のraspbian cliイメージからデスクトップ環境を構築してみようと思います。

Caution

今回試してみた方法ではいわゆる統合デスクトップ環境(LXDE,XFCE)などがそのままインストールできてしまいます。それらはディスプレーマネージャーも付属しておりDMが起動すると結果的にdisplay:0ホストのディスプレーを専有してしまい抜け出すことも困難となり、最悪ホストの環境を壊すことになりかねません。安易に試すことの無いよう(自己責任にて)願います。
今回利用したlxde関連のパッケージの中でもlxde-coreやlxsessionを導入すると依存関係でlxdmその他かなりのパッケージがインストールされてしまいます。

前回作成したイメージからコンテナ作成

$ docker container run --privileged -d -p 5901:5901 --name stretch_rpd -v /home/pi/build:/mnt stretch_lite-img /lib/systemd/systemd

コンテナに入ってX関連のインストール

$ docker container exec -it stretch_rpd /bin/bash
# apt install -y --no-install-recommends xserver-xorg xinit
# apt install -y openbox lxterminal fonts-ipafont fonts-ricty-diminished

ホストとの通信はVNC接続

# apt install -y tightvncserver autocutsel

vncserverを起動、初回はパスワードを求められます。

# vncserver :1 -geometry 800x600 -depth 24
You will require a password to access your desktops.
Password: 
Verify:   
Would you like to enter a view-only password (y/n)? n
xauth:  file /root/.Xauthority does not exist
New 'X' desktop is f2f559e59844:1
Creating default startup script /root/.vnc/xstartup
Starting applications specified in /root/.vnc/xstartup
Log file is /root/.vnc/f2f559e59844:1.log

一旦killします。

# vncserver -kill :1
Killing Xtightvnc process ID 2525

~/.vnc/xstartupの編集

#!/bin/sh
xrdb $HOME/.Xresources
xsetroot -solid grey
autocutsel -fork
cd
#lxpanel &
lxterminal &
openbox
#x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#x-window-manager &
# Fix to make GNOME work
export XKL_XMODMAP_DISABLE=1
/etc/X11/Xsession

コンテナ内から実行

# vncserver :1 -geometry 800x600 -depth 24

Hostのpi3にはtigervnc-viewerをインストールしました。

# apt install tigervnc-viewer

ホストPi3のターミナルから実行します。

$ vncviewer localhost :1 (or 127.0.0.1 :1)


tigervnc-viewerはtightvncviewerと間違えてインストールしたものです。(・・;)
問題なく使えているのでいいでしょう。
tightvncviewerはserverに同梱されているようです。


openbox右メニューはデフォルトです。
フォントはあまりきれいではないのでここのフォント設定を適用しておきます。

日本語入力その他ツール

# apt install -y fcitx-anthy dbus-x11
# apt install -y lxpanel pcmanfm leafpad lxappearance lxappearance-obconf dconf-editor gnome-icon-theme alacarte htop


~/.vnc/xstartupの#lxpanel &をコメントアウト(有効)にしてコンテナを再スタートします。

vncboot
vncserverの自動起動は下記のページを参考にさせていただきました。
Raspberry PiのVNCサーバーの自動起動の設定
/etc/init.d/vncboot スクリプトの以下の部分を変更しています。(その他画面サイズなど適宜変更)

USER=root
HOME=/root
export LANG='ja_JP.UTF-8' 追記
# cd /etc/init.d
# chmod 755 vncboot
# systemctl enable vncboot


lxappearance
フォントのサイズもlxappearanceから変更しますがGTK2とGTK3では同じポイント数でも大きさが違ってきてしまいます。GTK2系で大きさを決めたら/root/.config/gtk-3.0/settings.ini
gtk-font-name=Sans 10の値を変更することで合わせることができます。
値はdconfで保存されますがlxappearanceの何かを変更するとまた変わってしまいます。
ウインドータイトル関係はobconfから変更します。


fcitx-anthy
日本語入力はfcitx-anthyが使えます。mozcは動きませんでした。
設定には少々手こずるかもしれません。
設定入力メソッドからfcitxを選択します。コンテナをリスタート、システム設定のfcitxをクリックスタートで起動しないときは次の設定をします。


設定fcitx設定から+のボタンでanthyが現れます。OKでコンテナをリスタート
システム設定fcitxをクリックで通知エリアにアイコンが出現して使用可能になります。
自動起動はうまく設定できませんでした。


パネルアイテムの追加からアプリケーションランチャーを追加
アプリケーションランチャーからfcitxを登録します。
右隅に配置、1回押せば通常通り使用可能になります。


コンテナ内で動くX環境ができました。
autocutselでホスト〜コンテナでコピーは可能ですが2バイト文字は文字化けしてしまいます。
設定ツール以外のアプリケーションはlxterminal,pcmanfm,leafpad,alacarte,htopを入れています。
ここでcommitしておきます。
イメージサイズは約1GBになりました。

$ docker container commit stretch_rpd stretch_rpd-img
sha256:96b30dc7b241ab6e0568e2b4d9d1cae56fd2d9e8a66222361213be71b31bfde2
$ docker image ls | grep stretch_rpd
stretch_rpd-img latest 96b30dc7b241 About a minute ago 1.04GB/pre>


おまけの画像
dockerだからという訳ではないのですがswapがじわじわ増えていきます。極端に増えるわけではないのですがデフォルトの100MBは優に越していくので増やしておくのがいいと思います。

以前はXの設定というとX -configureのあとはtwmの画面と対面していたのですが最近は滅多に拝むことがなくなりました。
vnc接続と言ってもホスト〜コンテナ間の接続なので全くストレスは感じないですね。
いろいろ遊べそうです。

Top