LXD で作る仮想化 GUI 環境


# 概要

下記の記事を参考にして、LXDを使用したGUI隔離環境の実践例と応用の手法を記載します。

https://gihyo.jp/admin/serial/01/ubuntu-recipe/0627

基本的に色々なところから持ってきた手順を切った貼ったした感じのドキュメントになります。

自分用のドキュメントをなんとか他人にも見せられる形にした状態なので、
今後、修正と整理を行います。

# 変更履歴

* 2022/03/12 公開

# 検証環境

* OS: Ubuntu 20.04 LTS AMD64

22.04 LTS でも動作させられるように、
別途環境の近い 21.10 環境でも検証中です。


# LXDをインストールする。

```LXDのインストール
ubuntu@host:~$ sudo snap install lxd 
ubuntu@host:~$ sudo apt install btrfs-progs       # snap版の場合は不要
ubuntu@host:~$ sudo lxd init
Would you like to use LXD clustering? (yes/no) [default=no]: 
Do you want to configure a new storage pool? (yes/no) [default=yes]: 
Name of the new storage pool [default=default]: 
Name of the storage backend to use (btrfs, dir, lvm, zfs, ceph) [default=zfs]: btrfs
Create a new BTRFS pool? (yes/no) [default=yes]: 
Would you like to use an existing empty block device (e.g. a disk or partition)? (yes/no) [default=no]: 
Size in GB of the new loop device (1GB minimum) [default=30GB]: 64GB
Would you like to connect to a MAAS server? (yes/no) [default=no]: 
Would you like to create a new local network bridge? (yes/no) [default=yes]: 
What should the new bridge be called? [default=lxdbr0]: 
What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: 
What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: 
Would you like the LXD server to be available over the network? (yes/no) [default=no]: 
Would you like stale cached images to be updated automatically? (yes/no) [default=yes] 
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]: 
```

あとからIPv6を無効にする場合
```
ubuntu@host:~$ lxc network set lxdbr0 ipv6.address none
```

### ユーザーをlxdグループに追加

通常はインストールを行ったユーザーは自動で追加されると思いますが、
もし追加されていない場合は「 /etc/group 」を編集する等して追加してください。

### UFWの設定

UFW を導入している場合，この先に進む前に LXD が用意してくれるブリッジである lxdbr0 を介しての通信を許可します。以下は ufw での例です。
```
ubuntu@host:~$ sudo ufw allow in on lxdbr0
ubuntu@host:~$ sudo ufw route allow in on lxdbr0
```


### 再起動

設定の反映等のためにホストを再起動してください。














# GUIアプリを動かせるコンテナを作成（基本）

やりやすいようにコンテナ名を変数に入れる。
```
ubuntu@host:~$ LXCNAME=kasou1
```

### コンテナの作成

```
ubuntu@host:~$ lxc launch ubuntu:20.04 $LXCNAME
ubuntu@host:~$ lxc exec $LXCNAME -- sh -c "apt update && apt full-upgrade -y && apt autoremove -y"
ubuntu@host:~$ lxc exec $LXCNAME -- sh -c "reboot"
```

### UID/GIDの設定
```
ubuntu@host:~$ lxc config set $LXCNAME raw.idmap 'both 1000 1000'
```

### パッケージのインストール
```
ubuntu@host:~$ lxc exec $LXCNAME -- sh -c 'apt update && apt install -y \
  x11-apps pulseaudio dbus-x11 \
  language-pack-ja fonts-noto-cjk-extra \
  fonts-noto-color-emoji manpages-ja'
```

### 日本語環境の設定
```
ubuntu@host:~$ lxc exec $LXCNAME -- update-locale LANG=ja_JP.UTF-8
ubuntu@host:~$ lxc exec $LXCNAME -- timedatectl set-timezone Asia/Tokyo
ubuntu@host:~$ lxc exec $LXCNAME -- localectl set-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"
ubuntu@host:~$ lxc exec $LXCNAME -- source /etc/default/locale
ubuntu@host:~$ lxc exec $LXCNAME -- sh -c "echo export LANG=ja_JP.UTF8 | tee --append /home/ubuntu/.profile"
```

### コンテナ再起動
```
ubuntu@host:~$ lxc exec $LXCNAME -- sh -c "reboot"
```


### コンテナの中からホストのサウンドサーバーにアクセスできるようにする

```
ubuntu@host:~$ lxc exec $LXCNAME -- sed -i "s/; enable-shm = yes/enable-shm = no/g" /etc/pulse/client.conf
ubuntu@host:~$ lxc exec $LXCNAME -- sh -c "echo export PULSE_SERVER=unix:/tmp/.pulse-native | tee --append /home/ubuntu/.profile"
ubuntu@host:~$ lxc config device add $LXCNAME pa disk source=/run/user/1000/pulse/native path=/tmp/.pulse-native
```

### コンテナからホストのXサーバーとGPUデバイスにアクセスできるようにします。
```
ubuntu@host:~$ lxc exec $LXCNAME -- usermod -aG video ubuntu
ubuntu@host:~$ lxc config set $LXCNAME environment.DISPLAY :0
ubuntu@host:~$ lxc config device add $LXCNAME xorg disk source=/tmp/.X11-unix/X0 path=/tmp/.X11-unix/X0
ubuntu@host:~$ lxc config device add $LXCNAME mygpu gpu gid=`getent group video | cut -d: -f3`
```

### 念の為ubuntuユーザーにパスワードを設定する。
```
ubuntu@host:~$ lxc exec $LXCNAME -- /bin/bash
root@kasou1:~# passwd ubuntu
New password: 
Retype new password: 
passwd: password updated successfully
root@kasou1:~# exit
```

また、その後の作業のために、いったんubuntuユーザーが sudo を使用できるか確認してください。



### fcitx-mozcのインストール(日本語入力の設定)

```
ubuntu@host:~$ lxc exec $LXCNAME -- sh -c 'apt update && apt install -y \
                 fcitx-mozc dbus-x11 \
                 language-pack-ja gnome-user-docs-ja ibus-mozc'
ubuntu@host:~$ lxc exec $LXCNAME -- sh -c 'localectl set-x11-keymap jp jp106'
ubuntu@host:~$ lxc exec $LXCNAME -- sh -c 'sh -c "dbus-uuidgen > /var/lib/dbus/machine-id"'
```

Ubuntuユーザーの「~/.profile」に下記を追加する。
```
 # Added by https://astherier.com/blog/2020/08/install-fcitx-mozc-on-wsl2-ubuntu2004/
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
export DefaultIMModule=fcitx
if [ $SHLVL = 1 ] ; then
  (fcitx-autostart > /dev/null 2>&1 &)
  xset -r 49  > /dev/null 2>&1
fi
 #end
```

インストールが完了したら、設定を反映させるため一旦コンテナを再起動します。
```
ubuntu@host:~$ lxc exec $LXCNAME -- sh -c "reboot"
```


### gnomeの設定画面を開く

このとき「gnome-control-center」でも良いですが、音声関連のタブで落ちてしまい、起動できなくなってしまうので、次がいいです。
```
ubuntu@host:~$ lxc exec $LXCNAME -- sudo --user=ubuntu --login 'gnome-language-selector' 
```

追加のインストールを求められた場合はインストールを行ってください。

あと、「キーボード入力に使うIMシステム」に fcitx を選択します。

![Screenshot from 2022-03-05 18-49-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117082/f95e7e29-5837-b3cd-7809-eb1b29510ee7.png)


入力設定確認のため、fcitx-config-gtk3を実行します。

```
ubuntu@host:~$ lxc exec $LXCNAME -- sudo --user=ubuntu --login 'fcitx-config-gtk3' 
```

まず「入力メソッド(Input Method)」タブで「 Mozc 」が指定されているか確認してください。

ない場合は、下の＋ボタンで足してください。

![Screenshot from 2022-03-05 18-52-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117082/b8d28a61-7b7c-3bf9-7975-359b42b60e46.png)



続いて、「全体の設定(Global Config)」タブの中で、
「 Trigger Input Method 」の項目の「Ctrl+Space」の隣に、「 Zenkakuhankaku 」が指定されているか確認してください。

何もない場合は、そこをクリックして半角全角キーを押すと、「 Zenkakuhankaku 」と入力されると思います。

![Screenshot from 2022-03-05 18-53-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117082/e1f09141-9dba-6fd3-e023-6045dfa44fe7.png)





設定が終わったら閉じます。



### コンテナの自動起動を停止

```
ubuntu@host:~$ lxc config set $LXCNAME boot.autostart false
ubuntu@host:~$ lxc exec $LXCNAME -- sh -c "reboot"
```



### テンプレートを作成する。

ここまで作成したら、
今回作成した kasou1 を自作コンテナイメージとして登録します。

これで次回からは作業時間を短縮できます。

まず、スナップショットを作成します。
```
ubuntu@host:~$ lxc snapshot kasou1 bk-install1
```

スナップショットからコンテナイメージを作成します。
```
ubuntu@host:~$ lxc publish kasou1/bk-install1 --alias base1
Instance published with fingerprint: 1ad7a592111c44dd77079651832e45f04c07ba8ed999bccf468caa6498b1cb82
```

コンテナイメージができているか確認します。(出力結果は長いので一部抜粋)
```
ubuntu@host:~$ lxc image list base1
+-------+--------------+--------+--------------+-----------+-----------+
| ALIAS | FINGERPRINT  | PUBLIC | ARCHITECTURE |   TYPE    |   SIZE    | 
+-------+--------------+--------+--------------+-----------+-----------+
| base1 | 1ad7a592111c | no     | x86_64       | CONTAINER | 1025.37MB |
+-------+--------------+--------+--------------+-----------+-----------+
```

次回からは、「 base1 」で設定済みのコンテナを作成できます。
```
ubuntu@host:~$ lxc launch base1 voivo1
Creating voivo1
Starting voivo1  
```

ただし、すべての設定をコピーしてくれるわけではなく、
「  lxc config show voivo1 」の内容がデフォルトのままのようなので、下記の設定だけ行う必要があります。
( lxc config で始まるコマンドは実施する必要があるようです。)
```
ubuntu@host:~$ LXCNAME=voivo1
ubuntu@host:~$ lxc config set $LXCNAME raw.idmap 'both 1000 1000'
ubuntu@host:~$ lxc config device add $LXCNAME pa disk source=/run/user/1000/pulse/native path=/tmp/.pulse-native
ubuntu@host:~$ lxc config set $LXCNAME environment.DISPLAY :0
ubuntu@host:~$ lxc config device add $LXCNAME xorg disk source=/tmp/.X11-unix/X0 path=/tmp/.X11-unix/X0
ubuntu@host:~$ lxc config device add $LXCNAME mygpu gpu gid=`getent group video | cut -d: -f3`
ubuntu@host:~$ lxc config set $LXCNAME boot.autostart false
ubuntu@host:~$ lxc exec $LXCNAME -- sh -c "reboot"

```



# コンテナとソフトの自動起動

コンテナは自動起動してくれないので、PCを再起動した際にはコンテナも手動起動する必要があります。

それはメンドクサイので、私は柴田氏のスクリプトを簡易化したものを利用しています。

### 例（Google Chromeの場合）

下記のスクリプトをホスト側で作成します。

```lxc-chrome.sh
#!/bin/sh

# 指定したアプリのあるコンテナでアプリを起動する。
# コンテナが停止しているときには起動させる。
# 参考
# https://gihyo.jp/admin/serial/01/ubuntu-recipe/0627?page=3

##### 変数 ######################################
# コンテナ名
CONTAINER="chrome1"

# タイトル
TITLE="Google Chrome"

# ソフト起動時のコマンド
EXEC_COM="/home/ubuntu/bin/google-chrome.sh"


##### メイン処理 ######################################

if [ -z "${CONTAINER}" ]; then
    notify-send "${TITLE}" "Please specify container name"
    exit 1
fi

# check and start container
status=$(lxc list --format csv -c s "^${CONTAINER}$")
if [ "$status" != "RUNNING" ]; then
    lxc start "${CONTAINER}"
    lxc exec "${CONTAINER}" -- cloud-init status --wait

    status=$(lxc list --format csv -c s "^${CONTAINER}$")
    if [ "$status" != "RUNNING" ]; then
        notify-send "${TITLE}" "Failed to start \"${CONTAINER}\" container"
        exit 1
    fi
fi


lxc exec "${CONTAINER}" -- sudo --user=ubuntu --login "${EXEC_COM}"
```

使用したい際にはこのスクリプトを実行して起動させています。
違うソフトを起動したい場合は、変数の部分の内容を変更したスクリプトを作成してください。









# aptのキャッシュサーバを構築

apt-cacher-ng で https リポジトリに間接的にアクセスできるようにします。

複数のコンテナの効率的運用と、aptはさせたいが外部への通信はさせたくないコンテナ用に構築します。
キャッシュサーバ用のシステムはいくつかありますが、今回は apt-chcher-ng を使用します。

![setumei2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117082/55332705-6477-9aab-1307-b2e6f72e470b.png)





## apt-chcher-ng導入

```インストール
guest:~# apt update
guest:~# apt install apt-cacher-ng
guest:~# echo 'Acquire::http::Proxy "http://127.0.0.1:3142";' | tee /etc/apt/apt.conf.d/02proxy
```

### IPアドレス確認
```
guest:~# ip a | grep inet
```

### 設定ファイルの確認

設定ファイルは「 /etc/apt-cacher-ng/acng.conf 」です。

主な項目は下記です。
このあたりは、もっとマニュアルを読んで設定を詰める予定です。

ファイルがキャッシュされるディレクトリ
* CacheDir: /var/cache/apt-cacher-ng

ログが保存されるディレクトリ
* LogDir: /var/log/apt-cacher-ng

使用ポート
* Port:3142

詳細情報を表示するためのHTMLファイルの名前

* ReportPage: acng-report.html

http://サーバのIP:3142/acng-report.html にアクセスすると詳細情報が見れます。








## 隔離用のネットワークを作成して、apt-cacher-ngのみアクセスできるようにする。

ここも、もっと整理する予定です。

### ネットワークを追加する。（kakurilocal）

```
ubuntu@host:~$ lxc network create kakurilocal --type=bridge
ubuntu@host:~$ lxc network set kakurilocal ipv6.address none
ubuntu@host:~$ lxc network set kakurilocal ipv4.address 10.139.94.1/24
ubuntu@host:~$ lxc network set kakurilocal ipv4.nat false                  # NATできないようにする。
```

aptのキャッシュサーバはUFWをonにしておきます。
apt-chcher-ngへのアクセスのみ許可させます。
```
ubuntu@host:~$ ufw enable
ubuntu@host:~$ ufw allow proto tcp from 192.168.2.0/24 to any port 3142
ubuntu@host:~$ ufw allow proto tcp from 10.202.224.1/24 to any port 3142
ubuntu@host:~$ ufw allow proto tcp from 10.139.94.1/24 to any port 3142
ubuntu@host:~$ ufw status verbose
```

「kasou1」コンテナの接続を切り替える。
```
ubuntu@host:~$ lxc network attach kakurilocal kasou1 eth0
ubuntu@host:~$ lxc restart kasou1
```


apt-cacher-01にネットワークインターフェースを追加する

```
ubuntu@host:~$ lxc config device add apt-cacher-01 eth1 nic nictype=bridged parent=kakurilocal    # やらなくていい
Device eth1 added to apt-cacher-01

ubuntu@host:~$ lxc network attach kakurilocal apt-cacher-01 eth1
```

アドレスの割り当て
```
ubuntu@host:~$ lxc config device set apt-cacher-01 eth1 ipv4.address 10.139.94.10
```

IPアドレスの割り当て
```
ubuntu@host:~$ lxc exec apt-cacher-01 dhclient eth1
```

apt-cacher-01 のDHCPをONにします。
IPアドレスの管理はLXDが行います。
```
root@apt-cacher-01:~# vi /etc/netplan/50-cloud-init.yaml
        eth1:                               # 追加
            dhcp4: true                     # 追加
```

### 「kasou1」のプロキシの設定を行う。

```
root@kasou1:~# echo 'Acquire::http::Proxy "http://10.139.94.10:3142";' | tee /etc/apt/apt.conf.d/02proxy
```











# Google Chrome

別途debファイルをインストールする必要がある場合、
コンテナ環境にインストールすることで、
ホスト側をきれいに保つことができます。

ここでは Google Chrome　ブラウザをインストールします。

コンテナ名: chrome1


### 事前準備

事前にchromeのdebファイルと、コンテナの基本構築を行っておきます。

基本構築を行ったコンテナにdebファイルを転送しておきます。

事前に転送先のディレクトリは作成しておいてください。

```
ubuntu@host:~$ lxc file push './google-chrome-stable_current_amd64.deb' chrome1/home/ubuntu/work/
```


### インストール

コンテナrootで入ってインストールを行います。

```
ubuntu@host:~$ lxc exec chrome1 -- /bin/bash
root@chrome1:~# cd /home/ubuntu/work/
root@chrome1:~# apt install ./google-chrome-stable_current_amd64.deb
root@chrome1:~# exit
```


### googleのリポジトリに apt-cacher-ng 経由でアクセスできるようにする。

apt-cacher-ng 経由では HTTPS アクセスができないので、下記の設定を追加します。
作業は「apt-cacher-01」コンテナで行います。

```
ubuntu@host:~$ lxc exec apt-cacher-01 -- /bin/bash
root@apt-cacher-01:~# vi /etc/apt-cacher-ng/acng.conf
```

下記の設定を追加します。
これで、「」へのHTTPS通信はキャッシュせずに直接通信させるようになります。
```/etc/apt-cacher-ng/acng.conf
PassThroughPattern: dl\.google\.com:443$
```

設定を反映させるために、サービスを再起動させます。
```
root@apt-cacher-01:~# systemctl restart apt-cacher-ng
```


### 起動


起動させるためのスクリプトを作成します。

直接起動させても良いのですが、コマンドの引数をうまく与えられなかったりするため、
スクリプトを作成したほうが良いです。

```
ubuntu@host:~$ lxc exec chrome1 -- /bin/su - ubuntu
ubuntu@chrome1:~$ mkdir bin
ubuntu@chrome1:~$ cd bin/
ubuntu@chrome1:~/bin$ vi google-chrome.sh
```

下記のようなファイルを作成します。
```google-chrome.sh
#!/bin/bash

# google-chrome
/usr/bin/google-chrome %U
```

ファイルに実行権限を与え、コンテナから出ます。
```
ubuntu@chrome1:~/bin$ chmod 755 google-chrome.sh
ubuntu@chrome1:~/bin$ exit
```

下記で起動させます。
```
ubuntu@host:~$ lxc exec chrome1 -- sudo --user=ubuntu --login '/home/ubuntu/bin/google-chrome.sh' 
```





### ホストのディレクトリをmountする

ブラウザを使用しているとファイルをダウンロードしたりアップロードしたりすることがあるかと思います。

そのときにホストとファイルを簡単にやりとりできるようにしておくと便利です。

このため、ホストの特定のディレクトリをコンテナ側でマウントします。

予めホストに「 /mnt/disk1/chrome1 」をゲストに「 /home/ubuntu/share-chrome1 」を作成する。

```
ubuntu@host:~$ lxc config device add chrome1 share-drdata disk source=/mnt/disk1/chrome1 path=/home/ubuntu/share-chrome1
```

設定を確認します。

```
ubuntu@host:~$ lxc config show chrome1
architecture: x86_64
config:
  boot.autostart: "false"
・
・
・
devices:
  share-drdata:
    path: /home/ubuntu/share-chrome1
    source: /mnt/disk1/chrome1
    type: disk
・
・
・
```


















# krita とペンタブドライバ( digimend-kernel-drivers )をインストールする

ペイントソフトになります。

https://krita.org/en/

日本語サイトはニュースの更新が遅いため、英語サイトのリンクにしています。

今回は Appimage を使用し、ペンタブドライバもコンテナに一緒にインストールします。

これにより、ドライバをホストにインストールする必要がなく、きれいに保つことができます。

また、LXDのスナップショット機能を使用すれば Krita のバージョンアップ時に問題が起こってもすぐ戻せます。

 Appimage を使用するのであれば必要ないかとも思いますが、
メジャーバージョンのアップ時には conf の仕様が変更になり、すぐに戻せない場合があります。
（今回 Krita のバージョン5で conf の仕様変更が入っているはずです）

そんなときにLXDでスナップショットを取っておけばすぐ Krita の環境だけ元に戻せます。

コンテナ名: krita1

### 事前準備

Appimage ファイルをコンテナの「 /home/ubuntu/bin 」へコピーします。

ワコムドライバなどをインストールする。

```
ubuntu@host:~$ lxc exec krita1 -- sh -c 'apt update && apt install -y \
                 libwacom2 xserver-xorg-input-wacom xinput x11-xserver-utils'
```

ビルド用の環境を構築
```
ubuntu@host:~$ lxc exec krita1 -- sh -c 'apt update && apt install -y \
                 build-essential devscripts dkms debhelper gdebi unzip zip'
```

ペンタブのIDを確認
```
ubuntu@host:~$ lsusb
```

ペンタブを追加。（USBパススルー）
```
ubuntu@host:~$ lxc config device add コンテナ名 任意の名前 unix-hotplug vendorid=ベンダid productid=プロダクトID
```

例：
```
ubuntu@host:~$ lxc config device add krita1 xppenG640S unix-hotplug vendorid=28bd productid=0906
```

また、グループへ追加する。
```
ubuntu@host:~$ lxc exec krita1 -- usermod -aG input ubuntu
```


### WACOM以外を動かすための追加ドライバ

ドライバソースコードを持ってきてファイルを /home/ubuntu/work/ フォルダ内に置く。
https://github.com/DIGImend/digimend-kernel-drivers

解凍をして、コードをビルドを実行する。
```
ubuntu@host:~$ lxc exec krita1 -- /bin/su - ubuntu
ubuntu@krita1:~$ unzip digimend-kernel-drivers.zip
ubuntu@krita1:~$ cd digimend-kernel-drivers
ubuntu@krita1:~$ dpkg-buildpackage -r -uc -b
ubuntu@krita1:~$ exit
```

インストールはrootで行う
```
ubuntu@host:~$ lxc exec krita1 -- /bin/bash
root@krita1:~# cd /home/ubuntu/work/
root@krita1:~# gdebi digimend-dkms_10_all.deb
```

「/usr/share/X11/xorg.conf.d/」に「」があるか確認
なければソースから移動する。
```
root@krita1:~# cd /usr/share/X11/xorg.conf.d/
root@krita1:~# ls -la
```

コンテナを一旦再起動
```
root@krita1:~# reboot
```


### マルチモニタへの対応

マルチモニターの状況を確認するコマンド
```
ubuntu@host:~$ lxc exec krita1 -- sudo --user=ubuntu --login 'xrandr'
HDMI-A-0 connected 1920x1080+1920+0 (normal left inverted right x axis y axis) 476mm x 268mm
・
・
HDMI-A-1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 458mm x 258mm
```

USBインプットデバイスの状態を確認するコマンド
```
ubuntu@host:~$ lxc exec krita1 -- sudo --user=ubuntu --login 'xinput'
⎡ Virtual core pointer                    	id=2	[master pointer  (3)]
・
・
⎜   ↳ UGTABLET 6 inch PenTablet Mouse         	id=16	[slave  pointer  (2)]
⎜   ↳ UGTABLET 6 inch PenTablet Pen (0)       	id=19	[slave  pointer  (2)]
⎣ Virtual core keyboard                   	id=3	[master keyboard (2)]
・
・
    ↳ UGTABLET 6 inch PenTablet Keyboard      	id=17	[slave  keyboard (3)]
    ↳ UGTABLET 6 inch PenTablet               	id=18	[slave  keyboard (3)]
```

今回はHDMI-A-0 で使用します。


### 起動準備

下記のスクリプトを作成します。
```
ubuntu@host:~$ lxc exec krita1 -- /bin/su - ubuntu
ubuntu@krita1:~$ mkdir bin
ubuntu@krita1:~$ cd bin/
ubuntu@krita1:~$ vi krita-sta.sh
```

下記のようなファイルを作成します。
```krita-sta.sh
#!/bin/bash

# Display
xinput map-to-output $(xinput list --id-only "UGTABLET 6 inch PenTablet Pen (0)") HDMI-A-0

# krita
/home/ubuntu/bin/krita-5.0.2-x86_64.appimage
```

スクリプトとappimageに実行権限を与え、コンテナから出ます。
```
ubuntu@krita1:~/bin$ chmod 755 krita-sta.sh
ubuntu@krita1:~/bin$ chmod 755 krita-5.0.2-x86_64.appimage
ubuntu@krita1:~/bin$ exit
```

### 起動

下記で起動させます。
```
ubuntu@host:~$ lxc exec krita1 -- sudo --user=ubuntu --login '/home/ubuntu/bin/krita-sta.sh' 
```















# LXD上にblenderをインストールする。

https://www.blender.org/

コンテナ名: blender-cl1

snap 版をインストールする。
```
ubuntu@host:~$ lxc exec blender-cl1 -- /bin/bash
blender-cl1 >$  snap install blender --classic
```

起動
```
ubuntu@host:~$ lxc exec blender-cl1 -- sudo --user=ubuntu --login 'blender'
```

















## LXD上にAndroidStudioをインストールする。

~~これはAMDのCPUではうまくエミュレーターが動作してくれないため、intelのCPUで行ったほうが良いです。~~

どうやら最近AMDのCPUでも動くようになったようです。
検証したら更新します。

コンテナ名: adrdcl1

AndroidStudio用ライブラリのインストール
```
ubuntu@host:~$ lxc exec adrdcl1 -- sh -c 'apt update && apt install -y openjdk-11-jdk qemu-kvm adb libvirt-clients'
ubuntu@host:~$ lxc exec adrdcl1 -- usermod -aG kvm ubuntu

ubuntu@host:~$ lxc exec adrdcl1 -- sh -c "reboot"

ubuntu@host:~$ lxc stop adrdcl1
ubuntu@host:~$ lxc config device add adrdcl1 kvm unix-char path=/dev/kvm
ubuntu@host:~$ lxc start adrdcl1
ubuntu@host:~$ lxc exec adrdcl1 --ls -al /dev/kvm
ubuntu@host:~$ lxc exec adrdcl1 --apt install -y libnss3 libxcomposite1
```



以下から最新のものをダウンロードする

https://developer.android.com/studio?hl=ja

```
ubuntu@host:~$ lxc file push ./android-studio-ide-202.7486908-linux.tar.gz adrdcl1/home/ubuntu/
```

解凍
```
ubuntu@host:~$ lxc exec adrdcl1 -- /bin/su - ubuntu
ubuntu@adrdcl1:~$ tar -zxvf android-studio-ide-202.7486908-linux.tar.gz
ubuntu@adrdcl1:~$ exit
```


起動
```
ubuntu@host:~$ lxc exec adrdcl1 -- sudo --user=ubuntu --login '/home/ubuntu/android-studio/bin/studio.sh'
```












# LXD上にwineをインストールする。

Windowsの古いゲームを動かしたいので、構築しましたが、まだ十分動かせていません。

コンテナ名: wine-cl1

インストールは最新のUbuntuにする
```
ubuntu@host:~$ lxc launch ubuntu:21.04 wine-cl1
```

### 必要なソフトのインストール

必要なソフトをインストールします。
```
ubuntu@host:~$ lxc exec wine-cl1 -- sh -c 'apt update && apt install -y wine lhasa winetricks'
ubuntu@host:~$ lxc exec wine-cl1 -- sh -c "reboot"
```

フォントをインストールします。（しないと文字化けする）
```
ubuntu@host:~$ lxc exec wine-cl1 -- /bin/su - ubuntu
ubuntu@wine-cl1:~$ winetricks fakejapanese_ipamona   # 多分これだけでいい
ubuntu@wine-cl1:~$ winetricks allfonts
ubuntu@wine-cl1:~$ winetricks cjkfonts
```

変な通信を行うのを未然に防ぐために、基本的にNICを無効にする。
```
ubuntu@host:~$ lxc exec wine-cl1 -- /bin/bash
root@wine-cl1:~#  vi /etc/netplan/50-cloud-init.yaml
============================================
network:
    version: 2
    ethernets:
        eth0:
          #dhcp4: true
            dhcp4: false
============================================
```

再起動をして反映させます。
```
root@wine-cl1:~# netplan apply
```

### lzhの解凍

lhasaはこのために必要となります。
```
ubuntu@host:~$ lxc exec wine-cl1 -- /bin/su - ubuntu
ubuntu@wine-cl1:~$ lha x usabato.lzh 
```

使用したいexeは下記のフォルダに設置するほうがいいです。
ここでないと見れないらしい。
```
/home/ubuntu/.wine/drive_c/users/ubuntu/Desktop/
```

### 各種システム設定

各種アプリケーションを起動させるためのスクリプトを作成する。
これを行わないと英語でしか表示できない。

/home/ubuntu/work/
```winecfg.sh
#!/bin/bash
LANG=ja_JP.UTF-8 winecfg
```

```winefile.sh
#!/bin/bash
LANG=ja_JP.UTF-8 winefile
```


winecfgで設定を行う。
```
ubuntu@host:~$ lxc exec wine-cl1 -- sudo --user=ubuntu --login '/home/ubuntu/work/winecfg.sh'
```

アプリケーションのタブのWindows Vsrsion はXPのほうがいいかも。
Add application で動かしたいexeを登録する必要があるかも。


### アプリの起動

下記でファイラを起動して、動かしたいexeを選択して起動させる。
```
ubuntu@host:~$ lxc exec wine-cl1 -- sudo --user=ubuntu --login '/home/ubuntu/work/winefile.sh'
```



### MIDIを出力できるようにする(未完成)

timidity-daemon がインストールに失敗します。

```
ubuntu@host:~$ lxc config device add wine-cl1 seq unix-char source=/dev/snd/seq path=/dev/snd/seq
Device seq added to wine-cl1
```

```
ubuntu@host:~$ lxc exec wine-cl1 -- /bin/bash
root@wine-cl1:~# cd /dev/snd
root@wine-cl1:/dev/snd# chown root.audio seq
root@wine-cl1:~# apt install timidity timidity-daemon  alsa-utils
```

MIDIの出力ポート一覧
```
root@wine-cl1:~#  aconnect -o
```

設定を入れます。
```
ubuntu@host:~$ lxc exec wine-cl1 -- /bin/su - ubuntu
ubuntu@wine-cl1:~$ echo "timidity -iAD -B2,8 -Os1l -s 44100 -x'soundfont /usr/share/midi/sf2/mypatches.sf2 order=1'" >> ~/.profile 
ubuntu@wine-cl1:~$ source ~/.profile
```
















# LXD上にVOICEVOXをインストールする。

「無料で使える中品質なテキスト読み上げソフトウェア VOICEVOX 」

https://voicevox.hiroshiba.jp/

今回はCPU版を使用します。

GPU版も使用可能だとは思いますが、私がNvidia製GPUを持っておらず、検証することができませんでした。

コンテナ名: voivo1

### 事前準備

サイトからダウンロードしたインストール用スクリプトを、
「 /home/ubuntu/bin/ 」に配置し、実行権限を与えておきます。

足りない下記のライブラリを追加インストールします。
```
root@voivo1:~# apt install libatk-bridge2.0-0 libgtk-3-dev p7zip
```

インストーラーを起動します。
```
ubuntu@host:~$ lxc exec voivo1 -- sudo --user=ubuntu --login '/home/ubuntu/bin/VOICEVOX-CPU.Installer.0.11.3.Linux.sh'
```

### 起動

起動させるためのスクリプトを作成します。

```
ubuntu@host:~$ lxc exec voivo1 -- /bin/su - ubuntu
ubuntu@voivo1:~$ mkdir bin
ubuntu@voivo1:~$ cd bin/
ubuntu@voivo1:~/bin$ vi vbox.sh
```

下記のようなファイルを作成します。
```vbox.sh
#!/bin/bash

# VOICEVOX
/home/ubuntu/.voicevox/VOICEVOX.AppImage
```

ファイルに実行権限を与え、コンテナから出ます。
```
ubuntu@voivo1:~/bin$ chmod 755 vbox.sh
ubuntu@voivo1:~/bin$ exit
```

下記で起動させます。
```
ubuntu@host:~$ lxc exec voivo1 -- sudo --user=ubuntu --login '/home/ubuntu/bin/vbox.sh'
```








# 参考URL

https://gihyo.jp/admin/serial/01/ubuntu-recipe/0627

https://booth.pm/ja/items/1575615

https://gihyo.jp/admin/serial/01/ubuntu-recipe/0521

https://gihyo.jp/admin/serial/01/ubuntu-recipe/0479

https://www.fixes.pub/program/417137.html
https://qiita.com/mt08/items/c8b8187b1000382d77ae
http://bluearth.cocolog-nifty.com/blog/2020/04/post-8db9b1.html
https://astherier.com/blog/2020/08/install-fcitx-mozc-on-wsl2-ubuntu2004/
https://blog.goo.ne.jp/cinemaesprit/e/8805efd176e54a131c57bdb98c3a8b15
https://zenn.dev/tantan_tanuki/articles/7796a4f1d6d1b0
https://postgresweb.com/ubuntu-20-04-japanese
https://www.linux-setting.tokyo/2021/11/ubuntu-2110-impish-indri-ibus-mozc.html
https://matoken.org/blog/2019/07/19/direct-access-to-https-repository-with-apt-cacher-ng/
https://gihyo.jp/admin/serial/01/linux_containers/0015
https://qiita.com/yakitatata/items/a3070b13982999631d0e
https://matoken.org/blog/2019/07/19/direct-access-to-https-repository-with-apt-cacher-ng/