投げ銭

★当サイトへの投げ銭(PayPal)★

LINK


(無償、寄付歓迎) logo
世界中で使われるISO標準オフィスソフト(MSオフィス互換)

★LibreOfficeの導入事例★
詳細について

人気の投稿(1ヶ月間)

Ad

Ad

投げ銭

★当サイトへの投げ銭(PayPal)★

2021年3月10日水曜日

【Linux CentOS7】DockerコンテナにMATEによるLinuxデスクトップ環境を構築する(日本語、複数ユーザー対応)【VNC SERVERによるヘッドレス運用】【No privileged】

最終更新 2022年10月11日

<概要>

◯特権なしでMATEデスクトップを運用

以前に、DockerコンテナでMATEデスクトップ環境を構築したことがあった。
VNC SERVERを用いてネットワーク越しに接続できるヘッドレスシステムである。
しかしそのときはコンテナを特権動作させる必要があった。

しかし、この記事で示すように「特権なし(privileged なし)」でそのような環境を構築している
この方法では特権が不要なので、システムの信頼性も高まると考えられる。


◯日本語表示のMATEデスクトップ環境

Dockerコンテナで使用するCentOS7イメージは、CentOS7 minimal isoで導入できるシステムとは異なっていて、日本ロケールのみ追加してもうまく日本語表示ができなかった。
(一部のみ日本語化され、右クリックメニューが英語になるという問題が生じていた。)

これはおそらくロケールに関するデータが不十分なために生じていたのだと思う。
後述するようなとても簡単な設定でCentOS7 minimal isoのようにロケールをフルで利用可能になった。
その上で、必要なデスクトップ環境構築のためにパッケージと、日本語表示のための設定を加えた。

これにより、はじめてMATEデスクトップが完全に日本語表示となった


◯Dockerコンテナでデスクトップ環境を運用することのメリット

Dockerコンテナを用いてデスクトップ環境を構築すれば、
構築直後のデスクトップをイメージ化しておけば、いつでもイメージから復元し元の状態に戻すことが可能になる。
万が一、不具合が生じたとしても迅速に簡単に復旧が可能になる。

また、イメージを用いれば同じデスクトップ環境を複製することも可能になる。
これに対応する方法はいくつか考えられる。ただしこの記事では扱っていない。

「Dockerの仮想ネットワークで対応する」
これによりコンテナ毎にIPアドレスを割り当てられるようになり、同一イメージからコンテナを起動してもリモートアクセストランスポートが各コンテナで重ならなくなる。

「コンテナの起動前にVNC SERVER起動スクリプトを与える」
あるいは、VNC SERVERを起動するコマンドが記載されたスクリプト(この記事に登場する)を、コンテナの起動前に外部からコピーして与えておくようにする。
このスクリプトには、VNC SERVERのコマンドとリモートアクセスのトランスポート番号に対応するディスプレイの番号が記載されている。
コンテナごとに異なる内容のスクリプトをコピーして与えれば、同じイメージから起動するコンテナでも、VNC SERVERが使うトランスポート番号を重ねずに済むようにできる。

イメージから簡単にデスクトップ環境を開始し、また復元できるという特徴からDockerによるデスクトップ環境の構築は、シンクライアントの構築にうってつけなのではないかと思う。



■Dockerホストのセットアップ

(注意)
「このデスクトップコンテナを動作させるDockerホストの要件について」

必ず、このDockerホストは安全なLAN内で動作させるようにすること。
さもなければ外部から不正アクセスを許してしまうことになる。
(独自のDocker仮想ネットワークを構築するなど適切なポリシーで工夫を行うならこの限りではない。この記事では扱っていない。)

後述するrunコマンドが示すように、Dockerホスト上のトランスポートを開いている。
これが意味するのは、Dockerシステムが自動的に当該トランスポートについてファイアーウォールをオープンするということである。

したがって、Dockerホストマシンがインターネットにダイレクトに接している場合には、外部にデスクトップ環境を晒すことになり非常に非常に危険である。


◯Dockerは次のページの方法で導入した。



◯Dockerホストの情報(CentOS 7 / Docker-ce stable 20.10.5)

[root@localhost ~]# uname -r
3.10.0-1160.15.2.el7.x86_64



■LinuxデスクトップMATEコンテナのセットアップ

1、システムの更新

◯まず、CentOS公式のCentOS7初期イメージを使って次のコマンドでコンテナを動作させた。

docker run -d -i -t --init --name centos7-mate-ja-setup centos:centos7 /bin/bash
Unable to find image 'centos:centos7' locally
centos7: Pulling from library/centos
2d473b07cdd5: Pull complete 
Digest: sha256:0f4ec88e21daf75124b8a9e5ca03c37a5e937e0e108a255d890492430789b60e
Status: Downloaded newer image for centos:centos7
(説明)
-d フラグ
コンテナをバックグラウンドで動作させる。コンテナのルートプロセスが終了するとコンテナは終了する。

-t フラグ
疑似端末で動作させる。

--init フラグ
コンテナ内でPID 1として動作させるルートプロセスを指定することで、コンテナ終了時にゾンビプロセスの完全な解消が可能になる。引数なしでdocker-initというプロセスが動作する。

・ -i フラグ
ここでは指定しているが、使用しなくても動作した。
バックグラウンドで動作すればよいのでインタラクティブである必要はないため。


◯バックグラウンドで動作中のコンテナに接続した。

docker exec -it centos7-mate-ja-setup /bin/bash
[root@e8394b6f7b13 /]#


◯ロケールをフルで利用できるようにする。(大切な手順)

この段階では日本語ロケールは認識できなかった。

[root@e8394b6f7b13 /]# locale -a | grep ja


次の通り、ファイルを編集して下記のようにコメントアウトした。
(後で述べているが、これによって日本をはじめ多量のロケールが導入可能になる。)
[root@e8394b6f7b13 /]# vi /etc/yum.conf
#override_install_langs=en_US.utf8

上記ファイル編集後に、次のコマンドでシステム更新を行った。
(D-Bus関係エラーが一つ生じたが結果的にMATEデスクトップ環境は動作した。)

[root@e8394b6f7b13 /]# yum update
Updating   : systemd-219-78.el7_9.3.x86_64                                                                                                                       16/48 
Failed to get D-Bus connection: Operation not permitted

Updated:
  bind-license.noarch 32:9.11.4-26.P2.el7_9.4 centos-release.x86_64 0:7-9.2009.1.el7.centos  coreutils.x86_64 0:8.22-24.el7_9.2   curl.x86_64 0:7.29.0-59.el7_9.1      
  device-mapper.x86_64 7:1.02.170-6.el7_9.3   device-mapper-libs.x86_64 7:1.02.170-6.el7_9.3 glib2.x86_64 0:2.56.1-8.el7          glibc.x86_64 0:2.17-323.el7_9        
  glibc-common.x86_64 0:2.17-323.el7_9        kpartx.x86_64 0:0.4.9-134.el7_9                libblkid.x86_64 0:2.23.2-65.el7_9.1  libcurl.x86_64 0:7.29.0-59.el7_9.1   
  libmount.x86_64 0:2.23.2-65.el7_9.1         libsmartcols.x86_64 0:2.23.2-65.el7_9.1        libuuid.x86_64 0:2.23.2-65.el7_9.1   openssl-libs.x86_64 1:1.0.2k-21.el7_9
  python.x86_64 0:2.7.5-90.el7                python-libs.x86_64 0:2.7.5-90.el7              systemd.x86_64 0:219-78.el7_9.3      systemd-libs.x86_64 0:219-78.el7_9.3 
  tzdata.noarch 0:2021a-1.el7                 util-linux.x86_64 0:2.23.2-65.el7_9.1          vim-minimal.x86_64 2:7.4.629-8.el7_9 zlib.x86_64 0:1.2.7-19.el7_9         

Complete!
上記のように、glibc-common が更新されたことを確認した。
これによってファイル編集と連動して多量のロケールが導入されると考えられる。

もしも、glibc-common の更新がなければ、yum reinstall glibc-common を行うと良いと考えられる。(検証していない。)


アップデート後、導入済みロケールについて確認した。

[root@e8394b6f7b13 /]# locale -a | grep ja
ja_JP
ja_JP.eucjp
ja_JP.ujis
ja_JP.utf8
japanese
japanese.euc
[root@e8394b6f7b13 /]# locale -a | wc -l
791
この結果が示すように日本語ロケールだけでなく、他に多量のロケールが導入されたことがわかる
これにより、CentOS7 minimal isoを通常のマシンに導入した場合と同じになったのではないかと思う
おそらくこの状態ではじめてMATEデスクトップの完全な日本語化に成功すると考えられる
上記日本語ロケールだけの導入ではMATEデスクトップの日本語化は不完全だった。
(その場合には一部のみが日本語化されるにとどまる。)


ついでに、コンテナでタイムゾーンも合わせておく。

# ln -sf  /usr/share/zoneinfo/Asia/Tokyo /etc/localtime


◯コンテナの再起動を行った

コンテナから出た。

[root@e8394b6f7b13 /]# exit


Dockerホスト上で、Dockerコマンドによりコンテナをストップし、再びスタートした。

[root@localhost ~]# docker stop centos7-mate-ja-setup
centos7-mate-ja-setup
[root@localhost ~]# docker start centos7-mate-ja-setup
centos7-mate-ja-setup

再びコンテナに接続した。

[root@localhost ~]# docker exec -it centos7-mate-ja-setup /bin/bash
[root@e8394b6f7b13 /]#


2、デスクトップ環境構築のためのインストールを行った。

◯X Window systemのインストールを行った。

(コマンド実行中に生じたエラー情報についてのみ載せた。最終的にMATEデスクトップの利用には今の所支障はない。)

[root@e8394b6f7b13 /]# yum groupinstall "X Window system"
Install  11 Packages (+349 Dependent packages)

Total download size: 339 M
Installed size: 1.1 G


  Installing : nettle-2.7.1-8.el7.x86_64          38/360
install-info: No such file or directory for /usr/share/info/nettle.info

  Installing : 7:device-mapper-event-1.02.170-6.el7_9.3.x86_64          50/360 
Failed to get D-Bus connection: Operation not permitted
warning: %post(device-mapper-event-7:1.02.170-6.el7_9.3.x86_64) scriptlet failed, exit status 1
Non-fatal POSTIN scriptlet failure in rpm package 7:device-mapper-event-1.02.170-6.el7_9.3.x86_64

  Installing : oddjob-0.31.5-4.el7.x86_64          113/360 
dbus-daemon: no process found

  Installing : oddjob-mkhomedir-0.31.5-4.el7.x86_64          114/360 
dbus-daemon: no process found

  Installing : 7:lvm2-2.02.187-6.el7_9.3.x86_64          124/360 
Failed to get D-Bus connection: Operation not permitted
Failed to get D-Bus connection: Operation not permitted
Failed to get D-Bus connection: Operation not permitted
warning: %post(lvm2-7:2.02.187-6.el7_9.3.x86_64) scriptlet failed, exit status 1
Non-fatal POSTIN scriptlet failure in rpm package 7:lvm2-2.02.187-6.el7_9.3.x86_64

  Installing : chrony-3.4-1.el7.x86_64          266/360 
Failed to get D-Bus connection: Operation not permitted

No '/dev/log' or 'logger' included for syslog logging
findmnt: can't read (null): No such file or directory
findmnt: can't read (null): No such file or directory


Complete!

◯MATE Desktopのための一連のパッケージの導入を行った。

まず、必要なパッケージリポジトリの追加を行った。

[root@9706b98eb163 /]# yum install epel-release
Installed:
epel-release.noarch 0:7-11
Complete!

つづいて、MATE Desktopのインストールを行った。

(コマンド実行中に生じたエラー情報についてのみ載せた。最終的にMATEデスクトップの利用には今の所支障はない。)

[root@e8394b6f7b13 /]# yum groupinstall "MATE Desktop"
Install  138 Packages (+360 Dependent packages)

Total download size: 484 M
Installed size: 1.5 G

  Installing : which-2.20-7.el7.x86_64          36/498 
install-info: No such file or directory for /usr/share/info/which.info.gz

  Installing : recode-3.6-38.el7.x86_64         174/498 
install-info: No such file or directory for /usr/share/info/recode.info.gz

  Installing : libchewing-0.3.4-6.el7.x86_64          191/498 
install-info: No such file or directory for /usr/share/info/libchewing.info


Complete!

◯VNC SERVERの導入を行った。

これによりヘッドレス(モニタがなし)で、ネットワーク越しにリモート接続できるようになる。

[root@e8394b6f7b13 /]# yum install tigervnc-server
Installed:
  tigervnc-server.x86_64 0:1.8.0-22.el7

Complete!

◯日本語入力のためのパッケージを導入した。(オプション)

デフォルトでも入力システムが存在する。
MOZCを利用したい場合のみインストールを行う。

また、日本語入力を行うには、MATEデスクトップ環境が整ってアクセス利用できるようになった後に最終設定が必要である。

[root@356cab84b434 /]# yum install ibus-mozc
Installed:
  ibus-mozc.x86_64 0:2.17.2322.102-1.el7

Dependency Installed:
  libmng.x86_64 0:1.0.10-14.el7                    mozc.x86_64 0:2.17.2322.102-1.el7            pciutils.x86_64 0:3.5.1-3.el7                                          
  pciutils-libs.x86_64 0:3.5.1-3.el7               protobuf.x86_64 0:2.5.0-8.el7                qt.x86_64 1:4.8.7-9.el7_9                                              
  qt-settings.noarch 0:19-23.12.el7.centos         qt-x11.x86_64 1:4.8.7-9.el7_9                xemacs-filesystem.noarch 0:21.5.34-8.20140605hgacf1c26e3019.el7        
  zinnia.x86_64 0:0.06-22.el7                      zinnia-tomoe-ja.x86_64 0:0.06-22.el7        

Complete!



3、ユーザーのデスクトップセッションを始動するための設定を行った。

以下では1ユーザーの設定を行っている。
複数人のために複数セッションが必要な場合はここで作成した1ユーザーの設定をコピーするとよい。(後述)


◯Linuxユーザーを作成し、パスワードを設定した。
名称などは任意だがつづく設定でも同じユーザー名を当てはめる必要がある。

[root@e8394b6f7b13 /]# useradd user01
[root@e8394b6f7b13 /]# passwd user01
Changing password for user user01.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.

◯VNCユーザー(デスクトップ利用者)としての設定を行った。
(上記のように設定済みのLinuxユーザーである必要がある。)

当該ユーザーに切り替えた。

[root@e8394b6f7b13 /]# su user01


VNCデスクトップセッションにアクセスするためのパスワードを設定した。

[user01@e8394b6f7b13 /]$ vncpasswd 
Password:
Verify:
Would you like to enter a view-only password (y/n)? n
A view-only password is not used

いったんVNC SERVERを起動することで、設定ファイルの生成を行わせた。
(ユーザーのデスクトップ番号を2番で作成した。これは後にTCPポート番号で利用される。)

[user01@e8394b6f7b13 /]$ vncserver :2
xauth:  file /home/user01/.Xauthority does not exist

New 'e8394b6f7b13:2 (user01)' desktop is e8394b6f7b13:2

Creating default startup script /home/user01/.vnc/xstartup
Creating default config /home/user01/.vnc/config
Starting applications specified in /home/user01/.vnc/xstartup
Log file is /home/user01/.vnc/e8394b6f7b13:2.log

上記のようにxstartupファイルの生成を確認できたので、次のコマンドでVNC SERVERを停止した。

[user01@e8394b6f7b13 /]$ vncserver -kill :2
Killing Xvnc process ID 12978

生成されたxstartupファイルのバックアップを行った。

[user01@e8394b6f7b13 /]$ cp /home/user01/.vnc/xstartup /home/user01/.vnc/xstartup.org


日本語表示のMATEデスクトップを起動できるようにxstartupファイルの修正を行った。

修正した箇所は色付きの4行である。他はデフォルトのままである。
青文字はコメントアウトを行い、色マーカー部分は追加した部分である。

緑マーカー…ロケール(日本語表示など)に関する設定
橙マーカー…漢字入力に関する設定
青マーカー…MATEデスクトップ環境に関する設定

また、必ず下記の順番になるようにすることが大切である。

[user01@e8394b6f7b13 /]$ vi /home/user01/.vnc/xstartup
#!/bin/sh

unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS

export LANG=ja_JP.UTF-8

export GTK_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
export QT_IM_MODULE=ibus

# exec ibus-daemon -drx &

exec mate-session &
#/etc/X11/xinit/xinitrc

# Assume either Gnome or KDE will be started by default when installed
# We want to kill the session automatically in this case when user logs out. In case you modify
# /etc/X11/xinit/Xclients or ~/.Xclients yourself to achieve a different result, then you should
# be responsible to modify below code to avoid that your session will be automatically killed
if [ -e /usr/bin/gnome-session -o -e /usr/bin/startkde ]; then
    vncserver -kill $DISPLAY
fi


英語表記に戻したい場合は、export LANG=en_US.utf8 にすればよいだろう。


※ 上で「exec ibus-daemon -drx」をコメントアウトしている。この理由は次に示す不具合が生じたからだ。
 後で、複数ユーザーに対応するためにVNCセッションを複数動作させることをしているが、その一部のユーザーセッションにおいて、メモ帳アプリやThunderbirdでは日本語入力できるものの、Firefoxだけで日本語入力ができない現象が生じた。(ただし、その場合、そのユーザーのデスクトップでターミナルを開いて、xstartupに記述した「exec ibus-daemon -drx」を実行すれば解消したが、不便なので次のように代替方法を用いる。)
 そこで、代わりに、MATEデスクトップのユーザーセッションのプログラムスタートアップ機能を用いて、「ibus-daemon -drx」を起動することにした。この後、MATEデスクトップが起動してから、ユーザーごとに設定する。そのため、上のスクリプトでは、関連する環境変数だけを登録しておく


 つぎのようにファイルを作成して、MATEスタートアップにibus-daemonを登録する。

[user01@e8394b6f7b13 /]$ vi /home/user01/.config/autostart/ibus-daemon.desktop 
[Desktop Entry]
Type=Application
Exec=/usr/bin/ibus-daemon -drx
Hidden=false
X-MATE-Autostart-enabled=true
Name[ja_JP]=Start ibus daemon
Name=Start ibus daemon
Comment[ja_JP]=AKIRA
Comment=AKIRA
 (MATEデスクトップが起動してから、mate-session-propertiesコマンドで開くウインドウからも登録できる。)



このユーザーについての基本設定は完了した。

rootユーザーに戻った。
[user01@e8394b6f7b13 /]$ exit
exit
[root@e8394b6f7b13 /]#



4、CUPSの導入(プリンタシステムが必要な場合)


MATEデスクトップコンテナでも印刷システムが使えるようにcupsを導入した。
ただし、実際にプリンタに接続するための設定も別に必要になる。

コンテナはできるだけ他の設定を入れたくないので、私の場合は次のページのようにプリンターサーバーを構築した。
プリンターサーバーにブリンタ依存の個別ドライバを入れて個別のプリンタとのやり取りを任せる。

デスクトップ側からはプリントアウト内容はPostScriptという記述のままプリンタサーバーに送信するための仮想プリンタのみインストールすることができる。
詳しくは下記ページをご参照ください。


とりあえず、MATEデスクトップコンテナには印刷システムのCUPSのみインストールした。

[root@e8394b6f7b13 /]# yum install cups
Complete!


5、コンテナ起動時に必要なシステムが自動起動するためのスクリプトを作成した。

作成するスクリプトは、cupsdを起動するコマンドと、
VNC SERVERによるユーザー毎のデスクトップセッションを起動するためのコマンドで成り立っている。

まず、スクリプトの格納場所を作成した。(rootディレクトリにまとめることにした。)

[root@e8394b6f7b13 /]# mkdir -p /root/Script/


スクリプトは次のように作成した。

[root@e8394b6f7b13 /]# vi /root/Script/runserver.sh
#!/bin/bash

/usr/sbin/cupsd &

/usr/bin/rm /tmp/* -rf
/usr/bin/rm /tmp/.* -rf

/usr/bin/rm -f /tmp/.X2-lock
/usr/bin/su -c "/usr/bin/vncserver -kill :2" user01
/usr/bin/su -c "/usr/bin/vncserver :2" user01

/bin/bash

(説明)
/usr/sbin/cupsd &
cupsdサービスを起動している。(上記手順でインストールした場合)

/usr/bin/rm /tmp/* -rf
/usr/bin/rm /tmp/.* -rf
/tmpディレクトリの中身を全て削除し初期化を行っている。これは「ICEの監視ソケットを生成できませんでした。Cannot establish any listening Sockets」というエラーが発生する場合があるのを避けるためである。

rm -f /tmp/.X2-lock
コンテナの終了のタイミングで次のようなエラーが生じてデスクトップセッションを開始できない場合を避けるためのものである。下記はエラーの例である。(user11が、vncserver :11 でセッションを開始したときのエラー)
[user11@6097c5fce671 /]$ vncserver :11

Warning: 6097c5fce671:11 is taken because of /tmp/.X11-lock
Remove this file if there is no X server 6097c5fce671:11
A VNC server is already running as :11

suコマンドの引数に実行コマンドを渡して、指定ユーザー権限でvncserverが起動するようにしている。

最後の /bin/bash は、このスクリプトをコンテナの起動スクリプトするときに、スクリプト実行完了でコンテナが終了してしまわないようにするためのものである。 


つづいて、作成したスクリプトに実行権限を与えた。

[root@e8394b6f7b13 /]# chmod +x /root/Script/runserver.sh


以上で、「LinuxデスクトップMATEコンテナのセットアップ」は完了した。
つづいて、コンテナのイメージ化を行う。

どうしてもイメージに加えておきたい基本的な設定があればこの段階までで行うと良い。
しかし、一応ここまでで基本的な設定段階としてイメージ化しておくと良いのではないかと思う。



■作成したデスクトップ環境の基本コンテナのイメージ化と動作テストを行った。


コンテナから離脱し、Dockerホストに戻った。
[root@e8394b6f7b13 /]# exit
exit

◯コンテナのイメージ化を行った。

Dockerホストにおいて、コンテナを停止させた。

[root@localhost ~]# docker stop centos7-mate-ja-setup
centos7-mate-ja-setup

コンテナのイメージ化を行った。

[root@localhost ~]# docker commit centos7-mate-ja-setup image-centos7-ja-mate-user01_20210309

作成したイメージは次のコマンドで確認できた。

[root@localhost ~]# docker image list


◯作成したイメージを用いて、新しいコンテナを起動した。

(注意)
必ず、このDockerホストは安全なLAN内で動作させるようにすること。
さもなければ外部から不正アクセスを許してしまうことになる!
(独自のDocker仮想ネットワークを構築するなど適切なポリシーで工夫を行うならこの限りではない。この記事では扱っていない。)

下記コマンドが示すように、Dockerホスト上のトランスポートを開いている。
これが意味するのは、Dockerシステムが自動的に当該トランスポートについてファイアーウォールをオープンするということである。
したがって、Dockerホストマシンがインターネットにダイレクトに接している場合には、外部にデスクトップ環境を晒すことになり非常に非常に危険である。

これまでの手順で、複数ユーザーのデスクトップセッションを設定した場合は、
下記コマンドの、-p 5952:5902 だけでなく、さらに存在するディスプレイの番号からリモートアクセス用トランスポート番号を開放する必要がある。オプションを並列させて指定する。

[root@localhost ~]# docker run -d -i -t --shm-size=256m --init -p 5952:5902 --name centos7-ja-mate-user01 image-centos7-ja-mate-user01_20210309 /root/Script/runserver.sh

(説明)
・image-centos7-ja-mate-user01_20210309
作成したイメージ

・/root/Script/runserver.sh
コンテナ内で作成済みの自動起動用のスクリプト

・--shm-size=256m
一時ファイルのための領域を設定する。
この設定がなければ、ブラウザの動画再生がうまくできずフリーズした。

・-p 5952:5902
指定された番号についてホストのトランスポートを開き、それを指定した番号のコンテナのトランスポートに結びつける。
この例では、5952がホスト側で、5902がコンテナ側になる。

ポートをオープンできない場合は、Dockerの標準ネットワークでなく、独自に構築した仮想ネットワークを設定するなど工夫が必要がある。ここでは扱わない。
また、インターネット越しにリモートアクセスさせたい場合には、そのように独自に仮想ネットワークを構築した上で、IPsecなどの安全な方法でアクセスさせるべきである。



◯コンテナの動作後、クライアントマシンにおいてVNC Viewerからアクセスした。

IPアドレスとトランスポート5952はDockerホストのものである。
runコマンドで指定したとおり、5952はコンテナの5902ポートに転送される。
5902ポートはディスプレイ番号2番に対応している。


パスワードの入力を求められると、vncpasswdで設定したものを入力した。

すると、次のように日本語表示になったMATEデスクトップ環境にアクセスできた。

日本語入力を行うには、MATEデスクトップ環境において最終設定が必要です。
特に、VNC経由の場合には切り替え日本語 / 英語スイッチの変更キーの変更が必要です。
設定方法は次のページを参照してください。







◯デスクトップ環境の再起動方法

次のように、Dockerコンテナをストップしてからスタートするだけで良かった。
編集中のファイルなど保存されていないデータは消滅するのは、通常のデスクトップ環境と同じ。

Dockerホストにおいて次のように対象コンテナをストップしてからスタートした。

[root@localhost ~]# docker stop centos7-ja-mate-user01
[root@localhost ~]# docker start centos7-ja-mate-user01

そして、再びクライアントマシンにおいてVNC Viewerからアクセスすれば繋がった。



■MATEデスクトップのそのほかの設定について

・ログアウトなどの禁止の設定を行う方法

・SAMBAファイルサーバーへの接続方法

・LibreOfficeのインストール

・Google Chromeのインストール

Chromeは、上のページを参考にしてインストールを行った。
ただし、この後で示すように、--no-sandbox オプションを付けなければ起動できなかった。
(セキュリティー上問題があるためこのようにすべきでない。)

また、特定のサイトを開くとタブがクラッシュして開けなかった。
Chrome(104.0.5112.101 2022年8月24日現在のもの)で、楽天のページ「https://www.rakuten.co.jp/」を開こうとすると、「このウェブページの表示中に問題が発生しました。」と表示され、タブがクラッシュした。リロードしても、シークレットタブでも、キャッシュを削除しても改善しなかった。
しかし、その他の有名なサイト、例えば「yahoo.co.jp」、「amazon.co.jp」などは正常に開くことができた。

同様に、--no-sandboxオプション付きで起動したEdge(Linux版rpm:104.0.1293.63 2022年8月24日現在のもの)でも、この楽天サイトでタブがクラッシュした。「このページには問題があります」と表示された。

一方で、Firefox(91.11.0esr 2022年8月24日現在yumで導入できたもの)では、この楽天サイトは正常に表示された。


$ google-chrome-stable --no-sandbox

ランチャーメニューに登録されているchrome起動コマンドも編集した。

次のコマンドを実行して、メニュー編集ウインドウを開く。
$ mozo 

次の写真のように、インターネットメニューのアイテムの欄からGoogle Chromeを選び、プロパティーボタンを押した。

開くランチャのプロパティウインドウ内のコマンドのテキストボックスには最初は次のコマンドが設定されていた。
/usr/bin/google-chrome-stable %U
この起動コマンドに、次のように --no-sandbox オプションを追加した。
/usr/bin/google-chrome-stable %U --no-sandbox


◯ FirefoxでYoutubeの「LIVE」が再生できない問題への対処方法

Firefoxで、次のページを開いた。
https://www.jeffersonscher.com/sumo/html5-video.html

すると、次のように、
「MP4/H.264 avc1.42001E, mp4a.40.2 can't be played」
「MSE & H.264 video/mp4; codecs="avc1.4d401e" not supported」と表示された。


 次のようにして、パッケージを導入した。

# yum localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm
# yum install epel-release
# yum install ffmpeg ffmpeg-devel
Installed:
  ffmpeg.x86_64 0:3.4.11-1.el7                                                     ffmpeg-devel.x86_64 0:3.4.11-1.el7                                                    

Dependency Installed:
  SDL2.x86_64 0:2.0.14-2.el7                    ffmpeg-libs.x86_64 0:3.4.11-1.el7                             jack-audio-connection-kit.x86_64 0:1.9.9.5-6.el7           
  lame-libs.x86_64 0:3.100-1.el7                libass.x86_64 0:0.13.4-6.el7                                  libavdevice.x86_64 0:3.4.11-1.el7                          
  libffado.x86_64 0:2.1.0-4.el7                 libmfx.x86_64 0:1.21-2.el7                                    libmodplug.x86_64 1:0.8.9.0-9.el7                          
  libva.x86_64 0:1.8.3-1.el7                    libvdpau.x86_64 0:1.1.1-3.el7                                 libxml++.x86_64 0:2.37.1-1.el7                             
  numactl-libs.x86_64 0:2.0.12-5.el7            ocl-icd.x86_64 0:2.2.12-1.el7                                 openal-soft.x86_64 0:1.16.0-3.el7                          
  opencore-amr.x86_64 0:0.1.5-6.el7             soxr.x86_64 0:0.1.2-1.el7                                     vid.stab.x86_64 0:1.1-4.20170830gitafc8ea9.el7             
  vo-amrwbenc.x86_64 0:0.1.3-1.el7              x264-libs.x86_64 0:0.148-24.20170521gitaaa9aa8.el7            x265-libs.x86_64 0:2.9-3.el7                               
  xvidcore.x86_64 0:1.3.4-2.el7                 zvbi.x86_64 0:0.2.35-1.el7                                   

Complete!

 すると、先程のWEBページで確認すると、コーデックが有効になったことが確認できた。
Youtubeの「LIVE」も再生されるようになった。





■複数ユーザーセッションの作成手順

以下では、追加であと2ユーザー分のデスクトップ環境を作成している。
ただしDockerホストのメモリーなどのリソースが十分でなければならない。

以上で1ユーザー(user01)についてのデスクトップ環境の設定が済んだする。
もし複数ユーザーセッションを構築したい場合は、このユーザー(user01)の設定をコピーすれば良い。

以下の手順は上記からの流れでMATEデスクトップコンテナが動作していることを想定している。

◯コンテナに接続

Dockerホストにおいて次のコマンドで対象コンテナに接続した。

[root@localhost ~]# docker exec -it  centos7-ja-mate-user01 /bin/bash
[root@51d854032c59 /]#


◯動作中の場合、user01デスクトップセッションを終了させた

[root@51d854032c59 /]# su user01
[user01@51d854032c59 /]$ vncserver -kill :2
Killing Xvnc process ID 24
[user01@51d854032c59 /]$ exit
exit
[root@51d854032c59 /]#



◯追加ユーザーの作成

試しに追加で2ユーザー分のデスクトップセッションを作成するものとする。
user名は任意である。ここでは、user14と、user15ということにしている。

(追加分1)
[root@51d854032c59 /]# useradd user14
[root@51d854032c59 /]# passwd user14
Changing password for user user14.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.
(追加分2)
[root@51d854032c59 /]# useradd user15
[root@51d854032c59 /]# passwd user15
Changing password for user user15.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.

◯設定情報のコピー

user01は上記の手順で既にデスクトップ環境の設定済みである。
このuser01の設定情報を、追加ユーザーの設定情報として流用する。
コピーするだけである。

user14とuser15をuseraddコマンドで作成した段階では、
/home/user14と、/home/user15ディレクトリ内は空だった。
空でない場合、下記のrsyncコマンドにオプションで、--deleteをつけるとそれらをクリアできる。
データが削除されるので注意すること。

また、下記のrsyncコマンドは、スラッシュの有無で挙動が変わるので注意すること。


(追加分1)
既に設定済みのuser01の設定情報をuser14のものとしてコピーし、
ディレクトリ内コンテンツの所有者とグループをuser14に変更した。

[root@51d854032c59 /]# rsync -av /home/user01/ /home/user14/
[root@51d854032c59 /]# chown user14:user14 /home/user14/ -R

(追加分2)
[root@51d854032c59 /]# rsync -av /home/user01/ /home/user15/
[root@51d854032c59 /]# chown user15:user15 /home/user15/ -R


たくさんのユーザーを追加する場合、たとえば次のようにすることもできる。
# for i in 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ; do USERNO=$i ; chown user$i:user$i /home/user$i/ -R ; done


◯サーバー起動スクリプトの編集

既に上記の手順で作成済みのスクリプトの編集を行った。

下記のマーカー部分に注意して、追加ユーザー分について編集する。(アンダーラインのところ)
ディスプレイ番号が重ならないようにすること。

[root@51d854032c59 /]# vi /root/Script/runserver.sh
#!/bin/bash
 
/usr/sbin/cupsd &

/usr/bin/rm /tmp/* -rf
/usr/bin/rm /tmp/.* -rf
 
/usr/bin/rm -f /tmp/.X2-lock
/usr/bin/su -c "/usr/bin/vncserver -kill :2" user01
/usr/bin/su -c "/usr/bin/vncserver :2" user01

/usr/bin/rm -f /tmp/.X14-lock
/usr/bin/su -c "/usr/bin/vncserver -kill :14" user14
/usr/bin/su -c "/usr/bin/vncserver :14" user14

/usr/bin/read -t 10 -p "Starting VNC SERVER ..., waiting for 10 second"

/usr/bin/rm -f /tmp/.X15-lock
/usr/bin/su -c "/usr/bin/vncserver -kill :15" user15
/usr/bin/su -c "/usr/bin/vncserver :15" user15


/bin/bash

ディスプレイ番号(14や15 )は、トランスポート番号の決定で利用される。
14番ならば、5900+14で、5914 がトランスポートポート番号になる。
このトランスポート番号が他のサービスとバッティングしないようにしなければいけない。

/usr/bin/read -t 10 -p "Starting VNC SERVER ..., waiting for 10 second"
次のセッションをスタートさせるまでに待機時間を念の為に設けている。これは、日本語入力がうまくできなかったり、デスクトップ環境が正しく起動しなくなったりする問題を避けるために行っている。

ところで、さらに複数のユーザーがある場合は、各ユーザーごとのセッション作成コマンドを記述するのは大変なので、
次のループを組み込んでおくと便利である。
下記の方法でうまく10ユーザー(11から20)のデスクトップセッションを作成できた。

for NUM in 11 12 13 14 15 16 17 18 19 20
        do
                /usr/bin/rm -f /tmp/.X$NUM-lock
                /usr/bin/su -c "/usr/bin/vncserver -kill :$NUM" user$NUM
                /usr/bin/su -c "/usr/bin/vncserver :$NUM" user$NUM
                /usr/bin/read -t 10 -p "Starting VNC SERVER ..., waiting for 10 second"
        done


◯追加ユーザーセッションの動作テスト

上記設定を有効化するにはこのコンテナの再起動を行うだけである。

しかし、複数ユーザー分のネットワークポートを通す必要があるので、
一旦イメージ化してからdocker runコマンドでコンテナを起動する。


・コンテナの停止

デスクトップ上などの未保存ファイルは消えるので予め保存しておくこと。

[root@localhost ~]# docker stop centos7-ja-mate-user01
centos7-ja-mate-user01


・コンテナのイメージ化を行った。

新しいイメージを作成している。

[root@localhost ~]# docker commit centos7-mate-ja-setup image-centos7-ja-mate-3user_20210329


・コンテナを作成したイメージから起動した。

追加ユーザー分のネットワークポート設定も行っている。

[root@localhost ~]# docker run -d -i -t --shm-size=256m --init -p 5952:5902 -p 5964:5914 -p 5965:5915 --name centos7-ja-mate-3user image-centos7-ja-mate-3user_20210329 /root/Script/runserver.sh

ユーザー名「Dockerホスト上のポート:コンテナに転送先ポート」(:ディスプレイ番号)
user01 「5952:5902」 (:2)
user14 「5964:5914」 (:14)
user15 「5965:5915」 (:15)

そして、同様にしてVnc Viewerで接続する。(ディスプレイ番号は異なる。)

デスクトップ環境が起動するまでに少し時間がかかった。
早く接続しようとするとつながらなかった。


これで複数ユーザーのデスクトップ環境の管理がとても楽になる。

ところで、もし、Docker標準のネットワークでなく、独自Dockerネットワークを構築しているなら、
docker runコマンドでのポート転送設定も不要となる。
そのため上記のようにユーザーセッションを追加の度にわざわざイメージ化とコンテナ再作成は不要となる。
コンテナの再起動のみですぐに追加したデスクトップセッションが利用できるようになる。
ここでは扱っていない。


以上


<参考>
◯CentOS7
・CentOS 7 コンテナに消えない日本語ロケールを追加する
< https://qiita.com/teruo-oshida/items/08cb84efc2b581b0a439 > 2021年3月6日

・Docker コンテナの時刻同期(時刻データ)について
< https://qiita.com/hirotaka-tajiri/items/f5900b236a005d7ffe58 > 2021年4月2日


◯Docker
・Docker上のpuppeteerがPage crashしてしまうときはshmサイズを疑う
< https://qiita.com/windyakin/items/00b085902547570eebc6 > 2021年2月25日

・Docker run reference
< https://docs.docker.com/engine/reference/run/ > 2021年3月9日

・Docs » Engine リファレンス » Docker run リファレンス
< https://docs.docker.jp/engine/reference/run.html > 2021年3月9日

・Dockerの資源管理について(CPU、メモリ)
< https://www.nedia.ne.jp/blog/tech/network/2020/06/09/16500 > 2021年4月2日

・What are pseudo terminals (pty/tty)?
< https://unix.stackexchange.com/questions/21147/what-are-pseudo-terminals-pty-tty > 2021年3月9日


◯Linux端末
・Linux 端末の歴史と違い
< https://teratail.com/questions/76154 > 2021年3月9日


◯MATEデスクトップ環境構築
・【Linux CentOS 7】Dockerコンテナ(CentOS7)にデスクトップ環境(MATE)を構築してVNCでリモート接続できるようにした【Docker-ce 18.06.1.ce】
< http://akira-arets.blogspot.com/2018/08/docker-mate-desktop-vncserver.html > 2021年3月6日

・CentOS7でMATEを使う
< https://blue-red.ddo.jp/~ao/wiki/wiki.cgi?page=CentOS7%A4%C7MATE%A4%F2%BB%C8%A4%A6 > 2022年8月24日

・impish (1) mate-session.1.gz
< https://manpages.ubuntu.com/manpages/impish/man1/mate-session.1.html > 2022年8月24日

・MATE
< https://wiki.archlinux.jp/index.php/MATE > 2022年8月24日



◯Firefoxのコーデック
・CentOS 8 Workstation Firefox does not play live Youtube streams
< https://forums.centos.org/viewtopic.php?t=74107 > 2022年8月10日

・Can't play Live Stream Videos on Firefox
< https://support.mozilla.org/en-US/questions/1322086 > 2022年8月10日

・How to Install and Use FFmpeg on CentOS 7
< https://linuxize.com/post/how-to-install-ffmpeg-on-centos-7/ > 2022年8月10日


投げ銭

★当サイトへの投げ銭(PayPal)★

Ad

Ad