Ubuntu 18.04LTS(server)でLTSPを動かすためのメモ <動いてません>

# このメモは?

現時点ではまだ動いていないのですが、何が原因なのかも微妙なため、情報共有として出しておきたいと思います。

# やりたいこと

Ubuntu 18.04ベースでのLTSPでデスクトップ環境をクライアント展開させたいということです。
利用するのはNFSではなく、NBD(network block device)です。こちらのほうがクライアントが多いときに(圧縮転送してるので)性能が期待できるから。

しかしながら2018年10月現在、手元の環境では**ブートすれどもディスクがマウントできず**で動かない状態です。
なにかわかったところで随時更新します。

ということで、**あくまでまだ動いていない、途上の記録**であることを前提に見てください。そして修正点があったら指摘をしていただければと思います。

# 環境構成

- Windows10
- VirtualBox 5.2.20
- Ubuntu 18.04LTSサーバーのmini.isoでLTSPサーバーを構築
- LTSPのスタンドアロン版システムと必要そうなものを準備

# やったこと

## VMを作成

LTSPサーバー用のVMインスタンスを作成し、mini.isoからOpenSSHサーバーのみ入れる形でインストールしています。

- Linux/Ubuntu 64bitベース
- CPUは2つ
- メモリ2048MB
- 仮想ディスク20GB
- ネットワークはNATに加えて『内部ネットワーク』を追加、他と混ざらないように名前を"LTSP"として設定

![LTSP-serverVM-net.png](https://qiita-image-store.s3.amazonaws.com/0/146518/cf5a3789-bb92-f803-0207-61fcad443e64.png)

## VMへのインストール

何買ってもいいようにスナップショットを準備してから、起動時にUbuntu 18.04LTSのネットブートイメージ(mini.iso)を使ってブートしてインストール。

- インストール時の言語は英語にし、キーボードや居住地は日本に設定
- ネットワークはNATと内部が存在するためNAT側をとりあえず有効にしてインストールデータの確保
- ホスト名やミラー(国内を自動選択)を設定
- 管理用ユーザーを作成
- ディスク設定は全体(LVM)利用、その後ベースシステムのインストールが進む
- ソフトウェア更新(popcon)は「セキュリティのみ自動更新」で調整
- 追加パッケージはOpenSSHサーバーのみ(後で必要なものはaptにて)
- その他必要なことはよしなに設定

![LTSP-serverVM-tasks.png](https://qiita-image-store.s3.amazonaws.com/0/146518/5b9ded04-4f40-2110-3b46-140c3c430f86.png)

これでブートを確認したら、一度落としてスナップショットを作成

## LTSP環境の準備(ネット周り)

LTSPを使うためには内部ネットワークを構成する必要があるのでそのあたりを準備しておきます。

### 内部ネットワークの準備

- ネットワークは2つある
    - enp0s3: NAT
    - enp0s8: 内部ネットワーク(LTSP)、この時点ではIP未設定

ということでnetplan(5)に従い設定

![LTSP-serverVM-netplan.png](https://qiita-image-store.s3.amazonaws.com/0/146518/e9c5e9bc-de0d-a442-e043-a9ff36e17508.png)

適用のため

```bash
$ sudo netplan apply
$ ip a
```

で動作確認。

![LTSP-serverVM-netplan-applied.png](https://qiita-image-store.s3.amazonaws.com/0/146518/e80862cd-d376-8bcf-fffc-8f502944b899.png)

### DHCPとTFTPの準備

LTSPクライアントはDHCPクライアントを通じて情報を得るため、DHCPサーバーとTFTPサーバーが必要になる。

```bash
$ sudo apt update
$ sudo apt install -y isc-dhcp-server tftpd-hpa
```

インストール後設定をいじります。Systemdが読む`isc-dhcp-server.service`ファイルが、`INTERFACES`変数を読むのに`/etc/default/isc-dhcp-server`では`INTERFACESV4`とかになってて機能しないため、変数を書き換えて対応。

![LTSP-serverVM-dhcp1.png](https://qiita-image-store.s3.amazonaws.com/0/146518/69a251c2-789f-f2ad-f7f4-883e376f2e69.png)


そして`/etc/dhcp/dhcpd.conf`を本来ならいじるのですが、LTSPを使ってる時は先行してファイルを検出した時点ですり替えるロジックが入っているため今回はまだこのままにしておきます。

TFTPサーバーは入れるだけで今の所いじるポイントはありません(どっちのインターフェースも待ち受けしているため)。
多分起動時にエラーが出ますが気にせずシャットダウン、スナップショットを撮っておきます。

## LTSP環境の構築

続いてLTSPのセットを入れてからイメージ構築を開始します。

### パッケージの準備

```bash
$ sudo apt install -y ltsp-server
```

特段することはありませんね。`ltsp-server-standalone`を使うべきかは少し迷うところですが、最小限でやってみてます。

### イメージ生成

まずはログインするところまで出せるかなので、イメージを作ります。

```bash
$ sudo ltsp-build-client --mirror http://jp.archive.ubuntu.com/ubuntu --dist bionic # bionic -> 16.04LTS
```

![LTSP-serverVM-building.png](https://qiita-image-store.s3.amazonaws.com/0/146518/847696f2-6fed-f008-99bd-155b4cc8060e.png)

これで最終的に`mksquashfs`され、イメージが`/opt/ltsp/images`以下に配置されます。

- DHCPの設定がないので、ltsp-configで生成させましょう
- NBDの設定ファイルはとりあえずありますが、リモートスワップは使わないので後で無効化します

```bash
$ sudo ltsp-config isc-dhcp-server
```

```file:/etc/ltsp/dhcp.conf
#
# Default LTSP dhcpd.conf config file.
#

authoritative;

subnet 192.168.67.0 netmask 255.255.255.0 {
    range 192.168.67.20 192.168.67.250;
    option domain-name "example.com";
    option domain-name-servers 192.168.67.1;
    option broadcast-address 192.168.67.255;
    option routers 192.168.67.1;
    next-server 192.168.67.1;
#    get-lease-hostnames true;
    option subnet-mask 255.255.255.0;
    option root-path "/opt/ltsp/amd64";
    if substring( option vendor-class-identifier, 0, 9 ) = "PXEClient" {
        filename "/ltsp/amd64/pxelinux.0";
    } else {
        filename "/ltsp/amd64/nbi.img";
    }
}
```

```bash
# この時点ではrootのイメージを読めるか不明ですが… 動かして試すが一番
$ cd /etc/ltsp
$ sudo sed -e 's;192.168.67;172.16.0:g'  -i.bak dhcpd.conf
```

```/etc/ltsp/dhcpd.conf
#
# Default LTSP dhcpd.conf config file.
#

authoritative;

subnet 172.16.0.0 netmask 255.255.255.0 {
    range 172.16.0.20 172.16.0.250;
    option domain-name "example.com";
    option domain-name-servers 172.16.0.1;
    option broadcast-address 172.16.0.255;
    option routers 172.16.0.1;
    next-server 172.16.0.1;
#    get-lease-hostnames true;
    option subnet-mask 255.255.255.0;
    option root-path "/opt/ltsp/amd64";
    if substring( option vendor-class-identifier, 0, 9 ) = "PXEClient" {
        filename "/ltsp/amd64/pxelinux.0";
    } else {
        filename "/ltsp/amd64/nbi.img";
    }
}
```

`ltsp_amd64.conf`はとりあえずそのまま、スワップのファイルは無効化しておきます。

```file:/etc/nbd-server/conf.d/ltsp_amd64.conf
[/opt/ltsp/amd64]
exportname = /opt/ltsp/images/amd64.img
readonly = true
authfile = /etc/ltsp/nbd-server.allow
```

```file:/etc/nbd-server/conf.d/swap.conf
#[swap]
#exportname = /tmp/nbd-swap/%s
#prerun = nbdswapd %s
#postrun = rm -f %s
#authfile = /etc/ltsp/nbd-server.allow
```

設定後、nbd-serverを再起動しておきましょう。

```bash
$ sudo systemctl restart nbd-server
```

これでひとまずOKとしておきます。

ここでの懸念

- dhcpd.confでnbi.imgの部分を実態に合わせるべき?
- nbd-serverに置いてる設定ファイルでauthfileを無効化しておくべきか


# LTSPクライアントVMを作成してみる

新規VM作成で、

- メモリ1GB
- ディスクなし
- ネットワークは設定を変えてNATを削除、内部ネットワークで設定名LTSPを使っておく

起動後のコンソールで即座にF12を押し、ネットワークブート(l)を指定することで、サーバー側のDHCPサーバー経由でイメージを読み込みます。

![ltsp-client-dhcp.png](https://qiita-image-store.s3.amazonaws.com/0/146518/9782ce46-8e2c-6925-9eaa-ee84c47ba62d.png)

しかしながら起動後にイメージが上手く読み込めずにエラーを起こすのでした。

![ltsp-client-failed.png](https://qiita-image-store.s3.amazonaws.com/0/146518/8603f1d4-249d-6205-d487-5a98ef59d619.png)

# 原因調査

まずはNBDがうまくディスクを渡せていないのではということでログを取得

```bash
$ journalctl -xe --no-pager -u nbd-server
...
-- 
-- Unit nbd-server.service has finished starting up.
-- 
-- The start-up result is RESULT.
Oct 25 10:55:16 ltspserver nbd_server[19691]: Spawned a child process
Oct 25 10:55:16 ltspserver nbd_server[19709]: virtstyle ipliteral
Oct 25 10:55:16 ltspserver nbd_server[19709]: connect from 172.16.0.20, assigned file is /opt/ltsp/images/amd64.img
Oct 25 10:55:16 ltspserver nbd_server[19709]: Can't open authorization file /etc/ltsp/nbd-server.allow (No such file or directory).
Oct 25 10:55:16 ltspserver nbd_server[19709]: Size of exported file/device is 576049152
Oct 25 10:55:16 ltspserver nbd_server[19709]: Starting to serve
```

利用するイメージのアサインは、想定通りamd64.imgとなっています。
これはDHCPのオプションによりroot-pathというキーで値が渡っており、NBDのクライアント側はこれをキーにディスクイメージの割当要求をしているからです。
しかしながら直後にファイル`/etc/ltsp/nbd-server.allow`が無いことによるエラーっぽいのが見えてます。でもその一方で"Starting to serve"とも書いてていったいぜんたい…という感じです。気持ち悪いので、

```file:/etc/nbd-server/conf.d/ltsp_amd64.conf
[/opt/ltsp/amd64]
exportname = /opt/ltsp/images/amd64.img
readonly = true
#authfile = /etc/ltsp/nbd-server.allow
```

とコメントアウトしてnbd-server再起動後にリトライ。

![ltsp-client-failed2.png](https://qiita-image-store.s3.amazonaws.com/0/146518/3fd59de2-d810-f5b6-a79f-6337580b97a6.png)

やっぱりコケましたが、

```
-- 
-- Unit nbd-server.service has finished starting up.
-- 
-- The start-up result is RESULT.
Oct 25 11:03:37 ltspserver nbd_server[19787]: Spawned a child process
Oct 25 11:03:37 ltspserver nbd_server[19807]: virtstyle ipliteral
Oct 25 11:03:37 ltspserver nbd_server[19807]: connect from 172.16.0.20, assigned file is /opt/ltsp/images/amd64.img
Oct 25 11:03:37 ltspserver nbd_server[19807]: No authorization file, granting access.
Oct 25 11:03:37 ltspserver nbd_server[19807]: Size of exported file/device is 576049152
Oct 25 11:03:37 ltspserver nbd_server[19807]: Starting to serve
```

となっており「認証設定がなければとりあえず許しちゃる」という扱いなので問題無しとなってます。が、ダメでした。

# んじゃ、16.04だったら?

これがうまくいっちゃうんですね。ただしGUI周りとか入れてないので使えませんが、先へ進んでしまうんですよ。

```bash
$ cd /opt/ltsp
# バックアップを取ってから一度18.04の痕跡を削除して…
$ sudo tar cvpzf 18.04.tar.gz amd64 && sudo rm -fr amd64 images
# 16.04を指定してイメージ構築をさせる
$ sudo ltsp-build-client --mirror http://jp.archive.ubuntu.com/ubuntu --dist xenial
```