LTSPを授業で使うことを試してみた(その1:イメージ作成まわり)

# はじめに

この文書は、授業環境での均一な授業環境提供のため、LTSP[^1]の力を借りてみることを検討し、実装を試みている最中のものです。
案外LTSPの日本語資料が少ない気がする(あっても古い)ので、現状というものを知るいい機会になると思います。

[^1]: Linux Terminal Server Project

# VagrantとVirtualBoxによる手元練習環境の構築

実際に動かしている環境は別にありますが、まずはミニマム環境でどの程度できるかを確認してみることにしましょう。使っているものは以下のものです。

- MacBook Pro(2012mid, macOS High Sierra)
- Vagrant 2.0
- VirtualBox 5.1.30

もちろん適当なターミナルなどは必要なので用意しておきましょう。標準でもいいですが、私はiTerm2を使ってます。また、実際の運用環境もそうですが、サーバもクライアントもamd64です。

```bash
$ mkdir -pv ~/tmp/ltsp
$ cd ~/tmp/ltsp
$ vagrant init ubuntu/xenial64
$ vi Vagrantfile
```

で、パラメータの書き換えと仕込みを行います。

```diff
--- Vagrantfile.dist	2017-10-19 03:31:04.000000000 +0900
+++ Vagrantfile	2017-10-19 03:38:24.000000000 +0900
@@ -32,7 +32,7 @@

   # Create a private network, which allows host-only access to the machine
   # using a specific IP.
-  # config.vm.network "private_network", ip: "192.168.33.10"
+  config.vm.network "private_network", ip: "192.168.33.10"

   # Create a public network, which generally matched to bridged network.
   # Bridged networks make the machine appear as another physical device on
@@ -67,4 +67,11 @@
   #   apt-get update
   #   apt-get install -y apache2
   # SHELL
+  config.vm.provision :shell, inline: <<-SHELL
+      locale-gen ja_JP.UTF-8 UTF-8
+      timedatectl set-timezone Asia/Tokyo
+      cp -vf /vagrant/sources.list /etc/apt/
+      cp -vf /vagrant/99proxy /etc/apt/apt.conf.d/
+      apt-get update
+  SHELL
 end
```

ネットワークに関しては、プライベートネットワーク(VirtualBox的には「ホストオンリーアダプター」)を準備するようにしてます、IPは適当というかデフォルトをとりあえずそのまま使ってます。

また、ロケールの生成とタイムゾーンの設定を行っていますが、これは後ほど行うLTSPクライアントイメージ作成の中でタイムゾーン設定ファイルの配置に起因するエラーを回避するためのものです。というかこうしないと時計が9時間ぐらい狂うことになるので結局やらざるを得ませんが。

`sources.list`は国内ミラーを使うための差し替え、`99proxy`はプロキシサーバーを`apt`で使うための設定で、とりあえず以下のコードになっています。

```text:sources.list
deb http://jp.archive.ubuntu.com/ubuntu xenial main restricted
deb-src http://jp.archive.ubuntu.com/ubuntu xenial main restricted

deb http://jp.archive.ubuntu.com/ubuntu xenial-updates main restricted
deb-src http://jp.archive.ubuntu.com/ubuntu xenial-updates main restricted

deb http://jp.archive.ubuntu.com/ubuntu xenial universe
deb-src http://jp.archive.ubuntu.com/ubuntu xenial universe
deb http://jp.archive.ubuntu.com/ubuntu xenial-updates universe
deb-src http://jp.archive.ubuntu.com/ubuntu xenial-updates universe

deb http://jp.archive.ubuntu.com/ubuntu xenial multiverse
deb-src http://jp.archive.ubuntu.com/ubuntu xenial multiverse
deb http://jp.archive.ubuntu.com/ubuntu xenial-updates multiverse
deb-src http://jp.archive.ubuntu.com/ubuntu xenial-updates multiverse

deb http://jp.archive.ubuntu.com/ubuntu xenial-backports main restricted universe multiverse
deb-src http://jp.archive.ubuntu.com/ubuntu xenial-backports main restricted universe multiverse

deb http://security.ubuntu.com/ubuntu xenial-security main restricted
deb-src http://security.ubuntu.com/ubuntu xenial-security main restricted
deb http://security.ubuntu.com/ubuntu xenial-security universe
deb-src http://security.ubuntu.com/ubuntu xenial-security universe
deb http://security.ubuntu.com/ubuntu xenial-security multiverse
```

sedで`s;//archive;//jp.archive;`しただけです。コメントは削除してますので、プロビジョニングのシェルコードでもいじれる簡単なお仕事。

```text:99proxy
Acquire::http::proxy "http://192.168.1.249:3128/";
```

プロキシがあるなら使おうというところですので、適当なアドレス、ポートに差し替えてください。無いなら該当コードをコメントアウトしておけばいいでしょう。

# Vagrant VMの起動

これでマシンを作れますので、起動しておきます。

```bash:LTSPサーバもどきの起動
$ vagrant up && vagrant status
...
Current machine states:

default                   running (virtualbox)

The VM is running. To stop this VM, you can run `vagrant halt` to
shut it down forcefully, or you can run `vagrant suspend` to simply
suspend the virtual machine. In either case, to restart it again,
simply run `vagrant up`.
```

まずは無事に動きました。ではログインしてからLTSPの構築を行います。

```bash:LTSPのツール類をインストール
# Vagrantfileにてリポジトリキャッシュを更新してるのでいきなり入れてます
$ sudo apt install -y ltsp-server-standalone
```

# LTSP用 クライアントイメージの構築

LTSPのツールとしてインストールされる`ltsp-build-client`を使ってイメージの構築を行います。

```bash:イメージ作成
$ sudo ltsp-build-client --mirror=http://jp.archive.ubuntu.com/ubuntu/ \
                         --http-proxy=http://192.168.1.249:3128/
                         --locale=ja_JP.UTF-8
```

この作業は少し時間がかかるので、その間にネットワーク周りの下調べをしておきます。

# VirtualBoxの内部ネットワークについて

Vagrantにてプライベートネットワーク(`private_network`)を有効にしていますが、これはVirtualBoxにおいては**ホストオンリーアダプター**というインターフェースのもとで成立しています。これはVirtualBox側で覗き込むとわかります。


<img width="800" alt="スクリーンショット 2017-10-19 4.02.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/146518/73140758-20e4-d809-e5e6-86e2704c940e.png">

この場合はvboxnet0というアダプターが選択されているのがわかりますね。
同じネットワーク上にVMを用意すれば、LTSPの提供するDHCPサーバーでアドレスの割当やらをしてくれることになります。今のうちに作っておきましょうか。

低スペックでも動くか確認したいので、とりあえずメモリ1GBのLTSP Clientを作成します。仮想ハードディスクは本来のLTSPであれば不要のはずですが、予定としてホームを各自のPCで保有するというのを想定しているので作ってます、4GBで設定してますがお好みで。

<img width="894" alt="スクリーンショット 2017-10-19 4.04.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/146518/fc813421-749d-b19c-b013-7aa7e4cd233f.png">
<img width="900" alt="スクリーンショット 2017-10-19 4.04.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/146518/13922bd8-1188-905b-036b-8e89d460838e.png">

VM作成後、設定を開き、ネットワークアダプタの設定をLTSP用Vagrant VMと同じものにしておきましょう(ホストオンリーのvboxnet0)。

<img width="891" alt="スクリーンショット 2017-10-19 4.09.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/146518/de8fe419-c88d-9148-e6de-aa795b44a8a1.png">

# LTSPクライアントを起動してみると…

さて、とりあえずイメージ生成ができたでしょうか?できてるなら、初期設定のままだと、パス `/opt/ltsp/images/amd64.img`でできています。

ためしに動かしてみましょう。VirtualBoxのマネージャー画面から、作成しておいたLTSP Client VMを起動します。

初回起動の際はインストール用のディスクは?と聞かれますが、不要なのでキャンセルして進めます。
<img width="665" alt="スクリーンショット 2017-10-19 4.40.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/146518/e7f267a1-0d8a-4226-4285-dc4d86ef9a4c.png">
BIOS画面になりますが、ここですからず`F12`キーを押します。MacであればFn+F12の場合もあるので要注意。
<img width="741" alt="スクリーンショット 2017-10-19 4.41.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/146518/52b43c1e-4c27-d36f-3f28-04ce1d55613a.png">
これで起動方法が選べますので、LANブートのために`l`を押します。これでDHCPでアドレスを取得して…

<img width="914" alt="スクリーンショット 2017-10-19 4.51.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/146518/54b06da6-80b3-84fe-16fb-0feb69371441.png">

**くれねー** という具合になってしまいます。

この理由は次の[お話](https://qiita.com/fugahogeds/items/ab74c669dfe865dd1b67)にて。