Ubuntu 22.04/20.04 LTS上でのLTSPサーバ構築 : fat / thin clientの管理

# 概要

- [研究室のシステム構成](https://qiita.com/NeK/items/70f994b271b0c1a48590)
- [LTSP(公式のページ)](https://ltsp.org/)

## 更新履歴
2023/01/09: ubuntu 22.04を対応に追加．内容はおなじまま．

## モチベーション
研究室に10人～20人の学生さんがいるとする．
学生さんなので毎年人が入れ替わる．
そんな状況下で，各PCにubuntuをインストールし必要なソフトウエアをインストールし実験などが恙なく行われるようにメンテナンスし続けることは煩雑すぎて嫌である．

LTSPはサーバ側でOSイメージを持ちネットワーク経由で各PCにOSイメージを配布し起動するものとなる．
システムの一括管理が出来て楽そう，ということで導入している．

### 前ver.からのモチベーション
2019年度にalkisgさんがscratchで書き直したようで，前ver.がLTSP5と改名されている([参考](https://ltsp.org/))．
特にUEFIに対応したのがデカく，Surface関係が起動できるようになった．
というか，そのために新ver.を入れた．ぼちぼち苦労したので，ここで情報公開．
私の前バージョンの話は[こちら](https://qiita.com/NeK/items/53178f3b53aaec81ec68)．

## LTSPにまつわる情報
新ver.になってスタンスが変わっている．曰く，clientも十分な能力もっているので基本clientで作業した方がいいよね，と([参考](https://ltsp.org/docs/preparation/))．
そのため，以下の使用方法が基本らしい．

- fat client
- chrootless
    - chroot, VM wareのイメージも利用できるが，chrootlessが推奨．

更にクライアントの管理としては18.04からepoptesが利用できるようになった．
これはクライアントの電源の情報・画面の取得などができるものである．
本ページでは説明省略．

## 前提
当研究室のシステム構成は[このようなもの](https://qiita.com/NeK/items/70f994b271b0c1a48590)を使っている．
ここで関係のある部分は以下のとおり．

- LTSPサーバ
    - Ubuntu Desktop 22.04, Ubuntu Desktop 20.04
    - chrootless
    - NICは1枚
- 各PC
    - PXE boot可(でないとLTSPのクライアントになれない．biosで設定)
- dns, dhcpサーバ
    - 既にあるdns, dhcpサーバを利用．
- ユーザ認証
    - 既にあるldapサーバを利用

dns, dhcpサーバを外部に持つことが一番通常と違うと思われる．たぶん普通はLTSPサーバインストール時に用意・設定されるdns, dhcpを使用することになる(dnsmasq, systemd-resolv?)．

また本ページで記載しているIPは全部適当(頭脳乱数により生成)

- dnsとかdhcp
    - 192.168.0.5
- LTSPサーバ
    - 192.168.0.10

## dns, dhcpサーバおよびユーザ認証について
既に設定されているサーバを使用するため，ここでは各サーバの構築方法などは説明しない．

# 準備
## LTSPサーバの準備
Ubuntu Desktopをインストール．ユーザが使用するであろう通常のDesktopとして設定．

- 利用ソフトウエアのインストール
    - nfsなどシステム利用のためのものからchromeやvimなどのアプリケーションまで
- homeディレクトリをNFSで外部からマウントしたい場合，LTSPサーバではマウントしないよう設定
    - fatクライアントではlts.confの中のfstabに関する項目でマウントするので大丈夫
- 認証の設定
    - ldap認証できるようにしておく
- その他
    - ntp，システムアップデート，etc.

## dhcpサーバでの追加設定
現在利用しているdhcpサーバの設定ファイルを編集．
クライアントにipが割り振られる時，PXEブートするのか，PXEブートするならOSファイルを配布するLTSPサーバのIPは何かを設定する．

- 対象コンピュータ
    - DHCPサーバ
- 対象ファイル
    - /etc/dhcp/dhcpd.conf
- 例は関係する一部を抜粋
    - 前後の一般的な設定は'....'で表現

```dhcpd.conf
....
option space ipxe;
option ipxe-encap-opts code 175 = encapsulate ipxe;
option ipxe.menu code 39 = unsigned integer 8;
option ipxe.no-pxedhcp code 176 = unsigned integer 8;
option arch code 93 = unsigned integer 16;

subnet .... {
        option ipxe.no-pxedhcp 1;
        next-server 192.168.0.10; # LTSPサーバ(tftpサーバ)のIPを記載
        if exists ipxe.menu {
                filename "ltsp/ltsp.ipxe";
        } elsif option arch = 00:00 {
                filename "ltsp/undionly.kpxe";
        } elsif option arch = 00:07 {
                filename "ltsp/snponly.efi";
        } elsif option arch = 00:09 {
                filename "ltsp/snponly.efi";
        } else {
                filename "ltsp/unmatched-client";
        }
....
}
```

# LTSPサーバ構築
以下，LTSPサーバ上での作業．

## インストール
インストールとepoptesがクライアント管理するための設定

```Bash:terminal
$ sudo add-apt-repository ppa:ltsp
$ sudo apt update
$ apt install ltsp ltsp-binaries dnsmasq nfs-kernel-server openssh-server squashfs-tools ethtool net-tools epoptes
$ gpasswd -a admin epoptes # adminの部分は，実際に管理者権限持っているユーザ名に置き換えること
```

## dnsmasqの設定

```Bash:terminal
$ sudo ltsp dnsmasq --proxy-dhcp=0 --real-dhcp=0
$ sudo systemctl restart dnsmasq
```

注意: NIC1枚で外部にDHCPサーバを持つ場合のコマンド．

## ltsp.confの設定

### ファイル準備

```Bash:terminal
$ sudo install -m 0660 -g sudo /usr/share/ltsp/common/ltsp/ltsp.conf /etc/ltsp/ltsp.conf
```

### 設定
- 対象ファイル
    - /etc/ltsp/ltsp.conf


```ltsp.conf
[server]

[common]

[client]
DNS_SERVER=192.168.0.5 # DNSサーバのIPアドレス．これがないとfstabなどで名前解決できない．

# fstabの設定
# 例ではhomeディレクトリをサーブするhome-serverとsamba用(/sambaをサーブ)のsamba-serverがある
# IPで指定でもいいが例では名前で指定．
FSTAB_0="home-server:/home /home nfs4 _netdev,auto 0 0"
FSTAB_1="samba-server:/samba /samba nfs4 _netdev,auto 0 0"
```

### fstabの設定について
<details><summary>LTSPサーバの/etc/fstabでなくlts.confの中で設定する理由</summary>

chrootlessによりLTSPサーバの環境 = クライアントの環境として構築できる．そのためLTSPサーバの/etc/fstabに記入することで，クライアントでも同じようにNFSマウントが行われる．しかし敢えてLTSPサーバではfstabを使わない．
理由:
homeディレクトリをhome-serverによりNFSマウントする状況を考える．
home-serverを再起動した時，NFSマウントしているPCがハングアップする可能性がある．
- もし，LTSPサーバがhomeディレクトリをマウントしていた場合，LTSPサーバもハングアップしてしまう．管理者がいないと復旧できない．
- もし，LTSPサーバがhomeディレクトリをマウントしていない場合，クライアントのみハングアップするので，クライアントのみ強制再起動すれば直る．管理者がいなくても復旧できる．
よって，LTSPサーバの/etc/fstabでhomeディレクトリをマウントせず，lts.confの中でfstab設定するようにする．
</details>



## 初期イメージ作成

```Bash:terminal
$ sudo ltsp image /
$ sudo ltsp ipxe
$ sudo ltsp nfs
$ sudo ltsp initrd
```

## クライアントの設定
クライアントのBIOSでPXEブート(ネットワークブート)を有効・起動順位を適正に設定．

## クライアントの起動
ちゃんとLTSPクライアントとして起動しているか確認

# 運用
## システムアップデート・ソフトウエア追加など変更があった場合

1. LTSPサーバ自体に変更を適用する
    - アップデート or ソフトウエア追加など
1. 変更したLTSPサーバをもとにクライアント用OSイメージを作成

```Bash:terminal
$ sudo ltsp image /
$ sudo ltsp ipxe
$ sudo ltsp nfs
$ sudo ltsp initrd
```

クライアントを再起動して新しいOSイメージでブートさせると完了．

## ltsp.confを編集

1. ltsp.confを編集
2. bootイメージを再作成

```Bash:terminal
$ sudo ltsp initrd
```

# その他
## SurfaceのLTSPブート

- 確認対象
    - Surface Go
    - USB Type-C Ethernet/USBアダプター
        - デフォルトでmoduleを読み込んでいないようで起動せず往生した．
        - module名
            - cdc_ether
            - r8152

### 設定

1. module 'cdc_ether, r8152'を組み込む．
2. 組み込んだmoduleを有効にする．
3. イメージ作成する．

```Bash:terminal
$ sudo echo 'cdc_ether' >> /etc/initramfs-tools/modules
$ sudo echo 'r8152' >> /etc/initramfs-tools/modules
$ sudo update-initramfs -u
$ sudo ltsp image /;sudo ltsp ipxe;sudo ltsp nfs;sudo ltsp initrd
```