計算サーバーをLTSPでディスクレス化する

## はじめに

某大の某研で学生用の計算サーバーを管理しています。
計算サーバーの増加にメンテナンスが追いついておらず、ソフトウェアの更新も激しいです。
そもそも、それぞれのサーバーにOSがインストールされていることが諸悪の根源です。
OSをLANからブートする`Preboot eXecution Environment(PXE) ブート`で管理コストを削減します。
ホストの管理として`Linux Terminal Server Project(LTSP)`を使います。

### PXE/LTSPで何ができるの？

https://ltsp.org/
何ができるのかざっくりと言うならば、

> 設定済みサーバーのコピーをポンポン作れる、超簡単に。

です。コピー先のOSをインストールする必要がありません。
そもそもSSHやHDDをセットアップする必要もないです。

## 0. 準備

### 準備するもの

- LAN環境
- PC二台

### 環境

PXEブートではDHCPの設定が必要ですが、今回はDHCPプロキシという機能を使います。
DHCPサーバーはルーター付属のものをそのまま使い、特別な設定はありません。

筆者の環境では`NIS`と`NFS`でアカウントが管理されています。
これらの管理システムがない状態でも使うことができるように説明します。
しかし、可用性の観点からNISやNFSによるアカウント管理、データの冗長化をお勧めします。

この記事では`Ubuntu Server 18.04.3`で動作確認します。
そこそこ良いワークステーションをホストにしましょう。
依存関係のトラブルは面倒なので、クリーンインストールした状態から説明を始めます。

GPU環境を導入する場合は、ホストとクライアントのどちらにもGPUを差しておいてください。
GPUドライバの都合、BIOSのセキュアブートをOFFにする必要があるかもしれません。
ホストにはGPUがなくても動作するかもしれませんが、未確認です。

```c
Internet <--> Router(DHCP) <--(HUB)--> Host
                                |--> Client_1
                         NIS <--|--> Client_2
                         NFS <--|--> Client_n
```

## 1. LTSPの導入

### インストール

ホストマシンにLTSPを導入します。
LTSPの[インストールページ](https://ltsp.org/docs/installation/)の通りに進めます。

```bash
$ sudo apt -y purge --auto-remove indicator-application mate-hud snapd
$ sudo apt -y install synaptic
$ sudo add-apt-repository -y ppa:ltsp
$ sudo apt update
$ sudo apt -y install --install-recommends ltsp ltsp-binaries dnsmasq nfs-kernel-server openssh-server squashfs-tools ethtool net-tools epoptes
```

### LTSPの初期設定

細かいオプションがありますが、ほとんどの環境ではデフォルト設定で良いです。
詳しくはLTSPの[インストールページ](https://ltsp.org/docs/installation/)や[ドキュメント](https://ltsp.org/man/)を見てください。

```bash
$ sudo ltsp dnsmasq
$ sudo install -m 0660 -g sudo /usr/share/ltsp/common/ltsp/ltsp.conf /etc/ltsp/ltsp.conf
$ sudo ltsp image /
$ sudo ltsp ipxe
$ sudo ltsp nfs
$ sudo ltsp initrd
```

この時点で、ブートができるようになっています。
クライアントから起動してログインできるか確認しましょう。
BIOSの設定からNetwork Boot(PXE BOOT)を有効にし、起動順序でLANを優先にします。
初期設定で既に、/homeがNFSでマウントされているため、環境によってはこれだけで十分かもしれません。


## 2. SSHリモートアクセスの設定(Option)

計算サーバーはSSHで接続する必要があります。
SSHの有効化と静的IPの設定をします。
各サーバーのMACアドレスが必要です。

クライアント用のSSHホスト鍵を作成

```bash
$ sudo mkdir -p /etc/ltsp/etc/ssh
$ sudo ssh-keygen -A -f /etc/ltsp
$ sudo mv /etc/ltsp/etc/ssh/ssh_host_* /etc/ltsp/ # 鍵が思った場所に生成されないので移動
$ sudo rm -r /etc/ltsp/etc/
```

SSHの設定を追加

```conf
$ sudo vim /etc/ltsp/ltsp.conf
[clients]
KEEP_SYSTEM_SERVICES="ssh"
POST_INIT_CP_KEYS="mv /etc/ltsp/ssh_host_* /etc/ssh/"
```

それぞれのクライアント用に静的IPの設定を追加

```conf
$ sudo vim /etc/ltsp/ltsp.conf
[00:11:22:33:44:55]
HOSTNAME="client1"
KERNEL_PARAMETERS="ip=192.168.0.10:\${srv}:\${gateway}:\${netmask}"
```



## 3. GPUの設定(Option)

NvidiaのGPUを使う場合はホストに`nvidia-driver`をインストールします。
CUDAも一緒にインストールします。
LTSPの設定に追加は不要です。
ただし、ディスプレイをGPUに接続すると画面がはみ出します。(原因調査中)

```bash
$ wget https://developer.nvidia.com/compute/cuda/10.1/Prod/local_installers/cuda_10.1.105_418.39_linux.run
$ sudo sh cuda_10.1.105_418.39_linux.run --silent --driver --toolkit
```


## 4. NISとNFSの設定(Option)

ホストでNISを設定してください。ホストでNFSは設定しません。
クライアントでNFSを有効にするために、FSTABの記述を加える必要があります。
こちらの記事 [CentOS7(研究室内新設サーバー)の設定メモ](https://qiita.com/Yasushi-Shinohara/items/d38e80cc95c8a29bd1b2) が参考になるかもしれません。

```conf
$ sudo vim /etc/ltsp/ltsp.conf
[clients]
FSTAB_HOME="file-server:/home /home nfs defaults"
```

## 5. 運用

ホスト環境やLTSPの設定を変更した場合は以下を実行する必要があります。
その後、クライアントを再起動すると反映されます。

```bash
$ sudo ltsp image /
$ sudo ltsp ipxe
$ sudo ltsp nfs
$ sudo ltsp initrd
```

## さいごに
後任への引継ぎ資料も兼ねて、ここに備忘録を記します。
不明点や間違いの指摘があればコメントにお願いします。